在双向直流电源的软件控制界面中实现多语言支持,需从国际化(i18n)架构设计、资源文件管理、动态语言切换逻辑和实际代码实现四个层面入手。以下是详细方案,涵盖关键技术要点和代码示例:
文本与代码分离:所有界面文本(按钮标签、提示信息、状态显示等)需从代码中提取,存储在外部资源文件中。
动态切换:用户可在运行时切换语言,无需重启软件。
默认语言回退:当目标语言资源缺失时,自动回退到默认语言(如英文)。
.ts为文本翻译文件,.qm为编译后的二进制文件)。示例JSON资源文件(languages/en.json):
json{ "main_window": { "title": "Bidirectional DC Power Control System", "charge_btn": "Charge", "discharge_btn": "Discharge", "power_label": "Power (W):", "status_label": "Status: {{status}}" }, "error_messages": { "overvoltage": "Overvoltage detected! Please check the input voltage.", "overcurrent": "Overcurrent alert! Current exceeds {{max_current}}A." }}
languages/├── en.json # 英文├── zh_CN.json # 简体中文├── de.json # 德文└── ...
pythonimport jsonfrom PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox, QLabel, QVBoxLayout, QWidgetclass MultilingualUI(QMainWindow): def __init__(self): super().__init__() self.current_language = "en" # 默认英文 self.translations = {} # 存储所有语言的翻译 self.load_translations() # 加载所有语言资源 self.init_ui() def load_translations(self): """加载所有语言的JSON资源文件""" languages = ["en", "zh_CN", "de"] # 支持的语言列表 for lang in languages: with open(f"languages/{lang}.json", "r", encoding="utf-8") as f: self.translations[lang] = json.load(f) def init_ui(self): """初始化界面并应用默认语言""" layout = QVBoxLayout() # 语言选择下拉框 self.lang_combo = QComboBox() self.lang_combo.addItems(["English", "中文", "Deutsch"]) self.lang_combo.currentIndexChanged.connect(self.change_language) # 界面控件 self.title_label = QLabel(self.get_translation("main_window", "title")) self.charge_btn = QPushButton(self.get_translation("main_window", "charge_btn")) self.discharge_btn = QPushButton(self.get_translation("main_window", "discharge_btn")) self.power_label = QLabel(self.get_translation("main_window", "power_label")) # 布局组装 layout.addWidget(self.lang_combo) layout.addWidget(self.title_label) layout.addWidget(self.charge_btn) layout.addWidget(self.discharge_btn) layout.addWidget(self.power_label) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) def get_translation(self, category, key, **kwargs): """获取翻译文本,支持变量替换(如{{status}})""" text = self.translations[self.current_language][category][key] for k, v in kwargs.items(): text = text.replace(f"{{{{{k}}}}}", str(v)) return text def change_language(self, index): """根据下拉框选择切换语言""" lang_map = {0: "en", 1: "zh_CN", 2: "de"} # 下拉框索引到语言代码的映射 self.current_language = lang_map[index] self.update_ui_texts() def update_ui_texts(self): """更新所有界面控件的文本""" self.title_label.setText(self.get_translation("main_window", "title")) self.charge_btn.setText(self.get_translation("main_window", "charge_btn")) self.discharge_btn.setText(self.get_translation("main_window", "discharge_btn")) self.power_label.setText(self.get_translation("main_window", "power_label"))if __name__ == "__main__": app = QApplication([]) window = MultilingualUI() window.show() app.exec_()
{{power}}),通过str.replace()或format()方法替换为实际值。json{ "status_messages": { "power_display": "Current Power: {{power}}W" }}
pythondef update_status(self, power): status_text = self.get_translation("status_messages", "power_display", power=power) self.status_label.setText(status_text)
item_one、item_other)。babel)自动处理复数规则。QLabel.setWordWrap(True))。QVBoxLayout/QHBoxLayout)。locale.setlocale())或第三方库(如babel)格式化数据。pythonfrom babel.dates import format_datefrom babel.numbers import format_numberdate_str = format_date(datetime.now(), locale="de_DE") # 德文日期格式number_str = format_number(1000.5, locale="fr_FR") # 法文数字格式
场景:用户下次启动软件时自动加载上次选择的语言。
实现:
config.ini)或系统注册表。pythonimport configparserdef save_language_preference(lang): config = configparser.ConfigParser() config["USER_SETTINGS"] = {"language": lang} with open("config.ini", "w") as f: config.write(f)def load_language_preference(): config = configparser.ConfigParser() if config.read("config.ini"): return config["USER_SETTINGS"].get("language", "en") # 默认英文 return "en"
zh_CN.json)json{ "main_window": { "title": "双向直流电源控制系统", "charge_btn": "充电", "discharge_btn": "放电", "start_btn": "启动", "stop_btn": "停止", "voltage_label": "电压 (V):", "current_label": "电流 (A):", "power_label": "功率 (W):", "status_label": "状态: {{status}}" }, "error_messages": { "overvoltage": "检测到过压!请检查输入电压。", "overcurrent": "过流报警!电流超过 {{max_current}}A。" }}
标题变为“双向直流电源控制系统”。
按钮文本变为“充电”“放电”。
状态提示中的变量(如{{status}})被实时替换为当前状态(如“运行中”)。
扩展建议: