Skip to content

Instantly share code, notes, and snippets.

@Troland
Forked from fabulator/moment-locale-resolver.js
Created January 28, 2019 09:04
Show Gist options
  • Save Troland/a61499b507d939cb5d04bc24fefeb037 to your computer and use it in GitHub Desktop.
Save Troland/a61499b507d939cb5d04bc24fefeb037 to your computer and use it in GitHub Desktop.
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'));
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment