新增 `DistractionDetectionLevel` 参数以控制驾驶员分心检测的灵敏度等级,并在 `dmonitoringd.py` 和 `helpers.py` 中实现不同等级对应的时间阈值配置。同时更新了相关逻辑以支持动态调整该参数。 fix(toyota): 支持 Toyota Wildlander PHEV 车型接入与控制 增加对 Toyota Wildlander PHEV 的指纹识别、车辆规格定义及接口适配,确保其在 TSS2 平台下的正常运行,并修正部分雷达ACC判断条件。 feat(ui): 优化 Dragonpilot 设置界面选项显示语言一致性 将 Dragonpilot 设置页面中的多个下拉选项文本进行国际化处理,统一使用翻译函数包裹,提升多语言兼容性。 chore(config): 更新 launch 脚本 API 地址并切换 shell 解释器 修改 `launch_openpilot.sh` 使用 `/usr/bin/bash` 作为解释器,并设置自定义 API 与 Athena 服务地址。 refactor(key): 实现 ECU 秘钥提取脚本并写入参数存储 创建 `key.py` 脚本用于通过 UDS 协议从 ECU 提取 SecOC 密钥,并将其保存至系统参数中供后续使用。 docs(vscode): 移除不再使用的终端配置项 清理 `.vscode/settings.json` 文件中过时的 terminal 配置内容。 feat(fonts): 新增中文字体资源文件 添加 `china.ttf` 字体文件以增强 UI 在中文环境下的渲染效果。 build(payload): 添加二进制负载文件 引入新的二进制 payload 文件用于辅助密钥提取流程。
95 lines
2.6 KiB
Python
95 lines
2.6 KiB
Python
import os
|
|
import json
|
|
import gettext
|
|
from openpilot.common.basedir import BASEDIR
|
|
from openpilot.common.swaglog import cloudlog
|
|
|
|
try:
|
|
from openpilot.common.params import Params
|
|
except ImportError:
|
|
Params = None
|
|
|
|
SYSTEM_UI_DIR = os.path.join(BASEDIR, "system", "ui")
|
|
UI_DIR = os.path.join(BASEDIR, "selfdrive", "ui")
|
|
TRANSLATIONS_DIR = os.path.join(UI_DIR, "translations")
|
|
LANGUAGES_FILE = os.path.join(TRANSLATIONS_DIR, "languages.json")
|
|
|
|
UNIFONT_LANGUAGES = [
|
|
"ar",
|
|
"th",
|
|
]
|
|
|
|
CHINA_LANGUAGES = [
|
|
"zh-CHT",
|
|
"zh-CHS",
|
|
"ko",
|
|
"ja",
|
|
]
|
|
|
|
|
|
class Multilang:
|
|
def __init__(self):
|
|
self._params = Params() if Params is not None else None
|
|
self._language: str = "en"
|
|
self.languages = {}
|
|
self.codes = {}
|
|
self._translation: gettext.NullTranslations | gettext.GNUTranslations = gettext.NullTranslations()
|
|
self._load_languages()
|
|
|
|
@property
|
|
def language(self) -> str:
|
|
return self._language
|
|
|
|
def requires_china(self) -> bool:
|
|
"""Certain languages require china to render their glyphs."""
|
|
return self._language in CHINA_LANGUAGES
|
|
|
|
def requires_unifont(self) -> bool:
|
|
"""Certain languages require unifont to render their glyphs."""
|
|
return self._language in UNIFONT_LANGUAGES
|
|
|
|
def setup(self):
|
|
try:
|
|
with open(os.path.join(TRANSLATIONS_DIR, f'app_{self._language}.mo'), 'rb') as fh:
|
|
translation = gettext.GNUTranslations(fh)
|
|
translation.install()
|
|
self._translation = translation
|
|
cloudlog.warning(f"Loaded translations for language: {self._language}")
|
|
except FileNotFoundError:
|
|
cloudlog.error(f"No translation file found for language: {self._language}, using default.")
|
|
gettext.install('app')
|
|
self._translation = gettext.NullTranslations()
|
|
|
|
def change_language(self, language_code: str) -> None:
|
|
# Reinstall gettext with the selected language
|
|
self._params.put("LanguageSetting", language_code)
|
|
self._language = language_code
|
|
self.setup()
|
|
|
|
def tr(self, text: str) -> str:
|
|
return self._translation.gettext(text)
|
|
|
|
def trn(self, singular: str, plural: str, n: int) -> str:
|
|
return self._translation.ngettext(singular, plural, n)
|
|
|
|
def _load_languages(self):
|
|
with open(LANGUAGES_FILE, encoding='utf-8') as f:
|
|
self.languages = json.load(f)
|
|
self.codes = {v: k for k, v in self.languages.items()}
|
|
|
|
if self._params is not None:
|
|
lang = str(self._params.get("LanguageSetting")).removeprefix("main_")
|
|
if lang in self.codes:
|
|
self._language = lang
|
|
|
|
|
|
multilang = Multilang()
|
|
multilang.setup()
|
|
|
|
tr, trn = multilang.tr, multilang.trn
|
|
|
|
|
|
# no-op marker for static strings translated later
|
|
def tr_noop(s: str) -> str:
|
|
return s
|