fix(i18n): fall back to base fallback language tags
All checks were successful
Security Scan / security (push) Successful in 9s
Test / test (push) Successful in 2m1s

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-02 05:31:48 +00:00
parent 459876c8b7
commit bae8b1b788
2 changed files with 27 additions and 1 deletions

View file

@ -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 {

View file

@ -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 {