diff --git a/client/package.json b/client/package.json index af8c61c..12eab0e 100644 --- a/client/package.json +++ b/client/package.json @@ -17,7 +17,10 @@ "date-fns": "^2.30.0", "react-hot-toast": "^2.4.1", "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": { "@vitejs/plugin-react": "^4.0.3", diff --git a/client/src/components/common/LanguageSelector.jsx b/client/src/components/common/LanguageSelector.jsx new file mode 100644 index 0000000..e40796d --- /dev/null +++ b/client/src/components/common/LanguageSelector.jsx @@ -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 ( + +
+ + + {currentLanguage.flag} + {currentLanguage.name} + + +
+ + + +
+ {languages.map((language) => ( + + {({ active }) => ( + + )} + + ))} +
+
+
+
+ ); +} \ No newline at end of file diff --git a/client/src/i18n/index.js b/client/src/i18n/index.js new file mode 100644 index 0000000..15eb4be --- /dev/null +++ b/client/src/i18n/index.js @@ -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; \ No newline at end of file diff --git a/client/src/i18n/locales/en.json b/client/src/i18n/locales/en.json new file mode 100644 index 0000000..58c9b7c --- /dev/null +++ b/client/src/i18n/locales/en.json @@ -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" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/sv.json b/client/src/i18n/locales/sv.json new file mode 100644 index 0000000..d574e18 --- /dev/null +++ b/client/src/i18n/locales/sv.json @@ -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" + } +} \ No newline at end of file diff --git a/management/package.json b/management/package.json index dd4dd39..f6944c2 100644 --- a/management/package.json +++ b/management/package.json @@ -19,7 +19,10 @@ "@heroicons/react": "^2.0.18", "clsx": "^2.0.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": { "@types/react": "^18.2.15", diff --git a/management/src/i18n/index.js b/management/src/i18n/index.js new file mode 100644 index 0000000..15eb4be --- /dev/null +++ b/management/src/i18n/index.js @@ -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; \ No newline at end of file diff --git a/management/src/i18n/locales/en.json b/management/src/i18n/locales/en.json new file mode 100644 index 0000000..73e69c8 --- /dev/null +++ b/management/src/i18n/locales/en.json @@ -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" + } +} \ No newline at end of file diff --git a/management/src/i18n/locales/sv.json b/management/src/i18n/locales/sv.json new file mode 100644 index 0000000..107f046 --- /dev/null +++ b/management/src/i18n/locales/sv.json @@ -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" + } +} \ No newline at end of file