use std::env;
static LOCALES: &[(&str, &str)] = &[
("en", include_str!("../locales/en.toml")),
("de", include_str!("../locales/de.toml")),
("fr", include_str!("../locales/fr.toml")),
("es", include_str!("../locales/es.toml")),
];
pub(crate) fn primary_code(locale: &str) -> &str {
locale.split(['_', '.', '@']).next().unwrap_or(locale)
}
pub(crate) fn is_bundled(code: &str) -> bool {
LOCALES.iter().any(|(c, _)| c.eq_ignore_ascii_case(code))
}
pub fn detect_lang_code() -> String {
if let Ok(val) = env::var("LANGUAGE") {
for part in val.split(':') {
let code = primary_code(part);
if is_bundled(code) {
return code.to_ascii_lowercase();
}
}
}
for var in &["LC_ALL", "LC_MESSAGES", "LANG"] {
if let Ok(val) = env::var(var) {
if !val.is_empty() && val != "C" && val != "POSIX" {
return primary_code(&val).to_ascii_lowercase();
}
}
}
if let Some(locale) = sys_locale::get_locale() {
return primary_code(&locale).to_ascii_lowercase();
}
"en".to_string()
}
#[derive(serde::Deserialize)]
pub struct Translations {
pub tab_overview: String,
pub tab_cpu: String,
pub tab_memory: String,
pub tab_network: String,
pub tab_disks: String,
pub tab_processes: String,
pub tab_gpu: String,
pub menu_title: String,
pub nav_right: String,
pub nav_left: String,
pub jump_to_tab: String,
pub quit: String,
pub scroll_up: String,
pub scroll_down: String,
pub ago_60s: String,
pub ago_30s: String,
pub now: String,
pub cpu_history_title: String,
pub cpu_dataset_label: String,
pub mem_history_title: String,
pub mem_dataset_label: String,
pub ram: String,
pub swap: String,
pub net_history_title: String,
pub net_throughput_title: String,
pub disk_usage_title: String,
pub processes_title: String,
pub col_pid: String,
pub col_name: String,
pub col_cpu_pct: String,
pub col_mem_kib: String,
pub gpu_no_device: String,
pub gpu_util: String,
pub gpu_vram: String,
pub gpu_gtt: String,
pub gpu_stats: String,
pub gpu_temp: String,
pub gpu_power: String,
pub na: String,
}
pub fn get_translations(lang_code: &str) -> Translations {
let code = primary_code(lang_code).to_ascii_lowercase();
let src = LOCALES
.iter()
.find(|(c, _)| *c == code.as_str())
.map(|(_, s)| *s)
.unwrap_or(LOCALES[0].1); toml::from_str(src).expect("bundled locale TOML is invalid")
}