konnektoren_core/konnektoren_js/
i18n.rs1use 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}