diff options
Diffstat (limited to 'node_modules/os-locale/index.js')
| -rw-r--r-- | node_modules/os-locale/index.js | 101 | 
1 files changed, 101 insertions, 0 deletions
| diff --git a/node_modules/os-locale/index.js b/node_modules/os-locale/index.js new file mode 100644 index 0000000..1ada7a4 --- /dev/null +++ b/node_modules/os-locale/index.js @@ -0,0 +1,101 @@ +'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; +}); | 
