[agent/codex:gpt-5.4-mini] Read ~/spec/code/core/go/i18n/RFC.md fully. Find ONE feature... #96

Merged
Virgil merged 1 commit from agent/read---spec-code-core-go-i18n-rfc-md-ful into dev 2026-04-02 03:11:33 +00:00
6 changed files with 32 additions and 2 deletions

View file

@ -75,6 +75,18 @@ func TestSetLanguage_Good(t *testing.T) {
assert.Contains(t, CurrentLanguage(), "en")
}
func TestSetLanguage_Good_UnderscoreTag(t *testing.T) {
svc, err := New()
require.NoError(t, err)
_ = Init()
SetDefault(svc)
err = SetLanguage("fr_CA")
assert.NoError(t, err)
assert.True(t, len(CurrentLanguage()) >= 2)
assert.Equal(t, "fr", CurrentLanguage()[:2])
}
func TestSetLanguage_Bad_Unsupported(t *testing.T) {
svc, err := New()
require.NoError(t, err)

View file

@ -2,6 +2,7 @@ package i18n
// GetPluralRule returns the plural rule for a language code.
func GetPluralRule(lang string) PluralRule {
lang = normalizeLanguageTag(lang)
if rule, ok := pluralRules[lang]; ok {
return rule
}

View file

@ -12,11 +12,13 @@ func TestGetPluralCategory(t *testing.T) {
{"en", 0, PluralOther},
{"en", 1, PluralOne},
{"en", 2, PluralOther},
{"en_US", 1, PluralOne},
// French (0 and 1 are singular)
{"fr", 0, PluralOne},
{"fr", 1, PluralOne},
{"fr", 2, PluralOther},
{"fr_CA", 2, PluralOther},
// Russian
{"ru", 1, PluralOne},
@ -88,6 +90,11 @@ func TestGetPluralRule(t *testing.T) {
t.Error("Welsh-GB rule(2) should be PluralTwo")
}
rule = GetPluralRule("en_US")
if rule(1) != PluralOne {
t.Error("English_US rule(1) should be PluralOne")
}
// Unknown falls back to English
rule = GetPluralRule("xx-YY")
if rule(1) != PluralOne {

View file

@ -57,6 +57,7 @@ func (g GrammaticalGender) String() string {
// IsRTLLanguage returns true if the language code uses right-to-left text.
func IsRTLLanguage(lang string) bool {
lang = normalizeLanguageTag(lang)
if rtlLanguages[lang] {
return true
}
@ -110,8 +111,7 @@ func detectLanguage(supported []language.Tag) string {
if langEnv == "" {
return ""
}
baseLang := core.Split(langEnv, ".")[0]
baseLang = core.Replace(baseLang, "_", "-")
baseLang := normalizeLanguageTag(core.Split(langEnv, ".")[0])
parsedLang, err := language.Parse(baseLang)
if err != nil {
return ""
@ -129,3 +129,11 @@ func detectLanguage(supported []language.Tag) string {
}
return ""
}
func normalizeLanguageTag(lang string) string {
lang = core.Trim(lang)
if lang == "" {
return ""
}
return core.Replace(lang, "_", "-")
}

View file

@ -88,6 +88,7 @@ func TestIsRTLLanguage_Good(t *testing.T) {
}{
{"arabic", "ar", true},
{"arabic_sa", "ar-SA", true},
{"arabic_sa_underscore", "ar_EG", true},
{"hebrew", "he", true},
{"farsi", "fa", true},
{"urdu", "ur", true},

View file

@ -231,6 +231,7 @@ func (s *Service) loadJSON(lang string, data []byte) error {
func (s *Service) SetLanguage(lang string) error {
s.mu.Lock()
defer s.mu.Unlock()
lang = normalizeLanguageTag(lang)
requestedLang, err := language.Parse(lang)
if err != nil {
return log.E("Service.SetLanguage", "invalid language tag: "+lang, err)