147 lines
4.8 KiB
Python
147 lines
4.8 KiB
Python
# UI语言设置
|
||
|
||
import os
|
||
from PySide2.QtCore import QTranslator
|
||
|
||
from . import pre_configs
|
||
from plugin_i18n import setLangCode
|
||
from umi_log import logger
|
||
|
||
I18nDir = "i18n" # 翻译文件 目录
|
||
DefaultLang = "zh_CN" # 默认语言,项目中qsTr()标记的原生语言,无翻译文件。
|
||
|
||
# 语言表。每个语种只有第一个语言代码是有效的(对应到翻译文件.qm),
|
||
# 其余的语言代码会映射到第一个。如zh_HK会映射到zh_TW,en_CA映射到en_US。
|
||
# https://www.science.co.il/language/Locale-codes.php
|
||
LanguageCodes = {
|
||
# ===== 简中 =====
|
||
"zh_CN": "简体中文",
|
||
"zh": "简体中文",
|
||
# ===== 繁中 =====
|
||
"zh_TW": "繁體中文", # 中国台湾
|
||
"zh_HK": "繁體中文", # 中国香港
|
||
"zh_MO": "繁體中文", # 中国澳门
|
||
"zh_SG": "繁體中文", # 新加坡
|
||
# ===== 英语 =====
|
||
"en_US": "English", # 美国
|
||
"en": "English",
|
||
"en_GB": "English", # 英国
|
||
"en_AU": "English", # 澳大利亚
|
||
"en_CA": "English", # 加拿大
|
||
# ===== 日语 =====
|
||
"ja_JP": "日本語", # 日本
|
||
# ===== 俄语 =====
|
||
"ru_RU": "Русский", # 俄罗斯
|
||
"ru": "Русский",
|
||
# ===== 葡萄牙语 =====
|
||
"pt": "Português",
|
||
"pt_BR": "Português", # 巴西
|
||
"pt_PT": "Português", # 葡萄牙
|
||
# ===== 泰米尔语 =====
|
||
"ta": "தமிழ்",
|
||
"ta_TA": "தமிழ்",
|
||
}
|
||
|
||
""" 暂未启用的语言
|
||
# ===== 韩语 =====
|
||
"ko_KR": "한국어", # 韩国
|
||
# ===== 法语 =====
|
||
"fr_FR": "Français", # 法国
|
||
"fr": "Français",
|
||
"fr_CA": "Français", # 加拿大(魁北克)
|
||
"fr_BE": "Français", # 比利时
|
||
# ===== 意大利语 =====
|
||
"it_IT": "Italiano",
|
||
# ===== 挪威语 =====
|
||
"nb_NO": "norsk",
|
||
# ===== 德语 =====
|
||
"de_DE": "Deutsch",
|
||
"de": "Deutsch",
|
||
"de_AT": "Deutsch",
|
||
"de_CH": "Deutsch",
|
||
# ===== 西班牙语 Spanish =====
|
||
"es_ES": "Español",
|
||
"es_MX": "Español",
|
||
"""
|
||
|
||
|
||
class _I18n:
|
||
def init(self, qtApp):
|
||
translator = QTranslator()
|
||
qtApp.translators = [translator]
|
||
|
||
self.langCode = ""
|
||
self.langDict = {}
|
||
# 获取信息
|
||
self._getLangPath()
|
||
text, path = self.langDict[self.langCode]
|
||
setLangCode(self.langCode) # 设置插件翻译
|
||
if not path:
|
||
logger.debug("使用默认文本,未加载翻译。")
|
||
return
|
||
if not translator.load(path):
|
||
msg = f"无法加载UI语言!\n[Error] Unable to load UI language: {path}"
|
||
logger.warning(msg)
|
||
os.MessageBox(msg, type_="warning")
|
||
return
|
||
if not qtApp.installTranslator(translator): # 安装翻译器
|
||
msg = f"无法加载翻译模块!\n[Error] Unable to installTranslator: {path}"
|
||
logger.warning(msg)
|
||
os.MessageBox(msg, type_="warning")
|
||
return
|
||
logger.info(f"i18n file loaded successfully. {self.langCode} - {text}")
|
||
|
||
# 切换语言
|
||
def setLanguage(self, code):
|
||
if code in self.langDict:
|
||
self.langCode = code
|
||
pre_configs.setValue("i18n", code) # 写入预配置项
|
||
return True
|
||
return False
|
||
|
||
# 获取语言参数
|
||
def getInfos(self):
|
||
return [self.langCode, self.langDict]
|
||
|
||
# 获取当前翻译文件路径,如果没有配置文件则初始化
|
||
def _getLangPath(self):
|
||
self.langDict = {}
|
||
self.langCode = ""
|
||
# 搜索本地翻译文件
|
||
for file in os.listdir(I18nDir):
|
||
if file.endswith(".qm"):
|
||
code = os.path.splitext(file)[0]
|
||
path = os.path.join(I18nDir, file)
|
||
text = LanguageCodes.get(code, code)
|
||
self.langDict[code] = [text, path]
|
||
if DefaultLang not in self.langDict:
|
||
text = LanguageCodes[DefaultLang]
|
||
self.langDict[DefaultLang] = [text, ""]
|
||
# 加载预配置项
|
||
code = pre_configs.getValue("i18n")
|
||
if code in self.langDict:
|
||
self.langCode = code
|
||
# 未能加载,则初始化预配置
|
||
if not self.langCode:
|
||
import locale
|
||
|
||
# 取得当前系统语言
|
||
code, encoding = locale.getdefaultlocale()
|
||
# 映射首位代号
|
||
if code in LanguageCodes:
|
||
langStr = LanguageCodes[code]
|
||
for c, l in LanguageCodes.items():
|
||
if l == langStr:
|
||
code = c
|
||
break
|
||
# 尝试写入配置
|
||
if not self.setLanguage(code):
|
||
# 写入配置失败,则使用默认语言
|
||
self.setLanguage(DefaultLang)
|
||
logger.warning(
|
||
f"The current system language is {code} and there is no corresponding i18n file. The default language used is {DefaultLang}."
|
||
)
|
||
|
||
|
||
I18n = _I18n()
|