go-i18n/language_test.go
Claude e8a87b0f50
feat: grammar-aware i18n module extracted from core
Standalone grammar-aware translation engine with:
- 3-tier verb/noun fallback (JSON locale → irregular maps → regular rules)
- 6 built-in i18n.* namespace handlers (label, progress, count, done, fail, numeric)
- Nested en.json with gram/prompt/time/lang sections (no flat command keys)
- CLDR plural rules for 10 languages
- Subject fluent API, number/time formatting, RTL detection
- 55 tests passing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 19:51:27 +00:00

83 lines
1.7 KiB
Go

package i18n
import "testing"
func TestGetPluralCategory(t *testing.T) {
tests := []struct {
lang string
n int
want PluralCategory
}{
// English
{"en", 0, PluralOther},
{"en", 1, PluralOne},
{"en", 2, PluralOther},
// French (0 and 1 are singular)
{"fr", 0, PluralOne},
{"fr", 1, PluralOne},
{"fr", 2, PluralOther},
// Russian
{"ru", 1, PluralOne},
{"ru", 2, PluralFew},
{"ru", 5, PluralMany},
{"ru", 11, PluralMany},
{"ru", 21, PluralOne},
{"ru", 22, PluralFew},
// Polish
{"pl", 1, PluralOne},
{"pl", 2, PluralFew},
{"pl", 5, PluralMany},
// Arabic
{"ar", 0, PluralZero},
{"ar", 1, PluralOne},
{"ar", 2, PluralTwo},
{"ar", 5, PluralFew},
{"ar", 11, PluralMany},
{"ar", 100, PluralOther},
// Chinese (always other)
{"zh", 0, PluralOther},
{"zh", 1, PluralOther},
{"zh", 100, PluralOther},
// Fallback for unknown language uses English rules
{"xx", 1, PluralOne},
{"xx", 5, PluralOther},
}
for _, tt := range tests {
t.Run(tt.lang, func(t *testing.T) {
got := GetPluralCategory(tt.lang, tt.n)
if got != tt.want {
t.Errorf("GetPluralCategory(%q, %d) = %v, want %v", tt.lang, tt.n, got, tt.want)
}
})
}
}
func TestGetPluralRule(t *testing.T) {
// Known language
rule := GetPluralRule("en")
if rule == nil {
t.Fatal("GetPluralRule(en) returned nil")
}
if rule(1) != PluralOne {
t.Error("English rule(1) should be PluralOne")
}
// Base language extraction
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 {
t.Error("Unknown rule(1) should fallback to English PluralOne")
}
}