From 956e90aa45fd637b66c0322528c3f1ad7c128a09 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 06:22:07 +0000 Subject: [PATCH] fix(i18n): canonicalise fallback language tags Co-Authored-By: Virgil --- localise.go | 6 +++++- service_test.go | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/localise.go b/localise.go index d854083..d4ad110 100644 --- a/localise.go +++ b/localise.go @@ -148,5 +148,9 @@ func normalizeLanguageTag(lang string) string { if lang == "" { return "" } - return core.Replace(lang, "_", "-") + lang = core.Replace(lang, "_", "-") + if tag, err := language.Parse(lang); err == nil { + return tag.String() + } + return lang } diff --git a/service_test.go b/service_test.go index 8c41676..0d12494 100644 --- a/service_test.go +++ b/service_test.go @@ -386,6 +386,22 @@ func TestServiceFallbackNormalisesLanguageTag(t *testing.T) { } } +func TestServiceFallbackCanonicalisesLanguageTagCase(t *testing.T) { + svc, err := New(WithFallback("FR_ca")) + if err != nil { + t.Fatalf("New() failed: %v", err) + } + + if got, want := svc.Fallback(), "fr-CA"; got != want { + t.Fatalf("WithFallback(FR_ca) = %q, want %q", got, want) + } + + svc.SetFallback("EN_us") + if got, want := svc.Fallback(), "en-US"; got != want { + t.Fatalf("SetFallback(EN_us) = %q, want %q", got, want) + } +} + func TestServiceMessageFallbackUsesBaseLanguageTagBeforeConfiguredFallback(t *testing.T) { svc, err := NewWithLoader(messageBaseFallbackLoader{}) if err != nil { -- 2.45.3