From 9c0ac7f330fc9fec79838cd1c4ce09376c9e8969 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 9 Mar 2026 23:06:09 +0000 Subject: [PATCH] Auto-sync updates: docs: Add guide for adding new radiation portal monitor systems --- src/app/(dashboard)/page.tsx | 10 +- src/app/_components/AlarmAudio.tsx | 4 +- src/app/_components/LanguageSelector.tsx | 60 +++++-- src/app/_components/Navbar.tsx | 6 +- .../adjudication/AdjudicationDetail.tsx | 30 ++-- .../adjudication/AdjudicationLog.tsx | 26 +-- .../adjudication/AdjudicationSelect.tsx | 28 ++-- .../adjudication/IsotopeSelect.tsx | 5 +- .../SecondaryInspectionSelect.tsx | 6 +- .../_components/dashboard/LaneStatusItem.tsx | 12 +- src/app/_components/event-details/DataRow.tsx | 27 ++-- .../_components/event-details/MiscTable.tsx | 12 +- .../event-preview/ChartTimeHighlight.tsx | 2 + .../event-preview/EventPreview.tsx | 10 +- .../event-preview/LaneVideoPlayback.tsx | 6 +- .../_components/event-table/EventTable.tsx | 25 ++- src/app/_components/lane-view/LaneStatus.tsx | 7 +- src/app/_components/lane-view/StatusTable.tsx | 13 +- src/app/_components/maps/MapComponent.tsx | 7 +- .../national/NationalDatePicker.tsx | 6 +- .../national/NationalStatsTable.tsx | 20 +-- .../national/TimeRangeSelector.tsx | 52 +++--- .../reportgen/EventTypeSelector.tsx | 36 +++-- .../_components/reportgen/LaneSelector.tsx | 9 +- .../_components/reportgen/NodeSelector.tsx | 6 +- src/app/_components/reportgen/Report.tsx | 8 +- .../reportgen/ReportTypeSelector.tsx | 42 ++--- .../reportgen/TimeRangeSelector.tsx | 54 ++++--- src/app/_components/servers/NodeForm.tsx | 16 +- src/app/_components/servers/NodeList.tsx | 6 +- src/app/contexts/DataSourceContext.tsx | 26 +-- src/app/event-details/page.tsx | 4 +- src/app/lane-view/page.tsx | 44 +++--- src/app/map/page.tsx | 2 +- src/app/providers.tsx | 37 +++-- src/contexts/LanguageContext.tsx | 45 +++++- src/lib/data/oscar/Utilities.ts | 11 +- .../models/AdjudicationConstants.ts | 25 +-- src/locales/ar-JO.json | 144 +++++++++++++++++ src/locales/ar.json | 144 +++++++++++++++++ src/locales/bn.json | 144 +++++++++++++++++ src/locales/de.json | 144 +++++++++++++++++ src/locales/en.json | 120 +++++++++++++- src/locales/es.json | 134 +++++++++++++++- src/locales/et.json | 144 +++++++++++++++++ src/locales/fr.json | 148 ++++++++++++++++-- src/locales/hi.json | 144 +++++++++++++++++ src/locales/id.json | 144 +++++++++++++++++ src/locales/it.json | 144 +++++++++++++++++ src/locales/ja.json | 144 +++++++++++++++++ src/locales/ko.json | 144 +++++++++++++++++ src/locales/lv.json | 144 +++++++++++++++++ src/locales/pa-PK.json | 144 +++++++++++++++++ src/locales/pt.json | 144 +++++++++++++++++ src/locales/ru.json | 144 +++++++++++++++++ src/locales/th.json | 144 +++++++++++++++++ src/locales/tr.json | 144 +++++++++++++++++ src/locales/ur.json | 144 +++++++++++++++++ src/locales/vi.json | 144 +++++++++++++++++ src/locales/yue.json | 144 +++++++++++++++++ src/locales/zh-CN.json | 144 +++++++++++++++++ 61 files changed, 3707 insertions(+), 320 deletions(-) create mode 100644 src/locales/ar-JO.json create mode 100644 src/locales/ar.json create mode 100644 src/locales/bn.json create mode 100644 src/locales/de.json create mode 100644 src/locales/et.json create mode 100644 src/locales/hi.json create mode 100644 src/locales/id.json create mode 100644 src/locales/it.json create mode 100644 src/locales/ja.json create mode 100644 src/locales/ko.json create mode 100644 src/locales/lv.json create mode 100644 src/locales/pa-PK.json create mode 100644 src/locales/pt.json create mode 100644 src/locales/ru.json create mode 100644 src/locales/th.json create mode 100644 src/locales/tr.json create mode 100644 src/locales/ur.json create mode 100644 src/locales/vi.json create mode 100644 src/locales/yue.json create mode 100644 src/locales/zh-CN.json diff --git a/src/app/(dashboard)/page.tsx b/src/app/(dashboard)/page.tsx index d3a2b8ae..429bf68b 100644 --- a/src/app/(dashboard)/page.tsx +++ b/src/app/(dashboard)/page.tsx @@ -55,19 +55,19 @@ export default function DashboardPage() { let laneDSColl = laneDSMap.get(laneid); if(isGammaDataStream(ds)) - laneDSColl.addDS('gammaRT', rtDS); + laneDSColl?.addDS('gammaRT', rtDS); if(isNeutronDataStream(ds)) - laneDSColl.addDS('neutronRT', rtDS); + laneDSColl?.addDS('neutronRT', rtDS); if(isTamperDataStream(ds)) - laneDSColl.addDS('tamperRT', rtDS); + laneDSColl?.addDS('tamperRT', rtDS); if(isConnectionDataStream(ds)) - laneDSColl.addDS('connectionRT', rtDS); + laneDSColl?.addDS('connectionRT', rtDS); if(isThresholdDataStream(ds)) - laneDSColl.addDS('gammaTrshldRT', rtDS); + laneDSColl?.addDS('gammaTrshldRT', rtDS); }); newStatusList.push({ diff --git a/src/app/_components/AlarmAudio.tsx b/src/app/_components/AlarmAudio.tsx index e07138ca..67f437c5 100644 --- a/src/app/_components/AlarmAudio.tsx +++ b/src/app/_components/AlarmAudio.tsx @@ -5,6 +5,7 @@ import { useDispatch, useSelector } from "react-redux"; import Box from "@mui/material/Box"; import {Alert} from "@mui/material"; import { selectAlarmAudioVolume } from "@/lib/state/OSCARClientSlice"; +import { useLanguage } from '@/contexts/LanguageContext'; let alarmAudio: HTMLAudioElement | null = null; @@ -17,6 +18,7 @@ export function getAlarmAudio() { } export default function AlarmAudio() { + const { t } = useLanguage(); const dispatch = useDispatch(); const savedVolume = useSelector(selectAlarmAudioVolume); const triggerAlarm = useSelector((state: RootState) => selectTriggeredAlarm(state)); @@ -61,7 +63,7 @@ export default function AlarmAudio() { {soundLocked && ( - Click anywhere to enable alarm sound + {t('clickAnywhereToEnableAlarmSound')} )} diff --git a/src/app/_components/LanguageSelector.tsx b/src/app/_components/LanguageSelector.tsx index f98af022..e16110e7 100644 --- a/src/app/_components/LanguageSelector.tsx +++ b/src/app/_components/LanguageSelector.tsx @@ -1,15 +1,41 @@ "use client"; -import React, { useState } from 'react'; -import { Select, MenuItem, FormControl, InputLabel, SelectChangeEvent } from '@mui/material'; +import React from 'react'; +import { Select, MenuItem, FormControl, SelectChangeEvent } from '@mui/material'; import { useLanguage } from '@/contexts/LanguageContext'; import LanguageIcon from '@mui/icons-material/Language'; +const languages = [ + { code: 'en', name: 'English' }, + { code: 'es', name: 'Español' }, + { code: 'fr', name: 'Français' }, + { code: 'ar', name: 'العربية' }, + { code: 'ru', name: 'Русский' }, + { code: 'zh-CN', name: '简体中文' }, + { code: 'ja', name: '日本語' }, + { code: 'ko', name: '한국어' }, + { code: 'ar-JO', name: 'العربية (الأردن)' }, + { code: 'lv', name: 'Latviešu' }, + { code: 'et', name: 'Eesti' }, + { code: 'pt', name: 'Português' }, + { code: 'de', name: 'Deutsch' }, + { code: 'th', name: 'ไทย' }, + { code: 'hi', name: 'हिन्दी' }, + { code: 'bn', name: 'বাংলা' }, + { code: 'pa-PK', name: 'پنجابی' }, + { code: 'vi', name: 'Tiếng Việt' }, + { code: 'yue', name: '粵語' }, + { code: 'tr', name: 'Türkçe' }, + { code: 'id', name: 'Bahasa Indonesia' }, + { code: 'ur', name: 'اردو' }, + { code: 'it', name: 'Italiano' } +]; + export default function LanguageSelector() { const { language, setLanguage } = useLanguage(); const handleChange = (event: SelectChangeEvent) => { - setLanguage(event.target.value as 'en' | 'es' | 'fr'); + setLanguage(event.target.value as any); }; return ( @@ -19,18 +45,28 @@ export default function LanguageSelector() { value={language} onChange={handleChange} displayEmpty - inputProps={{ 'aria-label': 'Without label' }} - startAdornment={} + inputProps={{ 'aria-label': 'Language' }} + startAdornment={} renderValue={(selected) => { - if (selected === 'en') return 'English'; - if (selected === 'es') return 'Español'; - if (selected === 'fr') return 'Français'; - return selected; + const lang = languages.find(l => l.code === selected); + return lang ? lang.name : selected; + }} + sx={{ + color: 'inherit', + '& .MuiSelect-select': { + paddingTop: '4px', + paddingBottom: '4px', + }, + '&:before': { borderBottomColor: 'rgba(255, 255, 255, 0.7)' }, + '&:after': { borderBottomColor: 'white' }, + '& .MuiSvgIcon-root': { color: 'inherit' } }} > - English - Español - Français + {languages.map((lang) => ( + + {lang.name} + + ))} ); diff --git a/src/app/_components/Navbar.tsx b/src/app/_components/Navbar.tsx index 86e5eaec..5aa328fd 100644 --- a/src/app/_components/Navbar.tsx +++ b/src/app/_components/Navbar.tsx @@ -201,7 +201,7 @@ export default function Navbar({children}: { children: React.ReactNode }) { {savedVolume === 0 ? : } @@ -256,7 +256,7 @@ export default function Navbar({children}: { children: React.ReactNode }) { ([]); @@ -95,7 +97,7 @@ export default function AdjudicationDetail(props: { event: EventTableData }) { const occupancyObservation = await query.nextPage(); if (!occupancyObservation || occupancyObservation.length === 0) { - setAdjSnackMsg('Cannot find observation to adjudicate. Please try again.'); + setAdjSnackMsg(t('cannotFindObservation')); setColorStatus('error'); setOpenSnack(true); return; @@ -106,7 +108,7 @@ export default function AdjudicationDetail(props: { event: EventTableData }) { } catch (err) { console.error(err); - setAdjSnackMsg('Error loading observation.'); + setAdjSnackMsg(t('errorLoadingObservation')); setColorStatus('error'); setOpenSnack(true); } @@ -188,7 +190,7 @@ export default function AdjudicationDetail(props: { event: EventTableData }) { const sendAdjudicationData = async () => { if(adjData.adjudicationCode === null || !adjData.adjudicationCode || adjData.adjudicationCode === AdjudicationCodes.codes[0]){ - setAdjSnackMsg("Please selected a valid adjudication code before submitting."); + setAdjSnackMsg(t('selectValidCode')); setColorStatus('error'); setOpenSnack(true) return; @@ -234,7 +236,7 @@ export default function AdjudicationDetail(props: { event: EventTableData }) { const occupancyObservation = await query.nextPage(); if (!occupancyObservation) { - setAdjSnackMsg('Cannot find observation to adjudicate. Please try again.'); + setAdjSnackMsg(t('cannotFindObservation')); setColorStatus('error') setOpenSnack(true); return; @@ -264,7 +266,7 @@ export default function AdjudicationDetail(props: { event: EventTableData }) { ); if (!response.ok) { - setAdjSnackMsg('Adjudication failed to submit.') + setAdjSnackMsg(t('adjudicationFail')) setColorStatus('error') return; } @@ -274,11 +276,11 @@ export default function AdjudicationDetail(props: { event: EventTableData }) { dispatch(setSelectedEvent(props.event)); dispatch(setAdjudicatedEventId(props.event.id)); - setAdjSnackMsg('Adjudication successful for Occupancy ID: ' + props.event.occupancyCount); + setAdjSnackMsg(t('adjudicationSuccess') + props.event.occupancyCount); setColorStatus('success') }catch(error){ - setAdjSnackMsg('Adjudication failed to submit.') + setAdjSnackMsg(t('adjudicationFail')) setColorStatus('error') }finally{ setShouldFetchLogs(true); @@ -301,7 +303,7 @@ export default function AdjudicationDetail(props: { event: EventTableData }) { - Adjudication + {t('adjudicationTitle')} - Adjudication Report Form + {t('adjudicationReportForm')} - Upload Files + {t('uploadFiles')} - Submit + {t('submit')} ); -} \ No newline at end of file +} diff --git a/src/app/_components/adjudication/AdjudicationLog.tsx b/src/app/_components/adjudication/AdjudicationLog.tsx index 9baea707..18b0ee2f 100644 --- a/src/app/_components/adjudication/AdjudicationLog.tsx +++ b/src/app/_components/adjudication/AdjudicationLog.tsx @@ -12,6 +12,7 @@ import ControlStream from "osh-js/source/core/consysapi/controlstream/ControlStr import {AdjudicationCodes} from "@/lib/data/oscar/adjudication/models/AdjudicationConstants"; import ControlStreamFilter from "osh-js/source/core/consysapi/controlstream/ControlStreamFilter"; import { Dialog, DialogTitle, DialogContent } from "@mui/material"; +import { useLanguage } from '@/contexts/LanguageContext'; @@ -20,6 +21,7 @@ export default function AdjudicationLog(props: { shouldFetch: boolean; onFetch: () => void; }) { + const { t } = useLanguage(); const locale = navigator.language || 'en-US'; const laneMapRef = useContext(DataSourceContext).laneMapRef; @@ -35,19 +37,19 @@ export default function AdjudicationLog(props: { const logColumns: GridColDef[] = [ { field: 'occupancyCount', - headerName: 'Occupancy ID', + headerName: t('occupancyId'), width: 175, type: 'string', }, { field: 'username', - headerName: 'User', + headerName: t('user'), width: 150, type: 'string', }, { field: 'time', - headerName: 'Timestamp', + headerName: t('timestamp'), width: 200, type: 'string', valueFormatter: (params) => (new Date(params)).toLocaleString(locale, { @@ -61,7 +63,7 @@ export default function AdjudicationLog(props: { }, { field: 'feedback', - headerName: 'Feedback', + headerName: t('feedback'), width: 250, type: 'string', renderCell: (params) => { @@ -80,7 +82,7 @@ export default function AdjudicationLog(props: { style={{ color: "#1976d2", border: "none", background: "none", cursor: "pointer" }} onClick={() => setFeedbackDialog({ open: true, text: fullText })} > - Read more + {t('readMore')} )} @@ -89,12 +91,12 @@ export default function AdjudicationLog(props: { }, { field: 'secondaryInspectionStatus', - headerName: 'Secondary Inspection Status', + headerName: t('secondaryInspectionStatus'), width: 200 }, { field: 'adjudicationCode', - headerName: 'Adjudication Code', + headerName: t('adjudicationCode'), width: 400, valueGetter: (value, row) => { return row.adjudicationCode.label @@ -102,7 +104,7 @@ export default function AdjudicationLog(props: { }, { field: 'isotopes', - headerName: 'Isotopes', + headerName: t('isotopes'), width: 200, valueGetter: (value) => { if (value === "") return "Unknown"; @@ -111,13 +113,13 @@ export default function AdjudicationLog(props: { }, { field: 'filePaths', - headerName: 'FilePaths', + headerName: t('filePaths'), width: 200, type: 'string' }, { field: 'vehicleId', - headerName: 'Vehicle ID', + headerName: t('vehicleId'), width: 150, valueGetter: (value) => { if (value === "") return "Unknown"; @@ -198,7 +200,7 @@ export default function AdjudicationLog(props: { <> - Logged Adjudications + {t('loggedAdjudications')} - Feedback + {t('feedback')} {feedbackDialog.text} diff --git a/src/app/_components/adjudication/AdjudicationSelect.tsx b/src/app/_components/adjudication/AdjudicationSelect.tsx index db3e7e0d..d7e138e4 100644 --- a/src/app/_components/adjudication/AdjudicationSelect.tsx +++ b/src/app/_components/adjudication/AdjudicationSelect.tsx @@ -4,6 +4,8 @@ import {FormControl, InputLabel, ListSubheader, MenuItem, Select, SelectChangeEv import {useEffect, useState} from 'react'; import {AdjudicationCode, AdjudicationCodes} from "@/lib/data/oscar/adjudication/models/AdjudicationConstants"; import {IAdjudicationData} from "@/lib/data/oscar/adjudication/Adjudication"; +import {useLanguage} from "@/contexts/LanguageContext"; + export const colorCodes = { real: {color: "error.dark"}, @@ -16,10 +18,12 @@ export default function AdjudicationSelect(props: { onSelect: (value: AdjudicationCode) => void, // Return selected value adjCode: AdjudicationCode }) { + const { t } = useLanguage(); // const [adjudicated, setAdjudicated] = useState(AdjudicationCodes.codes[0]); // Adjudication selected value const [style, setStyle] = useState(colorCodes.other.color); // Adjudicated button style based on selected value const handleChangeAdjCode = (event: SelectChangeEvent) => { + // Value in Select is English label (unique) let value: AdjudicationCode = AdjudicationCodes.getCodeObjByLabel(event.target.value); // setAdjudicated(value); // Set local adjudicated state props.onSelect(value); // Return selected value to parent component @@ -38,11 +42,11 @@ export default function AdjudicationSelect(props: { return ( - Adjudicate + {t('adjudicated')} diff --git a/src/app/_components/adjudication/IsotopeSelect.tsx b/src/app/_components/adjudication/IsotopeSelect.tsx index 7778f1c9..1fc43ad0 100644 --- a/src/app/_components/adjudication/IsotopeSelect.tsx +++ b/src/app/_components/adjudication/IsotopeSelect.tsx @@ -52,6 +52,7 @@ export default function IsotopeSelect(props: { onSelect: (value: string[]) => void, // Return selected value isotopeValue: string[] }) { + const { t } = useLanguage(); const [isotope, setIsotope] = useState([""]); const handleChange = (event: SelectChangeEvent) => { @@ -70,9 +71,9 @@ export default function IsotopeSelect(props: { return ( - Isotope + {t('isotope')} {props.name.length <= 15 ? props.name : (props.name.substr(0, 15)) } {props.isFault && - + } {props.isTamper && - + } {/*{!props.isTamper && !props.isFault && props.isOnline && (*/} {props.isOnline ? ( - + ) : ( - + )} @@ -62,4 +64,4 @@ export default function LaneStatusItem(props: { ); -} \ No newline at end of file +} diff --git a/src/app/_components/event-details/DataRow.tsx b/src/app/_components/event-details/DataRow.tsx index 44265265..3b8d75a3 100644 --- a/src/app/_components/event-details/DataRow.tsx +++ b/src/app/_components/event-details/DataRow.tsx @@ -3,6 +3,7 @@ import {Table, TableBody, TableCell, TableContainer, TableHead, TableRow} from "@mui/material"; import {styled, Theme} from "@mui/material/styles"; import {EventTableData} from "@/lib/data/oscar/TableHelpers"; +import { useLanguage } from '@/contexts/LanguageContext'; const StatusTableCell = styled(TableCell)(({theme, status}: { theme: Theme, status: string }) => ({ @@ -11,21 +12,23 @@ const StatusTableCell = styled(TableCell)(({theme, status}: { theme: Theme, stat })); export default function DataRow({eventData}: {eventData: EventTableData}) { + const { t } = useLanguage(); + return ( - +
- Secondary Inspection - Lane ID - Occupancy ID - Start Time - End Time - Max Gamma - Max Neutron - Status - Adjudicated + {t('secondaryInspection')} + {t('laneId')} + {t('occupancyId')} + {t('startTime')} + {t('endTime')} + {t('maxGamma')} + {t('maxNeutron')} + {t('status')} + {t('adjudicated')} @@ -42,11 +45,11 @@ export default function DataRow({eventData}: {eventData: EventTableData}) { {eventData?.status || 'Unknown'} - {eventData?.adjudicatedIds.length > 0 ? "Yes" : "No"} + {eventData?.adjudicatedIds.length > 0 ? t('yes') : t('no')} ) : ( - No event data available + {t('noEventDataAvailable')} )} diff --git a/src/app/_components/event-details/MiscTable.tsx b/src/app/_components/event-details/MiscTable.tsx index 0892c244..100974fe 100644 --- a/src/app/_components/event-details/MiscTable.tsx +++ b/src/app/_components/event-details/MiscTable.tsx @@ -9,9 +9,11 @@ import ObservationFilter from "osh-js/source/core/consysapi/observation/Observat import {selectEventData, selectSpeed, setSpeed} from "@/lib/state/EventDetailsSlice"; import {useAppDispatch} from "@/lib/state/Hooks"; import {isSpeedDataStream} from "@/lib/data/oscar/Utilities"; +import { useLanguage } from '@/contexts/LanguageContext'; export default function MiscTable({currentTime}: {currentTime: string}) { + const { t } = useLanguage(); const dispatch = useAppDispatch(); const savedSpeed = useSelector(selectSpeed) @@ -52,18 +54,18 @@ export default function MiscTable({currentTime}: {currentTime: string}) { return ( -
+
- Max Gamma Count Rate (cps) + {t('maxGammaCountRate')} {eventData?.maxGamma} - Neutron Background Count Rate + {t('neutronBackgroundCountRate')} {eventData?.neutronBackground} - Max Neutron Count Rate (cps) + {t('maxNeutronCountRate')} {eventData?.maxNeutron} - Speed (kph) + {t('speedKph')} {speedVal} diff --git a/src/app/_components/event-preview/ChartTimeHighlight.tsx b/src/app/_components/event-preview/ChartTimeHighlight.tsx index 06175658..ddeeb967 100644 --- a/src/app/_components/event-preview/ChartTimeHighlight.tsx +++ b/src/app/_components/event-preview/ChartTimeHighlight.tsx @@ -17,6 +17,7 @@ import { createNSigmaCalcViewCurve, createThresholdViewCurve, createThreshSigmaViewCurve } from "@/app/utils/ChartUtils"; +import {useLanguage} from "@/contexts/LanguageContext"; type CurveLayers = { @@ -44,6 +45,7 @@ export class ChartInterceptProps { } export default function ChartTimeHighlight(props: ChartInterceptProps) { + const { t } = useLanguage(); const gammaChartViewRef = useRef(null); const nSigmaChartViewRef = useRef(null); diff --git a/src/app/_components/event-preview/EventPreview.tsx b/src/app/_components/event-preview/EventPreview.tsx index 4241aae4..800a68f7 100644 --- a/src/app/_components/event-preview/EventPreview.tsx +++ b/src/app/_components/event-preview/EventPreview.tsx @@ -47,8 +47,10 @@ import ObservationFilter from "osh-js/source/core/consysapi/observation/Observat import ControlStream from "osh-js/source/core/consysapi/controlstream/ControlStream"; import {isAdjudicationControlStream} from "@/lib/data/oscar/Utilities"; import { EventTableData } from "@/lib/data/oscar/TableHelpers"; +import { useLanguage } from '@/contexts/LanguageContext'; export function EventPreview() { + const { t } = useLanguage(); const dispatch = useAppDispatch(); const router = useRouter(); const eventPreview = useSelector(selectEventPreview); @@ -325,11 +327,11 @@ export function EventPreview() { - Occupancy ID: {eventPreview.eventData.occupancyCount} + {t('occupancyId')}: {eventPreview.eventData.occupancyCount} @@ -377,7 +379,7 @@ export function EventPreview() { diff --git a/src/app/_components/event-preview/LaneVideoPlayback.tsx b/src/app/_components/event-preview/LaneVideoPlayback.tsx index 584dcd85..7080cc24 100644 --- a/src/app/_components/event-preview/LaneVideoPlayback.tsx +++ b/src/app/_components/event-preview/LaneVideoPlayback.tsx @@ -9,6 +9,7 @@ import NavigateBeforeIcon from "@mui/icons-material/NavigateBefore"; import NavigateNextIcon from "@mui/icons-material/NavigateNext"; import '../../../Styles.css'; import CircularProgress from "@mui/material/CircularProgress"; +import { useLanguage } from '@/contexts/LanguageContext'; export class LaneVideoPlaybackProps { @@ -24,6 +25,7 @@ export class LaneVideoPlaybackProps { } export default function LaneVideoPlayback({selectedNode, videos, modeType, startTime, endTime, isPlaying, syncTime, onVideoTimeUpdate, onSelectedVideoIdxChange}: LaneVideoPlaybackProps) { + const { t } = useLanguage(); const [videoHeight, setVideoHeight] = useState("320px"); const videoRefs = useRef([]); const [videoDuration, setVideoDuration] = useState(0); @@ -175,7 +177,7 @@ export default function LaneVideoPlayback({selectedNode, videos, modeType, start playsInline > - Your browser does not support the video tag. + {t('yourBrowserDoesNotSupportVideoTag')} ); })} @@ -192,7 +194,7 @@ export default function LaneVideoPlayback({selectedNode, videos, modeType, start ) : ( - No Video Available + {t('noVideoAvailable')} )} diff --git a/src/app/_components/event-table/EventTable.tsx b/src/app/_components/event-table/EventTable.tsx index 63d72bab..868cc195 100644 --- a/src/app/_components/event-table/EventTable.tsx +++ b/src/app/_components/event-table/EventTable.tsx @@ -155,7 +155,21 @@ export default function EventTable({ minWidth: 125, flex: 1.2, type: 'singleSelect', - valueOptions: ['None', 'Gamma', 'Neutron', 'Gamma & Neutron'], + valueOptions: [ + { value: 'None', label: t('statusNone') }, + { value: 'Gamma', label: t('statusGamma') }, + { value: 'Neutron', label: t('statusNeutron') }, + { value: 'Gamma & Neutron', label: t('statusGammaNeutron') } + ], + valueFormatter: (params) => { + switch(params) { + case 'Gamma': return t('statusGamma'); + case 'Neutron': return t('statusNeutron'); + case 'Gamma & Neutron': return t('statusGammaNeutron'); + case 'None': return t('statusNone'); + default: return params; + } + }, filterOperators: getGridSingleSelectOperators().filter( (op) => ['is'].includes(op.value) // (op) => ['is', 'not'].includes(op.value) @@ -164,12 +178,15 @@ export default function EventTable({ { field: 'adjudicatedIds', headerName: t('adjudicated'), - valueFormatter: (params: any) => params.length > 0 ? "Yes" : "No", + valueFormatter: (params: any) => params.length > 0 ? t('yes') : t('no'), minWidth: 100, flex: 1, filterable: viewAdjudicated, type: 'singleSelect', - valueOptions: ['Yes', 'No'], + valueOptions: [ + { value: 'Yes', label: t('yes') }, + { value: 'No', label: t('no') } + ], filterOperators: getGridSingleSelectOperators().filter( (op) => ['is', 'equal'].includes(op.value) ) @@ -185,7 +202,7 @@ export default function EventTable({ } - label="Details" + label={t('details')} onClick={() => handleEventPreview()} showInMenu /> diff --git a/src/app/_components/lane-view/LaneStatus.tsx b/src/app/_components/lane-view/LaneStatus.tsx index 170296e3..b12e16c3 100644 --- a/src/app/_components/lane-view/LaneStatus.tsx +++ b/src/app/_components/lane-view/LaneStatus.tsx @@ -77,7 +77,12 @@ export default function LaneStatus(props: LaneStatusProps) { const gammaDataStream = await dsAPI.getDataStreamById(gammaDataStreamId); const latestObservationQuery = await gammaDataStream.searchObservations(new ObservationFilter({resultTime: 'latest'}), 1); const latestObservationArray = await latestObservationQuery.nextPage(); - const latestObservation = latestObservationArray[0]; + const latestObservation = latestObservationArray?.[0]; + + if (!latestObservation || !latestObservation.result) { + console.warn("No latest observation found for lane status initialization"); + return; + } const initialLaneStatus: LaneStatusType = { id: -1, diff --git a/src/app/_components/lane-view/StatusTable.tsx b/src/app/_components/lane-view/StatusTable.tsx index 46633abf..09c5c450 100644 --- a/src/app/_components/lane-view/StatusTable.tsx +++ b/src/app/_components/lane-view/StatusTable.tsx @@ -23,6 +23,7 @@ import DataStream from "osh-js/source/core/sweapi/datastream/DataStream"; import {ALARM_DEF, TAMPER_STATUS_DEF} from "@/lib/data/Constants"; import {EventType} from "osh-js/source/core/event/EventType"; import {convertToMap} from "@/app/utils/Utils"; +import {useLanguage} from "@/contexts/LanguageContext"; interface StatusTableProps { currentLane: string, @@ -30,6 +31,7 @@ interface StatusTableProps { } export default function StatusTable({currentLane, entry}: StatusTableProps){ + const { t } = useLanguage(); const locale = navigator.language || 'en-US'; const nodes = useSelector(selectNodes); @@ -47,14 +49,14 @@ export default function StatusTable({currentLane, entry}: StatusTableProps){ const columns: GridColDef[] = [ { field: 'laneId', - headerName: 'Lane ID', + headerName: t('laneId'), type: 'string', minWidth: 100, flex: 1, }, { field: 'timestamp', - headerName: 'Timestamp', + headerName: t('timestamp'), valueFormatter: (params) => (new Date(params)).toLocaleString(locale, { year: 'numeric', month: 'numeric', @@ -68,7 +70,7 @@ export default function StatusTable({currentLane, entry}: StatusTableProps){ }, { field: 'status', - headerName: 'Status', + headerName: t('status'), type: 'string', minWidth: 150, flex: 1, @@ -76,6 +78,7 @@ export default function StatusTable({currentLane, entry}: StatusTableProps){ ]; async function fetchTotalCount(node: INode, datastreamIds: string[]) { + if (!node) return 0; let endpoint = node.getConnectedSystemsEndpoint(false); const queryParams = new URLSearchParams({ // resultTime: `../${pageLoadedTime}`, I think it is safe to fetch count of all here @@ -119,7 +122,7 @@ export default function StatusTable({currentLane, entry}: StatusTableProps){ newEvent = new AlarmTableData(randomUUID(), currentLane, state, obs.samplingTime); } } else if (obs?.tamperStatus) { - newEvent = new AlarmTableData(randomUUID(), currentLane, "Tamper", obs.samplingtime); + newEvent = new AlarmTableData(randomUUID(), currentLane, "Tamper", obs.samplingTime); } } else { const result = obs?.properties?.result; @@ -137,7 +140,7 @@ export default function StatusTable({currentLane, entry}: StatusTableProps){ const getDatastreamIds = useCallback((node: INode) => { const datastreamIds: string[] = []; - if (!entry) return datastreamIds; + if (!entry || !node) return datastreamIds; if (entry.parentNode.id !== node.id) return datastreamIds; diff --git a/src/app/_components/maps/MapComponent.tsx b/src/app/_components/maps/MapComponent.tsx index 84b63da9..31028d60 100644 --- a/src/app/_components/maps/MapComponent.tsx +++ b/src/app/_components/maps/MapComponent.tsx @@ -25,9 +25,10 @@ import {INode} from "@/lib/data/osh/Node"; import ObservationFilter from "osh-js/source/core/consysapi/observation/ObservationFilter"; import { convertToMap } from "@/app/utils/Utils"; import DataStreamFilter from "osh-js/source/core/consysapi/datastream/DataStreamFilter.js"; - +import { useLanguage } from '@/contexts/LanguageContext'; export default function MapComponent() { + const { t } = useLanguage(); const mapcontainer: string = "mapcontainer"; const laneMap = useSelector((state: RootState) => selectLaneMap(state)); const leafletViewRef = useRef(null); @@ -320,8 +321,8 @@ export default function MapComponent() { return ( `` ); } diff --git a/src/app/_components/national/NationalDatePicker.tsx b/src/app/_components/national/NationalDatePicker.tsx index aa59f799..67905b95 100644 --- a/src/app/_components/national/NationalDatePicker.tsx +++ b/src/app/_components/national/NationalDatePicker.tsx @@ -3,12 +3,14 @@ import {DateTimePicker, LocalizationProvider} from "@mui/x-date-pickers"; import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; import React, {useEffect, useState} from "react"; import dayjs, {Dayjs} from "dayjs"; +import { useLanguage } from '@/contexts/LanguageContext'; export default function NationalDatePicker({onCustomStartChange, onCustomEndChange }: { onCustomStartChange?: (value: string) => void, onCustomEndChange?: (value: string) => void, }){ + const { t } = useLanguage(); const [startTime, setStartTime] = useState(dayjs().subtract(1, 'year')); const [endTime, setEndTime] = useState(dayjs().add(1, 'hour')); @@ -38,12 +40,12 @@ export default function NationalDatePicker({onCustomStartChange, onCustomEndChan diff --git a/src/app/_components/national/NationalStatsTable.tsx b/src/app/_components/national/NationalStatsTable.tsx index fd8ff55e..62b1c1b7 100644 --- a/src/app/_components/national/NationalStatsTable.tsx +++ b/src/app/_components/national/NationalStatsTable.tsx @@ -5,9 +5,11 @@ import { NationalTableDataCollection} from "@/lib/data/oscar/TableHelpers"; import {DataGrid, GridColDef} from "@mui/x-data-grid"; import {Box} from "@mui/material"; import CustomToolbar from "@/app/_components/CustomToolbar"; +import { useLanguage } from '@/contexts/LanguageContext'; export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCounts: INationalTableData[]}){ + const { t } = useLanguage(); const natlTableRef = useRef(new NationalTableDataCollection()); useEffect(() => { @@ -21,14 +23,14 @@ export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCou const columns: GridColDef[] = [ { field: 'site', - headerName: 'Node ID', + headerName: t('nodeId'), type: 'string', minWidth: 150, flex: 1, }, { field: 'numGammaAlarms', - headerName: 'G Alarm', + headerName: t('alarm.gamma'), valueFormatter: (value) => { return typeof value === 'number' ? value : 0; }, @@ -37,7 +39,7 @@ export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCou }, { field: 'numNeutronAlarms', - headerName: 'N Alarm', + headerName: t('alarm.neutron'), valueFormatter: (value) => { return typeof value === 'number' ? value : 0; }, @@ -46,7 +48,7 @@ export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCou }, { field: 'numGammaNeutronAlarms', - headerName: 'G-N Alarm', + headerName: t('alarm.gammaNeutron'), valueFormatter: (value) => { return typeof value === 'number' ? value : 0; }, @@ -55,7 +57,7 @@ export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCou }, { field: 'numOccupancies', - headerName: 'Occupancies', + headerName: t('occupancies'), valueFormatter: (value) => { return typeof value === 'number' ? value : 0; }, @@ -64,7 +66,7 @@ export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCou }, { field: 'numTampers', - headerName: 'Tamper', + headerName: t('tamper'), valueFormatter: (value) => { return typeof value === 'number' ? value : 0; }, @@ -73,7 +75,7 @@ export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCou }, { field: 'numGammaFaults', - headerName: 'G Faults', + headerName: t('faults.gamma'), valueFormatter: (value) => { return typeof value === 'number' ? value : 0; }, @@ -82,7 +84,7 @@ export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCou }, { field: 'numNeutronFaults', - headerName: 'N Faults', + headerName: t('faults.neutron'), valueFormatter: (value) => { return typeof value === 'number' ? value : 0; }, @@ -91,7 +93,7 @@ export default function StatTable(selectedTimeRangeCounts: {selectedTimeRangeCou }, { field: 'numFaults', - headerName: 'Faults', + headerName: t('faults'), valueFormatter: (value) => { return typeof value === 'number' ? value : 0; }, diff --git a/src/app/_components/national/TimeRangeSelector.tsx b/src/app/_components/national/TimeRangeSelector.tsx index e5bda7e7..d9e0ca8d 100644 --- a/src/app/_components/national/TimeRangeSelector.tsx +++ b/src/app/_components/national/TimeRangeSelector.tsx @@ -2,34 +2,36 @@ import {FormControl, InputLabel, MenuItem, Select, SelectChangeEvent} from '@mui/material'; import {useState} from 'react'; - -const timeRanges = [ - { - label: "All Time", - value: "allTime", - }, - { - label: "Monthly", - value: "monthly", - }, - { - label: "Weekly", - value: 'weekly' - }, - { - label: "Daily", - value: "daily" - }, - { - label: "Custom Range", - value: "custom" - } -] +import { useLanguage } from '@/contexts/LanguageContext'; export default function TimeRangeSelect(props: { onSelect: (value: string[] | string) => void, timeRange: string }) { + const { t } = useLanguage(); + + const timeRanges = [ + { + label: t('allTime'), + value: "allTime", + }, + { + label: t('monthly'), + value: "monthly", + }, + { + label: t('weekly'), + value: 'weekly' + }, + { + label: t('daily'), + value: "daily" + }, + { + label: t('customRange'), + value: "custom" + } + ] const handleChange = (event: SelectChangeEvent) => { const val = event.target.value; @@ -38,11 +40,11 @@ export default function TimeRangeSelect(props: { return ( - Time Range + {t('timeRange')} selectLaneMap(state)); @@ -52,11 +53,11 @@ export default function LaneSelect(props: { return ( - Lane Selector + {t('laneSelector')} (""); @@ -208,7 +210,7 @@ export default function ReportGeneratorView(){ - Generate A Report + {t('generateReport')} @@ -243,7 +245,7 @@ export default function ReportGeneratorView(){ onClick={handleGenerateReport} disabled={isGenerating || !selectedReportType || !selectedTimeRange || !selectedNode} > - {isGenerating ? 'Generating Report...' : 'Generate Report'} + {isGenerating ? t('generatingReport') : t('generateReportBtn')} @@ -252,7 +254,7 @@ export default function ReportGeneratorView(){ - Generated Report + {t('generatedReport')} {generatedURL ? ( diff --git a/src/app/_components/reportgen/ReportTypeSelector.tsx b/src/app/_components/reportgen/ReportTypeSelector.tsx index 7c3c9905..812ab392 100644 --- a/src/app/_components/reportgen/ReportTypeSelector.tsx +++ b/src/app/_components/reportgen/ReportTypeSelector.tsx @@ -2,31 +2,33 @@ import {FormControl, InputLabel, MenuItem, Select, SelectChangeEvent} from '@mui/material'; import {useState} from "react"; +import { useLanguage } from '@/contexts/LanguageContext'; -export const reportTypes = [ - { - label: "RDS Site Report", - value: "RDS_SITE", - }, - { - label: "Lane Report", - value: "LANE", - }, - { - label: "Adjudication Report", - value: "ADJUDICATION", - }, - { - label: "Event Report", - value: "EVENT", - } -] export default function ReportTypeSelect(props: { onSelect: (value: string[] | string) => void, report: string }) { + const { t } = useLanguage(); + const reportTypes = [ + { + label: t('rdsSiteReport'), + value: "RDS_SITE", + }, + { + label: t('laneReport'), + value: "LANE", + }, + { + label: t('adjudicationReport'), + value: "ADJUDICATION", + }, + { + label: t('eventReport'), + value: "EVENT", + } + ] const handleChange = (event: SelectChangeEvent) => { const val = event.target.value; @@ -35,11 +37,11 @@ export default function ReportTypeSelect(props: { return ( - Report Type + {t('reportType')} {isEditNode ? Editing Node: {editNode.id} : null} - - - + + + - - + - } label="Is Secure"/> + } label={t('isSecure')}/> + onClick={() => modeChangeCallback(false, null)}>{t('cancel')} diff --git a/src/app/_components/servers/NodeList.tsx b/src/app/_components/servers/NodeList.tsx index 396f0f3a..978dd096 100644 --- a/src/app/_components/servers/NodeList.tsx +++ b/src/app/_components/servers/NodeList.tsx @@ -72,7 +72,7 @@ export default function NodeList({modeChangeCallback}: NodeListProps) { { t('nodes') } {nodes.length === 0 ? ( -

No Nodes

+

{t('noNodes')}

) : ( {nodes.map((node: INode) => ( @@ -86,10 +86,10 @@ export default function NodeList({modeChangeCallback}: NodeListProps) { sx={{m: 1}} onClick={() => setEditNode(node)} > - Edit + {t('edit')} + onClick={() => deleteNode(node.id)}>{t('delete')} ))} diff --git a/src/app/contexts/DataSourceContext.tsx b/src/app/contexts/DataSourceContext.tsx index 4dec8521..368e0cef 100644 --- a/src/app/contexts/DataSourceContext.tsx +++ b/src/app/contexts/DataSourceContext.tsx @@ -53,22 +53,26 @@ export default function DataSourceProvider({children}: { children: ReactNode }) let allLanes: Map = new Map(); await Promise.all(nodes.map(async (node: INode) => { - let nodeLaneMap = await node.fetchLaneSystemsAndSubsystems(); - if(!nodeLaneMap) return; + try { + let nodeLaneMap = await node.fetchLaneSystemsAndSubsystems(); + if(!nodeLaneMap) return; - await node.fetchDataStreams(nodeLaneMap); - await node.fetchLaneControlStreams(nodeLaneMap); + await node.fetchDataStreams(nodeLaneMap); + await node.fetchLaneControlStreams(nodeLaneMap); - for (const [key, mapEntry] of nodeLaneMap.entries()) { - try { - mapEntry.addDefaultConSysApis(); - } catch (e) { - console.error(`[ERROR] addDefaultConSysApis failed for ${key}:`, e); + for (const [key, mapEntry] of nodeLaneMap.entries()) { + try { + mapEntry.addDefaultConSysApis(); + } catch (e) { + console.error(`[ERROR] addDefaultConSysApis failed for ${key}:`, e); + } } - } - nodeLaneMap.forEach((value: LaneMapEntry, key: string) =>allLanes.set(key,value)); + nodeLaneMap.forEach((value: LaneMapEntry, key: string) =>allLanes.set(key,value)); + } catch (e) { + console.error(`[ERROR] Failed to fetch data for node ${node.name}:`, e); + } })); dispatch(setLaneMap(allLanes)); diff --git a/src/app/event-details/page.tsx b/src/app/event-details/page.tsx index 7675fe87..6c3fa1f9 100644 --- a/src/app/event-details/page.tsx +++ b/src/app/event-details/page.tsx @@ -115,7 +115,7 @@ export default function EventDetailsPage() { reactToPrintFn() }} > - Export as PDF + {t('exportPdf')}
@@ -150,4 +150,4 @@ export default function EventDetailsPage() {
); -} \ No newline at end of file +} diff --git a/src/app/lane-view/page.tsx b/src/app/lane-view/page.tsx index 7e04b1a0..ea90e8ac 100644 --- a/src/app/lane-view/page.tsx +++ b/src/app/lane-view/page.tsx @@ -45,8 +45,8 @@ export default function LaneViewPage() { const toggleButtons = [ - Occupancy Table, - Fault Table + {t('occupancyTable')}, + {t('faultTable')} ]; const handleToggle = (event: React.MouseEvent, newView: string) =>{ @@ -72,25 +72,27 @@ export default function LaneViewPage() { const rtDS = lane.datasourcesRealtime[i]; - if (isGammaDataStream(ds)) { - rtDS.properties.mqttOpts.shared = true - laneDsCollection.addDS('gammaRT', rtDS); - setGammaDS(rtDS) - } - if (isNeutronDataStream(ds)) { - rtDS.properties.mqttOpts.shared = true - laneDsCollection.addDS('neutronRT', rtDS); - setNeutronDS(rtDS); - } - if (isTamperDataStream(ds)) { - rtDS.properties.mqttOpts.shared = true - laneDsCollection.addDS('tamperRT', rtDS); - setTamperDS(rtDS) - } - if (isThresholdDataStream(ds)) { - rtDS.properties.mqttOpts.shared = true - laneDsCollection?.addDS('gammaTrshldRT', rtDS); - setThresholdDS(rtDS); + if (rtDS) { + if (isGammaDataStream(ds)) { + rtDS.properties.mqttOpts.shared = true + laneDsCollection.addDS('gammaRT', rtDS); + setGammaDS(rtDS) + } + if (isNeutronDataStream(ds)) { + rtDS.properties.mqttOpts.shared = true + laneDsCollection.addDS('neutronRT', rtDS); + setNeutronDS(rtDS); + } + if (isTamperDataStream(ds)) { + rtDS.properties.mqttOpts.shared = true + laneDsCollection.addDS('tamperRT', rtDS); + setTamperDS(rtDS) + } + if (isThresholdDataStream(ds)) { + rtDS.properties.mqttOpts.shared = true + laneDsCollection?.addDS('gammaTrshldRT', rtDS); + setThresholdDS(rtDS); + } } } diff --git a/src/app/map/page.tsx b/src/app/map/page.tsx index a7425856..316ebbfc 100644 --- a/src/app/map/page.tsx +++ b/src/app/map/page.tsx @@ -12,7 +12,7 @@ export default function MapViewPage() { const Map = useMemo(() => dynamic( () => import('@/app/_components/maps/MapComponent'), { - loading: () =>

loading

, + loading: () =>

{t('loading')}

, ssr: false } ),[]) diff --git a/src/app/providers.tsx b/src/app/providers.tsx index 952dc6c2..545293a6 100644 --- a/src/app/providers.tsx +++ b/src/app/providers.tsx @@ -6,29 +6,40 @@ import CssBaseline from '@mui/material/CssBaseline'; import { getTheme } from "@/app/style/theme"; import "@/app/style/global.css" import SuspenseLoad from "./_components/SuspenseLoad"; -import {LanguageProvider} from "@/contexts/LanguageContext"; - -export default function Providers({ children }: { children: ReactNode }) { +import {LanguageProvider, useLanguage} from "@/contexts/LanguageContext"; +function ThemeWrapper({ children }: { children: ReactNode }) { // Get system preference for dark/light mode const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)"); + const { direction } = useLanguage(); - // Implement custom theme based on system preference + // Implement custom theme based on system preference and language direction const theme = useMemo( - () => createTheme(getTheme(prefersDarkMode ? "dark" : "light")), - [prefersDarkMode], + () => createTheme({ + ...getTheme(prefersDarkMode ? "dark" : "light"), + direction: direction + }), + [prefersDarkMode, direction], + ); + + return ( + + + + {children} + + ); +} +export default function Providers({ children }: { children: ReactNode }) { return ( }> - - - - {children} - - + + {children} + ); -} \ No newline at end of file +} diff --git a/src/contexts/LanguageContext.tsx b/src/contexts/LanguageContext.tsx index 3879cd39..891c4981 100644 --- a/src/contexts/LanguageContext.tsx +++ b/src/contexts/LanguageContext.tsx @@ -4,18 +4,40 @@ import React, { createContext, useContext, useState, useEffect, ReactNode } from import en from '../locales/en.json'; import es from '../locales/es.json'; import fr from '../locales/fr.json'; +import ar from '../locales/ar.json'; +import ru from '../locales/ru.json'; +import zhCN from '../locales/zh-CN.json'; +import ja from '../locales/ja.json'; +import ko from '../locales/ko.json'; +import arJO from '../locales/ar-JO.json'; +import lv from '../locales/lv.json'; +import et from '../locales/et.json'; +import pt from '../locales/pt.json'; +import de from '../locales/de.json'; +import th from '../locales/th.json'; +import hi from '../locales/hi.json'; +import bn from '../locales/bn.json'; +import paPK from '../locales/pa-PK.json'; +import vi from '../locales/vi.json'; +import yue from '../locales/yue.json'; +import tr from '../locales/tr.json'; +import id from '../locales/id.json'; +import ur from '../locales/ur.json'; +import it from '../locales/it.json'; -type Locale = 'en' | 'es' | 'fr'; +type Locale = 'en' | 'es' | 'fr' | 'ar' | 'ru' | 'zh-CN' | 'ja' | 'ko' | 'ar-JO' | 'lv' | 'et' | 'pt' | 'de' | 'th' | 'hi' | 'bn' | 'pa-PK' | 'vi' | 'yue' | 'tr' | 'id' | 'ur' | 'it'; +type Direction = 'ltr' | 'rtl'; type Translations = Record; const translations: Record = { - en, - es, - fr, + en, es, fr, ar, ru, 'zh-CN': zhCN, ja, ko, 'ar-JO': arJO, lv, et, pt, de, th, hi, bn, 'pa-PK': paPK, vi, yue, tr, id, ur, it }; +const rtlLocales: Locale[] = ['ar', 'ar-JO', 'pa-PK', 'ur']; + interface LanguageContextProps { language: Locale; + direction: Direction; setLanguage: (lang: Locale) => void; t: (key: string) => string; } @@ -24,23 +46,34 @@ const LanguageContext = createContext(undefine export const LanguageProvider = ({ children }: { children: ReactNode }) => { const [language, setLanguageState] = useState('en'); + const [direction, setDirection] = useState('ltr'); const [isLoaded, setIsLoaded] = useState(false); useEffect(() => { const savedLanguage = localStorage.getItem('language') as Locale; if (savedLanguage && translations[savedLanguage]) { setLanguageState(savedLanguage); + const dir = rtlLocales.includes(savedLanguage) ? 'rtl' : 'ltr'; + setDirection(dir); + document.documentElement.dir = dir; + document.documentElement.lang = savedLanguage; } setIsLoaded(true); }, []); const setLanguage = (lang: Locale) => { setLanguageState(lang); + const dir = rtlLocales.includes(lang) ? 'rtl' : 'ltr'; + setDirection(dir); localStorage.setItem('language', lang); + // Update document direction immediately for better UX + document.documentElement.dir = dir; + document.documentElement.lang = lang; }; const t = (key: string) => { - return translations[language][key] || key; + // Fallback to English if translation is missing + return translations[language][key] || translations['en'][key] || key; }; if (!isLoaded) { @@ -50,7 +83,7 @@ export const LanguageProvider = ({ children }: { children: ReactNode }) => { } return ( - + {children} ); diff --git a/src/lib/data/oscar/Utilities.ts b/src/lib/data/oscar/Utilities.ts index 667f8071..a556f750 100644 --- a/src/lib/data/oscar/Utilities.ts +++ b/src/lib/data/oscar/Utilities.ts @@ -141,18 +141,15 @@ export function isHLSVideoControlStream(controlStream: typeof ControlStream): bo export function hasDefinitionProperties(stream: typeof ConnectedSystemsApi){ - if (stream.properties.length == 0) + if (!stream || !stream.properties) return false; let definition = null; if (stream instanceof ControlStream) - definition = stream.properties.controlledProperties[0].definition; + definition = stream.properties.controlledProperties?.[0]?.definition; else if (stream instanceof DataStream) - definition = stream.properties.observedProperties[0].definition + definition = stream.properties.observedProperties?.[0]?.definition - if (definition == undefined) - return false; - - return true; + return definition !== undefined && definition !== null; } \ No newline at end of file diff --git a/src/lib/data/oscar/adjudication/models/AdjudicationConstants.ts b/src/lib/data/oscar/adjudication/models/AdjudicationConstants.ts index cf8c20fd..87c41b0a 100644 --- a/src/lib/data/oscar/adjudication/models/AdjudicationConstants.ts +++ b/src/lib/data/oscar/adjudication/models/AdjudicationConstants.ts @@ -6,23 +6,24 @@ export interface AdjudicationCode { code: number; label: string; + translationKey: string; group: string; } export class AdjudicationCodes { static codes: AdjudicationCode[] = [ - {code: 0, label: "", group: ""}, - {code: 1, label: "Code 1: Contraband Found", group: "Real Alarm"}, - {code: 2, label: "Code 2: Other", group: "Real Alarm"}, - {code: 3, label: "Code 3: Medical Isotope Found", group: "Innocent Alarm"}, - {code: 4, label: "Code 4: NORM Found", group: "Innocent Alarm"}, - {code: 5, label: "Code 5: Declared Shipment of Radioactive Material", group: "Innocent Alarm"}, - {code: 6, label: "Code 6: Physical Inspection Negative", group: "False Alarm"}, - {code: 7, label: "Code 7: RIID/ASP Indicates Background Only", group: "False Alarm"}, - {code: 8, label: "Code 8: Other", group: "False Alarm"}, - {code: 9, label: "Code 9: Authorized Test, Maintenance, or Training Activity", group: "Test/Maintenance"}, - {code: 10, label: "Code 10: Unauthorized Activity", group: "Tamper/Fault"}, - {code: 11, label: "Code 11: Other", group: "Other"} + {code: 0, label: "", translationKey: "", group: ""}, + {code: 1, label: "Code 1: Contraband Found", translationKey: "code1", group: "Real Alarm"}, + {code: 2, label: "Code 2: Other", translationKey: "code2", group: "Real Alarm"}, + {code: 3, label: "Code 3: Medical Isotope Found", translationKey: "code3", group: "Innocent Alarm"}, + {code: 4, label: "Code 4: NORM Found", translationKey: "code4", group: "Innocent Alarm"}, + {code: 5, label: "Code 5: Declared Shipment of Radioactive Material", translationKey: "code5", group: "Innocent Alarm"}, + {code: 6, label: "Code 6: Physical Inspection Negative", translationKey: "code6", group: "False Alarm"}, + {code: 7, label: "Code 7: RIID/ASP Indicates Background Only", translationKey: "code7", group: "False Alarm"}, + {code: 8, label: "Code 8: Other", translationKey: "code8", group: "False Alarm"}, + {code: 9, label: "Code 9: Authorized Test, Maintenance, or Training Activity", translationKey: "code9", group: "Test/Maintenance"}, + {code: 10, label: "Code 10: Unauthorized Activity", translationKey: "code10", group: "Tamper/Fault"}, + {code: 11, label: "Code 11: Other", translationKey: "code11", group: "Other"} ] constructor() { diff --git a/src/locales/ar-JO.json b/src/locales/ar-JO.json new file mode 100644 index 00000000..4ef22bed --- /dev/null +++ b/src/locales/ar-JO.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "لوحة القيادة", + "events": "الأحداث", + "map": "الخريطة", + "national": "الوطنية", + "reportGenerator": "مولد التقارير", + "servers": "الخوادم", + "alarmVolume": "مستوى صوت الإنذار", + "laneStatus": "حالة المسار", + "laneId": "معرف المسار", + "occupancyId": "معرف الإشغال", + "startTime": "وقت البدء", + "endTime": "وقت الانتهاء", + "maxGamma": "عدد أشعة غاما في الثانية (cps)", + "maxNeutron": "عدد النيوترونات في الثانية (cps)", + "status": "الحالة", + "adjudicated": "تم التقييم", + "details": "التفاصيل", + "yes": "نعم", + "no": "لا", + "eventDetails": "تفاصيل الحدث", + "addServer": "إضافة خادم جديد", + "editNode": "تعديل العقدة", + "nodes": "العقد", + "exportPdf": "تصدير كـ PDF", + "adjudicationTitle": "التقييم", + "adjudicationReportForm": "نموذج تقرير التقييم", + "vehicleId": "معرف المركبة", + "notes": "ملاحظات", + "uploadFiles": "رفع ملفات", + "submit": "إرسال", + "adjudicationSuccess": "تم التقييم بنجاح لمعرف الإشغال: ", + "adjudicationFail": "فشل إرسال التقييم.", + "selectValidCode": "الرجاء اختيار رمز تقييم صالح قبل الإرسال.", + "errorLoadingObservation": "خطأ في تحميل المراقبة.", + "cannotFindObservation": "لا يمكن العثور على المراقبة للتقييم. حاول مرة أخرى.", + "statusOnline": "متصل", + "statusOffline": "غير متصل", + "statusTamper": "إنذار العبث", + "statusFault": "عطل", + "statusClear": "مسح", + "statusGamma": "غاما", + "statusNeutron": "نيوترون", + "statusGammaNeutron": "غاما ونيوترون", + "statusNone": "لا يوجد", + "code1": "الرمز 1: تم العثور على ممنوعات", + "code2": "الرمز 2: آخر", + "code3": "الرمز 3: تم العثور على نظير طبي", + "code4": "الرمز 4: تم العثور على مواد مشعة طبيعية (NORM)", + "code5": "الرمز 5: شحنة معلنة من المواد المشعة", + "code6": "الرمز 6: الفحص البدني سلبي", + "code7": "الرمز 7: يشير RIID/ASP إلى الخلفية فقط", + "code8": "الرمز 8: آخر", + "code9": "الرمز 9: نشاط اختبار أو صيانة أو تدريب مصرح به", + "code10": "الرمز 10: نشاط غير مصرح به", + "code11": "الرمز 11: آخر", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "إنذار حقيقي", + "innocentAlarm": "إنذار بريء", + "falseAlarm": "إنذار كاذب", + "other": "آخر", + "isotope": "النظائر", + "secondaryInspection": "التفتيش الثانوي", + "loggedAdjudications": "الأحكام المسجلة", + "feedback": "تعليق", + "noNodes": "لا العقد", + "delete": "يمسح", + "cancel": "يلغي", + "timeRange": "النطاق الزمني", + "viewLane": "عرض المسار", + "eventType": "نوع الحدث", + "nodeSelector": "محدد العقدة", + "laneSelector": "محدد المسار", + "reportType": "نوع التقرير", + "adjudicationCode": "رمز التحكيم", + "isotopes": "النظائر", + "filePaths": "مسارات الملفات", + "occupancyTable": "جدول الإشغال", + "faultTable": "جدول الأخطاء", + "noEventDataAvailable": "لا توجد بيانات الحدث المتاحة", + "neutronBackgroundCountRate": "معدل عدد الخلفية النيوترونية", + "maxGammaCountRate": "الحد الأقصى لمعدل عدد جاما (cps)", + "maxNeutronCountRate": "الحد الأقصى لمعدل عدد النيوترونات (cps)", + "speedKph": "السرعة (كم/ساعة)", + "expand": "يوسع", + "close": "يغلق", + "name": "اسم", + "address": "عنوان", + "port": "ميناء", + "csApiEndpoint": "نقطة النهاية لواجهة برمجة تطبيقات CS", + "username": "اسم المستخدم", + "password": "كلمة المرور", + "isSecure": "آمن", + "openDrawer": "درج مفتوح", + "openNotifications": "فتح الإخطارات", + "volume": "مقدار", + "startDate": "تاريخ البدء", + "endDate": "تاريخ الانتهاء", + "simpleTable": "طاولة بسيطة", + "user": "مستخدم", + "timestamp": "الطابع الزمني", + "secondaryInspectionStatus": "حالة التفتيش الثانوية", + "nodeId": "معرف العقدة", + "alarm.gamma": "إنذار جاما", + "alarm.neutron": "إنذار النيوترونات", + "alarm.gammaNeutron": "إنذار جاما نيوترون", + "occupancies": "الإشغالات", + "tamper": "العبث", + "faults.gamma": "أخطاء جاما", + "faults.neutron": "أخطاء النيوترونات", + "faults": "أخطاء", + "noVideoAvailable": "لا يوجد فيديو متاح", + "loading": "تحميل...", + "edit": "يحرر", + "back": "خلف", + "reset": "إعادة ضبط", + "generateReport": "إنشاء تقرير", + "generatedReport": "تقرير تم إنشاؤه", + "pleaseGenerateReport": "يرجى إنشاء تقرير لعرضه وتنزيله هنا.", + "readMore": "اقرأ المزيد", + "clickAnywhereToEnableAlarmSound": "انقر في أي مكان لتمكين صوت التنبيه", + "yourBrowserDoesNotSupportVideoTag": "متصفحك لا يدعم علامة الفيديو.", + "alarmsAndOccupancies": "الإنذارات والإشغالات", + "alarms": "إنذار", + "allTime": "كل الوقت", + "monthly": "شهريا", + "weekly": "أسبوعي", + "daily": "يوميًا", + "customRange": "نطاق مخصص", + "stateOfHealth": "الحالة الصحية", + "selectAll": "حدد الكل", + "last24Hours": "آخر 24 ساعة", + "last7Days": "آخر 7 أيام", + "last30Days": "آخر 30 يومًا", + "thisMonth": "هذا الشهر", + "rdsSiteReport": "تقرير موقع RDS", + "laneReport": "تقرير لين", + "adjudicationReport": "تقرير التحكيم", + "eventReport": "تقرير الحدث", + "generatingReport": "جارٍ إنشاء التقرير...", + "generateReportBtn": "إنشاء تقرير" +} diff --git a/src/locales/ar.json b/src/locales/ar.json new file mode 100644 index 00000000..4ef22bed --- /dev/null +++ b/src/locales/ar.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "لوحة القيادة", + "events": "الأحداث", + "map": "الخريطة", + "national": "الوطنية", + "reportGenerator": "مولد التقارير", + "servers": "الخوادم", + "alarmVolume": "مستوى صوت الإنذار", + "laneStatus": "حالة المسار", + "laneId": "معرف المسار", + "occupancyId": "معرف الإشغال", + "startTime": "وقت البدء", + "endTime": "وقت الانتهاء", + "maxGamma": "عدد أشعة غاما في الثانية (cps)", + "maxNeutron": "عدد النيوترونات في الثانية (cps)", + "status": "الحالة", + "adjudicated": "تم التقييم", + "details": "التفاصيل", + "yes": "نعم", + "no": "لا", + "eventDetails": "تفاصيل الحدث", + "addServer": "إضافة خادم جديد", + "editNode": "تعديل العقدة", + "nodes": "العقد", + "exportPdf": "تصدير كـ PDF", + "adjudicationTitle": "التقييم", + "adjudicationReportForm": "نموذج تقرير التقييم", + "vehicleId": "معرف المركبة", + "notes": "ملاحظات", + "uploadFiles": "رفع ملفات", + "submit": "إرسال", + "adjudicationSuccess": "تم التقييم بنجاح لمعرف الإشغال: ", + "adjudicationFail": "فشل إرسال التقييم.", + "selectValidCode": "الرجاء اختيار رمز تقييم صالح قبل الإرسال.", + "errorLoadingObservation": "خطأ في تحميل المراقبة.", + "cannotFindObservation": "لا يمكن العثور على المراقبة للتقييم. حاول مرة أخرى.", + "statusOnline": "متصل", + "statusOffline": "غير متصل", + "statusTamper": "إنذار العبث", + "statusFault": "عطل", + "statusClear": "مسح", + "statusGamma": "غاما", + "statusNeutron": "نيوترون", + "statusGammaNeutron": "غاما ونيوترون", + "statusNone": "لا يوجد", + "code1": "الرمز 1: تم العثور على ممنوعات", + "code2": "الرمز 2: آخر", + "code3": "الرمز 3: تم العثور على نظير طبي", + "code4": "الرمز 4: تم العثور على مواد مشعة طبيعية (NORM)", + "code5": "الرمز 5: شحنة معلنة من المواد المشعة", + "code6": "الرمز 6: الفحص البدني سلبي", + "code7": "الرمز 7: يشير RIID/ASP إلى الخلفية فقط", + "code8": "الرمز 8: آخر", + "code9": "الرمز 9: نشاط اختبار أو صيانة أو تدريب مصرح به", + "code10": "الرمز 10: نشاط غير مصرح به", + "code11": "الرمز 11: آخر", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "إنذار حقيقي", + "innocentAlarm": "إنذار بريء", + "falseAlarm": "إنذار كاذب", + "other": "آخر", + "isotope": "النظائر", + "secondaryInspection": "التفتيش الثانوي", + "loggedAdjudications": "الأحكام المسجلة", + "feedback": "تعليق", + "noNodes": "لا العقد", + "delete": "يمسح", + "cancel": "يلغي", + "timeRange": "النطاق الزمني", + "viewLane": "عرض المسار", + "eventType": "نوع الحدث", + "nodeSelector": "محدد العقدة", + "laneSelector": "محدد المسار", + "reportType": "نوع التقرير", + "adjudicationCode": "رمز التحكيم", + "isotopes": "النظائر", + "filePaths": "مسارات الملفات", + "occupancyTable": "جدول الإشغال", + "faultTable": "جدول الأخطاء", + "noEventDataAvailable": "لا توجد بيانات الحدث المتاحة", + "neutronBackgroundCountRate": "معدل عدد الخلفية النيوترونية", + "maxGammaCountRate": "الحد الأقصى لمعدل عدد جاما (cps)", + "maxNeutronCountRate": "الحد الأقصى لمعدل عدد النيوترونات (cps)", + "speedKph": "السرعة (كم/ساعة)", + "expand": "يوسع", + "close": "يغلق", + "name": "اسم", + "address": "عنوان", + "port": "ميناء", + "csApiEndpoint": "نقطة النهاية لواجهة برمجة تطبيقات CS", + "username": "اسم المستخدم", + "password": "كلمة المرور", + "isSecure": "آمن", + "openDrawer": "درج مفتوح", + "openNotifications": "فتح الإخطارات", + "volume": "مقدار", + "startDate": "تاريخ البدء", + "endDate": "تاريخ الانتهاء", + "simpleTable": "طاولة بسيطة", + "user": "مستخدم", + "timestamp": "الطابع الزمني", + "secondaryInspectionStatus": "حالة التفتيش الثانوية", + "nodeId": "معرف العقدة", + "alarm.gamma": "إنذار جاما", + "alarm.neutron": "إنذار النيوترونات", + "alarm.gammaNeutron": "إنذار جاما نيوترون", + "occupancies": "الإشغالات", + "tamper": "العبث", + "faults.gamma": "أخطاء جاما", + "faults.neutron": "أخطاء النيوترونات", + "faults": "أخطاء", + "noVideoAvailable": "لا يوجد فيديو متاح", + "loading": "تحميل...", + "edit": "يحرر", + "back": "خلف", + "reset": "إعادة ضبط", + "generateReport": "إنشاء تقرير", + "generatedReport": "تقرير تم إنشاؤه", + "pleaseGenerateReport": "يرجى إنشاء تقرير لعرضه وتنزيله هنا.", + "readMore": "اقرأ المزيد", + "clickAnywhereToEnableAlarmSound": "انقر في أي مكان لتمكين صوت التنبيه", + "yourBrowserDoesNotSupportVideoTag": "متصفحك لا يدعم علامة الفيديو.", + "alarmsAndOccupancies": "الإنذارات والإشغالات", + "alarms": "إنذار", + "allTime": "كل الوقت", + "monthly": "شهريا", + "weekly": "أسبوعي", + "daily": "يوميًا", + "customRange": "نطاق مخصص", + "stateOfHealth": "الحالة الصحية", + "selectAll": "حدد الكل", + "last24Hours": "آخر 24 ساعة", + "last7Days": "آخر 7 أيام", + "last30Days": "آخر 30 يومًا", + "thisMonth": "هذا الشهر", + "rdsSiteReport": "تقرير موقع RDS", + "laneReport": "تقرير لين", + "adjudicationReport": "تقرير التحكيم", + "eventReport": "تقرير الحدث", + "generatingReport": "جارٍ إنشاء التقرير...", + "generateReportBtn": "إنشاء تقرير" +} diff --git a/src/locales/bn.json b/src/locales/bn.json new file mode 100644 index 00000000..be4b2320 --- /dev/null +++ b/src/locales/bn.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "ডैशবোর্ড", + "events": "ইভেন্ট", + "map": "মানচিত্র", + "national": "জাতীয়", + "reportGenerator": "রিপোর্ট জেনারেটর", + "servers": "সার্ভার", + "alarmVolume": "অ্যালার্ম ভলিউম", + "laneStatus": "লেনের অবস্থা", + "laneId": "লেন আইডি", + "occupancyId": "দখল আইডি", + "startTime": "শুরুর সময়", + "endTime": "শেষ সময়", + "maxGamma": "সর্বোচ্চ গামা (cps)", + "maxNeutron": "সর্বোচ্চ নিউট্রন (cps)", + "status": "অবস্থা", + "adjudicated": "রায় দেওয়া হয়েছে", + "details": "বিস্তারিত", + "yes": "হ্যাঁ", + "no": "না", + "eventDetails": "ইভেন্টের বিস্তারিত", + "addServer": "নতুন সার্ভার যোগ করুন", + "editNode": "নোড সম্পাদনা করুন", + "nodes": "নোড", + "exportPdf": "PDF হিসেবে রপ্তানি করুন", + "adjudicationTitle": "রায়", + "adjudicationReportForm": "রায় রিপোর্ট ফর্ম", + "vehicleId": "যানবাহন আইডি", + "notes": "নোট", + "uploadFiles": "ফাইল আপলোড করুন", + "submit": "জমা দিন", + "adjudicationSuccess": "দখল আইডি-র জন্য রায় সফল: ", + "adjudicationFail": "রায় জমা দিতে ব্যর্থ।", + "selectValidCode": "জমা দেওয়ার আগে অনুগ্রহ করে একটি বৈধ রায় কোড নির্বাচন করুন।", + "errorLoadingObservation": "পর্যবেক্ষণ লোড করতে ত্রুটি।", + "cannotFindObservation": "রায় দেওয়ার জন্য পর্যবেক্ষণ খুঁজে পাওয়া যাচ্ছে না। অনুগ্রহ করে আবার চেষ্টা করুন।", + "statusOnline": "অনলাইন", + "statusOffline": "অফলাইন", + "statusTamper": "হস্তক্ষেপ", + "statusFault": "ত্রুটি", + "statusClear": "পরিষ্কার", + "statusGamma": "গামা", + "statusNeutron": "নিউট্রন", + "statusGammaNeutron": "গামা এবং নিউট্রন", + "statusNone": "কিছুই না", + "code1": "কোড 1: চোরাচালান পণ্য পাওয়া গেছে", + "code2": "কোড 2: অন্যান্য", + "code3": "কোড 3: মেডিকেল আইসোটোপ পাওয়া গেছে", + "code4": "কোড 4: NORM উপাদান পাওয়া গেছে", + "code5": "কোড 5: তেজস্ক্রিয় উপাদানের ঘোষিত চালান", + "code6": "কোড 6: শারীরিক পরিদর্শন নেতিবাচক", + "code7": "কোড 7: RIID/ASP শুধুমাত্র ব্যাকগ্রাউন্ড নির্দেশ করে", + "code8": "কোড 8: অন্যান্য", + "code9": "কোড 9: অনুমোদিত পরীক্ষা, রক্ষণাবেক্ষণ বা প্রশিক্ষণ কার্যকলাপ", + "code10": "কোড 10: অননুমোদিত কার্যকলাপ", + "code11": "কোড 11: অন্যান্য", + "cps": "সিপিএস", + "nsigma": "এনসিগমা", + "realAlarm": "রিয়েল অ্যালার্ম", + "innocentAlarm": "ইনোসেন্ট অ্যালার্ম", + "falseAlarm": "মিথ্যা অ্যালার্ম", + "other": "অন্যান্য", + "isotope": "আইসোটোপ", + "secondaryInspection": "মাধ্যমিক পরিদর্শন", + "loggedAdjudications": "রায় লগ করা", + "feedback": "প্রতিক্রিয়া", + "noNodes": "কোন নোড নেই", + "delete": "মুছে দিন", + "cancel": "বাতিল করুন", + "timeRange": "সময় পরিসীমা", + "viewLane": "লেন দেখুন", + "eventType": "ইভেন্টের ধরন", + "nodeSelector": "নোড নির্বাচক", + "laneSelector": "লেন নির্বাচক", + "reportType": "রিপোর্টের ধরন", + "adjudicationCode": "বিচার কোড", + "isotopes": "আইসোটোপ", + "filePaths": "ফাইলপাথ", + "occupancyTable": "অকুপেন্সি টেবিল", + "faultTable": "ফল্ট টেবিল", + "noEventDataAvailable": "কোনো ইভেন্ট ডেটা উপলব্ধ নেই৷", + "neutronBackgroundCountRate": "নিউট্রন ব্যাকগ্রাউন্ড কাউন্ট রেট", + "maxGammaCountRate": "সর্বোচ্চ গামা কাউন্ট রেট (cps)", + "maxNeutronCountRate": "সর্বোচ্চ নিউট্রন কাউন্ট রেট (cps)", + "speedKph": "গতি (kph)", + "expand": "প্রসারিত", + "close": "বন্ধ", + "name": "নাম", + "address": "ঠিকানা", + "port": "বন্দর", + "csApiEndpoint": "CS API এন্ডপয়েন্ট", + "username": "ব্যবহারকারীর নাম", + "password": "পাসওয়ার্ড", + "isSecure": "নিরাপদ", + "openDrawer": "খোলা ড্রয়ার", + "openNotifications": "খোলা বিজ্ঞপ্তি", + "volume": "আয়তন", + "startDate": "শুরুর তারিখ", + "endDate": "শেষ তারিখ", + "simpleTable": "সহজ টেবিল", + "user": "ব্যবহারকারী", + "timestamp": "টাইমস্ট্যাম্প", + "secondaryInspectionStatus": "মাধ্যমিক পরিদর্শন অবস্থা", + "nodeId": "নোড আইডি", + "alarm.gamma": "গামা অ্যালার্ম", + "alarm.neutron": "নিউট্রন অ্যালার্ম", + "alarm.gammaNeutron": "গামা নিউট্রন অ্যালার্ম", + "occupancies": "দখল", + "tamper": "টেম্পার", + "faults.gamma": "গামা ফল্টস", + "faults.neutron": "নিউট্রন ফল্ট", + "faults": "দোষ", + "noVideoAvailable": "কোন ভিডিও উপলব্ধ নেই", + "loading": "লোড হচ্ছে...", + "edit": "সম্পাদনা করুন", + "back": "ব্যাক", + "reset": "রিসেট করুন", + "generateReport": "একটি প্রতিবেদন তৈরি করুন", + "generatedReport": "উত্পন্ন রিপোর্ট", + "pleaseGenerateReport": "এখানে দেখতে এবং ডাউনলোড করতে একটি প্রতিবেদন তৈরি করুন.", + "readMore": "আরও পড়ুন", + "clickAnywhereToEnableAlarmSound": "অ্যালার্ম সাউন্ড চালু করতে যেকোনো জায়গায় ক্লিক করুন", + "yourBrowserDoesNotSupportVideoTag": "আপনার ব্রাউজার ভিডিও ট্যাগ সমর্থন করে না.", + "alarmsAndOccupancies": "অ্যালার্ম এবং দখল", + "alarms": "অ্যালার্ম", + "allTime": "সব সময়", + "monthly": "মাসিক", + "weekly": "সাপ্তাহিক", + "daily": "দৈনিক", + "customRange": "কাস্টম পরিসীমা", + "stateOfHealth": "স্বাস্থ্যের অবস্থা", + "selectAll": "সব নির্বাচন করুন", + "last24Hours": "গত 24 ঘন্টা", + "last7Days": "গত ৭ দিন", + "last30Days": "গত 30 দিন", + "thisMonth": "এই মাসে", + "rdsSiteReport": "আরডিএস সাইট রিপোর্ট", + "laneReport": "লেন রিপোর্ট", + "adjudicationReport": "বিচার প্রতিবেদন", + "eventReport": "ইভেন্ট রিপোর্ট", + "generatingReport": "প্রতিবেদন তৈরি করা হচ্ছে...", + "generateReportBtn": "প্রতিবেদন তৈরি করুন" +} diff --git a/src/locales/de.json b/src/locales/de.json new file mode 100644 index 00000000..45d3c790 --- /dev/null +++ b/src/locales/de.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Dashboard", + "events": "Ereignisse", + "map": "Karte", + "national": "National", + "reportGenerator": "Berichtsgenerator", + "servers": "Server", + "alarmVolume": "Alarmlautstärke", + "laneStatus": "Spurstatus", + "laneId": "Spur-ID", + "occupancyId": "Belegungs-ID", + "startTime": "Startzeit", + "endTime": "Endzeit", + "maxGamma": "Max Gamma (cps)", + "maxNeutron": "Max Neutron (cps)", + "status": "Status", + "adjudicated": "Beurteilt", + "details": "Details", + "yes": "Ja", + "no": "Nein", + "eventDetails": "Ereignisdetails", + "addServer": "Neuen Server hinzufügen", + "editNode": "Knoten bearbeiten", + "nodes": "Knoten", + "exportPdf": "Als PDF exportieren", + "adjudicationTitle": "Beurteilung", + "adjudicationReportForm": "Beurteilungsbericht", + "vehicleId": "Fahrzeug-ID", + "notes": "Notizen", + "uploadFiles": "Dateien hochladen", + "submit": "Absenden", + "adjudicationSuccess": "Beurteilung erfolgreich für Belegungs-ID: ", + "adjudicationFail": "Fehler beim Senden der Beurteilung.", + "selectValidCode": "Bitte wählen Sie vor dem Absenden einen gültigen Beurteilungscode aus.", + "errorLoadingObservation": "Fehler beim Laden der Beobachtung.", + "cannotFindObservation": "Beobachtung zur Beurteilung nicht gefunden. Bitte versuchen Sie es erneut.", + "statusOnline": "Online", + "statusOffline": "Offline", + "statusTamper": "Sabotage", + "statusFault": "Störung", + "statusClear": "Frei", + "statusGamma": "Gamma", + "statusNeutron": "Neutron", + "statusGammaNeutron": "Gamma & Neutron", + "statusNone": "Keine", + "code1": "Code 1: Schmuggelware gefunden", + "code2": "Code 2: Sonstiges", + "code3": "Code 3: Medizinisches Isotop gefunden", + "code4": "Code 4: NORM-Material gefunden", + "code5": "Code 5: Deklarierter Transport radioaktiven Materials", + "code6": "Code 6: Physische Inspektion negativ", + "code7": "Code 7: RIID/ASP zeigt nur Hintergrundstrahlung an", + "code8": "Code 8: Sonstiges", + "code9": "Code 9: Autorisierte Test-, Wartungs- oder Schulungsaktivität", + "code10": "Code 10: Unbefugte Aktivität", + "code11": "Code 11: Sonstiges", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Echter Alarm", + "innocentAlarm": "Unschuldiger Alarm", + "falseAlarm": "Fehlalarm", + "other": "Andere", + "isotope": "Isotop", + "secondaryInspection": "Sekundärinspektion", + "loggedAdjudications": "Protokollierte Urteile", + "feedback": "Rückmeldung", + "noNodes": "Keine Knoten", + "delete": "Löschen", + "cancel": "Stornieren", + "timeRange": "Zeitbereich", + "viewLane": "ANSICHTSTRASSE", + "eventType": "Ereignistyp", + "nodeSelector": "Knotenauswahl", + "laneSelector": "Spurauswahl", + "reportType": "Berichtstyp", + "adjudicationCode": "Urteilskodex", + "isotopes": "Isotope", + "filePaths": "Dateipfade", + "occupancyTable": "Belegungstabelle", + "faultTable": "Fehlertabelle", + "noEventDataAvailable": "Keine Ereignisdaten verfügbar", + "neutronBackgroundCountRate": "Neutronen-Hintergrundzählrate", + "maxGammaCountRate": "Max. Gamma-Zählrate (cps)", + "maxNeutronCountRate": "Max. Neutronenzählrate (cps)", + "speedKph": "Geschwindigkeit (km/h)", + "expand": "expandieren", + "close": "schließen", + "name": "Name", + "address": "Adresse", + "port": "Hafen", + "csApiEndpoint": "CS-API-Endpunkt", + "username": "Benutzername", + "password": "Passwort", + "isSecure": "Ist sicher", + "openDrawer": "offene Schublade", + "openNotifications": "offene Benachrichtigungen", + "volume": "Volumen", + "startDate": "Startdatum", + "endDate": "Enddatum", + "simpleTable": "einfacher Tisch", + "user": "Benutzer", + "timestamp": "Zeitstempel", + "secondaryInspectionStatus": "Sekundärer Inspektionsstatus", + "nodeId": "Knoten-ID", + "alarm.gamma": "G-Alarm", + "alarm.neutron": "Nenalarm", + "alarm.gammaNeutron": "Gamma-Neutronen-Alarm", + "occupancies": "Besetzungen", + "tamper": "Manipulation", + "faults.gamma": "Gfehler", + "faults.neutron": "Nenfehler", + "faults": "Fehler", + "noVideoAvailable": "Kein Video verfügbar", + "loading": "Laden...", + "edit": "Bearbeiten", + "back": "Zurück", + "reset": "Zurücksetzen", + "generateReport": "Erstellen Sie einen Bericht", + "generatedReport": "Generierter Bericht", + "pleaseGenerateReport": "Bitte erstellen Sie einen Bericht, um ihn hier anzuzeigen und herunterzuladen.", + "readMore": "Mehr lesen", + "clickAnywhereToEnableAlarmSound": "Klicken Sie auf eine beliebige Stelle, um den Alarmton zu aktivieren", + "yourBrowserDoesNotSupportVideoTag": "Ihr Browser unterstützt das Video-Tag nicht.", + "alarmsAndOccupancies": "Alarme und Belegungen", + "alarms": "Alarm", + "allTime": "Alle Zeit", + "monthly": "Monatlich", + "weekly": "Wöchentlich", + "daily": "Täglich", + "customRange": "Benutzerdefinierter Bereich", + "stateOfHealth": "Gesundheitszustand", + "selectAll": "Wählen Sie „Alle“ aus", + "last24Hours": "Letzte 24 Stunden", + "last7Days": "Letzte 7 Tage", + "last30Days": "Letzte 30 Tage", + "thisMonth": "Diesen Monat", + "rdsSiteReport": "RDS-Site-Bericht", + "laneReport": "Spurbericht", + "adjudicationReport": "Entscheidungsbericht", + "eventReport": "Veranstaltungsbericht", + "generatingReport": "Bericht wird erstellt...", + "generateReportBtn": "Bericht erstellen" +} diff --git a/src/locales/en.json b/src/locales/en.json index d3b2db7a..30dfa73c 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -22,5 +22,123 @@ "eventDetails": "Event Details", "addServer": "Add a New Server", "editNode": "Edit Node", - "nodes": "Nodes" + "nodes": "Nodes", + "exportPdf": "Export as PDF", + "adjudicationTitle": "Adjudication", + "adjudicationReportForm": "Adjudication Report Form", + "vehicleId": "Vehicle ID", + "notes": "Notes", + "uploadFiles": "Upload Files", + "submit": "Submit", + "adjudicationSuccess": "Adjudication successful for Occupancy ID: ", + "adjudicationFail": "Adjudication failed to submit.", + "selectValidCode": "Please select a valid adjudication code before submitting.", + "errorLoadingObservation": "Error loading observation.", + "cannotFindObservation": "Cannot find observation to adjudicate. Please try again.", + "statusOnline": "Online", + "statusOffline": "Offline", + "statusTamper": "Tamper", + "statusFault": "Fault", + "statusClear": "Clear", + "statusGamma": "Gamma", + "statusNeutron": "Neutron", + "statusGammaNeutron": "Gamma & Neutron", + "statusNone": "None", + "code1": "Code 1: Contraband Found", + "code2": "Code 2: Other", + "code3": "Code 3: Medical Isotope Found", + "code4": "Code 4: Norm Found", + "code5": "Code 5: Declared Shipment of Radioactive Material", + "code6": "Code 6: Physical Inspection Negative", + "code7": "Code 7: RIID/ASP Indicates Background Only", + "code8": "Code 8: Other", + "code9": "Code 9: Authorized Test, Maintenance, or Training Activity", + "code10": "Code 10: Unauthorized Activity", + "code11": "Code 11: Other", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Real Alarm", + "innocentAlarm": "Innocent Alarm", + "falseAlarm": "False Alarm", + "other": "Other", + "isotope": "Isotope", + "secondaryInspection": "Secondary Inspection", + "loggedAdjudications": "Logged Adjudications", + "feedback": "Feedback", + "noNodes": "No Nodes", + "delete": "Delete", + "cancel": "Cancel", + "timeRange": "Time Range", + "viewLane": "VIEW LANE", + "eventType": "Event Type", + "nodeSelector": "Node Selector", + "laneSelector": "Lane Selector", + "reportType": "Report Type", + "adjudicationCode": "Adjudication Code", + "isotopes": "Isotopes", + "filePaths": "FilePaths", + "occupancyTable": "Occupancy Table", + "faultTable": "Fault Table", + "noEventDataAvailable": "No event data available", + "neutronBackgroundCountRate": "Neutron Background Count Rate", + "maxGammaCountRate": "Max Gamma Count Rate (cps)", + "maxNeutronCountRate": "Max Neutron Count Rate (cps)", + "speedKph": "Speed (kph)", + "expand": "expand", + "close": "close", + "name": "Name", + "address": "Address", + "port": "Port", + "csApiEndpoint": "CS API Endpoint", + "username": "Username", + "password": "Password", + "isSecure": "Is Secure", + "openDrawer": "open drawer", + "openNotifications": "open notifications", + "volume": "Volume", + "startDate": "Start Date", + "endDate": "End Date", + "simpleTable": "simple table", + "user": "User", + "timestamp": "Timestamp", + "secondaryInspectionStatus": "Secondary Inspection Status", + "nodeId": "Node ID", + "alarm.gamma": "G Alarm", + "alarm.neutron": "N Alarm", + "alarm.gammaNeutron": "G-N Alarm", + "occupancies": "Occupancies", + "tamper": "Tamper", + "faults.gamma": "G Faults", + "faults.neutron": "N Faults", + "faults": "Faults", + "noVideoAvailable": "No Video Available", + "loading": "Loading...", + "edit": "Edit", + "back": "Back", + "reset": "Reset", + "generateReport": "Generate A Report", + "generatedReport": "Generated Report", + "pleaseGenerateReport": "Please generate a report to view and download it here.", + "readMore": "Read more", + "clickAnywhereToEnableAlarmSound": "Click anywhere to enable alarm sound", + "yourBrowserDoesNotSupportVideoTag": "Your browser does not support the video tag.", + "alarmsAndOccupancies": "Alarms and Occupancies", + "alarms": "Alarms", + "allTime": "All Time", + "monthly": "Monthly", + "weekly": "Weekly", + "daily": "Daily", + "customRange": "Custom Range", + "stateOfHealth": "State of Health", + "selectAll": "Select All", + "last24Hours": "Last 24 Hours", + "last7Days": "Last 7 Days", + "last30Days": "Last 30 Days", + "thisMonth": "This Month", + "rdsSiteReport": "RDS Site Report", + "laneReport": "Lane Report", + "adjudicationReport": "Adjudication Report", + "eventReport": "Event Report", + "generatingReport": "Generating Report...", + "generateReportBtn": "Generate Report" } diff --git a/src/locales/es.json b/src/locales/es.json index 40cad8b7..9c2d3ed8 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -1,9 +1,9 @@ { "appTitle": "OSCAR", - "dashboard": "Tablero", + "dashboard": "Panel de Control", "events": "Eventos", "map": "Mapa", - "national": "Nacional", + "national": "Vista Nacional", "reportGenerator": "Generador de Informes", "servers": "Servidores", "alarmVolume": "Volumen de Alarma", @@ -12,15 +12,133 @@ "occupancyId": "ID de Ocupación", "startTime": "Hora de Inicio", "endTime": "Hora de Finalización", - "maxGamma": "Gamma Max (cps)", - "maxNeutron": "Neutrón Max (cps)", + "maxGamma": "Cuentas gamma por segundo (cps)", + "maxNeutron": "Cuentas de neutrones por segundo (cps)", "status": "Estado", "adjudicated": "Adjudicado", "details": "Detalles", "yes": "Sí", "no": "No", - "eventDetails": "Detalles del evento", - "addServer": "Agregar un nuevo servidor", - "editNode": "Editar nodo", - "nodes": "Nodos" + "eventDetails": "Detalles del Evento", + "addServer": "Añadir Nuevo Servidor", + "editNode": "Editar Nodo", + "nodes": "Nodos", + "exportPdf": "Exportar como PDF", + "adjudicationTitle": "Adjudicación", + "adjudicationReportForm": "Formulario de Informe de Adjudicación", + "vehicleId": "ID del Vehículo", + "notes": "Notas", + "uploadFiles": "Subir Archivos", + "submit": "Enviar", + "adjudicationSuccess": "Adjudicación exitosa para ID de Ocupación: ", + "adjudicationFail": "Fallo al enviar la adjudicación.", + "selectValidCode": "Por favor seleccione un código de adjudicación válido antes de enviar.", + "errorLoadingObservation": "Error cargando la observación.", + "cannotFindObservation": "No se puede encontrar la observación para adjudicar. Por favor intente de nuevo.", + "statusOnline": "En línea", + "statusOffline": "Desconectado", + "statusTamper": "Manipulación", + "statusFault": "Fallo", + "statusClear": "Despejado", + "statusGamma": "Gamma", + "statusNeutron": "Neutrón", + "statusGammaNeutron": "Gamma y Neutrón", + "statusNone": "Ninguno", + "code1": "Código 1: Contrabando Encontrado", + "code2": "Código 2: Otro", + "code3": "Código 3: Isótopo Médico Encontrado", + "code4": "Código 4: Material NORM Encontrado", + "code5": "Código 5: Envío Declarado de Material Radiactivo", + "code6": "Código 6: Inspección Física Negativa", + "code7": "Código 7: RIID/ASP Indica Solo Fondo", + "code8": "Código 8: Otro", + "code9": "Código 9: Actividad Autorizada de Prueba, Mantenimiento o Capacitación", + "code10": "Código 10: Actividad No Autorizada", + "code11": "Código 11: Otro", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Alarma Real", + "innocentAlarm": "Alarma Inocente", + "falseAlarm": "Falsa Alarma", + "other": "Otro", + "isotope": "Isótopo", + "secondaryInspection": "Inspección Secundaria", + "loggedAdjudications": "Adjudicaciones Registradas", + "feedback": "Comentarios", + "noNodes": "No hay Nodos", + "delete": "Eliminar", + "cancel": "Cancelar", + "timeRange": "Rango de Tiempo", + "viewLane": "VER CARRIL", + "eventType": "Tipo de Evento", + "nodeSelector": "Selector de Nodo", + "laneSelector": "Selector de Carril", + "reportType": "Tipo de Informe", + "adjudicationCode": "Código de Adjudicación", + "isotopes": "Isótopos", + "filePaths": "Rutas de Archivo", + "occupancyTable": "Tabla de Ocupaciones", + "faultTable": "Tabla de Fallos", + "noEventDataAvailable": "No hay datos de eventos disponibles", + "neutronBackgroundCountRate": "Tasa de recuento de fondo de neutrones", + "maxGammaCountRate": "Tasa máxima de recuento de gamma (cps)", + "maxNeutronCountRate": "Tasa máxima de recuento de neutrones (cps)", + "speedKph": "Velocidad (kph)", + "expand": "expandir", + "close": "cerrar", + "name": "Nombre", + "address": "Dirección", + "port": "Puerto", + "csApiEndpoint": "Punto final de API CS", + "username": "Nombre de usuario", + "password": "Contraseña", + "isSecure": "Es Seguro", + "openDrawer": "abrir cajón", + "openNotifications": "abrir notificaciones", + "volume": "Volumen", + "startDate": "Fecha de Inicio", + "endDate": "Fecha de Finalización", + "simpleTable": "tabla simple", + "user": "Usuario", + "timestamp": "Marca de tiempo", + "secondaryInspectionStatus": "Estado de Inspección Secundaria", + "nodeId": "ID de Nodo", + "alarm.gamma": "Alarma Gamma", + "alarm.neutron": "Alarma de Neutrón", + "alarm.gammaNeutron": "Alarma Gamma-Neutrón", + "occupancies": "Ocupaciones", + "tamper": "Manipulación", + "faults.gamma": "Fallos Gamma", + "faults.neutron": "Fallos de Neutrón", + "faults": "Fallos", + "noVideoAvailable": "No hay video disponible", + "loading": "Cargando...", + "edit": "Editar", + "back": "Atrás", + "reset": "Restablecer", + "generateReport": "Generar un Informe", + "generatedReport": "Informe Generado", + "pleaseGenerateReport": "Por favor genere un informe para verlo y descargarlo aquí.", + "readMore": "Leer más", + "clickAnywhereToEnableAlarmSound": "Haga clic en cualquier lugar para habilitar el sonido de alarma", + "yourBrowserDoesNotSupportVideoTag": "Su navegador no admite la etiqueta de video.", + "alarmsAndOccupancies": "Alarmas y Ocupaciones", + "alarms": "Alarmas", + "allTime": "Todo el Tiempo", + "monthly": "Mensual", + "weekly": "Semanal", + "daily": "Diario", + "customRange": "Rango Personalizado", + "stateOfHealth": "Estado de Salud", + "selectAll": "Seleccionar Todo", + "last24Hours": "Últimas 24 Horas", + "last7Days": "Últimos 7 Días", + "last30Days": "Últimos 30 Días", + "thisMonth": "Este Mes", + "rdsSiteReport": "Informe del Sitio RDS", + "laneReport": "Informe de Carril", + "adjudicationReport": "Informe de Adjudicación", + "eventReport": "Informe de Eventos", + "generatingReport": "Generando informe...", + "generateReportBtn": "Generar informe" } diff --git a/src/locales/et.json b/src/locales/et.json new file mode 100644 index 00000000..e427a05e --- /dev/null +++ b/src/locales/et.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Armatuurlaud", + "events": "Sündmused", + "map": "Kaart", + "national": "Riiklik", + "reportGenerator": "Aruande generaator", + "servers": "Serverid", + "alarmVolume": "Häire helitugevus", + "laneStatus": "Raja olek", + "laneId": "Raja ID", + "occupancyId": "Hõivatuse ID", + "startTime": "Algusaeg", + "endTime": "Lõppaeg", + "maxGamma": "Maksimaalne gamma (cps)", + "maxNeutron": "Maksimaalne neutron (cps)", + "status": "Olek", + "adjudicated": "Otsustatud", + "details": "Üksikasjad", + "yes": "Jah", + "no": "Ei", + "eventDetails": "Sündmuse üksikasjad", + "addServer": "Lisa uus server", + "editNode": "Muuda sõlme", + "nodes": "Sõlmed", + "exportPdf": "Ekspordi PDF-ina", + "adjudicationTitle": "Otsus", + "adjudicationReportForm": "Otsuse aruande vorm", + "vehicleId": "Sõiduki ID", + "notes": "Märkmed", + "uploadFiles": "Laadi failid üles", + "submit": "Esita", + "adjudicationSuccess": "Otsus edukas hõivatuse ID jaoks: ", + "adjudicationFail": "Otsuse esitamine ebaõnnestus.", + "selectValidCode": "Palun valige enne esitamist kehtiv otsuse kood.", + "errorLoadingObservation": "Viga vaatluse laadimisel.", + "cannotFindObservation": "Ei leia vaatlust otsustamiseks. Palun proovige uuesti.", + "statusOnline": "Võrgus", + "statusOffline": "Võrguühenduseta", + "statusTamper": "Sabotaaž", + "statusFault": "Rike", + "statusClear": "Puhas", + "statusGamma": "Gamma", + "statusNeutron": "Neutron", + "statusGammaNeutron": "Gamma ja Neutron", + "statusNone": "Puudub", + "code1": "Kood 1: Leitud salakaubavedu", + "code2": "Kood 2: Muu", + "code3": "Kood 3: Leitud meditsiiniline isotoop", + "code4": "Kood 4: Leitud NORM materjal", + "code5": "Kood 5: Deklareeritud radioaktiivse materjali saadetis", + "code6": "Kood 6: Füüsiline kontroll negatiivne", + "code7": "Kood 7: RIID/ASP näitab ainult fooni", + "code8": "Kood 8: Muu", + "code9": "Kood 9: Volitatud testimine, hooldus või koolitus", + "code10": "Kood 10: Volitamata tegevus", + "code11": "Kood 11: Muu", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Tõeline äratus", + "innocentAlarm": "Süütu äratus", + "falseAlarm": "Valehäire", + "other": "muud", + "isotope": "Isotoop", + "secondaryInspection": "Teisene ülevaatus", + "loggedAdjudications": "Logitud otsused", + "feedback": "Tagasiside", + "noNodes": "Sõlmesid pole", + "delete": "Kustuta", + "cancel": "Tühista", + "timeRange": "Ajavahemik", + "viewLane": "VAATAMISALA", + "eventType": "Sündmuse tüüp", + "nodeSelector": "Sõlme valija", + "laneSelector": "Raja valija", + "reportType": "Aruande tüüp", + "adjudicationCode": "Kohtuotsuse kood", + "isotopes": "Isotoobid", + "filePaths": "FilePaths", + "occupancyTable": "Hõivatuse tabel", + "faultTable": "Veatabel", + "noEventDataAvailable": "Sündmuse andmed pole saadaval", + "neutronBackgroundCountRate": "Neutronite taustaloenduskiirus", + "maxGammaCountRate": "Maksimaalne gamma loendusmäär (cps)", + "maxNeutronCountRate": "Maksimaalne neutronite loenduskiirus (cps)", + "speedKph": "Kiirus (kph)", + "expand": "laiendada", + "close": "sulgeda", + "name": "Nimi", + "address": "Aadress", + "port": "Port", + "csApiEndpoint": "CS API lõpp-punkt", + "username": "Kasutajanimi", + "password": "Parool", + "isSecure": "On Turvaline", + "openDrawer": "avatud sahtel", + "openNotifications": "avage teatised", + "volume": "Helitugevus", + "startDate": "Alguskuupäev", + "endDate": "Lõppkuupäev", + "simpleTable": "lihtne laud", + "user": "Kasutaja", + "timestamp": "Ajatempel", + "secondaryInspectionStatus": "Teisese ülevaatuse olek", + "nodeId": "Sõlme ID", + "alarm.gamma": "G alarm", + "alarm.neutron": "Nite häire", + "alarm.gammaNeutron": "Gamma neutronite häire", + "occupancies": "Hõivamised", + "tamper": "Tamper", + "faults.gamma": "G vead", + "faults.neutron": "Nite rikked", + "faults": "Vead", + "noVideoAvailable": "Video pole saadaval", + "loading": "Laadimine...", + "edit": "Muuda", + "back": "Tagasi", + "reset": "Lähtesta", + "generateReport": "Loo aruanne", + "generatedReport": "Loodud aruanne", + "pleaseGenerateReport": "Looge aruanne selle vaatamiseks ja siit allalaadimiseks.", + "readMore": "Loe edasi", + "clickAnywhereToEnableAlarmSound": "Äratusheli lubamiseks klõpsake ükskõik kus", + "yourBrowserDoesNotSupportVideoTag": "Teie brauser ei toeta videomärgendit.", + "alarmsAndOccupancies": "Häired ja hõivamised", + "alarms": "Äratused", + "allTime": "Kogu aeg", + "monthly": "Igakuine", + "weekly": "Iganädalane", + "daily": "Igapäevane", + "customRange": "Kohandatud vahemik", + "stateOfHealth": "Tervislik seisund", + "selectAll": "Valige Kõik", + "last24Hours": "Viimased 24 tundi", + "last7Days": "Viimased 7 päeva", + "last30Days": "Viimased 30 päeva", + "thisMonth": "Sel kuul", + "rdsSiteReport": "RDS-i saidi aruanne", + "laneReport": "Raja aruanne", + "adjudicationReport": "Kohtuotsuse aruanne", + "eventReport": "Sündmuse aruanne", + "generatingReport": "Aruande genereerimine...", + "generateReportBtn": "Loo aruanne" +} diff --git a/src/locales/fr.json b/src/locales/fr.json index 9ce0dce9..da261960 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -1,26 +1,144 @@ { "appTitle": "OSCAR", - "dashboard": "Tableau de bord", + "dashboard": "Tableau de Bord", "events": "Événements", "map": "Carte", "national": "National", - "reportGenerator": "Générateur de rapports", + "reportGenerator": "Générateur de Rapports", "servers": "Serveurs", - "alarmVolume": "Volume de l'alarme", - "laneStatus": "État de la voie", - "laneId": "ID de la voie", - "occupancyId": "ID d'occupation", - "startTime": "Heure de début", - "endTime": "Heure de fin", - "maxGamma": "Gamma Max (cps)", - "maxNeutron": "Neutron Max (cps)", - "status": "État", + "alarmVolume": "Volume de l'Alarme", + "laneStatus": "État de la Voie", + "laneId": "ID de Voie", + "occupancyId": "ID d'Occupation", + "startTime": "Heure de Début", + "endTime": "Heure de Fin", + "maxGamma": "Coups gamma par seconde (cps)", + "maxNeutron": "Coups de neutrons par seconde (cps)", + "status": "Statut", "adjudicated": "Jugé", "details": "Détails", "yes": "Oui", "no": "Non", - "eventDetails": "Détails de l'événement", - "addServer": "Ajouter un nouveau serveur", - "editNode": "Modifier le nœud", - "nodes": "Nœuds" + "eventDetails": "Détails de l'Événement", + "addServer": "Ajouter un Nouveau Serveur", + "editNode": "Modifier le Nœud", + "nodes": "Nœuds", + "exportPdf": "Exporter en PDF", + "adjudicationTitle": "Adjudication", + "adjudicationReportForm": "Formulaire de Rapport d'Adjudication", + "vehicleId": "ID du Véhicule", + "notes": "Remarques", + "uploadFiles": "Télécharger des Fichiers", + "submit": "Soumettre", + "adjudicationSuccess": "Adjudication réussie pour l'ID d'Occupation : ", + "adjudicationFail": "Échec de la soumission de l'adjudication.", + "selectValidCode": "Veuillez sélectionner un code d'adjudication valide avant de soumettre.", + "errorLoadingObservation": "Erreur lors du chargement de l'observation.", + "cannotFindObservation": "Impossible de trouver l'observation à juger. Veuillez réessayer.", + "statusOnline": "En Ligne", + "statusOffline": "Hors Ligne", + "statusTamper": "Sabotage", + "statusFault": "Défaut", + "statusClear": "Clair", + "statusGamma": "Gamma", + "statusNeutron": "Neutron", + "statusGammaNeutron": "Gamma et Neutron", + "statusNone": "Aucun", + "code1": "Code 1 : Contrebande Trouvée", + "code2": "Code 2 : Autre", + "code3": "Code 3 : Isotope Médical Trouvé", + "code4": "Code 4 : Matériel NORM Trouvé", + "code5": "Code 5 : Expédition Déclarée de Matière Radioactive", + "code6": "Code 6 : Inspection Physique Négative", + "code7": "Code 7 : RIID/ASP Indique Uniquement le Bruit de Fond", + "code8": "Code 8 : Autre", + "code9": "Code 9 : Activité Autorisée de Test, Maintenance ou Formation", + "code10": "Code 10 : Activité Non Autorisée", + "code11": "Code 11 : Autre", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Véritable alarme", + "innocentAlarm": "Alarme innocente", + "falseAlarm": "Fausse alarme", + "other": "Autre", + "isotope": "Isotope", + "secondaryInspection": "Inspection secondaire", + "loggedAdjudications": "Décisions enregistrées", + "feedback": "Retour", + "noNodes": "Aucun nœud", + "delete": "Supprimer", + "cancel": "Annuler", + "timeRange": "Plage de temps", + "viewLane": "VOIR LA VOIE", + "eventType": "Type d'événement", + "nodeSelector": "Sélecteur de nœud", + "laneSelector": "Sélecteur de voie", + "reportType": "Type de rapport", + "adjudicationCode": "Code d'arbitrage", + "isotopes": "Isotopes", + "filePaths": "Chemins de fichiers", + "occupancyTable": "Tableau d'occupation", + "faultTable": "Tableau des défauts", + "noEventDataAvailable": "Aucune donnée d'événement disponible", + "neutronBackgroundCountRate": "Taux de comptage de fond de neutrons", + "maxGammaCountRate": "Taux de comptage gamma maximum (cps)", + "maxNeutronCountRate": "Taux de comptage maximal de neutrons (cps)", + "speedKph": "Vitesse (km/h)", + "expand": "développer", + "close": "fermer", + "name": "Nom", + "address": "Adresse", + "port": "Port", + "csApiEndpoint": "Point de terminaison de l'API CS", + "username": "Nom d'utilisateur", + "password": "Mot de passe", + "isSecure": "Est sécurisé", + "openDrawer": "tiroir ouvert", + "openNotifications": "ouvrir les notifications", + "volume": "Volume", + "startDate": "Date de début", + "endDate": "Date de fin", + "simpleTable": "tableau simple", + "user": "Utilisateur", + "timestamp": "Horodatage", + "secondaryInspectionStatus": "Statut d'inspection secondaire", + "nodeId": "ID du nœud", + "alarm.gamma": "Alarme gamma", + "alarm.neutron": "Alarme neutronique", + "alarm.gammaNeutron": "Alarme neutrons gamma", + "occupancies": "Occupations", + "tamper": "Altérer", + "faults.gamma": "Défauts gamma", + "faults.neutron": "Défauts neutroniques", + "faults": "Défauts", + "noVideoAvailable": "Aucune vidéo disponible", + "loading": "Chargement...", + "edit": "Modifier", + "back": "Dos", + "reset": "Réinitialiser", + "generateReport": "Générer un rapport", + "generatedReport": "Rapport généré", + "pleaseGenerateReport": "Veuillez générer un rapport pour le consulter et le télécharger ici.", + "readMore": "En savoir plus", + "clickAnywhereToEnableAlarmSound": "Cliquez n'importe où pour activer le son de l'alarme", + "yourBrowserDoesNotSupportVideoTag": "Votre navigateur ne prend pas en charge la balise vidéo.", + "alarmsAndOccupancies": "Alarmes et occupations", + "alarms": "Alarmes", + "allTime": "Tout le temps", + "monthly": "Mensuel", + "weekly": "Hebdomadaire", + "daily": "Tous les jours", + "customRange": "Gamme personnalisée", + "stateOfHealth": "État de santé", + "selectAll": "Sélectionner tout", + "last24Hours": "Dernières 24 heures", + "last7Days": "7 derniers jours", + "last30Days": "30 derniers jours", + "thisMonth": "Ce mois-ci", + "rdsSiteReport": "Rapport de site RDS", + "laneReport": "Rapport de voie", + "adjudicationReport": "Rapport d'arbitrage", + "eventReport": "Rapport d'événement", + "generatingReport": "Génération du rapport...", + "generateReportBtn": "Générer un rapport" } diff --git a/src/locales/hi.json b/src/locales/hi.json new file mode 100644 index 00000000..5ed16ca4 --- /dev/null +++ b/src/locales/hi.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "डैशबोर्ड", + "events": "घटनाएँ", + "map": "नक्शा", + "national": "राष्ट्रीय", + "reportGenerator": "रिपोर्ट जनरेटर", + "servers": "सर्वर", + "alarmVolume": "अलार्म वॉल्यूम", + "laneStatus": "लेन स्थिति", + "laneId": "लेन आईडी", + "occupancyId": "अधिभोग आईडी", + "startTime": "प्रारंभ समय", + "endTime": "समाप्ति समय", + "maxGamma": "अधिकतम गामा (cps)", + "maxNeutron": "अधिकतम न्यूट्रॉन (cps)", + "status": "स्थिति", + "adjudicated": "निर्णित", + "details": "विवरण", + "yes": "हाँ", + "no": "नहीं", + "eventDetails": "घटना विवरण", + "addServer": "नया सर्वर जोड़ें", + "editNode": "नोड संपादित करें", + "nodes": "नोड्स", + "exportPdf": "PDF के रूप में निर्यात करें", + "adjudicationTitle": "निर्णय", + "adjudicationReportForm": "निर्णय रिपोर्ट फॉर्म", + "vehicleId": "वाहन आईडी", + "notes": "टिप्पणियाँ", + "uploadFiles": "फाइलें अपलोड करें", + "submit": "जमा करें", + "adjudicationSuccess": "अधिभोग आईडी के लिए निर्णय सफल: ", + "adjudicationFail": "निर्णय जमा करने में विफल।", + "selectValidCode": "कृपया जमा करने से पहले एक मान्य निर्णय कोड चुनें।", + "errorLoadingObservation": "अवलोकन लोड करने में त्रुटि।", + "cannotFindObservation": "निर्णय के लिए अवलोकन नहीं मिल सका। कृपया पुनः प्रयास करें।", + "statusOnline": "ऑनलाइन", + "statusOffline": "ऑफलाइन", + "statusTamper": "छेड़छाड़", + "statusFault": "दोष", + "statusClear": "साफ़", + "statusGamma": "गामा", + "statusNeutron": "न्यूट्रॉन", + "statusGammaNeutron": "गामा और न्यूट्रॉन", + "statusNone": "कोई नहीं", + "code1": "कोड 1: तस्करी का सामान मिला", + "code2": "कोड 2: अन्य", + "code3": "कोड 3: चिकित्सा समस्थानिक मिला", + "code4": "कोड 4: NORM सामग्री मिली", + "code5": "कोड 5: रेडियोधर्मी सामग्री का घोषित शिपमेंट", + "code6": "कोड 6: शारीरिक निरीक्षण नकारात्मक", + "code7": "कोड 7: RIID/ASP केवल पृष्ठभूमि इंगित करता है", + "code8": "कोड 8: अन्य", + "code9": "कोड 9: अधिकृत परीक्षण, रखरखाव, या प्रशिक्षण गतिविधि", + "code10": "कोड 10: अनधिकृत गतिविधि", + "code11": "कोड 11: अन्य", + "cps": "सीपी", + "nsigma": "एनसिग्मा", + "realAlarm": "असली अलार्म", + "innocentAlarm": "मासूम अलार्म", + "falseAlarm": "गलत सचेतक", + "other": "अन्य", + "isotope": "आइसोटोप", + "secondaryInspection": "माध्यमिक निरीक्षण", + "loggedAdjudications": "लॉग किए गए निर्णय", + "feedback": "प्रतिक्रिया", + "noNodes": "कोई नोड्स नहीं", + "delete": "मिटाना", + "cancel": "रद्द करना", + "timeRange": "समय सीमा", + "viewLane": "लेन देखें", + "eventType": "इवेंट प्रकार", + "nodeSelector": "नोड चयनकर्ता", + "laneSelector": "लेन चयनकर्ता", + "reportType": "आख्या की प्रकार", + "adjudicationCode": "न्यायनिर्णयन संहिता", + "isotopes": "आइसोटोप", + "filePaths": "फ़ाइलपथ", + "occupancyTable": "अधिभोग तालिका", + "faultTable": "दोष तालिका", + "noEventDataAvailable": "कोई घटना डेटा उपलब्ध नहीं है", + "neutronBackgroundCountRate": "न्यूट्रॉन पृष्ठभूमि गणना दर", + "maxGammaCountRate": "अधिकतम गामा गणना दर (सीपीएस)", + "maxNeutronCountRate": "अधिकतम न्यूट्रॉन गणना दर (सीपीएस)", + "speedKph": "गति (किलोमीटर प्रति घंटा)", + "expand": "बढ़ाना", + "close": "बंद करना", + "name": "नाम", + "address": "पता", + "port": "पत्तन", + "csApiEndpoint": "सीएस एपीआई समापन बिंदु", + "username": "उपयोगकर्ता नाम", + "password": "पासवर्ड", + "isSecure": "सुरक्षित है", + "openDrawer": "खुली दराज", + "openNotifications": "सूचनाएं खोलें", + "volume": "आयतन", + "startDate": "आरंभ करने की तिथि", + "endDate": "अंतिम तिथि", + "simpleTable": "साधारण टेबल", + "user": "उपयोगकर्ता", + "timestamp": "समय-चिह्न", + "secondaryInspectionStatus": "माध्यमिक निरीक्षण स्थिति", + "nodeId": "नोड आईडी", + "alarm.gamma": "गामा अलार्म", + "alarm.neutron": "न्यूट्रॉन अलार्म", + "alarm.gammaNeutron": "गामा न्यूट्रॉन अलार्म", + "occupancies": "ऑक्यूपेंसी", + "tamper": "छेड़छाड़", + "faults.gamma": "गामा दोष", + "faults.neutron": "न्यूट्रॉन दोष", + "faults": "दोष", + "noVideoAvailable": "कोई वीडियो उपलब्ध नहीं", + "loading": "लोड हो रहा है...", + "edit": "संपादन करना", + "back": "पीछे", + "reset": "रीसेट करें", + "generateReport": "एक रिपोर्ट तैयार करें", + "generatedReport": "तैयार की गई रिपोर्ट", + "pleaseGenerateReport": "कृपया इसे यहां देखने और डाउनलोड करने के लिए एक रिपोर्ट तैयार करें।", + "readMore": "और पढ़ें", + "clickAnywhereToEnableAlarmSound": "अलार्म ध्वनि सक्षम करने के लिए कहीं भी क्लिक करें", + "yourBrowserDoesNotSupportVideoTag": "आपका ब्राउज़र में वीडियो टैग समर्थित नहीं है।", + "alarmsAndOccupancies": "अलार्म और अधिभोग", + "alarms": "एलार्म", + "allTime": "पूरे समय", + "monthly": "महीने के", + "weekly": "साप्ताहिक", + "daily": "दैनिक", + "customRange": "कस्टम रेंज", + "stateOfHealth": "सेहत की स्थिति", + "selectAll": "सबका चयन करें", + "last24Hours": "पिछले 24 घंटे", + "last7Days": "पिछले 7 दिन", + "last30Days": "पिछले 30 दिन", + "thisMonth": "इस महीने", + "rdsSiteReport": "आरडीएस साइट रिपोर्ट", + "laneReport": "लेन रिपोर्ट", + "adjudicationReport": "न्यायनिर्णयन रिपोर्ट", + "eventReport": "घटना रिपोर्ट", + "generatingReport": "रिपोर्ट तैयार की जा रही है...", + "generateReportBtn": "रिपोर्ट तैयार करें" +} diff --git a/src/locales/id.json b/src/locales/id.json new file mode 100644 index 00000000..892affc0 --- /dev/null +++ b/src/locales/id.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Dasbor", + "events": "Peristiwa", + "map": "Peta", + "national": "Nasional", + "reportGenerator": "Pembuat Laporan", + "servers": "Server", + "alarmVolume": "Volume Alarm", + "laneStatus": "Status Jalur", + "laneId": "ID Jalur", + "occupancyId": "ID Okupansi", + "startTime": "Waktu Mulai", + "endTime": "Waktu Selesai", + "maxGamma": "Maks Gamma (cps)", + "maxNeutron": "Maks Neutron (cps)", + "status": "Status", + "adjudicated": "Diputuskan", + "details": "Detail", + "yes": "Ya", + "no": "Tidak", + "eventDetails": "Detail Peristiwa", + "addServer": "Tambah Server Baru", + "editNode": "Edit Node", + "nodes": "Node", + "exportPdf": "Ekspor sebagai PDF", + "adjudicationTitle": "Ajudikasi", + "adjudicationReportForm": "Formulir Laporan Ajudikasi", + "vehicleId": "ID Kendaraan", + "notes": "Catatan", + "uploadFiles": "Unggah Berkas", + "submit": "Kirim", + "adjudicationSuccess": "Ajudikasi berhasil untuk ID Okupansi: ", + "adjudicationFail": "Gagal mengirim ajudikasi.", + "selectValidCode": "Silakan pilih kode ajudikasi yang valid sebelum mengirim.", + "errorLoadingObservation": "Kesalahan memuat pengamatan.", + "cannotFindObservation": "Tidak dapat menemukan pengamatan untuk diajudikasi. Silakan coba lagi.", + "statusOnline": "Daring", + "statusOffline": "Luring", + "statusTamper": "Sabotase", + "statusFault": "Kesalahan", + "statusClear": "Bersih", + "statusGamma": "Gamma", + "statusNeutron": "Neutron", + "statusGammaNeutron": "Gamma & Neutron", + "statusNone": "Tidak Ada", + "code1": "Kode 1: Barang Selundupan Ditemukan", + "code2": "Kode 2: Lainnya", + "code3": "Kode 3: Isotop Medis Ditemukan", + "code4": "Kode 4: Materi NORM Ditemukan", + "code5": "Kode 5: Pengiriman Materi Radioaktif yang Dideklarasikan", + "code6": "Kode 6: Pemeriksaan Fisik Negatif", + "code7": "Kode 7: RIID/ASP Menunjukkan Hanya Latar Belakang", + "code8": "Kode 8: Lainnya", + "code9": "Kode 9: Aktivitas Pengujian, Pemeliharaan, atau Pelatihan Resmi", + "code10": "Kode 10: Aktivitas Tidak Sah", + "code11": "Kode 11: Lainnya", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Alarm Nyata", + "innocentAlarm": "Alarm Tidak Bersalah", + "falseAlarm": "Alarm Palsu", + "other": "Lainnya", + "isotope": "Isotop", + "secondaryInspection": "Inspeksi Sekunder", + "loggedAdjudications": "Ajudikasi yang Dicatat", + "feedback": "Masukan", + "noNodes": "Tidak Ada Node", + "delete": "Menghapus", + "cancel": "Membatalkan", + "timeRange": "Rentang Waktu", + "viewLane": "LIHAT JALUR", + "eventType": "Jenis Acara", + "nodeSelector": "Pemilih Node", + "laneSelector": "Pemilih Jalur", + "reportType": "Jenis Laporan", + "adjudicationCode": "Kode Ajudikasi", + "isotopes": "Isotop", + "filePaths": "Jalur File", + "occupancyTable": "Tabel Hunian", + "faultTable": "Tabel Kesalahan", + "noEventDataAvailable": "Tidak ada data peristiwa yang tersedia", + "neutronBackgroundCountRate": "Tingkat Jumlah Latar Belakang Neutron", + "maxGammaCountRate": "Tingkat Jumlah Gamma Maks (cps)", + "maxNeutronCountRate": "Laju Jumlah Neutron Maks (cps)", + "speedKph": "Kecepatan (kpj)", + "expand": "memperluas", + "close": "menutup", + "name": "Nama", + "address": "Alamat", + "port": "Pelabuhan", + "csApiEndpoint": "Titik Akhir CS API", + "username": "Nama belakang", + "password": "Kata sandi", + "isSecure": "Aman", + "openDrawer": "laci terbuka", + "openNotifications": "buka notifikasi", + "volume": "Volume", + "startDate": "Tanggal Mulai", + "endDate": "Tanggal Berakhir", + "simpleTable": "meja sederhana", + "user": "Pengguna", + "timestamp": "Stempel waktu", + "secondaryInspectionStatus": "Status Inspeksi Sekunder", + "nodeId": "ID simpul", + "alarm.gamma": "Alarm G", + "alarm.neutron": "Alarm N", + "alarm.gammaNeutron": "Alarm G-N", + "occupancies": "Hunian", + "tamper": "merusak", + "faults.gamma": "Kesalahan G", + "faults.neutron": "Kesalahan N", + "faults": "Kesalahan", + "noVideoAvailable": "Tidak Ada Video yang Tersedia", + "loading": "Memuat...", + "edit": "Sunting", + "back": "Kembali", + "reset": "Mengatur ulang", + "generateReport": "Hasilkan Laporan", + "generatedReport": "Laporan yang Dihasilkan", + "pleaseGenerateReport": "Silakan buat laporan untuk dilihat dan diunduh di sini.", + "readMore": "Baca selengkapnya", + "clickAnywhereToEnableAlarmSound": "Klik di mana saja untuk mengaktifkan suara alarm", + "yourBrowserDoesNotSupportVideoTag": "Browser Anda tidak mendukung tag video.", + "alarmsAndOccupancies": "Alarm dan Hunian", + "alarms": "Alarm", + "allTime": "Sepanjang Waktu", + "monthly": "Bulanan", + "weekly": "Mingguan", + "daily": "Sehari-hari", + "customRange": "Rentang Kustom", + "stateOfHealth": "Keadaan Kesehatan", + "selectAll": "Pilih Semua", + "last24Hours": "24 Jam Terakhir", + "last7Days": "7 Hari Terakhir", + "last30Days": "30 Hari Terakhir", + "thisMonth": "Bulan ini", + "rdsSiteReport": "Laporan Situs RDS", + "laneReport": "Laporan Jalur", + "adjudicationReport": "Laporan Ajudikasi", + "eventReport": "Laporan Acara", + "generatingReport": "Membuat Laporan...", + "generateReportBtn": "Hasilkan Laporan" +} diff --git a/src/locales/it.json b/src/locales/it.json new file mode 100644 index 00000000..9c9d8bf6 --- /dev/null +++ b/src/locales/it.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Dashboard", + "events": "Eventi", + "map": "Mappa", + "national": "Nazionale", + "reportGenerator": "Generatore di Report", + "servers": "Server", + "alarmVolume": "Volume Allarme", + "laneStatus": "Stato Corsia", + "laneId": "ID Corsia", + "occupancyId": "ID Occupazione", + "startTime": "Ora Inizio", + "endTime": "Ora Fine", + "maxGamma": "Max Gamma (cps)", + "maxNeutron": "Max Neutrone (cps)", + "status": "Stato", + "adjudicated": "Giudicato", + "details": "Dettagli", + "yes": "Sì", + "no": "No", + "eventDetails": "Dettagli Evento", + "addServer": "Aggiungi Nuovo Server", + "editNode": "Modifica Nodo", + "nodes": "Nodi", + "exportPdf": "Esporta come PDF", + "adjudicationTitle": "Giudizio", + "adjudicationReportForm": "Modulo Rapporto Giudizio", + "vehicleId": "ID Veicolo", + "notes": "Note", + "uploadFiles": "Carica File", + "submit": "Invia", + "adjudicationSuccess": "Giudizio inviato con successo per ID Occupazione: ", + "adjudicationFail": "Invio giudizio fallito.", + "selectValidCode": "Seleziona un codice di giudizio valido prima di inviare.", + "errorLoadingObservation": "Errore nel caricamento dell'osservazione.", + "cannotFindObservation": "Impossibile trovare l'osservazione da giudicare. Riprova.", + "statusOnline": "Online", + "statusOffline": "Offline", + "statusTamper": "Manomissione", + "statusFault": "Guasto", + "statusClear": "Libero", + "statusGamma": "Gamma", + "statusNeutron": "Neutrone", + "statusGammaNeutron": "Gamma e Neutrone", + "statusNone": "Nessuno", + "code1": "Codice 1: Contrabbando Trovato", + "code2": "Codice 2: Altro", + "code3": "Codice 3: Isotopo Medico Trovato", + "code4": "Codice 4: Materiale NORM Trovato", + "code5": "Codice 5: Spedizione Dichiarata di Materiale Radioattivo", + "code6": "Codice 6: Ispezione Fisica Negativa", + "code7": "Codice 7: RIID/ASP Indica Solo Fondo", + "code8": "Codice 8: Altro", + "code9": "Codice 9: Attività Autorizzata di Test, Manutenzione o Addestramento", + "code10": "Codice 10: Attività Non Autorizzata", + "code11": "Codice 11: Altro", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Vero allarme", + "innocentAlarm": "Allarme innocente", + "falseAlarm": "Falso allarme", + "other": "Altro", + "isotope": "Isotopo", + "secondaryInspection": "Ispezione secondaria", + "loggedAdjudications": "Sentenze registrate", + "feedback": "Feedback", + "noNodes": "Nessun nodo", + "delete": "Eliminare", + "cancel": "Cancellare", + "timeRange": "Intervallo di tempo", + "viewLane": "VISUALIZZA CORSIA", + "eventType": "Tipo di evento", + "nodeSelector": "Selettore di nodo", + "laneSelector": "Selettore di corsia", + "reportType": "Tipo di rapporto", + "adjudicationCode": "Codice di aggiudicazione", + "isotopes": "Isotopi", + "filePaths": "Percorsi file", + "occupancyTable": "Tabella di occupazione", + "faultTable": "Tabella dei guasti", + "noEventDataAvailable": "Nessun dato sugli eventi disponibile", + "neutronBackgroundCountRate": "Tasso di conteggio del fondo neutronico", + "maxGammaCountRate": "Velocità massima di conteggio gamma (cps)", + "maxNeutronCountRate": "Velocità massima di conteggio dei neutroni (cps)", + "speedKph": "Velocità (km/h)", + "expand": "espandere", + "close": "vicino", + "name": "Nome", + "address": "Indirizzo", + "port": "Porta", + "csApiEndpoint": "Endpoint API CS", + "username": "Nome utente", + "password": "Password", + "isSecure": "È sicuro", + "openDrawer": "cassetto aperto", + "openNotifications": "notifiche aperte", + "volume": "Volume", + "startDate": "Data di inizio", + "endDate": "Data di fine", + "simpleTable": "tavolo semplice", + "user": "Utente", + "timestamp": "Timestamp", + "secondaryInspectionStatus": "Stato dell'ispezione secondaria", + "nodeId": "ID del nodo", + "alarm.gamma": "Allarme gamma", + "alarm.neutron": "Allarme neutroni", + "alarm.gammaNeutron": "Allarme neutroni gamma", + "occupancies": "Occupazioni", + "tamper": "Manomettere", + "faults.gamma": "Difetti gamma", + "faults.neutron": "Difetti neutronici", + "faults": "Difetti", + "noVideoAvailable": "Nessun video disponibile", + "loading": "Caricamento...", + "edit": "Modificare", + "back": "Indietro", + "reset": "Reset", + "generateReport": "Genera un rapporto", + "generatedReport": "Rapporto generato", + "pleaseGenerateReport": "Genera un report per visualizzarlo e scaricarlo qui.", + "readMore": "Per saperne di più", + "clickAnywhereToEnableAlarmSound": "Fare clic in un punto qualsiasi per attivare il suono dell'allarme", + "yourBrowserDoesNotSupportVideoTag": "Il tuo browser non supporta il tag video.", + "alarmsAndOccupancies": "Allarmi e occupazioni", + "alarms": "Allarmi", + "allTime": "Tutto il tempo", + "monthly": "Mensile", + "weekly": "Settimanale", + "daily": "Quotidiano", + "customRange": "Gamma personalizzata", + "stateOfHealth": "Stato di salute", + "selectAll": "Seleziona tutto", + "last24Hours": "Ultime 24 ore", + "last7Days": "Ultimi 7 giorni", + "last30Days": "Ultimi 30 giorni", + "thisMonth": "Questo mese", + "rdsSiteReport": "Rapporto sul sito RDS", + "laneReport": "Rapporto sulla corsia", + "adjudicationReport": "Rapporto di aggiudicazione", + "eventReport": "Rapporto sugli eventi", + "generatingReport": "Generazione rapporto...", + "generateReportBtn": "Genera rapporto" +} diff --git a/src/locales/ja.json b/src/locales/ja.json new file mode 100644 index 00000000..85ccd861 --- /dev/null +++ b/src/locales/ja.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "ダッシュボード", + "events": "イベント", + "map": "地図", + "national": "全国概要", + "reportGenerator": "レポート作成", + "servers": "サーバー", + "alarmVolume": "アラーム音量", + "laneStatus": "レーン状態", + "laneId": "レーンID", + "occupancyId": "通過ID", + "startTime": "開始時刻", + "endTime": "終了時刻", + "maxGamma": "最大ガンマ線計数率 (cps)", + "maxNeutron": "最大中性子線計数率 (cps)", + "status": "ステータス", + "adjudicated": "判定済み", + "details": "詳細", + "yes": "はい", + "no": "いいえ", + "eventDetails": "イベント詳細", + "addServer": "新規サーバー追加", + "editNode": "ノード編集", + "nodes": "ノード", + "exportPdf": "PDFとしてエクスポート", + "adjudicationTitle": "判定", + "adjudicationReportForm": "判定報告フォーム", + "vehicleId": "車両ID", + "notes": "備考", + "uploadFiles": "ファイルアップロード", + "submit": "送信", + "adjudicationSuccess": "判定完了。通過ID: ", + "adjudicationFail": "判定の送信に失敗しました。", + "selectValidCode": "送信する前に有効な判定コードを選択してください。", + "errorLoadingObservation": "観測データの読み込みエラー。", + "cannotFindObservation": "判定対象の観測データが見つかりません。再試行してください。", + "statusOnline": "オンライン", + "statusOffline": "オフライン", + "statusTamper": "改ざん検知", + "statusFault": "障害", + "statusClear": "クリア", + "statusGamma": "ガンマ線", + "statusNeutron": "中性子線", + "statusGammaNeutron": "ガンマ線および中性子線", + "statusNone": "なし", + "code1": "コード1: 禁制品発見", + "code2": "コード2: その他", + "code3": "コード3: 医療用アイソトープ発見", + "code4": "コード4: NORM(自然起源放射性物質)発見", + "code5": "コード5: 申告済み放射性物質輸送", + "code6": "コード6: 物理検査陰性", + "code7": "コード7: RIID/ASPはバックグラウンドのみ表示", + "code8": "コード8: その他", + "code9": "コード9: 許可されたテスト、保守、または訓練活動", + "code10": "コード10: 許可されていない活動", + "code11": "コード11: その他", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "リアルアラーム", + "innocentAlarm": "イノセントアラーム", + "falseAlarm": "誤報", + "other": "他の", + "isotope": "アイソトープ", + "secondaryInspection": "二次検査", + "loggedAdjudications": "記録された判決", + "feedback": "フィードバック", + "noNodes": "ノードなし", + "delete": "消去", + "cancel": "キャンセル", + "timeRange": "時間範囲", + "viewLane": "ビューレーン", + "eventType": "イベントの種類", + "nodeSelector": "ノードセレクター", + "laneSelector": "レーンセレクター", + "reportType": "レポートの種類", + "adjudicationCode": "裁定コード", + "isotopes": "同位体", + "filePaths": "ファイルパス", + "occupancyTable": "占有率表", + "faultTable": "障害テーブル", + "noEventDataAvailable": "利用可能なイベント データがありません", + "neutronBackgroundCountRate": "中性子バックグラウンド計数率", + "maxGammaCountRate": "最大ガンマ カウント レート (cps)", + "maxNeutronCountRate": "最大中性子計数率 (cps)", + "speedKph": "速度(時速キロ)", + "expand": "拡大する", + "close": "近い", + "name": "名前", + "address": "住所", + "port": "ポート", + "csApiEndpoint": "CS APIエンドポイント", + "username": "ユーザー名", + "password": "パスワード", + "isSecure": "安全です", + "openDrawer": "引き出しを開ける", + "openNotifications": "通知を開く", + "volume": "音量", + "startDate": "開始日", + "endDate": "終了日", + "simpleTable": "シンプルなテーブル", + "user": "ユーザー", + "timestamp": "タイムスタンプ", + "secondaryInspectionStatus": "二次検査状況", + "nodeId": "ノードID", + "alarm.gamma": "ガンマアラーム", + "alarm.neutron": "中性子警報", + "alarm.gammaNeutron": "ガンマ中性子警報", + "occupancies": "占有率", + "tamper": "タンパー", + "faults.gamma": "ガンマ線欠陥", + "faults.neutron": "中性子断層", + "faults": "故障", + "noVideoAvailable": "利用可能なビデオがありません", + "loading": "読み込み中...", + "edit": "編集", + "back": "戻る", + "reset": "リセット", + "generateReport": "レポートの生成", + "generatedReport": "生成されたレポート", + "pleaseGenerateReport": "ここでレポートを生成して表示およびダウンロードしてください。", + "readMore": "続きを読む", + "clickAnywhereToEnableAlarmSound": "任意の場所をクリックしてアラーム音を有効にします", + "yourBrowserDoesNotSupportVideoTag": "お使いのブラウザはvideoタグをサポートしていません。", + "alarmsAndOccupancies": "アラームと占有状況", + "alarms": "アラーム", + "allTime": "オールタイム", + "monthly": "毎月", + "weekly": "毎週", + "daily": "毎日", + "customRange": "カスタム範囲", + "stateOfHealth": "健康状態", + "selectAll": "すべて選択", + "last24Hours": "過去 24 時間", + "last7Days": "過去 7 日間", + "last30Days": "過去 30 日間", + "thisMonth": "今月", + "rdsSiteReport": "RDSサイトレポート", + "laneReport": "レーンレポート", + "adjudicationReport": "裁定報告書", + "eventReport": "イベントレポート", + "generatingReport": "レポートを生成中...", + "generateReportBtn": "レポートの生成" +} diff --git a/src/locales/ko.json b/src/locales/ko.json new file mode 100644 index 00000000..6986e825 --- /dev/null +++ b/src/locales/ko.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "대시보드", + "events": "이벤트", + "map": "지도", + "national": "전국 현황", + "reportGenerator": "보고서 생성기", + "servers": "서버", + "alarmVolume": "알람 볼륨", + "laneStatus": "차선 상태", + "laneId": "차선 ID", + "occupancyId": "점유 ID", + "startTime": "시작 시간", + "endTime": "종료 시간", + "maxGamma": "최대 감마 계수율 (cps)", + "maxNeutron": "최대 중성자 계수율 (cps)", + "status": "상태", + "adjudicated": "판정됨", + "details": "세부 정보", + "yes": "예", + "no": "아니요", + "eventDetails": "이벤트 세부 정보", + "addServer": "새 서버 추가", + "editNode": "노드 편집", + "nodes": "노드", + "exportPdf": "PDF로 내보내기", + "adjudicationTitle": "판정", + "adjudicationReportForm": "판정 보고서 양식", + "vehicleId": "차량 ID", + "notes": "비고", + "uploadFiles": "파일 업로드", + "submit": "제출", + "adjudicationSuccess": "판정 성공, 점유 ID: ", + "adjudicationFail": "판정 제출 실패.", + "selectValidCode": "제출하기 전에 유효한 판정 코드를 선택하십시오.", + "errorLoadingObservation": "관측 데이터 로드 오류.", + "cannotFindObservation": "판정할 관측 데이터를 찾을 수 없습니다. 다시 시도하십시오.", + "statusOnline": "온라인", + "statusOffline": "오프라인", + "statusTamper": "변조 감지", + "statusFault": "결함", + "statusClear": "해제", + "statusGamma": "감마", + "statusNeutron": "중성자", + "statusGammaNeutron": "감마 및 중성자", + "statusNone": "없음", + "code1": "코드 1: 금지품 발견", + "code2": "코드 2: 기타", + "code3": "코드 3: 의료용 동위원소 발견", + "code4": "코드 4: NORM 물질 발견", + "code5": "코드 5: 신고된 방사성 물질 운송", + "code6": "코드 6: 물리적 검사 음성", + "code7": "코드 7: RIID/ASP가 배경 방사선만 표시함", + "code8": "코드 8: 기타", + "code9": "코드 9: 승인된 테스트, 유지 보수 또는 훈련 활동", + "code10": "코드 10: 승인되지 않은 활동", + "code11": "코드 11: 기타", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "실제 알람", + "innocentAlarm": "무고한 경보", + "falseAlarm": "허위 경보", + "other": "다른", + "isotope": "동위 원소", + "secondaryInspection": "2차 검사", + "loggedAdjudications": "기록된 판결", + "feedback": "피드백", + "noNodes": "노드 없음", + "delete": "삭제", + "cancel": "취소", + "timeRange": "시간 범위", + "viewLane": "차선 보기", + "eventType": "이벤트 유형", + "nodeSelector": "노드 선택기", + "laneSelector": "차선 선택기", + "reportType": "보고서 유형", + "adjudicationCode": "판정 코드", + "isotopes": "동위원소", + "filePaths": "파일 경로", + "occupancyTable": "점유 테이블", + "faultTable": "결함 테이블", + "noEventDataAvailable": "사용 가능한 이벤트 데이터가 없습니다.", + "neutronBackgroundCountRate": "중성자 배경 카운트 비율", + "maxGammaCountRate": "최대 감마 카운트 속도(cps)", + "maxNeutronCountRate": "최대 중성자 수 비율(cps)", + "speedKph": "속도(km/h)", + "expand": "확장하다", + "close": "닫다", + "name": "이름", + "address": "주소", + "port": "포트", + "csApiEndpoint": "CS API 엔드포인트", + "username": "사용자 이름", + "password": "비밀번호", + "isSecure": "안전하다", + "openDrawer": "열린 서랍", + "openNotifications": "알림 열기", + "volume": "용량", + "startDate": "시작일", + "endDate": "종료일", + "simpleTable": "간단한 테이블", + "user": "사용자", + "timestamp": "타임스탬프", + "secondaryInspectionStatus": "2차검사 현황", + "nodeId": "노드 ID", + "alarm.gamma": "감마 경보", + "alarm.neutron": "중성자 경보", + "alarm.gammaNeutron": "감마 중성자 경보", + "occupancies": "점유", + "tamper": "탬퍼", + "faults.gamma": "감마 결함", + "faults.neutron": "중성자 단층", + "faults": "결함", + "noVideoAvailable": "사용할 수 있는 비디오가 없습니다.", + "loading": "로드 중...", + "edit": "편집하다", + "back": "뒤쪽에", + "reset": "다시 놓기", + "generateReport": "보고서 생성", + "generatedReport": "생성된 보고서", + "pleaseGenerateReport": "여기에서 보고 다운로드하려면 보고서를 생성하세요.", + "readMore": "더 읽어보세요", + "clickAnywhereToEnableAlarmSound": "알람 소리를 활성화하려면 아무 곳이나 클릭하세요.", + "yourBrowserDoesNotSupportVideoTag": "귀하의 브라우저는 video 태그를 지원하지 않습니다.", + "alarmsAndOccupancies": "경보 및 점유", + "alarms": "알람", + "allTime": "모든 시간", + "monthly": "월간 간행물", + "weekly": "주간", + "daily": "일일", + "customRange": "맞춤 범위", + "stateOfHealth": "건강 상태", + "selectAll": "모두 선택", + "last24Hours": "지난 24시간", + "last7Days": "지난 7일", + "last30Days": "지난 30일", + "thisMonth": "이번 달", + "rdsSiteReport": "RDS 사이트 보고서", + "laneReport": "차선 보고", + "adjudicationReport": "판결 보고서", + "eventReport": "이벤트 보고서", + "generatingReport": "보고서 생성 중...", + "generateReportBtn": "보고서 생성" +} diff --git a/src/locales/lv.json b/src/locales/lv.json new file mode 100644 index 00000000..209afcc6 --- /dev/null +++ b/src/locales/lv.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Informācijas panelis", + "events": "Notikumi", + "map": "Karte", + "national": "Valsts", + "reportGenerator": "Pārskatu ģenerators", + "servers": "Serveri", + "alarmVolume": "Trauksmes skaļums", + "laneStatus": "Joslas statuss", + "laneId": "Joslas ID", + "occupancyId": "Aizņemtības ID", + "startTime": "Sākuma laiks", + "endTime": "Beigu laiks", + "maxGamma": "Maksimālā gamma (cps)", + "maxNeutron": "Maksimālais neitrons (cps)", + "status": "Statuss", + "adjudicated": "Izlemts", + "details": "Sīkāka informācija", + "yes": "Jā", + "no": "Nē", + "eventDetails": "Notikuma informācija", + "addServer": "Pievienot jaunu serveri", + "editNode": "Rediģēt mezglu", + "nodes": "Mezgli", + "exportPdf": "Eksportēt kā PDF", + "adjudicationTitle": "Lēmums", + "adjudicationReportForm": "Lēmuma ziņojuma veidlapa", + "vehicleId": "Transportlīdzekļa ID", + "notes": "Piezīmes", + "uploadFiles": "Augšupielādēt failus", + "submit": "Iesniegt", + "adjudicationSuccess": "Lēmums veiksmīgs aizņemtības ID: ", + "adjudicationFail": "Neizdevās iesniegt lēmumu.", + "selectValidCode": "Lūdzu, atlasiet derīgu lēmuma kodu pirms iesniegšanas.", + "errorLoadingObservation": "Kļūda ielādējot novērojumu.", + "cannotFindObservation": "Nevar atrast novērojumu, lai pieņemtu lēmumu. Lūdzu, mēģiniet vēlreiz.", + "statusOnline": "Tiešsaistē", + "statusOffline": "Bezsaistē", + "statusTamper": "Sabotāža", + "statusFault": "Kļūme", + "statusClear": "Tīrs", + "statusGamma": "Gamma", + "statusNeutron": "Neitrons", + "statusGammaNeutron": "Gamma un Neitrons", + "statusNone": "Nav", + "code1": "Kods 1: Atrasta kontrabanda", + "code2": "Kods 2: Cits", + "code3": "Kods 3: Atrasts medicīniskais izotops", + "code4": "Kods 4: Atrasts NORM materiāls", + "code5": "Kods 5: Deklarēts radioaktīvā materiāla sūtījums", + "code6": "Kods 6: Fiziskā pārbaude negatīva", + "code7": "Kods 7: RIID/ASP norāda tikai fonu", + "code8": "Kods 8: Cits", + "code9": "Kods 9: Autorizēta pārbaude, apkope vai apmācība", + "code10": "Kods 10: Neatļauta darbība", + "code11": "Kods 11: Cits", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Īsta trauksme", + "innocentAlarm": "Nevainīgs trauksmes signāls", + "falseAlarm": "Viltus trauksme", + "other": "Cits", + "isotope": "Izotops", + "secondaryInspection": "Sekundārā pārbaude", + "loggedAdjudications": "Reģistrētie spriedumi", + "feedback": "Atsauksmes", + "noNodes": "Nav mezglu", + "delete": "Dzēst", + "cancel": "Atcelt", + "timeRange": "Laika diapazons", + "viewLane": "SKATĪJUMA JOSLA", + "eventType": "Pasākuma veids", + "nodeSelector": "Mezglu atlasītājs", + "laneSelector": "Joslas atlasītājs", + "reportType": "Pārskata veids", + "adjudicationCode": "Sprieduma kodekss", + "isotopes": "Izotopi", + "filePaths": "FilePaths", + "occupancyTable": "Noslogotības tabula", + "faultTable": "Kļūdu tabula", + "noEventDataAvailable": "Notikuma dati nav pieejami", + "neutronBackgroundCountRate": "Neitronu fona skaitīšanas ātrums", + "maxGammaCountRate": "Maksimālais gamma skaitīšanas ātrums (cps)", + "maxNeutronCountRate": "Maksimālais neitronu skaitīšanas ātrums (cps)", + "speedKph": "Ātrums (km/h)", + "expand": "paplašināt", + "close": "aizveriet", + "name": "Vārds", + "address": "Adrese", + "port": "Osta", + "csApiEndpoint": "CS API galapunkts", + "username": "Lietotājvārds", + "password": "Parole", + "isSecure": "Ir Drošs", + "openDrawer": "atveriet atvilktni", + "openNotifications": "atvērt paziņojumus", + "volume": "Skaļums", + "startDate": "Sākuma datums", + "endDate": "Beigu datums", + "simpleTable": "vienkāršs galds", + "user": "Lietotājs", + "timestamp": "Laika zīmogs", + "secondaryInspectionStatus": "Sekundārās pārbaudes statuss", + "nodeId": "Mezgla ID", + "alarm.gamma": "G trauksme", + "alarm.neutron": "Neitronu trauksme", + "alarm.gammaNeutron": "Gamma neitronu trauksme", + "occupancies": "Noslogojums", + "tamper": "Sabojāt", + "faults.gamma": "G defekti", + "faults.neutron": "Neitronu defekti", + "faults": "Kļūdas", + "noVideoAvailable": "Nav pieejams neviens video", + "loading": "Notiek ielāde...", + "edit": "Rediģēt", + "back": "Atpakaļ", + "reset": "Atiestatīt", + "generateReport": "Izveidojiet pārskatu", + "generatedReport": "Izveidots ziņojums", + "pleaseGenerateReport": "Lūdzu, izveidojiet pārskatu, lai to skatītu un lejupielādētu šeit.", + "readMore": "Lasīt vairāk", + "clickAnywhereToEnableAlarmSound": "Noklikšķiniet jebkurā vietā, lai iespējotu modinātāja skaņu", + "yourBrowserDoesNotSupportVideoTag": "Jūsu pārlūkprogramma neatbalsta video tagu.", + "alarmsAndOccupancies": "Signalizācijas un aizņemtības", + "alarms": "Signalizācijas", + "allTime": "Visu laiku", + "monthly": "Ikmēneša", + "weekly": "Iknedēļas", + "daily": "Ikdienas", + "customRange": "Pielāgots diapazons", + "stateOfHealth": "Veselības stāvoklis", + "selectAll": "Atlasiet visu", + "last24Hours": "Pēdējās 24 stundas", + "last7Days": "Pēdējās 7 dienas", + "last30Days": "Pēdējās 30 dienas", + "thisMonth": "Šomēnes", + "rdsSiteReport": "RDS vietnes ziņojums", + "laneReport": "Joslu ziņojums", + "adjudicationReport": "Spriešanas ziņojums", + "eventReport": "Notikuma atskaite", + "generatingReport": "Notiek pārskata ģenerēšana...", + "generateReportBtn": "Ģenerēt atskaiti" +} diff --git a/src/locales/pa-PK.json b/src/locales/pa-PK.json new file mode 100644 index 00000000..41b0292d --- /dev/null +++ b/src/locales/pa-PK.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR (pa-PK)", + "dashboard": "ڈیش بورڈ", + "events": "واقعات", + "map": "نقشہ", + "national": "قومی", + "reportGenerator": "رپورٹ جنریٹر", + "servers": "سرورز", + "alarmVolume": "الارم والیوم", + "laneStatus": "لین کی حیثیت", + "laneId": "لین آئی ڈی", + "occupancyId": "آکوپینسی آئی ڈی", + "startTime": "شروع ہونے کا وقت", + "endTime": "ختم ہونے کا وقت", + "maxGamma": "زیادہ سے زیادہ گاما (cps)", + "maxNeutron": "زیادہ سے زیادہ نیوٹران (cps)", + "status": "حیثیت", + "adjudicated": "فیصلہ شدہ", + "details": "تفصیلات", + "yes": "ہاں", + "no": "نہیں", + "eventDetails": "واقعہ کی تفصیلات", + "addServer": "نیا سرور شامل کریں", + "editNode": "نوڈ میں ترمیم کریں", + "nodes": "نوڈس", + "exportPdf": "پی ڈی ایف کے طور پر ایکسپورٹ کریں", + "adjudicationTitle": "فیصلہ", + "adjudicationReportForm": "فیصلہ رپورٹ فارم", + "vehicleId": "گاڑی کی آئی ڈی", + "notes": "نوٹس", + "uploadFiles": "فائلیں اپ لوڈ کریں", + "submit": "جمع کروائیں", + "adjudicationSuccess": "کے لئے فیصلہ کامیاب: ", + "adjudicationFail": "فیصلہ جمع کرانے میں ناکام۔", + "selectValidCode": "براہ کرم جمع کرنے سے پہلے ایک درست کوڈ منتخب کریں۔", + "errorLoadingObservation": "مشاہدہ لوڈ کرنے میں خرابی۔", + "cannotFindObservation": "فیصلہ کرنے کے لئے مشاہدہ نہیں مل سکا۔ براہ کرم دوبارہ کوشش کریں۔", + "statusOnline": "آن لائن", + "statusOffline": "آف لائن", + "statusTamper": "چھیڑ چھاڑ", + "statusFault": "خرابی", + "statusClear": "صاف", + "statusGamma": "گاما", + "statusNeutron": "نیوٹران", + "statusGammaNeutron": "گاما اور نیوٹران", + "statusNone": "کوئی نہیں", + "code1": "کوڈ 1: ممنوعہ مواد ملا", + "code2": "کوڈ 2: دیگر", + "code3": "کوڈ 3: طبی آاسوٹوپ ملا", + "code4": "کوڈ 4: NORM ملا", + "code5": "کوڈ 5: تابکار مواد کی اعلان کردہ شپمنٹ", + "code6": "کوڈ 6: جسمانی معائنہ منفی", + "code7": "کوڈ 7: RIID/ASP صرف پس منظر کی نشاندہی کرتا ہے", + "code8": "کوڈ 8: دیگر", + "code9": "کوڈ 9: مجاز ٹیسٹ، بحالی، یا تربیتی سرگرمی", + "code10": "کوڈ 10: غیر مجاز سرگرمی", + "code11": "کوڈ 11: دیگر", + "cps": "ਸੀ.ਪੀ.ਐਸ", + "nsigma": "NSigma", + "realAlarm": "ਅਸਲ ਅਲਾਰਮ", + "innocentAlarm": "ਨਿਰਦੋਸ਼ ਅਲਾਰਮ", + "falseAlarm": "ਗਲਤ ਅਲਾਰਮ", + "other": "ਹੋਰ", + "isotope": "ਆਈਸੋਟੋਪ", + "secondaryInspection": "ਸੈਕੰਡਰੀ ਨਿਰੀਖਣ", + "loggedAdjudications": "ਲੌਗ ਕੀਤੇ ਫੈਸਲੇ", + "feedback": "ਫੀਡਬੈਕ", + "noNodes": "ਕੋਈ ਨੋਡ ਨਹੀਂ", + "delete": "ਮਿਟਾਓ", + "cancel": "ਰੱਦ ਕਰੋ", + "timeRange": "ਸਮਾਂ ਸੀਮਾ", + "viewLane": "ਲੇਨ ਦੇਖੋ", + "eventType": "ਘਟਨਾ ਦੀ ਕਿਸਮ", + "nodeSelector": "ਨੋਡ ਚੋਣਕਾਰ", + "laneSelector": "ਲੇਨ ਚੋਣਕਾਰ", + "reportType": "ਰਿਪੋਰਟ ਦੀ ਕਿਸਮ", + "adjudicationCode": "ਨਿਰਣਾਇਕ ਕੋਡ", + "isotopes": "ਆਈਸੋਟੋਪ", + "filePaths": "ਫਾਈਲਪਾਥ", + "occupancyTable": "ਆਕੂਪੈਂਸੀ ਟੇਬਲ", + "faultTable": "ਨੁਕਸ ਸਾਰਣੀ", + "noEventDataAvailable": "ਕੋਈ ਇਵੈਂਟ ਡਾਟਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ", + "neutronBackgroundCountRate": "ਨਿਊਟ੍ਰੋਨ ਬੈਕਗ੍ਰਾਊਂਡ ਕਾਉਂਟ ਰੇਟ", + "maxGammaCountRate": "ਅਧਿਕਤਮ ਗਾਮਾ ਗਿਣਤੀ ਦਰ (cps)", + "maxNeutronCountRate": "ਅਧਿਕਤਮ ਨਿਊਟ੍ਰੋਨ ਕਾਉਂਟ ਰੇਟ (cps)", + "speedKph": "ਗਤੀ (kph)", + "expand": "ਫੈਲਾਓ", + "close": "ਬੰਦ ਕਰੋ", + "name": "ਨਾਮ", + "address": "ਪਤਾ", + "port": "ਪੋਰਟ", + "csApiEndpoint": "CS API ਅੰਤਮ ਬਿੰਦੂ", + "username": "ਯੂਜ਼ਰਨੇਮ", + "password": "ਪਾਸਵਰਡ", + "isSecure": "ਸੁਰੱਖਿਅਤ ਹੈ", + "openDrawer": "ਖੁੱਲ੍ਹਾ ਦਰਾਜ਼", + "openNotifications": "ਸੂਚਨਾਵਾਂ ਖੋਲ੍ਹੋ", + "volume": "ਵਾਲੀਅਮ", + "startDate": "ਤਾਰੀਖ ਸ਼ੁਰੂ", + "endDate": "ਸਮਾਪਤੀ ਮਿਤੀ", + "simpleTable": "ਸਧਾਰਨ ਸਾਰਣੀ", + "user": "ਉਪਭੋਗਤਾ", + "timestamp": "ਟਾਈਮਸਟੈਂਪ", + "secondaryInspectionStatus": "ਸੈਕੰਡਰੀ ਨਿਰੀਖਣ ਸਥਿਤੀ", + "nodeId": "ਨੋਡ ਆਈ.ਡੀ", + "alarm.gamma": "ਗਾਮਾ ਅਲਾਰਮ", + "alarm.neutron": "ਨਿਊਟ੍ਰੋਨ ਅਲਾਰਮ", + "alarm.gammaNeutron": "ਗਾਮਾ ਨਿਊਟ੍ਰੋਨ ਅਲਾਰਮ", + "occupancies": "ਕਿੱਤੇ", + "tamper": "ਛੇੜਛਾੜ", + "faults.gamma": "ਗਾਮਾ ਨੁਕਸ", + "faults.neutron": "ਨਿਊਟ੍ਰੋਨ ਨੁਕਸ", + "faults": "ਨੁਕਸ", + "noVideoAvailable": "ਕੋਈ ਵੀਡੀਓ ਉਪਲਬਧ ਨਹੀਂ ਹੈ", + "loading": "ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...", + "edit": "ਸੰਪਾਦਿਤ ਕਰੋ", + "back": "ਪਿੱਛੇ", + "reset": "ਰੀਸੈਟ ਕਰੋ", + "generateReport": "ਇੱਕ ਰਿਪੋਰਟ ਤਿਆਰ ਕਰੋ", + "generatedReport": "ਤਿਆਰ ਕੀਤੀ ਰਿਪੋਰਟ", + "pleaseGenerateReport": "ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਦੇਖਣ ਅਤੇ ਇੱਥੇ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਇੱਕ ਰਿਪੋਰਟ ਤਿਆਰ ਕਰੋ।", + "readMore": "ਹੋਰ ਪੜ੍ਹੋ", + "clickAnywhereToEnableAlarmSound": "ਅਲਾਰਮ ਧੁਨੀ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਲਈ ਕਿਤੇ ਵੀ ਕਲਿੱਕ ਕਰੋ", + "yourBrowserDoesNotSupportVideoTag": "ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ਰ ਵੀਡੀਓ ਟੈਗ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ।", + "alarmsAndOccupancies": "ਅਲਾਰਮ ਅਤੇ ਆਕੂਪੈਂਸੀਜ਼", + "alarms": "ਅਲਾਰਮ", + "allTime": "ਹਰ ਸਮੇਂ", + "monthly": "ਮਹੀਨਾਵਾਰ", + "weekly": "ਹਫ਼ਤਾਵਾਰੀ", + "daily": "ਰੋਜ਼ਾਨਾ", + "customRange": "ਕਸਟਮ ਰੇਂਜ", + "stateOfHealth": "ਸਿਹਤ ਦੀ ਸਥਿਤੀ", + "selectAll": "ਸਭ ਚੁਣੋ", + "last24Hours": "ਪਿਛਲੇ 24 ਘੰਟੇ", + "last7Days": "ਪਿਛਲੇ 7 ਦਿਨ", + "last30Days": "ਪਿਛਲੇ 30 ਦਿਨ", + "thisMonth": "ਇਸ ਮਹੀਨੇ", + "rdsSiteReport": "RDS ਸਾਈਟ ਰਿਪੋਰਟ", + "laneReport": "ਲੇਨ ਰਿਪੋਰਟ", + "adjudicationReport": "ਨਿਰਣਾਇਕ ਰਿਪੋਰਟ", + "eventReport": "ਘਟਨਾ ਦੀ ਰਿਪੋਰਟ", + "generatingReport": "ਰਿਪੋਰਟ ਤਿਆਰ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ...", + "generateReportBtn": "ਰਿਪੋਰਟ ਤਿਆਰ ਕਰੋ" +} diff --git a/src/locales/pt.json b/src/locales/pt.json new file mode 100644 index 00000000..2a9024e6 --- /dev/null +++ b/src/locales/pt.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Painel de Controle", + "events": "Eventos", + "map": "Mapa", + "national": "Nacional", + "reportGenerator": "Gerador de Relatórios", + "servers": "Servidores", + "alarmVolume": "Volume do Alarme", + "laneStatus": "Status da Faixa", + "laneId": "ID da Faixa", + "occupancyId": "ID de Ocupação", + "startTime": "Hora de Início", + "endTime": "Hora de Término", + "maxGamma": "Gama Máx (cps)", + "maxNeutron": "Nêutron Máx (cps)", + "status": "Status", + "adjudicated": "Julgado", + "details": "Detalhes", + "yes": "Sim", + "no": "Não", + "eventDetails": "Detalhes do Evento", + "addServer": "Adicionar Novo Servidor", + "editNode": "Editar Nó", + "nodes": "Nós", + "exportPdf": "Exportar como PDF", + "adjudicationTitle": "Julgamento", + "adjudicationReportForm": "Formulário de Relatório de Julgamento", + "vehicleId": "ID do Veículo", + "notes": "Notas", + "uploadFiles": "Enviar Arquivos", + "submit": "Enviar", + "adjudicationSuccess": "Julgamento bem-sucedido para ID de Ocupação: ", + "adjudicationFail": "Falha ao enviar julgamento.", + "selectValidCode": "Por favor, selecione um código de julgamento válido antes de enviar.", + "errorLoadingObservation": "Erro ao carregar observação.", + "cannotFindObservation": "Não foi possível encontrar a observação para julgar. Por favor, tente novamente.", + "statusOnline": "Online", + "statusOffline": "Offline", + "statusTamper": "Violação", + "statusFault": "Falha", + "statusClear": "Limpo", + "statusGamma": "Gama", + "statusNeutron": "Nêutron", + "statusGammaNeutron": "Gama e Nêutron", + "statusNone": "Nenhum", + "code1": "Código 1: Contrabando Encontrado", + "code2": "Código 2: Outro", + "code3": "Código 3: Isótopo Médico Encontrado", + "code4": "Código 4: Material NORM Encontrado", + "code5": "Código 5: Remessa Declarada de Material Radioativo", + "code6": "Código 6: Inspeção Física Negativa", + "code7": "Código 7: RIID/ASP Indica Apenas Fundo", + "code8": "Código 8: Outro", + "code9": "Código 9: Atividade Autorizada de Teste, Manutenção ou Treinamento", + "code10": "Código 10: Atividade Não Autorizada", + "code11": "Código 11: Outro", + "cps": "CPS", + "nsigma": "Nsigma", + "realAlarm": "Alarme real", + "innocentAlarm": "Alarme inocente", + "falseAlarm": "Alarme falso", + "other": "Outro", + "isotope": "Isótopo", + "secondaryInspection": "Inspeção Secundária", + "loggedAdjudications": "Julgamentos registrados", + "feedback": "Opinião", + "noNodes": "Sem nós", + "delete": "Excluir", + "cancel": "Cancelar", + "timeRange": "Intervalo de tempo", + "viewLane": "VER PISTA", + "eventType": "Tipo de Evento", + "nodeSelector": "Seletor de nós", + "laneSelector": "Seletor de pista", + "reportType": "Tipo de relatório", + "adjudicationCode": "Código de Adjudicação", + "isotopes": "Isótopos", + "filePaths": "Caminhos de arquivos", + "occupancyTable": "Tabela de Ocupação", + "faultTable": "Tabela de falhas", + "noEventDataAvailable": "Nenhum dado de evento disponível", + "neutronBackgroundCountRate": "Taxa de contagem de fundo de nêutrons", + "maxGammaCountRate": "Taxa máxima de contagem gama (cps)", + "maxNeutronCountRate": "Taxa máxima de contagem de nêutrons (cps)", + "speedKph": "Velocidade (km/h)", + "expand": "expandir", + "close": "fechar", + "name": "Nome", + "address": "Endereço", + "port": "Porta", + "csApiEndpoint": "Ponto final da API CS", + "username": "Nome de usuário", + "password": "Senha", + "isSecure": "É seguro", + "openDrawer": "gaveta aberta", + "openNotifications": "abrir notificações", + "volume": "Volume", + "startDate": "Data de início", + "endDate": "Data de término", + "simpleTable": "mesa simples", + "user": "Usuário", + "timestamp": "Carimbo de data e hora", + "secondaryInspectionStatus": "Status de inspeção secundária", + "nodeId": "ID do nó", + "alarm.gamma": "Alarme Gama", + "alarm.neutron": "Alarme de nêutrons", + "alarm.gammaNeutron": "Alarme de nêutrons gama", + "occupancies": "Ocupações", + "tamper": "Adulteração", + "faults.gamma": "Falhas Gama", + "faults.neutron": "Falhas de nêutrons", + "faults": "Falhas", + "noVideoAvailable": "Nenhum vídeo disponível", + "loading": "Carregando...", + "edit": "Editar", + "back": "Voltar", + "reset": "Reiniciar", + "generateReport": "Gerar um relatório", + "generatedReport": "Relatório gerado", + "pleaseGenerateReport": "Por favor, gere um relatório para visualizá-lo e baixá-lo aqui.", + "readMore": "Leia mais", + "clickAnywhereToEnableAlarmSound": "Clique em qualquer lugar para ativar o som do alarme", + "yourBrowserDoesNotSupportVideoTag": "Seu navegador não suporta a tag de vídeo.", + "alarmsAndOccupancies": "Alarmes e Ocupações", + "alarms": "Alarmes", + "allTime": "Todos os tempos", + "monthly": "Mensal", + "weekly": "Semanalmente", + "daily": "Diário", + "customRange": "Intervalo personalizado", + "stateOfHealth": "Estado de saúde", + "selectAll": "Selecionar tudo", + "last24Hours": "Últimas 24 horas", + "last7Days": "Últimos 7 dias", + "last30Days": "Últimos 30 dias", + "thisMonth": "Este mês", + "rdsSiteReport": "Relatório do site RDS", + "laneReport": "Relatório de pista", + "adjudicationReport": "Relatório de Adjudicação", + "eventReport": "Relatório de Evento", + "generatingReport": "Gerando relatório...", + "generateReportBtn": "Gerar relatório" +} diff --git a/src/locales/ru.json b/src/locales/ru.json new file mode 100644 index 00000000..57bd3476 --- /dev/null +++ b/src/locales/ru.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Приборная панель", + "events": "События", + "map": "Карта", + "national": "Национальный обзор", + "reportGenerator": "Генератор отчетов", + "servers": "Серверы", + "alarmVolume": "Громкость сигнала", + "laneStatus": "Статус полосы", + "laneId": "ID полосы", + "occupancyId": "ID проезда", + "startTime": "Время начала", + "endTime": "Время окончания", + "maxGamma": "Отсчетов гамма-излучения в секунду (имп/с)", + "maxNeutron": "Отсчетов нейтронов в секунду (имп/с)", + "status": "Статус", + "adjudicated": "Оценено", + "details": "Детали", + "yes": "Да", + "no": "Нет", + "eventDetails": "Детали события", + "addServer": "Добавить новый сервер", + "editNode": "Редактировать узел", + "nodes": "Узлы", + "exportPdf": "Экспорт в PDF", + "adjudicationTitle": "Оценка события", + "adjudicationReportForm": "Форма отчета об оценке", + "vehicleId": "ID ТС", + "notes": "Примечания", + "uploadFiles": "Загрузить файлы", + "submit": "Отправить", + "adjudicationSuccess": "Оценка успешна для ID проезда: ", + "adjudicationFail": "Не удалось отправить оценку.", + "selectValidCode": "Пожалуйста, выберите допустимый код оценки перед отправкой.", + "errorLoadingObservation": "Ошибка загрузки наблюдения.", + "cannotFindObservation": "Не удается найти наблюдение для оценки. Пожалуйста, попробуйте снова.", + "statusOnline": "В сети", + "statusOffline": "Оффлайн", + "statusTamper": "Взлом", + "statusFault": "Сбой", + "statusClear": "Чисто", + "statusGamma": "Гамма", + "statusNeutron": "Нейтрон", + "statusGammaNeutron": "Гамма и Нейтрон", + "statusNone": "Нет", + "code1": "Код 1: Обнаружена контрабанда", + "code2": "Код 2: Другое", + "code3": "Код 3: Обнаружен медицинский изотоп", + "code4": "Код 4: Обнаружен материал NORM", + "code5": "Код 5: Заявленная перевозка радиоактивных материалов", + "code6": "Код 6: Физический досмотр отрицательный", + "code7": "Код 7: RIID/ASP показывает только фон", + "code8": "Код 8: Другое", + "code9": "Код 9: Авторизованная проверка, техобслуживание или обучение", + "code10": "Код 10: Несанкционированная деятельность", + "code11": "Код 11: Другое", + "cps": "CPS", + "nsigma": "НСигма", + "realAlarm": "Реальная тревога", + "innocentAlarm": "Невинная тревога", + "falseAlarm": "Ложная тревога", + "other": "Другой", + "isotope": "Изотоп", + "secondaryInspection": "Вторичная проверка", + "loggedAdjudications": "Зарегистрированные решения", + "feedback": "Обратная связь", + "noNodes": "Нет узлов", + "delete": "Удалить", + "cancel": "Отмена", + "timeRange": "Временной диапазон", + "viewLane": "ПРОСМОТР ПОЛОСЫ", + "eventType": "Тип события", + "nodeSelector": "Селектор узлов", + "laneSelector": "Селектор полосы движения", + "reportType": "Тип отчета", + "adjudicationCode": "Судебный кодекс", + "isotopes": "изотопы", + "filePaths": "пути к файлам", + "occupancyTable": "Таблица заполняемости", + "faultTable": "Таблица неисправностей", + "noEventDataAvailable": "Нет данных о событии", + "neutronBackgroundCountRate": "Скорость счета нейтронного фона", + "maxGammaCountRate": "Максимальная скорость счета гаммы (имп/с)", + "maxNeutronCountRate": "Максимальная скорость счета нейтронов (имп/с)", + "speedKph": "Скорость (км/ч)", + "expand": "расширять", + "close": "закрывать", + "name": "Имя", + "address": "Адрес", + "port": "Порт", + "csApiEndpoint": "Конечная точка CS API", + "username": "Имя пользователя", + "password": "Пароль", + "isSecure": "Безопасно", + "openDrawer": "открытый ящик", + "openNotifications": "открытые уведомления", + "volume": "Объем", + "startDate": "Дата начала", + "endDate": "Дата окончания", + "simpleTable": "простой стол", + "user": "Пользователь", + "timestamp": "Временная метка", + "secondaryInspectionStatus": "Статус вторичной проверки", + "nodeId": "Идентификатор узла", + "alarm.gamma": "Гамма-сигнализация", + "alarm.neutron": "Нейтронная сигнализация", + "alarm.gammaNeutron": "Гамма-нейтронная сигнализация", + "occupancies": "Занятия", + "tamper": "Тампер", + "faults.gamma": "Гамма-разломы", + "faults.neutron": "Нейтронные неисправности", + "faults": "Неисправности", + "noVideoAvailable": "Нет доступного видео", + "loading": "Загрузка...", + "edit": "Редактировать", + "back": "Назад", + "reset": "Перезагрузить", + "generateReport": "Создать отчет", + "generatedReport": "Сгенерированный отчет", + "pleaseGenerateReport": "Создайте отчет, чтобы просмотреть и загрузить его здесь.", + "readMore": "Читать далее", + "clickAnywhereToEnableAlarmSound": "Нажмите в любом месте, чтобы включить звук будильника.", + "yourBrowserDoesNotSupportVideoTag": "Ваш браузер не поддерживает тег видео.", + "alarmsAndOccupancies": "Сигнализация и присутствие", + "alarms": "Сигнализация", + "allTime": "Все время", + "monthly": "Ежемесячно", + "weekly": "Еженедельно", + "daily": "Ежедневно", + "customRange": "Пользовательский диапазон", + "stateOfHealth": "Состояние здоровья", + "selectAll": "Выбрать все", + "last24Hours": "Последние 24 часа", + "last7Days": "Последние 7 дней", + "last30Days": "Последние 30 дней", + "thisMonth": "В этом месяце", + "rdsSiteReport": "Отчет о сайте RDS", + "laneReport": "Отчет о переулке", + "adjudicationReport": "Отчет о вынесении решения", + "eventReport": "Отчет о событии", + "generatingReport": "Создание отчета...", + "generateReportBtn": "Создать отчет" +} diff --git a/src/locales/th.json b/src/locales/th.json new file mode 100644 index 00000000..42db87b9 --- /dev/null +++ b/src/locales/th.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "แดชบอร์ด", + "events": "เหตุการณ์", + "map": "แผนที่", + "national": "ระดับชาติ", + "reportGenerator": "ตัวสร้างรายงาน", + "servers": "เซิร์ฟเวอร์", + "alarmVolume": "ระดับเสียงปลุก", + "laneStatus": "สถานะช่องทาง", + "laneId": "รหัสช่องทาง", + "occupancyId": "รหัสการครอบครอง", + "startTime": "เวลาเริ่มต้น", + "endTime": "เวลาสิ้นสุด", + "maxGamma": "แกมมาสูงสุด (cps)", + "maxNeutron": "นิวตรอนสูงสุด (cps)", + "status": "สถานะ", + "adjudicated": "ตัดสินแล้ว", + "details": "รายละเอียด", + "yes": "ใช่", + "no": "ไม่", + "eventDetails": "รายละเอียดเหตุการณ์", + "addServer": "เพิ่มเซิร์ฟเวอร์ใหม่", + "editNode": "แก้ไขโหนด", + "nodes": "โหนด", + "exportPdf": "ส่งออกเป็น PDF", + "adjudicationTitle": "การตัดสิน", + "adjudicationReportForm": "แบบฟอร์มรายงานการตัดสิน", + "vehicleId": "รหัสยานพาหนะ", + "notes": "หมายเหตุ", + "uploadFiles": "อัปโหลดไฟล์", + "submit": "ส่ง", + "adjudicationSuccess": "การตัดสินสำเร็จสำหรับรหัสการครอบครอง: ", + "adjudicationFail": "ส่งการตัดสินล้มเหลว", + "selectValidCode": "โปรดเลือกรหัสการตัดสินที่ถูกต้องก่อนส่ง", + "errorLoadingObservation": "ข้อผิดพลาดในการโหลดการสังเกต", + "cannotFindObservation": "ไม่พบการสังเกตเพื่อตัดสิน โปรดลองอีกครั้ง", + "statusOnline": "ออนไลน์", + "statusOffline": "ออฟไลน์", + "statusTamper": "การงัดแงะ", + "statusFault": "ข้อผิดพลาด", + "statusClear": "ปกติ", + "statusGamma": "แกมมา", + "statusNeutron": "นิวตรอน", + "statusGammaNeutron": "แกมมาและนิวตรอน", + "statusNone": "ไม่มี", + "code1": "รหัส 1: พบของเถื่อน", + "code2": "รหัส 2: อื่นๆ", + "code3": "รหัส 3: พบไอโซโทปทางการแพทย์", + "code4": "รหัส 4: พบวัสดุ NORM", + "code5": "รหัส 5: การขนส่งวัสดุกัมมันตภาพรังสีที่แจ้งไว้", + "code6": "รหัส 6: การตรวจสอบทางกายภาพเป็นลบ", + "code7": "รหัส 7: RIID/ASP ระบุเฉพาะพื้นหลัง", + "code8": "รหัส 8: อื่นๆ", + "code9": "รหัส 9: กิจกรรมการทดสอบ การบำรุงรักษา หรือการฝึกอบรมที่ได้รับอนุญาต", + "code10": "รหัส 10: กิจกรรมที่ไม่ได้รับอนุญาต", + "code11": "รหัส 11: อื่นๆ", + "cps": "ซีพีเอส", + "nsigma": "เอ็นซิกม่า", + "realAlarm": "ปลุกจริง", + "innocentAlarm": "สัญญาณเตือนที่ไร้เดียงสา", + "falseAlarm": "สัญญาณเตือนเท็จ", + "other": "อื่น", + "isotope": "ไอโซโทป", + "secondaryInspection": "การตรวจสอบรอง", + "loggedAdjudications": "บันทึกการตัดสิน", + "feedback": "ข้อเสนอแนะ", + "noNodes": "ไม่มีโหนด", + "delete": "ลบ", + "cancel": "ยกเลิก", + "timeRange": "ช่วงเวลา", + "viewLane": "ดูเลน", + "eventType": "ประเภทเหตุการณ์", + "nodeSelector": "ตัวเลือกโหนด", + "laneSelector": "ตัวเลือกเลน", + "reportType": "ประเภทรายงาน", + "adjudicationCode": "รหัสการตัดสิน", + "isotopes": "ไอโซโทป", + "filePaths": "FilePaths", + "occupancyTable": "ตารางการเข้าพัก", + "faultTable": "ตารางข้อผิดพลาด", + "noEventDataAvailable": "ไม่มีข้อมูลเหตุการณ์", + "neutronBackgroundCountRate": "อัตราการนับพื้นหลังนิวตรอน", + "maxGammaCountRate": "อัตราการนับแกมมาสูงสุด (cps)", + "maxNeutronCountRate": "อัตราการนับนิวตรอนสูงสุด (cps)", + "speedKph": "ความเร็ว (กม./ชม.)", + "expand": "ขยาย", + "close": "ปิด", + "name": "ชื่อ", + "address": "ที่อยู่", + "port": "ท่าเรือ", + "csApiEndpoint": "ตำแหน่งข้อมูล CS API", + "username": "ชื่อผู้ใช้", + "password": "รหัสผ่าน", + "isSecure": "มีความปลอดภัย", + "openDrawer": "เปิดลิ้นชัก", + "openNotifications": "เปิดการแจ้งเตือน", + "volume": "ปริมาณ", + "startDate": "วันที่เริ่มต้น", + "endDate": "วันที่สิ้นสุด", + "simpleTable": "ตารางที่เรียบง่าย", + "user": "ผู้ใช้", + "timestamp": "การประทับเวลา", + "secondaryInspectionStatus": "สถานะการตรวจสอบรอง", + "nodeId": "รหัสโหนด", + "alarm.gamma": "สัญญาณเตือนแกมมา", + "alarm.neutron": "สัญญาณเตือนนิวตรอน", + "alarm.gammaNeutron": "สัญญาณเตือนแกมมานิวตรอน", + "occupancies": "อัตราการเข้าพัก", + "tamper": "งัดแงะ", + "faults.gamma": "ข้อบกพร่องแกมมา", + "faults.neutron": "ความผิดพลาดของนิวตรอน", + "faults": "ความผิดพลาด", + "noVideoAvailable": "ไม่มีวิดีโอ", + "loading": "กำลังโหลด...", + "edit": "แก้ไข", + "back": "กลับ", + "reset": "รีเซ็ต", + "generateReport": "สร้างรายงาน", + "generatedReport": "รายงานที่สร้างขึ้น", + "pleaseGenerateReport": "โปรดสร้างรายงานเพื่อดูและดาวน์โหลดได้ที่นี่", + "readMore": "อ่านเพิ่มเติม", + "clickAnywhereToEnableAlarmSound": "คลิกที่ใดก็ได้เพื่อเปิดใช้งานเสียงปลุก", + "yourBrowserDoesNotSupportVideoTag": "เบราว์เซอร์ของคุณไม่รองรับแท็กวิดีโอ", + "alarmsAndOccupancies": "สัญญาณเตือนภัยและการเข้าพัก", + "alarms": "สัญญาณเตือน", + "allTime": "ตลอดเวลา", + "monthly": "รายเดือน", + "weekly": "รายสัปดาห์", + "daily": "รายวัน", + "customRange": "ช่วงที่กำหนดเอง", + "stateOfHealth": "สถานะของสุขภาพ", + "selectAll": "เลือกทั้งหมด", + "last24Hours": "24 ชั่วโมงที่ผ่านมา", + "last7Days": "7 วันที่ผ่านมา", + "last30Days": "30 วันที่ผ่านมา", + "thisMonth": "เดือนนี้", + "rdsSiteReport": "รายงานไซต์ RDS", + "laneReport": "รายงานเลน", + "adjudicationReport": "รายงานการตัดสิน", + "eventReport": "รายงานกิจกรรม", + "generatingReport": "กำลังสร้างรายงาน...", + "generateReportBtn": "สร้างรายงาน" +} diff --git a/src/locales/tr.json b/src/locales/tr.json new file mode 100644 index 00000000..ac67c678 --- /dev/null +++ b/src/locales/tr.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Gösterge Paneli", + "events": "Olaylar", + "map": "Harita", + "national": "Ulusal", + "reportGenerator": "Rapor Oluşturucu", + "servers": "Sunucular", + "alarmVolume": "Alarm Sesi", + "laneStatus": "Şerit Durumu", + "laneId": "Şerit Kimliği", + "occupancyId": "Doluluk Kimliği", + "startTime": "Başlangıç Zamanı", + "endTime": "Bitiş Zamanı", + "maxGamma": "Maks Gamma (cps)", + "maxNeutron": "Maks Nötron (cps)", + "status": "Durum", + "adjudicated": "Karara Bağlandı", + "details": "Detaylar", + "yes": "Evet", + "no": "Hayır", + "eventDetails": "Olay Detayları", + "addServer": "Yeni Sunucu Ekle", + "editNode": "Düğümü Düzenle", + "nodes": "Düğümler", + "exportPdf": "PDF Olarak Dışa Aktar", + "adjudicationTitle": "Karar", + "adjudicationReportForm": "Karar Raporu Formu", + "vehicleId": "Araç Kimliği", + "notes": "Notlar", + "uploadFiles": "Dosyaları Yükle", + "submit": "Gönder", + "adjudicationSuccess": "Doluluk Kimliği için karar başarılı: ", + "adjudicationFail": "Karar gönderilemedi.", + "selectValidCode": "Lütfen göndermeden önce geçerli bir karar kodu seçin.", + "errorLoadingObservation": "Gözlem yüklenirken hata oluştu.", + "cannotFindObservation": "Karar verilecek gözlem bulunamadı. Lütfen tekrar deneyin.", + "statusOnline": "Çevrimiçi", + "statusOffline": "Çevrimdışı", + "statusTamper": "Kurcalama", + "statusFault": "Arıza", + "statusClear": "Temiz", + "statusGamma": "Gamma", + "statusNeutron": "Nötron", + "statusGammaNeutron": "Gamma ve Nötron", + "statusNone": "Hiçbiri", + "code1": "Kod 1: Kaçak Mal Bulundu", + "code2": "Kod 2: Diğer", + "code3": "Kod 3: Tıbbi İzotop Bulundu", + "code4": "Kod 4: NORM Malzemesi Bulundu", + "code5": "Kod 5: Beyan Edilen Radyoaktif Malzeme Sevkiyatı", + "code6": "Kod 6: Fiziksel Muayene Negatif", + "code7": "Kod 7: RIID/ASP Sadece Arka Planı Gösteriyor", + "code8": "Kod 8: Diğer", + "code9": "Kod 9: Yetkili Test, Bakım veya Eğitim Faaliyeti", + "code10": "Kod 10: Yetkisiz Faaliyet", + "code11": "Kod 11: Diğer", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Gerçek Alarm", + "innocentAlarm": "Masum Alarm", + "falseAlarm": "Yanlış alarm", + "other": "Diğer", + "isotope": "İzotop", + "secondaryInspection": "İkincil Muayene", + "loggedAdjudications": "Günlüğe Kaydedilen Kararlar", + "feedback": "Geri bildirim", + "noNodes": "Düğüm yok", + "delete": "Silmek", + "cancel": "İptal etmek", + "timeRange": "Zaman Aralığı", + "viewLane": "ŞERİDİ GÖRÜNTÜLE", + "eventType": "Etkinlik Türü", + "nodeSelector": "Düğüm Seçici", + "laneSelector": "Şerit Seçici", + "reportType": "Rapor Türü", + "adjudicationCode": "Karar Kodu", + "isotopes": "İzotoplar", + "filePaths": "Dosya Yolları", + "occupancyTable": "Doluluk Tablosu", + "faultTable": "Arıza Tablosu", + "noEventDataAvailable": "Etkinlik verisi yok", + "neutronBackgroundCountRate": "Nötron Arkaplan Sayım Oranı", + "maxGammaCountRate": "Maksimum Gama Sayım Oranı (cps)", + "maxNeutronCountRate": "Maksimum Nötron Sayım Hızı (cps)", + "speedKph": "Hız (km/saat)", + "expand": "genişletmek", + "close": "kapalı", + "name": "İsim", + "address": "Adres", + "port": "Liman", + "csApiEndpoint": "CS API Uç Noktası", + "username": "Kullanıcı adı", + "password": "Şifre", + "isSecure": "Güvenli mi", + "openDrawer": "açık çekmece", + "openNotifications": "bildirimleri aç", + "volume": "Hacim", + "startDate": "Başlangıç ​​Tarihi", + "endDate": "Bitiş Tarihi", + "simpleTable": "basit masa", + "user": "Kullanıcı", + "timestamp": "Zaman damgası", + "secondaryInspectionStatus": "İkincil Muayene Durumu", + "nodeId": "Düğüm kimliği", + "alarm.gamma": "Gama Alarmı", + "alarm.neutron": "Nötron Alarmı", + "alarm.gammaNeutron": "Gama Nötron Alarmı", + "occupancies": "Doluluklar", + "tamper": "Sabotaj", + "faults.gamma": "Gama Hataları", + "faults.neutron": "Nötron Hataları", + "faults": "Arızalar", + "noVideoAvailable": "Video Mevcut Değil", + "loading": "Yükleniyor...", + "edit": "Düzenlemek", + "back": "Geri", + "reset": "Sıfırla", + "generateReport": "Rapor Oluştur", + "generatedReport": "Oluşturulan Rapor", + "pleaseGenerateReport": "Lütfen burada görüntülemek ve indirmek için bir rapor oluşturun.", + "readMore": "Devamını oku", + "clickAnywhereToEnableAlarmSound": "Alarm sesini etkinleştirmek için herhangi bir yere tıklayın", + "yourBrowserDoesNotSupportVideoTag": "Tarayıcınız video etiketini desteklemiyor.", + "alarmsAndOccupancies": "Alarmlar ve Doluluklar", + "alarms": "Alarmlar", + "allTime": "Tüm Zamanlar", + "monthly": "Aylık", + "weekly": "Haftalık", + "daily": "Günlük", + "customRange": "Özel Aralık", + "stateOfHealth": "Sağlık Durumu", + "selectAll": "Tümünü Seç", + "last24Hours": "Son 24 Saat", + "last7Days": "Son 7 Gün", + "last30Days": "Son 30 Gün", + "thisMonth": "Bu Ay", + "rdsSiteReport": "RDS Site Raporu", + "laneReport": "Şerit Raporu", + "adjudicationReport": "Karar Raporu", + "eventReport": "Etkinlik Raporu", + "generatingReport": "Rapor Oluşturuluyor...", + "generateReportBtn": "Rapor Oluştur" +} diff --git a/src/locales/ur.json b/src/locales/ur.json new file mode 100644 index 00000000..9b5aa160 --- /dev/null +++ b/src/locales/ur.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "ڈیش بورڈ", + "events": "واقعات", + "map": "نقشہ", + "national": "قومی", + "reportGenerator": "رپورٹ جنریٹر", + "servers": "سرورز", + "alarmVolume": "الارم والیوم", + "laneStatus": "لین کی حیثیت", + "laneId": "لین ID", + "occupancyId": "قبضہ ID", + "startTime": "شروع کا وقت", + "endTime": "ختم ہونے کا وقت", + "maxGamma": "زیادہ سے زیادہ گاما (cps)", + "maxNeutron": "زیادہ سے زیادہ نیوٹران (cps)", + "status": "حیثیت", + "adjudicated": "فیصلہ شدہ", + "details": "تفصیلات", + "yes": "ہاں", + "no": "نہیں", + "eventDetails": "واقعہ کی تفصیلات", + "addServer": "نیا سرور شامل کریں", + "editNode": "نوڈ میں ترمیم کریں", + "nodes": "نوڈس", + "exportPdf": "پی ڈی ایف کے طور پر برآمد کریں", + "adjudicationTitle": "فیصلہ", + "adjudicationReportForm": "فیصلہ رپورٹ فارم", + "vehicleId": "گاڑی کی شناخت", + "notes": "نوٹس", + "uploadFiles": "فائلیں اپ لوڈ کریں", + "submit": "جمع کرائیں", + "adjudicationSuccess": "قبضہ ID کے لئے فیصلہ کامیاب: ", + "adjudicationFail": "فیصلہ جمع کرانے میں ناکام۔", + "selectValidCode": "براہ کرم جمع کرانے سے پہلے ایک درست فیصلہ کوڈ منتخب کریں۔", + "errorLoadingObservation": "مشاہدہ لوڈ کرنے میں غلطی۔", + "cannotFindObservation": "فیصلہ کرنے کے لیے مشاہدہ نہیں مل سکا۔ براہ کرم دوبارہ کوشش کریں۔", + "statusOnline": "آن لائن", + "statusOffline": "آف لائن", + "statusTamper": "چھیڑ چھاڑ", + "statusFault": "نقص", + "statusClear": "صاف", + "statusGamma": "گاما", + "statusNeutron": "نیوٹران", + "statusGammaNeutron": "گاما اور نیوٹران", + "statusNone": "کوئی نہیں", + "code1": "کوڈ 1: ممنوعہ سامان ملا", + "code2": "کوڈ 2: دیگر", + "code3": "کوڈ 3: طبی آاسوٹوپ ملا", + "code4": "کوڈ 4: NORM مواد ملا", + "code5": "کوڈ 5: تابکار مواد کی اعلان کردہ کھیپ", + "code6": "کوڈ 6: جسمانی معائنہ منفی", + "code7": "کوڈ 7: RIID/ASP صرف پس منظر کی نشاندہی کرتا ہے", + "code8": "کوڈ 8: دیگر", + "code9": "کوڈ 9: مجاز ٹیسٹ، دیکھ بھال، یا تربیت کی سرگرمی", + "code10": "کوڈ 10: غیر مجاز سرگرمی", + "code11": "کوڈ 11: دیگر", + "cps": "سی پی ایس", + "nsigma": "NSigma", + "realAlarm": "حقیقی الارم", + "innocentAlarm": "معصوم الارم", + "falseAlarm": "غلط الارم", + "other": "دیگر", + "isotope": "آاسوٹوپ", + "secondaryInspection": "ثانوی معائنہ", + "loggedAdjudications": "لاگ ان فیصلے", + "feedback": "تاثرات", + "noNodes": "کوئی نوڈس نہیں۔", + "delete": "حذف کریں۔", + "cancel": "منسوخ کریں۔", + "timeRange": "وقت کی حد", + "viewLane": "لین دیکھیں", + "eventType": "واقعہ کی قسم", + "nodeSelector": "نوڈ سلیکٹر", + "laneSelector": "لین سلیکٹر", + "reportType": "رپورٹ کی قسم", + "adjudicationCode": "عدالتی ضابطہ", + "isotopes": "آاسوٹوپس", + "filePaths": "فائل پاتھس", + "occupancyTable": "قبضے کی میز", + "faultTable": "فالٹ ٹیبل", + "noEventDataAvailable": "ایونٹ کا کوئی ڈیٹا دستیاب نہیں ہے۔", + "neutronBackgroundCountRate": "نیوٹران بیک گراؤنڈ کاؤنٹ ریٹ", + "maxGammaCountRate": "زیادہ سے زیادہ گاما شمار کی شرح (سی پی ایس)", + "maxNeutronCountRate": "زیادہ سے زیادہ نیوٹران کاؤنٹ ریٹ (سی پی ایس)", + "speedKph": "رفتار (kph)", + "expand": "پھیلاؤ", + "close": "بند", + "name": "نام", + "address": "پتہ", + "port": "بندرگاہ", + "csApiEndpoint": "CS API اینڈ پوائنٹ", + "username": "صارف نام", + "password": "پاس ورڈ", + "isSecure": "محفوظ ہے۔", + "openDrawer": "کھلی دراز", + "openNotifications": "اطلاعات کھولیں۔", + "volume": "حجم", + "startDate": "آغاز کی تاریخ", + "endDate": "اختتامی تاریخ", + "simpleTable": "سادہ میز", + "user": "صارف", + "timestamp": "ٹائم اسٹیمپ", + "secondaryInspectionStatus": "ثانوی معائنہ کی حیثیت", + "nodeId": "نوڈ ID", + "alarm.gamma": "گاما الارم", + "alarm.neutron": "نیوٹران الارم", + "alarm.gammaNeutron": "گاما نیوٹران الارم", + "occupancies": "قبضے", + "tamper": "چھیڑ چھاڑ", + "faults.gamma": "گاما فالٹس", + "faults.neutron": "نیوٹران فالٹس", + "faults": "خرابیاں", + "noVideoAvailable": "کوئی ویڈیو دستیاب نہیں ہے۔", + "loading": "لوڈ ہو رہا ہے...", + "edit": "ترمیم کریں۔", + "back": "پیچھے", + "reset": "دوبارہ ترتیب دیں۔", + "generateReport": "ایک رپورٹ بنائیں", + "generatedReport": "تیار کردہ رپورٹ", + "pleaseGenerateReport": "براہ کرم یہاں دیکھنے اور ڈاؤن لوڈ کرنے کے لیے ایک رپورٹ بنائیں۔", + "readMore": "مزید پڑھیں", + "clickAnywhereToEnableAlarmSound": "الارم کی آواز کو فعال کرنے کے لیے کہیں بھی کلک کریں۔", + "yourBrowserDoesNotSupportVideoTag": "آپ کا براؤزر ویڈیو ٹیگ کو سپورٹ نہیں کرتا ہے۔", + "alarmsAndOccupancies": "الارم اور قبضے", + "alarms": "الارم", + "allTime": "ہر وقت", + "monthly": "ماہانہ", + "weekly": "ہفتہ وار", + "daily": "روزانہ", + "customRange": "اپنی مرضی کی حد", + "stateOfHealth": "صحت کی حالت", + "selectAll": "سبھی کو منتخب کریں۔", + "last24Hours": "پچھلے 24 گھنٹے", + "last7Days": "آخری 7 دن", + "last30Days": "آخری 30 دن", + "thisMonth": "اس مہینے", + "rdsSiteReport": "RDS سائٹ کی رپورٹ", + "laneReport": "لین رپورٹ", + "adjudicationReport": "عدالتی رپورٹ", + "eventReport": "واقعہ کی رپورٹ", + "generatingReport": "رپورٹ تیار ہو رہی ہے...", + "generateReportBtn": "رپورٹ بنائیں" +} diff --git a/src/locales/vi.json b/src/locales/vi.json new file mode 100644 index 00000000..5ab78056 --- /dev/null +++ b/src/locales/vi.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "Bảng điều khiển", + "events": "Sự kiện", + "map": "Bản đồ", + "national": "Quốc gia", + "reportGenerator": "Trình tạo báo cáo", + "servers": "Máy chủ", + "alarmVolume": "Âm lượng báo động", + "laneStatus": "Trạng thái làn", + "laneId": "ID làn", + "occupancyId": "ID chiếm dụng", + "startTime": "Thời gian bắt đầu", + "endTime": "Thời gian kết thúc", + "maxGamma": "Gamma tối đa (cps)", + "maxNeutron": "Neutron tối đa (cps)", + "status": "Trạng thái", + "adjudicated": "Đã xét xử", + "details": "Chi tiết", + "yes": "Có", + "no": "Không", + "eventDetails": "Chi tiết sự kiện", + "addServer": "Thêm máy chủ mới", + "editNode": "Chỉnh sửa nút", + "nodes": "Các nút", + "exportPdf": "Xuất ra PDF", + "adjudicationTitle": "Xét xử", + "adjudicationReportForm": "Mẫu báo cáo xét xử", + "vehicleId": "ID xe", + "notes": "Ghi chú", + "uploadFiles": "Tải lên tệp", + "submit": "Gửi", + "adjudicationSuccess": "Xét xử thành công cho ID chiếm dụng: ", + "adjudicationFail": "Gửi xét xử thất bại.", + "selectValidCode": "Vui lòng chọn mã xét xử hợp lệ trước khi gửi.", + "errorLoadingObservation": "Lỗi khi tải quan sát.", + "cannotFindObservation": "Không tìm thấy quan sát để xét xử. Vui lòng thử lại.", + "statusOnline": "Trực tuyến", + "statusOffline": "Ngoại tuyến", + "statusTamper": "Giả mạo", + "statusFault": "Lỗi", + "statusClear": "Xóa", + "statusGamma": "Gamma", + "statusNeutron": "Neutron", + "statusGammaNeutron": "Gamma và Neutron", + "statusNone": "Không", + "code1": "Mã 1: Tìm thấy hàng lậu", + "code2": "Mã 2: Khác", + "code3": "Mã 3: Tìm thấy đồng vị y tế", + "code4": "Mã 4: Tìm thấy vật liệu NORM", + "code5": "Mã 5: Lô hàng vật liệu phóng xạ đã khai báo", + "code6": "Mã 6: Kiểm tra vật lý âm tính", + "code7": "Mã 7: RIID/ASP chỉ chỉ thị nền", + "code8": "Mã 8: Khác", + "code9": "Mã 9: Hoạt động thử nghiệm, bảo trì hoặc đào tạo được ủy quyền", + "code10": "Mã 10: Hoạt động trái phép", + "code11": "Mã 11: Khác", + "cps": "CPS", + "nsigma": "NSigma", + "realAlarm": "Báo động thực sự", + "innocentAlarm": "Báo động vô tội", + "falseAlarm": "Báo động sai", + "other": "Khác", + "isotope": "đồng vị", + "secondaryInspection": "Kiểm tra thứ cấp", + "loggedAdjudications": "Phán quyết được ghi lại", + "feedback": "Nhận xét", + "noNodes": "Không có nút", + "delete": "Xóa bỏ", + "cancel": "Hủy bỏ", + "timeRange": "Phạm vi thời gian", + "viewLane": "XEM LÀNG", + "eventType": "Loại sự kiện", + "nodeSelector": "Bộ chọn nút", + "laneSelector": "Bộ chọn làn đường", + "reportType": "Loại báo cáo", + "adjudicationCode": "Mã xét xử", + "isotopes": "đồng vị", + "filePaths": "Đường dẫn tệp", + "occupancyTable": "Bảng công suất", + "faultTable": "Bảng lỗi", + "noEventDataAvailable": "Không có dữ liệu sự kiện", + "neutronBackgroundCountRate": "Tốc độ đếm nền neutron", + "maxGammaCountRate": "Tốc độ đếm Gamma tối đa (cps)", + "maxNeutronCountRate": "Tốc độ đếm neutron tối đa (cps)", + "speedKph": "Tốc độ (kph)", + "expand": "mở rộng", + "close": "đóng", + "name": "Tên", + "address": "Địa chỉ", + "port": "Cảng", + "csApiEndpoint": "Điểm cuối API CS", + "username": "Tên người dùng", + "password": "Mật khẩu", + "isSecure": "An toàn", + "openDrawer": "mở ngăn kéo", + "openNotifications": "mở thông báo", + "volume": "Âm lượng", + "startDate": "Ngày bắt đầu", + "endDate": "Ngày kết thúc", + "simpleTable": "bảng đơn giản", + "user": "người dùng", + "timestamp": "Dấu thời gian", + "secondaryInspectionStatus": "Tình trạng kiểm tra thứ cấp", + "nodeId": "ID nút", + "alarm.gamma": "Báo động gamma", + "alarm.neutron": "Báo động neutron", + "alarm.gammaNeutron": "Báo động neutron gamma", + "occupancies": "Số lượng người làm việc", + "tamper": "giả mạo", + "faults.gamma": "Lỗi gamma", + "faults.neutron": "Lỗi neutron", + "faults": "Lỗi", + "noVideoAvailable": "Không có video nào", + "loading": "Đang tải...", + "edit": "Biên tập", + "back": "Mặt sau", + "reset": "Cài lại", + "generateReport": "Tạo báo cáo", + "generatedReport": "Báo cáo đã tạo", + "pleaseGenerateReport": "Vui lòng tạo báo cáo để xem và tải xuống tại đây.", + "readMore": "Đọc thêm", + "clickAnywhereToEnableAlarmSound": "Nhấp vào bất cứ đâu để bật âm thanh báo động", + "yourBrowserDoesNotSupportVideoTag": "Trình duyệt của bạn không hỗ trợ thẻ video.", + "alarmsAndOccupancies": "Báo động và Công việc", + "alarms": "Báo động", + "allTime": "mọi lúc", + "monthly": "hàng tháng", + "weekly": "hàng tuần", + "daily": "Hằng ngày", + "customRange": "Phạm vi tùy chỉnh", + "stateOfHealth": "Tình trạng sức khỏe", + "selectAll": "Chọn tất cả", + "last24Hours": "24 giờ qua", + "last7Days": "7 ngày qua", + "last30Days": "30 ngày qua", + "thisMonth": "Tháng này", + "rdsSiteReport": "Báo cáo trang web RDS", + "laneReport": "Báo cáo làn đường", + "adjudicationReport": "Báo cáo xét xử", + "eventReport": "Báo cáo sự kiện", + "generatingReport": "Đang tạo báo cáo...", + "generateReportBtn": "Tạo báo cáo" +} diff --git a/src/locales/yue.json b/src/locales/yue.json new file mode 100644 index 00000000..a16fa054 --- /dev/null +++ b/src/locales/yue.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "儀表板", + "events": "事件", + "map": "地圖", + "national": "全國視圖", + "reportGenerator": "報告生成器", + "servers": "伺服器", + "alarmVolume": "警報音量", + "laneStatus": "車道狀態", + "laneId": "車道 ID", + "occupancyId": "佔用 ID", + "startTime": "開始時間", + "endTime": "結束時間", + "maxGamma": "伽馬每秒計數 (cps)", + "maxNeutron": "中子每秒計數 (cps)", + "status": "狀態", + "adjudicated": "已裁決", + "details": "詳情", + "yes": "是", + "no": "否", + "eventDetails": "事件詳情", + "addServer": "新增伺服器", + "editNode": "編輯節點", + "nodes": "節點", + "exportPdf": "導出為 PDF", + "adjudicationTitle": "裁決", + "adjudicationReportForm": "裁決報告表", + "vehicleId": "車輛 ID", + "notes": "備註", + "uploadFiles": "上傳文件", + "submit": "提交", + "adjudicationSuccess": "裁決成功,佔用 ID:", + "adjudicationFail": "裁決提交失敗。", + "selectValidCode": "提交前請選擇有效的裁決代碼。", + "errorLoadingObservation": "加載觀測數據錯誤。", + "cannotFindObservation": "無法找到要裁決的觀測數據。請重試。", + "statusOnline": "在線", + "statusOffline": "離線", + "statusTamper": "防拆警報", + "statusFault": "故障", + "statusClear": "清除", + "statusGamma": "伽馬", + "statusNeutron": "中子", + "statusGammaNeutron": "伽馬和中子", + "statusNone": "無", + "code1": "代碼 1:發現違禁品", + "code2": "代碼 2:其他", + "code3": "代碼 3:發現醫用同位素", + "code4": "代碼 4:發現 NORM 材料", + "code5": "代碼 5:申報的放射性物質運輸", + "code6": "代碼 6:物理檢查陰性", + "code7": "代碼 7:RIID/ASP 僅指示背景輻射", + "code8": "代碼 8:其他", + "code9": "代碼 9:授權測試、維護或培訓活動", + "code10": "代碼 10:未經授權的活動", + "code11": "代碼 11:其他", + "cps": "消費者保護計劃", + "nsigma": "西格瑪", + "realAlarm": "真實警報", + "innocentAlarm": "無辜警報", + "falseAlarm": "虛驚", + "other": "其他", + "isotope": "同位素", + "secondaryInspection": "二次檢驗", + "loggedAdjudications": "記錄的裁決", + "feedback": "回饋", + "noNodes": "無節點", + "delete": "刪除", + "cancel": "取消", + "timeRange": "時間範圍", + "viewLane": "景觀車道", + "eventType": "事件類型", + "nodeSelector": "節點選擇器", + "laneSelector": "車道選擇器", + "reportType": "報告類型", + "adjudicationCode": "裁決守則", + "isotopes": "同位素", + "filePaths": "文件路徑", + "occupancyTable": "入住表", + "faultTable": "故障表", + "noEventDataAvailable": "無可用事件數據", + "neutronBackgroundCountRate": "中子本底計數率", + "maxGammaCountRate": "最大伽瑪計數率 (cps)", + "maxNeutronCountRate": "最大中子計數率 (cps)", + "speedKph": "速度(公里/小時)", + "expand": "擴張", + "close": "關閉", + "name": "姓名", + "address": "地址", + "port": "港口", + "csApiEndpoint": "CS API 端點", + "username": "使用者名稱", + "password": "密碼", + "isSecure": "安全", + "openDrawer": "打開抽屜", + "openNotifications": "開啟通知", + "volume": "體積", + "startDate": "開始日期", + "endDate": "結束日期", + "simpleTable": "簡單的桌子", + "user": "使用者", + "timestamp": "時間戳", + "secondaryInspectionStatus": "二次檢驗狀態", + "nodeId": "節點號", + "alarm.gamma": "伽瑪警報", + "alarm.neutron": "中子警報", + "alarm.gammaNeutron": "伽瑪中子警報", + "occupancies": "佔用人數", + "tamper": "篡改", + "faults.gamma": "伽瑪斷層", + "faults.neutron": "中子斷層", + "faults": "故障", + "noVideoAvailable": "沒有可用視頻", + "loading": "載入中...", + "edit": "編輯", + "back": "後退", + "reset": "重置", + "generateReport": "產生報告", + "generatedReport": "產生的報告", + "pleaseGenerateReport": "請產生報告以在此處查看和下載。", + "readMore": "閱讀更多", + "clickAnywhereToEnableAlarmSound": "點擊任意位置即可啟用警報聲音", + "yourBrowserDoesNotSupportVideoTag": "您的瀏覽器不支援影片標籤。", + "alarmsAndOccupancies": "警報和占用", + "alarms": "警報", + "allTime": "所有時間", + "monthly": "每月", + "weekly": "每週", + "daily": "日常的", + "customRange": "定制範圍", + "stateOfHealth": "健康狀況", + "selectAll": "選擇全部", + "last24Hours": "過去 24 小時", + "last7Days": "過去 7 天", + "last30Days": "過去 30 天", + "thisMonth": "本月", + "rdsSiteReport": "RDS 站點報告", + "laneReport": "車道報告", + "adjudicationReport": "裁決報告", + "eventReport": "事件報告", + "generatingReport": "正在產生報告...", + "generateReportBtn": "產生報告" +} diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json new file mode 100644 index 00000000..a4de48c1 --- /dev/null +++ b/src/locales/zh-CN.json @@ -0,0 +1,144 @@ +{ + "appTitle": "OSCAR", + "dashboard": "仪表板", + "events": "事件", + "map": "地图", + "national": "全国视图", + "reportGenerator": "报告生成器", + "servers": "服务器", + "alarmVolume": "报警音量", + "laneStatus": "车道状态", + "laneId": "车道 ID", + "occupancyId": "占用 ID", + "startTime": "开始时间", + "endTime": "结束时间", + "maxGamma": "伽马每秒计数 (cps)", + "maxNeutron": "中子每秒计数 (cps)", + "status": "状态", + "adjudicated": "已裁决", + "details": "详情", + "yes": "是", + "no": "否", + "eventDetails": "事件详情", + "addServer": "添加新服务器", + "editNode": "编辑节点", + "nodes": "节点", + "exportPdf": "导出为 PDF", + "adjudicationTitle": "裁决", + "adjudicationReportForm": "裁决报告表", + "vehicleId": "车辆 ID", + "notes": "备注", + "uploadFiles": "上传文件", + "submit": "提交", + "adjudicationSuccess": "裁决成功,占用 ID:", + "adjudicationFail": "裁决提交失败。", + "selectValidCode": "提交前请选择有效的裁决代码。", + "errorLoadingObservation": "加载观测数据错误。", + "cannotFindObservation": "无法找到要裁决的观测数据。请重试。", + "statusOnline": "在线", + "statusOffline": "离线", + "statusTamper": "防拆报警", + "statusFault": "故障", + "statusClear": "清除", + "statusGamma": "伽马", + "statusNeutron": "中子", + "statusGammaNeutron": "伽马和中子", + "statusNone": "无", + "code1": "代码 1:发现违禁品", + "code2": "代码 2:其他", + "code3": "代码 3:发现医用同位素", + "code4": "代码 4:发现 NORM 材料", + "code5": "代码 5:申报的放射性物质运输", + "code6": "代码 6:物理检查阴性", + "code7": "代码 7:RIID/ASP 仅指示背景辐射", + "code8": "代码 8:其他", + "code9": "代码 9:授权测试、维护或培训活动", + "code10": "代码 10:未经授权的活动", + "code11": "代码 11:其他", + "cps": "消费者保护计划", + "nsigma": "西格玛", + "realAlarm": "真实警报", + "innocentAlarm": "无辜警报", + "falseAlarm": "虚惊", + "other": "其他", + "isotope": "同位素", + "secondaryInspection": "二次检验", + "loggedAdjudications": "记录的裁决", + "feedback": "反馈", + "noNodes": "无节点", + "delete": "删除", + "cancel": "取消", + "timeRange": "时间范围", + "viewLane": "景观车道", + "eventType": "事件类型", + "nodeSelector": "节点选择器", + "laneSelector": "车道选择器", + "reportType": "报告类型", + "adjudicationCode": "裁决守则", + "isotopes": "同位素", + "filePaths": "文件路径", + "occupancyTable": "入住表", + "faultTable": "故障表", + "noEventDataAvailable": "无可用事件数据", + "neutronBackgroundCountRate": "中子本底计数率", + "maxGammaCountRate": "最大伽玛计数率 (cps)", + "maxNeutronCountRate": "最大中子计数率 (cps)", + "speedKph": "速度(公里/小时)", + "expand": "扩张", + "close": "关闭", + "name": "姓名", + "address": "地址", + "port": "港口", + "csApiEndpoint": "CS API 端点", + "username": "用户名", + "password": "密码", + "isSecure": "安全", + "openDrawer": "打开抽屉", + "openNotifications": "打开通知", + "volume": "体积", + "startDate": "开始日期", + "endDate": "结束日期", + "simpleTable": "简单的桌子", + "user": "用户", + "timestamp": "时间戳", + "secondaryInspectionStatus": "二次检验状态", + "nodeId": "节点号", + "alarm.gamma": "伽玛警报", + "alarm.neutron": "中子警报", + "alarm.gammaNeutron": "伽马中子警报", + "occupancies": "占用人数", + "tamper": "篡改", + "faults.gamma": "伽玛断层", + "faults.neutron": "中子断层", + "faults": "故障", + "noVideoAvailable": "没有可用视频", + "loading": "加载中...", + "edit": "编辑", + "back": "后退", + "reset": "重置", + "generateReport": "生成报告", + "generatedReport": "生成的报告", + "pleaseGenerateReport": "请生成报告以在此处查看和下载。", + "readMore": "阅读更多", + "clickAnywhereToEnableAlarmSound": "单击任意位置即可启用警报声音", + "yourBrowserDoesNotSupportVideoTag": "您的浏览器不支持视频标签。", + "alarmsAndOccupancies": "警报和占用", + "alarms": "警报", + "allTime": "所有时间", + "monthly": "每月", + "weekly": "每周", + "daily": "日常的", + "customRange": "定制范围", + "stateOfHealth": "健康状况", + "selectAll": "选择全部", + "last24Hours": "过去 24 小时", + "last7Days": "过去 7 天", + "last30Days": "过去 30 天", + "thisMonth": "本月", + "rdsSiteReport": "RDS 站点报告", + "laneReport": "车道报告", + "adjudicationReport": "裁决报告", + "eventReport": "事件报告", + "generatingReport": "正在生成报告...", + "generateReportBtn": "生成报告" +}