From 68aa056359b17cf6d43e27c42edd388af3ec4ea5 Mon Sep 17 00:00:00 2001 From: yw1573 Date: Tue, 28 Jul 2026 15:51:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(i18n):=20=E8=AF=AD=E8=A8=80=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E6=97=B6=E5=85=A8=E9=9D=A2=E5=88=B7=E6=96=B0=E6=89=80?= =?UTF-8?q?=E6=9C=89UI=E6=96=87=E6=9C=AC=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- a1_swap_mod_packer/gui.py | 184 ++++++++++++++++++++++++++++---------- 1 file changed, 139 insertions(+), 45 deletions(-) diff --git a/a1_swap_mod_packer/gui.py b/a1_swap_mod_packer/gui.py index eb33861..11cc855 100644 --- a/a1_swap_mod_packer/gui.py +++ b/a1_swap_mod_packer/gui.py @@ -441,8 +441,8 @@ class MainWindow(QMainWindow): file_body.addLayout(table_layout, 1) # --- 缩略图预览 --- - preview_group = QGroupBox(t("gui.preview.title")) - preview_layout = QVBoxLayout(preview_group) + self.preview_group = QGroupBox(t("gui.preview.title")) + preview_layout = QVBoxLayout(self.preview_group) self.thumbnail_label = QLabel(t("gui.preview.select_hint")) self.thumbnail_label.setAlignment(Qt.AlignCenter) self.thumbnail_label.setFixedSize(240, 170) @@ -461,15 +461,15 @@ class MainWindow(QMainWindow): preview_layout.addWidget(self.thumbnail_label) preview_layout.addWidget(self.thumbnail_name_label) preview_layout.addStretch(1) - file_body.addWidget(preview_group) + file_body.addWidget(self.preview_group) file_layout.addLayout(file_body) # --- 文件操作按钮栏 --- file_buttons = QHBoxLayout() - add_button = QPushButton(t("gui.button.add_3mf")) - remove_button = QPushButton(t("gui.button.remove")) - remove_all_button = QPushButton(t("gui.button.remove_all")) - apply_default_copies_button = QPushButton(t("gui.button.apply_copies")) + self.add_button = QPushButton(t("gui.button.add_3mf")) + self.remove_button = QPushButton(t("gui.button.remove")) + self.remove_all_button = QPushButton(t("gui.button.remove_all")) + self.apply_default_copies_button = QPushButton(t("gui.button.apply_copies")) self.build_button = QPushButton(t("gui.button.build")) self.build_button.setMinimumHeight(48) self.build_button.setMinimumWidth(160) @@ -478,13 +478,13 @@ class MainWindow(QMainWindow): build_font.setBold(True) self.build_button.setFont(build_font) - add_button.clicked.connect(self.add_files) - remove_button.clicked.connect(self.remove_selected) - remove_all_button.clicked.connect(self.remove_all) - apply_default_copies_button.clicked.connect(self.apply_default_copies_to_selected) + self.add_button.clicked.connect(self.add_files) + self.remove_button.clicked.connect(self.remove_selected) + self.remove_all_button.clicked.connect(self.remove_all) + self.apply_default_copies_button.clicked.connect(self.apply_default_copies_to_selected) self.build_button.clicked.connect(self.build_output) - for button in (add_button, remove_button, remove_all_button, apply_default_copies_button): + for button in (self.add_button, self.remove_button, self.remove_all_button, self.apply_default_copies_button): button.setMinimumHeight(32) file_buttons.addWidget(button) file_buttons.addStretch(1) @@ -495,8 +495,8 @@ class MainWindow(QMainWindow): # ===================================================================== # --- 打包选项区 --- # ===================================================================== - options_group = QGroupBox(t("gui.options.group.title")) - grid = QGridLayout(options_group) + self.options_group = QGroupBox(t("gui.options.group.title")) + grid = QGridLayout(self.options_group) grid.setColumnStretch(1, 1) grid.setColumnStretch(3, 1) grid.setHorizontalSpacing(16) @@ -507,12 +507,12 @@ class MainWindow(QMainWindow): self.swap_gcode_combo = QComboBox() self.swap_gcode_combo.setMinimumWidth(240) self.swap_gcode_combo.setMaximumWidth(440) - refresh_button = QPushButton(t("gui.options.refresh")) - open_folder_button = QPushButton(t("gui.options.open_folder")) - refresh_button.setFixedWidth(refresh_button.sizeHint().width()) - open_folder_button.setFixedWidth(open_folder_button.sizeHint().width()) - refresh_button.clicked.connect(self.load_swap_gcode_to_combo) - open_folder_button.clicked.connect(self.open_swap_gcode_folder) + self.refresh_button = QPushButton(t("gui.options.refresh")) + self.open_folder_button = QPushButton(t("gui.options.open_folder")) + self.refresh_button.setFixedWidth(self.refresh_button.sizeHint().width()) + self.open_folder_button.setFixedWidth(self.open_folder_button.sizeHint().width()) + self.refresh_button.clicked.connect(self.load_swap_gcode_to_combo) + self.open_folder_button.clicked.connect(self.open_swap_gcode_folder) # 默认份数 self.default_copies_edit = QLineEdit("1") @@ -528,7 +528,8 @@ class MainWindow(QMainWindow): bed_row = QHBoxLayout() bed_row.addWidget(self.bed_cooldown_check) bed_row.addWidget(self.cool_bed_edit) - bed_row.addWidget(QLabel(t("gui.options.bed_cooldown.suffix"))) + self.bed_cooldown_suffix_label = QLabel(t("gui.options.bed_cooldown.suffix")) + bed_row.addWidget(self.bed_cooldown_suffix_label) bed_row.addStretch(1) # 换盘后等待时间(勾选后启用,不勾选则不插入等待指令) @@ -540,7 +541,8 @@ class MainWindow(QMainWindow): eject_wait_row = QHBoxLayout() eject_wait_row.addWidget(self.eject_wait_check) eject_wait_row.addWidget(self.wait_edit) - eject_wait_row.addWidget(QLabel(t("gui.options.wait_suffix"))) + self.wait_suffix_label = QLabel(t("gui.options.wait_suffix")) + eject_wait_row.addWidget(self.wait_suffix_label) eject_wait_row.addStretch(1) # 剩余时间板号显示 @@ -556,10 +558,10 @@ class MainWindow(QMainWindow): self.patch_check.setToolTip(t("gui.options.gcode_patches.tooltip")) self.patch_check.setChecked(True) patch_row = QHBoxLayout() - open_patch_button = QPushButton(t("gui.options.open_config")) - open_patch_button.clicked.connect(self.open_patch_config) + self.open_patch_button = QPushButton(t("gui.options.open_config")) + self.open_patch_button.clicked.connect(self.open_patch_config) patch_row.addWidget(self.patch_check) - patch_row.addWidget(open_patch_button) + patch_row.addWidget(self.open_patch_button) patch_row.addStretch(1) # 3MF 元数据模式 @@ -612,8 +614,8 @@ class MainWindow(QMainWindow): # 第 0 行:换盘 G-code(下拉框跨 col1-2,按钮放 col3 对齐右侧控件) grid.addWidget(self.swap_gcode_combo, 0, 1, 1, 2) swap_btn_row = QHBoxLayout() - swap_btn_row.addWidget(refresh_button) - swap_btn_row.addWidget(open_folder_button) + swap_btn_row.addWidget(self.refresh_button) + swap_btn_row.addWidget(self.open_folder_button) swap_btn_row.addStretch(1) grid.addLayout(swap_btn_row, 0, 3) @@ -640,13 +642,13 @@ class MainWindow(QMainWindow): # 第 6 行:构建成功后清空输入列表(独立一行) grid.addWidget(self.clear_after_build_check, 6, 1, 1, 3) - root.addWidget(options_group) + root.addWidget(self.options_group) # ===================================================================== # --- 输出区 --- # ===================================================================== - output_group = QGroupBox(t("gui.output.group.title")) - output_layout = QFormLayout(output_group) + self.output_group = QGroupBox(t("gui.output.group.title")) + output_layout = QFormLayout(self.output_group) # 输出目录 output_dir_row = QHBoxLayout() @@ -654,12 +656,13 @@ class MainWindow(QMainWindow): self.output_dir_edit.setPlaceholderText(t("gui.output.dir.placeholder")) self.output_dir_edit.setMinimumWidth(240) self.output_dir_edit.setMaximumWidth(520) - browse_output_dir_button = QPushButton(t("gui.output.dir.browse")) - browse_output_dir_button.setFixedWidth(browse_output_dir_button.sizeHint().width()) - browse_output_dir_button.clicked.connect(self.choose_output_dir) + self.browse_output_dir_button = QPushButton(t("gui.output.dir.browse")) + self.browse_output_dir_button.setFixedWidth(self.browse_output_dir_button.sizeHint().width()) + self.browse_output_dir_button.clicked.connect(self.choose_output_dir) output_dir_row.addWidget(self.output_dir_edit, 1) - output_dir_row.addWidget(browse_output_dir_button) - output_layout.addRow(t("gui.output.dir.label"), output_dir_row) + output_dir_row.addWidget(self.browse_output_dir_button) + self.output_dir_label = QLabel(t("gui.output.dir.label")) + output_layout.addRow(self.output_dir_label, output_dir_row) # 输出文件名规则 self.output_name_edit = QLineEdit(DEFAULT_OUTPUT_PATTERN) @@ -667,23 +670,26 @@ class MainWindow(QMainWindow): self.output_name_edit.setMinimumWidth(240) self.output_name_edit.setMaximumWidth(520) filename_rule_row = QHBoxLayout() - output_rule_help_button = QPushButton(t("gui.output.filename_rule.help")) - output_rule_help_button.setFixedWidth(34) - output_rule_help_button.setToolTip(t("gui.output.filename_rule.help.tooltip")) - output_rule_help_button.clicked.connect(self.show_output_rule_help) + self.output_rule_help_button = QPushButton(t("gui.output.filename_rule.help")) + self.output_rule_help_button.setFixedWidth(34) + self.output_rule_help_button.setToolTip(t("gui.output.filename_rule.help.tooltip")) + self.output_rule_help_button.clicked.connect(self.show_output_rule_help) filename_rule_row.addWidget(self.output_name_edit, 1) - filename_rule_row.addWidget(output_rule_help_button) - output_layout.addRow(t("gui.output.filename_rule"), filename_rule_row) + filename_rule_row.addWidget(self.output_rule_help_button) + self.output_filename_rule_label = QLabel(t("gui.output.filename_rule")) + output_layout.addRow(self.output_filename_rule_label, filename_rule_row) # 输出预览 self.output_preview_label = QLabel("-") - output_layout.addRow(t("gui.output.preview"), self.output_preview_label) + self.output_preview_label_title = QLabel(t("gui.output.preview")) + output_layout.addRow(self.output_preview_label_title, self.output_preview_label) # ---- 发送至打印机 ---- self.send_to_printer_check = QCheckBox(t("gui.output.printer.send")) self.send_to_printer_check.setChecked(False) self.send_to_printer_check.setToolTip(t("gui.output.printer.send.tooltip")) - output_layout.addRow(t("gui.output.printer.send"), self.send_to_printer_check) + self.printer_label = QLabel(t("gui.output.printer.send")) + output_layout.addRow(self.printer_label, self.send_to_printer_check) # 打印机配置行(IP、访问码、序列号) printer_config_widget = QWidget() @@ -707,7 +713,7 @@ class MainWindow(QMainWindow): printer_config_layout.addStretch(1) output_layout.addRow("", printer_config_widget) - root.addWidget(output_group) + root.addWidget(self.output_group) # ===================================================================== # --- 日志区 --- @@ -1512,7 +1518,8 @@ class MainWindow(QMainWindow): self.save_current_settings() def _refresh_ui_texts(self) -> None: - """刷新所有可通过 t() 获取的 UI 文本(窗口标题、组框等)。""" + """刷新所有可通过 t() 获取的 UI 文本。""" + # 文件输入区 self.file_group.setTitle(t("gui.file_group.title")) self.table.setHorizontalHeaderLabels([ t("gui.file_group.table.header.order"), @@ -1522,11 +1529,98 @@ class MainWindow(QMainWindow): t("gui.file_group.table.header.filament"), ]) self.table.setToolTip(t("gui.file_group.table.tooltip")) + + # 缩略图区 + self.preview_group.setTitle(t("gui.preview.title")) + if self.thumbnail_label.text() and not self.thumbnail_label.pixmap(): + self.thumbnail_label.setText(t("gui.preview.select_hint")) + + # 按钮 + self.add_button.setText(t("gui.button.add_3mf")) + self.remove_button.setText(t("gui.button.remove")) + self.remove_all_button.setText(t("gui.button.remove_all")) + self.apply_default_copies_button.setText(t("gui.button.apply_copies")) + self.build_button.setText(t("gui.button.build")) + + # 打包选项区 + self.options_group.setTitle(t("gui.options.group.title")) + self.refresh_button.setText(t("gui.options.refresh")) + self.open_folder_button.setText(t("gui.options.open_folder")) + self.bed_cooldown_check.setText(t("gui.options.bed_cooldown")) + self.eject_wait_check.setText(t("gui.options.eject_wait")) + self.show_plate_number_check.setText(t("gui.options.plate_number")) + self.swap_final_check.setText(t("gui.options.final_swap")) + self.patch_check.setText(t("gui.options.gcode_patches")) + self.patch_check.setToolTip(t("gui.options.gcode_patches.tooltip")) + self.open_patch_button.setText(t("gui.options.open_config")) + self.individual_batch_check.setText(t("gui.options.batch_mode")) + self.individual_batch_check.setToolTip(t("gui.options.batch_mode.tooltip")) + self.clear_after_build_check.setText(t("gui.options.clear_after_build")) + self.skip_duplicates_check.setText(t("gui.options.skip_duplicates")) + self.bed_cooldown_suffix_label.setText(t("gui.options.bed_cooldown.suffix")) + self.wait_suffix_label.setText(t("gui.options.wait_suffix")) + + # 元数据下拉框 + self.metadata_combo.setItemText(0, t("gui.options.metadata.source")) + self.metadata_combo.setItemText(1, t("gui.options.metadata.sum")) + # ZIP 压缩下拉框 + for level in range(1, 10): + self.zip_level_combo.setItemText(level - 1, t("gui.options.zip_compression.level_format", level=level)) + self.zip_level_combo.setToolTip(t("gui.options.zip_compression.tooltip")) + + # 网格标签遍历 + self._refresh_grid_labels() + + # 输出区 + self.output_group.setTitle(t("gui.output.group.title")) + self.output_dir_edit.setPlaceholderText(t("gui.output.dir.placeholder")) + self.browse_output_dir_button.setText(t("gui.output.dir.browse")) + self.output_name_edit.setPlaceholderText(t("gui.output.filename_rule.placeholder")) + self.output_rule_help_button.setToolTip(t("gui.output.filename_rule.help.tooltip")) + self.output_dir_label.setText(t("gui.output.dir.label")) + self.output_filename_rule_label.setText(t("gui.output.filename_rule")) + self.output_preview_label_title.setText(t("gui.output.preview")) + self.printer_label.setText(t("gui.output.printer.send")) + self.send_to_printer_check.setText(t("gui.output.printer.send")) + self.send_to_printer_check.setToolTip(t("gui.output.printer.send.tooltip")) + self.printer_ip_edit.setPlaceholderText(t("gui.output.printer.ip")) + self.printer_access_code_edit.setPlaceholderText(t("gui.output.printer.access_code")) + self.printer_serial_edit.setPlaceholderText(t("gui.output.printer.serial")) + + # 语言标签 self.language_label.setText(t("gui.options.language") + ":") + + # 动态文本刷新 self.update_total_summary() self.update_output_preview() self.update_thumbnail_preview() + def _refresh_grid_labels(self) -> None: + """遍历打包选项网格,刷新所有 QLabel 文本。""" + grid = self.options_group.layout() + key_map = { + (0, 0): "gui.options.swap_gcode.label", + (1, 0): "gui.options.default_copies", + (1, 2): "gui.options.bed_cooldown.label", + (2, 0): "gui.options.eject_wait.label", + (2, 2): "gui.options.plate_number.label", + (3, 0): "gui.options.final_swap.label", + (3, 2): "gui.options.gcode_patches.label", + (4, 0): "gui.options.metadata.label", + (4, 2): "gui.options.zip_compression.label", + (5, 0): "gui.options.batch_mode.label", + (5, 2): "gui.options.input_handling", + (6, 0): "gui.options.clear_after_build.label", + } + for i in range(grid.count()): + item = grid.itemAt(i) + if item.widget() and isinstance(item.widget(), QLabel): + label = item.widget() + row, col, _, _ = grid.getItemPosition(i) + key = key_map.get((row, col)) + if key: + label.setText(t(key)) + def main() -> int: """应用程序入口:初始化 QApplication,创建并显示主窗口,进入事件循环。"""