certflow.views.common.i18n_manager 源代码

# 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}")