From ca7f4d238bbc8def423c867d047a8cb27875f3f0 Mon Sep 17 00:00:00 2001 From: forelleblau <44144152+forelleblau@users.noreply.github.com> Date: Sun, 5 Nov 2023 14:01:09 +0100 Subject: [PATCH] jsonConfig --- admin/jsonConfig.json | 180 +++++++++++++++ admin/words.js | 505 +++++++++++++++++++++++++++++++++++++++--- io-package.json | 8 + lib/tools.js | 99 +++++++++ 4 files changed, 756 insertions(+), 36 deletions(-) create mode 100644 admin/jsonConfig.json create mode 100644 lib/tools.js diff --git a/admin/jsonConfig.json b/admin/jsonConfig.json new file mode 100644 index 0000000..a083328 --- /dev/null +++ b/admin/jsonConfig.json @@ -0,0 +1,180 @@ +{ + "type": "tabs", + "i18n": true, + "items": { + "portconnection": { + "type": "panel", + "label": "portConnection", + "items": { + "_image": { + "type": "staticImage", + "tooltip": "GSMSMS", + "src": "gsmsms.png", + "style": { + "width": 50, + "height": 50 + } + } + "port": { + "type": "text", + "label": "port", + "sm": 12, + "md": 6, + "lg": 6 + }, + "pin": { + "type": "text", + "label": "pin", + "sm": 12, + "md": 6, + "lg": 6 + } + } + }, + "gsm": { + "type": "panel", + "label": "gsm", + "items": { + "incomingSMSIndication": { + "newLine": true, + "type": "checkbox", + "label": "incomingSMSIndication" + }, + "autoDeleteOnReceive": { + "type": "checkbox", + "label": "autoDeleteOnReceive" + }, + "enableConcatenation": { + "newLine": true, + "type": "checkbox", + "label": "enableConcatenation" + }, + "getSignalQuality": { + "newLine": true, + "type": "checkbox", + "label": "getSignalQuality", + "sm": 12, + "md": 6, + "lg": 6 + }, + "pollinginterval": { + "type": "number", + "min": 5, + "max": 86400, + "label": "pollinginterval", + "sm": 12, + "md": 6, + "lg": 3 + }, + "customInitCommand": { + "newLine": true, + "type": "text", + "label": "customInitCommand", + "sm": 12, + "md": 6, + "lg": 6 + }, + "cnmiModemOpen": { + "newLine": true, + "type": "text", + "label": "cnmiModemOpen", + "sm": 12, + "md": 6, + "lg": 6 + }, + "cnmiModemClosed": { + "type": "text", + "label": "cnmiModemClosed", + "sm": 12, + "md": 6, + "lg": 6 + } + } + }, + "serialport": { + "type": "panel", + "label": "serialport", + "items": { + "baudRate": { + "type": "number", + "sm": 12, + "md": 8, + "lg": 4, + "label": "baudRate" + }, + "dataBits": { + "newLine": true, + "sm": 12, + "md": 6, + "lg": 4, + "type": "number", + "label": "dataBits" + }, + "stopBits": { + "sm": 12, + "md": 6, + "lg": 4, + "type": "number", + "label": "stopBits" + }, + "parity": { + "type": "select", + "label": "parity", + "options": [{ + "label": "none", + "value": "none" + }, + { + "label": "odd", + "value": "odd" + }, + { + "label": "even", + "value": "even" + }, + { + "label": "mark", + "value": "mark" + }, + { + "label": "space", + "value": "space" + } + ], + "sm": 12, + "md": 6, + "lg": 4 + }, + "rtscts": { + "newLine": true, + "type": "checkbox", + "label": "rtscts", + "sm": 6, + "md": 3, + "lg": 3 + }, + "xon": { + "type": "checkbox", + "label": "xon", + "sm": 6, + "md": 3, + "lg": 3 + }, + "xoff": { + "type": "checkbox", + "label": "xoff", + "sm": 6, + "md": 3, + "lg": 3 + }, + "xany": { + "type": "checkbox", + "label": "xany", + "sm": 6, + "md": 3, + "lg": 3 + } + } + } + } +} diff --git a/admin/words.js b/admin/words.js index eb41f2e..c071561 100644 --- a/admin/words.js +++ b/admin/words.js @@ -8,39 +8,472 @@ 'use strict'; systemDictionary = { - "alwaysopen": { "en": "Allways open", "de": "Immer geöffnet", "ru": "Всегда открыт", "pt": "Sempre aberto", "nl": "Altijd open", "fr": "Toujours ouvert", "it": "Sempre aperto", "es": "Siempre abierto", "pl": "Zawsze otwarte", "uk": "Завжди відкрита", "zh-cn": "永远开放"}, - "autoDeleteOnReceive": { "en": "Auto delete on recieve", "de": "Automatisches Löschen bei Empfang", "ru": "Автоматическое удаление при получении", "pt": "Apagar automaticamente ao receber", "nl": "Automatisch verwijderen bij ontvangst", "fr": "Suppression automatique à la réception", "it": "Eliminazione automatica alla ricezione", "es": "Eliminar automáticamente al recibir", "pl": "Automatyczne usuwanie przy odbiorze", "uk": "Автоматичне видалення при отриманні", "zh-cn": "收到后自动删除"}, - "basic": { "en": "Basic settings", "de": "Grundeinstellungen", "ru": "Основные настройки", "pt": "Configurações básicas", "nl": "Basis instellingen", "fr": "Paramètres de base", "it": "Impostazioni di base", "es": "Ajustes básicos", "pl": "Podstawowe ustawienia", "uk": "Основні налаштування", "zh-cn": "基本设置"}, - "baudRate": { "en": "Baud rate", "de": "Baudrate", "ru": "Скорость передачи", "pt": "Taxa de transmissão", "nl": "baudrate", "fr": "Débit en bauds", "it": "Velocità di trasmissione", "es": "Tasa de baudios", "pl": "Szybkość transmisji", "uk": "Швидкість передачі даних", "zh-cn": "波特率"}, - "cnmiModemClosed": { "en": "CNMI when modem closed", "de": "CNMI bei geschlossenem Modem", "ru": "CNMI при закрытом модеме", "pt": "CNMI quando o modem está fechado", "nl": "CNMI wanneer modem gesloten is", "fr": "CNMI à la fermeture du modem", "it": "CNMI quando il modem è chiuso", "es": "CNMI cuando el módem está cerrado", "pl": "CNMI po zamknięciu modemu", "uk": "CNMI, коли модем закритий", "zh-cn": "调制解调器关闭时的 CNMI"}, - "cnmiModemOpen": { "en": "CNMI when modem open", "de": "CNMI bei geöffnetem Modem", "ru": "CNMI при открытом модеме", "pt": "CNMI quando o modem abre", "nl": "CNMI wanneer modem open is", "fr": "CNMI à l'ouverture du modem", "it": "CNMI quando il modem è aperto", "es": "CNMI cuando el módem está abierto", "pl": "CNMI, gdy modem jest otwarty", "uk": "CNMI, коли модем відкритий", "zh-cn": "调制解调器打开时的 CNMI"}, - "connectionMode": { "en": "Connection mode", "de": "Verbindungsmodus", "ru": "Режим подключения", "pt": "Modo de conexão", "nl": "Verbindingsmodus", "fr": "Mode de connexion", "it": "Modalità di connessione", "es": "Modo de conexión", "pl": "Tryb połączenia", "uk": "Режим підключення", "zh-cn": "连接方式"}, - "customInitCommand": { "en": "Custom Iinit command", "de": "Benutzerdefinierter Iinit-Befehl", "ru": "Пользовательская команда Iinit", "pt": "Comando Iinit personalizado", "nl": "Aangepast Iinit-commando", "fr": "Commande Iinit personnalisée", "it": "Comando di inizializzazione personalizzato", "es": "Comando Iinit personalizado", "pl": "Niestandardowe polecenie Iinit", "uk": "Спеціальна команда Iinit", "zh-cn": "自定义 Iinit 命令"}, - "dataBits": { "en": "databits", "de": "Daten Bits", "ru": "данные", "pt": "bits de dados", "nl": "databits", "fr": "Bits de données", "it": "bit di dati", "es": "bits de datos", "pl": "bity danych", "uk": "біти даних", "zh-cn": "数据位"}, - "enableConcatenation": { "en": "Enable concatenation", "de": "Verkettung aktivieren", "ru": "Включить конкатенацию", "pt": "Habilitar concatenação", "nl": "Aaneenschakeling inschakelen", "fr": "Activer la concaténation", "it": "Abilita concatenazione", "es": "Habilitar la concatenación", "pl": "Włącz konkatenację", "uk": "Увімкнути конкатенацію", "zh-cn": "启用串联"}, - "even": { "en": "even", "de": "even", "ru": "even", "pt": "even", "nl": "even", "fr": "even", "it": "even", "es": "even", "pl": "even", "uk": "навіть", "zh-cn": "even"}, - "getSignalQuality": { "en": "retrieve signal quality", "de": "Signalqualität abrufen", "ru": "получить качество сигнала", "pt": "recuperar a qualidade do sinal", "nl": "_", "fr": "récupérer la qualité du signal", "it": "recuperare la qualità del segnale", "es": "recuperar la calidad de la señal", "pl": "wyszukiwanie jakości sygnałów", "uk": "отримувати якість сигналу", "zh-cn": "b. 恢复信号质量"}, - "gsm": { "en": "GSM", "de": "GSM", "ru": "GSM", "pt": "GSM", "nl": "GSM", "fr": "GSM", "it": "GSM", "es": "GSM", "pl": "GSM", "uk": "GSM", "zh-cn": "全球通"}, - "gsmsettings": { "en": "GSM settings", "de": "GSM-Einstellungen", "ru": "Настройки GSM", "pt": "Configurações GSM", "nl": "GSM-instellingen", "fr": "Paramètres GSM", "it": "Impostazioni GSM", "es": "Configuraciones GSM", "pl": "Ustawienia GSM", "uk": "Налаштування GSM", "zh-cn": "GSM 设置"}, - "gsmsms adapter settings": { "en": "Adapter settings for gsmsms", "de": "Adaptereinstellungen für gsmsms", "ru": "Настройки адаптера для gsmsms", "pt": "Configurações do adaptador para gsmsms", "nl": "Adapterinstellingen voor gsmsms", "fr": "Paramètres d'adaptateur pour gsmsms", "it": "Impostazioni dell'adattatore per gsmsms", "es": "Ajustes del adaptador para gsmsms", "pl": "Ustawienia adaptera dla gsmsms", "uk": "Налаштування адаптера для gsmsms", "zh-cn": "gsmsms的适配器设置"}, - "incomingCallIndication": { "en": "Incoming call indication", "de": "Anzeige eingehender Anrufe", "ru": "Индикация входящего звонка", "pt": "Indicação de chamada de entrada", "nl": "Inkomende oproep indicatie", "fr": "Indication d'appel entrant", "it": "Indicazione chiamata in arrivo", "es": "Indicación de llamada entrante", "pl": "Wskazanie połączenia przychodzącego", "uk": "Індикація вхідного дзвінка", "zh-cn": "来电显示"}, - "incomingSMSIndication": { "en": "Incoming SMS indication", "de": "Anzeige eingehender SMS", "ru": "Индикация входящего SMS", "pt": "Indicação de entrada de SMS", "nl": "Inkomende SMS indicatie", "fr": "Indication SMS entrant", "it": "Indicazione SMS in arrivo", "es": "Indicación de SMS entrantes", "pl": "Wskazanie przychodzącej wiadomości SMS", "uk": "Індикація вхідних SMS", "zh-cn": "来电短信指示"}, - "mark": { "en": "mark", "de": "mark", "ru": "mark", "pt": "mark", "nl": "mark", "fr": "mark", "it": "mark", "es": "mark", "pl": "mark", "uk": "знак", "zh-cn": "mark"}, - "none": { "en": "none", "de": "none", "ru": "none", "pt": "none", "nl": "none", "fr": "none", "it": "none", "es": "none", "pl": "none", "uk": "немає", "zh-cn": "none"}, - "odd": { "en": "odd", "de": "odd", "ru": "odd", "pt": "odd", "nl": "odd", "fr": "odd", "it": "odd", "es": "odd", "pl": "odd", "uk": "непарний", "zh-cn": "odd"}, - "parity": { "en": "parity", "de": "Parität", "ru": "паритет", "pt": "paridade", "nl": "pariteit", "fr": "parité", "it": "parità", "es": "paridad", "pl": "parytet", "uk": "паритет", "zh-cn": "平价"}, - "pin": { "en": "PIN (if activated on SIM)", "de": "PIN (sofern auf SIM aktiviert)", "ru": "PIN-код (если активирован на SIM-карте)", "pt": "PIN (se ativado no SIM)", "nl": "PIN (indien geactiveerd op SIM)", "fr": "PIN (si activé sur SIM)", "it": "PIN (se attivato su SIM)", "es": "PIN (si está activado en SIM)", "pl": "PIN (jeśli aktywowany na karcie SIM)", "uk": "PIN (якщо активований на SIM-карті)", "zh-cn": "PIN(如果在 SIM 卡上激活)"}, - "polling": { "en": "Retrieval", "de": "Abruf", "ru": "Воспроизведение", "pt": "Recuperação", "nl": "Ophalen", "fr": "Récupération", "it": "Recupero", "es": "Recuperación", "pl": "Wyszukiwanie", "uk": "Пошук", "zh-cn": "恢复"}, - "pollinginterval": { "en": "Retrieval interval (s)", "de": "Abrufintervall (s)", "ru": "Интервал поиска (s)", "pt": "Intervalo de recuperação (s)", "nl": "Ophaalinterval (s)", "fr": "Intervalle de récupération (s)", "it": "Intervallo di recupero (s)", "es": "Intervalo de recuperación (s)", "pl": "Interwał wyszukiwania (s)", "uk": "Інтервал пошуку (с)", "zh-cn": "检索间隔(s)"}, - "port": { "en": "serial port (e.g. /dev/ttyUSB1)", "de": "serielle Schnittstelle (z.B. /dev/ttyUSB1)", "ru": "последовательный порт (например, /dev/ttyUSB1)", "pt": "porta serial (por exemplo, /dev /ttyUSB1)", "nl": "seriële poort (bijv. /dev/ttyUSB1)", "fr": "port série (par exemple /dev/ttyUSB1)", "it": "porta seriale (es. /dev/ttyUSB1)", "es": "puerto serie (por ejemplo, /dev/ttyUSB1)", "pl": "port szeregowy (np. /dev/ttyUSB1)", "uk": "послідовний порт (наприклад, /dev/ttyUSB1)", "zh-cn": "串口(例如 /dev/ttyUSB1)"}, - "portConnection": { "en": "Port- & connection settings", "de": "Port- & Verbindungseinstellungen", "ru": "Настройки порта и подключения", "pt": "Configurações de porta e conexão", "nl": "Poort- & verbindingsinstellingen", "fr": "Paramètres de port et de connexion", "it": "Impostazioni di porta e connessione", "es": "Configuración de puerto y conexión", "pl": "Ustawienia portu i połączenia", "uk": "Параметри портів і підключення", "zh-cn": "端口和连接设置"}, - "rtscts": { "en": "RTS/CTS", "de": "RTS/CTS", "ru": "RTS / CTS", "pt": "RTS / CTS", "nl": "RTS/CTS", "fr": "RTS/CTS", "it": "RTS/CTS", "es": "RTS / CTS", "pl": "RTS/CTS", "uk": "RTS/CTS", "zh-cn": "RTS/CTS"}, - "sendonly": { "en": "Send only", "de": "Nur senden", "ru": "Только отправить", "pt": "Envie apenas", "nl": "Alleen verzenden", "fr": "Envoyer seulement", "it": "Invia solo", "es": "Solamente enviar", "pl": "Tylko wyślij", "uk": "Тільки відправити", "zh-cn": "只发送"}, - "serialport": { "en": "serial port", "de": "serielle Schnittstelle", "ru": "Серийный порт", "pt": "porta serial", "nl": "seriële poort", "fr": "port série", "it": "porta seriale", "es": "Puerto serial", "pl": "Port szeregowy", "uk": "послідовний порт", "zh-cn": "串行端口"}, - "serialportsettings": { "en": "Serial port setttings", "de": "Einstellungen für den seriellen Anschluss", "ru": "Настройки последовательного порта", "pt": "Configurações de porta serial", "nl": "Instellingen seriële poort", "fr": "Paramètres du port série", "it": "Impostazioni della porta seriale", "es": "Configuración del puerto serie", "pl": "Ustawienia portu szeregowego", "uk": "Параметри послідовного порту", "zh-cn": "串口设置"}, - "space": { "en": "space", "de": "space", "ru": "space", "pt": "space", "nl": "space", "fr": "space", "it": "space", "es": "space", "pl": "space", "uk": "простір", "zh-cn": "space"}, - "stopBits": { "en": "stopbits", "de": "Stopp-Bits", "ru": "стоп-биты", "pt": "paradas", "nl": "stopbits", "fr": "bits d'arrêt", "it": "stopbits", "es": "bits de parada", "pl": "stopbity", "uk": "стоп-біти", "zh-cn": "停止位"}, - "xany": { "en": "xany", "de": "xany", "ru": "xany", "pt": "xany", "nl": "xany", "fr": "xany", "it": "xany", "es": "xany", "pl": "xany", "uk": "xany", "zh-cn": "仙妮"}, - "xoff": { "en": "xoff", "de": "xoff", "ru": "xoff", "pt": "xoff", "nl": "xoff", "fr": "xoff", "it": "xoff", "es": "xoff", "pl": "xoff", "uk": "xoff", "zh-cn": "xoff"}, - "xon": { "en": "xon", "de": "xon", "ru": "xon", "pt": "xon", "nl": "xon", "fr": "xon", "it": "xon", "es": "xon", "pl": "xon", "uk": "xon", "zh-cn": "xon"}, -}; \ No newline at end of file + "alwaysopen": { + "en": "Allways open", + "de": "Immer geöffnet", + "ru": "Всегда открыт", + "pt": "Sempre aberto", + "nl": "Altijd open", + "fr": "Toujours ouvert", + "it": "Sempre aperto", + "es": "Siempre abierto", + "pl": "Zawsze otwarte", + "uk": "Завжди відкрита", + "zh-cn": "永远开放" + }, + "autoDeleteOnReceive": { + "en": "Auto delete on recieve", + "de": "Automatisches Löschen bei Empfang", + "ru": "Автоматическое удаление при получении", + "pt": "Apagar automaticamente ao receber", + "nl": "Automatisch verwijderen bij ontvangst", + "fr": "Suppression automatique à la réception", + "it": "Eliminazione automatica alla ricezione", + "es": "Eliminar automáticamente al recibir", + "pl": "Automatyczne usuwanie przy odbiorze", + "uk": "Автоматичне видалення при отриманні", + "zh-cn": "收到后自动删除" + }, + "basic": { + "en": "Basic settings", + "de": "Grundeinstellungen", + "ru": "Основные настройки", + "pt": "Configurações básicas", + "nl": "Basis instellingen", + "fr": "Paramètres de base", + "it": "Impostazioni di base", + "es": "Ajustes básicos", + "pl": "Podstawowe ustawienia", + "uk": "Основні налаштування", + "zh-cn": "基本设置" + }, + "baudRate": { + "en": "Baud rate", + "de": "Baudrate", + "ru": "Скорость передачи", + "pt": "Taxa de transmissão", + "nl": "baudrate", + "fr": "Débit en bauds", + "it": "Velocità di trasmissione", + "es": "Tasa de baudios", + "pl": "Szybkość transmisji", + "uk": "Швидкість передачі даних", + "zh-cn": "波特率" + }, + "cnmiModemClosed": { + "en": "CNMI when modem closed", + "de": "CNMI bei geschlossenem Modem", + "ru": "CNMI при закрытом модеме", + "pt": "CNMI quando o modem está fechado", + "nl": "CNMI wanneer modem gesloten is", + "fr": "CNMI à la fermeture du modem", + "it": "CNMI quando il modem è chiuso", + "es": "CNMI cuando el módem está cerrado", + "pl": "CNMI po zamknięciu modemu", + "uk": "CNMI, коли модем закритий", + "zh-cn": "调制解调器关闭时的 CNMI" + }, + "cnmiModemOpen": { + "en": "CNMI when modem open", + "de": "CNMI bei geöffnetem Modem", + "ru": "CNMI при открытом модеме", + "pt": "CNMI quando o modem abre", + "nl": "CNMI wanneer modem open is", + "fr": "CNMI à l'ouverture du modem", + "it": "CNMI quando il modem è aperto", + "es": "CNMI cuando el módem está abierto", + "pl": "CNMI, gdy modem jest otwarty", + "uk": "CNMI, коли модем відкритий", + "zh-cn": "调制解调器打开时的 CNMI" + }, + "connectionMode": { + "en": "Connection mode", + "de": "Verbindungsmodus", + "ru": "Режим подключения", + "pt": "Modo de conexão", + "nl": "Verbindingsmodus", + "fr": "Mode de connexion", + "it": "Modalità di connessione", + "es": "Modo de conexión", + "pl": "Tryb połączenia", + "uk": "Режим підключення", + "zh-cn": "连接方式" + }, + "customInitCommand": { + "en": "Custom Iinit command", + "de": "Benutzerdefinierter Iinit-Befehl", + "ru": "Пользовательская команда Iinit", + "pt": "Comando Iinit personalizado", + "nl": "Aangepast Iinit-commando", + "fr": "Commande Iinit personnalisée", + "it": "Comando di inizializzazione personalizzato", + "es": "Comando Iinit personalizado", + "pl": "Niestandardowe polecenie Iinit", + "uk": "Спеціальна команда Iinit", + "zh-cn": "自定义 Iinit 命令" + }, + "dataBits": { + "en": "databits", + "de": "Daten Bits", + "ru": "данные", + "pt": "bits de dados", + "nl": "databits", + "fr": "Bits de données", + "it": "bit di dati", + "es": "bits de datos", + "pl": "bity danych", + "uk": "біти даних", + "zh-cn": "数据位" + }, + "enableConcatenation": { + "en": "Enable concatenation", + "de": "Verkettung aktivieren", + "ru": "Включить конкатенацию", + "pt": "Habilitar concatenação", + "nl": "Aaneenschakeling inschakelen", + "fr": "Activer la concaténation", + "it": "Abilita concatenazione", + "es": "Habilitar la concatenación", + "pl": "Włącz konkatenację", + "uk": "Увімкнути конкатенацію", + "zh-cn": "启用串联" + }, + "even": { + "en": "even", + "de": "even", + "ru": "even", + "pt": "even", + "nl": "even", + "fr": "even", + "it": "even", + "es": "even", + "pl": "even", + "uk": "навіть", + "zh-cn": "even" + }, + "getSignalQuality": { + "en": "retrieve signal quality", + "de": "Signalqualität abrufen", + "ru": "получить качество сигнала", + "pt": "recuperar a qualidade do sinal", + "nl": "_", + "fr": "récupérer la qualité du signal", + "it": "recuperare la qualità del segnale", + "es": "recuperar la calidad de la señal", + "pl": "wyszukiwanie jakości sygnałów", + "uk": "отримувати якість сигналу", + "zh-cn": "b. 恢复信号质量" + }, + "gsm": { + "en": "GSM", + "de": "GSM", + "ru": "GSM", + "pt": "GSM", + "nl": "GSM", + "fr": "GSM", + "it": "GSM", + "es": "GSM", + "pl": "GSM", + "uk": "GSM", + "zh-cn": "全球通" + }, + "gsmsettings": { + "en": "GSM settings", + "de": "GSM-Einstellungen", + "ru": "Настройки GSM", + "pt": "Configurações GSM", + "nl": "GSM-instellingen", + "fr": "Paramètres GSM", + "it": "Impostazioni GSM", + "es": "Configuraciones GSM", + "pl": "Ustawienia GSM", + "uk": "Налаштування GSM", + "zh-cn": "GSM 设置" + }, + "gsmsms adapter settings": { + "en": "Adapter settings for gsmsms", + "de": "Adaptereinstellungen für gsmsms", + "ru": "Настройки адаптера для gsmsms", + "pt": "Configurações do adaptador para gsmsms", + "nl": "Adapterinstellingen voor gsmsms", + "fr": "Paramètres d'adaptateur pour gsmsms", + "it": "Impostazioni dell'adattatore per gsmsms", + "es": "Ajustes del adaptador para gsmsms", + "pl": "Ustawienia adaptera dla gsmsms", + "uk": "Налаштування адаптера для gsmsms", + "zh-cn": "gsmsms的适配器设置" + }, + "incomingCallIndication": { + "en": "Incoming call indication", + "de": "Anzeige eingehender Anrufe", + "ru": "Индикация входящего звонка", + "pt": "Indicação de chamada de entrada", + "nl": "Inkomende oproep indicatie", + "fr": "Indication d'appel entrant", + "it": "Indicazione chiamata in arrivo", + "es": "Indicación de llamada entrante", + "pl": "Wskazanie połączenia przychodzącego", + "uk": "Індикація вхідного дзвінка", + "zh-cn": "来电显示" + }, + "incomingSMSIndication": { + "en": "Incoming SMS indication", + "de": "Anzeige eingehender SMS", + "ru": "Индикация входящего SMS", + "pt": "Indicação de entrada de SMS", + "nl": "Inkomende SMS indicatie", + "fr": "Indication SMS entrant", + "it": "Indicazione SMS in arrivo", + "es": "Indicación de SMS entrantes", + "pl": "Wskazanie przychodzącej wiadomości SMS", + "uk": "Індикація вхідних SMS", + "zh-cn": "来电短信指示" + }, + "mark": { + "en": "mark", + "de": "mark", + "ru": "mark", + "pt": "mark", + "nl": "mark", + "fr": "mark", + "it": "mark", + "es": "mark", + "pl": "mark", + "uk": "знак", + "zh-cn": "mark" + }, + "none": { + "en": "none", + "de": "none", + "ru": "none", + "pt": "none", + "nl": "none", + "fr": "none", + "it": "none", + "es": "none", + "pl": "none", + "uk": "немає", + "zh-cn": "none" + }, + "odd": { + "en": "odd", + "de": "odd", + "ru": "odd", + "pt": "odd", + "nl": "odd", + "fr": "odd", + "it": "odd", + "es": "odd", + "pl": "odd", + "uk": "непарний", + "zh-cn": "odd" + }, + "parity": { + "en": "parity", + "de": "Parität", + "ru": "паритет", + "pt": "paridade", + "nl": "pariteit", + "fr": "parité", + "it": "parità", + "es": "paridad", + "pl": "parytet", + "uk": "паритет", + "zh-cn": "平价" + }, + "pin": { + "en": "PIN (if activated on SIM)", + "de": "PIN (sofern auf SIM aktiviert)", + "ru": "PIN-код (если активирован на SIM-карте)", + "pt": "PIN (se ativado no SIM)", + "nl": "PIN (indien geactiveerd op SIM)", + "fr": "PIN (si activé sur SIM)", + "it": "PIN (se attivato su SIM)", + "es": "PIN (si está activado en SIM)", + "pl": "PIN (jeśli aktywowany na karcie SIM)", + "uk": "PIN (якщо активований на SIM-карті)", + "zh-cn": "PIN(如果在 SIM 卡上激活)" + }, + "polling": { + "en": "Retrieval", + "de": "Abruf", + "ru": "Воспроизведение", + "pt": "Recuperação", + "nl": "Ophalen", + "fr": "Récupération", + "it": "Recupero", + "es": "Recuperación", + "pl": "Wyszukiwanie", + "uk": "Пошук", + "zh-cn": "恢复" + }, + "pollinginterval": { + "en": "Retrieval interval (s)", + "de": "Abrufintervall (s)", + "ru": "Интервал поиска (s)", + "pt": "Intervalo de recuperação (s)", + "nl": "Ophaalinterval (s)", + "fr": "Intervalle de récupération (s)", + "it": "Intervallo di recupero (s)", + "es": "Intervalo de recuperación (s)", + "pl": "Interwał wyszukiwania (s)", + "uk": "Інтервал пошуку (с)", + "zh-cn": "检索间隔(s)" + }, + "port": { + "en": "serial port (e.g. /dev/ttyUSB1)", + "de": "serielle Schnittstelle (z.B. /dev/ttyUSB1)", + "ru": "последовательный порт (например, /dev/ttyUSB1)", + "pt": "porta serial (por exemplo, /dev /ttyUSB1)", + "nl": "seriële poort (bijv. /dev/ttyUSB1)", + "fr": "port série (par exemple /dev/ttyUSB1)", + "it": "porta seriale (es. /dev/ttyUSB1)", + "es": "puerto serie (por ejemplo, /dev/ttyUSB1)", + "pl": "port szeregowy (np. /dev/ttyUSB1)", + "uk": "послідовний порт (наприклад, /dev/ttyUSB1)", + "zh-cn": "串口(例如 /dev/ttyUSB1)" + }, + "portConnection": { + "en": "Port- & connection settings", + "de": "Port- & Verbindungseinstellungen", + "ru": "Настройки порта и подключения", + "pt": "Configurações de porta e conexão", + "nl": "Poort- & verbindingsinstellingen", + "fr": "Paramètres de port et de connexion", + "it": "Impostazioni di porta e connessione", + "es": "Configuración de puerto y conexión", + "pl": "Ustawienia portu i połączenia", + "uk": "Параметри портів і підключення", + "zh-cn": "端口和连接设置" + }, + "rtscts": { + "en": "RTS/CTS", + "de": "RTS/CTS", + "ru": "RTS / CTS", + "pt": "RTS / CTS", + "nl": "RTS/CTS", + "fr": "RTS/CTS", + "it": "RTS/CTS", + "es": "RTS / CTS", + "pl": "RTS/CTS", + "uk": "RTS/CTS", + "zh-cn": "RTS/CTS" + }, + "sendonly": { + "en": "Send only", + "de": "Nur senden", + "ru": "Только отправить", + "pt": "Envie apenas", + "nl": "Alleen verzenden", + "fr": "Envoyer seulement", + "it": "Invia solo", + "es": "Solamente enviar", + "pl": "Tylko wyślij", + "uk": "Тільки відправити", + "zh-cn": "只发送" + }, + "serialport": { + "en": "serial port", + "de": "serielle Schnittstelle", + "ru": "Серийный порт", + "pt": "porta serial", + "nl": "seriële poort", + "fr": "port série", + "it": "porta seriale", + "es": "Puerto serial", + "pl": "Port szeregowy", + "uk": "послідовний порт", + "zh-cn": "串行端口" + }, + "serialportsettings": { + "en": "Serial port setttings", + "de": "Einstellungen für den seriellen Anschluss", + "ru": "Настройки последовательного порта", + "pt": "Configurações de porta serial", + "nl": "Instellingen seriële poort", + "fr": "Paramètres du port série", + "it": "Impostazioni della porta seriale", + "es": "Configuración del puerto serie", + "pl": "Ustawienia portu szeregowego", + "uk": "Параметри послідовного порту", + "zh-cn": "串口设置" + }, + "space": { + "en": "space", + "de": "space", + "ru": "space", + "pt": "space", + "nl": "space", + "fr": "space", + "it": "space", + "es": "space", + "pl": "space", + "uk": "простір", + "zh-cn": "space" + }, + "stopBits": { + "en": "stopbits", + "de": "Stopp-Bits", + "ru": "стоп-биты", + "pt": "paradas", + "nl": "stopbits", + "fr": "bits d'arrêt", + "it": "stopbits", + "es": "bits de parada", + "pl": "stopbity", + "uk": "стоп-біти", + "zh-cn": "停止位" + }, + "xany": { + "en": "xany", + "de": "xany", + "ru": "xany", + "pt": "xany", + "nl": "xany", + "fr": "xany", + "it": "xany", + "es": "xany", + "pl": "xany", + "uk": "xany", + "zh-cn": "仙妮" + }, + "xoff": { + "en": "xoff", + "de": "xoff", + "ru": "xoff", + "pt": "xoff", + "nl": "xoff", + "fr": "xoff", + "it": "xoff", + "es": "xoff", + "pl": "xoff", + "uk": "xoff", + "zh-cn": "xoff" + }, + "xon": { + "en": "xon", + "de": "xon", + "ru": "xon", + "pt": "xon", + "nl": "xon", + "fr": "xon", + "it": "xon", + "es": "xon", + "pl": "xon", + "uk": "xon", + "zh-cn": "xon" + }, + "Basic Settings": { + "en": "Basic Settings", + "de": "Grundeinstellungen", + "ru": "Основные настройки", + "pt": "Configurações básicas", + "nl": "Basic Settings", + "fr": "Paramètres de base", + "it": "Impostazioni di base", + "es": "Ajustes básicos", + "pl": "Podstawy podstawowe", + "uk": "Основні налаштування", + "zh-cn": "基本规定" + } +}; diff --git a/io-package.json b/io-package.json index 80c6599..0072b0d 100644 --- a/io-package.json +++ b/io-package.json @@ -120,8 +120,16 @@ "tier": 1, "materialize": true, "messagebox": true, + "supportedMessages": { + "custom": true, + "notifications": true + }, + "subscribe": "messagebox", "blockly": true, "logTransporter": false, + "adminUI": { + "config": "json" + } "dependencies": [{ "js-controller": ">=3.0.0" }], diff --git a/lib/tools.js b/lib/tools.js new file mode 100644 index 0000000..de83179 --- /dev/null +++ b/lib/tools.js @@ -0,0 +1,99 @@ +const axios = require('axios').default; + +/** + * Tests whether the given variable is a real object and not an Array + * @param {any} it The variable to test + * @returns {it is Record} + */ +function isObject(it) { + // This is necessary because: + // typeof null === 'object' + // typeof [] === 'object' + // [] instanceof Object === true + return Object.prototype.toString.call(it) === '[object Object]'; +} + +/** + * Tests whether the given variable is really an Array + * @param {any} it The variable to test + * @returns {it is any[]} + */ +function isArray(it) { + if (typeof Array.isArray === 'function') return Array.isArray(it); + return Object.prototype.toString.call(it) === '[object Array]'; +} + +/** + * Translates text to the target language. Automatically chooses the right translation API. + * @param {string} text The text to translate + * @param {string} targetLang The target languate + * @param {string} [yandexApiKey] The yandex API key. You can create one for free at https://translate.yandex.com/developers + * @returns {Promise} + */ +async function translateText(text, targetLang, yandexApiKey) { + if (targetLang === 'en') { + return text; + } else if (!text) { + return ''; + } + if (yandexApiKey) { + return translateYandex(text, targetLang, yandexApiKey); + } else { + return translateGoogle(text, targetLang); + } +} + +/** + * Translates text with Yandex API + * @param {string} text The text to translate + * @param {string} targetLang The target languate + * @param {string} apiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers + * @returns {Promise} + */ +async function translateYandex(text, targetLang, apiKey) { + if (targetLang === 'zh-cn') { + targetLang = 'zh'; + } + try { + const url = `https://translate.yandex.net/api/v1.5/tr.json/translate?key=${apiKey}&text=${encodeURIComponent(text)}&lang=en-${targetLang}`; + const response = await axios({url, timeout: 15000}); + if (response.data && response.data.text && isArray(response.data.text)) { + return response.data.text[0]; + } + throw new Error('Invalid response for translate request'); + } catch (e) { + throw new Error(`Could not translate to "${targetLang}": ${e}`); + } +} + +/** + * Translates text with Google API + * @param {string} text The text to translate + * @param {string} targetLang The target languate + * @returns {Promise} + */ +async function translateGoogle(text, targetLang) { + try { + const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`; + const response = await axios({url, timeout: 15000}); + if (isArray(response.data)) { + // we got a valid response + return response.data[0][0][0]; + } + throw new Error('Invalid response for translate request'); + } catch (e) { + if (e.response && e.response.status === 429) { + throw new Error( + `Could not translate to "${targetLang}": Rate-limited by Google Translate` + ); + } else { + throw new Error(`Could not translate to "${targetLang}": ${e}`); + } + } +} + +module.exports = { + isArray, + isObject, + translateText +};