From 65f3163c5770fd24e667ca2e0cca410cc7082101 Mon Sep 17 00:00:00 2001 From: Starmoe Date: Tue, 28 Oct 2025 21:12:19 +0800 Subject: [PATCH] Add Chinese Translation --- dialogExecution/editVMNew.py | 10 + dialogExecution/errDialog.py | 10 + dialogExecution/newVirtualMachine.py | 10 + dialogExecution/noUpdateAvailable.py | 10 + dialogExecution/qemuImgError.py | 7 + dialogExecution/qemuSysError.py | 10 + dialogExecution/startVirtualMachine.py | 9 +- dialogExecution/updateAvailable.py | 1 + dialogExecution/vhdExistsDialog.py | 10 + dialogExecution/vmExistsDialog.py | 10 + dialogExecution/vmTooNew.py | 1 + emugui.py | 96 +++++ translations/systemdefault.txt | 1 + translations/zhcn.py | 515 +++++++++++++++++++++++++ ui/Main.ui | 5 + ui/ui_Main.py | 3 + uiScripts/ui_Main.py | 4 +- 17 files changed, 710 insertions(+), 2 deletions(-) create mode 100644 translations/zhcn.py diff --git a/dialogExecution/editVMNew.py b/dialogExecution/editVMNew.py index 84de8e0..54218f9 100644 --- a/dialogExecution/editVMNew.py +++ b/dialogExecution/editVMNew.py @@ -24,6 +24,7 @@ import translations.pt import translations.it import translations.pl +import translations.zhcn import locale import errors.logman import errors.logID @@ -145,6 +146,9 @@ def langDetect(self): elif result[0][1] == "it": langmode = "it" + elif result[0][1] == "zh_cn": + langmode = "zh_cn" + elif result[0][1] == "system": langmode = "system" @@ -217,6 +221,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateEditVMIT(self, self.vmSpecs[0]) + elif languageToUse.startswith("zhcn"): + translations.zhcn.translateEditVMCN(self, self.vmSpecs[0]) + else: translations.en.translateEditVMEN(self, self.vmSpecs[0]) @@ -271,6 +278,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("pl"): translations.pl.translateEditVMPL(self, self.vmSpecs[0]) + elif languageToUse.startswith("zhcn"): + translations.zhcn.translateEditVMCN(self, self.vmSpecs[0]) + elif languageToUse.startswith("it"): translations.it.translateEditVMIT(self, self.vmSpecs[0]) diff --git a/dialogExecution/errDialog.py b/dialogExecution/errDialog.py index d7d529e..94d8098 100644 --- a/dialogExecution/errDialog.py +++ b/dialogExecution/errDialog.py @@ -21,6 +21,7 @@ import translations.pt import translations.it import translations.pl +import translations.zhcn import locale import sqlite3 import services.pathfinder as pf @@ -140,6 +141,9 @@ def langDetect(self): elif result[0][1] == "pl": langmode = "pl" + elif result[0][1] == "zh_cn": + langmode = "zh_cn" + elif result[0][1] == "system": langmode = "system" @@ -195,6 +199,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateErrDialogIT(self, self.vmSpecs[0]) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateErrDialogCN(self, self.vmSpecs[0]) + else: translations.en.translateErrDialogEN(self, self.vmSpecs[0]) @@ -244,6 +251,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateErrDialogIT(self, self.vmSpecs[0]) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateErrDialogCN(self, self.vmSpecs[0]) + else: translations.en.translateErrDialogEN(self, self.vmSpecs[0]) diff --git a/dialogExecution/newVirtualMachine.py b/dialogExecution/newVirtualMachine.py index 9605fda..422d1c5 100644 --- a/dialogExecution/newVirtualMachine.py +++ b/dialogExecution/newVirtualMachine.py @@ -27,6 +27,7 @@ import translations.pt import translations.it import translations.pl +import translations.zhcn import locale import plugins.pluginmgr.hw_reader as hwpr # HWPR = HardWare Plug-in Reader import services.pathfinder as pf @@ -227,6 +228,9 @@ def langDetect(self): elif result[0][1] == "it": langmode = "it" + elif result[0][1] == "zhcn": + langmode = "zhcn" + elif result[0][1] == "system": langmode = "system" @@ -299,6 +303,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateNewVmIT(self) + elif languageToUse.startswith("zhcn"): + translations.zhcn.translateNewVmCN(self) + else: translations.en.translateNewVmEN(self) @@ -356,6 +363,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateNewVmIT(self) + elif languageToUse.startswith("zhcn"): + translations.zhcn.translateNewVmCN(self) + else: translations.en.translateNewVmEN(self) diff --git a/dialogExecution/noUpdateAvailable.py b/dialogExecution/noUpdateAvailable.py index 06cb4de..2f122a8 100644 --- a/dialogExecution/noUpdateAvailable.py +++ b/dialogExecution/noUpdateAvailable.py @@ -13,6 +13,7 @@ import translations.de import translations.uk import translations.en +import translations.zhcn import locale class NoUpdateAvailable(QDialog, Ui_Dialog): @@ -70,6 +71,9 @@ def langDetect(self): elif result[0][1] == "uk": langmode = "uk" + elif result[0][1] == "zhcn": + langmode = "zhcn" + elif result[0][1] == "system": langmode = "system" @@ -98,6 +102,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("uk"): translations.uk.translateNoUpdateAvailableUK(self) + elif languageToUse.startswith("zhcn"): + translations.zhcn.translateNoUpdateAvaliableCN(self) + else: translations.en.translateNoUpdateAvailableEN(self) @@ -120,6 +127,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("uk"): translations.uk.translateNoUpdateAvailableUK(self) + elif languageToUse.startswith("zhcn"): + translations.zhcn.translateNoUpdateAvaliableCN(self) + else: translations.en.translateNoUpdateAvailableEN(self) diff --git a/dialogExecution/qemuImgError.py b/dialogExecution/qemuImgError.py index 1c7318b..eae5fcb 100644 --- a/dialogExecution/qemuImgError.py +++ b/dialogExecution/qemuImgError.py @@ -20,6 +20,7 @@ import translations.ru import translations.pt import translations.it +import translations.zhcn import locale import sqlite3 @@ -107,6 +108,9 @@ def langDetect(self): elif result[0][1] == "it": langmode = "it" + elif result[0][1] == "zh_cn": + langmode = "zh_cn" + elif result[0][1] == "system": langmode = "system" @@ -159,6 +163,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateQemuImgMissingIT(self) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateQemuImgMissingCN(self) + else: translations.en.translateQemuImgMissingEN(self) diff --git a/dialogExecution/qemuSysError.py b/dialogExecution/qemuSysError.py index ef0df17..c2cde97 100644 --- a/dialogExecution/qemuSysError.py +++ b/dialogExecution/qemuSysError.py @@ -20,6 +20,7 @@ import translations.ru import translations.pt import translations.it +import translations.zhcn import locale import sqlite3 @@ -127,6 +128,9 @@ def langDetect(self): elif result[0][1] == "it": langmode = "it" + elif result[0][1] == "zh_cn": + langmode = "zh_cn" + elif result[0][1] == "system": langmode = "system" @@ -179,6 +183,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateQemuSysMissingIT(self, self.vmSpecs[1]) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateQemuSysMissingCN(self, self.vmSpecs[1]) + else: translations.en.translateQemuSysMissingEN(self, self.vmSpecs[1]) @@ -225,6 +232,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateQemuSysMissingIT(self, self.vmSpecs[1]) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateQemuSysMissingCN(self, self.vmSpecs[1]) + else: translations.en.translateQemuSysMissingEN(self, self.vmSpecs[1]) diff --git a/dialogExecution/startVirtualMachine.py b/dialogExecution/startVirtualMachine.py index ab8f09a..6945ed7 100644 --- a/dialogExecution/startVirtualMachine.py +++ b/dialogExecution/startVirtualMachine.py @@ -15,7 +15,7 @@ import subprocess from PySide6.QtCore import QDateTime from random import randint -import magic +#import magic import translations.de import translations.uk import translations.en @@ -28,6 +28,7 @@ import translations.pt import translations.it import translations.pl +import translations.zhcn import locale import errors.errCodes from dialogExecution.errDialog import ErrDialog @@ -168,6 +169,9 @@ def langDetect(self): elif result[0][1] == "it": langmode = "it" + elif result[0][1] == "zhcn": + langmode = "zhcn" + elif result[0][1] == "system": langmode = "system" @@ -223,6 +227,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateStartVmIT(self, self.vmSpecs[0]) + elif languageToUse.startswith("zhcn"): + translations.zhcn.translateStartVmCN(self, self.vmSpecs[0]) + else: translations.en.translateStartVmEN(self, self.vmSpecs[0]) diff --git a/dialogExecution/updateAvailable.py b/dialogExecution/updateAvailable.py index 2478581..a6e916a 100644 --- a/dialogExecution/updateAvailable.py +++ b/dialogExecution/updateAvailable.py @@ -17,6 +17,7 @@ import translations.be import translations.cz import translations.ru +import translations.zhcn import locale class UpdateAvailable(QDialog, Ui_Dialog): diff --git a/dialogExecution/vhdExistsDialog.py b/dialogExecution/vhdExistsDialog.py index e43eb67..9637d1e 100644 --- a/dialogExecution/vhdExistsDialog.py +++ b/dialogExecution/vhdExistsDialog.py @@ -21,6 +21,7 @@ import translations.ru import translations.pt import translations.it +import translations.zhcn import locale class VhdAlreadyExists(QDialog, Ui_Dialog): @@ -132,6 +133,9 @@ def langDetect(self): elif result[0][1] == "it": langmode = "it" + elif result[0][1] == "zh_cn": + langmode = "zh_cn" + elif result[0][1] == "system": langmode = "system" @@ -184,6 +188,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateVhdExistsIT(self) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateVhdExistsCN(self) + else: translations.en.translateVhdExistsEN(self) @@ -230,6 +237,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateVhdExistsIT(self) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateVhdExistsCN(self) + else: translations.en.translateVhdExistsEN(self) diff --git a/dialogExecution/vmExistsDialog.py b/dialogExecution/vmExistsDialog.py index 3d74d98..e89e06b 100644 --- a/dialogExecution/vmExistsDialog.py +++ b/dialogExecution/vmExistsDialog.py @@ -21,6 +21,7 @@ import translations.ru import translations.pt import translations.it +import translations.zhcn import locale class VmAlreadyExistsDialog(QDialog, Ui_Dialog): @@ -107,6 +108,9 @@ def langDetect(self): elif result[0][1] == "it": langmode = "it" + elif result[0][1] == "zh_cn": + langmode = "zh_cn" + elif result[0][1] == "system": langmode = "system" @@ -159,6 +163,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateVmExistsIT(self) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateVmExistsCN(self) + else: translations.en.translateVmExistsEN(self) @@ -205,6 +212,9 @@ def setLanguage(self, langmode): elif languageToUse.startswith("it"): translations.it.translateVmExistsIT(self) + elif languageToUse.startswith("zh_cn"): + translations.zhcn.translateVmExistsCN(self) + else: translations.en.translateVmExistsEN(self) diff --git a/dialogExecution/vmTooNew.py b/dialogExecution/vmTooNew.py index b680b7f..6bb6755 100644 --- a/dialogExecution/vmTooNew.py +++ b/dialogExecution/vmTooNew.py @@ -21,6 +21,7 @@ import translations.ru import translations.pt import translations.it +import translations.zhcn import locale class VmIsMadeWithTooYoungEmuGUI(QDialog, Ui_Dialog): diff --git a/emugui.py b/emugui.py index 3a12d43..45bda50 100644 --- a/emugui.py +++ b/emugui.py @@ -70,6 +70,7 @@ import translations.pt import translations.it import translations.pl + import translations.zhcn import locale except: @@ -355,6 +356,14 @@ def setLanguage(self, langmode): if langmode != "system": self.languageInUse = "de" + + elif languageToUse.startswith("zh"): + + translations.zhcn.translateMainCN(self) + + if langmode != "system": + self.languageInUse = "zhcn" + elif languageToUse.startswith("uk"): translations.uk.translateMainUK(self) @@ -612,6 +621,7 @@ def prepareDatabase(self, connection): # pt: Portuguese # it: Italian # pl: Polish + # zhcn: Chinese (Simplified) insert_language = """ INSERT INTO settings ( name, value @@ -935,6 +945,16 @@ def prepareDatabase(self, connection): langmode = "be" + elif result[0][1] == "zhcn": + while i < self.comboBox_4.count(): + if self.comboBox_4.itemText(i) == "简体中文": + self.comboBox_4.setCurrentIndex(i) + break + + i += 1 + + langmode = "zhcn" + if platform.system() == "Windows": langfile = platformSpecific.windowsSpecific.windowsLanguageFile() @@ -2658,6 +2678,12 @@ def applyGeneric(self): WHERE name = 'lang'; """ + language_zhcn = f""" + UPDATE settings + SET value = 'zhcn' + WHERE name = 'lang'; + """ + language_it = f""" UPDATE settings SET value = 'it' @@ -3240,6 +3266,76 @@ def applyGeneric(self): dialog = SettingsRequireEmuGUIReboot(self) dialog.exec() + elif self.comboBox_4.currentText() == "简体中文": + langmode = "zhcn" + + try: + cursor.execute(language_zhcn) + connection.commit() + + if platform.system() == "Windows": + langfile = platformSpecific.windowsSpecific.windowsLanguageFile() + + else: + langfile = platformSpecific.unixSpecific.unixLanguageFile() + + if langmode == "system": + languageToUseLater = locale.getlocale()[0] + languageToUseEvenLater = languageToUseLater.split("_") + languageToUseHere = languageToUseEvenLater[0] + + else: + languageToUseHere = langmode + + try: + with open(langfile, "w+") as language: + language.write(languageToUseHere) + + except: + print("EmuGUI failed to create a language file. Expect some issues.") + + if platform.system() == "Windows": + errorFile = platformSpecific.windowsSpecific.windowsErrorFile() + + else: + errorFile = platformSpecific.unixSpecific.unixErrorFile() + + with open(errorFile, "w+") as errCodeFile: + errCodeFile.write(errors.errCodes.errCodes[54]) + + logman.writeToLogFile( + f"{errors.errCodes.errCodes[54]}: Could not create the language file. Expect issues." + ) + + dialog = ErrDialog(self) + dialog.exec() + + self.setLanguage(langmode) + print("The query was executed successfully.") + + except sqlite3.Error as e: + print(f"The SQLite module encountered an error: {e}.") + + if platform.system() == "Windows": + errorFile = platformSpecific.windowsSpecific.windowsErrorFile() + + else: + errorFile = platformSpecific.unixSpecific.unixErrorFile() + + with open(errorFile, "w+") as errCodeFile: + errCodeFile.write(errors.errCodes.errCodes[12]) + + logman.writeToLogFile( + f"{errors.errCodes.errCodes[12]}: The database could not be accessed and the settings are therefore not applied. SQLite describes the error as follows: \"{e}\"" + ) + + dialog = ErrDialog(self) + dialog.exec() + + except: + dialog = SettingsRequireEmuGUIReboot(self) + dialog.exec() + elif self.comboBox_4.currentText() == "Românã": langmode = "ro" diff --git a/translations/systemdefault.txt b/translations/systemdefault.txt index 3828e51..d97b230 100644 --- a/translations/systemdefault.txt +++ b/translations/systemdefault.txt @@ -1,4 +1,5 @@ System default +系统缺省 Systemstandard По умолчанию системы Па змаўчанні сістэмы diff --git a/translations/zhcn.py b/translations/zhcn.py new file mode 100644 index 0000000..05afedd --- /dev/null +++ b/translations/zhcn.py @@ -0,0 +1,515 @@ +from translations.systemdefaultset import * + + +def translateMainCN(window): + # Tab group 1 + window.tabWidget.setTabText(0, "主页") # Main + window.tabWidget.setTabText(1, "设置") # Settings + + # Main tab + window.pushButton_8.setText("创建新的虚拟机") # New virtual machine + window.pushButton_9.setText("启动虚拟机") # Start virtual machine + window.pushButton_10.setText("编辑选中的虚拟机") # Edit selected virtual machine + window.pushButton_11.setText("删除选中的虚拟机") # Delete selected virtual machine + window.pushButton_22.setText("导出选中的虚拟机") # Export selected virtual machine + window.pushButton_23.setText("导入现有的虚拟机") # Import virtual machine + + # Settings tabs + window.tabWidget_2.setTabText(0, "一般") # General + window.tabWidget_2.setTabText(3, "关于 EmuGUI") # About EmuGUI + + # General tab + window.label_15.setText("语言") # Language + window.pushButton_15.setText("应用") # Apply + + # Combo box for languages + i = 0 + + while i < window.comboBox_4.count(): + sysDefSet("系统缺省", window.comboBox_4, i) # System default + + i += 1 + + # Combo box for themes + i = 0 + + while i < window.comboBox_5.count(): + sysDefSet("系统缺省", window.comboBox_5, i) # System default + + i += 1 + + # QEMU tab + window.label.setText("qemu-img 路径") # qemu-img 路径 + window.label_2.setText("qemu-system-i386 路径") # qemu-system-i386 路径 + window.label_3.setText("qemu-system-x86_64 路径") # qemu-system-x86_64 路径 + window.label_4.setText("qemu-system-ppc 路径") # qemu-system-ppc 路径 + window.label_5.setText("qemu-system-mips64el 路径") # qemu-system-mips64el 路径 + window.label_9.setText("qemu-system-aarch64 路径") # qemu-system-aarch64 路径 + window.label_11.setText("qemu-system-arm 路径") # qemu-system-arm 路径 + window.label_16.setText("qemu-system-ppc64 路径") # qemu-system-ppc64 路径 + window.label_17.setText("qemu-system-mipsel 路径") # qemu-system-mipsel 路径 + window.label_18.setText("qemu-system-mips 路径") # qemu-system-mips 路径 + window.label_19.setText("qemu-system-mips64 路径") # qemu-system-mips64 路径 + window.label_12.setText("qemu-system-sparc 路径") # qemu-system-sparc 路径 + window.label_13.setText("qemu-system-sparc64 路径") # qemu-system-sparc64 路径 + window.lbl_alpha.setText("qemu-system-alpha 路径") # qemu-system-alpha 路径 + window.lbl_riscv32.setText("qemu-system-riscv32 路径") # qemu-system-riscv32 路径 + window.lbl_riscv64.setText("qemu-system-riscv64 路径") # qemu-system-riscv64 路径 + + window.pushButton.setText("浏览") # 浏览 + window.pushButton_2.setText("浏览") # 浏览 + window.pushButton_3.setText("浏览") # 浏览 + window.pushButton_4.setText("浏览") # 浏览 + window.pushButton_5.setText("浏览") # 浏览 + window.pushButton_7.setText("浏览") # 浏览 + window.pushButton_12.setText("浏览") # 浏览 + window.pushButton_16.setText("浏览") # 浏览 + window.pushButton_17.setText("浏览") # 浏览 + window.pushButton_18.setText("浏览") # 浏览 + window.pushButton_19.setText("浏览") # 浏览 + window.pushButton_13.setText("浏览") # 浏览 + window.pushButton_14.setText("浏览") # 浏览 + window.btn_alpha.setText("浏览") # 浏览 + window.btn_riscv32.setText("浏览") # 浏览 + window.btn_riscv64.setText("浏览") # 浏览 + window.pushButton_6.setText("应用") # Apply + window.btn_apply_qemu2.setText("应用") # Apply + + # About tab + # label_7 = Built on Python and PyQt technology, licensed under GNU General Public License 3.0 + window.label_7.setText("使用Python和PyQt技术,基于GNU GPLv3许可证进行授权") + + window.label_10.setText( + """ + WARNING: This program comes with ABSOLUTELY NO WARRANTY under applicable law. Please see the GNU GPL license for details. + """ + ) # WARNING: This program comes with ABSOLUTELY NO WARRANTY under applicable law. Please see the GNU GPL license for details. + + window.label_14.setText("Banner made by Tech-FZ.") # Banner made by (insert author of current banner here). + + window.label_21.setText("在社交媒体上的 EmuGUI (使用英语)") # EmuGUI on social media (in English) + + +def translateNewVmCN(window): + window.setWindowTitle("EmuGUI - 创建新的虚拟机") + + # First page + window.lbl_vmname.setText("名称") # Name + window.lbl_arch.setText("架构") # Architecture + window.cb_arch.setPlaceholderText("请选择一个架构") # Please choose an architecture + + window.btn_next1.setText("下一步 >") # Next > + window.btn_cancel1.setText("取消") # Cancel + + # Second page + window.lbl_machine.setText("机型") # Machine + window.lbl_cpu.setText("处理器") # CPU + window.lbl_ram.setText("内存(以MB为单位)") # RAM in MB + + window.cb_machine.setPlaceholderText("请选择一款机型") # Please select a machine + window.cb_cpu.setPlaceholderText("请选择一款处理器") # Please select a processor + + window.pb_prev2.setText("< 上一步") # < Previous + window.pb_next2.setText("下一步 >") # Next > + window.pb_cancel2.setText("取消") # Cancel + + # Combo boxes on second page + i = 0 + + while i < window.cb_machine.count(): + if window.cb_machine.itemText(i) == "Let QEMU decide" or window.cb_machine.itemText(i) == "QEMU überlassen": + window.cb_machine.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + i = 0 + + while i < window.cb_cpu.count(): + if window.cb_cpu.itemText(i) == "Let QEMU decide" or window.cb_cpu.itemText(i) == "QEMU überlassen": + window.cb_cpu.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + # Third page + window.lbl_vhdU.setText("VHD使用情况") # VHD usage + + # Combobox for VHD usage + i = 0 + + while i < window.cb_vhdU.count(): + if window.cb_vhdU.itemText(i) == "Create a new virtual hard drive": + window.cb_vhdU.setItemText(i, "创建一个新的虚拟磁盘") # Create a new virtual hard drive + break + + i += 1 + + i = 0 + + while i < window.cb_vhdU.count(): + if window.cb_vhdU.itemText(i) == "Add an existing virtual hard drive": + window.cb_vhdU.setItemText(i, "添加一个现有的虚拟磁盘") # Add an existing virtual hard drive + break + + i += 1 + + i = 0 + + while i < window.cb_vhdU.count(): + if window.cb_vhdU.itemText(i) == "Don't add a virtual hard drive": + window.cb_vhdU.setItemText(i, "不要添加虚拟磁盘") # Don't add a virtual hard drive + break + + i += 1 + + window.lbl_vhdP.setText("VHD路径") # VHD path + window.lbl_vhdF.setText("VHD文件格式") # VHD file format + window.lbl_maxsize.setText("最大大小") # Maximum size + window.lbl_hddC.setText("硬盘控制器") # HDD controller + + i = 0 + + while i < window.cb_hddC.count(): + if window.cb_hddC.itemText(i) == "Let QEMU decide" or window.cb_hddC.itemText(i) == "QEMU überlassen": + window.cb_hddC.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + window.cb_vhdF.setPlaceholderText("(请选择一种文件格式)") # (Please select a file format) + + window.btn_vhdP.setText("浏览") # 浏览 + window.btn_prev3.setText("< 上一步") # < Previous + window.btn_next3.setText("下一步t >") # Next > + window.btn_cancel3.setText("取消") # Cancel + + # Fourth page + window.lbl_vga.setText("显卡") # VGA + window.lbl_net.setText("网卡") # Network + window.lbl_mouse.setText("鼠标") # Mouse + + window.cb_vga.setPlaceholderText("(请选择一种图形适配器)") # (Please select a graphics adapter) + window.cb_net.setPlaceholderText("(请选择一种网卡)") # (Please select a network adapter) + + window.btn_prev4.setText("< 上一步") # < Previous + window.btn_next4.setText("下一步 >") # Next > + window.btn_cancel4.setText("取消") # Cancel + + # Fifth page + window.lbl_biosLoc.setText( + "外部固件文件(留空使用缺省固件)" + ) # Location of external\nBIOS file (Leave\nempty to use the\ndefault BIOS) + + window.lbl_biosF.setText("外部固件文件") # External BIOS file + + window.btn_biosF.setText("浏览") # 浏览 + window.btn_prev5.setText("< 上一步") # < Previous + window.btn_next5.setText("下一步 >") # Next > + window.btn_cancel5.setText("取消") # Cancel + + # Sixth page + window.lbl_sound.setText("声卡") # Sound card + window.lbl_cores.setText("处理器核心数") # CPU cores + window.lbl_kbd.setText("键盘") # Keyboard + window.lbl_kbdlayout.setText("键盘格式") # Keyboard layout + + window.btn_prev6.setText("< 上一步") # < Previous + window.btn_next6.setText("下一步 >") # Next > + window.btn_cancel6.setText("取消") # Cancel + + # Seventh page + window.lbl_kernel.setText("Linux 内核") # Linux kernel + window.lbl_initrd.setText("Linux 初始化内存盘") # Linux initrd image + window.lbl_cmd.setText("Linux cmd 命令") # Linux cmd args + + window.btn_kernel.setText("浏览") # 浏览 + window.btn_initrd.setText("浏览") # 浏览 + window.btn_prev7.setText("< 上一步") # < Previous + window.btn_next7.setText("下一步 >") # Next > + window.btn_cancel7.setText("取消") # Cancel + + # Eighth page + window.lbl_accel.setText("加速") # Acceleration + window.lbl_cdc1.setText("光驱控制器1") # CD controller 1 + window.lbl_cdc2.setText("光驱控制器2") # CD controller 2 + + i = 0 + + while i < window.cb_cdc1.count(): + if window.cb_cdc1.itemText(i) == "Let QEMU decide" or window.cb_cdc1.itemText(i) == "QEMU überlassen": + window.cb_cdc1.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + i = 0 + + while i < window.cb_cdc2.count(): + if window.cb_cdc2.itemText(i) == "Let QEMU decide" or window.cb_cdc2.itemText(i) == "QEMU überlassen": + window.cb_cdc2.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + window.btn_prev8.setText("< 上一步") # < Previous + window.btn_next8.setText("下一步 >") # Next > + window.btn_cancel8.setText("取消") # Cancel + + # Ninth page + window.lbl_addargs.setText("附加参数 (如果需要)") # Additional arguments (if needed) + + window.checkBox_2.setText( + "我想安装Windows 2000\n(已弃用)") # I want to install Windows 2000\n(depreciated) + window.chb_usb.setText("添加USB支持") # Add USB support + + window.btn_prev9.setText("< 上一步") # < Previous + window.btn_finish.setText("完成") # Finish + window.btn_cancel9.setText("取消") # Cancel + + +def translateStartVmCN(window, vmname): + window.setWindowTitle(f"EmuGUI - 启动 {vmname}") + window.label_4.setText("日期与时间") # Date & Time + window.label_3.setText("引导设备") # Boot from + window.label_6.setText("TPM 路径 (仅Linux)") # TPM path (Linux only) + window.label_7.setText("从终端创建TPM") # Create the TPM from the terminal! + + window.label_5.setText(""" + 注意:如果虚拟机在五分钟内无法启动,你应该检查一下QEMU和虚拟机的设置 + """) # Note: If the VM doesn't start within five minutes, then you should check the VM and QEMU settings. + + window.pushButton.setText("浏览") # 浏览 + window.pushButton_2.setText("浏览") # 浏览 + window.pushButton_6.setText("浏览") # 浏览 + window.pushButton_5.setText("选择系统") # Set to system + window.pushButton_3.setText("启动虚拟机") # Start VM + window.pushButton_4.setText("取消") # Cancel + window.checkBox.setText("使用实时时钟选项") # Use RTC option + + # Combo box for boot + i = 0 + + while i < window.comboBox.count(): + if window.comboBox.itemText(i) == "Let QEMU decide" or window.comboBox.itemText(i) == "QEMU überlassen": + window.comboBox.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + +def translateVmExistsCN(window): + window.label.setText( + "抱歉,已存在一个名字相同的虚拟机" + ) # Sorry, but a VM with this name already exists. + + window.label_2.setText( + "请考虑删除那个虚拟机或者换个名字" + ) # Please consider either deleting that VM or thinking of a new name. + + window.pushButton.setText("确认") # OK + + +def translateVhdExistsCN(window): + # The dialog which used to use this translation function is no longer in use. + window.label.setText( + "抱歉,你要创建的硬盘已经创建" + ) # Sorry, but the disk you want to create is already existant. + + window.label_2.setText("你打算覆盖还是保留它?") # Do you want to keep or overwrite it? + + window.pushButton.setText("覆盖") # Overwrite + window.pushButton_2.setText("保留") # Keep + + +def translateSettingsPendingCN(window): + # The dialog which used to use this translation function is no longer in use. + window.label.setText("你没有设置QEMU路径") + window.label_2.setText("请在设置里设置路径,然后再试一次") + + window.pushButton.setText("OK") # OK + + +def translateVmTooNewCN(window): + window.label.setText( + "这个虚拟机需要更新的EmuGUI才能运行. 请更新您的软件!" + ) # This VM is made with a version of EmuGUI that is too new. Please use a later version! + + window.pushButton.setText("OK") # OK + + +def translateQemuSysMissingCN(window, arch): + window.label.setText( + f"抱歉,EmuGUI还没有配置为使用\"qemu-system-{arch}\" \n但是此组件是虚拟机运行所必需的\n请转到设置/QEMU以解决此问题" + ) # Sorry but EmuGUI is not configured for using \"qemu-system-{arch}\" yet.\nThis component however is necessary to start this virtual machine.\nPlease go to Settings/QEMU to solve this issue. + + window.pushButton.setText("OK") # OK + + +def translateQemuImgMissingCN(window): + window.label.setText( + "抱歉,EmuGUI还未配置\"qemu-img\" \n但是此组件是编辑虚拟机硬盘所必需的\n请转到设置/QEMU已解决此问题." + ) # Sorry but EmuGUI is not configured for using \"qemu-img\" yet.\nThis component however is necessary to create or edit virtual machines.\nPlease go to Settings/QEMU to solve this issue. + + window.pushButton.setText("确认") # OK + + +def translateEditVMCN(window, vmname): + window.setWindowTitle(f"EmuGUI - 编辑虚拟机 {vmname}") + + # Buttons on all tabs + window.btn_cancel.setText("取消") # Cancel + window.btn_ok.setText("确认") # OK + + # Tab names + window.tabWidget.setTabText(0, "一般") # General + window.tabWidget.setTabText(1, "机器") # Machine + window.tabWidget.setTabText(2, "虚拟硬盘") # Virtual hard disks + window.tabWidget.setTabText(3, "外设") # Peripherals + window.tabWidget.setTabText(4, "固件") # BIOS + window.tabWidget.setTabText(6, "附加组件") # Additional components + + # Translations for General tab + window.lbl_name.setText("名称") # Name + window.lbl_arch.setText("架构") # Architecture + + # Translations for Machine tab + window.lbl_cpu.setText("处理器") # CPU + window.lbl_machine.setText("机型") # Machine + window.lbl_ram.setText("内存(以MB为单位)") # RAM in MB + + i = 0 + + while i < window.cb_cpu.count(): + if window.cb_cpu.itemText(i) == "Let QEMU decide" or window.cb_cpu.itemText(i) == "QEMU überlassen": + window.cb_cpu.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + i = 0 + + while i < window.cb_machine.count(): + if window.cb_machine.itemText(i) == "Let QEMU decide" or window.cb_machine.itemText(i) == "QEMU überlassen": + window.cb_machine.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + # Translations for VHD tab + window.lbl_vhdu.setText("VHD 占用情况") # VHD usage + window.lbl_vhdp.setText("VHD 路径") # VHD path + window.lbl_vhdf.setText("VHD 文件格式") # VHD file format + window.lbl_maxsize.setText("最大容量") # Maximum size + window.btn_vhdp.setText("浏览") # 浏览 + + # Combobox for VHD usage + i = 0 + + while i < window.cb_vhdu.count(): + if window.cb_vhdu.itemText(i) == "Create a new virtual hard drive": + window.cb_vhdu.setItemText(i, "创建新的虚拟硬盘") # Create a new virtual hard drive + break + + i += 1 + + i = 0 + + while i < window.cb_vhdu.count(): + if window.cb_vhdu.itemText(i) == "Add an existing virtual hard drive": + window.cb_vhdu.setItemText(i, "添加现有的虚拟硬盘") # Add an existing virtual hard drive + break + + i += 1 + + i = 0 + + while i < window.cb_vhdu.count(): + if window.cb_vhdu.itemText(i) == "Don't add a virtual hard drive": + window.cb_vhdu.setItemText(i, "不要添加虚拟硬盘") # Don't add a virtual hard drive + break + + i += 1 + + window.lbl_cdc1.setText("光驱控制器1") # CD controller 1 + window.lbl_cdc2.setText("光驱控制器2") # CD controller 2 + + i = 0 + + while i < window.cb_cdc1.count(): + if window.cb_cdc1.itemText(i) == "Let QEMU decide" or window.cb_cdc1.itemText(i) == "QEMU überlassen": + window.cb_cdc1.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + i = 0 + + while i < window.cb_cdc2.count(): + if window.cb_cdc2.itemText(i) == "Let QEMU decide" or window.cb_cdc2.itemText(i) == "QEMU überlassen": + window.cb_cdc2.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + window.lbl_hddc.setText("硬盘控制器") # HDD controller + + i = 0 + + while i < window.cb_hddc.count(): + if window.cb_hddc.itemText(i) == "Let QEMU decide" or window.cb_hddc.itemText(i) == "QEMU überlassen": + window.cb_hddc.setItemText(i, "让QEMU自己决定") # Let QEMU decide + break + + i += 1 + + # Translations for Peripherals tab + window.lbl_mouse.setText("鼠标类型") # Mouse type + window.lbl_kbdtype.setText("键盘类型") # Keyboard type + + # Translations for BIOS tab + # Location of external BIOS file (Leave empty to use the default BIOS) + window.lbl_biosloc.setText("外部固件文件的路径(留空使用缺省固件)") + window.lbl_biosf.setText("外部固件文件") # External BIOS file + window.btn_biosf.setText("浏览") # 浏览 + + # Translations for Linux tab + window.lbl_kernel.setText("Linux 内核") # Linux kernel + window.lbl_initrd.setText("Linux 初始化内存盘") # Linux initrd image + window.lbl_cmd.setText("Linux cmd 命令") # Linux cmd arguments + window.btn_kernel.setText("浏览") # 浏览 + window.btn_initrd.setText("浏览") # 浏览 + + # Translations for Additional components tab + window.lbl_vga.setText("显卡") # VGA + window.lbl_net.setText("网卡") # Network adapter + window.lbl_sound.setText("声卡") # Sound card + window.lbl_addargs.setText("附加选项(如果需要的话)") # Additional arguments (if necessary) + window.lbl_cpuc.setText("处理器核心数") # CPU cores + window.chb_usb.setText("添加USB支持") # Add USB support + window.lbl_accel.setText("加速") # Acceleration + + +def translateErrDialogCN(window, errcode): + window.setWindowTitle(f"EmuGUI - 错误") + + if errcode.startswith("C"): + window.label.setText( + "EmuGUI遇到一个严重错误,需要关闭。") # EmuGUI encountered a critical error and needs to be closed. + + elif errcode.startswith("E"): + window.label.setText("EmuGUI 遇到了严重错误") # EmuGUI encountered an error. + + elif errcode.startswith("W"): + window.label.setText("EmuGUI 对你发出了警告") # EmuGUI has to warn you. + + else: + window.label.setText("EmuGUI 有一些事情对你说") # EmuGUI has something to say. + + window.label_2.setText("错误码: " + errcode) # Error Code: + + window.label_3.setText( + "如果多次出现此错误,请联系管理员和/或在EmuGUI Discord服务器或其GitHub存储库上寻求帮助。" + ) # If this error occurs multiple times, contact your administrator and/or ask for help on the EmuGUI Discord Server or on its GitHub repository. + + window.pushButton.setText("OK") # OK \ No newline at end of file diff --git a/ui/Main.ui b/ui/Main.ui index 7068be8..f25bc3a 100644 --- a/ui/Main.ui +++ b/ui/Main.ui @@ -201,6 +201,11 @@ Polski + + + 简体中文 + + diff --git a/ui/ui_Main.py b/ui/ui_Main.py index 5128299..0ef41aa 100644 --- a/ui/ui_Main.py +++ b/ui/ui_Main.py @@ -95,6 +95,8 @@ def setupUi(self, MainWindow): self.comboBox_4.addItem("") self.comboBox_4.addItem("") self.comboBox_4.addItem("") + self.comboBox_4.addItem("") + self.comboBox_4.setObjectName(u"comboBox_4") self.gridLayout_7.addWidget(self.comboBox_4, 0, 1, 1, 1) @@ -423,6 +425,7 @@ def retranslateUi(self, MainWindow): self.comboBox_4.setItemText(1, QCoreApplication.translate("MainWindow", u"English", None)) self.comboBox_4.setItemText(2, QCoreApplication.translate("MainWindow", u"Deutsch", None)) self.comboBox_4.setItemText(3, QCoreApplication.translate("MainWindow", u"\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430", None)) + self.comboBox_4.setItemText(4, QCoreApplication.translate("MainWindow", u"简体中文", None)) self.pushButton_15.setText(QCoreApplication.translate("MainWindow", u"Apply", None)) self.label_15.setText(QCoreApplication.translate("MainWindow", u"Language", None)) diff --git a/uiScripts/ui_Main.py b/uiScripts/ui_Main.py index d8c2e6a..24377b9 100644 --- a/uiScripts/ui_Main.py +++ b/uiScripts/ui_Main.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'Main.ui' ## -## Created by: Qt User Interface Compiler version 6.6.0 +## Created by: Qt User Interface Compiler version 6.10.0 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -114,6 +114,7 @@ def setupUi(self, MainWindow): self.comboBox_4.addItem("") self.comboBox_4.addItem("") self.comboBox_4.addItem("") + self.comboBox_4.addItem("") self.comboBox_4.setObjectName(u"comboBox_4") self.gridLayout_7.addWidget(self.comboBox_4, 0, 1, 1, 1) @@ -580,6 +581,7 @@ def retranslateUi(self, MainWindow): self.comboBox_4.setItemText(10, QCoreApplication.translate("MainWindow", u"Portugu\u00eas", None)) self.comboBox_4.setItemText(11, QCoreApplication.translate("MainWindow", u"Italiano", None)) self.comboBox_4.setItemText(12, QCoreApplication.translate("MainWindow", u"Polski", None)) + self.comboBox_4.setItemText(13, QCoreApplication.translate("MainWindow", u"\u7b80\u4f53\u4e2d\u6587", None)) self.pushButton_15.setText(QCoreApplication.translate("MainWindow", u"Apply", None)) self.label_15.setText(QCoreApplication.translate("MainWindow", u"Language", None))