Merge pull request #723 from proddy/dev

fix to base translations, auto generate i18n
This commit is contained in:
Proddy
2022-11-05 14:00:08 +01:00
committed by GitHub
20 changed files with 121 additions and 2629 deletions

8
.gitignore vendored
View File

@@ -11,7 +11,6 @@ debug.log
# platformio # platformio
.pio .pio
pio_local.ini pio_local.ini
/.VSCodeCounter
# OS specific # OS specific
.DS_Store .DS_Store
@@ -29,6 +28,13 @@ test.sh
scripts/__pycache__ scripts/__pycache__
.temp .temp
# i18n generated files
interface/src/i18n/i18n-react.tsx
interface/src/i18n/i18n-types.ts
interface/src/i18n/i18n-util.ts
interface/src/i18n/i18n-util.sync.ts
interface/src/i18n/i18n-util.async.ts
# sonar # sonar
.scannerwork/ .scannerwork/
sonar/ sonar/

View File

@@ -1,5 +1,5 @@
{ {
"adapter": "react", "adapter": "react",
"baseLocale": "en", "baseLocale": "pl",
"$schema": "https://unpkg.com/typesafe-i18n@5.16.2/schema/typesafe-i18n.json" "$schema": "https://unpkg.com/typesafe-i18n@5.16.2/schema/typesafe-i18n.json"
} }

View File

@@ -14,9 +14,9 @@
"@mui/icons-material": "^5.10.9", "@mui/icons-material": "^5.10.9",
"@mui/material": "^5.10.12", "@mui/material": "^5.10.12",
"@table-library/react-table-library": "4.0.23", "@table-library/react-table-library": "4.0.23",
"@types/lodash": "^4.14.187", "@types/lodash": "^4.14.188",
"@types/node": "^18.11.9", "@types/node": "^18.11.9",
"@types/react": "^18.0.24", "@types/react": "^18.0.25",
"@types/react-dom": "^18.0.8", "@types/react-dom": "^18.0.8",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
"async-validator": "^4.2.5", "async-validator": "^4.2.5",
@@ -4007,9 +4007,9 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
}, },
"node_modules/@types/lodash": { "node_modules/@types/lodash": {
"version": "4.14.187", "version": "4.14.188",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.187.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.188.tgz",
"integrity": "sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A==" "integrity": "sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w=="
}, },
"node_modules/@types/mime": { "node_modules/@types/mime": {
"version": "3.0.1", "version": "3.0.1",
@@ -4052,9 +4052,9 @@
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "18.0.24", "version": "18.0.25",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.24.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz",
"integrity": "sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q==", "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==",
"dependencies": { "dependencies": {
"@types/prop-types": "*", "@types/prop-types": "*",
"@types/scheduler": "*", "@types/scheduler": "*",
@@ -20194,9 +20194,9 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
}, },
"@types/lodash": { "@types/lodash": {
"version": "4.14.187", "version": "4.14.188",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.187.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.188.tgz",
"integrity": "sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A==" "integrity": "sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w=="
}, },
"@types/mime": { "@types/mime": {
"version": "3.0.1", "version": "3.0.1",
@@ -20239,9 +20239,9 @@
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
}, },
"@types/react": { "@types/react": {
"version": "18.0.24", "version": "18.0.25",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.24.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz",
"integrity": "sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q==", "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==",
"requires": { "requires": {
"@types/prop-types": "*", "@types/prop-types": "*",
"@types/scheduler": "*", "@types/scheduler": "*",

View File

@@ -10,9 +10,9 @@
"@mui/icons-material": "^5.10.9", "@mui/icons-material": "^5.10.9",
"@mui/material": "^5.10.12", "@mui/material": "^5.10.12",
"@table-library/react-table-library": "4.0.23", "@table-library/react-table-library": "4.0.23",
"@types/lodash": "^4.14.187", "@types/lodash": "^4.14.188",
"@types/node": "^18.11.9", "@types/node": "^18.11.9",
"@types/react": "^18.0.24", "@types/react": "^18.0.25",
"@types/react-dom": "^18.0.8", "@types/react-dom": "^18.0.8",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
"async-validator": "^4.2.5", "async-validator": "^4.2.5",

View File

@@ -1,4 +1,6 @@
import type { Translation } from '../i18n-types'; import type { Translation } from '../i18n-types';
/* prettier-ignore */
/* eslint-disable */
const de: Translation = { const de: Translation = {
LANGUAGE: 'Sprache', LANGUAGE: 'Sprache',
@@ -64,11 +66,11 @@ const de: Translation = {
STARTVALUE: 'Startwert', STARTVALUE: 'Startwert',
WARN_GPIO: 'Warnung: Vorsicht bei der korrekten Wahl des GPIO!', WARN_GPIO: 'Warnung: Vorsicht bei der korrekten Wahl des GPIO!',
EDIT: 'Editiere', EDIT: 'Editiere',
TEMP_SENSOR: '{{Sensor|Temperatursensor}}', SENSOR: 'Sensor',
TEMP_SENSOR: 'Temperatursensor',
TEMP_SENSORS: 'Temperatursensoren', TEMP_SENSORS: 'Temperatursensoren',
WRITE_COMMAND: 'Befehl schreiben {cmd}', WRITE_COMMAND: 'Befehl schreiben {cmd}',
EMS_BUS_WARNING: EMS_BUS_WARNING: 'EMS-Bus getrennt. Wenn diese Warnung nach einigen Sekunden immer noch besteht, überprüfen Sie bitte die Einstellungen und das Board-Profil',
'EMS-Bus getrennt. Wenn diese Warnung nach einigen Sekunden immer noch besteht, überprüfen Sie bitte die Einstellungen und das Board-Profil',
EMS_BUS_SCANNING: 'Suche nach EMS Geräten...', EMS_BUS_SCANNING: 'Suche nach EMS Geräten...',
CONNECTED: 'Verbunden', CONNECTED: 'Verbunden',
TX_ISSUES: 'Tx-Probleme - versuchen Sie einen anderen Tx-Modus', TX_ISSUES: 'Tx-Probleme - versuchen Sie einen anderen Tx-Modus',
@@ -104,8 +106,7 @@ const de: Translation = {
CUSTOMIZATION: 'Anpassungen', CUSTOMIZATION: 'Anpassungen',
APPLICATION_RESTARTING: 'EMS-ESP startet neu', APPLICATION_RESTARTING: 'EMS-ESP startet neu',
INTERFACE_BOARD_PROFILE: 'Interface Platinenprofil', INTERFACE_BOARD_PROFILE: 'Interface Platinenprofil',
BOARD_PROFILE_TEXT: BOARD_PROFILE_TEXT: 'Wählen Sie ein vorkonfiguriertes Platinenprofil aus der Liste unten aus oder wählen Sie "Custom", um Ihre eigenen Hardwareeinstellungen zu konfigurieren',
'Wählen Sie ein vorkonfiguriertes Platinenprofil aus der Liste unten aus oder wählen Sie "Custom", um Ihre eigenen Hardwareeinstellungen zu konfigurieren',
BOARD_PROFILE: 'Platinenprofil', BOARD_PROFILE: 'Platinenprofil',
CUSTOM: 'Custom', CUSTOM: 'Custom',
GPIO_OF: '{0} GPIO', GPIO_OF: '{0} GPIO',
@@ -159,8 +160,7 @@ const de: Translation = {
SET_ALL: 'setzen Sie alle', SET_ALL: 'setzen Sie alle',
OPTIONS: 'Optionen', OPTIONS: 'Optionen',
NAME: 'Name', NAME: 'Name',
CUSTOMIZATIONS_RESET: CUSTOMIZATIONS_RESET: 'Möchten Sie wirklich alle Anpassungen entfernen, einschließlich der benutzerdefinierten Einstellungen der Temperatur- und Analogsensoren?',
'Möchten Sie wirklich alle Anpassungen entfernen, einschließlich der benutzerdefinierten Einstellungen der Temperatur- und Analogsensoren?',
DEVICE_ENTITIES: 'Geräteentitäten', DEVICE_ENTITIES: 'Geräteentitäten',
USER_CUSTOMIZATION: 'Benutzeranpassung', USER_CUSTOMIZATION: 'Benutzeranpassung',
SUPPORT_INFORMATION: 'Unterstützende Informationen', SUPPORT_INFORMATION: 'Unterstützende Informationen',
@@ -169,8 +169,7 @@ const de: Translation = {
HELP_INFORMATION_2: 'Für einen Live-Community-Chat besuchen Sie unseren Discord-Server', HELP_INFORMATION_2: 'Für einen Live-Community-Chat besuchen Sie unseren Discord-Server',
HELP_INFORMATION_3: 'Um neue Funktionen anzufragen oder Fehler zu melden, eröffnen Sie ein Issue auf Github', HELP_INFORMATION_3: 'Um neue Funktionen anzufragen oder Fehler zu melden, eröffnen Sie ein Issue auf Github',
HELP_INFORMATION_4: 'Bitte laden Sie die System-Details und hängen Sie sie an das Support-Issue an. ', HELP_INFORMATION_4: 'Bitte laden Sie die System-Details und hängen Sie sie an das Support-Issue an. ',
HELP_INFORMATION_5: HELP_INFORMATION_5: 'EMS-ESP ist ein freies Open-Source Projekt. Bitte unterstützen Sie die zukünftige Entwicklung mit einem "Star" auf Github!',
'EMS-ESP ist ein freies Open-Source Projekt. Bitte unterstützen Sie die zukünftige Entwicklung mit einem "Star" auf Github!',
SUPPORT_INFO: 'Support Info', SUPPORT_INFO: 'Support Info',
UPLOAD_OF: '{0} Hochladen', UPLOAD_OF: '{0} Hochladen',
UPLOAD: 'Hochladen', UPLOAD: 'Hochladen',
@@ -208,10 +207,8 @@ const de: Translation = {
COMPACT: 'Kompakte Darstellung', COMPACT: 'Kompakte Darstellung',
ENABLE_OTA: 'OTA Updates verwenden', ENABLE_OTA: 'OTA Updates verwenden',
DOWNLOAD_CUSTOMIZATION_TEXT: 'Herunterladen der individuellen Entitätsanpassungen', DOWNLOAD_CUSTOMIZATION_TEXT: 'Herunterladen der individuellen Entitätsanpassungen',
DOWNLOAD_SETTINGS_TEXT: DOWNLOAD_SETTINGS_TEXT: 'Herunterladen der Anwendungseinstellungen. Vorsicht beim Teilen der Einstellungen, da sie Passwörter und andere sensitive Einstellungen enthalten',
'Herunterladen der Anwendungseinstellungen. Vorsicht beim Teilen der Einstellungen, da sie Passwörter und andere sensitive Einstellungen enthalten', UPLOAD_TEXT: 'Hochladen von neuer Firmware (.bin), Geräte- oder Entitätseinstellungen (.json), zur optionalen Validitätsprüfung zuerst die (.md5) Datei hochladen',
UPLOAD_TEXT:
'Hochladen von neuer Firmware (.bin), Geräte- oder Entitätseinstellungen (.json), zur optionalen Validitätsprüfung zuerst die (.md5) Datei hochladen',
UPLOADING: 'Hochladen', UPLOADING: 'Hochladen',
UPLOAD_DROP_TEXT: 'Klicken Sie hier, oder ziehen eine Datei hierher', UPLOAD_DROP_TEXT: 'Klicken Sie hier, oder ziehen eine Datei hierher',
ERROR: 'Unerwarteter Fehler, bitter versuchen Sie es erneut', ERROR: 'Unerwarteter Fehler, bitter versuchen Sie es erneut',
@@ -221,13 +218,11 @@ const de: Translation = {
USER_WARNING: 'Sie müssen mindestens einen Admin-Nutzer konfigurieren', USER_WARNING: 'Sie müssen mindestens einen Admin-Nutzer konfigurieren',
ADD: 'Hinzufügen', ADD: 'Hinzufügen',
ACCESS_TOKEN_FOR: 'Zugangs-Token für', ACCESS_TOKEN_FOR: 'Zugangs-Token für',
ACCESS_TOKEN_TEXT: ACCESS_TOKEN_TEXT: 'Dieses Token ist für REST API Aufrufe bestimmt, die eine Authentifizierung benötigen. Es kann entweder als Bearer Token im `Authorization-Header` oder in der Access_Token URL verwendet werden.',
'Dieses Token ist für REST API Aufrufe bestimmt, die eine Authentifizierung benötigen. Es kann entweder als Bearer Token im `Authorization-Header` oder in der Access_Token URL verwendet werden.',
GENERATING_TOKEN: 'Erzeuge Token', GENERATING_TOKEN: 'Erzeuge Token',
USER: 'Nutzer', USER: 'Nutzer',
MODIFY: 'Ändern', MODIFY: 'Ändern',
SU_TEXT: SU_TEXT: 'Das su (super user) Passwort wird zum Signieren der Authentifikations-Tokens verwendet und ermöglicht Admin-Berechtigung in der Konsole.',
'Das su (super user) Passwort wird zum Signieren der Authentifikations-Tokens verwendet und ermöglicht Admin-Berechtigung in der Konsole.',
NOT_ENABLED: 'Nicht aktiviert', NOT_ENABLED: 'Nicht aktiviert',
ERRORS_OF: '{0} Fehler', ERRORS_OF: '{0} Fehler',
DISCONNECT_REASON: 'Grund der Verbindungsunterbrechung', DISCONNECT_REASON: 'Grund der Verbindungsunterbrechung',

View File

@@ -1,4 +1,6 @@
import type { BaseTranslation } from '../i18n-types'; import type { BaseTranslation } from '../i18n-types';
/* prettier-ignore */
/* eslint-disable */
const en: BaseTranslation = { const en: BaseTranslation = {
LANGUAGE: 'Language', LANGUAGE: 'Language',
@@ -7,7 +9,7 @@ const en: BaseTranslation = {
IS_REQUIRED: '{0} is required', IS_REQUIRED: '{0} is required',
SIGN_IN: 'Sign In', SIGN_IN: 'Sign In',
SIGN_OUT: 'Sign Out', SIGN_OUT: 'Sign Out',
USERNAME: '{{Username}}', USERNAME: 'Username',
PASSWORD: 'Password', PASSWORD: 'Password',
SU_PASSWORD: 'su Password', SU_PASSWORD: 'su Password',
DASHBOARD: 'Dashboard', DASHBOARD: 'Dashboard',
@@ -19,8 +21,8 @@ const en: BaseTranslation = {
UPLOAD_SUCCESSFUL: 'Upload finished', UPLOAD_SUCCESSFUL: 'Upload finished',
DOWNLOAD_SUCCESSFUL: 'Download finished', DOWNLOAD_SUCCESSFUL: 'Download finished',
INVALID_LOGIN: 'Invalid login details', INVALID_LOGIN: 'Invalid login details',
NETWORK: '{{Network}}', NETWORK: 'Network',
SECURITY: '{{Security}}', SECURITY: 'Security',
ONOFF_CAP: 'ON/OFF', ONOFF_CAP: 'ON/OFF',
ONOFF: 'on/off', ONOFF: 'on/off',
TYPE: 'Type', TYPE: 'Type',
@@ -35,7 +37,7 @@ const en: BaseTranslation = {
VERSION: 'Version', VERSION: 'Version',
BRAND: 'Brand', BRAND: 'Brand',
ENTITY_NAME: 'Entity Name', ENTITY_NAME: 'Entity Name',
VALUE: '{{Value|value}}', VALUE: 'Value',
SHOW_FAV: 'only show favorites', SHOW_FAV: 'only show favorites',
DEVICE_SENSOR_DATA: 'Device and Sensor Data', DEVICE_SENSOR_DATA: 'Device and Sensor Data',
DEVICES_SENSORS: 'Devices & Sensors', DEVICES_SENSORS: 'Devices & Sensors',
@@ -43,7 +45,7 @@ const en: BaseTranslation = {
RUN_COMMAND: 'Call Command', RUN_COMMAND: 'Call Command',
CHANGE_VALUE: 'Change Value', CHANGE_VALUE: 'Change Value',
CANCEL: 'Cancel', CANCEL: 'Cancel',
RESET: '{{Reset}}', RESET: 'Reset',
SEND: 'Send', SEND: 'Send',
SAVE: 'Save', SAVE: 'Save',
REMOVE: 'Remove', REMOVE: 'Remove',
@@ -64,13 +66,13 @@ const en: BaseTranslation = {
STARTVALUE: 'Start value', STARTVALUE: 'Start value',
WARN_GPIO: 'Warning: be careful when assigning a GPIO!', WARN_GPIO: 'Warning: be careful when assigning a GPIO!',
EDIT: 'Edit', EDIT: 'Edit',
TEMP_SENSOR: '{{|Temperature}} Sensor', SENSOR: 'Sensor',
TEMP_SENSOR: 'Temperature Sensor',
TEMP_SENSORS: 'Temperature Sensors', TEMP_SENSORS: 'Temperature Sensors',
WRITE_COMMAND: 'Write command {cmd}', WRITE_COMMAND: 'Write command {cmd}',
EMS_BUS_WARNING: EMS_BUS_WARNING: 'EMS bus disconnected. If this warning still persists after a few seconds please check settings and board profile',
'EMS bus disconnected. If this warning still persists after a few seconds please check settings and board profile',
EMS_BUS_SCANNING: 'Scanning for EMS devices...', EMS_BUS_SCANNING: 'Scanning for EMS devices...',
CONNECTED: '{{Connected}}', CONNECTED: 'Connected',
TX_ISSUES: 'Tx issues - try a different Tx Mode', TX_ISSUES: 'Tx issues - try a different Tx Mode',
DISCONNECTED: 'Disconnected', DISCONNECTED: 'Disconnected',
EMS_SCAN: 'Are you sure you want to initiate a full device scan of the EMS bus?', EMS_SCAN: 'Are you sure you want to initiate a full device scan of the EMS bus?',
@@ -104,15 +106,14 @@ const en: BaseTranslation = {
CUSTOMIZATION: 'Customization', CUSTOMIZATION: 'Customization',
APPLICATION_RESTARTING: 'EMS-ESP is restarting', APPLICATION_RESTARTING: 'EMS-ESP is restarting',
INTERFACE_BOARD_PROFILE: 'Interface Board Profile', INTERFACE_BOARD_PROFILE: 'Interface Board Profile',
BOARD_PROFILE_TEXT: BOARD_PROFILE_TEXT: 'Select a pre-configured interface board profile from the list below or choose Custom to configure your own hardware settings',
'Select a pre-configured interface board profile from the list below or choose Custom to configure your own hardware settings',
BOARD_PROFILE: 'Board Profile', BOARD_PROFILE: 'Board Profile',
CUSTOM: 'Custom', CUSTOM: 'Custom',
GPIO_OF: '{0} GPIO', GPIO_OF: '{0} GPIO',
BUTTON: 'Button', BUTTON: 'Button',
TEMPERATURE: 'Temperature', TEMPERATURE: 'Temperature',
PHY_TYPE: 'Eth PHY Type', PHY_TYPE: 'Eth PHY Type',
DISABLED: '{{disabled}}', DISABLED: 'disabled',
TX_MODE: 'Tx Mode', TX_MODE: 'Tx Mode',
HARDWARE: 'Hardware', HARDWARE: 'Hardware',
EMS_BUS: '{{BUS|EMS BUS}}', EMS_BUS: '{{BUS|EMS BUS}}',
@@ -158,9 +159,8 @@ const en: BaseTranslation = {
SELECT_DEVICE: 'Select a device', SELECT_DEVICE: 'Select a device',
SET_ALL: 'set all', SET_ALL: 'set all',
OPTIONS: 'Options', OPTIONS: 'Options',
NAME: '{{Name}}', NAME: 'Name',
CUSTOMIZATIONS_RESET: CUSTOMIZATIONS_RESET: 'Are you sure you want remove all customizations including the custom settings of the Temperature and Analog sensors?',
'Are you sure you want remove all customizations including the custom settings of the Temperature and Analog sensors?',
DEVICE_ENTITIES: 'Device Entities', DEVICE_ENTITIES: 'Device Entities',
USER_CUSTOMIZATION: 'User Customization', USER_CUSTOMIZATION: 'User Customization',
SUPPORT_INFORMATION: 'Support Information', SUPPORT_INFORMATION: 'Support Information',
@@ -168,18 +168,16 @@ const en: BaseTranslation = {
HELP_INFORMATION_1: 'Visit the online wiki to get instructions on how to configure EMS-ESP', HELP_INFORMATION_1: 'Visit the online wiki to get instructions on how to configure EMS-ESP',
HELP_INFORMATION_2: 'For live community chat join our Discord server', HELP_INFORMATION_2: 'For live community chat join our Discord server',
HELP_INFORMATION_3: 'To request a feature or report a bug', HELP_INFORMATION_3: 'To request a feature or report a bug',
HELP_INFORMATION_4: HELP_INFORMATION_4: 'remember to download and attach your system information for a faster response when reporting an issue',
'remember to download and attach your system information for a faster response when reporting an issue', HELP_INFORMATION_5: 'EMS-ESP is a free and open-source project. Please support its future development by giving it a star on Github!',
HELP_INFORMATION_5:
'EMS-ESP is a free and open-source project. Please support its future development by giving it a star on Github!',
SUPPORT_INFO: 'Support Info', SUPPORT_INFO: 'Support Info',
UPLOAD_OF: '{0} Upload', UPLOAD_OF: '{0} Upload',
UPLOAD: 'Upload', UPLOAD: 'Upload',
DOWNLOAD: '{{Download|download|}}', DOWNLOAD: 'Download',
ABORTED: 'aborted', ABORTED: 'aborted',
FAILED: 'failed', FAILED: 'failed',
SUCCESSFUL: 'successful', SUCCESSFUL: 'successful',
SYSTEM: '{{System}}', SYSTEM: 'System',
LOG_OF: '{0} Log', LOG_OF: '{0} Log',
STATUS_OF: '{0} Status', STATUS_OF: '{0} Status',
UPLOAD_DOWNLOAD: 'Upload/Download', UPLOAD_DOWNLOAD: 'Upload/Download',
@@ -190,7 +188,7 @@ const en: BaseTranslation = {
FACTORY_RESET: 'Factory Reset', FACTORY_RESET: 'Factory Reset',
SYSTEM_FACTORY_TEXT: 'Device has been factory reset and will now restart', SYSTEM_FACTORY_TEXT: 'Device has been factory reset and will now restart',
SYSTEM_FACTORY_TEXT_DIALOG: 'Are you sure you want to reset the device to its factory defaults?', SYSTEM_FACTORY_TEXT_DIALOG: 'Are you sure you want to reset the device to its factory defaults?',
VERSION_CHECK: '{{Version Check}}', VERSION_CHECK: 'Version Check',
THE_LATEST: 'The latest', THE_LATEST: 'The latest',
OFFICIAL: 'official', OFFICIAL: 'official',
DEVELOPMENT: 'development', DEVELOPMENT: 'development',
@@ -209,26 +207,22 @@ const en: BaseTranslation = {
COMPACT: 'Compact', COMPACT: 'Compact',
ENABLE_OTA: 'Enable OTA Updates', ENABLE_OTA: 'Enable OTA Updates',
DOWNLOAD_CUSTOMIZATION_TEXT: 'Download the entity customizations', DOWNLOAD_CUSTOMIZATION_TEXT: 'Download the entity customizations',
DOWNLOAD_SETTINGS_TEXT: DOWNLOAD_SETTINGS_TEXT: 'Download the application settings. Be careful when sharing your settings as this file contains passwords and other sensitive system information',
'Download the application settings. Be careful when sharing your settings as this file contains passwords and other sensitive system information', UPLOAD_TEXT: 'Upload a new firmware (.bin) file, settings or customizations (.json) file below, for optional validation upload (.md5) first',
UPLOAD_TEXT:
'Upload a new firmware (.bin) file, settings or customizations (.json) file below, for optional validation upload (.md5) first',
UPLOADING: 'Uploading', UPLOADING: 'Uploading',
UPLOAD_DROP_TEXT: 'Drop file or click here', UPLOAD_DROP_TEXT: 'Drop file or click here',
ERROR: 'Unexpected Error, please try again', ERROR: 'Unexpected Error, please try again',
TIME_SET: 'Time set', TIME_SET: 'Time set',
MANAGE_USERS: 'Manage Users', MANAGE_USERS: 'Manage Users',
IS_ADMIN: '{{is Admin}}', IS_ADMIN: 'is Admin',
USER_WARNING: 'You must have at least one admin user configured', USER_WARNING: 'You must have at least one admin user configured',
ADD: '{{Add}}', ADD: 'Add',
ACCESS_TOKEN_FOR: 'Access Token for', ACCESS_TOKEN_FOR: 'Access Token for',
ACCESS_TOKEN_TEXT: ACCESS_TOKEN_TEXT: 'The token below is used with REST API calls that require authorization. It can be passed either as a Bearer token in the Authorization header or in the access_token URL query parameter.',
'The token below is used with REST API calls that require authorization. It can be passed either as a Bearer token in the Authorization header or in the access_token URL query parameter.',
GENERATING_TOKEN: 'Generating token', GENERATING_TOKEN: 'Generating token',
USER: '{{User}}', USER: 'User',
MODIFY: 'Modify', MODIFY: 'Modify',
SU_TEXT: SU_TEXT: 'The su (super user) password is used to sign authentication tokens and also enable admin privileges within the Console.',
'The su (super user) password is used to sign authentication tokens and also enable admin privileges within the Console.',
NOT_ENABLED: 'Not enabled', NOT_ENABLED: 'Not enabled',
ERRORS_OF: '{0} Errors', ERRORS_OF: '{0} Errors',
DISCONNECT_REASON: 'Disconnect Reason', DISCONNECT_REASON: 'Disconnect Reason',
@@ -252,20 +246,20 @@ const en: BaseTranslation = {
MQTT_INT_SOLAR: 'Solar Modules', MQTT_INT_SOLAR: 'Solar Modules',
MQTT_INT_MIXER: 'Mixer Modules', MQTT_INT_MIXER: 'Mixer Modules',
MQTT_QUEUE: 'MQTT Queue', MQTT_QUEUE: 'MQTT Queue',
DEFAULT: '{{Default}}', DEFAULT: 'Default',
MQTT_CLEAN_SESSION: 'Set Clean Session', MQTT_CLEAN_SESSION: 'Set Clean Session',
MQTT_RETAIN_FLAG: 'Always set Retain flag', MQTT_RETAIN_FLAG: 'Always set Retain flag',
INACTIVE: 'Inactive', INACTIVE: 'Inactive',
ACTIVE: 'Active', ACTIVE: 'Active',
UNKNOWN: 'Unknown', UNKNOWN: 'Unknown',
SET_TIME: '{{Set Time}}', SET_TIME: 'Set Time',
SET_TIME_TEXT: 'Enter local date and time below to set the time', SET_TIME_TEXT: 'Enter local date and time below to set the time',
LOCAL_TIME: 'Local Time', LOCAL_TIME: 'Local Time',
UTC_TIME: 'UTC Time', UTC_TIME: 'UTC Time',
ENABLE_NTP: 'Enable NTP', ENABLE_NTP: 'Enable NTP',
NTP_SERVER: 'NTP Server', NTP_SERVER: 'NTP Server',
TIME_ZONE: 'Time Zone', TIME_ZONE: 'Time Zone',
ACCESS_POINT: '{{Access Point}}', ACCESS_POINT: 'Access Point',
AP_PROVIDE: 'Enable Access Point', AP_PROVIDE: 'Enable Access Point',
AP_PROVIDE_TEXT_1: 'always', AP_PROVIDE_TEXT_1: 'always',
AP_PROVIDE_TEXT_2: 'when WiFi is disconnected', AP_PROVIDE_TEXT_2: 'when WiFi is disconnected',

View File

@@ -1,10 +1,9 @@
import type { FormattersInitializer } from 'typesafe-i18n'; import type { FormattersInitializer } from 'typesafe-i18n';
import type { Locales, Formatters } from './i18n-types'; import type { Locales, Formatters } from './i18n-types';
import { date } from 'typesafe-i18n/formatters';
export const initFormatters: FormattersInitializer<Locales, Formatters> = (locale: Locales) => { export const initFormatters: FormattersInitializer<Locales, Formatters> = (locale: Locales) => {
const formatters: Formatters = { const formatters: Formatters = {
weekday: date(locale, { weekday: 'long' }) // add your formatter functions here
}; };
return formatters; return formatters;

View File

@@ -1,16 +0,0 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import { useContext } from 'react'
import { initI18nReact } from 'typesafe-i18n/react'
import type { I18nContextType } from 'typesafe-i18n/react'
import type { Formatters, Locales, TranslationFunctions, Translations } from './i18n-types'
import { loadedFormatters, loadedLocales } from './i18n-util'
const { component: TypesafeI18n, context: I18nContext } = initI18nReact<Locales, Translations, TranslationFunctions, Formatters>(loadedLocales, loadedFormatters)
const useI18nContext = (): I18nContextType<Locales, Translations, TranslationFunctions> => useContext(I18nContext)
export { I18nContext, useI18nContext }
export default TypesafeI18n

File diff suppressed because it is too large Load Diff

View File

@@ -1,31 +0,0 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import { initFormatters } from './formatters'
import type { Locales, Translations } from './i18n-types'
import { loadedFormatters, loadedLocales, locales } from './i18n-util'
const localeTranslationLoaders = {
de: () => import('./de'),
en: () => import('./en'),
nl: () => import('./nl'),
no: () => import('./no'),
pl: () => import('./pl'),
se: () => import('./se'),
}
const updateDictionary = (locale: Locales, dictionary: Partial<Translations>): Translations =>
loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary }
export const importLocaleAsync = async (locale: Locales): Promise<Translations> =>
(await localeTranslationLoaders[locale]()).default as unknown as Translations
export const loadLocaleAsync = async (locale: Locales): Promise<void> => {
updateDictionary(locale, await importLocaleAsync(locale))
loadFormatters(locale)
}
export const loadAllLocalesAsync = (): Promise<void[]> => Promise.all(locales.map(loadLocaleAsync))
export const loadFormatters = (locale: Locales): void =>
void (loadedFormatters[locale] = initFormatters(locale))

View File

@@ -1,34 +0,0 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import { initFormatters } from './formatters'
import type { Locales, Translations } from './i18n-types'
import { loadedFormatters, loadedLocales, locales } from './i18n-util'
import de from './de'
import en from './en'
import nl from './nl'
import no from './no'
import pl from './pl'
import se from './se'
const localeTranslations = {
de,
en,
nl,
no,
pl,
se,
}
export const loadLocale = (locale: Locales): void => {
if (loadedLocales[locale]) return
loadedLocales[locale] = localeTranslations[locale] as unknown as Translations
loadFormatters(locale)
}
export const loadAllLocales = (): void => locales.forEach(loadLocale)
export const loadFormatters = (locale: Locales): void =>
void (loadedFormatters[locale] = initFormatters(locale))

View File

@@ -1,39 +0,0 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import { i18n as initI18n, i18nObject as initI18nObject, i18nString as initI18nString } from 'typesafe-i18n'
import type { LocaleDetector } from 'typesafe-i18n/detectors'
import type { LocaleTranslationFunctions, TranslateByString } from 'typesafe-i18n'
import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors'
import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types'
export const baseLocale: Locales = 'en'
export const locales: Locales[] = [
'de',
'en',
'nl',
'no',
'pl',
'se'
]
export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales)
export const loadedLocales: Record<Locales, Translations> = {} as Record<Locales, Translations>
export const loadedFormatters: Record<Locales, Formatters> = {} as Record<Locales, Formatters>
export const i18nString = (locale: Locales): TranslateByString => initI18nString<Locales, Formatters>(locale, loadedFormatters[locale])
export const i18nObject = (locale: Locales): TranslationFunctions =>
initI18nObject<Locales, Translations, TranslationFunctions, Formatters>(
locale,
loadedLocales[locale],
loadedFormatters[locale]
)
export const i18n = (): LocaleTranslationFunctions<Locales, Translations, TranslationFunctions> =>
initI18n<Locales, Translations, TranslationFunctions, Formatters>(loadedLocales, loadedFormatters)
export const detectLocale = (...detectors: LocaleDetector[]): Locales => detectLocaleFn<Locales>(baseLocale, locales, ...detectors)

View File

@@ -1,4 +1,5 @@
import type { Translation } from '../i18n-types'; import type { Translation } from '../i18n-types';
// prettier-ignore
const nl: Translation = { const nl: Translation = {
LANGUAGE: 'Taal', LANGUAGE: 'Taal',
@@ -64,11 +65,11 @@ const nl: Translation = {
STARTVALUE: 'Startwaarde', STARTVALUE: 'Startwaarde',
WARN_GPIO: 'Waarschuwing: let op met het koppelen van de juiste GPIO pin!', WARN_GPIO: 'Waarschuwing: let op met het koppelen van de juiste GPIO pin!',
EDIT: 'Wijzigen', EDIT: 'Wijzigen',
TEMP_SENSOR: '{{Sensor|Temperatuur sensor}}', SENSOR: 'Sensor',
TEMP_SENSOR: 'Temperatuur sensor',
TEMP_SENSORS: 'Temperatuur Sensoren', TEMP_SENSORS: 'Temperatuur Sensoren',
WRITE_COMMAND: 'Schrijf commando {cmd}', WRITE_COMMAND: 'Schrijf commando {cmd}',
EMS_BUS_WARNING: EMS_BUS_WARNING: 'EMS bus niet gevonden. Als deze waarschuwing blijft staan na een paar seconden dan loop de instellingen na en in het bijzonder het apparaat type profiel na.',
'EMS bus niet gevonden. Als deze waarschuwing blijft staan na een paar seconden dan loop de instellingen na en in het bijzonder het apparaat type profiel na.',
EMS_BUS_SCANNING: 'Scannen naar EMS apparaten...', EMS_BUS_SCANNING: 'Scannen naar EMS apparaten...',
CONNECTED: 'Verbonden', CONNECTED: 'Verbonden',
TX_ISSUES: 'Tx bus probleem. Probeer een andere Tx verzendmodus', TX_ISSUES: 'Tx bus probleem. Probeer een andere Tx verzendmodus',
@@ -104,8 +105,7 @@ const nl: Translation = {
CUSTOMIZATION: 'Custom aanpassingen', CUSTOMIZATION: 'Custom aanpassingen',
APPLICATION_RESTARTING: 'EMS-ESP herstarten', APPLICATION_RESTARTING: 'EMS-ESP herstarten',
INTERFACE_BOARD_PROFILE: 'Interface Apparaatprofiel', INTERFACE_BOARD_PROFILE: 'Interface Apparaatprofiel',
BOARD_PROFILE_TEXT: BOARD_PROFILE_TEXT: 'Selecteer een vooraf ingesteld apparaat profiel uit de lijst of kies Eigen om zelf uw hardware te configureren',
'Selecteer een vooraf ingesteld apparaat profiel uit de lijst of kies Eigen om zelf uw hardware te configureren',
BOARD_PROFILE: 'Apparaatprofiel', BOARD_PROFILE: 'Apparaatprofiel',
CUSTOM: 'Custom', CUSTOM: 'Custom',
GPIO_OF: '{0} GPIO', GPIO_OF: '{0} GPIO',
@@ -159,8 +159,7 @@ const nl: Translation = {
SET_ALL: 'Alles aanzetten', SET_ALL: 'Alles aanzetten',
OPTIONS: 'Opties', OPTIONS: 'Opties',
NAME: 'Naam', NAME: 'Naam',
CUSTOMIZATIONS_RESET: CUSTOMIZATIONS_RESET: 'Weet je zeker dat je alle custom aanpassingen wilt verwijderen inclusief de custom instellingen voor analoge temperatuursensoren?',
'Weet je zeker dat je alle custom aanpassingen wilt verwijderen inclusief de custom instellingen voor analoge temperatuursensoren?',
DEVICE_ENTITIES: 'Apparaat Entiteiten', DEVICE_ENTITIES: 'Apparaat Entiteiten',
USER_CUSTOMIZATION: 'Custom Instellingen', USER_CUSTOMIZATION: 'Custom Instellingen',
SUPPORT_INFORMATION: 'Support Informatie', SUPPORT_INFORMATION: 'Support Informatie',
@@ -207,8 +206,7 @@ const nl: Translation = {
COMPACT: 'Compact', COMPACT: 'Compact',
ENABLE_OTA: 'Acitveer OTA Updates', ENABLE_OTA: 'Acitveer OTA Updates',
DOWNLOAD_CUSTOMIZATION_TEXT: 'Download alle custom instellingen', DOWNLOAD_CUSTOMIZATION_TEXT: 'Download alle custom instellingen',
DOWNLOAD_SETTINGS_TEXT: DOWNLOAD_SETTINGS_TEXT: 'Download de applicatie settings. Wees voorzichting met het delen van dit bestand want het bevat o.a. de wachtwoorden in plain text',
'Download de applicatie settings. Wees voorzichting met het delen van dit bestand want het bevat o.a. de wachtwoorden in plain text',
UPLOAD_TEXT: 'Upload een nieuwe firmware (.bin) file, instellingen of custom instellingen (.json) bestand hieronder', UPLOAD_TEXT: 'Upload een nieuwe firmware (.bin) file, instellingen of custom instellingen (.json) bestand hieronder',
UPLOADING: 'Uploading', UPLOADING: 'Uploading',
UPLOAD_DROP_TEXT: 'Sleep bestand hierheen of klik hier', UPLOAD_DROP_TEXT: 'Sleep bestand hierheen of klik hier',
@@ -219,13 +217,11 @@ const nl: Translation = {
USER_WARNING: 'U dient tenminste 1 admin gebruiker te configureren', USER_WARNING: 'U dient tenminste 1 admin gebruiker te configureren',
ADD: 'Toevoegen', ADD: 'Toevoegen',
ACCESS_TOKEN_FOR: 'Access Token voor', ACCESS_TOKEN_FOR: 'Access Token voor',
ACCESS_TOKEN_TEXT: ACCESS_TOKEN_TEXT: 'Het token hieronder wordt gebruikt voor de REST API calls die authorisatie nodig hebben. Het kan zowel als Bearer token in de Authorization header of in acccess_token URL query parameter gebruikt worden',
'Het token hieronder wordt gebruikt voor de REST API calls die authorisatie nodig hebben. Het kan zowel als Bearer token in de Authorization header of in acccess_token URL query parameter gebruikt worden',
GENERATING_TOKEN: 'Token aan het genereren', GENERATING_TOKEN: 'Token aan het genereren',
USER: 'Gebruiker', USER: 'Gebruiker',
MODIFY: 'Aanpassen', MODIFY: 'Aanpassen',
SU_TEXT: SU_TEXT: 'Het su (super user) wachtwoord wordt gebruikt om authorisatie tokens te signeren en ook om admin privileges te activeren in de console.',
'Het su (super user) wachtwoord wordt gebruikt om authorisatie tokens te signeren en ook om admin privileges te activeren in de console.',
NOT_ENABLED: 'Niet geactiveerd', NOT_ENABLED: 'Niet geactiveerd',
ERRORS_OF: '{0} Foutmeldingen', ERRORS_OF: '{0} Foutmeldingen',
DISCONNECT_REASON: 'Verbinding verbroken vanwege', DISCONNECT_REASON: 'Verbinding verbroken vanwege',

View File

@@ -1,4 +1,6 @@
import type { Translation } from '../i18n-types'; import type { Translation } from '../i18n-types';
/* prettier-ignore */
/* eslint-disable */
const no: Translation = { const no: Translation = {
LANGUAGE: 'Språk', LANGUAGE: 'Språk',
@@ -64,11 +66,11 @@ const no: Translation = {
STARTVALUE: 'Startverdi', STARTVALUE: 'Startverdi',
WARN_GPIO: 'Advarsel: vær forsiktig ved aktivering av GPIO!', WARN_GPIO: 'Advarsel: vær forsiktig ved aktivering av GPIO!',
EDIT: 'Endre', EDIT: 'Endre',
TEMP_SENSOR: '{{Sensor|Temperatursensor}}', SENSOR: 'Sensor',
TEMP_SENSOR: 'Temperatursensor',
TEMP_SENSORS: 'Temperaturesensorer', TEMP_SENSORS: 'Temperaturesensorer',
WRITE_COMMAND: 'Skriv kommando {cmd}', WRITE_COMMAND: 'Skriv kommando {cmd}',
EMS_BUS_WARNING: EMS_BUS_WARNING: 'EMS bussen koblet ned. Hvis denne advarselen fortsetter etter noen f¨sekunder sjekk instillinger og prosessorkort',
'EMS bussen koblet ned. Hvis denne advarselen fortsetter etter noen f¨sekunder sjekk instillinger og prosessorkort',
EMS_BUS_SCANNING: 'Søker etter EMS enheter...', EMS_BUS_SCANNING: 'Søker etter EMS enheter...',
CONNECTED: 'Tilkoblet', CONNECTED: 'Tilkoblet',
TX_ISSUES: 'Tx problemer - prøv en annen Tx Modus', TX_ISSUES: 'Tx problemer - prøv en annen Tx Modus',
@@ -104,8 +106,7 @@ const no: Translation = {
CUSTOMIZATION: 'Tilpasninger', CUSTOMIZATION: 'Tilpasninger',
APPLICATION_RESTARTING: 'EMS-ESP restarter', APPLICATION_RESTARTING: 'EMS-ESP restarter',
INTERFACE_BOARD_PROFILE: 'Interface Prosessor Profil', INTERFACE_BOARD_PROFILE: 'Interface Prosessor Profil',
BOARD_PROFILE_TEXT: BOARD_PROFILE_TEXT: 'Velg en pre-konfigurert prosessor profil fra listen under eller velg Tilpasset for å konfigurere dine egne innstillinger',
'Velg en pre-konfigurert prosessor profil fra listen under eller velg Tilpasset for å konfigurere dine egne innstillinger',
BOARD_PROFILE: 'Prosessor Profil', BOARD_PROFILE: 'Prosessor Profil',
CUSTOM: 'Custom', CUSTOM: 'Custom',
GPIO_OF: '{0} GPIO', GPIO_OF: '{0} GPIO',
@@ -159,8 +160,7 @@ const no: Translation = {
SET_ALL: 'sett alle', SET_ALL: 'sett alle',
OPTIONS: 'Alternativ', OPTIONS: 'Alternativ',
NAME: 'Navn', NAME: 'Navn',
CUSTOMIZATIONS_RESET: CUSTOMIZATIONS_RESET: 'Er du sikker på att du vil fjerne tilpassninger inkludert innstillinger for Temperatur og Analoge sensorer?',
'Er du sikker på att du vil fjerne tilpassninger inkludert innstillinger for Temperatur og Analoge sensorer?',
DEVICE_ENTITIES: 'Enhets objekter', DEVICE_ENTITIES: 'Enhets objekter',
USER_CUSTOMIZATION: 'Brukertilpasninger', USER_CUSTOMIZATION: 'Brukertilpasninger',
SUPPORT_INFORMATION: 'Supportinformasjon', SUPPORT_INFORMATION: 'Supportinformasjon',
@@ -168,8 +168,7 @@ const no: Translation = {
HELP_INFORMATION_1: 'Besøk wiki for instruksjoner for å konfigurere EMS-ESP', HELP_INFORMATION_1: 'Besøk wiki for instruksjoner for å konfigurere EMS-ESP',
HELP_INFORMATION_2: 'For community-support besøk vår Discord-server', HELP_INFORMATION_2: 'For community-support besøk vår Discord-server',
HELP_INFORMATION_3: 'For å be om en ny funksjon eller melde feil', HELP_INFORMATION_3: 'For å be om en ny funksjon eller melde feil',
HELP_INFORMATION_4: HELP_INFORMATION_4: 'husk å laste ned og legg ved din systeminformasjon for en raskere respons når du rapporterer et problem',
'husk å laste ned og legg ved din systeminformasjon for en raskere respons når du rapporterer et problem',
HELP_INFORMATION_5: 'EMS-ESP er gratis og åpen kildekode. Bidra til utviklingen ved å gi oss en stjerne på GitHub!', HELP_INFORMATION_5: 'EMS-ESP er gratis og åpen kildekode. Bidra til utviklingen ved å gi oss en stjerne på GitHub!',
SUPPORT_INFO: 'Supportinfo', SUPPORT_INFO: 'Supportinfo',
UPLOAD_OF: '{0} Opplasning', UPLOAD_OF: '{0} Opplasning',
@@ -208,8 +207,7 @@ const no: Translation = {
COMPACT: 'Komprimere', COMPACT: 'Komprimere',
ENABLE_OTA: 'Aktiviser OTA oppdateringer', ENABLE_OTA: 'Aktiviser OTA oppdateringer',
DOWNLOAD_CUSTOMIZATION_TEXT: 'Last ned objektstilpasninger', DOWNLOAD_CUSTOMIZATION_TEXT: 'Last ned objektstilpasninger',
DOWNLOAD_SETTINGS_TEXT: DOWNLOAD_SETTINGS_TEXT: 'Last ned applikasjonskonfigurasjon. Vær varsom med å dele fila da den inneholder passord og annen sensitiv system informasjon',
'Last ned applikasjonskonfigurasjon. Vær varsom med å dele fila da den inneholder passord og annen sensitiv system informasjon',
UPLOAD_TEXT: 'Last opp en ny firmware (.bin) fil, innstillinger eller tilpassninger (.json) fil nedenfor', UPLOAD_TEXT: 'Last opp en ny firmware (.bin) fil, innstillinger eller tilpassninger (.json) fil nedenfor',
UPLOADING: 'Opplasting', UPLOADING: 'Opplasting',
UPLOAD_DROP_TEXT: 'Slipp fil eller klikk her', UPLOAD_DROP_TEXT: 'Slipp fil eller klikk her',
@@ -220,13 +218,11 @@ const no: Translation = {
USER_WARNING: 'Du må ha minst en admin bruker konfigurert', USER_WARNING: 'Du må ha minst en admin bruker konfigurert',
ADD: 'Legg til', ADD: 'Legg til',
ACCESS_TOKEN_FOR: 'Aksess Token for', ACCESS_TOKEN_FOR: 'Aksess Token for',
ACCESS_TOKEN_TEXT: ACCESS_TOKEN_TEXT: 'Token nedenfor benyttes med REST API-kall som krever autorisering. Den kan sendes med enten som en Bearer token i Authorization-headern eller i access_token URL query-parameter.',
'Token nedenfor benyttes med REST API-kall som krever autorisering. Den kan sendes med enten som en Bearer token i Authorization-headern eller i access_token URL query-parameter.',
GENERATING_TOKEN: 'Generer token', GENERATING_TOKEN: 'Generer token',
USER: 'Bruker', USER: 'Bruker',
MODIFY: 'Endre', MODIFY: 'Endre',
SU_TEXT: SU_TEXT: 'su brukeren (super user) passord benyttes for å signere autentiserings token samt å tillate admin privileger i konsoll modus.',
'su brukeren (super user) passord benyttes for å signere autentiserings token samt å tillate admin privileger i konsoll modus.',
NOT_ENABLED: 'Ikke aktiv', NOT_ENABLED: 'Ikke aktiv',
ERRORS_OF: '{0} Feil', ERRORS_OF: '{0} Feil',
DISCONNECT_REASON: 'Årsak til nedkobling', DISCONNECT_REASON: 'Årsak til nedkobling',

View File

@@ -1,4 +1,6 @@
import type { Translation } from '../i18n-types'; import type { Translation } from '../i18n-types';
/* prettier-ignore */
/* eslint-disable */
const pl: Translation = { const pl: Translation = {
LANGUAGE: 'Język', LANGUAGE: 'Język',
@@ -64,11 +66,11 @@ const pl: Translation = {
STARTVALUE: 'Wartość początkowa', STARTVALUE: 'Wartość początkowa',
WARN_GPIO: 'Uwaga! Zachowaj ostrożność przypisując GPIO do urządzenia!', WARN_GPIO: 'Uwaga! Zachowaj ostrożność przypisując GPIO do urządzenia!',
EDIT: 'Edycja', EDIT: 'Edycja',
TEMP_SENSOR: '{{czujnika temperatury|czujnika|}}', SENSOR: 'czujnika',
TEMP_SENSOR: 'czujnika temperatury',
TEMP_SENSORS: 'Czujniki temperatury 1-Wire®', TEMP_SENSORS: 'Czujniki temperatury 1-Wire®',
WRITE_COMMAND: 'Wyślij komendę {cmd}', WRITE_COMMAND: 'Wyślij komendę {cmd}',
EMS_BUS_WARNING: EMS_BUS_WARNING: 'Brak połączenia z magistralą EMS. Jeśli ten błąd występuje dłużej niż kilka sekund, sprawdź ustawienia oraz profil płytki interfejsu.',
'Brak połączenia z magistralą EMS. Jeśli ten błąd występuje dłużej niż kilka sekund, sprawdź ustawienia oraz profil płytki interfejsu.',
EMS_BUS_SCANNING: 'Trwa skanowanie urządzeń na magistrali EMS...', EMS_BUS_SCANNING: 'Trwa skanowanie urządzeń na magistrali EMS...',
CONNECTED: '{{połączono|połączenie|}}', CONNECTED: '{{połączono|połączenie|}}',
TX_ISSUES: 'Problem z zapisem na magistralę EMS. Spróbuj wybrać inny "Tryb transmisji (Tx)".', TX_ISSUES: 'Problem z zapisem na magistralę EMS. Spróbuj wybrać inny "Tryb transmisji (Tx)".',
@@ -158,8 +160,7 @@ const pl: Translation = {
SET_ALL: 'Ustaw wszystko jako', SET_ALL: 'Ustaw wszystko jako',
OPTIONS: 'Opcje', OPTIONS: 'Opcje',
NAME: '{{Nazwa|nazwa|}}', NAME: '{{Nazwa|nazwa|}}',
CUSTOMIZATIONS_RESET: CUSTOMIZATIONS_RESET: 'Czy jesteś pewien, że chcesz usunąć wszystkie personalizacje łącznie z ustawieniami dla czujników temperatury 1-Wire® i urządzeń podłączonych do EMS-ESP?',
'Czy jesteś pewien, że chcesz usunąć wszystkie personalizacje łącznie z ustawieniami dla czujników temperatury 1-Wire® i urządzeń podłączonych do EMS-ESP?',
DEVICE_ENTITIES: 'Encje urządzenia', DEVICE_ENTITIES: 'Encje urządzenia',
USER_CUSTOMIZATION: 'Personalizacje użytkownika', USER_CUSTOMIZATION: 'Personalizacje użytkownika',
SUPPORT_INFORMATION: 'Informacje dotyczące wsparcia', SUPPORT_INFORMATION: 'Informacje dotyczące wsparcia',
@@ -168,8 +169,7 @@ const pl: Translation = {
HELP_INFORMATION_2: 'Aby dołączyć do naszego serwera Discord i komunikować się na żywo ze społecznością', HELP_INFORMATION_2: 'Aby dołączyć do naszego serwera Discord i komunikować się na żywo ze społecznością',
HELP_INFORMATION_3: 'Aby zaproponować nową funkcjonalność lub zgłosić problem', HELP_INFORMATION_3: 'Aby zaproponować nową funkcjonalność lub zgłosić problem',
HELP_INFORMATION_4: 'Zgłaszając problem, nie zapomnij dołączyć informacji o swoim systemie!', HELP_INFORMATION_4: 'Zgłaszając problem, nie zapomnij dołączyć informacji o swoim systemie!',
HELP_INFORMATION_5: HELP_INFORMATION_5: 'EMS-ESP jest darmowym projektem typu open-source. Aby go wesprzeć, rozważ przyznanie nam gwiazdki na Github!',
'EMS-ESP jest darmowym projektem typu open-source. Aby go wesprzeć, rozważ przyznanie nam gwiazdki na Github!',
SUPPORT_INFO: 'Pobierz informacje', SUPPORT_INFO: 'Pobierz informacje',
UPLOAD_OF: 'Wysyłanie {0}', UPLOAD_OF: 'Wysyłanie {0}',
UPLOAD: 'Wysyłanie', UPLOAD: 'Wysyłanie',
@@ -186,8 +186,7 @@ const pl: Translation = {
CLOSE: 'Zamknij', CLOSE: 'Zamknij',
USE: 'Aby zaktualizować firmware skorzystaj z funkcji', USE: 'Aby zaktualizować firmware skorzystaj z funkcji',
FACTORY_RESET: 'Ustawienia fabryczne', FACTORY_RESET: 'Ustawienia fabryczne',
SYSTEM_FACTORY_TEXT: SYSTEM_FACTORY_TEXT: 'Interfejs EMS-ESP został przywrócony do ustawień fabrycznych i zostanie teraz ponownie uruchomiony.',
'Interfejs EMS-ESP został przywrócony do ustawień fabrycznych i zostanie teraz ponownie uruchomiony.',
SYSTEM_FACTORY_TEXT_DIALOG: 'Czy jesteś pewien, że chcesz przywrócić ustawienia fabryczne interfejsu EMS-ESP? ', SYSTEM_FACTORY_TEXT_DIALOG: 'Czy jesteś pewien, że chcesz przywrócić ustawienia fabryczne interfejsu EMS-ESP? ',
VERSION_CHECK: 'Sprawd{{ź|zanie|}} wersj{{ę|i|}}', VERSION_CHECK: 'Sprawd{{ź|zanie|}} wersj{{ę|i|}}',
THE_LATEST: 'Najnowsza', THE_LATEST: 'Najnowsza',
@@ -208,8 +207,7 @@ const pl: Translation = {
COMPACT: 'Kompaktowy', COMPACT: 'Kompaktowy',
ENABLE_OTA: 'Aktywuj aktualizacje OTA', ENABLE_OTA: 'Aktywuj aktualizacje OTA',
DOWNLOAD_CUSTOMIZATION_TEXT: 'Pobierz personalizacje', DOWNLOAD_CUSTOMIZATION_TEXT: 'Pobierz personalizacje',
DOWNLOAD_SETTINGS_TEXT: DOWNLOAD_SETTINGS_TEXT: 'Pobierz ustawienia aplikacji. Uważaj jeśli udostępniasz plik z ustawieniami, ponieważ zawiera on hasła oraz inne wrażliwe informacje!',
'Pobierz ustawienia aplikacji. Uważaj jeśli udostępniasz plik z ustawieniami, ponieważ zawiera on hasła oraz inne wrażliwe informacje!',
UPLOAD_TEXT: 'Wyślij firmware (.bin), ustawienia lub personalizacje (.json). Opcjonalnie, wyślij wcześniej plik walidacji (.md5).', UPLOAD_TEXT: 'Wyślij firmware (.bin), ustawienia lub personalizacje (.json). Opcjonalnie, wyślij wcześniej plik walidacji (.md5).',
UPLOADING: 'Wysłano', UPLOADING: 'Wysłano',
UPLOAD_DROP_TEXT: 'Przeciągnij tutaj plik lub kliknij', UPLOAD_DROP_TEXT: 'Przeciągnij tutaj plik lub kliknij',
@@ -220,13 +218,11 @@ const pl: Translation = {
USER_WARNING: 'Przynajmniej jeden użytkownik musi mieć uprawnienia administratora!', USER_WARNING: 'Przynajmniej jeden użytkownik musi mieć uprawnienia administratora!',
ADD: 'Doda{{j|wanie|}}', ADD: 'Doda{{j|wanie|}}',
ACCESS_TOKEN_FOR: 'Token dostępu dla użytkownika', ACCESS_TOKEN_FOR: 'Token dostępu dla użytkownika',
ACCESS_TOKEN_TEXT: ACCESS_TOKEN_TEXT: 'Token jest używany w wywołaniach REST API wymagających autoryzacji. Można go przekazywać bezpośrednio lub przez URL.',
'Token jest używany w wywołaniach REST API wymagających autoryzacji. Można go przekazywać bezpośrednio lub przez URL.',
GENERATING_TOKEN: 'Generowanie tokenu', GENERATING_TOKEN: 'Generowanie tokenu',
USER: '{{Użytkownik|użytkownika|}}', USER: '{{Użytkownik|użytkownika|}}',
MODIFY: 'Edycja', MODIFY: 'Edycja',
SU_TEXT: SU_TEXT: 'Hasło "su" (super-użytkownika) służy do podpisywania tokenów autoryzujących oraz włączania uprawnień administratora w konsoli.',
'Hasło "su" (super-użytkownika) służy do podpisywania tokenów autoryzujących oraz włączania uprawnień administratora w konsoli.',
NOT_ENABLED: 'nieaktywny', NOT_ENABLED: 'nieaktywny',
ERRORS_OF: 'Błędy {0}', ERRORS_OF: 'Błędy {0}',
DISCONNECT_REASON: 'Przyczyna braku połączenia', DISCONNECT_REASON: 'Przyczyna braku połączenia',

View File

@@ -1,4 +1,6 @@
import type { Translation } from '../i18n-types'; import type { Translation } from '../i18n-types';
/* prettier-ignore */
/* eslint-disable */
const se: Translation = { const se: Translation = {
LANGUAGE: 'Språk', LANGUAGE: 'Språk',
@@ -64,11 +66,11 @@ const se: Translation = {
STARTVALUE: 'Startvärde', STARTVALUE: 'Startvärde',
WARN_GPIO: 'Varning: Var försiktig vid aktivering av GPIO!', WARN_GPIO: 'Varning: Var försiktig vid aktivering av GPIO!',
EDIT: 'Ändra', EDIT: 'Ändra',
TEMP_SENSOR: '{{Sensor|Temperatursensor}}', SENSOR: 'Sensor',
TEMP_SENSOR: 'Temperatursensor',
TEMP_SENSORS: 'Temperatursensorer', TEMP_SENSORS: 'Temperatursensorer',
WRITE_COMMAND: 'Skrivkommando {cmd}', WRITE_COMMAND: 'Skrivkommando {cmd}',
EMS_BUS_WARNING: EMS_BUS_WARNING: 'EMS-buss nedkopplad. Om denna varning kvarstår efter några sekunder, kontrollera inställningar och enhets-profil.',
'EMS-buss nedkopplad. Om denna varning kvarstår efter några sekunder, kontrollera inställningar och enhets-profil.',
EMS_BUS_SCANNING: 'Söker efter EMS-enheter...', EMS_BUS_SCANNING: 'Söker efter EMS-enheter...',
CONNECTED: 'Ansluten', CONNECTED: 'Ansluten',
TX_ISSUES: 'Sändfel - Prova ett annat TX-läge', TX_ISSUES: 'Sändfel - Prova ett annat TX-läge',
@@ -104,8 +106,7 @@ const se: Translation = {
CUSTOMIZATION: 'Anpassa', CUSTOMIZATION: 'Anpassa',
APPLICATION_RESTARTING: 'EMS-ESP startar om', APPLICATION_RESTARTING: 'EMS-ESP startar om',
INTERFACE_BOARD_PROFILE: 'Interface Hårdvaruprofil', INTERFACE_BOARD_PROFILE: 'Interface Hårdvaruprofil',
BOARD_PROFILE_TEXT: BOARD_PROFILE_TEXT: 'Välj en förkonfigurerad hårdvaruprofil från listan nedan eller välj Anpassad för att konfigurera dina egna hårdvaruinställningar',
'Välj en förkonfigurerad hårdvaruprofil från listan nedan eller välj Anpassad för att konfigurera dina egna hårdvaruinställningar',
BOARD_PROFILE: 'Hårdvaruprofil', BOARD_PROFILE: 'Hårdvaruprofil',
CUSTOM: 'Custom', CUSTOM: 'Custom',
GPIO_OF: '{0} GPIO', GPIO_OF: '{0} GPIO',
@@ -159,8 +160,7 @@ const se: Translation = {
SET_ALL: 'ställ in alla', SET_ALL: 'ställ in alla',
OPTIONS: 'Alternativ', OPTIONS: 'Alternativ',
NAME: 'Namn', NAME: 'Namn',
CUSTOMIZATIONS_RESET: CUSTOMIZATIONS_RESET: 'Är du säker på att du vill ta bort alla anpassningar inklusive inställningar för Temperatur och Analoga sensorer?',
'Är du säker på att du vill ta bort alla anpassningar inklusive inställningar för Temperatur och Analoga sensorer?',
DEVICE_ENTITIES: 'Enhets-entiteter', DEVICE_ENTITIES: 'Enhets-entiteter',
USER_CUSTOMIZATION: 'Användaranpassningar', USER_CUSTOMIZATION: 'Användaranpassningar',
SUPPORT_INFORMATION: 'Supportinformation', SUPPORT_INFORMATION: 'Supportinformation',
@@ -169,8 +169,7 @@ const se: Translation = {
HELP_INFORMATION_2: 'För community-support besök vår Discord-server', HELP_INFORMATION_2: 'För community-support besök vår Discord-server',
HELP_INFORMATION_3: 'Önska en ny funktion eller rapportera en bugg', HELP_INFORMATION_3: 'Önska en ny funktion eller rapportera en bugg',
HELP_INFORMATION_4: 'Bifoga din systeminformation för snabbare hantering när du rapporterar ett problem', HELP_INFORMATION_4: 'Bifoga din systeminformation för snabbare hantering när du rapporterar ett problem',
HELP_INFORMATION_5: HELP_INFORMATION_5: 'EMS-ESP är gratis och är öppen källkod. Bidra till utvecklingen genom att ge oss en stjärna på GitHub!',
'EMS-ESP är gratis och är öppen källkod. Bidra till utvecklingen genom att ge oss en stjärna på GitHub!',
SUPPORT_INFO: 'Supportinfo', SUPPORT_INFO: 'Supportinfo',
UPLOAD_OF: '{0} Uppladdning', UPLOAD_OF: '{0} Uppladdning',
UPLOAD: 'Uppladdning', UPLOAD: 'Uppladdning',
@@ -208,8 +207,7 @@ const se: Translation = {
COMPACT: 'Komprimera', COMPACT: 'Komprimera',
ENABLE_OTA: 'Aktivera OTA-uppdateringar', ENABLE_OTA: 'Aktivera OTA-uppdateringar',
DOWNLOAD_CUSTOMIZATION_TEXT: 'Ladda ner entitetsanpassningar', DOWNLOAD_CUSTOMIZATION_TEXT: 'Ladda ner entitetsanpassningar',
DOWNLOAD_SETTINGS_TEXT: DOWNLOAD_SETTINGS_TEXT: 'Ladda ner applikationsinställningar. Var försiktig om du delar dina iställlningar då de innehåller lösenord och annan känslig systeminformation',
'Ladda ner applikationsinställningar. Var försiktig om du delar dina iställlningar då de innehåller lösenord och annan känslig systeminformation',
UPLOAD_TEXT: 'Ladda upp ett nytt firmware (.bin), inställningar eller anpassningar (.json) nedan', UPLOAD_TEXT: 'Ladda upp ett nytt firmware (.bin), inställningar eller anpassningar (.json) nedan',
UPLOADING: 'Laddar upp', UPLOADING: 'Laddar upp',
UPLOAD_DROP_TEXT: 'Släpp fil eller klicka här', UPLOAD_DROP_TEXT: 'Släpp fil eller klicka här',
@@ -220,13 +218,11 @@ const se: Translation = {
USER_WARNING: 'Du måste ha minst en admin konfigurerad', USER_WARNING: 'Du måste ha minst en admin konfigurerad',
ADD: 'Lägg till', ADD: 'Lägg till',
ACCESS_TOKEN_FOR: 'Access Token för', ACCESS_TOKEN_FOR: 'Access Token för',
ACCESS_TOKEN_TEXT: ACCESS_TOKEN_TEXT: 'Nedan Token används med REST API-anrop som kräver auktorisering. Den kan skickas med antingen som en Bearer token i Authorization-headern eller i access_token URL query-parametern.',
'Nedan Token används med REST API-anrop som kräver auktorisering. Den kan skickas med antingen som en Bearer token i Authorization-headern eller i access_token URL query-parametern.',
GENERATING_TOKEN: 'Genererar token', GENERATING_TOKEN: 'Genererar token',
USER: 'Användare', USER: 'Användare',
MODIFY: 'Ändra', MODIFY: 'Ändra',
SU_TEXT: SU_TEXT: 'SU-användarens (super user) lösenord används för att signera autensierings-tokens samt för att aktivera administratörsprivilegier i Console-läge',
'SU-användarens (super user) lösenord används för att signera autensierings-tokens samt för att aktivera administratörsprivilegier i Console-läge',
NOT_ENABLED: 'Ej aktiv', NOT_ENABLED: 'Ej aktiv',
ERRORS_OF: '{0} fel', ERRORS_OF: '{0} fel',
DISCONNECT_REASON: 'Anledning till nedkoppling', DISCONNECT_REASON: 'Anledning till nedkoppling',

View File

@@ -559,11 +559,11 @@ const DashboardData: FC = () => {
offset: sensor.o offset: sensor.o
}); });
if (response.status === 204) { if (response.status === 204) {
enqueueSnackbar(LL.UPLOAD_OF(LL.TEMP_SENSOR(0)) + ' ' + LL.FAILED(), { variant: 'error' }); enqueueSnackbar(LL.UPLOAD_OF(LL.SENSOR()) + ' ' + LL.FAILED(), { variant: 'error' });
} else if (response.status === 403) { } else if (response.status === 403) {
enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' }); enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' });
} else { } else {
enqueueSnackbar(LL.UPDATED_OF(LL.TEMP_SENSOR(0)), { variant: 'success' }); enqueueSnackbar(LL.UPDATED_OF(LL.SENSOR()), { variant: 'success' });
} }
setSensor(undefined); setSensor(undefined);
} catch (error) { } catch (error) {
@@ -580,11 +580,11 @@ const DashboardData: FC = () => {
return ( return (
<Dialog open={sensor !== undefined} onClose={() => setSensor(undefined)}> <Dialog open={sensor !== undefined} onClose={() => setSensor(undefined)}>
<DialogTitle> <DialogTitle>
{LL.EDIT()} {LL.TEMP_SENSOR(0)} {LL.EDIT()} {LL.TEMP_SENSOR()}
</DialogTitle> </DialogTitle>
<DialogContent dividers> <DialogContent dividers>
<Box color="warning.main" p={0} pl={0} pr={0} mt={0} mb={2}> <Box color="warning.main" p={0} pl={0} pr={0} mt={0} mb={2}>
<Typography variant="body2">{LL.ID_OF(LL.TEMP_SENSOR(1))}: {sensor.id}</Typography> <Typography variant="body2">{LL.ID_OF(LL.SENSOR())}: {sensor.id}</Typography>
</Box> </Box>
<Grid container spacing={1}> <Grid container spacing={1}>
<Grid item> <Grid item>

View File

@@ -20,16 +20,17 @@ def flagExists(flag):
def buildWeb(): def buildWeb():
os.chdir("interface") os.chdir("interface")
print("Building interface with npm") print("Building web interface...")
try: try:
env.Execute("npm install") env.Execute("npm install")
env.Execute("npx typesafe-i18n --no-watch")
env.Execute("npm run build") env.Execute("npm run build")
buildPath = Path("build") buildPath = Path("build")
wwwPath = Path("../data/www") wwwPath = Path("../data/www")
if wwwPath.exists() and wwwPath.is_dir(): if wwwPath.exists() and wwwPath.is_dir():
rmtree(wwwPath) rmtree(wwwPath)
if not flagExists("PROGMEM_WWW"): if not flagExists("PROGMEM_WWW"):
print("Copying interface to data directory") print("Copying web files to data directory")
copytree(buildPath, wwwPath) copytree(buildPath, wwwPath)
for currentpath, folders, files in os.walk(wwwPath): for currentpath, folders, files in os.walk(wwwPath):
for file in files: for file in files:
@@ -40,4 +41,4 @@ def buildWeb():
if (len(BUILD_TARGETS) == 0 or "upload" in BUILD_TARGETS): if (len(BUILD_TARGETS) == 0 or "upload" in BUILD_TARGETS):
buildWeb() buildWeb()
else: else:
print("Skipping build interface step for target(s): " + ", ".join(BUILD_TARGETS)) print("Skipping build web interface for target(s): " + ", ".join(BUILD_TARGETS))

View File

@@ -947,7 +947,7 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) {
obj["m"] = dv.state >> 4; // send back the mask state. We're only interested in the high nibble obj["m"] = dv.state >> 4; // send back the mask state. We're only interested in the high nibble
obj["w"] = dv.has_cmd; // if writable obj["w"] = dv.has_cmd; // if writable
if (dv.has_cmd && (obj["v"].is<float>() || obj["v"].is<int>())) { if (dv.has_cmd && (obj["v"].is<float>() || obj["v"].is<int>())) {
// set the min and max values if there are any and if entity has a value // set the min and max values if there are any and if entity has a value
int16_t dv_set_min; int16_t dv_set_min;
uint16_t dv_set_max; uint16_t dv_set_max;

View File

@@ -30,11 +30,10 @@ class WebStatusService {
WebStatusService(AsyncWebServer * server, SecurityManager * securityManager); WebStatusService(AsyncWebServer * server, SecurityManager * securityManager);
private: private:
void webStatusService(AsyncWebServerRequest * request); void webStatusService(AsyncWebServerRequest * request);
void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info);
void mDNS_start() const; void mDNS_start() const;
const char * disconnectReason(uint8_t code); const char * disconnectReason(uint8_t code);
}; };
} // namespace emsesp } // namespace emsesp