Skip to main content

ttf_view/platform/
languages.rs

1use crate::{platform::PlatformId, tables::name::Name};
2use lcid::{LanguageId as Lcid, LcidLookupError};
3use std::borrow::Cow;
4
5#[derive(Debug, Copy, Hash)]
6#[derive_const(Clone, PartialEq, Eq)]
7#[repr(u16)]
8pub enum LanguageId {
9    Tagged(u16) = 0,
10    Macintosh(u16) = 1,
11    Windows(u16) = 3,
12}
13
14impl LanguageId {
15    pub const fn new(platform_id: u16, language_id: u16) -> Option<Self> {
16        PlatformId::new(platform_id)?.language(language_id)
17    }
18
19    pub const fn platform_id(&self) -> Option<u16> {
20        match self {
21            Self::Tagged(_) => None,
22            Self::Macintosh(_) => Some(1),
23            Self::Windows(_) => Some(3),
24        }
25    }
26    pub const fn language_id(&self) -> u16 {
27        match *self {
28            Self::Tagged(x) => x,
29            Self::Macintosh(x) => x,
30            Self::Windows(x) => x,
31        }
32    }
33
34    pub fn tag(&self, table: Option<Name<'_>>) -> Option<Cow<'static, str>> {
35        Some(match *self {
36            Self::Tagged(id) => {
37                Cow::Owned(table?.lang_tags().nth((id & 0x7FFF) as usize)?.string())
38            },
39            Self::Macintosh(id) => Cow::Borrowed(macintosh_language_tag(id)?),
40
41            Self::Windows(id) => match <&Lcid>::try_from(id as u32) {
42                Ok(lcid) => Cow::Borrowed(lcid.name),
43                Err(LcidLookupError::Reserved(_, tag)) => Cow::Borrowed(tag),
44                Err(_) => return None,
45            },
46        })
47    }
48
49    pub fn english_name(&self, table: Option<Name<'_>>) -> Option<Cow<'static, str>> {
50        Some(match *self {
51            Self::Tagged(id) => {
52                let lang_tag = table?.lang_tags().nth((id & 0x7FFF) as usize)?.string();
53                let lcid: &Lcid = lang_tag.as_str().try_into().ok()?;
54                Cow::Borrowed(lcid.english_name)
55            },
56            Self::Macintosh(id) => Cow::Borrowed(macintosh_language_name(id)?),
57
58            Self::Windows(id) => {
59                let lcid: &Lcid = (id as u32).try_into().ok()?;
60                Cow::Borrowed(lcid.english_name)
61            },
62        })
63    }
64}
65
66#[rustfmt::skip]
67fn macintosh_language_tag(id: u16) -> Option<&'static str> {
68    Some(match id {
69        0 => "en", 1 => "fr", 2 => "de", 3 => "it", 4 => "nl", 5 => "sv", 6 => "es", 7 => "da",
70        8 => "pt", 9 => "no", 10 => "he", 11 => "ja", 12 => "ar", 13 => "fi", 14 => "el",
71        15 => "is", 16 => "mt", 17 => "tr", 18 => "hr", 19 => "zh-Hant", 20 => "ur", 21 => "hi",
72        22 => "th", 23 => "ko", 24 => "lt", 25 => "pl", 26 => "hu", 27 => "et", 28 => "lv",
73        29 => "se", 30 => "fo", 31 => "fa", 32 => "ru", 33 => "zh-Hans", 34 => "nl", 35 => "ga",
74        36 => "sq", 37 => "ro", 38 => "cs", 39 => "sk", 40 => "sl", 41 => "yi", 42 => "sr",
75        43 => "mk", 44 => "bg", 45 => "uk", 46 => "be", 47 => "uz", 48 => "kk", 49 => "az-Cyrl",
76        50 => "az-Arab", 51 => "hy", 52 => "ka", 53 => "ro", 54 => "ky", 55 => "tg", 56 => "tk",
77        57 => "mn-Mong", 58 => "mn-Cyrl", 59 => "ps", 60 => "ku", 61 => "ks", 62 => "sd",
78        63 => "bo", 64 => "ne", 65 => "sa", 66 => "mr", 67 => "bn", 68 => "as", 69 => "gu",
79        70 => "pa", 71 => "or", 72 => "ml", 73 => "kn", 74 => "ta", 75 => "te", 76 => "si",
80        77 => "my", 78 => "km", 79 => "lo", 80 => "vi", 81 => "id", 82 => "tl", 83 => "ms-Latn",
81        84 => "ms-Arab", 85 => "am", 86 => "ti", 87 => "om", 88 => "so", 89 => "sw", 90 => "rw",
82        91 => "rn", 92 => "ny", 93 => "mg", 94 => "eo", 128 => "cy", 129 => "eu", 130 => "ca",
83        131 => "la", 132 => "qu", 133 => "gn", 134 => "ay", 135 => "tt", 136 => "ug", 137 => "dz",
84        138 => "jv-Latn", 139 => "su-Latn", 140 => "gl", 141 => "af", 142 => "br", 143 => "iu",
85        144 => "gd", 145 => "gv", 146 => "ga", 147 => "to", 148 => "el", 149 => "kl",
86        150 => "az-Latn",
87        _ => return None,
88    })
89}
90#[rustfmt::skip]
91fn macintosh_language_name(id: u16) -> Option<&'static str> {
92    Some(match id {
93        0 => "English", 1 => "French", 2 => "German", 3 => "Italian", 4 => "Dutch", 5 => "Swedish",
94        6 => "Spanish", 7 => "Danish", 8 => "Portuguese", 9 => "Norwegian", 10 => "Hebrew",
95        11 => "Japanese", 12 => "Arabic", 13 => "Finnish", 14 => "Greek", 15 => "Icelandic",
96        16 => "Maltese", 17 => "Turkish", 18 => "Croatian", 19 => "Chinese (traditional)",
97        20 => "Urdu", 21 => "Hindi", 22 => "Thai", 23 => "Korean", 24 => "Lithuanian",
98        25 => "Polish", 26 => "Hungarian", 27 => "Estonian", 28 => "Latvian", 29 => "Sami",
99        30 => "Faroese", 31 => "Farsi/Persian", 32 => "Russian", 33 => "Chinese (simplified)",
100        34 => "Flemish", 35 => "Irish Gaelic", 36 => "Albanian", 37 => "Romanian", 38 => "Czech",
101        39 => "Slovak", 40 => "Slovenian", 41 => "Yiddish", 42 => "Serbian", 43 => "Macedonian",
102        44 => "Bulgarian", 45 => "Ukrainian", 46 => "Byelorussian", 47 => "Uzbek", 48 => "Kazakh",
103        49 => "Azerbaijani (Cyrillic script)", 50 => "Azerbaijani (Arabic script)",
104        51 => "Armenian", 52 => "Georgian", 53 => "Moldavian", 54 => "Kirghiz", 55 => "Tajiki",
105        56 => "Turkmen", 57 => "Mongolian (Mongolian script)", 58 => "Mongolian (Cyrillic script)",
106        59 => "Pashto", 60 => "Kurdish", 61 => "Kashmiri", 62 => "Sindhi", 63 => "Tibetan",
107        64 => "Nepali", 65 => "Sanskrit", 66 => "Marathi", 67 => "Bengali", 68 => "Assamese",
108        69 => "Gujarati", 70 => "Punjabi", 71 => "Oriya", 72 => "Malayalam", 73 => "Kannada",
109        74 => "Tamil", 75 => "Telugu", 76 => "Sinhalese", 77 => "Burmese", 78 => "Khmer",
110        79 => "Lao", 80 => "Vietnamese", 81 => "Indonesian", 82 => "Tagalog",
111        83 => "Malay (Roman script)", 84 => "Malay (Arabic script)", 85 => "Amharic",
112        86 => "Tigrinya", 87 => "Galla", 88 => "Somali", 89 => "Swahili",
113        90 => "Kinyarwanda/Ruanda", 91 => "Rundi", 92 => "Nyanja/Chewa", 93 => "Malagasy",
114        94 => "Esperanto", 128 => "Welsh", 129 => "Basque", 130 => "Catalan", 131 => "Latin",
115        132 => "Quechua", 133 => "Guarani", 134 => "Aymara", 135 => "Tatar", 136 => "Uighur",
116        137 => "Dzongkha", 138 => "Javanese (Roman script)", 139 => "Sundanese (Roman script)",
117        140 => "Galician", 141 => "Afrikaans", 142 => "Breton", 143 => "Inuktitut",
118        144 => "Scottish Gaelic", 145 => "Manx Gaelic", 146 => "Irish Gaelic (with dot above)",
119        147 => "Tongan", 148 => "Greek (polytonic)", 149 => "Greenlandic",
120        150 => "Azerbaijani (Roman script)",
121        _ => return None,
122    })
123}