# -*- coding: utf-8 -*-
# Licensed under the EUPL v1.2
# © 2020 bicobus <bicobus@keemail.me>
import os
import gettext
import locale
import logging
from qmm import get_data_path
from qmm.common import settings
logger = logging.getLogger(__name__)
DEFAULT_LANGUAGE = "en_US"
# List of maintained translation
# fmt: off
LANGUAGE_CODES = [
('English (United States)', 'en_US'),
('Français', 'fr_FR')
]
LANGUAGE_ALIASES = {
'en': 'en_US',
'fr': 'fr_FR',
'fr_BE': 'fr_FR'
}
# fmt: on
[docs]def normalize_locale(loc: str):
loc = loc.replace("-", "_")
if loc in LANGUAGE_ALIASES.keys():
loc = LANGUAGE_ALIASES[loc]
return loc
[docs]def get_locale():
if not settings["language"] or settings["language"] == "system":
try:
language = locale.getdefaultlocale()[0]
except ValueError:
language = DEFAULT_LANGUAGE
language = normalize_locale(language)
for lang in list_available_languages():
if lang == language:
break
if lang.startswith(language) or language.startswith(lang):
language = lang
break
else:
if settings["language"] not in list_available_languages():
settings["language"] = DEFAULT_LANGUAGE
language = normalize_locale(settings["language"])
return language
[docs]def list_available_languages():
locale_path = get_data_path("locales")
langs = [d for d in os.listdir(locale_path) if os.path.isdir(os.path.join(locale_path, d))]
langs.append(DEFAULT_LANGUAGE)
for lang in langs:
if not any(normalize_locale(lang) == c[1] for c in LANGUAGE_CODES):
logger.warning(
(
"A new translation seems to have been added to the locales "
"directory. Please update the list of maintained translations "
"in the qmm/lang.py file. Code: %s"
),
lang,
)
return [DEFAULT_LANGUAGE]
return langs
[docs]def set_gettext(install=True):
lang = get_locale()
locale_dir = get_data_path("locales")
trans = gettext.translation("qmm", localedir=locale_dir, languages=[lang], fallback=True)
if install:
trans.install()
return trans.gettext