diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-05-03 15:35:00 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-05-03 15:35:00 +0200 |
commit | de98e0b232509d5f40c135d540a70e415272ff85 (patch) | |
tree | a79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/os-locale/index.js | |
parent | e0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff) |
node_modules
Diffstat (limited to 'node_modules/os-locale/index.js')
-rw-r--r-- | node_modules/os-locale/index.js | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/node_modules/os-locale/index.js b/node_modules/os-locale/index.js new file mode 100644 index 000000000..2c8a0065d --- /dev/null +++ b/node_modules/os-locale/index.js @@ -0,0 +1,127 @@ +'use strict'; +var childProcess = require('child_process'); +var execFileSync = childProcess.execFileSync; +var lcid = require('lcid'); +var defaultOpts = {spawn: true}; +var cache; + +function fallback() { + cache = 'en_US'; + return cache; +} + +function getEnvLocale(env) { + env = env || process.env; + var ret = env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE; + cache = getLocale(ret); + return ret; +} + +function parseLocale(x) { + var env = x.split('\n').reduce(function (env, def) { + def = def.split('='); + env[def[0]] = def[1]; + return env; + }, {}); + return getEnvLocale(env); +} + +function getLocale(str) { + return (str && str.replace(/[.:].*/, '')) || fallback(); +} + +module.exports = function (opts, cb) { + if (typeof opts === 'function') { + cb = opts; + opts = defaultOpts; + } else { + opts = opts || defaultOpts; + } + + if (cache || getEnvLocale() || opts.spawn === false) { + setImmediate(cb, null, cache); + return; + } + + var getAppleLocale = function () { + childProcess.execFile('defaults', ['read', '-g', 'AppleLocale'], function (err, stdout) { + if (err) { + fallback(); + return; + } + + cache = stdout.trim() || fallback(); + cb(null, cache); + }); + }; + + if (process.platform === 'win32') { + childProcess.execFile('wmic', ['os', 'get', 'locale'], function (err, stdout) { + if (err) { + fallback(); + return; + } + + var lcidCode = parseInt(stdout.replace('Locale', ''), 16); + cache = lcid.from(lcidCode) || fallback(); + cb(null, cache); + }); + } else { + childProcess.execFile('locale', function (err, stdout) { + if (err) { + fallback(); + return; + } + + var res = parseLocale(stdout); + + if (!res && process.platform === 'darwin') { + getAppleLocale(); + return; + } + + cache = getLocale(res); + cb(null, cache); + }); + } +}; + +module.exports.sync = function (opts) { + opts = opts || defaultOpts; + + if (cache || getEnvLocale() || !execFileSync || opts.spawn === false) { + return cache; + } + + if (process.platform === 'win32') { + var stdout; + + try { + stdout = execFileSync('wmic', ['os', 'get', 'locale'], {encoding: 'utf8'}); + } catch (err) { + return fallback(); + } + + var lcidCode = parseInt(stdout.replace('Locale', ''), 16); + cache = lcid.from(lcidCode) || fallback(); + return cache; + } + + var res; + + try { + res = parseLocale(execFileSync('locale', {encoding: 'utf8'})); + } catch (err) {} + + if (!res && process.platform === 'darwin') { + try { + cache = execFileSync('defaults', ['read', '-g', 'AppleLocale'], {encoding: 'utf8'}).trim() || fallback(); + return cache; + } catch (err) { + return fallback(); + } + } + + cache = getLocale(res); + return cache; +}; |