tl_cli/translation/
language.rs

1//! Language code validation and supported languages.
2
3use anyhow::Result;
4
5use crate::ui::Style;
6
7/// Supported language codes (ISO 639-1) and their names.
8pub const SUPPORTED_LANGUAGES: &[(&str, &str)] = &[
9    ("af", "Afrikaans"),
10    ("am", "Amharic"),
11    ("ar", "Arabic"),
12    ("az", "Azerbaijani"),
13    ("be", "Belarusian"),
14    ("bg", "Bulgarian"),
15    ("bn", "Bengali"),
16    ("bs", "Bosnian"),
17    ("ca", "Catalan"),
18    ("cs", "Czech"),
19    ("cy", "Welsh"),
20    ("da", "Danish"),
21    ("de", "German"),
22    ("el", "Greek"),
23    ("en", "English"),
24    ("es", "Spanish"),
25    ("et", "Estonian"),
26    ("eu", "Basque"),
27    ("fa", "Persian"),
28    ("fi", "Finnish"),
29    ("fil", "Filipino"),
30    ("fr", "French"),
31    ("ga", "Irish"),
32    ("gl", "Galician"),
33    ("gu", "Gujarati"),
34    ("he", "Hebrew"),
35    ("hi", "Hindi"),
36    ("hr", "Croatian"),
37    ("hu", "Hungarian"),
38    ("hy", "Armenian"),
39    ("id", "Indonesian"),
40    ("is", "Icelandic"),
41    ("it", "Italian"),
42    ("ja", "Japanese"),
43    ("ka", "Georgian"),
44    ("kk", "Kazakh"),
45    ("km", "Khmer"),
46    ("kn", "Kannada"),
47    ("ko", "Korean"),
48    ("la", "Latin"),
49    ("lo", "Lao"),
50    ("lt", "Lithuanian"),
51    ("lv", "Latvian"),
52    ("mk", "Macedonian"),
53    ("ml", "Malayalam"),
54    ("mn", "Mongolian"),
55    ("mr", "Marathi"),
56    ("ms", "Malay"),
57    ("mt", "Maltese"),
58    ("my", "Myanmar (Burmese)"),
59    ("ne", "Nepali"),
60    ("nl", "Dutch"),
61    ("no", "Norwegian"),
62    ("pa", "Punjabi"),
63    ("pl", "Polish"),
64    ("ps", "Pashto"),
65    ("pt", "Portuguese"),
66    ("ro", "Romanian"),
67    ("ru", "Russian"),
68    ("si", "Sinhala"),
69    ("sk", "Slovak"),
70    ("sl", "Slovenian"),
71    ("sq", "Albanian"),
72    ("sr", "Serbian"),
73    ("sv", "Swedish"),
74    ("sw", "Swahili"),
75    ("ta", "Tamil"),
76    ("te", "Telugu"),
77    ("th", "Thai"),
78    ("tl", "Tagalog"),
79    ("tr", "Turkish"),
80    ("uk", "Ukrainian"),
81    ("ur", "Urdu"),
82    ("uz", "Uzbek"),
83    ("vi", "Vietnamese"),
84    ("zh", "Chinese (Simplified)"),
85    ("zh-TW", "Chinese (Traditional)"),
86];
87
88/// Prints all supported language codes to stdout.
89pub fn print_languages() {
90    println!("{}", Style::header("Supported language codes (ISO 639-1)"));
91    for (code, name) in SUPPORTED_LANGUAGES {
92        println!("  {:5} {}", Style::code(code), Style::secondary(name));
93    }
94}
95
96/// Validates that the given language code is supported.
97///
98/// # Errors
99///
100/// Returns an error if the language code is not in the supported list.
101pub fn validate_language(lang: &str) -> Result<()> {
102    if SUPPORTED_LANGUAGES.iter().any(|(code, _)| *code == lang) {
103        Ok(())
104    } else {
105        anyhow::bail!(
106            "Invalid language code: '{lang}'\n\n\
107             Valid language codes (ISO 639-1): ja, en, zh, ko, fr, de, es, ...\n\
108             Run 'tl languages' to see all supported codes."
109        )
110    }
111}
112
113#[cfg(test)]
114mod tests {
115    use super::*;
116
117    #[test]
118    fn test_validate_language_valid() {
119        assert!(validate_language("ja").is_ok());
120        assert!(validate_language("en").is_ok());
121        assert!(validate_language("zh-TW").is_ok());
122    }
123
124    #[test]
125    fn test_validate_language_invalid() {
126        assert!(validate_language("invalid").is_err());
127        assert!(validate_language("").is_err());
128        assert!(validate_language("JP").is_err()); // Case sensitive
129    }
130}