[agent/codex:gpt-5.4-mini] Read ~/spec/code/core/go/i18n/RFC.md fully. Find features de... #170

Merged
Virgil merged 1 commit from agent/read---spec-code-core-go-i18n-rfc-md-ful into dev 2026-04-02 08:36:46 +00:00
2 changed files with 73 additions and 3 deletions

View file

@ -136,12 +136,28 @@ func NewWithLoader(loader Loader, opts ...Option) (*Service, error) {
return nil, log.E("NewWithLoader", "load locale: "+lang, err)
}
lang = normalizeLanguageTag(lang)
s.messages[lang] = messages
_, seen := s.messages[lang]
if existing, ok := s.messages[lang]; ok {
if existing == nil {
existing = make(map[string]Message)
s.messages[lang] = existing
}
maps.Copy(existing, messages)
} else {
s.messages[lang] = messages
}
if grammarDataHasContent(grammar) {
SetGrammarData(lang, grammar)
if seen {
MergeGrammarData(lang, grammar)
} else {
SetGrammarData(lang, grammar)
}
}
tag := language.Make(lang)
s.availableLangs = append(s.availableLangs, tag)
if !slices.Contains(s.availableLangs, tag) {
s.availableLangs = append(s.availableLangs, tag)
}
}
if detected := detectLanguage(s.availableLangs); detected != "" {

View file

@ -57,6 +57,31 @@ func (underscoreLangLoader) Load(lang string) (map[string]Message, *GrammarData,
}, nil, nil
}
type duplicateLangLoader struct{}
func (duplicateLangLoader) Languages() []string {
return []string{"en_US", "en-US"}
}
func (duplicateLangLoader) Load(lang string) (map[string]Message, *GrammarData, error) {
switch lang {
case "en_US":
return map[string]Message{
"first.key": {Text: "first"},
}, &GrammarData{
Words: map[string]string{"pkg": "package"},
}, nil
case "en-US":
return map[string]Message{
"second.key": {Text: "second"},
}, &GrammarData{
Words: map[string]string{"api": "API"},
}, nil
default:
return map[string]Message{}, nil, nil
}
}
func TestNewService(t *testing.T) {
svc, err := New()
if err != nil {
@ -240,6 +265,35 @@ func TestNewWithLoaderNormalisesLanguageTags(t *testing.T) {
}
}
func TestNewWithLoaderMergesCanonicalDuplicateLanguages(t *testing.T) {
svc, err := NewWithLoader(duplicateLangLoader{})
if err != nil {
t.Fatalf("NewWithLoader() failed: %v", err)
}
if err := svc.SetLanguage("en-US"); err != nil {
t.Fatalf("SetLanguage(en-US) failed: %v", err)
}
if got, want := svc.T("first.key"), "first"; got != want {
t.Fatalf("T(first.key) = %q, want %q", got, want)
}
if got, want := svc.T("second.key"), "second"; got != want {
t.Fatalf("T(second.key) = %q, want %q", got, want)
}
data := GetGrammarData("en-US")
if data == nil {
t.Fatal("GetGrammarData(en-US) returned nil")
}
if got, want := data.Words["pkg"], "package"; got != want {
t.Fatalf("grammar word pkg = %q, want %q", got, want)
}
if got, want := data.Words["api"], "API"; got != want {
t.Fatalf("grammar word api = %q, want %q", got, want)
}
}
func TestServiceTPluralMessage(t *testing.T) {
svc, err := New()
if err != nil {