use std::sync::OnceLock;
type DialogTranslator = Box<dyn Fn(&str) -> Option<String> + Send + Sync>;
static DIALOG_TRANSLATOR: OnceLock<DialogTranslator> = OnceLock::new();
pub fn set_dialog_translator(translator: impl Fn(&str) -> Option<String> + Send + Sync + 'static) {
let _ = DIALOG_TRANSLATOR.set(Box::new(translator));
}
pub fn dialog_title(key: &str, fallback: &str) -> String {
DIALOG_TRANSLATOR
.get()
.and_then(|translate| translate(key))
.filter(|value| !value.trim().is_empty())
.unwrap_or_else(|| fallback.to_string())
}