forked from IQ.Lvbs/IQ.Pilot
IQ.Pilot Release Commit @ f2a861c
This commit is contained in:
48
iqpilot/selfdrive/ui/tests/test_translations.py
Normal file
48
iqpilot/selfdrive/ui/tests/test_translations.py
Normal file
@@ -0,0 +1,48 @@
|
||||
import gettext
|
||||
import json
|
||||
import re
|
||||
|
||||
import pytest
|
||||
|
||||
from iqpilot.system.ui.lib.multilang import LANGUAGES_FILE, TRANSLATIONS_DIR
|
||||
|
||||
|
||||
FORMAT_ARG = re.compile(r"%(?:\([^)]+\))?[#0+\-]?(?:\d+|\*)?(?:\.\d+|\.\*)?[hlL]?[diouxXeEfFgGcrsa%]")
|
||||
|
||||
|
||||
with LANGUAGES_FILE.open(encoding="utf-8") as stream:
|
||||
LANGUAGES = json.load(stream)
|
||||
|
||||
|
||||
def load_catalog(language_code: str) -> dict[str | tuple[str, int], str]:
|
||||
with TRANSLATIONS_DIR.joinpath(f"app_{language_code}.mo").open("rb") as stream:
|
||||
return gettext.GNUTranslations(stream)._catalog
|
||||
|
||||
|
||||
def message_keys(catalog: dict[str | tuple[str, int], str]) -> set[str]:
|
||||
return {key for key in catalog if isinstance(key, str) and key}
|
||||
|
||||
|
||||
def format_args(text: str) -> list[str]:
|
||||
return sorted(match for match in FORMAT_ARG.findall(text) if match != "%%")
|
||||
|
||||
|
||||
def test_language_codes_are_unique():
|
||||
assert len(LANGUAGES) == len(set(LANGUAGES.values()))
|
||||
|
||||
|
||||
@pytest.mark.parametrize("language_code", LANGUAGES.values(), ids=LANGUAGES.keys())
|
||||
def test_translation_catalog_is_complete(language_code):
|
||||
source = load_catalog("en")
|
||||
translated = load_catalog(language_code)
|
||||
assert message_keys(translated) == message_keys(source)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("language_code", LANGUAGES.values(), ids=LANGUAGES.keys())
|
||||
def test_translation_catalog_entries(language_code):
|
||||
catalog = load_catalog(language_code)
|
||||
for source, translated in catalog.items():
|
||||
if not isinstance(source, str) or not source:
|
||||
continue
|
||||
assert translated
|
||||
assert format_args(translated) == format_args(source)
|
||||
Reference in New Issue
Block a user