"""Language table: one row per language with the codes each engine needs. code = our ID (ISO 639-1 style; also what Whisper understands for speech input) nllb = Meta NLLB-200 code (offline engine) or None google = Google Translate code or None tts = Edge neural-voice locale prefix (None = no voice for that language) speech = True if the speech model can transcribe it (source language) """ from __future__ import annotations # code, name, nllb, google, tts, speech _ROWS = [ ("af", "Afrikaans", "afr_Latn", "af", "af-ZA", True), ("am", "Amharic", "amh_Ethi", "am", "am-ET", True), ("ar", "Arabic", "arb_Arab", "ar", "ar-EG", True), ("as", "Assamese", "asm_Beng", "as", None, True), ("az", "Azerbaijani", "azj_Latn", "az", "az-AZ", True), ("be", "Belarusian", "bel_Cyrl", "be", None, True), ("bg", "Bulgarian", "bul_Cyrl", "bg", "bg-BG", True), ("bn", "Bengali", "ben_Beng", "bn", "bn-BD", True), ("bo", "Tibetan", "bod_Tibt", None, None, True), ("bs", "Bosnian", "bos_Latn", "bs", "bs-BA", True), ("ca", "Catalan", "cat_Latn", "ca", "ca-ES", True), ("ceb", "Cebuano", "ceb_Latn", "ceb", None, False), ("ckb", "Kurdish (Sorani)", "ckb_Arab", "ckb", None, False), ("cs", "Czech", "ces_Latn", "cs", "cs-CZ", True), ("cy", "Welsh", "cym_Latn", "cy", "cy-GB", True), ("da", "Danish", "dan_Latn", "da", "da-DK", True), ("de", "German", "deu_Latn", "de", "de-DE", True), ("el", "Greek", "ell_Grek", "el", "el-GR", True), ("en", "English", "eng_Latn", "en", "en-US", True), ("es", "Spanish", "spa_Latn", "es", "es-MX", True), ("et", "Estonian", "est_Latn", "et", "et-EE", True), ("eu", "Basque", "eus_Latn", "eu", None, True), ("fa", "Persian (Farsi)", "pes_Arab", "fa", "fa-IR", True), ("fi", "Finnish", "fin_Latn", "fi", "fi-FI", True), ("fr", "French", "fra_Latn", "fr", "fr-FR", True), ("ga", "Irish", "gle_Latn", "ga", "ga-IE", False), ("gl", "Galician", "glg_Latn", "gl", "gl-ES", True), ("gu", "Gujarati", "guj_Gujr", "gu", "gu-IN", True), ("ha", "Hausa", "hau_Latn", "ha", None, True), ("haw", "Hawaiian", None, "haw", None, True), ("he", "Hebrew", "heb_Hebr", "iw", "he-IL", True), ("hi", "Hindi", "hin_Deva", "hi", "hi-IN", True), ("hmn", "Hmong", None, "hmn", None, False), ("hr", "Croatian", "hrv_Latn", "hr", "hr-HR", True), ("ht", "Haitian Creole", "hat_Latn", "ht", None, True), ("hu", "Hungarian", "hun_Latn", "hu", "hu-HU", True), ("hy", "Armenian", "hye_Armn", "hy", None, True), ("id", "Indonesian", "ind_Latn", "id", "id-ID", True), ("ig", "Igbo", "ibo_Latn", "ig", None, False), ("ilo", "Ilocano", "ilo_Latn", "ilo", None, False), ("is", "Icelandic", "isl_Latn", "is", "is-IS", True), ("it", "Italian", "ita_Latn", "it", "it-IT", True), ("ja", "Japanese", "jpn_Jpan", "ja", "ja-JP", True), ("jw", "Javanese", "jav_Latn", "jw", "jv-ID", True), ("ka", "Georgian", "kat_Geor", "ka", "ka-GE", True), ("kk", "Kazakh", "kaz_Cyrl", "kk", "kk-KZ", True), ("km", "Khmer", "khm_Khmr", "km", "km-KH", True), ("kn", "Kannada", "kan_Knda", "kn", "kn-IN", True), ("ko", "Korean", "kor_Hang", "ko", "ko-KR", True), ("ku", "Kurdish (Kurmanji)", "kmr_Latn", "ku", None, False), ("ky", "Kyrgyz", "kir_Cyrl", "ky", None, False), ("lb", "Luxembourgish", "ltz_Latn", "lb", None, True), ("lo", "Lao", "lao_Laoo", "lo", "lo-LA", True), ("lt", "Lithuanian", "lit_Latn", "lt", "lt-LT", True), ("lv", "Latvian", "lvs_Latn", "lv", "lv-LV", True), ("mg", "Malagasy", "plt_Latn", "mg", None, True), ("mi", "Maori", "mri_Latn", "mi", None, True), ("mk", "Macedonian", "mkd_Cyrl", "mk", "mk-MK", True), ("ml", "Malayalam", "mal_Mlym", "ml", "ml-IN", True), ("mn", "Mongolian", "khk_Cyrl", "mn", "mn-MN", True), ("mr", "Marathi", "mar_Deva", "mr", "mr-IN", True), ("ms", "Malay", "zsm_Latn", "ms", "ms-MY", True), ("mt", "Maltese", "mlt_Latn", "mt", "mt-MT", True), ("my", "Burmese (Myanmar)", "mya_Mymr", "my", "my-MM", True), ("ne", "Nepali", "npi_Deva", "ne", "ne-NP", True), ("nl", "Dutch", "nld_Latn", "nl", "nl-NL", True), ("no", "Norwegian", "nob_Latn", "no", "nb-NO", True), ("ny", "Chichewa", "nya_Latn", "ny", None, False), ("om", "Oromo", "gaz_Latn", "om", None, False), ("pa", "Punjabi", "pan_Guru", "pa", None, True), ("pl", "Polish", "pol_Latn", "pl", "pl-PL", True), ("ps", "Pashto", "pbt_Arab", "ps", "ps-AF", True), ("pt", "Portuguese", "por_Latn", "pt", "pt-BR", True), ("ro", "Romanian", "ron_Latn", "ro", "ro-RO", True), ("ru", "Russian", "rus_Cyrl", "ru", "ru-RU", True), ("rw", "Kinyarwanda", "kin_Latn", "rw", None, False), ("sd", "Sindhi", "snd_Arab", "sd", None, True), ("si", "Sinhala", "sin_Sinh", "si", "si-LK", True), ("sk", "Slovak", "slk_Latn", "sk", "sk-SK", True), ("sl", "Slovenian", "slv_Latn", "sl", "sl-SI", True), ("sm", "Samoan", "smo_Latn", "sm", None, False), ("sn", "Shona", "sna_Latn", "sn", None, True), ("so", "Somali", "som_Latn", "so", "so-SO", True), ("sq", "Albanian", "als_Latn", "sq", "sq-AL", True), ("sr", "Serbian", "srp_Cyrl", "sr", "sr-RS", True), ("su", "Sundanese", "sun_Latn", "su", "su-ID", True), ("sv", "Swedish", "swe_Latn", "sv", "sv-SE", True), ("sw", "Swahili", "swh_Latn", "sw", "sw-KE", True), ("ta", "Tamil", "tam_Taml", "ta", "ta-IN", True), ("te", "Telugu", "tel_Telu", "te", "te-IN", True), ("tg", "Tajik", "tgk_Cyrl", "tg", None, True), ("th", "Thai", "tha_Thai", "th", "th-TH", True), ("ti", "Tigrinya", "tir_Ethi", "ti", None, False), ("tk", "Turkmen", "tuk_Latn", "tk", None, True), ("tl", "Filipino (Tagalog)", "tgl_Latn", "tl", "fil-PH", True), ("tr", "Turkish", "tur_Latn", "tr", "tr-TR", True), ("tt", "Tatar", "tat_Cyrl", "tt", None, True), ("uk", "Ukrainian", "ukr_Cyrl", "uk", "uk-UA", True), ("ur", "Urdu", "urd_Arab", "ur", "ur-PK", True), ("uz", "Uzbek", "uzn_Latn", "uz", "uz-UZ", True), ("vi", "Vietnamese", "vie_Latn", "vi", "vi-VN", True), ("xh", "Xhosa", "xho_Latn", "xh", None, False), ("yi", "Yiddish", "ydd_Hebr", "yi", None, True), ("yo", "Yoruba", "yor_Latn", "yo", None, True), ("yue", "Cantonese", "yue_Hant", "zh-TW", "zh-HK", True), ("zh", "Chinese (Simplified)", "zho_Hans", "zh-CN", "zh-CN", True), ("zh-TW", "Chinese (Traditional)", "zho_Hant", "zh-TW", "zh-TW", False), ("zu", "Zulu", "zul_Latn", "zu", "zu-ZA", False), ] LANGS = {r[0]: {"code": r[0], "name": r[1], "nllb": r[2], "google": r[3], "tts": r[4], "speech": r[5]} for r in _ROWS} # Most spoken languages in US homes (Census ACS), shown first in the menus POPULAR_US = ["en", "es", "zh", "tl", "vi", "ar", "fr", "ko", "ru", "ht", "pt", "hi", "de", "ur", "fa", "ja", "pl", "it", "so", "lo", "km", "hmn", "th", "am", "pa"] def get(code: str) -> dict: if code not in LANGS: raise ValueError(f"Unknown language code: {code}") return LANGS[code] def public_list() -> list[dict]: return sorted(LANGS.values(), key=lambda r: r["name"])