thisweek_core/
language.rs

1use serde::Serialize;
2
3//https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes
4
5#[derive(Serialize, Clone, Debug, Default, PartialEq)]
6pub enum Language {
7    #[default]
8    English = 1,
9    Farsi = 2,
10    Chinese = 3,
11    Arabic = 4,
12}
13
14impl Language {
15    pub fn change_numbers_language(&self, s: &str) -> String {
16        let nums_en = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
17        let nums_fa = ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"];
18        let nums_ar = ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"];
19        let mut s: String = String::from(s);
20        if *self == Language::Farsi {
21            for i in 0..10 {
22                s = s.replace(nums_en[i], nums_fa[i]);
23            }
24        } else if *self == Language::Arabic {
25            for i in 0..10 {
26                s = s.replace(nums_en[i], nums_ar[i]);
27            }
28        } else {
29            // for i in 0..10 {
30            //     s = s.replace(nums_fa[i], nums_en[i]);
31            // }
32        }
33        s
34    }
35
36    pub fn default_direction(&self) -> String {
37        match self {
38            Language::English => "ltr".into(),
39            Language::Farsi => "rtl".into(),
40            Language::Chinese => "ltr".into(),
41            Language::Arabic => "rtl".into(),
42        }
43    }
44}
45
46impl From<i32> for Language {
47    fn from(val: i32) -> Self {
48        match val {
49            1 => Language::English,
50            2 => Language::Farsi,
51            3 => Language::Chinese,
52            4 => Language::Arabic,
53            _ => Language::English,
54        }
55    }
56}
57
58impl From<String> for Language {
59    fn from(val: String) -> Self {
60        match val.as_str() {
61            "en" => Language::English,
62            "fa" => Language::Farsi,
63            "zh" => Language::Chinese,
64            "ar" => Language::Arabic,
65            &_ => Language::English, // default
66        }
67    }
68}
69
70impl From<Language> for String {
71    fn from(val: Language) -> Self {
72        match val {
73            Language::English => "en".to_string(),
74            Language::Farsi => "fa".to_string(),
75            Language::Chinese => "zh".to_string(),
76            Language::Arabic => "ar".to_string(),
77        }
78    }
79}
80
81// convert from constant &str array to Vec
82pub fn str_to_vec(arr: &[&str]) -> Vec<String> {
83    // arr.to_vec().into_iter().map(String::from).collect()
84    arr.iter().copied().map(String::from).collect()
85}