diff --git a/system/ui/lib/application.py b/system/ui/lib/application.py index e0fb5be86e..a2d3f3c2be 100644 --- a/system/ui/lib/application.py +++ b/system/ui/lib/application.py @@ -12,6 +12,7 @@ from typing import NamedTuple from importlib.resources import as_file, files from openpilot.common.swaglog import cloudlog from openpilot.system.hardware import HARDWARE, PC +from openpilot.system.ui.lib.multilang import Multilang from openpilot.common.realtime import Ratekeeper DEFAULT_FPS = int(os.getenv("FPS", "60")) @@ -135,6 +136,7 @@ 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] = [] @@ -318,11 +320,6 @@ class GuiApplication: def height(self): return self._height - def _load_languages(self): - LANGUAGE_DIR = os.path.join(BASEDIR, "selfdrive", "ui", "translations") - for file in os.listdir(LANGUAGE_DIR): - if file.endswith(".ts"): - pass def _load_fonts(self): # Create a character set from our keyboard layouts diff --git a/system/ui/lib/multilang.py b/system/ui/lib/multilang.py new file mode 100644 index 0000000000..234c06e50d --- /dev/null +++ b/system/ui/lib/multilang.py @@ -0,0 +1,46 @@ +import os +import pyray as rl +from typing import Union +from openpilot.common.params import Params +from openpilot.common.basedir import BASEDIR + + +class Multilang: + def __init__(self): + self._language: str = "main_en" + self._translations: dict[str, dict[str, str]] = {} + + self._load_languages() + self._hook_draw_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 _get_translated_text(self, text: str) -> str: + if self._language not in self._translations: + return text + return self._translations[self._language].get(text, text) + + 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 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