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 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}