annotate vendor/symfony/translation/PluralizationRules.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
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@17 21 private static $rules = [];
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@17 38 if (\strlen($locale) > 3) {
Chris@17 39 $locale = substr($locale, 0, -\strlen(strrchr($locale, '_')));
Chris@0 40 }
Chris@0 41
Chris@0 42 if (isset(self::$rules[$locale])) {
Chris@17 43 $return = \call_user_func(self::$rules[$locale], $number);
Chris@0 44
Chris@17 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
Chris@0 75 case 'af':
Chris@0 76 case 'bn':
Chris@0 77 case 'bg':
Chris@0 78 case 'ca':
Chris@0 79 case 'da':
Chris@0 80 case 'de':
Chris@0 81 case 'el':
Chris@0 82 case 'en':
Chris@0 83 case 'eo':
Chris@0 84 case 'es':
Chris@0 85 case 'et':
Chris@0 86 case 'eu':
Chris@0 87 case 'fa':
Chris@0 88 case 'fi':
Chris@0 89 case 'fo':
Chris@0 90 case 'fur':
Chris@0 91 case 'fy':
Chris@0 92 case 'gl':
Chris@0 93 case 'gu':
Chris@0 94 case 'ha':
Chris@0 95 case 'he':
Chris@0 96 case 'hu':
Chris@0 97 case 'is':
Chris@0 98 case 'it':
Chris@0 99 case 'ku':
Chris@0 100 case 'lb':
Chris@0 101 case 'ml':
Chris@0 102 case 'mn':
Chris@0 103 case 'mr':
Chris@0 104 case 'nah':
Chris@0 105 case 'nb':
Chris@0 106 case 'ne':
Chris@0 107 case 'nl':
Chris@0 108 case 'nn':
Chris@0 109 case 'no':
Chris@16 110 case 'oc':
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@14 126 return (1 == $number) ? 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@14 141 return ((0 == $number) || (1 == $number)) ? 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@17 147 case 'sh':
Chris@0 148 case 'sr':
Chris@0 149 case 'uk':
Chris@14 150 return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
Chris@0 151
Chris@0 152 case 'cs':
Chris@0 153 case 'sk':
Chris@14 154 return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2);
Chris@0 155
Chris@0 156 case 'ga':
Chris@14 157 return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2);
Chris@0 158
Chris@0 159 case 'lt':
Chris@14 160 return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
Chris@0 161
Chris@0 162 case 'sl':
Chris@14 163 return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3));
Chris@0 164
Chris@0 165 case 'mk':
Chris@14 166 return (1 == $number % 10) ? 0 : 1;
Chris@0 167
Chris@0 168 case 'mt':
Chris@14 169 return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3));
Chris@0 170
Chris@0 171 case 'lv':
Chris@14 172 return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2);
Chris@0 173
Chris@0 174 case 'pl':
Chris@14 175 return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2);
Chris@0 176
Chris@0 177 case 'cy':
Chris@14 178 return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3));
Chris@0 179
Chris@0 180 case 'ro':
Chris@14 181 return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2);
Chris@0 182
Chris@0 183 case 'ar':
Chris@14 184 return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5))));
Chris@0 185
Chris@0 186 default:
Chris@0 187 return 0;
Chris@0 188 }
Chris@0 189 }
Chris@0 190
Chris@0 191 /**
Chris@0 192 * Overrides the default plural rule for a given locale.
Chris@0 193 *
Chris@0 194 * @param callable $rule A PHP callable
Chris@0 195 * @param string $locale The locale
Chris@0 196 */
Chris@0 197 public static function set(callable $rule, $locale)
Chris@0 198 {
Chris@0 199 if ('pt_BR' === $locale) {
Chris@0 200 // temporary set a locale for brazilian
Chris@0 201 $locale = 'xbr';
Chris@0 202 }
Chris@0 203
Chris@17 204 if (\strlen($locale) > 3) {
Chris@17 205 $locale = substr($locale, 0, -\strlen(strrchr($locale, '_')));
Chris@0 206 }
Chris@0 207
Chris@0 208 self::$rules[$locale] = $rule;
Chris@0 209 }
Chris@0 210 }