-
-
Save Troland/a61499b507d939cb5d04bc24fefeb037 to your computer and use it in GitHub Desktop.
Resolve best locale for moment
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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