Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Side by Side Diff: packages/intl/lib/src/plural_rules.dart

Issue 2989763002: Update charted to 0.4.8 and roll (Closed)
Patch Set: Removed Cutch from list of reviewers Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « packages/intl/lib/src/lazy_locale_data.dart ('k') | packages/intl/pubspec.yaml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 /// Provides locale-specific plural rules. Based on pluralrules.js from Closure.
6 ///
7 /// Each function does the calculation for one or more locales. These are done i n terms of
8 /// various values used by the CLDR syntax and defined by UTS #35
9 /// http://unicode.org/reports/tr35/tr35-numbers.html#Plural_rules_syntax
10 ///
11 /// * n - absolute value of the source number (integer and decimals).
12 /// * i - integer digits of n.
13 /// * v - number of visible fraction digits in n, with trailing zeros.
14 /// * w - number of visible fraction digits in n, without trailing zeros.
15 /// * f - visible fractional digits in n, with trailing zeros.
16 /// * t - visible fractional digits in n, without trailing zeros.
17 library plural_rules;
18
19 typedef PluralCase PluralRule();
20
21 /// The possible cases used in a plural rule.
22 enum PluralCase { ZERO, ONE, TWO, FEW, MANY, OTHER }
23
24 /// The default rule in case we don't have anything more specific for a locale.
25 PluralCase _default_rule() => OTHER;
26
27 /// This must be called before evaluating a new rule, because we're using
28 /// library-global state to both keep the rules terse and minimize space.
29 startRuleEvaluation(int howMany) {
30 _n = howMany;
31 }
32
33 /// The number whose [PluralCase] we are trying to find.
34 ///
35 // This is library-global state, along with the other variables. This allows us
36 // to avoid calculating parameters that the functions don't need and also
37 // not introduce a subclass per locale or have instance tear-offs which
38 // we can't cache. This is fine as long as these methods aren't async, which
39 // they should never be.
40 int _n;
41
42 /// The integer part of [_n] - since we only support integers, it's the same as
43 /// [_n].
44 int get _i => _n;
45 int opt_precision; // Not currently used.
46
47 /// Number of visible fraction digits. Always zero since we only support int.
48 int get _v => 0;
49
50 /// Number of visible fraction digits without trailing zeros. Always zero
51 /// since we only support int.
52 //int get _w => 0;
53
54 /// The visible fraction digits in n, with trailing zeros. Always zero since
55 /// we only support int.
56 int get _f => 0;
57
58 /// The visible fraction digits in n, without trailing zeros. Always zero since
59 /// we only support int.
60 int get _t => 0;
61
62 PluralCase get ZERO => PluralCase.ZERO;
63 PluralCase get ONE => PluralCase.ONE;
64 PluralCase get TWO => PluralCase.TWO;
65 PluralCase get FEW => PluralCase.FEW;
66 PluralCase get MANY => PluralCase.MANY;
67 PluralCase get OTHER => PluralCase.OTHER;
68
69 PluralCase _fil_rule() {
70 if (_v == 0 && (_i == 1 || _i == 2 || _i == 3) ||
71 _v == 0 && _i % 10 != 4 && _i % 10 != 6 && _i % 10 != 9 ||
72 _v != 0 && _f % 10 != 4 && _f % 10 != 6 && _f % 10 != 9) {
73 return ONE;
74 }
75 return OTHER;
76 }
77
78 PluralCase _pt_PT_rule() {
79 if (_n == 1 && _v == 0) {
80 return ONE;
81 }
82 return OTHER;
83 }
84
85 PluralCase _br_rule() {
86 if (_n % 10 == 1 && _n % 100 != 11 && _n % 100 != 71 && _n % 100 != 91) {
87 return ONE;
88 }
89 if (_n % 10 == 2 && _n % 100 != 12 && _n % 100 != 72 && _n % 100 != 92) {
90 return TWO;
91 }
92 if ((_n % 10 >= 3 && _n % 10 <= 4 || _n % 10 == 9) &&
93 (_n % 100 < 10 || _n % 100 > 19) &&
94 (_n % 100 < 70 || _n % 100 > 79) &&
95 (_n % 100 < 90 || _n % 100 > 99)) {
96 return FEW;
97 }
98 if (_n != 0 && _n % 1000000 == 0) {
99 return MANY;
100 }
101 return OTHER;
102 }
103
104 PluralCase _sr_rule() {
105 if (_v == 0 && _i % 10 == 1 && _i % 100 != 11 ||
106 _f % 10 == 1 && _f % 100 != 11) {
107 return ONE;
108 }
109 if (_v == 0 &&
110 _i % 10 >= 2 &&
111 _i % 10 <= 4 &&
112 (_i % 100 < 12 || _i % 100 > 14) ||
113 _f % 10 >= 2 && _f % 10 <= 4 && (_f % 100 < 12 || _f % 100 > 14)) {
114 return FEW;
115 }
116 return OTHER;
117 }
118
119 PluralCase _ro_rule() {
120 if (_i == 1 && _v == 0) {
121 return ONE;
122 }
123 if (_v != 0 || _n == 0 || _n != 1 && _n % 100 >= 1 && _n % 100 <= 19) {
124 return FEW;
125 }
126 return OTHER;
127 }
128
129 PluralCase _hi_rule() {
130 if (_i == 0 || _n == 1) {
131 return ONE;
132 }
133 return OTHER;
134 }
135
136 PluralCase _fr_rule() {
137 if (_i == 0 || _i == 1) {
138 return ONE;
139 }
140 return OTHER;
141 }
142
143 PluralCase _cs_rule() {
144 if (_i == 1 && _v == 0) {
145 return ONE;
146 }
147 if (_i >= 2 && _i <= 4 && _v == 0) {
148 return FEW;
149 }
150 if (_v != 0) {
151 return MANY;
152 }
153 return OTHER;
154 }
155
156 PluralCase _pl_rule() {
157 if (_i == 1 && _v == 0) {
158 return ONE;
159 }
160 if (_v == 0 &&
161 _i % 10 >= 2 &&
162 _i % 10 <= 4 &&
163 (_i % 100 < 12 || _i % 100 > 14)) {
164 return FEW;
165 }
166 if (_v == 0 && _i != 1 && _i % 10 >= 0 && _i % 10 <= 1 ||
167 _v == 0 && _i % 10 >= 5 && _i % 10 <= 9 ||
168 _v == 0 && _i % 100 >= 12 && _i % 100 <= 14) {
169 return MANY;
170 }
171 return OTHER;
172 }
173
174 PluralCase _lv_rule() {
175 if (_n % 10 == 0 ||
176 _n % 100 >= 11 && _n % 100 <= 19 ||
177 _v == 2 && _f % 100 >= 11 && _f % 100 <= 19) {
178 return ZERO;
179 }
180 if (_n % 10 == 1 && _n % 100 != 11 ||
181 _v == 2 && _f % 10 == 1 && _f % 100 != 11 ||
182 _v != 2 && _f % 10 == 1) {
183 return ONE;
184 }
185 return OTHER;
186 }
187
188 PluralCase _he_rule() {
189 if (_i == 1 && _v == 0) {
190 return ONE;
191 }
192 if (_i == 2 && _v == 0) {
193 return TWO;
194 }
195 if (_v == 0 && (_n < 0 || _n > 10) && _n % 10 == 0) {
196 return MANY;
197 }
198 return OTHER;
199 }
200
201 PluralCase _mt_rule() {
202 if (_n == 1) {
203 return ONE;
204 }
205 if (_n == 0 || _n % 100 >= 2 && _n % 100 <= 10) {
206 return FEW;
207 }
208 if (_n % 100 >= 11 && _n % 100 <= 19) {
209 return MANY;
210 }
211 return OTHER;
212 }
213
214 PluralCase _si_rule() {
215 if ((_n == 0 || _n == 1) || _i == 0 && _f == 1) {
216 return ONE;
217 }
218 return OTHER;
219 }
220
221 PluralCase _cy_rule() {
222 if (_n == 0) {
223 return ZERO;
224 }
225 if (_n == 1) {
226 return ONE;
227 }
228 if (_n == 2) {
229 return TWO;
230 }
231 if (_n == 3) {
232 return FEW;
233 }
234 if (_n == 6) {
235 return MANY;
236 }
237 return OTHER;
238 }
239
240 PluralCase _da_rule() {
241 if (_n == 1 || _t != 0 && (_i == 0 || _i == 1)) {
242 return ONE;
243 }
244 return OTHER;
245 }
246
247 PluralCase _ru_rule() {
248 if (_v == 0 && _i % 10 == 1 && _i % 100 != 11) {
249 return ONE;
250 }
251 if (_v == 0 &&
252 _i % 10 >= 2 &&
253 _i % 10 <= 4 &&
254 (_i % 100 < 12 || _i % 100 > 14)) {
255 return FEW;
256 }
257 if (_v == 0 && _i % 10 == 0 ||
258 _v == 0 && _i % 10 >= 5 && _i % 10 <= 9 ||
259 _v == 0 && _i % 100 >= 11 && _i % 100 <= 14) {
260 return MANY;
261 }
262 return OTHER;
263 }
264
265 PluralCase _be_rule() {
266 if (_n % 10 == 1 && _n % 100 != 11) {
267 return ONE;
268 }
269 if (_n % 10 >= 2 && _n % 10 <= 4 && (_n % 100 < 12 || _n % 100 > 14)) {
270 return FEW;
271 }
272 if (_n % 10 == 0 ||
273 _n % 10 >= 5 && _n % 10 <= 9 ||
274 _n % 100 >= 11 && _n % 100 <= 14) {
275 return MANY;
276 }
277 return OTHER;
278 }
279
280 PluralCase _mk_rule() {
281 if (_v == 0 && _i % 10 == 1 || _f % 10 == 1) {
282 return ONE;
283 }
284 return OTHER;
285 }
286
287 PluralCase _ga_rule() {
288 if (_n == 1) {
289 return ONE;
290 }
291 if (_n == 2) {
292 return TWO;
293 }
294 if (_n >= 3 && _n <= 6) {
295 return FEW;
296 }
297 if (_n >= 7 && _n <= 10) {
298 return MANY;
299 }
300 return OTHER;
301 }
302
303 PluralCase _pt_rule() {
304 if (_n >= 0 && _n <= 2 && _n != 2) {
305 return ONE;
306 }
307 return OTHER;
308 }
309
310 PluralCase _es_rule() {
311 if (_n == 1) {
312 return ONE;
313 }
314 return OTHER;
315 }
316
317 PluralCase _is_rule() {
318 if (_t == 0 && _i % 10 == 1 && _i % 100 != 11 || _t != 0) {
319 return ONE;
320 }
321 return OTHER;
322 }
323
324 PluralCase _ar_rule() {
325 if (_n == 0) {
326 return ZERO;
327 }
328 if (_n == 1) {
329 return ONE;
330 }
331 if (_n == 2) {
332 return TWO;
333 }
334 if (_n % 100 >= 3 && _n % 100 <= 10) {
335 return FEW;
336 }
337 if (_n % 100 >= 11 && _n % 100 <= 99) {
338 return MANY;
339 }
340 return OTHER;
341 }
342
343 PluralCase _sl_rule() {
344 if (_v == 0 && _i % 100 == 1) {
345 return ONE;
346 }
347 if (_v == 0 && _i % 100 == 2) {
348 return TWO;
349 }
350 if (_v == 0 && _i % 100 >= 3 && _i % 100 <= 4 || _v != 0) {
351 return FEW;
352 }
353 return OTHER;
354 }
355
356 PluralCase _lt_rule() {
357 if (_n % 10 == 1 && (_n % 100 < 11 || _n % 100 > 19)) {
358 return ONE;
359 }
360 if (_n % 10 >= 2 && _n % 10 <= 9 && (_n % 100 < 11 || _n % 100 > 19)) {
361 return FEW;
362 }
363 if (_f != 0) {
364 return MANY;
365 }
366 return OTHER;
367 }
368
369 PluralCase _en_rule() {
370 if (_i == 1 && _v == 0) {
371 return ONE;
372 }
373 return OTHER;
374 }
375
376 PluralCase _ak_rule() {
377 if (_n >= 0 && _n <= 1) {
378 return ONE;
379 }
380 return OTHER;
381 }
382
383 /// Selected Plural rules by locale.
384 final Map pluralRules = {
385 'af': _es_rule,
386 'am': _hi_rule,
387 'ar': _ar_rule,
388 'az': _es_rule,
389 'be': _be_rule,
390 'bg': _es_rule,
391 'bn': _hi_rule,
392 'br': _br_rule,
393 'bs': _sr_rule,
394 'ca': _en_rule,
395 'chr': _es_rule,
396 'cs': _cs_rule,
397 'cy': _cy_rule,
398 'da': _da_rule,
399 'de': _en_rule,
400 'de_AT': _en_rule,
401 'de_CH': _en_rule,
402 'el': _es_rule,
403 'en': _en_rule,
404 'en_AU': _en_rule,
405 'en_CA': _en_rule,
406 'en_GB': _en_rule,
407 'en_IE': _en_rule,
408 'en_IN': _en_rule,
409 'en_SG': _en_rule,
410 'en_US': _en_rule,
411 'en_ZA': _en_rule,
412 'es': _es_rule,
413 'es_419': _es_rule,
414 'es_ES': _es_rule,
415 'es_MX': _es_rule,
416 'es_US': _es_rule,
417 'et': _en_rule,
418 'eu': _es_rule,
419 'fa': _hi_rule,
420 'fi': _en_rule,
421 'fil': _fil_rule,
422 'fr': _fr_rule,
423 'fr_CA': _fr_rule,
424 'ga': _ga_rule,
425 'gl': _en_rule,
426 'gsw': _es_rule,
427 'gu': _hi_rule,
428 'haw': _es_rule,
429 'he': _he_rule,
430 'hi': _hi_rule,
431 'hr': _sr_rule,
432 'hu': _es_rule,
433 'hy': _fr_rule,
434 'id': _default_rule,
435 'in': _default_rule,
436 'is': _is_rule,
437 'it': _en_rule,
438 'iw': _he_rule,
439 'ja': _default_rule,
440 'ka': _es_rule,
441 'kk': _es_rule,
442 'km': _default_rule,
443 'kn': _hi_rule,
444 'ko': _default_rule,
445 'ky': _es_rule,
446 'ln': _ak_rule,
447 'lo': _default_rule,
448 'lt': _lt_rule,
449 'lv': _lv_rule,
450 'mk': _mk_rule,
451 'ml': _es_rule,
452 'mn': _es_rule,
453 'mo': _ro_rule,
454 'mr': _hi_rule,
455 'ms': _default_rule,
456 'mt': _mt_rule,
457 'my': _default_rule,
458 'nb': _es_rule,
459 'ne': _es_rule,
460 'nl': _en_rule,
461 'no': _es_rule,
462 'no_NO': _es_rule,
463 'or': _es_rule,
464 'pa': _ak_rule,
465 'pl': _pl_rule,
466 'pt': _pt_rule,
467 'pt_BR': _pt_rule,
468 'pt_PT': _pt_PT_rule,
469 'ro': _ro_rule,
470 'ru': _ru_rule,
471 'sh': _sr_rule,
472 'si': _si_rule,
473 'sk': _cs_rule,
474 'sl': _sl_rule,
475 'sq': _es_rule,
476 'sr': _sr_rule,
477 'sr_Latn': _sr_rule,
478 'sv': _en_rule,
479 'sw': _en_rule,
480 'ta': _es_rule,
481 'te': _es_rule,
482 'th': _default_rule,
483 'tl': _fil_rule,
484 'tr': _es_rule,
485 'uk': _ru_rule,
486 'ur': _en_rule,
487 'uz': _es_rule,
488 'vi': _default_rule,
489 'zh': _default_rule,
490 'zh_CN': _default_rule,
491 'zh_HK': _default_rule,
492 'zh_TW': _default_rule,
493 'zu': _hi_rule,
494 'default': _default_rule
495 };
496
497 /// Do we have plural rules specific to [locale]
498 bool localeHasPluralRules(String locale) => pluralRules.containsKey(locale);
OLDNEW
« no previous file with comments | « packages/intl/lib/src/lazy_locale_data.dart ('k') | packages/intl/pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698