1/* global pluralRuleParser */ 2( function ( $ ) { 3 'use strict'; 4 5 // jscs:disable 6 var language = { 7 // CLDR plural rules generated using 8 // libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html 9 pluralRules: { 10 ak: { 11 one: 'n = 0..1' 12 }, 13 am: { 14 one: 'i = 0 or n = 1' 15 }, 16 ar: { 17 zero: 'n = 0', 18 one: 'n = 1', 19 two: 'n = 2', 20 few: 'n % 100 = 3..10', 21 many: 'n % 100 = 11..99' 22 }, 23 ars: { 24 zero: 'n = 0', 25 one: 'n = 1', 26 two: 'n = 2', 27 few: 'n % 100 = 3..10', 28 many: 'n % 100 = 11..99' 29 }, 30 as: { 31 one: 'i = 0 or n = 1' 32 }, 33 be: { 34 one: 'n % 10 = 1 and n % 100 != 11', 35 few: 'n % 10 = 2..4 and n % 100 != 12..14', 36 many: 'n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14' 37 }, 38 bh: { 39 one: 'n = 0..1' 40 }, 41 bn: { 42 one: 'i = 0 or n = 1' 43 }, 44 br: { 45 one: 'n % 10 = 1 and n % 100 != 11,71,91', 46 two: 'n % 10 = 2 and n % 100 != 12,72,92', 47 few: 'n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99', 48 many: 'n != 0 and n % 1000000 = 0' 49 }, 50 bs: { 51 one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11', 52 few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14' 53 }, 54 cs: { 55 one: 'i = 1 and v = 0', 56 few: 'i = 2..4 and v = 0', 57 many: 'v != 0' 58 }, 59 cy: { 60 zero: 'n = 0', 61 one: 'n = 1', 62 two: 'n = 2', 63 few: 'n = 3', 64 many: 'n = 6' 65 }, 66 da: { 67 one: 'n = 1 or t != 0 and i = 0,1' 68 }, 69 dsb: { 70 one: 'v = 0 and i % 100 = 1 or f % 100 = 1', 71 two: 'v = 0 and i % 100 = 2 or f % 100 = 2', 72 few: 'v = 0 and i % 100 = 3..4 or f % 100 = 3..4' 73 }, 74 fa: { 75 one: 'i = 0 or n = 1' 76 }, 77 ff: { 78 one: 'i = 0,1' 79 }, 80 fil: { 81 one: 'v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9' 82 }, 83 fr: { 84 one: 'i = 0,1' 85 }, 86 ga: { 87 one: 'n = 1', 88 two: 'n = 2', 89 few: 'n = 3..6', 90 many: 'n = 7..10' 91 }, 92 gd: { 93 one: 'n = 1,11', 94 two: 'n = 2,12', 95 few: 'n = 3..10,13..19' 96 }, 97 gu: { 98 one: 'i = 0 or n = 1' 99 }, 100 guw: { 101 one: 'n = 0..1' 102 }, 103 gv: { 104 one: 'v = 0 and i % 10 = 1', 105 two: 'v = 0 and i % 10 = 2', 106 few: 'v = 0 and i % 100 = 0,20,40,60,80', 107 many: 'v != 0' 108 }, 109 he: { 110 one: 'i = 1 and v = 0', 111 two: 'i = 2 and v = 0', 112 many: 'v = 0 and n != 0..10 and n % 10 = 0' 113 }, 114 hi: { 115 one: 'i = 0 or n = 1' 116 }, 117 hr: { 118 one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11', 119 few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14' 120 }, 121 hsb: { 122 one: 'v = 0 and i % 100 = 1 or f % 100 = 1', 123 two: 'v = 0 and i % 100 = 2 or f % 100 = 2', 124 few: 'v = 0 and i % 100 = 3..4 or f % 100 = 3..4' 125 }, 126 hy: { 127 one: 'i = 0,1' 128 }, 129 is: { 130 one: 't = 0 and i % 10 = 1 and i % 100 != 11 or t != 0' 131 }, 132 iu: { 133 one: 'n = 1', 134 two: 'n = 2' 135 }, 136 iw: { 137 one: 'i = 1 and v = 0', 138 two: 'i = 2 and v = 0', 139 many: 'v = 0 and n != 0..10 and n % 10 = 0' 140 }, 141 kab: { 142 one: 'i = 0,1' 143 }, 144 kn: { 145 one: 'i = 0 or n = 1' 146 }, 147 kw: { 148 one: 'n = 1', 149 two: 'n = 2' 150 }, 151 lag: { 152 zero: 'n = 0', 153 one: 'i = 0,1 and n != 0' 154 }, 155 ln: { 156 one: 'n = 0..1' 157 }, 158 lt: { 159 one: 'n % 10 = 1 and n % 100 != 11..19', 160 few: 'n % 10 = 2..9 and n % 100 != 11..19', 161 many: 'f != 0' 162 }, 163 lv: { 164 zero: 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19', 165 one: 'n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1' 166 }, 167 mg: { 168 one: 'n = 0..1' 169 }, 170 mk: { 171 one: 'v = 0 and i % 10 = 1 or f % 10 = 1' 172 }, 173 mo: { 174 one: 'i = 1 and v = 0', 175 few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19' 176 }, 177 mr: { 178 one: 'i = 0 or n = 1' 179 }, 180 mt: { 181 one: 'n = 1', 182 few: 'n = 0 or n % 100 = 2..10', 183 many: 'n % 100 = 11..19' 184 }, 185 naq: { 186 one: 'n = 1', 187 two: 'n = 2' 188 }, 189 nso: { 190 one: 'n = 0..1' 191 }, 192 pa: { 193 one: 'n = 0..1' 194 }, 195 pl: { 196 one: 'i = 1 and v = 0', 197 few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14', 198 many: 'v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14' 199 }, 200 prg: { 201 zero: 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19', 202 one: 'n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1' 203 }, 204 pt: { 205 one: 'i = 0..1' 206 }, 207 ro: { 208 one: 'i = 1 and v = 0', 209 few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19' 210 }, 211 ru: { 212 one: 'v = 0 and i % 10 = 1 and i % 100 != 11', 213 few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14', 214 many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14' 215 }, 216 se: { 217 one: 'n = 1', 218 two: 'n = 2' 219 }, 220 sh: { 221 one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11', 222 few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14' 223 }, 224 shi: { 225 one: 'i = 0 or n = 1', 226 few: 'n = 2..10' 227 }, 228 si: { 229 one: 'n = 0,1 or i = 0 and f = 1' 230 }, 231 sk: { 232 one: 'i = 1 and v = 0', 233 few: 'i = 2..4 and v = 0', 234 many: 'v != 0' 235 }, 236 sl: { 237 one: 'v = 0 and i % 100 = 1', 238 two: 'v = 0 and i % 100 = 2', 239 few: 'v = 0 and i % 100 = 3..4 or v != 0' 240 }, 241 sma: { 242 one: 'n = 1', 243 two: 'n = 2' 244 }, 245 smi: { 246 one: 'n = 1', 247 two: 'n = 2' 248 }, 249 smj: { 250 one: 'n = 1', 251 two: 'n = 2' 252 }, 253 smn: { 254 one: 'n = 1', 255 two: 'n = 2' 256 }, 257 sms: { 258 one: 'n = 1', 259 two: 'n = 2' 260 }, 261 sr: { 262 one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11', 263 few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14' 264 }, 265 ti: { 266 one: 'n = 0..1' 267 }, 268 tl: { 269 one: 'v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9' 270 }, 271 tzm: { 272 one: 'n = 0..1 or n = 11..99' 273 }, 274 uk: { 275 one: 'v = 0 and i % 10 = 1 and i % 100 != 11', 276 few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14', 277 many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14' 278 }, 279 wa: { 280 one: 'n = 0..1' 281 }, 282 zu: { 283 one: 'i = 0 or n = 1' 284 } 285 }, 286 // jscs:enable 287 288 /** 289 * Plural form transformations, needed for some languages. 290 * 291 * @param {integer} count 292 * Non-localized quantifier 293 * @param {Array} forms 294 * List of plural forms 295 * @return {string} Correct form for quantifier in this language 296 */ 297 convertPlural: function ( count, forms ) { 298 var pluralRules, 299 pluralFormIndex, 300 index, 301 explicitPluralPattern = /\d+=/i, 302 formCount, 303 form; 304 305 if ( !forms || forms.length === 0 ) { 306 return ''; 307 } 308 309 // Handle for Explicit 0= & 1= values 310 for ( index = 0; index < forms.length; index++ ) { 311 form = forms[ index ]; 312 if ( explicitPluralPattern.test( form ) ) { 313 formCount = parseInt( form.slice( 0, form.indexOf( '=' ) ), 10 ); 314 if ( formCount === count ) { 315 return ( form.slice( form.indexOf( '=' ) + 1 ) ); 316 } 317 forms[ index ] = undefined; 318 } 319 } 320 321 forms = $.map( forms, function ( form ) { 322 if ( form !== undefined ) { 323 return form; 324 } 325 } ); 326 327 pluralRules = this.pluralRules[ $.i18n().locale ]; 328 329 if ( !pluralRules ) { 330 // default fallback. 331 return ( count === 1 ) ? forms[ 0 ] : forms[ 1 ]; 332 } 333 334 pluralFormIndex = this.getPluralForm( count, pluralRules ); 335 pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 ); 336 337 return forms[ pluralFormIndex ]; 338 }, 339 340 /** 341 * For the number, get the plural for index 342 * 343 * @param {integer} number 344 * @param {Object} pluralRules 345 * @return {integer} plural form index 346 */ 347 getPluralForm: function ( number, pluralRules ) { 348 var i, 349 pluralForms = [ 'zero', 'one', 'two', 'few', 'many', 'other' ], 350 pluralFormIndex = 0; 351 352 for ( i = 0; i < pluralForms.length; i++ ) { 353 if ( pluralRules[ pluralForms[ i ] ] ) { 354 if ( pluralRuleParser( pluralRules[ pluralForms[ i ] ], number ) ) { 355 return pluralFormIndex; 356 } 357 358 pluralFormIndex++; 359 } 360 } 361 362 return pluralFormIndex; 363 }, 364 365 /** 366 * Converts a number using digitTransformTable. 367 * 368 * @param {number} num Value to be converted 369 * @param {boolean} integer Convert the return value to an integer 370 * @return {string} The number converted into a String. 371 */ 372 convertNumber: function ( num, integer ) { 373 var tmp, item, i, 374 transformTable, numberString, convertedNumber; 375 376 // Set the target Transform table: 377 transformTable = this.digitTransformTable( $.i18n().locale ); 378 numberString = String( num );
379 convertedNumber = ''; 380 381 if ( !transformTable ) { 382 return num; 383 } 384 385 // Check if the restore to Latin number flag is set: 386 if ( integer ) { 387 if ( parseFloat( num, 10 ) === num ) { 388 return num; 389 } 390 391 tmp = []; 392 393 for ( item in transformTable ) { 394 tmp[ transformTable[ item ] ] = item; 395 } 396 397 transformTable = tmp; 398 } 399 400 for ( i = 0; i < numberString.length; i++ ) { 401 if ( transformTable[ numberString[ i ] ] ) { 402 convertedNumber += transformTable[ numberString[ i ] ]; 403 } else { 404 convertedNumber += numberString[ i ]; 405 } 406 } 407 408 return integer ? parseFloat( convertedNumber, 10 ) : convertedNumber; 409 }, 410 411 /** 412 * Grammatical transformations, needed for inflected languages. 413 * Invoked by putting {{grammar:form|word}} in a message. 414 * Override this method for languages that need special grammar rules 415 * applied dynamically. 416 * 417 * @param {string} word 418 * @param {string} form 419 * @return {string} 420 */ 421 // eslint-disable-next-line no-unused-vars 422 convertGrammar: function ( word, form ) { 423 return word; 424 }, 425 426 /** 427 * Provides an alternative text depending on specified gender. Usage 428 * {{gender:[gender|user object]|masculine|feminine|neutral}}. If second 429 * or third parameter are not specified, masculine is used. 430 * 431 * These details may be overriden per language. 432 * 433 * @param {string} gender 434 * male, female, or anything else for neutral. 435 * @param {Array} forms 436 * List of gender forms 437 * 438 * @return {string} 439 */ 440 gender: function ( gender, forms ) { 441 if ( !forms || forms.length === 0 ) { 442 return ''; 443 } 444 445 while ( forms.length < 2 ) { 446 forms.push( forms[ forms.length - 1 ] ); 447 } 448 449 if ( gender === 'male' ) { 450 return forms[ 0 ]; 451 } 452 453 if ( gender === 'female' ) { 454 return forms[ 1 ]; 455 } 456 457 return ( forms.length === 3 ) ? forms[ 2 ] : forms[ 0 ]; 458 }, 459 460 /** 461 * Get the digit transform table for the given language 462 * See http://cldr.unicode.org/translation/numbering-systems 463 * 464 * @param {string} language 465 * @return {Array|boolean} List of digits in the passed language or false 466 * representation, or boolean false if there is no information. 467 */ 468 digitTransformTable: function ( language ) { 469 var tables = { 470 ar: '٠١٢٣٤٥٦٧٨٩', 471 fa: 'Û°Û±Û²Û³Û´ÛµÛ¶Û·Û¸Û¹', 472 ml: '൦൧൨൩൪൫൬àµàµ®àµ¯', 473 kn: '೦೧೨೩೪೫೬à³à³®à³¯', 474 lo: 'à»à»à»à»à»à»à»à»à»à»', 475 or: 'à¦à§à¨à©àªà«à¬àà®à¯', 476 kh: 'á á¡á¢á£á¤á¥á¦á§á¨á©', 477 nqo: 'ßßßßßß ßßßß', // Note that the digits go right to left 478 pa: '੦੧੨੩੪੫੬à©à©®à©¯', 479 gu: '૦૧૨૩૪૫૬à«à«®à«¯', 480 hi: '०१२३४५६à¥à¥®à¥¯', 481 my: 'áááááá áááá', 482 ta: '௦௧௨௩௪௫௬à¯à¯®à¯¯', 483 te: '౦౧౨౩౪౫౬à±à±®à±¯', 484 th: 'à¹à¹à¹à¹à¹à¹à¹à¹à¹à¹', // FIXME use iso 639 codes 485 bo: '༠༡༢༣༤༥༦༧༨༩' // FIXME use iso 639 codes 486 }; 487 488 if ( !tables[ language ] ) { 489 return false; 490 } 491 492 return tables[ language ].split( '' ); 493 } 494 }; 495 496 $.extend( $.i18n.languages, { 497 default: language 498 } ); 499}( jQuery ) );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.