UNPKG

nightscout

Version:

Nightscout acts as a web-based CGM (Continuous Glucose Monitor) to allow multiple caregivers to remotely view a patients glucose data in realtime.

181 lines (150 loc) 6.51 kB
'use strict'; var _ = require('lodash'); function init (fs) { function language () { return language; } language.speechCode = 'en-US'; language.lang = 'en'; language.languages = [ { code: 'bg', file: 'bg_BG', language: 'Български', speechCode: 'bg-BG' } , { code: 'cs', file: 'cs_CZ', language: 'Čeština', speechCode: 'cs-CZ' } , { code: 'de', file: 'de_DE', language: 'Deutsch', speechCode: 'de-DE' } , { code: 'dk', file: 'da_DK', language: 'Dansk', speechCode: 'dk-DK' } , { code: 'el', file: 'el_GR', language: 'Ελληνικά', speechCode: 'el-GR' } , { code: 'en', file: 'en_US', language: 'English', speechCode: 'en-US' } , { code: 'es', file: 'es_ES', language: 'Español', speechCode: 'es-ES' } , { code: 'fi', file: 'fi_FI', language: 'Suomi', speechCode: 'fi-FI' } , { code: 'fr', file: 'fr_FR', language: 'Français', speechCode: 'fr-FR' } , { code: 'he', file: 'he_IL', language: 'עברית', speechCode: 'he-IL' } , { code: 'hr', file: 'hr_HR', language: 'Hrvatski', speechCode: 'hr-HR' } , { code: 'hu', file: 'hu_HU', language: 'Magyar', speechCode: 'hu-HU' } , { code: 'it', file: 'it_IT', language: 'Italiano', speechCode: 'it-IT' } , { code: 'ja', file: 'ja_JP', language: '日本語', speechCode: 'ja-JP' } , { code: 'ko', file: 'ko_KR', language: '한국어', speechCode: 'ko-KR' } , { code: 'nb', file: 'nb_NO', language: 'Norsk (Bokmål)', speechCode: 'no-NO' } , { code: 'nl', file: 'nl_NL', language: 'Nederlands', speechCode: 'nl-NL' } , { code: 'pl', file: 'pl_PL', language: 'Polski', speechCode: 'pl-PL' } , { code: 'pt', file: 'pt_PT', language: 'Português', speechCode: 'pt-PT' } , { code: 'br', file: 'pt_BR', language: 'Português (Brasil)', speechCode: 'pt-BR' } , { code: 'ro', file: 'ro_RO', language: 'Română', speechCode: 'ro-RO' } , { code: 'ru', file: 'ru_RU', language: 'Русский', speechCode: 'ru-RU' } , { code: 'sk', file: 'sk_SK', language: 'Slovenčina', speechCode: 'sk-SK' } , { code: 'sl', file: 'sl_SL', language: 'Slovenščina', speechCode: 'sl-SL' } , { code: 'sv', file: 'sv_SE', language: 'Svenska', speechCode: 'sv-SE' } , { code: 'tr', file: 'tr_TR', language: 'Türkçe', speechCode: 'tr-TR' } , { code: 'zh_cn', file: 'zh_CN', language: '中文(简体)', speechCode: 'cmn-Hans-CN' } // , { code: 'zh_tw', file: 'zh_TW', language: '中文(繁體)', speechCode: 'cmn-Hant-TW' } ]; var translations = {}; language.translations = translations; language.offerTranslations = function offerTranslations (localization) { translations = localization; language.translations = translations; } // case sensitive language.translateCS = function translateCaseSensitive (text) { if (translations[text]) { return translations[text]; } // console.log('localization:', text, 'not found'); return text; }; // case insensitive language.translateCI = function translateCaseInsensitive (text) { var utext = text.toUpperCase(); _.forEach(translations, function(ts, key) { var ukey = key.toUpperCase(); if (ukey === utext) { text = ts; } }); return text; }; language.translate = function translate (text, options) { var translated; if (options && options.ci) { translated = language.translateCI(text); } else { translated = language.translateCS(text); } var hasCI = false; var hasParams = false; if (options) { hasCI = Object.prototype.hasOwnProperty.call(options,'ci'); hasParams = Object.prototype.hasOwnProperty.call(options,'params'); } var keys = hasParams ? options.params : null; if (options && !hasCI && !hasParams) { keys = []; for (var i = 1; i < arguments.length; i++) { keys.push(arguments[i]); } } if (options && (hasCI || hasParams) && arguments.length > 2) { if (!keys) keys = []; for (i = 2; i < arguments.length; i++) { keys.push(arguments[i]); } } if (keys) { for (i = 0; i < keys.length; i++) { /* eslint-disable-next-line no-useless-escape, security/detect-non-literal-regexp */ // validated false positive var r = new RegExp('\%' + (i + 1), 'g'); translated = translated.replace(r, keys[i]); } } return translated; }; language.DOMtranslate = function DOMtranslate ($) { // do translation of static text on load $('.translate').each(function() { $(this).text(language.translate($(this).text())); }); $('.titletranslate, .tip').each(function() { $(this).attr('title', language.translate($(this).attr('title'))); $(this).attr('original-title', language.translate($(this).attr('original-title'))); $(this).attr('placeholder', language.translate($(this).attr('placeholder'))); }); }; language.getFilename = function getFilename (code) { if (code == 'en') { return 'en/en.json'; } let file; language.languages.forEach(function(l) { if (l.code == code) file = l.file; }); return file + '.json'; } // this is a server only call and needs fs by reference as the class is also used in the client language.loadLocalization = function loadLocalization (fs, path) { let filename = './translations/' + this.getFilename(this.lang); if (path) filename = path.resolve(__dirname, filename); /* eslint-disable-next-line security/detect-non-literal-fs-filename */ // verified false positive; well defined set of values const l = fs.readFileSync(filename); this.offerTranslations(JSON.parse(l)); } language.set = function set (newlang) { if (!newlang) return; language.lang = newlang; language.languages.forEach(function(l) { if (l.code === language.lang && l.speechCode) language.speechCode = l.speechCode; }); return language(); }; language.get = function get (lang) { var r; language.languages.forEach(function(l) { if (l.code === lang) r = l; }); return r; } // if run on server and we get a filesystem handle, load english by default if (fs) { language.set('en'); language.loadLocalization(fs); } return language(); } module.exports = init;