-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPluralRule.hh
More file actions
124 lines (104 loc) · 3.96 KB
/
Copy pathPluralRule.hh
File metadata and controls
124 lines (104 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?hh // strict
/**
* @copyright 2010-2015, The Titon Project
* @license http://opensource.org/licenses/bsd-license.php
* @link http://titon.io
*/
namespace Titon\Intl;
/**
* Manages the pluralization rules for languages.
*
* @link http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms
* @link https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals#List_of_Plural_Rules
* @link http://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html
*
* @package Titon\Intl
*/
class PluralRule {
const int RULE_1 = 1;
const int RULE_2 = 2;
const int RULE_3 = 3;
const int RULE_4 = 4;
const int RULE_5 = 5;
const int RULE_6 = 6;
const int RULE_7 = 7;
const int RULE_8 = 8;
const int RULE_9 = 9;
const int RULE_10 = 10;
const int RULE_11 = 11;
const int RULE_12 = 12;
const int RULE_13 = 13;
const int RULE_14 = 14;
const int RULE_15 = 15;
/**
* Calculate the number of plural forms based on a rule and number.
*
* @param int $rule
* @param int $number
* @return int
*/
public static function calculate(int $rule, int $number): int {
switch ($rule) {
default:
case self::RULE_1:
return 0;
case self::RULE_2:
return ($number == 1) ? 0 : 1;
case self::RULE_3:
return ($number > 1) ? 1 : 0;
case self::RULE_4:
return ($number % 10 == 1 && $number % 100 != 11) ? 0
: (($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 10 || $number % 100 >= 20)) ? 1
: 2);
case self::RULE_5:
return ($number == 1) ? 0
: (($number >= 2 && $number <= 4) ? 1
: 2);
case self::RULE_6:
return ($number == 1) ? 0
: (($number == 2) ? 1
: 2);
case self::RULE_7:
return ($number % 10 == 1 && $number % 100 != 11) ? 0
: (($number % 10 >= 2 && ($number % 100 < 10 || $number % 100 >= 20)) ? 1
: 2);
case self::RULE_8:
return ($number % 100 == 1) ? 0
: (($number % 100 == 2) ? 1
: (($number % 100 == 3 || $number % 100 == 4) ? 2
: 3));
case self::RULE_9:
return ($number % 10 == 1) ? 0 : 1;
case self::RULE_10:
return ($number == 1) ? 0
: (($number == 0 || ($number % 100 > 1 && $number % 100 < 11)) ? 1
: (($number % 100 > 10 && $number % 100 < 20) ? 2
: 3));
case self::RULE_11:
return ($number == 0) ? 0
: (($number % 10 == 1 && $number % 100 != 11) ? 1
: 2);
case self::RULE_12:
return ($number == 1) ? 0
: (($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 12 || $number % 100 > 14)) ? 1
: 2);
case self::RULE_13:
return ($number == 1) ? 0
: (($number == 2) ? 1
: (($number == 8 || $number == 11) ? 2
: 3));
case self::RULE_14:
return ($number == 1) ? 0
: (($number == 0 || ($number % 100 > 0 && $number % 100 < 20)) ? 1
: 2);
case self::RULE_15:
return ($number == 0) ? 0
: (($number == 1) ? 1
: (($number == 2) ? 2
: (($number % 100 >= 3 && $number % 100 <= 10) ? 3
: (($number % 100 >= 11 && $number % 100 <= 99) ? 4
: 5))));
}
return 0;
}
}