fabulator
10/10/2017 - 1:31 PM

Resolve best locale for moment

Resolve best locale for moment

import moment from 'moment';
import {
    LocaleResolver,
    NavigatorDetector,
    FallbacksTransformer,
    DefaultLocaleTransformer,
} from 'locales-detector';

// moment locales are in lowercase, need it change en-GB to en-gb
class LowerCaseTransformer {
    transform(locales) {
        return locales.map((locale) => {
            return locale.toLocaleLowerCase();
        });
    }
}

// detect locales from browser
// create fallbacks for regional versions [es-ES] => [es-ES, es]
// lowercase locales
// add default en language
const langs = (new LocaleResolver([new NavigatorDetector], [
    new FallbacksTransformer(),
    new LowerCaseTransformer(),
    new DefaultLocaleTransformer('en'),
])).getLocales();

let i = 0;

/**
 * Import locale language.
 *
 * @param {string} lang - imported language
 * @returns {Promise}
 */
function importLocale(lang) {
    // en language is not in chunks, resolve it
    if (lang === 'en') {
        return Promise.resolve();
    }

    // try to find language in chunks
    return import('moment/locale/' + lang + '.js')
        .catch(() => {
            // lang does not exists
            i++;

            // if all languages from browser was not found, use default en
            if (!langs[i]) {
                return null;
            }

            // try to import another language
            return importLocale(langs[i]);
        });
}

importLocale(langs[i]).then(() => {
    // info about used language for moment
    console.log('Used language: ' + (langs[i] || 'en'));
    console.log(moment().format('dddd'));
});