pub(crate) struct LangRow {
pub name: &'static str,
pub script: &'static str,
pub region: &'static str,
pub context: &'static str,
}
pub(crate) struct ScriptRow {
pub name: &'static str,
pub default_lang: Option<&'static str>,
pub example: &'static str,
pub context_aware: bool,
}
pub(crate) static LANGS: &[(&str, LangRow)] = &[
(
"am",
LangRow {
name: "Amharic",
script: "Ethiopic",
region: "African",
context: "none",
},
),
(
"ar",
LangRow {
name: "Arabic",
script: "Arabic",
region: "Middle Eastern",
context: "full",
},
),
(
"as",
LangRow {
name: "Assamese",
script: "Bengali",
region: "Indic",
context: "none",
},
),
(
"ban",
LangRow {
name: "Balinese",
script: "Balinese",
region: "Southeast Asian",
context: "none",
},
),
(
"bax",
LangRow {
name: "Bamum",
script: "Bamum",
region: "African",
context: "none",
},
),
(
"bg",
LangRow {
name: "Bulgarian",
script: "Cyrillic",
region: "European",
context: "none",
},
),
(
"bn",
LangRow {
name: "Bengali",
script: "Bengali",
region: "Indic",
context: "none",
},
),
(
"bo",
LangRow {
name: "Tibetan",
script: "Tibetan",
region: "Central Asian",
context: "none",
},
),
(
"bug",
LangRow {
name: "Buginese",
script: "Buginese",
region: "Southeast Asian",
context: "none",
},
),
(
"ca",
LangRow {
name: "Catalan",
script: "Latin",
region: "European",
context: "none",
},
),
(
"chr",
LangRow {
name: "Cherokee",
script: "Cherokee",
region: "Americas",
context: "none",
},
),
(
"cjm",
LangRow {
name: "Eastern Cham",
script: "Cham",
region: "Southeast Asian",
context: "none",
},
),
(
"cop",
LangRow {
name: "Coptic",
script: "Coptic",
region: "Middle Eastern",
context: "none",
},
),
(
"cs",
LangRow {
name: "Czech",
script: "Latin",
region: "European",
context: "none",
},
),
(
"cy",
LangRow {
name: "Welsh",
script: "Latin",
region: "European",
context: "none",
},
),
(
"da",
LangRow {
name: "Danish",
script: "Latin",
region: "European",
context: "none",
},
),
(
"de",
LangRow {
name: "German",
script: "Latin",
region: "European",
context: "none",
},
),
(
"dv",
LangRow {
name: "Dhivehi (Maldivian)",
script: "Thaana",
region: "South Asian",
context: "none",
},
),
(
"el",
LangRow {
name: "Greek",
script: "Greek",
region: "European",
context: "none",
},
),
(
"es",
LangRow {
name: "Spanish",
script: "Latin",
region: "European",
context: "none",
},
),
(
"et",
LangRow {
name: "Estonian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"fa",
LangRow {
name: "Persian (Farsi)",
script: "Arabic",
region: "Middle Eastern",
context: "partial",
},
),
(
"fi",
LangRow {
name: "Finnish",
script: "Latin",
region: "European",
context: "none",
},
),
(
"fr",
LangRow {
name: "French",
script: "Latin",
region: "European",
context: "none",
},
),
(
"ga",
LangRow {
name: "Irish",
script: "Latin",
region: "European",
context: "none",
},
),
(
"gu",
LangRow {
name: "Gujarati",
script: "Gujarati",
region: "Indic",
context: "none",
},
),
(
"he",
LangRow {
name: "Hebrew",
script: "Hebrew",
region: "Middle Eastern",
context: "full",
},
),
(
"hi",
LangRow {
name: "Hindi",
script: "Devanagari",
region: "Indic",
context: "none",
},
),
(
"hr",
LangRow {
name: "Croatian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"hu",
LangRow {
name: "Hungarian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"hy",
LangRow {
name: "Armenian",
script: "Armenian",
region: "Caucasian",
context: "none",
},
),
(
"is",
LangRow {
name: "Icelandic",
script: "Latin",
region: "European",
context: "none",
},
),
(
"it",
LangRow {
name: "Italian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"ja",
LangRow {
name: "Japanese",
script: "Han",
region: "East Asian",
context: "none",
},
),
(
"ja-kunrei",
LangRow {
name: "Japanese (Kunrei-shiki)",
script: "Han",
region: "East Asian",
context: "none",
},
),
(
"jv",
LangRow {
name: "Javanese",
script: "Javanese",
region: "Southeast Asian",
context: "none",
},
),
(
"ka",
LangRow {
name: "Georgian",
script: "Georgian",
region: "Caucasian",
context: "none",
},
),
(
"khb",
LangRow {
name: "Lü",
script: "NewTaiLue",
region: "Southeast Asian",
context: "none",
},
),
(
"km",
LangRow {
name: "Khmer",
script: "Khmer",
region: "Southeast Asian",
context: "none",
},
),
(
"kn",
LangRow {
name: "Kannada",
script: "Kannada",
region: "Indic",
context: "none",
},
),
(
"ko",
LangRow {
name: "Korean",
script: "Hangul",
region: "East Asian",
context: "none",
},
),
(
"lis",
LangRow {
name: "Lisu",
script: "Lisu",
region: "East Asian",
context: "none",
},
),
(
"lo",
LangRow {
name: "Lao",
script: "Lao",
region: "Southeast Asian",
context: "none",
},
),
(
"lt",
LangRow {
name: "Lithuanian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"lv",
LangRow {
name: "Latvian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"ml",
LangRow {
name: "Malayalam",
script: "Malayalam",
region: "Indic",
context: "none",
},
),
(
"mn",
LangRow {
name: "Mongolian",
script: "Mongolian",
region: "Central Asian",
context: "none",
},
),
(
"mni",
LangRow {
name: "Meitei (Manipuri)",
script: "MeeteiMayek",
region: "Indic",
context: "none",
},
),
(
"mr",
LangRow {
name: "Marathi",
script: "Devanagari",
region: "Indic",
context: "none",
},
),
(
"mt",
LangRow {
name: "Maltese",
script: "Latin",
region: "European",
context: "none",
},
),
(
"my",
LangRow {
name: "Myanmar (Burmese)",
script: "Myanmar",
region: "Southeast Asian",
context: "none",
},
),
(
"ne",
LangRow {
name: "Nepali",
script: "Devanagari",
region: "Indic",
context: "none",
},
),
(
"nl",
LangRow {
name: "Dutch",
script: "Latin",
region: "European",
context: "none",
},
),
(
"no",
LangRow {
name: "Norwegian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"nod",
LangRow {
name: "Northern Thai",
script: "TaiTham",
region: "Southeast Asian",
context: "none",
},
),
(
"nqo",
LangRow {
name: "N'Ko",
script: "NKo",
region: "African",
context: "none",
},
),
(
"or",
LangRow {
name: "Odia",
script: "Oriya",
region: "Indic",
context: "none",
},
),
(
"pa",
LangRow {
name: "Punjabi",
script: "Gurmukhi",
region: "Indic",
context: "none",
},
),
(
"pl",
LangRow {
name: "Polish",
script: "Latin",
region: "European",
context: "none",
},
),
(
"pt",
LangRow {
name: "Portuguese",
script: "Latin",
region: "European",
context: "none",
},
),
(
"ro",
LangRow {
name: "Romanian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"ru",
LangRow {
name: "Russian",
script: "Cyrillic",
region: "European",
context: "none",
},
),
(
"sa",
LangRow {
name: "Sanskrit",
script: "Devanagari",
region: "Indic",
context: "none",
},
),
(
"sat",
LangRow {
name: "Santali",
script: "OlChiki",
region: "Indic",
context: "none",
},
),
(
"si",
LangRow {
name: "Sinhala",
script: "Sinhala",
region: "South Asian",
context: "none",
},
),
(
"sk",
LangRow {
name: "Slovak",
script: "Latin",
region: "European",
context: "none",
},
),
(
"sl",
LangRow {
name: "Slovenian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"sq",
LangRow {
name: "Albanian",
script: "Latin",
region: "European",
context: "none",
},
),
(
"sr",
LangRow {
name: "Serbian",
script: "Cyrillic",
region: "European",
context: "none",
},
),
(
"su",
LangRow {
name: "Sundanese",
script: "Sundanese",
region: "Southeast Asian",
context: "none",
},
),
(
"sv",
LangRow {
name: "Swedish",
script: "Latin",
region: "European",
context: "none",
},
),
(
"syr",
LangRow {
name: "Syriac",
script: "Syriac",
region: "Middle Eastern",
context: "none",
},
),
(
"ta",
LangRow {
name: "Tamil",
script: "Tamil",
region: "Indic",
context: "none",
},
),
(
"tdd",
LangRow {
name: "Tai Nüa",
script: "TaiLe",
region: "Southeast Asian",
context: "none",
},
),
(
"te",
LangRow {
name: "Telugu",
script: "Telugu",
region: "Indic",
context: "none",
},
),
(
"th",
LangRow {
name: "Thai",
script: "Thai",
region: "Southeast Asian",
context: "none",
},
),
(
"tl",
LangRow {
name: "Tagalog/Filipino",
script: "Tagalog",
region: "Southeast Asian",
context: "none",
},
),
(
"tr",
LangRow {
name: "Turkish",
script: "Latin",
region: "European",
context: "none",
},
),
(
"tzm",
LangRow {
name: "Central Atlas Tamazight",
script: "Tifinagh",
region: "African",
context: "none",
},
),
(
"uk",
LangRow {
name: "Ukrainian",
script: "Cyrillic",
region: "European",
context: "none",
},
),
(
"vai",
LangRow {
name: "Vai",
script: "Vai",
region: "African",
context: "none",
},
),
(
"vi",
LangRow {
name: "Vietnamese",
script: "Latin",
region: "Southeast Asian",
context: "none",
},
),
(
"zh",
LangRow {
name: "Chinese",
script: "Han",
region: "East Asian",
context: "none",
},
),
];
pub(crate) static SCRIPTS_META: &[(&str, ScriptRow)] = &[
(
"Arabic",
ScriptRow {
name: "Arabic",
default_lang: Some("ar"),
example: "العربية",
context_aware: true,
},
),
(
"Armenian",
ScriptRow {
name: "Armenian",
default_lang: Some("hy"),
example: "Հայերեն",
context_aware: false,
},
),
(
"Balinese",
ScriptRow {
name: "Balinese",
default_lang: Some("ban"),
example: "ᬅᬓᬗ",
context_aware: false,
},
),
(
"Bamum",
ScriptRow {
name: "Bamum",
default_lang: Some("bax"),
example: "ꚠꚡꚢ",
context_aware: false,
},
),
(
"Bengali",
ScriptRow {
name: "Bengali",
default_lang: Some("bn"),
example: "বাংলা",
context_aware: false,
},
),
(
"Buginese",
ScriptRow {
name: "Buginese (Lontara)",
default_lang: Some("bug"),
example: "ᨀᨁᨂ",
context_aware: false,
},
),
(
"CanadianAboriginal",
ScriptRow {
name: "Canadian Aboriginal Syllabics",
default_lang: None,
example: "ᐃᓄᒃᑎᑐᑦ",
context_aware: false,
},
),
(
"Cham",
ScriptRow {
name: "Cham",
default_lang: Some("cjm"),
example: "ꨀꨁꨂ",
context_aware: false,
},
),
(
"Cherokee",
ScriptRow {
name: "Cherokee",
default_lang: Some("chr"),
example: "ᏣᎳᎩ",
context_aware: false,
},
),
(
"Coptic",
ScriptRow {
name: "Coptic",
default_lang: Some("cop"),
example: "Ⲁⲁ Ⲃⲃ",
context_aware: false,
},
),
(
"Cuneiform",
ScriptRow {
name: "Cuneiform",
default_lang: None,
example: "𒀀𒀁",
context_aware: false,
},
),
(
"Cyrillic",
ScriptRow {
name: "Cyrillic",
default_lang: Some("ru"),
example: "Кириллица",
context_aware: false,
},
),
(
"Devanagari",
ScriptRow {
name: "Devanagari",
default_lang: Some("hi"),
example: "देवनागरी",
context_aware: false,
},
),
(
"Ethiopic",
ScriptRow {
name: "Ethiopic (Ge'ez)",
default_lang: Some("am"),
example: "ኢትዮጵያ",
context_aware: false,
},
),
(
"Georgian",
ScriptRow {
name: "Georgian",
default_lang: Some("ka"),
example: "ქართული",
context_aware: false,
},
),
(
"Gothic",
ScriptRow {
name: "Gothic",
default_lang: None,
example: "𐌰𐌱𐌲",
context_aware: false,
},
),
(
"Greek",
ScriptRow {
name: "Greek",
default_lang: Some("el"),
example: "Ελληνικά",
context_aware: false,
},
),
(
"Gujarati",
ScriptRow {
name: "Gujarati",
default_lang: Some("gu"),
example: "ગુજરાતી",
context_aware: false,
},
),
(
"Gurmukhi",
ScriptRow {
name: "Gurmukhi",
default_lang: Some("pa"),
example: "ਗੁਰਮੁਖੀ",
context_aware: false,
},
),
(
"Han",
ScriptRow {
name: "Han (CJK)",
default_lang: Some("zh"),
example: "漢字",
context_aware: false,
},
),
(
"Hangul",
ScriptRow {
name: "Hangul",
default_lang: Some("ko"),
example: "한글",
context_aware: false,
},
),
(
"Hebrew",
ScriptRow {
name: "Hebrew",
default_lang: Some("he"),
example: "עברית",
context_aware: true,
},
),
(
"Hiragana",
ScriptRow {
name: "Hiragana",
default_lang: Some("ja"),
example: "ひらがな",
context_aware: false,
},
),
(
"Javanese",
ScriptRow {
name: "Javanese",
default_lang: Some("jv"),
example: "ꦗꦮ",
context_aware: false,
},
),
(
"Kannada",
ScriptRow {
name: "Kannada",
default_lang: Some("kn"),
example: "ಕನ್ನಡ",
context_aware: false,
},
),
(
"Katakana",
ScriptRow {
name: "Katakana",
default_lang: Some("ja"),
example: "カタカナ",
context_aware: false,
},
),
(
"Khmer",
ScriptRow {
name: "Khmer",
default_lang: Some("km"),
example: "ខ្មែរ",
context_aware: false,
},
),
(
"Lao",
ScriptRow {
name: "Lao",
default_lang: Some("lo"),
example: "ລາວ",
context_aware: false,
},
),
(
"Latin",
ScriptRow {
name: "Latin",
default_lang: None,
example: "ABCabc",
context_aware: false,
},
),
(
"LinearB",
ScriptRow {
name: "Linear B",
default_lang: None,
example: "𐀀𐀁",
context_aware: false,
},
),
(
"Lisu",
ScriptRow {
name: "Lisu (Fraser)",
default_lang: Some("lis"),
example: "ꓐꓑꓒ",
context_aware: false,
},
),
(
"Malayalam",
ScriptRow {
name: "Malayalam",
default_lang: Some("ml"),
example: "മലയാളം",
context_aware: false,
},
),
(
"MeeteiMayek",
ScriptRow {
name: "Meetei Mayek",
default_lang: Some("mni"),
example: "ꯀꯁꯂ",
context_aware: false,
},
),
(
"Mongolian",
ScriptRow {
name: "Mongolian",
default_lang: Some("mn"),
example: "ᠮᠣᠩᠭᠣᠯ",
context_aware: false,
},
),
(
"Myanmar",
ScriptRow {
name: "Myanmar",
default_lang: Some("my"),
example: "မြန်မာ",
context_aware: false,
},
),
(
"NKo",
ScriptRow {
name: "N'Ko",
default_lang: Some("nqo"),
example: "ߒߞߏ",
context_aware: false,
},
),
(
"NewTaiLue",
ScriptRow {
name: "New Tai Lue",
default_lang: Some("khb"),
example: "ᦀᦁᦂ",
context_aware: false,
},
),
(
"Ogham",
ScriptRow {
name: "Ogham",
default_lang: None,
example: "ᚁᚂᚃ",
context_aware: false,
},
),
(
"OlChiki",
ScriptRow {
name: "Ol Chiki",
default_lang: Some("sat"),
example: "ᱚᱛᱜ",
context_aware: false,
},
),
(
"OldPersian",
ScriptRow {
name: "Old Persian",
default_lang: None,
example: "𐎠𐎡𐎢",
context_aware: false,
},
),
(
"Oriya",
ScriptRow {
name: "Odia",
default_lang: Some("or"),
example: "ଓଡ଼ିଆ",
context_aware: false,
},
),
(
"Runic",
ScriptRow {
name: "Runic",
default_lang: None,
example: "ᚠᚢᚦ",
context_aware: false,
},
),
(
"Sinhala",
ScriptRow {
name: "Sinhala",
default_lang: Some("si"),
example: "සිංහල",
context_aware: false,
},
),
(
"Sundanese",
ScriptRow {
name: "Sundanese",
default_lang: Some("su"),
example: "ᮃᮄᮅ",
context_aware: false,
},
),
(
"Syriac",
ScriptRow {
name: "Syriac",
default_lang: Some("syr"),
example: "ܐܒܓ",
context_aware: false,
},
),
(
"Tagalog",
ScriptRow {
name: "Tagalog (Baybayin)",
default_lang: Some("tl"),
example: "ᜀᜁᜂ",
context_aware: false,
},
),
(
"TaiLe",
ScriptRow {
name: "Tai Le",
default_lang: Some("tdd"),
example: "ᥐᥑᥒ",
context_aware: false,
},
),
(
"TaiTham",
ScriptRow {
name: "Tai Tham (Lanna)",
default_lang: Some("nod"),
example: "ᨠᨡᨢ",
context_aware: false,
},
),
(
"Tamil",
ScriptRow {
name: "Tamil",
default_lang: Some("ta"),
example: "தமிழ்",
context_aware: false,
},
),
(
"Telugu",
ScriptRow {
name: "Telugu",
default_lang: Some("te"),
example: "తెలుగు",
context_aware: false,
},
),
(
"Thaana",
ScriptRow {
name: "Thaana",
default_lang: Some("dv"),
example: "ދިވެހި",
context_aware: false,
},
),
(
"Thai",
ScriptRow {
name: "Thai",
default_lang: Some("th"),
example: "ไทย",
context_aware: false,
},
),
(
"Tibetan",
ScriptRow {
name: "Tibetan",
default_lang: Some("bo"),
example: "བོད",
context_aware: false,
},
),
(
"Tifinagh",
ScriptRow {
name: "Tifinagh",
default_lang: Some("tzm"),
example: "ⴰⴱⴳ",
context_aware: false,
},
),
(
"Vai",
ScriptRow {
name: "Vai",
default_lang: Some("vai"),
example: "ꔀꔁꔂ",
context_aware: false,
},
),
];
pub(crate) static SCRIPTS: &[&str] = &[
"Arabic",
"Armenian",
"Balinese",
"Bamum",
"Bengali",
"Buginese",
"CanadianAboriginal",
"Cham",
"Cherokee",
"Common",
"Coptic",
"Cuneiform",
"Cyrillic",
"Devanagari",
"Ethiopic",
"Georgian",
"Gothic",
"Greek",
"Gujarati",
"Gurmukhi",
"Han",
"Hangul",
"Hebrew",
"Hiragana",
"Inherited",
"Javanese",
"Kannada",
"Katakana",
"Khmer",
"Lao",
"Latin",
"LinearB",
"Lisu",
"Malayalam",
"MeeteiMayek",
"Mongolian",
"Myanmar",
"NKo",
"NewTaiLue",
"Ogham",
"OlChiki",
"OldPersian",
"Oriya",
"Runic",
"Sinhala",
"Sundanese",
"Syriac",
"Tagalog",
"TaiLe",
"TaiTham",
"Tamil",
"Telugu",
"Thaana",
"Thai",
"Tibetan",
"Tifinagh",
"Vai",
];
pub(crate) fn lang(code: &str) -> Option<&'static LangRow> {
LANGS
.binary_search_by_key(&code, |(k, _)| *k)
.ok()
.map(|i| &LANGS[i].1)
}
pub(crate) fn script(name: &str) -> Option<&'static ScriptRow> {
SCRIPTS_META
.binary_search_by_key(&name, |(k, _)| *k)
.ok()
.map(|i| &SCRIPTS_META[i].1)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn langs_sorted_by_code() {
assert!(
LANGS.windows(2).all(|w| w[0].0 < w[1].0),
"LANGS must be strictly sorted by code for binary_search"
);
}
#[test]
fn scripts_meta_sorted_by_name() {
assert!(
SCRIPTS_META.windows(2).all(|w| w[0].0 < w[1].0),
"SCRIPTS_META must be strictly sorted by name for binary_search"
);
}
#[test]
fn scripts_sorted_and_unique() {
assert!(
SCRIPTS.windows(2).all(|w| w[0] < w[1]),
"SCRIPTS must be strictly sorted and unique"
);
}
}