Clean up language codes

This commit is contained in:
jpirnay
2026-03-26 10:42:15 +01:00
parent 3f5a2663f6
commit 5da520eb9e
+17 -66
View File
@@ -296,50 +296,6 @@ def report_unused_keys(
# C++ string escaping # C++ string escaping
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
LANG_ABBREVIATIONS = {
"english": "EN",
"español": "ES",
"espanol": "ES",
"italiano": "IT",
"svenska": "SV",
"français": "FR",
"francais": "FR",
"deutsch": "DE",
"german": "DE",
"polski": "PL",
"português": "PT",
"portugues": "PT",
"português (brasil)": "PO",
"中文": "ZH",
"chinese": "ZH",
"日本語": "JA",
"japanese": "JA",
"한국어": "KO",
"korean": "KO",
"русский": "RU",
"russian": "RU",
"العربية": "AR",
"arabic": "AR",
"עברית": "HE",
"hebrew": "HE",
"فارسی": "FA",
"persian": "FA",
"čeština": "CS",
"türkçe": "TR",
"turkish": "TR",
"Қазақша": "KK",
"kazakh": "KK",
}
def get_lang_abbreviation(lang_code: str, lang_name: str) -> str:
"""Return a 2-letter abbreviation for a language."""
lower = lang_name.lower()
if lower in LANG_ABBREVIATIONS:
return LANG_ABBREVIATIONS[lower]
return lang_code[:2].upper()
def escape_cpp_string(s: str) -> List[str]: def escape_cpp_string(s: str) -> List[str]:
r""" r"""
Convert *s* into one or more C++ string literal segments. Convert *s* into one or more C++ string literal segments.
@@ -494,10 +450,9 @@ def generate_keys_header(
"namespace i18n_strings {", "namespace i18n_strings {",
] ]
for code, name in zip(languages, language_names): for code in languages:
abbrev = get_lang_abbreviation(code, name) lines.append(f"extern const char STRINGS_{code}_DATA[];")
lines.append(f"extern const char STRINGS_{abbrev}_DATA[];") lines.append(f"extern const uint16_t OFFSETS_{code}[];")
lines.append(f"extern const uint16_t OFFSETS_{abbrev}[];")
lines.append("} // namespace i18n_strings") lines.append("} // namespace i18n_strings")
lines.append("") lines.append("")
@@ -541,16 +496,15 @@ def generate_keys_header(
lines.append("// Helper function to get string data for a language") lines.append("// Helper function to get string data for a language")
lines.append("inline LangStrings getLanguageStrings(Language lang) {") lines.append("inline LangStrings getLanguageStrings(Language lang) {")
lines.append(" switch (lang) {") lines.append(" switch (lang) {")
for code, name in zip(languages, language_names): for code in languages:
abbrev = get_lang_abbreviation(code, name)
lines.append(f" case Language::{code}:") lines.append(f" case Language::{code}:")
lines.append( lines.append(
f" return {{i18n_strings::STRINGS_{abbrev}_DATA, i18n_strings::OFFSETS_{abbrev}}};" f" return {{i18n_strings::STRINGS_{code}_DATA, i18n_strings::OFFSETS_{code}}};"
) )
first_abbrev = get_lang_abbreviation(languages[0], language_names[0]) first_code = languages[0]
lines.append(" default:") lines.append(" default:")
lines.append( lines.append(
f" return {{i18n_strings::STRINGS_{first_abbrev}_DATA, i18n_strings::OFFSETS_{first_abbrev}}};" f" return {{i18n_strings::STRINGS_{first_code}_DATA, i18n_strings::OFFSETS_{first_code}}};"
) )
lines.append(" }") lines.append(" }")
lines.append("}") lines.append("}")
@@ -606,10 +560,9 @@ def generate_strings_header(
"", "",
] ]
for code, name in zip(languages, language_names): for code in languages:
abbrev = get_lang_abbreviation(code, name) lines.append(f"extern const char STRINGS_{code}_DATA[];")
lines.append(f"extern const char STRINGS_{abbrev}_DATA[];") lines.append(f"extern const uint16_t OFFSETS_{code}[];")
lines.append(f"extern const uint16_t OFFSETS_{abbrev}[];")
lines.append("") lines.append("")
lines.append("} // namespace i18n_strings") lines.append("} // namespace i18n_strings")
@@ -654,8 +607,7 @@ def generate_strings_cpp(
lines.append("namespace i18n_strings {") lines.append("namespace i18n_strings {")
lines.append("") lines.append("")
for lang_idx, (code, name) in enumerate(zip(languages, language_names)): for lang_idx, code in enumerate(languages):
abbrev = get_lang_abbreviation(code, name)
lang_strings = [translations[key][lang_idx] for key in string_keys] lang_strings = [translations[key][lang_idx] for key in string_keys]
# Precompute byte offsets (UTF-8 encoded, +1 per string for null terminator) # Precompute byte offsets (UTF-8 encoded, +1 per string for null terminator)
@@ -673,7 +625,7 @@ def generate_strings_cpp(
# Flat string data blob — all strings concatenated with \0 separators. # Flat string data blob — all strings concatenated with \0 separators.
# clang-format off/on avoids reformatting of the adjacent string literals. # clang-format off/on avoids reformatting of the adjacent string literals.
lines.append("// clang-format off") lines.append("// clang-format off")
lines.append(f"const char STRINGS_{abbrev}_DATA[] =") lines.append(f"const char STRINGS_{code}_DATA[] =")
for text in lang_strings: for text in lang_strings:
_append_string_data_entry(lines, text) _append_string_data_entry(lines, text)
lines.append(";") lines.append(";")
@@ -681,7 +633,7 @@ def generate_strings_cpp(
lines.append("") lines.append("")
# Offset table — one uint16_t per StrId # Offset table — one uint16_t per StrId
lines.append(f"const uint16_t OFFSETS_{abbrev}[] = {{") lines.append(f"const uint16_t OFFSETS_{code}[] = {{")
chunk_size = 12 chunk_size = 12
for i in range(0, len(offsets), chunk_size): for i in range(0, len(offsets), chunk_size):
chunk = offsets[i : i + chunk_size] chunk = offsets[i : i + chunk_size]
@@ -694,14 +646,13 @@ def generate_strings_cpp(
# Compile-time size checks # Compile-time size checks
lines.append("// Compile-time validation of array sizes") lines.append("// Compile-time validation of array sizes")
for code, name in zip(languages, language_names): for code in languages:
abbrev = get_lang_abbreviation(code, name)
lines.append( lines.append(
f"static_assert(sizeof(i18n_strings::OFFSETS_{abbrev}) " f"static_assert(sizeof(i18n_strings::OFFSETS_{code}) "
f"/ sizeof(i18n_strings::OFFSETS_{abbrev}[0]) ==" f"/ sizeof(i18n_strings::OFFSETS_{code}[0]) =="
) )
lines.append(" static_cast<size_t>(StrId::_COUNT),") lines.append(" static_cast<size_t>(StrId::_COUNT),")
lines.append(f' "OFFSETS_{abbrev} size mismatch");') lines.append(f' "OFFSETS_{code} size mismatch");')
_write_file(output_path, lines, verbose) _write_file(output_path, lines, verbose)