From 2e52b9ee15e57896e4b23f73501477d0f3461ad7 Mon Sep 17 00:00:00 2001 From: Yinyin Liu Date: Mon, 9 Mar 2026 11:23:09 +0100 Subject: [PATCH] translated hard-code English words to match selected language system, e.g., german, french and italian --- .../src/components/ForgotPassword.tsx | 16 +++-- .../src/components/ResetPassword.tsx | 16 +++-- .../src/components/SetNewPassword.tsx | 16 +++-- .../frontend-marios2/src/components/login.tsx | 18 ++--- .../dashboards/BatteryView/BatteryView.tsx | 30 ++++----- .../BatteryView/BatteryViewSalidomo.tsx | 24 +++---- .../BatteryView/BatteryViewSodioHome.tsx | 20 +++--- .../dashboards/BatteryView/MainStats.tsx | 2 +- .../BatteryView/MainStatsSalidomo.tsx | 2 +- .../BatteryView/MainStatsSodioHome.tsx | 2 +- .../Configuration/Configuration.tsx | 15 +++-- .../Installations/FlatInstallationView.tsx | 9 +-- .../dashboards/Installations/Installation.tsx | 2 +- .../content/dashboards/Overview/overview.tsx | 9 +-- .../dashboards/Overview/salidomoOverview.tsx | 4 +- .../src/content/dashboards/PvView/PvView.tsx | 17 ++--- .../FlatInstallationView.tsx | 9 +-- .../SalidomoInstallations/Installation.tsx | 2 +- .../SodiohomeInstallations/Installation.tsx | 2 +- .../InstallationSearch.tsx | 4 +- .../SodistoreHomeConfiguration.tsx | 19 +++--- .../SodiohomeInstallations/WeeklyReport.tsx | 2 +- .../content/dashboards/Topology/Topology.tsx | 5 +- .../Topology/TopologySodistoreHome.tsx | 5 +- .../content/dashboards/Tree/Information.tsx | 8 +-- .../dashboards/Users/FlatUsersView.tsx | 5 +- .../src/content/dashboards/Users/User.tsx | 19 +++--- .../content/dashboards/Users/UsersSearch.tsx | 5 +- .../src/content/dashboards/Users/userForm.tsx | 7 +- .../content/pages/Status/Status500/index.tsx | 10 +-- typescript/frontend-marios2/src/lang/de.json | 66 ++++++++++++++++++- typescript/frontend-marios2/src/lang/en.json | 66 ++++++++++++++++++- typescript/frontend-marios2/src/lang/fr.json | 66 ++++++++++++++++++- typescript/frontend-marios2/src/lang/it.json | 66 ++++++++++++++++++- 34 files changed, 423 insertions(+), 145 deletions(-) diff --git a/typescript/frontend-marios2/src/components/ForgotPassword.tsx b/typescript/frontend-marios2/src/components/ForgotPassword.tsx index c53ffe8e5..12700f2f1 100644 --- a/typescript/frontend-marios2/src/components/ForgotPassword.tsx +++ b/typescript/frontend-marios2/src/components/ForgotPassword.tsx @@ -19,6 +19,7 @@ import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; import axiosConfig from 'src/Resources/axiosConfig'; import { useNavigate } from 'react-router-dom'; import routes from 'src/Resources/routes.json'; +import { FormattedMessage, useIntl } from 'react-intl'; interface ForgotPasswordPromps { resetPassword: () => void; @@ -29,6 +30,7 @@ function ForgotPassword() { const [loading, setLoading] = useState(false); const [open, setOpen] = useState(false); const [errorModalOpen, setErrorModalOpen] = useState(false); + const intl = useIntl(); const theme = useTheme(); const context = useContext(UserContext); @@ -105,7 +107,7 @@ function ForgotPassword() { - Provide your username + - Submit + - Username is wrong. Please try again. + @@ -216,7 +218,7 @@ function ForgotPassword() { }} > - Mail sent successfully. + diff --git a/typescript/frontend-marios2/src/components/ResetPassword.tsx b/typescript/frontend-marios2/src/components/ResetPassword.tsx index f4023ac17..7928ab76a 100644 --- a/typescript/frontend-marios2/src/components/ResetPassword.tsx +++ b/typescript/frontend-marios2/src/components/ResetPassword.tsx @@ -18,12 +18,14 @@ import { TokenContext } from 'src/contexts/tokenContext'; import { useNavigate } from 'react-router-dom'; import Avatar from '@mui/material/Avatar'; import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; +import { FormattedMessage, useIntl } from 'react-intl'; function ResetPassword() { const [username, setUsername] = useState(''); const [loading, setLoading] = useState(false); const [rememberMe, setRememberMe] = useState(false); const [open, setOpen] = useState(false); + const intl = useIntl(); const theme = useTheme(); const context = useContext(UserContext); const navigate = useNavigate(); @@ -102,7 +104,7 @@ function ResetPassword() { - Reset Password + - Passwords do not match + )} @@ -164,7 +166,7 @@ function ResetPassword() { color="primary" onClick={handleSubmit} > - Submit + - Reset Password failed. Please try again. + diff --git a/typescript/frontend-marios2/src/components/SetNewPassword.tsx b/typescript/frontend-marios2/src/components/SetNewPassword.tsx index 3d53c5bc5..cf9de7e73 100644 --- a/typescript/frontend-marios2/src/components/SetNewPassword.tsx +++ b/typescript/frontend-marios2/src/components/SetNewPassword.tsx @@ -18,12 +18,14 @@ import { TokenContext } from 'src/contexts/tokenContext'; import { useNavigate } from 'react-router-dom'; import Avatar from '@mui/material/Avatar'; import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; +import { FormattedMessage, useIntl } from 'react-intl'; function SetNewPassword() { const [username, setUsername] = useState(''); const [loading, setLoading] = useState(false); const [rememberMe, setRememberMe] = useState(false); const [open, setOpen] = useState(false); + const intl = useIntl(); const theme = useTheme(); const context = useContext(UserContext); const navigate = useNavigate(); @@ -103,7 +105,7 @@ function SetNewPassword() { - Set New Password + - Passwords do not match + )} @@ -165,7 +167,7 @@ function SetNewPassword() { color="primary" onClick={handleSubmit} > - Submit + - Setting new password failed. Please try again. + diff --git a/typescript/frontend-marios2/src/components/login.tsx b/typescript/frontend-marios2/src/components/login.tsx index 48d047c31..bc0f2ffa9 100644 --- a/typescript/frontend-marios2/src/components/login.tsx +++ b/typescript/frontend-marios2/src/components/login.tsx @@ -25,6 +25,7 @@ import CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank'; import CheckBoxIcon from '@mui/icons-material/CheckBox'; import routes from 'src/Resources/routes.json'; import { ProductIdContext } from '../contexts/ProductIdContextProvider'; +import { FormattedMessage, useIntl } from 'react-intl'; function Login() { const [username, setUsername] = useState(''); @@ -34,6 +35,7 @@ function Login() { const [open, setOpen] = useState(false); const [error, setError] = useState(false); + const intl = useIntl(); const theme = useTheme(); const context = useContext(UserContext); const { @@ -147,7 +149,7 @@ function Login() { - Sign in + } - label="Remember me" + label={} /> {loading && ( @@ -253,7 +255,7 @@ function Login() { }} > - Login failed. Please try again. + @@ -281,7 +283,7 @@ function Login() { onForgotPassword(); }} > - Forgot password? + diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx index b4441fa3b..62a780dc4 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx @@ -87,10 +87,10 @@ function BatteryView(props: BatteryViewProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Unable to communicate with the installation + - Please wait or refresh the page + )} @@ -111,10 +111,10 @@ function BatteryView(props: BatteryViewProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Battery service is not available at the moment + - Please wait or refresh the page + )} @@ -229,24 +229,24 @@ function BatteryView(props: BatteryViewProps) { - Battery - Firmware - Power - Battery Voltage - SoC - Temperature + + + + + + {product === 0 ? ( - Warnings + ) : ( - Min Cell Voltage + )} {product === 0 ? ( - Alarms + ) : ( - Max Cell Voltage + )} {(product === 3 || product === 4) && ( - Voltage Difference + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSalidomo.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSalidomo.tsx index 030cc890e..12a238d91 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSalidomo.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSalidomo.tsx @@ -85,10 +85,10 @@ function BatteryViewSalidomo(props: BatteryViewProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Unable to communicate with the installation + - Please wait or refresh the page + )} @@ -109,10 +109,10 @@ function BatteryViewSalidomo(props: BatteryViewProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Battery service is not available at the moment + - Please wait or refresh the page + )} @@ -209,14 +209,14 @@ function BatteryViewSalidomo(props: BatteryViewProps) {
- Battery - Firmware - Power - Voltage - SoC - Temperature - Warnings - Alarms + + + + + + + + diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSodioHome.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSodioHome.tsx index fb3e221d3..6c5a1eb4b 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSodioHome.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSodioHome.tsx @@ -87,10 +87,10 @@ function BatteryViewSodioHome(props: BatteryViewSodioHomeProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Unable to communicate with the installation + - Please wait or refresh the page + )} @@ -111,10 +111,10 @@ function BatteryViewSodioHome(props: BatteryViewSodioHomeProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Battery service is not available at the moment + - Please wait or refresh the page + )} @@ -195,12 +195,12 @@ function BatteryViewSodioHome(props: BatteryViewSodioHomeProps) {
- Battery - Power - Battery Voltage - Current - SoC - SoH + + + + + + {/*Daily Charge Energy*/} {/*Daily Discharge Energy*/} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStats.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStats.tsx index 35be8866e..a27540f2a 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStats.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStats.tsx @@ -295,7 +295,7 @@ function MainStats(props: MainStatsProps) { > - Fetching data... + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStatsSalidomo.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStatsSalidomo.tsx index fbe4fe728..1b8b5ea36 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStatsSalidomo.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStatsSalidomo.tsx @@ -294,7 +294,7 @@ function MainStatsSalidomo(props: MainStatsProps) { > - Fetching data... + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStatsSodioHome.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStatsSodioHome.tsx index 598eedc77..e08a436ef 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStatsSodioHome.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStatsSodioHome.tsx @@ -302,7 +302,7 @@ function MainStatsSodioHome(props: MainStatsSodioHomeProps) { > - Fetching data... + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx b/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx index eee0f1849..8bdf1a24a 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx @@ -19,7 +19,7 @@ import { } from '@mui/material'; import React, { useContext, useState } from 'react'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import Button from '@mui/material/Button'; import { Close as CloseIcon } from '@mui/icons-material'; import MenuItem from '@mui/material/MenuItem'; @@ -40,6 +40,7 @@ interface ConfigurationProps { } function Configuration(props: ConfigurationProps) { + const intl = useIntl(); if (props.values === null) { return null; } @@ -137,7 +138,7 @@ function Configuration(props: ConfigurationProps) { props.values.EssControl.Mode === 'CalibrationCharge' ) { setDateSelectionError( - 'You cannot change the date while the installation is in Calibration Charge Mode' + intl.formatMessage({ id: 'cannotChangeDateCalibration' }) ); setErrorDateModalOpen(true); return; @@ -146,7 +147,7 @@ function Configuration(props: ConfigurationProps) { dayjs(formValues.calibrationChargeDate).isBefore(dayjs()) ) { //console.log('asked for', dayjs(formValues.calibrationChargeDate)); - setDateSelectionError('You must specify a future date'); + setDateSelectionError(intl.formatMessage({ id: 'mustSpecifyFutureDate' })); setErrorDateModalOpen(true); return; } else { @@ -458,7 +459,7 @@ function Configuration(props: ConfigurationProps) { helperText={ errors.minimumSoC ? ( - Value should be between 0-100% + {intl.formatMessage({ id: 'valueBetween0And100' })} ) : ( '' @@ -592,7 +593,7 @@ function Configuration(props: ConfigurationProps) { helperText={ errors.gridSetPoint ? ( - Please provide a valid number + {intl.formatMessage({ id: 'pleaseProvideValidNumber' })} ) : ( '' @@ -804,7 +805,7 @@ function Configuration(props: ConfigurationProps) { alignItems: 'center' }} > - Successfully applied configuration file + - An error has occurred + { + const intl = useIntl(); const [isRowHovered, setHoveredRow] = useState(-1); const navigate = useNavigate(); const [selectedInstallation, setSelectedInstallation] = useState(-1); @@ -202,7 +203,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => { > setSearchTerm(e.target.value)} fullWidth @@ -226,7 +227,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => { setSortByAction(e.target.value)} - label="Show Only" + label={intl.formatMessage({ id: 'showOnly' })} > {[ 'All Installations', diff --git a/typescript/frontend-marios2/src/content/dashboards/Installations/Installation.tsx b/typescript/frontend-marios2/src/content/dashboards/Installations/Installation.tsx index 41aff6831..6894d5546 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Installations/Installation.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Installations/Installation.tsx @@ -394,7 +394,7 @@ function Installation(props: singleInstallationProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Connecting to the device... + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/Overview/overview.tsx b/typescript/frontend-marios2/src/content/dashboards/Overview/overview.tsx index 5129abbed..530a22e42 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Overview/overview.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Overview/overview.tsx @@ -19,7 +19,7 @@ import { transformInputToDailyDataJson } from 'src/interfaces/Chart'; import Button from '@mui/material/Button'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import CircularProgress from '@mui/material/CircularProgress'; import { LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; @@ -52,6 +52,7 @@ const computeLast7Days = (): string[] => { }; function Overview(props: OverviewProps) { + const intl = useIntl(); const context = useContext(UserContext); const { currentUser } = context; const [dailyData, setDailyData] = useState(true); @@ -119,7 +120,7 @@ function Overview(props: OverviewProps) { resultPromise .then((result) => { if (result.chartData.soc.data.length === 0) { - setDateSelectionError('No data available for the selected date range. Please choose a more recent date.'); + setDateSelectionError(intl.formatMessage({ id: 'noDataForDateRange' })); setErrorDateModalOpen(true); setLoading(false); return; @@ -288,7 +289,7 @@ function Overview(props: OverviewProps) { resultPromise .then((result) => { if (result.chartData.soc.data.length === 0) { - setDateSelectionError('No data available for the selected date range. Please choose a more recent date.'); + setDateSelectionError(intl.formatMessage({ id: 'noDataForDateRange' })); setErrorDateModalOpen(true); setLoading(false); return; @@ -616,7 +617,7 @@ function Overview(props: OverviewProps) { > - Fetching data... + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/Overview/salidomoOverview.tsx b/typescript/frontend-marios2/src/content/dashboards/Overview/salidomoOverview.tsx index 6d60e0fc0..35ce941b0 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Overview/salidomoOverview.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Overview/salidomoOverview.tsx @@ -405,7 +405,7 @@ const computeLast7Days = (): string[] => { // > // // -// Fetching data... +// // // // )} @@ -945,7 +945,7 @@ function SalidomoOverview(props: salidomoOverviewProps) { > - Fetching data... + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/PvView/PvView.tsx b/typescript/frontend-marios2/src/content/dashboards/PvView/PvView.tsx index e246f0f7d..0d16400b8 100644 --- a/typescript/frontend-marios2/src/content/dashboards/PvView/PvView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/PvView/PvView.tsx @@ -14,6 +14,7 @@ import { JSONRecordData } from '../Log/graph.util'; import { useLocation, useNavigate } from 'react-router-dom'; import routes from '../../../Resources/routes.json'; import CircularProgress from '@mui/material/CircularProgress'; +import { FormattedMessage } from 'react-intl'; interface PvViewProps { values: JSONRecordData; @@ -80,10 +81,10 @@ function PvView(props: PvViewProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Unable to communicate with the installation + - Please wait or refresh the page + )} @@ -105,10 +106,10 @@ function PvView(props: PvViewProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Pv view is not available at the moment + - Please wait or refresh the page + )} @@ -130,10 +131,10 @@ function PvView(props: PvViewProps) {
- Pv - Power - Voltage - Current + + + + diff --git a/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/FlatInstallationView.tsx b/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/FlatInstallationView.tsx index fe534676b..b303dfcbe 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/FlatInstallationView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/FlatInstallationView.tsx @@ -20,7 +20,7 @@ import { useTheme } from '@mui/material'; import { I_Installation } from 'src/interfaces/InstallationTypes'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import { useLocation, useNavigate } from 'react-router-dom'; import routes from '../../../Resources/routes.json'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -32,6 +32,7 @@ interface FlatInstallationViewProps { } const FlatInstallationView = (props: FlatInstallationViewProps) => { + const intl = useIntl(); const navigate = useNavigate(); const [selectedInstallation, setSelectedInstallation] = useState(-1); const currentLocation = useLocation(); @@ -182,7 +183,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => { > setSearchTerm(e.target.value)} fullWidth @@ -206,7 +207,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => { setSortByAction(e.target.value)} - label="Show Only" + label={intl.formatMessage({ id: 'showOnly' })} > {[ 'All Installations', diff --git a/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/Installation.tsx b/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/Installation.tsx index 51d202da0..73ca52dd4 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/Installation.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/Installation.tsx @@ -315,7 +315,7 @@ function SalidomoInstallation(props: singleInstallationProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Connecting to the device... + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/Installation.tsx b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/Installation.tsx index 2df0402f3..703098d50 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/Installation.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/Installation.tsx @@ -449,7 +449,7 @@ function SodioHomeInstallation(props: singleInstallationProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Connecting to the device... + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/InstallationSearch.tsx b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/InstallationSearch.tsx index 1b3601874..521f4622e 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/InstallationSearch.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/InstallationSearch.tsx @@ -1,6 +1,7 @@ import React, { useMemo, useState } from 'react'; import { FormControl, Grid, InputAdornment, TextField } from '@mui/material'; import SearchTwoToneIcon from '@mui/icons-material/SearchTwoTone'; +import { useIntl } from 'react-intl'; import { I_Installation } from '../../../interfaces/InstallationTypes'; import { Route, Routes, useLocation } from 'react-router-dom'; import routes from '../../../Resources/routes.json'; @@ -12,6 +13,7 @@ interface installationSearchProps { } function InstallationSearch(props: installationSearchProps) { + const intl = useIntl(); const [searchTerm, setSearchTerm] = useState(''); const currentLocation = useLocation(); // const [filteredData, setFilteredData] = useState(props.installations); @@ -60,7 +62,7 @@ function InstallationSearch(props: installationSearchProps) { > setSearchTerm(e.target.value)} fullWidth diff --git a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/SodistoreHomeConfiguration.tsx b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/SodistoreHomeConfiguration.tsx index de4c2ef21..95ba5d25d 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/SodistoreHomeConfiguration.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/SodistoreHomeConfiguration.tsx @@ -17,7 +17,7 @@ import { } from '@mui/material'; import React, { useContext, useState, useEffect } from 'react'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import Button from '@mui/material/Button'; import { Close as CloseIcon } from '@mui/icons-material'; import MenuItem from '@mui/material/MenuItem'; @@ -39,6 +39,7 @@ interface SodistoreHomeConfigurationProps { } function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) { + const intl = useIntl(); if (props.values === null) { return null; } @@ -202,7 +203,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) { const stopTimeInMinutes = stopHours * 60 + stopMinutes; if (startTimeInMinutes >= stopTimeInMinutes) { - setDateSelectionError('Stop time must be later than start time'); + setDateSelectionError(intl.formatMessage({ id: 'stopTimeMustBeLater' })); setErrorDateModalOpen(true); return false; } @@ -462,7 +463,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) { {/* fullWidth*/} {/*/>*/} handleTimeChargeDischargeChange(e.target.name, e.target.value) } - helperText="Enter a positive or negative power value" + helperText={intl.formatMessage({ id: 'enterPowerValue' })} fullWidth /> @@ -556,7 +557,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) { - Successfully applied configuration file + - An error has occurred + - Unable to communicate with the installation + - Please wait or refresh the page + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/Topology/TopologySodistoreHome.tsx b/typescript/frontend-marios2/src/content/dashboards/Topology/TopologySodistoreHome.tsx index ef980b1a8..29a27eb05 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Topology/TopologySodistoreHome.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Topology/TopologySodistoreHome.tsx @@ -13,6 +13,7 @@ import { JSONRecordData } from '../Log/graph.util'; import { ProductIdContext } from '../../../contexts/ProductIdContextProvider'; +import { FormattedMessage } from 'react-intl'; interface TopologySodistoreHomeProps { values: JSONRecordData; @@ -82,10 +83,10 @@ function TopologySodistoreHome(props: TopologySodistoreHomeProps) { style={{ color: 'black', fontWeight: 'bold' }} mt={2} > - Unable to communicate with the installation + - Please wait or refresh the page + )} diff --git a/typescript/frontend-marios2/src/content/dashboards/Tree/Information.tsx b/typescript/frontend-marios2/src/content/dashboards/Tree/Information.tsx index f0fa3259c..3e8c936f6 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Tree/Information.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Tree/Information.tsx @@ -177,14 +177,14 @@ function TreeInformation(props: TreeInformationProps) { gutterBottom sx={{ fontWeight: 'bold' }} > - Do you want to delete this folder? + - All installations of this folder will be deleted. +
- Delete +
diff --git a/typescript/frontend-marios2/src/content/dashboards/Users/FlatUsersView.tsx b/typescript/frontend-marios2/src/content/dashboards/Users/FlatUsersView.tsx index 53cb2a2b7..77ddd612e 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Users/FlatUsersView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Users/FlatUsersView.tsx @@ -12,6 +12,7 @@ import { Typography, useTheme } from '@mui/material'; +import { FormattedMessage } from 'react-intl'; import { InnovEnergyUser } from 'src/interfaces/UserTypes'; import User from './User'; @@ -57,8 +58,8 @@ const FlatUsersView = (props: FlatUsersViewProps) => { - Username - Email + + diff --git a/typescript/frontend-marios2/src/content/dashboards/Users/User.tsx b/typescript/frontend-marios2/src/content/dashboards/Users/User.tsx index 25725a759..074c1c2bd 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Users/User.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Users/User.tsx @@ -25,7 +25,7 @@ import axiosConfig from 'src/Resources/axiosConfig'; import { InnovEnergyUser } from 'src/interfaces/UserTypes'; import { TokenContext } from 'src/contexts/tokenContext'; import { TabsContainerWrapper } from 'src/layouts/TabsContainerWrapper'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import UserAccess from '../ManageAccess/UserAccess'; interface singleUserProps { @@ -35,6 +35,7 @@ interface singleUserProps { function User(props: singleUserProps) { const theme = useTheme(); + const intl = useIntl(); const [loading, setLoading] = useState(false); const [error, setError] = useState(false); const [updated, setUpdated] = useState(false); @@ -43,8 +44,8 @@ function User(props: singleUserProps) { const tokencontext = useContext(TokenContext); const { removeToken } = tokencontext; const tabs = [ - { value: 'user', label: 'User' }, - { value: 'manage', label: 'Access Management' } + { value: 'user', label: intl.formatMessage({ id: 'user' }) }, + { value: 'manage', label: intl.formatMessage({ id: 'accessManagement' }) } ]; const [openModalDeleteUser, setOpenModalDeleteUser] = useState(false); @@ -190,7 +191,7 @@ function User(props: singleUserProps) { gutterBottom sx={{ fontWeight: 'bold' }} > - Do you want to delete this user? +
- Delete +
@@ -274,7 +275,7 @@ function User(props: singleUserProps) { >
setSearchTerm(e.target.value)} fullWidth diff --git a/typescript/frontend-marios2/src/content/dashboards/Users/userForm.tsx b/typescript/frontend-marios2/src/content/dashboards/Users/userForm.tsx index 57cef9bf5..652461f34 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Users/userForm.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Users/userForm.tsx @@ -18,7 +18,7 @@ import { InnovEnergyUser } from 'src/interfaces/UserTypes'; import axiosConfig from 'src/Resources/axiosConfig'; import { TokenContext } from 'src/contexts/tokenContext'; import { I_Folder, I_Installation } from 'src/interfaces/InstallationTypes'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; interface userFormProps { cancel: () => void; @@ -27,10 +27,11 @@ interface userFormProps { } function userForm(props: userFormProps) { + const intl = useIntl(); const theme = useTheme(); const [loading, setLoading] = useState(false); const [error, setError] = useState(false); - const [errormessage, setErrorMessage] = useState('An error has occured'); + const [errormessage, setErrorMessage] = useState(intl.formatMessage({ id: 'errorOccured' })); const [openInstallation, setOpenInstallation] = useState(false); const [openFolder, setOpenFolder] = useState(false); const [formValues, setFormValues] = useState>({ @@ -174,7 +175,7 @@ function userForm(props: userFormProps) { .delete(`/DeleteUser?userId=${res.data.id}`) .then((response) => { setLoading(false); - setErrorMessage('An error has occured'); + setErrorMessage(intl.formatMessage({ id: 'errorOccured' })); setError(true); setTimeout(() => { props.cancel(); diff --git a/typescript/frontend-marios2/src/content/pages/Status/Status500/index.tsx b/typescript/frontend-marios2/src/content/pages/Status/Status500/index.tsx index 492156a9f..2fcd2bae5 100644 --- a/typescript/frontend-marios2/src/content/pages/Status/Status500/index.tsx +++ b/typescript/frontend-marios2/src/content/pages/Status/Status500/index.tsx @@ -11,6 +11,7 @@ import { import { Helmet } from 'react-helmet-async'; import RefreshTwoToneIcon from '@mui/icons-material/RefreshTwoTone'; import LoadingButton from '@mui/lab/LoadingButton'; +import { FormattedMessage } from 'react-intl'; const GridWrapper = styled(Grid)( ({ theme }) => ` @@ -77,7 +78,7 @@ function Status500() { src="/static/images/status/500.svg" /> - There was an error, please try again later + - The server encountered an internal error and was not able to - complete your request + } > - Refresh view + diff --git a/typescript/frontend-marios2/src/lang/de.json b/typescript/frontend-marios2/src/lang/de.json index 318822c60..6c212a1e4 100644 --- a/typescript/frontend-marios2/src/lang/de.json +++ b/typescript/frontend-marios2/src/lang/de.json @@ -404,5 +404,69 @@ "allInstallations": "Alle Installationen", "group": "Gruppe", "groups": "Gruppen", - "requiredOrderNumber": "Pflichtbestellnummer" + "requiredOrderNumber": "Pflichtbestellnummer", + "unableToCommunicate": "Kommunikation mit der Installation nicht möglich", + "pleaseWaitOrRefresh": "Bitte warten oder Seite aktualisieren", + "noDataForDateRange": "Keine Daten für den gewählten Zeitraum verfügbar. Bitte wählen Sie ein neueres Datum.", + "loginFailed": "Anmeldung fehlgeschlagen. Bitte versuchen Sie es erneut.", + "usernameWrong": "Benutzername ist falsch. Bitte versuchen Sie es erneut.", + "mailSentSuccessfully": "E-Mail erfolgreich gesendet.", + "passwordsDoNotMatch": "Passwörter stimmen nicht überein", + "resetPasswordFailed": "Passwort zurücksetzen fehlgeschlagen. Bitte versuchen Sie es erneut.", + "setNewPasswordFailed": "Neues Passwort setzen fehlgeschlagen. Bitte versuchen Sie es erneut.", + "successfullyAppliedConfig": "Konfigurationsdatei erfolgreich angewendet", + "configErrorOccurred": "Ein Fehler ist aufgetreten", + "confirmDeleteFolder": "Möchten Sie diesen Ordner löschen?", + "deleteFolderWarning": "Alle Installationen dieses Ordners werden gelöscht.", + "failedToLoadReport": "Bericht konnte nicht geladen werden. Stellen Sie sicher, dass die Excel-Datei in tmp_report/ abgelegt ist.", + "serverError": "Ein Fehler ist aufgetreten, bitte versuchen Sie es später erneut", + "pvViewNotAvailable": "PV-Ansicht ist derzeit nicht verfügbar", + "batteryServiceNotAvailable": "Batteriedienst ist derzeit nicht verfügbar", + "cannotChangeDateCalibration": "Sie können das Datum nicht ändern, während sich die Installation im Kalibrierungslade-Modus befindet", + "mustSpecifyFutureDate": "Sie müssen ein zukünftiges Datum angeben", + "valueBetween0And100": "Wert muss zwischen 0-100% liegen", + "pleaseProvideValidNumber": "Bitte geben Sie eine gültige Zahl ein", + "stopTimeMustBeLater": "Die Stoppzeit muss nach der Startzeit liegen", + "signIn": "Anmelden", + "username": "Benutzername", + "password": "Passwort", + "rememberMe": "Angemeldet bleiben", + "login": "Anmelden", + "close": "Schliessen", + "forgotPasswordLink": "Passwort vergessen?", + "provideYourUsername": "Geben Sie Ihren Benutzernamen ein", + "userName": "Benutzername", + "resetPassword": "Passwort zurücksetzen", + "setNewPassword": "Neues Passwort setzen", + "verifyPassword": "Passwort bestätigen", + "delete": "Löschen", + "successfullyCreatedUser": "Benutzer erfolgreich erstellt", + "serverInternalError": "Der Server hat einen internen Fehler festgestellt und konnte Ihre Anfrage nicht abschliessen", + "refreshView": "Ansicht aktualisieren", + "goBack": "Zurück", + "connectingToDevice": "Verbindung zum Gerät wird hergestellt...", + "fetchingData": "Daten werden abgerufen...", + "confirmDeleteUser": "Möchten Sie diesen Benutzer löschen?", + "accessManagement": "Zugriffsverwaltung", + "power": "Leistung", + "voltage": "Spannung", + "current": "Strom", + "battery": "Batterie", + "firmware": "Firmware", + "batteryVoltage": "Batteriespannung", + "soc": "Ladezustand", + "soh": "Gesundheitszustand", + "temperature": "Temperatur", + "warnings": "Warnungen", + "alarms": "Alarme", + "minCellVoltage": "Min. Zellenspannung", + "maxCellVoltage": "Max. Zellenspannung", + "voltageDifference": "Spannungsdifferenz", + "pv": "PV", + "showOnly": "Nur anzeigen", + "minimumSocPercent": "Minimaler Ladezustand (%)", + "powerW": "Leistung (W)", + "enterPowerValue": "Positiven oder negativen Leistungswert eingeben", + "startDateTime": "Startdatum und -zeit (Startzeit < Stoppzeit)", + "stopDateTime": "Stoppdatum und -zeit (Startzeit < Stoppzeit)" } \ No newline at end of file diff --git a/typescript/frontend-marios2/src/lang/en.json b/typescript/frontend-marios2/src/lang/en.json index 9b721c031..222811e16 100644 --- a/typescript/frontend-marios2/src/lang/en.json +++ b/typescript/frontend-marios2/src/lang/en.json @@ -152,5 +152,69 @@ "demo_custom_group": "Custom (may use Mistral AI)", "demo_custom_option": "Type custom alarm below…", "demo_custom_placeholder": "e.g. UnknownBatteryFault", - "demo_diagnose_button": "Diagnose" + "demo_diagnose_button": "Diagnose", + "unableToCommunicate": "Unable to communicate with the installation", + "pleaseWaitOrRefresh": "Please wait or refresh the page", + "noDataForDateRange": "No data available for the selected date range. Please choose a more recent date.", + "loginFailed": "Login failed. Please try again.", + "usernameWrong": "Username is wrong. Please try again.", + "mailSentSuccessfully": "Mail sent successfully.", + "passwordsDoNotMatch": "Passwords do not match", + "resetPasswordFailed": "Reset Password failed. Please try again.", + "setNewPasswordFailed": "Setting new password failed. Please try again.", + "successfullyAppliedConfig": "Successfully applied configuration file", + "configErrorOccurred": "An error has occurred", + "confirmDeleteFolder": "Do you want to delete this folder?", + "deleteFolderWarning": "All installations of this folder will be deleted.", + "failedToLoadReport": "Failed to load report. Make sure the Excel file is placed in tmp_report/", + "serverError": "There was an error, please try again later", + "pvViewNotAvailable": "Pv view is not available at the moment", + "batteryServiceNotAvailable": "Battery service is not available at the moment", + "cannotChangeDateCalibration": "You cannot change the date while the installation is in Calibration Charge Mode", + "mustSpecifyFutureDate": "You must specify a future date", + "valueBetween0And100": "Value should be between 0-100%", + "pleaseProvideValidNumber": "Please provide a valid number", + "stopTimeMustBeLater": "Stop time must be later than start time", + "signIn": "Sign in", + "username": "Username", + "password": "Password", + "rememberMe": "Remember me", + "login": "Login", + "close": "Close", + "forgotPasswordLink": "Forgot password?", + "provideYourUsername": "Provide your username", + "userName": "User Name", + "resetPassword": "Reset Password", + "setNewPassword": "Set New Password", + "verifyPassword": "Verify Password", + "delete": "Delete", + "successfullyCreatedUser": "Successfully Created User", + "serverInternalError": "The server encountered an internal error and was not able to complete your request", + "refreshView": "Refresh view", + "goBack": "Go back", + "connectingToDevice": "Connecting to the device...", + "fetchingData": "Fetching data...", + "confirmDeleteUser": "Do you want to delete this user?", + "accessManagement": "Access Management", + "power": "Power", + "voltage": "Voltage", + "current": "Current", + "battery": "Battery", + "firmware": "Firmware", + "batteryVoltage": "Battery Voltage", + "soc": "SoC", + "soh": "SoH", + "temperature": "Temperature", + "warnings": "Warnings", + "alarms": "Alarms", + "minCellVoltage": "Min Cell Voltage", + "maxCellVoltage": "Max Cell Voltage", + "voltageDifference": "Voltage Difference", + "pv": "Pv", + "showOnly": "Show Only", + "minimumSocPercent": "Minimum SoC (%)", + "powerW": "Power (W)", + "enterPowerValue": "Enter a positive or negative power value", + "startDateTime": "Start Date and Time (Start Time < Stop Time)", + "stopDateTime": "Stop Date and Time (Start Time < Stop Time)" } diff --git a/typescript/frontend-marios2/src/lang/fr.json b/typescript/frontend-marios2/src/lang/fr.json index 4d24219f6..16f559678 100644 --- a/typescript/frontend-marios2/src/lang/fr.json +++ b/typescript/frontend-marios2/src/lang/fr.json @@ -404,5 +404,69 @@ "groupTabs": "Groupes", "groupTree": "Arborescence de groupes", "installationTabs": "Installations", - "navigationTabs": "Navigation" + "navigationTabs": "Navigation", + "unableToCommunicate": "Impossible de communiquer avec l'installation", + "pleaseWaitOrRefresh": "Veuillez patienter ou actualiser la page", + "noDataForDateRange": "Aucune donnée disponible pour la période sélectionnée. Veuillez choisir une date plus récente.", + "loginFailed": "Échec de la connexion. Veuillez réessayer.", + "usernameWrong": "Nom d'utilisateur incorrect. Veuillez réessayer.", + "mailSentSuccessfully": "E-mail envoyé avec succès.", + "passwordsDoNotMatch": "Les mots de passe ne correspondent pas", + "resetPasswordFailed": "La réinitialisation du mot de passe a échoué. Veuillez réessayer.", + "setNewPasswordFailed": "La définition du nouveau mot de passe a échoué. Veuillez réessayer.", + "successfullyAppliedConfig": "Fichier de configuration appliqué avec succès", + "configErrorOccurred": "Une erreur s'est produite", + "confirmDeleteFolder": "Voulez-vous supprimer ce dossier ?", + "deleteFolderWarning": "Toutes les installations de ce dossier seront supprimées.", + "failedToLoadReport": "Impossible de charger le rapport. Assurez-vous que le fichier Excel est placé dans tmp_report/", + "serverError": "Une erreur s'est produite, veuillez réessayer plus tard", + "pvViewNotAvailable": "La vue PV n'est pas disponible pour le moment", + "batteryServiceNotAvailable": "Le service batterie n'est pas disponible pour le moment", + "cannotChangeDateCalibration": "Vous ne pouvez pas changer la date pendant que l'installation est en mode de charge de calibration", + "mustSpecifyFutureDate": "Vous devez spécifier une date future", + "valueBetween0And100": "La valeur doit être entre 0-100%", + "pleaseProvideValidNumber": "Veuillez fournir un nombre valide", + "stopTimeMustBeLater": "L'heure d'arrêt doit être postérieure à l'heure de début", + "signIn": "Se connecter", + "username": "Nom d'utilisateur", + "password": "Mot de passe", + "rememberMe": "Se souvenir de moi", + "login": "Connexion", + "close": "Fermer", + "forgotPasswordLink": "Mot de passe oublié ?", + "provideYourUsername": "Entrez votre nom d'utilisateur", + "userName": "Nom d'utilisateur", + "resetPassword": "Réinitialiser le mot de passe", + "setNewPassword": "Définir un nouveau mot de passe", + "verifyPassword": "Vérifier le mot de passe", + "delete": "Supprimer", + "successfullyCreatedUser": "Utilisateur créé avec succès", + "serverInternalError": "Le serveur a rencontré une erreur interne et n'a pas pu traiter votre demande", + "refreshView": "Actualiser la vue", + "goBack": "Retour", + "connectingToDevice": "Connexion à l'appareil en cours...", + "fetchingData": "Récupération des données...", + "confirmDeleteUser": "Voulez-vous supprimer cet utilisateur ?", + "accessManagement": "Gestion des accès", + "power": "Puissance", + "voltage": "Tension", + "current": "Courant", + "battery": "Batterie", + "firmware": "Firmware", + "batteryVoltage": "Tension de la batterie", + "soc": "État de charge", + "soh": "État de santé", + "temperature": "Température", + "warnings": "Avertissements", + "alarms": "Alarmes", + "minCellVoltage": "Tension min. cellule", + "maxCellVoltage": "Tension max. cellule", + "voltageDifference": "Différence de tension", + "pv": "PV", + "showOnly": "Afficher uniquement", + "minimumSocPercent": "SoC minimum (%)", + "powerW": "Puissance (W)", + "enterPowerValue": "Entrez une valeur de puissance positive ou négative", + "startDateTime": "Date et heure de début (Début < Fin)", + "stopDateTime": "Date et heure de fin (Début < Fin)" } \ No newline at end of file diff --git a/typescript/frontend-marios2/src/lang/it.json b/typescript/frontend-marios2/src/lang/it.json index e59fdb36a..cf44a2c21 100644 --- a/typescript/frontend-marios2/src/lang/it.json +++ b/typescript/frontend-marios2/src/lang/it.json @@ -404,5 +404,69 @@ "alarm_AFCIFault": "Guasto AFCI", "alarm_GFCIHigh": "Corrente di guasto a terra elevata", "alarm_PVVoltageHigh": "Tensione PV elevata", - "alarm_OffGridBusVoltageTooLow": "Tensione Bus Fuori Rete Troppo Bassa" + "alarm_OffGridBusVoltageTooLow": "Tensione Bus Fuori Rete Troppo Bassa", + "unableToCommunicate": "Impossibile comunicare con l'installazione", + "pleaseWaitOrRefresh": "Attendere o aggiornare la pagina", + "noDataForDateRange": "Nessun dato disponibile per il periodo selezionato. Scegliere una data più recente.", + "loginFailed": "Accesso fallito. Riprovare.", + "usernameWrong": "Nome utente errato. Riprovare.", + "mailSentSuccessfully": "E-mail inviata con successo.", + "passwordsDoNotMatch": "Le password non corrispondono", + "resetPasswordFailed": "Reimpostazione password fallita. Riprovare.", + "setNewPasswordFailed": "Impostazione nuova password fallita. Riprovare.", + "successfullyAppliedConfig": "File di configurazione applicato con successo", + "configErrorOccurred": "Si è verificato un errore", + "confirmDeleteFolder": "Vuoi eliminare questa cartella?", + "deleteFolderWarning": "Tutte le installazioni di questa cartella verranno eliminate.", + "failedToLoadReport": "Impossibile caricare il rapporto. Assicurarsi che il file Excel sia in tmp_report/", + "serverError": "Si è verificato un errore, riprovare più tardi", + "pvViewNotAvailable": "La vista PV non è disponibile al momento", + "batteryServiceNotAvailable": "Il servizio batteria non è disponibile al momento", + "cannotChangeDateCalibration": "Non è possibile cambiare la data mentre l'installazione è in modalità di carica di calibrazione", + "mustSpecifyFutureDate": "Specificare una data futura", + "valueBetween0And100": "Il valore deve essere tra 0-100%", + "pleaseProvideValidNumber": "Inserire un numero valido", + "stopTimeMustBeLater": "L'ora di fine deve essere successiva all'ora di inizio", + "signIn": "Accedi", + "username": "Nome utente", + "password": "Password", + "rememberMe": "Ricordami", + "login": "Accedi", + "close": "Chiudi", + "forgotPasswordLink": "Password dimenticata?", + "provideYourUsername": "Inserisci il tuo nome utente", + "userName": "Nome utente", + "resetPassword": "Reimposta password", + "setNewPassword": "Imposta nuova password", + "verifyPassword": "Verifica password", + "delete": "Elimina", + "successfullyCreatedUser": "Utente creato con successo", + "serverInternalError": "Il server ha riscontrato un errore interno e non è stato in grado di completare la richiesta", + "refreshView": "Aggiorna vista", + "goBack": "Indietro", + "connectingToDevice": "Connessione al dispositivo in corso...", + "fetchingData": "Recupero dati in corso...", + "confirmDeleteUser": "Vuoi eliminare questo utente?", + "accessManagement": "Gestione accessi", + "power": "Potenza", + "voltage": "Tensione", + "current": "Corrente", + "battery": "Batteria", + "firmware": "Firmware", + "batteryVoltage": "Tensione batteria", + "soc": "Stato di carica", + "soh": "Stato di salute", + "temperature": "Temperatura", + "warnings": "Avvisi", + "alarms": "Allarmi", + "minCellVoltage": "Tensione min. cella", + "maxCellVoltage": "Tensione max. cella", + "voltageDifference": "Differenza di tensione", + "pv": "PV", + "showOnly": "Mostra solo", + "minimumSocPercent": "SoC minimo (%)", + "powerW": "Potenza (W)", + "enterPowerValue": "Inserire un valore di potenza positivo o negativo", + "startDateTime": "Data e ora di inizio (Inizio < Fine)", + "stopDateTime": "Data e ora di fine (Inizio < Fine)" }