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

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

View file

@ -12,21 +12,45 @@ import (
// GetGrammarData returns the grammar data for the specified language.
func GetGrammarData(lang string) *GrammarData {
lang = normalizeLanguageTag(lang)
if lang == "" {
return nil
}
grammarCacheMu.RLock()
defer grammarCacheMu.RUnlock()
return grammarCache[lang]
if data, ok := grammarCache[lang]; ok && data != nil {
return data
}
if base := baseLanguageTag(lang); base != "" {
if data, ok := grammarCache[base]; ok && data != nil {
return data
}
}
return nil
}
// SetGrammarData sets the grammar data for a language, replacing any existing data.
func SetGrammarData(lang string, data *GrammarData) {
lang = normalizeLanguageTag(lang)
if lang == "" {
return
}
grammarCacheMu.Lock()
defer grammarCacheMu.Unlock()
if data == nil {
delete(grammarCache, lang)
return
}
grammarCache[lang] = cloneGrammarData(data)
}
// MergeGrammarData merges grammar data into the existing data for a language.
// New entries are added; existing entries are overwritten per-key.
func MergeGrammarData(lang string, data *GrammarData) {
lang = normalizeLanguageTag(lang)
if lang == "" || data == nil {
return
}
grammarCacheMu.Lock()
defer grammarCacheMu.Unlock()
existing := grammarCache[lang]

View file

@ -454,6 +454,50 @@ func TestMergeGrammarData(t *testing.T) {
}
}
func TestGrammarDataLanguageTagNormalisation(t *testing.T) {
const rawLang = "tl_PH"
const canonicalLang = "tl-PH"
originalRaw := GetGrammarData(rawLang)
originalCanonical := GetGrammarData(canonicalLang)
t.Cleanup(func() {
SetGrammarData(rawLang, originalRaw)
SetGrammarData(canonicalLang, originalCanonical)
})
SetGrammarData(rawLang, &GrammarData{
Words: map[string]string{
"demo": "Demo",
},
})
if got := GetGrammarData(rawLang); got == nil || got.Words["demo"] != "Demo" {
t.Fatalf("GetGrammarData(%q) = %+v, want demo word", rawLang, got)
}
if got := GetGrammarData(canonicalLang); got == nil || got.Words["demo"] != "Demo" {
t.Fatalf("GetGrammarData(%q) = %+v, want demo word", canonicalLang, got)
}
MergeGrammarData(canonicalLang, &GrammarData{
Words: map[string]string{
"api": "API",
},
})
data := GetGrammarData(rawLang)
if data == nil {
t.Fatalf("GetGrammarData(%q) returned nil after merge", rawLang)
}
if data.Words["api"] != "API" {
t.Fatalf("merged word normalisation failed: %+v", data.Words)
}
SetGrammarData(rawLang, nil)
if got := GetGrammarData(canonicalLang); got != nil {
t.Fatalf("SetGrammarData(%q, nil) did not clear entry: %+v", rawLang, got)
}
}
func TestNewWithLoader_LoadsGrammarOnlyLocale(t *testing.T) {
loaderFS := fstest.MapFS{
"fr.json": &fstest.MapFile{