import glob import locale import os from typing import Tuple, Set from bauh.view.util import resource class I18n(dict): def __init__(self, current_key: str, current_locale: dict, default_key: str, default_locale: dict): super(I18n, self).__init__() self.current_key = current_key self.current = current_locale self.default_key = default_key self.default = default_locale def __getitem__(self, item): try: return self.current.__getitem__(item) except KeyError: if self.default: try: return self.default.__getitem__(item) except KeyError: return item else: return item def get(self, *args, **kwargs): res = self.current.get(args[0]) if res is None: if self.default: return self.default.get(*args, **kwargs) else: return self.current.get(*args, **kwargs) return res def get_available_keys() -> Set[str]: locale_dir = resource.get_path('locale') return {file.split('/')[-1] for file in glob.glob(locale_dir + '/*') if os.path.isfile(file)} def get_locale_keys(key: str = None, locale_dir: str = resource.get_path('locale')) -> Tuple[str, dict]: locale_path = None if key is None: try: current_locale = locale.getdefaultlocale() if current_locale is None or current_locale[0] is None: current_locale = ('en', 'UTF-8') except: current_locale = ('en', 'UTF-8') else: current_locale = [key.strip().lower()] if current_locale: current_locale = current_locale[0] for locale_file in glob.glob(locale_dir + '/*'): name = locale_file.split('/')[-1] if current_locale == name or current_locale.startswith(name + '_'): locale_path = locale_file break if not locale_path: return current_locale if current_locale else key, {} with open(locale_path, 'r') as f: locale_keys = f.readlines() locale_obj = {} for line in locale_keys: line_strip = line.strip() if line_strip: try: keyval = line_strip.split('=') locale_obj[keyval[0].strip()] = keyval[1].strip() except: print("Error decoding i18n line '{}'".format(line)) return locale_path.split('/')[-1], locale_obj