# src/certflow/views/common/i18n_manager.py
"""国际化管理器
提供应用级别的语言切换引擎。
由于当前应用未使用 QTranslator/.qm 翻译文件体系,I18nManager 采用
动态字典查找 + QObject.tr() 兼容模式实现语言切换。
架构层次:
Controller (SettingsController) → View/Common (I18nManager) → 各 View 的 tr() 调用
当前策略:
- 维护中英文翻译字典
- 语言切换时发出 language_changed 信号
- 各 View 监听该信号后自行调用 retranslateUi() 刷新界面文本
- 为未来 .qm 文件迁移预留接口
Usage:
manager = I18nManager()
manager.switch_language("zh_CN")
manager.switch_language("en_US")
text = manager.tr("导入") # → "Import"
"""
from __future__ import annotations
from PySide6.QtCore import QObject, Signal
from certflow.utils.logger import logger
[文档]
class I18nManager(QObject):
"""国际化管理器 — 中/英文切换
维护核心 UI 文本的翻译字典,语言切换时发出信号通知各 View 刷新。
"""
# ============================================================
# Signals
# ============================================================
language_changed = Signal(str)
"""语言变更信号,携带新语言代码 (zh_CN / en_US)"""
# ============================================================
# 翻译字典 (简体中文 → English)
# ============================================================
TRANSLATIONS: dict[str, dict[str, str]] = {
# ===== 主窗口 / 导航栏 =====
"CertFlow - 阀门证书管理系统": "CertFlow - Valve Certificate Management System",
"🏭 CertFlow": "🏭 CertFlow",
"📋 计划导入": "📋 Import Plans",
"🔍 查询与补充": "🔍 Query & Supplement",
"🖨 打印合格证": "🖨 Print Certificates",
"📸 扫描件生成": "📸 Generate Scans",
"📄 报告生成": "📄 Generate Reports",
"📜 打印历史": "📜 Print History",
"⚙️ 系统设置": "⚙️ Settings",
"✅ 系统就绪": "✅ System Ready",
"就绪": "Ready",
# ===== 导入对话框 =====
"导入配置": "Import Configuration",
"选择文件": "Select File",
"浏览...": "Browse...",
"-- 选择历史文件 --": "-- Select History File --",
"-- 没有历史文件,请浏览 --": "-- No history, please browse --",
"清除历史": "Clear History",
"工作表": "Worksheet",
"表头行": "Header Row",
"数据起始行": "Data Start Row",
"跳过行": "Skip Rows",
"列映射": "Column Mapping",
"导入": "Import",
"取消": "Cancel",
"导入完成": "Import Completed",
"导入中...": "Importing...",
"总记录": "Total Records",
"新增": "New",
"重复跳过": "Duplicates Skipped",
"跳过": "Skipped",
"变更": "Changes",
# ===== 查询视图 =====
"查询": "Query",
"搜索": "Search",
"重置": "Reset",
"导出": "Export",
"高级筛选": "Advanced Filter",
"字段": "Field",
"操作符": "Operator",
"值": "Value",
"添加条件": "Add Condition",
"清除条件": "Clear Conditions",
"打印选中": "Print Selected",
"生成扫描件": "Generate Scans",
"生成报告": "Generate Reports",
"全选": "Select All",
"取消全选": "Deselect All",
# ===== 打印视图 =====
"打印合格证": "Print Certificates",
"打印机": "Printer",
"份数": "Copies",
"单张打印": "Single Print",
"批量打印": "Batch Print",
"生成 PDF": "Generate PDF",
"预览": "Preview",
"起始编号": "Start Serial",
"结束编号": "End Serial",
"产品名称": "Product Name",
"产品型号": "Product Model",
"规格": "Specification",
"压力": "Pressure",
"温度": "Temperature",
"介质": "Medium",
"检验标准": "Inspection Standard",
"编号模式": "Serial Number Mode",
"自动生成": "Auto Generate",
"手动输入": "Manual Input",
"打印完成": "Print Completed",
"打印失败": "Print Failed",
# ===== 扫描件视图 =====
"扫描件生成": "Scan Generation",
"模板": "Template",
"输出目录": "Output Directory",
"选择目录": "Select Directory",
"生成": "Generate",
"进度": "Progress",
"生成完成": "Generation Completed",
# ===== 报告视图 =====
"报告生成": "Report Generation",
"报告类型": "Report Type",
"试压报告": "Pressure Test Report",
"材质报告": "Material Report",
"语言": "Language",
"简体中文": "Simplified Chinese",
"English": "English",
# ===== 设置视图 =====
"系统设置": "Settings",
"📋 配置总览": "📋 Config Overview",
"🖨️ 打印设置": "🖨️ Print Settings",
"⚙️ 偏好设置": "⚙️ Preferences",
"保存设置": "Save Settings",
"恢复默认": "Restore Defaults",
"保存成功": "Save Successful",
"保存失败": "Save Failed",
"设置已保存到 userconfig.yaml": "Settings saved to userconfig.yaml",
"确认恢复": "Confirm Restore",
"确定要将所有设置恢复为默认值吗?\n此操作不会保存,需点击「保存设置」生效。": "Are you sure you want to restore all settings to defaults?\n"
"This will not save automatically, click 'Save Settings' to apply.",
"通用": "General",
"界面": "Interface",
"最近文件": "Recent Files",
"启用自动保存": "Enable Auto Save",
"启用后,系统会定时自动保存打印视图中正在编辑的合格证数据到数据库,防止意外退出丢失记录": "When enabled, the system periodically auto-saves the certificate data being edited in the print view to the database, preventing data loss on unexpected exit",
"自动保存间隔:": "Auto Save Interval:",
"自动保存的时间间隔,仅在「启用自动保存」开启时生效": "Auto-save time interval, only effective when 'Enable Auto Save' is on",
"覆盖前确认": "Confirm Before Overwrite",
"导入数据前弹出确认对话框,防止误操作覆盖已有销售计划记录": "Show a confirmation dialog before importing data to prevent accidentally overwriting existing sales plan records",
"语言:": "Language:",
"切换界面显示语言,保存后立即生效": "Switch the interface display language, takes effect immediately after saving",
"主题:": "Theme:",
"切换界面颜色主题,保存后立即生效。也可点击导航栏右侧的 🌙/☀️ 按钮快速切换": "Switch the interface color theme, takes effect immediately after saving. You can also click the 🌙/☀️ button on the right side of the navigation bar to quickly toggle",
"最大保留数量:": "Max Recent Files:",
"导入对话框中「最近文件」列表的最大保留条数,超出后自动裁剪": "Maximum number of entries kept in the 'Recent Files' list in the import dialog, older entries are trimmed automatically",
"分钟": " min",
"zh_CN (简体中文)": "zh_CN (Simplified Chinese)",
"en_US (English)": "en_US (English)",
"light (浅色)": "light (Light)",
"dark (深色)": "dark (Dark)",
"系统级打印配置 (来自 config.yaml,只读)": "System Print Config (from config.yaml, read-only)",
"🔧 打印机物理偏移 (mm) — 用户可调,保存到 userconfig.yaml": "🔧 Printer Physical Offset (mm) — adjustable, saved to userconfig.yaml",
"默认打印机:": "Default Printer:",
"默认份数:": "Default Copies:",
"纸张尺寸:": "Paper Size:",
"打印坐标:": "Print Coordinates:",
"打印字体:": "Print Font:",
"批量参数:": "Batch Parameters:",
"X 偏移 (向右为正):": "X Offset (right positive):",
"Y 偏移 (向下为正):": "Y Offset (down positive):",
"📋 以下为 config.yaml 全部配置节点的只读展示,修改请直接编辑 config.yaml 文件后重启。": "📋 Read-only view of all config.yaml nodes. Edit the config.yaml file directly and restart to apply changes.",
"节点": "Node",
"值 / 说明": "Value / Description",
"个子节点": " sub-nodes",
"个字段": " fields",
"项": " items",
"个对象": " objects",
"个值": " values",
"列表": "List",
"空列表": "empty list",
"空字符串": "empty string",
"✓ 是": "✓ Yes",
"✗ 否": "✗ No",
"粗体": "Bold",
"常规": "Regular",
# ===== 打印历史 =====
"打印历史": "Print History",
"刷新": "Refresh",
# ===== 通用消息 =====
"提示": "Notice",
"确认": "Confirm",
"警告": "Warning",
"错误": "Error",
"是": "Yes",
"否": "No",
"确定": "OK",
"关闭": "Close",
# ===== 确认对话框 =====
"确认批量打印": "Confirm Batch Print",
"已发送第一张打印": "First print sent",
"剩余": "remaining",
"张,是否继续?": "cards, continue?",
"批量打印已取消": "Batch print cancelled",
"批量打印完成,共": "Batch print completed, total",
"张": "cards",
"已完成": "Completed",
"张合格证打印,是否生成扫描件?": "certificate(s) printed. Generate scans?",
"已生成": "Generated",
"个扫描件": "scan file(s)",
"扫描件生成完成!\n共": "Scan generation completed!\nTotal",
"个文件": "file(s)",
"无可打印的编号": "No serial numbers to print",
"已加载": "Loaded",
"条记录": "record(s)",
"正在打印": "Printing",
"份...": "copy/copies...",
}
# ============================================================
# Initialization
# ============================================================
def __init__(self, parent: QObject | None = None):
super().__init__(parent)
self._current_language: str = "zh_CN"
@property
def current_language(self) -> str:
"""当前语言"""
return self._current_language
[文档]
def tr(self, text: str) -> str:
"""翻译文本
Args:
text: 源文本(简体中文)
Returns:
翻译后的文本;若当前为中文或找不到翻译则返回原文
"""
if self._current_language == "zh_CN":
return text
return (
self.TRANSLATIONS.get("zh_CN", {}).get(text, text)
if False
else self.TRANSLATIONS.get(text, text)
)
[文档]
def switch_language(self, language: str) -> None:
"""切换应用语言
Args:
language: 语言代码,可选 "zh_CN" 或 "en_US"
Returns:
None: 切换成功时发出 language_changed 信号
"""
if language not in ("zh_CN", "en_US"):
logger.warning(f"不支持的语言: {language},使用 zh_CN")
language = "zh_CN"
if language == self._current_language:
return
self._current_language = language
self.language_changed.emit(language)
logger.info(f"语言已切换为: {language}")