diff --git a/selfdrive/ui/layouts/home.py b/selfdrive/ui/layouts/home.py index 1833e2293d..34a7558cdc 100644 --- a/selfdrive/ui/layouts/home.py +++ b/selfdrive/ui/layouts/home.py @@ -166,7 +166,7 @@ class HomeLayout(Widget): highlight_color = rl.Color(255, 70, 70, 255) if self.current_state == HomeLayoutState.ALERTS else rl.Color(226, 44, 44, 255) rl.draw_rectangle_rounded(self.alert_notif_rect, 0.3, 10, highlight_color) - alert_text = trn("{n} ALERT", "{n} ALERTS", self.alert_count).format(self.alert_count) + alert_text = trn("{} ALERT", "{} ALERTS", self.alert_count).format(self.alert_count) text_size = measure_text_cached(font, alert_text, HEAD_BUTTON_FONT_SIZE) text_x = self.alert_notif_rect.x + (self.alert_notif_rect.width - text_size.x) // 2 text_y = self.alert_notif_rect.y + (self.alert_notif_rect.height - text_size.y) // 2 diff --git a/system/ui/lib/application.py b/system/ui/lib/application.py index ad1761def2..aeeadcebb4 100644 --- a/system/ui/lib/application.py +++ b/system/ui/lib/application.py @@ -14,7 +14,6 @@ from typing import NamedTuple from importlib.resources import as_file, files from openpilot.common.swaglog import cloudlog from openpilot.system.hardware import HARDWARE, PC, TICI -from openpilot.system.ui.lib.multilang import Multilang from openpilot.common.realtime import Ratekeeper _DEFAULT_FPS = int(os.getenv("FPS", 20 if TICI else 60)) @@ -142,7 +141,6 @@ class GuiApplication: self._window_close_requested = False self._trace_log_callback = None self._modal_overlay = ModalOverlay() - self._multilang = Multilang() self._mouse = MouseState(self._scale) self._mouse_events: list[MouseEvent] = [] diff --git a/system/ui/lib/multilang.py b/system/ui/lib/multilang.py index 2dd4b61e79..30077a0322 100644 --- a/system/ui/lib/multilang.py +++ b/system/ui/lib/multilang.py @@ -1,7 +1,5 @@ import os import gettext -import pyray as rl -from typing import Union from openpilot.common.params import Params from openpilot.common.basedir import BASEDIR @@ -13,52 +11,51 @@ LANGUAGES_FILE = os.path.join(TRANSLATIONS_DIR, "languages.json") class Multilang: def __init__(self): - self._language: str = "en" - self._translations: dict[str, dict[str, str]] = {} + self._params = Params() + self._language: str = self._params.get("LanguageSetting").strip("main_") + print(f"Multilang initialized with language: {self._language}") - self._load_languages() - self._hook_draw_text() + # self._translations: dict[str, dict[str, str]] = {} - def translate(self, text: str) -> str: - if self._language not in self._translations: - return text - return self._translations[self._language].get(text, text) + # self._load_languages() - def _load_languages(self): - self._language = Params().get("LanguageSetting") + def setup(self): + # global tr, trn + try: + with open(os.path.join(TRANSLATIONS_DIR, f'app_{self._language}.mo'), 'rb') as fh: + translation = gettext.GNUTranslations(fh) + translation.install() + tr = translation.gettext + trn = translation.ngettext + print(f"Loaded translations for language: {self._language}") + except FileNotFoundError: + print(f"No translation file found for language: {self._language}, using default.") + gettext.install('app') + tr = gettext.gettext + trn = gettext.ngettext - LANGUAGE_DIR = os.path.join(BASEDIR, "selfdrive", "ui", "translations") - for file in os.listdir(LANGUAGE_DIR): - if file.endswith(".ts"): - pass + return tr, trn - def _get_translated_text(self, text: str) -> str: - # print("Translating:", text, "to", self._language, self._translations.keys()) - if self._language not in self._translations: - return text - return self._translations[self._language].get(text, text) + def install_language(self, language: str): + # install and set globals + global tr, trn + self._language = language + tr, trn = self.setup() - def _hook_draw_text(self): - # hook rl.draw_text* to get text for multilang - # TODO: and measure text - original_draw_text = rl.draw_text - original_draw_text_ex = rl.draw_text_ex + # def translate(self, text: str) -> str: + # if self._language not in self._translations: + # return text + # return self._translations[self._language].get(text, text) + # + # def _load_languages(self): + # self._language = Params().get("LanguageSetting") + # + # LANGUAGE_DIR = os.path.join(BASEDIR, "selfdrive", "ui", "translations") + # for file in os.listdir(LANGUAGE_DIR): + # if file.endswith(".ts"): + # pass - def draw_text_wrapper(text: str, posX: int, posY: int, fontSize: int, color: Union[rl.Color, list, tuple]) -> None: - assert False - text = self._get_translated_text(text) - return original_draw_text(text, posX, posY, fontSize, color) - def draw_text_ex_wrapper(font: Union[rl.Font, list, tuple], text: str, position: Union[rl.Vector2, list, tuple], fontSize: float, spacing: float, - tint: Union[rl.Color, list, tuple]) -> None: - text = self._get_translated_text(text) - return original_draw_text_ex(font, text, position, fontSize, spacing, tint) - - rl.draw_text = draw_text_wrapper - rl.draw_text_ex = draw_text_ex_wrapper - - -# multilang = Multilang() # # l = gettext.translation('app_de', localedir=TRANSLATIONS_DIR, languages=['de']) # with open(os.path.join(TRANSLATIONS_DIR, 'app_de.mo'), 'rb') as fh: # l = gettext.GNUTranslations(fh) @@ -67,3 +64,9 @@ class Multilang: # # tr = gettext.gettext # tr = l.gettext # trn = l.ngettext + +# tr, trn = None, None +# multilang = Multilang() + +multilang = Multilang() +tr, trn = multilang.setup()