use pacsea::i18n::translations::{TranslationMap, translate_with_fallback};
use pacsea::i18n::{self, find_locales_dir, load_locale_file, resolve_locale};
use std::collections::HashMap;
pub fn load_cli_translations() -> (TranslationMap, TranslationMap) {
let Some(locales_dir) = find_locales_dir() else {
tracing::debug!("Locales directory not found, using English fallback");
return (HashMap::new(), HashMap::new());
};
let Some(i18n_config_path) = i18n::find_config_file("i18n.yml") else {
tracing::debug!("i18n.yml not found, using default locale");
let fallback = load_locale_file("en-US", &locales_dir).unwrap_or_default();
return (fallback.clone(), fallback);
};
let settings_locale = &pacsea::theme::settings().locale;
let resolved_locale = resolve_locale(settings_locale, &i18n_config_path);
let primary = load_locale_file(&resolved_locale, &locales_dir).unwrap_or_default();
let fallback = if resolved_locale == "en-US" {
primary.clone()
} else {
load_locale_file("en-US", &locales_dir).unwrap_or_default()
};
(primary, fallback)
}
pub fn t(key: &str) -> String {
use std::sync::OnceLock;
static TRANSLATIONS: OnceLock<(TranslationMap, TranslationMap)> = OnceLock::new();
let (primary, fallback) = TRANSLATIONS.get_or_init(load_cli_translations);
translate_with_fallback(key, primary, fallback)
}
pub fn t_fmt(key: &str, args: &[&dyn std::fmt::Display]) -> String {
let translation = t(key);
let mut result = translation;
for arg in args {
result = result.replacen("{}", &arg.to_string(), 1);
}
result
}
pub fn t_fmt1<T: std::fmt::Display>(key: &str, arg: T) -> String {
t_fmt(key, &[&arg])
}
pub fn t_fmt2<T1: std::fmt::Display, T2: std::fmt::Display>(
key: &str,
arg1: T1,
arg2: T2,
) -> String {
t_fmt(key, &[&arg1, &arg2])
}