Fix jwt-token
This commit is contained in:
@@ -17,7 +17,10 @@
|
|||||||
"date-fns": "^2.30.0",
|
"date-fns": "^2.30.0",
|
||||||
"react-hot-toast": "^2.4.1",
|
"react-hot-toast": "^2.4.1",
|
||||||
"framer-motion": "^10.16.4",
|
"framer-motion": "^10.16.4",
|
||||||
"classnames": "^2.3.2"
|
"classnames": "^2.3.2",
|
||||||
|
"react-i18next": "^13.5.0",
|
||||||
|
"i18next": "^23.7.8",
|
||||||
|
"i18next-browser-languagedetector": "^7.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vitejs/plugin-react": "^4.0.3",
|
"@vitejs/plugin-react": "^4.0.3",
|
||||||
|
|||||||
72
client/src/components/common/LanguageSelector.jsx
Normal file
72
client/src/components/common/LanguageSelector.jsx
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { Menu, Transition } from '@headlessui/react';
|
||||||
|
import { Fragment } from 'react';
|
||||||
|
import { GlobeAltIcon, ChevronDownIcon } from '@heroicons/react/24/outline';
|
||||||
|
|
||||||
|
const languages = [
|
||||||
|
{ code: 'en', name: 'English', flag: '🇺🇸' },
|
||||||
|
{ code: 'sv', name: 'Svenska', flag: '🇸🇪' }
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function LanguageSelector({ className = '' }) {
|
||||||
|
const { i18n, t } = useTranslation();
|
||||||
|
|
||||||
|
const currentLanguage = languages.find(lang => lang.code === i18n.language) || languages[0];
|
||||||
|
|
||||||
|
const changeLanguage = (languageCode) => {
|
||||||
|
i18n.changeLanguage(languageCode);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Menu as="div" className={`relative inline-block text-left ${className}`}>
|
||||||
|
<div>
|
||||||
|
<Menu.Button className="inline-flex items-center justify-center w-full px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
||||||
|
<GlobeAltIcon className="w-4 h-4 mr-2" />
|
||||||
|
<span className="mr-1">{currentLanguage.flag}</span>
|
||||||
|
<span>{currentLanguage.name}</span>
|
||||||
|
<ChevronDownIcon className="w-4 h-4 ml-2" />
|
||||||
|
</Menu.Button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Transition
|
||||||
|
as={Fragment}
|
||||||
|
enter="transition ease-out duration-100"
|
||||||
|
enterFrom="transform opacity-0 scale-95"
|
||||||
|
enterTo="transform opacity-100 scale-100"
|
||||||
|
leave="transition ease-in duration-75"
|
||||||
|
leaveFrom="transform opacity-100 scale-100"
|
||||||
|
leaveTo="transform opacity-0 scale-95"
|
||||||
|
>
|
||||||
|
<Menu.Items className="absolute right-0 z-10 w-48 mt-2 origin-top-right bg-white border border-gray-300 rounded-md shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
|
||||||
|
<div className="py-1">
|
||||||
|
{languages.map((language) => (
|
||||||
|
<Menu.Item key={language.code}>
|
||||||
|
{({ active }) => (
|
||||||
|
<button
|
||||||
|
onClick={() => changeLanguage(language.code)}
|
||||||
|
className={`${
|
||||||
|
active ? 'bg-gray-100 text-gray-900' : 'text-gray-700'
|
||||||
|
} ${
|
||||||
|
language.code === i18n.language ? 'bg-indigo-50 text-indigo-600' : ''
|
||||||
|
} group flex items-center px-4 py-2 text-sm w-full text-left`}
|
||||||
|
>
|
||||||
|
<span className="mr-3">{language.flag}</span>
|
||||||
|
<span>{language.name}</span>
|
||||||
|
{language.code === i18n.language && (
|
||||||
|
<span className="ml-auto">
|
||||||
|
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
|
||||||
|
<path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
</Menu.Item>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</Menu.Items>
|
||||||
|
</Transition>
|
||||||
|
</Menu>
|
||||||
|
);
|
||||||
|
}
|
||||||
34
client/src/i18n/index.js
Normal file
34
client/src/i18n/index.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import i18n from 'i18next';
|
||||||
|
import { initReactI18next } from 'react-i18next';
|
||||||
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
||||||
|
|
||||||
|
// Import translation files
|
||||||
|
import en from './locales/en.json';
|
||||||
|
import sv from './locales/sv.json';
|
||||||
|
|
||||||
|
const resources = {
|
||||||
|
en: {
|
||||||
|
translation: en
|
||||||
|
},
|
||||||
|
sv: {
|
||||||
|
translation: sv
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
i18n
|
||||||
|
.use(LanguageDetector)
|
||||||
|
.use(initReactI18next)
|
||||||
|
.init({
|
||||||
|
resources,
|
||||||
|
lng: 'en', // default language
|
||||||
|
fallbackLng: 'en',
|
||||||
|
interpolation: {
|
||||||
|
escapeValue: false // React already does escaping
|
||||||
|
},
|
||||||
|
detection: {
|
||||||
|
order: ['localStorage', 'navigator', 'htmlTag'],
|
||||||
|
caches: ['localStorage']
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default i18n;
|
||||||
142
client/src/i18n/locales/en.json
Normal file
142
client/src/i18n/locales/en.json
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
{
|
||||||
|
"app": {
|
||||||
|
"title": "UAM-ILS Drone Detection System",
|
||||||
|
"subtitle": "Real-time Unmanned Aerial Vehicle Monitoring"
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"detections": "Detections",
|
||||||
|
"devices": "Devices",
|
||||||
|
"alerts": "Alerts",
|
||||||
|
"settings": "Settings",
|
||||||
|
"logout": "Logout"
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"login": "Login",
|
||||||
|
"username": "Username",
|
||||||
|
"password": "Password",
|
||||||
|
"loginButton": "Sign In",
|
||||||
|
"loginError": "Invalid credentials. Please try again.",
|
||||||
|
"sessionExpired": "Your session has expired. Please log in again.",
|
||||||
|
"accessDenied": "Access denied. Please contact support.",
|
||||||
|
"loggingIn": "Signing in...",
|
||||||
|
"logout": "Logout",
|
||||||
|
"logoutConfirm": "Are you sure you want to log out?"
|
||||||
|
},
|
||||||
|
"dashboard": {
|
||||||
|
"title": "System Overview",
|
||||||
|
"activeDetectors": "Active Detectors",
|
||||||
|
"recentDetections": "Recent Detections",
|
||||||
|
"threatLevel": "Threat Level",
|
||||||
|
"systemStatus": "System Status",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"maintenance": "Maintenance"
|
||||||
|
},
|
||||||
|
"detections": {
|
||||||
|
"title": "Drone Detections",
|
||||||
|
"noDetections": "No detections found",
|
||||||
|
"loadingDetections": "Loading detections...",
|
||||||
|
"filterByType": "Filter by Type",
|
||||||
|
"filterByThreat": "Filter by Threat Level",
|
||||||
|
"allTypes": "All Types",
|
||||||
|
"allThreats": "All Threat Levels",
|
||||||
|
"timestamp": "Timestamp",
|
||||||
|
"location": "Location",
|
||||||
|
"droneType": "Drone Type",
|
||||||
|
"threatLevel": "Threat Level",
|
||||||
|
"distance": "Distance",
|
||||||
|
"altitude": "Altitude",
|
||||||
|
"confidence": "Confidence",
|
||||||
|
"actions": "Actions",
|
||||||
|
"viewDetails": "View Details",
|
||||||
|
"deleteDetection": "Delete Detection",
|
||||||
|
"confirmDelete": "Are you sure you want to delete this detection?"
|
||||||
|
},
|
||||||
|
"devices": {
|
||||||
|
"title": "Detection Devices",
|
||||||
|
"noDevices": "No devices configured",
|
||||||
|
"loadingDevices": "Loading devices...",
|
||||||
|
"addDevice": "Add Device",
|
||||||
|
"deviceId": "Device ID",
|
||||||
|
"deviceName": "Device Name",
|
||||||
|
"status": "Status",
|
||||||
|
"lastSeen": "Last Seen",
|
||||||
|
"location": "Location",
|
||||||
|
"actions": "Actions",
|
||||||
|
"edit": "Edit",
|
||||||
|
"delete": "Delete",
|
||||||
|
"activate": "Activate",
|
||||||
|
"deactivate": "Deactivate"
|
||||||
|
},
|
||||||
|
"alerts": {
|
||||||
|
"title": "Alert Configuration",
|
||||||
|
"noAlerts": "No alert rules configured",
|
||||||
|
"loadingAlerts": "Loading alert rules...",
|
||||||
|
"addAlert": "Add Alert Rule",
|
||||||
|
"ruleName": "Rule Name",
|
||||||
|
"conditions": "Conditions",
|
||||||
|
"actions": "Actions",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"title": "Settings",
|
||||||
|
"general": "General",
|
||||||
|
"notifications": "Notifications",
|
||||||
|
"language": "Language",
|
||||||
|
"theme": "Theme",
|
||||||
|
"timezone": "Timezone",
|
||||||
|
"save": "Save Changes",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"saved": "Settings saved successfully",
|
||||||
|
"error": "Failed to save settings"
|
||||||
|
},
|
||||||
|
"common": {
|
||||||
|
"loading": "Loading...",
|
||||||
|
"error": "An error occurred",
|
||||||
|
"retry": "Retry",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"save": "Save",
|
||||||
|
"delete": "Delete",
|
||||||
|
"edit": "Edit",
|
||||||
|
"add": "Add",
|
||||||
|
"remove": "Remove",
|
||||||
|
"confirm": "Confirm",
|
||||||
|
"yes": "Yes",
|
||||||
|
"no": "No",
|
||||||
|
"ok": "OK",
|
||||||
|
"close": "Close",
|
||||||
|
"search": "Search",
|
||||||
|
"filter": "Filter",
|
||||||
|
"clear": "Clear",
|
||||||
|
"refresh": "Refresh",
|
||||||
|
"export": "Export",
|
||||||
|
"import": "Import"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"networkError": "Network connection error. Please check your internet connection.",
|
||||||
|
"serverError": "Server error. Please try again later.",
|
||||||
|
"notFound": "The requested resource was not found.",
|
||||||
|
"unauthorized": "You are not authorized to access this resource.",
|
||||||
|
"forbidden": "Access to this resource is forbidden.",
|
||||||
|
"validationError": "Please check your input and try again.",
|
||||||
|
"sessionExpired": "Your session has expired. Please log in again.",
|
||||||
|
"unknownError": "An unknown error occurred. Please try again."
|
||||||
|
},
|
||||||
|
"droneTypes": {
|
||||||
|
"unknown": "Unknown",
|
||||||
|
"consumer": "Consumer",
|
||||||
|
"commercial": "Commercial",
|
||||||
|
"military": "Military",
|
||||||
|
"surveillance": "Surveillance",
|
||||||
|
"racing": "Racing",
|
||||||
|
"educational": "Educational"
|
||||||
|
},
|
||||||
|
"threatLevels": {
|
||||||
|
"low": "Low",
|
||||||
|
"medium": "Medium",
|
||||||
|
"high": "High",
|
||||||
|
"critical": "Critical"
|
||||||
|
}
|
||||||
|
}
|
||||||
142
client/src/i18n/locales/sv.json
Normal file
142
client/src/i18n/locales/sv.json
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
{
|
||||||
|
"app": {
|
||||||
|
"title": "UAM-ILS Drönardetektionssystem",
|
||||||
|
"subtitle": "Realtidsövervakning av obemannade luftfarkoster"
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"dashboard": "Översikt",
|
||||||
|
"detections": "Detekteringar",
|
||||||
|
"devices": "Enheter",
|
||||||
|
"alerts": "Larm",
|
||||||
|
"settings": "Inställningar",
|
||||||
|
"logout": "Logga ut"
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"login": "Logga in",
|
||||||
|
"username": "Användarnamn",
|
||||||
|
"password": "Lösenord",
|
||||||
|
"loginButton": "Logga in",
|
||||||
|
"loginError": "Ogiltiga inloggningsuppgifter. Försök igen.",
|
||||||
|
"sessionExpired": "Din session har löpt ut. Vänligen logga in igen.",
|
||||||
|
"accessDenied": "Åtkomst nekad. Vänligen kontakta support.",
|
||||||
|
"loggingIn": "Loggar in...",
|
||||||
|
"logout": "Logga ut",
|
||||||
|
"logoutConfirm": "Är du säker på att du vill logga ut?"
|
||||||
|
},
|
||||||
|
"dashboard": {
|
||||||
|
"title": "Systemöversikt",
|
||||||
|
"activeDetectors": "Aktiva detektorer",
|
||||||
|
"recentDetections": "Senaste detekteringar",
|
||||||
|
"threatLevel": "Hotnivå",
|
||||||
|
"systemStatus": "Systemstatus",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"maintenance": "Underhåll"
|
||||||
|
},
|
||||||
|
"detections": {
|
||||||
|
"title": "Drönardetekteringar",
|
||||||
|
"noDetections": "Inga detekteringar hittades",
|
||||||
|
"loadingDetections": "Laddar detekteringar...",
|
||||||
|
"filterByType": "Filtrera efter typ",
|
||||||
|
"filterByThreat": "Filtrera efter hotnivå",
|
||||||
|
"allTypes": "Alla typer",
|
||||||
|
"allThreats": "Alla hotnivåer",
|
||||||
|
"timestamp": "Tidsstämpel",
|
||||||
|
"location": "Plats",
|
||||||
|
"droneType": "Drönartyp",
|
||||||
|
"threatLevel": "Hotnivå",
|
||||||
|
"distance": "Avstånd",
|
||||||
|
"altitude": "Höjd",
|
||||||
|
"confidence": "Säkerhet",
|
||||||
|
"actions": "Åtgärder",
|
||||||
|
"viewDetails": "Visa detaljer",
|
||||||
|
"deleteDetection": "Ta bort detektion",
|
||||||
|
"confirmDelete": "Är du säker på att du vill ta bort denna detektion?"
|
||||||
|
},
|
||||||
|
"devices": {
|
||||||
|
"title": "Detektionsenheter",
|
||||||
|
"noDevices": "Inga enheter konfigurerade",
|
||||||
|
"loadingDevices": "Laddar enheter...",
|
||||||
|
"addDevice": "Lägg till enhet",
|
||||||
|
"deviceId": "Enhets-ID",
|
||||||
|
"deviceName": "Enhetsnamn",
|
||||||
|
"status": "Status",
|
||||||
|
"lastSeen": "Senast sedd",
|
||||||
|
"location": "Plats",
|
||||||
|
"actions": "Åtgärder",
|
||||||
|
"edit": "Redigera",
|
||||||
|
"delete": "Ta bort",
|
||||||
|
"activate": "Aktivera",
|
||||||
|
"deactivate": "Inaktivera"
|
||||||
|
},
|
||||||
|
"alerts": {
|
||||||
|
"title": "Larmkonfiguration",
|
||||||
|
"noAlerts": "Inga larmregler konfigurerade",
|
||||||
|
"loadingAlerts": "Laddar larmregler...",
|
||||||
|
"addAlert": "Lägg till larmregel",
|
||||||
|
"ruleName": "Regelnamn",
|
||||||
|
"conditions": "Villkor",
|
||||||
|
"actions": "Åtgärder",
|
||||||
|
"enabled": "Aktiverad",
|
||||||
|
"disabled": "Inaktiverad"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"title": "Inställningar",
|
||||||
|
"general": "Allmänt",
|
||||||
|
"notifications": "Notifieringar",
|
||||||
|
"language": "Språk",
|
||||||
|
"theme": "Tema",
|
||||||
|
"timezone": "Tidszon",
|
||||||
|
"save": "Spara ändringar",
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"saved": "Inställningar sparade framgångsrikt",
|
||||||
|
"error": "Misslyckades att spara inställningar"
|
||||||
|
},
|
||||||
|
"common": {
|
||||||
|
"loading": "Laddar...",
|
||||||
|
"error": "Ett fel uppstod",
|
||||||
|
"retry": "Försök igen",
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"save": "Spara",
|
||||||
|
"delete": "Ta bort",
|
||||||
|
"edit": "Redigera",
|
||||||
|
"add": "Lägg till",
|
||||||
|
"remove": "Ta bort",
|
||||||
|
"confirm": "Bekräfta",
|
||||||
|
"yes": "Ja",
|
||||||
|
"no": "Nej",
|
||||||
|
"ok": "OK",
|
||||||
|
"close": "Stäng",
|
||||||
|
"search": "Sök",
|
||||||
|
"filter": "Filtrera",
|
||||||
|
"clear": "Rensa",
|
||||||
|
"refresh": "Uppdatera",
|
||||||
|
"export": "Exportera",
|
||||||
|
"import": "Importera"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"networkError": "Nätverksanslutningsfel. Vänligen kontrollera din internetanslutning.",
|
||||||
|
"serverError": "Serverfel. Vänligen försök igen senare.",
|
||||||
|
"notFound": "Den begärda resursen hittades inte.",
|
||||||
|
"unauthorized": "Du är inte behörig att komma åt denna resurs.",
|
||||||
|
"forbidden": "Åtkomst till denna resurs är förbjuden.",
|
||||||
|
"validationError": "Vänligen kontrollera din inmatning och försök igen.",
|
||||||
|
"sessionExpired": "Din session har löpt ut. Vänligen logga in igen.",
|
||||||
|
"unknownError": "Ett okänt fel uppstod. Vänligen försök igen."
|
||||||
|
},
|
||||||
|
"droneTypes": {
|
||||||
|
"unknown": "Okänd",
|
||||||
|
"consumer": "Konsument",
|
||||||
|
"commercial": "Kommersiell",
|
||||||
|
"military": "Militär",
|
||||||
|
"surveillance": "Övervakning",
|
||||||
|
"racing": "Racing",
|
||||||
|
"educational": "Utbildning"
|
||||||
|
},
|
||||||
|
"threatLevels": {
|
||||||
|
"low": "Låg",
|
||||||
|
"medium": "Medium",
|
||||||
|
"high": "Hög",
|
||||||
|
"critical": "Kritisk"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,7 +19,10 @@
|
|||||||
"@heroicons/react": "^2.0.18",
|
"@heroicons/react": "^2.0.18",
|
||||||
"clsx": "^2.0.0",
|
"clsx": "^2.0.0",
|
||||||
"date-fns": "^2.30.0",
|
"date-fns": "^2.30.0",
|
||||||
"react-hot-toast": "^2.4.1"
|
"react-hot-toast": "^2.4.1",
|
||||||
|
"react-i18next": "^13.5.0",
|
||||||
|
"i18next": "^23.7.8",
|
||||||
|
"i18next-browser-languagedetector": "^7.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/react": "^18.2.15",
|
"@types/react": "^18.2.15",
|
||||||
|
|||||||
34
management/src/i18n/index.js
Normal file
34
management/src/i18n/index.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import i18n from 'i18next';
|
||||||
|
import { initReactI18next } from 'react-i18next';
|
||||||
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
||||||
|
|
||||||
|
// Import translation files
|
||||||
|
import en from './locales/en.json';
|
||||||
|
import sv from './locales/sv.json';
|
||||||
|
|
||||||
|
const resources = {
|
||||||
|
en: {
|
||||||
|
translation: en
|
||||||
|
},
|
||||||
|
sv: {
|
||||||
|
translation: sv
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
i18n
|
||||||
|
.use(LanguageDetector)
|
||||||
|
.use(initReactI18next)
|
||||||
|
.init({
|
||||||
|
resources,
|
||||||
|
lng: 'en', // default language
|
||||||
|
fallbackLng: 'en',
|
||||||
|
interpolation: {
|
||||||
|
escapeValue: false // React already does escaping
|
||||||
|
},
|
||||||
|
detection: {
|
||||||
|
order: ['localStorage', 'navigator', 'htmlTag'],
|
||||||
|
caches: ['localStorage']
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default i18n;
|
||||||
202
management/src/i18n/locales/en.json
Normal file
202
management/src/i18n/locales/en.json
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
{
|
||||||
|
"app": {
|
||||||
|
"title": "UAM-ILS Management Portal",
|
||||||
|
"subtitle": "Multi-Tenant Drone Detection System Administration"
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"tenants": "Tenants",
|
||||||
|
"users": "Users",
|
||||||
|
"system": "System",
|
||||||
|
"monitoring": "Monitoring",
|
||||||
|
"settings": "Settings",
|
||||||
|
"logout": "Logout"
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"login": "Login",
|
||||||
|
"username": "Username",
|
||||||
|
"password": "Password",
|
||||||
|
"loginButton": "Sign In",
|
||||||
|
"loginError": "Invalid management credentials. Please try again.",
|
||||||
|
"sessionExpired": "Your management session has expired. Please log in again.",
|
||||||
|
"accessDenied": "Insufficient management privileges.",
|
||||||
|
"loggingIn": "Signing in...",
|
||||||
|
"logout": "Logout",
|
||||||
|
"logoutConfirm": "Are you sure you want to log out?"
|
||||||
|
},
|
||||||
|
"dashboard": {
|
||||||
|
"title": "System Overview",
|
||||||
|
"totalTenants": "Total Tenants",
|
||||||
|
"activeTenants": "Active Tenants",
|
||||||
|
"totalUsers": "Total Users",
|
||||||
|
"systemHealth": "System Health",
|
||||||
|
"recentActivity": "Recent Activity",
|
||||||
|
"systemMetrics": "System Metrics",
|
||||||
|
"memoryUsage": "Memory Usage",
|
||||||
|
"cpuUsage": "CPU Usage",
|
||||||
|
"diskUsage": "Disk Usage",
|
||||||
|
"networkTraffic": "Network Traffic"
|
||||||
|
},
|
||||||
|
"tenants": {
|
||||||
|
"title": "Tenant Management",
|
||||||
|
"noTenants": "No tenants configured",
|
||||||
|
"loadingTenants": "Loading tenants...",
|
||||||
|
"addTenant": "Add Tenant",
|
||||||
|
"editTenant": "Edit Tenant",
|
||||||
|
"deleteTenant": "Delete Tenant",
|
||||||
|
"tenantName": "Tenant Name",
|
||||||
|
"tenantSlug": "Tenant Slug",
|
||||||
|
"domain": "Domain",
|
||||||
|
"status": "Status",
|
||||||
|
"created": "Created",
|
||||||
|
"lastActivity": "Last Activity",
|
||||||
|
"actions": "Actions",
|
||||||
|
"active": "Active",
|
||||||
|
"inactive": "Inactive",
|
||||||
|
"suspended": "Suspended",
|
||||||
|
"edit": "Edit",
|
||||||
|
"delete": "Delete",
|
||||||
|
"activate": "Activate",
|
||||||
|
"deactivate": "Deactivate",
|
||||||
|
"suspend": "Suspend",
|
||||||
|
"viewDetails": "View Details",
|
||||||
|
"confirmDelete": "Are you sure you want to delete this tenant? This action cannot be undone."
|
||||||
|
},
|
||||||
|
"users": {
|
||||||
|
"title": "User Management",
|
||||||
|
"noUsers": "No users found",
|
||||||
|
"loadingUsers": "Loading users...",
|
||||||
|
"addUser": "Add User",
|
||||||
|
"editUser": "Edit User",
|
||||||
|
"deleteUser": "Delete User",
|
||||||
|
"username": "Username",
|
||||||
|
"email": "Email",
|
||||||
|
"role": "Role",
|
||||||
|
"tenant": "Tenant",
|
||||||
|
"status": "Status",
|
||||||
|
"lastLogin": "Last Login",
|
||||||
|
"created": "Created",
|
||||||
|
"actions": "Actions",
|
||||||
|
"active": "Active",
|
||||||
|
"inactive": "Inactive",
|
||||||
|
"admin": "Admin",
|
||||||
|
"user": "User",
|
||||||
|
"operator": "Operator",
|
||||||
|
"viewer": "Viewer"
|
||||||
|
},
|
||||||
|
"system": {
|
||||||
|
"title": "System Information",
|
||||||
|
"serverInfo": "Server Information",
|
||||||
|
"databaseInfo": "Database Information",
|
||||||
|
"containerInfo": "Container Information",
|
||||||
|
"version": "Version",
|
||||||
|
"uptime": "Uptime",
|
||||||
|
"platform": "Platform",
|
||||||
|
"nodeVersion": "Node.js Version",
|
||||||
|
"connections": "Database Connections",
|
||||||
|
"tables": "Tables",
|
||||||
|
"diskSpace": "Disk Space",
|
||||||
|
"memoryUsage": "Memory Usage",
|
||||||
|
"loadAverage": "Load Average",
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"networks": "Networks"
|
||||||
|
},
|
||||||
|
"monitoring": {
|
||||||
|
"title": "System Monitoring",
|
||||||
|
"realTimeMetrics": "Real-time Metrics",
|
||||||
|
"alerts": "System Alerts",
|
||||||
|
"logs": "System Logs",
|
||||||
|
"performance": "Performance",
|
||||||
|
"security": "Security Events",
|
||||||
|
"noAlerts": "No active alerts",
|
||||||
|
"noLogs": "No recent logs",
|
||||||
|
"refresh": "Refresh",
|
||||||
|
"autoRefresh": "Auto Refresh",
|
||||||
|
"exportLogs": "Export Logs",
|
||||||
|
"clearLogs": "Clear Logs"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"title": "Management Settings",
|
||||||
|
"general": "General",
|
||||||
|
"security": "Security",
|
||||||
|
"notifications": "Notifications",
|
||||||
|
"language": "Language",
|
||||||
|
"timezone": "Timezone",
|
||||||
|
"theme": "Theme",
|
||||||
|
"sessionTimeout": "Session Timeout",
|
||||||
|
"passwordPolicy": "Password Policy",
|
||||||
|
"twoFactorAuth": "Two-Factor Authentication",
|
||||||
|
"auditLogging": "Audit Logging",
|
||||||
|
"save": "Save Changes",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"saved": "Settings saved successfully",
|
||||||
|
"error": "Failed to save settings"
|
||||||
|
},
|
||||||
|
"forms": {
|
||||||
|
"name": "Name",
|
||||||
|
"slug": "Slug",
|
||||||
|
"domain": "Domain",
|
||||||
|
"description": "Description",
|
||||||
|
"email": "Email",
|
||||||
|
"password": "Password",
|
||||||
|
"confirmPassword": "Confirm Password",
|
||||||
|
"role": "Role",
|
||||||
|
"status": "Status",
|
||||||
|
"required": "Required",
|
||||||
|
"optional": "Optional",
|
||||||
|
"create": "Create",
|
||||||
|
"update": "Update",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"save": "Save",
|
||||||
|
"reset": "Reset"
|
||||||
|
},
|
||||||
|
"common": {
|
||||||
|
"loading": "Loading...",
|
||||||
|
"error": "An error occurred",
|
||||||
|
"retry": "Retry",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"save": "Save",
|
||||||
|
"delete": "Delete",
|
||||||
|
"edit": "Edit",
|
||||||
|
"add": "Add",
|
||||||
|
"remove": "Remove",
|
||||||
|
"confirm": "Confirm",
|
||||||
|
"yes": "Yes",
|
||||||
|
"no": "No",
|
||||||
|
"ok": "OK",
|
||||||
|
"close": "Close",
|
||||||
|
"search": "Search",
|
||||||
|
"filter": "Filter",
|
||||||
|
"clear": "Clear",
|
||||||
|
"refresh": "Refresh",
|
||||||
|
"export": "Export",
|
||||||
|
"import": "Import",
|
||||||
|
"view": "View",
|
||||||
|
"manage": "Manage"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"networkError": "Network connection error. Please check your internet connection.",
|
||||||
|
"serverError": "Server error. Please try again later.",
|
||||||
|
"notFound": "The requested resource was not found.",
|
||||||
|
"unauthorized": "You are not authorized to access this resource.",
|
||||||
|
"forbidden": "Access to this resource is forbidden.",
|
||||||
|
"validationError": "Please check your input and try again.",
|
||||||
|
"sessionExpired": "Your session has expired. Please log in again.",
|
||||||
|
"unknownError": "An unknown error occurred. Please try again.",
|
||||||
|
"tenantExists": "A tenant with this name or slug already exists.",
|
||||||
|
"userExists": "A user with this username or email already exists.",
|
||||||
|
"invalidCredentials": "Invalid credentials provided.",
|
||||||
|
"insufficientPrivileges": "Insufficient privileges to perform this action."
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"tenantCreated": "Tenant created successfully",
|
||||||
|
"tenantUpdated": "Tenant updated successfully",
|
||||||
|
"tenantDeleted": "Tenant deleted successfully",
|
||||||
|
"userCreated": "User created successfully",
|
||||||
|
"userUpdated": "User updated successfully",
|
||||||
|
"userDeleted": "User deleted successfully",
|
||||||
|
"settingsSaved": "Settings saved successfully"
|
||||||
|
}
|
||||||
|
}
|
||||||
202
management/src/i18n/locales/sv.json
Normal file
202
management/src/i18n/locales/sv.json
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
{
|
||||||
|
"app": {
|
||||||
|
"title": "UAM-ILS Förvaltningsportal",
|
||||||
|
"subtitle": "Administration av multi-tenant drönardetektionssystem"
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"dashboard": "Översikt",
|
||||||
|
"tenants": "Hyresgäster",
|
||||||
|
"users": "Användare",
|
||||||
|
"system": "System",
|
||||||
|
"monitoring": "Övervakning",
|
||||||
|
"settings": "Inställningar",
|
||||||
|
"logout": "Logga ut"
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"login": "Logga in",
|
||||||
|
"username": "Användarnamn",
|
||||||
|
"password": "Lösenord",
|
||||||
|
"loginButton": "Logga in",
|
||||||
|
"loginError": "Ogiltiga förvaltningsuppgifter. Försök igen.",
|
||||||
|
"sessionExpired": "Din förvaltningssession har löpt ut. Vänligen logga in igen.",
|
||||||
|
"accessDenied": "Otillräckliga förvaltningsprivilegier.",
|
||||||
|
"loggingIn": "Loggar in...",
|
||||||
|
"logout": "Logga ut",
|
||||||
|
"logoutConfirm": "Är du säker på att du vill logga ut?"
|
||||||
|
},
|
||||||
|
"dashboard": {
|
||||||
|
"title": "Systemöversikt",
|
||||||
|
"totalTenants": "Totala hyresgäster",
|
||||||
|
"activeTenants": "Aktiva hyresgäster",
|
||||||
|
"totalUsers": "Totala användare",
|
||||||
|
"systemHealth": "Systemhälsa",
|
||||||
|
"recentActivity": "Senaste aktivitet",
|
||||||
|
"systemMetrics": "Systemmätningar",
|
||||||
|
"memoryUsage": "Minnesanvändning",
|
||||||
|
"cpuUsage": "CPU-användning",
|
||||||
|
"diskUsage": "Diskanvändning",
|
||||||
|
"networkTraffic": "Nätverkstrafik"
|
||||||
|
},
|
||||||
|
"tenants": {
|
||||||
|
"title": "Hyresgästhantering",
|
||||||
|
"noTenants": "Inga hyresgäster konfigurerade",
|
||||||
|
"loadingTenants": "Laddar hyresgäster...",
|
||||||
|
"addTenant": "Lägg till hyresgäst",
|
||||||
|
"editTenant": "Redigera hyresgäst",
|
||||||
|
"deleteTenant": "Ta bort hyresgäst",
|
||||||
|
"tenantName": "Hyresgästnamn",
|
||||||
|
"tenantSlug": "Hyresgästslug",
|
||||||
|
"domain": "Domän",
|
||||||
|
"status": "Status",
|
||||||
|
"created": "Skapad",
|
||||||
|
"lastActivity": "Senaste aktivitet",
|
||||||
|
"actions": "Åtgärder",
|
||||||
|
"active": "Aktiv",
|
||||||
|
"inactive": "Inaktiv",
|
||||||
|
"suspended": "Avstängd",
|
||||||
|
"edit": "Redigera",
|
||||||
|
"delete": "Ta bort",
|
||||||
|
"activate": "Aktivera",
|
||||||
|
"deactivate": "Inaktivera",
|
||||||
|
"suspend": "Stäng av",
|
||||||
|
"viewDetails": "Visa detaljer",
|
||||||
|
"confirmDelete": "Är du säker på att du vill ta bort denna hyresgäst? Denna åtgärd kan inte ångras."
|
||||||
|
},
|
||||||
|
"users": {
|
||||||
|
"title": "Användarhantering",
|
||||||
|
"noUsers": "Inga användare hittades",
|
||||||
|
"loadingUsers": "Laddar användare...",
|
||||||
|
"addUser": "Lägg till användare",
|
||||||
|
"editUser": "Redigera användare",
|
||||||
|
"deleteUser": "Ta bort användare",
|
||||||
|
"username": "Användarnamn",
|
||||||
|
"email": "E-post",
|
||||||
|
"role": "Roll",
|
||||||
|
"tenant": "Hyresgäst",
|
||||||
|
"status": "Status",
|
||||||
|
"lastLogin": "Senaste inloggning",
|
||||||
|
"created": "Skapad",
|
||||||
|
"actions": "Åtgärder",
|
||||||
|
"active": "Aktiv",
|
||||||
|
"inactive": "Inaktiv",
|
||||||
|
"admin": "Admin",
|
||||||
|
"user": "Användare",
|
||||||
|
"operator": "Operatör",
|
||||||
|
"viewer": "Betraktare"
|
||||||
|
},
|
||||||
|
"system": {
|
||||||
|
"title": "Systeminformation",
|
||||||
|
"serverInfo": "Serverinformation",
|
||||||
|
"databaseInfo": "Databasinformation",
|
||||||
|
"containerInfo": "Behållarinformation",
|
||||||
|
"version": "Version",
|
||||||
|
"uptime": "Drifttid",
|
||||||
|
"platform": "Plattform",
|
||||||
|
"nodeVersion": "Node.js Version",
|
||||||
|
"connections": "Databasanslutningar",
|
||||||
|
"tables": "Tabeller",
|
||||||
|
"diskSpace": "Diskutrymme",
|
||||||
|
"memoryUsage": "Minnesanvändning",
|
||||||
|
"loadAverage": "Belastningsgenomsnitt",
|
||||||
|
"containers": "Behållare",
|
||||||
|
"images": "Bilder",
|
||||||
|
"volumes": "Volymer",
|
||||||
|
"networks": "Nätverk"
|
||||||
|
},
|
||||||
|
"monitoring": {
|
||||||
|
"title": "Systemövervakning",
|
||||||
|
"realTimeMetrics": "Realtidsmätningar",
|
||||||
|
"alerts": "Systemlarm",
|
||||||
|
"logs": "Systemloggar",
|
||||||
|
"performance": "Prestanda",
|
||||||
|
"security": "Säkerhetshändelser",
|
||||||
|
"noAlerts": "Inga aktiva larm",
|
||||||
|
"noLogs": "Inga senaste loggar",
|
||||||
|
"refresh": "Uppdatera",
|
||||||
|
"autoRefresh": "Automatisk uppdatering",
|
||||||
|
"exportLogs": "Exportera loggar",
|
||||||
|
"clearLogs": "Rensa loggar"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"title": "Förvaltningsinställningar",
|
||||||
|
"general": "Allmänt",
|
||||||
|
"security": "Säkerhet",
|
||||||
|
"notifications": "Notifieringar",
|
||||||
|
"language": "Språk",
|
||||||
|
"timezone": "Tidszon",
|
||||||
|
"theme": "Tema",
|
||||||
|
"sessionTimeout": "Sessionstimeout",
|
||||||
|
"passwordPolicy": "Lösenordspolicy",
|
||||||
|
"twoFactorAuth": "Tvåfaktorsautentisering",
|
||||||
|
"auditLogging": "Revisionsloggning",
|
||||||
|
"save": "Spara ändringar",
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"saved": "Inställningar sparade framgångsrikt",
|
||||||
|
"error": "Misslyckades att spara inställningar"
|
||||||
|
},
|
||||||
|
"forms": {
|
||||||
|
"name": "Namn",
|
||||||
|
"slug": "Slug",
|
||||||
|
"domain": "Domän",
|
||||||
|
"description": "Beskrivning",
|
||||||
|
"email": "E-post",
|
||||||
|
"password": "Lösenord",
|
||||||
|
"confirmPassword": "Bekräfta lösenord",
|
||||||
|
"role": "Roll",
|
||||||
|
"status": "Status",
|
||||||
|
"required": "Obligatorisk",
|
||||||
|
"optional": "Valfri",
|
||||||
|
"create": "Skapa",
|
||||||
|
"update": "Uppdatera",
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"save": "Spara",
|
||||||
|
"reset": "Återställ"
|
||||||
|
},
|
||||||
|
"common": {
|
||||||
|
"loading": "Laddar...",
|
||||||
|
"error": "Ett fel uppstod",
|
||||||
|
"retry": "Försök igen",
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"save": "Spara",
|
||||||
|
"delete": "Ta bort",
|
||||||
|
"edit": "Redigera",
|
||||||
|
"add": "Lägg till",
|
||||||
|
"remove": "Ta bort",
|
||||||
|
"confirm": "Bekräfta",
|
||||||
|
"yes": "Ja",
|
||||||
|
"no": "Nej",
|
||||||
|
"ok": "OK",
|
||||||
|
"close": "Stäng",
|
||||||
|
"search": "Sök",
|
||||||
|
"filter": "Filtrera",
|
||||||
|
"clear": "Rensa",
|
||||||
|
"refresh": "Uppdatera",
|
||||||
|
"export": "Exportera",
|
||||||
|
"import": "Importera",
|
||||||
|
"view": "Visa",
|
||||||
|
"manage": "Hantera"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"networkError": "Nätverksanslutningsfel. Vänligen kontrollera din internetanslutning.",
|
||||||
|
"serverError": "Serverfel. Vänligen försök igen senare.",
|
||||||
|
"notFound": "Den begärda resursen hittades inte.",
|
||||||
|
"unauthorized": "Du är inte behörig att komma åt denna resurs.",
|
||||||
|
"forbidden": "Åtkomst till denna resurs är förbjuden.",
|
||||||
|
"validationError": "Vänligen kontrollera din inmatning och försök igen.",
|
||||||
|
"sessionExpired": "Din session har löpt ut. Vänligen logga in igen.",
|
||||||
|
"unknownError": "Ett okänt fel uppstod. Vänligen försök igen.",
|
||||||
|
"tenantExists": "En hyresgäst med detta namn eller slug finns redan.",
|
||||||
|
"userExists": "En användare med detta användarnamn eller e-post finns redan.",
|
||||||
|
"invalidCredentials": "Ogiltiga inloggningsuppgifter angivna.",
|
||||||
|
"insufficientPrivileges": "Otillräckliga privilegier för att utföra denna åtgärd."
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"tenantCreated": "Hyresgäst skapad framgångsrikt",
|
||||||
|
"tenantUpdated": "Hyresgäst uppdaterad framgångsrikt",
|
||||||
|
"tenantDeleted": "Hyresgäst borttagen framgångsrikt",
|
||||||
|
"userCreated": "Användare skapad framgångsrikt",
|
||||||
|
"userUpdated": "Användare uppdaterad framgångsrikt",
|
||||||
|
"userDeleted": "Användare borttagen framgångsrikt",
|
||||||
|
"settingsSaved": "Inställningar sparade framgångsrikt"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user