From 01a394c4a036274f20f393bc8b4442caaea450f5 Mon Sep 17 00:00:00 2001 From: Sharrnah <55756126+Sharrnah@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:15:21 +0000 Subject: [PATCH 1/4] Bugfix finding closest supported language with app translations. https://github.com/fyne-io/fyne/issues/5015 --- app/app_gl.go | 2 ++ lang/lang.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/app_gl.go b/app/app_gl.go index 1f34caaa2f..9167cbcb4d 100644 --- a/app/app_gl.go +++ b/app/app_gl.go @@ -4,11 +4,13 @@ package app import ( "fyne.io/fyne/v2" + "fyne.io/fyne/v2/lang" "fyne.io/fyne/v2/internal/driver/glfw" ) // NewWithID returns a new app instance using the appropriate runtime driver. // The ID string should be globally unique to this app. func NewWithID(id string) fyne.App { + lang.SetLocalizer() return newAppWithDriver(glfw.NewGLDriver(), id) } diff --git a/lang/lang.go b/lang/lang.go index 3188acee7b..b07ad00586 100644 --- a/lang/lang.go +++ b/lang/lang.go @@ -169,7 +169,9 @@ func init() { if err != nil { fyne.LogError("Error occurred loading built-in translations", err) } +} +func SetLocalizer() { // Find the closest translation from the user's locale list and set it up all, err := locale.GetLocales() if err != nil { From 8d9d4e1070f51ed12388146af4aef53a33ce6c66 Mon Sep 17 00:00:00 2001 From: Sharrnah <55756126+Sharrnah@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:33:50 +0000 Subject: [PATCH 2/4] find closest matching localizer on each added language. --- app/app_gl.go | 2 -- lang/lang.go | 25 +++++++++++++------------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/app/app_gl.go b/app/app_gl.go index 9167cbcb4d..1f34caaa2f 100644 --- a/app/app_gl.go +++ b/app/app_gl.go @@ -4,13 +4,11 @@ package app import ( "fyne.io/fyne/v2" - "fyne.io/fyne/v2/lang" "fyne.io/fyne/v2/internal/driver/glfw" ) // NewWithID returns a new app instance using the appropriate runtime driver. // The ID string should be globally unique to this app. func NewWithID(id string) fyne.App { - lang.SetLocalizer() return newAppWithDriver(glfw.NewGLDriver(), id) } diff --git a/lang/lang.go b/lang/lang.go index b07ad00586..9f8622ed04 100644 --- a/lang/lang.go +++ b/lang/lang.go @@ -155,9 +155,22 @@ func AddTranslationsFS(fs embed.FS, dir string) (retErr error) { return retErr } +func setLocalizer() { + // Find the closest translation from the user's locale list and set it up + all, err := locale.GetLocales() + if err != nil { + fyne.LogError("Failed to load user locales", err) + all = []string{"en"} + } + str := closestSupportedLocale(all).LanguageString() + setupLang(str) + localizer = i18n.NewLocalizer(bundle, str) +} + func addLanguage(data []byte, name string) error { f, err := bundle.ParseMessageFileBytes(data, name) translated = append(translated, f.Tag) + setLocalizer() return err } @@ -171,18 +184,6 @@ func init() { } } -func SetLocalizer() { - // Find the closest translation from the user's locale list and set it up - all, err := locale.GetLocales() - if err != nil { - fyne.LogError("Failed to load user locales", err) - all = []string{"en"} - } - str := closestSupportedLocale(all).LanguageString() - setupLang(str) - localizer = i18n.NewLocalizer(bundle, str) -} - func fallbackWithData(key, fallback string, data any) string { t, err := template.New(key).Parse(fallback) if err != nil { From 60d4d6d4026c21162d4d29ad7fe39c621185616f Mon Sep 17 00:00:00 2001 From: Sharrnah <55756126+Sharrnah@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:48:27 +0000 Subject: [PATCH 3/4] remove additional function to find closest localizer --- lang/lang.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lang/lang.go b/lang/lang.go index 9f8622ed04..3c3950be03 100644 --- a/lang/lang.go +++ b/lang/lang.go @@ -155,7 +155,10 @@ func AddTranslationsFS(fs embed.FS, dir string) (retErr error) { return retErr } -func setLocalizer() { +func addLanguage(data []byte, name string) error { + f, err := bundle.ParseMessageFileBytes(data, name) + translated = append(translated, f.Tag) + // Find the closest translation from the user's locale list and set it up all, err := locale.GetLocales() if err != nil { @@ -165,12 +168,7 @@ func setLocalizer() { str := closestSupportedLocale(all).LanguageString() setupLang(str) localizer = i18n.NewLocalizer(bundle, str) -} -func addLanguage(data []byte, name string) error { - f, err := bundle.ParseMessageFileBytes(data, name) - translated = append(translated, f.Tag) - setLocalizer() return err } From 38e675250f1a2a1c930e7f061c333504cdba3c47 Mon Sep 17 00:00:00 2001 From: Sharrnah <55756126+Sharrnah@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:58:27 +0000 Subject: [PATCH 4/4] Call setLocalizer in public AddTranslations* functions --- lang/lang.go | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/lang/lang.go b/lang/lang.go index 3c3950be03..4c440fc498 100644 --- a/lang/lang.go +++ b/lang/lang.go @@ -114,12 +114,14 @@ func LocalizePluralKey(key, fallback string, count int, data ...any) string { // The language that this relates to will be inferred from the resource name, for example "fr.json". // The data should be in json format. func AddTranslations(r fyne.Resource) error { + defer setLocalizer() return addLanguage(r.Content(), r.Name()) } // AddTranslationsForLocale allows an app to load a bundle of translations for a specified locale. // The data should be in json format. func AddTranslationsForLocale(data []byte, l fyne.Locale) error { + defer setLocalizer() return addLanguage(data, l.String()+".json") } @@ -152,23 +154,14 @@ func AddTranslationsFS(fs embed.FS, dir string) (retErr error) { } } + setLocalizer() + return retErr } func addLanguage(data []byte, name string) error { f, err := bundle.ParseMessageFileBytes(data, name) translated = append(translated, f.Tag) - - // Find the closest translation from the user's locale list and set it up - all, err := locale.GetLocales() - if err != nil { - fyne.LogError("Failed to load user locales", err) - all = []string{"en"} - } - str := closestSupportedLocale(all).LanguageString() - setupLang(str) - localizer = i18n.NewLocalizer(bundle, str) - return err } @@ -193,6 +186,18 @@ func fallbackWithData(key, fallback string, data any) string { return str.String() } +func setLocalizer() { + // Find the closest translation from the user's locale list and set it up + all, err := locale.GetLocales() + if err != nil { + fyne.LogError("Failed to load user locales", err) + all = []string{"en"} + } + str := closestSupportedLocale(all).LanguageString() + setupLang(str) + localizer = i18n.NewLocalizer(bundle, str) +} + // A utility for setting up languages - available to unit tests for overriding system func setupLang(lang string) { localizer = i18n.NewLocalizer(bundle, lang)