intl_rs/
structs.rs

1use serde_json::Value;
2use std::collections::HashMap;
3use std::fs;
4
5#[derive(Clone, Debug, Default)]
6pub struct TranslationConfig {
7    pub accept_language: Option<String>,
8    pub default_message: Option<String>,
9    pub args: Option<HashMap<String, String>>,
10}
11
12#[derive(Clone, Debug)]
13pub struct I18n {
14    pub supported_languages: Vec<String>,
15    pub inner: HashMap<String, Value>,
16    pub default_language: String,
17}
18
19impl I18n {
20    ///init the I18n singleton
21    pub fn init(resources_path: String, default_language: String) -> Self {
22        let read_dir =
23            fs::read_dir(&resources_path).expect("Fail to initialize with current directory");
24        let supported_languages: Vec<String> = read_dir
25            .filter_map(|entry| {
26                entry.ok().and_then(|dir_entry| {
27                    let path = dir_entry.path();
28                    path.extension()
29                        .filter(|ext| ext.to_str() == Some("json"))
30                        .and_then(|_| {
31                            path.file_stem().and_then(|file_name| {
32                                file_name
33                                    .to_str()
34                                    .map(|file_name_str| String::from(file_name_str))
35                            })
36                        })
37                })
38            })
39            .collect();
40        let inner: HashMap<String, Value> = supported_languages
41            .iter()
42            .filter_map(|language| {
43                let file_name = format!("{}/{}.json", &resources_path, language);
44                fs::read_to_string(file_name).ok().and_then(|content| {
45                    serde_json::from_str(content.as_str())
46                        .and_then(|value| Ok((language.clone(), value)))
47                        .ok()
48                })
49            })
50            .collect();
51        I18n {
52            supported_languages,
53            inner,
54            default_language,
55        }
56    }
57}