#!/usr/bin/env python3 import argparse import sys import unicodedata from pathlib import Path # pip install pyicu import icu # HACK: Ensure the shared module is visible for this script. sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from shared.glyph_mapping import get_glyph_map from shared.paths import PROJECT_PATHS MISSING_PRINT_LIMIT = 10 LOCALES_TO_TEST = { "ar_SA": "Arabic", "az_AZ": "Azerbaijani", "be_BY": "Belarusian", "bg_BG": "Bulgarian", "bn_IN": "Bengali", "bs_BA": "Bosnian", "ca_ES": "Catalan", "cs_CZ": "Czech", "da_DK": "Danish", "de_DE": "German", "el_GR": "Greek", "en_US": "English", "es_ES": "Spanish", "et_EE": "Estonian", "eu_ES": "Basque", "fa_IR": "Persian", "fi_FI": "Finnish", "fo_FO": "Faroese", "fr_FR": "French", "ga_IE": "Irish", "gl_ES": "Galician", "gu_IN": "Gujarati", "he_IL": "Hebrew", "hi_IN": "Hindi", "hr_HR": "Croatian", "hu_HU": "Hungarian", "hy_AM": "Armenian", "id_ID": "Indonesian", "is_IS": "Icelandic", "it_IT": "Italian", "ja_JP": "Japanese", "ka_GE": "Georgian", "kk_KZ": "Kazakh", "kn_IN": "Kannada", "ko_KR": "Korean", "kok_IN": "Konkani", "lt_LT": "Lithuanian", "lv_LV": "Latvian", "mk_MK": "Macedonian", "ml_IN": "Malayalam", "mn_MN": "Mongolian", "mr_IN": "Marathi", "ms_MY": "Malay", "mt_MT": "Maltese", "nb_NO": "Norwegian Bokmål", "nl_NL": "Dutch", "nn_NO": "Norwegian Nynorsk", "no_NO": "Norwegian", "pa_IN": "Punjabi", "pl_PL": "Polish", "pt_BR": "Portuguese", "pt_PT": "Portuguese", "ro_RO": "Romanian", "ru_RU": "Russian", "se_NO": "Northern Sami", "sk_SK": "Slovak", "sl_SI": "Slovenian", "sr_BA": "Serbian", "sv_SE": "Swedish", "tr_TR": "Turkish", "zh_CN": "Chinese", "zh_TW": "Chinese", } def get_glyphs_for_locale(locale_code: str) -> list[str]: locale = icu.LocaleData(locale_code) results: set[str] = set() for glyph in locale.getExemplarSet(0, 0): results.add(unicodedata.normalize("NFC", glyph.lower())) results.add(unicodedata.normalize("NFC", glyph.upper())) return sorted(r for r in results if len(r) == 1) def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser() parser.add_argument("game", type=int) return parser.parse_args() def main() -> None: args = parse_args() input_dir = PROJECT_PATHS[args.game].data_dir / "glyphs" glyph_map = {glyph.text: glyph for glyph in get_glyph_map(input_dir)} present_glyphs = set(glyph_map.keys()) for locale_code, language_name in LOCALES_TO_TEST.items(): requested_glyphs = set(get_glyphs_for_locale(locale_code)) missing_glyphs = requested_glyphs - present_glyphs print(f"{locale_code:>10s} {language_name} ", end="") if missing_glyphs: print("not supported: missing ", end="") for glyph in sorted(missing_glyphs)[:MISSING_PRINT_LIMIT]: print(f"U+{ord(glyph):04X}:{glyph}", end=" ") if len(missing_glyphs) >= MISSING_PRINT_LIMIT: print(f"...", end=" ") print(f"({len(missing_glyphs)} total)") else: print("supported!") if __name__ == "__main__": main()