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}