translated hard-code English words to match selected language system, e.g., german, french and italian
This commit is contained in:
parent
66803a2b34
commit
2e52b9ee15
|
|
@ -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() {
|
|||
<LockOutlinedIcon />
|
||||
</Avatar>
|
||||
<Typography component="h1" variant="h5">
|
||||
Provide your username
|
||||
<FormattedMessage id="provideYourUsername" defaultMessage="Provide your username" />
|
||||
</Typography>
|
||||
<Box
|
||||
component="form"
|
||||
|
|
@ -118,7 +120,7 @@ function ForgotPassword() {
|
|||
}}
|
||||
>
|
||||
<TextField
|
||||
label="User Name"
|
||||
label={intl.formatMessage({ id: 'userName', defaultMessage: 'User Name' })}
|
||||
variant="outlined"
|
||||
type="username"
|
||||
value={username}
|
||||
|
|
@ -150,7 +152,7 @@ function ForgotPassword() {
|
|||
color="primary"
|
||||
onClick={handleSubmit}
|
||||
>
|
||||
Submit
|
||||
<FormattedMessage id="submit" defaultMessage="Submit" />
|
||||
</Button>
|
||||
|
||||
<Modal
|
||||
|
|
@ -176,7 +178,7 @@ function ForgotPassword() {
|
|||
}}
|
||||
>
|
||||
<Typography variant="body1" gutterBottom>
|
||||
Username is wrong. Please try again.
|
||||
<FormattedMessage id="usernameWrong" defaultMessage="Username is wrong. Please try again." />
|
||||
</Typography>
|
||||
<Button
|
||||
sx={{
|
||||
|
|
@ -188,7 +190,7 @@ function ForgotPassword() {
|
|||
}}
|
||||
onClick={() => setErrorModalOpen(false)}
|
||||
>
|
||||
Close
|
||||
<FormattedMessage id="close" defaultMessage="Close" />
|
||||
</Button>
|
||||
</Box>
|
||||
</Modal>
|
||||
|
|
@ -216,7 +218,7 @@ function ForgotPassword() {
|
|||
}}
|
||||
>
|
||||
<Typography variant="body1" gutterBottom>
|
||||
Mail sent successfully.
|
||||
<FormattedMessage id="mailSentSuccessfully" defaultMessage="Mail sent successfully." />
|
||||
</Typography>
|
||||
<Button
|
||||
sx={{
|
||||
|
|
@ -228,7 +230,7 @@ function ForgotPassword() {
|
|||
}}
|
||||
onClick={handleReturn}
|
||||
>
|
||||
Close
|
||||
<FormattedMessage id="close" defaultMessage="Close" />
|
||||
</Button>
|
||||
</Box>
|
||||
</Modal>
|
||||
|
|
|
|||
|
|
@ -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() {
|
|||
<LockOutlinedIcon />
|
||||
</Avatar>
|
||||
<Typography component="h1" variant="h5">
|
||||
Reset Password
|
||||
<FormattedMessage id="resetPassword" defaultMessage="Reset Password" />
|
||||
</Typography>
|
||||
<Box
|
||||
component="form"
|
||||
|
|
@ -115,7 +117,7 @@ function ResetPassword() {
|
|||
}}
|
||||
>
|
||||
<TextField
|
||||
label="Password"
|
||||
label={intl.formatMessage({ id: 'password', defaultMessage: 'Password' })}
|
||||
variant="outlined"
|
||||
type="password"
|
||||
value={password}
|
||||
|
|
@ -126,7 +128,7 @@ function ResetPassword() {
|
|||
sx={{ width: 350 }}
|
||||
/>
|
||||
<TextField
|
||||
label="Verify Password"
|
||||
label={intl.formatMessage({ id: 'verifyPassword', defaultMessage: 'Verify Password' })}
|
||||
type="password"
|
||||
variant="outlined"
|
||||
value={verifypassword}
|
||||
|
|
@ -147,7 +149,7 @@ function ResetPassword() {
|
|||
variant="h5"
|
||||
sx={{ color: '#FF0000', marginTop: 1 }}
|
||||
>
|
||||
Passwords do not match
|
||||
<FormattedMessage id="passwordsDoNotMatch" defaultMessage="Passwords do not match" />
|
||||
</Typography>
|
||||
)}
|
||||
|
||||
|
|
@ -164,7 +166,7 @@ function ResetPassword() {
|
|||
color="primary"
|
||||
onClick={handleSubmit}
|
||||
>
|
||||
Submit
|
||||
<FormattedMessage id="submit" defaultMessage="Submit" />
|
||||
</Button>
|
||||
|
||||
<Modal
|
||||
|
|
@ -190,7 +192,7 @@ function ResetPassword() {
|
|||
}}
|
||||
>
|
||||
<Typography variant="body1" gutterBottom>
|
||||
Reset Password failed. Please try again.
|
||||
<FormattedMessage id="resetPasswordFailed" defaultMessage="Reset Password failed. Please try again." />
|
||||
</Typography>
|
||||
<Button
|
||||
sx={{
|
||||
|
|
@ -202,7 +204,7 @@ function ResetPassword() {
|
|||
}}
|
||||
onClick={() => setOpen(false)}
|
||||
>
|
||||
Close
|
||||
<FormattedMessage id="close" defaultMessage="Close" />
|
||||
</Button>
|
||||
</Box>
|
||||
</Modal>
|
||||
|
|
|
|||
|
|
@ -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() {
|
|||
<LockOutlinedIcon />
|
||||
</Avatar>
|
||||
<Typography component="h1" variant="h5">
|
||||
Set New Password
|
||||
<FormattedMessage id="setNewPassword" defaultMessage="Set New Password" />
|
||||
</Typography>
|
||||
<Box
|
||||
component="form"
|
||||
|
|
@ -116,7 +118,7 @@ function SetNewPassword() {
|
|||
}}
|
||||
>
|
||||
<TextField
|
||||
label="Password"
|
||||
label={intl.formatMessage({ id: 'password', defaultMessage: 'Password' })}
|
||||
variant="outlined"
|
||||
type="password"
|
||||
value={password}
|
||||
|
|
@ -127,7 +129,7 @@ function SetNewPassword() {
|
|||
sx={{ width: 350 }}
|
||||
/>
|
||||
<TextField
|
||||
label="Verify Password"
|
||||
label={intl.formatMessage({ id: 'verifyPassword', defaultMessage: 'Verify Password' })}
|
||||
type="password"
|
||||
variant="outlined"
|
||||
value={verifypassword}
|
||||
|
|
@ -148,7 +150,7 @@ function SetNewPassword() {
|
|||
variant="h5"
|
||||
sx={{ color: '#FF0000', marginTop: 1 }}
|
||||
>
|
||||
Passwords do not match
|
||||
<FormattedMessage id="passwordsDoNotMatch" defaultMessage="Passwords do not match" />
|
||||
</Typography>
|
||||
)}
|
||||
|
||||
|
|
@ -165,7 +167,7 @@ function SetNewPassword() {
|
|||
color="primary"
|
||||
onClick={handleSubmit}
|
||||
>
|
||||
Submit
|
||||
<FormattedMessage id="submit" defaultMessage="Submit" />
|
||||
</Button>
|
||||
|
||||
<Modal
|
||||
|
|
@ -191,7 +193,7 @@ function SetNewPassword() {
|
|||
}}
|
||||
>
|
||||
<Typography variant="body1" gutterBottom>
|
||||
Setting new password failed. Please try again.
|
||||
<FormattedMessage id="setNewPasswordFailed" defaultMessage="Setting new password failed. Please try again." />
|
||||
</Typography>
|
||||
<Button
|
||||
sx={{
|
||||
|
|
@ -203,7 +205,7 @@ function SetNewPassword() {
|
|||
}}
|
||||
onClick={() => setOpen(false)}
|
||||
>
|
||||
Close
|
||||
<FormattedMessage id="close" defaultMessage="Close" />
|
||||
</Button>
|
||||
</Box>
|
||||
</Modal>
|
||||
|
|
|
|||
|
|
@ -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() {
|
|||
<LockOutlinedIcon />
|
||||
</Avatar>
|
||||
<Typography component="h1" variant="h5">
|
||||
Sign in
|
||||
<FormattedMessage id="signIn" defaultMessage="Sign in" />
|
||||
</Typography>
|
||||
<Box
|
||||
component="form"
|
||||
|
|
@ -160,7 +162,7 @@ function Login() {
|
|||
}}
|
||||
>
|
||||
<TextField
|
||||
label="Username"
|
||||
label={intl.formatMessage({ id: 'username', defaultMessage: 'Username' })}
|
||||
value={username}
|
||||
onChange={handleUsernameChange}
|
||||
fullWidth
|
||||
|
|
@ -176,7 +178,7 @@ function Login() {
|
|||
/>
|
||||
|
||||
<TextField
|
||||
label="Password"
|
||||
label={intl.formatMessage({ id: 'password', defaultMessage: 'Password' })}
|
||||
variant="outlined"
|
||||
type="password"
|
||||
value={password}
|
||||
|
|
@ -203,7 +205,7 @@ function Login() {
|
|||
style={{ marginLeft: -175 }}
|
||||
/>
|
||||
}
|
||||
label="Remember me"
|
||||
label={<FormattedMessage id="rememberMe" defaultMessage="Remember me" />}
|
||||
/>
|
||||
|
||||
<Button
|
||||
|
|
@ -218,7 +220,7 @@ function Login() {
|
|||
color="primary"
|
||||
onClick={handleSubmit}
|
||||
>
|
||||
Login
|
||||
<FormattedMessage id="login" defaultMessage="Login" />
|
||||
</Button>
|
||||
|
||||
{loading && (
|
||||
|
|
@ -253,7 +255,7 @@ function Login() {
|
|||
}}
|
||||
>
|
||||
<Typography variant="body1" gutterBottom>
|
||||
Login failed. Please try again.
|
||||
<FormattedMessage id="loginFailed" defaultMessage="Login failed. Please try again." />
|
||||
</Typography>
|
||||
<Button
|
||||
sx={{
|
||||
|
|
@ -265,7 +267,7 @@ function Login() {
|
|||
}}
|
||||
onClick={() => setOpen(false)}
|
||||
>
|
||||
Close
|
||||
<FormattedMessage id="close" defaultMessage="Close" />
|
||||
</Button>
|
||||
</Box>
|
||||
</Modal>
|
||||
|
|
@ -281,7 +283,7 @@ function Login() {
|
|||
onForgotPassword();
|
||||
}}
|
||||
>
|
||||
Forgot password?
|
||||
<FormattedMessage id="forgotPasswordLink" defaultMessage="Forgot password?" />
|
||||
</Link>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
|
|
|||
|
|
@ -87,10 +87,10 @@ function BatteryView(props: BatteryViewProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Unable to communicate with the installation
|
||||
<FormattedMessage id="unableToCommunicate" defaultMessage="Unable to communicate with the installation" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
@ -111,10 +111,10 @@ function BatteryView(props: BatteryViewProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Battery service is not available at the moment
|
||||
<FormattedMessage id="batteryServiceNotAvailable" defaultMessage="Battery service is not available at the moment" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
@ -229,24 +229,24 @@ function BatteryView(props: BatteryViewProps) {
|
|||
<Table sx={{ minWidth: 650 }} aria-label="simple table">
|
||||
<TableHead>
|
||||
<TableRow>
|
||||
<TableCell align="center">Battery</TableCell>
|
||||
<TableCell align="center">Firmware</TableCell>
|
||||
<TableCell align="center">Power</TableCell>
|
||||
<TableCell align="center">Battery Voltage</TableCell>
|
||||
<TableCell align="center">SoC</TableCell>
|
||||
<TableCell align="center">Temperature</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="battery" defaultMessage="Battery" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="firmware" defaultMessage="Firmware" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="power" defaultMessage="Power" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="batteryVoltage" defaultMessage="Battery Voltage" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="soc" defaultMessage="SoC" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="temperature" defaultMessage="Temperature" /></TableCell>
|
||||
{product === 0 ? (
|
||||
<TableCell align="center">Warnings</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="warnings" defaultMessage="Warnings" /></TableCell>
|
||||
) : (
|
||||
<TableCell align="center">Min Cell Voltage</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="minCellVoltage" defaultMessage="Min Cell Voltage" /></TableCell>
|
||||
)}
|
||||
{product === 0 ? (
|
||||
<TableCell align="center">Alarms</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="alarms" defaultMessage="Alarms" /></TableCell>
|
||||
) : (
|
||||
<TableCell align="center">Max Cell Voltage</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="maxCellVoltage" defaultMessage="Max Cell Voltage" /></TableCell>
|
||||
)}
|
||||
{(product === 3 || product === 4) && (
|
||||
<TableCell align="center">Voltage Difference</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="voltageDifference" defaultMessage="Voltage Difference" /></TableCell>
|
||||
)}
|
||||
</TableRow>
|
||||
</TableHead>
|
||||
|
|
|
|||
|
|
@ -85,10 +85,10 @@ function BatteryViewSalidomo(props: BatteryViewProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Unable to communicate with the installation
|
||||
<FormattedMessage id="unableToCommunicate" defaultMessage="Unable to communicate with the installation" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
@ -109,10 +109,10 @@ function BatteryViewSalidomo(props: BatteryViewProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Battery service is not available at the moment
|
||||
<FormattedMessage id="batteryServiceNotAvailable" defaultMessage="Battery service is not available at the moment" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
@ -209,14 +209,14 @@ function BatteryViewSalidomo(props: BatteryViewProps) {
|
|||
<Table sx={{ minWidth: 650 }} aria-label="simple table">
|
||||
<TableHead>
|
||||
<TableRow>
|
||||
<TableCell align="center">Battery</TableCell>
|
||||
<TableCell align="center">Firmware</TableCell>
|
||||
<TableCell align="center">Power</TableCell>
|
||||
<TableCell align="center">Voltage</TableCell>
|
||||
<TableCell align="center">SoC</TableCell>
|
||||
<TableCell align="center">Temperature</TableCell>
|
||||
<TableCell align="center">Warnings</TableCell>
|
||||
<TableCell align="center">Alarms</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="battery" defaultMessage="Battery" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="firmware" defaultMessage="Firmware" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="power" defaultMessage="Power" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="voltage" defaultMessage="Voltage" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="soc" defaultMessage="SoC" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="temperature" defaultMessage="Temperature" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="warnings" defaultMessage="Warnings" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="alarms" defaultMessage="Alarms" /></TableCell>
|
||||
</TableRow>
|
||||
</TableHead>
|
||||
<TableBody>
|
||||
|
|
|
|||
|
|
@ -87,10 +87,10 @@ function BatteryViewSodioHome(props: BatteryViewSodioHomeProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Unable to communicate with the installation
|
||||
<FormattedMessage id="unableToCommunicate" defaultMessage="Unable to communicate with the installation" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
@ -111,10 +111,10 @@ function BatteryViewSodioHome(props: BatteryViewSodioHomeProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Battery service is not available at the moment
|
||||
<FormattedMessage id="batteryServiceNotAvailable" defaultMessage="Battery service is not available at the moment" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
@ -195,12 +195,12 @@ function BatteryViewSodioHome(props: BatteryViewSodioHomeProps) {
|
|||
<Table sx={{ minWidth: 650 }} aria-label="simple table">
|
||||
<TableHead>
|
||||
<TableRow>
|
||||
<TableCell align="center">Battery</TableCell>
|
||||
<TableCell align="center">Power</TableCell>
|
||||
<TableCell align="center">Battery Voltage</TableCell>
|
||||
<TableCell align="center">Current</TableCell>
|
||||
<TableCell align="center">SoC</TableCell>
|
||||
<TableCell align="center">SoH</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="battery" defaultMessage="Battery" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="power" defaultMessage="Power" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="batteryVoltage" defaultMessage="Battery Voltage" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="current" defaultMessage="Current" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="soc" defaultMessage="SoC" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="soh" defaultMessage="SoH" /></TableCell>
|
||||
{/*<TableCell align="center">Daily Charge Energy</TableCell>*/}
|
||||
{/*<TableCell align="center">Daily Discharge Energy</TableCell>*/}
|
||||
</TableRow>
|
||||
|
|
|
|||
|
|
@ -295,7 +295,7 @@ function MainStats(props: MainStatsProps) {
|
|||
>
|
||||
<CircularProgress size={60} style={{ color: '#ffc04d' }} />
|
||||
<Typography variant="body2" style={{ color: 'black' }} mt={2}>
|
||||
Fetching data...
|
||||
<FormattedMessage id="fetchingData" defaultMessage="Fetching data..." />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ function MainStatsSalidomo(props: MainStatsProps) {
|
|||
>
|
||||
<CircularProgress size={60} style={{ color: '#ffc04d' }} />
|
||||
<Typography variant="body2" style={{ color: 'black' }} mt={2}>
|
||||
Fetching data...
|
||||
<FormattedMessage id="fetchingData" defaultMessage="Fetching data..." />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -302,7 +302,7 @@ function MainStatsSodioHome(props: MainStatsSodioHomeProps) {
|
|||
>
|
||||
<CircularProgress size={60} style={{ color: '#ffc04d' }} />
|
||||
<Typography variant="body2" style={{ color: 'black' }} mt={2}>
|
||||
Fetching data...
|
||||
<FormattedMessage id="fetchingData" defaultMessage="Fetching data..." />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -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 ? (
|
||||
<span style={{ color: 'red' }}>
|
||||
Value should be between 0-100%
|
||||
{intl.formatMessage({ id: 'valueBetween0And100' })}
|
||||
</span>
|
||||
) : (
|
||||
''
|
||||
|
|
@ -592,7 +593,7 @@ function Configuration(props: ConfigurationProps) {
|
|||
helperText={
|
||||
errors.gridSetPoint ? (
|
||||
<span style={{ color: 'red' }}>
|
||||
Please provide a valid number
|
||||
{intl.formatMessage({ id: 'pleaseProvideValidNumber' })}
|
||||
</span>
|
||||
) : (
|
||||
''
|
||||
|
|
@ -804,7 +805,7 @@ function Configuration(props: ConfigurationProps) {
|
|||
alignItems: 'center'
|
||||
}}
|
||||
>
|
||||
Successfully applied configuration file
|
||||
<FormattedMessage id="successfullyAppliedConfig" defaultMessage="Successfully applied configuration file" />
|
||||
<IconButton
|
||||
color="inherit"
|
||||
size="small"
|
||||
|
|
@ -824,7 +825,7 @@ function Configuration(props: ConfigurationProps) {
|
|||
alignItems: 'center'
|
||||
}}
|
||||
>
|
||||
An error has occurred
|
||||
<FormattedMessage id="configErrorOccurred" defaultMessage="An error has occurred" />
|
||||
<IconButton
|
||||
color="inherit"
|
||||
size="small"
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import {
|
|||
import { I_Installation } from 'src/interfaces/InstallationTypes';
|
||||
import CancelIcon from '@mui/icons-material/Cancel';
|
||||
import BuildIcon from '@mui/icons-material/Build';
|
||||
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 { ProductIdContext } from '../../../contexts/ProductIdContextProvider';
|
||||
|
|
@ -33,6 +33,7 @@ interface FlatInstallationViewProps {
|
|||
}
|
||||
|
||||
const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
||||
const intl = useIntl();
|
||||
const [isRowHovered, setHoveredRow] = useState(-1);
|
||||
const navigate = useNavigate();
|
||||
const [selectedInstallation, setSelectedInstallation] = useState<number>(-1);
|
||||
|
|
@ -202,7 +203,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
|||
>
|
||||
<FormControl sx={{ flex: 1 }}>
|
||||
<TextField
|
||||
placeholder="Search"
|
||||
placeholder={intl.formatMessage({ id: 'search' })}
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
fullWidth
|
||||
|
|
@ -226,7 +227,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
|||
<Select
|
||||
value={sortByStatus}
|
||||
onChange={(e) => setSortByStatus(e.target.value)}
|
||||
label="Show Only"
|
||||
label={intl.formatMessage({ id: 'showOnly' })}
|
||||
>
|
||||
{[
|
||||
'All Installations',
|
||||
|
|
@ -252,7 +253,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
|||
<Select
|
||||
value={sortByAction}
|
||||
onChange={(e) => setSortByAction(e.target.value)}
|
||||
label="Show Only"
|
||||
label={intl.formatMessage({ id: 'showOnly' })}
|
||||
>
|
||||
{[
|
||||
'All Installations',
|
||||
|
|
|
|||
|
|
@ -394,7 +394,7 @@ function Installation(props: singleInstallationProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Connecting to the device...
|
||||
<FormattedMessage id="connectingToDevice" defaultMessage="Connecting to the device..." />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -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) {
|
|||
>
|
||||
<CircularProgress size={60} style={{ color: '#ffc04d' }} />
|
||||
<Typography variant="body2" style={{ color: 'black' }} mt={2}>
|
||||
Fetching data...
|
||||
<FormattedMessage id="fetchingData" defaultMessage="Fetching data..." />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -405,7 +405,7 @@ const computeLast7Days = (): string[] => {
|
|||
// >
|
||||
// <CircularProgress size={60} style={{ color: '#ffc04d' }} />
|
||||
// <Typography variant="body2" style={{ color: 'black' }} mt={2}>
|
||||
// Fetching data...
|
||||
// <FormattedMessage id="fetchingData" defaultMessage="Fetching data..." />
|
||||
// </Typography>
|
||||
// </Container>
|
||||
// )}
|
||||
|
|
@ -945,7 +945,7 @@ function SalidomoOverview(props: salidomoOverviewProps) {
|
|||
>
|
||||
<CircularProgress size={60} style={{ color: '#ffc04d' }} />
|
||||
<Typography variant="body2" style={{ color: 'black' }} mt={2}>
|
||||
Fetching data...
|
||||
<FormattedMessage id="fetchingData" defaultMessage="Fetching data..." />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
<FormattedMessage id="unableToCommunicate" defaultMessage="Unable to communicate with the installation" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
@ -105,10 +106,10 @@ function PvView(props: PvViewProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Pv view is not available at the moment
|
||||
<FormattedMessage id="pvViewNotAvailable" defaultMessage="Pv view is not available at the moment" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
@ -130,10 +131,10 @@ function PvView(props: PvViewProps) {
|
|||
<Table sx={{ minWidth: 250 }} aria-label={`CU${deviceId} table`}>
|
||||
<TableHead>
|
||||
<TableRow>
|
||||
<TableCell align="center">Pv</TableCell>
|
||||
<TableCell align="center">Power</TableCell>
|
||||
<TableCell align="center">Voltage</TableCell>
|
||||
<TableCell align="center">Current</TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="pv" defaultMessage="Pv" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="power" defaultMessage="Power" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="voltage" defaultMessage="Voltage" /></TableCell>
|
||||
<TableCell align="center"><FormattedMessage id="current" defaultMessage="Current" /></TableCell>
|
||||
</TableRow>
|
||||
</TableHead>
|
||||
<TableBody>
|
||||
|
|
|
|||
|
|
@ -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<number>(-1);
|
||||
const currentLocation = useLocation();
|
||||
|
|
@ -182,7 +183,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
|||
>
|
||||
<FormControl sx={{ flex: 1 }}>
|
||||
<TextField
|
||||
placeholder="Search"
|
||||
placeholder={intl.formatMessage({ id: 'search' })}
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
fullWidth
|
||||
|
|
@ -206,7 +207,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
|||
<Select
|
||||
value={sortByStatus}
|
||||
onChange={(e) => setSortByStatus(e.target.value)}
|
||||
label="Show Only"
|
||||
label={intl.formatMessage({ id: 'showOnly' })}
|
||||
>
|
||||
{[
|
||||
'All Installations',
|
||||
|
|
@ -232,7 +233,7 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
|||
<Select
|
||||
value={sortByAction}
|
||||
onChange={(e) => setSortByAction(e.target.value)}
|
||||
label="Show Only"
|
||||
label={intl.formatMessage({ id: 'showOnly' })}
|
||||
>
|
||||
{[
|
||||
'All Installations',
|
||||
|
|
|
|||
|
|
@ -315,7 +315,7 @@ function SalidomoInstallation(props: singleInstallationProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Connecting to the device...
|
||||
<FormattedMessage id="connectingToDevice" defaultMessage="Connecting to the device..." />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -449,7 +449,7 @@ function SodioHomeInstallation(props: singleInstallationProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Connecting to the device...
|
||||
<FormattedMessage id="connectingToDevice" defaultMessage="Connecting to the device..." />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -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) {
|
|||
>
|
||||
<FormControl variant="outlined">
|
||||
<TextField
|
||||
placeholder="Search"
|
||||
placeholder={intl.formatMessage({ id: 'search' })}
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
fullWidth
|
||||
|
|
|
|||
|
|
@ -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*/}
|
||||
{/*/>*/}
|
||||
<TextField
|
||||
label="Minimum SoC (%)"
|
||||
label={intl.formatMessage({ id: 'minimumSocPercent' })}
|
||||
name="minimumSoC"
|
||||
value={formValues.minimumSoC}
|
||||
onChange={handleChange}
|
||||
|
|
@ -540,13 +541,13 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
|
|||
{/* Power input*/}
|
||||
<div style={{ marginBottom: '5px' }}>
|
||||
<TextField
|
||||
label="Power (W)"
|
||||
label={intl.formatMessage({ id: 'powerW' })}
|
||||
name="timeChargeandDischargePower"
|
||||
value={formValues.timeChargeandDischargePower}
|
||||
onChange={(e) =>
|
||||
handleTimeChargeDischargeChange(e.target.name, e.target.value)
|
||||
}
|
||||
helperText="Enter a positive or negative power value"
|
||||
helperText={intl.formatMessage({ id: 'enterPowerValue' })}
|
||||
fullWidth
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -556,7 +557,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
|
|||
<LocalizationProvider dateAdapter={AdapterDayjs}>
|
||||
<DateTimePicker
|
||||
ampm={false}
|
||||
label="Start Date and Time (Start Time < Stop Time)"
|
||||
label={intl.formatMessage({ id: 'startDateTime' })}
|
||||
value={
|
||||
formValues.startTimeChargeandDischargeDayandTime
|
||||
? dayjs(formValues.startTimeChargeandDischargeDayandTime)
|
||||
|
|
@ -588,7 +589,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
|
|||
<LocalizationProvider dateAdapter={AdapterDayjs}>
|
||||
<DateTimePicker
|
||||
ampm={false}
|
||||
label="Stop Date and Time (Start Time < Stop Time)"
|
||||
label={intl.formatMessage({ id: 'stopDateTime' })}
|
||||
value={
|
||||
formValues.stopTimeChargeandDischargeDayandTime
|
||||
? dayjs(formValues.stopTimeChargeandDischargeDayandTime)
|
||||
|
|
@ -654,7 +655,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
|
|||
alignItems: 'center'
|
||||
}}
|
||||
>
|
||||
Successfully applied configuration file
|
||||
<FormattedMessage id="successfullyAppliedConfig" defaultMessage="Successfully applied configuration file" />
|
||||
<IconButton
|
||||
color="inherit"
|
||||
size="small"
|
||||
|
|
@ -674,7 +675,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
|
|||
alignItems: 'center'
|
||||
}}
|
||||
>
|
||||
An error has occurred
|
||||
<FormattedMessage id="configErrorOccurred" defaultMessage="An error has occurred" />
|
||||
<IconButton
|
||||
color="inherit"
|
||||
size="small"
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ function WeeklySection({ installationId, latestMonthlyPeriodEnd }: { installatio
|
|||
const msg =
|
||||
err.response?.data ||
|
||||
err.message ||
|
||||
'Failed to load report. Make sure the Excel file is placed in tmp_report/';
|
||||
intl.formatMessage({ id: 'failedToLoadReport' });
|
||||
setError(typeof msg === 'string' ? msg : JSON.stringify(msg));
|
||||
} finally {
|
||||
setLoading(false);
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import {
|
|||
JSONRecordData
|
||||
} from '../Log/graph.util';
|
||||
import { ProductIdContext } from '../../../contexts/ProductIdContextProvider';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
interface TopologyProps {
|
||||
values: JSONRecordData;
|
||||
|
|
@ -64,10 +65,10 @@ function Topology(props: TopologyProps) {
|
|||
style={{ color: 'black', fontWeight: 'bold' }}
|
||||
mt={2}
|
||||
>
|
||||
Unable to communicate with the installation
|
||||
<FormattedMessage id="unableToCommunicate" defaultMessage="Unable to communicate with the installation" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
<FormattedMessage id="unableToCommunicate" defaultMessage="Unable to communicate with the installation" />
|
||||
</Typography>
|
||||
<Typography variant="body2" style={{ color: 'black' }}>
|
||||
Please wait or refresh the page
|
||||
<FormattedMessage id="pleaseWaitOrRefresh" defaultMessage="Please wait or refresh the page" />
|
||||
</Typography>
|
||||
</Container>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -177,14 +177,14 @@ function TreeInformation(props: TreeInformationProps) {
|
|||
gutterBottom
|
||||
sx={{ fontWeight: 'bold' }}
|
||||
>
|
||||
Do you want to delete this folder?
|
||||
<FormattedMessage id="confirmDeleteFolder" defaultMessage="Do you want to delete this folder?" />
|
||||
</Typography>
|
||||
<Typography
|
||||
variant="body1"
|
||||
gutterBottom
|
||||
sx={{ fontSize: '0.875rem' }}
|
||||
>
|
||||
All installations of this folder will be deleted.
|
||||
<FormattedMessage id="deleteFolderWarning" defaultMessage="All installations of this folder will be deleted." />
|
||||
</Typography>
|
||||
|
||||
<div
|
||||
|
|
@ -204,7 +204,7 @@ function TreeInformation(props: TreeInformationProps) {
|
|||
}}
|
||||
onClick={deleteFolderModalHandle}
|
||||
>
|
||||
Delete
|
||||
<FormattedMessage id="delete" defaultMessage="Delete" />
|
||||
</Button>
|
||||
<Button
|
||||
sx={{
|
||||
|
|
@ -217,7 +217,7 @@ function TreeInformation(props: TreeInformationProps) {
|
|||
}}
|
||||
onClick={deleteFolderModalHandleCancel}
|
||||
>
|
||||
Cancel
|
||||
<FormattedMessage id="cancel" defaultMessage="Cancel" />
|
||||
</Button>
|
||||
</div>
|
||||
</Box>
|
||||
|
|
|
|||
|
|
@ -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) => {
|
|||
<TableHead>
|
||||
<TableRow>
|
||||
<TableCell padding="checkbox"></TableCell>
|
||||
<TableCell>Username</TableCell>
|
||||
<TableCell>Email</TableCell>
|
||||
<TableCell><FormattedMessage id="username" defaultMessage="Username" /></TableCell>
|
||||
<TableCell><FormattedMessage id="email" defaultMessage="Email" /></TableCell>
|
||||
</TableRow>
|
||||
</TableHead>
|
||||
<TableBody>
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
<FormattedMessage id="confirmDeleteUser" defaultMessage="Do you want to delete this user?" />
|
||||
</Typography>
|
||||
|
||||
<div
|
||||
|
|
@ -210,7 +211,7 @@ function User(props: singleUserProps) {
|
|||
}}
|
||||
onClick={deleteUserModalHandle}
|
||||
>
|
||||
Delete
|
||||
<FormattedMessage id="delete" defaultMessage="Delete" />
|
||||
</Button>
|
||||
<Button
|
||||
sx={{
|
||||
|
|
@ -223,7 +224,7 @@ function User(props: singleUserProps) {
|
|||
}}
|
||||
onClick={deleteUserModalHandleCancel}
|
||||
>
|
||||
Cancel
|
||||
<FormattedMessage id="cancel" defaultMessage="Cancel" />
|
||||
</Button>
|
||||
</div>
|
||||
</Box>
|
||||
|
|
@ -274,7 +275,7 @@ function User(props: singleUserProps) {
|
|||
>
|
||||
<div>
|
||||
<TextField
|
||||
label="Name"
|
||||
label={intl.formatMessage({ id: 'name' })}
|
||||
name="name"
|
||||
value={formValues.name}
|
||||
onChange={handleChange}
|
||||
|
|
@ -283,7 +284,7 @@ function User(props: singleUserProps) {
|
|||
</div>
|
||||
<div>
|
||||
<TextField
|
||||
label="Email"
|
||||
label={intl.formatMessage({ id: 'email' })}
|
||||
name="email"
|
||||
value={formValues.email}
|
||||
onChange={handleChange}
|
||||
|
|
@ -293,7 +294,7 @@ function User(props: singleUserProps) {
|
|||
</div>
|
||||
<div>
|
||||
<TextField
|
||||
label="Information"
|
||||
label={intl.formatMessage({ id: 'information' })}
|
||||
name="information"
|
||||
value={formValues.information}
|
||||
onChange={handleChange}
|
||||
|
|
|
|||
|
|
@ -13,11 +13,12 @@ import { AccessContext } from '../../../contexts/AccessContextProvider';
|
|||
import Button from '@mui/material/Button';
|
||||
import UserForm from './userForm';
|
||||
import { UserContext } from '../../../contexts/userContext';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import { FormattedMessage, useIntl } from 'react-intl';
|
||||
import { Close as CloseIcon } from '@mui/icons-material';
|
||||
import { UserType } from '../../../interfaces/UserTypes';
|
||||
|
||||
function UsersSearch() {
|
||||
const intl = useIntl();
|
||||
const [searchTerm, setSearchTerm] = useState('');
|
||||
const { availableUsers, fetchAvailableUsers } = useContext(AccessContext);
|
||||
const [filteredData, setFilteredData] = useState(availableUsers);
|
||||
|
|
@ -147,7 +148,7 @@ function UsersSearch() {
|
|||
<Grid item xs={12} md={isMobile ? 5 : 3}>
|
||||
<FormControl variant="outlined" fullWidth>
|
||||
<TextField
|
||||
placeholder="Search"
|
||||
placeholder={intl.formatMessage({ id: 'search' })}
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
fullWidth
|
||||
|
|
|
|||
|
|
@ -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<Partial<InnovEnergyUser>>({
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
/>
|
||||
<Typography variant="h2" sx={{ my: 2 }}>
|
||||
There was an error, please try again later
|
||||
<FormattedMessage id="serverError" defaultMessage="There was an error, please try again later" />
|
||||
</Typography>
|
||||
<Typography
|
||||
variant="h4"
|
||||
|
|
@ -85,8 +86,7 @@ function Status500() {
|
|||
fontWeight="normal"
|
||||
sx={{ mb: 4 }}
|
||||
>
|
||||
The server encountered an internal error and was not able to
|
||||
complete your request
|
||||
<FormattedMessage id="serverInternalError" defaultMessage="The server encountered an internal error and was not able to complete your request" />
|
||||
</Typography>
|
||||
<LoadingButton
|
||||
onClick={handleClick}
|
||||
|
|
@ -95,10 +95,10 @@ function Status500() {
|
|||
color="primary"
|
||||
startIcon={<RefreshTwoToneIcon />}
|
||||
>
|
||||
Refresh view
|
||||
<FormattedMessage id="refreshView" defaultMessage="Refresh view" />
|
||||
</LoadingButton>
|
||||
<Button href="/overview" variant="contained" sx={{ ml: 1 }}>
|
||||
Go back
|
||||
<FormattedMessage id="goBack" defaultMessage="Go back" />
|
||||
</Button>
|
||||
</Box>
|
||||
</Container>
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
}
|
||||
|
|
@ -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)"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
}
|
||||
|
|
@ -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)"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue