import os
import json
import gettext
from openpilot . common . params import Params
from openpilot . common . basedir import BASEDIR
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 " )
class Multilang :
def __init__ ( self ) :
self . _params = Params ( )
self . languages = { }
self . codes = { }
self . _translation : gettext . NullTranslations | gettext . GNUTranslations | None = None
self . _load_languages ( )
@property
def language ( self ) - > str :
return self . _params . get ( " LanguageSetting " ) or " en "
def setup ( self ) :
language = self . language
try :
with open ( os . path . join ( TRANSLATIONS_DIR , f ' app_ { language } .mo ' ) , ' rb ' ) as fh :
translation = gettext . GNUTranslations ( fh )
translation . install ( )
self . _translation = translation
print ( f " Loaded translations for language: { language } " )
except FileNotFoundError :
print ( f " No translation file found for language: { language } , using default. " )
gettext . install ( ' app ' )
self . _translation = gettext . NullTranslations ( )
return None
def change_language ( self , language_code : str ) - > None :
# Persist selection
if self . _params . get ( " LanguageSetting " ) != language_code :
self . _params . put ( " LanguageSetting " , language_code )
# Reinstall gettext with the selected language
self . setup ( )
def tr ( self , text : str ) - > str :
if self . _translation is None :
self . setup ( )
return self . _translation . gettext ( text )
def trn ( self , singular : str , plural : str , n : int ) - > str :
if self . _translation is None :
self . setup ( )
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 ( ) }
multilang = Multilang ( )
multilang . setup ( )
def tr ( text : str ) - > str :
return multilang . tr ( text )
def trn ( singular : str , plural : str , n : int ) - > str :
return multilang . trn ( singular , plural , n )