|
1 | 1 | export enum Language {
|
2 | 2 | ENGLISH_US = "en-US",
|
3 | 3 | SPANISH_MX = "es-MX",
|
4 |
| - CHINESE_CN = "zh-CN", |
5 | 4 | ITALIAN = "it-IT",
|
| 5 | + JAPANESE = "ja-JP", |
| 6 | + FRENCH = "fr-FR", |
| 7 | + CHINESE_CN = "zh-CN", |
| 8 | + GERMAN = "de-DE", |
| 9 | + DUTCH = "nl-NL", |
| 10 | + PORTUGUESE = "pt-PT", |
| 11 | + RUSSIAN = "ru-RU", |
| 12 | + HINDI = "hi-IN", |
| 13 | + KOREAN = "ko-KR", |
| 14 | + SWEDISH = "sv-SE", |
| 15 | + TURKISH = "tr-TR", |
| 16 | + POLISH = "pl-PL" |
6 | 17 | }
|
7 | 18 |
|
8 | 19 | interface LanguageInfo {
|
9 | 20 | code: Language;
|
10 | 21 | name: string;
|
11 |
| - order: number; |
| 22 | + countryCode: string; // ISO 3166-1 alpha-2 country code for flags |
| 23 | + kaikkiName: string; // Name in Kaikki dictionary format |
12 | 24 | }
|
13 | 25 |
|
| 26 | +// ordered by preference/importance |
14 | 27 | export const LANGUAGE_INFO: LanguageInfo[] = [
|
15 |
| - { code: Language.ENGLISH_US, name: "English (US)", order: 1 }, |
16 |
| - { code: Language.SPANISH_MX, name: "Spanish (Mexico)", order: 2 }, |
17 |
| - { code: Language.CHINESE_CN, name: "Chinese (Mandarin)", order: 3 }, |
18 |
| - { code: Language.ITALIAN, name: "Italian", order: 4 }, |
19 |
| -].sort((a, b) => a.order - b.order); |
| 28 | + { code: Language.ENGLISH_US, name: "English (US)", countryCode: "US", kaikkiName: "English" }, |
| 29 | + { code: Language.SPANISH_MX, name: "Spanish (Mexico)", countryCode: "MX", kaikkiName: "Spanish" }, |
| 30 | + { code: Language.ITALIAN, name: "Italian", countryCode: "IT", kaikkiName: "Italian" }, |
| 31 | + { code: Language.JAPANESE, name: "Japanese", countryCode: "JP", kaikkiName: "Japanese" }, |
| 32 | + { code: Language.FRENCH, name: "French", countryCode: "FR", kaikkiName: "French" }, |
| 33 | + { code: Language.CHINESE_CN, name: "Chinese (Mandarin)", countryCode: "CN", kaikkiName: "Chinese" }, |
| 34 | + { code: Language.GERMAN, name: "German", countryCode: "DE", kaikkiName: "German" }, |
| 35 | + { code: Language.DUTCH, name: "Dutch", countryCode: "NL", kaikkiName: "Dutch" }, |
| 36 | + { code: Language.PORTUGUESE, name: "Portuguese", countryCode: "PT", kaikkiName: "Portuguese" }, |
| 37 | + { code: Language.RUSSIAN, name: "Russian", countryCode: "RU", kaikkiName: "Russian" }, |
| 38 | + { code: Language.HINDI, name: "Hindi", countryCode: "IN", kaikkiName: "Hindi" }, |
| 39 | + { code: Language.KOREAN, name: "Korean", countryCode: "KR", kaikkiName: "Korean" }, |
| 40 | + { code: Language.SWEDISH, name: "Swedish", countryCode: "SE", kaikkiName: "Swedish" }, |
| 41 | + { code: Language.TURKISH, name: "Turkish", countryCode: "TR", kaikkiName: "Turkish" }, |
| 42 | + { code: Language.POLISH, name: "Polish", countryCode: "PL", kaikkiName: "Polish" } |
| 43 | +]; |
| 44 | + |
| 45 | +// Get language info by code |
| 46 | +export function getLanguageInfo(code: Language): LanguageInfo { |
| 47 | + const info = LANGUAGE_INFO.find(l => l.code === code); |
| 48 | + if (!info) throw new Error(`No language info for code: ${code}`); |
| 49 | + return info; |
| 50 | +} |
20 | 51 |
|
| 52 | +// Get display name |
21 | 53 | export function describeLanguage(lang: Language): string {
|
22 |
| - return LANGUAGE_INFO.find(info => info.code === lang)?.name ?? lang; |
| 54 | + return getLanguageInfo(lang).name; |
| 55 | +} |
| 56 | + |
| 57 | +// normalize lang codes to basic ISO format (e.g. "en-US" -> "en") |
| 58 | +export function normalizeLanguage(lang: string): string { |
| 59 | + return lang.toLowerCase().split(/[-_]/)[0]; |
| 60 | +} |
| 61 | + |
| 62 | +// Get Kaikki dictionary name for a language |
| 63 | +export function toKaikkiLanguage(lang: Language): KaikkiLanguage { |
| 64 | + return getLanguageInfo(lang).kaikkiName as KaikkiLanguage; |
23 | 65 | }
|
| 66 | + |
| 67 | +// Get country code for flags |
| 68 | +export function getCountryCode(lang: Language): string { |
| 69 | + return getLanguageInfo(lang).countryCode; |
| 70 | +} |
| 71 | + |
| 72 | +// map of Kaikki language names to ISO codes |
| 73 | +export const KAIKKI_LANGUAGE_MAP = { |
| 74 | + English: "en", |
| 75 | + Spanish: "es", |
| 76 | + Italian: "it", |
| 77 | + German: "de", |
| 78 | + Russian: "ru", |
| 79 | + Portuguese: "pt", |
| 80 | + Polish: "pl", |
| 81 | + French: "fr", |
| 82 | + Catalan: "ca", |
| 83 | + Swedish: "sv", |
| 84 | + Latvian: "lv", |
| 85 | + Lithuanian: "lt", |
| 86 | + Dutch: "nl", |
| 87 | + Romanian: "ro", |
| 88 | + Greek: "el", |
| 89 | + Hungarian: "hu", |
| 90 | + Bulgarian: "bg", |
| 91 | + Czech: "cs", |
| 92 | + Ukrainian: "uk", |
| 93 | + Irish: "ga", |
| 94 | + Latin: "la", |
| 95 | + Arabic: "ar", |
| 96 | + Armenian: "hy", |
| 97 | + Azerbaijani: "az", |
| 98 | + Cebuano: "ceb", |
| 99 | + Chinese: "zh", |
| 100 | + Hebrew: "he", |
| 101 | + Hindi: "hi", |
| 102 | + Japanese: "ja", |
| 103 | + Korean: "ko", |
| 104 | + Marathi: "mr", |
| 105 | + Tagalog: "tl", |
| 106 | + Tamil: "ta", |
| 107 | + Telugu: "te", |
| 108 | + Turkish: "tr", |
| 109 | + Urdu: "ur", |
| 110 | + Vietnamese: "vi" |
| 111 | +} as const; |
| 112 | + |
| 113 | +export type KaikkiLanguage = keyof typeof KAIKKI_LANGUAGE_MAP; |
| 114 | + |
| 115 | +// normalize kaikki format to ISO (e.g. "English" -> "en") |
| 116 | +export function normalizeKaikkiLanguage(lang: KaikkiLanguage): string { |
| 117 | + return KAIKKI_LANGUAGE_MAP[lang]; |
| 118 | +} |
| 119 | + |
| 120 | +// all supported kaikki languages |
| 121 | +export const KAIKKI_LANGUAGES = Object.keys(KAIKKI_LANGUAGE_MAP) as KaikkiLanguage[]; |
0 commit comments