|
|
- '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;
- });
|