This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
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.
101 lines
2.3 KiB
101 lines
2.3 KiB
'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; |
|
});
|
|
|