Track your Anki study sessions directly into Yōten.
1# An ISO 639-1 two-letter language code (e.g., 'en', 'es', 'ko')
2# Pulled from https://tangled.org/yoten.app/yoten/blob/master/internal/db/language.go
3LANGUAGE_CODES = {
4 "aa": "Afar",
5 "ab": "Abkhazian",
6 "af": "Afrikaans",
7 "am": "Amharic",
8 "ar": "Arabic",
9 "as": "Assamese",
10 "ay": "Aymara",
11 "az": "Azerbaijani",
12 "ba": "Bashkir",
13 "be": "Byelorussian",
14 "bg": "Bulgarian",
15 "bh": "Bihari",
16 "bi": "Bislama",
17 "bn": "Bengali",
18 "bo": "Tibetan",
19 "br": "Breton",
20 "ca": "Catalan",
21 "co": "Corsican",
22 "cs": "Czech",
23 "cy": "Welsh",
24 "da": "Danish",
25 "de": "German",
26 "dz": "Bhutani",
27 "el": "Greek",
28 "en": "English",
29 "eo": "Esperanto",
30 "es": "Spanish",
31 "et": "Estonian",
32 "eu": "Basque",
33 "fa": "Persian",
34 "fi": "Finnish",
35 "fj": "Fiji",
36 "fo": "Faroese",
37 "fr": "French",
38 "fy": "Frisian",
39 "ga": "Irish",
40 "gd": "Gaelic (Scottish)",
41 "gl": "Galician",
42 "gn": "Guarani",
43 "gu": "Gujarati",
44 "ha": "Hausa",
45 "he": "Hebrew",
46 "hi": "Hindi",
47 "hr": "Croatian",
48 "hu": "Hungarian",
49 "hy": "Armenian",
50 "ia": "Interlingua",
51 "id": "Indonesian",
52 "ie": "Interlingue",
53 "ik": "Inupiak",
54 "is": "Icelandic",
55 "it": "Italian",
56 "iu": "Inuktitut",
57 "ja": "Japanese",
58 "jw": "Javanese",
59 "ka": "Georgian",
60 "kk": "Kazakh",
61 "kl": "Greenlandic",
62 "km": "Cambodian",
63 "kn": "Kannada",
64 "ko": "Korean",
65 "ks": "Kashmiri",
66 "ku": "Kurdish",
67 "ky": "Kirghiz",
68 "la": "Latin",
69 "ln": "Lingala",
70 "lo": "Laothian",
71 "lt": "Lithuanian",
72 "lv": "Latvian",
73 "mg": "Malagasy",
74 "mi": "Maori",
75 "mk": "Macedonian",
76 "ml": "Malayalam",
77 "mn": "Mongolian",
78 "mo": "Moldavian",
79 "mr": "Marathi",
80 "ms": "Malay",
81 "mt": "Maltese",
82 "my": "Burmese",
83 "na": "Nauru",
84 "ne": "Nepali",
85 "nl": "Dutch",
86 "no": "Norwegian",
87 "oc": "Occitan",
88 "om": "Oromo (Afan)",
89 "or": "Oriya",
90 "pa": "Punjabi",
91 "pl": "Polish",
92 "ps": "Pashto (Pushto)",
93 "pt": "Portuguese",
94 "qu": "Quechua",
95 "rm": "Rhaeto-Romance",
96 "rn": "Kirundi",
97 "ro": "Romanian",
98 "ru": "Russian",
99 "rw": "Kinyarwanda",
100 "sa": "Sanskrit",
101 "sd": "Sindhi",
102 "sg": "Sangro",
103 "sh": "Serbo-Croatian",
104 "si": "Singhalese",
105 "sk": "Slovak",
106 "sl": "Slovenian",
107 "sm": "Samoan",
108 "sn": "Shona",
109 "so": "Somali",
110 "sq": "Albanian",
111 "sr": "Serbian",
112 "ss": "Siswati",
113 "st": "Sesotho",
114 "su": "Sundanese",
115 "sv": "Swedish",
116 "sw": "Swahili",
117 "ta": "Tamil",
118 "te": "Tegulu",
119 "tg": "Tajik",
120 "th": "Thai",
121 "ti": "Tigrinya",
122 "tk": "Turkmen",
123 "tl": "Tagalog",
124 "tn": "Setswana",
125 "to": "Tonga",
126 "tr": "Turkish",
127 "ts": "Tsonga",
128 "tt": "Tatar",
129 "tw": "Twi",
130 "ug": "Uigur",
131 "uk": "Ukrainian",
132 "ur": "Urdu",
133 "uz": "Uzbek",
134 "vi": "Vietnamese",
135 "vo": "Volapuk",
136 "wo": "Wolof",
137 "xh": "Xhosa",
138 "yi": "Yiddish",
139 "yo": "Yoruba",
140 "za": "Zhuang",
141 "zh": "Chinese",
142 "zu": "Zulu",
143}
144
145
146def get_common_languages():
147 common_codes = [
148 "en", "es", "fr", "de", "it", "pt", "ru", "ja", "ko", "zh",
149 "ar", "hi", "nl", "pl", "tr", "vi", "th", "sv", "he", "id"
150 ]
151
152 common = [(code, LANGUAGE_CODES[code])
153 for code in common_codes if code in LANGUAGE_CODES]
154
155 remaining_codes = set(LANGUAGE_CODES.keys()) - set(common_codes)
156 remaining = sorted(
157 [(code, LANGUAGE_CODES[code]) for code in remaining_codes],
158 key=lambda x: x[1] # Sort by language name
159 )
160
161 return common + [("---", "─── Other Languages ───")] + remaining
162
163
164def get_language_name(code: str) -> str:
165 return LANGUAGE_CODES.get(code, code.upper())
166
167
168def is_valid_language_code(code: str) -> bool:
169 return code in LANGUAGE_CODES