]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
use language substrings
authorIsaac Cambron <isaac@isaaccambron.com>
Sat, 28 Sep 2013 22:14:17 +0000 (18:14 -0400)
committerIsaac Cambron <isaac@isaaccambron.com>
Sat, 28 Sep 2013 22:14:17 +0000 (18:14 -0400)
moment.js
test/moment/lang.js

index a9b752b169f6369a2e59da54c8f73b8dfc18eb39..f57c1214203bf20884d11a1c4682c292b9e17f96 100644 (file)
--- a/moment.js
+++ b/moment.js
     }
 
     // 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
     ************************************/
index ace0d866aea74ae4f717e233a29c163d8bf3e0aa..31ff57a6ed9ea1caf1896cf2bc9a7391643801f9 100644 (file)
@@ -36,6 +36,23 @@ exports.lang = {
         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);
 
@@ -117,6 +134,18 @@ exports.lang = {
         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');