You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
1.7 KiB

use serde::{Serialize, Deserialize};
use strum::{
EnumIter,
IntoEnumIterator,
};
#[derive(Serialize, Deserialize, Debug, PartialEq, Copy, Clone)]
pub enum SupportedLanguage {
#[serde(rename = "en")]
English,
#[serde(rename = "fr")]
French,
}
impl std::fmt::Display for SupportedLanguage {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let output = match self {
Self::English => "en",
Self::French => "fr",
};
write!(f, "{}", output)
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, EnumIter)]
#[serde(rename_all = "camelCase")]
pub enum TranslatedKey {
UrlGame,
UrlDivision,
UrlLeague,
IbihfLeagues,
Goals,
Assists,
Period,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct TranslatedString {
#[serde(rename = "name")]
pub key: TranslatedKey,
#[serde(rename = "$value")]
pub value: String,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct LanguageStrings {
#[serde(rename = "$value")]
pub kvs: Vec<TranslatedString>,
}
/// Verify that all keys are present for translations.
pub fn verify_resources(ls: &LanguageStrings) -> bool {
for key in TranslatedKey::iter() {
let mut is_available = false;
for strs in &ls.kvs {
if strs.key == key {
is_available = true;
}
}
if !is_available {
return false;
}
}
true
}
macro_rules! add_language {
($func_name:ident, $file_name:expr) => {
pub fn $func_name() -> LanguageStrings {
let strings = serde_xml_rs::from_str(include_str!($file_name)).unwrap();
if !verify_resources(&strings) {
panic!("The language XML for {} is not correct.", $file_name);
}
strings
}
}
}
add_language!(en_lang, "../translations/en.xml");
add_language!(fr_lang, "../translations/fr.xml");