fix(i18n): 语言切换时全面刷新所有UI文本控件

This commit is contained in:
2026-07-28 15:51:54 +08:00
parent 2fed301a6c
commit 68aa056359
+139 -45
View File
@@ -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,创建并显示主窗口,进入事件循环。"""