From 74f60fc5d3869e0bb1ace23f38d130d84c81342b Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Wed, 26 Aug 2015 19:48:49 +0200 Subject: [PATCH 01/21] ar2 --- lib/language.js | 57 ++++++++++++++++++++++++++++++++++++++++-- lib/levels.js | 3 ++- lib/plugins/ar2.js | 10 +++++--- tests/language.test.js | 6 +++++ 4 files changed, 69 insertions(+), 7 deletions(-) diff --git a/lib/language.js b/lib/language.js index d03a5544670..3977b4a6641 100644 --- a/lib/language.js +++ b/lib/language.js @@ -1,5 +1,7 @@ 'use strict'; +var _ = require('lodash'); + function init() { var lang; @@ -763,7 +765,7 @@ function init() { ,he: 'גודל' } ,'(none)' : { - cs: '(Prázdný)' + cs: '(žádný)' ,de: '(nichts)' ,es: '(ninguno)' ,fr: '(aucun)' @@ -778,6 +780,19 @@ function init() { ,nb: '(ingen)' ,he: '(ללא)' } + ,'None' : { + cs: 'Žádný' + ,de: 'Nichts' + ,es: 'Ninguno' + ,fr: 'Aucun' + ,pt: 'Nenhum' + ,sv: 'Tom' + ,ro: 'Fără' + ,bg: 'няма' + ,hr: 'Prazno' + ,it: 'Nessuno' + ,dk: 'Ingen' + } ,'Result is empty' : { cs: 'Prázdný výsledek' ,de: 'Leeres Ergebnis' @@ -3391,7 +3406,7 @@ function init() { ,ro: 'Alarmă urgentă hiper' ,bg: 'Много висока КЗ' ,hr: 'Hitni alarm za hiper' - ,it: 'Allarme Urgente: Glicemia Molto Alta' + ,it: 'Allarme UrgentUrgente: Glicemia Molto Alta' ,dk: 'Høj grænse overskredet' ,fi: 'Kriittinen korkea' ,nb: 'Kritisk høy alarm' @@ -4083,6 +4098,33 @@ function init() { cs: 'nejnovější nahoře' ,bg: 'Новите най-отгоре' } + ,'15m' : { // 15 minuts + cs: '15min' + } + ,'Check BG' : { + cs: 'Kontrola glykémie' + } + ,'predicted' : { + cs: 'předpovídaná' + } + ,'w/raw' : { + cs: 'včetně RAW' + } + ,'Unknown' : { // Message level + cs: 'Neznámý' + } + ,'Urgent' : { // Message level + cs: 'Urgentní' + } + ,'Warning' : { // Message level + cs: 'Varování' + } + ,'Info' : { // Message level + cs: 'Informativní' + } + ,'Lowest' : { // Message level + cs: 'Nejnižší' + } }; @@ -4093,6 +4135,17 @@ function init() { return text; }; + language.translateInUpperCase = function translateInUpperCase(text) { + var utext = text.toUpperCase(); + _.forEach(translations, function (ts, key) { + var ukey = key.toUpperCase(); + if (ukey === utext && ts[lang]) { + return ts[lang].toUpperCase(); + } + }); + return utext; + }; + language.DOMtranslate = function DOMtranslate($) { // do translation of static text on load $('.translate').each(function () { diff --git a/lib/levels.js b/lib/levels.js index 14dce01d308..ec03e4c28c5 100644 --- a/lib/levels.js +++ b/lib/levels.js @@ -1,5 +1,6 @@ 'use strict'; +var translate = require('./language')().translate; var levels = { URGENT: 2 @@ -25,7 +26,7 @@ levels.isAlarm = function isAlarm(level) { levels.toDisplay = function toDisplay(level) { var key = level !== undefined && level.toString(); - return key && level2Display[key] || 'Unknown'; + return key && translate(level2Display[key]) || translate('Unknown'); }; levels.toLowerCase = function toLowerCase(level) { diff --git a/lib/plugins/ar2.js b/lib/plugins/ar2.js index 53a1f6f6361..1a9ba347a97 100644 --- a/lib/plugins/ar2.js +++ b/lib/plugins/ar2.js @@ -5,6 +5,8 @@ var levels = require('../levels'); var times = require('../times'); var rawbg = require('./rawbg')(); var delta = require('./delta')(); +var translate = require('../language')().translate; +var translateInUpperCase = require('../language')().translateInUpperCase; var BG_REF = 140; //Central tendency var BG_MIN = 36; //Not 39, but why? @@ -46,7 +48,7 @@ function init() { var scaled = predicted && _.map(predicted, function(p) { return sbx.scaleEntry(p) } ); if (scaled && scaled.length >= 3) { - prop.displayLine = (prop.usingRaw ? 'Raw BG' : 'BG') + ' 15m: ' + scaled[2] + ' ' + sbx.unitsLabel; + prop.displayLine = (prop.usingRaw ? translate('Raw BG') : translate('BG')) + ' ' + translate('15m') + ': ' + scaled[2] + ' ' + sbx.unitsLabel; } @@ -220,15 +222,15 @@ function selectEventType (prop, sbx) { } function buildTitle(prop, sbx) { - var rangeLabel = prop.eventName ? prop.eventName.toUpperCase() : 'Check BG'; + var rangeLabel = prop.eventName ? translateInUpperCase(prop.eventName) : translate('Check BG'); var title = levels.toDisplay(prop.level) + ', ' + rangeLabel; var sgv = sbx.lastScaledSGV(); if (sgv > sbx.scaleMgdl(sbx.settings.thresholds.bgTargetBottom) && sgv < sbx.scaleMgdl(sbx.settings.thresholds.bgTargetTop)) { - title += ' predicted'; + title += ' ' + translate('predicted'); } if (prop.usingRaw) { - title += ' w/raw'; + title += ' ' + translate('w/raw'); } return title; } diff --git a/tests/language.test.js b/tests/language.test.js index 81c457f2ba9..2959f6bf113 100644 --- a/tests/language.test.js +++ b/tests/language.test.js @@ -21,4 +21,10 @@ describe('language', function ( ) { language.translate('Carbs').should.equal('Sacharidy'); }); + it('translate to Czech uppercase', function () { + var language = require('../lib/language')(); + language.set('cs'); + language.translateInUpperCase('carbs').should.equal('SACHARIDY'); + }); + }); From 8f5be2e447ea60bf9bf2ad4c657ef9885bc346b6 Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Wed, 26 Aug 2015 23:14:21 +0200 Subject: [PATCH 02/21] function return bug fix --- lib/language.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/language.js b/lib/language.js index 3977b4a6641..3b411d4e334 100644 --- a/lib/language.js +++ b/lib/language.js @@ -4140,7 +4140,7 @@ function init() { _.forEach(translations, function (ts, key) { var ukey = key.toUpperCase(); if (ukey === utext && ts[lang]) { - return ts[lang].toUpperCase(); + utext = ts[lang].toUpperCase(); } }); return utext; From 3de02d8b8e7e700bf1077ec10d4f4b455e22e3a0 Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Tue, 15 Sep 2015 13:07:16 +0200 Subject: [PATCH 03/21] reverse wrong edit --- lib/language.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/language.js b/lib/language.js index 3b411d4e334..c382285e047 100644 --- a/lib/language.js +++ b/lib/language.js @@ -3406,7 +3406,7 @@ function init() { ,ro: 'Alarmă urgentă hiper' ,bg: 'Много висока КЗ' ,hr: 'Hitni alarm za hiper' - ,it: 'Allarme UrgentUrgente: Glicemia Molto Alta' + ,it: 'Allarme Urgente: Glicemia Molto Alta' ,dk: 'Høj grænse overskredet' ,fi: 'Kriittinen korkea' ,nb: 'Kritisk høy alarm' From 18c1aa2f522af8c58af2b43da1310b7509759b62 Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Fri, 18 Sep 2015 23:30:13 +0200 Subject: [PATCH 04/21] ci translations --- lib/language.js | 26 ++++++++++++++++++++++---- lib/plugins/ar2.js | 3 +-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/language.js b/lib/language.js index c382285e047..5169721d06c 100644 --- a/lib/language.js +++ b/lib/language.js @@ -4128,22 +4128,40 @@ function init() { }; - language.translate = function translate(text) { + // case sensitive + language.translateCS = function translateCaseSensitive(text) { if (translations[text] && translations[text][lang]) { return translations[text][lang]; } return text; }; - language.translateInUpperCase = function translateInUpperCase(text) { + // case insensitive + language.translateCI = function translateCaseInsensitive(text) { var utext = text.toUpperCase(); _.forEach(translations, function (ts, key) { var ukey = key.toUpperCase(); if (ukey === utext && ts[lang]) { - utext = ts[lang].toUpperCase(); + text = ts[lang]; } }); - return utext; + return text; + }; + + language.translate = function translate(text, options) { + var translated; + if (options && options.ci) { + translated = language.translateCI(text); + } else { + translated = language.translateCS(text); + } + if (options && options.params) { + for (var i = 0; i < options.params.length; i++) { + var r = new RegExp('\%' + (i+1), 'g'); + translated = translated.replace(r, options.params[i]); + } + } + return translated; }; language.DOMtranslate = function DOMtranslate($) { diff --git a/lib/plugins/ar2.js b/lib/plugins/ar2.js index 1a9ba347a97..18cd2dd42c9 100644 --- a/lib/plugins/ar2.js +++ b/lib/plugins/ar2.js @@ -6,7 +6,6 @@ var times = require('../times'); var rawbg = require('./rawbg')(); var delta = require('./delta')(); var translate = require('../language')().translate; -var translateInUpperCase = require('../language')().translateInUpperCase; var BG_REF = 140; //Central tendency var BG_MIN = 36; //Not 39, but why? @@ -222,7 +221,7 @@ function selectEventType (prop, sbx) { } function buildTitle(prop, sbx) { - var rangeLabel = prop.eventName ? translateInUpperCase(prop.eventName) : translate('Check BG'); + var rangeLabel = prop.eventName ? translate(prop.eventName, { ci: true }).toUpperCase() : translate('Check BG'); var title = levels.toDisplay(prop.level) + ', ' + rangeLabel; var sgv = sbx.lastScaledSGV(); From ae0a33c95a86cfb3b0b939718666bf6323ab5bd1 Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Fri, 18 Sep 2015 23:55:21 +0200 Subject: [PATCH 05/21] fix travis --- tests/language.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/language.test.js b/tests/language.test.js index 2959f6bf113..fb024b85965 100644 --- a/tests/language.test.js +++ b/tests/language.test.js @@ -24,7 +24,7 @@ describe('language', function ( ) { it('translate to Czech uppercase', function () { var language = require('../lib/language')(); language.set('cs'); - language.translateInUpperCase('carbs').should.equal('SACHARIDY'); + language.translate('carbs', { ci: true }).should.equal('Sacharidy'); }); }); From 98b446f6369225c776c9b763f7edcd01884d14e0 Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Fri, 14 Oct 2016 21:13:46 +0200 Subject: [PATCH 06/21] translations admin tools roles --- lib/admin_plugins/roles.js | 4 ++-- lib/language.js | 48 +++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/lib/admin_plugins/roles.js b/lib/admin_plugins/roles.js index e2b99c1b7a9..4eeea560386 100644 --- a/lib/admin_plugins/roles.js +++ b/lib/admin_plugins/roles.js @@ -44,7 +44,7 @@ function createOrSaveRole (role, client, callback) { reload(client, callback); }).fail(function fail(err) { console.error('Unable to ' + method + ' Subject', err.responseText); - window.alert(client.translate('Unable to ' + method + ' Subject')); + window.alert(client.translate('Unable to %1 Subject', { params: [method] })); if (callback) { callback(err); } @@ -150,7 +150,7 @@ function openDialog (role, client) { } function showRole (role, table, client) { - var editIcon = $(''); + var editIcon = $(''); editIcon.click(function clicked ( ) { openDialog(role, client); }); diff --git a/lib/language.js b/lib/language.js index d06e1b01f5e..2ec3af3a159 100644 --- a/lib/language.js +++ b/lib/language.js @@ -7228,7 +7228,7 @@ function init() { ,ko: '활동량' } ,'Targets' : { - cs:'Cíl' + cs: 'Cíl' ,sk: 'Ciele' ,de: 'Ziele' ,sv: 'Mål' @@ -7240,19 +7240,19 @@ function init() { ,ko: '목표' } ,'Bolus insulin:' : { - cs:'Bolusový inzulín:' + cs: 'Bolusový inzulín:' ,ro: 'Insulină bolusată:' ,ru: 'Болюс инсулин' ,ko: 'Bolus 인슐린' } ,'Base basal insulin:' : { - cs:'Základní bazální inzulín:' + cs: 'Základní bazální inzulín:' ,ro: 'Bazala obișnuită:' ,ru: 'Основной базал инсулин' ,ko: '기본 basal 인슐린' } ,'Positive temp basal insulin:' : { - cs:'Pozitivní dočasný bazální inzulín:' + cs: 'Pozitivní dočasný bazální inzulín:' ,ro: 'Bazala temporară crescută:' ,ru: 'Положит знач временн базал инс ' ,ko: '임시 basal 인슐린 남아 있습니다.' @@ -7264,7 +7264,7 @@ function init() { ,ko: '임시 basal 인슐린 남아 있지 않습니다.' } ,'Total basal insulin:' : { - cs:'Celkový bazální inzulín:' + cs: 'Celkový bazální inzulín:' ,ro: 'Bazala totală:' ,ru: 'Всего базал инсулина' ,ko: '전체 basal 인슐린' @@ -7275,7 +7275,43 @@ function init() { ,ru: 'Всего ежедн базал инсулина' ,ko: '전체 하루 인슐린' } - + ,'Unable to %1 Subject' : { // PUT or POST + cs: 'Chyba volání %1 Subjektu:' + } + ,'Unable to delete Subject' : { + cs: 'Nelze odstranit Subjekt:' + } + ,'Database contains %1 roles' : { + cs: 'Databáze obsahuje %1 rolí' + } + ,'Edit Role' : { + cs:'Editovat roli:' + } + ,'admin, school, family, etc' : { + cs: 'administrátor, škola, rodina atd...' + } + ,'Permissions' : { + cs: 'Oprávnění' + } + ,'Are you sure you want to delete: ' : { + cs: 'Opravdu vymazat: ' + } + ,'Each role will have a 1 or more permissions. The * permission is a wildcard, permissions are a hierarchy using : as a seperator.' : { + cs: 'Každá role má 1 nebo více oprávnění. Oprávnění * je zástupný znak, oprávnění jsou hiearchie používající : jako oddělovač.' + } + ,'Add new Role' : { + cs: 'Přidat novou roli' + } + ,'Roles - Groups of People, Devices, etc' : { + cs: 'Role - Skupiny lidí, zařízení atd.' + } + ,'Edit this role' : { + cs: 'Editovat tuto roli' + } + ,'Admin authorized' : { + cs: 'Admin autorizován' + } + }; language.translations = translations; From 4260d097685c1d5c172dbd96be07cb2572b1335f Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Fri, 14 Oct 2016 21:35:41 +0200 Subject: [PATCH 07/21] translations admin tools subjects --- lib/admin_plugins/roles.js | 8 +++--- lib/admin_plugins/subjects.js | 4 +-- lib/language.js | 49 +++++++++++++++++++++++++++++++---- 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/lib/admin_plugins/roles.js b/lib/admin_plugins/roles.js index 4eeea560386..42191751c4b 100644 --- a/lib/admin_plugins/roles.js +++ b/lib/admin_plugins/roles.js @@ -43,8 +43,8 @@ function createOrSaveRole (role, client, callback) { }).done(function success() { reload(client, callback); }).fail(function fail(err) { - console.error('Unable to ' + method + ' Subject', err.responseText); - window.alert(client.translate('Unable to %1 Subject', { params: [method] })); + console.error('Unable to ' + method + ' Role', err.responseText); + window.alert(client.translate('Unable to %1 Role', { params: [method] })); if (callback) { callback(err); } @@ -59,8 +59,8 @@ function deleteRole (role, client, callback) { }).done(function success() { reload(client, callback); }).fail(function fail(err) { - console.error('Unable to delete Subject', err.responseText); - window.alert(client.translate('Unable to delete Subject')); + console.error('Unable to delete Role', err.responseText); + window.alert(client.translate('Unable to delete Role')); if (callback) { callback(err); } diff --git a/lib/admin_plugins/subjects.js b/lib/admin_plugins/subjects.js index 4a230774e62..5ea1bdbf180 100644 --- a/lib/admin_plugins/subjects.js +++ b/lib/admin_plugins/subjects.js @@ -149,11 +149,11 @@ function openDialog (subject, client) { } function showSubject (subject, table, client) { - var editIcon = $(''); + var editIcon = $(''); editIcon.click(function clicked ( ) { openDialog(subject, client); }); - var deleteIcon = $(''); + var deleteIcon = $(''); deleteIcon.click(function clicked ( ) { var ok = window.confirm(client.translate('Are you sure you want to delete: ') + subject.name); if (ok) { diff --git a/lib/language.js b/lib/language.js index 2ec3af3a159..b6a2dc6fc91 100644 --- a/lib/language.js +++ b/lib/language.js @@ -7275,17 +7275,17 @@ function init() { ,ru: 'Всего ежедн базал инсулина' ,ko: '전체 하루 인슐린' } - ,'Unable to %1 Subject' : { // PUT or POST - cs: 'Chyba volání %1 Subjektu:' + ,'Unable to %1 Role' : { // PUT or POST + cs: 'Chyba volání %1 Role:' } - ,'Unable to delete Subject' : { - cs: 'Nelze odstranit Subjekt:' + ,'Unable to delete Role' : { + cs: 'Nelze odstranit Roli:' } ,'Database contains %1 roles' : { cs: 'Databáze obsahuje %1 rolí' } ,'Edit Role' : { - cs:'Editovat roli:' + cs:'Editovat roli' } ,'admin, school, family, etc' : { cs: 'administrátor, škola, rodina atd...' @@ -7311,6 +7311,45 @@ function init() { ,'Admin authorized' : { cs: 'Admin autorizován' } + ,'Subjects - People, Devices, etc' : { + cs: 'Subjekty - Lidé, zařízení atd.' + } + ,'Each subject will have a unique access token and 1 or more roles. Click on the access token to open a new view with the selected subject, this secret link can then be shared.' : { + cs: 'Každý subjekt má svůj unikátní token a 1 nebo více rolí. Klikem na přístupový token se otevře nové okno pro tento subjekt. Tento link je možné sdílet.' + } + ,'Add new Subject' : { + cs: 'Přidat nový subjekt' + } + ,'Unable to %1 Subject' : { // PUT or POST + cs: 'Chyba volání %1 Subjektu:' + } + ,'Unable to delete Subject' : { + cs: 'Nelze odstranit Subjekt:' + } + ,'Database contains %1 subjects' : { + cs: 'Databáze obsahuje %1 subjektů' + } + ,'Edit Subject' : { + cs:'Editovat subjekt' + } + ,'person, device, etc' : { + cs:'osoba, zařízeni atd.' + } + ,'role1, role2' : { + cs:'role1, role2' + } + ,'Edit this subject' : { + cs:'Editovat tento subjekt' + } + ,'Delete this subject' : { + cs:'Smazat tento subjekt' + } + ,'Roles' : { + cs:'Role' + } + ,'Access Token' : { + cs:'Přístupový token' + } }; From 2b627f20caf8128c37e7f5423187ce49718735d7 Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Sat, 15 Oct 2016 11:25:38 +0200 Subject: [PATCH 08/21] translation of Snooze ... --- lib/client/index.js | 2 +- lib/language.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/client/index.js b/lib/client/index.js index 5bc1ce9a0a9..4cc716a8ed4 100644 --- a/lib/client/index.js +++ b/lib/client/index.js @@ -576,7 +576,7 @@ client.load = function load(serverSettings, callback) { silenceBtn.empty(); _.each(client.settings.snoozeMinsForAlarmEvent(notify), function eachOption (mins) { - var snoozeOption = $('
  • Silence for ' + mins + ' minutes
  • '); + var snoozeOption = $('
  • ' + client.translate('Silence for %1 minutes', { params: [mins] }) + '
  • '); snoozeOption.click(snoozeAlarm); silenceBtn.append(snoozeOption); }); diff --git a/lib/language.js b/lib/language.js index b6a2dc6fc91..58cf3ac83cb 100644 --- a/lib/language.js +++ b/lib/language.js @@ -7350,6 +7350,15 @@ function init() { ,'Access Token' : { cs:'Přístupový token' } + ,'hour ago' : { + cs:'hodina zpět' + } + ,'hours ago' : { + cs:'hodin zpět' + } + ,'Silence for %1 minutes' : { + cs:'Ztlumit na %1 minut' + } }; From e5b556cac8405c9fd54e94c78198206d64c3ecf7 Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Sat, 15 Oct 2016 16:09:54 +0200 Subject: [PATCH 09/21] /translations/ endpoint fix --- static/translations/js/translations.js | 88 ++++++++++++-------------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/static/translations/js/translations.js b/static/translations/js/translations.js index 1c026aa3e85..e3004900b84 100644 --- a/static/translations/js/translations.js +++ b/static/translations/js/translations.js @@ -1,50 +1,46 @@ (function () { - 'use strict'; - //for the tests window isn't the global object - var $ = window.$; - var _ = window._; - var Nightscout = window.Nightscout; - var client = Nightscout.client; + 'use strict'; + //for the tests window isn't the global object + var $ = window.$; + var _ = window._; + var Nightscout = window.Nightscout; + var client = Nightscout.client; - if (serverSettings === undefined) { - console.error('server settings were not loaded, will not call init'); - } else { - client.init(serverSettings, Nightscout.plugins); - } - - var language = client.language; - var result = {}; - - language.languages.forEach( function eachLanguage(l) { - result[l.code] = { total: 0, ok: 0, missing: 0, keys: [] }; - _.forEach(language.translations, function (n, t) { - result[l.code].total++; - if (language.translations[t][l.code]) { - result[l.code].ok++; - } else { - result[l.code].missing++; - result[l.code].keys.push(t); - } + client.init(Nightscout.plugins, function loaded() { + + var language = client.language; + var result = {}; + + language.languages.forEach(function eachLanguage(l) { + result[l.code] = {total: 0, ok: 0, missing: 0, keys: []}; + _.forEach(language.translations, function (n, t) { + result[l.code].total++; + if (language.translations[t][l.code]) { + result[l.code].ok++; + } else { + result[l.code].missing++; + result[l.code].keys.push(t); + } + }); + }); + + var table = $('').append(''); + language.languages.forEach(function eachLanguage(l) { + if (l.code === 'en') { + return; + } + var tr = $(''); + tr.append($('
    LanguageCodeTranslatedNot translatedPercentMissing
    ').append(l.language)); + tr.append($('').append(l.code)); + tr.append($('').append(result[l.code].ok)); + tr.append($('').append(result[l.code].missing)); + tr.append($('').append((result[l.code].ok / result[l.code].total * 100).toFixed(1) + '%')); + tr.append($('').attr('width', '300px').append(result[l.code].keys.join('
    '))); + + table.append(tr); + }); + + var placeholder = $('#translations'); + placeholder.html(table); }); - }); - - var table = $('').append(''); - language.languages.forEach( function eachLanguage(l) { - if (l.code === 'en') { - return; - } - var tr = $(''); - tr.append($('
    LanguageCodeTranslatedNot translatedPercentMissing
    ').append(l.language)); - tr.append($('').append(l.code)); - tr.append($('').append(result[l.code].ok)); - tr.append($('').append(result[l.code].missing)); - tr.append($('').append((result[l.code].ok / result[l.code].total * 100).toFixed(1) + '%')); - tr.append($('').attr('width','300px').append(result[l.code].keys.join('
    '))); - - table.append(tr); - }); - - var placeholder = $('#translations'); - placeholder.html(table); - })(); \ No newline at end of file From d8b46eecdd248e39e3cbe841c6e79229181b1de8 Mon Sep 17 00:00:00 2001 From: Jason Calabrese Date: Sat, 15 Oct 2016 10:54:20 -0700 Subject: [PATCH 10/21] refactor init so plugins can be localized --- bundle/bundle.source.js | 1 - lib/bootevent.js | 8 ++- lib/client/browser-settings.js | 8 +-- lib/client/index.js | 36 +++++++---- lib/data/dataloader.js | 2 +- lib/data/treatmenttocurve.js | 9 ++- lib/plugins/index.js | 88 +++++++++++++------------- lib/plugins/rawbg.js | 14 ++-- lib/report_plugins/daytoday.js | 4 +- server.js | 2 +- static/admin/js/admin.js | 2 +- static/food/js/food.js | 2 +- static/js/client.js | 2 +- static/js/init.js | 33 ---------- static/profile/js/profileeditor.js | 2 +- static/report/js/report.js | 4 +- static/translations/js/translations.js | 2 +- tests/admintools.test.js | 3 +- tests/api.entries.test.js | 3 +- tests/api.status.test.js | 4 +- tests/api.treatments.test.js | 3 +- tests/api.unauthorized.test.js | 3 +- tests/api.verifyauth.test.js | 4 +- tests/careportal.test.js | 3 +- tests/data.treatmenttocurve.test.js | 8 ++- tests/hashauth.test.js | 15 ++--- tests/pebble.test.js | 5 +- tests/plugins.test.js | 10 ++- tests/profileeditor.test.js | 3 +- tests/rawbg.test.js | 5 +- tests/reports.test.js | 3 +- tests/security.test.js | 3 +- tests/verifyauth.test.js | 3 +- 33 files changed, 149 insertions(+), 148 deletions(-) delete mode 100644 static/js/init.js diff --git a/bundle/bundle.source.js b/bundle/bundle.source.js index 3ad14260687..aa9d19e6f1d 100644 --- a/bundle/bundle.source.js +++ b/bundle/bundle.source.js @@ -11,7 +11,6 @@ window.Nightscout = { client: require('../lib/client') , units: require('../lib/units')() - , plugins: require('../lib/plugins/')().registerClientDefaults() , report_plugins: require('../lib/report_plugins/')() , admin_plugins: require('../lib/admin_plugins/')() }; diff --git a/lib/bootevent.js b/lib/bootevent.js index 2cd706ae55d..d1d0e09a6c4 100644 --- a/lib/bootevent.js +++ b/lib/bootevent.js @@ -4,9 +4,10 @@ var _ = require('lodash'); var UPDATE_THROTTLE = 1000; -function boot (env) { +function boot (env, language) { function checkEnv (ctx, next) { + ctx.language = language; if (env.err) { ctx.bootErrors = ctx.bootErrors || [ ]; ctx.bootErrors.push({'desc': 'ENV Error', err: env.err}); @@ -63,7 +64,10 @@ function boot (env) { /////////////////////////////////////////////////// // api and json object variables /////////////////////////////////////////////////// - ctx.plugins = require('./plugins')().registerServerDefaults().init(env.settings); + ctx.plugins = require('./plugins')({ + settings: env.settings + , language: ctx.language + }).registerServerDefaults(); ctx.pushover = require('./plugins/pushover')(env); ctx.maker = require('./plugins/maker')(env); diff --git a/lib/client/browser-settings.js b/lib/client/browser-settings.js index 070a82948a7..910214c4b63 100644 --- a/lib/client/browser-settings.js +++ b/lib/client/browser-settings.js @@ -203,10 +203,10 @@ function init (client, serverSettings, $) { showLocalstorageError(); } - client.plugins.init(settings); - - loadForm(); - wireForm(); + init.loadAndWireForm = function loadAndWireForm ( ) { + loadForm(); + wireForm(); + }; return settings; } diff --git a/lib/client/index.js b/lib/client/index.js index 4cc716a8ed4..864d9fa35ce 100644 --- a/lib/client/index.js +++ b/lib/client/index.js @@ -32,14 +32,8 @@ client.headers = function headers ( ) { } }; -client.init = function init(plugins, callback) { - - client.plugins = plugins = client.plugins || plugins; - client.rawbg = plugins('rawbg'); - client.delta = plugins('delta'); - client.timeago = plugins('timeago'); - client.direction = plugins('direction'); - client.errorcodes = plugins('errorcodes'); +client.init = function init(callback) { + client.browserUtils = require('./browser-utils')($); var token = client.browserUtils.queryParms().token; @@ -126,7 +120,26 @@ client.load = function load(serverSettings, callback) { .attr('class', 'tooltip') .style('opacity', 0); - client.settings = require('./browser-settings')(client, serverSettings, $); + var browserSettings = require('./browser-settings'); + client.settings = browserSettings(client, serverSettings, $); + + language.set(client.settings.language).DOMtranslate($); + client.translate = language.translate; + client.language = language; + + client.plugins = require('../plugins/')({ + settings: client.settings + , language: language + }).registerClientDefaults(); + + //After plugins are initialized with browser settings; + browserSettings.loadAndWireForm(); + + client.rawbg = client.plugins('rawbg'); + client.delta = client.plugins('delta'); + client.timeago = client.plugins('timeago'); + client.direction = client.plugins('direction'); + client.errorcodes = client.plugins('errorcodes'); client.ctx = { data: {} @@ -137,12 +150,7 @@ client.load = function load(serverSettings, callback) { }; client.utils = require('../utils')(client.ctx.settings); - client.sbx = sandbox.clientInit(client.ctx, client.now); - - language.set(client.settings.language).DOMtranslate($); - client.translate = language.translate; - client.language = language; client.renderer = require('./renderer')(client, d3, $); if (serverSettings && serverSettings.authorized) { diff --git a/lib/data/dataloader.js b/lib/data/dataloader.js index 54f4774cfa9..6d6a5f5a102 100644 --- a/lib/data/dataloader.js +++ b/lib/data/dataloader.js @@ -27,7 +27,7 @@ function init(env, ctx) { ddata.treatments = _.uniq(ddata.treatments, false, function (item) { return item._id.toString(); }); //sort treatments so the last is the most recent ddata.treatments = _.sortBy(ddata.treatments, function (item) { return item.mills; }); - fitTreatmentsToBGCurve(ddata, env.settings); + fitTreatmentsToBGCurve(ddata, env, ctx); if (err) { console.error(err); } diff --git a/lib/data/treatmenttocurve.js b/lib/data/treatmenttocurve.js index f8d96e5eb49..a96d3a795ce 100644 --- a/lib/data/treatmenttocurve.js +++ b/lib/data/treatmenttocurve.js @@ -1,9 +1,14 @@ 'use strict'; var _ = require('lodash'); -var rawbg = require('../plugins/rawbg')(); -module.exports = function fitTreatmentsToBGCurve (ddata, settings) { +module.exports = function fitTreatmentsToBGCurve (ddata, env, ctx) { + + var settings = env.settings; + var rawbg = require('../plugins/rawbg')({ + settings: settings + , language: ctx.language + }); function updateTreatmentBG(treatment) { diff --git a/lib/plugins/index.js b/lib/plugins/index.js index f9a9755319c..c874d968ef8 100644 --- a/lib/plugins/index.js +++ b/lib/plugins/index.js @@ -2,7 +2,7 @@ var _ = require('lodash'); -function init() { +function init (ctx) { var allPlugins = [] , enabledPlugins = []; @@ -18,48 +18,48 @@ function init() { plugins.base = require('./pluginbase'); var clientDefaultPlugins = [ - require('./bgnow')() - , require('./rawbg')() - , require('./direction')() - , require('./timeago')() - , require('./upbat')() - , require('./ar2')() - , require('./errorcodes')() - , require('./iob')() - , require('./cob')() - , require('./careportal')() - , require('./pump')() - , require('./openaps')() - , require('./loop')() - , require('./boluswizardpreview')() - , require('./cannulaage')() - , require('./sensorage')() - , require('./insulinage')() - , require('./basalprofile')() - , require('./boluscalc')() // fake plugin to show/hide - , require('./profile')() // fake plugin to hold extended settings + require('./bgnow')(ctx) + , require('./rawbg')(ctx) + , require('./direction')(ctx) + , require('./timeago')(ctx) + , require('./upbat')(ctx) + , require('./ar2')(ctx) + , require('./errorcodes')(ctx) + , require('./iob')(ctx) + , require('./cob')(ctx) + , require('./careportal')(ctx) + , require('./pump')(ctx) + , require('./openaps')(ctx) + , require('./loop')(ctx) + , require('./boluswizardpreview')(ctx) + , require('./cannulaage')(ctx) + , require('./sensorage')(ctx) + , require('./insulinage')(ctx) + , require('./basalprofile')(ctx) + , require('./boluscalc')(ctx) // fake plugin to show/hide + , require('./profile')(ctx) // fake plugin to hold extended settings ]; var serverDefaultPlugins = [ - require('./bgnow')() - , require('./rawbg')() - , require('./direction')() - , require('./upbat')() - , require('./ar2')() - , require('./simplealarms')() - , require('./errorcodes')() - , require('./iob')() - , require('./cob')() - , require('./pump')() - , require('./openaps')() - , require('./loop')() - , require('./boluswizardpreview')() - , require('./cannulaage')() - , require('./sensorage')() - , require('./insulinage')() - , require('./treatmentnotify')() - , require('./timeago')() - , require('./basalprofile')() + require('./bgnow')(ctx) + , require('./rawbg')(ctx) + , require('./direction')(ctx) + , require('./upbat')(ctx) + , require('./ar2')(ctx) + , require('./simplealarms')(ctx) + , require('./errorcodes')(ctx) + , require('./iob')(ctx) + , require('./cob')(ctx) + , require('./pump')(ctx) + , require('./openaps')(ctx) + , require('./loop')(ctx) + , require('./boluswizardpreview')(ctx) + , require('./cannulaage')(ctx) + , require('./sensorage')(ctx) + , require('./insulinage')(ctx) + , require('./treatmentnotify')(ctx) + , require('./timeago')(ctx) + , require('./basalprofile')(ctx) ]; plugins.registerServerDefaults = function registerServerDefaults() { @@ -76,13 +76,13 @@ function init() { _.each(all, function eachPlugin(plugin) { allPlugins.push(plugin); }); - }; - plugins.init = function initPlugins (settings) { enabledPlugins = []; + + var enable = _.get(ctx, 'settings.enable'); function isEnabled(plugin) { //TODO: unify client/server env/app - return settings.enable.indexOf(plugin.name) > -1; + return enable && enable.indexOf(plugin.name) > -1; } _.each(allPlugins, function eachPlugin(plugin) { @@ -91,7 +91,7 @@ function init() { enabledPlugins.push(plugin); } }); - return plugins; + }; plugins.eachPlugin = function eachPlugin(f) { diff --git a/lib/plugins/rawbg.js b/lib/plugins/rawbg.js index 346cdf491e0..3961abcdbac 100644 --- a/lib/plugins/rawbg.js +++ b/lib/plugins/rawbg.js @@ -2,7 +2,9 @@ var _ = require('lodash'); -function init() { +function init (ctx) { + + var translate = ctx.language.translate; var rawbg = { name: 'rawbg' @@ -79,13 +81,13 @@ function init() { var display; switch (parseInt(noise)) { case 0: display = '---'; break; - case 1: display = 'Clean'; break; - case 2: display = 'Light'; break; - case 3: display = 'Medium'; break; - case 4: display = 'Heavy'; break; + case 1: display = translate('Clean'); break; + case 2: display = translate('Light'); break; + case 3: display = translate('Medium'); break; + case 4: display = translate('Heavy'); break; default: if (mgdl < 40) { - display = 'Heavy'; + display = translate('Heavy'); } else { display = '~~~'; } diff --git a/lib/report_plugins/daytoday.js b/lib/report_plugins/daytoday.js index 7c885bbeaf4..6d0673729c3 100644 --- a/lib/report_plugins/daytoday.js +++ b/lib/report_plugins/daytoday.js @@ -314,7 +314,7 @@ daytoday.report = function report_daytoday(datastorage,sorteddaystoshow,options) cobpolyline += (xScale2(moment(from)) + padding.left) + ',' + (yCarbsScale(0) + padding.top) + ' '; for (var dt=moment(from); dt < to; dt.add(5, 'minutes')) { if (options.iob) { - var iob = Nightscout.plugins('iob').calcTotal(datastorage.treatments,datastorage.devicestatus,profile,dt.toDate()).iob; + var iob = client.plugins('iob').calcTotal(datastorage.treatments,datastorage.devicestatus,profile,dt.toDate()).iob; // make the graph discontinuous when data is missing if (iob === undefined) { iobpolyline += ', ' + (xScale2(lastDt) + padding.left) + ',' + (yInsulinScale(0) + padding.top); @@ -329,7 +329,7 @@ daytoday.report = function report_daytoday(datastorage,sorteddaystoshow,options) lastIOB = iob; } if (options.cob) { - var cob = Nightscout.plugins('cob').cobTotal(datastorage.treatments,datastorage.devicestatus,profile,dt.toDate()).cob; + var cob = client.plugins('cob').cobTotal(datastorage.treatments,datastorage.devicestatus,profile,dt.toDate()).cob; if (!dt.isSame(from)) { cobpolyline += ', '; } diff --git a/server.js b/server.js index d64c2918cff..642fe1ed73e 100644 --- a/server.js +++ b/server.js @@ -45,7 +45,7 @@ function create (app) { return transport.createServer(app); } -require('./lib/bootevent')(env).boot(function booted (ctx) { +require('./lib/bootevent')(env, language).boot(function booted (ctx) { var app = require('./app')(env, ctx); var server = create(app).listen(PORT, HOSTNAME); console.log(translate('Listening on port'), PORT, HOSTNAME); diff --git a/static/admin/js/admin.js b/static/admin/js/admin.js index 3900899b931..2421519a40b 100644 --- a/static/admin/js/admin.js +++ b/static/admin/js/admin.js @@ -6,7 +6,7 @@ var admin_plugins = Nightscout.admin_plugins; client.requiredPermission = '*'; - client.init(Nightscout.plugins, function loaded () { + client.init(function loaded () { // init HTML code admin_plugins.createHTML( client ); }); diff --git a/static/food/js/food.js b/static/food/js/food.js index d3a89d3d867..d743994d598 100644 --- a/static/food/js/food.js +++ b/static/food/js/food.js @@ -8,7 +8,7 @@ var client = Nightscout.client; (function () { -client.init(Nightscout.plugins, function loaded () { +client.init(function loaded () { var translate = client.translate; var foodrec_template = { diff --git a/static/js/client.js b/static/js/client.js index 4d9676365e4..df43f5229d8 100644 --- a/static/js/client.js +++ b/static/js/client.js @@ -1,3 +1,3 @@ 'use strict'; -window.Nightscout.client.init(Nightscout.plugins); +window.Nightscout.client.init(); diff --git a/static/js/init.js b/static/js/init.js deleted file mode 100644 index 0d0ac37a352..00000000000 --- a/static/js/init.js +++ /dev/null @@ -1,33 +0,0 @@ -// don't 'use strict' since we're setting serverSettings globally -serverSettings = { - 'status':'unauthorized', - 'name':'Nightscout', - 'version':'unknown', - 'apiEnabled':false, - 'careportalEnabled':false, - 'boluscalcEnabled':false, - 'settings':{ }, - 'extendedSettings':{ }, - 'authorized':null -}; - -var params = {}; -if (window.location.search) { - window.location.search.substr(1).split('&').forEach(function(item) { - params[item.split('=')[0]] = item.split('=')[1].replace(/[_\+]/g, ' '); - }); -} - -var token = params.token; -var secret = $.localStorage.get('apisecrethash'); - -var script = window.document.createElement('script'); -var src = '/api/v1/status.js?t=' + new Date().getTime(); - -if (secret) { - src += '&secret=' + secret; -} else if (token) { - src += '&token=' + token; -} -script.setAttribute('src', src); -window.document.body.appendChild(script); diff --git a/static/profile/js/profileeditor.js b/static/profile/js/profileeditor.js index 7a49449bb95..3afd13ee495 100644 --- a/static/profile/js/profileeditor.js +++ b/static/profile/js/profileeditor.js @@ -16,7 +16,7 @@ var timeInput = $('#pe_time'); var dateInput = $('#pe_date'); - client.init(Nightscout.plugins, function loaded () { + client.init(function loaded () { var translate = client.translate; diff --git a/static/report/js/report.js b/static/report/js/report.js index 6eec916b132..b933f33f07c 100644 --- a/static/report/js/report.js +++ b/static/report/js/report.js @@ -12,7 +12,7 @@ var client = Nightscout.client; var report_plugins = Nightscout.report_plugins; - client.init(Nightscout.plugins, function loaded () { + client.init(function loaded () { // init HTML code report_plugins.addHtmlFromPlugins( client ); @@ -720,7 +720,7 @@ var cal = data.cal[data.cal.length-1]; var temp1 = [ ]; - var rawbg = Nightscout.plugins('rawbg'); + var rawbg = client.rawbg; if (cal) { temp1 = data.sgv.map(function (entry) { entry.mgdl = entry.y; // value names changed from enchilada diff --git a/static/translations/js/translations.js b/static/translations/js/translations.js index e3004900b84..5d76e7bbaa4 100644 --- a/static/translations/js/translations.js +++ b/static/translations/js/translations.js @@ -6,7 +6,7 @@ var Nightscout = window.Nightscout; var client = Nightscout.client; - client.init(Nightscout.plugins, function loaded() { + client.init(function loaded() { var language = client.language; var result = {}; diff --git a/tests/admintools.test.js b/tests/admintools.test.js index cd009b17b95..59230ff71a2 100644 --- a/tests/admintools.test.js +++ b/tests/admintools.test.js @@ -175,7 +175,6 @@ describe('admintools', function ( ) { }); it ('should produce some html', function (done) { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -194,7 +193,7 @@ describe('admintools', function ( ) { return true; }; - client.init(plugins); + client.init(); client.dataUpdate(nowData); //var result = $('body').html(); diff --git a/tests/api.entries.test.js b/tests/api.entries.test.js index 4dbf626eada..dd3e1eb2cec 100644 --- a/tests/api.entries.test.js +++ b/tests/api.entries.test.js @@ -3,6 +3,7 @@ var request = require('supertest'); var load = require('./fixtures/load'); var bootevent = require('../lib/bootevent'); +var language = require('../lib/language')(); require('should'); describe('Entries REST api', function ( ) { @@ -17,7 +18,7 @@ describe('Entries REST api', function ( ) { this.app = require('express')( ); this.app.enable('api'); var self = this; - bootevent(env).boot(function booted (ctx) { + bootevent(env, language).boot(function booted (ctx) { self.app.use('/', entries(self.app, self.wares, ctx)); self.archive = require('../lib/entries')(env, ctx); diff --git a/tests/api.status.test.js b/tests/api.status.test.js index 8edb2a0cf36..1da9f793a98 100644 --- a/tests/api.status.test.js +++ b/tests/api.status.test.js @@ -1,6 +1,8 @@ 'use strict'; var request = require('supertest'); +var language = require('../lib/language')(); + require('should'); describe('Status REST api', function ( ) { @@ -14,7 +16,7 @@ describe('Status REST api', function ( ) { this.app = require('express')( ); this.app.enable('api'); var self = this; - require('../lib/bootevent')(env).boot(function booted (ctx) { + require('../lib/bootevent')(env, language).boot(function booted (ctx) { self.app.use('/api', api(env, ctx)); done(); }); diff --git a/tests/api.treatments.test.js b/tests/api.treatments.test.js index 0a84d6f8b5c..6a1608158c4 100644 --- a/tests/api.treatments.test.js +++ b/tests/api.treatments.test.js @@ -2,6 +2,7 @@ var request = require('supertest'); var should = require('should'); +var language = require('../lib/language')(); describe('Treatment API', function ( ) { this.timeout(2000); @@ -16,7 +17,7 @@ describe('Treatment API', function ( ) { this.wares = require('../lib/middleware/')(self.env); self.app = require('express')(); self.app.enable('api'); - require('../lib/bootevent')(self.env).boot(function booted(ctx) { + require('../lib/bootevent')(self.env, language).boot(function booted(ctx) { self.ctx = ctx; self.ctx.ddata = require('../lib/data/ddata')(); self.app.use('/api', api(self.env, ctx)); diff --git a/tests/api.unauthorized.test.js b/tests/api.unauthorized.test.js index ef5976ba1fb..23ff9c165c0 100644 --- a/tests/api.unauthorized.test.js +++ b/tests/api.unauthorized.test.js @@ -3,6 +3,7 @@ var request = require('supertest'); var load = require('./fixtures/load'); var should = require('should'); +var language = require('../lib/language')(); describe('authed REST api', function ( ) { var entries = require('../lib/api/entries/'); @@ -19,7 +20,7 @@ describe('authed REST api', function ( ) { this.app.enable('api'); var self = this; self.known_key = known; - require('../lib/bootevent')(env).boot(function booted (ctx) { + require('../lib/bootevent')(env, language).boot(function booted (ctx) { self.app.use('/', entries(self.app, self.wares, ctx)); self.archive = require('../lib/entries')(env, ctx); diff --git a/tests/api.verifyauth.test.js b/tests/api.verifyauth.test.js index 1cb9b295cae..6a7514a8349 100644 --- a/tests/api.verifyauth.test.js +++ b/tests/api.verifyauth.test.js @@ -1,6 +1,8 @@ 'use strict'; var request = require('supertest'); +var language = require('../lib/language')(); + require('should'); describe('Verifyauth REST api', function ( ) { @@ -13,7 +15,7 @@ describe('Verifyauth REST api', function ( ) { this.wares = require('../lib/middleware/')(self.env); self.app = require('express')( ); self.app.enable('api'); - require('../lib/bootevent')(self.env).boot(function booted (ctx) { + require('../lib/bootevent')(self.env, language).boot(function booted (ctx) { self.app.use('/api', api(self.env, ctx)); done(); }); diff --git a/tests/careportal.test.js b/tests/careportal.test.js index 8b7954df08d..83a3ce2ee41 100644 --- a/tests/careportal.test.js +++ b/tests/careportal.test.js @@ -35,7 +35,6 @@ describe('client', function ( ) { }); it ('open careportal, and enter a treatment', function (done) { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -46,7 +45,7 @@ describe('client', function ( ) { }; - client.init(plugins); + client.init(); client.dataUpdate(nowData); client.careportal.prepareEvents(); diff --git a/tests/data.treatmenttocurve.test.js b/tests/data.treatmenttocurve.test.js index 17ecf845926..2cdc5b0042d 100644 --- a/tests/data.treatmenttocurve.test.js +++ b/tests/data.treatmenttocurve.test.js @@ -20,7 +20,13 @@ describe('Data', function ( ) { , {_id: 'someid_4', mills: now + 60000, insulin: '1.00'} //without glucose, after sgvs , {_id: 'someid_5', mills: before - 120000, insulin: '1.00'} //without glucose, before sgvs ]; - fitTreatmentsToBGCurve(ddata, settings); + fitTreatmentsToBGCurve(ddata, { + settings: settings + } + , { + language: require('../lib/language')() + } + ); ddata.treatments[0].mgdl.should.equal(100); ddata.treatments[1].mmol.should.equal(5.5); ddata.treatments[2].mgdl.should.equal(95); diff --git a/tests/hashauth.test.js b/tests/hashauth.test.js index 6aadc634d04..46073983a5f 100644 --- a/tests/hashauth.test.js +++ b/tests/hashauth.test.js @@ -63,7 +63,6 @@ describe('hashauth', function ( ) { */ it ('should make module unauthorized', function () { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -73,7 +72,7 @@ describe('hashauth', function ( ) { next(true); }; - client.init(plugins); + client.init(); hashauth.inlineCode().indexOf('Not authorized').should.be.greaterThan(0); hashauth.isAuthenticated().should.equal(false); @@ -82,7 +81,6 @@ describe('hashauth', function ( ) { }); it ('should make module authorized', function () { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -92,14 +90,13 @@ describe('hashauth', function ( ) { next(true); }; - client.init(plugins); + client.init(); hashauth.inlineCode().indexOf('Admin authorized').should.be.greaterThan(0); hashauth.isAuthenticated().should.equal(true); }); it ('should store hash and the remove authentication', function () { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); var localStorage = require('./fixtures/localstorage'); @@ -113,7 +110,7 @@ describe('hashauth', function ( ) { }; hashauth.updateSocketAuth = function mockUpdateSocketAuth() {}; - client.init(plugins); + client.init(); hashauth.processSecret('this is my long pass phrase',true); @@ -126,7 +123,6 @@ describe('hashauth', function ( ) { }); it ('should not store hash', function () { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); var localStorage = require('./fixtures/localstorage'); @@ -139,7 +135,7 @@ describe('hashauth', function ( ) { next(true); }; - client.init(plugins); + client.init(); hashauth.processSecret('this is my long pass phrase',false); @@ -150,7 +146,6 @@ describe('hashauth', function ( ) { }); it ('should report secret too short', function () { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); var localStorage = require('./fixtures/localstorage'); @@ -159,7 +154,7 @@ describe('hashauth', function ( ) { hashauth.init(client, self.$); - client.init(plugins); + client.init(); window.alert = function mockConfirm (message) { function containsLine (line) { diff --git a/tests/pebble.test.js b/tests/pebble.test.js index 1571ad5a1ae..d26e5e64e77 100644 --- a/tests/pebble.test.js +++ b/tests/pebble.test.js @@ -2,6 +2,7 @@ var request = require('supertest'); var should = require('should'); +var language = require('../lib/language')(); //Mocked ctx var ctx = {}; @@ -92,7 +93,7 @@ describe('Pebble Endpoint', function ( ) { this.app = require('express')( ); this.app.enable('api'); var self = this; - bootevent(env).boot(function booted (context) { + bootevent(env, language).boot(function booted (context) { context.ddata = ctx.ddata.clone( ); self.app.use('/pebble', pebble(env, context)); done(); @@ -228,7 +229,7 @@ describe('Pebble Endpoint with Raw and IOB and COB', function ( ) { this.appRaw = require('express')( ); this.appRaw.enable('api'); var self = this; - bootevent(env).boot(function booted (context) { + bootevent(env, language).boot(function booted (context) { context.ddata = ctx.ddata.clone( ); self.appRaw.use('/pebble', pebbleRaw(env, context)); done(); diff --git a/tests/plugins.test.js b/tests/plugins.test.js index 6028b46cc7d..38f6c1898f4 100644 --- a/tests/plugins.test.js +++ b/tests/plugins.test.js @@ -6,7 +6,10 @@ describe('Plugins', function ( ) { it('should find client plugins, but not server only plugins', function (done) { - var plugins = require('../lib/plugins/')().registerClientDefaults(); + var plugins = require('../lib/plugins/')({ + settings: { } + , language: require('../lib/language')() + }).registerClientDefaults(); plugins('bgnow').name.should.equal('bgnow'); plugins('rawbg').name.should.equal('rawbg'); @@ -18,7 +21,10 @@ describe('Plugins', function ( ) { }); it('should find sever plugins, but not client only plugins', function (done) { - var plugins = require('../lib/plugins/')().registerServerDefaults(); + var plugins = require('../lib/plugins/')({ + settings: { } + , language: require('../lib/language')() + }).registerServerDefaults(); plugins('rawbg').name.should.equal('rawbg'); plugins('treatmentnotify').name.should.equal('treatmentnotify'); diff --git a/tests/profileeditor.test.js b/tests/profileeditor.test.js index fdff11b9fe9..ba68dde6c87 100644 --- a/tests/profileeditor.test.js +++ b/tests/profileeditor.test.js @@ -101,7 +101,6 @@ describe('Profile editor', function ( ) { }); it ('should produce some html', function (done) { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -120,7 +119,7 @@ describe('Profile editor', function ( ) { return true; }; - client.init(plugins); + client.init(); client.dataUpdate(nowData); //var result = $('body').html(); diff --git a/tests/rawbg.test.js b/tests/rawbg.test.js index b252f7b1b32..59aa3a2b11d 100644 --- a/tests/rawbg.test.js +++ b/tests/rawbg.test.js @@ -3,7 +3,10 @@ require('should'); describe('Raw BG', function ( ) { - var rawbg = require('../lib/plugins/rawbg')(); + var rawbg = require('../lib/plugins/rawbg')({ + settings: {} + , language: require('../lib/language')() + }); var sandbox = require('../lib/sandbox')(); var now = Date.now(); diff --git a/tests/reports.test.js b/tests/reports.test.js index b58867d52e9..b49ccd065af 100644 --- a/tests/reports.test.js +++ b/tests/reports.test.js @@ -204,7 +204,6 @@ describe('reports', function ( ) { it ('should produce some html', function (done) { - var plugins = require('../lib/plugins/')().registerClientDefaults(); var client = require('../lib/client'); var hashauth = require('../lib/hashauth'); @@ -226,7 +225,7 @@ describe('reports', function ( ) { call(); }; - client.init(plugins, function afterInit ( ) { + client.init(function afterInit ( ) { client.dataUpdate(nowData); // Load profile, we need to operate in UTC diff --git a/tests/security.test.js b/tests/security.test.js index 198cda6b4e3..80959cfeed3 100644 --- a/tests/security.test.js +++ b/tests/security.test.js @@ -3,13 +3,14 @@ var request = require('supertest'); var should = require('should'); var load = require('./fixtures/load'); +var language = require('../lib/language')(); describe('API_SECRET', function ( ) { var api = require('../lib/api/'); var scope = this; function setup_app (env, fn) { - require('../lib/bootevent')(env).boot(function booted (ctx) { + require('../lib/bootevent')(env, language).boot(function booted (ctx) { ctx.app = api(env, ctx); scope.app = ctx.app; scope.entries = ctx.entries; diff --git a/tests/verifyauth.test.js b/tests/verifyauth.test.js index 339f716264e..871dd56f176 100644 --- a/tests/verifyauth.test.js +++ b/tests/verifyauth.test.js @@ -1,13 +1,14 @@ 'use strict'; var request = require('supertest'); +var language = require('../lib/language')(); describe('verifyauth', function ( ) { var api = require('../lib/api/'); var scope = this; function setup_app (env, fn) { - require('../lib/bootevent')(env).boot(function booted (ctx) { + require('../lib/bootevent')(env, language).boot(function booted (ctx) { ctx.app = api(env, ctx); scope.app = ctx.app; fn(ctx); From f196b524a2de6317cb912c776d9b0d3faf44b545 Mon Sep 17 00:00:00 2001 From: mdomox Date: Sun, 16 Oct 2016 01:37:12 +0300 Subject: [PATCH 11/21] Update language.js --- lib/language.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/language.js b/lib/language.js index d06e1b01f5e..27051b10c2a 100644 --- a/lib/language.js +++ b/lib/language.js @@ -15,6 +15,7 @@ function init() { , { code: 'en', language: 'English' } , { code: 'es', language: 'Español' } , { code: 'fr', language: 'Français' } + , { code: 'el', language: 'Ελληνικά' } , { code: 'he', language: 'עברית' } , { code: 'hr', language: 'Hrvatski' } , { code: 'it', language: 'Italiano' } @@ -39,7 +40,8 @@ function init() { ,fr: 'Ecoute sur port' ,pt: 'Escutando porta' ,sv: 'Lyssnar på port' - ,ro: 'Activ pe portul' + , ro: 'Activ pe portul' + ,el: 'Σύνδεση στην πόρτα' ,bg: 'Активиране на порта' ,hr: 'Slušanje na portu' ,it: 'Porta in ascolto' @@ -59,7 +61,8 @@ function init() { cs: 'Po' ,de: 'Mo' ,es: 'Lu' - ,fr: 'Lu' + , fr: 'Lu' + ,el:'Δε' ,pt: 'Seg' ,sv: 'Mån' ,ro: 'Lu' @@ -80,7 +83,8 @@ function init() { cs: 'Út' ,de: 'Di' ,es: 'Mar' - ,fr: 'Ma' + , fr: 'Ma' + ,el: 'Τρ' ,pt: 'Ter' ,sv: 'Tis' ,ro: 'Ma' @@ -101,7 +105,8 @@ function init() { cs: 'St' ,de: 'Mi' ,es: 'Mie' - ,fr: 'Me' + , fr: 'Me' + ,el: 'Τε' ,pt: 'Qua' ,sv: 'Ons' ,ro: 'Mie' @@ -122,7 +127,8 @@ function init() { cs: 'Čt' ,de: 'Do' ,es: 'Jue' - ,fr: 'Je' + , fr: 'Je' + ,el: 'Πε' ,pt: 'Qui' ,sv: 'Tor' ,ro: 'Jo' @@ -7244,36 +7250,42 @@ function init() { ,ro: 'Insulină bolusată:' ,ru: 'Болюс инсулин' ,ko: 'Bolus 인슐린' + ,de: 'Bolus Insulin:' } ,'Base basal insulin:' : { cs:'Základní bazální inzulín:' ,ro: 'Bazala obișnuită:' ,ru: 'Основной базал инсулин' ,ko: '기본 basal 인슐린' + ,de: 'Basis Basal Insulin:' } ,'Positive temp basal insulin:' : { cs:'Pozitivní dočasný bazální inzulín:' ,ro: 'Bazala temporară crescută:' ,ru: 'Положит знач временн базал инс ' ,ko: '임시 basal 인슐린 남아 있습니다.' + ,de: 'Positives temporäres Basal Insulin:' } ,'Negative temp basal insulin:' : { cs:'Negativní dočasný bazální inzulín:' ,ro: 'Bazala temporară scăzută:' ,ru: 'Отриц знач временн базал инс' ,ko: '임시 basal 인슐린 남아 있지 않습니다.' + ,de: 'Negatives temporäres Basal Insulin:' } ,'Total basal insulin:' : { cs:'Celkový bazální inzulín:' ,ro: 'Bazala totală:' ,ru: 'Всего базал инсулина' ,ko: '전체 basal 인슐린' + ,de: 'Gesamt Basal Insulin:' } ,'Total daily insulin:' : { cs:'Celkový denní inzulín:' ,ro: 'Insulina totală zilnică:' ,ru: 'Всего ежедн базал инсулина' ,ko: '전체 하루 인슐린' + ,de: 'Gesamtes tägliches Insulin:' } }; From f44bf27538da69a6f77bb9d4aa2052c7ff4c72b5 Mon Sep 17 00:00:00 2001 From: mdomox Date: Sun, 16 Oct 2016 01:56:15 +0300 Subject: [PATCH 12/21] Update language.js --- lib/language.js | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/language.js b/lib/language.js index 27051b10c2a..ac38f73cad1 100644 --- a/lib/language.js +++ b/lib/language.js @@ -83,7 +83,7 @@ function init() { cs: 'Út' ,de: 'Di' ,es: 'Mar' - , fr: 'Ma' + ,fr: 'Ma' ,el: 'Τρ' ,pt: 'Ter' ,sv: 'Tis' @@ -150,6 +150,7 @@ function init() { ,de: 'Fr' ,es: 'Vie' ,fr: 'Ve' + ,el: 'Πα' ,pt: 'Sex' ,sv: 'Fre' ,ro: 'Vi' @@ -171,6 +172,7 @@ function init() { ,de: 'Sa' ,es: 'Sab' ,fr: 'Sa' + ,el: 'Σα' ,pt: 'Sab' ,sv: 'Lör' ,ro: 'Sa' @@ -192,6 +194,7 @@ function init() { ,de: 'So' ,es: 'Dom' ,fr: 'Di' + ,el: 'Κυ' ,pt: 'Dom' ,sv: 'Sön' ,ro: 'Du' @@ -213,6 +216,7 @@ function init() { ,de: 'Montag' ,es: 'Lunes' ,fr: 'Lundi' + ,el: 'Δευτέρα' ,pt: 'Segunda' ,sv: 'Måndag' ,ro: 'Luni' @@ -234,6 +238,7 @@ function init() { ,de: 'Dienstag' ,es: 'Martes' ,fr: 'Mardi' + ,el: 'Τρίτη' ,pt: 'Terça' ,ro: 'Marți' ,bg: 'Вторник' @@ -255,6 +260,7 @@ function init() { ,de: 'Mittwoch' ,es: 'Miércoles' ,fr: 'Mercredi' + ,el: 'Τετάρτη' ,pt: 'Quarta' ,sv: 'Onsdag' ,ro: 'Miercuri' @@ -276,6 +282,7 @@ function init() { ,de: 'Donnerstag' ,es: 'Jueves' ,fr: 'Jeudi' + ,el: 'Πέμπτη' ,pt: 'Quinta' ,sv: 'Torsdag' ,ro: 'Joi' @@ -296,6 +303,7 @@ function init() { cs: 'Pátek' ,de: 'Freitag' ,fr: 'Vendredi' + ,el: 'Παρασκευή' ,pt: 'Sexta' ,sv: 'Fredag' ,ro: 'Vineri' @@ -318,6 +326,7 @@ function init() { ,de: 'Samstag' ,es: 'Sábado' ,fr: 'Samedi' + ,el: 'Σάββατο' ,pt: 'Sábado' ,ro: 'Sâmbătă' ,bg: 'Събота' @@ -339,6 +348,7 @@ function init() { ,de: 'Sonntag' ,es: 'Domingo' ,fr: 'Dimanche' + ,el: 'Κυριακή' ,pt: 'Domingo' ,ro: 'Duminică' ,bg: 'Неделя' @@ -360,6 +370,7 @@ function init() { ,de: 'Kategorie' ,es: 'Categoría' ,fr: 'Catégorie' + ,el: 'Κατηγορία' ,pt: 'Categoria' ,sv: 'Kategori' ,ro: 'Categorie' @@ -381,6 +392,7 @@ function init() { ,de: 'Unterkategorie' ,es: 'Subcategoría' ,fr: 'Sous-catégorie' + ,el: 'Υποκατηγορία' ,pt: 'Subcategoria' ,sv: 'Underkategori' ,ro: 'Subcategorie' @@ -402,6 +414,7 @@ function init() { ,de: 'Name' ,es: 'Nombre' ,fr: 'Nom' + ,el: 'Όνομα' ,pt: 'Nome' ,sv: 'Namn' ,ro: 'Nume' @@ -423,6 +436,7 @@ function init() { ,de: 'Heute' ,es: 'Hoy' ,fr: 'Aujourd\'hui' + ,el: 'Σήμερα' ,pt: 'Hoje' ,ro: 'Astăzi' ,bg: 'Днес' @@ -444,6 +458,7 @@ function init() { ,de: 'Letzten 2 Tage' ,es: 'Últimos 2 días' ,fr: '2 derniers jours' + ,el: 'Τελευταίες 2 μέρες' ,pt: 'Últimos 2 dias' ,ro: 'Ultimele 2 zile' ,bg: 'Последните 2 дни' @@ -465,6 +480,7 @@ function init() { ,de: 'Letzten 3 Tage' ,es: 'Últimos 3 días' ,fr: '3 derniers jours' + ,el: 'Τελευταίες 3 μέρες' ,pt: 'Últimos 3 dias' ,sv: 'Senaste 3 dagarna' ,ro: 'Ultimele 3 zile' @@ -486,6 +502,7 @@ function init() { ,de: 'Letzte Woche' ,es: 'Semana pasada' ,fr: 'Semaine Dernière' + ,el: 'Τελευταία εβδομάδα' ,pt: 'Semana passada' ,ro: 'Săptămâna trecută' ,bg: 'Последната седмица' @@ -507,6 +524,7 @@ function init() { ,de: 'Letzten 2 Wochen' ,es: 'Últimas 2 semanas' ,fr: '2 dernières semaines' + ,el: 'Τελευταίες 2 εβδομάδες' ,pt: 'Últimas 2 semanas' ,ro: 'Ultimele 2 săptămâni' ,bg: 'Последните 2 седмици' @@ -528,6 +546,7 @@ function init() { ,de: 'Letzter Monat' ,es: 'Mes pasado' ,fr: 'Mois dernier' + ,el: 'Τελευταίος μήνας' ,pt: 'Mês passado' ,ro: 'Ultima lună' ,bg: 'Последният месец' @@ -549,6 +568,7 @@ function init() { ,de: 'Letzten 3 Monate' ,es: 'Últimos 3 meses' ,fr: '3 derniers mois' + ,el: 'Τελευταίοι 3 μήνες' ,pt: 'Últimos 3 meses' ,ro: 'Ultimele 3 luni' ,bg: 'Последните 3 месеца' @@ -570,6 +590,7 @@ function init() { ,de: 'Von' ,es: 'Desde' ,fr: 'De' + ,el: 'Από' ,pt: 'De' ,sv: 'Från' ,ro: 'De la' @@ -591,6 +612,7 @@ function init() { ,de: 'Bis' ,es: 'Hasta' ,fr: 'À' + ,el: 'Έως' ,pt: 'a' ,ro: 'La' ,bg: 'До' @@ -612,6 +634,7 @@ function init() { ,de: 'Notiz' ,es: 'Notas' ,fr: 'Notes' + ,el: 'Σημειώσεις' ,pt: 'Notas' ,sv: 'Notering' ,ro: 'Note' @@ -633,6 +656,7 @@ function init() { ,de: 'Ernährung' ,es: 'Comida' ,fr: 'Nourriture' + ,el: 'Φαγητό' ,pt: 'Comida' ,sv: 'Föda' ,ro: 'Mâncare' @@ -654,6 +678,7 @@ function init() { ,de: 'Insulin' ,es: 'Insulina' ,fr: 'Insuline' + ,el: 'Ινσουλίνη' ,pt: 'Insulina' ,ro: 'Insulină' ,bg: 'Инсулин' @@ -675,6 +700,7 @@ function init() { ,de: 'Kohlenhydrate' ,es: 'Hidratos de carbono' ,fr: 'Glucides' + ,el: 'Υδατάνθρακες' ,pt: 'Carboidrato' ,ro: 'Carbohidrați' ,bg: 'Въглехидрати' @@ -696,6 +722,7 @@ function init() { ,de: 'Erläuterungen' ,es: 'Contenido de las notas' ,fr: 'Notes contiennent' + ,el: 'Οι σημειώσεις περιέχουν' ,pt: 'Notas contém' ,ro: 'Conținut note' ,bg: 'бележките съдържат' @@ -716,6 +743,7 @@ function init() { ,de: 'Vorgabe unteres BG-Ziel' ,es: 'Objetivo inferior de glucemia' ,fr: 'Limite inférieure glycémie' + ,el: 'Στόχος γλυκόζης - Κάτω όριο' ,pt: 'Limite inferior de glicemia' ,ro: 'Limită de jos a glicemiei' ,bg: 'Долна граница на КЗ' @@ -737,6 +765,7 @@ function init() { ,de: 'oben' ,es: 'Superior' ,fr: 'Supérieur' + ,el: 'Πάνω όριο' ,pt: 'Superior' ,ro: 'Sus' ,bg: 'горна' @@ -758,6 +787,7 @@ function init() { ,de: 'Zeigen' ,es: 'Mostrar' ,fr: 'Montrer' + ,el: 'Εμφάνιση' ,pt: 'Mostrar' ,ro: 'Arată' ,sv: 'Visa' @@ -779,6 +809,7 @@ function init() { ,de: 'Darstellen' ,es: 'Visualizar' ,fr: 'Afficher' + ,el: 'Εμφάνιση' ,pt: 'Visualizar' ,ro: 'Afișează' ,bg: 'Покажи' @@ -800,6 +831,7 @@ function init() { ,de: 'Laden' ,es: 'Cargando' ,fr: 'Chargement' + ,el: 'Φορτώνει' ,pt: 'Carregando' ,ro: 'Se încarcă' ,bg: 'Зареждане' From 205edca98b618d5f6fdd3ca249b7a677d3d145d0 Mon Sep 17 00:00:00 2001 From: mdomox Date: Sun, 16 Oct 2016 03:03:08 +0300 Subject: [PATCH 13/21] Update language.js Reports translated. Work in progress --- lib/language.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/lib/language.js b/lib/language.js index ac38f73cad1..ee49006a4be 100644 --- a/lib/language.js +++ b/lib/language.js @@ -831,7 +831,7 @@ function init() { ,de: 'Laden' ,es: 'Cargando' ,fr: 'Chargement' - ,el: 'Φορτώνει' + ,el: 'Ανάκτηση' ,pt: 'Carregando' ,ro: 'Se încarcă' ,bg: 'Зареждане' @@ -853,6 +853,7 @@ function init() { ,de: 'Lade Profil' ,es: 'Cargando perfil' ,fr: 'Chargement du profil' + ,el: 'Ανάκτηση Προφίλ' ,pt: 'Carregando perfil' ,sv: 'Laddar profil' ,ro: 'Încarc profilul' @@ -874,6 +875,7 @@ function init() { ,de: 'Lade Status' ,es: 'Cargando estado' ,fr: 'Statut du chargement' + ,el: 'Ανάκτηση Κατάστασης' ,pt: 'Carregando status' ,sv: 'Laddar status' ,ro: 'Încarc statusul' @@ -895,6 +897,7 @@ function init() { ,de: 'Lade Ernährungs-Datenbank' ,es: 'Cargando base de datos de alimentos' ,fr: 'Chargement de la base de données alimentaire' + ,el: 'Ανάκτηση Βάσης Δεδομένων Φαγητών' ,pt: 'Carregando dados de alimentos' ,sv: 'Laddar födoämnesdatabas' ,ro: 'Încarc baza de date de alimente' @@ -916,6 +919,7 @@ function init() { ,de: 'nicht angezeigt' ,es: 'No mostrado' ,fr: 'non affiché' + ,el: 'Δεν προβάλλεται' ,pt: 'não mostrado' ,ro: 'neafișat' ,bg: 'Не се показва' @@ -937,6 +941,7 @@ function init() { ,de: 'Lade CGM-Daten von' ,es: 'Cargando datos de CGM de' ,fr: 'Chargement données CGM de' + ,el: 'Ανάκτηση δεδομένων CGM' ,pt: 'Carregando dados de CGM de' ,sv: 'Laddar CGM-data för' ,ro: 'Încarc datele CGM ale lui' @@ -958,6 +963,7 @@ function init() { ,de: 'Lade Behandlungsdaten von' ,es: 'Cargando datos de tratamientos de' ,fr: 'Chargement données traitement de' + ,el: 'Ανάκτηση δεδομένων ενεργειών' ,pt: 'Carregando dados de tratamento de' ,sv: 'Laddar behandlingsdata för' ,ro: 'Încarc datele despre tratament pentru' @@ -979,6 +985,7 @@ function init() { ,de: 'Verarbeite Daten von' ,es: 'Procesando datos de' ,fr: 'Traitement des données de' + ,el: 'Επεξεργασία Δεδομένων' ,pt: 'Processando dados de' ,sv: 'Behandlar data för' ,ro: 'Procesez datele pentru' @@ -1000,6 +1007,7 @@ function init() { ,de: 'Portion' ,es: 'Porción' ,fr: 'Portion' + ,el: 'Μερίδα' ,pt: 'Porção' ,ro: 'Porție' ,bg: 'Порция' @@ -1021,6 +1029,7 @@ function init() { ,de: 'Größe' ,es: 'Tamaño' ,fr: 'Taille' + ,el: 'Μέγεθος' ,pt: 'Tamanho' ,ro: 'Mărime' ,sv: 'Storlek' @@ -1042,6 +1051,7 @@ function init() { ,de: '(nichts)' ,es: '(ninguno)' ,fr: '(aucun)' + ,el: '(κενό)' ,pt: '(nenhum)' ,sv: '(tom)' ,ro: '(fără)' @@ -1063,6 +1073,7 @@ function init() { ,de: 'Nichts' ,es: 'Ninguno' ,fr: 'aucun' + ,el: 'Κενό' ,pt: 'nenhum' ,sv: 'tom' ,ro: 'fără' @@ -1084,6 +1095,7 @@ function init() { ,de: '' ,es: '' ,fr: '' + ,el: '<κενό>' ,pt: '' ,sv: '' ,ro: '' @@ -1105,6 +1117,7 @@ function init() { ,de: 'Ergebnis ist leer' ,es: 'Resultado vacío' ,fr: 'Pas de résultat' + ,el: 'Δεν υπάρχουν αποτελέσματα' ,pt: 'Resultado vazio' ,sv: 'Resultat saknas' ,ro: 'Fără rezultat' @@ -1126,6 +1139,7 @@ function init() { ,de: 'Von Tag zu Tag' ,es: 'Día a día' ,fr: 'jour par jour' + ,el: 'Ανά ημέρα' ,pt: 'Dia a dia' ,sv: 'Dag för dag' ,ro: 'Zi cu zi' @@ -1147,6 +1161,7 @@ function init() { ,de: 'Tägliche Statistik' ,es: 'Estadísticas diarias' ,fr: 'Stats quotidiennes' + ,el: 'Ημερήσια Στατιστικά' ,pt: 'Estatísticas diárias' ,sv: 'Dygnsstatistik' ,ro: 'Statistici zilnice' @@ -1168,6 +1183,7 @@ function init() { ,de: 'Perzentil-Diagramm' ,es: 'Percentiles' ,fr: 'Percentiles' + ,el: 'Γράφημα Εκατοστημορίων' ,pt: 'Percentis' ,ro: 'Grafic percentile' ,bg: 'Процентна графика' @@ -1189,6 +1205,7 @@ function init() { ,de: 'Verteilung' ,es: 'Distribución' ,fr: 'Distribution' + ,el: 'Κατανομή' ,pt: 'Distribuição' ,ro: 'Distribuție' ,bg: 'Разпределение' @@ -1210,6 +1227,7 @@ function init() { ,de: 'Stündliche Statistik' ,es: 'Estadísticas por hora' ,fr: 'Statistiques horaires' + ,el: 'Ωριαία Στατιστικά' ,pt: 'Estatísticas por hora' ,sv: 'Timmstatistik' ,ro: 'Statistici orare' @@ -1231,6 +1249,7 @@ function init() { ,de: 'Wöchentlicher Erfolg' ,es: 'Resultados semanales' ,fr: 'Résultat hebdomadaire' + ,el: 'Εβδομαδιαία Στατιστικά' ,pt: 'Resultados semanais' ,ro: 'Rezultate săptămânale' ,bg: 'Седмичен успех' @@ -1251,6 +1270,7 @@ function init() { ,de: 'Keine Daten verfügbar' ,es: 'No hay datos disponibles' ,fr: 'Pas de données disponibles' + ,el: 'Μη διαθέσιμα δεδομένα' ,pt: 'Não há dados' ,ro: 'Fără date' ,bg: 'Няма данни за показване' @@ -1272,6 +1292,7 @@ function init() { ,de: 'Tief' ,es: 'Bajo' ,fr: 'Bas' + ,el: 'Χαμηλά' ,pt: 'Baixo' ,sv: 'Låg' ,ro: 'Prea jos' @@ -1293,6 +1314,7 @@ function init() { ,de: 'Im Zielbereich' ,es: 'En rango' ,fr: 'dans la norme' + ,el: 'Στο στόχο' ,pt: 'Na meta' ,sv: 'Inom intervallet' ,ro: 'În interval' @@ -1314,6 +1336,7 @@ function init() { ,de: 'Periode' ,es: 'Periodo' ,fr: 'Période' + ,el: 'Περίοδος' ,pt: 'Período' ,sv: 'Period' ,ro: 'Perioada' @@ -1335,6 +1358,7 @@ function init() { ,de: 'Hoch' ,es: 'Alto' ,fr: 'Haut' + ,el: 'Υψηλά' ,pt: 'Alto' ,sv: 'Hög' ,ro: 'Prea sus' @@ -1356,6 +1380,7 @@ function init() { ,de: 'Mittelwert' ,es: 'Media' ,fr: 'Moyenne' + ,el: 'Μέσος Όρος' ,pt: 'Média' ,sv: 'Genomsnittligt' ,ro: 'Media' @@ -1377,6 +1402,7 @@ function init() { ,de: 'Unteres Quartil' ,es: 'Cuartil inferior' ,fr: 'Quartile inférieur' + ,el: 'Τεταρτημόριο Χαμηλών' ,pt: 'Quartil inferior' ,ro: 'Pătrime inferioară' ,bg: 'Ниска четвъртинка' @@ -1398,6 +1424,7 @@ function init() { ,de: 'Oberes Quartil' ,es: 'Cuartil superior' ,fr: 'Quartile supérieur' + ,el: 'Τεταρτημόριο Υψηλών' ,pt: 'Quartil superior' ,ro: 'Pătrime superioară' ,bg: 'Висока четвъртинка' @@ -1419,6 +1446,7 @@ function init() { ,de: 'Quartil' ,es: 'Cuartil' ,fr: 'Quartile' + ,el: 'Τεταρτημόριο' ,pt: 'Quartil' ,ro: 'Pătrime' ,bg: 'Четвъртинка' @@ -1440,6 +1468,7 @@ function init() { ,de: 'Datum' ,es: 'Fecha' ,fr: 'Date' + ,el: 'Ημερομηνία' ,pt: 'Data' ,sv: 'Datum' ,ro: 'Data' @@ -1461,6 +1490,7 @@ function init() { ,de: 'Normal' ,es: 'Normal' ,fr: 'Normale' + ,el: 'Εντός Στόχου' ,pt: 'Normal' ,sv: 'Normal' ,ro: 'Normal' @@ -1481,6 +1511,7 @@ function init() { ,de: 'Median' ,es: 'Mediana' ,fr: 'Médiane' + ,el: 'Διάμεσος' ,pt: 'Mediana' ,ro: 'Mediană' ,bg: 'Средно' @@ -1502,6 +1533,7 @@ function init() { ,de: 'Messwerte' ,es: 'Valores' ,fr: 'Valeurs' + ,el: 'Μετρήσεις' ,pt: 'Valores' ,sv: 'Avläsningar' ,ro: 'Valori' @@ -1523,6 +1555,7 @@ function init() { ,de: 'Standardabweichung' ,es: 'Desviación estándar' ,fr: 'Déviation St.' + ,el: 'Τυπική Απόκλιση' ,pt: 'DesvPadr' ,sv: 'StdDev' ,ro: 'Standarddeviation' @@ -1543,6 +1576,7 @@ function init() { ,de: 'Tagesstatistik Bericht' ,es: 'Informe de estadísticas diarias' ,fr: 'Rapport quotidien' + ,el: 'Ημερήσια Στατιστικά' ,pt: 'Relatório diário' ,ro: 'Raport statistică zilnică' ,bg: 'Дневна статистика' @@ -1564,6 +1598,7 @@ function init() { ,de: 'Glukose-Perzentil Bericht' ,es: 'Informe de percetiles de glucemia' ,fr: 'Rapport percentiles Glycémie' + ,el: 'Αναφορά Εκατοστημοριακής Κατάταξης τιμών Γλυκόζης' ,pt: 'Relatório de Percentis de Glicemia' ,sv: 'Glukosrapport i procent' ,ro: 'Raport percentile glicemii' @@ -1584,6 +1619,7 @@ function init() { ,de: 'Glukose Verteilung' ,es: 'Distribución de glucemias' ,fr: 'Distribution glycémies' + ,el: 'Κατανομή Τιμών Γλυκόζης' ,pt: 'Distribuição de glicemias' ,ro: 'Distribuție glicemie' ,bg: 'Разпределение на КЗ' @@ -1605,6 +1641,7 @@ function init() { ,de: 'Gesamttage' ,es: 'Total de días' ,fr: 'jours totaux' + ,el: 'ημέρες συνολικά' ,pt: 'dias no total' ,sv: 'antal dagar' ,ro: 'total zile' @@ -1626,6 +1663,7 @@ function init() { ,de: 'Insgesamt' ,es: 'General' ,fr: 'En général' + ,el: 'Σύνολο' ,pt: 'Geral' ,sv: 'Genomsnitt' ,ro: 'General' @@ -1647,6 +1685,7 @@ function init() { ,de: 'Bereich' ,es: 'Intervalo' ,fr: 'Intervalle' + ,el: 'Διάστημα' ,pt: 'intervalo' ,sv: 'Intervall' ,ro: 'Interval' @@ -1668,6 +1707,7 @@ function init() { ,de: '% der Messwerte' ,es: '% de valores' ,fr: '% de valeurs' + ,el: '% των μετρήσεων' ,pt: '% de valores' ,sv: '& av avläsningar' ,ro: '% de valori' @@ -1689,6 +1729,7 @@ function init() { ,de: '# des Messwerts' ,es: 'N° de valores' ,fr: 'nbr de valeurs' + ,el: 'Πλήθος μετρήσεων' ,pt: 'N° de valores' ,sv: '# av avläsningar' ,ro: 'nr. de valori' @@ -1710,6 +1751,7 @@ function init() { ,de: 'Mittelwert' ,es: 'Media' ,fr: 'Moyenne' + ,el: 'Μέσος Όρος' ,pt: 'Média' ,sv: 'Genomsnitt' ,ro: 'Medie' @@ -1731,6 +1773,7 @@ function init() { ,de: 'Standardabweichung' ,es: 'Desviación estándar' ,fr: 'Déviation Standard' + ,el: 'Τυπική Απόκλιση' ,pt: 'Desvio padrão' ,ro: 'Deviație standard' ,bg: 'Стандартно отклонение' @@ -1752,6 +1795,7 @@ function init() { ,de: 'Max' ,es: 'Max' ,fr: 'Max' + ,el: 'Μέγιστο' ,pt: 'Máx' ,sv: 'Max' ,ro: 'Max' @@ -1773,6 +1817,7 @@ function init() { ,de: 'Min' ,es: 'Min' ,fr: 'Min' + ,el: 'Ελάχιστο' ,pt: 'Mín' ,sv: 'Min' ,ro: 'Min' @@ -1794,6 +1839,7 @@ function init() { ,de: 'Einschätzung HbA1c*' ,es: 'Estimación de HbA1c*' ,fr: 'Estimation HbA1c*' + ,el: 'Εκτίμηση HbA1c' ,pt: 'HbA1c estimada*' ,ro: 'HbA1C estimată' ,bg: 'Очакван HbA1c' @@ -1815,6 +1861,7 @@ function init() { ,de: 'Wöchtlicher Erfolg' ,es: 'Resultados semanales' ,fr: 'Réussite hebdomadaire' + ,el: 'Εβδομαδιαία Στατιστικά' ,pt: 'Resultados semanais' ,ro: 'Rezultate săptămânale' ,bg: 'Седмичен успех' @@ -1835,6 +1882,7 @@ function init() { ,de: 'Für diesen Bericht sind nicht genug Daten verfügbar. Bitte weitere Tage auswählen.' ,es: 'No hay datos suficientes para generar este informe. Seleccione más días.' ,fr: 'Pas assez de données pour un rapport. Sélectionnez plus de jours.' + ,el: 'Μη επαρκή δεδομένα για αυτή την αναφορά.Παρακαλώ επιλέξτε περισσότερες ημέρες' ,pt: 'Não há dados suficientes. Selecione mais dias' ,ro: 'Nu sunt sufieciente date pentru acest raport. Selectați mai multe zile.' ,bg: 'Няма достатъчно данни за показване. Изберете повече дни.' From e838dcf1d393c3cc1cda73378e5af225fc14cfa8 Mon Sep 17 00:00:00 2001 From: Bog Dan Date: Sun, 16 Oct 2016 09:07:37 +0300 Subject: [PATCH 14/21] RO translation for 0.9 main Added admin section --- lib/language.js | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/language.js b/lib/language.js index 58cf3ac83cb..6ac7bcc48ec 100644 --- a/lib/language.js +++ b/lib/language.js @@ -7277,87 +7277,114 @@ function init() { } ,'Unable to %1 Role' : { // PUT or POST cs: 'Chyba volání %1 Role:' + ,ro: 'Imposibil de %1 Rolul' } ,'Unable to delete Role' : { cs: 'Nelze odstranit Roli:' + ,ro: 'Imposibil de șters Rolul' } ,'Database contains %1 roles' : { cs: 'Databáze obsahuje %1 rolí' + ,ro: 'Baza de date conține %1 rol(uri)' } ,'Edit Role' : { cs:'Editovat roli' + ,ro: 'Editează Rolul' } ,'admin, school, family, etc' : { cs: 'administrátor, škola, rodina atd...' + ,ro: 'administrator, școală, familie, etc' } ,'Permissions' : { cs: 'Oprávnění' + ,ro: 'Permisiuni' } ,'Are you sure you want to delete: ' : { cs: 'Opravdu vymazat: ' + ,ro: 'Confirmați ștergerea: ' } ,'Each role will have a 1 or more permissions. The * permission is a wildcard, permissions are a hierarchy using : as a seperator.' : { cs: 'Každá role má 1 nebo více oprávnění. Oprávnění * je zástupný znak, oprávnění jsou hiearchie používající : jako oddělovač.' - } + ,ro: 'Fiecare rol va avea cel puțin o permisiune. Permisiunea * este totală, permisiunile sunt ierarhice utilizând : pe post de separator.' + } ,'Add new Role' : { cs: 'Přidat novou roli' + ,ro: 'Adaugă un Rol nou' } ,'Roles - Groups of People, Devices, etc' : { cs: 'Role - Skupiny lidí, zařízení atd.' + ,ro: 'Roluri - Grupuri de persoane, dispozitive, etc' } ,'Edit this role' : { cs: 'Editovat tuto roli' + ,ro: 'Editează acest rol' } ,'Admin authorized' : { cs: 'Admin autorizován' + ,ro: 'Autorizat de admin' } ,'Subjects - People, Devices, etc' : { cs: 'Subjekty - Lidé, zařízení atd.' + ,ro: 'Subiecte - Persoane, dispozitive, etc' } ,'Each subject will have a unique access token and 1 or more roles. Click on the access token to open a new view with the selected subject, this secret link can then be shared.' : { cs: 'Každý subjekt má svůj unikátní token a 1 nebo více rolí. Klikem na přístupový token se otevře nové okno pro tento subjekt. Tento link je možné sdílet.' + ,ro: 'Fiecare subiect va avea o cheie unică de acces și unul sau mai multe roluri. Apăsați pe cheia de acces pentru a vizualiza subiectul selectat, acest link poate fi distribuit.' } ,'Add new Subject' : { cs: 'Přidat nový subjekt' + ,ro: 'Adaugă un Subiect nou' } ,'Unable to %1 Subject' : { // PUT or POST cs: 'Chyba volání %1 Subjektu:' + ,ro: 'Imposibil de %1 Subiectul' } ,'Unable to delete Subject' : { cs: 'Nelze odstranit Subjekt:' + ,ro: 'Imposibil de șters Subiectul' } ,'Database contains %1 subjects' : { cs: 'Databáze obsahuje %1 subjektů' } ,'Edit Subject' : { cs:'Editovat subjekt' + ,ro: 'Editează Subiectul' } ,'person, device, etc' : { cs:'osoba, zařízeni atd.' + ,ro: 'persoană, dispozitiv, etc' } ,'role1, role2' : { cs:'role1, role2' + ,ro: 'Rol1, Rol2' } ,'Edit this subject' : { cs:'Editovat tento subjekt' + ,ro: 'Editează acest subiect' } ,'Delete this subject' : { cs:'Smazat tento subjekt' + ,ro: 'Șterge acest subiect' } ,'Roles' : { cs:'Role' + ,ro: 'Roluri' } ,'Access Token' : { cs:'Přístupový token' + ,ro: 'Cheie de acces' } ,'hour ago' : { cs:'hodina zpět' + ,ro: 'oră trecut' } ,'hours ago' : { cs:'hodin zpět' + ,ro: 'ore trecute' } ,'Silence for %1 minutes' : { cs:'Ztlumit na %1 minut' + ,ro: 'Liniște pentru %1 minute' } }; From ebc72d4fe0f43f5435dba9cbb33b733f572adf5c Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 16 Oct 2016 10:35:30 +0200 Subject: [PATCH 15/21] Add greek language to Azure deploy --- azuredeploy.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azuredeploy.json b/azuredeploy.json index 5a173380911..c428f7f2b16 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -77,6 +77,7 @@ "cs", "dk", "de", + "el", "en", "es", "fr", @@ -313,4 +314,4 @@ } }] }] -} \ No newline at end of file +} From c3f8a23d0e52edf2e0bdf5e9fc5457331cb538de Mon Sep 17 00:00:00 2001 From: Bog Dan Date: Sun, 16 Oct 2016 11:43:11 +0300 Subject: [PATCH 16/21] RO translation Skiped one line... :) --- lib/language.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/language.js b/lib/language.js index 49048a6a000..2eb1616b896 100644 --- a/lib/language.js +++ b/lib/language.js @@ -7437,6 +7437,7 @@ function init() { } ,'Database contains %1 subjects' : { cs: 'Databáze obsahuje %1 subjektů' + ,ro: 'Baza de date are %1 subiecți' } ,'Edit Subject' : { cs:'Editovat subjekt' From d8e362812410a64b6a59f9cdd4ad78de1c9db853 Mon Sep 17 00:00:00 2001 From: Sulka Haro Date: Sun, 16 Oct 2016 11:49:03 +0300 Subject: [PATCH 17/21] Update FI with all missing localization --- lib/language.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/lib/language.js b/lib/language.js index 6ac7bcc48ec..86583018b26 100644 --- a/lib/language.js +++ b/lib/language.js @@ -1574,7 +1574,7 @@ function init() { ,hr: 'ukupno dana' ,it: 'Giorni totali' ,dk: 'antal dage' - ,fi: 'päivä yhteensä' + ,fi: 'päivän arvio' ,nb: 'antall dager' ,he: 'מספר ימים' ,pl: 'dni łącznie' @@ -4266,7 +4266,7 @@ function init() { ,hr: 'Promjena seta' ,it: 'CAGE-Cambio Ago' ,dk: 'Skift insulin infusionssted' - ,fi: 'Pumpun kanyylin vaihto' + ,fi: 'Kanyylin vaihto' ,nb: 'Pumpebytte' ,he: 'החלפת צינורית משאבה' ,pl: 'Zmiana miejsca wkłucia pompy' @@ -7130,6 +7130,7 @@ function init() { ,ru: 'Помпа' ,nl: 'Pomp' ,ko: '펌프' + ,fi: 'Pumppu' } ,'Sensor Age' : { cs: 'Stáří senzoru (SAGE)' @@ -7142,6 +7143,7 @@ function init() { ,ru: 'Возраст сенсора' ,nl: 'Sensor leeftijd' ,ko: '센서 사용 기간' + ,fi: 'Sensorin ikä' } ,'Insulin Age' : { cs: 'Stáří inzulínu (IAGE)' @@ -7154,6 +7156,7 @@ function init() { ,ru: 'Возраст инсулина' ,nl: 'Insuline leeftijd' ,ko: '인슐린 사용 기간' + ,fi: 'Insuliinin ikä' } ,'Temporary target' : { cs: 'Dočasný cíl' @@ -7166,6 +7169,7 @@ function init() { ,ru: 'Временная цель' ,nl: 'Tijdelijk doel' ,ko: '임시 목표' + ,fi: 'Tilapäinen tavoite' } ,'Reason' : { cs: 'Důvod' @@ -7178,6 +7182,7 @@ function init() { ,ro: 'Motiv' ,ru: 'Причина' ,ko: '근거' + ,fi: 'Syy' } ,'Eating soon' : { cs: 'Následuje jídlo' @@ -7190,6 +7195,7 @@ function init() { ,ru: 'Скоро еда' ,nl: 'Binnenkort eten' ,ko: '곧 편집 중' + ,fi: 'Syödään pian' } ,'Top' : { cs: 'Horní' @@ -7202,6 +7208,7 @@ function init() { ,ru: 'Верх' ,nl: 'Boven' ,ko: '최고' + ,fi: 'Ylä' } ,'Bottom' : { cs: 'Dolní' @@ -7214,6 +7221,7 @@ function init() { ,ru: 'Низ' ,nl: 'Beneden' ,ko: '최저' + ,fi: 'Ala' } ,'Activity' : { cs: 'Aktivita' @@ -7226,6 +7234,7 @@ function init() { ,ru: 'Активность' ,nl: 'Activiteit' ,ko: '활동량' + ,fi: 'Aktiviteetti' } ,'Targets' : { cs: 'Cíl' @@ -7238,153 +7247,188 @@ function init() { ,ru: 'Цели' ,nl: 'Doelen' ,ko: '목표' + ,fi: 'Tavoitteet' } ,'Bolus insulin:' : { cs: 'Bolusový inzulín:' ,ro: 'Insulină bolusată:' ,ru: 'Болюс инсулин' ,ko: 'Bolus 인슐린' + ,fi: 'Bolusinsuliini:' } ,'Base basal insulin:' : { cs: 'Základní bazální inzulín:' ,ro: 'Bazala obișnuită:' ,ru: 'Основной базал инсулин' ,ko: '기본 basal 인슐린' + ,fi: 'Basaalin perusannos:' } ,'Positive temp basal insulin:' : { cs: 'Pozitivní dočasný bazální inzulín:' ,ro: 'Bazala temporară crescută:' ,ru: 'Положит знач временн базал инс ' ,ko: '임시 basal 인슐린 남아 있습니다.' + ,fi: 'Positiivinen tilapäisbasaali:' } ,'Negative temp basal insulin:' : { cs:'Negativní dočasný bazální inzulín:' ,ro: 'Bazala temporară scăzută:' ,ru: 'Отриц знач временн базал инс' ,ko: '임시 basal 인슐린 남아 있지 않습니다.' + ,fi: 'Negatiivinen tilapäisbasaali:' } ,'Total basal insulin:' : { cs: 'Celkový bazální inzulín:' ,ro: 'Bazala totală:' ,ru: 'Всего базал инсулина' ,ko: '전체 basal 인슐린' + ,fi: 'Basaali yhteensä:' } ,'Total daily insulin:' : { cs:'Celkový denní inzulín:' ,ro: 'Insulina totală zilnică:' ,ru: 'Всего ежедн базал инсулина' ,ko: '전체 하루 인슐린' + ,fi: 'Päivän kokonaisinsuliiniannos' } ,'Unable to %1 Role' : { // PUT or POST cs: 'Chyba volání %1 Role:' ,ro: 'Imposibil de %1 Rolul' + ,fi: '%1 operaatio roolille opäonnistui' } ,'Unable to delete Role' : { cs: 'Nelze odstranit Roli:' ,ro: 'Imposibil de șters Rolul' + ,fi: 'Roolin poistaminen epäonnistui' } ,'Database contains %1 roles' : { cs: 'Databáze obsahuje %1 rolí' ,ro: 'Baza de date conține %1 rol(uri)' + ,fi: 'Tietokanta sisältää %1 roolia' } ,'Edit Role' : { cs:'Editovat roli' ,ro: 'Editează Rolul' + ,fi: 'Muokkaa roolia' } ,'admin, school, family, etc' : { cs: 'administrátor, škola, rodina atd...' ,ro: 'administrator, școală, familie, etc' + ,fi: 'ylläpitäjä, koulu, perhe jne' } ,'Permissions' : { cs: 'Oprávnění' ,ro: 'Permisiuni' + ,fi: 'Oikeudet' } ,'Are you sure you want to delete: ' : { cs: 'Opravdu vymazat: ' ,ro: 'Confirmați ștergerea: ' + ,fi: 'Oletko varmat että haluat tuhota: ' } ,'Each role will have a 1 or more permissions. The * permission is a wildcard, permissions are a hierarchy using : as a seperator.' : { cs: 'Každá role má 1 nebo více oprávnění. Oprávnění * je zástupný znak, oprávnění jsou hiearchie používající : jako oddělovač.' ,ro: 'Fiecare rol va avea cel puțin o permisiune. Permisiunea * este totală, permisiunile sunt ierarhice utilizând : pe post de separator.' + ,fi: 'Jokaisella roolilla on yksi tai useampia oikeuksia. + on jokeri (tunnistuu kaikkina oikeuksina), oikeudet ovat hierarkia joka käyttää : merkkiä erottimena.' } ,'Add new Role' : { cs: 'Přidat novou roli' ,ro: 'Adaugă un Rol nou' + ,fi: 'Lisää uusi rooli' } ,'Roles - Groups of People, Devices, etc' : { cs: 'Role - Skupiny lidí, zařízení atd.' ,ro: 'Roluri - Grupuri de persoane, dispozitive, etc' + ,fi: 'Roolit - Ihmisten ja laitteiden muodostamia ryhmiä' } ,'Edit this role' : { cs: 'Editovat tuto roli' ,ro: 'Editează acest rol' + ,fi: 'Muokkaa tätä roolia' } ,'Admin authorized' : { cs: 'Admin autorizován' ,ro: 'Autorizat de admin' + ,fi: 'Ylläpitäjä valtuutettu' } ,'Subjects - People, Devices, etc' : { cs: 'Subjekty - Lidé, zařízení atd.' ,ro: 'Subiecte - Persoane, dispozitive, etc' + ,fi: 'Käyttäjät (Ihmiset, laitteet jne)' } ,'Each subject will have a unique access token and 1 or more roles. Click on the access token to open a new view with the selected subject, this secret link can then be shared.' : { cs: 'Každý subjekt má svůj unikátní token a 1 nebo více rolí. Klikem na přístupový token se otevře nové okno pro tento subjekt. Tento link je možné sdílet.' ,ro: 'Fiecare subiect va avea o cheie unică de acces și unul sau mai multe roluri. Apăsați pe cheia de acces pentru a vizualiza subiectul selectat, acest link poate fi distribuit.' + ,fi: 'Jokaisella käyttäjällä on uniikki pääsytunniste ja yksi tai useampi rooli. Klikkaa pääsytunnistetta nähdäksesi käyttäjän, jolloin saat jaettavan osoitteen tämän käyttäjän oikeuksilla.' } ,'Add new Subject' : { cs: 'Přidat nový subjekt' ,ro: 'Adaugă un Subiect nou' + ,fi: 'Lisää uusi käyttäjä' } ,'Unable to %1 Subject' : { // PUT or POST cs: 'Chyba volání %1 Subjektu:' ,ro: 'Imposibil de %1 Subiectul' + ,fi: '%1 operaatio käyttäjälle epäonnistui' } ,'Unable to delete Subject' : { cs: 'Nelze odstranit Subjekt:' ,ro: 'Imposibil de șters Subiectul' + ,fi: 'Käyttäjän poistaminen epäonnistui' } ,'Database contains %1 subjects' : { cs: 'Databáze obsahuje %1 subjektů' + ,fi: 'Tietokanta sisältää %1 käyttäjää' } ,'Edit Subject' : { cs:'Editovat subjekt' ,ro: 'Editează Subiectul' + ,fi: 'Muokkaa käyttäjää' } ,'person, device, etc' : { cs:'osoba, zařízeni atd.' ,ro: 'persoană, dispozitiv, etc' + ,fi: 'henkilö, laite jne' } ,'role1, role2' : { cs:'role1, role2' ,ro: 'Rol1, Rol2' + ,fi: 'rooli1, rooli2' } ,'Edit this subject' : { cs:'Editovat tento subjekt' ,ro: 'Editează acest subiect' + ,fi: 'Muokkaa tätä käyttäjää' } ,'Delete this subject' : { cs:'Smazat tento subjekt' ,ro: 'Șterge acest subiect' + ,fi: 'Poista tämä käyttäjä' } ,'Roles' : { cs:'Role' ,ro: 'Roluri' + ,fi: 'Rooli' } ,'Access Token' : { cs:'Přístupový token' ,ro: 'Cheie de acces' + ,fi: 'Pääsytunniste' } ,'hour ago' : { cs:'hodina zpět' ,ro: 'oră trecut' + ,fi: 'tunti sitten' } ,'hours ago' : { cs:'hodin zpět' ,ro: 'ore trecute' + ,fi: 'tuntia sitten' } ,'Silence for %1 minutes' : { cs:'Ztlumit na %1 minut' ,ro: 'Liniște pentru %1 minute' + ,fi: 'Hiljennä %1 minuutiksi' } }; From 87c52beb4b41d1007f77fe4f612ad23c8c07121b Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Sun, 16 Oct 2016 11:11:58 +0200 Subject: [PATCH 18/21] russian translations by Fedor Apanasenko --- lib/language.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/language.js b/lib/language.js index 480fcf96845..613db5f77cf 100644 --- a/lib/language.js +++ b/lib/language.js @@ -7386,141 +7386,169 @@ function init() { ,'Unable to %1 Role' : { // PUT or POST cs: 'Chyba volání %1 Role:' ,ro: 'Imposibil de %1 Rolul' + ,ru: 'Невозможно %1 Роль' ,fi: '%1 operaatio roolille opäonnistui' } ,'Unable to delete Role' : { cs: 'Nelze odstranit Roli:' ,ro: 'Imposibil de șters Rolul' + ,ru: 'Невозможно удалить Роль' ,fi: 'Roolin poistaminen epäonnistui' } ,'Database contains %1 roles' : { cs: 'Databáze obsahuje %1 rolí' ,ro: 'Baza de date conține %1 rol(uri)' + ,ru: 'База данных содержит %1 Ролей' ,fi: 'Tietokanta sisältää %1 roolia' } ,'Edit Role' : { cs:'Editovat roli' ,ro: 'Editează Rolul' + ,ru: 'Редактировать Роль' ,fi: 'Muokkaa roolia' } ,'admin, school, family, etc' : { cs: 'administrátor, škola, rodina atd...' ,ro: 'administrator, școală, familie, etc' + ,ru: 'админ, школа, семья и т д' ,fi: 'ylläpitäjä, koulu, perhe jne' } ,'Permissions' : { cs: 'Oprávnění' ,ro: 'Permisiuni' + ,ru: 'Разрешения' ,fi: 'Oikeudet' } ,'Are you sure you want to delete: ' : { cs: 'Opravdu vymazat: ' ,ro: 'Confirmați ștergerea: ' + ,ru: 'Вы уверены, что хотите удалить' ,fi: 'Oletko varmat että haluat tuhota: ' } ,'Each role will have a 1 or more permissions. The * permission is a wildcard, permissions are a hierarchy using : as a seperator.' : { cs: 'Každá role má 1 nebo více oprávnění. Oprávnění * je zástupný znak, oprávnění jsou hiearchie používající : jako oddělovač.' ,ro: 'Fiecare rol va avea cel puțin o permisiune. Permisiunea * este totală, permisiunile sunt ierarhice utilizând : pe post de separator.' + ,ru: 'Каждая роль имеет 1 или более разрешений. Разрешение * это подстановочный символ, разрешения это иерархия, использующая : как разделитель.' ,fi: 'Jokaisella roolilla on yksi tai useampia oikeuksia. + on jokeri (tunnistuu kaikkina oikeuksina), oikeudet ovat hierarkia joka käyttää : merkkiä erottimena.' } ,'Add new Role' : { cs: 'Přidat novou roli' ,ro: 'Adaugă un Rol nou' + ,ru: 'Добавить новую Роль' ,fi: 'Lisää uusi rooli' } ,'Roles - Groups of People, Devices, etc' : { cs: 'Role - Skupiny lidí, zařízení atd.' ,ro: 'Roluri - Grupuri de persoane, dispozitive, etc' + ,ru: 'Роли- группы людей, устройств и т п' ,fi: 'Roolit - Ihmisten ja laitteiden muodostamia ryhmiä' } ,'Edit this role' : { cs: 'Editovat tuto roli' ,ro: 'Editează acest rol' + ,ru: 'Редактировать эту роль' ,fi: 'Muokkaa tätä roolia' } ,'Admin authorized' : { cs: 'Admin autorizován' ,ro: 'Autorizat de admin' + ,ru: 'Разрешено администратором' ,fi: 'Ylläpitäjä valtuutettu' } ,'Subjects - People, Devices, etc' : { cs: 'Subjekty - Lidé, zařízení atd.' ,ro: 'Subiecte - Persoane, dispozitive, etc' + ,ru: 'Люди, устройства и т п' ,fi: 'Käyttäjät (Ihmiset, laitteet jne)' } ,'Each subject will have a unique access token and 1 or more roles. Click on the access token to open a new view with the selected subject, this secret link can then be shared.' : { cs: 'Každý subjekt má svůj unikátní token a 1 nebo více rolí. Klikem na přístupový token se otevře nové okno pro tento subjekt. Tento link je možné sdílet.' ,ro: 'Fiecare subiect va avea o cheie unică de acces și unul sau mai multe roluri. Apăsați pe cheia de acces pentru a vizualiza subiectul selectat, acest link poate fi distribuit.' + ,ru: 'Каждый субъект получает уникальный код доступа и 1 или более ролей. Нажмите на иконку кода доступа чтобы открыть новое окно с выбранным субъектом, эту секретную ссылку можно переслать.' ,fi: 'Jokaisella käyttäjällä on uniikki pääsytunniste ja yksi tai useampi rooli. Klikkaa pääsytunnistetta nähdäksesi käyttäjän, jolloin saat jaettavan osoitteen tämän käyttäjän oikeuksilla.' } ,'Add new Subject' : { cs: 'Přidat nový subjekt' ,ro: 'Adaugă un Subiect nou' + ,ru: 'Добавить нового субъекта' ,fi: 'Lisää uusi käyttäjä' } ,'Unable to %1 Subject' : { // PUT or POST cs: 'Chyba volání %1 Subjektu:' ,ro: 'Imposibil de %1 Subiectul' + ,ru: 'Невозможно %1 субъекта' ,fi: '%1 operaatio käyttäjälle epäonnistui' } ,'Unable to delete Subject' : { cs: 'Nelze odstranit Subjekt:' ,ro: 'Imposibil de șters Subiectul' + ,ru: 'Невозможно удалить ' ,fi: 'Käyttäjän poistaminen epäonnistui' } ,'Database contains %1 subjects' : { cs: 'Databáze obsahuje %1 subjektů' ,fi: 'Tietokanta sisältää %1 käyttäjää' + ,ru: 'База данных содержит %1 субъект(а/ов)' ,ro: 'Baza de date are %1 subiecți' } ,'Edit Subject' : { cs:'Editovat subjekt' ,ro: 'Editează Subiectul' + ,ru: 'Редактировать субъекта' ,fi: 'Muokkaa käyttäjää' } ,'person, device, etc' : { cs:'osoba, zařízeni atd.' ,ro: 'persoană, dispozitiv, etc' + ,ru: 'лицо, устройство и т п' ,fi: 'henkilö, laite jne' } ,'role1, role2' : { cs:'role1, role2' ,ro: 'Rol1, Rol2' + ,ru: 'Роль1, Роль2' ,fi: 'rooli1, rooli2' } ,'Edit this subject' : { cs:'Editovat tento subjekt' ,ro: 'Editează acest subiect' + ,ru: 'Редактировать этого субъекта' ,fi: 'Muokkaa tätä käyttäjää' } ,'Delete this subject' : { cs:'Smazat tento subjekt' ,ro: 'Șterge acest subiect' + ,ru: 'Удалить этого субъекта' ,fi: 'Poista tämä käyttäjä' } ,'Roles' : { cs:'Role' ,ro: 'Roluri' + ,ru: 'Роли' ,fi: 'Rooli' } ,'Access Token' : { cs:'Přístupový token' ,ro: 'Cheie de acces' + ,ru: 'Код доступа' ,fi: 'Pääsytunniste' } ,'hour ago' : { cs:'hodina zpět' ,ro: 'oră trecut' + ,ru: 'час назад' ,fi: 'tunti sitten' } ,'hours ago' : { cs:'hodin zpět' ,ro: 'ore trecute' + ,ru: 'часов назад' ,fi: 'tuntia sitten' } ,'Silence for %1 minutes' : { cs:'Ztlumit na %1 minut' ,ro: 'Liniște pentru %1 minute' + ,ru: 'Молчание %1 минут' ,fi: 'Hiljennä %1 minuutiksi' } From 344cd1676a6ce0913b07af48911cfa3b2f29c15f Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Sun, 16 Oct 2016 11:19:42 +0200 Subject: [PATCH 19/21] bulgarian translations by Filip Filipov --- lib/language.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lib/language.js b/lib/language.js index 613db5f77cf..d15b40f49d6 100644 --- a/lib/language.js +++ b/lib/language.js @@ -7337,6 +7337,7 @@ function init() { } ,'Bolus insulin:' : { cs: 'Bolusový inzulín:' + ,bg: 'Болус инсулин' ,ro: 'Insulină bolusată:' ,ru: 'Болюс инсулин' ,ko: 'Bolus 인슐린' @@ -7345,6 +7346,7 @@ function init() { } ,'Base basal insulin:' : { cs: 'Základní bazální inzulín:' + ,bg: 'Основен базален инсулин' ,ro: 'Bazala obișnuită:' ,ru: 'Основной базал инсулин' ,ko: '기본 basal 인슐린' @@ -7353,6 +7355,7 @@ function init() { } ,'Positive temp basal insulin:' : { cs: 'Pozitivní dočasný bazální inzulín:' + ,bg: 'Положителен временено базален инсулин' ,ro: 'Bazala temporară crescută:' ,ru: 'Положит знач временн базал инс ' ,ko: '임시 basal 인슐린 남아 있습니다.' @@ -7361,6 +7364,7 @@ function init() { } ,'Negative temp basal insulin:' : { cs:'Negativní dočasný bazální inzulín:' + ,bg: 'Отрицателен временено базален инсулин' ,ro: 'Bazala temporară scăzută:' ,ru: 'Отриц знач временн базал инс' ,ko: '임시 basal 인슐린 남아 있지 않습니다.' @@ -7369,6 +7373,7 @@ function init() { } ,'Total basal insulin:' : { cs: 'Celkový bazální inzulín:' + ,bg: 'Общо базален инсулин' ,ro: 'Bazala totală:' ,ru: 'Всего базал инсулина' ,ko: '전체 basal 인슐린' @@ -7377,6 +7382,7 @@ function init() { } ,'Total daily insulin:' : { cs:'Celkový denní inzulín:' + ,bg: 'Общо инсулин за деня' ,ro: 'Insulina totală zilnică:' ,ru: 'Всего ежедн базал инсулина' ,ko: '전체 하루 인슐린' @@ -7385,168 +7391,196 @@ function init() { } ,'Unable to %1 Role' : { // PUT or POST cs: 'Chyba volání %1 Role:' + ,bg: 'Невъзможно да %1 Роля' ,ro: 'Imposibil de %1 Rolul' ,ru: 'Невозможно %1 Роль' ,fi: '%1 operaatio roolille opäonnistui' } ,'Unable to delete Role' : { cs: 'Nelze odstranit Roli:' + ,bg: 'Невъзможно изтриването на Роля' ,ro: 'Imposibil de șters Rolul' ,ru: 'Невозможно удалить Роль' ,fi: 'Roolin poistaminen epäonnistui' } ,'Database contains %1 roles' : { cs: 'Databáze obsahuje %1 rolí' + ,bg: 'Базата данни съдържа %1 роли' ,ro: 'Baza de date conține %1 rol(uri)' ,ru: 'База данных содержит %1 Ролей' ,fi: 'Tietokanta sisältää %1 roolia' } ,'Edit Role' : { cs:'Editovat roli' + ,bg: 'Промени Роля' ,ro: 'Editează Rolul' ,ru: 'Редактировать Роль' ,fi: 'Muokkaa roolia' } ,'admin, school, family, etc' : { cs: 'administrátor, škola, rodina atd...' + ,bg: 'администратор,училище,семейство' ,ro: 'administrator, școală, familie, etc' ,ru: 'админ, школа, семья и т д' ,fi: 'ylläpitäjä, koulu, perhe jne' } ,'Permissions' : { cs: 'Oprávnění' + ,bg: 'Права' ,ro: 'Permisiuni' ,ru: 'Разрешения' ,fi: 'Oikeudet' } ,'Are you sure you want to delete: ' : { cs: 'Opravdu vymazat: ' + ,bg: 'Потвърдете изтриването' ,ro: 'Confirmați ștergerea: ' ,ru: 'Вы уверены, что хотите удалить' ,fi: 'Oletko varmat että haluat tuhota: ' } ,'Each role will have a 1 or more permissions. The * permission is a wildcard, permissions are a hierarchy using : as a seperator.' : { cs: 'Každá role má 1 nebo více oprávnění. Oprávnění * je zástupný znak, oprávnění jsou hiearchie používající : jako oddělovač.' + ,bg: 'Всяка роля ще има 1 или повече права. В * правото е маска, правата са йерархия използвайки като разделител' ,ro: 'Fiecare rol va avea cel puțin o permisiune. Permisiunea * este totală, permisiunile sunt ierarhice utilizând : pe post de separator.' ,ru: 'Каждая роль имеет 1 или более разрешений. Разрешение * это подстановочный символ, разрешения это иерархия, использующая : как разделитель.' ,fi: 'Jokaisella roolilla on yksi tai useampia oikeuksia. + on jokeri (tunnistuu kaikkina oikeuksina), oikeudet ovat hierarkia joka käyttää : merkkiä erottimena.' } ,'Add new Role' : { cs: 'Přidat novou roli' + ,bg: 'Добавете нова роля' ,ro: 'Adaugă un Rol nou' ,ru: 'Добавить новую Роль' ,fi: 'Lisää uusi rooli' } ,'Roles - Groups of People, Devices, etc' : { cs: 'Role - Skupiny lidí, zařízení atd.' + ,bg: 'Роли - Група хора,устройства,т.н.' ,ro: 'Roluri - Grupuri de persoane, dispozitive, etc' ,ru: 'Роли- группы людей, устройств и т п' ,fi: 'Roolit - Ihmisten ja laitteiden muodostamia ryhmiä' } ,'Edit this role' : { cs: 'Editovat tuto roli' + ,bg: 'Промени тази роля' ,ro: 'Editează acest rol' ,ru: 'Редактировать эту роль' ,fi: 'Muokkaa tätä roolia' } ,'Admin authorized' : { cs: 'Admin autorizován' + ,bg: 'Оторизиран като администратор' ,ro: 'Autorizat de admin' ,ru: 'Разрешено администратором' ,fi: 'Ylläpitäjä valtuutettu' } ,'Subjects - People, Devices, etc' : { cs: 'Subjekty - Lidé, zařízení atd.' + ,bg: 'Субекти - Хора,Устройства,т.н.' ,ro: 'Subiecte - Persoane, dispozitive, etc' ,ru: 'Люди, устройства и т п' ,fi: 'Käyttäjät (Ihmiset, laitteet jne)' } ,'Each subject will have a unique access token and 1 or more roles. Click on the access token to open a new view with the selected subject, this secret link can then be shared.' : { cs: 'Každý subjekt má svůj unikátní token a 1 nebo více rolí. Klikem na přístupový token se otevře nové okno pro tento subjekt. Tento link je možné sdílet.' + ,bg: 'Всеки обект ще има уникален ключ за достъп и 1 или повече роли. Кликнете върху ключа за достъп, за да отворите нов изглед с избрания обект, тази секретна връзка може след това да се споделя' ,ro: 'Fiecare subiect va avea o cheie unică de acces și unul sau mai multe roluri. Apăsați pe cheia de acces pentru a vizualiza subiectul selectat, acest link poate fi distribuit.' ,ru: 'Каждый субъект получает уникальный код доступа и 1 или более ролей. Нажмите на иконку кода доступа чтобы открыть новое окно с выбранным субъектом, эту секретную ссылку можно переслать.' ,fi: 'Jokaisella käyttäjällä on uniikki pääsytunniste ja yksi tai useampi rooli. Klikkaa pääsytunnistetta nähdäksesi käyttäjän, jolloin saat jaettavan osoitteen tämän käyttäjän oikeuksilla.' } ,'Add new Subject' : { cs: 'Přidat nový subjekt' + ,bg: 'Добави нов субект' ,ro: 'Adaugă un Subiect nou' ,ru: 'Добавить нового субъекта' ,fi: 'Lisää uusi käyttäjä' } ,'Unable to %1 Subject' : { // PUT or POST cs: 'Chyba volání %1 Subjektu:' + ,bg: 'Невъзможно %1 субект' ,ro: 'Imposibil de %1 Subiectul' ,ru: 'Невозможно %1 субъекта' ,fi: '%1 operaatio käyttäjälle epäonnistui' } ,'Unable to delete Subject' : { cs: 'Nelze odstranit Subjekt:' + ,bg: 'Невъзможно изтриването на субекта' ,ro: 'Imposibil de șters Subiectul' ,ru: 'Невозможно удалить ' ,fi: 'Käyttäjän poistaminen epäonnistui' } ,'Database contains %1 subjects' : { cs: 'Databáze obsahuje %1 subjektů' + bg: 'Базата данни съдържа %1 субекти' ,fi: 'Tietokanta sisältää %1 käyttäjää' ,ru: 'База данных содержит %1 субъект(а/ов)' ,ro: 'Baza de date are %1 subiecți' } ,'Edit Subject' : { cs:'Editovat subjekt' + ,bg: 'Промени субект' ,ro: 'Editează Subiectul' ,ru: 'Редактировать субъекта' ,fi: 'Muokkaa käyttäjää' } ,'person, device, etc' : { cs:'osoba, zařízeni atd.' + ,bg: 'човек,устройство,т.н.' ,ro: 'persoană, dispozitiv, etc' ,ru: 'лицо, устройство и т п' ,fi: 'henkilö, laite jne' } ,'role1, role2' : { cs:'role1, role2' + ,bg: 'Роля1, Роля2' ,ro: 'Rol1, Rol2' ,ru: 'Роль1, Роль2' ,fi: 'rooli1, rooli2' } ,'Edit this subject' : { cs:'Editovat tento subjekt' + ,bg: 'Промени този субект' ,ro: 'Editează acest subiect' ,ru: 'Редактировать этого субъекта' ,fi: 'Muokkaa tätä käyttäjää' } ,'Delete this subject' : { cs:'Smazat tento subjekt' + ,bg: 'Изтрий този субект' ,ro: 'Șterge acest subiect' ,ru: 'Удалить этого субъекта' ,fi: 'Poista tämä käyttäjä' } ,'Roles' : { cs:'Role' + ,bg: 'Роли' ,ro: 'Roluri' ,ru: 'Роли' ,fi: 'Rooli' } ,'Access Token' : { cs:'Přístupový token' + ,bg: 'Ключ за достъп' ,ro: 'Cheie de acces' ,ru: 'Код доступа' ,fi: 'Pääsytunniste' } ,'hour ago' : { cs:'hodina zpět' + ,bg: 'Преди час' ,ro: 'oră trecut' ,ru: 'час назад' ,fi: 'tunti sitten' } ,'hours ago' : { cs:'hodin zpět' + ,bg: 'Преди часове' ,ro: 'ore trecute' ,ru: 'часов назад' ,fi: 'tuntia sitten' } ,'Silence for %1 minutes' : { cs:'Ztlumit na %1 minut' + ,bg: 'Заглушаване за %1 минути' ,ro: 'Liniște pentru %1 minute' ,ru: 'Молчание %1 минут' ,fi: 'Hiljennä %1 minuutiksi' From 7b8824f15e1fcadb547220a5ebb61d74acfb1e01 Mon Sep 17 00:00:00 2001 From: MilosKozak Date: Sun, 16 Oct 2016 11:22:20 +0200 Subject: [PATCH 20/21] missing comma --- lib/language.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/language.js b/lib/language.js index d15b40f49d6..9c810defb80 100644 --- a/lib/language.js +++ b/lib/language.js @@ -7510,7 +7510,7 @@ function init() { } ,'Database contains %1 subjects' : { cs: 'Databáze obsahuje %1 subjektů' - bg: 'Базата данни съдържа %1 субекти' + ,bg: 'Базата данни съдържа %1 субекти' ,fi: 'Tietokanta sisältää %1 käyttäjää' ,ru: 'База данных содержит %1 субъект(а/ов)' ,ro: 'Baza de date are %1 subiecți' From 1a97b188824e580b1a338dadc988549a15c1f6cc Mon Sep 17 00:00:00 2001 From: DanielFilipov Date: Sun, 16 Oct 2016 10:55:13 +0100 Subject: [PATCH 21/21] Update language.js Updated --- lib/language.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/language.js b/lib/language.js index 9c810defb80..24d09b2f208 100644 --- a/lib/language.js +++ b/lib/language.js @@ -5067,6 +5067,8 @@ function init() { ,nl: 'Kleurenblind vriendelijke kleuren' ,ro: 'Culori pentru cei cu deficiențe de vedere' ,ko: '색맹 친화적인 색상' + ,bg: 'Цветове за далтонисти' + } ,'Reset, and use defaults' : { cs: 'Vymaž a nastav výchozí hodnoty'