konnektoren_core/konnektoren_js/
i18n.rs

1use std::collections::HashMap;
2use wasm_bindgen::prelude::*;
3use web_sys::Window;
4
5pub struct I18nHandler<'a> {
6    window: &'a Window,
7    translations: HashMap<String, String>,
8}
9
10impl<'a> I18nHandler<'a> {
11    pub fn new(window: &'a Window) -> Self {
12        Self {
13            window,
14            translations: HashMap::new(),
15        }
16    }
17
18    pub fn set_i18n_data(&mut self, i18n_data: serde_json::Value) {
19        let konnektoren_obj =
20            js_sys::Reflect::get(self.window, &JsValue::from_str("konnektoren")).unwrap();
21        let i18n_data_js = serde_wasm_bindgen::to_value(&i18n_data).unwrap();
22        js_sys::Reflect::set(&konnektoren_obj, &JsValue::from_str("i18n"), &i18n_data_js).unwrap();
23
24        self.translations = serde_json::from_value(i18n_data).unwrap();
25
26        let translations = self.translations.clone();
27        let tr_closure = Closure::wrap(Box::new(move |text: JsValue| {
28            let text_str = text.as_string().unwrap_or_default();
29            let translated = translations
30                .get(&text_str)
31                .cloned()
32                .unwrap_or_else(|| text_str.clone());
33            JsValue::from_str(&translated)
34        }) as Box<dyn FnMut(JsValue) -> JsValue>);
35
36        js_sys::Reflect::set(
37            &konnektoren_obj,
38            &JsValue::from_str("tr"),
39            tr_closure.as_ref().unchecked_ref(),
40        )
41        .unwrap();
42        tr_closure.forget();
43    }
44}