use std::collections::HashMap;
use crate::localization::Localization;
use dictionary::Dictionary;
mod dictionary;
#[derive(Debug, Default, Clone)]
pub struct RonLocalizationBuilder {
language: String,
dictionaries: HashMap<String, Dictionary>,
}
impl RonLocalizationBuilder {
pub fn dictionary(mut self, key: impl Into<String>, dictionary: &str) -> Self {
self.dictionaries
.insert(key.into(), Dictionary::from(dictionary));
self
}
pub fn language(mut self, language: impl Into<String>) -> Self {
self.language = language.into();
self
}
pub fn build(self) -> RonLocalization {
RonLocalization {
language: self.language,
dictionaries: self.dictionaries,
}
}
}
#[derive(Debug, Default, Clone)]
pub struct RonLocalization {
language: String,
dictionaries: HashMap<String, Dictionary>,
}
impl RonLocalization {
pub fn create() -> RonLocalizationBuilder {
RonLocalizationBuilder::default()
}
}
impl Localization for RonLocalization {
fn language(&self) -> &String {
&self.language
}
fn set_language(&mut self, key: &str) {
self.language = key.to_string();
}
fn text(&self, key: String) -> String {
if let Some(dictionary) = self.dictionaries.get(&self.language) {
if let Some(word) = dictionary.words.get(&key) {
return word.clone();
}
}
key
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_text() {
let de_de = r#"
Dictionary(
words: {
"hello": "Hallo",
"world": "Welt",
}
)
"#;
let localization = RonLocalization::create()
.language("de_DE")
.dictionary("de_DE", de_de)
.build();
assert_eq!(localization.text("hello".to_string()), "Hallo".to_string());
assert_eq!(localization.text("world".to_string()), "Welt".to_string());
assert_eq!(localization.text("test".to_string()), "test".to_string());
}
}