mirror of
https://github.com/slint-ui/slint.git
synced 2025-09-29 05:14:48 +00:00
Internalize hack for dynamic translations change so that it also works for Rust apps
This commit is contained in:
parent
66652cdc1d
commit
623bae7732
3 changed files with 14 additions and 6 deletions
|
@ -1276,10 +1276,7 @@ inline SharedString translate(const SharedString &original, const SharedString &
|
|||
/// Example
|
||||
/// ```cpp
|
||||
/// my_ui->global<LanguageSettings>().on_french_selected([] {
|
||||
/// // trick from https://www.gnu.org/software/gettext/manual/html_node/gettext-grok.html
|
||||
/// setenv("LANGUAGE", langs[l], true);
|
||||
/// extern int _nl_msg_cat_cntr;
|
||||
/// ++_nl_msg_cat_cntr;
|
||||
/// slint::update_all_translations();
|
||||
/// });
|
||||
/// ```
|
||||
|
|
|
@ -80,9 +80,6 @@ int main()
|
|||
printer_demo->global<PrinterSettings>().on_change_language([](int l) {
|
||||
static const char *langs[] = { "en", "fr" };
|
||||
setenv("LANGUAGE", langs[l], true);
|
||||
// trick from https://www.gnu.org/software/gettext/manual/html_node/gettext-grok.html
|
||||
extern int _nl_msg_cat_cntr;
|
||||
++_nl_msg_cat_cntr;
|
||||
slint::update_all_translations();
|
||||
});
|
||||
#endif
|
||||
|
|
|
@ -225,6 +225,20 @@ fn translate_gettext(string: &str, ctx: &str, domain: &str, n: i32, plural: &str
|
|||
}
|
||||
|
||||
pub fn mark_all_translations_dirty() {
|
||||
#[cfg(all(feature = "gettext-rs", target_family = "unix"))]
|
||||
{
|
||||
// SAFETY: This trick from https://www.gnu.org/software/gettext/manual/html_node/gettext-grok.html
|
||||
// is merely incrementing a generational counter that will invalidate gettext's internal cache for translations.
|
||||
// If in the worst case it won't invalidate, then old translations are shown.
|
||||
#[allow(unsafe_code)]
|
||||
unsafe {
|
||||
extern "C" {
|
||||
static mut _nl_msg_cat_cntr: std::ffi::c_int;
|
||||
}
|
||||
_nl_msg_cat_cntr += 1;
|
||||
}
|
||||
}
|
||||
|
||||
crate::context::GLOBAL_CONTEXT.with(|ctx| {
|
||||
let Some(ctx) = ctx.get() else { return };
|
||||
ctx.0.translations_dirty.mark_dirty();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue