[agent/codex:gpt-5.4-mini] Read ~/spec/code/core/go/i18n/RFC.md fully. Find ONE feature... #96
6 changed files with 32 additions and 2 deletions
12
i18n_test.go
12
i18n_test.go
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
12
localise.go
12
localise.go
|
|
@ -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, "_", "-")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue