use once_cell::sync::Lazy;
use serde_json::Value;
use std::collections::HashMap;
use std::io;
use std::sync::RwLock;
pub fn parse_json_to_map(content: &str) -> io::Result<HashMap<String, String>> {
let json: Value =
serde_json::from_str(content).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
let mut map = HashMap::new();
if let Some(obj) = json.as_object() {
for (k, v) in obj {
if let Some(text) = v.as_str() {
map.insert(k.clone(), text.to_string());
}
}
}
Ok(map)
}
static TRANSLATIONS: Lazy<RwLock<HashMap<String, String>>> =
Lazy::new(|| RwLock::new(HashMap::new()));
pub fn load_language(lang_code: &str) {
let mut map = TRANSLATIONS.write().unwrap();
map.clear();
let content = match lang_code {
"it" => include_str!("locales/it.json"),
"en" => include_str!("locales/en.json"),
_ => include_str!("locales/en.json"),
};
*map = parse_json_to_map(content).expect("Invalid embedded locale JSON");
}
pub fn tr(key: &str) -> String {
TRANSLATIONS
.read()
.unwrap()
.get(key)
.cloned()
.unwrap_or_else(|| key.to_string())
}
pub fn tr_with(key: &str, vars: &[(&str, &str)]) -> String {
let mut s = tr(key);
for (k, v) in vars {
let placeholder = format!("{{{}}}", k);
s = s.replace(&placeholder, v);
}
s
}
pub fn tr_s(key: &str) -> &'static str {
Box::leak(tr(key).into_boxed_str())
}