diff options
author | metamuffin <metamuffin@disroot.org> | 2024-09-24 12:43:42 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-09-24 12:43:42 +0200 |
commit | 9453f5f4b3e68d79fb09494b55bc885432ac0351 (patch) | |
tree | 66eea4b897cda02db1b72bbe305afcc6e4e8a4d8 /server/src/message.rs | |
parent | f68d3a579f05e5bbe490cbaa9cc4d1e1bff208ac (diff) | |
download | hurrycurry-9453f5f4b3e68d79fb09494b55bc885432ac0351.tar hurrycurry-9453f5f4b3e68d79fb09494b55bc885432ac0351.tar.bz2 hurrycurry-9453f5f4b3e68d79fb09494b55bc885432ac0351.tar.zst |
format server in english locale
Diffstat (limited to 'server/src/message.rs')
-rw-r--r-- | server/src/message.rs | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/server/src/message.rs b/server/src/message.rs new file mode 100644 index 00000000..c248fff8 --- /dev/null +++ b/server/src/message.rs @@ -0,0 +1,122 @@ +/* + Hurry Curry! - a game about cooking + Copyright 2024 metamuffin + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, version 3 of the License only. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + +*/ + +use anyhow::{anyhow, Result}; +use hurrycurry_protocol::Message; +use std::{collections::HashMap, fmt::Debug, ops::Index, sync::LazyLock}; + +#[macro_export] +macro_rules! trm { + ($id:literal $(, $typ:ident = $param:expr)*) => { + hurrycurry_protocol::Message::Translation { + id: $id.to_owned(), + params: vec![$(crate::trm_param!($typ, $param)),*] + } + }; +} + +#[macro_export] +macro_rules! trm_param { + (s, $x:expr) => { + hurrycurry_protocol::Message::Text($x) + }; + (i, $x:expr) => { + hurrycurry_protocol::Message::Item($x) + }; + (t, $x:expr) => { + hurrycurry_protocol::Message::Tile($x) + }; + (m, $x:expr) => { + $x + }; +} + +pub struct TrError { + pub id: &'static str, + pub params: Vec<Message>, +} +impl From<TrError> for Message { + fn from(value: TrError) -> Self { + Self::Translation { + id: value.id.to_owned(), + params: value.params, + } + } +} +impl Debug for TrError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{} {:?}", tr(self.id), self.params) + } +} + +#[macro_export] +macro_rules! tre { + ($id:literal $(, $typ:ident = $param:expr)*) => { + crate::message::TrError { + id: $id, + params: vec![$(crate::tre_param!($typ, $param)),*] + } + }; +} + +#[macro_export] +macro_rules! tre_param { + (s, $x:expr) => { + hurrycurry_protocol::Message::Text($x) + }; + (i, $x:expr) => { + hurrycurry_protocol::Message::Item($x) + }; + (t, $x:expr) => { + hurrycurry_protocol::Message::Tile($x) + }; + (m, $x:expr) => { + $x + }; +} + +pub struct Strings(HashMap<String, String>); +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() -> Result<Self> { + Ok(Self( + include_str!("../../locale/en.ini") + .lines() + .skip(1) + .map(|l| { + let (k, v) = l.split_once("=").ok_or(anyhow!("'=' missing"))?; + Ok::<_, anyhow::Error>(( + k.trim_end().to_owned(), + v.trim_start().replace("%n", "\n"), + )) + }) + .try_collect()?, + )) + } +} + +static TR: LazyLock<Strings> = LazyLock::new(|| Strings::load().unwrap()); +pub fn tr<'a>(s: &'static str) -> &'a str { + &TR[s] +} |