123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 'use strict';
- const execa = require('execa');
- const lcid = require('lcid');
- const mem = require('mem');
- const defaultOpts = {spawn: true};
- const defaultLocale = 'en_US';
- function getEnvLocale(env) {
- env = env || process.env;
- return env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE;
- }
- function parseLocale(x) {
- const env = x.split('\n').reduce((env, def) => {
- def = def.split('=');
- env[def[0]] = def[1].replace(/^"|"$/g, '');
- return env;
- }, {});
- return getEnvLocale(env);
- }
- function getLocale(str) {
- return (str && str.replace(/[.:].*/, ''));
- }
- function getAppleLocale() {
- return execa.stdout('defaults', ['read', '-g', 'AppleLocale']);
- }
- function getAppleLocaleSync() {
- return execa.sync('defaults', ['read', '-g', 'AppleLocale']).stdout;
- }
- 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']).stdout;
- const lcidCode = parseInt(stdout.replace('Locale', ''), 16);
- return lcid.from(lcidCode);
- }
- module.exports = mem(opts => {
- opts = opts || defaultOpts;
- const envLocale = getEnvLocale();
- let thenable;
- if (envLocale || opts.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(opts => {
- opts = opts || defaultOpts;
- const envLocale = getEnvLocale();
- let res;
- if (envLocale || opts.spawn === false) {
- res = getLocale(envLocale);
- } else {
- try {
- if (process.platform === 'win32') {
- res = getWinLocaleSync();
- } else {
- res = getUnixLocaleSync();
- }
- } catch (err) {}
- }
- return res || defaultLocale;
- });
|