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

@@ -169,7 +169,7 @@ $wgResourceModules['ext.uls.webfonts.mobile'] = array(
$wgResourceModules['jquery.i18n'] = array( $wgResourceModules['jquery.i18n'] = array(
'scripts' => array( 'scripts' => array(
'lib/jquery.i18n/jquery.i18n.js', 'lib/jquery.i18n/jquery.i18n.js',
'lib/jquery.i18n/jquery.i18n.messages.js', 'lib/jquery.i18n/jquery.i18n.messagestore.js',
'lib/jquery.i18n/jquery.i18n.parser.js', 'lib/jquery.i18n/jquery.i18n.parser.js',
'lib/jquery.i18n/jquery.i18n.emitter.js', 'lib/jquery.i18n/jquery.i18n.emitter.js',
'lib/jquery.i18n/jquery.i18n.language.js', 'lib/jquery.i18n/jquery.i18n.language.js',

View File

@@ -57,7 +57,7 @@
while ( locale ) { while ( locale ) {
// Iterate through locales starting at most-specific until // Iterate through locales starting at most-specific until
// localization is found. As in fi-Latn-FI, fi-Latn and fi. // localization is found. As in fi-Latn-FI, fi-Latn and fi.
localeParts = locale.toLowerCase().split( '-' ); localeParts = locale.split( '-' );
localePartIndex = localeParts.length; localePartIndex = localeParts.length;
do { do {
@@ -96,18 +96,40 @@
/** /**
* General message loading API This can take a URL string for * 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> * <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' ); * load('path/to/de-messages.json', 'de' );
* </code> * </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 * A data object containing message key- message translation mappings
* can also be passed Eg: * can also be passed. Example:
* <code> * <code>
* load( { 'hello' : 'Hello' }, optionalLocale ); * load( { 'hello' : 'Hello' }, optionalLocale );
* </code> If the data argument is * </code>
* null/undefined/false, *
* 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. * all cached messages for the i18n instance will get reset.
* *
* @param {String|Object} source * @param {String|Object} source
@@ -115,7 +137,22 @@
* @returns {jQuery.Promise} * @returns {jQuery.Promise}
*/ */
load: function ( source, locale ) { 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 = { var language = {
// CLDR plural rules generated using // CLDR plural rules generated using
// http://i18ndata.appspot.com/cldr/tags/unconfirmed/supplemental/plurals?action=browse&depth=-1 // libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html
// and compressed 'pluralRules': {
pluralRules: { 'ak': {
gv: { 'one': 'n = 0..1'
one: 'n mod 10 in 1..2 or n mod 20 is 0' },
'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: { 'be': {
one: 'n is 1' '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: { 'bn': {
one: 'n is 1' 'one': 'i = 0 or n = 1'
}, },
ga: { 'br': {
few: 'n in 3..6', 'one': 'n % 10 = 1 and n % 100 != 11,71,91',
many: 'n in 7..10', 'two': 'n % 10 = 2 and n % 100 != 12,72,92',
two: 'n is 2', 'few': 'n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99',
one: 'n is 1' '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: { 'cy': {
one: 'n is 1' 'zero': 'n = 0',
'one': 'n = 1',
'two': 'n = 2',
'few': 'n = 3',
'many': 'n = 6'
}, },
lg: { 'da': {
one: 'n is 1' 'one': 'n = 1 or t != 0 and i = 0,1'
}, },
lb: { 'fa': {
one: 'n is 1' 'one': 'i = 0 or n = 1'
}, },
xog: { 'ff': {
one: 'n is 1' 'one': 'i = 0,1'
}, },
ln: { 'fil': {
one: 'n in 0..1' 'one': 'i = 0..1 and v = 0'
}, },
lo: '', 'fr': {
brx: { 'one': 'i = 0,1'
one: 'n is 1'
}, },
tr: '', 'ga': {
ts: { 'one': 'n = 1',
one: 'n is 1' 'two': 'n = 2',
'few': 'n = 3..6',
'many': 'n = 7..10'
}, },
tn: { 'gd': {
one: 'n is 1' 'one': 'n = 1,11',
'two': 'n = 2,12',
'few': 'n = 3..10,13..19'
}, },
to: '', 'gu': {
lt: { 'one': 'i = 0 or n = 1'
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'
}, },
tk: { 'guw': {
one: 'n is 1' 'one': 'n = 0..1'
}, },
th: '', 'gv': {
ksb: { 'one': 'n % 10 = 1',
one: 'n is 1' 'two': 'n % 10 = 2',
'few': 'n % 100 = 0,20,40,60'
}, },
te: { 'he': {
one: 'n is 1' 'one': 'i = 1 and v = 0',
'two': 'i = 2 and v = 0',
'many': 'v = 0 and n != 0..10 and n % 10 = 0'
}, },
ksh: { 'hi': {
zero: 'n is 0', 'one': 'i = 0 or n = 1'
one: 'n is 1'
}, },
fil: { 'hr': {
one: 'n in 0..1' '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: { 'hy': {
one: 'n is 1' 'one': 'i = 0,1'
}, },
kcg: { 'is': {
one: 'n is 1' 'one': 't = 0 and i % 10 = 1 and i % 100 != 11 or t != 0'
}, },
ssy: { 'iu': {
one: 'n is 1' 'one': 'n = 1',
'two': 'n = 2'
}, },
yo: '', 'iw': {
de: { 'one': 'i = 1 and v = 0',
one: 'n is 1' 'two': 'i = 2 and v = 0',
'many': 'v = 0 and n != 0..10 and n % 10 = 0'
}, },
ko: '', 'kab': {
da: { 'one': 'i = 0,1'
one: 'n is 1'
}, },
dz: '', 'kn': {
dv: { 'one': 'i = 0 or n = 1'
one: 'n is 1'
}, },
guw: { 'kw': {
one: 'n in 0..1' 'one': 'n = 1',
'two': 'n = 2'
}, },
shi: { 'lag': {
few: 'n in 2..10', 'zero': 'n = 0',
one: 'n within 0..1' 'one': 'i = 0,1 and n != 0'
}, },
el: { 'ln': {
one: 'n is 1' 'one': 'n = 0..1'
}, },
eo: { 'lt': {
one: 'n is 1' 'one': 'n % 10 = 1 and n % 100 != 11..19',
'few': 'n % 10 = 2..9 and n % 100 != 11..19',
'many': 'f != 0'
}, },
en: { 'lv': {
one: 'n is 1' '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: '', 'mg': {
teo: { 'one': 'n = 0..1'
one: 'n is 1'
}, },
ee: { 'mk': {
one: 'n is 1' 'one': 'v = 0 and i % 10 = 1 or f % 10 = 1'
}, },
kde: '', 'mo': {
fr: { 'one': 'i = 1 and v = 0',
one: 'n within 0..2 and n is not 2' 'few': 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
}, },
eu: { 'mr': {
one: 'n is 1' 'one': 'i = 0 or n = 1'
}, },
et: { 'mt': {
one: 'n is 1' 'one': 'n = 1',
'few': 'n = 0 or n % 100 = 2..10',
'many': 'n % 100 = 11..19'
}, },
es: { 'naq': {
one: 'n is 1' 'one': 'n = 1',
'two': 'n = 2'
}, },
seh: { 'nso': {
one: 'n is 1' 'one': 'n = 0..1'
}, },
ru: { 'pa': {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14', 'one': 'n = 0..1'
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'
}, },
kl: { 'pl': {
one: 'n is 1' '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: { 'pt': {
two: 'n is 2', 'one': 'i = 1 and v = 0 or i = 0 and t = 1'
one: 'n is 1'
}, },
smn: { 'pt_PT': {
two: 'n is 2', 'one': 'n = 1 and v = 0'
one: 'n is 1'
}, },
smj: { 'ro': {
two: 'n is 2', 'one': 'i = 1 and v = 0',
one: 'n is 1' 'few': 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
}, },
smi: { 'ru': {
two: 'n is 2', 'one': 'v = 0 and i % 10 = 1 and i % 100 != 11',
one: 'n is 1' 'many': 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
}, },
fy: { 'se': {
one: 'n is 1' 'one': 'n = 1',
'two': 'n = 2'
}, },
rm: { 'sh': {
one: 'n is 1' '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: { 'shi': {
few: 'n is 0 OR n is not 1 AND n mod 100 in 1..19', 'one': 'i = 0 or n = 1',
one: 'n is 1' 'few': 'n = 2..10'
}, },
bn: { 'si': {
one: 'n is 1' 'one': 'n = 0,1 or i = 0 and f = 1'
}, },
sma: { 'sk': {
two: 'n is 2', 'one': 'i = 1 and v = 0',
one: 'n is 1' 'few': 'i = 2..4 and v = 0',
'many': 'v != 0'
}, },
be: { 'sl': {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14', 'one': 'v = 0 and i % 100 = 1',
many: 'n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14', 'two': 'v = 0 and i % 100 = 2',
one: 'n mod 10 is 1 and n mod 100 is not 11' 'few': 'v = 0 and i % 100 = 3..4 or v != 0'
}, },
bg: { 'sma': {
one: 'n is 1' 'one': 'n = 1',
'two': 'n = 2'
}, },
ms: '', 'smi': {
wa: { 'one': 'n = 1',
one: 'n in 0..1' 'two': 'n = 2'
}, },
ps: { 'smj': {
one: 'n is 1' 'one': 'n = 1',
'two': 'n = 2'
}, },
wo: '', 'smn': {
bm: '', 'one': 'n = 1',
jv: '', 'two': 'n = 2'
bo: '',
bh: {
one: 'n in 0..1'
}, },
kea: '', 'sms': {
asa: { 'one': 'n = 1',
one: 'n is 1' 'two': 'n = 2'
}, },
cgg: { 'sr': {
one: 'n is 1' '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: { 'ti': {
few: 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 'one': 'n = 0..1'
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'
}, },
bs: { 'tl': {
few: 'n mod 10 in 2..4 and n mod 100 not in 12..14', 'one': 'i = 0..1 and v = 0'
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'
}, },
ja: '', 'tzm': {
om: { 'one': 'n = 0..1 or n = 11..99'
one: 'n is 1'
}, },
fa: '', 'uk': {
vun: { 'one': 'v = 0 and i % 10 = 1 and i % 100 != 11',
one: 'n is 1' '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: { 'wa': {
one: 'n is 1' 'one': 'n = 0..1'
}, },
xh: { 'zu': {
one: 'n is 1' 'one': 'i = 0 or n = 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'
} }
}, },
/** /**
* Plural form transformations, needed for some languages. * 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 locale
* @param messages * @param messages
*/ */
set: function( locale, 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 ) { function jsonMessageLoader( url ) {
return $.getJSON( url ).fail( function ( jqxhr, settings, exception ) { var deferred = $.Deferred();
$.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
$.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() ); $.extend( $.i18n.messageStore, new MessageStore() );