1use anyhow::Result;
4
5use crate::ui::Style;
6
7pub 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
88pub 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
96pub 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()); }
130}