}
// compare two arrays, return the number of differences
- function compareArrays(array1, array2) {
+ function compareArrays(array1, array2, dontConvert) {
var len = Math.min(array1.length, array2.length),
lengthDiff = Math.abs(array1.length - array2.length),
diffs = 0,
i;
for (i = 0; i < len; i++) {
- if (toInt(array1[i]) !== toInt(array2[i])) {
+ if ((dontConvert && array1[i] !== array2[i]) ||
+ (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
diffs++;
}
}
}
function normalizeLanguage(key) {
- return key.toLowerCase().replace('_', '-');
+ return key ? key.toLowerCase().replace('_', '-') : key;
}
/************************************
// definition for 'en', so long as 'en' has already been loaded using
// moment.lang.
function getLangDefinition(key) {
- var i, lang,
+ var i = 0, j, lang, next, split,
get = function (k) {
- k = normalizeLanguage(k);
if (!languages[k] && hasModule) {
try {
require('./lang/' + k);
return languages[k];
};
- if (isArray(key)) {
- for (i in key) {
- lang = get(key[i]);
+ if (!key) {
+ return moment.fn._lang;
+ }
+
+ if (!isArray(key)) {
+ //short-circuit everything else
+ lang = get(key);
+ if (lang) {
+ return lang;
+ }
+ key = [key];
+ }
+
+ while (i < key.length) {
+ split = normalizeLanguage(key[i]).split('-');
+ j = split.length;
+ next = normalizeLanguage(key[i + 1]);
+ next = next ? next.split('-') : null;
+ while (j > 0) {
+ lang = get(split.slice(0, j).join('-'));
if (lang) {
return lang;
}
+ if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+ //the next array item is better than a shallower substring of this one
+ break;
+ }
+ j--;
}
+ i++;
}
- else if (key) {
- return get(key) || moment.fn._lang;
- }
-
return moment.fn._lang;
}
-
/************************************
Formatting
************************************/
test.done();
},
+ "library getter language substrings" : function (test) {
+ test.equal(moment.lang('fr-crap'), 'fr', "use substrings");
+ test.equal(moment.lang('fr-does-not-exist'), 'fr', "uses deep substrings");
+ test.equal(moment.lang('fr-CA-does-not-exist'), 'fr-ca', "uses deepest substring");
+ test.done();
+ },
+
+ "library getter language array and substrings" : function (test) {
+ test.equal(moment.lang(['en-CH', 'fr']), 'en', "prefer root languages to shallower ones");
+ test.equal(moment.lang(['en-gb-leeds', 'en-CA']), 'en-gb', "prefer root languages to shallower ones");
+ test.equal(moment.lang(['en-CH', 'en-CA']), 'en-ca', "prefer alternatives with shared roots");
+ test.equals(moment.lang(['fake-CA', 'fake-MX', 'fr']), 'fr', "always find something if possible");
+ test.equals(moment.lang(['fake-CA', 'fake-MX', 'fr']), 'fr', "always find something if possible");
+ test.equals(moment.lang(['fake-CA', 'fake-MX', 'fr-fake-fake-fake']), 'fr', "always find something if possible");
+ test.done();
+ },
+
"library ensure inheritance" : function (test) {
test.expect(2);
test.done();
},
+ "instance getter language substrings" : function (test) {
+ var m = moment();
+
+ m.lang('fr-crap');
+ test.equal(m.lang()._abbr, 'fr', "use substrings");
+
+ m.lang('fr-does-not-exist');
+ test.equal(m.lang()._abbr, 'fr', "uses deep substrings");
+
+ test.done();
+ },
+
"instance lang persists with manipulation" : function (test) {
test.expect(3);
moment.lang('en');