From 069df92dbf8a4b2894edbadc8bce2f24b44694d2 Mon Sep 17 00:00:00 2001 From: pswid <78219494+pswid@users.noreply.github.com> Date: Thu, 3 Nov 2022 12:34:32 +0100 Subject: [PATCH 1/2] fix to the translation of the webUI in Polish. Everything visible should already be translated into Polish. However, I was not able to check how the translations of all errors are displayed (because how to display them if there is no error?), so I'm not sure that they are ok. BTW, there are still many error messages hardcoded (e.g. "Local IP is required"). I think we should translate them as well. --- interface/src/SignIn.tsx | 4 +- .../src/framework/mqtt/MqttSettingsForm.tsx | 12 +- .../src/framework/mqtt/MqttStatusForm.tsx | 2 +- .../framework/network/NetworkSettingsForm.tsx | 10 +- interface/src/framework/ntp/NTPStatusForm.tsx | 2 +- .../framework/security/ManageUsersForm.tsx | 4 +- interface/src/framework/security/UserForm.tsx | 2 +- interface/src/i18n/de/index.ts | 23 ++- interface/src/i18n/en/index.ts | 37 ++-- interface/src/i18n/i18n-types.ts | 182 ++++++++++++++---- interface/src/i18n/nl/index.ts | 27 ++- interface/src/i18n/no/index.ts | 27 ++- interface/src/i18n/pl/index.ts | 117 ++++++----- interface/src/i18n/se/index.ts | 23 ++- interface/src/project/DashboardData.tsx | 16 +- interface/src/project/SettingsApplication.tsx | 26 +-- .../src/project/SettingsCustomization.tsx | 18 +- 17 files changed, 359 insertions(+), 173 deletions(-) diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx index a2ffeb9f9..b658bfd39 100644 --- a/interface/src/SignIn.tsx +++ b/interface/src/SignIn.tsx @@ -41,7 +41,7 @@ const SignIn: FC = () => { const validateAndSignIn = async () => { setProcessing(true); SIGN_IN_REQUEST_VALIDATOR.messages({ - required: '%s ' + LL.IS_REQUIRED() + required: LL.IS_REQUIRED('%s') }); try { await validate(SIGN_IN_REQUEST_VALIDATOR, signInRequest); @@ -139,7 +139,7 @@ const SignIn: FC = () => { fieldErrors={fieldErrors} disabled={processing} name="username" - label={LL.USERNAME()} + label={LL.USERNAME(0)} value={signInRequest.username} onChange={updateLoginRequestValue} margin="normal" diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index c03915800..8de9f71fc 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -57,7 +57,7 @@ const MqttSettingsForm: FC = () => { { { { { { InputProps={{ endAdornment: {LL.SECONDS()} }} - label={LL.DEFAULT()} + label={LL.DEFAULT(0)} fullWidth variant="outlined" value={numberValue(data.publish_time_other)} diff --git a/interface/src/framework/mqtt/MqttStatusForm.tsx b/interface/src/framework/mqtt/MqttStatusForm.tsx index 8e6d373b5..51725c65f 100644 --- a/interface/src/framework/mqtt/MqttStatusForm.tsx +++ b/interface/src/framework/mqtt/MqttStatusForm.tsx @@ -103,7 +103,7 @@ const MqttStatusForm: FC = () => { # - + diff --git a/interface/src/framework/network/NetworkSettingsForm.tsx b/interface/src/framework/network/NetworkSettingsForm.tsx index 8dd52b265..d4a856146 100644 --- a/interface/src/framework/network/NetworkSettingsForm.tsx +++ b/interface/src/framework/network/NetworkSettingsForm.tsx @@ -196,7 +196,7 @@ const WiFiSettingsForm: FC = () => { { { { { { const ntpStatus = ({ status }: NTPStatus) => { switch (status) { case NTPSyncStatus.NTP_DISABLED: - return LL.DISABLED(); + return LL.DISABLED(0); case NTPSyncStatus.NTP_INACTIVE: return LL.INACTIVE(); case NTPSyncStatus.NTP_ACTIVE: diff --git a/interface/src/framework/security/ManageUsersForm.tsx b/interface/src/framework/security/ManageUsersForm.tsx index 29c29c6ee..1321eedc5 100644 --- a/interface/src/framework/security/ManageUsersForm.tsx +++ b/interface/src/framework/security/ManageUsersForm.tsx @@ -40,7 +40,7 @@ const ManageUsersForm: FC = () => { const table_theme = useTheme({ Table: ` - --data-table-library_grid-template-columns: repeat(1, minmax(0, 1fr)) 120px 120px; + --data-table-library_grid-template-columns: repeat(1, minmax(0, 1fr)) minmax(120px, max-content) 120px; `, BaseRow: ` font-size: 14px; @@ -140,7 +140,7 @@ const ManageUsersForm: FC = () => { <>
- {LL.USERNAME()} + {LL.USERNAME(1)} {LL.IS_ADMIN(0)} diff --git a/interface/src/framework/security/UserForm.tsx b/interface/src/framework/security/UserForm.tsx index 28e659469..22ec43fa5 100644 --- a/interface/src/framework/security/UserForm.tsx +++ b/interface/src/framework/security/UserForm.tsx @@ -60,7 +60,7 @@ const UserForm: FC = ({ creating, validator, user, setUser, onDon /** * S​i​g​n​ ​I​n */ @@ -43,7 +44,7 @@ type RootTranslation = { */ SIGN_OUT: string /** - * U​s​e​r​n​a​m​e + * {​{​U​s​e​r​n​a​m​e​}​} */ USERNAME: string /** @@ -82,11 +83,11 @@ type RootTranslation = { */ PLEASE_SIGNIN: string /** - * U​p​l​o​a​d​ ​s​u​c​c​e​s​s​f​u​l + * U​p​l​o​a​d​ ​f​i​n​i​s​h​e​d */ UPLOAD_SUCCESSFUL: string /** - * D​o​w​n​l​o​a​d​ ​s​u​c​c​e​s​s​f​u​l + * D​o​w​n​l​o​a​d​ ​f​i​n​i​s​h​e​d */ DOWNLOAD_SUCCESSFUL: string /** @@ -133,6 +134,23 @@ type RootTranslation = { * D​e​v​i​c​e​ ​D​e​t​a​i​l​s */ DEVICE_DETAILS: string + /** + * {​0​}​ ​I​D + * @param {unknown} 0 + */ + ID_OF: RequiredParams<'0'> + /** + * D​e​v​i​c​e + */ + DEVICE: string + /** + * P​r​o​d​u​c​t + */ + PRODUCT: string + /** + * V​e​r​s​i​o​n + */ + VERSION: string /** * B​r​a​n​d */ @@ -142,7 +160,7 @@ type RootTranslation = { */ ENTITY_NAME: string /** - * {​{​V​a​l​u​e​}​} + * {​{​V​a​l​u​e​|​v​a​l​u​e​}​} */ VALUE: string /** @@ -262,7 +280,7 @@ type RootTranslation = { */ EDIT: string /** - * T​e​m​p​e​r​a​t​u​r​e​ ​S​e​n​s​o​r + * {​{​|​T​e​m​p​e​r​a​t​u​r​e​}​}​ ​S​e​n​s​o​r */ TEMP_SENSOR: string /** @@ -427,6 +445,15 @@ type RootTranslation = { * B​o​a​r​d​ ​P​r​o​f​i​l​e */ BOARD_PROFILE: string + /** + * C​u​s​t​o​m + */ + CUSTOM: string + /** + * {​0​}​ ​G​P​I​O + * @param {unknown} 0 + */ + GPIO_OF: RequiredParams<'0'> /** * B​u​t​t​o​n */ @@ -440,13 +467,21 @@ type RootTranslation = { */ PHY_TYPE: string /** - * d​i​s​a​b​l​e​d + * {​{​d​i​s​a​b​l​e​d​}​} */ DISABLED: string /** * T​x​ ​M​o​d​e */ TX_MODE: string + /** + * H​a​r​d​w​a​r​e + */ + HARDWARE: string + /** + * {​{​B​U​S​|​E​M​S​ ​B​U​S​}​} + */ + EMS_BUS: string /** * G​e​n​e​r​a​l​ ​O​p​t​i​o​n​s */ @@ -616,7 +651,7 @@ type RootTranslation = { */ OPTIONS: string /** - * N​a​m​e + * {​{​N​a​m​e​}​} */ NAME: string /** @@ -891,6 +926,18 @@ type RootTranslation = { * E​n​a​b​l​e​ ​M​Q​T​T */ ENABLE_MQTT: string + /** + * B​r​o​k​e​r + */ + BROKER: string + /** + * C​l​i​e​n​t + */ + CLIENT: string + /** + * B​a​s​e + */ + BASE_TOPIC: string /** * O​p​t​i​o​n​a​l */ @@ -900,9 +947,9 @@ type RootTranslation = { */ FORMATTING: string /** - * F​o​r​m​a​t + * T​o​p​i​c​/​P​a​y​l​o​a​d​ ​F​o​r​m​a​t */ - FORMAT: string + MQTT_FORMAT: string /** * N​e​s​t​e​d​ ​i​n​ ​a​ ​s​i​n​g​l​e​ ​t​o​p​i​c */ @@ -956,7 +1003,7 @@ type RootTranslation = { */ MQTT_QUEUE: string /** - * D​e​f​a​u​l​t + * {​{​D​e​f​a​u​l​t​}​} */ DEFAULT: string /** @@ -1108,7 +1155,7 @@ type RootTranslation = { */ NETWORK_FIXED_IP: string /** - * G​e​t​a​w​a​y + * G​a​t​e​w​a​y */ NETWORK_GATEWAY: string /** @@ -1137,13 +1184,22 @@ type RootTranslation = { */ NEW: string /** - * R​e​n​a​m​e + * N​e​w​ ​{​0​}​ ​n​a​m​e + * @param {unknown} 0 */ - RENAME: string + NEW_NAME_OF: RequiredParams<'0'> /** - * E​n​t​i​t​y + * e​n​t​i​t​y */ ENTITY: string + /** + * m​i​n + */ + MIN: string + /** + * m​a​x + */ + MAX: string } export type TranslationFunctions = { @@ -1160,9 +1216,9 @@ export type TranslationFunctions = { */ LOADING: () => LocalizedString /** - * is required + * {0} is required */ - IS_REQUIRED: () => LocalizedString + IS_REQUIRED: (arg0: unknown) => LocalizedString /** * Sign In */ @@ -1172,9 +1228,9 @@ export type TranslationFunctions = { */ SIGN_OUT: () => LocalizedString /** - * Username + * {{Username}} */ - USERNAME: () => LocalizedString + USERNAME: (arg0: string | number | boolean) => LocalizedString /** * Password */ @@ -1208,11 +1264,11 @@ export type TranslationFunctions = { */ PLEASE_SIGNIN: () => LocalizedString /** - * Upload successful + * Upload finished */ UPLOAD_SUCCESSFUL: () => LocalizedString /** - * Download successful + * Download finished */ DOWNLOAD_SUCCESSFUL: () => LocalizedString /** @@ -1259,6 +1315,22 @@ export type TranslationFunctions = { * Device Details */ DEVICE_DETAILS: () => LocalizedString + /** + * {0} ID + */ + ID_OF: (arg0: unknown) => LocalizedString + /** + * Device + */ + DEVICE: () => LocalizedString + /** + * Product + */ + PRODUCT: () => LocalizedString + /** + * Version + */ + VERSION: () => LocalizedString /** * Brand */ @@ -1268,7 +1340,7 @@ export type TranslationFunctions = { */ ENTITY_NAME: () => LocalizedString /** - * {{Value}} + * {{Value|value}} */ VALUE: (arg0: string | number | boolean) => LocalizedString /** @@ -1384,9 +1456,9 @@ export type TranslationFunctions = { */ EDIT: () => LocalizedString /** - * Temperature Sensor + * {{|Temperature}} Sensor */ - TEMP_SENSOR: () => LocalizedString + TEMP_SENSOR: (arg0: string | number | boolean) => LocalizedString /** * Temperature Sensors */ @@ -1541,6 +1613,14 @@ export type TranslationFunctions = { * Board Profile */ BOARD_PROFILE: () => LocalizedString + /** + * Custom + */ + CUSTOM: () => LocalizedString + /** + * {0} GPIO + */ + GPIO_OF: (arg0: unknown) => LocalizedString /** * Button */ @@ -1554,13 +1634,21 @@ export type TranslationFunctions = { */ PHY_TYPE: () => LocalizedString /** - * disabled + * {{disabled}} */ - DISABLED: () => LocalizedString + DISABLED: (arg0: string | number | boolean) => LocalizedString /** * Tx Mode */ TX_MODE: () => LocalizedString + /** + * Hardware + */ + HARDWARE: () => LocalizedString + /** + * {{BUS|EMS BUS}} + */ + EMS_BUS: (arg0: string | number | boolean) => LocalizedString /** * General Options */ @@ -1730,9 +1818,9 @@ export type TranslationFunctions = { */ OPTIONS: () => LocalizedString /** - * Name + * {{Name}} */ - NAME: () => LocalizedString + NAME: (arg0: string | number | boolean) => LocalizedString /** * Are you sure you want remove all customizations including the custom settings of the Temperature and Analog sensors? */ @@ -2001,6 +2089,18 @@ export type TranslationFunctions = { * Enable MQTT */ ENABLE_MQTT: () => LocalizedString + /** + * Broker + */ + BROKER: () => LocalizedString + /** + * Client + */ + CLIENT: () => LocalizedString + /** + * Base + */ + BASE_TOPIC: () => LocalizedString /** * Optional */ @@ -2010,9 +2110,9 @@ export type TranslationFunctions = { */ FORMATTING: () => LocalizedString /** - * Format + * Topic/Payload Format */ - FORMAT: () => LocalizedString + MQTT_FORMAT: () => LocalizedString /** * Nested in a single topic */ @@ -2066,9 +2166,9 @@ export type TranslationFunctions = { */ MQTT_QUEUE: () => LocalizedString /** - * Default + * {{Default}} */ - DEFAULT: () => LocalizedString + DEFAULT: (arg0: string | number | boolean) => LocalizedString /** * Set Clean Session */ @@ -2218,7 +2318,7 @@ export type TranslationFunctions = { */ NETWORK_FIXED_IP: () => LocalizedString /** - * Getaway + * Gateway */ NETWORK_GATEWAY: () => LocalizedString /** @@ -2246,13 +2346,21 @@ export type TranslationFunctions = { */ NEW: () => LocalizedString /** - * Rename + * New {0} name */ - RENAME: () => LocalizedString + NEW_NAME_OF: (arg0: unknown) => LocalizedString /** - * Entity + * entity */ ENTITY: () => LocalizedString + /** + * min + */ + MIN: () => LocalizedString + /** + * max + */ + MAX: () => LocalizedString } export type Formatters = {} diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index 1ab08c6ed..f6edcf107 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -4,7 +4,7 @@ const nl: Translation = { LANGUAGE: 'Taal', RETRY: 'Opnieuw proberen', LOADING: 'Laden', - IS_REQUIRED: 'is verplicht', + IS_REQUIRED: '{0} is verplicht', SIGN_IN: 'Inloggen', SIGN_OUT: 'Uitloggen', USERNAME: 'Gebruikersnaam', @@ -29,6 +29,10 @@ const nl: Translation = { REFRESH: 'Ververs', EXPORT: 'Export', DEVICE_DETAILS: 'Device Gegevens', + ID_OF: '{0} ID', + DEVICE: 'Apparaat', + PRODUCT: 'Product', + VERSION: 'Versie', BRAND: 'Merk', ENTITY_NAME: 'Entiteit', VALUE: '{{Waarde|waarde}}', @@ -60,7 +64,7 @@ const nl: Translation = { STARTVALUE: 'Startwaarde', WARN_GPIO: 'Waarschuwing: let op met het koppelen van de juiste GPIO pin!', EDIT: 'Wijzigen', - TEMP_SENSOR: 'Temperatuur sensor', + TEMP_SENSOR: '{{Sensor|Temperatuur sensor}}', TEMP_SENSORS: 'Temperatuur Sensoren', WRITE_COMMAND: 'Schrijf commando {cmd}', EMS_BUS_WARNING: @@ -103,10 +107,14 @@ const nl: Translation = { BOARD_PROFILE_TEXT: 'Selecteer een vooraf ingesteld apparaat profiel uit de lijst of kies Eigen om zelf uw hardware te configureren', BOARD_PROFILE: 'Apparaatprofiel', + CUSTOM: 'Custom', + GPIO_OF: '{0} GPIO', BUTTON: 'Toets', TEMPERATURE: 'Temperatuur', PHY_TYPE: 'Eth PHY Type', TX_MODE: 'Tx Mode', + HARDWARE: 'Hardware', + EMS_BUS: '{{BUS|EMS BUS}}', DISABLED: 'Uitgeschakeld', GENERAL_OPTIONS: 'Algemene Opties', LANGUAGE_ENTITIES: 'Taal (voor apparaat entiteiten)', @@ -222,9 +230,12 @@ const nl: Translation = { ERRORS_OF: '{0} Foutmeldingen', DISCONNECT_REASON: 'Verbinding verbroken vanwege', ENABLE_MQTT: 'Activeer MQTT', + BROKER: 'Broker', + CLIENT: 'Client', + BASE_TOPIC: 'Base', OPTIONAL: 'Optioneel', FORMATTING: 'Formatteren', - FORMAT: 'Formattering', + MQTT_FORMAT: 'Topic/Payload Formattering', MQTT_NEST_1: 'Genest in 1 topic', MQTT_NEST_2: 'Als individuele topics', MQTT_RESPONSE: 'Publiceer commando output naar een `response` topic', @@ -276,15 +287,17 @@ const nl: Translation = { NETWORK_USE_DNS: 'Activeer mDNS Service', NETWORK_ENABLE_IPV6: 'Activeer IPv6 support', NETWORK_FIXED_IP: 'Gebruik vast IP addres', - NETWORK_GATEWAY: 'Getaway', - NETWORK_SUBNET: 'Subnet Mask', + NETWORK_GATEWAY: 'Gateway', + NETWORK_SUBNET: 'Subnetmasker', NETWORK_DNS: 'DNS Servers', ADDRESS_OF: '{0} Address', ADMIN: 'Admin', GUEST: 'Gast', NEW: 'Nieuwe', - RENAME: 'Hernoem', - ENTITY: 'Entiteit' + NEW_NAME_OF: 'Hernoem {0}', + ENTITY: 'Entiteit', + MIN: 'min', + MAX: 'max' }; export default nl; diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index 7a8bf8041..b9f64f8b5 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -4,7 +4,7 @@ const no: Translation = { LANGUAGE: 'Språk', RETRY: 'Forsøk igjen', LOADING: 'Laster', - IS_REQUIRED: 'er nødvendig', + IS_REQUIRED: '{0} er nødvendig', SIGN_IN: 'Logg inn', SIGN_OUT: 'Logg ut', USERNAME: 'Brukernavn', @@ -29,6 +29,10 @@ const no: Translation = { REFRESH: 'Oppdater', EXPORT: 'Eksport', DEVICE_DETAILS: 'Enhetsdetaljer', + ID_OF: '{0}-ID', + DEVICE: 'Enhets', + PRODUCT: 'Produkt', + VERSION: 'Versjon', BRAND: 'Fabrikat', ENTITY_NAME: 'Objektsnavn', VALUE: '{{Verdi|verdi}}', @@ -60,7 +64,7 @@ const no: Translation = { STARTVALUE: 'Startverdi', WARN_GPIO: 'Advarsel: vær forsiktig ved aktivering av GPIO!', EDIT: 'Endre', - TEMP_SENSOR: 'Temperatursensor', + TEMP_SENSOR: '{{Sensor|Temperatursensor}}', TEMP_SENSORS: 'Temperaturesensorer', WRITE_COMMAND: 'Skriv kommando {cmd}', EMS_BUS_WARNING: @@ -103,11 +107,15 @@ const no: Translation = { BOARD_PROFILE_TEXT: 'Velg en pre-konfigurert prosessor profil fra listen under eller velg Tilpasset for å konfigurere dine egne innstillinger', BOARD_PROFILE: 'Prosessor Profil', + CUSTOM: 'Custom', + GPIO_OF: '{0} GPIO', BUTTON: 'Knapp', TEMPERATURE: 'Temperatur', PHY_TYPE: 'Eth PHY Type', DISABLED: 'avslått', TX_MODE: 'Tx Mode', + HARDWARE: 'Hardware', + EMS_BUS: '{{BUS|EMS BUS}}', GENERAL_OPTIONS: 'Generelle Innstillinger', LANGUAGE_ENTITIES: 'Språk (for objekter)', HIDE_LED: 'Skjul LED', @@ -223,9 +231,12 @@ const no: Translation = { ERRORS_OF: '{0} Feil', DISCONNECT_REASON: 'Årsak til nedkobling', ENABLE_MQTT: 'Aktiver MQTT', + BROKER: 'Broker', + CLIENT: 'Client', + BASE_TOPIC: 'Base', OPTIONAL: 'Valgfritt', FORMATTING: 'Formatering', - FORMAT: 'Format', + MQTT_FORMAT: 'Topic/Payload Format', MQTT_NEST_1: 'Nestet i en topic', MQTT_NEST_2: 'Som individuelle topics', MQTT_RESPONSE: 'Publiser kommandoer til en `response` topic', @@ -277,15 +288,17 @@ const no: Translation = { NETWORK_USE_DNS: 'Aktiviser mDNS Service', NETWORK_ENABLE_IPV6: 'Aktiviser IPv6 støtte', NETWORK_FIXED_IP: 'Benytt statisk IP adresse', - NETWORK_GATEWAY: 'Getaway', - NETWORK_SUBNET: 'Subnet Mask', + NETWORK_GATEWAY: 'Gateway', + NETWORK_SUBNET: 'Nettverksmaske', NETWORK_DNS: 'DNS Servers', ADDRESS_OF: '{0} Address', ADMIN: 'Admin', GUEST: 'Gjest', NEW: 'Ny', - RENAME: 'Bytt navn', - ENTITY: 'Entitet' + NEW_NAME_OF: 'Bytt navn {0}', + ENTITY: 'Entitet', + MIN: 'min', + MAX: 'max' }; export default no; diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index b974a6d6a..767d9a586 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -4,21 +4,21 @@ const pl: Translation = { LANGUAGE: 'Język', RETRY: 'Ponów', LOADING: 'Ładowanie', - IS_REQUIRED: 'Czy wymagany?', - SIGN_IN: 'Zaloguj', - SIGN_OUT: 'Wyloguj', - USERNAME: 'Nazwa użytkownika', + IS_REQUIRED: 'Pole {0} nie może być puste!', + SIGN_IN: 'Zaloguj się', + SIGN_OUT: 'Wyloguj się', + USERNAME: '{{Użytkownik|Nazwa użytkownika|}}', PASSWORD: 'Hasło', SU_PASSWORD: 'Hasło "su"', DASHBOARD: 'Pulpit', SETTINGS_OF: 'Ustawienia {0}', SAVED: 'zostały zapisane.', HELP_OF: 'Pomoc {0}', - LOGGED_IN: 'Zalogowany jako {name}.', + LOGGED_IN: 'Zalogowano użytkownika {name}.', PLEASE_SIGNIN: 'Zaloguj się aby kontynuować.', UPLOAD_SUCCESSFUL: 'Wysyłanie zakończone.', DOWNLOAD_SUCCESSFUL: 'Pobieranie zakończone.', - INVALID_LOGIN: 'Niepoprawny login!', + INVALID_LOGIN: 'Nieprawidłowy użytkownik lub hasło!', NETWORK: '{{Sieć|sieci|}}', SECURITY: '{{B|b|}}ezpieczeństw{{o|a|}}', ONOFF_CAP: 'wł./wył.', @@ -29,9 +29,13 @@ const pl: Translation = { REFRESH: 'Odśwież', EXPORT: 'Eksportuj', DEVICE_DETAILS: 'Szczegóły urządzenia', + ID_OF: 'ID {0}', + DEVICE: 'urządzenia', + PRODUCT: 'produktu', BRAND: 'Marka', + VERSION: 'Wersja', ENTITY_NAME: 'Nazwa encji', - VALUE: '{{Wartość|wartość|}}', + VALUE: '{{W|w|}}artość', SHOW_FAV: 'Pokaż tylko "ulubione"', DEVICE_SENSOR_DATA: 'Dane z urządzeń i czujników', DEVICES_SENSORS: 'Urządzenia i czujniki', @@ -39,7 +43,7 @@ const pl: Translation = { RUN_COMMAND: 'Wykonaj komendę', CHANGE_VALUE: 'Zmień wartość', CANCEL: 'Anuluj', - RESET: '{{Resetuj|Resetowanie|}}', + RESET: 'Reset{{uj|owanie|}}', SEND: 'Wyślij', SAVE: 'Zapisz', REMOVE: 'Usuń', @@ -52,23 +56,23 @@ const pl: Translation = { UPDATE_OF: 'Aktualizacja {0}', REMOVED_OF: 'Usunięto ustawienia {0}.', DELETION_OF: 'Kasowanie {0}', - OFFSET: 'Korekta +/-', + OFFSET: 'Korekta ±', FACTOR: 'Mnożnik', FREQ: 'Częstotliwość', DUTY_CYCLE: 'Wypełnienie', UNIT: 'J.m.', STARTVALUE: 'Wartość początkowa', - WARN_GPIO: 'Uwaga! Bądź ostrożny przypisując GPIO do czujnika!', + WARN_GPIO: 'Uwaga! Zachowaj ostrożność przypisując GPIO do urządzenia!', EDIT: 'Edycja', - TEMP_SENSOR: 'czujnika temperatury', + TEMP_SENSOR: '{{czujnika temperatury|czujnika|}}', TEMP_SENSORS: 'Czujniki temperatury 1-Wire®', WRITE_COMMAND: 'Wyślij komendę {cmd}', 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.', - EMS_BUS_SCANNING: 'Trwa skanowanie magistrali EMS w poszukiwaniu urządzeń...', + EMS_BUS_SCANNING: 'Trwa skanowanie urządzeń na magistrali EMS...', CONNECTED: '{{połączono|połączenie|}}', - TX_ISSUES: 'Problem z zapisem na magistralę EMS. Spróbuj wybrać inny "Sposób transmisji (Tx)".', - DISCONNECTED: 'zostało rozłączone', + TX_ISSUES: 'Problem z zapisem na magistralę EMS. Spróbuj wybrać inny "Tryb transmisji (Tx)".', + DISCONNECTED: 'brak połączenia', EMS_SCAN: 'Czy na pewno wykonać pełne skanowanie magistrali EMS?', EMS_BUS_STATUS: 'Status magistrali EMS', ACTIVE_DEVICES: 'Aktywne urządzenia i czujniki', @@ -87,11 +91,11 @@ const pl: Translation = { 'Odczyty czujników analogowych i cyfrowych', 'Publikacje MQTT', 'Wywołania API', - 'Wpisy w logu systemowym' + 'Wpisy w SysLog' ], NUM_DEVICES: '{num} urządze{{ń|nie|nia|nia|ń}} EMS', NUM_TEMP_SENSORS: '{num} czujni{{ków|k|ki|ki|ków}} temperatury', - NUM_ANALOG_SENSORS: '{num} czujni{{ków|k|ki(two)|ki|ków}} analogow{{ych|y|e|e|ych}}', + NUM_ANALOG_SENSORS: '{num} inn{{ych|e|e|e|ych}} urządze{{ń|nie|nia(two)|nia|ń}} podłączon{{ych|e|e|e|ych}} do EMS-ESP', NUM_DAYS: '{num} {{dni|dzień|dni|dni|dni}}', NUM_SECONDS: '{num} sekun{{d|da|dy|dy|d}}', NUM_HOURS: '{num} godzi{{n|na|ny|ny|n}}', @@ -100,13 +104,17 @@ const pl: Translation = { CUSTOMIZATION: 'Personalizacja', APPLICATION_RESTARTING: 'Trwa ponowne uruchamianie...', INTERFACE_BOARD_PROFILE: 'Profil płytki interfejsu', - BOARD_PROFILE_TEXT: 'Wybierz z listy wstępną konfigurację płytki interfejsu lub stwórz własną konfigurację.', + BOARD_PROFILE_TEXT: 'Wybierz z listy gotowy profil płytki interfejsu lub wybierając "własny..." skonfiguruj posiadany sprzęt samodzielnie.', BOARD_PROFILE: 'Profil płytki', - BUTTON: 'Przycisk', + CUSTOM: 'własny', + GPIO_OF: 'GPIO {0}', + BUTTON: 'przycisku', TEMPERATURE: '1-Wire®', PHY_TYPE: 'Typ układu ethernetowego (PHY)', - DISABLED: 'wyłączony', - TX_MODE: 'Sposób transmisji (Tx)', + DISABLED: '{{wyłączono|brak|}}', + TX_MODE: 'Tryb transmisji (Tx)', + EMS_BUS: '{{magistrali EMS|na magistrali|}}', + HARDWARE: 'sprzętowy', GENERAL_OPTIONS: 'Opcje podstawowe', LANGUAGE_ENTITIES: 'Język encji', HIDE_LED: 'Wyłącz LED', @@ -121,9 +129,9 @@ const pl: Translation = { TRIGGER_TIME: 'Wyzwalaj po czasie', COLD_SHOT_DURATION: 'Czas trwania tryśnięcia zimnej wody', FORMATTING_OPTIONS: 'Opcje formatowania', - BOOLEAN_FORMAT_DASHBOARD: 'Format wartości binarnych dla pulpitu', - BOOLEAN_FORMAT_API: 'Format wartości binarnych dla API/MQTT', - ENUM_FORMAT: 'Format wartości numerowanych dla API/MQTT', + BOOLEAN_FORMAT_DASHBOARD: 'Wartości dwustanowe na pulpicie', + BOOLEAN_FORMAT_API: 'Wartości dwustanowe w API/MQTT', + ENUM_FORMAT: 'Wartości z listy w API/MQTT', INDEX: 'indeks', ENABLE_PARASITE: 'Aktywuj zasilanie pasożytnicze', LOGGING: 'Logowanie', @@ -143,29 +151,29 @@ const pl: Translation = { CUSTOMIZATIONS_SAVED: 'Personalizacje zostały zapisane.', CUSTOMIZATIONS_HELP_1: 'Wybierz urządzenie EMS, dostosuj opcje lub kliknij by zmienić nazwę encji.', CUSTOMIZATIONS_HELP_2: 'oznacz jako ulubioną', - CUSTOMIZATIONS_HELP_3: 'zablokuj możliwość zapisu', + CUSTOMIZATIONS_HELP_3: 'zablokuj akcje zapisu', CUSTOMIZATIONS_HELP_4: 'wyklucz z MQTT i API', CUSTOMIZATIONS_HELP_5: 'ukryj na pulpicie', SELECT_DEVICE: 'wybierz urządzenie', - SET_ALL: 'Zaznacz wszystko jako', + SET_ALL: 'Ustaw wszystko jako', OPTIONS: 'Opcje', - NAME: 'nazwa', + NAME: '{{Nazwa|nazwa|}}', 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?', DEVICE_ENTITIES: 'Encje urządzenia', USER_CUSTOMIZATION: 'Personalizacje użytkownika', SUPPORT_INFORMATION: 'Informacje dotyczące wsparcia', CLICK_HERE: 'Kliknij tu', - HELP_INFORMATION_1: 'W celu znalezienia szczegółowych instrukcji jak skonfigurować EMS-ESP skorzystaj z wiki', - HELP_INFORMATION_2: 'W celu komunikacji na żywo ze społecznością skorzystaj z serwera Discord', + HELP_INFORMATION_1: 'Aby uzyskać instrukcje dotyczące konfiguracji EMS-ESP skorzystaj z wiki w internecie', + 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_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: 'EMS-ESP jest darmowym projektem typu open-source. Aby go wesprzeć, rozważ przyznanie nam gwiazdki na Github!', SUPPORT_INFO: 'Pobierz informacje', UPLOAD_OF: 'Wysyłanie {0}', UPLOAD: 'Wysyłanie', - DOWNLOAD: '{{P|p|P}}obier{{anie|z|z}}', + DOWNLOAD: '{{P|p||P}}obier{{anie|z||z}}', ABORTED: 'zostało przerwane!', FAILED: 'nie powiodło się!', SUCCESSFUL: 'powiodło się.', @@ -193,7 +201,7 @@ const pl: Translation = { CPU_FREQ: 'Taktowanie CPU', HEAP: 'HEAP (wolne / maksymalny przydział)', PSRAM: 'PSRAM (rozmiar / wolne)', - FLASH: 'Układ pamięci flash (rozmiar / taktowanie)', + FLASH: 'Flash (rozmiar / taktowanie)', APPSIZE: 'Aplikacja (wykorzystane / wolne)', FILESYSTEM: 'System plików (wykorzystane / wolne)', BUFFER_SIZE: 'Rozmiar bufora', @@ -202,15 +210,15 @@ const pl: Translation = { DOWNLOAD_CUSTOMIZATION_TEXT: 'Pobierz personalizacje', 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!', - UPLOAD_TEXT: 'Wyślij firmware (.bin), ustawienia lub personalizacje (.json)', + UPLOAD_TEXT: 'Wyślij firmware (.bin), ustawienia lub personalizacje (.json). Opcjonalnie, wyślij wcześniej plik walidacji (.md5).', UPLOADING: 'Wysłano', UPLOAD_DROP_TEXT: 'Przeciągnij tutaj plik lub kliknij', ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!', - TIME_SET: 'Ustaw czas', + TIME_SET: 'Zegar został ustawiony.', MANAGE_USERS: 'Zarządzanie użytkownikami', - IS_ADMIN: '{{Admin?|Uprawnienia administratora|}}', + IS_ADMIN: '{{Administrator|Uprawnienia administratora|}}', USER_WARNING: 'Przynajmniej jeden użytkownik musi mieć uprawnienia administratora!', - ADD: 'Doda{{j|wanie|C}}', + ADD: 'Doda{{j|wanie|}}', ACCESS_TOKEN_FOR: 'Token dostępu dla użytkownika', ACCESS_TOKEN_TEXT: 'Token jest używany w wywołaniach REST API wymagających autoryzacji. Można go przekazywać bezpośrednio lub przez URL.', @@ -218,29 +226,32 @@ const pl: Translation = { USER: '{{Użytkownik|użytkownika|}}', MODIFY: 'Edycja', SU_TEXT: - 'Hasło "su" (super-użytkownika) jest wykorzystywane do autoryzacji tokenów oraz dostępu do konsoli z uprawnieniami administratora.', - NOT_ENABLED: 'nieaktywowany', + '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', ERRORS_OF: 'Błędy {0}', - DISCONNECT_REASON: 'Powód rozłączenia', + DISCONNECT_REASON: 'Przyczyna braku połączenia', ENABLE_MQTT: 'Aktywuj MQTT', + BROKER: 'brokera', + CLIENT: 'klienta', + BASE_TOPIC: 'Prefiks bazowy', OPTIONAL: 'opcjonalny', FORMATTING: 'Formatowanie', - FORMAT: 'Format', + MQTT_FORMAT: 'Sposób publikowania danych', MQTT_NEST_1: 'zagnieżdżone w pojedynczym temacie', MQTT_NEST_2: 'jako indywidualne tematy', - MQTT_RESPONSE: 'Publikuj odpowiedzi na komendy w temacie "response"', - MQTT_PUBLISH_TEXT_1: 'Publikuj pojedyńcze wartości po zmianie', + MQTT_RESPONSE: 'Rezultat wykonania komendy publikuj w temacie "response"', + MQTT_PUBLISH_TEXT_1: 'Publikuj tematy z pojedynczą wartością bezpośrednio po zmianie', MQTT_PUBLISH_TEXT_2: 'Publikuj w temacie "command" (ioBroker)', - MQTT_PUBLISH_TEXT_3: 'Włącz opcję MQTT Discovery (Home Assistant, Domoticz)', - MQTT_PUBLISH_TEXT_4: 'Prefiks do tematów "discovery"', - MQTT_PUBLISH_INTERVALS: 'Interwał publikowania', + MQTT_PUBLISH_TEXT_3: 'Włącz opcję "MQTT discovery" (Home Assistant, Domoticz)', + MQTT_PUBLISH_TEXT_4: 'Prefiks dla tematów "MQTT discovery"', + MQTT_PUBLISH_INTERVALS: 'Interwały publikowania', MQTT_INT_BOILER: 'Kotły i pompy ciepła', MQTT_INT_THERMOSTATS: 'Termostaty', MQTT_INT_SOLAR: 'Panele solarne', MQTT_INT_MIXER: 'Mieszacze', MQTT_QUEUE: 'Kolejka MQTT', - DEFAULT: 'Domyślnie', - MQTT_CLEAN_SESSION: 'Ustawiaj "Clean session"', + DEFAULT: '{{Pozostałe|Domyślna|}}', + MQTT_CLEAN_SESSION: 'Ustawiaj flagę "Clean session"', MQTT_RETAIN_FLAG: 'Ustawiaj flagę "Retain"', INACTIVE: 'nieaktywny', ACTIVE: 'aktywny', @@ -253,7 +264,7 @@ const pl: Translation = { NTP_SERVER: 'Serwer NTP', TIME_ZONE: 'Strefa czasowa', ACCESS_POINT: '{{Punkt|punktu|}} {{dostępowy|dostępowego|}}', - AP_PROVIDE: 'Aktywuj punkt dostępowy (Access Point)', + AP_PROVIDE: 'Aktywuj punkt dostępowy', AP_PROVIDE_TEXT_1: 'zawsze', AP_PROVIDE_TEXT_2: 'gdy połączenie WiFi jest rozłączone', AP_PROVIDE_TEXT_3: 'nigdy', @@ -262,7 +273,7 @@ const pl: Translation = { AP_CLIENTS: 'Liczba klientów', AP_MAX_CLIENTS: 'Maksymalna liczba klientów', AP_LOCAL_IP: 'Lokalny adres IP', - NETWORK_SCAN: 'Skanuj sieci WiFi', + NETWORK_SCAN: 'Skanowanie sieci WiFi', IDLE: 'uśpiony', LOST: 'zostało utracone.', SCANNING: 'Skanuję', @@ -281,11 +292,13 @@ const pl: Translation = { NETWORK_SUBNET: 'Maska podsieci', NETWORK_DNS: 'Serwery DNS', ADDRESS_OF: 'Adres {0}', - ADMIN: 'Administrator', - GUEST: 'Gość', + ADMIN: 'Użytkownik "administrator".', + GUEST: 'Użytkownik "gość".', NEW: 'Nowy', - RENAME: 'Zmień nazwę', - ENTITY: 'encji' + NEW_NAME_OF: 'Nowa nazwa {0}', + ENTITY: 'encji', + MIN: 'Min.', + MAX: 'Maks.' }; export default pl; diff --git a/interface/src/i18n/se/index.ts b/interface/src/i18n/se/index.ts index d8beb47a7..3e7aa0bad 100644 --- a/interface/src/i18n/se/index.ts +++ b/interface/src/i18n/se/index.ts @@ -4,7 +4,7 @@ const se: Translation = { LANGUAGE: 'Språk', RETRY: 'Försök igen', LOADING: 'Laddar', - IS_REQUIRED: 'Krävs', + IS_REQUIRED: '{0} Krävs', SIGN_IN: 'Logga In', SIGN_OUT: 'Logga Ut', USERNAME: 'Användarnamn', @@ -29,6 +29,10 @@ const se: Translation = { REFRESH: 'Uppdatera', EXPORT: 'Exportera', DEVICE_DETAILS: 'Enhetsdetaljer', + ID_OF: '{0}-ID', + DEVICE: 'Enhets', + PRODUCT: 'Produkt', + VERSION: 'Version', BRAND: 'Fabrikat', ENTITY_NAME: 'Entitetsnamn', VALUE: '{{Värde|värde}}', @@ -60,7 +64,7 @@ const se: Translation = { STARTVALUE: 'Startvärde', WARN_GPIO: 'Varning: Var försiktig vid aktivering av GPIO!', EDIT: 'Ändra', - TEMP_SENSOR: 'Temperatursensor', + TEMP_SENSOR: '{{Sensor|Temperatursensor}}', TEMP_SENSORS: 'Temperatursensorer', WRITE_COMMAND: 'Skrivkommando {cmd}', EMS_BUS_WARNING: @@ -103,11 +107,15 @@ const se: Translation = { 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', BOARD_PROFILE: 'Hårdvaruprofil', + CUSTOM: 'Custom', + GPIO_OF: '{0} GPIO', BUTTON: 'Knapp', TEMPERATURE: 'Temperatur', PHY_TYPE: 'Eth PHY-typ', DISABLED: 'inaktiverad', TX_MODE: 'Tx Mode', + HARDWARE: 'Hardware', + EMS_BUS: '{{BUS|EMS BUS}}', GENERAL_OPTIONS: 'Allmänna Inställningar', LANGUAGE_ENTITIES: 'Språk (för entiteter)', HIDE_LED: 'Inaktivera LED', @@ -223,9 +231,12 @@ const se: Translation = { ERRORS_OF: '{0} fel', DISCONNECT_REASON: 'Anledning till nedkoppling', ENABLE_MQTT: 'Aktivera MQTT', + BROKER: 'Broker', + CLIENT: 'Client', + BASE_TOPIC: 'Base', OPTIONAL: 'Valfritt', FORMATTING: 'Formatering', - FORMAT: 'Format', + MQTT_FORMAT: 'Topic/Payload Format', MQTT_NEST_1: 'Nestlat i en topic.', MQTT_NEST_2: 'Som individuella topics', MQTT_RESPONSE: 'Publish-kommando som ett `response` topic', @@ -284,8 +295,10 @@ const se: Translation = { ADMIN: 'Admin', GUEST: 'Gäst', NEW: 'Ny', - RENAME: 'Byt namn', - ENTITY: 'Entitet' + NEW_NAME_OF: 'Byt namn {0}', + ENTITY: 'Entitet', + MIN: 'min', + MAX: 'max' }; export default se; diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 04d0bda83..8d96666d7 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -559,11 +559,11 @@ const DashboardData: FC = () => { offset: sensor.o }); if (response.status === 204) { - enqueueSnackbar(LL.UPLOAD_OF(LL.TEMP_SENSOR()) + ' ' + LL.FAILED(), { variant: 'error' }); + enqueueSnackbar(LL.UPLOAD_OF(LL.TEMP_SENSOR(0)) + ' ' + LL.FAILED(), { variant: 'error' }); } else if (response.status === 403) { enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' }); } else { - enqueueSnackbar(LL.UPDATED_OF(LL.TEMP_SENSOR()), { variant: 'success' }); + enqueueSnackbar(LL.UPDATED_OF(LL.TEMP_SENSOR(0)), { variant: 'success' }); } setSensor(undefined); } catch (error) { @@ -580,11 +580,11 @@ const DashboardData: FC = () => { return ( setSensor(undefined)}> - {LL.EDIT()} {LL.TEMP_SENSOR()} + {LL.EDIT()} {LL.TEMP_SENSOR(0)} - Sensor ID: {sensor.id} + {LL.ID_OF(LL.TEMP_SENSOR(1))}: {sensor.id} @@ -649,22 +649,22 @@ const DashboardData: FC = () => { - + - + - + diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx index f73617d31..85379faf8 100644 --- a/interface/src/project/SettingsApplication.tsx +++ b/interface/src/project/SettingsApplication.tsx @@ -133,7 +133,7 @@ const SettingsApplication: FC = () => { {boardProfileSelectItems()} - Custom… + {LL.CUSTOM()}… {data.board_profile === 'CUSTOM' && ( @@ -143,7 +143,7 @@ const SettingsApplication: FC = () => { { { { { { margin="normal" select > - {LL.DISABLED()} + {LL.DISABLED(1)} LAN8720 TLK110 @@ -232,7 +232,7 @@ const SettingsApplication: FC = () => { { { { )} - {LL.SETTINGS_OF('EMS BUS')} + {LL.SETTINGS_OF(LL.EMS_BUS(0))} @@ -296,13 +296,13 @@ const SettingsApplication: FC = () => { EMS EMS+ HT3 - Hardware + {LL.HARDWARE()} { const entities_theme = useTheme({ Table: ` - --data-table-library_grid-template-columns: 120px repeat(1, minmax(80px, 1fr)) 40px 40px 120px; + --data-table-library_grid-template-columns: 120px repeat(1, minmax(80px, 1fr)) 45px 45px 120px; `, BaseRow: ` font-size: 14px; @@ -455,11 +455,11 @@ const SettingsCustomization: FC = () => { {LL.OPTIONS()} - min - max + {LL.MIN()} + {LL.MAX()} {LL.VALUE(0)}
@@ -582,7 +582,7 @@ const SettingsCustomization: FC = () => { const de = deviceEntity; return ( setDeviceEntity(undefined)}> - {LL.EDIT() + ' ' + LL.ENTITY() + ' ' + de.id} + {LL.EDIT() + ' ' + LL.ENTITY() + ' "' + de.id + '"'} { - {LL.DEFAULT() + ' ' + LL.NAME()}: {deviceEntity.n} + {LL.DEFAULT(1) + ' ' + LL.NAME(1)}: {deviceEntity.n} { { Date: Thu, 3 Nov 2022 13:04:25 +0100 Subject: [PATCH 2/2] fixes Polish chars not being displayed properly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The characters "Ę" and "ę" had wrong uni-codes in re.woff2. Now, the problem https://github.com/emsesp/EMS-ESP32/pull/702#issuecomment-1291720910 is finally solved. --- interface/public/css/roboto.css | 6 ++---- interface/public/fonts/re.woff2 | Bin 16908 -> 16912 bytes 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/interface/public/css/roboto.css b/interface/public/css/roboto.css index 3a747ac5e..30013e88b 100644 --- a/interface/public/css/roboto.css +++ b/interface/public/css/roboto.css @@ -10,8 +10,7 @@ font-style: normal; font-weight: 400; src: local('Roboto'), local('Roboto-Regular'), url(../fonts/re.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, - U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + unicode-range: U+0000-00FF, U+0104-0107, U+0118-0119, U+0131, U+0141-0144, U+0152-0153, U+015A-015B, U+0179-017C, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { @@ -19,6 +18,5 @@ font-style: normal; font-weight: 500; src: local('Roboto Medium'), local('Roboto-Medium'), url(../fonts/md.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, - U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + unicode-range: U+0000-00FF, U+0104-0107, U+0118-0119, U+0131, U+0141-0144, U+0152-0153, U+015A-015B, U+0179-017C, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } diff --git a/interface/public/fonts/re.woff2 b/interface/public/fonts/re.woff2 index 5ca942ccbaa566da5ab84125044dc7d1a75bdfc4..8fe24668b380a52218d80bc9e1931f658c834637 100644 GIT binary patch literal 16912 zcmV)5K*_&%Pew8T0RR91074J|5&!@I0GK2I070ez0RR9100000000000000000000 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