annotate vendor/symfony/translation/PluralizationRules.php @ 8:50b0d041100e

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