diff --git a/service.go b/service.go index 28426be..a650d3c 100644 --- a/service.go +++ b/service.go @@ -791,14 +791,25 @@ func (s *Service) getMessage(lang, key string) (Message, bool) { // AddMessages adds messages for a language at runtime. func (s *Service) AddMessages(lang string, messages map[string]string) { + lang = normalizeLanguageTag(lang) + if lang == "" { + return + } + s.mu.Lock() - defer s.mu.Unlock() if s.messages[lang] == nil { s.messages[lang] = make(map[string]Message) } for key, text := range messages { s.messages[lang][key] = Message{Text: text} } + tag := language.Make(lang) + if !slices.Contains(s.availableLangs, tag) { + s.availableLangs = append(s.availableLangs, tag) + } + s.mu.Unlock() + + s.autoDetectLanguage() } // AddLoader loads translations from an additional Loader, merging messages diff --git a/service_test.go b/service_test.go index dd7ca79..fca3ae4 100644 --- a/service_test.go +++ b/service_test.go @@ -677,6 +677,25 @@ func TestServiceAddMessages(t *testing.T) { } } +func TestServiceAddMessages_RegistersLanguage(t *testing.T) { + svc, err := New() + if err != nil { + t.Fatalf("New() failed: %v", err) + } + + svc.AddMessages("fr_CA", map[string]string{ + "custom.greeting": "Salut!", + }) + + if err := svc.SetLanguage("fr_CA"); err != nil { + t.Fatalf("SetLanguage(fr_CA) failed: %v", err) + } + + if got := svc.T("custom.greeting"); got != "Salut!" { + t.Fatalf("T(custom.greeting) = %q, want %q", got, "Salut!") + } +} + func TestServiceHandlers(t *testing.T) { svc, err := New() if err != nil {