add nl language to web, add more translations

This commit is contained in:
MichaelDvP
2022-09-02 14:05:46 +02:00
parent 354b2facf7
commit e3487b4845
9 changed files with 367 additions and 30 deletions

View File

@@ -27,6 +27,7 @@ const de: Translation = {
ENTITIES: 'Entitäten',
REFRESH: 'Aktualisieren',
EXPORT: 'Exportieren',
BRAND: "Marke",
ENTITY_NAME: 'Entitätsname',
VALUE: 'Wert',
SHOW_FAV: 'nur Favoriten anzeigen',
@@ -45,6 +46,12 @@ const de: Translation = {
ACCESS_DENIED: 'Zugriff abgelehnt',
ANALOG_SENSOR: 'Analogsensor{post}',
ANALOG_SENSORS: 'Analogsensoren',
OFFSET: "Addition",
FACTOR: "Faktor",
FREQ: "Frequenz",
STARTVALUE: "Startwert",
WARN_GPIO: "Warnung: Vorsicht bei der korrekten Wahl des GPIO!",
EDIT: "Editiere",
TEMP_SENSOR: 'Temperatursensor{post}',
TEMP_SENSORS: 'Temperatursensoren',
WRITE_COMMAND: 'Befehl schreiben {cmd}',
@@ -189,7 +196,7 @@ const de: Translation = {
ADD: 'Hinzufügen',
ACCESS_TOKEN_FOR: 'Zugangs-Token für',
ACCESS_TOKEN_TEXT:
'Das untenstehende Token ist für REST API Aufrufe, 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',
USER: 'Nutzer',
MODIFY: 'Ändern',

View File

@@ -27,6 +27,7 @@ const en: BaseTranslation = {
ENTITIES: 'Entities',
REFRESH: 'Refresh',
EXPORT: 'Export',
BRAND: "Brand",
ENTITY_NAME: 'Entity Name',
VALUE: 'Value',
SHOW_FAV: 'only show favorites',
@@ -45,6 +46,12 @@ const en: BaseTranslation = {
ACCESS_DENIED: 'Access Denied',
ANALOG_SENSOR: 'Analog Sensor{post}',
ANALOG_SENSORS: 'Analog Sensors',
OFFSET: "Offset",
FACTOR: "Factor",
FREQ: "Frequency",
STARTVALUE: "Start value",
WARN_GPIO: "Warning: be careful when assigning a GPIO!",
EDIT: "Edit",
TEMP_SENSOR: 'Temperature Sensor{post}',
TEMP_SENSORS: 'Temperature Sensors',
WRITE_COMMAND: 'Write command {cmd}',

View File

@@ -8,6 +8,7 @@ export type BaseLocale = 'en'
export type Locales =
| 'de'
| 'en'
| 'nl'
export type Translation = RootTranslation
@@ -119,6 +120,10 @@ type RootTranslation = {
* Export
*/
EXPORT: string
/**
* Brand
*/
BRAND: string
/**
* Entity Name
*/
@@ -192,7 +197,31 @@ type RootTranslation = {
* Analog Sensors
*/
ANALOG_SENSORS: string
/**
/**
* Offset
*/
OFFSET: string
/**
* Factor
*/
FACTOR: string
/**
* Frequency
*/
FREQ: string
/**
* Start value
*/
STARTVALUE: string
/**
* Warning: be careful when assigning a GPIO!
*/
WARN_GPIO: string
/**
* Edit
*/
EDIT: string
/**
* Temperature Sensor{post}
* @param {unknown} post
*/
@@ -467,14 +496,14 @@ type RootTranslation = {
* minutes
*/
MINUTES: string
/**
* Restart
*/
RESTART: string
/**
* hours
*/
HOURS: string
/**
* Restart
*/
RESTART: string
/**
* EMS-ESP needs to be restarted to apply changed system settings
*/
@@ -692,8 +721,8 @@ type RootTranslation = {
*/
FILESYSTEM: string
/**
* Buffer Size
*/
* Buffer Size
*/
BUFFER_SIZE: string
/**
* Compact
@@ -1094,6 +1123,10 @@ export type TranslationFunctions = {
* Export
*/
EXPORT: () => LocalizedString
/**
* Brand
*/
BRAND: () => LocalizedString
/**
* Entity Name
*/
@@ -1165,8 +1198,32 @@ export type TranslationFunctions = {
/**
* Analog Sensors
*/
ANALOG_SENSORS: () => LocalizedString
/**
ANALOG_SENSORS: () => LocalizedString
/**
* Offset
*/
OFFSET: () => LocalizedString
/**
* Factor
*/
FACTOR: () => LocalizedString
/**
* Frequency
*/
FREQ: () => LocalizedString
/**
* Start value
*/
STARTVALUE: () => LocalizedString
/**
* Warning: be careful when assigning a GPIO!
*/
WARN_GPIO: () => LocalizedString
/**
* Edit
*/
EDIT: () => LocalizedString
/**
* Temperature Sensor{post}
*/
TEMP_SENSOR: (arg: { post: unknown }) => LocalizedString
@@ -1432,14 +1489,14 @@ export type TranslationFunctions = {
* minutes
*/
MINUTES: () => LocalizedString
/**
* Restart
*/
RESTART: () => LocalizedString
/**
* hours
*/
HOURS: () => LocalizedString
/**
* Restart
*/
RESTART: () => LocalizedString
/**
* EMS-ESP needs to be restarted to apply changed system settings
*/
@@ -1633,7 +1690,7 @@ export type TranslationFunctions = {
*/
PLATFORM: () => LocalizedString
/**
* ystem Uptime
* System Uptime
*/
UPTIME: () => LocalizedString
/**

View File

@@ -8,6 +8,7 @@ import { loadedFormatters, loadedLocales, locales } from './i18n-util'
const localeTranslationLoaders = {
de: () => import('./de'),
en: () => import('./en'),
nl: () => import('./nl'),
}
const updateDictionary = (locale: Locales, dictionary: Partial<Translations>) =>

View File

@@ -7,10 +7,12 @@ import { loadedFormatters, loadedLocales, locales } from './i18n-util'
import de from './de'
import en from './en'
import nl from './nl'
const localeTranslations = {
de,
en,
nl,
}
export const loadLocale = (locale: Locales): void => {

View File

@@ -10,7 +10,8 @@ export const baseLocale: Locales = 'en'
export const locales: Locales[] = [
'de',
'en'
'en',
'nl'
]
export const loadedLocales = {} as Record<Locales, Translations>

View File

@@ -0,0 +1,261 @@
import type { BaseTranslation } from '../i18n-types';
const en: BaseTranslation = {
LANGUAGE: 'Language',
RETRY: 'Retry',
LOADING: 'Loading',
IS_REQUIRED: 'is required',
SIGN_IN: 'Sign In',
SIGN_OUT: 'Sign Out',
USERNAME: 'Username',
PASSWORD: 'Password',
DASHBOARD: 'Dashboard',
SETTINGS: 'Settings',
SAVED: 'saved',
HELP: 'Help',
LOGGED_IN: 'Logged in as {name}',
PLEASE_SIGNIN: 'Please sign in to continue',
UPLOAD_SUCCESSFUL: 'Upload successful',
DOWNLOAD_SUCCESSFUL: 'Download successful',
INVALID_LOGIN: 'Invalid login details',
NETWORK: 'Network',
SECURITY: 'Security',
ONOFF_CAP: 'ON/OFF',
ONOFF: 'on/off',
TYPE: 'Type',
DESCRIPTION: 'Description',
ENTITIES: 'Entities',
REFRESH: 'Refresh',
EXPORT: 'Export',
BRAND: "Brand",
ENTITY_NAME: 'Entity Name',
VALUE: 'Value',
SHOW_FAV: 'only show favorites',
DEVICE_SENSOR_DATA: 'Device and Sensor Data',
DEVICES_SENSORS: 'Devices & Sensors',
ATTACHED_SENSORS: 'Attached EMS-ESP Sensors',
RUN_COMMAND: 'Call Command',
CHANGE_VALUE: 'Change Value',
CANCEL: 'Cancel',
RESET: 'Reset',
SEND: 'Send',
SAVE: 'Save',
REMOVE: 'Remove',
PROBLEM_UPDATING: 'Problem updating',
PROBLEM_LOADING: 'Problem loading',
ACCESS_DENIED: 'Access Denied',
ANALOG_SENSOR: 'Analog Sensor{post}',
ANALOG_SENSORS: 'Analog Sensors',
OFFSET: "Offset",
FACTOR: "Factor",
FREQ: "Frequency",
STARTVALUE: "Start value",
WARN_GPIO: "Warning: be careful when assigning a GPIO!",
EDIT: "Edit",
TEMP_SENSOR: 'Temperature Sensor{post}',
TEMP_SENSORS: 'Temperature Sensors',
WRITE_COMMAND: 'Write command {cmd}',
EMS_BUS_WARNING:
'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...',
CONNECTED: 'Connected',
TX_ISSUES: 'Tx issues - try a different Tx Mode',
DISCONNECTED: 'Disconnected',
EMS_SCAN: 'Are you sure you want to initiate a full device scan of the EMS bus?',
EMS_BUS_STATUS: 'EMS Bus Status',
ACTIVE_DEVICES: 'Active Devices & Sensors',
DEVICE: 'Device',
SUCCESS: 'SUCCESS',
FAIL: 'FAIL',
QUALITY: 'QUALITY',
SCAN_DEVICES: 'Scan for new devices',
EMS_BUS_STATUS_TITLE: 'EMS Bus & Activity Status',
SCAN: 'Scan',
STATUS_NAMES: [
'EMS Telegrams Received (Rx)',
'EMS Reads (Tx)',
'EMS Writes (Tx)',
'Temperature Sensor Reads',
'Analog Sensor Reads',
'MQTT Publishes',
'API Calls',
'Syslog Messages'
],
NUM_DEVICES: '{num} Device{{s}}',
NUM_TEMP_SENSORS: '{num} Temperature Sensor{{s}}',
NUM_ANALOG_SENSORS: '{num} Analog Sensor{{s}}',
NUM_DAYS: '{num} Day{{s}}',
NUM_SECONDS: '{num} Second{{s}}',
NUM_HOURS: '{num} Hour{{s}}',
NUM_MINUTES: '{num} Minute{{s}}',
APPLICATION_SETTINGS: 'Application Settings',
CUSTOMIZATION: 'Customization',
APPLICATION_RESTARTING: 'EMS-ESP is restarting',
BOARD_PROFILE_TEXT:
'Select a pre-configured interface board profile from the list below or choose Custom to configure your own hardware settings',
BOARD_PROFILE: 'Board Profile',
BUTTON: 'Button',
TEMPERATURE: 'Temperature',
DISABLED: 'disabled',
GENERAL_OPTIONS: 'General Options',
LANGUAGE_ENTITIES: 'Language (for device entities)',
HIDE_LED: 'Hide LED',
ENABLE_TELNET: 'Enable Telnet Console',
ENABLE_ANALOG: 'Enable Analog Sensors',
CONVERT_FAHRENHEIT: 'Convert temperature values to Fahrenheit',
BYPASS_TOKEN: 'Bypass Access Token authorization on API calls',
READONLY: 'Enable read-only mode (blocks all outgoing EMS Tx Write commands)',
UNDERCLOCK_CPU: 'Underclock CPU speed',
ENABLE_SHOWER_TIMER: 'Enable Shower Timer',
ENABLE_SHOWER_ALERT: 'Enable Shower Alert',
TRIGGER_TIME: 'Trigger Time',
COLD_SHOT_DURATION: 'Cold Shot Duration',
FORMATTING_OPTIONS: 'Formatting Options',
BOOLEAN_FORMAT_DASHBOARD: 'Boolean Format Dashboard',
BOOLEAN_FORMAT_API: 'Boolean Format API/MQTT',
ENUM_FORMAT: 'Enum Format API/MQTT',
INDEX: 'Index',
ENABLE_PARASITE: 'Enable parasite power',
LOGGING: 'Logging',
LOG_HEX: 'Log EMS telegrams in hexadecimal',
ENABLE_SYSLOG: 'Enable Syslog',
MARK_INTERVAL: 'Mark Interval',
SECONDS: 'seconds',
MINUTES: 'minutes',
RESTART: 'Restart',
HOURS: "hours",
RESTART_TEXT: 'EMS-ESP needs to be restarted to apply changed system settings',
COMMAND: 'Command',
CUSTOMIZATIONS_RESTART: 'All customizations have been removed. Restarting...',
CUSTOMIZATIONS_FULL: 'Selected entities exceeded limit of 60. Please Save in batches',
CUSTOMIZATIONS_SAVED: 'Customizations saved',
CUSTOMIZATIONS_HELP_1: 'Select a device and customize the entities using the options',
CUSTOMIZATIONS_HELP_2: 'mark as favorite',
CUSTOMIZATIONS_HELP_3: 'disable write action',
CUSTOMIZATIONS_HELP_4: 'exclude from MQTT and API',
CUSTOMIZATIONS_HELP_5: 'hide from Dashboard',
SELECT_DEVICE: 'Select a device',
SET_ALL: 'set all',
OPTIONS: 'Options',
NAME: 'Name',
CUSTOMIZATIONS_RESET:
'Are you sure you want remove all customizations including the custom settings of the Temperature and Analog sensors?',
DEVICE_ENTITIES: 'Device Entities',
CONFIGURE: 'configure',
USER_CUSTOMIZATION: 'User Customization',
SUPPORT_INFORMATION: 'Support Information',
HELP_INFORMATION_1: 'Visit the online',
HELP_INFORMATION_2: 'to get instructions on how to',
HELP_INFORMATION_3: 'and access other information',
HELP_INFORMATION_4: 'For live community chat join our',
HELP_INFORMATION_5: 'Submit a',
HELP_INFORMATION_6: 'support issue',
HELP_INFORMATION_7: 'for requesting a new feature or reporting a bug',
HELP_INFORMATION_8: 'Make sure you also',
HELP_INFORMATION_9: 'and attach your system details for a faster response',
HELP_INFORMATION_10: 'EMS-ESP will always be a free and open-source project. Please consider supporting it with a',
UPLOAD: 'Upload',
DOWNLOAD: 'Download',
ABORTED: 'aborted',
FAILED: 'failed',
SUCCESSFUL: 'successful',
SYSTEM: 'System',
LOG: 'Log',
STATUS: 'Status',
UPLOAD_DOWNLOAD: 'Upload/Download',
SYSTEM_VERSION_RUNNING: 'You are currently running version',
SYSTEM_APPLY_FIRMWARE: 'to apply the new firmware',
CLOSE: 'Close',
USE: 'Use',
FACTORY_RESET: 'Factory Reset',
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?',
VERSION_CHECK: 'Version Check',
THE_LATEST: 'The latest',
PLATFORM: 'Device (Platform / SDK)',
UPTIME: 'System Uptime',
CPU_FREQ: 'CPU Frequency',
HEAP: 'Heap (Free / Max Alloc)',
PSRAM: 'PSRAM (Size / Free)',
FLASH: 'Flash Chip (Size / Speed)',
FILESYSTEM: 'File System (Used / Total)',
BUFFER_SIZE: 'Buffer Size',
COMPACT: 'Compact',
ENABLE_OTA: 'Enable OTA Updates',
DOWNLOAD_CUSTOMIZATION_TEXT: 'Download the entity customizations',
DOWNLOAD_SETTINGS_TEXT:
'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',
UPLOADING: 'Uploading',
UPLOAD_DROP_TEXT: 'Drop file or click here',
ERROR: 'Unexpected Error, please try again',
TIME_SET: 'Time set',
MANAGE_USERS: 'Manage Users',
IS_ADMIN: 'is Admin',
USER_WARNING: 'You must have at least one admin user configured',
ADD: 'Add',
ACCESS_TOKEN_FOR: 'Access Token for',
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.',
GENERATING_TOKEN: 'Generating token',
USER: 'User',
MODIFY: 'Modify',
SU_TEXT:
'The su (super user) password is used to sign authentication tokens and also enable admin privileges within the Console.',
NOT_ENABLED: 'Not enabled',
ERRORS: 'Errors',
DISCONNECT_REASON: 'Disconnect Reason',
ENABLE_MQTT: 'Enable MQTT',
OPTIONAL: 'Optional',
FORMATTING: 'Formatting',
FORMAT: 'Format',
MQTT_NEST_1: 'Nested in a single topic',
MQTT_NEST_2: 'As individual topics',
MQTT_RESPONSE: 'Publish command output to a `response` topic',
MQTT_PUBLISH_TEXT_1: 'Publish single value topics on change',
MQTT_PUBLISH_TEXT_2: 'Publish to command topics (ioBroker)',
MQTT_PUBLISH_TEXT_3: 'Enable MQTT Discovery (Home Assistant, Domoticz)',
MQTT_PUBLISH_TEXT_4: 'Prefix for the Discovery topics',
MQTT_PUBLISH_INTERVALS: 'Publish Intervals',
MQTT_INT_BOILER: 'Boilers and Heat Pumps',
MQTT_INT_THERMOSTATS: 'Thermostats',
MQTT_INT_SOLAR: 'Solar Modules',
MQTT_INT_MIXER: 'Mixer Modules',
DEFAULT: 'Default',
MQTT_CLEAN_SESSION: 'Set Clean Session',
MQTT_RETAIN_FLAG: 'Always set Retain flag',
INACTIVE: 'Inactive',
ACTIVE: 'Active',
UNKNOWN: 'Unknown',
SET_TIME: 'Set Time',
SET_TIME_TEXT: 'Enter local date and time below to set the time.',
LOCAL_TIME: 'Local Time',
UTC_TIME: 'UTC Time',
ENABLE_NTP: 'Enable NTP',
TIME_ZONE: 'Time Zone',
ACCESS_POINT: 'Access Point',
AP_PROVIDE: 'Enable Access Point',
AP_PROVIDE_TEXT_1: 'always',
AP_PROVIDE_TEXT_2: 'when WiFi is disconnected',
AP_PROVIDE_TEXT_3: 'never',
AP_PREFERRED_CHANNEL: 'Preferred Channel',
AP_HIDE_SSID: 'Hide SSID',
NETWORK_SCAN: 'Scan WiFi Networks',
IDLE: 'Idle',
LOST: 'Lost',
SCANNING: 'Scanning',
SCAN_AGAIN: 'Scan again',
NETWORK_SCANNER: 'Network Scanner',
NETWORK_NO_WIFI: 'No WiFi networks found',
NETWORK_BLANK_SSID: 'leave blank to disable WiFi',
POWER: 'Power',
NETWORK_DISABLE_SLEEP: 'Disable WiFi Sleep Mode',
NETWORK_LOW_BAND: 'Use Lower WiFi Bandwidth',
NETWORK_USE_DNS: 'Enable mDNS Service',
NETWORK_ENABLE_IPV6: 'Enable IPv6 support',
NETWORK_FIXED_IP: 'Use Fixed IP address',
ADMIN: 'Admin',
GUEST: 'Guest'
};
export default en;

View File

@@ -578,7 +578,7 @@ const DashboardData: FC = () => {
if (sensor) {
return (
<Dialog open={sensor !== undefined} onClose={() => setSensor(undefined)}>
<DialogTitle>Edit Temperature Sensor</DialogTitle>
<DialogTitle>{LL.EDIT()} {LL.TEMP_SENSORS()}</DialogTitle>
<DialogContent dividers>
<Box color="warning.main" p={0} pl={0} pr={0} mt={0} mb={2}>
<Typography variant="body2">Sensor ID {sensor.id}</Typography>
@@ -587,7 +587,7 @@ const DashboardData: FC = () => {
<Grid item>
<ValidatedTextField
name="n"
label="Name"
label={LL.ENTITY_NAME()}
value={sensor.n}
autoFocus
sx={{ width: '30ch' }}
@@ -597,7 +597,7 @@ const DashboardData: FC = () => {
<Grid item>
<ValidatedTextField
name="o"
label="Offset"
label={LL.OFFSET()}
value={numberValue(sensor.o)}
sx={{ width: '12ch' }}
type="number"
@@ -643,13 +643,13 @@ const DashboardData: FC = () => {
<DialogContent dividers>
<List dense={true}>
<ListItem>
<ListItemText primary="Type" secondary={coreData.devices[deviceDialog].t} />
<ListItemText primary={LL.TYPE()} secondary={coreData.devices[deviceDialog].t} />
</ListItem>
<ListItem>
<ListItemText primary="Name" secondary={coreData.devices[deviceDialog].n} />
<ListItemText primary={LL.NAME()} secondary={coreData.devices[deviceDialog].n} />
</ListItem>
<ListItem>
<ListItemText primary="Brand" secondary={coreData.devices[deviceDialog].b} />
<ListItemText primary={LL.BRAND()} secondary={coreData.devices[deviceDialog].b} />
</ListItem>
<ListItem>
<ListItemText
@@ -943,7 +943,7 @@ const DashboardData: FC = () => {
{LL.TYPE()}
</Button>
</HeaderCell>
<HeaderCell stiff>VALUE</HeaderCell>
<HeaderCell stiff>{LL.VALUE()}</HeaderCell>
<HeaderCell stiff />
</HeaderRow>
</Header>
@@ -1030,7 +1030,7 @@ const DashboardData: FC = () => {
if (analog) {
return (
<Dialog open={analog !== undefined} onClose={() => setAnalog(undefined)}>
<DialogTitle>Edit Analog Sensor</DialogTitle>
<DialogTitle>{LL.EDIT()} {LL.ANALOG_SENSORS()}</DialogTitle>
<DialogContent dividers>
<Grid container spacing={2}>
<Grid item>
@@ -1078,7 +1078,7 @@ const DashboardData: FC = () => {
<Grid item>
<ValidatedTextField
name="o"
label="Offset"
label={LL.OFFSET()}
value={numberValue(analog.o)}
sx={{ width: '20ch' }}
type="number"
@@ -1095,7 +1095,7 @@ const DashboardData: FC = () => {
<Grid item>
<ValidatedTextField
name="o"
label="Start Value"
label={LL.STARTVALUE()}
value={numberValue(analog.o)}
sx={{ width: '20ch' }}
type="number"
@@ -1108,7 +1108,7 @@ const DashboardData: FC = () => {
<Grid item>
<ValidatedTextField
name="f"
label="Factor"
label={LL.FACTOR()}
value={numberValue(analog.f)}
sx={{ width: '20ch' }}
type="number"
@@ -1124,7 +1124,7 @@ const DashboardData: FC = () => {
<Grid item>
<ValidatedTextField
name="o"
label="DAC Value"
label={LL.VALUE()}
value={numberValue(analog.o)}
sx={{ width: '20ch' }}
type="number"
@@ -1156,7 +1156,7 @@ const DashboardData: FC = () => {
<Grid item>
<ValidatedTextField
name="f"
label="Frequency"
label={LL.CPU_FREQ()}
value={numberValue(analog.f)}
sx={{ width: '20ch' }}
type="number"
@@ -1187,7 +1187,7 @@ const DashboardData: FC = () => {
)}
</Grid>
<Box color="warning.main" mt={2}>
<Typography variant="body2">Warning: be careful when assigning a GPIO!</Typography>
<Typography variant="body2">{LL.WARN_GPIO()}</Typography>
</Box>
</DialogContent>
<DialogActions>

View File

@@ -340,6 +340,7 @@ const SettingsApplication: FC = () => {
>
<MenuItem value="en">English (en)</MenuItem>
<MenuItem value="de">Deutsch (de)</MenuItem>
<MenuItem value="nl">Dutch (nl)</MenuItem>
</ValidatedTextField>
</Box>
{data.led_gpio !== 0 && (