From bae8b1b788e827a76f735a224969dcedcd707ed8 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 05:31:48 +0000 Subject: [PATCH] fix(i18n): fall back to base fallback language tags Co-Authored-By: Virgil --- service.go | 8 +++++++- service_test.go | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/service.go b/service.go index bac71c6..8fd85a3 100644 --- a/service.go +++ b/service.go @@ -392,7 +392,13 @@ func (s *Service) resolveDirect(messageID string, data any) string { return text } } - return s.tryResolve(s.fallbackLang, messageID, data) + if text := s.tryResolve(s.fallbackLang, messageID, data); text != "" { + return text + } + if base := baseLanguageTag(s.fallbackLang); base != "" && base != s.fallbackLang { + return s.tryResolve(base, messageID, data) + } + return "" } func (s *Service) resolveWithFallback(messageID string, data any) string { diff --git a/service_test.go b/service_test.go index 7f7a8ad..16f69b4 100644 --- a/service_test.go +++ b/service_test.go @@ -296,6 +296,26 @@ func TestServiceMessageFallbackUsesBaseLanguageTagBeforeConfiguredFallback(t *te } } +func TestServiceMessageFallbackUsesConfiguredFallbackBaseLanguageTag(t *testing.T) { + svc, err := NewWithLoader(messageBaseFallbackLoader{}) + if err != nil { + t.Fatalf("NewWithLoader() failed: %v", err) + } + + svc.AddMessages("fr", map[string]string{ + "greeting": "bonjour", + }) + + if err := svc.SetLanguage("en-GB"); err != nil { + t.Fatalf("SetLanguage(en-GB) failed: %v", err) + } + svc.SetFallback("fr-CA") + + if got := svc.T("greeting"); got != "bonjour" { + t.Fatalf("T(greeting) = %q, want %q", got, "bonjour") + } +} + func TestServiceCommonFallbackUsesBaseLanguageTagBeforeConfiguredFallback(t *testing.T) { svc, err := NewWithLoader(messageBaseFallbackLoader{}) if err != nil { -- 2.45.3