comparison vendor/symfony/translation/PluralizationRules.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Symfony\Component\Translation;
13
14 /**
15 * Returns the plural rules for a given locale.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 */
19 class PluralizationRules
20 {
21 private static $rules = array();
22
23 /**
24 * Returns the plural position to use for the given locale and number.
25 *
26 * @param int $number The number
27 * @param string $locale The locale
28 *
29 * @return int The plural position
30 */
31 public static function get($number, $locale)
32 {
33 if ('pt_BR' === $locale) {
34 // temporary set a locale for brazilian
35 $locale = 'xbr';
36 }
37
38 if (strlen($locale) > 3) {
39 $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
40 }
41
42 if (isset(self::$rules[$locale])) {
43 $return = call_user_func(self::$rules[$locale], $number);
44
45 if (!is_int($return) || $return < 0) {
46 return 0;
47 }
48
49 return $return;
50 }
51
52 /*
53 * The plural rules are derived from code of the Zend Framework (2010-09-25),
54 * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
55 * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
56 */
57 switch ($locale) {
58 case 'az':
59 case 'bo':
60 case 'dz':
61 case 'id':
62 case 'ja':
63 case 'jv':
64 case 'ka':
65 case 'km':
66 case 'kn':
67 case 'ko':
68 case 'ms':
69 case 'th':
70 case 'tr':
71 case 'vi':
72 case 'zh':
73 return 0;
74 break;
75
76 case 'af':
77 case 'bn':
78 case 'bg':
79 case 'ca':
80 case 'da':
81 case 'de':
82 case 'el':
83 case 'en':
84 case 'eo':
85 case 'es':
86 case 'et':
87 case 'eu':
88 case 'fa':
89 case 'fi':
90 case 'fo':
91 case 'fur':
92 case 'fy':
93 case 'gl':
94 case 'gu':
95 case 'ha':
96 case 'he':
97 case 'hu':
98 case 'is':
99 case 'it':
100 case 'ku':
101 case 'lb':
102 case 'ml':
103 case 'mn':
104 case 'mr':
105 case 'nah':
106 case 'nb':
107 case 'ne':
108 case 'nl':
109 case 'nn':
110 case 'no':
111 case 'om':
112 case 'or':
113 case 'pa':
114 case 'pap':
115 case 'ps':
116 case 'pt':
117 case 'so':
118 case 'sq':
119 case 'sv':
120 case 'sw':
121 case 'ta':
122 case 'te':
123 case 'tk':
124 case 'ur':
125 case 'zu':
126 return ($number == 1) ? 0 : 1;
127
128 case 'am':
129 case 'bh':
130 case 'fil':
131 case 'fr':
132 case 'gun':
133 case 'hi':
134 case 'hy':
135 case 'ln':
136 case 'mg':
137 case 'nso':
138 case 'xbr':
139 case 'ti':
140 case 'wa':
141 return (($number == 0) || ($number == 1)) ? 0 : 1;
142
143 case 'be':
144 case 'bs':
145 case 'hr':
146 case 'ru':
147 case 'sr':
148 case 'uk':
149 return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
150
151 case 'cs':
152 case 'sk':
153 return ($number == 1) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2);
154
155 case 'ga':
156 return ($number == 1) ? 0 : (($number == 2) ? 1 : 2);
157
158 case 'lt':
159 return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
160
161 case 'sl':
162 return ($number % 100 == 1) ? 0 : (($number % 100 == 2) ? 1 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 2 : 3));
163
164 case 'mk':
165 return ($number % 10 == 1) ? 0 : 1;
166
167 case 'mt':
168 return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3));
169
170 case 'lv':
171 return ($number == 0) ? 0 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2);
172
173 case 'pl':
174 return ($number == 1) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2);
175
176 case 'cy':
177 return ($number == 1) ? 0 : (($number == 2) ? 1 : ((($number == 8) || ($number == 11)) ? 2 : 3));
178
179 case 'ro':
180 return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2);
181
182 case 'ar':
183 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))));
184
185 default:
186 return 0;
187 }
188 }
189
190 /**
191 * Overrides the default plural rule for a given locale.
192 *
193 * @param callable $rule A PHP callable
194 * @param string $locale The locale
195 */
196 public static function set(callable $rule, $locale)
197 {
198 if ('pt_BR' === $locale) {
199 // temporary set a locale for brazilian
200 $locale = 'xbr';
201 }
202
203 if (strlen($locale) > 3) {
204 $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
205 }
206
207 self::$rules[$locale] = $rule;
208 }
209 }