import isArray from '../utils/is-array';
|
import compareArrays from '../utils/compare-arrays';
|
import { Locale } from './constructor';
|
|
// internal storage for locale config files
|
var locales = {};
|
var globalLocale;
|
|
function normalizeLocale(key) {
|
return key ? key.toLowerCase().replace('_', '-') : key;
|
}
|
|
// pick the locale from the array
|
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
|
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
|
function chooseLocale(names) {
|
var i = 0, j, next, locale, split;
|
|
while (i < names.length) {
|
split = normalizeLocale(names[i]).split('-');
|
j = split.length;
|
next = normalizeLocale(names[i + 1]);
|
next = next ? next.split('-') : null;
|
while (j > 0) {
|
locale = loadLocale(split.slice(0, j).join('-'));
|
if (locale) {
|
return locale;
|
}
|
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++;
|
}
|
return null;
|
}
|
|
function loadLocale(name) {
|
var oldLocale = null;
|
// TODO: Find a better way to register and load all the locales in Node
|
if (!locales[name] && typeof module !== 'undefined' &&
|
module && module.exports) {
|
try {
|
oldLocale = globalLocale._abbr;
|
require('./locale/' + name);
|
// because defineLocale currently also sets the global locale, we
|
// want to undo that for lazy loaded locales
|
getSetGlobalLocale(oldLocale);
|
} catch (e) { }
|
}
|
return locales[name];
|
}
|
|
// This function will load locale and then set the global locale. If
|
// no arguments are passed in, it will simply return the current global
|
// locale key.
|
export function getSetGlobalLocale (key, values) {
|
var data;
|
if (key) {
|
if (typeof values === 'undefined') {
|
data = getLocale(key);
|
}
|
else {
|
data = defineLocale(key, values);
|
}
|
|
if (data) {
|
// moment.duration._locale = moment._locale = data;
|
globalLocale = data;
|
}
|
}
|
|
return globalLocale._abbr;
|
}
|
|
export function defineLocale (name, values) {
|
if (values !== null) {
|
values.abbr = name;
|
locales[name] = locales[name] || new Locale();
|
locales[name].set(values);
|
|
// backwards compat for now: also set the locale
|
getSetGlobalLocale(name);
|
|
return locales[name];
|
} else {
|
// useful for testing
|
delete locales[name];
|
return null;
|
}
|
}
|
|
// returns locale data
|
export function getLocale (key) {
|
var locale;
|
|
if (key && key._locale && key._locale._abbr) {
|
key = key._locale._abbr;
|
}
|
|
if (!key) {
|
return globalLocale;
|
}
|
|
if (!isArray(key)) {
|
//short-circuit everything else
|
locale = loadLocale(key);
|
if (locale) {
|
return locale;
|
}
|
key = [key];
|
}
|
|
return chooseLocale(key);
|
}
|