You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.7 KiB
133 lines
4.7 KiB
/*!
|
|
// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
|
// Released under the MIT license
|
|
// https://opensource.org/licenses/mit-license.php
|
|
*/
|
|
/*!
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
Copyright (C) 2020 jeffy-g <hirotom1107@gmail.com>
|
|
Released under the MIT license
|
|
https://opensource.org/licenses/mit-license.php
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
*/
|
|
import * as lcid from "lcid";
|
|
import { execFile, execFileSync, } from "child_process";
|
|
const defaultLocale = "en_US";
|
|
const getStdOut = async (command, args) => await new Promise((resolve) => {
|
|
execFile(command, args, (err, stdout) => {
|
|
resolve(err || stdout);
|
|
});
|
|
});
|
|
const getStdOutSync = (command, args) => {
|
|
try {
|
|
return execFileSync(command, args);
|
|
}
|
|
catch (e) {
|
|
return e;
|
|
}
|
|
};
|
|
const normalise = (input) => input.replace(/_/, "-");
|
|
function validate(result, processor) {
|
|
if (typeof result === "string" && result.length) {
|
|
return processor ? processor(result) : result.trim();
|
|
}
|
|
return defaultLocale;
|
|
}
|
|
const getEnvLocale = (env = process.env) => env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE || "";
|
|
function parseLocale(str) {
|
|
const env = str.split("\n").reduce((env, definition) => {
|
|
const [key, value] = definition.split("=");
|
|
if (key && value) {
|
|
env[key] = value.replace(/^"|"$/g, "");
|
|
}
|
|
return env;
|
|
}, {});
|
|
return getEnvLocale(env);
|
|
}
|
|
const purgeExtraToken = (str) => (str && str.replace(/[.:].*/, "")) || defaultLocale;
|
|
const getSupportedLocale = (locale, locales) => locales.includes(locale) ? locale : defaultLocale;
|
|
const [getAppleLocale, getAppleLocaleSync] = ((cmd0, args0, cmd1, args1) => {
|
|
return [
|
|
async () => {
|
|
const results = await Promise.all([
|
|
getStdOut(cmd0, args0).then(ret => validate(ret)),
|
|
getStdOut(cmd1, args1).then(ret => validate(ret))
|
|
]);
|
|
return getSupportedLocale(results[0], results[1]);
|
|
},
|
|
() => getSupportedLocale(validate(getStdOutSync(cmd0, args0)), validate(getStdOutSync(cmd1, args1)))
|
|
];
|
|
})("defaults", ["read", "-globalDomain", "AppleLocale"], "locale", ["-a"]);
|
|
const getUnixLocale = async () => purgeExtraToken(parseLocale(await getStdOut("locale").then(ret => validate(ret))));
|
|
const getUnixLocaleSync = () => purgeExtraToken(parseLocale(validate(getStdOutSync("locale"))));
|
|
const parseLCID = (result) => {
|
|
const lcidCode = parseInt(result.replace("Locale", ""), 16);
|
|
return lcid.from(lcidCode);
|
|
};
|
|
const [getWinLocale, getWinLocaleSync] = ((cmd0, args0) => {
|
|
return [
|
|
async () => validate(await getStdOut(cmd0, args0), parseLCID),
|
|
() => validate(getStdOutSync(cmd0, args0), parseLCID)
|
|
];
|
|
})("wmic", ["os", "get", "locale"]);
|
|
let detector;
|
|
{
|
|
const gettersSlot = [
|
|
{
|
|
win32: getWinLocaleSync,
|
|
darwin: getAppleLocaleSync,
|
|
linux: getUnixLocaleSync,
|
|
}, {
|
|
win32: getWinLocale,
|
|
darwin: getAppleLocale,
|
|
linux: getUnixLocale,
|
|
}
|
|
];
|
|
const typeString = {}.toString;
|
|
const isPromise = (o) => typeString.call(o) === "[object Promise]";
|
|
let cacheLocal;
|
|
const base = (async) => (options = {}) => {
|
|
options = { spawn: true, cache: true, ...options };
|
|
const cache = options.cache;
|
|
if (cache && (cacheLocal === null || cacheLocal === void 0 ? void 0 : cacheLocal.length)) {
|
|
return (async ? Promise.resolve(cacheLocal) : cacheLocal);
|
|
}
|
|
const functions = gettersSlot[+(!!async)];
|
|
let locale;
|
|
const withCache = (l, mustPromise) => {
|
|
l = normalise(l);
|
|
cacheLocal = cache ? l : void 0;
|
|
return (mustPromise ? Promise.resolve(l) : l);
|
|
};
|
|
const envLocale = getEnvLocale();
|
|
if (envLocale || !options.spawn) {
|
|
locale = purgeExtraToken(envLocale);
|
|
}
|
|
else {
|
|
let { platform } = process;
|
|
if (platform !== "win32" && platform !== "darwin") {
|
|
platform = "linux";
|
|
}
|
|
locale = functions[platform]();
|
|
}
|
|
if (isPromise(locale)) {
|
|
return locale.then(result => withCache(result));
|
|
}
|
|
else {
|
|
return withCache(locale, async === true || void 0);
|
|
}
|
|
};
|
|
detector = (base(true));
|
|
detector.sync = base();
|
|
Object.defineProperties(detector, {
|
|
purge: {
|
|
value: () => cacheLocal = void 0,
|
|
enumerable: false,
|
|
},
|
|
version: {
|
|
value: "v1.0.8",
|
|
enumerable: true,
|
|
},
|
|
});
|
|
}
|
|
export const osLocale = Object.freeze(detector);
|