use super::{
Language, LanguageSettings, available, choose, install, installed_system_languages, name_of,
};
use crate::tr;
pub fn settings_ui(ui: &mut egui::Ui, settings: &mut LanguageSettings) -> bool {
let langs = available(ui.ctx());
let selected = match &settings.language {
Language::System => system_entry(ui, &langs),
Language::Explicit(tag) => langs
.iter()
.find(|l| l.to_string() == *tag)
.map_or_else(|| tag.clone(), |l| name_of(ui.ctx(), l)),
};
let before = settings.clone();
egui::ComboBox::from_id_salt("corundum_language")
.selected_text(selected)
.show_ui(ui, |ui| {
let system = system_entry(ui, &langs);
ui.selectable_value(&mut settings.language, Language::System, system);
for lang in &langs {
let name = name_of(ui.ctx(), lang);
ui.selectable_value(
&mut settings.language,
Language::Explicit(lang.to_string()),
name,
);
}
});
let changed = *settings != before;
if changed {
apply(ui.ctx(), settings);
}
changed
}
fn system_entry(ui: &egui::Ui, langs: &[super::LanguageIdentifier]) -> String {
let resolved = choose(&installed_system_languages(ui.ctx()), langs);
tr!(
ui,
"corundum-language-system",
language = name_of(ui.ctx(), &resolved)
)
}
fn apply(ctx: &egui::Context, settings: &LanguageSettings) {
install(ctx, settings);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::i18n::current;
use crate::test_support::{render, render_in};
#[test]
fn settings_ui_renders_without_a_change() {
let mut settings = LanguageSettings::default();
let mut changed = false;
render([600.0, 400.0], |ui| {
changed |= settings_ui(ui, &mut settings)
});
assert!(!changed);
assert_eq!(settings, LanguageSettings::default());
}
#[test]
fn apply_installs() {
let ctx = egui::Context::default();
let settings = LanguageSettings {
language: Language::Explicit("ja".into()),
};
render_in(&ctx, [600.0, 400.0], |ui| apply(ui.ctx(), &settings));
assert_eq!(current(&ctx).to_string(), "ja");
}
}