From 4c8c1a6d2f523a399ea1fd90a7f45033752e5563 Mon Sep 17 00:00:00 2001 From: Diego Pereyra Date: Sat, 15 Jan 2022 16:09:58 -0300 Subject: [PATCH 01/17] Option to keep or not the textual translations --- apps/locale/locale.html | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/locale/locale.html b/apps/locale/locale.html index 90a2e8d40..fa857d9f8 100644 --- a/apps/locale/locale.html +++ b/apps/locale/locale.html @@ -10,6 +10,9 @@ +
+ +

Then click

@@ -106,12 +109,18 @@ exports = { name : "en_GB", currencySym:"£", const lang = languageSelector.options[languageSelector.selectedIndex].value; console.log(`Language ${lang}`); + const translations = document.getElementById('translations').checked; + console.log(`Translations: ${translations}`); + const locale = locales[lang]; if (!locale) { alert(`Language ${lang} not found!`); return; } + if (!translations) + locale.trans = null; + const codePageName = "ISO8859-1"; if (locale.codePage) codePageName = locale.codePage; From 58a9b19aa1e6ea3e7f5c49ef4427c07697669d42 Mon Sep 17 00:00:00 2001 From: Diego Pereyra Date: Sat, 15 Jan 2022 16:23:48 -0300 Subject: [PATCH 02/17] typo --- apps/locale/locale.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/locale/locale.html b/apps/locale/locale.html index fa857d9f8..d02dab3ac 100644 --- a/apps/locale/locale.html +++ b/apps/locale/locale.html @@ -11,7 +11,7 @@
- +

Then click

From 8b23e17f1cf93cf2cab9a8a53600c86b449e562e Mon Sep 17 00:00:00 2001 From: copoer Date: Wed, 9 Feb 2022 19:51:55 -0400 Subject: [PATCH 03/17] Added a bunch of auto translations --- lang/cs_CZ.json | 236 ++++++++++++++++++++++++++-------- lang/de_DE.json | 199 +++++++++++++++++++++++++---- lang/es_ES.json | 199 +++++++++++++++++++++++++---- lang/fi_FI.json | 192 +++++++++++++++++++++++++--- lang/fr_FR.json | 192 +++++++++++++++++++++++++--- lang/hu_HU.json | 192 +++++++++++++++++++++++++--- lang/index.json | 6 +- lang/it_IT.json | 332 +++++++++++++++++++++++++++--------------------- lang/ja_JA.json | 167 ++++++++++++++++++++++++ lang/nl_NL.json | 192 +++++++++++++++++++++++++--- lang/pt_PT.json | 167 ++++++++++++++++++++++++ lang/ru_RU.json | 167 ++++++++++++++++++++++++ lang/sv_SE.json | 192 +++++++++++++++++++++++++--- lang/tr_TR.json | 40 +++--- lang/zh_ZH.json | 167 ++++++++++++++++++++++++ 15 files changed, 2266 insertions(+), 374 deletions(-) create mode 100644 lang/ja_JA.json create mode 100644 lang/pt_PT.json create mode 100644 lang/ru_RU.json create mode 100644 lang/zh_ZH.json diff --git a/lang/cs_CZ.json b/lang/cs_CZ.json index 3f4fc87f1..0b56e69ed 100644 --- a/lang/cs_CZ.json +++ b/lang/cs_CZ.json @@ -1,53 +1,185 @@ { - "//":"Czech language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarm" : "Budík", - "Hour" : "Hodina", - "Hours" : "Hodiny", - "Minute" : "Minuta", - "Minutes" : "Minuty", - "Second" : "Sekunda", - "Seconds" : "Sekundy", - "Month" : "Měsíc", - "Enabled" : "Povoleno", - "Background" : "Pozadí", - "Connected" : "Připojeno", - "Settings" : "Nastavení", - "Save" : "Uložit", - "Back" : "Zpět", - "Repeat" : "Opakovat", - "Delete" : "Smazat", - "Sleep" : "Uspat", - "Alarms" : "Budíky", - "ALARM!" : "BUDÍK!", - - " (repeat)" : " (opakovat)", - "< Back" : "< Zpět", - "> Delete" : "> Smazat", - "> Save" : " > Uložit", - "ALARM " : "BUDÍK ", - - "Add Device" : "Přidat zařízení", - "App Settings" : "Nast. Aplikací", - "Apps" : "Aplikace" - - }, - "alarm": { - "//":"App-specific overrides", - "Alarm/Timer" : "Budik/Časovač", - "rpt" : "Opk.", - "New Alarm" : "Nový budík", - "New Timer" : "Nový časovač", - "Auto snooze" : "Auto odložit" - }, - "setting" : { - "Quiet Mode" : "Tichý režim" - - }, - "messages": { - "Are you sure?" : "Opravdu?" - } - - -} + "//": "Czech language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarm": "Budík", + "Hour": "Hodina", + "Hours": "Hodiny", + "Minute": "Minuta", + "Minutes": "Minuty", + "Second": "Sekunda", + "Seconds": "Sekundy", + "Month": "Měsíc", + "Enabled": "Povoleno", + "Background": "Pozadí", + "Connected": "Připojeno", + "Settings": "Nastavení", + "Save": "Uložit", + "Back": "Zpět", + "Repeat": "Opakovat", + "Delete": "Smazat", + "Sleep": "Uspat", + "Alarms": "Budíky", + "ALARM!": "BUDÍK!", + " (repeat)": " (opakovat)", + "< Back": "< Zpět", + "> Delete": "> Smazat", + "> Save": " > Uložit", + "ALARM ": "BUDÍK ", + "Add Device": "Přidat zařízení", + "App Settings": "Nast. Aplikací", + "Apps": "Aplikace", + "valid period": "doba platnosti", + "Font": "Písmo", + "circle count": "počet kroužků", + "min. confidence": "min. důvěra", + "circle 1": "okruh 1", + "circle 3": "kruh 3", + "step length": "délka kroku", + "Highlight FG": "Zvýraznění FG", + "Storage": "Úložiště", + "show widgets": "zobrazit widgety", + "Highlight BG": "Zvýraznění BG", + "Foreground 2": "Popředí 2", + "BLE": "BLE", + "Light BW": "Light BW", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Show clocks": "Zobrazit hodiny", + "Delete All Messages": "Odstranění všech zpráv", + "data": "data", + "Mark Unread": "Označit nepřečtené", + "Launcher Settings": "Nastavení spouštěče", + "circle 4": "kruh 4", + "App Source\nNot found": "Zdroj aplikace\nNenalezeno", + "Twist Timeout": "Twist Timeout", + "Dark BW": "Dark BW", + "Flatten Battery": "Zploštění baterie", + "Make Connectable": "Připojení", + "Wake on Touch": "Probuzení při dotyku", + "Twist Threshold": "Prahová hodnota Twist", + "Debug Info": "Informace o ladění", + "Time Zone": "Časové pásmo", + "battery warn": "upozornění na baterii", + "Remove": "Odstranění stránky", + "maximum": "maximum", + "Vector font size": "Velikost vektorového písma", + "Vibration": "Vibrace", + "(repeat)": "(opakování)", + "week": "týden", + "Yes\ndefinitely": "Ano\nurčitě", + "heartrate": "srdeční frekvence", + "Foreground": "Přední stránka", + "Clock Style": "Styl hodin", + "music": "hudba", + "Delete all messages": "Odstranění všech zpráv", + "Piezo": "Piezo", + "Log": "Přihlásit se", + "Twist Max Y": "Twist Max Y", + "STEPS": "KROKY", + "View Message": "Zobrazit zprávu", + "Heartrate": "Srdeční frekvence", + "TAP right top/bottom": "TAP vpravo nahoře/dole", + "Utils": "Utils", + "Programmable": "Programovatelné", + "Rewrite Settings": "Nastavení přepisu", + "Wake on BTN2": "Probuďte se na BTN2", + "Utilities": "Komunální služby", + "Compacting...\nTakes approx\n1 minute": "Zhutňování...\nTrvá přibližně\n1 minuta", + "Wake on FaceUp": "Probuzení na FaceUp", + "Wake on BTN1": "Probuďte se na BTN1", + "Wake on Twist": "Probuzení na Twistu", + "This will remove everything": "Tím se odstraní vše.", + "Keep Msgs": "Uchovávejte zprávy Msgs", + "Background 2": "Pozadí 2", + "Reset Settings": "Obnovení nastavení", + "Are you sure": "Jste si jistý, že", + "Stay Connectable": "Zůstaňte ve spojení", + "HID": "HID", + "colorize icon": "vybarvit ikonu", + "distance goal": "vzdálenostní cíl", + "circle 2": "kruh 2", + "Record Run": "Rekordní běh", + "Connectable": "Připojitelné", + "Side": "Strana", + "No app has settings": "Žádná aplikace nemá nastavení", + "Date": "Datum", + "OFF": "OFF", + "No Messages": "Žádné zprávy", + "Turn Off": "Vypnout", + "Invalid settings": "Neplatné nastavení", + "Unread timer": "Nepřečtený časovač", + "weather circle": "povětrnostní kruh", + "minimum": "minimum", + "Customize": "Přizpůsobení", + "Bluetooth": "Bluetooth", + "Circle": "Kruh", + "LCD": "LCD", + "Compact Storage": "Kompaktní úložiště", + "LCD Timeout": "Časový limit LCD", + "Connect device\nto add to\nwhitelist": "Připojení zařízení\npřidat do\nwhitelist", + "LCD Brightness": "Jas displeje LCD", + "TIMER": "ČASOVAČ", + "Reset All": "Obnovit vše", + "Left": "Vlevo", + "Reset": "Obnovení", + "goal": "cíl", + "Alerts": "Upozornění", + "Locale": "Lokalita", + "Beep": "Pípnutí", + "Vibrate": "Vibrace", + "Message": "Zpráva", + "System": "Systém", + "on": "na adrese", + "Sort Order": "Pořadí řazení", + "Right": "Vpravo", + "Select Clock": "Vybrat hodiny", + "Reset to Defaults": "Obnovení výchozího nastavení", + "Wake on BTN3": "Probuďte se na BTN3", + "Passkey BETA": "Passkey BETA", + "No Clocks Found": "Nebyly nalezeny žádné hodiny", + "Reset all widgets": "Obnovení všech widgetů", + "Widgets": "Widgety", + "Sleep Phase Alarm": "Alarm fáze spánku", + "Error in settings": "Chyba v nastavení", + "Timer": "Časovač", + "ALARM": "ALARM", + "Disable": "Zakázat", + "BACK": "ZPĚT", + "Whitelist": "Bílá listina", + "Factory Reset": "Obnovení továrního nastavení", + "Set Time": "Nastavený čas", + "Hide": "Skrýt", + "Messages": "Zprávy", + "On": "Na adrese", + "Show": "Zobrazit", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Zploštění baterie - může trvat hodiny.\nDlouhým stisknutím tlačítka zrušíte", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "No": "Ne", + "Ok": "Ok", + "Yes": "Ano", + "Steps": "Kroky", + "Year": "Rok", + "steps": "kroky", + "back": "zpět", + "Music": "Hudba", + "Loading": "Načítání", + "off": "mimo", + "color": "barva", + "Off": "Vypnuto", + "Theme": "Téma" + }, + "alarm": { + "//": "App-specific overrides", + "Alarm/Timer": "Budik/Časovač", + "rpt": "Opk.", + "New Alarm": "Nový budík", + "New Timer": "Nový časovač", + "Auto snooze": "Auto odložit" + }, + "setting": { + "Quiet Mode": "Tichý režim" + }, + "messages": { + "Are you sure?": "Opravdu?" + } +} \ No newline at end of file diff --git a/lang/de_DE.json b/lang/de_DE.json index b4acfe675..8c893e6ad 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -1,28 +1,173 @@ { - "//":"German language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarm" : "Wecker", - "Hours" : "Stunden", - "Minutes" : "Minuten", - "Enabled" : "Aktiviert", - "Settings" : "Einstellungen", - "Save" : "Speichern", - "Back" : "Zurück", - "Repeat" : "Wiederholen", - "Delete" : "Löschen", - "Sleep" : "Schlummern", - "Alarms" : "Wecker", - "New Alarm" : "Neuer Wecker", - "ALARM!" : "ALARM!", - "Yes" : "Ja", - "No" : "Nein", - "On" : "Ein", - "Off" : "Aus", - "Ok" : "OK" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "Wdh." - } -} + "//": "German language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarm": "Wecker", + "Hours": "Stunden", + "Minutes": "Minuten", + "Enabled": "Aktiviert", + "Settings": "Einstellungen", + "Save": "Speichern", + "Back": "Zurück", + "Repeat": "Wiederholen", + "Delete": "Löschen", + "Sleep": "Schlummern", + "Alarms": "Wecker", + "New Alarm": "Neuer Wecker", + "ALARM!": "ALARM!", + "Yes": "Ja", + "No": "Nein", + "On": "Ein", + "Off": "Aus", + "Ok": "OK", + "New Timer": "Neue Zeitschaltuhr", + "(repeat)": "(Wiederholung)", + "music": "Musik", + "Keep Msgs": "Msgs behalten", + "circle count": "Kreiszahl", + "Auto snooze": "Automatisches Schlummern", + "week": "Woche", + "Heartrate": "Herzfrequenz", + "minimum": "Minimum", + "weather circle": "Wetterkreis", + "circle 3": "Kreis 3", + "show widgets": "Widgets anzeigen", + "circle 4": "Kreis 4", + "circle 1": "Kreis 1", + "circle 2": "Kreis 2", + "battery warn": "Batteriewarnung", + "heartrate": "Herzfrequenz", + "data": "Daten", + "step length": "Schrittlänge", + "valid period": "Gültigkeitsdauer", + "colorize icon": "Symbol einfärben", + "min. confidence": "Mindestvertrauen", + "maximum": "maximal", + "distance goal": "Fernziel", + "Circle": "Kreis", + "Yes\ndefinitely": "Ja\ndefinitiv", + "TAP right top/bottom": "TAP rechts oben/unten", + "Are you sure": "Sind Sie sicher, dass", + "STEPS": "SCHRITTE", + "Mark Unread": "Ungelesen markieren", + "Delete all messages": "Alle Nachrichten löschen", + "Unread timer": "Ungelesener Timer", + "Quiet Mode": "Leiser Modus", + "Utils": "Werkzeuge", + "Piezo": "Piezo", + "LCD": "LCD", + "Record Run": "Rekordlauf", + "Apps": "Apps", + "Delete All Messages": "Alle Nachrichten löschen", + "start&lap/reset, BTN1: EXIT": "Start&Runde/Zurücksetzen, BTN1: EXIT", + "No Messages": "Keine Nachrichten", + "Bluetooth": "Bluetooth", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "View Message": "Nachricht anzeigen", + "Vector font size": "Vektor-Schriftgröße", + "Light BW": "Licht BW", + "BLE": "BLE", + "Make Connectable": "Verbindbar machen", + "Vibration": "Vibration", + "Foreground": "Vorderseite", + "Customize": "Anpassen", + "HID": "HID", + "Dark BW": "Dunkel BW", + "Passkey BETA": "Hauptschlüssel BETA", + "Show clocks": "Uhren anzeigen", + "Font": "Schriftart", + "Launcher Settings": "Launcher-Einstellungen", + "App Source\nNot found": "App-Quelle\nNicht gefunden", + "Programmable": "Programmierbar", + "Background 2": "Hintergrund 2", + "Foreground 2": "Vordergrund 2", + "Add Device": "Gerät hinzufügen", + "Highlight BG": "Hervorhebung BG", + "Background": "Hintergrund", + "Highlight FG": "Highlight FG", + "Wake on Touch": "Wecken bei Berührung", + "Twist Timeout": "Twist Timeout", + "Twist Max Y": "Twist Max Y", + "LCD Timeout": "LCD-Zeitüberschreitung", + "LCD Brightness": "LCD-Helligkeit", + "Utilities": "Versorgungsunternehmen", + "Log": "Protokoll", + "Compact Storage": "Kompakte Lagerung", + "Wake on BTN3": "Wake auf BTN3", + "Twist Threshold": "Schwellenwert verdrehen", + "Remove": "entfernen", + "Connect device\nto add to\nwhitelist": "Gerät verbinden\nzum Hinzufügen zur\nWhitelist", + "Debug Info": "Debug-Informationen", + "Time Zone": "Zeitzone", + "Clock Style": "Uhr Stil", + "Wake on BTN2": "Wake auf BTN2", + "Wake on FaceUp": "Wake on FaceUp", + "Wake on BTN1": "Wake auf BTN1", + "Wake on Twist": "Wake on Twist", + "Connectable": "Anschließbar", + "Second": "Zweite", + "Minute": "Minute", + "Turn Off": "Ausschalten", + "No Clocks Found": "Keine Uhren gefunden", + "App Settings": "App-Einstellungen", + "Hour": "Stunde", + "Reset to Defaults": "Auf Standardwerte zurücksetzen", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Entladen der Batterie - dies kann Stunden dauern.\nLanger Tastendruck zum Abbrechen", + "Reset Settings": "Einstellungen zurücksetzen", + "Rewrite Settings": "Einstellungen umschreiben", + "Compacting...\nTakes approx\n1 minute": "Verdichten...\nDauert ca.\n1 Minute", + "Stay Connectable": "Anschlussfähig bleiben", + "Storage": "Lagerung", + "This will remove everything": "Dadurch wird alles entfernt", + "on": "auf", + "TIMER": "TIMER", + "Widgets": "Widgets", + "goal": "Ziel", + "Beep": "Piep", + "Reset": "Zurücksetzen", + "No app has settings": "Keine App hat Einstellungen", + "Month": "Monat", + "Reset All": "Alle zurücksetzen", + "Flatten Battery": "Batterie abflachen", + "Right": "Rechts", + "Side": "Seite", + "Left": "Links", + "Sleep Phase Alarm": "Schlafphasenalarm", + "Date": "Datum", + "Sort Order": "Sortierreihenfolge", + "OFF": "AUS", + "Invalid settings": "Ungültige Einstellungen", + "Message": "Nachricht", + "Vibrate": "Vibrieren", + "Reset all widgets": "Alle Widgets zurücksetzen", + "System": "System", + "Alerts": "Warnungen", + "Locale": "Schauplatz", + "Whitelist": "Whitelist", + "Select Clock": "Uhr auswählen", + "Disable": "Deaktivieren Sie", + "Timer": "Zeitschaltuhr", + "Error in settings": "Fehler in den Einstellungen", + "Set Time": "Zeit einstellen", + "ALARM": "ALARM", + "BACK": "ZURÜCK", + "Factory Reset": "Werksreset", + "steps": "Schritte", + "Connected": "Verbunden", + "Show": "anzeigen", + "Messages": "Nachrichten", + "Hide": "Ausblenden", + "back": "zurück", + "Steps": "Schritte", + "Year": "Jahr", + "Loading": "Laden", + "Music": "Musik", + "color": "Farbe", + "off": "aus", + "Theme": "Thema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "Wdh." + } +} \ No newline at end of file diff --git a/lang/es_ES.json b/lang/es_ES.json index a3e7ede3f..d381582e3 100644 --- a/lang/es_ES.json +++ b/lang/es_ES.json @@ -1,28 +1,173 @@ { - "//":"Spanish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Alarmas", - "Hours" : "Horas", - "Minutes" : "Minutos", - "Enabled" : "Activados", - "Save" : "Ahorrar", - "Back" : "Regresa", - "Repeat" : "Repetición", - "Delete" : "Borrar", - "ALARM!" : "ALARM", - "Sleep" : "Dormir", - "Alarms" : "Alarmas", - "New Alarm" : "Nueva alarma", - "ALARM!" : "ALARM!", - "Yes" : "Si", - "No" : "No", - "On" : "Encendido", - "Off" : "Apagado", - "Ok" : "OK" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "rep." - } -} + "//": "Spanish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Alarmas", + "Hours": "Horas", + "Minutes": "Minutos", + "Enabled": "Activados", + "Save": "Ahorrar", + "Back": "Regresa", + "Repeat": "Repetición", + "Delete": "Borrar", + "ALARM!": "ALARM!", + "Sleep": "Dormir", + "New Alarm": "Nueva alarma", + "Yes": "Si", + "No": "No", + "On": "Encendido", + "Off": "Apagado", + "Ok": "OK", + "(repeat)": "(repetir)", + "New Timer": "Nuevo temporizador", + "music": "música", + "circle 2": "círculo 2", + "circle 1": "círculo 1", + "Keep Msgs": "Mantener Msgs", + "circle 3": "círculo 3", + "week": "semana", + "Auto snooze": "Repetición automática de la alarma", + "show widgets": "mostrar widgets", + "min. confidence": "confianza mínima", + "circle 4": "círculo 4", + "circle count": "recuento de círculos", + "heartrate": "ritmo cardíaco", + "Heartrate": "El ritmo cardíaco", + "weather circle": "círculo meteorológico", + "battery warn": "aviso de batería", + "minimum": "mínimo", + "distance goal": "objetivo de distancia", + "valid period": "período de validez", + "maximum": "máximo", + "step length": "longitud del paso", + "data": "datos", + "colorize icon": "colorear el icono", + "Circle": "Círculo", + "Launcher Settings": "Configuración del lanzador", + "App Source\nNot found": "Fuente de la aplicación\nNo se ha encontrado", + "Show clocks": "Mostrar relojes", + "Font": "Fuente", + "TAP right top/bottom": "TAP derecho superior/inferior", + "Yes\ndefinitely": "Sí\ndefinitivamente", + "View Message": "Ver mensaje", + "Delete all messages": "Borrar todos los mensajes", + "STEPS": "PASOS", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Are you sure": "¿Está seguro de que", + "Vector font size": "Tamaño de la fuente vectorial", + "Mark Unread": "Marcar como no leído", + "No Messages": "No hay mensajes", + "Delete All Messages": "Borrar todos los mensajes", + "LCD": "LCD", + "Apps": "Aplicaciones", + "Unread timer": "Temporizador no leído", + "Record Run": "Carrera de récords", + "Bluetooth": "Bluetooth", + "Quiet Mode": "Modo silencioso", + "Piezo": "Piezo", + "Make Connectable": "Hacer conectable", + "Programmable": "Programable", + "Vibration": "Vibración", + "Passkey BETA": "Passkey BETA", + "Customize": "Personalice", + "HID": "HID", + "Utils": "Utilidades", + "Light BW": "Luz BW", + "BLE": "BLE", + "Dark BW": "BW oscuro", + "Background 2": "Antecedentes 2", + "Foreground 2": "Primer plano 2", + "Foreground": "Primer plano", + "Highlight BG": "Resaltar BG", + "Connect device\nto add to\nwhitelist": "Conectar dispositivo\npara añadirlo a la\nlista blanca", + "Highlight FG": "Destacar FG", + "Background": "Antecedentes", + "Add Device": "Añadir dispositivo", + "Remove": "Eliminar", + "Wake on BTN3": "Wake en BTN3", + "Twist Max Y": "Twist Max Y", + "LCD Timeout": "Tiempo de espera del LCD", + "Twist Threshold": "Umbral de giro", + "Wake on BTN2": "Wake en BTN2", + "Wake on BTN1": "Wake en BTN1", + "Wake on Twist": "Despertar en Twist", + "LCD Brightness": "Brillo del LCD", + "Log": "Registro", + "Time Zone": "Huso horario", + "Wake on FaceUp": "Despierta en FaceUp", + "Wake on Touch": "Despertar al tacto", + "Twist Timeout": "Tiempo de espera de la torsión", + "Compact Storage": "Almacenamiento compacto", + "Clock Style": "Estilo de reloj", + "Storage": "Almacenamiento", + "Utilities": "Servicios públicos", + "Compacting...\nTakes approx\n1 minute": "La compactación...\nTarda aproximadamente\n1 minuto", + "Debug Info": "Información de depuración", + "Rewrite Settings": "Reescribir la configuración", + "Flatten Battery": "Aplastar la batería", + "Turn Off": "Apagar", + "This will remove everything": "Esto eliminará todo", + "Reset Settings": "Restablecer la configuración", + "Month": "Mes", + "Second": "Segundo", + "Date": "Fecha", + "Reset to Defaults": "Restablecer los valores predeterminados", + "Hour": "Hora", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Aplastar la batería - esto puede llevar horas.\nPulsar prolongadamente el botón para cancelar", + "Stay Connectable": "Manténgase conectado", + "Minute": "Minuta", + "No Clocks Found": "No se han encontrado relojes", + "Connectable": "Conectable", + "No app has settings": "Ninguna aplicación tiene ajustes", + "Invalid settings": "Ajustes no válidos", + "App Settings": "Configuración de la aplicación", + "Side": "Lado", + "OFF": "OFF", + "Sleep Phase Alarm": "Alarma de fase de sueño", + "Widgets": "Widgets", + "Left": "Izquierda", + "Sort Order": "Orden de clasificación", + "TIMER": "TEMPORIZADOR", + "goal": "objetivo", + "Right": "A la derecha", + "on": "en", + "Alarm": "Alarma", + "Reset All": "Restablecer todo", + "Reset all widgets": "Restablecer todos los widgets", + "Reset": "Reiniciar", + "Beep": "Bip", + "System": "Sistema", + "Locale": "Localidad", + "Message": "Mensaje", + "Set Time": "Hora de la cita", + "Vibrate": "Vibrar", + "Alerts": "Alertas", + "Timer": "Temporizador", + "Error in settings": "Error en la configuración", + "Select Clock": "Seleccionar reloj", + "Whitelist": "Lista blanca", + "Disable": "Desactivar", + "BACK": "VOLVER", + "Factory Reset": "Restablecimiento de fábrica", + "Connected": "Conectado", + "ALARM": "ALARMA", + "Messages": "Mensajes", + "Settings": "Ajustes", + "Show": "Mostrar", + "Hide": "Ocultar", + "steps": "pasos", + "back": "volver", + "Steps": "Pasos", + "Year": "Año", + "Loading": "Cargando", + "Music": "Música", + "color": "color", + "off": "fuera de", + "Theme": "Tema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "rep." + } +} \ No newline at end of file diff --git a/lang/fi_FI.json b/lang/fi_FI.json index eb1d826d8..162e6a556 100644 --- a/lang/fi_FI.json +++ b/lang/fi_FI.json @@ -1,21 +1,173 @@ { - "//":"Finnish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Hälytykset", - "Hours" : "Tunnit", - "Minutes" : "Minuutit", - "Enabled" : "Aktivoitu", - "New Alarm" : "Uusi hälytys", - "Save" : "Tallenna", - "Back" : "Paluu", - "Repeat" : "Toista", - "Delete" : "Poista", - "ALARM!" : "ALARM", - "Sleep" : "Nukkuminen" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "toistaa" - } -} + "//": "Finnish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Hälytykset", + "Hours": "Tunnit", + "Minutes": "Minuutit", + "Enabled": "Aktivoitu", + "New Alarm": "Uusi hälytys", + "Save": "Tallenna", + "Back": "Paluu", + "Repeat": "Toista", + "Delete": "Poista", + "ALARM!": "ALARM", + "Sleep": "Nukkuminen", + "New Timer": "Uusi ajastin", + "(repeat)": "(toista)", + "music": "musiikki", + "circle count": "ympyröiden lukumäärä", + "Keep Msgs": "Pidä Msgs", + "Auto snooze": "Automaattinen torkku", + "battery warn": "akkuvaroitus", + "heartrate": "syke", + "circle 4": "ympyrä 4", + "circle 2": "ympyrä 2", + "min. confidence": "min. luottamus", + "show widgets": "näytä widgetit", + "step length": "askelpituus", + "weather circle": "sääpiiri", + "circle 1": "ympyrä 1", + "circle 3": "ympyrä 3", + "week": "viikko", + "minimum": "vähintään", + "colorize icon": "väritä kuvake", + "data": "tiedot", + "distance goal": "etäisyystavoite", + "Circle": "Circle", + "valid period": "voimassaoloaika", + "maximum": "maksimi", + "Heartrate": "Sydämen syke", + "Mark Unread": "Merkitse lukematon", + "Delete all messages": "Poista kaikki viestit", + "LCD": "LCD", + "Apps": "Sovellukset", + "TAP right top/bottom": "TAP oikealle ylhäältä/alhaalta", + "App Source\nNot found": "Sovelluksen lähde\nEi löydy", + "STEPS": "STEPS", + "Launcher Settings": "Laukaisimen asetukset", + "Show clocks": "Näytä kellot", + "Vector font size": "Vektorin fonttikoko", + "Font": "Fontti", + "Yes\ndefinitely": "Kyllä\nehdottomasti", + "Bluetooth": "Bluetooth", + "Record Run": "Ennätysjuoksu", + "View Message": "Näytä viesti", + "No Messages": "Ei viestejä", + "Unread timer": "Lukematon ajastin", + "Are you sure": "Oletko varma, että", + "Delete All Messages": "Poista kaikki viestit", + "Highlight FG": "Korosta FG", + "Foreground 2": "Tulosaineisto 2", + "Foreground": "Tulosaineisto", + "Make Connectable": "Tee liitettäväksi", + "Quiet Mode": "Hiljainen tila", + "BLE": "BLE", + "Dark BW": "Tumma BW", + "Background": "Tausta", + "Background 2": "Tausta 2", + "Utils": "Utils", + "Vibration": "Tärinä", + "Piezo": "Piezo", + "HID": "HID", + "Light BW": "Vaalea BW", + "Programmable": "Ohjelmoitava", + "Customize": "Mukauta", + "Passkey BETA": "Passkey BETA", + "BTNs 1:startlap 2:exit 3:reset": "BTN:t 1:käynnistys 2:poistuminen 3:nollaus", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Utilities": "Apuohjelmat", + "Time Zone": "Aikavyöhyke", + "Clock Style": "Kello tyyli", + "Compact Storage": "Kompakti varastointi", + "Log": "Tukki", + "Debug Info": "Vianmääritystiedot", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Remove": "Poista", + "LCD Timeout": "LCD-aikakatkaisu", + "LCD Brightness": "LCD-kirkkaus", + "Wake on Touch": "Herätys kosketuksesta", + "Wake on BTN3": "Wake BTN3:lla", + "Wake on Twist": "Wake on Twist", + "Wake on BTN2": "Wake BTN2:lla", + "Wake on FaceUp": "Wake on FaceUp", + "Twist Threshold": "Twist-kynnysarvo", + "Add Device": "Lisää laite", + "Highlight BG": "Korosta BG", + "Wake on BTN1": "Wake BTN1:llä", + "Connect device\nto add to\nwhitelist": "Yhdistä laite\nlisätäksesi\nwhitelist", + "Reset to Defaults": "Nollaa oletusasetukset", + "No Clocks Found": "Kelloja ei löydy", + "Hour": "Tunti", + "Date": "Päivämäärä", + "Stay Connectable": "Pysy yhteyksissä", + "Minute": "Minuutti", + "Second": "Toinen", + "Connectable": "Liitettävissä", + "Turn Off": "Kytke pois päältä", + "This will remove everything": "Tämä poistaa kaiken", + "Reset Settings": "Nollaa asetukset", + "Right": "Oikea", + "Left": "Vasen", + "Side": "Sivu", + "Sort Order": "Lajittelujärjestys", + "Reset All": "Nollaa kaikki", + "Widgets": "Widgetit", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Akun tyhjentäminen - tämä voi kestää tunteja.\nPeruuta painamalla pitkään painiketta", + "Compacting...\nTakes approx\n1 minute": "Tiivistäminen...\nKestää noin\n1 minuutti", + "Storage": "Varastointi", + "Rewrite Settings": "Uudelleenkirjoitusasetukset", + "Flatten Battery": "Litistä akku", + "Invalid settings": "Virheelliset asetukset", + "OFF": "OFF", + "Sleep Phase Alarm": "Univaiheen hälytys", + "No app has settings": "Missään sovelluksessa ei ole asetuksia", + "App Settings": "Sovelluksen asetukset", + "Month": "Kuukausi", + "Reset": "Nollaa", + "Alarm": "Hälytys", + "Beep": "Beep", + "goal": "tavoite", + "on": "osoitteessa", + "Reset all widgets": "Nollaa kaikki widgetit", + "Select Clock": "Valitse Kello", + "Vibrate": "Värinä", + "Message": "Viesti", + "TIMER": "AJASTIN", + "Alerts": "Hälytykset", + "Locale": "Paikkakunta", + "Set Time": "Aseta aika", + "System": "Järjestelmä", + "Disable": "Poista käytöstä", + "Whitelist": "Whitelist", + "Error in settings": "Virhe asetuksissa", + "BACK": "TAKAISIN", + "Factory Reset": "Tehdasasetusten palautus", + "Timer": "Ajastin", + "Connected": "Yhdistetty", + "ALARM": "HÄLYTYS", + "Messages": "Viestit", + "Hide": "Piilota", + "Ok": "Ok", + "Show": "Näytä", + "On": "Osoitteessa", + "No": "Ei", + "Settings": "Asetukset", + "steps": "vaiheet", + "back": "takaisin", + "Steps": "Askeleet", + "Yes": "Kyllä", + "Year": "Vuosi", + "Loading": "Ladataan", + "Music": "Musiikki", + "color": "väri", + "off": "off", + "Off": "Off", + "Theme": "Teema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "toistaa" + } +} \ No newline at end of file diff --git a/lang/fr_FR.json b/lang/fr_FR.json index 209574424..ad0f03b0c 100644 --- a/lang/fr_FR.json +++ b/lang/fr_FR.json @@ -1,21 +1,173 @@ { - "//":"French language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Réveils", - "Hours" : "Heures", - "Minutes" : "Minutes", - "Enabled" : "Activé", - "New Alarm" : "Nouveau Réveil", - "Save" : "Sauvegarder", - "Back" : "Retour", - "Repeat" : "Répétition", - "Delete" : "Supprimer", - "ALARM!" : "ALARM!", - "Sleep" : "Sommeil" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "rép." - } -} + "//": "French language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Réveils", + "Hours": "Heures", + "Minutes": "Minutes", + "Enabled": "Activé", + "New Alarm": "Nouveau Réveil", + "Save": "Sauvegarder", + "Back": "Retour", + "Repeat": "Répétition", + "Delete": "Supprimer", + "ALARM!": "ALARM!", + "Sleep": "Sommeil", + "New Timer": "Nouveau Timer", + "Keep Msgs": "Garder les messages", + "(repeat)": "(répétition)", + "week": "semaine", + "Auto snooze": "Réveil automatique", + "music": "musique", + "circle 2": "cercle 2", + "circle 3": "cercle 3", + "circle count": "nombre de cercles", + "weather circle": "cercle météorologique", + "circle 4": "cercle 4", + "show widgets": "afficher les widgets", + "heartrate": "fréquence cardiaque", + "battery warn": "alerte batterie", + "circle 1": "cercle 1", + "maximum": "maximum", + "min. confidence": "confiance minimale", + "step length": "longueur des pas", + "minimum": "minimum", + "Circle": "Cercle", + "valid period": "période de validité", + "Heartrate": "Fréquence cardiaque", + "distance goal": "objectif de distance", + "Yes\ndefinitely": "Oui\ndéfinitivement", + "data": "données", + "colorize icon": "coloriser l'icône", + "TAP right top/bottom": "TAP droit haut/bas", + "App Source\nNot found": "Source de l'application\nNon trouvé", + "Font": "Police", + "STEPS": "ÉTAPES", + "Vector font size": "Taille de la police vectorielle", + "Show clocks": "Montrer les horloges", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "No Messages": "Aucun message", + "View Message": "Afficher le message", + "Launcher Settings": "Paramètres du lanceur", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1 : EXIT", + "Make Connectable": "Rendre connectable", + "Piezo": "Piezo", + "Programmable": "Programmable", + "HID": "HID", + "Mark Unread": "Marquer comme non lu", + "Are you sure": "Vous êtes sûr", + "Dark BW": "Dark BW", + "Delete all messages": "Supprimer tous les messages", + "Delete All Messages": "Supprimer tous les messages", + "Vibration": "Vibration", + "Quiet Mode": "Mode silencieux", + "Passkey BETA": "Passkey BETA", + "BLE": "BLE", + "Foreground 2": "Premier plan 2", + "Background": "Contexte", + "Record Run": "Record Run", + "Utils": "Utils", + "Bluetooth": "Bluetooth", + "Apps": "Apps", + "Customize": "Personnalisez", + "Background 2": "Contexte 2", + "Light BW": "Light BW", + "LCD": "LCD", + "Unread timer": "Minuterie non lue", + "Foreground": "Premier plan", + "Remove": "Retirer", + "Highlight FG": "Highlight FG", + "Add Device": "Ajouter un dispositif", + "Highlight BG": "Mettre en évidence BG", + "Wake on BTN1": "Réveil sur BTN1", + "Connect device\nto add to\nwhitelist": "Connecter le dispositif\nà ajouter à\nliste blanche", + "LCD Timeout": "Temporisation de l'écran LCD", + "LCD Brightness": "Luminosité de l'écran LCD", + "Wake on BTN2": "Wake sur BTN2", + "Wake on BTN3": "Wake sur BTN3", + "Wake on FaceUp": "Réveillez-vous sur FaceUp", + "Wake on Touch": "Réveil au toucher", + "Twist Threshold": "Seuil de torsion", + "Wake on Twist": "Réveil sur Twist", + "Reset to Defaults": "Réinitialisation des valeurs par défaut", + "Utilities": "Utilitaires", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Mise à plat de la batterie - cela peut prendre des heures.\nAppuyez longuement sur le bouton pour annuler", + "Flatten Battery": "Aplatir la batterie", + "Storage": "Stockage", + "Reset Settings": "Réinitialiser les paramètres", + "Log": "Journal de bord", + "Rewrite Settings": "Paramètres de réécriture", + "Compacting...\nTakes approx\n1 minute": "Compactage...\nPrend environ\n1 minute", + "Time Zone": "Fuseau horaire", + "Clock Style": "Style de l'horloge", + "Debug Info": "Informations de débogage", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Compact Storage": "Stockage compact", + "App Settings": "Paramètres de l'application", + "No app has settings": "Aucune application n'a de paramètres", + "Sleep Phase Alarm": "Alarme de phase de sommeil", + "Month": "Mois", + "Turn Off": "Désactiver", + "This will remove everything": "Cela va supprimer tout", + "Date": "Date", + "Hour": "Heure", + "Right": "Droit", + "Left": "Gauche", + "No Clocks Found": "Aucune horloge trouvée", + "Sort Order": "Ordre de tri", + "OFF": "OFF", + "Side": "Côté", + "TIMER": "TIMER", + "Reset All": "Réinitialiser tout", + "Second": "Deuxièmement", + "Connectable": "Connectable", + "Minute": "Minute", + "Stay Connectable": "Restez connecté", + "Invalid settings": "Paramètres non valides", + "Widgets": "Widgets", + "Vibrate": "Vibrer", + "Reset all widgets": "Réinitialiser tous les widgets", + "Whitelist": "Liste blanche", + "Set Time": "Définir l'heure", + "System": "Système", + "Connected": "Connecté", + "Alerts": "Alertes", + "Locale": "Locale", + "Alarm": "Alarme", + "Reset": "Réinitialiser", + "on": "sur", + "Beep": "Bip", + "Factory Reset": "Réinitialisation d'usine", + "Select Clock": "Sélectionner l'horloge", + "Disable": "Désactiver", + "Message": "Message", + "goal": "objectif", + "Show": "Afficher", + "Hide": "Cacher", + "Messages": "Messages", + "BACK": "BACK", + "Error in settings": "Erreur dans les paramètres", + "Timer": "Minuterie", + "On": "Sur", + "No": "Non", + "Ok": "Ok", + "steps": "étapes", + "Settings": "Paramètres", + "ALARM": "ALARME", + "back": "dos", + "Yes": "Oui", + "Steps": "Étapes", + "Year": "Année", + "Loading": "Chargement", + "Music": "Musique", + "color": "couleur", + "Off": "Off", + "off": "off", + "Theme": "Thème" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "rép." + } +} \ No newline at end of file diff --git a/lang/hu_HU.json b/lang/hu_HU.json index 8e5df6ed7..62d956a3c 100644 --- a/lang/hu_HU.json +++ b/lang/hu_HU.json @@ -1,21 +1,173 @@ { - "//":"Spanish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Riasztások", - "Hours" : "Óra", - "Minutes" : "Perc", - "Enabled" : "Aktiválva", - "New Alarm" : "Új riasztás", - "Save" : "Mentés", - "Back" : "Vissza", - "Repeat" : "Ismétlés", - "Delete" : "Törlés", - "ALARM!" : "ALARM!", - "Sleep" : "Alvás" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "ismétlés" - } -} + "//": "Spanish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Riasztások", + "Hours": "Óra", + "Minutes": "Perc", + "Enabled": "Aktiválva", + "New Alarm": "Új riasztás", + "Save": "Mentés", + "Back": "Vissza", + "Repeat": "Ismétlés", + "Delete": "Törlés", + "ALARM!": "ALARM!", + "Sleep": "Alvás", + "New Timer": "Új időzítő", + "Auto snooze": "Automatikus szundi", + "(repeat)": "(ismétlés)", + "Keep Msgs": "Msgs megtartása", + "music": "zene", + "week": "hét", + "min. confidence": "min. bizalom", + "minimum": "minimum", + "data": "adatok", + "Heartrate": "Szívritmus", + "battery warn": "akkumulátor figyelmeztetés", + "maximum": "maximum", + "show widgets": "widgetek megjelenítése", + "circle count": "körök száma", + "circle 1": "1. kör", + "circle 4": "4. kör", + "heartrate": "szívritmus", + "circle 3": "3. kör", + "circle 2": "2. kör", + "valid period": "érvényes időszak", + "step length": "lépéshossz", + "distance goal": "távolsági cél", + "Circle": "Kör", + "colorize icon": "ikon színezése", + "weather circle": "időjárási kör", + "TAP right top/bottom": "TAP jobbra fent/alul", + "Launcher Settings": "Indító beállításai", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Yes\ndefinitely": "Igen\nhatározottan", + "App Source\nNot found": "Alkalmazás forrása\nNem található", + "No Messages": "Nincs üzenet", + "Unread timer": "Olvasatlan időzítő", + "Record Run": "Rekord futás", + "Font": "Betűtípus", + "Vector font size": "Vektor betűméret", + "Show clocks": "Mutassa az órákat", + "Delete all messages": "Minden üzenet törlése", + "Are you sure": "Biztos vagy benne, hogy", + "Delete All Messages": "Minden üzenet törlése", + "STEPS": "LÉPÉSEK", + "Apps": "Alkalmazások", + "View Message": "Üzenet megtekintése", + "LCD": "LCD", + "Bluetooth": "Bluetooth", + "Piezo": "Piezo", + "Utils": "Utils", + "BTNs 1:startlap 2:exit 3:reset": "BTN-ek 1:startlap 2:exit 3:reset", + "Mark Unread": "Mark Unread", + "LCD Brightness": "LCD fényerő", + "Customize": "Testreszabás", + "Light BW": "Világos BW", + "Background": "Háttér", + "Highlight BG": "Kiemelés BG", + "Highlight FG": "FG kiemelése", + "Foreground": "Új információk és jogok", + "Foreground 2": "Előtérben 2", + "Background 2": "Háttér 2", + "Remove": "Távolítsa el a", + "Connect device\nto add to\nwhitelist": "Eszköz csatlakoztatása\nhozzáadni a\nfehérlistára", + "Add Device": "Eszköz hozzáadása", + "Dark BW": "Sötét BW", + "Passkey BETA": "Passkey BETA", + "HID": "HID", + "Wake on BTN3": "Wake a BTN3-on", + "Wake on BTN1": "Wake a BTN1-en", + "Wake on BTN2": "Wake a BTN2-n", + "BLE": "BLE", + "Vibration": "Rezgés", + "Make Connectable": "Csatlakoztathatóvá tenni", + "Programmable": "Programozható", + "Quiet Mode": "Csendes üzemmód", + "Twist Threshold": "Twist küszöbérték", + "Wake on FaceUp": "Ébredj a FaceUp-on", + "Twist Timeout": "Twist Timeout", + "Utilities": "Közművek", + "Twist Max Y": "Twist Max Y", + "Time Zone": "Időzóna", + "Log": "Napló", + "Clock Style": "Óra stílus", + "Compact Storage": "Kompakt tárolás", + "Storage": "Tárolás", + "Wake on Twist": "Wake on Twist", + "Debug Info": "Hibaelhárítási információ", + "Flatten Battery": "Lapos akkumulátor", + "Wake on Touch": "Ébresztés érintésre", + "LCD Timeout": "LCD Timeout", + "Rewrite Settings": "Újraírási beállítások", + "This will remove everything": "Ez mindent eltávolít", + "Turn Off": "Kikapcsolás", + "Stay Connectable": "Maradjon összekapcsolható", + "Reset to Defaults": "Alapértelmezettre visszaállítása", + "Reset Settings": "Beállítások visszaállítása", + "Compacting...\nTakes approx\n1 minute": "Tömörítés...\nKb.\n1 perc", + "No Clocks Found": "Nem találtak órákat", + "TIMER": "TIMER", + "Connectable": "Csatlakoztatható", + "Side": "Oldal", + "Reset all widgets": "Minden widget alaphelyzetbe állítása", + "Reset All": "Minden visszaállítása", + "Left": "Balra", + "Widgets": "Widgetek", + "Right": "Jobbra", + "Sort Order": "Rendezési sorrend", + "Date": "Dátum", + "Hour": "Óra", + "goal": "cél", + "Beep": "Beep", + "Reset": "Reset", + "on": "a oldalon", + "App Settings": "Alkalmazás beállításai", + "OFF": "OFF", + "No app has settings": "Egyetlen alkalmazás sem rendelkezik beállításokkal", + "Invalid settings": "Érvénytelen beállítások", + "Minute": "Perc", + "Sleep Phase Alarm": "Alvási fázis riasztás", + "Second": "Második", + "Month": "Hónap", + "Alarm": "Riasztás", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Az akkumulátor lapítása - ez órákig is eltarthat.\nHosszan nyomja meg a gombot a törléshez", + "Whitelist": "Fehér lista", + "Alerts": "Riasztások", + "Disable": "A letiltása", + "Set Time": "Beállított idő", + "Select Clock": "Óra kiválasztása", + "Message": "Üzenet", + "System": "Rendszer", + "Vibrate": "Rezgés", + "Locale": "Helyszín", + "Factory Reset": "Gyári visszaállítás", + "BACK": "VISSZA", + "ALARM": "ALARM", + "Timer": "Időzítő", + "Connected": "Csatlakoztatva", + "Error in settings": "Hiba a beállításokban", + "Messages": "Üzenetek", + "Ok": "Oké", + "No": "Nem", + "back": "vissza", + "steps": "lépések", + "Year": "Év", + "Steps": "Lépések", + "On": "A oldalon.", + "Settings": "Beállítások", + "Hide": "Rejtsd el", + "Show": "Mutasd meg a", + "Yes": "Igen", + "Loading": "Betöltés", + "Music": "Zene", + "color": "szín", + "off": "off", + "Off": "Off", + "Theme": "Téma" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "ismétlés" + } +} \ No newline at end of file diff --git a/lang/index.json b/lang/index.json index 3d492783d..1a9c851d8 100644 --- a/lang/index.json +++ b/lang/index.json @@ -9,5 +9,9 @@ {"code":"it_IT","name":"Italian","url":"it_IT.json"}, {"code":"nl_NL","name":"Dutch","url":"nl_NL.json"}, {"code":"sv_SE","name":"Swedish","url":"sv_SE.json"}, - {"code":"tr_TR","name":"Turkish","url":"tr_TR.json"} + {"code":"tr_TR","name":"Turkish","url":"tr_TR.json"}, + {"code":"zh_ZH","name":"Chinese","url":"zh_ZH.json"}, + {"code":"ru_RU","name":"Russian","url":"ru_RU.json"}, + {"code":"pt_PT","name":"Portuguese","url":"pt_PT.json"}, + {"code":"ja_JA","name":"Japanese","url":"ja_JA.json"} ] diff --git a/lang/it_IT.json b/lang/it_IT.json index c64fc828a..07545e1e7 100644 --- a/lang/it_IT.json +++ b/lang/it_IT.json @@ -1,148 +1,186 @@ { - "//1": "Italian language translations", - "GLOBAL": { - "//": "Translations that apply for all apps", - "On": "On", - "on": "on", - "Off": "Off", - "off": "off", - "Ok": "Ok", - "Yes": "Sì", - "No": "No", - "Alarm": "Sveglia", - "ALARM": "SVEGLIA", - "Alarms": "Sveglie", - "Date": "Data", - "Year": "Anno", - "Month": "Mese", - "Day": "Giorno", - "Hour": "Ora", - "Hours": "Ore", - "Minute": "Minuto", - "Minutes": "Minuti", - "Second": "Secondo", - "Seconds": "Secondi", - "week": "settimana", - "Week": "Settimana", - "Enabled": "Attivo/a", - "New Alarm": "Nuova sveglia", - "Save": "Salva", - "Cancel": "Annulla", - "Back": "Indietro", - "Repeat": "Ripeti", - "Delete": "Cancella", - "ALARM!": "SVEGLIA!", - "Sleep": "Dormi", - "Timer": "Timer", - "TIMER": "TIMER", - "New Timer": "Nuovo timer", - "(repeat)": "(ripeti)", - "Auto snooze": "Posticipa automaticamente", - "Connected": "Connesso", - "Delete all messages": "Cancella tutti i messaggi", - "Delete All Messages": "Cancella tutti i messaggi", - "Message": "Messaggio", - "Messages": "Messaggi", - "No Messages": "Nessun messaggio", - "Keep Msgs": "Tieni i messaggi", - "Mark Unread": "Segna come non letto", - "Vibrate": "Vibrazione", - "Are you sure": "Sei sicuro/a", - "Music": "Musica", - "Apps": "App", - "App Settings": "Impostazioni app", - "Bluetooth": "Bluetooth", - "BLE": "BLE", - "Make Connectable": "Rendi collegabile", - "Programmable": "Programmabile", - "Remove": "Rimuovi", - "Utils": "Utilità", - "LCD": "LCD", - "LCD Brightness": "Luminosità LCD", - "LCD Timeout": "Timeout LCD", - "Wake on BTN1": "Risveglia con BTN1", - "Wake on BTN2": "Risveglia con BTN2", - "Wake on BTN3": "Risveglia con BTN3", - "Wake on FaceUp": "Risveglia a faccia in su", - "Wake on Touch": "Risveglia al tocco", - "Wake on Twist": "Risveglia con polso", - "Twist Timeout": "Timeout torsione", - "Twist Max Y": "Torsione Y max", - "Twist Threshold": "Soglia torsione", - "Customize": "Personalizza", - "Add Device": "Aggiungi dispositivo", - "Left": "Sinistra", - "Right": "Destra", - "Widgets": "Widget", - "Settings": "Impostazioni", - "No app has settings": "Non ci sono app con delle impostazioni", - "System": "Sistema", - "Alerts": "Avvisi", - "Theme": "Tema", - "Foreground": "Primo piano", - "Background": "Sfondo", - "Foreground 2": "Primo piano 2", - "Background 2": "Sfondo 2", - "Highlight FG": "Selezione PP", - "Highlight BG": "Selezione Sf", - "Utilities": "Utilità", - "Storage": "Memoria", - "Compact Storage": "Compatta memoria", - "Select Clock": "Seleziona orologio", - "No Clocks Found": "Nessun orologio trovato", - "Locale": "Localizzazione", - "Set Time": "Imposta orario", - "Time Zone": "Fuso orario", - "Whitelist": "Whitelist", - "Quiet Mode": "Modalità silenziosa", - "Disable": "Disabilita", - "Vibration": "Vibrazione", - "Show": "Mostra", - "Hide": "Nascondi", - "Rewrite Settings": "Riscrivi impostazioni", - "Reset Settings": "Reset impostazioni", - "Factory Reset": "Ripristino condizioni iniziali", - "Flatten Battery": "Scarica la batteria", - "Turn Off": "Spegni", - "This will remove everything": "Questo rimuoverà TUTTO", - "Error in settings": "Errore nelle impostazioni", - "Invalid settings": "Impostazioni non valide", - "Loading": "Caricamento", - "Launcher Settings": "Impostazioni Launcher", - "Font": "Font", - "Show clocks": "Mostra orologi", - "Log": "Log", - "Steps": "Passi", - "steps": "passi" - }, - "//2": "App-specific overrides", - "launch": { - "Vector font size": "Dim. font vett.", - "App Source\nNot found": "Codice app\nnon trovato" - }, - "messages": { - "Unread timer": "Timer msg non letti" - }, - "run": { - "Record Run": "Registra corsa" - }, - "setting": { - "Clock Style": "Formato ora", - "Compacting...\nTakes approx\n1 minute": "Compattamento in corso...\nCi vorrà circa un minuto", - "//1": "The new line before 'operazione' improves the layout", - "Flattening battery - this can take hours.\nLong-press button to cancel": "Scaricamento batteria in corso - l'\noperazione può richiedere ore. Tieni premuto il pulsante per annullare", - "Reset to Defaults": "Ripristinare le impostazioni predefinite", - "Connectable": "Collegamento", - "Connect device\nto add to\nwhitelist": "Collega un\ndispositivo\nper metterlo\nin whitelist", - "Stay Connectable": "Rimanere collegabile", - "Light BW": "Chiaro", - "Dark BW": "Scuro" - }, - "wid_edit": { - "Reset": "Ripristina", - "Reset All": "Ripristina tutto", - "Reset all widgets": "Ripristina tutti i widget", - "Sort Order": "Ordinamento", - "Side": "Lato" - } -} + "//1": "Italian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "On": "On", + "on": "on", + "Off": "Off", + "off": "off", + "Ok": "Ok", + "Yes": "Sì", + "No": "No", + "Alarm": "Sveglia", + "ALARM": "SVEGLIA", + "Alarms": "Sveglie", + "Date": "Data", + "Year": "Anno", + "Month": "Mese", + "Day": "Giorno", + "Hour": "Ora", + "Hours": "Ore", + "Minute": "Minuto", + "Minutes": "Minuti", + "Second": "Secondo", + "Seconds": "Secondi", + "week": "settimana", + "Week": "Settimana", + "Enabled": "Attivo/a", + "New Alarm": "Nuova sveglia", + "Save": "Salva", + "Cancel": "Annulla", + "Back": "Indietro", + "Repeat": "Ripeti", + "Delete": "Cancella", + "ALARM!": "SVEGLIA!", + "Sleep": "Dormi", + "Timer": "Timer", + "TIMER": "TIMER", + "New Timer": "Nuovo timer", + "(repeat)": "(ripeti)", + "Auto snooze": "Posticipa automaticamente", + "Connected": "Connesso", + "Delete all messages": "Cancella tutti i messaggi", + "Delete All Messages": "Cancella tutti i messaggi", + "Message": "Messaggio", + "Messages": "Messaggi", + "No Messages": "Nessun messaggio", + "Keep Msgs": "Tieni i messaggi", + "Mark Unread": "Segna come non letto", + "Vibrate": "Vibrazione", + "Are you sure": "Sei sicuro/a", + "Music": "Musica", + "Apps": "App", + "App Settings": "Impostazioni app", + "Bluetooth": "Bluetooth", + "BLE": "BLE", + "Make Connectable": "Rendi collegabile", + "Programmable": "Programmabile", + "Remove": "Rimuovi", + "Utils": "Utilità", + "LCD": "LCD", + "LCD Brightness": "Luminosità LCD", + "LCD Timeout": "Timeout LCD", + "Wake on BTN1": "Risveglia con BTN1", + "Wake on BTN2": "Risveglia con BTN2", + "Wake on BTN3": "Risveglia con BTN3", + "Wake on FaceUp": "Risveglia a faccia in su", + "Wake on Touch": "Risveglia al tocco", + "Wake on Twist": "Risveglia con polso", + "Twist Timeout": "Timeout torsione", + "Twist Max Y": "Torsione Y max", + "Twist Threshold": "Soglia torsione", + "Customize": "Personalizza", + "Add Device": "Aggiungi dispositivo", + "Left": "Sinistra", + "Right": "Destra", + "Widgets": "Widget", + "Settings": "Impostazioni", + "No app has settings": "Non ci sono app con delle impostazioni", + "System": "Sistema", + "Alerts": "Avvisi", + "Theme": "Tema", + "Foreground": "Primo piano", + "Background": "Sfondo", + "Foreground 2": "Primo piano 2", + "Background 2": "Sfondo 2", + "Highlight FG": "Selezione PP", + "Highlight BG": "Selezione Sf", + "Utilities": "Utilità", + "Storage": "Memoria", + "Compact Storage": "Compatta memoria", + "Select Clock": "Seleziona orologio", + "No Clocks Found": "Nessun orologio trovato", + "Locale": "Localizzazione", + "Set Time": "Imposta orario", + "Time Zone": "Fuso orario", + "Whitelist": "Whitelist", + "Quiet Mode": "Modalità silenziosa", + "Disable": "Disabilita", + "Vibration": "Vibrazione", + "Show": "Mostra", + "Hide": "Nascondi", + "Rewrite Settings": "Riscrivi impostazioni", + "Reset Settings": "Reset impostazioni", + "Factory Reset": "Ripristino condizioni iniziali", + "Flatten Battery": "Scarica la batteria", + "Turn Off": "Spegni", + "This will remove everything": "Questo rimuoverà TUTTO", + "Error in settings": "Errore nelle impostazioni", + "Invalid settings": "Impostazioni non valide", + "Loading": "Caricamento", + "Launcher Settings": "Impostazioni Launcher", + "Font": "Font", + "Show clocks": "Mostra orologi", + "Log": "Log", + "Steps": "Passi", + "steps": "passi", + "music": "musica", + "circle 4": "cerchio 4", + "circle 3": "cerchio 3", + "circle 1": "cerchio 1", + "circle 2": "cerchio 2", + "circle count": "conteggio dei cerchi", + "minimum": "minimo", + "weather circle": "cerchio meteorologico", + "show widgets": "mostra i widget", + "heartrate": "frequenza cardiaca", + "battery warn": "avvertire la batteria", + "Heartrate": "Battito cardiaco", + "valid period": "periodo valido", + "distance goal": "obiettivo di distanza", + "min. confidence": "fiducia minima", + "maximum": "massimo", + "Circle": "Cerchio", + "data": "dati", + "step length": "lunghezza del passo", + "View Message": "Visualizza il messaggio", + "Yes\ndefinitely": "Sì\nsicuramente", + "Piezo": "Piezo", + "colorize icon": "colorare l'icona", + "STEPS": "PASSI", + "TAP right top/bottom": "TAP in alto/basso a destra", + "HID": "HID", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Passkey BETA": "Passkey BETA", + "goal": "obiettivo", + "Beep": "Bip", + "Debug Info": "Informazioni di debug", + "OFF": "OFF", + "Reset": "Reset", + "Sleep Phase Alarm": "Allarme della fase di sonno", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "back": "indietro", + "color": "colore", + "BACK": "INDIETRO" + }, + "//2": "App-specific overrides", + "launch": { + "Vector font size": "Dim. font vett.", + "App Source\nNot found": "Codice app\nnon trovato" + }, + "messages": { + "Unread timer": "Timer msg non letti" + }, + "run": { + "Record Run": "Registra corsa" + }, + "setting": { + "Clock Style": "Formato ora", + "Compacting...\nTakes approx\n1 minute": "Compattamento in corso...\nCi vorrà circa un minuto", + "//1": "The new line before 'operazione' improves the layout", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Scaricamento batteria in corso - l'\noperazione può richiedere ore. Tieni premuto il pulsante per annullare", + "Reset to Defaults": "Ripristinare le impostazioni predefinite", + "Connectable": "Collegamento", + "Connect device\nto add to\nwhitelist": "Collega un\ndispositivo\nper metterlo\nin whitelist", + "Stay Connectable": "Rimanere collegabile", + "Light BW": "Chiaro", + "Dark BW": "Scuro" + }, + "wid_edit": { + "Reset": "Ripristina", + "Reset All": "Ripristina tutto", + "Reset all widgets": "Ripristina tutti i widget", + "Sort Order": "Ordinamento", + "Side": "Lato" + } +} \ No newline at end of file diff --git a/lang/ja_JA.json b/lang/ja_JA.json new file mode 100644 index 000000000..2852fd9e3 --- /dev/null +++ b/lang/ja_JA.json @@ -0,0 +1,167 @@ +{ + "//": "Japanese language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "新型アラーム", + "New Timer": "新型タイマー", + "Save": "保存", + "Keep Msgs": "Keep Msgs", + "circle count": "サークルカウント", + "(repeat)": "(繰り返し)", + "music": "音楽", + "Auto snooze": "オートスヌーズ", + "week": "ウィーク", + "circle 1": "サークル1", + "circle 3": "サークル3", + "circle 2": "サークル2", + "show widgets": "show widgets", + "heartrate": "心拍数", + "circle 4": "サークル4", + "battery warn": "バッテリー警告", + "valid period": "有効期間", + "maximum": "最大", + "weather circle": "ウェザーサークル", + "minimum": "ミニマム", + "step length": "ステップ長", + "distance goal": "距離目標", + "Circle": "サークル", + "min. confidence": "最低限の自信", + "colorize icon": "カラライズアイコン", + "Heartrate": "心拍数", + "data": "データ", + "Yes\ndefinitely": "はい。\n間違いなく", + "Launcher Settings": "ランチャー設定", + "TAP right top/bottom": "TAP右上/左下", + "Font": "フォント", + "Mark Unread": "マーク・アンリード", + "start&lap/reset, BTN1: EXIT": "スタート&ラップ&リセット、BTN1:EXIT", + "App Source\nNot found": "アプリソース\n見つからない", + "Show clocks": "時計の表示", + "STEPS": "ステップ", + "Vector font size": "ベクターのフォントサイズ", + "View Message": "メッセージを見る", + "Are you sure": "本当にいいの?", + "Bluetooth": "ブルートゥース", + "Unread timer": "未読のタイマー", + "Delete all messages": "すべてのメッセージの削除", + "No Messages": "メッセージなし", + "Record Run": "レコード・ラン", + "Apps": "アプリ", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Delete All Messages": "全メッセージの削除", + "Vibration": "振動", + "Utils": "ユーティライゼーション", + "Piezo": "ピエゾ", + "BLE": "BLE", + "Make Connectable": "接続可能にする", + "HID": "HID", + "Light BW": "ライトBW", + "LCD": "LCD", + "Background": "背景", + "Foreground": "フォアグラウンド", + "Programmable": "プログラム可能", + "Customize": "カスタマイズ", + "Dark BW": "ダークBW", + "Background 2": "背景2", + "Quiet Mode": "クワイエットモード", + "Highlight FG": "ハイライトFG", + "Foreground 2": "フォアグラウンド2", + "Remove": "削除", + "Passkey BETA": "Passkey BETA", + "Add Device": "デバイスの追加", + "LCD Timeout": "LCDタイムアウト", + "Highlight BG": "ハイライトBG", + "LCD Brightness": "液晶ディスプレイの明るさ", + "Connect device\nto add to\nwhitelist": "接続機器\nに追加します。\nホワイトリスト", + "Wake on BTN3": "Wake on BTN3", + "Wake on BTN2": "Wake on BTN2", + "Time Zone": "タイムゾーン", + "Wake on Touch": "ウェイクオンタッチ", + "Twist Timeout": "ツイストタイムアウト", + "Wake on Twist": "ウェイクオンツイスト", + "Wake on BTN1": "Wake on BTN1", + "Log": "ログ", + "Wake on FaceUp": "Wake on FaceUp", + "Twist Max Y": "ツイストマックスY", + "Utilities": "ユーティリティー", + "Clock Style": "クロックスタイル", + "Rewrite Settings": "リライト設定", + "Flatten Battery": "バッテリーを平らにする", + "Debug Info": "デバッグ情報", + "Storage": "ストレージ", + "Reset Settings": "設定のリセット", + "Twist Threshold": "ツイスト・スレッショルド", + "Turn Off": "電源オフ", + "Compact Storage": "コンパクトなストレージ", + "Reset to Defaults": "初期設定へのリセット", + "Second": "セカンド", + "Compacting...\nTakes approx\n1 minute": "コンパクトにして...。\n所要時間約\n1分", + "Date": "日付", + "Minute": "分", + "Connectable": "接続可能", + "Stay Connectable": "Stay Connectable", + "Hour": "時間", + "No Clocks Found": "No Clock Found", + "App Settings": "アプリの設定", + "Flattening battery - this can take hours.\nLong-press button to cancel": "バッテリーのフラット化 - これには数時間かかります。\nボタンの長押しでキャンセル", + "Month": "月", + "OFF": "OFF", + "Right": "右", + "Widgets": "ウィジェット", + "Left": "左", + "Sort Order": "並び替え", + "Side": "サイド", + "No app has settings": "設定のないアプリ", + "Sleep Phase Alarm": "スリープフェーズアラーム", + "Invalid settings": "無効な設定", + "TIMER": "TIMER", + "Reset All": "すべてをリセット", + "This will remove everything": "これにより、すべてのものが削除されます。", + "Alarm": "アラーム", + "on": "で", + "Minutes": "分", + "Reset all widgets": "全ウィジェットのリセット", + "Hours": "時間", + "Enabled": "有効", + "Repeat": "リピート", + "Delete": "削除", + "Reset": "リセット", + "goal": "ゴール", + "Beep": "ビープ", + "Message": "メッセージ", + "System": "システム", + "Select Clock": "セレクトクロック", + "Locale": "ロケール", + "Vibrate": "振動", + "Alerts": "アラート", + "Whitelist": "ホワイトリスト", + "Set Time": "セット時間", + "Disable": "Disable", + "BACK": "BACK", + "ALARM": "ALARM", + "Timer": "タイマー", + "Error in settings": "設定のエラー", + "Factory Reset": "ファクトリーリセット", + "Sleep": "睡眠", + "Connected": "コネクテッド", + "Messages": "メッセージ", + "Hide": "隠す", + "Show": "ショー", + "On": "オン", + "Ok": "OK", + "No": "いいえ", + "Settings": "設定", + "steps": "ステップ", + "back": "バック", + "Steps": "ステップ", + "Year": "年", + "Yes": "はい。", + "Loading": "ローディング", + "Music": "音楽", + "color": "カラー", + "off": "オフ", + "Off": "オフ", + "Theme": "テーマ", + "Back": "バック" + } +} \ No newline at end of file diff --git a/lang/nl_NL.json b/lang/nl_NL.json index a04e46928..0a39fefb2 100644 --- a/lang/nl_NL.json +++ b/lang/nl_NL.json @@ -1,21 +1,173 @@ { - "//":"Dutch language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Alarmen", - "Hours" : "Uren", - "Minutes" : "Minuten", - "Enabled" : "Geactiveerd", - "New Alarm" : "Nieuw alarm", - "Save" : "Opslaan", - "Back" : "Terug", - "Repeat" : "Herhalen", - "Delete" : "Verwijderen", - "ALARM!" : "ALARV.", - "Sleep" : "Stand-by" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "herhalen" - } -} + "//": "Dutch language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Alarmen", + "Hours": "Uren", + "Minutes": "Minuten", + "Enabled": "Geactiveerd", + "New Alarm": "Nieuw alarm", + "Save": "Opslaan", + "Back": "Terug", + "Repeat": "Herhalen", + "Delete": "Verwijderen", + "ALARM!": "ALARV.", + "Sleep": "Stand-by", + "New Timer": "Nieuwe Timer", + "(repeat)": "(herhaling)", + "music": "muziek", + "week": "week", + "Auto snooze": "Auto snooze", + "Keep Msgs": "Houd Msgs", + "circle count": "cirkeltelling", + "Heartrate": "Hartslag", + "weather circle": "weercirkel", + "circle 1": "cirkel 1", + "show widgets": "widgets tonen", + "circle 4": "cirkel 4", + "maximum": "maximum", + "circle 3": "cirkel 3", + "circle 2": "cirkel 2", + "minimum": "minimum", + "valid period": "geldige periode", + "heartrate": "hartslag", + "battery warn": "batterijwaarschuwing", + "data": "gegevens", + "step length": "staplengte", + "min. confidence": "min. vertrouwen", + "colorize icon": "pictogram inkleuren", + "distance goal": "afstandsdoel", + "Circle": "Cirkel", + "TAP right top/bottom": "TAP rechts boven/onder", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Are you sure": "Weet je het zeker?", + "Font": "Lettertype", + "App Source\nNot found": "App Bron\nNiet gevonden", + "Launcher Settings": "Launcher Instellingen", + "Yes\ndefinitely": "Ja\nzeker", + "STEPS": "STAPPEN", + "Show clocks": "Toon klokken", + "Record Run": "Record run", + "No Messages": "Geen berichten.", + "View Message": "Bekijk bericht", + "Piezo": "Piëzo", + "BTNs 1:startlap 2:exit 3:reset": "BTN's 1:startlap 2:exit 3:reset", + "Vector font size": "Vector lettergrootte", + "Mark Unread": "Markeer ongelezen", + "Delete all messages": "Alle berichten verwijderen", + "LCD": "LCD", + "Utils": "Utils", + "Bluetooth": "Bluetooth", + "Delete All Messages": "Alle berichten verwijderen", + "Unread timer": "Ongelezen timer", + "Make Connectable": "Maak Verbindbaar", + "Quiet Mode": "Rustige modus", + "BLE": "BLE", + "Dark BW": "Donker BW", + "Apps": "Apps", + "Programmable": "Programmeerbaar", + "Vibration": "Trilling", + "HID": "HID", + "Foreground 2": "Voorgrond 2", + "Passkey BETA": "Passkey BETA", + "Background": "Achtergrond", + "Light BW": "Licht BW", + "Customize": "Aanpassen", + "Background 2": "Achtergrond 2", + "Highlight FG": "Markeer FG", + "Highlight BG": "Markeer BG", + "Foreground": "Voorgrond", + "LCD Timeout": "LCD Timeout", + "LCD Brightness": "LCD-helderheid", + "Remove": "Verwijder", + "Add Device": "Apparaat toevoegen", + "Connect device\nto add to\nwhitelist": "Apparaat aansluiten\ntoe te voegen aan\nwhitelist", + "Wake on Twist": "Wake on Twist", + "Wake on BTN2": "Wake op BTN2", + "Wake on BTN1": "Wake op BTN1", + "Wake on FaceUp": "Wakker worden op FaceUp", + "Log": "Log", + "Debug Info": "Debug info", + "Wake on BTN3": "Wake op BTN3", + "Flatten Battery": "Batterij plat maken", + "Rewrite Settings": "Instellingen herschrijven", + "Compact Storage": "Compacte opslag", + "Utilities": "Nutsbedrijven", + "Clock Style": "Klok Stijl", + "Time Zone": "Tijdzone", + "Twist Timeout": "Time-out draaien", + "Twist Max Y": "Twist Max Y", + "Twist Threshold": "Twist Drempel", + "Wake on Touch": "Wakker worden bij aanraking", + "Compacting...\nTakes approx\n1 minute": "Verdichten...\nDuurt ongeveer\n1 minuut", + "Reset to Defaults": "Terugzetten op standaardwaarden", + "No Clocks Found": "Geen klokken gevonden", + "Month": "Maand", + "Minute": "Minuutje", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Batterij leegmaken - dit kan uren duren.\nDruk lang op de knop om te annuleren", + "Sleep Phase Alarm": "Slaapfase alarm", + "Second": "Tweede", + "Turn Off": "Zet uit.", + "Hour": "Uur", + "Storage": "Opslag", + "Date": "Datum", + "Reset Settings": "Reset Instellingen", + "This will remove everything": "Dit zal alles verwijderen", + "Connectable": "Aansluitbaar", + "App Settings": "App-instellingen", + "No app has settings": "Geen app heeft instellingen", + "Stay Connectable": "Blijf verbonden", + "on": "op", + "Sort Order": "Sorteer volgorde", + "Widgets": "Widgets", + "Invalid settings": "Ongeldige instellingen", + "Reset All": "Alles resetten", + "Reset all widgets": "Reset alle widgets", + "OFF": "UIT", + "Left": "Links", + "Right": "Rechts", + "Side": "Zijde", + "TIMER": "TIMER", + "Alarm": "Alarm", + "goal": "doel", + "Reset": "Reset", + "Beep": "Beep", + "System": "Systeem", + "Locale": "Locale", + "Vibrate": "Trillen", + "Message": "Bericht", + "Alerts": "Waarschuwingen", + "Select Clock": "Selecteer Klok", + "Timer": "Timer", + "ALARM": "ALARM", + "Factory Reset": "Fabrieks reset", + "Hide": "Verberg", + "Messages": "Berichten", + "Error in settings": "Fout in instellingen", + "BACK": "ACHTER", + "Whitelist": "Whitelist", + "Set Time": "Tijd instellen", + "Disable": "Uitschakelen", + "Connected": "Aangesloten", + "On": "Op", + "Show": "Toon", + "Ok": "Ok", + "No": "Geen", + "Settings": "Instellingen", + "Steps": "Stappen", + "steps": "stappen", + "back": "terug", + "Year": "Jaar", + "Yes": "Ja", + "Loading": "Laden", + "Music": "Muziek", + "color": "kleur", + "off": "van", + "Off": "Uit", + "Theme": "Thema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "herhalen" + } +} \ No newline at end of file diff --git a/lang/pt_PT.json b/lang/pt_PT.json new file mode 100644 index 000000000..837f7dab7 --- /dev/null +++ b/lang/pt_PT.json @@ -0,0 +1,167 @@ +{ + "//": "Portuguese language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Timer": "Novo Temporizador", + "New Alarm": "Novo Alarme", + "Auto snooze": "Soneca automática", + "week": "semana", + "circle 3": "círculo 3", + "(repeat)": "(repetir)", + "Save": "Salvar", + "Keep Msgs": "Manter Msgs", + "music": "música", + "circle 4": "círculo 4", + "circle 2": "círculo 2", + "circle count": "contagem em círculo", + "circle 1": "círculo 1", + "battery warn": "aviso de bateria", + "show widgets": "widgets de exposição", + "data": "dados", + "heartrate": "banda funerária", + "distance goal": "golo da distância", + "Circle": "Círculo", + "colorize icon": "ícone colorir", + "min. confidence": "min. confiança", + "minimum": "mínimo", + "maximum": "máximo", + "Heartrate": "Banda cardíaca", + "weather circle": "círculo meteorológico", + "step length": "comprimento do passo", + "valid period": "período válido", + "TAP right top/bottom": "TAP superior/inferior direita", + "Vector font size": "Tamanho de letra vectorial", + "Yes\ndefinitely": "Sim\ndefinitivamente", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "STEPS": "ETAPAS", + "Font": "Fonte", + "Show clocks": "Mostrar relógios", + "App Source\nNot found": "Fonte do aplicativo\nNão encontrado", + "Mark Unread": "Marcar como não lido", + "View Message": "Ver Mensagem", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: SAÍDA", + "Launcher Settings": "Configurações do lançador", + "Delete All Messages": "Apagar todas as mensagens", + "Delete all messages": "Apagar todas as mensagens", + "Utils": "Utils", + "LCD": "LCD", + "Apps": "Apps", + "Record Run": "Record Run", + "No Messages": "Sem Mensagens", + "Unread timer": "Temporizador não lido", + "Are you sure": "Tens a certeza", + "Make Connectable": "Tornar Conectável", + "Piezo": "Piezo", + "Bluetooth": "Bluetooth", + "BLE": "BLE", + "Programmable": "Programável", + "Vibration": "Vibração", + "Quiet Mode": "Modo Silencioso", + "Foreground": "Primeiro plano", + "Passkey BETA": "Passkey BETA", + "HID": "HID", + "Light BW": "BW Leve", + "Foreground 2": "Primeiro plano 2", + "Dark BW": "BW Escuro", + "Background": "Antecedentes", + "Highlight FG": "Destaque FG", + "Customize": "Personalizar", + "Background 2": "Antecedentes 2", + "Wake on BTN3": "Acorde no BTN3", + "Wake on BTN2": "Acorde no BTN2", + "Highlight BG": "Destaque BG", + "LCD Timeout": "Tempo limite do LCD", + "Wake on FaceUp": "Acorde no FaceUp", + "Wake on BTN1": "Acorde no BTN1", + "Wake on Twist": "Acorde na Twist", + "Wake on Touch": "Acorde ao Toque", + "Connect device\nto add to\nwhitelist": "Ligar dispositivo\npara adicionar a\nlista branca", + "Remove": "Remover", + "Add Device": "Adicionar dispositivo", + "LCD Brightness": "Luminosidade do LCD", + "Twist Max Y": "Torcer Max Y", + "Utilities": "Utilidades", + "Twist Threshold": "Limiar de Torção", + "Time Zone": "Fuso horário", + "Twist Timeout": "Twist Timeout", + "Clock Style": "Estilo Relógio", + "Debug Info": "Informação de Depuração", + "Log": "Diário de Bordo", + "Storage": "Armazenamento", + "Rewrite Settings": "Re-escrever configurações", + "Compacting...\nTakes approx\n1 minute": "A compactação...\nLeva aproximadamente\n1 minuto", + "Flatten Battery": "Bateria achatada", + "Reset Settings": "Redefinir configurações", + "Compact Storage": "Armazenamento compacto", + "Stay Connectable": "Fique Conectável", + "Turn Off": "Desligar", + "Connectable": "Conectável", + "This will remove everything": "Isto irá remover tudo", + "Date": "Data", + "Month": "Mês", + "Second": "Segundo", + "Minute": "Ata", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Bateria plana - isto pode demorar horas.\nBotão de pressão prolongada para cancelar", + "Reset to Defaults": "Redefinir para Padrões", + "Hour": "Hora", + "No Clocks Found": "Não foram encontrados relógios", + "Right": "Certo", + "No app has settings": "Nenhum aplicativo tem configurações", + "App Settings": "Configurações do aplicativo", + "OFF": "DESLIGADO", + "Side": "Lado", + "Left": "Esquerda", + "Sort Order": "Ordem de classificação", + "Widgets": "Widgets", + "Invalid settings": "Configurações inválidas", + "Sleep Phase Alarm": "Alarme da Fase do Sono", + "Alarm": "Alarme", + "Minutes": "Acta", + "TIMER": "TIMER", + "Hours": "Horário", + "on": "em", + "Reset All": "Reinicializar tudo", + "Repeat": "Repita", + "Delete": "Eliminar", + "Enabled": "Habilitado", + "Reset all widgets": "Redefinir todos os widgets", + "Reset": "Reinicialização", + "goal": "meta", + "Message": "Mensagem", + "Beep": "Bip", + "Vibrate": "Vibrar", + "System": "Sistema", + "Alerts": "Alertas", + "Locale": "Localização", + "Set Time": "Tempo Definido", + "Whitelist": "Lista branca", + "Select Clock": "Selecione Relógio", + "BACK": "VOLTAR", + "Timer": "Temporizador", + "Error in settings": "Erro nas configurações", + "Disable": "Desabilitar", + "Factory Reset": "Reinicialização de Fábrica", + "Connected": "Conectado", + "ALARM": "ALARME", + "Sleep": "Dormir", + "Messages": "Mensagens", + "Hide": "Esconder", + "Show": "Mostrar", + "On": "Em", + "Ok": "Ok", + "No": "Não", + "Settings": "Configurações", + "steps": "passos", + "back": "voltar", + "Steps": "Passos", + "Year": "Ano", + "Yes": "Sim", + "Loading": "Carregamento", + "Music": "Música", + "color": "cor", + "off": "em", + "Off": "Fora", + "Theme": "Tema", + "Back": "Voltar" + } +} \ No newline at end of file diff --git a/lang/ru_RU.json b/lang/ru_RU.json new file mode 100644 index 000000000..6bdf906fe --- /dev/null +++ b/lang/ru_RU.json @@ -0,0 +1,167 @@ +{ + "//": "Russian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Новая сигнализация", + "(repeat)": "(повтор)", + "New Timer": "Новый таймер", + "Auto snooze": "Автоматическая дозагрузка", + "circle 4": "круг 4", + "Save": "Сохранить", + "Keep Msgs": "Сохраняйте сообщения", + "week": "неделя", + "circle count": "счётчик окружностей", + "circle 2": "круг 2", + "music": "музыка", + "battery warn": "предупреждение о разряде батареи", + "circle 1": "круг 1", + "maximum": "максимальный", + "min. confidence": "мин. уверенность", + "heartrate": "частота сердечных сокращений", + "Circle": "Круг", + "minimum": "минимум", + "Heartrate": "Пульс", + "show widgets": "показывать виджеты", + "weather circle": "метеорологический круг", + "data": "данные", + "step length": "длина шага", + "valid period": "период действия", + "distance goal": "дальняя цель", + "circle 3": "круг 3", + "TAP right top/bottom": "TAP справа сверху/снизу", + "Delete all messages": "Удалить все сообщения", + "Mark Unread": "Отметить непрочитанным", + "Unread timer": "Непрочитанный таймер", + "Launcher Settings": "Настройки запуска", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "View Message": "Посмотреть сообщение", + "No Messages": "Нет сообщений", + "Are you sure": "Вы уверены", + "Vector font size": "Размер векторного шрифта", + "colorize icon": "раскрасить иконку", + "Yes\ndefinitely": "Да\nопределенно", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "App Source\nNot found": "Источник приложения\nНе найдено", + "STEPS": "СТЕПЕНИ", + "Font": "Шрифт", + "Show clocks": "Показать часы", + "Vibration": "Вибрация", + "Bluetooth": "Bluetooth", + "Make Connectable": "Сделать соединяемым", + "Apps": "Приложения", + "Quiet Mode": "Тихий режим", + "LCD": "ЖК-ДИСПЛЕЙ", + "Programmable": "Программируемый", + "Passkey BETA": "Passkey BETA", + "Record Run": "Рекордный пробег", + "Delete All Messages": "Удалить все сообщения", + "Utils": "Утилиты", + "Piezo": "Пьезо", + "Foreground": "Передний план", + "Background": "Справочная информация", + "Dark BW": "Темный BW", + "HID": "HID", + "BLE": "BLE", + "Light BW": "Светлый BW", + "Highlight FG": "Выделите FG", + "Foreground 2": "Передний план 2", + "Customize": "Настроить", + "Wake on BTN2": "Вейк на BTN2", + "Wake on BTN1": "Проснись на BTN1", + "Wake on BTN3": "Уэйк на BTN3", + "Add Device": "Добавить устройство", + "LCD Brightness": "Яркость ЖК-дисплея", + "Wake on FaceUp": "Проснуться на FaceUp", + "Storage": "Хранение", + "Wake on Twist": "Проснуться на твисте", + "Connect device\nto add to\nwhitelist": "Подключить устройство\nдля добавления в\nбелый список", + "Background 2": "Справочная информация 2", + "Remove": "Удалить", + "Highlight BG": "Выделение BG", + "LCD Timeout": "Тайм-аут ЖК-дисплея", + "Twist Timeout": "Тайм-аут скручивания", + "Twist Threshold": "Порог скручивания", + "Wake on Touch": "Пробуждение при касании", + "Twist Max Y": "Twist Max Y", + "Stay Connectable": "Оставайтесь на связи", + "This will remove everything": "Это удалит все", + "Turn Off": "Выключить", + "Hour": "Час", + "Minute": "Минута", + "Reset to Defaults": "Сброс настроек по умолчанию", + "No Clocks Found": "Часы не найдены", + "Log": "Журнал", + "Debug Info": "Отладочная информация", + "Utilities": "Утилиты", + "Compact Storage": "Компактное хранение", + "Reset Settings": "Сброс настроек", + "Compacting...\nTakes approx\n1 minute": "Уплотнение...\nЗанимает приблизительно\n1 минута", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Сплющивание батареи - это может занять несколько часов.\nДлительное нажатие кнопки для отмены", + "Connectable": "Подключаемый", + "Clock Style": "Часовой стиль", + "Time Zone": "Часовой пояс", + "Flatten Battery": "Расплющить батарею", + "Rewrite Settings": "Настройки перезаписи", + "Sort Order": "Порядок сортировки", + "Right": "Справа", + "Left": "Слева", + "Side": "Сторона", + "Hours": "Часы", + "on": "на сайте", + "Widgets": "Виджеты", + "TIMER": "ТАЙМЕР", + "Date": "Дата", + "Month": "Месяц", + "OFF": "OFF", + "Reset All": "Сбросить все", + "Alarm": "Сигнализация", + "Reset all widgets": "Сброс всех виджетов", + "Delete": "Удалить", + "Invalid settings": "Недопустимые настройки", + "Second": "Второй", + "Sleep Phase Alarm": "Сигнализация фазы сна", + "No app has settings": "Ни одно приложение не имеет настроек", + "App Settings": "Настройки приложения", + "Repeat": "Повторите", + "System": "Система", + "Minutes": "Протоколы", + "Enabled": "Включено", + "Reset": "Сброс", + "Vibrate": "Вибрация", + "Alerts": "Оповещения", + "Select Clock": "Выберите часы", + "Set Time": "Установленное время", + "Locale": "Местность", + "Beep": "Звуковой сигнал", + "goal": "гол", + "Message": "Сообщение", + "ALARM": "АЛАРМ", + "Disable": "Отключить", + "Factory Reset": "Заводской сброс", + "Sleep": "Сон", + "Whitelist": "Белый список", + "Timer": "Таймер", + "Error in settings": "Ошибка в настройках", + "BACK": "BACK", + "Messages": "Сообщения", + "Show": "Показать", + "Hide": "Скрыть", + "Connected": "Подключено", + "On": "На сайте", + "No": "Нет", + "Ok": "Хорошо", + "Settings": "Настройки", + "steps": "шаги", + "back": "назад", + "Year": "Год", + "Steps": "Шаги", + "Yes": "Да", + "Loading": "Загрузка", + "color": "цвет", + "Music": "Музыка", + "Off": "На сайте", + "off": "отключен", + "Theme": "Тема", + "Back": "Назад" + } +} \ No newline at end of file diff --git a/lang/sv_SE.json b/lang/sv_SE.json index 3a006c2bf..6b35f5cdf 100644 --- a/lang/sv_SE.json +++ b/lang/sv_SE.json @@ -1,21 +1,173 @@ { - "//":"Swedish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Larm", - "Hours" : "Timmar", - "Minutes" : "Minuter", - "Enabled" : "Aktiverad", - "New Alarm" : "Ny alarm", - "Save" : "Spara", - "Back" : "Tillbaka", - "Repeat" : "Upprepning", - "Delete" : "Radera", - "ALARM!" : "ALURH!", - "Sleep" : "Sömn" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "uppr." - } -} + "//": "Swedish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Larm", + "Hours": "Timmar", + "Minutes": "Minuter", + "Enabled": "Aktiverad", + "New Alarm": "Ny alarm", + "Save": "Spara", + "Back": "Tillbaka", + "Repeat": "Upprepning", + "Delete": "Radera", + "ALARM!": "ALURH!", + "Sleep": "Sömn", + "circle 3": "cirkel 3", + "circle 1": "cirkel 1", + "music": "musik", + "week": "vecka", + "Keep Msgs": "Behåll meddelanden", + "Auto snooze": "Automatisk snooze", + "step length": "steglängd", + "Circle": "Cirkel", + "data": "uppgifter", + "colorize icon": "färglägga ikonen", + "min. confidence": "Min. förtroende", + "show widgets": "visa widgets", + "valid period": "giltig period", + "Heartrate": "Hjärtfrekvens", + "distance goal": "mål för distans", + "circle 4": "cirkel 4", + "circle count": "antal cirklar", + "minimum": "minimum", + "maximum": "maximal", + "New Timer": "Ny timer", + "battery warn": "batteri varning", + "heartrate": "hjärtfrekvens", + "circle 2": "cirkel 2", + "(repeat)": "(upprepning)", + "weather circle": "Vädercirkel", + "Delete All Messages": "Radera alla meddelanden", + "No Messages": "Inga meddelanden", + "Show clocks": "Visa klockor", + "STEPS": "STEG", + "TAP right top/bottom": "TAP höger upp/ner", + "View Message": "Visa meddelande", + "Mark Unread": "Markera oläst", + "Are you sure": "Är du säker på att", + "Delete all messages": "Radera alla meddelanden", + "Record Run": "Rekordkörning", + "Unread timer": "Oläst timer", + "Vibration": "Vibrationer", + "Utils": "Användaruppgifter", + "Quiet Mode": "Tyst läge", + "Passkey BETA": "Passkey BETA", + "Dark BW": "Mörk BW", + "BTNs 1:startlap 2:exit 3:reset": "BTN 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "start&lap/återställning, BTN1: EXIT", + "BLE": "BLE", + "Programmable": "Programmerbar", + "Launcher Settings": "Inställningar för lanseringen", + "Vector font size": "Vektor teckensnittsstorlek", + "Font": "Typsnitt", + "Yes\ndefinitely": "Ja\ndefinitivt", + "App Source\nNot found": "App-källa\nEj funnen", + "Make Connectable": "Gör det möjligt att ansluta", + "HID": "HID", + "Bluetooth": "Bluetooth", + "Apps": "Appar", + "Piezo": "Piezo", + "LCD": "LCD", + "Foreground 2": "Förgrund 2", + "Light BW": "Ljus BW", + "Background": "Bakgrund", + "Remove": "Ta bort", + "Highlight BG": "Markera BG", + "Customize": "Anpassa", + "Highlight FG": "Highlight FG", + "Background 2": "Bakgrund 2", + "LCD Brightness": "Ljusstyrka på LCD-skärmen", + "Add Device": "Lägg till enhet", + "Wake on BTN1": "Vakna på BTN1", + "Wake on BTN2": "Vakna på BTN2", + "Twist Timeout": "Twist Timeout", + "Wake on Touch": "Vakna vid beröring", + "LCD Timeout": "LCD Timeout", + "Foreground": "Förgrund", + "Connect device\nto add to\nwhitelist": "Anslut enhet\nför att lägga till\nvitlista", + "Wake on FaceUp": "Vakna på FaceUp", + "Twist Threshold": "Tröskelvärde för vridning", + "Wake on BTN3": "Wake på BTN3", + "Clock Style": "Klockstil", + "Time Zone": "Tidszon", + "Twist Max Y": "Vridning Max Y", + "Stay Connectable": "Håll dig tillgänglig", + "This will remove everything": "Detta kommer att ta bort allt", + "Turn Off": "Stäng av", + "Connectable": "Anslutningsbar", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Platta batterier - detta kan ta flera timmar.\nTryck länge på knappen för att avbryta", + "Reset to Defaults": "Återställ till standardvärden", + "Utilities": "Verktyg", + "Flatten Battery": "Platta batterier", + "Debug Info": "Info om felsökning", + "Reset Settings": "Återställa inställningar", + "Wake on Twist": "Väckning på Twist", + "Compact Storage": "Kompakt förvaring", + "Log": "Logg", + "Rewrite Settings": "Omskrivning av inställningar", + "Compacting...\nTakes approx\n1 minute": "Komprimering...\nTar ca.\n1 minut", + "Storage": "Lagring", + "Second": "Andra", + "App Settings": "App-inställningar", + "Invalid settings": "Ogiltiga inställningar", + "Minute": "Protokoll", + "Sleep Phase Alarm": "Larm om sömnfas", + "No app has settings": "Ingen app har inställningar", + "Hour": "Timme", + "No Clocks Found": "Inga klockor hittades", + "Date": "Datum", + "Month": "Månad", + "Alarm": "Larm", + "Reset": "Återställ", + "Reset all widgets": "Återställ alla widgetar", + "TIMER": "TIMER", + "on": "på", + "OFF": "OFF", + "Side": "Sidan", + "Sort Order": "Sortering", + "Left": "Vänster", + "Right": "Höger", + "Reset All": "Återställ alla", + "Widgets": "Widgets", + "goal": "mål", + "Vibrate": "Vibrera", + "Message": "Meddelande", + "Beep": "Piper", + "Disable": "Inaktivera", + "Select Clock": "Välj klocka", + "Locale": "Lokalisering", + "Alerts": "Varningar", + "System": "System", + "Set Time": "Ställ in tid", + "Factory Reset": "Fabriksåterställning", + "Messages": "Meddelanden", + "Timer": "Timer", + "BACK": "TILLBAKA", + "Error in settings": "Fel i inställningarna", + "Whitelist": "Whitelist", + "ALARM": "ALARM", + "Hide": "Dölj", + "Connected": "Ansluten", + "Show": "Visa", + "On": "På", + "Ok": "Ok", + "No": "Ingen", + "Settings": "Inställningar", + "steps": "steg", + "back": "tillbaka", + "Steps": "Steg", + "Year": "År", + "Yes": "Ja", + "Loading": "Laddar", + "Music": "Musik", + "color": "färg", + "off": "off", + "Off": "Av", + "Theme": "Tema" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "uppr." + } +} \ No newline at end of file diff --git a/lang/tr_TR.json b/lang/tr_TR.json index c59bc7d6b..e153253df 100644 --- a/lang/tr_TR.json +++ b/lang/tr_TR.json @@ -1,21 +1,21 @@ { - "//":"Turkish language translations", - "GLOBAL": { - "//":"Translations that apply for all apps", - "Alarms" : "Alarmlar", - "Hours" : "Saat", - "Minutes" : "Dakika", - "Enabled" : "Etkinleştirildi", - "New Alarm" : "Yeni alarm", - "Save" : "Sakla", - "Back" : "Geriye", - "Repeat" : "Yineleme", - "Delete" : "Sil", - "ALARM!" : "ALARM!", - "Sleep" : "Uyku" - }, - "alarm": { - "//":"App-specific overrides", - "rpt" : "yineleme" - } -} + "//": "Turkish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarms": "Alarmlar", + "Hours": "Saat", + "Minutes": "Dakika", + "Enabled": "Etkinleştirildi", + "New Alarm": "Yeni alarm", + "Save": "Sakla", + "Back": "Geriye", + "Repeat": "Yineleme", + "Delete": "Sil", + "ALARM!": "ALARM!", + "Sleep": "Uyku" + }, + "alarm": { + "//": "App-specific overrides", + "rpt": "yineleme" + } +} \ No newline at end of file diff --git a/lang/zh_ZH.json b/lang/zh_ZH.json new file mode 100644 index 000000000..4ff134b04 --- /dev/null +++ b/lang/zh_ZH.json @@ -0,0 +1,167 @@ +{ + "//": "Chinese language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "music": "音乐", + "distance goal": "距离目标", + "Save": "拯救", + "circle 3": "第3圈", + "Show clocks": "显示时钟", + "data": "数据", + "battery warn": "电池警告", + "heartrate": "心率", + "circle 2": "第2圈", + "circle 1": "第1圈", + "STEPS": "步骤", + "step length": "步长", + "New Timer": "新的计时器", + "colorize icon": "给图标着色", + "Auto snooze": "自动休眠", + "maximum": "最大限度", + "View Message": "查看留言", + "show widgets": "显示小工具", + "weather circle": "气象圈", + "Delete all messages": "删除所有信息", + "Launcher Settings": "启动器设置", + "Circle": "圆圈", + "No Messages": "没有消息", + "min. confidence": "最低限度的信心", + "circle count": "圈数", + "Keep Msgs": "保持信息畅通", + "(repeat)": "(重复)", + "App Source\nNot found": "应用程序来源\n未找到", + "Mark Unread": "标记未读", + "week": "周", + "Delete All Messages": "删除所有信息", + "New Alarm": "新警报", + "minimum": "最低限度", + "Heartrate": "心率", + "circle 4": "第4圈", + "Font": "字体", + "Vector font size": "矢量字体大小", + "Bluetooth": "蓝牙", + "Record Run": "记录运行", + "Are you sure": "你确定吗?", + "Unread timer": "未读计时器", + "Apps": "应用", + "start&lap/reset, BTN1: EXIT": "开始&lap/复位,BTN1:EXIT", + "TAP right top/bottom": "右侧顶部/底部的TAP", + "Yes\ndefinitely": "是的\n绝对", + "valid period": "有效期限", + "Utils": "充分利用", + "Customize": "定制", + "Quiet Mode": "静音模式", + "LCD": "液晶显示器", + "Programmable": "可编程", + "Light BW": "轻型BW", + "Vibration": "震动", + "Passkey BETA": "通行证 BETA", + "Make Connectable": "使之成为可连接的", + "Background 2": "背景2", + "Background": "背景介绍", + "HID": "氙气灯", + "Remove": "移除", + "Add Device": "添加设备", + "Highlight FG": "亮点FG", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Highlight BG": "突出显示BG", + "Dark BW": "深色BW", + "Foreground 2": "前景2", + "Piezo": "压电式", + "Connect device\nto add to\nwhitelist": "连接设备\n来添加到\n白名单", + "LCD Brightness": "液晶显示器的亮度", + "LCD Timeout": "LCD超时", + "Wake on FaceUp": "在FaceUp上唤醒", + "Twist Timeout": "扭曲超时", + "Wake on BTN1": "在BTN1上唤醒", + "Wake on Twist": "在扭曲中醒来", + "Wake on Touch": "触摸时唤醒", + "Utilities": "公用事业", + "Twist Max Y": "扭转最大Y", + "Time Zone": "时区", + "Log": "纪录", + "Twist Threshold": "扭曲阈值", + "Wake on BTN3": "唤醒BTN3网站", + "Wake on BTN2": "在BTN2上唤醒", + "Debug Info": "调试信息", + "BLE": "BLE", + "Compact Storage": "紧凑型存储", + "Storage": "储存", + "Compacting...\nTakes approx\n1 minute": "压实...\n需要大约\n1分钟", + "Reset Settings": "重置设置", + "Clock Style": "钟表风格", + "Rewrite Settings": "重写设置", + "Flatten Battery": "扁平化电池", + "Foreground": "前景", + "Hour": "一小时", + "Reset to Defaults": "重置为默认值", + "Turn Off": "关掉", + "Connectable": "可连接", + "Stay Connectable": "保持联系", + "Minute": "分钟", + "Month": "月份", + "Flattening battery - this can take hours.\nLong-press button to cancel": "压扁电池 - 这可能需要几个小时。\n长按按钮可取消", + "Second": "第二次", + "This will remove everything": "这将删除一切", + "App Settings": "应用程序设置", + "Side": "侧面", + "No Clocks Found": "没有发现时钟", + "OFF": "关闭", + "Widgets": "小工具", + "Invalid settings": "无效的设置", + "Right": "对", + "No app has settings": "没有应用程序有设置", + "Left": "左边", + "Sleep Phase Alarm": "睡眠阶段报警", + "Sort Order": "排序顺序", + "Date": "日期", + "Reset all widgets": "重置所有小工具", + "on": "关于", + "Reset All": "全部重设", + "TIMER": "计时器", + "Hours": "小时", + "Alarm": "警报", + "Repeat": "重复进行", + "Reset": "复位", + "Minutes": "会议记录", + "Enabled": "已启用", + "goal": "目标", + "Beep": "哔哔声", + "Vibrate": "震动", + "Delete": "删除", + "Locale": "地区", + "System": "系统", + "Disable": "禁用", + "Select Clock": "选择时钟", + "Set Time": "设置时间", + "Alerts": "警报", + "Whitelist": "白名单", + "Error in settings": "设置中的错误", + "Factory Reset": "工厂重置", + "BACK": "返回", + "Timer": "计时器", + "Sleep": "睡眠", + "Messages": "留言", + "Hide": "隐藏", + "Connected": "已连接", + "ALARM": "警报", + "On": "在", + "Show": "显示", + "Ok": "好的", + "Message": "留言", + "steps": "步骤", + "No": "没有", + "Settings": "设置", + "back": "背面", + "Year": "年", + "Steps": "阶梯", + "Yes": "是", + "Loading": "负载", + "Music": "音乐", + "color": "颜色", + "off": "关闭", + "Off": "关闭", + "Theme": "主题", + "Back": "溯源" + } +} \ No newline at end of file From 1f48344d165329db2fa1d9f918ff2dc8a32a2d81 Mon Sep 17 00:00:00 2001 From: copoer Date: Wed, 9 Feb 2022 19:52:16 -0400 Subject: [PATCH 04/17] Added more /*LANG*/ --- apps/BLEcontroller/app.js | 2 +- apps/a_clock_timer/app.js | 2 +- apps/about/app-bangle1.js | 2 +- apps/about/app-bangle2.js | 4 +-- apps/accellog/app.js | 2 ++ apps/accelrec/app.js | 4 +++ apps/activepedom/app.js | 4 +-- apps/activepedom/settings.js | 2 ++ apps/activepedom/widget.js | 6 ++--- apps/alarm/app.js | 8 +++--- apps/android/boot.js | 6 ++--- apps/android/settings.js | 2 ++ apps/antonclk/app.js | 10 +++---- apps/antonclk/settings.js | 6 +++++ apps/banglerun/app.js | 2 +- apps/banglexercise/settings.js | 2 ++ apps/breath/app.js | 4 +-- apps/bthrm/boot.js | 2 +- apps/bthrm/settings.js | 7 +++++ apps/bthrv/app.js | 2 +- apps/calendar/settings.js | 4 +++ apps/chronowid/app.js | 1 + apps/circlesclock/app.js | 6 ++++- apps/circlesclock/settings.js | 8 ++++-- apps/cliclockJS2Enhanced/app.js | 12 ++++----- apps/clicompleteclk/app.js | 4 +-- apps/clicompleteclk/settings.js | 4 +++ apps/configurable_clock/app.js | 32 +++++++++++------------ apps/coretemp/settings.js | 4 +++ apps/cscsensor/cscsensor.app.js | 2 +- apps/cscsensor/settings.js | 2 ++ apps/dane_tcr/app.js | 2 +- apps/dane_tcr/settings.js | 2 ++ apps/daysl/app.js | 2 +- apps/dsdrelay/dsdrelay.app.js | 2 +- apps/dtlaunch/settings-b1.js | 4 +++ apps/dtlaunch/settings-b2.js | 5 ++++ apps/ffcniftya/settings.js | 1 + apps/ffcniftyb/app.js | 2 +- apps/fileman/fileman.app.js | 2 ++ apps/files/files.js | 1 + apps/gallifr/settings.js | 4 +++ apps/gbmusic/settings.js | 2 ++ apps/gbridge/settings.js | 4 +++ apps/gpsinfo/gps-info.js | 2 +- apps/gpsrec/app.js | 4 +-- apps/gpstime/gpstime.js | 2 +- apps/hardalarm/app.js | 1 + apps/hardalarm/hardalarm.js | 2 +- apps/health/app.js | 4 +++ apps/heart/app.js | 1 + apps/hidmsic/hid-music.js | 2 +- apps/hidmsicswipe/hidmsicswipe.js | 6 ++--- apps/hourstrike/app.js | 1 + apps/hralarm/settings.js | 2 ++ apps/intervalTimer/app.js | 4 +-- apps/intervals/intervals.app.js | 2 +- apps/ios/boot.js | 2 +- apps/jbm8b/app.js | 4 +-- apps/largeclock/settings.js | 2 ++ apps/lcars/lcars.app.js | 4 +-- apps/lcars/lcars.settings.js | 4 +++ apps/lightswitch/settings.js | 4 +-- apps/lightswitch/widget.js | 8 +++--- apps/limelight/limelight.settings.js | 4 +++ apps/ltherm/app.js | 2 +- apps/marioclock/marioclock-app.js | 2 +- apps/menuwheel/boot.js | 2 +- apps/messages/app.js | 4 +-- apps/messages/settings.js | 2 ++ apps/mysticclock/mystic-clock-settings.js | 6 +++++ apps/mysticdock/mystic-dock-settings.js | 6 +++++ apps/mywelcome/settings.js | 2 ++ apps/ncstart/start.js | 2 +- apps/numerals/numerals.settings.js | 2 +- apps/pastel/pastel.settings.js | 4 +++ apps/pebble/pebble.app.js | 2 +- apps/pebble/pebble.settings.js | 2 ++ apps/pebbled/pebbled.app.js | 2 +- apps/pebbled/pebbled.settings.js | 3 +++ apps/planetarium/settings.js | 1 + apps/presentor/app.js | 2 +- apps/ptlaunch/app.js | 4 +-- apps/puzzle15/puzzle15.app.js | 6 ++--- apps/puzzle15/puzzle15.settings.js | 2 +- apps/qalarm/app.js | 4 +++ apps/qmsched/app.js | 1 + apps/rebble/rebble.app.js | 2 +- apps/rebble/rebble.settings.js | 2 ++ apps/recorder/app.js | 4 +-- apps/recorder/widget.js | 4 +-- apps/score/score.settings.js | 2 ++ apps/sensible/sensible.js | 8 +++--- apps/setting/settings.js | 7 ++++- apps/simpletimer/app.js | 2 +- apps/sleepphasealarm/app.js | 4 +-- apps/smartibot/app.js | 8 +++--- apps/smtswch/app.js | 2 +- apps/sonicclk/app.js | 2 +- apps/speedalt/settings.js | 3 +++ apps/speedalt2/settings.js | 3 +++ apps/swp2clk/settings.js | 2 ++ apps/themesetter/app.js | 4 +-- apps/thermomF/app.js | 2 +- apps/timerclk/alarm.alert.js | 4 +-- apps/timerclk/settings.js | 2 ++ apps/torch/app.js | 2 +- apps/torch/settings.js | 2 ++ apps/toucher/app.js | 2 +- apps/toucher/settings.js | 3 +++ apps/vectorclock/settings.js | 2 ++ apps/viewstl/viewstl.min.js | 2 +- apps/walkersclock/app.js | 4 +-- apps/weather/settings.js | 2 ++ apps/welcome/settings.js | 2 ++ apps/widbatpc/settings.js | 4 +++ apps/widbatpc/widget.js | 8 +++--- apps/widbatwarn/settings.js | 1 + apps/widchime/settings.js | 2 ++ apps/widpedom/settings.js | 3 +++ apps/widpedom/widget.js | 2 +- 121 files changed, 295 insertions(+), 132 deletions(-) diff --git a/apps/BLEcontroller/app.js b/apps/BLEcontroller/app.js index c8217988c..7f3a37ae2 100644 --- a/apps/BLEcontroller/app.js +++ b/apps/BLEcontroller/app.js @@ -295,7 +295,7 @@ const SocketsMenu = new State({ const startEnd = status => status ? "start" : "end"; /* translate status into english */ -const onOff= status => status ? "on" : "off"; +const onOff= status => status ? "on" : /*LANG*/"off"; /* create watching functions that will change the global diff --git a/apps/a_clock_timer/app.js b/apps/a_clock_timer/app.js index 5f9a3a468..c1c31cb80 100644 --- a/apps/a_clock_timer/app.js +++ b/apps/a_clock_timer/app.js @@ -53,7 +53,7 @@ function countDown() { g.reset().clearRect(0, 76, 44+44, g.getHeight()/2+6); g.setFontAlign(0, -1, 0); - g.setFont("6x8").drawString("Timer", 44, g.getHeight()/2-20); + g.setFont("6x8").drawString(/*LANG*/"Timer", 44, g.getHeight()/2-20); g.setFont("Michroma16").drawString(timeToString(timervalue), 44, g.getHeight()/2-10); if (timervalue <= 0) { diff --git a/apps/about/app-bangle1.js b/apps/about/app-bangle1.js index 28a292376..04f7ff7ee 100644 --- a/apps/about/app-bangle1.js +++ b/apps/about/app-bangle1.js @@ -21,7 +21,7 @@ function getVersion(name,file) { } getVersion("Bootloader","boot.info"); getVersion("Launcher","launch.info"); -getVersion("Settings","setting.info"); +getVersion(/*LANG*/"Settings","setting.info"); y+=h; g.drawString(MEM.total+" JS Variables available",0,y+=h); diff --git a/apps/about/app-bangle2.js b/apps/about/app-bangle2.js index 978d36193..89663a4bc 100644 --- a/apps/about/app-bangle2.js +++ b/apps/about/app-bangle2.js @@ -23,7 +23,7 @@ function getVersion(name,file) { var versions = [ getVersion("Bootloader","boot.info"), getVersion("Launcher","launch.info"), - getVersion("Settings","setting.info") + getVersion(/*LANG*/"Settings","setting.info") ]; var logo = E.toArrayBuffer(atob("PBwBAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAD/w+AAAAQAHA4hAAAAQAMAMhAAAAQAYBmhAAAAQAYBGiAAAAQAQCD/H74+R4wGDhoKJCSEwEDgoKJCT8wFDgoKJCSAwHDhoKJCSEQHj/H6I+R4YHmAAAACAAYEGAAABCAAMEMAAAA8AAHA4AAAAAAAD/wAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/g")); @@ -41,7 +41,7 @@ function drawInfo() { getVersion("Bootloader","boot.info"); getVersion("Launcher","launch.info"); - getVersion("Settings","setting.info"); + getVersion(/*LANG*/"Settings","setting.info"); g.drawString(MEM.total+" JS Vars",0,y+=h); g.drawString("Storage: "+(require("Storage").getFree()>>10)+"k free",0,y+=h); diff --git a/apps/accellog/app.js b/apps/accellog/app.js index c54c5002b..c95ecab3d 100644 --- a/apps/accellog/app.js +++ b/apps/accellog/app.js @@ -136,3 +136,5 @@ function startRecord(force) { Bangle.loadWidgets(); Bangle.drawWidgets(); showMenu(); +Menu(); +Menu(); diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index 65f2a63ca..bd6688539 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -177,3 +177,7 @@ function showSaveMenu() { } showMenu(); + +} + +showMenu(); diff --git a/apps/activepedom/app.js b/apps/activepedom/app.js index 12969a0a0..d241586f2 100644 --- a/apps/activepedom/app.js +++ b/apps/activepedom/app.js @@ -108,7 +108,7 @@ g.setFont("6x8", 2); g.setColor(1,1,1); require("graph").drawLine(g, steps, { - //title: "Steps", + //title: /*LANG*/"Steps", axes : true, gridy : gridyValue, y : 60, //offset on screen @@ -118,7 +118,7 @@ // show steps and duration of the chart g.setFont("6x8", 2); g.setColor(0,1,0); - g.drawString("steps", 30, 24); + g.drawString(/*LANG*/"steps", 30, 24); g.drawString(stepsLastEntry, 30, 44); g.drawString((history/3600000) + " hrs", 30, 64); diff --git a/apps/activepedom/settings.js b/apps/activepedom/settings.js index 3b64d8735..700637649 100644 --- a/apps/activepedom/settings.js +++ b/apps/activepedom/settings.js @@ -110,3 +110,5 @@ }; E.showMenu(menu); }); +; +}); diff --git a/apps/activepedom/widget.js b/apps/activepedom/widget.js index 62c2d857a..11360fd61 100644 --- a/apps/activepedom/widget.js +++ b/apps/activepedom/widget.js @@ -69,7 +69,7 @@ 'stepGoal' : 10000, 'stepLength' : 75, 'lineOne' : "Distance", - 'lineTwo' : "Steps", + 'lineTwo' : /*LANG*/"Steps", }; if (!settings) { loadSettings(); } return (key in settings) ? settings[key] : DEFAULTS[key]; @@ -169,7 +169,7 @@ if (active == 1) g.setColor(0x07E0); //green else g.setColor(0xFFFF); //white g.setFont("6x8", 2); - if (setting('lineOne') == 'Steps') { + if (setting('lineOne') == /*LANG*/'Steps') { g.drawString(kFormatterSteps(stepsCounted),this.x+1,this.y); //first line, big number, steps } if (setting('lineOne') == 'Distance') { @@ -177,7 +177,7 @@ } g.setFont("6x8", 1); g.setColor(0xFFFF); //white - if (setting('lineTwo') == 'Steps') { + if (setting('lineTwo') == /*LANG*/'Steps') { g.drawString(stepsCounted,this.x+1,this.y+14); //second line, small number, steps } if (setting('lineTwo') == 'Distance') { diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 17062d44a..5ef6be152 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -39,9 +39,9 @@ function showMainMenu() { }; alarms.forEach((alarm,idx)=>{ if (alarm.timer) { - txt = /*LANG*/"TIMER "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatMins(alarm.timer); + txt = /*LANG*/"TIMER "+(alarm.on?/*LANG*/"on ":/*LANG*//*LANG*/"off ")+formatMins(alarm.timer); } else { - txt = /*LANG*/"ALARM "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatTime(alarm.hr); + txt = /*LANG*/"ALARM "+(alarm.on?/*LANG*/"on ":/*LANG*//*LANG*/"off ")+formatTime(alarm.hr); if (alarm.rp) txt += /*LANG*/" (repeat)"; } menu[txt] = function() { @@ -82,7 +82,7 @@ function editAlarm(alarmIndex) { }, /*LANG*/'Enabled': { value: en, - format: v=>v?"On":"Off", + format: v=>v?"On":/*LANG*/"Off", onchange: v=>en=v }, /*LANG*/'Repeat': { @@ -147,7 +147,7 @@ function editTimer(alarmIndex) { }, /*LANG*/'Enabled': { value: en, - format: v=>v?/*LANG*/"On":/*LANG*/"Off", + format: v=>v?/*LANG*/"On":/*LANG*//*LANG*/"Off", onchange: v=>en=v } }; diff --git a/apps/android/boot.js b/apps/android/boot.js index eb3d26c6e..5c910f5b1 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -29,11 +29,11 @@ }, // {t:"musicstate", state:"play/pause",position,shuffle,repeat} "musicstate" : function() { - require("messages").pushMessage({t:"modify",id:"music",title:"Music",state:event.state}); + require("messages").pushMessage({t:"modify",id:"music",title:/*LANG*/"Music",state:event.state}); }, // {t:"musicinfo", artist,album,track,dur,c(track count),n(track num} "musicinfo" : function() { - require("messages").pushMessage(Object.assign(event, {t:"modify",id:"music",title:"Music"})); + require("messages").pushMessage(Object.assign(event, {t:"modify",id:"music",title:/*LANG*/"Music"})); }, // {"t":"call","cmd":"incoming/end","name":"Bob","number":"12421312"}) "call" : function() { @@ -63,7 +63,7 @@ // Music control Bangle.musicControl = cmd => { // play/pause/next/previous/volumeup/volumedown - gbSend({ t: "music", n:cmd }); + gbSend({ t: /*LANG*/"music", n:cmd }); }; // Message response Bangle.messageResponse = (msg,response) => { diff --git a/apps/android/settings.js b/apps/android/settings.js index 7c46a1fc0..3e0e2b755 100644 --- a/apps/android/settings.js +++ b/apps/android/settings.js @@ -28,3 +28,5 @@ }; E.showMenu(mainmenu); }) +u(mainmenu); +}) diff --git a/apps/antonclk/app.js b/apps/antonclk/app.js index 7b40d8eb5..fd6cc98c6 100644 --- a/apps/antonclk/app.js +++ b/apps/antonclk/app.js @@ -37,7 +37,7 @@ require('Storage').writeJSON(SETTINGSFILE, { secondsColoured: true, secondsWithColon: true, dateOnMain: "Long", // "Short", "Long", "ISO8601" - dateOnSecs: "Year", // "No", "Year", "Weekday", LEGACY: true/false + dateOnSecs: "Year", // "No", /*LANG*/"Year", "Weekday", LEGACY: true/false weekDay: true, calWeek: true, upperCase: true, @@ -60,7 +60,7 @@ function loadSettings() { secondsColoured = def(settings.secondsColoured, true); secondsWithColon = def(settings.secondsWithColon, true); dateOnMain = def(settings.dateOnMain, "Long"); - dateOnSecs = def(settings.dateOnSecs, "Year"); + dateOnSecs = def(settings.dateOnSecs, /*LANG*/"Year"); weekDay = def(settings.weekDay, true); calWeek = def(settings.calWeek, false); upperCase = def(settings.upperCase, true); @@ -68,7 +68,7 @@ function loadSettings() { // Legacy if (dateOnSecs === true) - dateOnSecs = "Year"; + dateOnSecs = /*LANG*/"Year"; if (dateOnSecs === false) dateOnSecs = "No"; } @@ -153,7 +153,7 @@ function draw() { var md; var yearfirst; if (dateStr2.match(/\d\d\d\d$/)) { // formatted date ends with year - year = (dateOnSecs === "Year" ? dateStr2.slice(-4) : require("locale").dow(date, 1)); + year = (dateOnSecs === /*LANG*/"Year" ? dateStr2.slice(-4) : require("locale").dow(date, 1)); md = dateStr2.slice(0, -4); if (!md.endsWith(".")) // keep separator before the year only if it is a dot (31.12. but 31/12) md = md.slice(0, -1); @@ -161,7 +161,7 @@ function draw() { } else { // formatted date begins with year if (!dateStr2.match(/^\d\d\d\d/)) // if year position cannot be detected... dateStr2 = isoStr(date); // ...use ISO date format instead - year = (dateOnSecs === "Year" ? dateStr2.slice(0, 4) : require("locale").dow(date, 1)); + year = (dateOnSecs === /*LANG*/"Year" ? dateStr2.slice(0, 4) : require("locale").dow(date, 1)); md = dateStr2.slice(5); // never keep separator directly after year yearfirst = true; } diff --git a/apps/antonclk/settings.js b/apps/antonclk/settings.js index e452b02c7..1a81a7f24 100644 --- a/apps/antonclk/settings.js +++ b/apps/antonclk/settings.js @@ -105,3 +105,9 @@ }); // end of file +nu + E.showMenu(mainmenu); + +}); + +// end of file diff --git a/apps/banglerun/app.js b/apps/banglerun/app.js index b79255171..1793decef 100644 --- a/apps/banglerun/app.js +++ b/apps/banglerun/app.js @@ -1 +1 @@ -!function(){"use strict";var t;!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(t||(t={}));const n={STOP:63488,PAUSE:65504,RUN:2016};function e(t,n,e){g.setColor(0),g.fillRect(n-60,e,n+60,e+30),g.setColor(65535),g.drawString(t,n,e)}function i(i){var s;g.setFontVector(30),g.setFontAlign(0,-1,0),e((i.distance/1e3).toFixed(2),60,55),e(function(t){const n=Math.round(t),e=Math.floor(n/3600),i=Math.floor(n/60)%60,s=n%60;return(e?e+":":"")+("0"+i).substr(-2)+":"+("0"+s).substr(-2)}(i.duration),172,55),e(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),e=Math.floor(n/60),i=n%60;return("0"+e).substr(-2)+"'"+("0"+i).substr(-2)+'"'}(i.speed),60,115),e(i.hr.toFixed(0),172,115),e(i.steps.toFixed(0),60,175),e(i.cadence.toFixed(0),172,175),g.setFont("6x8",2),g.setColor(i.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(s=new Date).getHours()).substr(-2)+":"+("0"+s.getMinutes()).substr(-2),120,220),g.setColor(n[i.status]),g.fillRect(160,216,230,240),g.setColor(0),g.drawString(i.status,200,220),g.setFont("6x8").setFontAlign(0,0,1).setColor(-1),i.status===t.Paused?g.drawString("START",236,60,1).drawString(" CLEAR ",236,180,1):i.status===t.Running?g.drawString(" PAUSE ",236,60,1).drawString(" PAUSE ",236,180,1):g.drawString("START",236,60,1).drawString(" ",236,180,1)}function s(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),i(t),Bangle.drawWidgets()}function a(n){n.status===t.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),e=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(e,"w"),t.fileWritten=!1}(n),n.status===t.Running?n.status=t.Paused:n.status=t.Running,i(n)}const r={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,t:NaN,timeSinceLog:0,hr:60,hrError:100,file:null,fileWritten:!1,drawing:!1,status:t.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var o;o=r,Bangle.on("GPS",n=>function(n,e){n.lat=e.lat,n.lon=e.lon,n.alt=e.alt,n.vel=e.speed/3.6,n.fix=e.fix,n.dop=e.hdop,n.gpsValid=n.fix>0,function(n){const e=Date.now();let i=(e-n.t)/1e3;if(isFinite(i)||(i=0),n.t=e,n.timeSinceLog+=i,n.status===t.Running&&(n.duration+=i),!n.gpsValid)return;const s=6371008.8+n.alt,a=n.lat*Math.PI/180,r=n.lon*Math.PI/180,o=s*Math.cos(a)*Math.cos(r),g=s*Math.cos(a)*Math.sin(r),d=s*Math.sin(a);if(!n.x)return n.x=o,n.y=g,void(n.z=d);const u=o-n.x,l=g-n.y,c=d-n.z,f=Math.sqrt(u*u+l*l+c*c);n.x=o,n.y=g,n.z=d,n.status===t.Running&&(n.distance+=f,n.speed=n.distance/n.duration||0,n.cadence=60*n.steps/n.duration||0)}(n),i(n),n.gpsValid&&n.status===t.Running&&n.timeSinceLog>5&&(n.timeSinceLog=0,function(t){t.fileWritten||(t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate","steps"].join(",")+"\n"),t.fileWritten=!0),t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(n))}(o,n)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const e=n.bpm-t.hr,i=Math.abs(e)+101-n.confidence,s=t.hrError/(t.hrError+i)||0;t.hr+=e*s,t.hrError+=(i-t.hrError)*s}(t,n)),Bangle.setHRMPower(1)}(r),function(n){Bangle.on("step",()=>function(n){n.status===t.Running&&(n.steps+=1)}(n))}(r),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&s(t)}),s(t)}(r),setWatch(()=>a(r),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(n){n.status===t.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(n),n.status===t.Running?n.status=t.Paused:n.status=t.Stopped,i(n)}(r),BTN3,{repeat:!0,edge:"falling"})}(); +!function(){"use strict";var t;!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(t||(t={}));const n={STOP:63488,PAUSE:65504,RUN:2016};function e(t,n,e){g.setColor(0),g.fillRect(n-60,e,n+60,e+30),g.setColor(65535),g.drawString(t,n,e)}function i(i){var s;g.setFontVector(30),g.setFontAlign(0,-1,0),e((i.distance/1e3).toFixed(2),60,55),e(function(t){const n=Math.round(t),e=Math.floor(n/3600),i=Math.floor(n/60)%60,s=n%60;return(e?e+":":"")+("0"+i).substr(-2)+":"+("0"+s).substr(-2)}(i.duration),172,55),e(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),e=Math.floor(n/60),i=n%60;return("0"+e).substr(-2)+"'"+("0"+i).substr(-2)+'"'}(i.speed),60,115),e(i.hr.toFixed(0),172,115),e(i.steps.toFixed(0),60,175),e(i.cadence.toFixed(0),172,175),g.setFont("6x8",2),g.setColor(i.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(s=new Date).getHours()).substr(-2)+":"+("0"+s.getMinutes()).substr(-2),120,220),g.setColor(n[i.status]),g.fillRect(160,216,230,240),g.setColor(0),g.drawString(i.status,200,220),g.setFont("6x8").setFontAlign(0,0,1).setColor(-1),i.status===t.Paused?g.drawString("START",236,60,1).drawString(" CLEAR ",236,180,1):i.status===t.Running?g.drawString(" PAUSE ",236,60,1).drawString(" PAUSE ",236,180,1):g.drawString("START",236,60,1).drawString(" ",236,180,1)}function s(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),i(t),Bangle.drawWidgets()}function a(n){n.status===t.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),e=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(e,"w"),t.fileWritten=!1}(n),n.status===t.Running?n.status=t.Paused:n.status=t.Running,i(n)}const r={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,t:NaN,timeSinceLog:0,hr:60,hrError:100,file:null,fileWritten:!1,drawing:!1,status:t.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var o;o=r,Bangle.on("GPS",n=>function(n,e){n.lat=e.lat,n.lon=e.lon,n.alt=e.alt,n.vel=e.speed/3.6,n.fix=e.fix,n.dop=e.hdop,n.gpsValid=n.fix>0,function(n){const e=Date.now();let i=(e-n.t)/1e3;if(isFinite(i)||(i=0),n.t=e,n.timeSinceLog+=i,n.status===t.Running&&(n.duration+=i),!n.gpsValid)return;const s=6371008.8+n.alt,a=n.lat*Math.PI/180,r=n.lon*Math.PI/180,o=s*Math.cos(a)*Math.cos(r),g=s*Math.cos(a)*Math.sin(r),d=s*Math.sin(a);if(!n.x)return n.x=o,n.y=g,void(n.z=d);const u=o-n.x,l=g-n.y,c=d-n.z,f=Math.sqrt(u*u+l*l+c*c);n.x=o,n.y=g,n.z=d,n.status===t.Running&&(n.distance+=f,n.speed=n.distance/n.duration||0,n.cadence=60*n.steps/n.duration||0)}(n),i(n),n.gpsValid&&n.status===t.Running&&n.timeSinceLog>5&&(n.timeSinceLog=0,function(t){t.fileWritten||(t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate",/*LANG*/"steps"].join(",")+"\n"),t.fileWritten=!0),t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(n))}(o,n)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const e=n.bpm-t.hr,i=Math.abs(e)+101-n.confidence,s=t.hrError/(t.hrError+i)||0;t.hr+=e*s,t.hrError+=(i-t.hrError)*s}(t,n)),Bangle.setHRMPower(1)}(r),function(n){Bangle.on("step",()=>function(n){n.status===t.Running&&(n.steps+=1)}(n))}(r),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&s(t)}),s(t)}(r),setWatch(()=>a(r),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(n){n.status===t.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(n),n.status===t.Running?n.status=t.Paused:n.status=t.Stopped,i(n)}(r),BTN3,{repeat:!0,edge:"falling"})}(); diff --git a/apps/banglexercise/settings.js b/apps/banglexercise/settings.js index 3208c6eca..6b80e9035 100644 --- a/apps/banglexercise/settings.js +++ b/apps/banglexercise/settings.js @@ -19,3 +19,5 @@ } }); }); +}); +}); diff --git a/apps/breath/app.js b/apps/breath/app.js index 380308739..97e6b625f 100644 --- a/apps/breath/app.js +++ b/apps/breath/app.js @@ -191,8 +191,8 @@ function btn3Pressed() { if (settings.vibrate == "forward") settings.vibrate = "backward"; else if (settings.vibrate == "backward") - settings.vibrate = "off"; - else if (settings.vibrate == "off") + settings.vibrate = /*LANG*/"off"; + else if (settings.vibrate == /*LANG*/"off") settings.vibrate = "forward"; } else if(status == 5){ diff --git a/apps/bthrm/boot.js b/apps/bthrm/boot.js index 6ac6382d6..0d3b72735 100644 --- a/apps/bthrm/boot.js +++ b/apps/bthrm/boot.js @@ -503,7 +503,7 @@ if (settings.startWithHrm){ Bangle.setHRMPower = function(isOn, app) { - log("setHRMPower for " + app + ": " + (isOn?"on":"off")); + log("setHRMPower for " + app + ": " + (isOn?"on":/*LANG*/"off")); if (settings.enabled){ Bangle.setBTHRMPower(isOn, app); } diff --git a/apps/bthrm/settings.js b/apps/bthrm/settings.js index 62d2e7ea3..117e54e3f 100644 --- a/apps/bthrm/settings.js +++ b/apps/bthrm/settings.js @@ -243,5 +243,12 @@ } }; + E.showMenu(mainmenu); +}) + writeSettings("gracePeriodService",v); + } + } + }; + E.showMenu(mainmenu); }) diff --git a/apps/bthrv/app.js b/apps/bthrv/app.js index 7f6ec2d35..2faa7c200 100644 --- a/apps/bthrv/app.js +++ b/apps/bthrv/app.js @@ -58,7 +58,7 @@ function draw(y, hrv) { } g.setRotation(3); - g.setFontVector(12).drawString("Reset",g.getHeight()/2, g.getWidth()-10); + g.setFontVector(12).drawString(/*LANG*/"Reset",g.getHeight()/2, g.getWidth()-10); g.setRotation(0); } diff --git a/apps/calendar/settings.js b/apps/calendar/settings.js index 3c8f7d8e8..dfd2b6190 100644 --- a/apps/calendar/settings.js +++ b/apps/calendar/settings.js @@ -36,3 +36,7 @@ }); }) + }, + }); +}) + diff --git a/apps/chronowid/app.js b/apps/chronowid/app.js index ab363ed17..400d08eb5 100644 --- a/apps/chronowid/app.js +++ b/apps/chronowid/app.js @@ -91,3 +91,4 @@ function showMenu() { } showMenu(); +enu(); diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 49af2a057..5c2bf9478 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -227,7 +227,7 @@ function isCircleEnabled(type) { function getCircleColor(type) { const pos = getCirclePosition(type); - const color = settings["circle" + (pos + 1) + "color"]; + const color = settings["circle" + (pos + 1) + /*LANG*/"color"]; if (color && color != "") return color; } @@ -828,3 +828,7 @@ Bangle.loadWidgets(); draw(); setInterval(draw, 60000); +s(); + +draw(); +setInterval(draw, 60000); diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 348d187eb..30754f136 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -44,7 +44,7 @@ }, /*LANG*/'show widgets': { value: "showWidgets" in settings ? settings.showWidgets : false, - format: () => (settings.showWidgets ? 'Yes' : 'No'), + format: () => (settings.showWidgets ? /*LANG*/'Yes' : 'No'), onchange: x => save('showWidgets', x), }, /*LANG*/'weather circle': { @@ -167,7 +167,7 @@ }, /*LANG*/'colorize icon': { value: colorizeIconKey in settings ? settings[colorizeIconKey] : false, - format: () => (settings[colorizeIconKey] ? 'Yes' : 'No'), + format: () => (settings[colorizeIconKey] ? /*LANG*/'Yes' : 'No'), onchange: x => save(colorizeIconKey, x), }, }; @@ -175,5 +175,9 @@ } + showMainMenu(); +}); + + showMainMenu(); }); diff --git a/apps/cliclockJS2Enhanced/app.js b/apps/cliclockJS2Enhanced/app.js index b6172b497..e20944531 100644 --- a/apps/cliclockJS2Enhanced/app.js +++ b/apps/cliclockJS2Enhanced/app.js @@ -16,7 +16,7 @@ var lasty = 0; var lastx = 0; if (settings.HID=="kbmedia") { - profile = 'Music'; + profile = /*LANG*/'Music'; sendHid = function (code, cb) { try { NRF.sendHIDReport([1,code], () => { @@ -57,29 +57,29 @@ if (next) { if(lasty > 40){ writeLine('Down', 3); // setTimeout(drawApp, 1000); - // Bluetooth.println(JSON.stringify({t:"music", n:"volumedown"})); + // Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"volumedown"})); down(() => {}); } else if(lasty < -40){ writeLine('Up', 3); // setTimeout(drawApp, 1000); - //Bluetooth.println(JSON.stringify({t:"music", n:"volumeup"})); + //Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"volumeup"})); up(() => {}); } else if(lastx < -40){ writeLine('Prev', 3); // setTimeout(drawApp, 1000); - // Bluetooth.println(JSON.stringify({t:"music", n:"previous"})); + // Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"previous"})); prev(() => {}); } else if(lastx > 40){ writeLine('Next', 3); // setTimeout(drawApp, 1000); - // Bluetooth.println(JSON.stringify({t:"music", n:"next"})); + // Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"next"})); next(() => {}); } else if(lastx==0 && lasty==0){ writeLine('play/pause', 3); //setTimeout(drawApp, 1000); - // Bluetooth.println(JSON.stringify({t:"music", n:"play"})); + // Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"play"})); toggle(() => {}); } diff --git a/apps/clicompleteclk/app.js b/apps/clicompleteclk/app.js index a39b37e58..8a4d00798 100644 --- a/apps/clicompleteclk/app.js +++ b/apps/clicompleteclk/app.js @@ -35,7 +35,7 @@ function setting(key) { 'battery': true, 'batteryLvl': 30, 'weather': true, - 'steps': true, + /*LANG*/'steps': true, 'heartrate': true }; return (key in settings) ? settings[key] : DEFAULTS[key]; @@ -45,7 +45,7 @@ function setting(key) { let showBattery = setting('battery'); let batteryWarnLevel = setting('batteryLvl'); let showWeather = setting('weather'); -let showSteps = setting('steps'); +let showSteps = setting(/*LANG*/'steps'); let showHeartRate = setting('heartrate'); diff --git a/apps/clicompleteclk/settings.js b/apps/clicompleteclk/settings.js index 2df20ed3e..dfd37e902 100644 --- a/apps/clicompleteclk/settings.js +++ b/apps/clicompleteclk/settings.js @@ -52,3 +52,7 @@ '< Back': back, }); }); +, + '< Back': back, + }); +}); diff --git a/apps/configurable_clock/app.js b/apps/configurable_clock/app.js index 157d57741..afde21e1a 100644 --- a/apps/configurable_clock/app.js +++ b/apps/configurable_clock/app.js @@ -710,7 +710,7 @@ { Face:'1-12', colored:true, Hands:'rounded', withSeconds:true, - Foreground:'Theme', Background:'Theme', Seconds:'#FF0000' + Foreground:'Theme', Background:/*LANG*/'Theme', Seconds:'#FF0000' }, require('Storage').readJSON('configurable_clock.json', true) || {} ); @@ -855,8 +855,8 @@ activeLayout = null; g.setTheme({ - fg:(Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'), - bg:(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF') + fg:(Settings.Foreground === /*LANG*/'Theme' ? Theme.fg : Settings.Foreground || '#000000'), + bg:(Settings.Background === /*LANG*/'Theme' ? Theme.bg : Settings.Background || '#FFFFFF') }); g.clear(true); // also installs the current theme @@ -872,8 +872,8 @@ /**** renderClock ****/ function renderClock () { - g.setColor (Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'); - g.setBgColor(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); + g.setColor (Settings.Foreground === /*LANG*/'Theme' ? Theme.fg : Settings.Foreground || '#000000'); + g.setBgColor(Settings.Background === /*LANG*/'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); switch (Settings.Face) { case 'none': @@ -951,7 +951,7 @@ let HoursAngle = (Hours+(Minutes/60))/12 * twoPi - Pi; let MinutesAngle = (Minutes/60) * twoPi - Pi; - g.setColor(Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'); + g.setColor(Settings.Foreground === /*LANG*/'Theme' ? Theme.fg : Settings.Foreground || '#000000'); switch (Settings.Hands) { case 'simple': @@ -968,10 +968,10 @@ transformPolygon(roundedMinuteHandPolygon, CenterX,CenterY, MinutesAngle); g.fillPoly(transformedPolygon); -// g.setColor(Settings.Foreground === 'Theme' ? Theme.fg || '#000000'); +// g.setColor(Settings.Foreground === /*LANG*/'Theme' ? Theme.fg || '#000000'); g.fillCircle(CenterX,CenterY, outerBoltRadius); - g.setColor(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); + g.setColor(Settings.Background === /*LANG*/'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); g.drawCircle(CenterX,CenterY, outerBoltRadius); g.fillCircle(CenterX,CenterY, innerBoltRadius); break; @@ -986,7 +986,7 @@ } if (Settings.withSeconds) { - g.setColor(Settings.Seconds === 'Theme' ? Theme.fgH : Settings.Seconds || '#FF0000'); + g.setColor(Settings.Seconds === /*LANG*/'Theme' ? Theme.fgH : Settings.Seconds || '#FF0000'); let Seconds = now.getSeconds(); let SecondsAngle = (Seconds/60) * twoPi - Pi; @@ -1089,9 +1089,9 @@ let Seconds = (Changes.Seconds == null ? Settings.Seconds : Changes.Seconds); activeLayout = ColorsScreen; - activeLayout['Foreground'].bgCol = (Foreground === 'Theme' ? Theme.fg : Foreground); - activeLayout['Background'].bgCol = (Background === 'Theme' ? Theme.bg : Background); - activeLayout['Seconds'].bgCol = (Seconds === 'Theme' ? Theme.fgH : Seconds); + activeLayout['Foreground'].bgCol = (Foreground === /*LANG*/'Theme' ? Theme.fg : Foreground); + activeLayout['Background'].bgCol = (Background === /*LANG*/'Theme' ? Theme.bg : Background); + activeLayout['Seconds'].bgCol = (Seconds === /*LANG*/'Theme' ? Theme.fgH : Seconds); activeLayout.render(); } @@ -1123,12 +1123,12 @@ activeLayout['#FF00FF'].selected = (chosenColor === '#FF00FF'); activeLayout['#00FFFF'].selected = (chosenColor === '#00FFFF'); activeLayout['#FFFFFF'].selected = (chosenColor === '#FFFFFF'); - activeLayout['Theme'].selected = (chosenColor === 'Theme'); + activeLayout['Theme'].selected = (chosenColor === /*LANG*/'Theme'); activeLayout.render(); } function chooseColor (Control) { Bangle.buzz(); chosenColor = Control.id; refreshColorChoiceScreen(); } - function chooseThemeColor () { Bangle.buzz(); chosenColor = 'Theme'; refreshColorChoiceScreen(); } + function chooseThemeColor () { Bangle.buzz(); chosenColor = /*LANG*/'Theme'; refreshColorChoiceScreen(); } function applyColor () { Changes[ColorToChange] = chosenColor; @@ -1347,9 +1347,9 @@ Drawable(drawColorChoice, { id:'#00FFFF', common:ColorChoice, col:'#00FFFF' }), ], filly:1 }, { type:'h', c:[ - Label('use Theme:', { id:'Theme', common:leftAligned, pad:4 }), + Label('use Theme:', { id:/*LANG*/'Theme', common:leftAligned, pad:4 }), { width:10 }, - Drawable(drawColorChoice, { id:'Theme', common:ColorChoice, col:Theme.fg }), + Drawable(drawColorChoice, { id:/*LANG*/'Theme', common:ColorChoice, col:Theme.fg }), ], filly:1, onTouch:chooseThemeColor }, { height:4 }, { type:'h', c:[ diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js index 3fc2dfbf2..11e5c1e8f 100644 --- a/apps/coretemp/settings.js +++ b/apps/coretemp/settings.js @@ -45,3 +45,7 @@ const menu = { E.showMenu(menu); }) +nu); +}) +nu); +}) diff --git a/apps/cscsensor/cscsensor.app.js b/apps/cscsensor/cscsensor.app.js index e2af0db16..03fc77aca 100644 --- a/apps/cscsensor/cscsensor.app.js +++ b/apps/cscsensor/cscsensor.app.js @@ -225,7 +225,7 @@ function connection_setup() { return device.gatt.connect(); }).then(function(ga) { gatt = ga; - E.showMessage("Connected"); + E.showMessage(/*LANG*/"Connected"); return gatt.getPrimaryService("1816"); }).then(function(s) { service = s; diff --git a/apps/cscsensor/settings.js b/apps/cscsensor/settings.js index d7a7d565d..fdbffd2f5 100644 --- a/apps/cscsensor/settings.js +++ b/apps/cscsensor/settings.js @@ -43,3 +43,5 @@ } E.showMenu(menu); }) +nu); +}) diff --git a/apps/dane_tcr/app.js b/apps/dane_tcr/app.js index aa25379d3..ce75c55cb 100644 --- a/apps/dane_tcr/app.js +++ b/apps/dane_tcr/app.js @@ -244,7 +244,7 @@ function run(){ Bangle.setLCDMode(); g.clear(); g.flip(); - E.showMessage("Loading..."); + E.showMessage(/*LANG*/"Loading..."); load(app.src); } diff --git a/apps/dane_tcr/settings.js b/apps/dane_tcr/settings.js index 9d28d1b30..1fd20a2c8 100644 --- a/apps/dane_tcr/settings.js +++ b/apps/dane_tcr/settings.js @@ -56,4 +56,6 @@ }, '< Back': back }); +});: back + }); }); \ No newline at end of file diff --git a/apps/daysl/app.js b/apps/daysl/app.js index 50695328e..0bb11a77b 100644 --- a/apps/daysl/app.js +++ b/apps/daysl/app.js @@ -46,7 +46,7 @@ function showMenu() { updateSettings(); } }, - 'Year': { + /*LANG*/'Year': { value: settings.year, step: 1, onchange: v => { diff --git a/apps/dsdrelay/dsdrelay.app.js b/apps/dsdrelay/dsdrelay.app.js index 18e7293aa..4a34a47fc 100644 --- a/apps/dsdrelay/dsdrelay.app.js +++ b/apps/dsdrelay/dsdrelay.app.js @@ -59,7 +59,7 @@ function parseDevice(d) { g.clearRect(0, 60, 239, 239).setFontAlign(0, 0, 0).setColor(0, 1, 0).drawString("Found device", 120, 120).flip(); device.gatt.connect().then(function(ga) { gatt = ga; - g.clearRect(0, 60, 239, 239).setFontAlign(0, 0, 0).setColor(0, 1, 0).drawString("Connected", 120, 120).flip(); + g.clearRect(0, 60, 239, 239).setFontAlign(0, 0, 0).setColor(0, 1, 0).drawString(/*LANG*/"Connected", 120, 120).flip(); return gatt.getPrimaryService("FFE0"); }).then(function(s) { service = s; diff --git a/apps/dtlaunch/settings-b1.js b/apps/dtlaunch/settings-b1.js index f3101da16..41e9ce0ba 100644 --- a/apps/dtlaunch/settings-b1.js +++ b/apps/dtlaunch/settings-b1.js @@ -31,3 +31,7 @@ } }); }) + + } + }); +}) diff --git a/apps/dtlaunch/settings-b2.js b/apps/dtlaunch/settings-b2.js index 7f667d213..ad30eba04 100644 --- a/apps/dtlaunch/settings-b2.js +++ b/apps/dtlaunch/settings-b2.js @@ -40,3 +40,8 @@ } }); }) + + } + } + }); +}) diff --git a/apps/ffcniftya/settings.js b/apps/ffcniftya/settings.js index 46e4ef5aa..d57b6b20c 100644 --- a/apps/ffcniftya/settings.js +++ b/apps/ffcniftya/settings.js @@ -20,4 +20,5 @@ } } }); +}) }); }) \ No newline at end of file diff --git a/apps/ffcniftyb/app.js b/apps/ffcniftyb/app.js index 75d217ab4..9456d3421 100644 --- a/apps/ffcniftyb/app.js +++ b/apps/ffcniftyb/app.js @@ -2,7 +2,7 @@ const locale = require("locale"); const storage = require('Storage'); const is12Hour = (storage.readJSON("setting.json", 1) || {})["12hour"]; -const color = (storage.readJSON("ffcniftyb.json", 1) || {})["color"] || 63488 /* red */; +const color = (storage.readJSON("ffcniftyb.json", 1) || {})[/*LANG*/"color"] || 63488 /* red */; /* Clock *********************************************/ diff --git a/apps/fileman/fileman.app.js b/apps/fileman/fileman.app.js index 6a3c5598d..cd0948311 100644 --- a/apps/fileman/fileman.app.js +++ b/apps/fileman/fileman.app.js @@ -102,3 +102,5 @@ function get_pruned_file_list() { files = get_pruned_file_list(); drawMenu(); +Menu(); +Menu(); diff --git a/apps/files/files.js b/apps/files/files.js index e7b42c101..827be1d38 100644 --- a/apps/files/files.js +++ b/apps/files/files.js @@ -225,3 +225,4 @@ function sortHelper() { } showMainMenu(); +Menu(); diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js index feb6b0ffc..8aa3f419b 100644 --- a/apps/gallifr/settings.js +++ b/apps/gallifr/settings.js @@ -31,3 +31,7 @@ }; E.showMenu(appMenu) }) +enu) +}) +enu(appMenu) +}) diff --git a/apps/gbmusic/settings.js b/apps/gbmusic/settings.js index ae013fda5..aa35b4157 100644 --- a/apps/gbmusic/settings.js +++ b/apps/gbmusic/settings.js @@ -43,3 +43,5 @@ E.showMenu(menu); }); +u); +}); diff --git a/apps/gbridge/settings.js b/apps/gbridge/settings.js index f9c7cde90..5b7cce40c 100644 --- a/apps/gbridge/settings.js +++ b/apps/gbridge/settings.js @@ -47,3 +47,7 @@ E.showMenu(mainmenu); }) +nu); +}) +u(mainmenu); +}) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index 0eca2ccf5..a6e21af0d 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -5,7 +5,7 @@ function satelliteImage() { var Layout = require("Layout"); var layout; //Bangle.setGPSPower(1, "app"); -E.showMessage("Loading..."); // avoid showing rubbish on screen +E.showMessage(/*LANG*/"Loading..."); // avoid showing rubbish on screen var lastFix = { fix: -1, diff --git a/apps/gpsrec/app.js b/apps/gpsrec/app.js index 833a816ea..712567be5 100644 --- a/apps/gpsrec/app.js +++ b/apps/gpsrec/app.js @@ -251,7 +251,7 @@ function plotTrack(info) { g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString("Back",g.getWidth() - 10, g.getHeight()/2); + g.drawString(/*LANG*/"Back",g.getWidth() - 10, g.getHeight()/2); setWatch(function() { viewTrack(info.fn, info); }, global.BTN3||BTN1); @@ -335,7 +335,7 @@ function plotGraph(info, style) { }); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40); + g.drawString(/*LANG*/"Back",g.getWidth() - 10, g.getHeight() - 40); setWatch(function() { viewTrack(info.fn, info); }, global.BTN3||BTN1); diff --git a/apps/gpstime/gpstime.js b/apps/gpstime/gpstime.js index 8c80953fa..d22783e3a 100644 --- a/apps/gpstime/gpstime.js +++ b/apps/gpstime/gpstime.js @@ -40,7 +40,7 @@ var layout = new Layout( { {type:"txt", fillx:1, filly:1, font:"6x8:2", label:"---", id:"gpstime" } ]},{lazy:true, btns: [ { label : "Set", cb : setGPSTime}, - { label : "Back", cb : ()=>load() } + { label : /*LANG*/"Back", cb : ()=>load() } ]}); diff --git a/apps/hardalarm/app.js b/apps/hardalarm/app.js index 61467b421..2159f1711 100644 --- a/apps/hardalarm/app.js +++ b/apps/hardalarm/app.js @@ -110,3 +110,4 @@ function editAlarm(alarmIndex) { } showMainMenu(); +showMainMenu(); diff --git a/apps/hardalarm/hardalarm.js b/apps/hardalarm/hardalarm.js index e33bd39cc..b9ce731d4 100644 --- a/apps/hardalarm/hardalarm.js +++ b/apps/hardalarm/hardalarm.js @@ -40,7 +40,7 @@ function showNumberPicker(currentGuess, randomNum) { function showPrompt(msg, buzzCount, alarm) { E.showPrompt(msg,{ title:"STAY AWAKE!", - buttons : {"Sleep":0,"Stop":1} // default is sleep so it'll come back in 10 mins + buttons : {/*LANG*/"Sleep":0,"Stop":1} // default is sleep so it'll come back in 10 mins }).then(function(choice) { buzzCount = 0; if (choice==0) { diff --git a/apps/health/app.js b/apps/health/app.js index 7a55eec27..3eb72db5b 100644 --- a/apps/health/app.js +++ b/apps/health/app.js @@ -255,3 +255,7 @@ function clearButton() { Bangle.loadWidgets(); Bangle.drawWidgets(); menuMain(); +Main(); +ts(); +Bangle.drawWidgets(); +menuMain(); diff --git a/apps/heart/app.js b/apps/heart/app.js index 5428ea06b..e475fd7f3 100644 --- a/apps/heart/app.js +++ b/apps/heart/app.js @@ -310,3 +310,4 @@ function graphRecord(n) { showMainMenu(); // vim: et ts=2 sw=2 +=2 sw=2 diff --git a/apps/hidmsic/hid-music.js b/apps/hidmsic/hid-music.js index db81744f3..60aa2cf08 100644 --- a/apps/hidmsic/hid-music.js +++ b/apps/hidmsic/hid-music.js @@ -5,7 +5,7 @@ const settings = storage.readJSON('setting.json',1) || { HID: false }; var sendHid, next, prev, toggle, up, down, profile; if (settings.HID=="kbmedia") { - profile = 'Music'; + profile = /*LANG*/'Music'; sendHid = function (code, cb) { try { NRF.sendHIDReport([1,code], () => { diff --git a/apps/hidmsicswipe/hidmsicswipe.js b/apps/hidmsicswipe/hidmsicswipe.js index e0fc760a4..7da81900b 100644 --- a/apps/hidmsicswipe/hidmsicswipe.js +++ b/apps/hidmsicswipe/hidmsicswipe.js @@ -7,7 +7,7 @@ var lasty = 0; var lastx = 0; if (settings.HID=="kbmedia") { - profile = 'Music'; + profile = /*LANG*/'Music'; sendHid = function (code, cb) { try { NRF.sendHIDReport([1,code], () => { @@ -36,8 +36,8 @@ if (settings.HID=="kbmedia") { function drawApp() { g.clear(); - if(Bangle.isLocked()==false) E.showMessage('Swipe', 'Music'); - else E.showMessage('Locked', 'Music'); + if(Bangle.isLocked()==false) E.showMessage('Swipe', /*LANG*/'Music'); + else E.showMessage('Locked', /*LANG*/'Music'); } if (next) { diff --git a/apps/hourstrike/app.js b/apps/hourstrike/app.js index 9169b5def..dc81d2835 100644 --- a/apps/hourstrike/app.js +++ b/apps/hourstrike/app.js @@ -38,3 +38,4 @@ function showMainMenu() { } showMainMenu(); +Menu(); diff --git a/apps/hralarm/settings.js b/apps/hralarm/settings.js index 3158ab8b7..d6f629ac4 100644 --- a/apps/hralarm/settings.js +++ b/apps/hralarm/settings.js @@ -55,3 +55,5 @@ } }); }) + }); +}) diff --git a/apps/intervalTimer/app.js b/apps/intervalTimer/app.js index fd57dbe2b..906a8f8e0 100644 --- a/apps/intervalTimer/app.js +++ b/apps/intervalTimer/app.js @@ -172,7 +172,7 @@ function setNumSets(){ type:"v", c: [ {type:"txt", font:"6x8:2", label:"Number Sets", id:"title" }, {type:"txt", font:"30%", pad: 20, label: numSets, id:"value" }, - {type:"btn", font:"6x8:2", label:"Back", cb: l => { + {type:"btn", font:"6x8:2", label:/*LANG*/"Back", cb: l => { setRestTime(); } } @@ -217,7 +217,7 @@ function setRestTime(){ type:"v", c: [ {type:"txt", font:"6x8:2", label:"Rest Time", id:"title" }, {type:"txt", font:"30%", pad: 20, label: restTime, id:"value" }, - {type:"btn", font:"6x8:2", label:"Back", cb: l => { + {type:"btn", font:"6x8:2", label:/*LANG*/"Back", cb: l => { setActiveTime(); } } diff --git a/apps/intervals/intervals.app.js b/apps/intervals/intervals.app.js index da436b104..c0f368687 100644 --- a/apps/intervals/intervals.app.js +++ b/apps/intervals/intervals.app.js @@ -152,7 +152,7 @@ function showMenu() "Work seconds" : { value : settings.workseg,min:0,max:59,step:5,onchange : v => { settings.workseg=v; } }, "Rest minutes" : { value : settings.restmin,min:0,max:59,step:1,onchange : v => { settings.restmin=v; } }, "Rest seconds" : { value : settings.restseg,min:0,max:59,step:5,onchange : v => { settings.restseg=v; } }, - "Signal type" : { value : settings.buzz,format : v => v?"Buzz":"Beep",onchange : v => { settings.buzz=v; }} + "Signal type" : { value : settings.buzz,format : v => v?"Buzz":/*LANG*/"Beep",onchange : v => { settings.buzz=v; }} }; E.showMenu(mainmenu); diff --git a/apps/ios/boot.js b/apps/ios/boot.js index 50286c4a6..f95bd6839 100644 --- a/apps/ios/boot.js +++ b/apps/ios/boot.js @@ -132,7 +132,7 @@ E.on('notify',msg=>{ // Apple media service E.on('AMS',a=>{ function push(m) { - var msg = { t : "modify", id : "music", title:"Music" }; + var msg = { t : "modify", id : "music", title:/*LANG*/"Music" }; if (a.id=="artist") msg.artist = m; else if (a.id=="album") msg.album = m; else if (a.id=="title") msg.track = m; diff --git a/apps/jbm8b/app.js b/apps/jbm8b/app.js index 53baa32e3..bb77b1303 100644 --- a/apps/jbm8b/app.js +++ b/apps/jbm8b/app.js @@ -2,12 +2,12 @@ const affirmative = [ 'It is\ncertain.', 'It is\ndicededly\nso.', 'Without\na doubt.', - 'Yes\ndefinitely.', + /*LANG*/'Yes\ndefinitely.', 'You may\nrely\non it.', 'As I see,\nit yes.', 'Most\nlikely.', 'Outlook\ngood.', - 'Yes.', + /*LANG*/'Yes.', 'Signs point\nto yes.' ]; const nonCommittal = [ diff --git a/apps/largeclock/settings.js b/apps/largeclock/settings.js index f996666ab..729c417c8 100644 --- a/apps/largeclock/settings.js +++ b/apps/largeclock/settings.js @@ -84,3 +84,5 @@ E.showMenu(mainMenu); }); +u); +}); diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index c020c49e8..f430c1c43 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -3,7 +3,7 @@ const locale = require('locale'); const storage = require('Storage') let settings = { alarm: -1, - dataRow1: "Steps", + dataRow1: /*LANG*/"Steps", dataRow2: "Temp", dataRow3: "Battery" }; @@ -151,7 +151,7 @@ function _drawData(key, y, c){ var value = "ERR"; var should_print= true; - if(key == "STEPS"){ + if(key == /*LANG*/"STEPS"){ text = "STEP"; value = getSteps(); diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js index 076dea4d1..4f2637af1 100644 --- a/apps/lcars/lcars.settings.js +++ b/apps/lcars/lcars.settings.js @@ -52,3 +52,7 @@ } }); }) + + } + }); +}) diff --git a/apps/lightswitch/settings.js b/apps/lightswitch/settings.js index aac159148..13fe5dc39 100644 --- a/apps/lightswitch/settings.js +++ b/apps/lightswitch/settings.js @@ -107,8 +107,8 @@ step: 1 }, unlockSide: { - title: ["off", "left", "right", "top", "bottom", "front", "back"], - value: ["", "left", "right", "top", "bottom", "front", "back"] + title: ["off", "left", "right", "top", "bottom", "front", /*LANG*/"back"], + value: ["", "left", "right", "top", "bottom", "front", /*LANG*/"back"] }, tapOn: { title: ["on locked", "on unlocked", "always on"], diff --git a/apps/lightswitch/widget.js b/apps/lightswitch/widget.js index 119a114fe..c394df2e8 100644 --- a/apps/lightswitch/widget.js +++ b/apps/lightswitch/widget.js @@ -21,7 +21,7 @@ area: "tr", sortorder: 10, width: 23, - dragStatus: "off", + dragStatus: /*LANG*/"off", // internal function // // write settings to storage @@ -165,7 +165,7 @@ // on touch release remove drag listener and reset drag status to indicate stopped drag action if (!event.b) { Bangle.removeListener("drag", w.dragListener); - w.dragStatus = "off"; + w.dragStatus = /*LANG*/"off"; } // clear variables @@ -181,7 +181,7 @@ var w = WIDGETS.lightswitch; // skip all if drag action ongoing - if (w.dragStatus === "off") { + if (w.dragStatus === /*LANG*/"off") { // check if inside widget area if (!(!w || cursor.x < w.x || cursor.x > w.x + w.width || @@ -199,7 +199,7 @@ // clear drag timeout if (typeof w.dragStatus === "number") clearTimeout(w.dragStatus); // reset drag status to indicate stopped drag action - w.dragStatus = "off"; + w.dragStatus = /*LANG*/"off"; }, w.dragDelay, w); } // switch backlight diff --git a/apps/limelight/limelight.settings.js b/apps/limelight/limelight.settings.js index aacea2f86..a732d999a 100644 --- a/apps/limelight/limelight.settings.js +++ b/apps/limelight/limelight.settings.js @@ -75,4 +75,8 @@ }, } }); +}) + }, + } + }); }) diff --git a/apps/ltherm/app.js b/apps/ltherm/app.js index 7accae2ed..2cbf26e5f 100644 --- a/apps/ltherm/app.js +++ b/apps/ltherm/app.js @@ -20,6 +20,6 @@ const avg = []; setInterval(function() { drawTemperature(); }, 2000); -E.showMessage("Loading..."); +E.showMessage(/*LANG*/"Loading..."); Bangle.loadWidgets(); Bangle.drawWidgets(); diff --git a/apps/marioclock/marioclock-app.js b/apps/marioclock/marioclock-app.js index 6289a2568..20dc0814f 100644 --- a/apps/marioclock/marioclock-app.js +++ b/apps/marioclock/marioclock-app.js @@ -73,7 +73,7 @@ let lastTemp = 0; const phone = { get status() { - return NRF.getSecurityStatus().connected ? "Yes" : "No"; + return NRF.getSecurityStatus().connected ? /*LANG*/"Yes" : "No"; }, message: null, messageTimeout: null, diff --git a/apps/menuwheel/boot.js b/apps/menuwheel/boot.js index deb15264d..f5bfff498 100644 --- a/apps/menuwheel/boot.js +++ b/apps/menuwheel/boot.js @@ -14,7 +14,7 @@ E.showMenu = function(items) { // show "< Back" item (or similar) as button instead (i.e. remove from the menu) var back,backLbl; - for (var b of ['Back', 'Exit', 'Cancel']) { + for (var b of [/*LANG*/'Back', 'Exit', 'Cancel']) { if (!items[b] && items['< '+b]) b = '< '+b; back = items[b]; if (typeof back === "function") { diff --git a/apps/messages/app.js b/apps/messages/app.js index ec147daf8..05a02191c 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -98,7 +98,7 @@ function getMessageImage(msg) { if (s=="whatsapp") return atob("GBiBAAB+AAP/wAf/4A//8B//+D///H9//n5//nw//vw///x///5///4///8e//+EP3/APn/wPn/+/j///H//+H//8H//4H//wMB+AA=="); if (s=="wordfeud") return atob("GBgCWqqqqqqlf//////9v//////+v/////++v/////++v8///Lu+v8///L++v8///P/+v8v//P/+v9v//P/+v+fx/P/+v+Pk+P/+v/PN+f/+v/POuv/+v/Ofdv/+v/NvM//+v/I/Y//+v/k/k//+v/i/w//+v/7/6//+v//////+v//////+f//////9Wqqqqqql"); if (msg.id=="music") return atob("FhaBAH//+/////////////h/+AH/4Af/gB/+H3/7/f/v9/+/3/7+f/vB/w8H+Dwf4PD/x/////////////3//+A="); - if (msg.id=="back") return getBackImage(); + if (msg.id==/*LANG*/"back") return getBackImage(); return getNotificationImage(); } function getMessageImageCol(msg,def) { @@ -375,7 +375,7 @@ function checkMessages(options) { if (msg && msg.new) g.setBgColor(colBg); else g.setBgColor((idx&1) ? colSBg1 : colSBg2); g.clearRect(r.x,r.y,r.x+r.w-1,r.y+r.h-1).setColor(g.theme.fg); - if (idx==0) msg = {id:"back", title:"< Back"}; + if (idx==0) msg = {id:/*LANG*/"back", title:"< Back"}; if (!msg) return; var x = r.x+2, title = msg.title, body = msg.body; var img = getMessageImage(msg); diff --git a/apps/messages/settings.js b/apps/messages/settings.js index c865a37fb..ca64c692f 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -40,3 +40,5 @@ }; E.showMenu(mainmenu); }) +.showMenu(mainmenu); +}) diff --git a/apps/mysticclock/mystic-clock-settings.js b/apps/mysticclock/mystic-clock-settings.js index 2fa0c49c5..09aaf741e 100644 --- a/apps/mysticclock/mystic-clock-settings.js +++ b/apps/mysticclock/mystic-clock-settings.js @@ -39,3 +39,9 @@ E.showMenu(appMenu) }) +nu(appMenu) + +}) +nu) + +}) diff --git a/apps/mysticdock/mystic-dock-settings.js b/apps/mysticdock/mystic-dock-settings.js index 7bfda1c0f..55b25c6a4 100644 --- a/apps/mysticdock/mystic-dock-settings.js +++ b/apps/mysticdock/mystic-dock-settings.js @@ -46,3 +46,9 @@ E.showMenu(appMenu) }) +nu(appMenu) + +}) +nu) + +}) diff --git a/apps/mywelcome/settings.js b/apps/mywelcome/settings.js index cf7208d65..b3e276328 100644 --- a/apps/mywelcome/settings.js +++ b/apps/mywelcome/settings.js @@ -15,4 +15,6 @@ }, '< Back': back, }) +}) + }) }) diff --git a/apps/ncstart/start.js b/apps/ncstart/start.js index d2d713cb2..b34066376 100644 --- a/apps/ncstart/start.js +++ b/apps/ncstart/start.js @@ -29,7 +29,7 @@ function welcome() { setWatch(() => { clearInterval(i); clearWatch(); - E.showMessage('Loading...'); + E.showMessage(/*LANG*/'Loading...'); res(); }, BTN2, {repeat:false}); }); diff --git a/apps/numerals/numerals.settings.js b/apps/numerals/numerals.settings.js index ae321322a..ad56e7d04 100644 --- a/apps/numerals/numerals.settings.js +++ b/apps/numerals/numerals.settings.js @@ -32,7 +32,7 @@ "Date on touch": { value: 0|numeralsSettings.showDate, min:0,max:1, - format: v=>v?"On":"Off", + format: v=>v?"On":/*LANG*/"Off", onchange: v=> { numeralsSettings.showDate=v; updateSettings();} }, "< back": back diff --git a/apps/pastel/pastel.settings.js b/apps/pastel/pastel.settings.js index bf83fa7c2..a0570b292 100644 --- a/apps/pastel/pastel.settings.js +++ b/apps/pastel/pastel.settings.js @@ -54,3 +54,7 @@ } }) }) +, + } + }) +}) diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 106e09b82..35f700762 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -12,7 +12,7 @@ const SETTINGS_FILE = "pebble.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', /*LANG*/'color': 'Green'}; } var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); diff --git a/apps/pebble/pebble.settings.js b/apps/pebble/pebble.settings.js index ff408907d..a0e29320e 100644 --- a/apps/pebble/pebble.settings.js +++ b/apps/pebble/pebble.settings.js @@ -36,3 +36,5 @@ } }); }) + }); +}) diff --git a/apps/pebbled/pebbled.app.js b/apps/pebbled/pebbled.app.js index bbe98823f..378a3878d 100644 --- a/apps/pebbled/pebbled.app.js +++ b/apps/pebbled/pebbled.app.js @@ -12,7 +12,7 @@ const SETTINGS_FILE = "pebbleDistance.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', /*LANG*/'color': 'Green', 'avStep': 0.75}; } var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); diff --git a/apps/pebbled/pebbled.settings.js b/apps/pebbled/pebbled.settings.js index d6c84d5d1..4ca1b9612 100644 --- a/apps/pebbled/pebbled.settings.js +++ b/apps/pebbled/pebbled.settings.js @@ -45,4 +45,7 @@ } } }); +}); + } + }); }); diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index caadb4016..d1d83d3a2 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -28,4 +28,5 @@ }}, }; E.showMenu(appMenu) + })E.showMenu(appMenu) }) \ No newline at end of file diff --git a/apps/presentor/app.js b/apps/presentor/app.js index 6b7450a0c..d553e4d8a 100644 --- a/apps/presentor/app.js +++ b/apps/presentor/app.js @@ -106,7 +106,7 @@ let mainLayout = new Layout({ type: 'txt', font: '15%', label: '00:00', - id: 'Timer', + id: /*LANG*/'Timer', halign: 1, pad: 3 } diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 5db3a335b..18d355dbf 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -58,7 +58,7 @@ var showMainMenu = () => { showScrollerContainingAppsWithPatterns().then((selected) => { var pattern = selected.pattern; var appName = selected.appName; - if (pattern === "back") { + if (pattern === /*LANG*/"back") { showMainMenu(); } else { E.showPrompt(appName + "\n\npattern:\n" + pattern, { @@ -309,7 +309,7 @@ var showScrollerContainingAppsWithPatterns = () => { }, select: (i) => { log("selected: " + i); - var pattern = "back"; + var pattern = /*LANG*/"back"; var appName = ""; if (i > 0) { var storedPattern = storedPatternsArray[i - 1]; diff --git a/apps/puzzle15/puzzle15.app.js b/apps/puzzle15/puzzle15.app.js index eec21933c..a19494a68 100644 --- a/apps/puzzle15/puzzle15.app.js +++ b/apps/puzzle15/puzzle15.app.js @@ -63,7 +63,7 @@ var startWith; /* For development purposes require('Storage').writeJSON(SETTINGSFILE, { - splashMode: "off", + splashMode: /*LANG*/"off", startWith: "5x5", }); /* */ @@ -622,9 +622,9 @@ function framedText(text, x, y, textcol, framecol) { } // Show the splash screen at program start, call afterSplash afterwards. -// If spash mode is "off", call afterSplash directly. +// If spash mode is /*LANG*/"off", call afterSplash directly. function showSplash(afterSplash) { - if (splashMode === "off") + if (splashMode === /*LANG*/"off") afterSplash(); else { g.reset(); diff --git a/apps/puzzle15/puzzle15.settings.js b/apps/puzzle15/puzzle15.settings.js index 352ec4315..6f7496c33 100644 --- a/apps/puzzle15/puzzle15.settings.js +++ b/apps/puzzle15/puzzle15.settings.js @@ -47,4 +47,4 @@ }); -// end of file \ No newline at end of file +// end of file of file \ No newline at end of file diff --git a/apps/qalarm/app.js b/apps/qalarm/app.js index ad071adf0..fffe880fc 100644 --- a/apps/qalarm/app.js +++ b/apps/qalarm/app.js @@ -269,3 +269,7 @@ function showEditTimerMenu(timerIndex) { } showMainMenu(); +wMenu(menu); +} + +showMainMenu(); diff --git a/apps/qmsched/app.js b/apps/qmsched/app.js index e05eff6a2..4cca0890b 100644 --- a/apps/qmsched/app.js +++ b/apps/qmsched/app.js @@ -267,3 +267,4 @@ function showOptionsMenu() { loadSettings(); showMainMenu(); +showMainMenu(); diff --git a/apps/rebble/rebble.app.js b/apps/rebble/rebble.app.js index d186ea8ec..de6facdc6 100644 --- a/apps/rebble/rebble.app.js +++ b/apps/rebble/rebble.app.js @@ -33,7 +33,7 @@ function loadLocation() { } function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', /*LANG*/'color': 'Green'}; } function extractTime(d){ diff --git a/apps/rebble/rebble.settings.js b/apps/rebble/rebble.settings.js index db3bab878..d002d8e11 100644 --- a/apps/rebble/rebble.settings.js +++ b/apps/rebble/rebble.settings.js @@ -36,3 +36,5 @@ } }); }) + }); +}) diff --git a/apps/recorder/app.js b/apps/recorder/app.js index 7075563aa..320f4d83d 100644 --- a/apps/recorder/app.js +++ b/apps/recorder/app.js @@ -305,7 +305,7 @@ function viewTrack(filename, info) { g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40); + g.drawString(/*LANG*/"Back",g.getWidth() - 10, g.getHeight() - 40); setWatch(function() { viewTrack(info.fn, info); }, global.BTN3||BTN1); @@ -404,7 +404,7 @@ function viewTrack(filename, info) { }); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40); + g.drawString(/*LANG*/"Back",g.getWidth() - 10, g.getHeight() - 40); setWatch(function() { viewTrack(info.filename, info); }, global.BTN3||BTN1); diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index e10c99c0c..97b4e7208 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -99,8 +99,8 @@ steps:function() { var lastSteps = 0; return { - name : "Steps", - fields : ["Steps"], + name : /*LANG*/"Steps", + fields : [/*LANG*/"Steps"], getValues : () => { var c = Bangle.getStepCount(), r=[c-lastSteps]; lastSteps = c; diff --git a/apps/score/score.settings.js b/apps/score/score.settings.js index 88e367821..50ded8a69 100644 --- a/apps/score/score.settings.js +++ b/apps/score/score.settings.js @@ -217,3 +217,5 @@ }); })(); +; +})(); diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 8ec7d93d4..63b5bc9e2 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -50,7 +50,7 @@ let barMenu = { "": { "title" : "- Barometer -" }, "State": { value: settings.isBarEnabled, - format: v => v ? "On" : "Off", + format: v => v ? "On" : /*LANG*/"Off", onchange: v => { updateSetting('isBarEnabled', v); } }, "Altitude": { value: null }, @@ -62,7 +62,7 @@ let gpsMenu = { "": { "title" : "- GPS -" }, "State": { value: settings.isGpsEnabled, - format: v => v ? "On" : "Off", + format: v => v ? "On" : /*LANG*/"Off", onchange: v => { updateSetting('isGpsEnabled', v); } }, "Lat": { value: null }, @@ -76,7 +76,7 @@ let hrmMenu = { "": { "title" : "- Heart Rate -" }, "State": { value: settings.isHrmEnabled, - format: v => v ? "On" : "Off", + format: v => v ? "On" : /*LANG*/"Off", onchange: v => { updateSetting('isHrmEnabled', v); } }, "BPM": { value: null }, @@ -87,7 +87,7 @@ let magMenu = { "": { "title" : "- Magnetometer -" }, "State": { value: settings.isMagEnabled, - format: v => v ? "On" : "Off", + format: v => v ? "On" : /*LANG*/"Off", onchange: v => { updateSetting('isMagEnabled', v); } }, "x": { value: null }, diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 65e076753..a82985111 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -704,7 +704,7 @@ function showAppSettings(app) { return showError(/*LANG*/'Invalid settings'); } try { - // pass showAppSettingsMenu as "back" argument + // pass showAppSettingsMenu as /*LANG*/"back" argument appSettings(()=>showAppSettingsMenu()); } catch (e) { console.log(`${app.name} settings error:`, e) @@ -713,3 +713,8 @@ function showAppSettings(app) { } showMainMenu(); +tings'); + } +} + +showMainMenu(); diff --git a/apps/simpletimer/app.js b/apps/simpletimer/app.js index e99761810..272c00f0a 100644 --- a/apps/simpletimer/app.js +++ b/apps/simpletimer/app.js @@ -116,7 +116,7 @@ function drawLabels() { g.setFont("6x8", 1); g.drawString("Reset (re)start", 230, 120); if (state != "started") // only when not runnung - g.drawString("Back", 230, 120); + g.drawString(/*LANG*/"Back", 230, 120); } function resetTimer(value) { diff --git a/apps/sleepphasealarm/app.js b/apps/sleepphasealarm/app.js index 39f9b59db..5bb2c006c 100644 --- a/apps/sleepphasealarm/app.js +++ b/apps/sleepphasealarm/app.js @@ -68,7 +68,7 @@ function drawApp() { if (alarmHour < 10) alarmHour = "0" + alarmHour; if (alarmMinute < 10) alarmMinute = "0" + alarmMinute; const s = "Alarm at " + alarmHour + ":" + alarmMinute + "\n\n"; //# make distinct to time - E.showMessage(s, "Sleep Phase Alarm"); + E.showMessage(s, /*LANG*/"Sleep Phase Alarm"); function drawTime() { if (Bangle.isLCDOn()) { @@ -125,7 +125,7 @@ if (nextAlarm !== undefined) { if (swest !== undefined) { if (Bangle.isLCDOn()) { - drawString(swest ? "Sleep" : "Awake", BANGLEJS2 ? 150 : 180); //# remove x, adjust height + drawString(swest ? /*LANG*/"Sleep" : "Awake", BANGLEJS2 ? 150 : 180); //# remove x, adjust height } } diff --git a/apps/smartibot/app.js b/apps/smartibot/app.js index 88ea5e276..8760bc59c 100644 --- a/apps/smartibot/app.js +++ b/apps/smartibot/app.js @@ -35,7 +35,7 @@ function findDevices() { m[dev.id.substr(0,17)] = () => startConnectChoose(dev); }); m["Search again"] = () => findDevices(); - m["Back"] = () => load(); + m[/*LANG*/"Back"] = () => load(); E.showMenu(m); } }, {timeout : 2000, filters : [{ name : "Espruino SMARTIBOT" }] }); @@ -46,7 +46,7 @@ function startConnectChoose(device) { "": {title:"Control Method"}, "Accelerometer" : () => startConnectAccel(device), "Button" : () => startConnectBtn(device), - "Back": () => load(), + /*LANG*/"Back": () => load(), }); } @@ -57,7 +57,7 @@ function startConnectBtn(device) { function(gatt, write) { function setMotors(val) { write(`\x10w(${val})\n`); } drawBGBtn(); - g.reset().setFont("6x8",2).setFontAlign(0,0,1).drawString("BACK", 230,200); + g.reset().setFont("6x8",2).setFontAlign(0,0,1).drawString(/*LANG*/"BACK", 230,200); var state = 0; var watches = [ setWatch(e=>setMotors(state = (state&0b0011) | (e.state<<2)), BTN4, {repeat:true, edge:0}), @@ -81,7 +81,7 @@ function startConnectAccel(device) { "\x03\x10function w(x,y,z,v){var a=analogWrite;a(D4,x);a(D6,y);a(D10,z);a(D11,v);}\n", function(gatt, write) { drawBGAccel(); - g.reset().setFont("6x8",2).setFontAlign(0,0,1).drawString("BACK", 230,200); + g.reset().setFont("6x8",2).setFontAlign(0,0,1).drawString(/*LANG*/"BACK", 230,200); Bangle.on("accel", function(a) { var v = [0,0,0,0]; if (a.z<-0.5) { diff --git a/apps/smtswch/app.js b/apps/smtswch/app.js index e8491a065..bab06be79 100644 --- a/apps/smtswch/app.js +++ b/apps/smtswch/app.js @@ -35,7 +35,7 @@ function loadPage(page) { g.setFont("Vector", 15); g.drawString(page.name, g.getWidth() / 2, 200); g.setFont("Vector", 40); - g.drawString(page.state ? "On" : "Off", g.getWidth() / 2, g.getHeight() / 2); + g.drawString(page.state ? "On" : /*LANG*/"Off", g.getWidth() / 2, g.getHeight() / 2); g.drawImage(storage.read(`${icon}.img`), g.getWidth() / 2 - 24, g.getHeight() / 2 - 24 - 50); } diff --git a/apps/sonicclk/app.js b/apps/sonicclk/app.js index eddb971f8..e027ed676 100644 --- a/apps/sonicclk/app.js +++ b/apps/sonicclk/app.js @@ -268,7 +268,7 @@ const settingsMenu = { "": { title: "Settings" }, "Active Mode": { value: settings.activeMode, - format: (v) => (v ? "On" : "Off"), + format: (v) => (v ? "On" : /*LANG*/"Off"), onchange: (v) => (settings.activeMode = v), }, "Twist Thresh": { diff --git a/apps/speedalt/settings.js b/apps/speedalt/settings.js index 63d77971e..1929b7283 100644 --- a/apps/speedalt/settings.js +++ b/apps/speedalt/settings.js @@ -87,3 +87,6 @@ E.showMenu(appMenu); }); +showMenu(appMenu); + +}); diff --git a/apps/speedalt2/settings.js b/apps/speedalt2/settings.js index babb03061..96c74e3c7 100644 --- a/apps/speedalt2/settings.js +++ b/apps/speedalt2/settings.js @@ -88,3 +88,6 @@ E.showMenu(appMenu); }); +showMenu(appMenu); + +}); diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js index a97b51fab..f3ce8bff4 100644 --- a/apps/swp2clk/settings.js +++ b/apps/swp2clk/settings.js @@ -179,3 +179,5 @@ settings = readSettings(); showMainMenu(); }); +(); +}); diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js index aa3c608cf..303cdba02 100644 --- a/apps/themesetter/app.js +++ b/apps/themesetter/app.js @@ -376,7 +376,7 @@ ] }, { height:4 }, { type:'h', c:[ - Button('Back', { common:halfWidthButton, onTouch:() => gotoScreen('DetailSelectionScreen') }), + Button(/*LANG*/'Back', { common:halfWidthButton, onTouch:() => gotoScreen('DetailSelectionScreen') }), Button('Preview', { common:halfWidthButton, onTouch:() => gotoScreen('ThemePreviewScreen') }) ], filly:1 }, ] @@ -399,7 +399,7 @@ ] }, { height:4 }, { type:'h', c:[ - Button('Back', { common:legible, pad:4, onTouch:() => gotoScreen('ColorSelectionScreen') }) + Button(/*LANG*/'Back', { common:legible, pad:4, onTouch:() => gotoScreen('ColorSelectionScreen') }) ], filly:1 } ] }); diff --git a/apps/thermomF/app.js b/apps/thermomF/app.js index 2961e1efc..ac754d448 100644 --- a/apps/thermomF/app.js +++ b/apps/thermomF/app.js @@ -23,6 +23,6 @@ setInterval(function() { drawTemperature(); }, 20000); drawTemperature(); -E.showMessage("Loading..."); +E.showMessage(/*LANG*/"Loading..."); Bangle.loadWidgets(); Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/timerclk/alarm.alert.js b/apps/timerclk/alarm.alert.js index f4b61822a..133cc5118 100644 --- a/apps/timerclk/alarm.alert.js +++ b/apps/timerclk/alarm.alert.js @@ -9,8 +9,8 @@ function showAlarm(alarm) { Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.setLocked(false); - E.showPrompt("Alarm!",{ - title:"ALARM!", + E.showPrompt(/*LANG*/"Alarm!",{ + title:/*LANG*/"ALARM!", buttons : {/*LANG*/"Ok":true} }).then(function(ok) { buzzCount = 0; diff --git a/apps/timerclk/settings.js b/apps/timerclk/settings.js index 556dded98..a596ca6da 100644 --- a/apps/timerclk/settings.js +++ b/apps/timerclk/settings.js @@ -290,3 +290,5 @@ }; E.showMenu(mainMenu); }); +showMenu(mainMenu); +}); diff --git a/apps/torch/app.js b/apps/torch/app.js index 864efb883..071de5d46 100644 --- a/apps/torch/app.js +++ b/apps/torch/app.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "torch.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#FFFFFF', 'color': 'White'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#FFFFFF', /*LANG*/'color': 'White'}; } loadSettings(); diff --git a/apps/torch/settings.js b/apps/torch/settings.js index 8dd6d1854..a9ac09565 100644 --- a/apps/torch/settings.js +++ b/apps/torch/settings.js @@ -36,3 +36,5 @@ } }); }) + }); +}) diff --git a/apps/toucher/app.js b/apps/toucher/app.js index aab50fbda..19310592e 100644 --- a/apps/toucher/app.js +++ b/apps/toucher/app.js @@ -255,7 +255,7 @@ function run(){ if (process.env.HWVERSION == 1) Bangle.setLCDMode(); g.clear(); g.flip(); - E.showMessage("Loading..."); + E.showMessage(/*LANG*/"Loading..."); load(app.src); } diff --git a/apps/toucher/settings.js b/apps/toucher/settings.js index 51275d846..df3b83b0f 100644 --- a/apps/toucher/settings.js +++ b/apps/toucher/settings.js @@ -57,3 +57,6 @@ '< Back': back }); }); + back + }); +}); diff --git a/apps/vectorclock/settings.js b/apps/vectorclock/settings.js index 86cbad1e5..22339d2bf 100644 --- a/apps/vectorclock/settings.js +++ b/apps/vectorclock/settings.js @@ -53,3 +53,5 @@ "< Back" : () => back(), }); }) + }); +}) diff --git a/apps/viewstl/viewstl.min.js b/apps/viewstl/viewstl.min.js index 77469042c..82975bbf9 100644 --- a/apps/viewstl/viewstl.min.js +++ b/apps/viewstl/viewstl.min.js @@ -216,7 +216,7 @@ function loadFile(fn) { Bangle.setLCDMode("direct"); g.clear(); E.showMenu(); - E.showMessage("Loading...", fn); + E.showMessage(/*LANG*/"Loading...", fn); readSTL(fn); zDist = 5*largestExtent(points); g.clear(); diff --git a/apps/walkersclock/app.js b/apps/walkersclock/app.js index 8a5e826c4..e18879e01 100644 --- a/apps/walkersclock/app.js +++ b/apps/walkersclock/app.js @@ -203,7 +203,7 @@ function drawInfo() { break; case FN_MODE_GPS: col = 0x07FF; // cyan - str = "GPS: " + (gpsPowerState ? "ON" : "OFF"); + str = "GPS: " + (gpsPowerState ? "ON" : /*LANG*/"OFF"); drawModeLine(str,col); return; case FN_MODE_GDISP: @@ -560,7 +560,7 @@ Bangle.on('lcdPower',function(on) { prevInfoStr = "on"; // forces are redraw drawAll(); } else { - prevInfoStr = "off"; // forces are redraw + prevInfoStr = /*LANG*/"off"; // forces are redraw drawInfo(); } }); diff --git a/apps/weather/settings.js b/apps/weather/settings.js index 7e2c043b9..ea171adcd 100644 --- a/apps/weather/settings.js +++ b/apps/weather/settings.js @@ -30,3 +30,5 @@ '< Back': back, }); }) + }); +}) diff --git a/apps/welcome/settings.js b/apps/welcome/settings.js index 27a322c7f..69e6769fd 100644 --- a/apps/welcome/settings.js +++ b/apps/welcome/settings.js @@ -16,4 +16,6 @@ }, '< Back': back, }) +}) + }) }) diff --git a/apps/widbatpc/settings.js b/apps/widbatpc/settings.js index b45fc6749..b62113ad7 100644 --- a/apps/widbatpc/settings.js +++ b/apps/widbatpc/settings.js @@ -76,4 +76,8 @@ }, } E.showMenu(menu) +}) + }, + } + E.showMenu(menu) }) diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index 529923386..b69ef25de 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -28,7 +28,7 @@ function loadSettings() { settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}; const DEFAULTS = { - 'color': 'By Level', + /*LANG*/'color': 'By Level', 'percentage': true, 'charger': true, 'hideifmorethan': 100, @@ -46,7 +46,7 @@ const levelColor = (l) => { // "charging" is very bright -> percentage is hard to read, "high" is ok(ish) const green = setting('percentage') ? COLORS.high : COLORS.charging; - switch (setting('color')) { + switch (setting(/*LANG*/'color')) { case 'Monochrome': return COLORS.white; // no chance of reading the percentage here :-( case 'Green': return green; case 'By Level': // fall through @@ -64,7 +64,7 @@ } }; const chargerColor = () => { - return (setting('color') === 'Monochrome') ? COLORS.white : COLORS.charging; + return (setting(/*LANG*/'color') === 'Monochrome') ? COLORS.white : COLORS.charging; }; // sets width, returns true if it changed @@ -112,7 +112,7 @@ return; } let gfx = g; - if (setting('color') === 'Monochrome') { + if (setting(/*LANG*/'color') === 'Monochrome') { // draw text inverted on battery level gfx = Graphics.createCallback(g.getWidth(),g.getHeight(), 1, (x,y) => {g.setPixel(x,y,x<=xl?0:-1);}); diff --git a/apps/widbatwarn/settings.js b/apps/widbatwarn/settings.js index 8d15c8458..ced8ad2f5 100644 --- a/apps/widbatwarn/settings.js +++ b/apps/widbatwarn/settings.js @@ -44,4 +44,5 @@ }, }; E.showMenu(menu); +});nu); }); \ No newline at end of file diff --git a/apps/widchime/settings.js b/apps/widchime/settings.js index 54e94546b..d4290d3d5 100644 --- a/apps/widchime/settings.js +++ b/apps/widchime/settings.js @@ -20,3 +20,5 @@ } E.showMenu(menu) }) +enu) +}) diff --git a/apps/widpedom/settings.js b/apps/widpedom/settings.js index 4455ce7d7..214ca6783 100644 --- a/apps/widpedom/settings.js +++ b/apps/widpedom/settings.js @@ -62,3 +62,6 @@ '< Back': back, }) }) +'< Back': back, + }) +}) diff --git a/apps/widpedom/widget.js b/apps/widpedom/widget.js index cc7fdb579..2135bea1a 100644 --- a/apps/widpedom/widget.js +++ b/apps/widpedom/widget.js @@ -9,7 +9,7 @@ function loadSettings() { const d = require('Storage').readJSON("wpedom.json", 1) || {}; settings = Object.assign({ - 'goal': 10000, + /*LANG*/'goal': 10000, 'progress': false, 'large': false, 'hide': false From 4ce761dab9adc73393e0e841732000dcb627856d Mon Sep 17 00:00:00 2001 From: copoer Date: Wed, 9 Feb 2022 19:52:49 -0400 Subject: [PATCH 05/17] Updated script to add more accurate string finding and auto translation --- bin/language_scan.js | 73 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/bin/language_scan.js b/bin/language_scan.js index b2e98b5f3..7ad856245 100755 --- a/bin/language_scan.js +++ b/bin/language_scan.js @@ -5,6 +5,16 @@ outputs a list of strings that have been found. See https://github.com/espruino/BangleApps/issues/1311 */ +let AUTO_TRANSLATE = false; +let translate = false; +if (process.env.DEEPL) { + translate = require("translate"); + translate.engine = "deepl"; // Or "yandex", "libre", "deepl" + translate.key = process.env.DEEPL; + translate.url = "https://api-free.deepl.com/v2/translate"; + AUTO_TRANSLATE = true; +} + var IGNORE_STRINGS = [ "5x5","6x8","6x8:2","4x6","12x20","6x15","5x9Numeric7Seg", "Vector", // fonts "---","...","*","##","00","GPS","ram", @@ -12,7 +22,13 @@ var IGNORE_STRINGS = [ "sortorder","tl","tr", "function","object", // typeof=== "txt", // layout styles - "play","stop","pause", // music state + "play","stop","pause", "volumeup", "volumedown", // music state + "${hours}:${minutes}:${seconds}", "${hours}:${minutes}", + "BANGLEJS", + "NONE", + "fgH", "bgH", + "m/s", + "undefined", "kbmedia" ]; var IGNORE_FUNCTION_PARAMS = [ @@ -64,13 +80,20 @@ function isNotString(s, wasFnCall, wasArrayAccess) { if (wasArrayAccess && IGNORE_ARRAY_ACCESS.includes(wasArrayAccess)) return true; if (s=="Storage") console.log("isNotString",s,wasFnCall); - if (s.length<2) return true; // too short + if (s.length<3) return true; // too short if (s.length>40) return true; // too long if (s[0]=="#") return true; // a color - if (s.endsWith(".json") || s.endsWith(".img")) return true; // a filename + if (s.endsWith('.log') || s.endsWith('.js') || s.endsWith(".info") || s.endsWith(".csv") || s.endsWith(".json") || s.endsWith(".img") || s.endsWith(".txt")) return true; // a filename if (s.endsWith("=")) return true; // probably base64 if (s.startsWith("BTN")) return true; // button name if (IGNORE_STRINGS.includes(s)) return true; // one we know to ignore + if (!isNaN(parseFloat(s)) && isFinite(s)) return true; //is number + if (s.match(/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/)) return true; //roman number + if (!s.match(/.*[A-Z].*/i)) return true; // No letters + if (s.match(/.*[0-9].*/i)) return true; // No letters + if (s.match(/.*\(.*\).*/)) return true; // is function + if (s.match(/[A-Za-z]+[A-Z]([A-Z]|[a-z])*/)) return true; // is camel case + if (s.includes('_')) return true; return false; } @@ -115,6 +138,7 @@ apps.forEach((app,appIdx) => { if (previousString.includes("/*LANG*/")) { // translated! addString(translatedStrings, tok.value, shortFilePath); } else { // untranslated - potential to translate? + // filter out numbers if (!isNotString(tok.value, wasFnCall, wasArrayAccess)) { addString(untranslatedStrings, tok.value, shortFilePath); } @@ -137,6 +161,26 @@ untranslatedStrings.sort((a,b)=>a.uses - b.uses); translatedStrings.sort((a,b)=>a.uses - b.uses); +/* + * @description Add lang to start of string + * @param str string to add LANG to + * @param file file that string is found + * @returns void + */ +function applyLANG(str, file) { + fs.readFile(file, 'utf8', function (err,data) { + if (err) { + return console.log(err); + } + const regex = new RegExp(`(.*)((? translatedStrings.find(t=>t.str==e.str)).map(e=>`${JSON.stringify(e.str)} (${e.files.join(",")})`).join("\n")); +const wordsToAdd = untranslatedStrings.filter(e => translatedStrings.find(t=>t.str==e.str)); +// Uncomment to add LANG to all strings +//wordsToAdd.forEach(e => e.files.forEach(a => applyLANG(e.str, a))); +log(wordsToAdd.map(e=>`${JSON.stringify(e.str)} (${e.uses} uses)`).join("\n")); log(""); + //process.exit(1); log("Possible English Strings that could be translated"); log("================================================================="); @@ -158,15 +206,16 @@ log(""); //process.exit(1); let languages = JSON.parse(fs.readFileSync(`${BASEDIR}/lang/index.json`).toString()); -languages.forEach(language => { +for (let language of languages) { if (language.code == "en_GB") { console.log(`Ignoring ${language.code}`); - return; + continue; } console.log(`Scanning ${language.code}`); log(language.code); log("=========="); let translations = JSON.parse(fs.readFileSync(`${BASEDIR}/lang/${language.url}`).toString()); + let translationPromises = []; translatedStrings.forEach(translationItem => { if (!translations.GLOBAL[translationItem.str]) { console.log(`Missing GLOBAL translation for ${JSON.stringify(translationItem)}`); @@ -176,11 +225,21 @@ languages.forEach(language => { let appName = m[0].replaceAll("/", ""); if (translations[appName] && translations[appName][translationItem.str]) { console.log(` but LOCAL translation found in \"${appName}\"`); + } else if (AUTO_TRANSLATE && language.code !== "tr_TR") { // Auto Translate + translationPromises.push(new Promise(async (resolve) => { + const translation = await translate(translationItem.str, language.code.split("_")[0]); + console.log("Translating:", translationItem.str, translation); + translations.GLOBAL[translationItem.str] = translation; + resolve() + })) } } }); } }); + Promise.all(translationPromises).then(() => { + fs.writeFileSync(`${BASEDIR}/lang/${language.url}`, JSON.stringify(translations, null, 4)) + }); log(""); -}); +} console.log("Done."); From d54fdaa9e873e911db3ff1932d87316d1fb1a7de Mon Sep 17 00:00:00 2001 From: copoer Date: Wed, 9 Feb 2022 21:12:55 -0400 Subject: [PATCH 06/17] Fixed settings files --- apps/accellog/app.js | 2 -- apps/accelrec/app.js | 4 ---- apps/activepedom/settings.js | 2 -- apps/android/settings.js | 2 -- apps/antonclk/settings.js | 6 ------ apps/banglexercise/settings.js | 2 -- apps/bthrm/settings.js | 7 ------- apps/calendar/settings.js | 4 ---- apps/chronowid/app.js | 1 - apps/circlesclock/app.js | 4 ---- apps/circlesclock/settings.js | 4 ---- apps/clicompleteclk/settings.js | 4 ---- apps/coretemp/settings.js | 4 ---- apps/cscsensor/settings.js | 2 -- apps/dane_tcr/settings.js | 2 -- apps/dtlaunch/settings-b1.js | 4 ---- apps/dtlaunch/settings-b2.js | 5 ----- apps/ffcniftya/settings.js | 1 - apps/fileman/fileman.app.js | 2 -- apps/files/files.js | 1 - apps/gallifr/settings.js | 4 ---- apps/gbmusic/settings.js | 2 -- apps/gbridge/settings.js | 4 ---- apps/hardalarm/app.js | 1 - apps/health/app.js | 4 ---- apps/heart/app.js | 1 - apps/hourstrike/app.js | 1 - apps/hralarm/settings.js | 2 -- apps/largeclock/settings.js | 2 -- apps/lcars/lcars.settings.js | 4 ---- apps/limelight/limelight.settings.js | 4 ---- apps/messages/settings.js | 2 -- apps/mysticclock/mystic-clock-settings.js | 6 ------ apps/mysticdock/mystic-dock-settings.js | 6 ------ apps/mywelcome/settings.js | 2 -- apps/pastel/pastel.settings.js | 4 ---- apps/pebble/pebble.settings.js | 2 -- apps/pebbled/pebbled.settings.js | 3 --- apps/planetarium/settings.js | 1 - apps/puzzle15/puzzle15.settings.js | 2 +- apps/qalarm/app.js | 4 ---- apps/qmsched/app.js | 1 - apps/rebble/rebble.settings.js | 2 -- apps/score/score.settings.js | 2 -- apps/setting/settings.js | 5 ----- apps/speedalt/settings.js | 3 --- apps/speedalt2/settings.js | 3 --- apps/swp2clk/settings.js | 2 -- apps/timerclk/settings.js | 2 -- apps/torch/settings.js | 2 -- apps/toucher/settings.js | 3 --- apps/vectorclock/settings.js | 2 -- apps/weather/settings.js | 2 -- apps/welcome/settings.js | 2 -- apps/widbatpc/settings.js | 4 ---- apps/widbatwarn/settings.js | 1 - apps/widchime/settings.js | 2 -- apps/widpedom/settings.js | 3 --- bin/language_scan.js | 1 + 59 files changed, 2 insertions(+), 164 deletions(-) diff --git a/apps/accellog/app.js b/apps/accellog/app.js index c95ecab3d..c54c5002b 100644 --- a/apps/accellog/app.js +++ b/apps/accellog/app.js @@ -136,5 +136,3 @@ function startRecord(force) { Bangle.loadWidgets(); Bangle.drawWidgets(); showMenu(); -Menu(); -Menu(); diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index bd6688539..65f2a63ca 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -177,7 +177,3 @@ function showSaveMenu() { } showMenu(); - -} - -showMenu(); diff --git a/apps/activepedom/settings.js b/apps/activepedom/settings.js index 700637649..3b64d8735 100644 --- a/apps/activepedom/settings.js +++ b/apps/activepedom/settings.js @@ -110,5 +110,3 @@ }; E.showMenu(menu); }); -; -}); diff --git a/apps/android/settings.js b/apps/android/settings.js index 3e0e2b755..7c46a1fc0 100644 --- a/apps/android/settings.js +++ b/apps/android/settings.js @@ -28,5 +28,3 @@ }; E.showMenu(mainmenu); }) -u(mainmenu); -}) diff --git a/apps/antonclk/settings.js b/apps/antonclk/settings.js index 1a81a7f24..e452b02c7 100644 --- a/apps/antonclk/settings.js +++ b/apps/antonclk/settings.js @@ -105,9 +105,3 @@ }); // end of file -nu - E.showMenu(mainmenu); - -}); - -// end of file diff --git a/apps/banglexercise/settings.js b/apps/banglexercise/settings.js index 6b80e9035..3208c6eca 100644 --- a/apps/banglexercise/settings.js +++ b/apps/banglexercise/settings.js @@ -19,5 +19,3 @@ } }); }); -}); -}); diff --git a/apps/bthrm/settings.js b/apps/bthrm/settings.js index 117e54e3f..62d2e7ea3 100644 --- a/apps/bthrm/settings.js +++ b/apps/bthrm/settings.js @@ -243,12 +243,5 @@ } }; - E.showMenu(mainmenu); -}) - writeSettings("gracePeriodService",v); - } - } - }; - E.showMenu(mainmenu); }) diff --git a/apps/calendar/settings.js b/apps/calendar/settings.js index dfd2b6190..3c8f7d8e8 100644 --- a/apps/calendar/settings.js +++ b/apps/calendar/settings.js @@ -36,7 +36,3 @@ }); }) - }, - }); -}) - diff --git a/apps/chronowid/app.js b/apps/chronowid/app.js index 400d08eb5..ab363ed17 100644 --- a/apps/chronowid/app.js +++ b/apps/chronowid/app.js @@ -91,4 +91,3 @@ function showMenu() { } showMenu(); -enu(); diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 5c2bf9478..0eb14b425 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -828,7 +828,3 @@ Bangle.loadWidgets(); draw(); setInterval(draw, 60000); -s(); - -draw(); -setInterval(draw, 60000); diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 30754f136..e89ddf8f2 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -175,9 +175,5 @@ } - showMainMenu(); -}); - - showMainMenu(); }); diff --git a/apps/clicompleteclk/settings.js b/apps/clicompleteclk/settings.js index dfd37e902..2df20ed3e 100644 --- a/apps/clicompleteclk/settings.js +++ b/apps/clicompleteclk/settings.js @@ -52,7 +52,3 @@ '< Back': back, }); }); -, - '< Back': back, - }); -}); diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js index 11e5c1e8f..3fc2dfbf2 100644 --- a/apps/coretemp/settings.js +++ b/apps/coretemp/settings.js @@ -45,7 +45,3 @@ const menu = { E.showMenu(menu); }) -nu); -}) -nu); -}) diff --git a/apps/cscsensor/settings.js b/apps/cscsensor/settings.js index fdbffd2f5..d7a7d565d 100644 --- a/apps/cscsensor/settings.js +++ b/apps/cscsensor/settings.js @@ -43,5 +43,3 @@ } E.showMenu(menu); }) -nu); -}) diff --git a/apps/dane_tcr/settings.js b/apps/dane_tcr/settings.js index 1fd20a2c8..9d28d1b30 100644 --- a/apps/dane_tcr/settings.js +++ b/apps/dane_tcr/settings.js @@ -56,6 +56,4 @@ }, '< Back': back }); -});: back - }); }); \ No newline at end of file diff --git a/apps/dtlaunch/settings-b1.js b/apps/dtlaunch/settings-b1.js index 41e9ce0ba..f3101da16 100644 --- a/apps/dtlaunch/settings-b1.js +++ b/apps/dtlaunch/settings-b1.js @@ -31,7 +31,3 @@ } }); }) - - } - }); -}) diff --git a/apps/dtlaunch/settings-b2.js b/apps/dtlaunch/settings-b2.js index ad30eba04..7f667d213 100644 --- a/apps/dtlaunch/settings-b2.js +++ b/apps/dtlaunch/settings-b2.js @@ -40,8 +40,3 @@ } }); }) - - } - } - }); -}) diff --git a/apps/ffcniftya/settings.js b/apps/ffcniftya/settings.js index d57b6b20c..46e4ef5aa 100644 --- a/apps/ffcniftya/settings.js +++ b/apps/ffcniftya/settings.js @@ -20,5 +20,4 @@ } } }); -}) }); }) \ No newline at end of file diff --git a/apps/fileman/fileman.app.js b/apps/fileman/fileman.app.js index cd0948311..6a3c5598d 100644 --- a/apps/fileman/fileman.app.js +++ b/apps/fileman/fileman.app.js @@ -102,5 +102,3 @@ function get_pruned_file_list() { files = get_pruned_file_list(); drawMenu(); -Menu(); -Menu(); diff --git a/apps/files/files.js b/apps/files/files.js index 827be1d38..e7b42c101 100644 --- a/apps/files/files.js +++ b/apps/files/files.js @@ -225,4 +225,3 @@ function sortHelper() { } showMainMenu(); -Menu(); diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js index 8aa3f419b..feb6b0ffc 100644 --- a/apps/gallifr/settings.js +++ b/apps/gallifr/settings.js @@ -31,7 +31,3 @@ }; E.showMenu(appMenu) }) -enu) -}) -enu(appMenu) -}) diff --git a/apps/gbmusic/settings.js b/apps/gbmusic/settings.js index aa35b4157..ae013fda5 100644 --- a/apps/gbmusic/settings.js +++ b/apps/gbmusic/settings.js @@ -43,5 +43,3 @@ E.showMenu(menu); }); -u); -}); diff --git a/apps/gbridge/settings.js b/apps/gbridge/settings.js index 5b7cce40c..f9c7cde90 100644 --- a/apps/gbridge/settings.js +++ b/apps/gbridge/settings.js @@ -47,7 +47,3 @@ E.showMenu(mainmenu); }) -nu); -}) -u(mainmenu); -}) diff --git a/apps/hardalarm/app.js b/apps/hardalarm/app.js index 2159f1711..61467b421 100644 --- a/apps/hardalarm/app.js +++ b/apps/hardalarm/app.js @@ -110,4 +110,3 @@ function editAlarm(alarmIndex) { } showMainMenu(); -showMainMenu(); diff --git a/apps/health/app.js b/apps/health/app.js index 3eb72db5b..7a55eec27 100644 --- a/apps/health/app.js +++ b/apps/health/app.js @@ -255,7 +255,3 @@ function clearButton() { Bangle.loadWidgets(); Bangle.drawWidgets(); menuMain(); -Main(); -ts(); -Bangle.drawWidgets(); -menuMain(); diff --git a/apps/heart/app.js b/apps/heart/app.js index e475fd7f3..5428ea06b 100644 --- a/apps/heart/app.js +++ b/apps/heart/app.js @@ -310,4 +310,3 @@ function graphRecord(n) { showMainMenu(); // vim: et ts=2 sw=2 -=2 sw=2 diff --git a/apps/hourstrike/app.js b/apps/hourstrike/app.js index dc81d2835..9169b5def 100644 --- a/apps/hourstrike/app.js +++ b/apps/hourstrike/app.js @@ -38,4 +38,3 @@ function showMainMenu() { } showMainMenu(); -Menu(); diff --git a/apps/hralarm/settings.js b/apps/hralarm/settings.js index d6f629ac4..3158ab8b7 100644 --- a/apps/hralarm/settings.js +++ b/apps/hralarm/settings.js @@ -55,5 +55,3 @@ } }); }) - }); -}) diff --git a/apps/largeclock/settings.js b/apps/largeclock/settings.js index 729c417c8..f996666ab 100644 --- a/apps/largeclock/settings.js +++ b/apps/largeclock/settings.js @@ -84,5 +84,3 @@ E.showMenu(mainMenu); }); -u); -}); diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js index 4f2637af1..076dea4d1 100644 --- a/apps/lcars/lcars.settings.js +++ b/apps/lcars/lcars.settings.js @@ -52,7 +52,3 @@ } }); }) - - } - }); -}) diff --git a/apps/limelight/limelight.settings.js b/apps/limelight/limelight.settings.js index a732d999a..aacea2f86 100644 --- a/apps/limelight/limelight.settings.js +++ b/apps/limelight/limelight.settings.js @@ -75,8 +75,4 @@ }, } }); -}) - }, - } - }); }) diff --git a/apps/messages/settings.js b/apps/messages/settings.js index ca64c692f..c865a37fb 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -40,5 +40,3 @@ }; E.showMenu(mainmenu); }) -.showMenu(mainmenu); -}) diff --git a/apps/mysticclock/mystic-clock-settings.js b/apps/mysticclock/mystic-clock-settings.js index 09aaf741e..2fa0c49c5 100644 --- a/apps/mysticclock/mystic-clock-settings.js +++ b/apps/mysticclock/mystic-clock-settings.js @@ -39,9 +39,3 @@ E.showMenu(appMenu) }) -nu(appMenu) - -}) -nu) - -}) diff --git a/apps/mysticdock/mystic-dock-settings.js b/apps/mysticdock/mystic-dock-settings.js index 55b25c6a4..7bfda1c0f 100644 --- a/apps/mysticdock/mystic-dock-settings.js +++ b/apps/mysticdock/mystic-dock-settings.js @@ -46,9 +46,3 @@ E.showMenu(appMenu) }) -nu(appMenu) - -}) -nu) - -}) diff --git a/apps/mywelcome/settings.js b/apps/mywelcome/settings.js index b3e276328..cf7208d65 100644 --- a/apps/mywelcome/settings.js +++ b/apps/mywelcome/settings.js @@ -15,6 +15,4 @@ }, '< Back': back, }) -}) - }) }) diff --git a/apps/pastel/pastel.settings.js b/apps/pastel/pastel.settings.js index a0570b292..bf83fa7c2 100644 --- a/apps/pastel/pastel.settings.js +++ b/apps/pastel/pastel.settings.js @@ -54,7 +54,3 @@ } }) }) -, - } - }) -}) diff --git a/apps/pebble/pebble.settings.js b/apps/pebble/pebble.settings.js index a0e29320e..ff408907d 100644 --- a/apps/pebble/pebble.settings.js +++ b/apps/pebble/pebble.settings.js @@ -36,5 +36,3 @@ } }); }) - }); -}) diff --git a/apps/pebbled/pebbled.settings.js b/apps/pebbled/pebbled.settings.js index 4ca1b9612..d6c84d5d1 100644 --- a/apps/pebbled/pebbled.settings.js +++ b/apps/pebbled/pebbled.settings.js @@ -45,7 +45,4 @@ } } }); -}); - } - }); }); diff --git a/apps/planetarium/settings.js b/apps/planetarium/settings.js index d1d83d3a2..caadb4016 100644 --- a/apps/planetarium/settings.js +++ b/apps/planetarium/settings.js @@ -28,5 +28,4 @@ }}, }; E.showMenu(appMenu) - })E.showMenu(appMenu) }) \ No newline at end of file diff --git a/apps/puzzle15/puzzle15.settings.js b/apps/puzzle15/puzzle15.settings.js index 6f7496c33..352ec4315 100644 --- a/apps/puzzle15/puzzle15.settings.js +++ b/apps/puzzle15/puzzle15.settings.js @@ -47,4 +47,4 @@ }); -// end of file of file \ No newline at end of file +// end of file \ No newline at end of file diff --git a/apps/qalarm/app.js b/apps/qalarm/app.js index fffe880fc..ad071adf0 100644 --- a/apps/qalarm/app.js +++ b/apps/qalarm/app.js @@ -269,7 +269,3 @@ function showEditTimerMenu(timerIndex) { } showMainMenu(); -wMenu(menu); -} - -showMainMenu(); diff --git a/apps/qmsched/app.js b/apps/qmsched/app.js index 4cca0890b..e05eff6a2 100644 --- a/apps/qmsched/app.js +++ b/apps/qmsched/app.js @@ -267,4 +267,3 @@ function showOptionsMenu() { loadSettings(); showMainMenu(); -showMainMenu(); diff --git a/apps/rebble/rebble.settings.js b/apps/rebble/rebble.settings.js index d002d8e11..db3bab878 100644 --- a/apps/rebble/rebble.settings.js +++ b/apps/rebble/rebble.settings.js @@ -36,5 +36,3 @@ } }); }) - }); -}) diff --git a/apps/score/score.settings.js b/apps/score/score.settings.js index 50ded8a69..88e367821 100644 --- a/apps/score/score.settings.js +++ b/apps/score/score.settings.js @@ -217,5 +217,3 @@ }); })(); -; -})(); diff --git a/apps/setting/settings.js b/apps/setting/settings.js index a82985111..cd8953aaa 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -713,8 +713,3 @@ function showAppSettings(app) { } showMainMenu(); -tings'); - } -} - -showMainMenu(); diff --git a/apps/speedalt/settings.js b/apps/speedalt/settings.js index 1929b7283..63d77971e 100644 --- a/apps/speedalt/settings.js +++ b/apps/speedalt/settings.js @@ -87,6 +87,3 @@ E.showMenu(appMenu); }); -showMenu(appMenu); - -}); diff --git a/apps/speedalt2/settings.js b/apps/speedalt2/settings.js index 96c74e3c7..babb03061 100644 --- a/apps/speedalt2/settings.js +++ b/apps/speedalt2/settings.js @@ -88,6 +88,3 @@ E.showMenu(appMenu); }); -showMenu(appMenu); - -}); diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js index f3ce8bff4..a97b51fab 100644 --- a/apps/swp2clk/settings.js +++ b/apps/swp2clk/settings.js @@ -179,5 +179,3 @@ settings = readSettings(); showMainMenu(); }); -(); -}); diff --git a/apps/timerclk/settings.js b/apps/timerclk/settings.js index a596ca6da..556dded98 100644 --- a/apps/timerclk/settings.js +++ b/apps/timerclk/settings.js @@ -290,5 +290,3 @@ }; E.showMenu(mainMenu); }); -showMenu(mainMenu); -}); diff --git a/apps/torch/settings.js b/apps/torch/settings.js index a9ac09565..8dd6d1854 100644 --- a/apps/torch/settings.js +++ b/apps/torch/settings.js @@ -36,5 +36,3 @@ } }); }) - }); -}) diff --git a/apps/toucher/settings.js b/apps/toucher/settings.js index df3b83b0f..51275d846 100644 --- a/apps/toucher/settings.js +++ b/apps/toucher/settings.js @@ -57,6 +57,3 @@ '< Back': back }); }); - back - }); -}); diff --git a/apps/vectorclock/settings.js b/apps/vectorclock/settings.js index 22339d2bf..86cbad1e5 100644 --- a/apps/vectorclock/settings.js +++ b/apps/vectorclock/settings.js @@ -53,5 +53,3 @@ "< Back" : () => back(), }); }) - }); -}) diff --git a/apps/weather/settings.js b/apps/weather/settings.js index ea171adcd..7e2c043b9 100644 --- a/apps/weather/settings.js +++ b/apps/weather/settings.js @@ -30,5 +30,3 @@ '< Back': back, }); }) - }); -}) diff --git a/apps/welcome/settings.js b/apps/welcome/settings.js index 69e6769fd..27a322c7f 100644 --- a/apps/welcome/settings.js +++ b/apps/welcome/settings.js @@ -16,6 +16,4 @@ }, '< Back': back, }) -}) - }) }) diff --git a/apps/widbatpc/settings.js b/apps/widbatpc/settings.js index b62113ad7..b45fc6749 100644 --- a/apps/widbatpc/settings.js +++ b/apps/widbatpc/settings.js @@ -76,8 +76,4 @@ }, } E.showMenu(menu) -}) - }, - } - E.showMenu(menu) }) diff --git a/apps/widbatwarn/settings.js b/apps/widbatwarn/settings.js index ced8ad2f5..8d15c8458 100644 --- a/apps/widbatwarn/settings.js +++ b/apps/widbatwarn/settings.js @@ -44,5 +44,4 @@ }, }; E.showMenu(menu); -});nu); }); \ No newline at end of file diff --git a/apps/widchime/settings.js b/apps/widchime/settings.js index d4290d3d5..54e94546b 100644 --- a/apps/widchime/settings.js +++ b/apps/widchime/settings.js @@ -20,5 +20,3 @@ } E.showMenu(menu) }) -enu) -}) diff --git a/apps/widpedom/settings.js b/apps/widpedom/settings.js index 214ca6783..4455ce7d7 100644 --- a/apps/widpedom/settings.js +++ b/apps/widpedom/settings.js @@ -62,6 +62,3 @@ '< Back': back, }) }) -'< Back': back, - }) -}) diff --git a/bin/language_scan.js b/bin/language_scan.js index 7ad856245..eede250de 100755 --- a/bin/language_scan.js +++ b/bin/language_scan.js @@ -167,6 +167,7 @@ translatedStrings.sort((a,b)=>a.uses - b.uses); * @param file file that string is found * @returns void */ +//TODO fix settings bug function applyLANG(str, file) { fs.readFile(file, 'utf8', function (err,data) { if (err) { From 187821bf49edc26bff7b30226c8016ce95fc4a9c Mon Sep 17 00:00:00 2001 From: copoer Date: Thu, 10 Feb 2022 09:30:00 -0400 Subject: [PATCH 07/17] Removed auto /*LANG*/, Added more languages --- apps/BLEcontroller/app.js | 2 +- apps/a_clock_timer/app.js | 2 +- apps/about/app-bangle1.js | 2 +- apps/about/app-bangle2.js | 4 +- apps/activepedom/app.js | 4 +- apps/activepedom/widget.js | 6 +- apps/alarm/app.js | 8 +- apps/android/boot.js | 6 +- apps/antonclk/app.js | 10 +- apps/banglerun/app.js | 2 +- apps/breath/app.js | 4 +- apps/bthrm/boot.js | 2 +- apps/bthrv/app.js | 2 +- apps/circlesclock/app.js | 2 +- apps/circlesclock/settings.js | 4 +- apps/cliclockJS2Enhanced/app.js | 12 +- apps/clicompleteclk/app.js | 4 +- apps/configurable_clock/app.js | 32 +++--- apps/cscsensor/cscsensor.app.js | 2 +- apps/dane_tcr/app.js | 2 +- apps/daysl/app.js | 2 +- apps/dsdrelay/dsdrelay.app.js | 2 +- apps/ffcniftyb/app.js | 2 +- apps/gpsinfo/gps-info.js | 2 +- apps/gpsrec/app.js | 4 +- apps/gpstime/gpstime.js | 2 +- apps/hardalarm/hardalarm.js | 2 +- apps/hidmsic/hid-music.js | 2 +- apps/hidmsicswipe/hidmsicswipe.js | 6 +- apps/intervalTimer/app.js | 4 +- apps/intervals/intervals.app.js | 2 +- apps/ios/boot.js | 2 +- apps/jbm8b/app.js | 4 +- apps/lcars/lcars.app.js | 4 +- apps/lightswitch/settings.js | 4 +- apps/lightswitch/widget.js | 8 +- apps/ltherm/app.js | 2 +- apps/marioclock/marioclock-app.js | 2 +- apps/menuwheel/boot.js | 2 +- apps/messages/app.js | 4 +- apps/ncstart/start.js | 2 +- apps/numerals/numerals.settings.js | 2 +- apps/pebble/pebble.app.js | 2 +- apps/pebbled/pebbled.app.js | 2 +- apps/presentor/app.js | 2 +- apps/ptlaunch/app.js | 4 +- apps/puzzle15/puzzle15.app.js | 6 +- apps/rebble/rebble.app.js | 2 +- apps/recorder/app.js | 4 +- apps/recorder/widget.js | 4 +- apps/sensible/sensible.js | 8 +- apps/setting/settings.js | 2 +- apps/simpletimer/app.js | 2 +- apps/sleepphasealarm/app.js | 4 +- apps/smartibot/app.js | 8 +- apps/smtswch/app.js | 2 +- apps/sonicclk/app.js | 2 +- apps/themesetter/app.js | 4 +- apps/thermomF/app.js | 2 +- apps/timerclk/alarm.alert.js | 4 +- apps/torch/app.js | 2 +- apps/toucher/app.js | 2 +- apps/viewstl/viewstl.min.js | 2 +- apps/walkersclock/app.js | 4 +- apps/widbatpc/widget.js | 8 +- apps/widpedom/widget.js | 2 +- bin/language_scan.js | 19 ++-- lang/bg_BG.json | 163 ++++++++++++++++++++++++++++ lang/da_DA.json | 163 ++++++++++++++++++++++++++++ lang/el_EL.json | 163 ++++++++++++++++++++++++++++ lang/et_ET.json | 163 ++++++++++++++++++++++++++++ lang/index.json | 12 +- lang/lt_LT.json | 163 ++++++++++++++++++++++++++++ lang/lv_LV.json | 163 ++++++++++++++++++++++++++++ lang/pl_PL.json | 163 ++++++++++++++++++++++++++++ lang/ro_RO.json | 163 ++++++++++++++++++++++++++++ lang/sk_SK.json | 163 ++++++++++++++++++++++++++++ lang/sl_SL.json | 163 ++++++++++++++++++++++++++++ lang/{ => unicode-based}/ja_JA.json | 0 lang/{ => unicode-based}/zh_ZH.json | 0 80 files changed, 1781 insertions(+), 142 deletions(-) create mode 100644 lang/bg_BG.json create mode 100644 lang/da_DA.json create mode 100644 lang/el_EL.json create mode 100644 lang/et_ET.json create mode 100644 lang/lt_LT.json create mode 100644 lang/lv_LV.json create mode 100644 lang/pl_PL.json create mode 100644 lang/ro_RO.json create mode 100644 lang/sk_SK.json create mode 100644 lang/sl_SL.json rename lang/{ => unicode-based}/ja_JA.json (100%) rename lang/{ => unicode-based}/zh_ZH.json (100%) diff --git a/apps/BLEcontroller/app.js b/apps/BLEcontroller/app.js index 7f3a37ae2..c8217988c 100644 --- a/apps/BLEcontroller/app.js +++ b/apps/BLEcontroller/app.js @@ -295,7 +295,7 @@ const SocketsMenu = new State({ const startEnd = status => status ? "start" : "end"; /* translate status into english */ -const onOff= status => status ? "on" : /*LANG*/"off"; +const onOff= status => status ? "on" : "off"; /* create watching functions that will change the global diff --git a/apps/a_clock_timer/app.js b/apps/a_clock_timer/app.js index c1c31cb80..5f9a3a468 100644 --- a/apps/a_clock_timer/app.js +++ b/apps/a_clock_timer/app.js @@ -53,7 +53,7 @@ function countDown() { g.reset().clearRect(0, 76, 44+44, g.getHeight()/2+6); g.setFontAlign(0, -1, 0); - g.setFont("6x8").drawString(/*LANG*/"Timer", 44, g.getHeight()/2-20); + g.setFont("6x8").drawString("Timer", 44, g.getHeight()/2-20); g.setFont("Michroma16").drawString(timeToString(timervalue), 44, g.getHeight()/2-10); if (timervalue <= 0) { diff --git a/apps/about/app-bangle1.js b/apps/about/app-bangle1.js index 04f7ff7ee..28a292376 100644 --- a/apps/about/app-bangle1.js +++ b/apps/about/app-bangle1.js @@ -21,7 +21,7 @@ function getVersion(name,file) { } getVersion("Bootloader","boot.info"); getVersion("Launcher","launch.info"); -getVersion(/*LANG*/"Settings","setting.info"); +getVersion("Settings","setting.info"); y+=h; g.drawString(MEM.total+" JS Variables available",0,y+=h); diff --git a/apps/about/app-bangle2.js b/apps/about/app-bangle2.js index 89663a4bc..978d36193 100644 --- a/apps/about/app-bangle2.js +++ b/apps/about/app-bangle2.js @@ -23,7 +23,7 @@ function getVersion(name,file) { var versions = [ getVersion("Bootloader","boot.info"), getVersion("Launcher","launch.info"), - getVersion(/*LANG*/"Settings","setting.info") + getVersion("Settings","setting.info") ]; var logo = E.toArrayBuffer(atob("PBwBAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAD/w+AAAAQAHA4hAAAAQAMAMhAAAAQAYBmhAAAAQAYBGiAAAAQAQCD/H74+R4wGDhoKJCSEwEDgoKJCT8wFDgoKJCSAwHDhoKJCSEQHj/H6I+R4YHmAAAACAAYEGAAABCAAMEMAAAA8AAHA4AAAAAAAD/wAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/gAAAAAAAB/g")); @@ -41,7 +41,7 @@ function drawInfo() { getVersion("Bootloader","boot.info"); getVersion("Launcher","launch.info"); - getVersion(/*LANG*/"Settings","setting.info"); + getVersion("Settings","setting.info"); g.drawString(MEM.total+" JS Vars",0,y+=h); g.drawString("Storage: "+(require("Storage").getFree()>>10)+"k free",0,y+=h); diff --git a/apps/activepedom/app.js b/apps/activepedom/app.js index d241586f2..12969a0a0 100644 --- a/apps/activepedom/app.js +++ b/apps/activepedom/app.js @@ -108,7 +108,7 @@ g.setFont("6x8", 2); g.setColor(1,1,1); require("graph").drawLine(g, steps, { - //title: /*LANG*/"Steps", + //title: "Steps", axes : true, gridy : gridyValue, y : 60, //offset on screen @@ -118,7 +118,7 @@ // show steps and duration of the chart g.setFont("6x8", 2); g.setColor(0,1,0); - g.drawString(/*LANG*/"steps", 30, 24); + g.drawString("steps", 30, 24); g.drawString(stepsLastEntry, 30, 44); g.drawString((history/3600000) + " hrs", 30, 64); diff --git a/apps/activepedom/widget.js b/apps/activepedom/widget.js index 11360fd61..62c2d857a 100644 --- a/apps/activepedom/widget.js +++ b/apps/activepedom/widget.js @@ -69,7 +69,7 @@ 'stepGoal' : 10000, 'stepLength' : 75, 'lineOne' : "Distance", - 'lineTwo' : /*LANG*/"Steps", + 'lineTwo' : "Steps", }; if (!settings) { loadSettings(); } return (key in settings) ? settings[key] : DEFAULTS[key]; @@ -169,7 +169,7 @@ if (active == 1) g.setColor(0x07E0); //green else g.setColor(0xFFFF); //white g.setFont("6x8", 2); - if (setting('lineOne') == /*LANG*/'Steps') { + if (setting('lineOne') == 'Steps') { g.drawString(kFormatterSteps(stepsCounted),this.x+1,this.y); //first line, big number, steps } if (setting('lineOne') == 'Distance') { @@ -177,7 +177,7 @@ } g.setFont("6x8", 1); g.setColor(0xFFFF); //white - if (setting('lineTwo') == /*LANG*/'Steps') { + if (setting('lineTwo') == 'Steps') { g.drawString(stepsCounted,this.x+1,this.y+14); //second line, small number, steps } if (setting('lineTwo') == 'Distance') { diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 5ef6be152..17062d44a 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -39,9 +39,9 @@ function showMainMenu() { }; alarms.forEach((alarm,idx)=>{ if (alarm.timer) { - txt = /*LANG*/"TIMER "+(alarm.on?/*LANG*/"on ":/*LANG*//*LANG*/"off ")+formatMins(alarm.timer); + txt = /*LANG*/"TIMER "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatMins(alarm.timer); } else { - txt = /*LANG*/"ALARM "+(alarm.on?/*LANG*/"on ":/*LANG*//*LANG*/"off ")+formatTime(alarm.hr); + txt = /*LANG*/"ALARM "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatTime(alarm.hr); if (alarm.rp) txt += /*LANG*/" (repeat)"; } menu[txt] = function() { @@ -82,7 +82,7 @@ function editAlarm(alarmIndex) { }, /*LANG*/'Enabled': { value: en, - format: v=>v?"On":/*LANG*/"Off", + format: v=>v?"On":"Off", onchange: v=>en=v }, /*LANG*/'Repeat': { @@ -147,7 +147,7 @@ function editTimer(alarmIndex) { }, /*LANG*/'Enabled': { value: en, - format: v=>v?/*LANG*/"On":/*LANG*//*LANG*/"Off", + format: v=>v?/*LANG*/"On":/*LANG*/"Off", onchange: v=>en=v } }; diff --git a/apps/android/boot.js b/apps/android/boot.js index 5c910f5b1..eb3d26c6e 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -29,11 +29,11 @@ }, // {t:"musicstate", state:"play/pause",position,shuffle,repeat} "musicstate" : function() { - require("messages").pushMessage({t:"modify",id:"music",title:/*LANG*/"Music",state:event.state}); + require("messages").pushMessage({t:"modify",id:"music",title:"Music",state:event.state}); }, // {t:"musicinfo", artist,album,track,dur,c(track count),n(track num} "musicinfo" : function() { - require("messages").pushMessage(Object.assign(event, {t:"modify",id:"music",title:/*LANG*/"Music"})); + require("messages").pushMessage(Object.assign(event, {t:"modify",id:"music",title:"Music"})); }, // {"t":"call","cmd":"incoming/end","name":"Bob","number":"12421312"}) "call" : function() { @@ -63,7 +63,7 @@ // Music control Bangle.musicControl = cmd => { // play/pause/next/previous/volumeup/volumedown - gbSend({ t: /*LANG*/"music", n:cmd }); + gbSend({ t: "music", n:cmd }); }; // Message response Bangle.messageResponse = (msg,response) => { diff --git a/apps/antonclk/app.js b/apps/antonclk/app.js index fd6cc98c6..7b40d8eb5 100644 --- a/apps/antonclk/app.js +++ b/apps/antonclk/app.js @@ -37,7 +37,7 @@ require('Storage').writeJSON(SETTINGSFILE, { secondsColoured: true, secondsWithColon: true, dateOnMain: "Long", // "Short", "Long", "ISO8601" - dateOnSecs: "Year", // "No", /*LANG*/"Year", "Weekday", LEGACY: true/false + dateOnSecs: "Year", // "No", "Year", "Weekday", LEGACY: true/false weekDay: true, calWeek: true, upperCase: true, @@ -60,7 +60,7 @@ function loadSettings() { secondsColoured = def(settings.secondsColoured, true); secondsWithColon = def(settings.secondsWithColon, true); dateOnMain = def(settings.dateOnMain, "Long"); - dateOnSecs = def(settings.dateOnSecs, /*LANG*/"Year"); + dateOnSecs = def(settings.dateOnSecs, "Year"); weekDay = def(settings.weekDay, true); calWeek = def(settings.calWeek, false); upperCase = def(settings.upperCase, true); @@ -68,7 +68,7 @@ function loadSettings() { // Legacy if (dateOnSecs === true) - dateOnSecs = /*LANG*/"Year"; + dateOnSecs = "Year"; if (dateOnSecs === false) dateOnSecs = "No"; } @@ -153,7 +153,7 @@ function draw() { var md; var yearfirst; if (dateStr2.match(/\d\d\d\d$/)) { // formatted date ends with year - year = (dateOnSecs === /*LANG*/"Year" ? dateStr2.slice(-4) : require("locale").dow(date, 1)); + year = (dateOnSecs === "Year" ? dateStr2.slice(-4) : require("locale").dow(date, 1)); md = dateStr2.slice(0, -4); if (!md.endsWith(".")) // keep separator before the year only if it is a dot (31.12. but 31/12) md = md.slice(0, -1); @@ -161,7 +161,7 @@ function draw() { } else { // formatted date begins with year if (!dateStr2.match(/^\d\d\d\d/)) // if year position cannot be detected... dateStr2 = isoStr(date); // ...use ISO date format instead - year = (dateOnSecs === /*LANG*/"Year" ? dateStr2.slice(0, 4) : require("locale").dow(date, 1)); + year = (dateOnSecs === "Year" ? dateStr2.slice(0, 4) : require("locale").dow(date, 1)); md = dateStr2.slice(5); // never keep separator directly after year yearfirst = true; } diff --git a/apps/banglerun/app.js b/apps/banglerun/app.js index 1793decef..b79255171 100644 --- a/apps/banglerun/app.js +++ b/apps/banglerun/app.js @@ -1 +1 @@ -!function(){"use strict";var t;!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(t||(t={}));const n={STOP:63488,PAUSE:65504,RUN:2016};function e(t,n,e){g.setColor(0),g.fillRect(n-60,e,n+60,e+30),g.setColor(65535),g.drawString(t,n,e)}function i(i){var s;g.setFontVector(30),g.setFontAlign(0,-1,0),e((i.distance/1e3).toFixed(2),60,55),e(function(t){const n=Math.round(t),e=Math.floor(n/3600),i=Math.floor(n/60)%60,s=n%60;return(e?e+":":"")+("0"+i).substr(-2)+":"+("0"+s).substr(-2)}(i.duration),172,55),e(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),e=Math.floor(n/60),i=n%60;return("0"+e).substr(-2)+"'"+("0"+i).substr(-2)+'"'}(i.speed),60,115),e(i.hr.toFixed(0),172,115),e(i.steps.toFixed(0),60,175),e(i.cadence.toFixed(0),172,175),g.setFont("6x8",2),g.setColor(i.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(s=new Date).getHours()).substr(-2)+":"+("0"+s.getMinutes()).substr(-2),120,220),g.setColor(n[i.status]),g.fillRect(160,216,230,240),g.setColor(0),g.drawString(i.status,200,220),g.setFont("6x8").setFontAlign(0,0,1).setColor(-1),i.status===t.Paused?g.drawString("START",236,60,1).drawString(" CLEAR ",236,180,1):i.status===t.Running?g.drawString(" PAUSE ",236,60,1).drawString(" PAUSE ",236,180,1):g.drawString("START",236,60,1).drawString(" ",236,180,1)}function s(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),i(t),Bangle.drawWidgets()}function a(n){n.status===t.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),e=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(e,"w"),t.fileWritten=!1}(n),n.status===t.Running?n.status=t.Paused:n.status=t.Running,i(n)}const r={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,t:NaN,timeSinceLog:0,hr:60,hrError:100,file:null,fileWritten:!1,drawing:!1,status:t.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var o;o=r,Bangle.on("GPS",n=>function(n,e){n.lat=e.lat,n.lon=e.lon,n.alt=e.alt,n.vel=e.speed/3.6,n.fix=e.fix,n.dop=e.hdop,n.gpsValid=n.fix>0,function(n){const e=Date.now();let i=(e-n.t)/1e3;if(isFinite(i)||(i=0),n.t=e,n.timeSinceLog+=i,n.status===t.Running&&(n.duration+=i),!n.gpsValid)return;const s=6371008.8+n.alt,a=n.lat*Math.PI/180,r=n.lon*Math.PI/180,o=s*Math.cos(a)*Math.cos(r),g=s*Math.cos(a)*Math.sin(r),d=s*Math.sin(a);if(!n.x)return n.x=o,n.y=g,void(n.z=d);const u=o-n.x,l=g-n.y,c=d-n.z,f=Math.sqrt(u*u+l*l+c*c);n.x=o,n.y=g,n.z=d,n.status===t.Running&&(n.distance+=f,n.speed=n.distance/n.duration||0,n.cadence=60*n.steps/n.duration||0)}(n),i(n),n.gpsValid&&n.status===t.Running&&n.timeSinceLog>5&&(n.timeSinceLog=0,function(t){t.fileWritten||(t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate",/*LANG*/"steps"].join(",")+"\n"),t.fileWritten=!0),t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(n))}(o,n)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const e=n.bpm-t.hr,i=Math.abs(e)+101-n.confidence,s=t.hrError/(t.hrError+i)||0;t.hr+=e*s,t.hrError+=(i-t.hrError)*s}(t,n)),Bangle.setHRMPower(1)}(r),function(n){Bangle.on("step",()=>function(n){n.status===t.Running&&(n.steps+=1)}(n))}(r),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&s(t)}),s(t)}(r),setWatch(()=>a(r),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(n){n.status===t.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(n),n.status===t.Running?n.status=t.Paused:n.status=t.Stopped,i(n)}(r),BTN3,{repeat:!0,edge:"falling"})}(); +!function(){"use strict";var t;!function(t){t.Stopped="STOP",t.Paused="PAUSE",t.Running="RUN"}(t||(t={}));const n={STOP:63488,PAUSE:65504,RUN:2016};function e(t,n,e){g.setColor(0),g.fillRect(n-60,e,n+60,e+30),g.setColor(65535),g.drawString(t,n,e)}function i(i){var s;g.setFontVector(30),g.setFontAlign(0,-1,0),e((i.distance/1e3).toFixed(2),60,55),e(function(t){const n=Math.round(t),e=Math.floor(n/3600),i=Math.floor(n/60)%60,s=n%60;return(e?e+":":"")+("0"+i).substr(-2)+":"+("0"+s).substr(-2)}(i.duration),172,55),e(function(t){if(t<.1667)return"__'__\"";const n=Math.round(1e3/t),e=Math.floor(n/60),i=n%60;return("0"+e).substr(-2)+"'"+("0"+i).substr(-2)+'"'}(i.speed),60,115),e(i.hr.toFixed(0),172,115),e(i.steps.toFixed(0),60,175),e(i.cadence.toFixed(0),172,175),g.setFont("6x8",2),g.setColor(i.gpsValid?2016:63488),g.fillRect(0,216,80,240),g.setColor(0),g.drawString("GPS",40,220),g.setColor(65535),g.fillRect(80,216,160,240),g.setColor(0),g.drawString(("0"+(s=new Date).getHours()).substr(-2)+":"+("0"+s.getMinutes()).substr(-2),120,220),g.setColor(n[i.status]),g.fillRect(160,216,230,240),g.setColor(0),g.drawString(i.status,200,220),g.setFont("6x8").setFontAlign(0,0,1).setColor(-1),i.status===t.Paused?g.drawString("START",236,60,1).drawString(" CLEAR ",236,180,1):i.status===t.Running?g.drawString(" PAUSE ",236,60,1).drawString(" PAUSE ",236,180,1):g.drawString("START",236,60,1).drawString(" ",236,180,1)}function s(t){g.clear(),g.setColor(50712),g.setFont("6x8",2),g.setFontAlign(0,-1,0),g.drawString("DIST (KM)",60,32),g.drawString("TIME",180,32),g.drawString("PACE",60,92),g.drawString("HEART",180,92),g.drawString("STEPS",60,152),g.drawString("CADENCE",180,152),i(t),Bangle.drawWidgets()}function a(n){n.status===t.Stopped&&function(t){const n=(new Date).toISOString().replace(/[-:]/g,""),e=`banglerun_${n.substr(2,6)}_${n.substr(9,6)}`;t.file=require("Storage").open(e,"w"),t.fileWritten=!1}(n),n.status===t.Running?n.status=t.Paused:n.status=t.Running,i(n)}const r={fix:NaN,lat:NaN,lon:NaN,alt:NaN,vel:NaN,dop:NaN,gpsValid:!1,x:NaN,y:NaN,z:NaN,t:NaN,timeSinceLog:0,hr:60,hrError:100,file:null,fileWritten:!1,drawing:!1,status:t.Stopped,duration:0,distance:0,speed:0,steps:0,cadence:0};var o;o=r,Bangle.on("GPS",n=>function(n,e){n.lat=e.lat,n.lon=e.lon,n.alt=e.alt,n.vel=e.speed/3.6,n.fix=e.fix,n.dop=e.hdop,n.gpsValid=n.fix>0,function(n){const e=Date.now();let i=(e-n.t)/1e3;if(isFinite(i)||(i=0),n.t=e,n.timeSinceLog+=i,n.status===t.Running&&(n.duration+=i),!n.gpsValid)return;const s=6371008.8+n.alt,a=n.lat*Math.PI/180,r=n.lon*Math.PI/180,o=s*Math.cos(a)*Math.cos(r),g=s*Math.cos(a)*Math.sin(r),d=s*Math.sin(a);if(!n.x)return n.x=o,n.y=g,void(n.z=d);const u=o-n.x,l=g-n.y,c=d-n.z,f=Math.sqrt(u*u+l*l+c*c);n.x=o,n.y=g,n.z=d,n.status===t.Running&&(n.distance+=f,n.speed=n.distance/n.duration||0,n.cadence=60*n.steps/n.duration||0)}(n),i(n),n.gpsValid&&n.status===t.Running&&n.timeSinceLog>5&&(n.timeSinceLog=0,function(t){t.fileWritten||(t.file.write(["timestamp","latitude","longitude","altitude","duration","distance","heartrate","steps"].join(",")+"\n"),t.fileWritten=!0),t.file.write([Date.now().toFixed(0),t.lat.toFixed(6),t.lon.toFixed(6),t.alt.toFixed(2),t.duration.toFixed(0),t.distance.toFixed(2),t.hr.toFixed(0),t.steps.toFixed(0)].join(",")+"\n")}(n))}(o,n)),Bangle.setGPSPower(1),function(t){Bangle.on("HRM",n=>function(t,n){if(0===n.confidence)return;const e=n.bpm-t.hr,i=Math.abs(e)+101-n.confidence,s=t.hrError/(t.hrError+i)||0;t.hr+=e*s,t.hrError+=(i-t.hrError)*s}(t,n)),Bangle.setHRMPower(1)}(r),function(n){Bangle.on("step",()=>function(n){n.status===t.Running&&(n.steps+=1)}(n))}(r),function(t){Bangle.loadWidgets(),Bangle.on("lcdPower",n=>{t.drawing=n,n&&s(t)}),s(t)}(r),setWatch(()=>a(r),BTN1,{repeat:!0,edge:"falling"}),setWatch(()=>function(n){n.status===t.Paused&&function(t){t.duration=0,t.distance=0,t.speed=0,t.steps=0,t.cadence=0}(n),n.status===t.Running?n.status=t.Paused:n.status=t.Stopped,i(n)}(r),BTN3,{repeat:!0,edge:"falling"})}(); diff --git a/apps/breath/app.js b/apps/breath/app.js index 97e6b625f..380308739 100644 --- a/apps/breath/app.js +++ b/apps/breath/app.js @@ -191,8 +191,8 @@ function btn3Pressed() { if (settings.vibrate == "forward") settings.vibrate = "backward"; else if (settings.vibrate == "backward") - settings.vibrate = /*LANG*/"off"; - else if (settings.vibrate == /*LANG*/"off") + settings.vibrate = "off"; + else if (settings.vibrate == "off") settings.vibrate = "forward"; } else if(status == 5){ diff --git a/apps/bthrm/boot.js b/apps/bthrm/boot.js index 0d3b72735..6ac6382d6 100644 --- a/apps/bthrm/boot.js +++ b/apps/bthrm/boot.js @@ -503,7 +503,7 @@ if (settings.startWithHrm){ Bangle.setHRMPower = function(isOn, app) { - log("setHRMPower for " + app + ": " + (isOn?"on":/*LANG*/"off")); + log("setHRMPower for " + app + ": " + (isOn?"on":"off")); if (settings.enabled){ Bangle.setBTHRMPower(isOn, app); } diff --git a/apps/bthrv/app.js b/apps/bthrv/app.js index 2faa7c200..7f6ec2d35 100644 --- a/apps/bthrv/app.js +++ b/apps/bthrv/app.js @@ -58,7 +58,7 @@ function draw(y, hrv) { } g.setRotation(3); - g.setFontVector(12).drawString(/*LANG*/"Reset",g.getHeight()/2, g.getWidth()-10); + g.setFontVector(12).drawString("Reset",g.getHeight()/2, g.getWidth()-10); g.setRotation(0); } diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 0eb14b425..49af2a057 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -227,7 +227,7 @@ function isCircleEnabled(type) { function getCircleColor(type) { const pos = getCirclePosition(type); - const color = settings["circle" + (pos + 1) + /*LANG*/"color"]; + const color = settings["circle" + (pos + 1) + "color"]; if (color && color != "") return color; } diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index e89ddf8f2..348d187eb 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -44,7 +44,7 @@ }, /*LANG*/'show widgets': { value: "showWidgets" in settings ? settings.showWidgets : false, - format: () => (settings.showWidgets ? /*LANG*/'Yes' : 'No'), + format: () => (settings.showWidgets ? 'Yes' : 'No'), onchange: x => save('showWidgets', x), }, /*LANG*/'weather circle': { @@ -167,7 +167,7 @@ }, /*LANG*/'colorize icon': { value: colorizeIconKey in settings ? settings[colorizeIconKey] : false, - format: () => (settings[colorizeIconKey] ? /*LANG*/'Yes' : 'No'), + format: () => (settings[colorizeIconKey] ? 'Yes' : 'No'), onchange: x => save(colorizeIconKey, x), }, }; diff --git a/apps/cliclockJS2Enhanced/app.js b/apps/cliclockJS2Enhanced/app.js index e20944531..b6172b497 100644 --- a/apps/cliclockJS2Enhanced/app.js +++ b/apps/cliclockJS2Enhanced/app.js @@ -16,7 +16,7 @@ var lasty = 0; var lastx = 0; if (settings.HID=="kbmedia") { - profile = /*LANG*/'Music'; + profile = 'Music'; sendHid = function (code, cb) { try { NRF.sendHIDReport([1,code], () => { @@ -57,29 +57,29 @@ if (next) { if(lasty > 40){ writeLine('Down', 3); // setTimeout(drawApp, 1000); - // Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"volumedown"})); + // Bluetooth.println(JSON.stringify({t:"music", n:"volumedown"})); down(() => {}); } else if(lasty < -40){ writeLine('Up', 3); // setTimeout(drawApp, 1000); - //Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"volumeup"})); + //Bluetooth.println(JSON.stringify({t:"music", n:"volumeup"})); up(() => {}); } else if(lastx < -40){ writeLine('Prev', 3); // setTimeout(drawApp, 1000); - // Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"previous"})); + // Bluetooth.println(JSON.stringify({t:"music", n:"previous"})); prev(() => {}); } else if(lastx > 40){ writeLine('Next', 3); // setTimeout(drawApp, 1000); - // Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"next"})); + // Bluetooth.println(JSON.stringify({t:"music", n:"next"})); next(() => {}); } else if(lastx==0 && lasty==0){ writeLine('play/pause', 3); //setTimeout(drawApp, 1000); - // Bluetooth.println(JSON.stringify({t:/*LANG*/"music", n:"play"})); + // Bluetooth.println(JSON.stringify({t:"music", n:"play"})); toggle(() => {}); } diff --git a/apps/clicompleteclk/app.js b/apps/clicompleteclk/app.js index 8a4d00798..a39b37e58 100644 --- a/apps/clicompleteclk/app.js +++ b/apps/clicompleteclk/app.js @@ -35,7 +35,7 @@ function setting(key) { 'battery': true, 'batteryLvl': 30, 'weather': true, - /*LANG*/'steps': true, + 'steps': true, 'heartrate': true }; return (key in settings) ? settings[key] : DEFAULTS[key]; @@ -45,7 +45,7 @@ function setting(key) { let showBattery = setting('battery'); let batteryWarnLevel = setting('batteryLvl'); let showWeather = setting('weather'); -let showSteps = setting(/*LANG*/'steps'); +let showSteps = setting('steps'); let showHeartRate = setting('heartrate'); diff --git a/apps/configurable_clock/app.js b/apps/configurable_clock/app.js index afde21e1a..157d57741 100644 --- a/apps/configurable_clock/app.js +++ b/apps/configurable_clock/app.js @@ -710,7 +710,7 @@ { Face:'1-12', colored:true, Hands:'rounded', withSeconds:true, - Foreground:'Theme', Background:/*LANG*/'Theme', Seconds:'#FF0000' + Foreground:'Theme', Background:'Theme', Seconds:'#FF0000' }, require('Storage').readJSON('configurable_clock.json', true) || {} ); @@ -855,8 +855,8 @@ activeLayout = null; g.setTheme({ - fg:(Settings.Foreground === /*LANG*/'Theme' ? Theme.fg : Settings.Foreground || '#000000'), - bg:(Settings.Background === /*LANG*/'Theme' ? Theme.bg : Settings.Background || '#FFFFFF') + fg:(Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'), + bg:(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF') }); g.clear(true); // also installs the current theme @@ -872,8 +872,8 @@ /**** renderClock ****/ function renderClock () { - g.setColor (Settings.Foreground === /*LANG*/'Theme' ? Theme.fg : Settings.Foreground || '#000000'); - g.setBgColor(Settings.Background === /*LANG*/'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); + g.setColor (Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'); + g.setBgColor(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); switch (Settings.Face) { case 'none': @@ -951,7 +951,7 @@ let HoursAngle = (Hours+(Minutes/60))/12 * twoPi - Pi; let MinutesAngle = (Minutes/60) * twoPi - Pi; - g.setColor(Settings.Foreground === /*LANG*/'Theme' ? Theme.fg : Settings.Foreground || '#000000'); + g.setColor(Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'); switch (Settings.Hands) { case 'simple': @@ -968,10 +968,10 @@ transformPolygon(roundedMinuteHandPolygon, CenterX,CenterY, MinutesAngle); g.fillPoly(transformedPolygon); -// g.setColor(Settings.Foreground === /*LANG*/'Theme' ? Theme.fg || '#000000'); +// g.setColor(Settings.Foreground === 'Theme' ? Theme.fg || '#000000'); g.fillCircle(CenterX,CenterY, outerBoltRadius); - g.setColor(Settings.Background === /*LANG*/'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); + g.setColor(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); g.drawCircle(CenterX,CenterY, outerBoltRadius); g.fillCircle(CenterX,CenterY, innerBoltRadius); break; @@ -986,7 +986,7 @@ } if (Settings.withSeconds) { - g.setColor(Settings.Seconds === /*LANG*/'Theme' ? Theme.fgH : Settings.Seconds || '#FF0000'); + g.setColor(Settings.Seconds === 'Theme' ? Theme.fgH : Settings.Seconds || '#FF0000'); let Seconds = now.getSeconds(); let SecondsAngle = (Seconds/60) * twoPi - Pi; @@ -1089,9 +1089,9 @@ let Seconds = (Changes.Seconds == null ? Settings.Seconds : Changes.Seconds); activeLayout = ColorsScreen; - activeLayout['Foreground'].bgCol = (Foreground === /*LANG*/'Theme' ? Theme.fg : Foreground); - activeLayout['Background'].bgCol = (Background === /*LANG*/'Theme' ? Theme.bg : Background); - activeLayout['Seconds'].bgCol = (Seconds === /*LANG*/'Theme' ? Theme.fgH : Seconds); + activeLayout['Foreground'].bgCol = (Foreground === 'Theme' ? Theme.fg : Foreground); + activeLayout['Background'].bgCol = (Background === 'Theme' ? Theme.bg : Background); + activeLayout['Seconds'].bgCol = (Seconds === 'Theme' ? Theme.fgH : Seconds); activeLayout.render(); } @@ -1123,12 +1123,12 @@ activeLayout['#FF00FF'].selected = (chosenColor === '#FF00FF'); activeLayout['#00FFFF'].selected = (chosenColor === '#00FFFF'); activeLayout['#FFFFFF'].selected = (chosenColor === '#FFFFFF'); - activeLayout['Theme'].selected = (chosenColor === /*LANG*/'Theme'); + activeLayout['Theme'].selected = (chosenColor === 'Theme'); activeLayout.render(); } function chooseColor (Control) { Bangle.buzz(); chosenColor = Control.id; refreshColorChoiceScreen(); } - function chooseThemeColor () { Bangle.buzz(); chosenColor = /*LANG*/'Theme'; refreshColorChoiceScreen(); } + function chooseThemeColor () { Bangle.buzz(); chosenColor = 'Theme'; refreshColorChoiceScreen(); } function applyColor () { Changes[ColorToChange] = chosenColor; @@ -1347,9 +1347,9 @@ Drawable(drawColorChoice, { id:'#00FFFF', common:ColorChoice, col:'#00FFFF' }), ], filly:1 }, { type:'h', c:[ - Label('use Theme:', { id:/*LANG*/'Theme', common:leftAligned, pad:4 }), + Label('use Theme:', { id:'Theme', common:leftAligned, pad:4 }), { width:10 }, - Drawable(drawColorChoice, { id:/*LANG*/'Theme', common:ColorChoice, col:Theme.fg }), + Drawable(drawColorChoice, { id:'Theme', common:ColorChoice, col:Theme.fg }), ], filly:1, onTouch:chooseThemeColor }, { height:4 }, { type:'h', c:[ diff --git a/apps/cscsensor/cscsensor.app.js b/apps/cscsensor/cscsensor.app.js index 03fc77aca..e2af0db16 100644 --- a/apps/cscsensor/cscsensor.app.js +++ b/apps/cscsensor/cscsensor.app.js @@ -225,7 +225,7 @@ function connection_setup() { return device.gatt.connect(); }).then(function(ga) { gatt = ga; - E.showMessage(/*LANG*/"Connected"); + E.showMessage("Connected"); return gatt.getPrimaryService("1816"); }).then(function(s) { service = s; diff --git a/apps/dane_tcr/app.js b/apps/dane_tcr/app.js index ce75c55cb..aa25379d3 100644 --- a/apps/dane_tcr/app.js +++ b/apps/dane_tcr/app.js @@ -244,7 +244,7 @@ function run(){ Bangle.setLCDMode(); g.clear(); g.flip(); - E.showMessage(/*LANG*/"Loading..."); + E.showMessage("Loading..."); load(app.src); } diff --git a/apps/daysl/app.js b/apps/daysl/app.js index 0bb11a77b..50695328e 100644 --- a/apps/daysl/app.js +++ b/apps/daysl/app.js @@ -46,7 +46,7 @@ function showMenu() { updateSettings(); } }, - /*LANG*/'Year': { + 'Year': { value: settings.year, step: 1, onchange: v => { diff --git a/apps/dsdrelay/dsdrelay.app.js b/apps/dsdrelay/dsdrelay.app.js index 4a34a47fc..18e7293aa 100644 --- a/apps/dsdrelay/dsdrelay.app.js +++ b/apps/dsdrelay/dsdrelay.app.js @@ -59,7 +59,7 @@ function parseDevice(d) { g.clearRect(0, 60, 239, 239).setFontAlign(0, 0, 0).setColor(0, 1, 0).drawString("Found device", 120, 120).flip(); device.gatt.connect().then(function(ga) { gatt = ga; - g.clearRect(0, 60, 239, 239).setFontAlign(0, 0, 0).setColor(0, 1, 0).drawString(/*LANG*/"Connected", 120, 120).flip(); + g.clearRect(0, 60, 239, 239).setFontAlign(0, 0, 0).setColor(0, 1, 0).drawString("Connected", 120, 120).flip(); return gatt.getPrimaryService("FFE0"); }).then(function(s) { service = s; diff --git a/apps/ffcniftyb/app.js b/apps/ffcniftyb/app.js index 9456d3421..75d217ab4 100644 --- a/apps/ffcniftyb/app.js +++ b/apps/ffcniftyb/app.js @@ -2,7 +2,7 @@ const locale = require("locale"); const storage = require('Storage'); const is12Hour = (storage.readJSON("setting.json", 1) || {})["12hour"]; -const color = (storage.readJSON("ffcniftyb.json", 1) || {})[/*LANG*/"color"] || 63488 /* red */; +const color = (storage.readJSON("ffcniftyb.json", 1) || {})["color"] || 63488 /* red */; /* Clock *********************************************/ diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index a6e21af0d..0eca2ccf5 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -5,7 +5,7 @@ function satelliteImage() { var Layout = require("Layout"); var layout; //Bangle.setGPSPower(1, "app"); -E.showMessage(/*LANG*/"Loading..."); // avoid showing rubbish on screen +E.showMessage("Loading..."); // avoid showing rubbish on screen var lastFix = { fix: -1, diff --git a/apps/gpsrec/app.js b/apps/gpsrec/app.js index 712567be5..833a816ea 100644 --- a/apps/gpsrec/app.js +++ b/apps/gpsrec/app.js @@ -251,7 +251,7 @@ function plotTrack(info) { g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString(/*LANG*/"Back",g.getWidth() - 10, g.getHeight()/2); + g.drawString("Back",g.getWidth() - 10, g.getHeight()/2); setWatch(function() { viewTrack(info.fn, info); }, global.BTN3||BTN1); @@ -335,7 +335,7 @@ function plotGraph(info, style) { }); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString(/*LANG*/"Back",g.getWidth() - 10, g.getHeight() - 40); + g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40); setWatch(function() { viewTrack(info.fn, info); }, global.BTN3||BTN1); diff --git a/apps/gpstime/gpstime.js b/apps/gpstime/gpstime.js index d22783e3a..8c80953fa 100644 --- a/apps/gpstime/gpstime.js +++ b/apps/gpstime/gpstime.js @@ -40,7 +40,7 @@ var layout = new Layout( { {type:"txt", fillx:1, filly:1, font:"6x8:2", label:"---", id:"gpstime" } ]},{lazy:true, btns: [ { label : "Set", cb : setGPSTime}, - { label : /*LANG*/"Back", cb : ()=>load() } + { label : "Back", cb : ()=>load() } ]}); diff --git a/apps/hardalarm/hardalarm.js b/apps/hardalarm/hardalarm.js index b9ce731d4..e33bd39cc 100644 --- a/apps/hardalarm/hardalarm.js +++ b/apps/hardalarm/hardalarm.js @@ -40,7 +40,7 @@ function showNumberPicker(currentGuess, randomNum) { function showPrompt(msg, buzzCount, alarm) { E.showPrompt(msg,{ title:"STAY AWAKE!", - buttons : {/*LANG*/"Sleep":0,"Stop":1} // default is sleep so it'll come back in 10 mins + buttons : {"Sleep":0,"Stop":1} // default is sleep so it'll come back in 10 mins }).then(function(choice) { buzzCount = 0; if (choice==0) { diff --git a/apps/hidmsic/hid-music.js b/apps/hidmsic/hid-music.js index 60aa2cf08..db81744f3 100644 --- a/apps/hidmsic/hid-music.js +++ b/apps/hidmsic/hid-music.js @@ -5,7 +5,7 @@ const settings = storage.readJSON('setting.json',1) || { HID: false }; var sendHid, next, prev, toggle, up, down, profile; if (settings.HID=="kbmedia") { - profile = /*LANG*/'Music'; + profile = 'Music'; sendHid = function (code, cb) { try { NRF.sendHIDReport([1,code], () => { diff --git a/apps/hidmsicswipe/hidmsicswipe.js b/apps/hidmsicswipe/hidmsicswipe.js index 7da81900b..e0fc760a4 100644 --- a/apps/hidmsicswipe/hidmsicswipe.js +++ b/apps/hidmsicswipe/hidmsicswipe.js @@ -7,7 +7,7 @@ var lasty = 0; var lastx = 0; if (settings.HID=="kbmedia") { - profile = /*LANG*/'Music'; + profile = 'Music'; sendHid = function (code, cb) { try { NRF.sendHIDReport([1,code], () => { @@ -36,8 +36,8 @@ if (settings.HID=="kbmedia") { function drawApp() { g.clear(); - if(Bangle.isLocked()==false) E.showMessage('Swipe', /*LANG*/'Music'); - else E.showMessage('Locked', /*LANG*/'Music'); + if(Bangle.isLocked()==false) E.showMessage('Swipe', 'Music'); + else E.showMessage('Locked', 'Music'); } if (next) { diff --git a/apps/intervalTimer/app.js b/apps/intervalTimer/app.js index 906a8f8e0..fd57dbe2b 100644 --- a/apps/intervalTimer/app.js +++ b/apps/intervalTimer/app.js @@ -172,7 +172,7 @@ function setNumSets(){ type:"v", c: [ {type:"txt", font:"6x8:2", label:"Number Sets", id:"title" }, {type:"txt", font:"30%", pad: 20, label: numSets, id:"value" }, - {type:"btn", font:"6x8:2", label:/*LANG*/"Back", cb: l => { + {type:"btn", font:"6x8:2", label:"Back", cb: l => { setRestTime(); } } @@ -217,7 +217,7 @@ function setRestTime(){ type:"v", c: [ {type:"txt", font:"6x8:2", label:"Rest Time", id:"title" }, {type:"txt", font:"30%", pad: 20, label: restTime, id:"value" }, - {type:"btn", font:"6x8:2", label:/*LANG*/"Back", cb: l => { + {type:"btn", font:"6x8:2", label:"Back", cb: l => { setActiveTime(); } } diff --git a/apps/intervals/intervals.app.js b/apps/intervals/intervals.app.js index c0f368687..da436b104 100644 --- a/apps/intervals/intervals.app.js +++ b/apps/intervals/intervals.app.js @@ -152,7 +152,7 @@ function showMenu() "Work seconds" : { value : settings.workseg,min:0,max:59,step:5,onchange : v => { settings.workseg=v; } }, "Rest minutes" : { value : settings.restmin,min:0,max:59,step:1,onchange : v => { settings.restmin=v; } }, "Rest seconds" : { value : settings.restseg,min:0,max:59,step:5,onchange : v => { settings.restseg=v; } }, - "Signal type" : { value : settings.buzz,format : v => v?"Buzz":/*LANG*/"Beep",onchange : v => { settings.buzz=v; }} + "Signal type" : { value : settings.buzz,format : v => v?"Buzz":"Beep",onchange : v => { settings.buzz=v; }} }; E.showMenu(mainmenu); diff --git a/apps/ios/boot.js b/apps/ios/boot.js index f95bd6839..50286c4a6 100644 --- a/apps/ios/boot.js +++ b/apps/ios/boot.js @@ -132,7 +132,7 @@ E.on('notify',msg=>{ // Apple media service E.on('AMS',a=>{ function push(m) { - var msg = { t : "modify", id : "music", title:/*LANG*/"Music" }; + var msg = { t : "modify", id : "music", title:"Music" }; if (a.id=="artist") msg.artist = m; else if (a.id=="album") msg.album = m; else if (a.id=="title") msg.track = m; diff --git a/apps/jbm8b/app.js b/apps/jbm8b/app.js index bb77b1303..53baa32e3 100644 --- a/apps/jbm8b/app.js +++ b/apps/jbm8b/app.js @@ -2,12 +2,12 @@ const affirmative = [ 'It is\ncertain.', 'It is\ndicededly\nso.', 'Without\na doubt.', - /*LANG*/'Yes\ndefinitely.', + 'Yes\ndefinitely.', 'You may\nrely\non it.', 'As I see,\nit yes.', 'Most\nlikely.', 'Outlook\ngood.', - /*LANG*/'Yes.', + 'Yes.', 'Signs point\nto yes.' ]; const nonCommittal = [ diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f430c1c43..c020c49e8 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -3,7 +3,7 @@ const locale = require('locale'); const storage = require('Storage') let settings = { alarm: -1, - dataRow1: /*LANG*/"Steps", + dataRow1: "Steps", dataRow2: "Temp", dataRow3: "Battery" }; @@ -151,7 +151,7 @@ function _drawData(key, y, c){ var value = "ERR"; var should_print= true; - if(key == /*LANG*/"STEPS"){ + if(key == "STEPS"){ text = "STEP"; value = getSteps(); diff --git a/apps/lightswitch/settings.js b/apps/lightswitch/settings.js index 13fe5dc39..aac159148 100644 --- a/apps/lightswitch/settings.js +++ b/apps/lightswitch/settings.js @@ -107,8 +107,8 @@ step: 1 }, unlockSide: { - title: ["off", "left", "right", "top", "bottom", "front", /*LANG*/"back"], - value: ["", "left", "right", "top", "bottom", "front", /*LANG*/"back"] + title: ["off", "left", "right", "top", "bottom", "front", "back"], + value: ["", "left", "right", "top", "bottom", "front", "back"] }, tapOn: { title: ["on locked", "on unlocked", "always on"], diff --git a/apps/lightswitch/widget.js b/apps/lightswitch/widget.js index c394df2e8..119a114fe 100644 --- a/apps/lightswitch/widget.js +++ b/apps/lightswitch/widget.js @@ -21,7 +21,7 @@ area: "tr", sortorder: 10, width: 23, - dragStatus: /*LANG*/"off", + dragStatus: "off", // internal function // // write settings to storage @@ -165,7 +165,7 @@ // on touch release remove drag listener and reset drag status to indicate stopped drag action if (!event.b) { Bangle.removeListener("drag", w.dragListener); - w.dragStatus = /*LANG*/"off"; + w.dragStatus = "off"; } // clear variables @@ -181,7 +181,7 @@ var w = WIDGETS.lightswitch; // skip all if drag action ongoing - if (w.dragStatus === /*LANG*/"off") { + if (w.dragStatus === "off") { // check if inside widget area if (!(!w || cursor.x < w.x || cursor.x > w.x + w.width || @@ -199,7 +199,7 @@ // clear drag timeout if (typeof w.dragStatus === "number") clearTimeout(w.dragStatus); // reset drag status to indicate stopped drag action - w.dragStatus = /*LANG*/"off"; + w.dragStatus = "off"; }, w.dragDelay, w); } // switch backlight diff --git a/apps/ltherm/app.js b/apps/ltherm/app.js index 2cbf26e5f..7accae2ed 100644 --- a/apps/ltherm/app.js +++ b/apps/ltherm/app.js @@ -20,6 +20,6 @@ const avg = []; setInterval(function() { drawTemperature(); }, 2000); -E.showMessage(/*LANG*/"Loading..."); +E.showMessage("Loading..."); Bangle.loadWidgets(); Bangle.drawWidgets(); diff --git a/apps/marioclock/marioclock-app.js b/apps/marioclock/marioclock-app.js index 20dc0814f..6289a2568 100644 --- a/apps/marioclock/marioclock-app.js +++ b/apps/marioclock/marioclock-app.js @@ -73,7 +73,7 @@ let lastTemp = 0; const phone = { get status() { - return NRF.getSecurityStatus().connected ? /*LANG*/"Yes" : "No"; + return NRF.getSecurityStatus().connected ? "Yes" : "No"; }, message: null, messageTimeout: null, diff --git a/apps/menuwheel/boot.js b/apps/menuwheel/boot.js index f5bfff498..deb15264d 100644 --- a/apps/menuwheel/boot.js +++ b/apps/menuwheel/boot.js @@ -14,7 +14,7 @@ E.showMenu = function(items) { // show "< Back" item (or similar) as button instead (i.e. remove from the menu) var back,backLbl; - for (var b of [/*LANG*/'Back', 'Exit', 'Cancel']) { + for (var b of ['Back', 'Exit', 'Cancel']) { if (!items[b] && items['< '+b]) b = '< '+b; back = items[b]; if (typeof back === "function") { diff --git a/apps/messages/app.js b/apps/messages/app.js index 05a02191c..ec147daf8 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -98,7 +98,7 @@ function getMessageImage(msg) { if (s=="whatsapp") return atob("GBiBAAB+AAP/wAf/4A//8B//+D///H9//n5//nw//vw///x///5///4///8e//+EP3/APn/wPn/+/j///H//+H//8H//4H//wMB+AA=="); if (s=="wordfeud") return atob("GBgCWqqqqqqlf//////9v//////+v/////++v/////++v8///Lu+v8///L++v8///P/+v8v//P/+v9v//P/+v+fx/P/+v+Pk+P/+v/PN+f/+v/POuv/+v/Ofdv/+v/NvM//+v/I/Y//+v/k/k//+v/i/w//+v/7/6//+v//////+v//////+f//////9Wqqqqqql"); if (msg.id=="music") return atob("FhaBAH//+/////////////h/+AH/4Af/gB/+H3/7/f/v9/+/3/7+f/vB/w8H+Dwf4PD/x/////////////3//+A="); - if (msg.id==/*LANG*/"back") return getBackImage(); + if (msg.id=="back") return getBackImage(); return getNotificationImage(); } function getMessageImageCol(msg,def) { @@ -375,7 +375,7 @@ function checkMessages(options) { if (msg && msg.new) g.setBgColor(colBg); else g.setBgColor((idx&1) ? colSBg1 : colSBg2); g.clearRect(r.x,r.y,r.x+r.w-1,r.y+r.h-1).setColor(g.theme.fg); - if (idx==0) msg = {id:/*LANG*/"back", title:"< Back"}; + if (idx==0) msg = {id:"back", title:"< Back"}; if (!msg) return; var x = r.x+2, title = msg.title, body = msg.body; var img = getMessageImage(msg); diff --git a/apps/ncstart/start.js b/apps/ncstart/start.js index b34066376..d2d713cb2 100644 --- a/apps/ncstart/start.js +++ b/apps/ncstart/start.js @@ -29,7 +29,7 @@ function welcome() { setWatch(() => { clearInterval(i); clearWatch(); - E.showMessage(/*LANG*/'Loading...'); + E.showMessage('Loading...'); res(); }, BTN2, {repeat:false}); }); diff --git a/apps/numerals/numerals.settings.js b/apps/numerals/numerals.settings.js index ad56e7d04..ae321322a 100644 --- a/apps/numerals/numerals.settings.js +++ b/apps/numerals/numerals.settings.js @@ -32,7 +32,7 @@ "Date on touch": { value: 0|numeralsSettings.showDate, min:0,max:1, - format: v=>v?"On":/*LANG*/"Off", + format: v=>v?"On":"Off", onchange: v=> { numeralsSettings.showDate=v; updateSettings();} }, "< back": back diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 35f700762..106e09b82 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -12,7 +12,7 @@ const SETTINGS_FILE = "pebble.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', /*LANG*/'color': 'Green'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green'}; } var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); diff --git a/apps/pebbled/pebbled.app.js b/apps/pebbled/pebbled.app.js index 378a3878d..bbe98823f 100644 --- a/apps/pebbled/pebbled.app.js +++ b/apps/pebbled/pebbled.app.js @@ -12,7 +12,7 @@ const SETTINGS_FILE = "pebbleDistance.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', /*LANG*/'color': 'Green', 'avStep': 0.75}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}; } var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); diff --git a/apps/presentor/app.js b/apps/presentor/app.js index d553e4d8a..6b7450a0c 100644 --- a/apps/presentor/app.js +++ b/apps/presentor/app.js @@ -106,7 +106,7 @@ let mainLayout = new Layout({ type: 'txt', font: '15%', label: '00:00', - id: /*LANG*/'Timer', + id: 'Timer', halign: 1, pad: 3 } diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 18d355dbf..5db3a335b 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -58,7 +58,7 @@ var showMainMenu = () => { showScrollerContainingAppsWithPatterns().then((selected) => { var pattern = selected.pattern; var appName = selected.appName; - if (pattern === /*LANG*/"back") { + if (pattern === "back") { showMainMenu(); } else { E.showPrompt(appName + "\n\npattern:\n" + pattern, { @@ -309,7 +309,7 @@ var showScrollerContainingAppsWithPatterns = () => { }, select: (i) => { log("selected: " + i); - var pattern = /*LANG*/"back"; + var pattern = "back"; var appName = ""; if (i > 0) { var storedPattern = storedPatternsArray[i - 1]; diff --git a/apps/puzzle15/puzzle15.app.js b/apps/puzzle15/puzzle15.app.js index a19494a68..eec21933c 100644 --- a/apps/puzzle15/puzzle15.app.js +++ b/apps/puzzle15/puzzle15.app.js @@ -63,7 +63,7 @@ var startWith; /* For development purposes require('Storage').writeJSON(SETTINGSFILE, { - splashMode: /*LANG*/"off", + splashMode: "off", startWith: "5x5", }); /* */ @@ -622,9 +622,9 @@ function framedText(text, x, y, textcol, framecol) { } // Show the splash screen at program start, call afterSplash afterwards. -// If spash mode is /*LANG*/"off", call afterSplash directly. +// If spash mode is "off", call afterSplash directly. function showSplash(afterSplash) { - if (splashMode === /*LANG*/"off") + if (splashMode === "off") afterSplash(); else { g.reset(); diff --git a/apps/rebble/rebble.app.js b/apps/rebble/rebble.app.js index de6facdc6..d186ea8ec 100644 --- a/apps/rebble/rebble.app.js +++ b/apps/rebble/rebble.app.js @@ -33,7 +33,7 @@ function loadLocation() { } function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', /*LANG*/'color': 'Green'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green'}; } function extractTime(d){ diff --git a/apps/recorder/app.js b/apps/recorder/app.js index 320f4d83d..7075563aa 100644 --- a/apps/recorder/app.js +++ b/apps/recorder/app.js @@ -305,7 +305,7 @@ function viewTrack(filename, info) { g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString(/*LANG*/"Back",g.getWidth() - 10, g.getHeight() - 40); + g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40); setWatch(function() { viewTrack(info.fn, info); }, global.BTN3||BTN1); @@ -404,7 +404,7 @@ function viewTrack(filename, info) { }); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString(/*LANG*/"Back",g.getWidth() - 10, g.getHeight() - 40); + g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40); setWatch(function() { viewTrack(info.filename, info); }, global.BTN3||BTN1); diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index 97b4e7208..e10c99c0c 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -99,8 +99,8 @@ steps:function() { var lastSteps = 0; return { - name : /*LANG*/"Steps", - fields : [/*LANG*/"Steps"], + name : "Steps", + fields : ["Steps"], getValues : () => { var c = Bangle.getStepCount(), r=[c-lastSteps]; lastSteps = c; diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 63b5bc9e2..8ec7d93d4 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -50,7 +50,7 @@ let barMenu = { "": { "title" : "- Barometer -" }, "State": { value: settings.isBarEnabled, - format: v => v ? "On" : /*LANG*/"Off", + format: v => v ? "On" : "Off", onchange: v => { updateSetting('isBarEnabled', v); } }, "Altitude": { value: null }, @@ -62,7 +62,7 @@ let gpsMenu = { "": { "title" : "- GPS -" }, "State": { value: settings.isGpsEnabled, - format: v => v ? "On" : /*LANG*/"Off", + format: v => v ? "On" : "Off", onchange: v => { updateSetting('isGpsEnabled', v); } }, "Lat": { value: null }, @@ -76,7 +76,7 @@ let hrmMenu = { "": { "title" : "- Heart Rate -" }, "State": { value: settings.isHrmEnabled, - format: v => v ? "On" : /*LANG*/"Off", + format: v => v ? "On" : "Off", onchange: v => { updateSetting('isHrmEnabled', v); } }, "BPM": { value: null }, @@ -87,7 +87,7 @@ let magMenu = { "": { "title" : "- Magnetometer -" }, "State": { value: settings.isMagEnabled, - format: v => v ? "On" : /*LANG*/"Off", + format: v => v ? "On" : "Off", onchange: v => { updateSetting('isMagEnabled', v); } }, "x": { value: null }, diff --git a/apps/setting/settings.js b/apps/setting/settings.js index cd8953aaa..65e076753 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -704,7 +704,7 @@ function showAppSettings(app) { return showError(/*LANG*/'Invalid settings'); } try { - // pass showAppSettingsMenu as /*LANG*/"back" argument + // pass showAppSettingsMenu as "back" argument appSettings(()=>showAppSettingsMenu()); } catch (e) { console.log(`${app.name} settings error:`, e) diff --git a/apps/simpletimer/app.js b/apps/simpletimer/app.js index 272c00f0a..e99761810 100644 --- a/apps/simpletimer/app.js +++ b/apps/simpletimer/app.js @@ -116,7 +116,7 @@ function drawLabels() { g.setFont("6x8", 1); g.drawString("Reset (re)start", 230, 120); if (state != "started") // only when not runnung - g.drawString(/*LANG*/"Back", 230, 120); + g.drawString("Back", 230, 120); } function resetTimer(value) { diff --git a/apps/sleepphasealarm/app.js b/apps/sleepphasealarm/app.js index 5bb2c006c..39f9b59db 100644 --- a/apps/sleepphasealarm/app.js +++ b/apps/sleepphasealarm/app.js @@ -68,7 +68,7 @@ function drawApp() { if (alarmHour < 10) alarmHour = "0" + alarmHour; if (alarmMinute < 10) alarmMinute = "0" + alarmMinute; const s = "Alarm at " + alarmHour + ":" + alarmMinute + "\n\n"; //# make distinct to time - E.showMessage(s, /*LANG*/"Sleep Phase Alarm"); + E.showMessage(s, "Sleep Phase Alarm"); function drawTime() { if (Bangle.isLCDOn()) { @@ -125,7 +125,7 @@ if (nextAlarm !== undefined) { if (swest !== undefined) { if (Bangle.isLCDOn()) { - drawString(swest ? /*LANG*/"Sleep" : "Awake", BANGLEJS2 ? 150 : 180); //# remove x, adjust height + drawString(swest ? "Sleep" : "Awake", BANGLEJS2 ? 150 : 180); //# remove x, adjust height } } diff --git a/apps/smartibot/app.js b/apps/smartibot/app.js index 8760bc59c..88ea5e276 100644 --- a/apps/smartibot/app.js +++ b/apps/smartibot/app.js @@ -35,7 +35,7 @@ function findDevices() { m[dev.id.substr(0,17)] = () => startConnectChoose(dev); }); m["Search again"] = () => findDevices(); - m[/*LANG*/"Back"] = () => load(); + m["Back"] = () => load(); E.showMenu(m); } }, {timeout : 2000, filters : [{ name : "Espruino SMARTIBOT" }] }); @@ -46,7 +46,7 @@ function startConnectChoose(device) { "": {title:"Control Method"}, "Accelerometer" : () => startConnectAccel(device), "Button" : () => startConnectBtn(device), - /*LANG*/"Back": () => load(), + "Back": () => load(), }); } @@ -57,7 +57,7 @@ function startConnectBtn(device) { function(gatt, write) { function setMotors(val) { write(`\x10w(${val})\n`); } drawBGBtn(); - g.reset().setFont("6x8",2).setFontAlign(0,0,1).drawString(/*LANG*/"BACK", 230,200); + g.reset().setFont("6x8",2).setFontAlign(0,0,1).drawString("BACK", 230,200); var state = 0; var watches = [ setWatch(e=>setMotors(state = (state&0b0011) | (e.state<<2)), BTN4, {repeat:true, edge:0}), @@ -81,7 +81,7 @@ function startConnectAccel(device) { "\x03\x10function w(x,y,z,v){var a=analogWrite;a(D4,x);a(D6,y);a(D10,z);a(D11,v);}\n", function(gatt, write) { drawBGAccel(); - g.reset().setFont("6x8",2).setFontAlign(0,0,1).drawString(/*LANG*/"BACK", 230,200); + g.reset().setFont("6x8",2).setFontAlign(0,0,1).drawString("BACK", 230,200); Bangle.on("accel", function(a) { var v = [0,0,0,0]; if (a.z<-0.5) { diff --git a/apps/smtswch/app.js b/apps/smtswch/app.js index bab06be79..e8491a065 100644 --- a/apps/smtswch/app.js +++ b/apps/smtswch/app.js @@ -35,7 +35,7 @@ function loadPage(page) { g.setFont("Vector", 15); g.drawString(page.name, g.getWidth() / 2, 200); g.setFont("Vector", 40); - g.drawString(page.state ? "On" : /*LANG*/"Off", g.getWidth() / 2, g.getHeight() / 2); + g.drawString(page.state ? "On" : "Off", g.getWidth() / 2, g.getHeight() / 2); g.drawImage(storage.read(`${icon}.img`), g.getWidth() / 2 - 24, g.getHeight() / 2 - 24 - 50); } diff --git a/apps/sonicclk/app.js b/apps/sonicclk/app.js index e027ed676..eddb971f8 100644 --- a/apps/sonicclk/app.js +++ b/apps/sonicclk/app.js @@ -268,7 +268,7 @@ const settingsMenu = { "": { title: "Settings" }, "Active Mode": { value: settings.activeMode, - format: (v) => (v ? "On" : /*LANG*/"Off"), + format: (v) => (v ? "On" : "Off"), onchange: (v) => (settings.activeMode = v), }, "Twist Thresh": { diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js index 303cdba02..aa3c608cf 100644 --- a/apps/themesetter/app.js +++ b/apps/themesetter/app.js @@ -376,7 +376,7 @@ ] }, { height:4 }, { type:'h', c:[ - Button(/*LANG*/'Back', { common:halfWidthButton, onTouch:() => gotoScreen('DetailSelectionScreen') }), + Button('Back', { common:halfWidthButton, onTouch:() => gotoScreen('DetailSelectionScreen') }), Button('Preview', { common:halfWidthButton, onTouch:() => gotoScreen('ThemePreviewScreen') }) ], filly:1 }, ] @@ -399,7 +399,7 @@ ] }, { height:4 }, { type:'h', c:[ - Button(/*LANG*/'Back', { common:legible, pad:4, onTouch:() => gotoScreen('ColorSelectionScreen') }) + Button('Back', { common:legible, pad:4, onTouch:() => gotoScreen('ColorSelectionScreen') }) ], filly:1 } ] }); diff --git a/apps/thermomF/app.js b/apps/thermomF/app.js index ac754d448..2961e1efc 100644 --- a/apps/thermomF/app.js +++ b/apps/thermomF/app.js @@ -23,6 +23,6 @@ setInterval(function() { drawTemperature(); }, 20000); drawTemperature(); -E.showMessage(/*LANG*/"Loading..."); +E.showMessage("Loading..."); Bangle.loadWidgets(); Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/timerclk/alarm.alert.js b/apps/timerclk/alarm.alert.js index 133cc5118..f4b61822a 100644 --- a/apps/timerclk/alarm.alert.js +++ b/apps/timerclk/alarm.alert.js @@ -9,8 +9,8 @@ function showAlarm(alarm) { Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.setLocked(false); - E.showPrompt(/*LANG*/"Alarm!",{ - title:/*LANG*/"ALARM!", + E.showPrompt("Alarm!",{ + title:"ALARM!", buttons : {/*LANG*/"Ok":true} }).then(function(ok) { buzzCount = 0; diff --git a/apps/torch/app.js b/apps/torch/app.js index 071de5d46..864efb883 100644 --- a/apps/torch/app.js +++ b/apps/torch/app.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "torch.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#FFFFFF', /*LANG*/'color': 'White'}; + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#FFFFFF', 'color': 'White'}; } loadSettings(); diff --git a/apps/toucher/app.js b/apps/toucher/app.js index 19310592e..aab50fbda 100644 --- a/apps/toucher/app.js +++ b/apps/toucher/app.js @@ -255,7 +255,7 @@ function run(){ if (process.env.HWVERSION == 1) Bangle.setLCDMode(); g.clear(); g.flip(); - E.showMessage(/*LANG*/"Loading..."); + E.showMessage("Loading..."); load(app.src); } diff --git a/apps/viewstl/viewstl.min.js b/apps/viewstl/viewstl.min.js index 82975bbf9..77469042c 100644 --- a/apps/viewstl/viewstl.min.js +++ b/apps/viewstl/viewstl.min.js @@ -216,7 +216,7 @@ function loadFile(fn) { Bangle.setLCDMode("direct"); g.clear(); E.showMenu(); - E.showMessage(/*LANG*/"Loading...", fn); + E.showMessage("Loading...", fn); readSTL(fn); zDist = 5*largestExtent(points); g.clear(); diff --git a/apps/walkersclock/app.js b/apps/walkersclock/app.js index e18879e01..8a5e826c4 100644 --- a/apps/walkersclock/app.js +++ b/apps/walkersclock/app.js @@ -203,7 +203,7 @@ function drawInfo() { break; case FN_MODE_GPS: col = 0x07FF; // cyan - str = "GPS: " + (gpsPowerState ? "ON" : /*LANG*/"OFF"); + str = "GPS: " + (gpsPowerState ? "ON" : "OFF"); drawModeLine(str,col); return; case FN_MODE_GDISP: @@ -560,7 +560,7 @@ Bangle.on('lcdPower',function(on) { prevInfoStr = "on"; // forces are redraw drawAll(); } else { - prevInfoStr = /*LANG*/"off"; // forces are redraw + prevInfoStr = "off"; // forces are redraw drawInfo(); } }); diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index b69ef25de..529923386 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -28,7 +28,7 @@ function loadSettings() { settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}; const DEFAULTS = { - /*LANG*/'color': 'By Level', + 'color': 'By Level', 'percentage': true, 'charger': true, 'hideifmorethan': 100, @@ -46,7 +46,7 @@ const levelColor = (l) => { // "charging" is very bright -> percentage is hard to read, "high" is ok(ish) const green = setting('percentage') ? COLORS.high : COLORS.charging; - switch (setting(/*LANG*/'color')) { + switch (setting('color')) { case 'Monochrome': return COLORS.white; // no chance of reading the percentage here :-( case 'Green': return green; case 'By Level': // fall through @@ -64,7 +64,7 @@ } }; const chargerColor = () => { - return (setting(/*LANG*/'color') === 'Monochrome') ? COLORS.white : COLORS.charging; + return (setting('color') === 'Monochrome') ? COLORS.white : COLORS.charging; }; // sets width, returns true if it changed @@ -112,7 +112,7 @@ return; } let gfx = g; - if (setting(/*LANG*/'color') === 'Monochrome') { + if (setting('color') === 'Monochrome') { // draw text inverted on battery level gfx = Graphics.createCallback(g.getWidth(),g.getHeight(), 1, (x,y) => {g.setPixel(x,y,x<=xl?0:-1);}); diff --git a/apps/widpedom/widget.js b/apps/widpedom/widget.js index 2135bea1a..cc7fdb579 100644 --- a/apps/widpedom/widget.js +++ b/apps/widpedom/widget.js @@ -9,7 +9,7 @@ function loadSettings() { const d = require('Storage').readJSON("wpedom.json", 1) || {}; settings = Object.assign({ - /*LANG*/'goal': 10000, + 'goal': 10000, 'progress': false, 'large': false, 'hide': false diff --git a/bin/language_scan.js b/bin/language_scan.js index eede250de..6385caf49 100755 --- a/bin/language_scan.js +++ b/bin/language_scan.js @@ -5,14 +5,14 @@ outputs a list of strings that have been found. See https://github.com/espruino/BangleApps/issues/1311 */ -let AUTO_TRANSLATE = false; let translate = false; if (process.env.DEEPL) { + // Requires translate + // npm i translate translate = require("translate"); translate.engine = "deepl"; // Or "yandex", "libre", "deepl" - translate.key = process.env.DEEPL; - translate.url = "https://api-free.deepl.com/v2/translate"; - AUTO_TRANSLATE = true; + translate.key = process.env.DEEPL; // Requires API key (which are free) + translate.url = process.env.TURL; } var IGNORE_STRINGS = [ @@ -25,10 +25,8 @@ var IGNORE_STRINGS = [ "play","stop","pause", "volumeup", "volumedown", // music state "${hours}:${minutes}:${seconds}", "${hours}:${minutes}", "BANGLEJS", - "NONE", - "fgH", "bgH", - "m/s", - "undefined", "kbmedia" + "fgH", "bgH", "m/s", + "undefined", "kbmedia", "NONE", ]; var IGNORE_FUNCTION_PARAMS = [ @@ -190,8 +188,11 @@ log(""); log("Maybe we should add /*LANG*/ to these automatically?"); log(""); const wordsToAdd = untranslatedStrings.filter(e => translatedStrings.find(t=>t.str==e.str)); + // Uncomment to add LANG to all strings +// THIS IS EXPERIMENTAL //wordsToAdd.forEach(e => e.files.forEach(a => applyLANG(e.str, a))); + log(wordsToAdd.map(e=>`${JSON.stringify(e.str)} (${e.uses} uses)`).join("\n")); log(""); @@ -226,7 +227,7 @@ for (let language of languages) { let appName = m[0].replaceAll("/", ""); if (translations[appName] && translations[appName][translationItem.str]) { console.log(` but LOCAL translation found in \"${appName}\"`); - } else if (AUTO_TRANSLATE && language.code !== "tr_TR") { // Auto Translate + } else if (translate && language.code !== "tr_TR") { // Auto Translate translationPromises.push(new Promise(async (resolve) => { const translation = await translate(translationItem.str, language.code.split("_")[0]); console.log("Translating:", translationItem.str, translation); diff --git a/lang/bg_BG.json b/lang/bg_BG.json new file mode 100644 index 000000000..8e7fb50bb --- /dev/null +++ b/lang/bg_BG.json @@ -0,0 +1,163 @@ +{ + "//": "Bulgarian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Connected": "Свързан", + "circle 1": "кръг 1", + "week": "седмица", + "weather circle": "метеорологичен кръг", + "Timer": "Таймер", + "circle count": "брой кръгове", + "Keep Msgs": "Дръжте Msgs", + "Auto snooze": "Автоматична дрямка", + "Foreground": "На преден план", + "battery warn": "предупреждение за батерията", + "color": "цвят", + "Vibration": "Вибрации", + "New Timer": "Нов таймер", + "App Source\nNot found": "Източник на приложения\nНе е намерен", + "circle 2": "кръг 2", + "Circle": "Кръг", + "Record Run": "Записване на рекорд", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "steps": "стъпки", + "Beep": "Бип", + "Unread timer": "Непрочетен таймер", + "Delete all messages": "Изтриване на всички съобщения", + "Music": "Музика", + "minimum": "минимум", + "BLE": "BLE", + "goal": "цел", + "Save": "Запазете", + "maximum": "максимален", + "(repeat)": "(повторение)", + "circle 3": "кръг 3", + "Steps": "Стъпки", + "Bluetooth": "Bluetooth", + "Alarm": "Аларма", + "colorize icon": "оцветяване на икона", + "circle 4": "кръг 4", + "Loading": "Зареждане на", + "step length": "дължина на стъпката", + "HID": "HID", + "Heartrate": "Сърдечен ритъм", + "Dark BW": "Тъмно BW", + "Customize": "Персонализиране на", + "valid period": "валиден период", + "Sleep": "Сън", + "distance goal": "цел за разстояние", + "LCD": "LCD", + "data": "данни", + "Vector font size": "Размер на векторния шрифт", + "Mark Unread": "Маркирайте непрочетеното", + "heartrate": "сърдечен ритъм", + "Show clocks": "Показване на часовници", + "New Alarm": "Нова аларма", + "Are you sure": "Сигурни ли сте, че", + "Highlight BG": "Подчертаване на BG", + "Remove": "Премахване на", + "No Messages": "Няма съобщения", + "Delete All Messages": "Изтриване на всички съобщения", + "Foreground 2": "Преден план 2", + "Launcher Settings": "Настройки на стартера", + "Compact Storage": "Компактно съхранение", + "min. confidence": "мин. доверие", + "Connect device\nto add to\nwhitelist": "Свързване на устройството\nда добавите към\nбял списък", + "LCD Brightness": "Яркост на LCD дисплея", + "Highlight FG": "Изтъкване на FG", + "Twist Threshold": "Праг на усукване", + "Add Device": "Добавяне на устройство", + "LCD Timeout": "Време за изключване на LCD", + "Twist Timeout": "Време за завъртане", + "Log": "Log", + "Time Zone": "Часова зона", + "Clock Style": "Стил на часовника", + "Debug Info": "Информация за отстраняването на грешки", + "Wake on Touch": "Събуждане при докосване", + "View Message": "Преглед на съобщението", + "Quiet Mode": "Тих режим", + "Background 2": "Контекст 2", + "Light BW": "Светлина BW", + "show widgets": "показване на уиджети", + "Font": "Шрифт", + "Piezo": "Piezo", + "Make Connectable": "Свържете се", + "Apps": "Приложения", + "Background": "Фон", + "Twist Max Y": "Twist Max Y", + "Utils": "Услуги", + "Programmable": "Програмируем", + "Wake on BTN2": "Събуждане на BTN2", + "Utilities": "Комунални услуги", + "TAP right top/bottom": "TAP дясно отгоре/отдолу", + "Wake on BTN1": "Събуждане на BTN1", + "Passkey BETA": "Passkey BETA", + "Wake on BTN3": "Събуждане на BTN3", + "Wake on Twist": "Събуждане на Twist", + "Wake on FaceUp": "Събуждане в FaceUp", + "No Clocks Found": "Не са намерени часовници", + "Reset to Defaults": "Възстановяване на настройките по подразбиране", + "Compacting...\nTakes approx\n1 minute": "Уплътняване...\nОтнема приблизително\n1 минута", + "Rewrite Settings": "Настройки за пренаписване", + "Stay Connectable": "Останете свързани", + "Turn Off": "Изключване", + "This will remove everything": "Това ще премахне всичко", + "Flatten Battery": "Сплескайте батерията", + "Reset Settings": "Нулиране на настройките", + "Connectable": "Свързване на", + "Storage": "Съхранение", + "start&lap/reset, BTN1: EXIT": "стартиране и застъпване/ нулиране, BTN1: EXIT", + "Month": "Месец", + "App Settings": "Настройки на приложението", + "Side": "Страна", + "Invalid settings": "Невалидни настройки", + "Date": "Дата", + "No app has settings": "Няма приложение с настройки", + "on": "на", + "Left": "Вляво", + "Minute": "Минута", + "Year": "Година", + "Second": "Втори", + "Hour": "Час", + "Reset all widgets": "Нулиране на всички уиджети", + "Widgets": "Уиджети", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Сплескване на батерията - това може да отнеме часове.\nДълго натиснете бутона, за да отмените", + "TIMER": "ТАЙМЕР", + "Right": "Вдясно", + "Reset": "Нулиране на", + "Reset All": "Нулиране на всички", + "Sort Order": "Ред на сортиране", + "ALARM": "АЛАРМА", + "Minutes": "Протоколи", + "Hours": "Часове", + "Vibrate": "Вибрация", + "off": "от", + "Delete": "Изтриване на", + "Repeat": "Повторете", + "Message": "Съобщение", + "Enabled": "Разрешено", + "Settings": "Настройки", + "System": "Система", + "Alerts": "Сигнали", + "Theme": "Тема", + "Hide": "Скрий", + "Show": "Покажи", + "Messages": "Съобщения", + "Set Time": "Време за настройка", + "Whitelist": "Бял списък", + "On": "На", + "Select Clock": "Избор на часовник", + "Locale": "Местоположение", + "No": "Не", + "Error in settings": "Грешка в настройките", + "Factory Reset": "Фабрично нулиране", + "Disable": "Деактивиране на", + "Off": "Изключено", + "Yes": "Да", + "Ok": "Добре", + "Back": "Обратно" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/da_DA.json b/lang/da_DA.json new file mode 100644 index 000000000..59aea3068 --- /dev/null +++ b/lang/da_DA.json @@ -0,0 +1,163 @@ +{ + "//": "Danish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Ny alarm", + "Alarm": "Alarm", + "New Timer": "Ny timer", + "Save": "Gem", + "(repeat)": "(gentagelse)", + "circle 1": "kreds 1", + "circle 3": "kreds 3", + "circle 2": "kreds 2", + "Auto snooze": "Automatisk slumretid", + "circle 4": "cirkel 4", + "show widgets": "vise widgets", + "Connected": "Tilsluttet", + "Keep Msgs": "Behold msgs", + "min. confidence": "min. tillid", + "heartrate": "hjertefrekvens", + "steps": "trin", + "week": "uge", + "Sleep": "Søvn", + "circle count": "antal cirkler", + "goal": "mål", + "Timer": "Timer", + "Steps": "Trin", + "valid period": "gyldighedsperiode", + "step length": "trinlængde", + "minimum": "minimum", + "weather circle": "vejrkreds", + "maximum": "maksimum", + "data": "data", + "Circle": "Cirkel", + "Heartrate": "Hjertefrekvens", + "battery warn": "batteri advarer", + "App Source\nNot found": "App-kilde\nIkke fundet", + "colorize icon": "farvelægge ikonet", + "distance goal": "mål for afstand", + "TAP right top/bottom": "TAP højre top/bund", + "color": "farve", + "View Message": "Vis besked", + "Show clocks": "Vis ure", + "Mark Unread": "Markér ulæst", + "Unread timer": "Ulæst timer", + "Loading": "Indlæsning", + "Launcher Settings": "Indstillinger for startopsætningen", + "Bluetooth": "Bluetooth", + "Music": "Musik", + "Font": "Skrifttype", + "Vector font size": "Vektor skriftstørrelse", + "BTNs 1:startlap 2:exit 3:reset": "BTN'er 1:startlap 2:exit 3:reset", + "No Messages": "Ingen meddelelser", + "Are you sure": "Er du sikker på", + "Delete All Messages": "Slet alle meddelelser", + "Record Run": "Rekordløb", + "Delete all messages": "Slet alle meddelelser", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Vibration": "Vibrationer", + "HID": "HID", + "Make Connectable": "Gør det muligt at forbinde", + "LCD": "LCD", + "BLE": "BLE", + "Utils": "Utils", + "Piezo": "Piezo", + "Apps": "Apps", + "Background": "Baggrund", + "Customize": "Tilpas", + "Beep": "Bip", + "Quiet Mode": "Stille tilstand", + "Dark BW": "Mørk BW", + "Programmable": "Programmerbar", + "Passkey BETA": "Passkey BETA", + "Light BW": "Light BW", + "Highlight FG": "fremhæve FG", + "Background 2": "Baggrund 2", + "Foreground": "Forgrund", + "Highlight BG": "fremhæve BG", + "Foreground 2": "Forgrund 2", + "LCD Timeout": "LCD Timeout", + "Remove": "Fjern", + "Wake on BTN2": "Wake på BTN2", + "LCD Brightness": "LCD lysstyrke", + "Add Device": "Tilføj enhed", + "Wake on BTN1": "Vågn op på BTN1", + "Connect device\nto add to\nwhitelist": "Tilslut enhed\ntil at tilføje til\nwhitelist", + "Wake on BTN3": "Wake på BTN3", + "Wake on FaceUp": "Vågn op på FaceUp", + "Log": "Log", + "Debug Info": "Info om fejlfinding", + "Wake on Twist": "Vågn op på Twist", + "Wake on Touch": "Vågn op ved berøring", + "Clock Style": "Ur stil", + "Time Zone": "Tidszone", + "Twist Max Y": "Drej Max Y", + "Twist Threshold": "Twist tærskel", + "Compact Storage": "Kompakt opbevaring", + "Twist Timeout": "Twist Timeout", + "Storage": "Opbevaring", + "Utilities": "Hjælpeprogrammer", + "Rewrite Settings": "Omskrivning af indstillinger", + "No Clocks Found": "Ingen ure fundet", + "Reset to Defaults": "Nulstil til standardindstillingerne", + "Compacting...\nTakes approx\n1 minute": "Komprimering...\nTager ca.\n1 minut", + "Connectable": "Tilslutbar", + "Reset Settings": "Nulstil indstillinger", + "Stay Connectable": "Forbliv forbundet", + "Flatten Battery": "Flade batterier", + "Minute": "Minut", + "This will remove everything": "Dette vil fjerne alt", + "Turn Off": "Sluk for", + "Hour": "Timer", + "Month": "Måned", + "Second": "Anden", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Udfladning af batteriet - dette kan tage flere timer.\nTryk længe på knappen for at annullere", + "Year": "År", + "Widgets": "Widgets", + "Date": "Dato", + "Side": "Side", + "Left": "Venstre", + "App Settings": "App-indstillinger", + "No app has settings": "Ingen app har indstillinger", + "Invalid settings": "Ugyldige indstillinger", + "Reset All": "Nulstil alt", + "on": "på", + "TIMER": "TIMER", + "Right": "Højre", + "Sort Order": "Sorteringsrækkefølge", + "Reset": "Nulstil", + "Reset all widgets": "Nulstil alle widgets", + "ALARM": "ALARM", + "Settings": "Indstillinger", + "Alerts": "Advarsler", + "System": "System", + "Theme": "Tema", + "Locale": "Lokale", + "Vibrate": "Vibrere", + "Enabled": "Aktiveret", + "Hours": "Timer", + "Delete": "Slet", + "Minutes": "Protokol", + "Message": "Besked", + "Repeat": "Gentag", + "off": "off", + "Whitelist": "Whitelist", + "Show": "Vis", + "Messages": "Meddelelser", + "On": "På", + "Hide": "Skjul", + "Set Time": "Indstil tid", + "Factory Reset": "Fabriksnulstilling", + "Disable": "Deaktivere", + "Error in settings": "Fejl i indstillingerne", + "Select Clock": "Vælg ur", + "No": "Nej", + "Yes": "Ja", + "Ok": "Ok", + "Off": "Off", + "Back": "Tilbage" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/el_EL.json b/lang/el_EL.json new file mode 100644 index 000000000..38ef6a01f --- /dev/null +++ b/lang/el_EL.json @@ -0,0 +1,163 @@ +{ + "//": "Greek language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Save": "Αποθήκευση", + "week": "εβδομάδα", + "Keep Msgs": "Κρατήστε τα Msgs", + "New Alarm": "Νέος συναγερμός", + "Connected": "Συνδεδεμένο", + "Circle": "Κύκλος", + "maximum": "μέγιστο", + "Heartrate": "Καρδιακός ρυθμός", + "step length": "μήκος βήματος", + "valid period": "περίοδος ισχύος", + "(repeat)": "(επανάληψη)", + "min. confidence": "ελάχιστη εμπιστοσύνη", + "New Timer": "Νέος χρονοδιακόπτης", + "Sleep": "Ύπνος", + "Timer": "Χρονοδιακόπτης", + "Alarm": "Συναγερμός", + "goal": "γκολ", + "distance goal": "στόχος απόστασης", + "Steps": "Βήματα", + "minimum": "ελάχιστο", + "circle 4": "κύκλος 4", + "steps": "βήματα", + "circle 2": "κύκλος 2", + "circle 1": "κύκλος 1", + "weather circle": "κύκλος καιρού", + "circle count": "Αριθμός κύκλων", + "heartrate": "καρδιακός ρυθμός", + "circle 3": "κύκλος 3", + "show widgets": "Εμφάνιση widgets", + "battery warn": "προειδοποίηση μπαταρίας", + "Vector font size": "Μέγεθος γραμματοσειράς διανύσματος", + "Font": "Γραμματοσειρά", + "colorize icon": "χρωματισμός εικονιδίου", + "Show clocks": "Εμφάνιση ρολογιών", + "color": "χρώμα", + "Launcher Settings": "Ρυθμίσεις εκτοξευτή", + "App Source\nNot found": "Πηγή εφαρμογής\nΔεν βρέθηκε", + "Loading": "Φόρτωση", + "data": "δεδομένα", + "View Message": "Προβολή μηνύματος", + "Delete all messages": "Διαγραφή όλων των μηνυμάτων", + "Mark Unread": "Mark Unread", + "Are you sure": "Είσαι σίγουρος", + "Delete All Messages": "Διαγραφή όλων των μηνυμάτων", + "Unread timer": "Χρονοδιακόπτης χωρίς ανάγνωση", + "Apps": "Εφαρμογές", + "Record Run": "Τρέξιμο ρεκόρ", + "No Messages": "Δεν υπάρχουν μηνύματα", + "Music": "Μουσική", + "Bluetooth": "Bluetooth", + "LCD": "LCD", + "Piezo": "Piezo", + "Quiet Mode": "Αθόρυβη λειτουργία", + "Make Connectable": "Κάντε Connectable", + "Utils": "Utils", + "Vibration": "Δονήσεις", + "Programmable": "Προγραμματιζόμενο", + "Beep": "Μπιπ", + "Passkey BETA": "Passkey BETA", + "Wake on Touch": "Αφύπνιση στο άγγιγμα", + "Twist Max Y": "Twist Max Y", + "Time Zone": "Ζώνη ώρας", + "Remove": "Αφαιρέστε το", + "Add Device": "Προσθήκη συσκευής", + "LCD Brightness": "Φωτεινότητα LCD", + "LCD Timeout": "Χρονικό όριο LCD", + "Twist Timeout": "Twist Timeout", + "Highlight BG": "Επισημάνετε το BG", + "Highlight FG": "Επισημάνετε το FG", + "Light BW": "Ελαφρύ BW", + "Foreground 2": "Πρόσθιο πεδίο 2", + "Background": "Ιστορικό", + "Background 2": "Ιστορικό 2", + "HID": "HID", + "Dark BW": "Σκούρο BW", + "BLE": "BLE", + "Customize": "Προσαρμογή", + "Debug Info": "Πληροφορίες εντοπισμού σφαλμάτων", + "Rewrite Settings": "Ρυθμίσεις επανεγγραφής", + "Storage": "Αποθήκευση", + "Flatten Battery": "Επίπεδη μπαταρία", + "Clock Style": "Στυλ ρολογιού", + "Compact Storage": "Συμπαγής αποθήκευση", + "Utilities": "Υπηρεσίες κοινής ωφέλειας", + "Log": "Ημερολόγιο", + "Right": "Δεξιά", + "Month": "Μήνας", + "Side": "Πλευρά", + "No app has settings": "Καμία εφαρμογή δεν έχει ρυθμίσεις", + "Widgets": "Widgets", + "Left": "Αριστερά", + "Reset All": "Επαναφορά όλων", + "Invalid settings": "Μη έγκυρες ρυθμίσεις", + "Reset": "Επαναφορά", + "Sort Order": "Σειρά ταξινόμησης", + "TAP right top/bottom": "TAP δεξιά πάνω/κάτω", + "Wake on BTN2": "Wake στο BTN2", + "Connect device\nto add to\nwhitelist": "Σύνδεση συσκευής\nγια να προσθέσετε\nλευκή λίστα", + "Wake on FaceUp": "Wake στο FaceUp", + "Wake on BTN1": "Wake στο BTN1", + "Wake on BTN3": "Wake στο BTN3", + "Foreground": "Πρόσφατα στοιχεία", + "Wake on Twist": "Wake on Twist", + "Auto snooze": "Αυτόματη επαναφορά", + "Twist Threshold": "Κατώφλι συστροφής", + "Compacting...\nTakes approx\n1 minute": "Συμπίεση...\nΠαίρνει περίπου\n1 λεπτό", + "Connectable": "Συνδεόμενο", + "Repeat": "Επανάληψη", + "No Clocks Found": "Δεν βρέθηκαν ρολόγια", + "TIMER": "TIMER", + "App Settings": "Ρυθμίσεις εφαρμογής", + "Stay Connectable": "Μείνετε συνδεδεμένοι", + "Second": "Δεύτερο", + "Minute": "Λεπτό", + "Date": "Ημερομηνία", + "This will remove everything": "Αυτό θα αφαιρέσει τα πάντα", + "Reset to Defaults": "Επαναφορά στις προεπιλογές", + "Vibrate": "Δονήσεις", + "Hour": "Ώρα", + "Turn Off": "Απενεργοποίηση", + "Reset Settings": "Επαναφορά ρυθμίσεων", + "Year": "Έτος", + "Message": "Μήνυμα", + "Locale": "Τοπική τοποθεσία", + "Alerts": "Ειδοποιήσεις", + "Theme": "Θέμα", + "Error in settings": "Σφάλμα στις ρυθμίσεις", + "Disable": "Απενεργοποίηση", + "Factory Reset": "Επαναφορά εργοστασιακών ρυθμίσεων", + "System": "Σύστημα", + "Ok": "Εντάξει", + "Yes": "Ναι", + "On": "Στο", + "Settings": "Ρυθμίσεις", + "Select Clock": "Επιλέξτε Ρολόι", + "Off": "Off", + "Back": "Πίσω", + "No": "Όχι", + "Delete": "Διαγραφή", + "Enabled": "Ενεργοποιημένο", + "Hours": "Ώρες", + "ALARM": "ALARM", + "on": "στο", + "off": "off", + "Minutes": "Πρακτικά", + "Reset all widgets": "Επαναφορά όλων των widgets", + "Hide": "Απόκρυψη", + "Messages": "Μηνύματα", + "Show": "Εμφάνιση", + "Set Time": "Ρύθμιση χρόνου", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "εκκίνηση&γύρος/επαναφορά, BTN1: ΕΞΟΔΟΣ", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Εξομάλυνση της μπαταρίας - αυτό μπορεί να διαρκέσει ώρες.\nΠατήστε παρατεταμένα το κουμπί για ακύρωση", + "Whitelist": "Λευκή λίστα" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/et_ET.json b/lang/et_ET.json new file mode 100644 index 000000000..33be5bf6c --- /dev/null +++ b/lang/et_ET.json @@ -0,0 +1,163 @@ +{ + "//": "Estonian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Uus häire", + "Alarm": "Häire", + "Save": "Salvesta", + "Timer": "Taimer", + "(repeat)": "(kordus)", + "New Timer": "Uus taimer", + "circle 2": "ring 2", + "week": "nädal", + "circle 4": "ring 4", + "circle count": "ringide arv", + "Sleep": "Sleep", + "circle 3": "ring 3", + "Keep Msgs": "Hoidke Msgs", + "heartrate": "südame löögisagedus", + "circle 1": "ring 1", + "Connected": "Ühendatud", + "steps": "sammud", + "battery warn": "aku hoiatus", + "show widgets": "Näita vidinaid", + "minimum": "minimaalne", + "Heartrate": "Südame löögisagedus", + "weather circle": "ilmastikuring", + "Loading": "Laadimine", + "Launcher Settings": "Käivitajate seaded", + "color": "värv", + "Font": "Font", + "colorize icon": "värvida ikooni", + "Steps": "Sammud", + "step length": "sammu pikkus", + "Auto snooze": "Automaatne snooze", + "TAP right top/bottom": "TAP paremal üleval/alla", + "maximum": "maksimaalne", + "distance goal": "kauguse eesmärk", + "valid period": "kehtivusaeg", + "min. confidence": "min. usaldus", + "data": "andmed", + "Circle": "Ring", + "goal": "eesmärk", + "Delete all messages": "Kustuta kõik sõnumid", + "Are you sure": "Oled sa kindel, et", + "App Source\nNot found": "Rakenduse allikas\nEi leitud", + "Show clocks": "Näita kellasid", + "View Message": "Vaata sõnumit", + "Vector font size": "Vektori kirjasuurus", + "Mark Unread": "Märgi lugemata", + "Delete All Messages": "Kustuta kõik sõnumid", + "No Messages": "Sõnumid puuduvad", + "Bluetooth": "Bluetooth", + "LCD": "LCD", + "Unread timer": "Lugemata taimer", + "Record Run": "Record Run", + "Music": "Muusika", + "Beep": "Helisema", + "Piezo": "Piezo", + "Apps": "Rakendused", + "Utils": "Utils", + "Vibration": "Vibratsioon", + "BLE": "BLE", + "Make Connectable": "Tee ühendatavaks", + "Programmable": "Programmeeritav", + "Light BW": "Kerge BW", + "Passkey BETA": "Passkey BETA", + "HID": "HID", + "Quiet Mode": "Vaikne režiim", + "Background": "Taustaks", + "Customize": "Kohandada", + "Dark BW": "Tume BW", + "LCD Timeout": "LCD Timeout", + "Background 2": "Taust 2", + "Highlight FG": "FG esiletõstmine", + "Add Device": "Seadme lisamine", + "Highlight BG": "Rõhutage BG", + "Remove": "Eemaldage", + "LCD Brightness": "LCD heledus", + "Foreground 2": "Teadmised 2", + "Time Zone": "Ajavöönd", + "Debug Info": "Debug-info", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Foreground": "Esialgsed teadmised", + "Wake on BTN3": "Wake on BTN3", + "Connect device\nto add to\nwhitelist": "Seadme ühendamine\nlisada\nvalimisnimekirja", + "Wake on BTN2": "Wake on BTN2", + "Wake on Touch": "Wake on Touch", + "Wake on FaceUp": "FaceUp'i ärkamine", + "Compact Storage": "Kompaktne ladustamine", + "Wake on Twist": "Wake on Twist", + "Clock Style": "Kella stiil", + "Wake on BTN1": "Wake on BTN1", + "Utilities": "Kommunaalteenused", + "Twist Threshold": "Twist künnis", + "Log": "Logi", + "Reset Settings": "Seadete lähtestamine", + "Rewrite Settings": "Ümberkirjutamise seaded", + "Hour": "Tund", + "Stay Connectable": "Jääge ühendatavaks", + "Flatten Battery": "Aku tasandamine", + "This will remove everything": "See eemaldab kõik", + "Minute": "Hetk", + "App Settings": "Rakenduse seaded", + "No app has settings": "Ühelgi rakendusel ei ole seadeid", + "Invalid settings": "Väärad seaded", + "Date": "Kuupäev", + "Year": "Aasta", + "Side": "Side", + "Turn Off": "Lülita välja", + "Storage": "Ladustamine", + "Second": "Teine", + "Right": "Õigus", + "Left": "Vasakpoolne", + "Month": "Kuu", + "TIMER": "TIMER", + "Reset to Defaults": "Lähtestamine vaikimisi seadistustele", + "Compacting...\nTakes approx\n1 minute": "Tihendamine...\nKulub umbes\n1 minut", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Aku tasandamine - see võib võtta tunde.\nTühistamiseks vajutage pikalt nuppu", + "ALARM": "ALARM", + "Reset All": "Reset All", + "Hours": "Tunnid", + "off": "välja", + "Widgets": "Vidinad", + "Reset all widgets": "Nullida kõik vidinad", + "on": "aadressil", + "Connectable": "Ühendatav", + "No Clocks Found": "Kellasid ei leitud", + "BTNs 1:startlap 2:exit 3:reset": "BTNid 1:startlap 2:exit 3:reset", + "Sort Order": "Sorteerimisjärjekord", + "Reset": "Reset", + "System": "Süsteem", + "Message": "Sõnum", + "Settings": "Seaded", + "Locale": "Locale", + "Alerts": "Hoiatused", + "Enabled": "Lubatud", + "Theme": "Teema", + "Minutes": "Protokoll", + "Delete": "Kustuta", + "Set Time": "Määratud aeg", + "Select Clock": "Valige kell", + "Hide": "Peida", + "Messages": "Sõnumid", + "Ok": "Ok", + "Show": "Näita", + "On": "Veebilehel", + "Factory Reset": "Tehase lähtestamine", + "Error in settings": "Viga seadetes", + "Disable": "Lülita välja", + "Repeat": "Kordus", + "Vibrate": "Vibreerima", + "Whitelist": "Valge nimekiri", + "No": "Ei", + "Yes": "Jah", + "Off": "Väljaspool", + "Back": "Tagasi" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/index.json b/lang/index.json index 1a9c851d8..f2750cd72 100644 --- a/lang/index.json +++ b/lang/index.json @@ -10,8 +10,16 @@ {"code":"nl_NL","name":"Dutch","url":"nl_NL.json"}, {"code":"sv_SE","name":"Swedish","url":"sv_SE.json"}, {"code":"tr_TR","name":"Turkish","url":"tr_TR.json"}, - {"code":"zh_ZH","name":"Chinese","url":"zh_ZH.json"}, {"code":"ru_RU","name":"Russian","url":"ru_RU.json"}, {"code":"pt_PT","name":"Portuguese","url":"pt_PT.json"}, - {"code":"ja_JA","name":"Japanese","url":"ja_JA.json"} + {"code":"bg_BG","name":"Bulgarian","url":"bg_BG.json"}, + {"code":"da_DA","name":"Danish","url":"da_DA.json"}, + {"code":"el_EL","name":"Greek","url":"el_EL.json"}, + {"code":"et_ET","name":"Estonian","url":"et_ET.json"}, + {"code":"lt_LT","name":"Lithuanian","url":"lt_LT.json"}, + {"code":"lv_LV","name":"Latvian","url":"lv_LV.json"}, + {"code":"pl_PL","name":"Polish","url":"pl_PL.json"}, + {"code":"ro_RO","name":"Romanian","url":"ro_RO.json"}, + {"code":"sk_SK","name":"Slovak","url":"sk_SK.json"}, + {"code":"sl_SL","name":"Slovenian","url":"sl_SL.json"} ] diff --git a/lang/lt_LT.json b/lang/lt_LT.json new file mode 100644 index 000000000..2ea7dca90 --- /dev/null +++ b/lang/lt_LT.json @@ -0,0 +1,163 @@ +{ + "//": "Lithuanian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Naujas žadintuvas", + "(repeat)": "(pakartoti)", + "Alarm": "Signalizacija", + "Save": "Išsaugoti", + "New Timer": "Naujas laikmatis", + "Sleep": "Miegas", + "circle count": "ratų skaičius", + "Timer": "Laikmatis", + "week": "savaitė", + "Connected": "Prijungta", + "circle 2": "2 ratas", + "Auto snooze": "Automatinis snaudimas", + "circle 1": "1 ratas", + "show widgets": "rodyti valdiklius", + "Keep Msgs": "Laikyti Msgs", + "weather circle": "orų ratas", + "step length": "žingsnio ilgis", + "steps": "žingsniai", + "circle 3": "3 ratas", + "battery warn": "įspėjimas apie akumuliatorių", + "min. confidence": "min. pasitikėjimas", + "maximum": "didžiausias", + "valid period": "galiojantis laikotarpis", + "minimum": "minimalus", + "heartrate": "širdies ritmas", + "circle 4": "4 ratas", + "goal": "tikslas", + "data": "duomenys", + "distance goal": "atstumo tikslas", + "Steps": "Žingsniai", + "Heartrate": "Širdies ritmas", + "Show clocks": "Rodyti laikrodžius", + "View Message": "Peržiūrėti žinutę", + "color": "", + "colorize icon": "nuspalvinti piktogramą", + "Circle": "Apskritimas", + "Delete all messages": "Ištrinti visus pranešimus", + "Font": "Šriftas", + "TAP right top/bottom": "TAP dešinėje viršuje / apačioje", + "No Messages": "Jokių pranešimų", + "Launcher Settings": "Paleidimo programos nustatymai", + "App Source\nNot found": "Programėlės šaltinis\nNerastas", + "Loading": "Pakrovimas", + "Vector font size": "Vektorinio šrifto dydis", + "Music": "Muzika", + "Are you sure": "Ar tikrai", + "Delete All Messages": "Ištrinti visus pranešimus", + "Mark Unread": "Pažymėti Neskaityta", + "LCD": "LCD", + "Apps": "Programėlės", + "Record Run": "Rekordinis paleidimas", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Unread timer": "Neperskaitytas laikmatis", + "Bluetooth": "\"Bluetooth\"", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Dark BW": "Tamsus BW", + "Programmable": "Programuojamas", + "Make Connectable": "Sukurkite \"Connectable", + "BLE": "BLE", + "Passkey BETA": "Passkey BETA", + "HID": "HID", + "Utils": "Paslaugos", + "Quiet Mode": "Tylusis režimas", + "Beep": "Pyptelėjimas", + "Piezo": "Piezo", + "Vibration": "Vibracija", + "Background": "Pagrindinė informacija", + "Customize": "Tinkinti", + "Foreground": "Naujos žinios", + "Light BW": "Šviesus BW", + "Add Device": "Pridėti įrenginį", + "Remove": "Pašalinti", + "Wake on BTN1": "Pabusti dėl BTN1", + "Wake on BTN3": "Pabusti dėl BTN3", + "Highlight FG": "Pabrėžti FG", + "Highlight BG": "Išryškinti BG", + "Twist Max Y": "Twist Max Y", + "Foreground 2": "Pirmas planas 2", + "Background 2": "Pagrindinė informacija 2", + "Clock Style": "Laikrodžio stilius", + "Log": "Žurnalas", + "Debug Info": "Derinimo informacija", + "Time Zone": "Laiko juosta", + "Wake on Touch": "Pabudimas palietus", + "Twist Threshold": "Sukimo slenkstis", + "Wake on FaceUp": "Atsibusti \"FaceUp", + "Wake on BTN2": "Pabusti dėl BTN2", + "Wake on Twist": "Pabusti dėl Twist", + "LCD Brightness": "LCD ekrano ryškumas", + "Twist Timeout": "Twist Timeout", + "Compact Storage": "Kompaktiškas saugojimas", + "Storage": "Saugykla", + "Utilities": "Komunalinės paslaugos", + "Compacting...\nTakes approx\n1 minute": "Suspaudžiant...\nUžtrunka maždaug\n1 minutė", + "No Clocks Found": "Laikrodžių nerasta", + "Reset Settings": "Nustatymų atstatymas", + "Flatten Battery": "Išlyginti akumuliatorių", + "Connect device\nto add to\nwhitelist": "Prijungti įrenginį\npridėti prie\nbaltąjį sąrašą", + "LCD Timeout": "LCD ekrano laiko limitas", + "Hour": "Valanda", + "Second": "Antrasis", + "Date": "Data", + "Turn Off": "Išjungti", + "This will remove everything": "Tai pašalins viską.", + "Connectable": "Prijungiama", + "Stay Connectable": "Palaikykite ryšį", + "Left": "Kairėje pusėje", + "Right": "Dešinė", + "Side": "Šoninė pusė", + "Invalid settings": "Netinkami nustatymai", + "Month": "Mėnuo", + "Year": "Metai", + "App Settings": "Programėlės nustatymai", + "Sort Order": "Rūšiavimo tvarka", + "Minute": "Minutė", + "No app has settings": "Jokia programa neturi nustatymų", + "Rewrite Settings": "Perrašymo nustatymai", + "Reset All": "Iš naujo nustatyti viską", + "Reset": "Iš naujo nustatyti", + "Reset to Defaults": "Iš naujo nustatyti numatytąsias reikšmes", + "Hours": "Valandos", + "ALARM": "ALARMAS", + "TIMER": "LAIKMATIS", + "Widgets": "Valdikliai", + "Reset all widgets": "Iš naujo nustatyti visus valdiklius", + "Minutes": "Protokolas", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Akumuliatoriaus išlyginimas - tai gali užtrukti kelias valandas.\nIlgai paspauskite mygtuką, kad atšauktumėte", + "on": "svetainėje", + "off": "iš", + "Message": "Žinutė", + "Repeat": "Pakartokite", + "Delete": "Ištrinti", + "Enabled": "Įjungta", + "System": "Sistema", + "Theme": "Tema", + "Vibrate": "Vibruoti", + "Settings": "Nustatymai", + "Alerts": "Įspėjimai", + "Error in settings": "Klaida nustatymuose", + "Messages": "Žinutės", + "Set Time": "Nustatytas laikas", + "Locale": "Vietovė", + "Select Clock": "Pasirinkite laikrodį", + "Whitelist": "Baltasis sąrašas", + "Disable": "Išjungti", + "Factory Reset": "Gamyklinis atstatymas", + "Show": "Rodyti", + "Hide": "Paslėpti", + "Yes": "Taip", + "Ok": "Gerai", + "No": "Ne", + "On": "Svetainėje", + "Off": "Išjungta", + "Back": "Atgal" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/lv_LV.json b/lang/lv_LV.json new file mode 100644 index 000000000..41525891f --- /dev/null +++ b/lang/lv_LV.json @@ -0,0 +1,163 @@ +{ + "//": "Latvian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Save": "Saglabāt", + "Auto snooze": "Automātiskā snaudiena atlikšana", + "circle 1": "1 aplis", + "New Timer": "Jauns taimeris", + "New Alarm": "Jauns modinātājs", + "Sleep": "Miega režīms", + "circle count": "apļu skaits", + "Keep Msgs": "Glabāt Msgs", + "Timer": "Taimeris", + "week": "nedēļa", + "Connected": "Savienots", + "(repeat)": "(atkārtot)", + "circle 3": "aplis 3", + "circle 4": "4 aplis", + "Alarm": "Trauksmes signāls", + "steps": "soļi", + "heartrate": "sirdsdarbības ātrums", + "weather circle": "laikapstākļu aplis", + "circle 2": "2. aplis", + "minimum": "minimālais", + "battery warn": "brīdinājums par akumulatoru", + "min. confidence": "min. uzticēšanās", + "show widgets": "parādīt logrīkus", + "step length": "soļa garums", + "goal": "mērķis", + "distance goal": "attāluma mērķis", + "valid period": "derīguma termiņš", + "Circle": "Aplis", + "data": "dati", + "Steps": "Soļi", + "color": "krāsa", + "colorize icon": "iekrāsot ikonu", + "maximum": "maksimālais", + "Heartrate": "Sirdsdarbība", + "View Message": "Skatīt ziņojumu", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "TAP right top/bottom": "TAP pa labi augšā/apakšā", + "Mark Unread": "Atzīmēt Neizlasīts", + "Delete all messages": "Dzēst visus ziņojumus", + "Vector font size": "Vektora fonta lielums", + "Loading": "Iekraušana", + "Show clocks": "Rādīt pulksteņus", + "Font": "Fonts", + "App Source\nNot found": "Lietotņu avots\nNav atrasts", + "Launcher Settings": "Palaidēja iestatījumi", + "Delete All Messages": "Dzēst visus ziņojumus", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:izeja 3:resetēšana", + "Bluetooth": "Bluetooth", + "Are you sure": "Vai esat pārliecināts, ka", + "Utils": "Utils", + "Unread timer": "Neizlasīts taimeris", + "LCD": "LCD", + "Music": "Mūzika", + "No Messages": "Nav ziņojumu", + "Record Run": "Rekorda skrējiens", + "HID": "HID", + "Quiet Mode": "Klusais režīms", + "Highlight FG": "Izcelt FG", + "Programmable": "Programmējams", + "Passkey BETA": "Passkey BETA", + "Light BW": "Gaismas BW", + "Piezo": "Piezo", + "Make Connectable": "Padarīt savienojamu", + "Beep": "Pīkstiens", + "Dark BW": "Tumšs BW", + "Background": "Pamatinformācija", + "Vibration": "Vibrācija", + "Apps": "Aplikācijas", + "Foreground 2": "Priekšplāns 2", + "Background 2": "Pamatinformācija 2", + "Foreground": "Priekšplāns", + "Customize": "Pielāgojiet", + "Highlight BG": "Izcelt BG", + "BLE": "BLE", + "LCD Timeout": "LCD displeja laika ierobežojums", + "Twist Max Y": "Twist Max Y", + "Add Device": "Pievienot ierīci", + "Connect device\nto add to\nwhitelist": "Savienot ierīci\nlai pievienotu\nbalto sarakstu", + "Wake on Touch": "Pamosties pēc pieskāriena", + "Time Zone": "Laika josla", + "Wake on BTN3": "Wake par BTN3", + "Wake on BTN1": "Pamosties par BTN1", + "Wake on BTN2": "Wake par BTN2", + "LCD Brightness": "LCD ekrāna spilgtums", + "Remove": "Noņemt", + "Clock Style": "Pulksteņa stils", + "Debug Info": "Dzesēšanas informācija", + "Twist Timeout": "Twist laika ierobežojums", + "Wake on FaceUp": "Pamosties FaceUp", + "Twist Threshold": "Pagrieziena slieksnis", + "This will remove everything": "Tādējādi tiks noņemts viss", + "Utilities": "Komunālie pakalpojumi", + "Connectable": "Savienojams", + "Minute": "Minūtes", + "Stay Connectable": "Palieciet savienojami", + "Storage": "Uzglabāšana", + "Log": "Log", + "Wake on Twist": "Wake on Twist", + "Flatten Battery": "Izlīdzināt akumulatoru", + "Rewrite Settings": "Pārrakstīšanas iestatījumi", + "Compact Storage": "Kompakta uzglabāšana", + "Compacting...\nTakes approx\n1 minute": "Blīvēšanas...\nAizņem aptuveni\n1 minūte", + "Second": "Otrais", + "Reset Settings": "Iestatījumu atiestatīšana", + "Turn Off": "Izslēgt", + "Date": "Datums", + "Right": "Tiesības", + "Sort Order": "Kārtot pēc kārtas", + "No Clocks Found": "Nav atrasti pulksteņi", + "Reset to Defaults": "Atiestatīt noklusējuma iestatījumus", + "No app has settings": "Nevienā lietotnē nav iestatījumu", + "ALARM": "ALARM", + "Widgets": "Logrīki", + "off": "izslēgts", + "Invalid settings": "Nederīgi iestatījumi", + "Month": "Mēnesis", + "Side": "Sānu", + "Reset": "Atiestatīt", + "Reset All": "Atiestatīt visu", + "Hours": "Stundas", + "Repeat": "Atkārtojiet", + "Enabled": "Ieslēgts", + "Settings": "Iestatījumi", + "Message": "Ziņa", + "Minutes": "Protokols", + "App Settings": "Lietotņu iestatījumi", + "System": "Sistēma", + "Locale": "Vietne", + "Theme": "Tēma", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Akumulatora saplacināšana - tas var aizņemt vairākas stundas.\nIlgi nospiediet pogu, lai atceltu", + "Select Clock": "Izvēlieties pulksteni", + "Set Time": "Iestatītais laiks", + "Vibrate": "Vibrēt", + "Reset all widgets": "Visu logrīku atiestatīšana", + "Hour": "Stunda", + "Left": "Kreisā", + "TIMER": "TIMER", + "Year": "Gads", + "on": "vietnē", + "Alerts": "Brīdinājumi", + "Delete": "Dzēst", + "Whitelist": "Baltais saraksts", + "Messages": "Ziņojumi", + "Disable": "Atslēgt", + "Hide": "Paslēpt", + "Show": "Rādīt", + "On": "Uz", + "Factory Reset": "Rūpnīcas atiestatīšana", + "Error in settings": "Kļūda iestatījumos", + "Ok": "Labi", + "Yes": "Jā", + "No": "Nē", + "Back": "Atpakaļ", + "Off": "Izslēgts" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/pl_PL.json b/lang/pl_PL.json new file mode 100644 index 000000000..b83d72600 --- /dev/null +++ b/lang/pl_PL.json @@ -0,0 +1,163 @@ +{ + "//": "Polish language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Nowy Alarm", + "(repeat)": "(powtórzenie)", + "Connected": "Podłączony", + "Timer": "Timer", + "Alarm": "Alarm", + "New Timer": "Nowy zegar", + "Sleep": "Sen", + "Save": "Zapisz", + "circle 1": "krąg 1", + "circle 3": "krąg 3", + "circle count": "liczenie okręgów", + "week": "tydzień", + "circle 2": "krąg 2", + "Keep Msgs": "Keep Msgs", + "weather circle": "koło klimatyczne", + "circle 4": "krąg 4", + "heartrate": "częstość akcji serca", + "Heartrate": "Heartrate", + "maximum": "maksimum", + "min. confidence": "min. pewność siebie", + "valid period": "okres ważności", + "distance goal": "cel odległościowy", + "Circle": "Koło", + "step length": "długość kroku", + "Steps": "Kroki", + "show widgets": "wyświetlać widżety", + "steps": "kroki", + "battery warn": "ostrzeżenie o akumulatorze", + "minimum": "minimum", + "data": "dane", + "color": "kolor", + "goal": "bramka", + "Auto snooze": "Automatyczna drzemka", + "TAP right top/bottom": "TAP prawy górny/dolny", + "Font": "Czcionka", + "Launcher Settings": "Ustawienia programu uruchamiającego", + "Mark Unread": "Zaznacz nieprzeczytane", + "Loading": "Ładowanie", + "Vector font size": "Rozmiar czcionki wektorowej", + "Show clocks": "Pokaż zegary", + "App Source\nNot found": "Źródło aplikacji\nNie znaleziono", + "colorize icon": "ubarwiać ikonę", + "Delete all messages": "Usuń wszystkie wiadomości", + "No Messages": "Brak komunikatów", + "Delete All Messages": "Usuń wszystkie wiadomości", + "Are you sure": "Czy jesteś pewien, że", + "View Message": "Wyświetl wiadomość", + "Music": "Muzyka", + "Record Run": "Rekordowy bieg", + "Bluetooth": "Bluetooth", + "Unread timer": "Nieprzeczytany zegar", + "Quiet Mode": "Tryb cichy", + "Make Connectable": "Spraw, aby można było się połączyć", + "Utils": "Narzędzia", + "Beep": "Beep", + "Apps": "Aplikacje", + "Piezo": "Piezo", + "BLE": "BLE", + "LCD": "LCD", + "Vibration": "Wibracje", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: WYJŚCIE", + "Foreground": "Foreground", + "Light BW": "Światło BW", + "HID": "HID", + "Dark BW": "Ciemna BW", + "Customize": "Dostosuj", + "Passkey BETA": "Passkey BETA", + "Background": "Tło", + "Background 2": "Tło 2", + "Highlight BG": "Podświetlenie BG", + "Foreground 2": "Nowa wiedza 2", + "Highlight FG": "Highlight FG", + "LCD Brightness": "Jasność LCD", + "Wake on Touch": "Wake on Touch", + "LCD Timeout": "LCD Timeout", + "Remove": "Usuń", + "Wake on Twist": "Wake on Twist", + "Wake on BTN3": "Wake na BTN3", + "Wake on BTN2": "Wake na BTN2", + "Connect device\nto add to\nwhitelist": "Podłącz urządzenie\ndodać do\nwhitelist", + "Wake on BTN1": "Wake na BTN1", + "Add Device": "Dodaj urządzenie", + "Programmable": "Programowalna strona", + "Wake on FaceUp": "Wake on FaceUp", + "Clock Style": "Styl zegara", + "Twist Threshold": "Próg skrętu", + "Time Zone": "Strefa czasowa", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Utilities": "Narzędzia", + "Debug Info": "Debug Info", + "This will remove everything": "To spowoduje usunięcie wszystkiego", + "Compact Storage": "Kompaktowe przechowywanie", + "Flatten Battery": "Spłaszcz baterię", + "Log": "Dziennik Ustaw", + "Rewrite Settings": "Ustawienia przepisywania", + "Storage": "Przechowywanie", + "Reset Settings": "Resetuj ustawienia", + "Turn Off": "Wyłączyć", + "Minute": "Minuta", + "Stay Connectable": "Pozostań w kontakcie", + "Date": "Data", + "App Settings": "Ustawienia aplikacji", + "No app has settings": "Żadna aplikacja nie ma ustawień", + "Connectable": "Możliwość podłączenia", + "Year": "Rok", + "Second": "Drugi", + "No Clocks Found": "Nie znaleziono zegarów", + "Hour": "Godzina", + "Reset to Defaults": "Resetuj do ustawień domyślnych", + "Compacting...\nTakes approx\n1 minute": "Zagęszczanie...\nTrwa ok.\n1 minuta", + "Reset all widgets": "Wyzeruj wszystkie widżety", + "Right": "Prawo", + "Side": "Strona", + "TIMER": "TIMER", + "Sort Order": "Kolejność sortowania", + "Reset": "Reset", + "Invalid settings": "Nieprawidłowe ustawienia", + "Month": "Miesiąc", + "Widgets": "Widżety", + "Left": "Lewa", + "on": "na stronie", + "Delete": "Usuń", + "Hours": "Godziny", + "ALARM": "ALARM", + "Message": "Wiadomość", + "off": "poza", + "Reset All": "Resetuj wszystko", + "Minutes": "Protokół", + "Repeat": "Powtórz", + "Enabled": "Włączone", + "Vibrate": "Vibrate", + "Whitelist": "Whitelist", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Rozładowanie baterii - może to trwać godzinami.\nNaciśnij długo przycisk, aby anulować", + "Select Clock": "Wybierz zegar", + "Theme": "Temat", + "Locale": "Locale", + "Error in settings": "Błąd w ustawieniach", + "Disable": "Wyłącz", + "Settings": "Ustawienia", + "On": "Na stronie", + "Hide": "Ukryj", + "Messages": "Wiadomości", + "Factory Reset": "Reset fabryczny", + "System": "System", + "Alerts": "Wpisy", + "Set Time": "Ustawianie czasu", + "Ok": "Ok", + "Yes": "Tak", + "Show": "Pokaż", + "No": "Nie", + "Back": "Powrót", + "Off": "Poza" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/ro_RO.json b/lang/ro_RO.json new file mode 100644 index 000000000..78ed27579 --- /dev/null +++ b/lang/ro_RO.json @@ -0,0 +1,163 @@ +{ + "//": "Romanian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Alarma nouă", + "New Timer": "Noul cronometru", + "(repeat)": "(repetă)", + "Save": "Salvați", + "Auto snooze": "Repaus automat", + "Timer": "Cronometru", + "Alarm": "Alarma", + "circle 2": "cercul 2", + "circle 1": "cercul 1", + "Sleep": "Somnul", + "week": "săptămâna", + "circle count": "număr de cercuri", + "Connected": "Conectat", + "steps": "etape", + "battery warn": "avertizare baterie", + "heartrate": "ritmul cardiac", + "show widgets": "arată widget-uri", + "Keep Msgs": "Păstrați Msgs", + "circle 4": "cercul 4", + "circle 3": "cercul 3", + "minimum": "minim", + "Heartrate": "Ritmul cardiac", + "min. confidence": "încredere minimă", + "distance goal": "obiectivul de distanță", + "Steps": "Pași", + "color": "culoare", + "Circle": "Cerc", + "step length": "lungimea pasului", + "data": "date", + "maximum": "maxim", + "valid period": "perioada de valabilitate", + "weather circle": "cercul meteorologic", + "goal": "obiectiv", + "App Source\nNot found": "Sursa aplicației\nNu a fost găsit", + "Vector font size": "Dimensiunea fontului vectorial", + "colorize icon": "colorați pictograma", + "Show clocks": "Arată ceasuri", + "Loading": "Încărcare", + "Launcher Settings": "Setări lansator", + "Font": "Font", + "TAP right top/bottom": "TAP dreapta sus/jos", + "View Message": "Vezi mesajul", + "LCD": "LCD", + "Beep": "Beep", + "Vibration": "Vibrații", + "Bluetooth": "Bluetooth", + "Utils": "Utils", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "BTNs 1:startlap 2:exit 3:reset": "BTN-uri 1:startlap 2:exit 3:reset", + "Piezo": "Piezoelectrice", + "Customize": "Personalizați", + "Delete all messages": "Ștergeți toate mesajele", + "Apps": "Aplicații", + "Are you sure": "Ești sigur că", + "Music": "Muzică", + "Record Run": "Record Run", + "Mark Unread": "Marcați Unread", + "Foreground": "Prim-plan", + "Foreground 2": "Prim-plan 2", + "Background": "Fond", + "Passkey BETA": "Passkey BETA", + "Light BW": "Lumină BW", + "Dark BW": "Dark BW", + "Make Connectable": "Asigurați conectabilitatea", + "HID": "HID", + "Delete All Messages": "Ștergeți toate mesajele", + "No Messages": "Nu există mesaje", + "Unread timer": "Cronometru necitit", + "Quiet Mode": "Modul silențios", + "Programmable": "Programabil", + "BLE": "BLE", + "Highlight BG": "Evidențiați BG", + "Background 2": "Context 2", + "Highlight FG": "Evidențiați FG", + "Remove": "Eliminați", + "Connect device\nto add to\nwhitelist": "Conectați dispozitivul\npentru a adăuga la\nlista albă", + "LCD Brightness": "Luminozitatea LCD", + "Wake on FaceUp": "Trezirea pe FaceUp", + "LCD Timeout": "Timeout LCD", + "Add Device": "Adăugați dispozitiv", + "Wake on Touch": "Trezire la atingere", + "Wake on BTN1": "Trezirea pe BTN1", + "Wake on BTN3": "Trezirea pe BTN3", + "Debug Info": "Informații de depanare", + "Log": "Jurnal", + "Clock Style": "Stilul ceasului", + "Utilities": "Utilități", + "Wake on Twist": "Trezirea pe Twist", + "Wake on BTN2": "Trezirea pe BTN2", + "Twist Threshold": "Pragul de răsucire", + "Time Zone": "Fusul orar", + "Twist Timeout": "Twist Timeout", + "Twist Max Y": "Twist Max Y", + "Minute": "Minute", + "Month": "Luna", + "Second": "Al doilea", + "Hour": "Ora", + "Flatten Battery": "Aplatizare baterie", + "Storage": "Depozitare", + "Compact Storage": "Depozitare compactă", + "Reset Settings": "Resetare setări", + "Rewrite Settings": "Resetare Setări de rescriere", + "Stay Connectable": "Rămâneți conectați", + "No Clocks Found": "Nu s-au găsit ceasuri", + "Turn Off": "Oprire", + "This will remove everything": "Acest lucru va elimina totul", + "App Settings": "Setări aplicație", + "Year": "Anul", + "Connectable": "Conectabil", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Baterie de aplatizare - acest lucru poate dura ore.\nApăsați lung butonul pentru a anula", + "Compacting...\nTakes approx\n1 minute": "Compactarea...\nDurează aproximativ\n1 minut", + "Reset to Defaults": "Resetare la valorile implicite", + "Reset": "Resetare", + "Widgets": "Widgeturi", + "Reset all widgets": "Resetați toate widget-urile", + "No app has settings": "Nici o aplicație nu are setări", + "Left": "Stânga", + "Side": "Lateral", + "Date": "Data", + "Sort Order": "Ordinea de sortare", + "Invalid settings": "Setări nevalabile", + "Right": "Dreapta", + "Reset All": "Resetați toate", + "on": "pe", + "TIMER": "TIMER", + "off": "off", + "Message": "Mesaj", + "Vibrate": "Vibrare", + "ALARM": "ALARMĂ", + "Delete": "Ștergeți", + "Repeat": "Repetați", + "Enabled": "Activat", + "Settings": "Setări", + "Minutes": "Proces-verbal", + "Hours": "Ore", + "Theme": "Tema", + "Messages": "Mesaje", + "Hide": "Ascundeți", + "Alerts": "Alerte", + "Error in settings": "Eroare în setări", + "System": "Sistem", + "Disable": "Dezactivați", + "Set Time": "Set Time", + "Factory Reset": "Resetare din fabrică", + "Yes": "Da", + "Select Clock": "Selectați ceasul", + "Whitelist": "Lista albă", + "Locale": "Locale", + "Ok": "Ok", + "Show": "Arată", + "On": "Pe", + "No": "Nu", + "Off": "Off", + "Back": "Înapoi" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/sk_SK.json b/lang/sk_SK.json new file mode 100644 index 000000000..6d7de7398 --- /dev/null +++ b/lang/sk_SK.json @@ -0,0 +1,163 @@ +{ + "//": "Slovak language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Alarm": "Nový alarm", + "New Timer": "Nový časovač", + "(repeat)": "(opakovanie)", + "Alarm": "Alarm", + "Save": "Uložiť", + "week": "týždeň", + "circle count": "počet kruhov", + "Timer": "Časovač", + "Sleep": "Spánok", + "circle 1": "okruh 1", + "Connected": "Pripojené", + "Auto snooze": "Automatické odloženie", + "circle 4": "kruh 4", + "heartrate": "srdcová frekvencia", + "steps": "kroky", + "circle 2": "kruh 2", + "Keep Msgs": "Uchovávajte správy Msgs", + "goal": "cieľ", + "circle 3": "kruh 3", + "distance goal": "cieľ vzdialenosti", + "show widgets": "zobraziť widgety", + "maximum": "maximum", + "minimum": "minimálne", + "Circle": "Kruh", + "valid period": "obdobie platnosti", + "Steps": "Kroky", + "data": "údaje", + "min. confidence": "min. dôvera", + "battery warn": "upozornenie na batériu", + "Heartrate": "Srdcová frekvencia", + "weather circle": "kruh počasia", + "step length": "dĺžka kroku", + "colorize icon": "vyfarbenie ikony", + "color": "farba", + "TAP right top/bottom": "TAP vpravo hore/dole", + "App Source\nNot found": "Zdroj aplikácie\nNenájdené", + "Loading": "Načítavanie", + "Font": "Písmo", + "Unread timer": "Neprečítaný časovač", + "Music": "Hudba", + "Mark Unread": "Označiť neprečítané", + "View Message": "Zobraziť správu", + "Launcher Settings": "Nastavenia spúšťača", + "Delete All Messages": "Odstránenie všetkých správ", + "Vector font size": "Veľkosť vektorového písma", + "Delete all messages": "Odstránenie všetkých správ", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Are you sure": "Ste si istý, že", + "Show clocks": "Zobraziť hodiny", + "No Messages": "Žiadne správy", + "Record Run": "Rekordný beh", + "Apps": "Aplikácie", + "Piezo": "Piezoelektrické zariadenie", + "LCD": "LCD", + "Programmable": "Programovateľné", + "Utils": "Utils", + "Foreground 2": "Popredie 2", + "HID": "HID", + "Vibration": "Vibrácie", + "Make Connectable": "Urobiť pripojiteľné", + "Bluetooth": "Bluetooth", + "Quiet Mode": "Tichý režim", + "Beep": "Pípnutie", + "Passkey BETA": "Passkey BETA", + "Dark BW": "Tmavá BW", + "Light BW": "Light BW", + "Foreground": "Prvé miesto", + "Customize": "Prispôsobenie stránky", + "Background": "Pozadie", + "BLE": "BLE", + "LCD Brightness": "Jas LCD displeja", + "LCD Timeout": "Časový limit LCD displeja", + "Add Device": "Pridať zariadenie", + "Connect device\nto add to\nwhitelist": "Pripojenie zariadenia\npridať do\nwhitelist", + "Remove": "Odstránenie stránky", + "Highlight FG": "Zvýraznenie FG", + "Wake on Touch": "Prebudenie na dotyk", + "Background 2": "Pozadie 2", + "Wake on BTN1": "Prebuďte sa na BTN1", + "Wake on BTN2": "Prebuďte sa na BTN2", + "Wake on BTN3": "Prebuďte sa na BTN3", + "Highlight BG": "Zvýraznenie BG", + "Wake on FaceUp": "Prebudiť sa na FaceUp", + "Wake on Twist": "Prebudiť sa na Twiste", + "Utilities": "Komunálne služby", + "Rewrite Settings": "Nastavenia prepísania", + "Log": "Prihlásiť sa", + "Debug Info": "Informácie o ladení", + "Storage": "Úložisko", + "Compact Storage": "Kompaktné úložisko", + "Twist Max Y": "Twist Max Y", + "Twist Timeout": "Twist Timeout", + "Time Zone": "Časové pásmo", + "Reset Settings": "Obnovenie nastavení", + "Clock Style": "Štýl hodín", + "Compacting...\nTakes approx\n1 minute": "Zhutňovanie...\nTrvá približne\n1 minúta", + "Twist Threshold": "Prahová hodnota Twist", + "Stay Connectable": "Zostaňte pripojení", + "Flatten Battery": "Sploštenie batérie", + "This will remove everything": "Tým sa odstráni všetko.", + "Connectable": "Pripojiteľné", + "Turn Off": "Vypnúť", + "Reset to Defaults": "Obnovenie predvolených nastavení", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Sploštenie batérie - môže trvať niekoľko hodín.\nDlhým stlačením tlačidla zrušíte", + "No Clocks Found": "Nenašli sa žiadne hodiny", + "Side": "Strana", + "Date": "Dátum", + "Second": "Druhý", + "Hour": "Hodina", + "Minute": "Minúta", + "Left": "Vľavo", + "Year": "Rok", + "App Settings": "Nastavenia aplikácie", + "Widgets": "Widgety", + "Month": "Mesiac", + "No app has settings": "Žiadna aplikácia nemá nastavenia", + "Invalid settings": "Neplatné nastavenia", + "Sort Order": "Poradie triedenia", + "Reset All": "Obnoviť všetky", + "Reset": "Obnovenie", + "TIMER": "ČASOVAČ", + "Right": "Vpravo", + "Reset all widgets": "Obnovenie všetkých widgetov", + "ALARM": "ALARM", + "Minutes": "Zápisnica", + "Delete": "Odstrániť", + "off": "mimo", + "on": "na stránke .", + "Repeat": "Opakujte", + "System": "Systém", + "Enabled": "Povolené", + "Vibrate": "Vibrovať", + "Hours": "Hodiny", + "Settings": "Nastavenia", + "Select Clock": "Vybrať hodiny", + "Alerts": "Upozornenia", + "Message": "Správa", + "Theme": "Téma", + "Set Time": "Nastavený čas", + "Locale": "Lokalita", + "Disable": "Zakázať", + "Messages": "Správy", + "Error in settings": "Chyba v nastaveniach", + "Hide": "Skryť", + "Show": "Zobraziť", + "On": "Na stránke", + "Whitelist": "Biela listina", + "Yes": "Áno", + "Ok": "Ok", + "Factory Reset": "Obnovenie továrenského nastavenia", + "No": "Nie", + "Off": "Vypnuté", + "Back": "Späť" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/sl_SL.json b/lang/sl_SL.json new file mode 100644 index 000000000..bcf873bdd --- /dev/null +++ b/lang/sl_SL.json @@ -0,0 +1,163 @@ +{ + "//": "Slovenian language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "Alarm": "Alarm", + "(repeat)": "(ponovitev)", + "New Timer": "Nov časovnik", + "New Alarm": "Nov alarm", + "Timer": "Časomer", + "Save": "Shrani", + "Connected": "Povezano", + "Keep Msgs": "Hranite sporočila Msgs", + "circle 4": "krog 4", + "circle 3": "krog 3", + "Auto snooze": "Samodejni dremež", + "circle 1": "krog 1", + "week": "teden", + "circle 2": "krog 2", + "Sleep": "Spanje", + "circle count": "štetje krogov", + "steps": "koraki", + "show widgets": "prikaži gradnike", + "heartrate": "srčni utrip", + "valid period": "veljavno obdobje", + "maximum": "največ", + "battery warn": "opozorilo o bateriji", + "weather circle": "vremenski krog", + "data": "podatki", + "goal": "cilj", + "step length": "dolžina koraka", + "minimum": "najmanjši", + "min. confidence": "min. zaupanje", + "Heartrate": "Srčni utrip", + "distance goal": "ciljna razdalja", + "Steps": "Koraki", + "color": "barva", + "colorize icon": "obarvanje ikone", + "App Source\nNot found": "Vir aplikacije\nNi najden", + "Show clocks": "Prikaži ure", + "TAP right top/bottom": "TAP desno zgoraj/spodaj", + "View Message": "Ogled sporočila", + "Circle": "Krog", + "Launcher Settings": "Nastavitve zaganjalnika", + "Vector font size": "Velikost vektorske pisave", + "Font": "Pisava", + "Loading": "Nalaganje", + "Delete all messages": "Brisanje vseh sporočil", + "No Messages": "Brez sporočil", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "Are you sure": "Ste prepričani, da", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT", + "Mark Unread": "Označi neprebrano", + "Utils": "Utils", + "Record Run": "Rekordna vožnja", + "Delete All Messages": "Brisanje vseh sporočil", + "Unread timer": "Neprebrani časovnik", + "Music": "Glasba", + "LCD": "LCD", + "Apps": "Aplikacije", + "Bluetooth": "Bluetooth", + "Dark BW": "Temna BW", + "Vibration": "Vibracije", + "Quiet Mode": "Tihi način", + "Beep": "Beep", + "Passkey BETA": "Passkey BETA", + "Piezo": "Piezo", + "HID": "HID", + "Make Connectable": "Povežite se", + "BLE": "BLE", + "Programmable": "Programirljiv", + "Light BW": "Light BW", + "Background": "Ozadje", + "Customize": "Prilagodite", + "Background 2": "Ozadje 2", + "LCD Brightness": "Svetlost LCD-ja", + "Wake on BTN2": "Zbudi se na BTN2", + "Wake on BTN1": "Zbudite se na BTN1", + "LCD Timeout": "Časovna omejitev LCD", + "Twist Max Y": "Twist Max Y", + "Wake on Twist": "Prebudite se na Twist", + "Twist Threshold": "Prag zasuka", + "Foreground 2": "V ospredju 2", + "Foreground": "Novo okolje", + "Remove": "Odstranite", + "Time Zone": "Časovni pas", + "Wake on BTN3": "Wake na BTN3", + "Highlight FG": "Poudarite FG", + "Wake on Touch": "Zbujanje na dotik", + "Clock Style": "Stil ure", + "Highlight BG": "Poudarite BG", + "Add Device": "Dodajanje naprave", + "Connect device\nto add to\nwhitelist": "Povežite napravo\nza dodajanje v\nbeli seznam", + "Utilities": "Storitve", + "Wake on FaceUp": "Prebudite se v aplikaciji FaceUp", + "Compact Storage": "Kompaktno shranjevanje", + "Log": "Dnevnik", + "Debug Info": "Informacije o odpravljanju napak", + "Turn Off": "Izklopite", + "Flatten Battery": "Sploščena baterija", + "Reset to Defaults": "Ponastavitev na privzete nastavitve", + "Reset Settings": "Ponastavitev nastavitev", + "Twist Timeout": "Twist Timeout", + "This will remove everything": "To bo odstranilo vse", + "Rewrite Settings": "Nastavitve prepisovanja", + "Storage": "Shranjevanje", + "Compacting...\nTakes approx\n1 minute": "Zgoščevanje...\nVzame približno\n1 minuta", + "No Clocks Found": "Ure niso bile najdene", + "Stay Connectable": "Ostanite povezljivi", + "Minute": "Minuta", + "Connectable": "Povezljivost", + "Hour": "Ura", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Ploščati baterijo - to lahko traja več ur.\nDolgo pritisnite gumb za preklic", + "Second": "Drugi", + "Month": "Mesec", + "Date": "Datum", + "ALARM": "ALARM", + "Reset all widgets": "Ponastavitev vseh gradnikov", + "Reset All": "Ponastavi vse", + "TIMER": "TIMER", + "Widgets": "Pripomočki", + "Hours": "Ure", + "Minutes": "Zapisnik", + "Year": "Leto", + "No app has settings": "Nobena aplikacija nima nastavitev", + "App Settings": "Nastavitve aplikacije", + "Repeat": "Ponovite", + "Invalid settings": "Neveljavne nastavitve", + "Enabled": "Omogočeno", + "Reset": "Ponastavitev", + "off": "izklop", + "Side": "Stran", + "Sort Order": "Vrstni red", + "Left": "Leva stran", + "Right": "Desno", + "on": "na spletni strani .", + "Theme": "Tema", + "Locale": "Lokacija", + "Alerts": "Opozorila", + "Select Clock": "Izberite uro", + "System": "Sistem", + "Settings": "Nastavitve", + "Set Time": "Čas nastavitve", + "Whitelist": "Bela lista", + "Message": "Sporočilo", + "Vibrate": "Vibriranje", + "Delete": "Izbriši", + "Error in settings": "Napaka v nastavitvah", + "Messages": "Sporočila", + "Disable": "Onemogočite", + "Show": "Prikaži", + "Ok": "Ok", + "On": "Na spletni strani", + "Hide": "Skrij", + "Factory Reset": "Ponastavitev tovarniške nastavitve", + "Yes": "Da", + "No": "Ne", + "Off": "Izklopljeno", + "Back": "Nazaj" + }, + "alarm": { + "//": "App-specific overrides" + } +} \ No newline at end of file diff --git a/lang/ja_JA.json b/lang/unicode-based/ja_JA.json similarity index 100% rename from lang/ja_JA.json rename to lang/unicode-based/ja_JA.json diff --git a/lang/zh_ZH.json b/lang/unicode-based/zh_ZH.json similarity index 100% rename from lang/zh_ZH.json rename to lang/unicode-based/zh_ZH.json From 02aeaff86bf14ad3b29e134060791ac962f9e8eb Mon Sep 17 00:00:00 2001 From: storm64 Date: Fri, 11 Feb 2022 09:29:02 +0100 Subject: [PATCH 08/17] sleeplog: Add Sleep Log App This app logs and displays the four following states: _unknown, not worn, awake, sleeping_ It derived from the SleepPhaseAlarm and uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments ([ESS](https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en)) and the internal temperature to decide _sleeping_ or _not worn_ when the watch is resting. --- apps/sleeplog/ChangeLog | 1 + apps/sleeplog/README.md | 142 +++++++++++++++++++++++++ apps/sleeplog/app-icon.js | 1 + apps/sleeplog/app.js | 194 ++++++++++++++++++++++++++++++++++ apps/sleeplog/app.png | Bin 0 -> 698 bytes apps/sleeplog/boot.js | 137 ++++++++++++++++++++++++ apps/sleeplog/lib.js | 150 ++++++++++++++++++++++++++ apps/sleeplog/metadata.json | 28 +++++ apps/sleeplog/screenshot1.png | Bin 0 -> 4074 bytes apps/sleeplog/screenshot2.png | Bin 0 -> 3497 bytes apps/sleeplog/screenshot3.png | Bin 0 -> 4111 bytes apps/sleeplog/settings.js | 118 +++++++++++++++++++++ 12 files changed, 771 insertions(+) create mode 100644 apps/sleeplog/ChangeLog create mode 100644 apps/sleeplog/README.md create mode 100644 apps/sleeplog/app-icon.js create mode 100644 apps/sleeplog/app.js create mode 100644 apps/sleeplog/app.png create mode 100644 apps/sleeplog/boot.js create mode 100644 apps/sleeplog/lib.js create mode 100644 apps/sleeplog/metadata.json create mode 100644 apps/sleeplog/screenshot1.png create mode 100644 apps/sleeplog/screenshot2.png create mode 100644 apps/sleeplog/screenshot3.png create mode 100644 apps/sleeplog/settings.js diff --git a/apps/sleeplog/ChangeLog b/apps/sleeplog/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/sleeplog/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/sleeplog/README.md b/apps/sleeplog/README.md new file mode 100644 index 000000000..24f47c23c --- /dev/null +++ b/apps/sleeplog/README.md @@ -0,0 +1,142 @@ +# Sleep Log + +This app logs and displays the four following states: +_unknown, not worn, awake, sleeping_ +It derived from the [SleepPhaseAlarm](https://banglejs.com/apps/#sleepphasealarm) and uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments ([ESS](https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en)) and the internal temperature to decide _sleeping_ or _not worn_ when the watch is resting. + +#### Operating Principle +* __ESS calculation__ + The accelerometer polls values with 12.5Hz. On each poll the magnitude value is saved. When 13 values are collected, every 1.04 seconds, the standard deviation over this values is calculated. + Is the calculated standard deviation lower than the "no movement" threshold (__NoMoThresh__) a "no movement" counter is incremented. Each time the "no movement" threshold is reached the "no movement" counter will be reset. + When the "no movement" counter reaches the sleep threshold the watch is considered as resting. (The sleep threshold is calculated from the __MinDuration__ setting, Example: _sleep threshold = MinDuration * 60 / calculation interval => 10min * 60s/min / 1.04s ~= 576,9 rounded up to 577_) + To check if a resting watch indicates as sleeping, the internal temperature must be greater than the temperature threshold (__TempThresh__). Otherwise the watch is considered as not worn. +* __True Sleep__ + The true sleep value is a simple addition of all registert sleeping periods. +* __Consecutive Sleep__ + In addition the consecutive sleep value tries to predict the complete time you were asleep, even the light sleeping phases with registered movements. All periods after a sleeping period will be summarized til the first following non sleeping period that is longer then the maximal awake duration (__MaxAwake__). If this sum is lower than the minimal consecutive sleep duration (__MinConsec__) it is not considered, otherwise it will be added to the consecutive sleep value. +* __Logging__ + To minimize the log size only a changed state is logged. + +--- +### Control +--- +* __Swipe__ + Swipe left/right to display the previous/following day. +* __Touch__ / __BTN__ + Touch the screen to open the settings menu to exit or change settings. + +--- +### Settings +--- +* __BreakTod__ break at time of day + _0_ / _1_ / _..._ / __10__ / _..._ / _12_ + Change time of day on wich the lower graph starts and the upper graph ends. +* __MaxAwake__ maximal awake duration + _15min_ / _20min_ / _..._ / __60min__ / _..._ / _120min_ + Adjust the maximal awake duration upon the exceeding of which aborts the consecutive sleep period. +* __MinConsec__ minimal consecutive sleep duration + _15min_ / _20min_ / _..._ / __30min__ / _..._ / _120min_ + Adjust the minimal consecutive sleep duration that will be considered for the consecutive sleep value. +* __TempThresh__ temperature threshold + _20°C_ / _20.5°C_ / _..._ / __25°C__ / _..._ / _40°C_ + The internal temperature must be greater than this threshold to log _sleeping_, otherwise it is _not worn_. +* __NoMoThresh__ no movement threshold + _0.006_ / _0.007_ / _..._ / __0.012__ / _..._ / _0.020_ + The standard deviation over the measured values needs to be lower then this threshold to count as not moving. + The defaut threshold value worked best for my watch. A threshold value below 0.008 may get triggert by noise. +* __MinDuration__ minimal no movement duration + _5min_ / _6min_ / _..._ / __10min__ / _..._ / _15min_ + If no movement is detected for this duration, the watch is considered as resting. +* __Enabled__ + __on__ / _off_ + En-/Disable the service (all background activities). _Saves battery, but might make this app useless._ +* __Logfile__ + __default__ / _off_ + En-/Disable logging by setting the logfile to _sleeplog.log_ / _undefined_. + If the logfile has been customized it is displayed with _custom_. + +--- +### Global Object and Module Functions +--- +For easy access from the console or other apps the following parameters, values and functions are noteworthy: +``` +>global.sleeplog +={ + enabled: true, // bool / service status indicator + logfile: "sleeplog.log", // string / used logfile + resting: false, // bool / indicates if the watch is resting + status: 2, // int / actual status: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping + firstnomodate: 1644435877595, // number / Date.now() from first recognised no movement + stop: function () { ... }, // funct / stops the service until the next load() + start: function () { ... }, // funct / restarts the service + ... + } + +>require("sleeplog") +={ + setEnabled: function (enable, logfile) { ... }, + // en-/disable the service and/or logging + // * enable / bool / service status to change to + // * logfile / bool or string + // - true = enables logging to "sleeplog.log" + // - "some_file.log" = enables logging to "some_file.log" + // - false = disables logging + // returns: bool or undefined + // - true = changes executed + // - false = no changes needed + // - undefined = no global.sleeplog found + readLog: function (since, until) { ... }, + // read the raw log data for a specific time period + // * since / Date or number / startpoint of period + // * until / Date or number / endpoint of period + // returns: array + // * [[number, int, string], [...], ... ] / sorting: latest first + // - number // timestamp in ms + // - int // status: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping + // - string // additional information + // * [] = no data available or global.sleeplog found + getReadableLog: function (printLog, since, until) { ... } + // read the log data as humanreadable string for a specific time period + // * since / Date or number / startpoint of period + // * until / Date or number / endpoint of period + // returns: string + // * "{substring of ISO date} - {status} for {duration}min\n...", sorting: latest last + // * undefined = no data available or global.sleeplog found + restoreLog: function (logfile) { ... } + // eliminate some errors inside a specific logfile + // * logfile / string / name of the logfile that will be restored + // returns: int / number of changes that were made + reinterpretTemp: function (logfile, tempthresh) { ... } + // reinterpret worn status based on given temperature threshold + // * logfile / string / name of the logfile + // * tempthresh / float / new temperature threshold + // returns: int / number of changes that were made + } +``` + +--- +### Worth Mentioning +--- +#### To do list +* Send the logged information to Gadgetbridge. + _(For now I have no idea how to achieve this, help is appreciated.)_ +* Calculate and display overall sleep statistics. + +#### Requests, Bugs and Feedback +Please leave requests and bug reports by raising an issue at [github.com/storm64/BangleApps](https://github.com/storm64/BangleApps) or send me a [mail](mailto:banglejs@storm64.de). + +#### Creator +Storm64 ([Mail](mailto:banglejs@storm64.de), [github](https://github.com/storm64)) + +#### Contributors +nxdefiant ([github](https://github.com/nxdefiant)) + +#### Attributions +* ESS calculation based on nxdefiant interpretation of the following publication by: + Marko Borazio, Eugen Berlin, Nagihan Kücükyildiz, Philipp M. Scholl and Kristof Van Laerhoven + [Towards a Benchmark for Wearable Sleep Analysis with Inertial Wrist-worn Sensing Units](https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en), + ICHI 2014, Verona, Italy, IEEE Press, 2014. +* Icons used in this app are from [https://icons8.com](https://icons8.com). + +#### License +[MIT License](LICENSE) diff --git a/apps/sleeplog/app-icon.js b/apps/sleeplog/app-icon.js new file mode 100644 index 000000000..36b890491 --- /dev/null +++ b/apps/sleeplog/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4cA///4H8m2ZtVN/nl1P9vXXBoJT/AGcbtuwCJ3btu2CBsG7fZ23ACJk2CIXYCBcB2w1C7YRO/oR/CKp9CCIJ9MUIQRBUI8CpMgYpwRGdJQRGABQRUhdtCJ9btugCJsiM4O0kmSpICFCKJUCCMpZDCJx9CCJsyBIQRxBpACDyAR/CJZeCAA8BCPIA/AFQ")) diff --git a/apps/sleeplog/app.js b/apps/sleeplog/app.js new file mode 100644 index 000000000..cbfad4bda --- /dev/null +++ b/apps/sleeplog/app.js @@ -0,0 +1,194 @@ +// set storage and define settings +var storage = require("Storage"); +var breaktod, maxawake, minconsec; + +// read required settings from storage +function readSettings(settings) { + breaktod = settings.breaktod || (settings.breaktod === 0 ? 0 : 10); // time of day when to start/end graphs + maxawake = settings.maxawake || 36E5; // 60min in ms + minconsec = settings.minconsec || 18E5; // 30min in ms +} + +// define draw log function +function drawLog(topY, viewUntil) { + // set default view time + viewUntil = viewUntil || Date(); + + // define parameters + var statusValue = [0, 0.4, 0.6, 1]; // unknown, not worn, awake, sleeping, consecutive sleep + var statusColor = [0, 63488, 2016, 32799, 31]; // black, red, green, violet, blue + var period = 432E5; // 12h + var graphHeight = 18; + var labelHeight = 12; + var width = g.getWidth(); + var timestamp0 = viewUntil.valueOf() - period; + var y = topY + graphHeight; + + // read 12h wide log + var log = require("sleeplog").readLog(timestamp0, viewUntil.valueOf()); + + // format log array if not empty + if (log.length) { + // if the period goes into the future add unknown status at the beginning + if (viewUntil > Date()) log.unshift([Date().valueOf(), 0]); + + // check if the period goes earlier than logged data + if (log[log.length - 1][0] < timestamp0) { + // set time of last entry according to period + log[log.length - 1][0] = timestamp0; + } else { + // add entry with unknown status at the end + log.push([timestamp0, 0]); + } + + // remap each element to [status, relative beginning, relative end, duration] + log = log.map((element, index) => [ + element[1], + element[0] - timestamp0, + (log[index - 1] || [viewUntil.valueOf()])[0] - timestamp0, + (log[index - 1] || [viewUntil.valueOf()])[0] - element[0] + ]); + + // start with the oldest entry to build graph left to right + log.reverse(); + } + + // clear area + g.reset().clearRect(0, topY, width, y + labelHeight); + // draw x axis + g.drawLine(0, y + 1, width, y + 1); + // draw x label + var hours = period / 36E5; + var stepwidth = width / hours; + var startHour = 24 + viewUntil.getHours() - hours; + for (var x = 0; x < hours; x++) { + g.fillRect(x * stepwidth, y + 2, x * stepwidth, y + 4); + g.setFontAlign(-1, -1).setFont("6x8") + .drawString((startHour + x) % 24, x * stepwidth, y + 6); + } + + // define variables for sleep calculation + var consecutive = 0; + var output = [0, 0]; // [estimated, true] + var i, nosleepduration; + + // draw graph + log.forEach((element, index) => { + // set bar color depending on type + g.setColor(statusColor[consecutive ? 4 : element[0]]); + + // check for sleeping status + if (element[0] === 3) { + // count true sleeping hours + output[1] += element[3]; + // count duration of subsequent non sleeping periods + i = index + 1; + nosleepduration = 0; + while (log[i] !== undefined && log[i][0] < 3 && nosleepduration < maxawake) { + nosleepduration += log[i++][3]; + } + // check if counted duration lower than threshold to start/stop counting + if (log[i] !== undefined && nosleepduration < maxawake) { + // start counting consecutive sleeping hours + consecutive += element[3]; + // correct color to match consecutive sleeping + g.setColor(statusColor[4]); + } else { + // check if counted consecutive sleeping greater then threshold + if (consecutive >= minconsec) { + // write verified consecutive sleeping hours to output + output[0] += consecutive + element[3]; + } else { + // correct color to display a canceled consecutive sleeping period + g.setColor(statusColor[3]); + } + // stop counting consecutive sleeping hours + consecutive = 0; + } + } else { + // count durations of non sleeping periods for consecutive sleeping + if (consecutive) consecutive += element[3]; + } + + // calculate points + var x1 = Math.ceil(element[1] / period * width); + var x2 = Math.floor(element[2] / period * width); + var y2 = y - graphHeight * statusValue[element[0]]; + // draw bar + g.clearRect(x1, topY, x2, y); + g.fillRect(x1, y, x2, y2).reset(); + if (y !== y2) g.fillRect(x1, y2, x2, y2); + }); + + // clear variables + log = undefined; + + // return convert output into minutes + return output.map(value => value /= 6E4); +} + +// define draw night to function +function drawNightTo(prevDays) { + // calculate 10am of this or a previous day + var date = Date(); + date = Date(date.getFullYear(), date.getMonth(), date.getDate() - prevDays, breaktod); + + // get width + var width = g.getWidth(); + + // clear app area + g.clearRect(0, 24, width, width); + + // define variable for sleep calculation + var outputs = [0, 0]; // [estimated, true] + // draw log graphs and read outputs + drawLog(110, date).forEach( + (value, index) => outputs[index] += value); + drawLog(145, Date(date.valueOf() - 432E5)).forEach( + (value, index) => outputs[index] += value); + + // reduce date by 1s to ensure correct headline + date = Date(date.valueOf() - 1E3); + // draw headline, on red bg if service or loggging disabled + g.setColor(global.sleeplog && sleeplog.enabled && sleeplog.logfile ? g.theme.bg : 63488); + g.fillRect(0, 30, width, 66).reset(); + g.setFont("12x20").setFontAlign(0, -1); + g.drawString("Night to " + require('locale').dow(date, 1) + "\n" + + require('locale').date(date, 1), width / 2, 30); + + // draw outputs + g.reset(); // area: 0, 70, width, 105 + g.setFont("6x8").setFontAlign(-1, -1); + g.drawString("consecutive\nsleeping", 10, 70); + g.drawString("true\nsleeping", 10, 90); + g.setFont("12x20").setFontAlign(1, -1); + g.drawString(Math.floor(outputs[0] / 60) + "h " + + Math.floor(outputs[0] % 60) + "min", width - 10, 70); + g.drawString(Math.floor(outputs[1] / 60) + "h " + + Math.floor(outputs[1] % 60) + "min", width - 10, 90); +} + + +// define function to draw and setup UI +function startApp() { + readSettings(storage.readJSON("sleeplog.json", true) || {}); + drawNightTo(prevDays); + Bangle.setUI("leftright", (cb) => { + if (!cb) { + eval(storage.read("sleeplog.settings.js"))(startApp); + } else if (prevDays + cb >= -1) { + drawNightTo((prevDays += cb)); + } + }); +} + +// define day to display +var prevDays = 0; + +// setup app +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +// start app +startApp(); diff --git a/apps/sleeplog/app.png b/apps/sleeplog/app.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7f11f67bf96368c6c8994d43608a3c9ece108d GIT binary patch literal 698 zcmV;r0!96aP)>_62_vrVs7$x%)KEhY2bLH`8}|aP+4?loNZgNtQ$xdbF(5^0LHrv z*+n$Jo?TtG5znfDhWMwg>pnPhA64bntJ|$Z7122xCSpMsXp$@DCL257wkfKLqTb6Of7R0_aEmw-F2N`7O;DfXna3pU>Y z0M@gs%k^p^C2$Ye0)950Efu{>yq>Zp9zw{#ps}8TLDSP+NXwZdb@vg%IRJ!BR2F1v ztrChl1B^4EU9T=yX`_vGYC;HyCw zeu2ImiyxT3@-F?QwZq&%vuyl1->))54uWLrwWsTPj9&& zHGOc%+hA@$WdZo^)AJ3j-3%Zq5XJ^%YOO*nb_#d~{AfH&XzjFIc>XCYfq&KIZSXsZ zKc4t(wAhPlZ!AdKpR1K@o92-}iAUamQ3?G^crTVCpMl80uo-y+Mwhu^{gIh`P)0rj gk%5Sah=~82Kj4M5noGmPng9R*07*qoM6N<$f_3Oc+5i9m literal 0 HcmV?d00001 diff --git a/apps/sleeplog/boot.js b/apps/sleeplog/boot.js new file mode 100644 index 000000000..7ec71742c --- /dev/null +++ b/apps/sleeplog/boot.js @@ -0,0 +1,137 @@ +// Sleep/Wake detection with Estimation of Stationary Sleep-segments (ESS): +// Marko Borazio, Eugen Berlin, Nagihan Kücükyildiz, Philipp M. Scholl and Kristof Van Laerhoven, "Towards a Benchmark for Wearable Sleep Analysis with Inertial Wrist-worn Sensing Units", ICHI 2014, Verona, Italy, IEEE Press, 2014. +// https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en + +// sleeplog.status values: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping + +// load settings into global object +global.sleeplog = Object.assign({ + enabled: true, // en-/disable completely + logfile: "sleeplog.log", // logfile + winwidth: 13, // 13 values, read with 12.5Hz = every 1.04s + nomothresh: 0.012, // values lower than 0.008 getting triggert by noise + sleepthresh: 577, // 577 times no movement * 1.04s window width > 10min + tempthresh: 27, // every temperature above ist registered as worn +}, require("Storage").readJSON("sleeplog.json", true) || {}); + +// delete app settings +["breaktod", "maxawake", "minconsec"].forEach(property => delete global.sleeplog[property]); + +// check if service enabled +if (global.sleeplog.enabled) { + + // add cached values and functions to global object + global.sleeplog = Object.assign(global.sleeplog, { + // set cached values + ess_values: [], + nomocount: 0, + firstnomodate: undefined, + resting: undefined, + status: 0, + + // define acceleration listener function + accel: function(xyz) { + // save acceleration magnitude and start calculation on enough saved data + if (global.sleeplog.ess_values.push(xyz.mag) >= global.sleeplog.winwidth) global.sleeplog.calc(); + }, + + // define calculator function + calc: function() { + // calculate standard deviation over + var mean = this.ess_values.reduce((prev, cur) => cur + prev) / this.winwidth; + var stddev = Math.sqrt(this.ess_values.map(val => Math.pow(val - mean, 2)).reduce((prev, cur) => prev + cur) / this.winwidth); + // reset saved acceleration data + this.ess_values = []; + + // check for non-movement according to the threshold + if (stddev < this.nomothresh) { + // increment non-movement sections count, set date of first non-movement + if (++this.nomocount == 1) this.firstnomodate = Math.floor(Date.now()); + // check resting state and non-movement count against threshold + if (this.resting !== true && this.nomocount >= this.sleepthresh) { + // change resting state, status and write to log + this.resting = true; + // check if the watch is worn + if (E.getTemperature() > this.tempthresh) { + // set status and write to log as sleping + this.status = 3; + this.log(this.firstnomodate, 3, E.getTemperature()); + } else { + // set status and write to log as not worn + this.status = 1; + this.log(this.firstnomodate, 1, E.getTemperature()); + } + } + } else { + // reset non-movement sections count + this.nomocount = 0; + // check resting state + if (this.resting !== false) { + // change resting state + this.resting = false; + // set status and write to log as awake + this.status = 2; + this.log(Math.floor(Date.now()), 2); + } + } + }, + + // define logging function + log: function(date, status, temperature, info) { + // skip logging if logfile is undefined or does not end with ".log" + if (!this.logfile || !this.logfile.endsWith(".log")) return; + // prevent logging on implausible date + if (date < 9E11 || Date() < 9E11) return; + + // set default value for status + status = status || 0; + + // define storage + var storage = require("Storage"); + + // read previous logfile + var log = JSON.parse(atob(storage.read(this.logfile))); + + // remove last state if it was unknown and is less then 10min ago + if (log.length > 0 && log[0][1] === 0 && + Math.floor(Date.now()) - log[0][0] < 600000) log.shift(); + + // add actual status at the first position if it has changed + if (log.length === 0 || log[0][1] !== status) + log.unshift(info ? [date, status, temperature, info] : temperature ? [date, status, temperature] : [date, status]); + + // write log to storage + storage.write(this.logfile, btoa(JSON.stringify(log))); + + // clear variables + log = undefined; + storage = undefined; + }, + + // define stop function (logging will restart if enabled and boot file is executed) + stop: function() { + // remove acceleration and kill listener + Bangle.removeListener('accel', global.sleeplog.accel); + E.removeListener('kill', global.sleeplog.stop); + // write log with undefined sleeping status + global.sleeplog.log(Math.floor(Date.now())); + // reset cached values + global.sleeplog.ess_values = []; + global.sleeplog.nomocount = 0; + global.sleeplog.firstnomodate = undefined; + global.sleeplog.resting = undefined; + global.sleeplog.status = 0; + }, + + // define restart function (also use for initial starting) + start: function() { + // add acceleration listener + Bangle.on('accel', global.sleeplog.accel); + // add kill listener + E.on('kill', global.sleeplog.stop); + }, + }); + + // initial starting + global.sleeplog.start(); +} diff --git a/apps/sleeplog/lib.js b/apps/sleeplog/lib.js new file mode 100644 index 000000000..81bca0f3f --- /dev/null +++ b/apps/sleeplog/lib.js @@ -0,0 +1,150 @@ +exports = { + // define en-/disable function + setEnabled: function(enable, logfile) { + // check if sleeplog is available + if (typeof global.sleeplog !== "object") return; + + // set default logfile + logfile = logfile.endsWith(".log") ? logfile : + logfile === false ? undefined : + "sleeplog.log"; + + // check if status needs to be changed + if (enable === global.sleeplog.enabled || + logfile === global.sleeplog.logfile) return false; + + // stop if enabled + if (global.sleeplog.enabled) global.sleeplog.stop(); + + // define storage and filename + var storage = require("Storage"); + var filename = "sleeplog.json"; + + // change enabled value in settings + storage.writeJSON(filename, Object.assign(storage.readJSON(filename, true) || {}, { + enabled: enable, + logfile: logfile + })); + + // force changes to take effect by executing the boot script + eval(storage.read("sleeplog.boot.js")); + + // clear variables + storage = undefined; + filename = undefined; + return true; + }, + + // define read log function + // sorting: latest first, format: + // [[number, int, float, string], [...], ... ] + // - number // timestamp in ms + // - int // status: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping + // - float // internal temperature + // - string // additional information + readLog: function(since, until) { + // set logfile + var logfile = (global.sleeplog || {}).logfile || "sleeplog.log"; + + // check if since is in the future + if (since > Date()) return []; + + // read log json to array + var log = JSON.parse(atob(require("Storage").read(logfile))); + + // search for latest entry befor since + since = (log.find(element => element[0] <= since) || [0])[0]; + + // filter selected time period + log = log.filter(element => (element[0] >= since) && (element[0] <= (until || 1E14))); + + // output log + return log; + }, + + // define log to humanreadable string function + // sorting: latest last, format: + // "{substring of ISO date} - {status} for {duration}min\n..." + getReadableLog: function(printLog, since, until) { + // read log and check + var log = this.readLog(since, until); + if (!log.length) return; + // reverse array to set last timestamp to the end + log.reverse(); + + // define status description and log string + var statusText = ["unknown ", "not worn", "awake ", "sleeping"]; + var logString = []; + + // rewrite each entry + log.forEach((element, index) => { + logString[index] = "" + + Date(element[0] - Date().getTimezoneOffset() * 6E4).toISOString().substr(0, 19).replace("T", " ") + " - " + + statusText[element[1]] + + (index === log.length - 1 ? "" : " for " + Math.round((log[index + 1][0] - element[0]) / 60000) + "min") + + (element[2] ? " | Temp: " + element[2] + "°C" : "") + + (element[3] ? " | " + element[3] : ""); + }); + logString = logString.join("\n"); + + // if set print and return string + if (printLog) { + print(logString); + print("- first", Date(log[0][0])); + print("- last", Date(log[log.length - 1][0])); + var period = log[log.length - 1][0] - log[0][0]; + print("- period= " + Math.floor(period / 864E5) + "d " + Math.floor(period % 864E5 / 36E5) + "h " + Math.floor(period % 36E5 / 6E4) + "min"); + } + return logString; + }, + + // define function to eliminate some errors inside the log + restoreLog: function(logfile) { + // define storage + var storage = require("Storage"); + + // read log json to array + var log = JSON.parse(atob(storage.read(logfile))); + + // define output variable to show number of changes + var output = log.length; + + // remove non decremental entries + log = log.filter((element, index) => log[index][0] >= (log[index + 1] || [0])[0]); + + // write log to storage + storage.write(logfile, btoa(JSON.stringify(log))); + + // return difference in length + return output - log.length; + }, + + // define function to reinterpret worn status based on given temperature threshold + reinterpretTemp: function(logfile, tempthresh) { + // define storage + var storage = require("Storage"); + + // read log json to array + var log = JSON.parse(atob(storage.read(logfile))); + + // define output variable to show number of changes + var output = 0; + + // remove non decremental entries + log = log.map(element => { + if (element[2]) { + var tmp = element[1]; + element[1] = element[2] > tempthresh ? 3 : 1; + if (tmp !== element[1]) output++; + } + return element; + }); + + // write log to storage + storage.write(logfile, btoa(JSON.stringify(log))); + + // return output + return output; + } + +}; diff --git a/apps/sleeplog/metadata.json b/apps/sleeplog/metadata.json new file mode 100644 index 000000000..4a67af301 --- /dev/null +++ b/apps/sleeplog/metadata.json @@ -0,0 +1,28 @@ +{ + "id":"sleeplog", + "name":"Sleep Log", + "shortName": "SleepLog", + "version": "0.01", + "description": "Log and view your sleeping habits. This app derived from SleepPhaseAlarm and uses also the principe of Estimation of Stationary Sleep-segments (ESS).", + "icon": "app.png", + "type": "app", + "tags": "tool,boot", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name": "sleeplog.app.js", "url": "app.js"}, + {"name": "sleeplog.img", "url": "app-icon.js", "evaluate":true}, + {"name": "sleeplog.boot.js", "url": "boot.js"}, + {"name": "sleeplog", "url": "lib.js"}, + {"name": "sleeplog.settings.js", "url": "settings.js"} + ], + "data": [ + {"name": "sleeplog.json"}, + {"name": "sleeplog.log"} + ], + "screenshots": [ + {"url": "screenshot1.png"}, + {"url": "screenshot2.png"}, + {"url": "screenshot3.png"} + ] +} diff --git a/apps/sleeplog/screenshot1.png b/apps/sleeplog/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab384ca93dedea2d7499bf8f9e7cd61b3ee3826 GIT binary patch literal 4074 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 A1^@s6 literal 0 HcmV?d00001 diff --git a/apps/sleeplog/screenshot2.png b/apps/sleeplog/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..69e370042b9d83e90c9fc5c9930f54a884dfa77c GIT binary patch literal 3497 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 literal 0 HcmV?d00001 diff --git a/apps/sleeplog/screenshot3.png b/apps/sleeplog/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..79433949a4f1abe017d9dd469e489b75caaa9983 GIT binary patch literal 4111 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 PA3ku+#LBqB5EcI)fkepR literal 0 HcmV?d00001 diff --git a/apps/sleeplog/settings.js b/apps/sleeplog/settings.js new file mode 100644 index 000000000..6137e2082 --- /dev/null +++ b/apps/sleeplog/settings.js @@ -0,0 +1,118 @@ +(function(back) { + var filename = "sleeplog.json"; + + // set storage and load settings + var storage = require("Storage"); + var settings = Object.assign({ + breaktod: 10, // time of day when to start/end graphs + maxawake: 36E5, // 60min in ms + minconsec: 18E5, // 30min in ms + tempthresh: 27, // every temperature above ist registered as worn + nomothresh: 0.012, // values lower than 0.008 getting triggert by noise + sleepthresh: 577, // 577 times no movement * 1.04s window width > 10min + winwidth: 13, // 13 values, read with 12.5Hz = every 1.04s + enabled: true, // en-/disable completely + logfile: "sleeplog.log", // logfile + }, storage.readJSON(filename, true) || {}); + + // write change to global.sleeplog and storage + function writeSetting(key, value) { + // change key in global.sleeplog + if (typeof global.sleeplog === "object") global.sleeplog[key] = value; + // reread settings to only change key + settings = Object.assign(settings, storage.readJSON(filename, true) || {}); + // change the value of key + settings[key] = value; + // write to storage + storage.writeJSON(filename, settings); + } + + // define circulate function + function circulate(min, max, value) { + return value > max ? min : value < min ? max : value; + } + + // calculate sleepthresh factor + var stFactor = settings.winwidth / 12.5 / 60; + + // show main menu + function showMain() { + var mainMenu = E.showMenu({ + "": { + title: "Sleep Log" + }, + "< Exit": () => load(), + "< Back": () => back(), + "BreakTod": { + value: settings.breaktod, + step: 1, + onchange: function(v) { + this.value = v = circulate(0, 23, v); + writeSetting("breaktod", v); + } + }, + "MaxAwake": { + value: settings.maxawake / 6E4, + step: 5, + format: v => v + "min", + onchange: function(v) { + this.value = v = circulate(15, 120, v); + writeSetting("maxawake", v * 6E4); + } + }, + "MinConsec": { + value: settings.minconsec / 6E4, + step: 5, + format: v => v + "min", + onchange: function(v) { + this.value = v = circulate(15, 120, v); + writeSetting("minconsec", v * 6E4); + } + }, + "TempThresh": { + value: settings.tempthresh, + step: 0.5, + format: v => v + "°C", + onchange: function(v) { + this.value = v = circulate(20, 40, v); + writeSetting("tempthresh", v); + } + }, + "NoMoThresh": { + value: settings.nomothresh, + step: 0.001, + format: v => ("" + v).padEnd(5, "0"), + onchange: function(v) { + this.value = v = circulate(0.006, 0.02, v); + writeSetting("nomothresh", v); + } + }, + "MinDuration": { + value: Math.floor(settings.sleepthresh * stFactor), + step: 1, + format: v => v + "min", + onchange: function(v) { + this.value = v = circulate(5, 15, v); + writeSetting("sleepthresh", Math.ceil(v / stFactor)); + } + }, + "Enabled": { + value: settings.enabled, + format: v => v ? "on" : "off", + onchange: function(v) { + writeSetting("enabled", v); + } + }, + "Logfile ": { + value: settings.logfile === "sleeplog.log" ? true : settings.logfile.endsWith(".log") ? "custom" : false, + format: v => v === true ? "default" : v ? "custom" : "off", + onchange: function(v) { + if (v !== "custom") writeSetting("logfile", v ? "sleeplog.log" : undefined); + } + }, + }); + } + + // draw main menu + showMain(); +}) From 038480d358fec6491fb378ef0a839f932800f823 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 11 Feb 2022 10:54:16 +0100 Subject: [PATCH 09/17] Minor changes --- apps/lcars/lcars.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index bc797b1cf..2ff76a541 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -504,7 +504,7 @@ function getWeather(){ // Wind const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); - weather.wind = wind[1]; // + wind[2].toUpperCase(); // Don't show mph - its too large + weather.wind = Math.round(wind[1] * 1.60934) ; // + wind[2].toUpperCase(); // Don't show mph - its too large return weather } From 1e837248ac766546e973ffcaa52cf70c8c84b93a Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 11 Feb 2022 11:09:53 +0100 Subject: [PATCH 10/17] Qeue first --- apps/lcars/lcars.app.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 2ff76a541..d8405b18d 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -430,8 +430,9 @@ function drawPosition1(){ } function draw(){ + // Queue draw first to ensure that its called in one minute again. + queueDraw(); - try{ // First handle alarm to show this correctly afterwards handleAlarm(); @@ -445,13 +446,6 @@ function draw(){ } else if (lcarsViewPos == 1) { drawPosition1(); } - } catch (ex){ - // In case of an exception, we simply queue - // and try it in one minute again... - } - - // Queue draw in one minute - queueDraw(); } From cb4ca8dddd03f53267bddc28d65675155c084698 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 11 Feb 2022 11:09:10 +0000 Subject: [PATCH 11/17] mention changelog --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a92aae30..9cf30065a 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ Apps are listed in the Bangle.js menu, accessible from a clock app via the middl * `app.png` - app icon - 48x48px * `app-icon.js` - JS version of the icon (made with http://www.espruino.com/Image+Converter) for use in Bangle.js's menu * `app.js` - app code +* `ChangeLog` - A file containing a list of changes to your app so users can see what's changed #### `app-icon.js` @@ -189,9 +190,23 @@ When the widget is to be drawn, `x` and `y` values are set up in `WIDGETS["mywid and `draw` can then use `this.x` and `this.y` to figure out where it needs to draw to. +### ChangeLog + +This is a file containing a list of changes to your app so users can see what's changed, for example: + +``` +0.01: New App! +0.02: Changed the colors +0.03: Made the app run quicker +``` + +Entries should be newest last, with the version number of the last entry matching the version in `metadata.json` + +Please keep the same format at the example as the file needs to be parsed by the BangleApps tools. + ### `app.info` format -This is the file that's **auto-generated** and loaded onto Bangle.js by the App Loader, +This is the file that's **auto-generated** from `metadata.json` and loaded onto Bangle.js by the App Loader, and which gives information about the app for the Launcher. ``` From 52faa8c871501194e69d08081621675237c0f9b3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 11 Feb 2022 12:25:22 +0100 Subject: [PATCH 12/17] The speed of the wind can now be configured (mph / kph). --- apps/lcars/lcars.app.js | 34 +++++++++++++++++++--------------- apps/lcars/lcars.settings.js | 33 ++++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index d8405b18d..dcbd294bb 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -5,7 +5,8 @@ let settings = { alarm: -1, dataRow1: "Steps", dataRow2: "Temp", - dataRow3: "Battery" + dataRow3: "Battery", + speed: "kph", }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { @@ -121,18 +122,22 @@ function queueDraw() { function printRow(text, value, y, c){ g.setFontAntonioMedium(); g.setFontAlign(-1,-1,0); - g.setColor(c); - g.fillRect(77, y-2, 83 ,y+18); - - g.setFontAlign(0,-1,0); - g.drawString(value, 110, y); + // Print background g.setColor(c); g.setFontAlign(-1,-1,0); - g.fillRect(135, y-2, 165 ,y+18); + g.fillRect(80, y-2, 165 ,y+18); g.fillCircle(163, y+8, 10); g.setColor(cBlack); - g.drawString(text, 137, y); + g.drawString(text, 135, y); + + // Plot text + width = g.stringWidth(value); + g.setColor(cBlack); + g.fillRect(130-width-8, y-2, 130, y+18); + g.setColor(c); + g.setFontAlign(1,-1,0); + g.drawString(value, 126, y); } @@ -255,14 +260,14 @@ function drawState(){ iconEarth; g.drawImage(iconImg, 23, 118); g.setColor(cWhite); - g.drawString("STATUS", 23+25, 108); + g.drawString("STATUS", 23+26, 108); } else { // Alarm within symbol g.setColor(cOrange); - g.drawString("ALARM", 23+25, 108); + g.drawString("ALARM", 23+26, 108); g.setColor(cWhite); g.setFontAntonioLarge(); - g.drawString(getAlarmMinutes(), 23+25, 108+35); + g.drawString(getAlarmMinutes(), 23+26, 108+35); } g.setFontAlign(-1, -1, 0); @@ -490,15 +495,14 @@ function getWeather(){ var weather = weatherJson.weather; // Temperature - const temp = locale.temp(weather.temp-273.15).match(/^(\D*\d*)(.*)$/); - weather.temp = temp[1] + " " + temp[2].toUpperCase(); + weather.temp = locale.temp(weather.temp-273.15); // Humidity weather.hum = weather.hum + "%"; // Wind - const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); - weather.wind = Math.round(wind[1] * 1.60934) ; // + wind[2].toUpperCase(); // Don't show mph - its too large + var speedFactor = settings.speed == "kph" ? 1.60934 : 1.0; + weather.wind = Math.round(weather.wind * speedFactor); return weather } diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js index 71081e1d4..176f88593 100644 --- a/apps/lcars/lcars.settings.js +++ b/apps/lcars/lcars.settings.js @@ -7,7 +7,8 @@ alarm: -1, dataRow1: "Battery", dataRow2: "Steps", - dataRow3: "Temp" + dataRow3: "Temp", + speed: "kph", }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { @@ -18,35 +19,45 @@ storage.write(SETTINGS_FILE, settings) } - var data_options = ["Steps", "Battery", "VREF", "HRM", "Temp", "Humidity", "Wind", "Altitude", "CoreT"]; + var dataOptions = ["Steps", "Battery", "VREF", "HRM", "Temp", "Humidity", "Wind", "Altitude", "CoreT"]; + var speedOptions = ["kph", "mph"]; E.showMenu({ '': { 'title': 'LCARS Clock' }, '< Back': back, 'Row 1': { - value: 0 | data_options.indexOf(settings.dataRow1), + value: 0 | dataOptions.indexOf(settings.dataRow1), min: 0, max: 8, - format: v => data_options[v], + format: v => dataOptions[v], onchange: v => { - settings.dataRow1 = data_options[v]; + settings.dataRow1 = dataOptions[v]; save(); }, }, 'Row 2': { - value: 0 | data_options.indexOf(settings.dataRow2), + value: 0 | dataOptions.indexOf(settings.dataRow2), min: 0, max: 8, - format: v => data_options[v], + format: v => dataOptions[v], onchange: v => { - settings.dataRow2 = data_options[v]; + settings.dataRow2 = dataOptions[v]; save(); }, }, 'Row 3': { - value: 0 | data_options.indexOf(settings.dataRow3), + value: 0 | dataOptions.indexOf(settings.dataRow3), min: 0, max: 8, - format: v => data_options[v], + format: v => dataOptions[v], onchange: v => { - settings.dataRow3 = data_options[v]; + settings.dataRow3 = dataOptions[v]; + save(); + }, + }, + 'Speed': { + value: 0 | speedOptions.indexOf(settings.speed), + min: 0, max: 1, + format: v => speedOptions[v], + onchange: v => { + settings.speed = speedOptions[v]; save(); }, } From 2c64069bca92b15e58bdf7674db22767b832eddf Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 11 Feb 2022 12:27:15 +0100 Subject: [PATCH 13/17] New version --- apps/lcars/ChangeLog | 3 ++- apps/lcars/README.md | 4 ++-- apps/lcars/metadata.json | 2 +- apps/lcars/screenshot.png | Bin 5787 -> 5258 bytes 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 577e8b572..a8c55f8fd 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -13,4 +13,5 @@ 0.13: Improved battery visualization. 0.14: Added altitude as an option to display. 0.15: Using wpedom to count steps. -0.16: Improved stability. Wind can now be shown. \ No newline at end of file +0.16: Improved stability. Wind can now be shown. +0.17: Settings for mph/kph and other minor improvements. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index bfd15afa2..b6bfda2c1 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -20,13 +20,13 @@ with Gadgetbride and the weather app must be installed. * Display graphs (day or month) for steps + hrm on the second screen. ## Data that can be configured - * Steps - Steps loaded via the health module + * Steps - Steps loaded via the wpedom app. * Battery - Current battery level in % * VREF - Voltage of battery * HRM - Last measured HRM * Temp - Weather temperature loaded via the weather module + gadgetbridge * Humidity - Humidity loaded via the weather module + gadgetbridge - * Wind - Wind loaded via the weather module + gadgetbridge + * Wind - Wind loaded via the weather module + gadgetbridge. Set kph / mph in the settings. * Altitude - Shows the altitude in m. * CoreT - Temperature of device diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 924c07267..a402b35a4 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,7 +3,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.16", + "version":"0.17", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 120229fba29717e0501a63ac1f805467b1edc5fc..e2d2cbd5fc44c8c4aa82e9c4d7577edf5f7a8ac0 100644 GIT binary patch literal 5258 zcmV;56m{!~P)Px}L`g(JRCr$PUE7wVAPn63|BvoHYSYG;O9i5$G7r0FMy{bKLJ{=u-@kvKf8NjM z^Y7o^H|6+$vDlsLFgMow`P{Ex1eQwg?%AnZf$NmX008)=Bvp813*eh}=61|@3V5fX z1pqu5@2vJD*0Trj0Pnrr0|*QNfNwhPTL2&335W?iUu`@e7FaE?0yq`Cz>FWGFf5Q@ zfd#+=ya}cpMOf7d~=;dW5Os2;-7zp9yeQzT!7sLrmWhl>R=r3$ z^V!;g6A|feFKN1C;1&R*gP#q6ta`J`iGpihucp8lWpOIcsanO8&WqmnR6#0-K1a)$ z(s}D;R}3r-Aj&k6!OsM6X1$qZML=A@C4of(uLO3Uj)Pb$hk_IZIqh2)44mQfdEob+ zM+Tgx^~&|0m$JNc-t*e_f5}&6V9u->({k`>3|;;%mBUv8Z)KQ?=qeo;Wt$cTrg@J7 zfLE^f90l+UG`2ZKZR3F(Vc^23lu0Q_Q3j^W%gAK08-|eX*{q> z&n>3YK*imNC<9B(KNy&d&Km%n<;xES{#~!}_KYjSBvwL~Th1bAK7Zbpb60Mbc$Hu(*^72M~y#hYlLY8Co0ebe(`7zzuK%4Qj`EPPrCD%crY-VNhp{k zRX_t&_W(|0V2#nW4VuUN-eJaI;2Qxr>KdTwBPvAknI#F0OKp~9c6$}#Y!?D$Rx};T zz({#W8WfB*=^{R`6a}Wm zK5$TJ;75*ytz&BIP=wlj0N6ue!}Hq!m`V#wQu9I_HTT2Yph+sk;+Ab+oCxT^z}qPs z1~HNq9q`sNGucaPOT>Rg(;i_T#FkM|A!TNzc{~GOH|YC&d79sfwh>L21&%wE^9U6p zg9S4O3uV+&Ckjk7U1nc;FY6IHa0I}ayZ5YmBf#Wov-)Fg0p+@9X)z z+~$vE;0P!(S*E7mNS-4A>}}N6l|p_qeMBnLz=~WSlE&$g3>;m;vjALM@8tj{%=+6D z8EV8Nu~~Q8q>Gw0Ix#XXk7VEoAP^&=X=>|@rdM^j?mw~N|o08s(gh*QXJf=p*#;yqy+}Do8n3jTcf*5L!9 zCwuBeV9!3A<-Lwhz`EDIrG5( z(?^9{ zU{N9F{pa|3vjvu~y-#3}qY2CNjUUg_dTFFOyn2x_830DC^zbwbkTm#C3@69X{^Ee0 z=RcL<-xRsKlHnqg zkLE`vW(0g0X%QcI58#!tBMeO28(py#0N;awTL5eUh#Mu!>geRtnEQzgEKd0OkLyaG z0p6*^S1|AZu+7ui3@ih9yVXhr@I4r~#Rt9vfW1v)hO3~Jk?jM&j)6CR(KiGNk(J4*+Cl?w567lKdD z9B5*tWc$EF2PWFA#kf5%@LN;}dd$(P0~bBwF(+{-2s8~fvH|iy?>*P#Fx1b!s}4M` z5Kb%vk8>z_icf6)j;$5@R9*PM1Hj9`L?&YGfa?<1_6?8H$s0ehm7>wKScei*ksgiK zLoCDqa1Q|9LR&g{+ibQ;Jg}rNP_~sASo>RaVh#po7JH)$5e1FR;>EMgi84dmG*03U z1n`Ej0{S*Ocq83>lzfkqxOskmqsF4aJm>~XszU<_63jCIeEbx=goU9z!*HQEXEih{ynvPe~->f*#nz~1x_gR1dIPF_o z<0Vt?!_j3uCg0geyPQ0CW-#$(WBRI!H}8ee-oTP|Yx!>FAn~g7y$N^g-xJ!qd$CET zKYVv8Kvt1quWLtHeKXHs76iWAcYHm8(bo4p=Ix1&w2S*{sW&qW0^v8?=UVPvYIgzL zLnB8Uh6OYW3;+*o+}Z*Iz_%X0(RdiZ{F}Bl?*sHcVyAsAhknwjrrxLK_v|^rJ7e5> zwx0>$?9O|-YIc232fJs_8NlVAdx#2Q5k!~Ka^ASQQBXX_c)GE(nas22D;fAm5P6I- z7?|in0AqUgd>sR4f)_FF*n$iTv|4}!^T01+cMnzucw2{Mj?Y-(hlR?tu`zAh`4Fw%myu3|u|0&_Tb$ zgbQ-7%A9B+o`7BUN^_|YZ z{L=yGtM{$1`BP)Q;^a@(k4d%aqIIPz=V}J3eqyErF_~XMJ7>k zH+Z?HGB5%(Zd486(u=R9ya<4i?{R2AZed^v{FGriV`cxYF(ma(`DBqMPXQI}k2T47 zdSud4W~S*+WnkppX4*T)5Qap+x-i7|L(}Yqdo}M|Yhhr@NYe7k87uqu2m@=AX97D4 z>H@-OdhS-xNqz|fTR^!TfWZxLjSrm7xHUfL84RpV0!yVR?HUXWFtX(bw=l5e`$@~G z1|p3?Jk0r6PjeDNqBTa1oAL9~fzu>Ox$oLU<~J_Z;zo zkquXd3K0qHp_8-=9hffH7MQrfH6Qj=0GC~j6Owua1AEK5cXEgLpvbXr^kmJ8XkedghG`BY~;(L3)7if4)wv;CO@)pxe{cmAl-cPArmqnvBVx`OMNBE5v19OI@zf0^UF|x(1 zl98=4r2cCx%bC_&IkeS;mj8MN{&CLdGvAb+Vln9d-mK|~fhFeS3~epeM=&sFP|ZiT z+G+Xnul9lYf?2>?{_cTy9ULSjp5{pmOl`#bRm;GX$zR97Q}E3c*~FPP%DfcpXXwD5 z54=|jWFPrT2IeXPW!AyK0Ku*9g7P`5@1KF9eo1=qfhDQS+udt<_}@`Ky4XTv+6V(% ze)KCD*kjzMGcYnKYkXi@uA~D~9~fa^shzL)fjwXM=T-~`7I9vyLeK*b>F`7HfupO! z?R;RENf{Wmjae=8-pvOtOz0mN?5|hX>cBE+$@_$b6FOAYDgC&W3gP;&WrGGXX$$kN z06zC5PSb%sA2@^UJk_AILDQ!BBtpxRmW36-oqweWW?V(bE%|o?9MpR?9};DZ$YtNkd%k0Ppy?ds}a3^C(dHtuaH{= z-QEAviJEre)&kyTNi6?5ujUEdXnYa_bKRNlMLZo?)7Nhk3$bBd6lwg9$+x!>ywD=8 zbiM1qMKe9h2j0tQD`dGYto=@PUC*AkiAJLg>@lwQye7s01^3wu%zbG+Fh^b)vQ>yZ zfY%zhF0B17Mb$}rhTFsgS23@GxaHV*l_j#T>v)WTP6V0`jTW=OSa$qKxkoB0HT}0# zhn+v%n-6>!=3NK<93MCf2);X%=gVirhub>{>-H40^g)GqBdm(=B=L&UWP0X1Wd8u7xRU=ym7U&Pagh5qxL3;J05a(O+ zM{ZbjFeal30Soj8;Ibz|JHhYKNILM5KJXk+k^XLz{r*S&bPH-IB;CBFKc_!vJx;&7 z0kCvaV#mM?DO}&x82eZTK5Njk1waANXH7;Fyqk1#|GNS3OuRogz-Nn{ue-@Ydj1WD zIBfXO8gz|`c>Q8JKFKs|Xz9q`OZl66*MQ4~!TImg;C%lk=Huh7k;1;+mjgH+^RU0u zb`A3qCAf-FqHc!(I&Jc7K#YT7VGz_joHE^gUgiTAaB2)#mNf%peB~0CZGnM{y+y_)AS;ss0=1A&B!@NKWje5T z6JmX?-y*)2c{^fY4i1rl4UlV-(JTj@9NHxFCY7ypAWx?J0g7|a>-m4A7=O@OA_{K*@oB1&ANQL0bHM-23 z?hpYd-yll9-<+KJ>zj1Z4WYJISn9ZhfxWwE+VlAnTt$A^{4Y-eAAAWZE@fbC_YU}= zkXpf)dA^b4S7rH%K-?_I2Nv84ZLz(Mf#r9QX^blj(Xvr4CwAZk&IG6`MfAeJ+D2=$ ztPzy~RW(osHtK&01OIN1X+(O4YLJcOE*Ka9@5Y@FmU;gCN3K-A^}t+~dqZ_M_2Z5i z7`wtlyhZ*Rh2;XRJ+yKFyFhMV&xkofxQ?8&1li+HjzO!Da_cg z@%EUc&|x&%^&o6$K^F|HGt@3bl5ey&T?axhJs&m{;}B3oHs!93K0Owq0V Q_5c6?07*qoM6N<$f~}GSAOHXW literal 5787 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 Z@PEl{>&?){aSZ?f002ovPDHLkV1j3-{UHDV From 02feba3f45e1ec2ddcb4d02ca40900a4d966c7ad Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 11 Feb 2022 11:32:53 +0000 Subject: [PATCH 14/17] quick tweak - fix HID joystick selection --- apps/setting/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 65e076753..9bd63491f 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -188,7 +188,7 @@ function showBLEMenu() { }, /*LANG*/'HID': { value: Math.max(0,0 | hidV.indexOf(settings.HID)), - min: 0, max: 3, + min: 0, max: hidN.length-1, format: v => hidN[v], onchange: v => { settings.HID = hidV[v]; From 868213bb0d845ce65e4fba4f21046e9a96b58440 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 11 Feb 2022 11:33:07 +0000 Subject: [PATCH 15/17] disable languages we know don't work --- lang/index.json | 6 +++--- loader.js | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lang/index.json b/lang/index.json index f2750cd72..2a9ecfd42 100644 --- a/lang/index.json +++ b/lang/index.json @@ -10,11 +10,11 @@ {"code":"nl_NL","name":"Dutch","url":"nl_NL.json"}, {"code":"sv_SE","name":"Swedish","url":"sv_SE.json"}, {"code":"tr_TR","name":"Turkish","url":"tr_TR.json"}, - {"code":"ru_RU","name":"Russian","url":"ru_RU.json"}, + {"code":"ru_RU","name":"Russian","url":"ru_RU.json", "disabled":"Characters not in ISO Latin codepage"}, {"code":"pt_PT","name":"Portuguese","url":"pt_PT.json"}, - {"code":"bg_BG","name":"Bulgarian","url":"bg_BG.json"}, + {"code":"bg_BG","name":"Bulgarian","url":"bg_BG.json", "disabled":"Characters not in ISO Latin codepage"}, {"code":"da_DA","name":"Danish","url":"da_DA.json"}, - {"code":"el_EL","name":"Greek","url":"el_EL.json"}, + {"code":"el_EL","name":"Greek","url":"el_EL.json", "disabled":"Characters not in ISO Latin codepage"}, {"code":"et_ET","name":"Estonian","url":"et_ET.json"}, {"code":"lt_LT","name":"Lithuanian","url":"lt_LT.json"}, {"code":"lv_LV","name":"Latvian","url":"lv_LV.json"}, diff --git a/loader.js b/loader.js index c6840cbb0..6b27736ae 100644 --- a/loader.js +++ b/loader.js @@ -179,6 +179,7 @@ window.addEventListener('load', (event) => { } catch(e) { console.error("lang/index.json Corrupted", e); } + languages = languages.filter( l=> l.disabled===undefined ); function reloadLanguage() { LANGUAGE = undefined; From 55430085f2ffb4ff14a840b630a804d76e379aed Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 11 Feb 2022 11:40:44 +0000 Subject: [PATCH 16/17] update locale docs --- apps/locale/locale.html | 2 +- index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/locale/locale.html b/apps/locale/locale.html index d02dab3ac..b23225d5f 100644 --- a/apps/locale/locale.html +++ b/apps/locale/locale.html @@ -11,7 +11,7 @@
- +

Then click

diff --git a/index.html b/index.html index 64bf1d44c..6c9a21bf8 100644 --- a/index.html +++ b/index.html @@ -144,7 +144,7 @@
  Translations (BETA - more info) +   Translations (BETA - more info). Any apps that are uploaded to Bangle.js after changing this will have any text automatically translated.
From 615519350af09ac81c817c14c9aa320a44525267 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 11 Feb 2022 11:58:34 +0000 Subject: [PATCH 17/17] route 0.03: Color/positioning change to allow it to work with Bangle.js 1 (although not pretty) --- apps/route/ChangeLog | 1 + apps/route/custom.html | 243 ++++++++++++++++++++------------------- apps/route/metadata.json | 4 +- 3 files changed, 127 insertions(+), 121 deletions(-) diff --git a/apps/route/ChangeLog b/apps/route/ChangeLog index 02779b6ea..f8c97a57b 100644 --- a/apps/route/ChangeLog +++ b/apps/route/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Change color from red->yellow to ease readability (fix #710) +0.03: Color/positioning change to allow it to work with Bangle.js 1 (although not pretty) diff --git a/apps/route/custom.html b/apps/route/custom.html index b958303d8..bdabb471c 100644 --- a/apps/route/custom.html +++ b/apps/route/custom.html @@ -104,141 +104,146 @@ document.getElementById('fileLoader').addEventListener('change', handleFileSelec document.getElementById("upload").addEventListener("click", function() { var app = `${js} -var gcoords = new Uint8Array(coords.length); -var coordDistance = new Uint16Array(coords.length/2); + var gcoords = new Uint8Array(coords.length); + var coordDistance = new Uint16Array(coords.length/2); + var colHL = g.theme.dark ? "#FF0" : "#00F"; + var W = g.getWidth(), H = g.getHeight(); -var PT_DISTANCE = 30; // distance to a point before we consider it complete + var PT_DISTANCE = 30; // distance to a point before we consider it complete -function toScr(p) { - return { - x : 10 + (p.x-min.x)*100/(max.x-min.x), - y : 230 - (p.y-min.y)*100/(max.y-min.y) - }; -} - -var last; -var totalDistance = 0; -for (var i=0;i