diff --git a/service.go b/service.go index 8aac8fd..7dc32b1 100644 --- a/service.go +++ b/service.go @@ -131,6 +131,7 @@ func NewWithLoader(loader Loader, opts ...Option) (*Service, error) { if err != nil { return nil, log.E("NewWithLoader", "load locale: "+lang, err) } + lang = normalizeLanguageTag(lang) s.messages[lang] = messages if grammarDataHasContent(grammar) { SetGrammarData(lang, grammar) @@ -290,7 +291,11 @@ func (s *Service) SetMode(m Mode) { s.mu.Lock(); s.mode = m; s.mu.Unlo func (s *Service) Mode() Mode { s.mu.RLock(); defer s.mu.RUnlock(); return s.mode } func (s *Service) SetFormality(f Formality) { s.mu.Lock(); s.formality = f; s.mu.Unlock() } func (s *Service) Formality() Formality { s.mu.RLock(); defer s.mu.RUnlock(); return s.formality } -func (s *Service) SetFallback(lang string) { s.mu.Lock(); s.fallbackLang = normalizeLanguageTag(lang); s.mu.Unlock() } +func (s *Service) SetFallback(lang string) { + s.mu.Lock() + s.fallbackLang = normalizeLanguageTag(lang) + s.mu.Unlock() +} func (s *Service) Fallback() string { s.mu.RLock() defer s.mu.RUnlock() @@ -829,6 +834,7 @@ func (s *Service) AddLoader(loader Loader) error { if err != nil { return log.E("Service.AddLoader", "load locale: "+lang, err) } + lang = normalizeLanguageTag(lang) s.mu.Lock() if s.messages[lang] == nil { diff --git a/service_test.go b/service_test.go index 0d12494..685065e 100644 --- a/service_test.go +++ b/service_test.go @@ -33,6 +33,18 @@ func (h serviceMutatingHandler) Handle(key string, args []any, next func() strin return "mutated" } +type underscoreLangLoader struct{} + +func (underscoreLangLoader) Languages() []string { + return []string{"en_US"} +} + +func (underscoreLangLoader) Load(lang string) (map[string]Message, *GrammarData, error) { + return map[string]Message{ + "greeting": {Text: "hello"}, + }, nil, nil +} + func TestNewService(t *testing.T) { svc, err := New() if err != nil { @@ -148,6 +160,28 @@ func TestServiceTDirectKeys(t *testing.T) { } } +func TestNewWithLoaderNormalisesLanguageTags(t *testing.T) { + svc, err := NewWithLoader(underscoreLangLoader{}) + if err != nil { + t.Fatalf("NewWithLoader() failed: %v", err) + } + + langs := svc.AvailableLanguages() + if len(langs) != 1 || langs[0] != "en-US" { + t.Fatalf("AvailableLanguages() = %v, want [en-US]", langs) + } + + if err := svc.SetLanguage("en_US"); err != nil { + t.Fatalf("SetLanguage(en_US) failed: %v", err) + } + if got, want := svc.Language(), "en-US"; got != want { + t.Fatalf("Language() after SetLanguage(en_US) = %q, want %q", got, want) + } + if got := svc.T("greeting"); got != "hello" { + t.Fatalf("T(greeting) after SetLanguage(en_US) = %q, want %q", got, "hello") + } +} + func TestServiceTPluralMessage(t *testing.T) { svc, err := New() if err != nil {