Add test for i18n format consistency + fix strings

This commit is contained in:
Alexandre Aubin 2021-08-20 10:29:51 +02:00
parent 6ab93cfc86
commit 9b8f18b116
5 changed files with 68 additions and 16 deletions

View file

@ -38,7 +38,7 @@
"websocket_request_expected": "期望一个WebSocket请求", "websocket_request_expected": "期望一个WebSocket请求",
"cannot_open_file": "不能打开文件{file}(原因:{error}", "cannot_open_file": "不能打开文件{file}(原因:{error}",
"cannot_write_file": "写入文件{file}失败(原因:{error}", "cannot_write_file": "写入文件{file}失败(原因:{error}",
"unknown_error_reading_file": "尝试读取文件{files}时发生未知错误(原因:{errors}", "unknown_error_reading_file": "尝试读取文件{file}时发生未知错误(原因:{error}",
"corrupted_json": "从{ressource}读取的JSON损坏原因{error}", "corrupted_json": "从{ressource}读取的JSON损坏原因{error}",
"corrupted_yaml": "从{ressource}读取的YMAL损坏原因{error}", "corrupted_yaml": "从{ressource}读取的YMAL损坏原因{error}",
"error_writing_file": "写入文件{file}失败:{error}", "error_writing_file": "写入文件{file}失败:{error}",

View file

@ -38,9 +38,9 @@
"websocket_request_expected": "Richiesta WebSocket attesa", "websocket_request_expected": "Richiesta WebSocket attesa",
"cannot_open_file": "Impossibile aprire il file {file} (motivo: {error})", "cannot_open_file": "Impossibile aprire il file {file} (motivo: {error})",
"cannot_write_file": "Impossibile scrivere il file {file} (motivo: {error})", "cannot_write_file": "Impossibile scrivere il file {file} (motivo: {error})",
"unknown_error_reading_file": "Errore sconosciuto durante il tentativo di leggere il file {file} (motivo: {errore})", "unknown_error_reading_file": "Errore sconosciuto durante il tentativo di leggere il file {file} (motivo: {error})",
"corrupted_json": "Lettura JSON corrotta da {resource} (motivo: {error})", "corrupted_json": "Lettura JSON corrotta da {ressource} (motivo: {error})",
"corrupted_yaml": "Lettura YAML corrotta da {resource} (motivo: {error})", "corrupted_yaml": "Lettura YAML corrotta da {ressource} (motivo: {error})",
"error_writing_file": "Errore durante la scrittura del file {file}: {error}", "error_writing_file": "Errore durante la scrittura del file {file}: {error}",
"error_removing": "Errore durante la rimozione {path}: {error}", "error_removing": "Errore durante la rimozione {path}: {error}",
"error_changing_file_permissions": "Errore durante il cambio di permessi per {path}: {error}", "error_changing_file_permissions": "Errore durante il cambio di permessi per {path}: {error}",
@ -54,7 +54,7 @@
"warn_the_user_that_lock_is_acquired": "L'altro comando è appena completato, ora avvio questo comando", "warn_the_user_that_lock_is_acquired": "L'altro comando è appena completato, ora avvio questo comando",
"warn_the_user_about_waiting_lock_again": "Sto ancora aspettando ...", "warn_the_user_about_waiting_lock_again": "Sto ancora aspettando ...",
"warn_the_user_about_waiting_lock": "Un altro comando YunoHost è in esecuzione in questo momento, stiamo aspettando che finisca prima di eseguire questo", "warn_the_user_about_waiting_lock": "Un altro comando YunoHost è in esecuzione in questo momento, stiamo aspettando che finisca prima di eseguire questo",
"corrupted_toml": "TOML corrotto da {ressource} (motivo: {errore})", "corrupted_toml": "TOML corrotto da {ressource} (motivo: {error})",
"invalid_token": "Token non valido: autenticare", "invalid_token": "Token non valido: autenticare",
"session_expired": "La sessione è terminata. Sei pregato di autenticarti nuovamente.", "session_expired": "La sessione è terminata. Sei pregato di autenticarti nuovamente.",
"ldap_server_is_down_restart_it": "Il servizio LDAP è terminato, provo a riavviarlo..." "ldap_server_is_down_restart_it": "Il servizio LDAP è terminato, provo a riavviarlo..."

View file

@ -4,7 +4,7 @@
"websocket_request_expected": "Forventet en WebSocket-forespørsel", "websocket_request_expected": "Forventet en WebSocket-forespørsel",
"warning": "Advarsel:", "warning": "Advarsel:",
"values_mismatch": "Verdiene samsvarer ikke", "values_mismatch": "Verdiene samsvarer ikke",
"unknown_user": "Ukjent '{group}' bruker", "unknown_user": "Ukjent '{user}' bruker",
"unknown_group": "Ukjent '{group}' gruppe", "unknown_group": "Ukjent '{group}' gruppe",
"unable_authenticate": "Kunne ikke identitetsbekrefte", "unable_authenticate": "Kunne ikke identitetsbekrefte",
"success": "Vellykket.", "success": "Vellykket.",

View file

@ -30,21 +30,21 @@
"warn_the_user_that_lock_is_acquired": "diğer komut şimdi tamamlandı, şimdi bu komutu başlatıyor", "warn_the_user_that_lock_is_acquired": "diğer komut şimdi tamamlandı, şimdi bu komutu başlatıyor",
"warn_the_user_about_waiting_lock_again": "Hala bekliyor...", "warn_the_user_about_waiting_lock_again": "Hala bekliyor...",
"warn_the_user_about_waiting_lock": "Başka bir YunoHost komutu şu anda çalışıyor, bunu çalıştırmadan önce bitmesini bekliyoruz", "warn_the_user_about_waiting_lock": "Başka bir YunoHost komutu şu anda çalışıyor, bunu çalıştırmadan önce bitmesini bekliyoruz",
"command_unknown": "'{Command}' komutu bilinmiyor mu?", "command_unknown": "'{command}' komutu bilinmiyor mu?",
"download_bad_status_code": "{url} döndürülen durum kodu {code}", "download_bad_status_code": "{url} döndürülen durum kodu {code}",
"download_unknown_error": "{url} adresinden veri indirilirken hata oluştu: {error}", "download_unknown_error": "{url} adresinden veri indirilirken hata oluştu: {error}",
"download_timeout": "{url} yanıtlaması çok uzun sürdü, pes etti.", "download_timeout": "{url} yanıtlaması çok uzun sürdü, pes etti.",
"download_ssl_error": "{url} ağına bağlanırken SSL hatası", "download_ssl_error": "{url} ağına bağlanırken SSL hatası",
"invalid_url": "Geçersiz url {url} (bu site var mı?)", "invalid_url": "Geçersiz url {url} (bu site var mı?)",
"error_changing_file_permissions": "{Path} için izinler değiştirilirken hata oluştu: {error}", "error_changing_file_permissions": "{path} için izinler değiştirilirken hata oluştu: {error}",
"error_removing": "{Path} kaldırılırken hata oluştu: {error}", "error_removing": "{path} kaldırılırken hata oluştu: {error}",
"error_writing_file": "{File} dosyası yazılırken hata oluştu: {error}", "error_writing_file": "{file} dosyası yazılırken hata oluştu: {error}",
"corrupted_toml": "{Ressource} kaynağından okunan bozuk toml (nedeni: {hata})", "corrupted_toml": "{ressource} kaynağından okunan bozuk toml (nedeni: {error})",
"corrupted_yaml": "{Ressource} kaynağından bozuk yaml okunuyor (nedeni: {error})", "corrupted_yaml": "{ressource} kaynağından bozuk yaml okunuyor (nedeni: {error})",
"corrupted_json": "{Ressource} adresinden okunan bozuk json (nedeni: {error})", "corrupted_json": "{ressource} adresinden okunan bozuk json (nedeni: {error})",
"unknown_error_reading_file": "{File} dosyasını okumaya çalışırken bilinmeyen hata (nedeni: {error})", "unknown_error_reading_file": "{file} dosyasını okumaya çalışırken bilinmeyen hata (nedeni: {error})",
"cannot_write_file": "{File} dosyası yazılamadı (nedeni: {error})", "cannot_write_file": "{file} dosyası yazılamadı (nedeni: {error})",
"cannot_open_file": "{File} dosyasıılamadı (nedeni: {error})", "cannot_open_file": "{file} dosyasıılamadı (nedeni: {error})",
"unknown_user": "Bilinmeyen '{user}' kullanıcı", "unknown_user": "Bilinmeyen '{user}' kullanıcı",
"unknown_group": "Bilinmeyen '{group}' grubu", "unknown_group": "Bilinmeyen '{group}' grubu",
"invalid_usage": "Geçersiz kullanım, yardım görmek için --help iletin", "invalid_usage": "Geçersiz kullanım, yardım görmek için --help iletin",

View file

@ -0,0 +1,52 @@
import re
import json
import glob
import pytest
# List all locale files (except en.json being the ref)
locale_folder = "locales/"
locale_files = glob.glob(locale_folder + "*.json")
locale_files = [filename.split("/")[-1] for filename in locale_files]
locale_files.remove("en.json")
reference = json.loads(open(locale_folder + "en.json").read())
def find_inconsistencies(locale_file):
this_locale = json.loads(open(locale_folder + locale_file).read())
# We iterate over all keys/string in en.json
for key, string in reference.items():
# Ignore check if there's no translation yet for this key
if key not in this_locale:
continue
# Then we check that every "{stuff}" (for python's .format())
# should also be in the translated string, otherwise the .format
# will trigger an exception!
subkeys_in_ref = set(k[0] for k in re.findall(r"{(\w+)(:\w)?}", string))
subkeys_in_this_locale = set(
k[0] for k in re.findall(r"{(\w+)(:\w)?}", this_locale[key])
)
if any(k not in subkeys_in_ref for k in subkeys_in_this_locale):
yield """\n
==========================
Format inconsistency for string {key} in {locale_file}:"
en.json -> {string}
{locale_file} -> {translated_string}
""".format(
key=key,
string=string.encode("utf-8"),
locale_file=locale_file,
translated_string=this_locale[key].encode("utf-8"),
)
@pytest.mark.parametrize("locale_file", locale_files)
def test_translation_format_consistency(locale_file):
inconsistencies = list(find_inconsistencies(locale_file))
if inconsistencies:
raise Exception("".join(inconsistencies))