123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 'use strict';
- const execa = require('execa');
- const lcid = require('lcid');
- const mem = require('mem');
- const defaultOptions = {spawn: true};
- const defaultLocale = 'en_US';
- function getEnvLocale(env = process.env) {
- return env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE;
- }
- function parseLocale(string) {
- const env = string.split('\n').reduce((env, def) => {
- const [key, value] = def.split('=');
- env[key] = value.replace(/^"|"$/g, '');
- return env;
- }, {});
- return getEnvLocale(env);
- }
- function getLocale(string) {
- return (string && string.replace(/[.:].*/, ''));
- }
- function getLocales() {
- return execa.stdout('locale', ['-a']);
- }
- function getLocalesSync() {
- return execa.sync('locale', ['-a']).stdout;
- }
- function getSupportedLocale(locale, locales = '') {
- return locales.includes(locale) ? locale : defaultLocale;
- }
- function getAppleLocale() {
- return Promise.all([
- execa.stdout('defaults', ['read', '-globalDomain', 'AppleLocale']),
- getLocales()
- ]).then(results => getSupportedLocale(results[0], results[1]));
- }
- function getAppleLocaleSync() {
- return getSupportedLocale(
- execa.sync('defaults', ['read', '-globalDomain', 'AppleLocale']).stdout,
- getLocalesSync()
- );
- }
- function getUnixLocale() {
- if (process.platform === 'darwin') {
- return getAppleLocale();
- }
- return execa.stdout('locale')
- .then(stdout => getLocale(parseLocale(stdout)));
- }
- function getUnixLocaleSync() {
- if (process.platform === 'darwin') {
- return getAppleLocaleSync();
- }
- return getLocale(parseLocale(execa.sync('locale').stdout));
- }
- function getWinLocale() {
- return execa.stdout('wmic', ['os', 'get', 'locale'])
- .then(stdout => {
- const lcidCode = parseInt(stdout.replace('Locale', ''), 16);
- return lcid.from(lcidCode);
- });
- }
- function getWinLocaleSync() {
- const {stdout} = execa.sync('wmic', ['os', 'get', 'locale']);
- const lcidCode = parseInt(stdout.replace('Locale', ''), 16);
- return lcid.from(lcidCode);
- }
- module.exports = mem((options = defaultOptions) => {
- const envLocale = getEnvLocale();
- let thenable;
- if (envLocale || options.spawn === false) {
- thenable = Promise.resolve(getLocale(envLocale));
- } else if (process.platform === 'win32') {
- thenable = getWinLocale();
- } else {
- thenable = getUnixLocale();
- }
- return thenable
- .then(locale => locale || defaultLocale)
- .catch(() => defaultLocale);
- });
- module.exports.sync = mem((options = defaultOptions) => {
- const envLocale = getEnvLocale();
- let res;
- if (envLocale || options.spawn === false) {
- res = getLocale(envLocale);
- } else {
- try {
- res = process.platform === 'win32' ? getWinLocaleSync() : getUnixLocaleSync();
- } catch (_) {}
- }
- return res || defaultLocale;
- });
|