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>
85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
package i18n
|
|
|
|
// GetPluralRule returns the plural rule for a language code.
|
|
func GetPluralRule(lang string) PluralRule {
|
|
if rule, ok := pluralRules[lang]; ok {
|
|
return rule
|
|
}
|
|
if len(lang) > 2 {
|
|
base := lang[:2]
|
|
if rule, ok := pluralRules[base]; ok {
|
|
return rule
|
|
}
|
|
}
|
|
return pluralRuleEnglish
|
|
}
|
|
|
|
// GetPluralCategory returns the plural category for a count in the given language.
|
|
func GetPluralCategory(lang string, n int) PluralCategory {
|
|
return GetPluralRule(lang)(n)
|
|
}
|
|
|
|
func pluralRuleEnglish(n int) PluralCategory {
|
|
if n == 1 {
|
|
return PluralOne
|
|
}
|
|
return PluralOther
|
|
}
|
|
|
|
func pluralRuleGerman(n int) PluralCategory { return pluralRuleEnglish(n) }
|
|
func pluralRuleSpanish(n int) PluralCategory { return pluralRuleEnglish(n) }
|
|
|
|
func pluralRuleFrench(n int) PluralCategory {
|
|
if n == 0 || n == 1 {
|
|
return PluralOne
|
|
}
|
|
return PluralOther
|
|
}
|
|
|
|
func pluralRuleRussian(n int) PluralCategory {
|
|
mod10 := n % 10
|
|
mod100 := n % 100
|
|
if mod10 == 1 && mod100 != 11 {
|
|
return PluralOne
|
|
}
|
|
if mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14) {
|
|
return PluralFew
|
|
}
|
|
return PluralMany
|
|
}
|
|
|
|
func pluralRulePolish(n int) PluralCategory {
|
|
if n == 1 {
|
|
return PluralOne
|
|
}
|
|
mod10 := n % 10
|
|
mod100 := n % 100
|
|
if mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14) {
|
|
return PluralFew
|
|
}
|
|
return PluralMany
|
|
}
|
|
|
|
func pluralRuleArabic(n int) PluralCategory {
|
|
if n == 0 {
|
|
return PluralZero
|
|
}
|
|
if n == 1 {
|
|
return PluralOne
|
|
}
|
|
if n == 2 {
|
|
return PluralTwo
|
|
}
|
|
mod100 := n % 100
|
|
if mod100 >= 3 && mod100 <= 10 {
|
|
return PluralFew
|
|
}
|
|
if mod100 >= 11 && mod100 <= 99 {
|
|
return PluralMany
|
|
}
|
|
return PluralOther
|
|
}
|
|
|
|
func pluralRuleChinese(n int) PluralCategory { return PluralOther }
|
|
func pluralRuleJapanese(n int) PluralCategory { return PluralOther }
|
|
func pluralRuleKorean(n int) PluralCategory { return PluralOther }
|