Projekt

Obecné

Profil

Stáhnout (5.94 KB) Statistiky
| Větev: | Revize:
1 cb15593b Cajova-Houba
<?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
}