plural_rules.go

  1package i18n
  2
  3// This file contains plural rule implementations for different languages.
  4// Plural rules are based on Unicode CLDR plural rules.
  5// Reference: https://cldr.unicode.org/index/cldr-spec/plural-rules
  6
  7// EnglishPlural implements plural rules for English.
  8// Rule: one (n == 1), other (everything else)
  9func EnglishPlural(n int) PluralForm {
 10	if n == 1 {
 11		return One
 12	}
 13	return Other
 14}
 15
 16// SpanishPlural implements plural rules for Spanish.
 17// Rule: one (n == 1), other (everything else)
 18func SpanishPlural(n int) PluralForm {
 19	if n == 1 {
 20		return One
 21	}
 22	return Other
 23}
 24
 25// GermanPlural implements plural rules for German.
 26// Rule: one (n == 1), other (everything else)
 27func GermanPlural(n int) PluralForm {
 28	if n == 1 {
 29		return One
 30	}
 31	return Other
 32}
 33
 34// FrenchPlural implements plural rules for French.
 35// Rule: one (n == 0 or n == 1), other (everything else)
 36func FrenchPlural(n int) PluralForm {
 37	if n == 0 || n == 1 {
 38		return One
 39	}
 40	return Other
 41}
 42
 43// PortuguesePlural implements plural rules for Portuguese.
 44// Rule: one (n == 0 or n == 1), other (everything else)
 45func PortuguesePlural(n int) PluralForm {
 46	if n == 0 || n == 1 {
 47		return One
 48	}
 49	return Other
 50}
 51
 52// RussianPlural implements plural rules for Russian.
 53// Rule: one (n mod 10 == 1 and n mod 100 != 11)
 54//
 55//	few (n mod 10 in 2..4 and n mod 100 not in 12..14)
 56//	many (everything else)
 57func RussianPlural(n int) PluralForm {
 58	mod10 := n % 10
 59	mod100 := n % 100
 60
 61	if mod10 == 1 && mod100 != 11 {
 62		return One
 63	}
 64	if mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14) {
 65		return Few
 66	}
 67	return Many
 68}
 69
 70// ArabicPlural implements plural rules for Arabic.
 71// Rule: zero (n == 0)
 72//
 73//	one (n == 1)
 74//	two (n == 2)
 75//	few (n mod 100 in 3..10)
 76//	many (n mod 100 in 11..99)
 77//	other (everything else)
 78func ArabicPlural(n int) PluralForm {
 79	if n == 0 {
 80		return Zero
 81	}
 82	if n == 1 {
 83		return One
 84	}
 85	if n == 2 {
 86		return Two
 87	}
 88
 89	mod100 := n % 100
 90	if mod100 >= 3 && mod100 <= 10 {
 91		return Few
 92	}
 93	if mod100 >= 11 && mod100 <= 99 {
 94		return Many
 95	}
 96	return Other
 97}
 98
 99// JapanesePlural implements plural rules for Japanese.
100// Rule: other (always - no plural distinction)
101func JapanesePlural(n int) PluralForm {
102	return Other
103}
104
105// ChinesePlural implements plural rules for Chinese.
106// Rule: other (always - no plural distinction)
107func ChinesePlural(n int) PluralForm {
108	return Other
109}
110
111// PolishPlural implements plural rules for Polish.
112// Rule: one (n == 1)
113//
114//	few (n mod 10 in 2..4 and n mod 100 not in 12..14)
115//	many (everything else)
116func PolishPlural(n int) PluralForm {
117	if n == 1 {
118		return One
119	}
120
121	mod10 := n % 10
122	mod100 := n % 100
123
124	if mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14) {
125		return Few
126	}
127	return Many
128}
129
130// CzechPlural implements plural rules for Czech.
131// Rule: one (n == 1)
132//
133//	few (n in 2..4)
134//	many (everything else)
135func CzechPlural(n int) PluralForm {
136	if n == 1 {
137		return One
138	}
139	if n >= 2 && n <= 4 {
140		return Few
141	}
142	return Many
143}
144
145// ItalianPlural implements plural rules for Italian.
146// Rule: one (n == 1), other (everything else)
147func ItalianPlural(n int) PluralForm {
148	if n == 1 {
149		return One
150	}
151	return Other
152}
153
154// UkrainianPlural implements plural rules for Ukrainian.
155// Rule: one (n mod 10 == 1 and n mod 100 != 11)
156//
157//	few (n mod 10 in 2..4 and n mod 100 not in 12..14)
158//	many (everything else)
159//
160// Same as Russian
161func UkrainianPlural(n int) PluralForm {
162	mod10 := n % 10
163	mod100 := n % 100
164
165	if mod10 == 1 && mod100 != 11 {
166		return One
167	}
168	if mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14) {
169		return Few
170	}
171	return Many
172}