fix(i18n): 语言切换时全面刷新所有UI文本控件
This commit is contained in:
+139
-45
@@ -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,创建并显示主窗口,进入事件循环。"""
|
||||
|
||||
Reference in New Issue
Block a user