From 9a1a3fd088b9839c654241188172234ab558729d Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 16 Sep 2024 20:34:05 +0200 Subject: pc: localization --- pixel-client/src/strings.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 pixel-client/src/strings.rs (limited to 'pixel-client/src/strings.rs') diff --git a/pixel-client/src/strings.rs b/pixel-client/src/strings.rs new file mode 100644 index 00000000..cf225c7d --- /dev/null +++ b/pixel-client/src/strings.rs @@ -0,0 +1,42 @@ +use anyhow::{anyhow, Result}; +use std::{ + collections::HashMap, + fs::read_to_string, + ops::Index, + path::Path, + sync::{LazyLock, Mutex}, +}; + +pub struct Strings(HashMap); +impl Index<&'static str> for Strings { + type Output = str; + fn index(&self, index: &'static str) -> &Self::Output { + self.0.get(index).map(|s| s.as_str()).unwrap_or(index) + } +} + +impl Strings { + pub fn load(path: &Path) -> Result { + Ok(Self( + read_to_string(path)? + .lines() + .skip(1) + .map(|l| { + let (k, v) = l.split_once("=").ok_or(anyhow!("'=' missing"))?; + Ok::<_, anyhow::Error>((k.to_owned(), v.replace("%n", "\n"))) + }) + .try_collect()?, + )) + } +} + +static TR_LOAD: Mutex> = Mutex::new(None); +static TR: LazyLock = LazyLock::new(|| TR_LOAD.lock().unwrap().take().unwrap()); + +pub fn tr<'a>(s: &'static str) -> &'a str { + &TR[s] +} +pub fn set_language(lang: &str) { + *TR_LOAD.lock().unwrap() = + Some(Strings::load(Path::new(&format!("locale/{lang}.ini"))).unwrap()); +} -- cgit v1.2.3-70-g09d2