use crate::settings::Settings;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Language {
English,
Italian,
}
impl Language {
pub fn from_code(code: &str) -> Self {
match code {
"it" => Language::Italian,
_ => Language::English,
}
}
pub fn code(self) -> &'static str {
match self {
Language::English => "en",
Language::Italian => "it",
}
}
pub fn current() -> Self {
Settings::new()
.map(|s| Language::from_code(s.get_lang()))
.unwrap_or(Language::English)
}
}
pub mod keys {
pub const MAIN_MENU_TITLE: &str = "main_menu_title";
pub const SETTINGS: &str = "settings";
pub const SCHEDULING: &str = "scheduling";
pub const QUIT: &str = "quit";
pub const BACK: &str = "back";
pub const SELECT_OPTION: &str = "select_option";
pub const INVALID_OPTION: &str = "invalid_option";
pub const SETTINGS_MENU_TITLE: &str = "settings_menu_title";
pub const GENERAL: &str = "general";
pub const OBSERVATORY: &str = "observatory";
pub const SCHEDULING_MENU_TITLE: &str = "scheduling_menu_title";
pub const WEATHER_FORECAST: &str = "weather_forecast";
pub const SUN_MOON_TIMES: &str = "sun_moon_times";
pub const OBSERVING_TARGET_LIST: &str = "observing_target_list";
}
pub fn t(key: &str) -> String {
let lang = Language::current();
translate(key, lang)
}
fn translate(key: &str, lang: Language) -> String {
match (key, lang) {
(keys::MAIN_MENU_TITLE, Language::English) => "Main Menu".to_string(),
(keys::MAIN_MENU_TITLE, Language::Italian) => "Menu Principale".to_string(),
(keys::SETTINGS, Language::English) => "Settings".to_string(),
(keys::SETTINGS, Language::Italian) => "Impostazioni".to_string(),
(keys::SCHEDULING, Language::English) => "Scheduling".to_string(),
(keys::SCHEDULING, Language::Italian) => "Pianificazione".to_string(),
(keys::QUIT, Language::English) => "Quit".to_string(),
(keys::QUIT, Language::Italian) => "Esci".to_string(),
(keys::BACK, Language::English) => "Back".to_string(),
(keys::BACK, Language::Italian) => "Indietro".to_string(),
(keys::SELECT_OPTION, Language::English) => "Select an option:".to_string(),
(keys::SELECT_OPTION, Language::Italian) => "Seleziona un'opzione:".to_string(),
(keys::INVALID_OPTION, Language::English) => "Invalid option".to_string(),
(keys::INVALID_OPTION, Language::Italian) => "Opzione non valida".to_string(),
(keys::SETTINGS_MENU_TITLE, Language::English) => "Settings Menu".to_string(),
(keys::SETTINGS_MENU_TITLE, Language::Italian) => "Menu Impostazioni".to_string(),
(keys::GENERAL, Language::English) => "General".to_string(),
(keys::GENERAL, Language::Italian) => "Generale".to_string(),
(keys::OBSERVATORY, Language::English) => "Observatory".to_string(),
(keys::OBSERVATORY, Language::Italian) => "Osservatorio".to_string(),
(keys::SCHEDULING_MENU_TITLE, Language::English) => "Scheduling Menu".to_string(),
(keys::SCHEDULING_MENU_TITLE, Language::Italian) => "Menu Pianificazione".to_string(),
(keys::WEATHER_FORECAST, Language::English) => "Weather Forecast".to_string(),
(keys::WEATHER_FORECAST, Language::Italian) => "Previsioni Meteo".to_string(),
(keys::SUN_MOON_TIMES, Language::English) => "Sun and moon times".to_string(),
(keys::SUN_MOON_TIMES, Language::Italian) => "Ore di sole e luna".to_string(),
(keys::OBSERVING_TARGET_LIST, Language::English) => "Observing target list".to_string(),
(keys::OBSERVING_TARGET_LIST, Language::Italian) => "Lista obiettivi osservazione".to_string(),
_ => key.to_string(),
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_language_from_code() {
assert_eq!(Language::from_code("en"), Language::English);
assert_eq!(Language::from_code("it"), Language::Italian);
assert_eq!(Language::from_code("unknown"), Language::English);
}
#[test]
fn test_translate() {
assert_eq!(translate(keys::SETTINGS, Language::English), "Settings");
assert_eq!(translate(keys::SETTINGS, Language::Italian), "Impostazioni");
}
}