Update jquery.i18n from upstream

Upstream: https://github.com/wikimedia/jquery.i18n
Changes:
 * Support fallback loading when folder is passed as source to load
 * Do not overwrite existing messages for a locale while adding messages
   second time
 * Fix the country code case issue
 * Renamed jquery.i18n.messages.js to jquery.i18n.messagestore
 * ULS: Updated Resources.php for renaming of jquery.i18n.messages file

Change-Id: I60a6e3224cb7b8ea813a8ccd7e389071b3d1244c
This commit is contained in:
Kartik Mistry
2014-01-13 12:04:08 +05:30
parent 5f57b41101
commit 9c40252a72
4 changed files with 258 additions and 457 deletions

View File

@@ -57,7 +57,7 @@
while ( locale ) {
// Iterate through locales starting at most-specific until
// localization is found. As in fi-Latn-FI, fi-Latn and fi.
localeParts = locale.toLowerCase().split( '-' );
localeParts = locale.split( '-' );
localePartIndex = localeParts.length;
do {
@@ -96,18 +96,40 @@
/**
* General message loading API This can take a URL string for
* the json formatted messages.
* the json formatted messages. Example:
* <code>load('path/to/all_localizations.json');</code>
*
* This can also load a localization file for a locale <code>
* To load a localization file for a locale:
* <code>
* load('path/to/de-messages.json', 'de' );
* </code>
*
* To load a localization file from a directory:
* <code>
* load('path/to/i18n/directory', 'de' );
* </code>
* The above method has the advantage of fallback resolution.
* ie, it will automatically load the fallback locales for de.
* For most usecases, this is the recommended method.
* It is optional to have trailing slash at end.
*
* A data object containing message key- message translation mappings
* can also be passed Eg:
* can also be passed. Example:
* <code>
* load( { 'hello' : 'Hello' }, optionalLocale );
* </code> If the data argument is
* null/undefined/false,
* </code>
*
* A source map containing key-value pair of languagename and locations
* can also be passed. Example:
* <code>
* load( {
* 'bn': 'i18n/bn.json',
* 'he': 'i18n/he.json',
* 'en': 'i18n/en.json'
* } )
* </code>
*
* If the data argument is null/undefined/false,
* all cached messages for the i18n instance will get reset.
*
* @param {String|Object} source
@@ -115,7 +137,22 @@
* @returns {jQuery.Promise}
*/
load: function ( source, locale ) {
return this.messageStore.load( source, locale );
var fallbackLocales, locIndex, fallbackLocale, sourceMap = {};
if ( typeof source === 'string' &&
source.split('.').pop() !== 'json'
) {
fallbackLocales = ( $.i18n.fallbacks[locale] || [] )
.concat( this.options.fallbackLocale );
for ( locIndex in fallbackLocales ) {
fallbackLocale = fallbackLocales[locIndex];
sourceMap[fallbackLocale] = source + '/' + fallbackLocale + '.json';
}
return this.load( sourceMap );
} else {
return this.messageStore.load( source, locale );
}
},
/**

View File

@@ -4,513 +4,263 @@
var language = {
// CLDR plural rules generated using
// http://i18ndata.appspot.com/cldr/tags/unconfirmed/supplemental/plurals?action=browse&depth=-1
// and compressed
pluralRules: {
gv: {
one: 'n mod 10 in 1..2 or n mod 20 is 0'
// libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html
'pluralRules': {
'ak': {
'one': 'n = 0..1'
},
'am': {
'one': 'i = 0 or n = 1'
},
'ar': {
'zero': 'n = 0',
'one': 'n = 1',
'two': 'n = 2',
'few': 'n % 100 = 3..10',
'many': 'n % 100 = 11..99'
},
gu: {
one: 'n is 1'
'be': {
'one': 'n % 10 = 1 and n % 100 != 11',
'few': 'n % 10 = 2..4 and n % 100 != 12..14',
'many': 'n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14'
},
'bh': {
'one': 'n = 0..1'
},
rof: {
one: 'n is 1'
'bn': {
'one': 'i = 0 or n = 1'
},
ga: {
few: 'n in 3..6',
many: 'n in 7..10',
two: 'n is 2',
one: 'n is 1'
'br': {
'one': 'n % 10 = 1 and n % 100 != 11,71,91',
'two': 'n % 10 = 2 and n % 100 != 12,72,92',
'few': 'n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99',
'many': 'n != 0 and n % 1000000 = 0'
},
'bs': {
'one': 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
'few': 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
},
'cs': {
'one': 'i = 1 and v = 0',
'few': 'i = 2..4 and v = 0',
'many': 'v != 0'
},
gl: {
one: 'n is 1'
'cy': {
'zero': 'n = 0',
'one': 'n = 1',
'two': 'n = 2',
'few': 'n = 3',
'many': 'n = 6'
},
lg: {
one: 'n is 1'
'da': {
'one': 'n = 1 or t != 0 and i = 0,1'
},
lb: {
one: 'n is 1'
'fa': {
'one': 'i = 0 or n = 1'
},
xog: {
one: 'n is 1'
'ff': {
'one': 'i = 0,1'
},
ln: {
one: 'n in 0..1'
'fil': {
'one': 'i = 0..1 and v = 0'
},
lo: '',
brx: {
one: 'n is 1'
'fr': {
'one': 'i = 0,1'
},
tr: '',
ts: {
one: 'n is 1'
'ga': {
'one': 'n = 1',
'two': 'n = 2',
'few': 'n = 3..6',
'many': 'n = 7..10'
},
tn: {
one: 'n is 1'
'gd': {
'one': 'n = 1,11',
'two': 'n = 2,12',
'few': 'n = 3..10,13..19'
},
to: '',
lt: {
few: 'n mod 10 in 2..9 and n mod 100 not in 11..19',
one: 'n mod 10 is 1 and n mod 100 not in 11..19'
'gu': {
'one': 'i = 0 or n = 1'
},
tk: {
one: 'n is 1'
'guw': {
'one': 'n = 0..1'
},
th: '',
ksb: {
one: 'n is 1'
'gv': {
'one': 'n % 10 = 1',
'two': 'n % 10 = 2',
'few': 'n % 100 = 0,20,40,60'
},
te: {
one: 'n is 1'
'he': {
'one': 'i = 1 and v = 0',
'two': 'i = 2 and v = 0',
'many': 'v = 0 and n != 0..10 and n % 10 = 0'
},
ksh: {
zero: 'n is 0',
one: 'n is 1'
'hi': {
'one': 'i = 0 or n = 1'
},
fil: {
one: 'n in 0..1'
'hr': {
'one': 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
'few': 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
},
haw: {
one: 'n is 1'
'hy': {
'one': 'i = 0,1'
},
kcg: {
one: 'n is 1'
'is': {
'one': 't = 0 and i % 10 = 1 and i % 100 != 11 or t != 0'
},
ssy: {
one: 'n is 1'
'iu': {
'one': 'n = 1',
'two': 'n = 2'
},
yo: '',
de: {
one: 'n is 1'
'iw': {
'one': 'i = 1 and v = 0',
'two': 'i = 2 and v = 0',
'many': 'v = 0 and n != 0..10 and n % 10 = 0'
},
ko: '',
da: {
one: 'n is 1'
'kab': {
'one': 'i = 0,1'
},
dz: '',
dv: {
one: 'n is 1'
'kn': {
'one': 'i = 0 or n = 1'
},
guw: {
one: 'n in 0..1'
'kw': {
'one': 'n = 1',
'two': 'n = 2'
},
shi: {
few: 'n in 2..10',
one: 'n within 0..1'
'lag': {
'zero': 'n = 0',
'one': 'i = 0,1 and n != 0'
},
el: {
one: 'n is 1'
'ln': {
'one': 'n = 0..1'
},
eo: {
one: 'n is 1'
'lt': {
'one': 'n % 10 = 1 and n % 100 != 11..19',
'few': 'n % 10 = 2..9 and n % 100 != 11..19',
'many': 'f != 0'
},
en: {
one: 'n is 1'
'lv': {
'zero': 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19',
'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'
},
ses: '',
teo: {
one: 'n is 1'
'mg': {
'one': 'n = 0..1'
},
ee: {
one: 'n is 1'
'mk': {
'one': 'v = 0 and i % 10 = 1 or f % 10 = 1'
},
kde: '',
fr: {
one: 'n within 0..2 and n is not 2'
'mo': {
'one': 'i = 1 and v = 0',
'few': 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
},
eu: {
one: 'n is 1'
'mr': {
'one': 'i = 0 or n = 1'
},
et: {
one: 'n is 1'
'mt': {
'one': 'n = 1',
'few': 'n = 0 or n % 100 = 2..10',
'many': 'n % 100 = 11..19'
},
es: {
one: 'n is 1'
'naq': {
'one': 'n = 1',
'two': 'n = 2'
},
seh: {
one: 'n is 1'
'nso': {
'one': 'n = 0..1'
},
ru: {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14',
many: 'n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14',
one: 'n mod 10 is 1 and n mod 100 is not 11'
'pa': {
'one': 'n = 0..1'
},
kl: {
one: 'n is 1'
'pl': {
'one': 'i = 1 and v = 0',
'few': 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
'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'
},
sms: {
two: 'n is 2',
one: 'n is 1'
'pt': {
'one': 'i = 1 and v = 0 or i = 0 and t = 1'
},
smn: {
two: 'n is 2',
one: 'n is 1'
'pt_PT': {
'one': 'n = 1 and v = 0'
},
smj: {
two: 'n is 2',
one: 'n is 1'
'ro': {
'one': 'i = 1 and v = 0',
'few': 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
},
smi: {
two: 'n is 2',
one: 'n is 1'
'ru': {
'one': 'v = 0 and i % 10 = 1 and i % 100 != 11',
'many': 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
},
fy: {
one: 'n is 1'
'se': {
'one': 'n = 1',
'two': 'n = 2'
},
rm: {
one: 'n is 1'
'sh': {
'one': 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
'few': 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
},
ro: {
few: 'n is 0 OR n is not 1 AND n mod 100 in 1..19',
one: 'n is 1'
'shi': {
'one': 'i = 0 or n = 1',
'few': 'n = 2..10'
},
bn: {
one: 'n is 1'
'si': {
'one': 'n = 0,1 or i = 0 and f = 1'
},
sma: {
two: 'n is 2',
one: 'n is 1'
'sk': {
'one': 'i = 1 and v = 0',
'few': 'i = 2..4 and v = 0',
'many': 'v != 0'
},
be: {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14',
many: 'n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14',
one: 'n mod 10 is 1 and n mod 100 is not 11'
'sl': {
'one': 'v = 0 and i % 100 = 1',
'two': 'v = 0 and i % 100 = 2',
'few': 'v = 0 and i % 100 = 3..4 or v != 0'
},
bg: {
one: 'n is 1'
'sma': {
'one': 'n = 1',
'two': 'n = 2'
},
ms: '',
wa: {
one: 'n in 0..1'
'smi': {
'one': 'n = 1',
'two': 'n = 2'
},
ps: {
one: 'n is 1'
'smj': {
'one': 'n = 1',
'two': 'n = 2'
},
wo: '',
bm: '',
jv: '',
bo: '',
bh: {
one: 'n in 0..1'
'smn': {
'one': 'n = 1',
'two': 'n = 2'
},
kea: '',
asa: {
one: 'n is 1'
'sms': {
'one': 'n = 1',
'two': 'n = 2'
},
cgg: {
one: 'n is 1'
'sr': {
'one': 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
'few': 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
},
br: {
few: 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99',
many: 'n mod 1000000 is 0 and n is not 0',
two: 'n mod 10 is 2 and n mod 100 not in 12,72,92',
one: 'n mod 10 is 1 and n mod 100 not in 11,71,91'
'ti': {
'one': 'n = 0..1'
},
bs: {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14',
many: 'n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14',
one: 'n mod 10 is 1 and n mod 100 is not 11'
'tl': {
'one': 'i = 0..1 and v = 0'
},
ja: '',
om: {
one: 'n is 1'
'tzm': {
'one': 'n = 0..1 or n = 11..99'
},
fa: '',
vun: {
one: 'n is 1'
'uk': {
'one': 'v = 0 and i % 10 = 1 and i % 100 != 11',
'few': 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
'many': 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
},
or: {
one: 'n is 1'
'wa': {
'one': 'n = 0..1'
},
xh: {
one: 'n is 1'
},
nso: {
one: 'n in 0..1'
},
ca: {
one: 'n is 1'
},
cy: {
few: 'n is 3',
zero: 'n is 0',
many: 'n is 6',
two: 'n is 2',
one: 'n is 1'
},
cs: {
few: 'n in 2..4',
one: 'n is 1'
},
zh: '',
lv: {
zero: 'n is 0',
one: 'n mod 10 is 1 and n mod 100 is not 11'
},
pt: {
one: 'n is 1'
},
wae: {
one: 'n is 1'
},
tl: {
one: 'n in 0..1'
},
chr: {
one: 'n is 1'
},
pa: {
one: 'n is 1'
},
ak: {
one: 'n in 0..1'
},
pl: {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14',
many: 'n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14',
one: 'n is 1'
},
hr: {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14',
many: 'n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14',
one: 'n mod 10 is 1 and n mod 100 is not 11'
},
am: {
one: 'n in 0..1'
},
ti: {
one: 'n in 0..1'
},
hu: '',
hi: {
one: 'n in 0..1'
},
jmc: {
one: 'n is 1'
},
ha: {
one: 'n is 1'
},
he: {
one: 'n is 1'
},
mg: {
one: 'n in 0..1'
},
fur: {
one: 'n is 1'
},
bem: {
one: 'n is 1'
},
ml: {
one: 'n is 1'
},
mo: {
few: 'n is 0 OR n is not 1 AND n mod 100 in 1..19',
one: 'n is 1'
},
mn: {
one: 'n is 1'
},
mk: {
one: 'n mod 10 is 1 and n is not 11'
},
ur: {
one: 'n is 1'
},
bez: {
one: 'n is 1'
},
mt: {
few: 'n is 0 or n mod 100 in 2..10',
many: 'n mod 100 in 11..19',
one: 'n is 1'
},
uk: {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14',
many: 'n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14',
one: 'n mod 10 is 1 and n mod 100 is not 11'
},
mr: {
one: 'n is 1'
},
ta: {
one: 'n is 1'
},
my: '',
sah: '',
ve: {
one: 'n is 1'
},
af: {
one: 'n is 1'
},
vi: '',
is: {
one: 'n is 1'
},
iu: {
two: 'n is 2',
one: 'n is 1'
},
it: {
one: 'n is 1'
},
kn: '',
ii: '',
ar: {
few: 'n mod 100 in 3..10',
zero: 'n is 0',
many: 'n mod 100 in 11..99',
two: 'n is 2',
one: 'n is 1'
},
zu: {
one: 'n is 1'
},
saq: {
one: 'n is 1'
},
az: '',
tzm: {
one: 'n in 0..1 or n in 11..99'
},
id: '',
ig: '',
pap: {
one: 'n is 1'
},
nl: {
one: 'n is 1'
},
nn: {
one: 'n is 1'
},
no: {
one: 'n is 1'
},
nah: {
one: 'n is 1'
},
nd: {
one: 'n is 1'
},
ne: {
one: 'n is 1'
},
ny: {
one: 'n is 1'
},
naq: {
two: 'n is 2',
one: 'n is 1'
},
nyn: {
one: 'n is 1'
},
kw: {
two: 'n is 2',
one: 'n is 1'
},
nr: {
one: 'n is 1'
},
tig: {
one: 'n is 1'
},
kab: {
one: 'n within 0..2 and n is not 2'
},
mas: {
one: 'n is 1'
},
rwk: {
one: 'n is 1'
},
kaj: {
one: 'n is 1'
},
lag: {
zero: 'n is 0',
one: 'n within 0..2 and n is not 0 and n is not 2'
},
syr: {
one: 'n is 1'
},
kk: {
one: 'n is 1'
},
ff: {
one: 'n within 0..2 and n is not 2'
},
fi: {
one: 'n is 1'
},
fo: {
one: 'n is 1'
},
ka: '',
gsw: {
one: 'n is 1'
},
ckb: {
one: 'n is 1'
},
ss: {
one: 'n is 1'
},
sr: {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14',
many: 'n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14',
one: 'n mod 10 is 1 and n mod 100 is not 11'
},
sq: {
one: 'n is 1'
},
sw: {
one: 'n is 1'
},
sv: {
one: 'n is 1'
},
km: '',
st: {
one: 'n is 1'
},
sk: {
few: 'n in 2..4',
one: 'n is 1'
},
sh: {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14',
many: 'n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14',
one: 'n mod 10 is 1 and n mod 100 is not 11'
},
so: {
one: 'n is 1'
},
sn: {
one: 'n is 1'
},
ku: {
one: 'n is 1'
},
sl: {
few: 'n mod 100 in 3..4',
two: 'n mod 100 is 2',
one: 'n mod 100 is 1'
},
sg: '',
nb: {
one: 'n is 1'
},
se: {
two: 'n is 2',
one: 'n is 1'
'zu': {
'one': 'i = 0 or n = 1'
}
},
/**
* Plural form transformations, needed for some languages.
*

View File

@@ -83,12 +83,17 @@
},
/**
* Set messages
* Set messages to the given locale.
* If locale exists, add messages to the locale.
* @param locale
* @param messages
*/
set: function( locale, messages ) {
this.messages[locale] = messages;
if ( !this.messages[locale] ) {
this.messages[locale] = messages;
} else {
this.messages[locale] = $.extend( this.messages[locale], messages );
}
},
/**
@@ -102,10 +107,19 @@
}
};
function jsonMessageLoader( url ) {
return $.getJSON( url ).fail( function ( jqxhr, settings, exception ) {
$.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
var deferred = $.Deferred();
$.getJSON( url )
.done( deferred.resolve )
.fail( function ( jqxhr, settings, exception ) {
$.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
// Ignore 404 exception, because we are handling fallabacks explicitly
deferred.resolve();
} );
return deferred.promise();
}
$.extend( $.i18n.messageStore, new MessageStore() );