From 2a5e2ee5a30451d7c58c13960219396b3723d895 Mon Sep 17 00:00:00 2001 From: Virgil Date: Sat, 4 Apr 2026 02:07:05 +0000 Subject: [PATCH] fix(html): preserve locale on cloned translators Co-Authored-By: Virgil --- context_test.go | 46 +++++++++++++++++++++++++++++++++++++ translator_clone_default.go | 1 + translator_clone_js.go | 3 ++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/context_test.go b/context_test.go index e2e1985..5eeb80a 100644 --- a/context_test.go +++ b/context_test.go @@ -37,6 +37,33 @@ func (t *localeTranslator) Clone() Translator { return &clone } +type resettingTranslator struct { + language string +} + +func (t *resettingTranslator) T(key string, args ...any) string { + if key == "prompt.yes" && t.language == "fr" { + return "o" + } + if key == "prompt.yes" && t.language == "en" { + return "y" + } + return key +} + +func (t *resettingTranslator) SetLanguage(language string) error { + t.language = language + return nil +} + +func (t *resettingTranslator) Clone() Translator { + if t == nil { + return (*resettingTranslator)(nil) + } + + return &resettingTranslator{} +} + func TestContext_NewContextWithService_AppliesLocale(t *testing.T) { svc := &localeTranslator{} ctx := NewContextWithService(svc, "fr-FR") @@ -228,6 +255,25 @@ func TestContext_CloneClonesMutableTranslator(t *testing.T) { } } +func TestContext_CloneReappliesLocaleAfterTranslatorClone(t *testing.T) { + svc := &resettingTranslator{} + ctx := NewContextWithService(svc, "fr-FR") + + clone := ctx.Clone() + if clone == nil { + t.Fatal("Clone should return a context") + } + if clone.service == ctx.service { + t.Fatal("Clone should duplicate cloneable translators") + } + if got := Text("prompt.yes").Render(clone); got != "o" { + t.Fatalf("Clone should reapply locale after cloning the translator, got %q", got) + } + if got := clone.Locale; got != "fr-FR" { + t.Fatalf("Clone should preserve locale, got %q", got) + } +} + func TestContext_WithDataReturnsClonedContext(t *testing.T) { ctx := NewContext() ctx.SetData("theme", "dark") diff --git a/translator_clone_default.go b/translator_clone_default.go index 517ef7c..b22c1f3 100644 --- a/translator_clone_default.go +++ b/translator_clone_default.go @@ -13,6 +13,7 @@ func cloneTranslator(svc Translator, locale string) Translator { if cloner, ok := svc.(translatorCloner); ok && cloner != nil { if clone := cloner.Clone(); clone != nil { + applyLocaleToService(clone, locale) return clone } } diff --git a/translator_clone_js.go b/translator_clone_js.go index 3c19ac3..f60cc15 100644 --- a/translator_clone_js.go +++ b/translator_clone_js.go @@ -4,13 +4,14 @@ package html -func cloneTranslator(svc Translator, _ string) Translator { +func cloneTranslator(svc Translator, locale string) Translator { if svc == nil { return nil } if cloner, ok := svc.(translatorCloner); ok && cloner != nil { if clone := cloner.Clone(); clone != nil { + applyLocaleToService(clone, locale) return clone } }