Coverage for app/venv/lib/python3.14/site-packages/weblate/lang/data.py: 100%
73 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
1# Copyright © Michal Čihař <michal@weblate.org>
2#
3# SPDX-License-Identifier: GPL-3.0-or-later
5from django.utils.translation import pgettext_lazy
6from weblate_language_data import languages
7from weblate_language_data.aliases import ALIASES
8from weblate_language_data.ambiguous import AMBIGUOUS
10NO_CODE_LANGUAGES = {lang[0] for lang in languages.LANGUAGES}
12NO_SPACE_LANGUAGES = {
13 "zh",
14 "ja",
15 "th",
16 "km",
17 "lo",
18 "my",
19 "ko",
20}
22UNDERSCORE_EXCEPTIONS = {
23 "nb_NO",
24 "zh_Hant",
25 "zh_Hans",
26 "be_Latn",
27 "ro_MD",
28 "pt_BR",
29 "pa_PK",
30 "hi_Latn",
31}
32AT_EXCEPTIONS = {"ca@valencia"}
35def is_default_variant(code):
36 language = code.partition("_")[0]
37 if language not in NO_CODE_LANGUAGES and language in ALIASES:
38 return code == ALIASES[language]
39 return False
42def is_basic(code):
43 if code in AMBIGUOUS:
44 return False
45 if "_" in code:
46 return code in UNDERSCORE_EXCEPTIONS or is_default_variant(code)
47 return "@" not in code or code in AT_EXCEPTIONS
50BASIC_LANGUAGES = {lang for lang in NO_CODE_LANGUAGES if is_basic(lang)}
52# Following variables are used to map Gettext plural formulas
53# to one/few/may/other like rules
55ONE_OTHER_PLURALS = (
56 "n==1 || n%10==1 ? 0 : 1",
57 "n != 1",
58 "(n != 1)",
59 "n > 1",
60 "(n > 1)",
61 "n >= 2 && (n < 11 || n > 99)",
62 "n % 10 != 1 || n % 100 == 11",
63 "(n % 10 == 1 && n % 100 != 11) ? 0 : 1",
64 "n != 1 && n != 2 && n != 3 && (n % 10 == 4 || n % 10 == 6 || n % 10 == 9)",
65 "(n==0 || n==1)",
66 "(n%10==1 && n%100!=11 ? 0 : 1)",
67)
69TWO_OTHER_PLURALS = ("(n==2) ? 1 : 0",)
71ONE_FEW_MANY_PLURALS = (
72 "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2",
73 "(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2",
74 "n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2",
75 "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)",
76 "n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2",
77 "(n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 1 : 2)",
78 "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)",
79 "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)",
80 "((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2)",
81)
82ONE_FEW_OTHER_PLURALS = (
83 "n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2",
84 "(n == 1) ? 0 : ((n == 0 || n != 1 && n % 100 >= 1 && n % 100 <= 19) ? 1 : 2)",
85 "(n == 0 || n == 1) ? 0 : ((n >= 2 && n <= 10) ? 1 : 2)",
86 "(n == 1) ? 0 : ((n == 0 || n % 100 >= 2 && n % 100 <= 19) ? 1 : 2)",
87 "(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2)",
88)
89ZERO_ONE_FEW_OTHER_PLURALS = (
90 "n == 0 ? 0 : n == 1 ? 1 : ((n >= 2 && n <= 10) ? 2 : 3)",
91 "n==0 ? 0 : n==1 ? 1 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 2 : 3",
92 "n==0 ? 0 : (n == 1) ? 1 : ((n == 0 || n % 100 >= 2 && n % 100 <= 19) ? 2 : 3)",
93 "n==0 ? 0 : n==1 ? 1 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 2 : 3",
94 "n==0 ? 0 : (n==1) ? 1 : (n>=2 && n<=4) ? 2 : 3",
95 "n==0 ? 0 : n%10==1 && n%100!=11 ? 1 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 2 : 3",
96 "n==0 ? 0 : (n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) ? 1 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 2 : 3)",
97)
99ONE_ZERO_FEW_OTHER_PLURALS = (
100 "(n==1 ? 0 : (n==0 || (n%100>=1 && n%100<=10)) ? 1 : (n%100>=11 && n%100<=19) ? 2 : 3)",
101)
103ZERO_ONE_OTHER_PLURALS = (
104 "n==0 ? 0 : n==1 ? 1 : 2",
105 "(n == 0) ? 0 : ((n == 1) ? 1 : 2)",
106 "(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2)",
107 "n==0 ? 0 : n>1 ? 1 : 2",
108 "n==0 ? 0 : n!=1 ? 1 : 2",
109 "n == 0 ? 0 : n==1 || n%10==1 ? 1 : 2",
110 "n==0 ? 0 : n != 1 && n != 2 && n != 3 && (n % 10 == 4 || n % 10 == 6 || n % 10 == 9) ? 1: 2",
111 "n==0 ? 0 : n % 10 != 1 || n % 100 == 11 ? 1 :2",
112 "n==0 ? 0 : n >= 2 && (n < 11 || n > 99) ? 1 : 2",
113 "n==0 ? 0 : n%10==1 && n%100!=11 ? 1 : 2",
114 "(n==1 ? 0 : (n%10==4 || n%10==6 || n%10== 9) ? 1 : 2)",
115)
117ONE_TWO_OTHER_PLURALS = (
118 "n==1 ? 0 : n==2 ? 1 : 2",
119 "(n == 1) ? 0 : ((n == 2) ? 1 : 2)",
120 "n%100==1 ? 0 : n%100==2 ? 1 : 2",
121 "(n==1 ? 0 : n==2 ? 1 : 2)",
122 "(n%100==1 ? 0 : n%100==2 ? 1 : 2)",
123)
124ZERO_ONE_TWO_OTHER_PLURALS = (
125 "n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : 3",
126 "n==0 ? 0 : (n == 1) ? 1 : ((n == 2) ? 2 : 3)",
127)
129ONE_OTHER_TWO_PLURALS = ("n==1 ? 0 : n==2 ? 2 : 1",)
131ONE_TWO_THREE_OTHER_PLURALS = ("(n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3",)
133ONE_TWO_FEW_OTHER_PLURALS = (
134 "(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3",
135 "n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3",
136 "(n % 10 == 1) ? 0 : ((n % 10 == 2) ? 1 : ((n % 100 == 0 || n % 100 == 20 || n % 100 == 40 || n % 100 == 60 || n % 100 == 80) ? 2 : 3))",
137 "(n % 100 == 1) ? 0 : ((n % 100 == 2) ? 1 : ((n % 100 == 3 || n % 100 == 4) ? 2 : 3))",
138 "(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && n % 10 == 0) ? 2 : 3))",
139 "(n == 1) ? 0 : ((n == 2) ? 1 : ((n == 10) ? 2 : 3))",
140 "(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3",
141 "(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)",
142)
143ZERO_ONE_TWO_FEW_OTHER_PLURALS = (
144 "n==0 ? 0 : (n==1 || n==11) ? 1 : (n==2 || n==12) ? 2 : (n > 2 && n < 20) ? 3 : 4",
145 "n==0 ? 0 : (n == 1) ? 1 : ((n == 2) ? 2 : ((n > 10 && n % 10 == 0) ? 3 : 4))",
146 "n==0 ? 0 : (n % 100 == 1) ? 1 : ((n % 100 == 2) ? 2 : ((n % 100 == 3 || n % 100 == 4) ? 3 : 4))",
147 "n==0 ? 0 : n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 4",
148 "n==0 ? 0 : (n % 10 == 1) ? 1 : ((n % 10 == 2) ? 2 : ((n % 100 == 0 || n % 100 == 20 || n % 100 == 40 || n % 100 == 60 || n % 100 == 80) ? 3 : 4))",
149)
151OTHER_ONE_TWO_FEW_PLURALS = (
152 "(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0)",
153)
155ONE_TWO_FEW_MANY_OTHER_PLURALS = (
156 "n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4",
157 "n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>6 && n<11) ? 3 : 4",
158 "(n % 10 == 1 && n % 100 != 11 && n % 100 != 71 && n % 100 != 91) ? 0 : ((n % 10 == 2 && n % 100 != 12 && n % 100 != 72 && n % 100 != 92) ? 1 : ((((n % 10 == 3 || n % 10 == 4) || n % 10 == 9) && (n % 100 < 10 || n % 100 > 19) && (n % 100 < 70 || n % 100 > 79) && (n % 100 < 90 || n % 100 > 99)) ? 2 : ((n != 0 && n % 1000000 == 0) ? 3 : 4)))",
159 "(n == 1) ? 0 : ((n == 2) ? 1 : ((n == 0 || n % 100 >= 3 && n % 100 <= 10) ? 2 : ((n % 100 >= 11 && n % 100 <= 19) ? 3 : 4)))",
160)
162ONE_FEW_MANY_OTHER_PLURALS = (
163 "n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3",
164 "n==1 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3",
165 "n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2",
166 "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3)",
167 "(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3)",
168 "(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3)",
169)
170ZERO_ONE_FEW_MANY_OTHER_PLURALS = (
171 "n==0 ? 0 : n==1 ? 1 : ( n%100>1 && n%100<11) ? 2 : (n%100>10 && n%100<20 ) ? 3 : 4",
172 "(n==0 ? 0 : n==1 ? 1 : (n>=2 && n<=5) ? 2 : n==6 ? 3 : 4)",
173)
175ONE_OTHER_ZERO_PLURALS = (
176 "n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2",
177 "(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2)",
178)
180ZERO_ONE_TWO_FEW_MANY_OTHER_PLURALS = (
181 "(n==0) ? 0 : (n==1) ? 1 : (n==2) ? 2 : (n==3) ? 3 :(n==6) ? 4 : 5",
182 "(n == 0) ? 0 : ((n == 1) ? 1 : ((n == 2) ? 2 : ((n % 100 >= 3 && n % 100 <= 10) ? 3 : ((n % 100 >= 11 && n % 100 <= 99) ? 4 : 5))))",
183 "(n == 0) ? 0 : ((n == 1) ? 1 : (((n % 100 == 2 || n % 100 == 22 || n % 100 == 42 || n % 100 == 62 || n % 100 == 82) || n % 1000 == 0 && (n % 100000 >= 1000 && n % 100000 <= 20000 || n % 100000 == 40000 || n % 100000 == 60000 || n % 100000 == 80000) || n != 0 && n % 1000000 == 100000) ? 2 : ((n % 100 == 3 || n % 100 == 23 || n % 100 == 43 || n % 100 == 63 || n % 100 == 83) ? 3 : ((n != 1 && (n % 100 == 1 || n % 100 == 21 || n % 100 == 41 || n % 100 == 61 || n % 100 == 81)) ? 4 : 5))))",
184 "n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : (n>2 && n<7) ? 3 :(n>6 && n<11) ? 4 : 5",
185 "n==0 ? 0 : (n % 10 == 1 && n % 100 != 11 && n % 100 != 71 && n % 100 != 91) ? 1 : ((n % 10 == 2 && n % 100 != 12 && n % 100 != 72 && n % 100 != 92) ? 2 : ((((n % 10 == 3 || n % 10 == 4) || n % 10 == 9) && (n % 100 < 10 || n % 100 > 19) && (n % 100 < 70 || n % 100 > 79) && (n % 100 < 90 || n % 100 > 99)) ? 3 : ((n != 0 && n % 1000000 == 0) ? 4 : 5)))",
186 "(n == 0) ? 0 : (n == 1) ? 1 : ((n == 2) ? 2 : ((n == 0 || n % 100 >= 3 && n % 100 <= 10) ? 3 : ((n % 100 >= 11 && n % 100 <= 19) ? 4 : 5)))",
187 "(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : (n%100>=3 && n%100<=10) ? 3 : n%100>=11 ? 4 : 5)",
188 "n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5",
189)
190ONE_MANY_OTHER_PLURALS = (
191 "(n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2)",
192 "(n == 0 || n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2)",
193)
194ZERO_ONE_MANY_OTHER_PLURALS = (
195 "(n == 0) ? 0 : (n == 1) ? 1 : ((n != 0 && n % 1000000 == 0) ? 2 : 3)",
196)
198ZERO_OTHER_PLURALS = ("n==0 ? 0 : 1",)
200# Plural types definition
201PLURAL_NONE = 0
202PLURAL_ONE_OTHER = 1
203PLURAL_ONE_FEW_OTHER = 2
204PLURAL_ARABIC = 3
205PLURAL_ONE_TWO_OTHER = 4
206PLURAL_ONE_TWO_THREE_OTHER = 5
207PLURAL_ONE_TWO_FEW_OTHER = 6
208PLURAL_ONE_OTHER_ZERO = 7
209PLURAL_ONE_FEW_MANY_OTHER = 8
210PLURAL_TWO_OTHER = 9
211PLURAL_ONE_TWO_FEW_MANY_OTHER = 10
212PLURAL_ZERO_ONE_OTHER = 11
213PLURAL_ZERO_ONE_TWO_FEW_MANY_OTHER = 12
214PLURAL_OTHER_ONE_TWO_FEW = 13
215PLURAL_ONE_OTHER_TWO = 14
216PLURAL_ZERO_OTHER = 15
217PLURAL_ZERO_ONE_FEW_OTHER = 16
218PLURAL_ZERO_ONE_TWO_FEW_OTHER = 17
219PLURAL_ZERO_ONE_TWO_OTHER = 18
220PLURAL_ZERO_ONE_FEW_MANY_OTHER = 19
221PLURAL_ONE_MANY_OTHER = 20
222PLURAL_ZERO_ONE_MANY_OTHER = 21
223PLURAL_ONE_FEW_MANY = 22
224PLURAL_ONE_ZERO_FEW_OTHER = 23
225PLURAL_UNKNOWN = 666
227# Extra zero plural handling for stringsdict
228ZERO_PLURAL_TYPES = {
229 PLURAL_ARABIC,
230 PLURAL_ZERO_ONE_OTHER,
231 PLURAL_ZERO_ONE_TWO_FEW_MANY_OTHER,
232}
234FORMULA_WITH_ZERO = {
235 "0": "n==0 ? 0 : 1",
236 "n > 1": "n==0 ? 0 : n==1 ? 1 : 2",
237 "n != 1": "n==0 ? 0 : n==1 ? 1 : 2",
238 "(n == 0 || n == 1) ? 0 : ((n >= 2 && n <= 10) ? 1 : 2)": "n == 0 ? 0 : n == 1 ? 1 : ((n >= 2 && n <= 10) ? 2 : 3)",
239 "n == 1 ? 0 : n == 2 ? 1 : 2": "n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : 3",
240 "n==1 || n%10==1 ? 0 : 1": "n == 0 ? 0 : n==1 || n%10==1 ? 1 : 2",
241 "n==1 ? 0 : n==2 ? 1 : 2": "n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : 3",
242 "(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3": "n==0 ? 0 : (n==1 || n==11) ? 1 : (n==2 || n==12) ? 2 : (n > 2 && n < 20) ? 3 : 4",
243 "n != 1 && n != 2 && n != 3 && (n % 10 == 4 || n % 10 == 6 || n % 10 == 9)": "n==0 ? 0 : n != 1 && n != 2 && n != 3 && (n % 10 == 4 || n % 10 == 6 || n % 10 == 9) ? 1: 2",
244 "n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2": "n==0 ? 0 : n==1 ? 1 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 2 : 3",
245 "(n == 1) ? 0 : ((n == 0 || n % 100 >= 2 && n % 100 <= 19) ? 1 : 2)": "n==0 ? 0 : (n == 1) ? 1 : ((n == 0 || n % 100 >= 2 && n % 100 <= 19) ? 2 : 3)",
246 "n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2": "n==0 ? 0 : n==1 ? 1 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 2 : 3",
247 "(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2": "n==0 ? 0 : (n==1) ? 1 : (n>=2 && n<=4) ? 2 : 3",
248 "(n == 1) ? 0 : ((n == 2) ? 1 : 2)": "n==0 ? 0 : (n == 1) ? 1 : ((n == 2) ? 2 : 3)",
249 "n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3": "n==0 ? 0 : n==1 ? 1 : ( n%100>1 && n%100<11) ? 2 : (n%100>10 && n%100<20 ) ? 3 : 4",
250 "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2": "n==0 ? 0 : n%10==1 && n%100!=11 ? 1 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 2 : 3",
251 "(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && n % 10 == 0) ? 2 : 3))": "n==0 ? 0 : (n == 1) ? 1 : ((n == 2) ? 2 : ((n > 10 && n % 10 == 0) ? 3 : 4))",
252 "n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>6 && n<11) ? 3 : 4": "n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : (n>2 && n<7) ? 3 :(n>6 && n<11) ? 4 : 5",
253 "(n % 100 == 1) ? 0 : ((n % 100 == 2) ? 1 : ((n % 100 == 3 || n % 100 == 4) ? 2 : 3))": "n==0 ? 0 : (n % 100 == 1) ? 1 : ((n % 100 == 2) ? 2 : ((n % 100 == 3 || n % 100 == 4) ? 3 : 4))",
254 "n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3": "n==0 ? 0 : n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 4",
255 "n % 10 != 1 || n % 100 == 11": "n==0 ? 0 : n % 10 != 1 || n % 100 == 11 ? 1 :2",
256 "(n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 1 : 2)": "n==0 ? 0 : (n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) ? 1 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 2 : 3)",
257 "n >= 2 && (n < 11 || n > 99)": "n==0 ? 0 : n >= 2 && (n < 11 || n > 99) ? 1 : 2",
258 "(n % 10 == 1) ? 0 : ((n % 10 == 2) ? 1 : ((n % 100 == 0 || n % 100 == 20 || n % 100 == 40 || n % 100 == 60 || n % 100 == 80) ? 2 : 3))": "n==0 ? 0 : (n % 10 == 1) ? 1 : ((n % 10 == 2) ? 2 : ((n % 100 == 0 || n % 100 == 20 || n % 100 == 40 || n % 100 == 60 || n % 100 == 80) ? 3 : 4))",
259 "(n % 10 == 1 && n % 100 != 11 && n % 100 != 71 && n % 100 != 91) ? 0 : ((n % 10 == 2 && n % 100 != 12 && n % 100 != 72 && n % 100 != 92) ? 1 : ((((n % 10 == 3 || n % 10 == 4) || n % 10 == 9) && (n % 100 < 10 || n % 100 > 19) && (n % 100 < 70 || n % 100 > 79) && (n % 100 < 90 || n % 100 > 99)) ? 2 : ((n != 0 && n % 1000000 == 0) ? 3 : 4)))": "n==0 ? 0 : (n % 10 == 1 && n % 100 != 11 && n % 100 != 71 && n % 100 != 91) ? 1 : ((n % 10 == 2 && n % 100 != 12 && n % 100 != 72 && n % 100 != 92) ? 2 : ((((n % 10 == 3 || n % 10 == 4) || n % 10 == 9) && (n % 100 < 10 || n % 100 > 19) && (n % 100 < 70 || n % 100 > 79) && (n % 100 < 90 || n % 100 > 99)) ? 3 : ((n != 0 && n % 1000000 == 0) ? 4 : 5)))",
260 "n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2": "n==0 ? 0 : n%10==1 && n%100!=11 ? 1 : 2",
261 "(n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2)": "(n == 0) ? 0 : (n == 1) ? 1 : ((n != 0 && n % 1000000 == 0) ? 2 : 3)",
262 "(n == 0 || n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2)": "(n == 0) ? 0 : (n == 1) ? 1 : ((n != 0 && n % 1000000 == 0) ? 2 : 3)",
263 "(n == 1) ? 0 : ((n == 2) ? 1 : ((n == 0 || n % 100 >= 3 && n % 100 <= 10) ? 2 : ((n % 100 >= 11 && n % 100 <= 19) ? 3 : 4)))": "(n == 0) ? 0 : (n == 1) ? 1 : ((n == 2) ? 2 : ((n == 0 || n % 100 >= 3 && n % 100 <= 10) ? 3 : ((n % 100 >= 11 && n % 100 <= 19) ? 4 : 5)))",
264}
267def nospace_set(source):
268 return {item.replace(" ", "") for item in source}
271# Plural formula - type mappings
272PLURAL_MAPPINGS = (
273 (nospace_set(ONE_OTHER_PLURALS), PLURAL_ONE_OTHER),
274 (nospace_set(ONE_FEW_OTHER_PLURALS), PLURAL_ONE_FEW_OTHER),
275 (nospace_set(ZERO_ONE_FEW_OTHER_PLURALS), PLURAL_ZERO_ONE_FEW_OTHER),
276 (nospace_set(ONE_ZERO_FEW_OTHER_PLURALS), PLURAL_ONE_ZERO_FEW_OTHER),
277 (nospace_set(ONE_TWO_OTHER_PLURALS), PLURAL_ONE_TWO_OTHER),
278 (nospace_set(ZERO_ONE_TWO_OTHER_PLURALS), PLURAL_ZERO_ONE_TWO_OTHER),
279 (nospace_set(ONE_OTHER_TWO_PLURALS), PLURAL_ONE_OTHER_TWO),
280 (nospace_set(ZERO_ONE_OTHER_PLURALS), PLURAL_ZERO_ONE_OTHER),
281 (nospace_set(ONE_TWO_FEW_OTHER_PLURALS), PLURAL_ONE_TWO_FEW_OTHER),
282 (nospace_set(ZERO_ONE_TWO_FEW_OTHER_PLURALS), PLURAL_ZERO_ONE_TWO_FEW_OTHER),
283 (nospace_set(OTHER_ONE_TWO_FEW_PLURALS), PLURAL_OTHER_ONE_TWO_FEW),
284 (nospace_set(ONE_TWO_THREE_OTHER_PLURALS), PLURAL_ONE_TWO_THREE_OTHER),
285 (nospace_set(ONE_OTHER_ZERO_PLURALS), PLURAL_ONE_OTHER_ZERO),
286 (nospace_set(ONE_FEW_MANY_OTHER_PLURALS), PLURAL_ONE_FEW_MANY_OTHER),
287 (nospace_set(ZERO_ONE_FEW_MANY_OTHER_PLURALS), PLURAL_ZERO_ONE_FEW_MANY_OTHER),
288 (nospace_set(TWO_OTHER_PLURALS), PLURAL_TWO_OTHER),
289 (nospace_set(ONE_TWO_FEW_MANY_OTHER_PLURALS), PLURAL_ONE_TWO_FEW_MANY_OTHER),
290 (
291 nospace_set(ZERO_ONE_TWO_FEW_MANY_OTHER_PLURALS),
292 PLURAL_ZERO_ONE_TWO_FEW_MANY_OTHER,
293 ),
294 (nospace_set(ZERO_OTHER_PLURALS), PLURAL_ZERO_OTHER),
295 (nospace_set(ONE_MANY_OTHER_PLURALS), PLURAL_ONE_MANY_OTHER),
296 (nospace_set(ZERO_ONE_MANY_OTHER_PLURALS), PLURAL_ZERO_ONE_MANY_OTHER),
297 (nospace_set(ONE_FEW_MANY_PLURALS), PLURAL_ONE_FEW_MANY),
298)
300# Plural names mapping
301PLURAL_NAMES = {
302 PLURAL_NONE: ("",),
303 PLURAL_ONE_OTHER: (
304 pgettext_lazy("Plural form description", "Singular"),
305 pgettext_lazy("Plural form description", "Plural"),
306 ),
307 PLURAL_ONE_FEW_OTHER: (
308 pgettext_lazy("Plural form description", "One"),
309 pgettext_lazy("Plural form description", "Few"),
310 pgettext_lazy("Plural form description", "Other"),
311 ),
312 PLURAL_ZERO_ONE_FEW_OTHER: (
313 pgettext_lazy("Plural form description", "Zero"),
314 pgettext_lazy("Plural form description", "One"),
315 pgettext_lazy("Plural form description", "Few"),
316 pgettext_lazy("Plural form description", "Other"),
317 ),
318 PLURAL_ONE_ZERO_FEW_OTHER: (
319 pgettext_lazy("Plural form description", "One"),
320 pgettext_lazy("Plural form description", "Zero"),
321 pgettext_lazy("Plural form description", "Few"),
322 pgettext_lazy("Plural form description", "Other"),
323 ),
324 PLURAL_ARABIC: (
325 pgettext_lazy("Plural form description", "Zero"),
326 pgettext_lazy("Plural form description", "One"),
327 pgettext_lazy("Plural form description", "Two"),
328 pgettext_lazy("Plural form description", "Few"),
329 pgettext_lazy("Plural form description", "Many"),
330 pgettext_lazy("Plural form description", "Other"),
331 ),
332 PLURAL_ZERO_ONE_OTHER: (
333 pgettext_lazy("Plural form description", "Zero"),
334 pgettext_lazy("Plural form description", "One"),
335 pgettext_lazy("Plural form description", "Other"),
336 ),
337 PLURAL_ONE_TWO_OTHER: (
338 pgettext_lazy("Plural form description", "One"),
339 pgettext_lazy("Plural form description", "Two"),
340 pgettext_lazy("Plural form description", "Other"),
341 ),
342 PLURAL_ZERO_ONE_TWO_OTHER: (
343 pgettext_lazy("Plural form description", "Zero"),
344 pgettext_lazy("Plural form description", "One"),
345 pgettext_lazy("Plural form description", "Two"),
346 pgettext_lazy("Plural form description", "Other"),
347 ),
348 PLURAL_ONE_OTHER_TWO: (
349 pgettext_lazy("Plural form description", "One"),
350 pgettext_lazy("Plural form description", "Other"),
351 pgettext_lazy("Plural form description", "Two"),
352 ),
353 PLURAL_ONE_TWO_THREE_OTHER: (
354 pgettext_lazy("Plural form description", "One"),
355 pgettext_lazy("Plural form description", "Two"),
356 pgettext_lazy("Plural form description", "Three"),
357 pgettext_lazy("Plural form description", "Other"),
358 ),
359 PLURAL_ONE_TWO_FEW_OTHER: (
360 pgettext_lazy("Plural form description", "One"),
361 pgettext_lazy("Plural form description", "Two"),
362 pgettext_lazy("Plural form description", "Few"),
363 pgettext_lazy("Plural form description", "Other"),
364 ),
365 PLURAL_ZERO_ONE_TWO_FEW_OTHER: (
366 pgettext_lazy("Plural form description", "Zero"),
367 pgettext_lazy("Plural form description", "One"),
368 pgettext_lazy("Plural form description", "Two"),
369 pgettext_lazy("Plural form description", "Few"),
370 pgettext_lazy("Plural form description", "Other"),
371 ),
372 PLURAL_OTHER_ONE_TWO_FEW: (
373 pgettext_lazy("Plural form description", "Other"),
374 pgettext_lazy("Plural form description", "One"),
375 pgettext_lazy("Plural form description", "Two"),
376 pgettext_lazy("Plural form description", "Few"),
377 ),
378 PLURAL_ONE_OTHER_ZERO: (
379 pgettext_lazy("Plural form description", "One"),
380 pgettext_lazy("Plural form description", "Other"),
381 pgettext_lazy("Plural form description", "Zero"),
382 ),
383 PLURAL_ONE_FEW_MANY_OTHER: (
384 pgettext_lazy("Plural form description", "One"),
385 pgettext_lazy("Plural form description", "Few"),
386 pgettext_lazy("Plural form description", "Many"),
387 pgettext_lazy("Plural form description", "Other"),
388 ),
389 PLURAL_ZERO_ONE_FEW_MANY_OTHER: (
390 pgettext_lazy("Plural form description", "Zero"),
391 pgettext_lazy("Plural form description", "One"),
392 pgettext_lazy("Plural form description", "Few"),
393 pgettext_lazy("Plural form description", "Many"),
394 pgettext_lazy("Plural form description", "Other"),
395 ),
396 PLURAL_ONE_TWO_FEW_MANY_OTHER: (
397 pgettext_lazy("Plural form description", "One"),
398 pgettext_lazy("Plural form description", "Two"),
399 pgettext_lazy("Plural form description", "Few"),
400 pgettext_lazy("Plural form description", "Many"),
401 pgettext_lazy("Plural form description", "Other"),
402 ),
403 PLURAL_TWO_OTHER: (
404 pgettext_lazy("Plural form description", "Two"),
405 pgettext_lazy("Plural form description", "Other"),
406 ),
407 PLURAL_ZERO_ONE_TWO_FEW_MANY_OTHER: (
408 pgettext_lazy("Plural form description", "Zero"),
409 pgettext_lazy("Plural form description", "One"),
410 pgettext_lazy("Plural form description", "Two"),
411 pgettext_lazy("Plural form description", "Few"),
412 pgettext_lazy("Plural form description", "Many"),
413 pgettext_lazy("Plural form description", "Other"),
414 ),
415 PLURAL_ZERO_OTHER: (
416 pgettext_lazy("Plural form description", "Zero"),
417 pgettext_lazy("Plural form description", "Other"),
418 ),
419 PLURAL_ONE_MANY_OTHER: (
420 pgettext_lazy("Plural form description", "One"),
421 pgettext_lazy("Plural form description", "Many"),
422 pgettext_lazy("Plural form description", "Other"),
423 ),
424 PLURAL_ZERO_ONE_MANY_OTHER: (
425 pgettext_lazy("Plural form description", "Zero"),
426 pgettext_lazy("Plural form description", "One"),
427 pgettext_lazy("Plural form description", "Many"),
428 pgettext_lazy("Plural form description", "Other"),
429 ),
430 PLURAL_ONE_FEW_MANY: (
431 pgettext_lazy("Plural form description", "One"),
432 pgettext_lazy("Plural form description", "Few"),
433 pgettext_lazy("Plural form description", "Many"),
434 ),
435}