From 59fab6b1b12c2b75d7368052a59e07b09bbb1c74 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 21 Jul 2026 21:27:48 +0000 Subject: [PATCH] New Crowdin translations by GitHub Action --- frontend/public/translations/ar.json | 3573 ++++++++++++++++++- frontend/public/translations/de.json | 12 +- frontend/public/translations/es.json | 3573 ++++++++++++++++++- frontend/public/translations/fr.json | 1093 +++++- frontend/public/translations/it.json | 4787 ++++++++++++++++++++++++- frontend/public/translations/nl.json | 1093 +++++- frontend/public/translations/ro.json | 4789 +++++++++++++++++++++++++- frontend/public/translations/ru.json | 3593 ++++++++++++++++++- frontend/public/translations/sk.json | 1134 +++++- frontend/public/translations/sv.json | 3562 ++++++++++++++++++- frontend/public/translations/tr.json | 3582 ++++++++++++++++++- frontend/public/translations/vi.json | 270 +- frontend/public/translations/zh.json | 1111 +++++- 13 files changed, 31639 insertions(+), 533 deletions(-) diff --git a/frontend/public/translations/ar.json b/frontend/public/translations/ar.json index 7858e4cef..da138194e 100644 --- a/frontend/public/translations/ar.json +++ b/frontend/public/translations/ar.json @@ -39,6 +39,86 @@ "few": "{count} مفاتيح SSH", "many": "{count} مفتاح SSH", "other": "{count} مفتاح SSH" + }, + "asset": { + "zero": "{count} Assets", + "one": "{count} Asset", + "two": "{count} Assets", + "few": "{count} Assets", + "many": "{count} Assets", + "other": "{count} Assets" + }, + "node": { + "zero": "{count} Nodes", + "one": "{count} Node", + "two": "{count} Nodes", + "few": "{count} Nodes", + "many": "{count} Nodes", + "other": "{count} Nodes" + }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, + "allocation": { + "zero": "{count} Node Allocations", + "one": "{count} Node Allocation", + "two": "{count} Node Allocations", + "few": "{count} Node Allocations", + "many": "{count} Node Allocations", + "other": "{count} Node Allocations" + }, + "egg": { + "zero": "{count} Eggs", + "one": "{count} Egg", + "two": "{count} Eggs", + "few": "{count} Eggs", + "many": "{count} Eggs", + "other": "{count} Eggs" + }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, + "shortcut": { + "zero": "{count} Shortcuts", + "one": "{count} Shortcut", + "two": "{count} Shortcuts", + "few": "{count} Shortcuts", + "many": "{count} Shortcuts", + "other": "{count} Shortcuts" + }, + "line": { + "zero": "{count} Lines", + "one": "{count} Line", + "two": "{count} Lines", + "few": "{count} Lines", + "many": "{count} Lines", + "other": "{count} Lines" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -49,6 +129,7 @@ "save": "حفظ", "saveAndStay": "حفظ والبقاء", "edit": "تعديل", + "duplicate": "Duplicate", "delete": "حذف", "remove": "إزالة", "enable": "تفعيل", @@ -65,16 +146,28 @@ "selectAll": "تحديد الكل", "deselectAll": "إلغاء تحديد الكل", "restore": "استعادة", + "discard": "Discard", "download": "تنزيل", "downloadAs": "تنزيل كـ {format}", "export": "تصدير", "exportAs": "تصدير كـ {format}", "recreate": "إعادة إنشاء", + "move": "Move", + "transfer": "Transfer", + "reattach": "Reattach", + "detach": "Detach", + "send": "Send", + "reset": "Reset", + "view": "View", "import": "استيراد", "details": "التفاصيل", + "loadLogs": "Load Logs", + "sendTestEmail": "Send Test Email", "setPrimary": "تعيين كأساسي", "unsetPrimary": "إلغاء التعيين كأساسي", - "leavePage": "مغادرة الصفحة" + "leavePage": "مغادرة الصفحة", + "viewDocumentation": "View Documentation", + "undo": "Undo" }, "alert": { "error": "خطأ", @@ -88,27 +181,76 @@ "input": { "search": "بحث..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "إعادة تعيين إلى الافتراضي", "edit": "تعديل", "delete": "حذف", - "primary": "أساسي" + "remove": "Remove", + "primary": "أساسي", + "backupOnDifferentNode": "This backup is on a different node than the server. It is not viewable from the Client API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "الاسم", + "newName": "New Name", "description": "الوصف", + "author": "Author", + "type": "Type", "password": "كلمة المرور", "host": "المضيف", "username": "اسم المستخدم", + "usernameOrEmail": "Username/Email", "server": "الخادم", "url": "URL", "email": "البريد الإلكتروني", + "path": "Path", "port": "المنفذ", + "provider": "Provider", "command": "الأمر", + "fromAddress": "From Address", + "fromName": "From Name", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "apiKey": "API Key", + "accessKey": "Access Key", + "bucket": "Bucket", + "region": "Region", + "endpoint": "Endpoint", + "publicUrl": "Public URL", "firstName": "الاسم الأول", "lastName": "اسم العائلة", "language": "اللغة", + "identifier": "Identifier", "enabled": "مفعّل", + "disabled": "Disabled", + "title": "Title", + "content": "Content", + "backupConfiguration": "Backup Configuration", "fileName": "اسم الملف", "sftpPort": "منفذ SFTP", "sftpHost": "مضيف SFTP", @@ -119,11 +261,26 @@ "startupCommand": "أمر بدء التشغيل", "archiveName": "اسم الأرشيف", "archiveFormat": "تنسيق الأرشيف", + "compressionLevel": "Compression Level", + "multiplexChannels": "Multiplex Channels", + "multiplexChannelsDescription": "Add additional HTTP connections (and therefore also threads) for transferring split archives, total streams is 1 + multiplex channels.", + "deleteSourceBackups": "Delete source backups", + "deleteSourceBackupsDescription": "Deletes the transferred backups on the source node once transfer finishes.", + "node": "Node", + "primaryAllocation": "Primary Allocation", + "additionalAllocations": "Additional Allocations", + "externalId": "External ID", + "mount": "Mount", + "nest": "Nest", + "lines": "Lines", "databaseHost": "مضيف قاعدة البيانات", + "databaseAgentHost": "Database Agent Host", "timezone": "المنطقة الزمنية", + "timezoneSystem": "System", "protocol": "البروتوكول", "powerAction": "إجراء الطاقة", "destination": "الوجهة", + "destinationDirectory": "Destination Directory", "directoryName": "اسم المجلد", "locked": "مقفل", "portRanges": "نطاقات المنافذ", @@ -131,10 +288,17 @@ "currentPassword": "كلمة المرور الحالية", "confirmPassword": "تأكيد كلمة المرور", "authenticationCode": "رمز المصادقة", + "restoreStartup": "Restore the startup command, image, and variables from this backup.", "lineContains": "السطر يحتوي", + "filePath": "File Path", + "envVariable": "Environment Variable", + "value": "Value", "eggs": "البيض", "ignoredFiles": "الملفات المتجاهلة", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "كلمة مرور لوحة التحكم الخاصة بك", + "deploymentEnabled": "Deployment Enabled", + "maintenanceEnabled": "Maintenance Enabled", "truncateDirectory": "هل تريد حذف جميع ملفات هذا الخادم قبل تنفيذ هذا الإجراء؟ لا يمكن التراجع عن هذا." }, "table": { @@ -143,27 +307,60 @@ "empty": "لم يتم العثور على عناصر، يبدو أنها مخفية." }, "columns": { + "id": "ID", "name": "الاسم", + "author": "Author", + "type": "Type", + "title": "Title", + "enabled": "Enabled", "description": "الوصف", "username": "اسم المستخدم", "size": "الحجم", "lastUsed": "آخر استخدام", "created": "تم الإنشاء", + "updated": "Updated", "actor": "الممثل", "event": "الحدث", "ip": "IP", "when": "متى", "command": "الأمر", - "notes": "ملاحظات" + "location": "Location", + "node": "Node", + "owner": "Owner", + "added": "Added", + "backupConfiguration": "Backup Configuration", + "status": "Status", + "allocation": "Allocation", + "notes": "ملاحظات", + "source": "Source", + "target": "Target", + "checksum": "Checksum", + "files": "Files", + "server": "Server", + "address": "Address", + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, + "tabs": { + "general": "General" + }, "badge": { "active": "نشط", "inactive": "غير نشط", "enabled": "مفعّل", "disabled": "معطّل", "successful": "ناجح", - "failed": "فشل" + "failed": "فشل", + "installed": "Installed" + }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" }, "server": { "noAllocation": "لا يوجد تخصيص", @@ -217,6 +414,12 @@ "stopped": "تم الإيقاف", "restarted": "تم إعادة التشغيل", "killed": "تم الإنهاء" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" } }, "unit": { @@ -233,15 +436,37 @@ "readOnly": "قراءة فقط", "na": "غير متوفر", "never": "أبداً", + "none": "None", + "unknown": "Unknown", "yes": "نعم", "no": "لا", "web": "الويب", "api": "API", + "default": "Default", + "custom": "Custom", "system": "النظام", "schedule": "الجدولة", "impersonatedBy": "تم انتحال صفته بواسطة {username}" }, "elements": { + "routeOrderEditor": { + "title": "Route Configuration", + "label": { + "route": "Route", + "divider": "Divider", + "redirect": "Redirect" + }, + "empty": "No routes configured. Add routes, dividers, or redirects below.", + "unnamed": "(unnamed)", + "dividerPlaceholder": "Divider label (optional)", + "redirectNamePlaceholder": "Redirect name", + "destinationPlaceholder": "Destination URL (e.g. https://...)", + "selectRoutePlaceholder": "Select a route…", + "button": { + "addDivider": "Add Divider", + "addRedirect": "Add Redirect" + } + }, "errorBoundary": { "message": "حدث خطأ أثناء عرض هذا العرض. حاول تحديث الصفحة.", "hideDetails": "إخفاء التفاصيل", @@ -257,6 +482,13 @@ "copyManual": "نسخ إلى الحافظة: Ctrl+C أو Command+C، Enter" } }, + "pasteOnClick": { + "toast": { + "pasted": "Pasted from clipboard.", + "failed": "Failed to paste from clipboard.", + "pasteManual": "Paste from clipboard: Ctrl+V or Command+V, Enter" + } + }, "estimatedTimeArrival": { "tooltip": { "estimating": "جاري تقدير وقت الإنجاز...", @@ -268,7 +500,8 @@ "container": { "alert": { "impersonating": "أنت حالياً تنتحل شخصية مستخدم. يرجى العلم أن إجراءاتك قد تؤثر على حساب المستخدم المنتحل. للخروج من وضع انتحال الشخصية، انقر على زر \"إيقاف انتحال الشخصية\" في الزاوية اليسرى السفلية." - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -276,22 +509,43 @@ "stopImpersonating": "إيقاف انتحال الشخصية", "openInVirtualWindow": "فتح في نافذة افتراضية", "openInPopup": "فتح في نافذة منبثقة", - "openInNewTab": "فتح في علامة تبويب جديدة" + "openInNewTab": "فتح في علامة تبويب جديدة", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { + "button": { + "copyPermissions": "Copy Permissions", + "pastePermissions": "Paste Permissions" + }, "selectedPermissions": "الأذونات المحددة ({count})", "noPermissions": "لم يتم تحديد أي أذونات." }, "selectInput": { "noResults": "لم يتم العثور على نتائج." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "ليس لديك إذن للحفظ.", "cantDelete": "ليس لديك إذن للحذف." } }, + "resource": { + "tooltip": { + "created": "{resource} created.", + "updated": "{resource} updated.", + "deleted": "{resource} deleted." + } + }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -308,6 +562,10 @@ "title": "غير موجود", "content": "لم يتم العثور على الصفحة التي تبحث عنها." }, + "suspended": { + "title": "Account Suspended", + "content": "Your account has been suspended. You cannot make changes to your account. Please contact an administrator for more information." + }, "serverConflict": { "title": "حالة خادم متضاربة", "contentSuspended": "هذا الخادم معلق ولا يمكن الوصول إليه.", @@ -331,7 +589,10 @@ "scheduleDynamicInput": { "none": "لا شيء", "variable": "متغير", - "enterVariable": "الرجاء إدخال اسم المتغير للتقييم." + "enterVariable": "الرجاء إدخال اسم المتغير للتقييم.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -350,6 +611,7 @@ "toast": { "backupCompleted": "تم إنشاء النسخة الاحتياطية بنجاح.", "backupFailed": "فشل إنشاء النسخة الاحتياطية.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "تم استعادة النسخة الاحتياطية بنجاح.", "installCompleted": "اكتمل تثبيت الخادم بنجاح.", "installFailed": "فشل تثبيت الخادم.", @@ -368,6 +630,7 @@ }, "copying": { "completed": "تم نسخ `{path}` إلى `{destination}` في {time}.", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", "failed": "فشل نسخ `{path}` إلى `{destination}`:\n{error}" }, "copyingMany": { @@ -385,13 +648,21 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "انتظار: {file}", "uploading": "جاري الرفع: {file}", "uploadingFolder": "جاري رفع المجلد: {folder} ({files})", + "rateLimited": "Your upload has been rate limited. Waiting...", + "cancelAllUploads": "Cancel all uploads", "toast": { "uploading": "بدأ رفع {files}...", "cancelledFile": "تم إلغاء رفع `{file}` بنجاح.", - "cancelledFolder": "تم إلغاء رفع `{folder}` ({files}) بنجاح." + "cancelledFolder": "تم إلغاء رفع `{folder}` ({files}) بنجاح.", + "cancelledAll": "All uploads have been cancelled.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -447,6 +718,8 @@ "form": { "locationName": "اسم الموقع", "locationNamePlaceholder": "منزلي", + "locationFlag": "Location Flag", + "locationFlagPlaceholder": "The best country", "backupName": "اسم تكوين النسخ الاحتياطي", "backupNamePlaceholder": "Unicorn Cloud", "backupDisk": "قرص النسخ الاحتياطي", @@ -525,6 +798,7 @@ }, "server": { "title": "الخادم", + "existingServer": "A server has already been created. You can change the settings later in the admin menu.", "egg": { "title": "البيضة", "description": "لنقم بإعداد خادمك الأول وتشغيله. ما هي البيضة التي ترغب في استخدامها؟", @@ -570,9 +844,14 @@ "login": "تسجيل الدخول", "loginWith": "تسجيل الدخول بـ {name}" }, + "alert": { + "urlMismatch": "The application URL does not match the current URL. Expected: `{appUrl}`, Current: `{currentUrl}`." + }, "login": { "error": { - "usernameRequired": "الرجاء إدخال اسم المستخدم" + "usernameRequired": "الرجاء إدخال اسم المستخدم", + "registrationDisabled": "No matching Account could be found and registration is currently disabled.", + "userAlreadyExists": "An account with this username or email already exists." }, "passkey": { "error": { @@ -590,6 +869,10 @@ "step": { "username": { "title": "تسجيل الدخول", + "subtitle": "Enter your username or email address to continue", + "form": { + "usernameOrEmailPlaceholder": "Your username or email address" + }, "link": { "forgotPassword": "نسيت كلمة المرور", "notRegistered": "غير مسجل؟", @@ -678,6 +961,9 @@ "noGroups": "لا توجد مجموعات متاحة لإضافة الخادم إليها", "noGroup": "هذا الخادم ليس في أي مجموعة" }, + "badge": { + "foreign": "Foreign" + }, "tabs": { "groupedServers": { "title": "الخوادم المجمعة", @@ -711,6 +997,13 @@ "toast": { "added": "تمت إضافة الخادم إلى المجموعة." } + }, + "removeServerFromGroup": { + "title": "Confirm Server Removal", + "content": "Are you sure you want to remove **{server}** from **{group}**?", + "toast": { + "removed": "Server removed from group." + } } }, "noGroups": "لم يتم العثور على مجموعات، حان الوقت لإنشاء واحدة؟" @@ -752,6 +1045,10 @@ "requireTwoFactor": { "title": "مطلوب المصادقة الثنائية", "description": "المصادقة الثنائية مطلوبة على حسابك. يرجى إعدادها أدناه لمواصلة استخدام اللوحة." + }, + "frozen": { + "title": "Account Frozen", + "description": "Your account has been frozen. You cannot make changes to your account until it is unfrozen. Please contact an administrator for more information." } }, "containers": { @@ -827,13 +1124,15 @@ }, "securityKeys": { "title": "مفاتيح الأمان", + "subtitle": "{current} of {max} maximum security keys created.", "table": { "columns": { "credentialId": "معرف الاعتماد" } }, "tooltip": { - "secureContextRequired": "مطلوب سياق آمن (HTTPS) لاستخدام مفاتيح الأمان." + "secureContextRequired": "مطلوب سياق آمن (HTTPS) لاستخدام مفاتيح الأمان.", + "limitReached": "You are limited to {max} security keys." }, "modal": { "createSecurityKey": { @@ -882,6 +1181,23 @@ "subtitle": "استخدم هذه الاختصارات للتنقل والتفاعل مع اللوحة بشكل أكثر كفاءة.", "detectedMac": "تم اكتشاف macOS", "detectedWindows": "تم اكتشاف Windows/Linux", + "label": { + "disabled": "Disabled", + "modified": "Modified", + "recording": "Press keys..." + }, + "button": { + "rebind": "Rebind", + "resetAll": "Reset All", + "copy": "Copy All", + "paste": "Paste" + }, + "toast": { + "imported": "Updated {shortcuts}.", + "importedNone": "No shortcuts were changed.", + "importErrors": "Ignored {unknown} and {invalid}.", + "resetAll": "All shortcuts reset to defaults." + }, "fileManager": { "title": "مدير الملفات", "selectAll": "تحديد جميع الملفات", @@ -917,6 +1233,10 @@ }, "sshKeys": { "title": "مفاتيح SSH", + "subtitle": "{current} of {max} maximum ssh keys created.", + "tooltip": { + "limitReached": "You are limited to {max} ssh keys." + }, "table": { "columns": { "fingerprint": "البصمة" @@ -961,6 +1281,10 @@ }, "commandSnippets": { "title": "قصاصات الأوامر", + "subtitle": "{current} of {max} maximum command snippets created.", + "tooltip": { + "limitReached": "You are limited to {max} command snippets." + }, "modal": { "createCommandSnippet": { "title": "إنشاء قصاصة أمر", @@ -980,6 +1304,12 @@ "toast": { "removed": "تم إزالة قصاصة الأوامر." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1006,9 +1336,13 @@ }, "apiKeys": { "title": "مفاتيح API", + "subtitle": "{current} of {max} maximum api keys created.", "button": { "apiDocumentation": "وثائق API" }, + "tooltip": { + "limitReached": "You are limited to {max} api keys." + }, "table": { "columns": { "key": "المفتاح", @@ -1042,6 +1376,12 @@ "toast": { "removed": "تم إزالة مفتاح API." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1050,67 +1390,2612 @@ "userPermissions": "أذونات المستخدم", "serverPermissions": "أذونات الخادم", "adminPermissions": "أذونات المسؤول" + }, + "create": { + "title": "Create API Key", + "subtitle": "An application is requesting an API key to be created for your account.", + "alert": { + "adminPermissions": "This API key requests **admin permissions**. Anyone in possession of this key will be able to perform administrative actions on this panel in your name. Only continue if you absolutely trust the requesting application.", + "callbackUrl": "After creation, the new API key will be sent to **{url}**." + }, + "noPermissions": "This API key will not have any permissions.", + "keyCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "button": { + "goToApiKeys": "Go to API Keys" + } } }, "activity": { "title": "النشاط" } }, - "server": { - "viewAdmin": { - "title": "عرض المسؤول" + "admin": { + "home": { + "title": "Home", + "alert": { + "newPanelVersion": "A new version is available for the panel! You are currently on {current} and the latest version is {latest}. You may want to consider upgrading. [Click here]({upgradeUrl}) to view upgrade instructions." + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "permissionDenied": "You do not have permission to read the statistics that would have been here otherwise. For now, enjoy this bird.", + "card": { + "systemOverview": "System Overview", + "generalStatistics": "General Statistics", + "backupStatistics": "Backup Statistics" + }, + "system": { + "cpu": "CPU", + "memoryUsage": "Memory Usage ({process} used by Panel)", + "memoryValue": "{used} / {total} ({percent}%)", + "kernelVersion": "Kernel Version ({architecture})", + "containerType": "Container Type", + "databaseVersion": "Database Version ({size})", + "cacheVersion": "Cache Version", + "cacheCalls": "Cache Calls", + "cacheHits": "Cache Hits ({percent}%)", + "cacheMisses": "Cache Misses ({percent}%)", + "avgCachedCallLatency": "Avg. Cached Call Latency" + }, + "containerType": { + "none": "None detected", + "official": "Official", + "officialAio": "Official AIO", + "officialHeavy": "Official Heavy" + }, + "stats": { + "users": "Users", + "servers": "Servers", + "locations": "Locations", + "nodes": "Nodes", + "nestEggs": "Nest Eggs", + "databaseHosts": "Database Hosts", + "backupConfigurations": "Backup Configurations", + "roles": "Roles" + }, + "backup": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month", + "totalAllTime": "Total backups all time", + "successfulAllTime": "Successful backups all time", + "failedAllTime": "Failed backups all time", + "deletedAllTime": "Deleted backups all time", + "totalToday": "Total backups today", + "successfulToday": "Successful backups today", + "failedToday": "Failed backups today", + "deletedToday": "Deleted backups today", + "totalWeek": "Total backups this week", + "successfulWeek": "Successful backups this week", + "failedWeek": "Failed backups this week", + "deletedWeek": "Deleted backups this week", + "totalMonth": "Total backups this month", + "successfulMonth": "Successful backups this month", + "failedMonth": "Failed backups this month", + "deletedMonth": "Deleted backups this month", + "successfulValue": "{count} ({size})", + "deletedValue": "{count} ({size})" + } + } + }, + "updates": { + "title": "Updates", + "page": { + "alert": { + "extensionUpdateErrors": "There were errors checking for updates for some extensions." + }, + "card": { + "panelVersion": "Panel Version", + "versionHistory": "Version History", + "outdatedExtensions": "Outdated Extensions", + "outdatedNodes": "Outdated Nodes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" + }, + "panelVersion": "Your panel is currently running version `{current}`. The latest available version is `{latest}`.", + "unknown": "unknown", + "button": { + "recheck": "Recheck for Updates" + }, + "toast": { + "recheckComplete": "Recheck complete." + }, + "selectHistory": "Select an update history to view.", + "historyPanel": "Panel", + "historyExtension": "Extension: {name}", + "extensionsUpToDate": "All extensions are up to date.", + "extensionsOutdated": "Some extensions are outdated or had errors when checking for updates.", + "noChangelog": "No changelog", + "nodesUpToDate": "Seems like all nodes are up to date. ({failed} failed to check)", + "nodesOutdated": "Some nodes are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "table": { + "version": "Version", + "installed": "Installed", + "packageName": "Package Name", + "latestVersion": "Latest Version", + "changes": "Changes", + "error": "Error" + } + } + }, + "health": { + "title": "Health", + "page": { + "card": { + "generalHealth": "General Health", + "extensionMigrationHealth": "Extension Migration Health", + "desyncNodes": "Desync Nodes", + "debugMode": "Debug Mode" + }, + "appliedMigrations": "Applied Migrations ({percent}%)", + "migrationsValue": "{applied} / {total}", + "avgNtpOffset": "Avg. NTP Offset", + "noExtensions": "No extensions found.", + "nodesSynced": "Seems like all nodes have a synced clock (within 5 seconds of panel clock). ({failed} failed to check)", + "nodesDesync": "Some nodes have desync clocks (over 5 seconds off of the panel's clock). This can cause file download/console issues. ({desync} desync, {failed} failed to check)", + "debugEnabled": "Debug mode is currently enabled.", + "debugDisabled": "Debug mode is currently disabled.", + "debugResetNote": "This setting will be reset to the default ({default}) when the application restarts.", + "table": { + "packageName": "Package Name", + "applied": "Applied", + "total": "Total", + "id": "ID", + "desync": "Desync", + "appliedValue": "{applied} ({percent}%)" + }, + "button": { + "enableDebug": "Enable Debug Mode", + "disableDebug": "Disable Debug Mode" + }, + "toast": { + "debugEnabled": "Debug mode enabled.", + "debugDisabled": "Debug mode disabled." + } + } + } + } }, - "console": { - "title": "وحدة التحكم", - "input": { - "placeholder": "اكتب أمراً...", - "ariaLabel": "إدخال أمر وحدة التحكم." + "settings": { + "title": "Settings", + "tabs": { + "application": { + "title": "Application", + "page": { + "title": "Application Settings", + "form": { + "icon": "Icon", + "iconLight": "Icon (Light Mode)", + "banner": "Banner", + "bannerLight": "Banner (Light Mode)", + "sessionCookie": "Session Cookie", + "sessionDurationSeconds": "Session Duration (seconds)", + "twoFactorRequirement": "Two-Factor Authentication Requirement", + "telemetryEnabled": "Enable Telemetry", + "telemetryEnabledDescription": "Allow Calagopus to collect limited and anonymous usage data to help improve the application.", + "registrationEnabled": "Enable Registration" + }, + "enum": { + "twoFactorRequirement": { + "admins": "Admins", + "allUsers": "All Users", + "none": "None" + } + }, + "button": { + "previewTelemetry": "Preview Telemetry" + }, + "toast": { + "updated": "Application settings updated." + }, + "modal": { + "disableTelemetry": { + "title": "Confirm Disabling Telemetry", + "content": "Are you sure you want to disable telemetry? Telemetry helps us improve Calagopus by providing anonymous usage data. Disabling telemetry will prevent any data from being sent." + }, + "enableRegistration": { + "title": "Confirm Enabling Registration", + "content": "Are you sure you want to enable registration? Enabling registration allows anyone to create an account on this panel. If you do not have a captcha configured, this may be a mistake." + }, + "telemetryPreview": { + "title": "Telemetry Preview" + } + } + } + }, + "storage": { + "title": "Storage", + "page": { + "title": "Storage Settings", + "form": { + "driver": "Driver" + }, + "enum": { + "driver": { + "filesystem": "Filesystem", + "s3": "S3" + } + }, + "toast": { + "updated": "Storage settings updated." + }, + "modal": { + "changeStorageType": { + "title": "Confirm Changing Storage Type", + "content": "Are you sure you want to change the storage type? Changing the storage type will cause the application to look for assets (e.g. profile pictures) in a different location, which may result in missing assets if they are not moved to the new location manually." + } + }, + "s3": { + "alert": { + "permissionsTitle": "Note on Permissions", + "permissionsIntro": "To ensure that the storage backend works correctly, please make sure the following subdirectories are publicly accessible over the \"Public URL\" you provided:", + "permissionsAssets": "This is where all admin assets (e.g., icons) will be stored.", + "permissionsAvatars": "This is where all user avatars will be stored.", + "permissionsPublicData": "This is where extensions can store public data (e.g., images)." + }, + "form": { + "pathStyle": "Using path-style URLs" + } + } + } + }, + "mail": { + "title": "Mail", + "page": { + "title": "Email Settings", + "enum": { + "provider": { + "none": "None", + "smtp": "SMTP", + "sendmail": "Sendmail Command", + "filesystem": "Filesystem" + }, + "tlsMode": { + "none": "None", + "startTls": "STARTTLS", + "implicitTls": "Implicit TLS" + } + }, + "toast": { + "updated": "Email settings updated." + }, + "modal": { + "sendTestEmail": { + "title": "Send Test Email", + "toast": { + "sent": "Test email has been sent successfully." + } + } + }, + "smtp": { + "form": { + "tlsMode": "TLS Mode", + "skipCertValidation": "Skip Certificate Validation" + } + } + } + }, + "mailTemplates": { + "title": "Mail Templates", + "page": { + "title": "Email Template Settings", + "sidebar": { + "templates": "Templates", + "loading": "Loading...", + "availableVariables": "Available Variables" + }, + "alert": { + "syntaxBefore": "Templates use the", + "syntaxLink": "MiniJinja", + "syntaxMiddle": "templating syntax. Variables are referenced with", + "syntaxAnd": "and control structures like", + "syntaxOr": "and", + "syntaxAfter": "are supported." + }, + "empty": "Select a template from the sidebar to edit it.", + "loadingTemplate": "Loading template...", + "form": { + "subject": "Subject" + }, + "toast": { + "saved": "Email template saved.", + "reset": "Email template reset to default." + }, + "modal": { + "reset": { + "title": "Reset to default", + "content": "This will discard your custom template for **{identifier}** and restore the built-in default. This cannot be undone." + } + } + } + }, + "captcha": { + "title": "Captcha", + "page": { + "title": "Captcha Settings", + "toast": { + "updated": "Captcha settings updated." + }, + "recaptcha": { + "form": { + "v3": "V3" + } + } + } + }, + "webauthn": { + "title": "Webauthn", + "page": { + "title": "Webauthn Settings", + "form": { + "rpId": "RP Id", + "rpOrigin": "RP Origin" + }, + "button": { + "autofill": "Autofill" + }, + "toast": { + "updated": "Webauthn settings updated.", + "ipNotAllowed": "Cannot use WebAuthn on an IP address." + }, + "modal": { + "changeRpId": { + "title": "Confirm Changing RP Id", + "content": "Are you sure you want to change the RP Id? Changing the RP Id will break all existing Webauthn credentials and require users to re-register their devices. This can have significant consequences, so please make sure you understand the implications before proceeding." + } + } + } + }, + "server": { + "title": "Server", + "page": { + "title": "Server Settings", + "form": { + "maxFileManagerViewSize": "Max File Manager View Size", + "maxScheduleStepCount": "Max Schedule Steps", + "maxFileManagerContentSearchSize": "Max File Manager Content Search Size", + "maxFileManagerSearchResults": "Max File Manager Search Results", + "maxSubuserCount": "Max Subuser Count", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", + "allowOverwritingCustomDockerImage": "Allow Overwriting Custom Docker Image", + "allowOverwritingCustomDockerImageDescription": "If enabled, users will be able to overwrite the Docker image specified in the server configuration using the Eggs list, even if an admin has set a custom Docker image.", + "allowViewingInstallationLogs": "Allow Viewing Installation Logs", + "allowViewingInstallationLogsDescription": "If enabled, users with console read permissions will also be able to view installation logs via the websocket connection. If disabled, installation logs will only be available for admins.", + "allowAcknowledgingInstallationFailure": "Allow Acknowledging Installation Failure", + "allowAcknowledgingInstallationFailureDescription": "If enabled, users will be able to acknowledge installation failures for servers that are in the \"Install Failed\" state, allowing them to attempt to start the server instead of having to wait for an admin. If disabled, only admins will be able to acknowledge installation failures.", + "allowViewingTransferProgress": "Allow Viewing Transfer Progress", + "allowViewingTransferProgressDescription": "If enabled, users with console read permissions will also be able to view transfer progress logs via the websocket connection. If disabled, transfer progress logs will only be available for admins.", + "containerPrelude": "Container Prelude", + "containerPreludeDescription": "The terminal prelude used for some status-related messages in the server console." + }, + "toast": { + "updated": "Server settings updated." + } + } + }, + "user": { + "title": "User", + "page": { + "title": "User Settings", + "form": { + "maxServerGroupCount": "Max Server Groups", + "maxApiKeyCount": "Max API Keys", + "maxCommandSnippetCount": "Max Command Snippets", + "maxSecurityKeyCount": "Max Security Keys", + "maxSshKeyCount": "Max SSH Keys", + "allowChangingLanguage": "Allow Changing Language", + "allowChangingLanguageDescription": "If enabled, users will be able to change their language preferences." + }, + "routeOrder": { + "title": "Client Route Order" + }, + "toast": { + "updated": "User settings updated." + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "Activity Settings", + "form": { + "adminLogRetentionDays": "Admin Activity Retention Days", + "userLogRetentionDays": "User Activity Retention Days", + "serverLogRetentionDays": "Server Activity Retention Days", + "adminLogRetentionCount": "Admin Activity Retention Count", + "userLogRetentionCount": "User Activity Retention Count", + "serverLogRetentionCount": "Server Activity Retention Count", + "serverLogAdminActivity": "Log Server Admin Activity", + "serverLogAdminActivityDescription": "Enable or disable logging of admin activity on servers where the admin isn't an owner or subuser.", + "serverLogScheduleActivity": "Log Server Schedule Activity", + "serverLogScheduleActivityDescription": "Enable or disable logging of activity done by server schedules." + }, + "toast": { + "updated": "Activity settings updated." + } + } + }, + "ratelimits": { + "title": "Ratelimits", + "page": { + "title": "Ratelimit Settings", + "form": { + "hits": "Hits", + "hitsDescription": "Maximum number of requests allowed per window.", + "windowSeconds": "Window", + "windowSecondsDescription": "Window duration in seconds." + }, + "toast": { + "updated": "Rate limit settings updated." + } + } + } + } + }, + "announcements": { + "title": "Announcements", + "resourceName": "Announcement", + "tabs": { + "general": { + "page": { + "modal": { + "delete": { + "title": "Confirm Announcement Deletion", + "content": "Are you sure you want to delete **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" + } + }, + "form": { + "dismissibleEnd": "Dismissible End", + "enabledStart": "Enabled Start", + "enabledEnd": "Enabled End", + "locations": "Locations", + "locationsDescription": "Leave empty to apply to all locations.", + "nodes": "Nodes", + "nodesDescription": "Leave empty to apply to all nodes.", + "backupConfigurations": "Backup Configurations", + "backupConfigurationsDescription": "Leave empty to apply to all backup configurations.", + "eggsPlaceholder": "Select Eggs", + "dismissible": "Dismissible" + }, + "titleCreate": "Create Announcement", + "titleUpdate": "Update Announcement" + } + } + }, + "enum": { + "announcementType": { + "info": "Info", + "success": "Success", + "warning": "Warning", + "error": "Error" + } + } + }, + "assets": { + "title": "Assets", + "button": { + "newDirectory": "New Directory", + "upload": "Upload", + "copyLink": "Copy Link" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" }, "toast": { - "installCancelled": "تم إلغاء تثبيت الخادم." + "assetDeleted": "Asset deleted.", + "assetsDeleted": "{assets} deleted." }, "modal": { - "sshDetails": { - "title": "تفاصيل SSH", - "form": { - "command": "أمر SSH" - }, - "launch": "إطلاق" + "createDirectory": { + "title": "New Directory", + "createdAs": "Will be created at " + }, + "deleteAssets": { + "title": "Confirm Asset Deletion", + "content": "Are you sure you want to delete `{count}` assets?" + }, + "deleteAsset": { + "title": "Delete Asset", + "content": "Are you sure you want to delete this asset? This action cannot be undone." } + } + }, + "extensions": { + "title": "Extensions", + "unknownExtension": "Unknown Extension", + "alert": { + "noExtensions": "No extensions installed.", + "heavyImageMissing": "You don't seem to be using the heavy image required to install extensions, see [here]({docsUrl}) on how to switch to it." }, - "notification": { - "suspended": "خادمك معلق حالياً. لا يمكن تنفيذ أي إجراءات حتى يتم رفع التعليق.", - "suspendedAdmin": "هذا الخادم معلق حالياً. بما أنك مسؤول، يمكنك لا يزال الوصول إلى الخادم، ولكن الإجراءات محدودة.", - "nodeMaintenance": "خادمك على عقدة قيد الصيانة حالياً.", - "transferring": "خادمك قيد النقل حالياً إلى عقدة أخرى.", - "restoringBackup": "خادمك يستعيد من نسخة احتياطية حالياً. يرجى الانتظار...", - "installing": "خادمك قيد التثبيت حالياً. يرجى الانتظار..." - }, - "message": { - "serverMarkedAs": "تم وضع علامة على الخادم كـ {state}...", - "installFailed": "فشل التثبيت.", - "installCompleted": "اكتمل التثبيت بنجاح.", - "transferFailed": "فشل النقل.", - "transferCompleted": "اكتمل النقل بنجاح. جاري إعادة الاتصال بالخادم...", - "pullingImage": "خادمك يسحب صورة docker حالياً. يرجى الانتظار...", - "pulling": "جاري السحب", - "extracting": "جاري الاستخراج" + "button": { + "viewBuildLogs": "View build logs", + "install": "Install extension", + "rebuild": "Rebuild extensions", + "configure": "Configure", + "back": "Back to Extensions", + "accept": "Accept", + "decline": "Decline" }, "tooltip": { - "search": "بحث", - "sshDetails": "تفاصيل SSH", - "commandHistory": "سجل الأوامر", - "decreaseFontSize": "تقليل حجم الخط", - "increaseFontSize": "زيادة حجم الخط" + "building": "The panel is currently building extension code. Please wait.", + "noPendingBuild": "No pending extensions to build.", + "noBackend": "Backend extension is required to configure this extension.", + "noConfigurationPage": "This extension does not have a configuration page defined.", + "removeExtension": "Remove extension" }, - "drawer": { - "commandHistory": { - "title": "سجل الأوامر", - "detailTitle": "تفاصيل الأمر", - "noCommands": "لم يتم العثور على أوامر.", - "copyButton": "نسخ الأمر", - "sendButton": "إرسال الأمر", - "commandSent": "تم إرسال الأمر بنجاح." + "badge": { + "frontendMissing": "Frontend missing", + "backendMissing": "Backend missing", + "pendingBuild": "Pending build", + "pendingRemoval": "Pending removal" + }, + "card": { + "version": "Version", + "authors": "Authors" + }, + "section": { + "pendingExtensions": "Pending extensions", + "noPendingExtensions": "No pending extensions." + }, + "dropzone": { + "title": "Drop some files here to install as Extensions", + "subtitle": "Release to start installing" + }, + "toast": { + "buildStarted": "Extension rebuild started successfully.", + "buildCompleted": "Extension build completed. You may need to refresh the page.", + "added": "Extension `{packageName}` added successfully.", + "removed": "Extension `{packageName}` removed successfully." + }, + "notFound": { + "title": "Extension Not Found", + "content": "Extension with package name \"{packageName}\" not found." + }, + "configure": { + "title": "Configure {packageName}", + "noConfigurationPage": "This extension does not have a configuration page." + }, + "modal": { + "buildLogs": { + "title": "Build Logs", + "empty": "No logs found." + }, + "license": { + "title": "License agreement", + "description": "The extension `{packageName}` requires you to accept the following license before it can be installed." + }, + "remove": { + "title": "Remove extension", + "content": "Are you sure you want to remove the extension `{packageName}`? This action cannot be undone.", + "form": { + "removeMigrations": "Do you want to remove & rollback the database migrations of this extension?" + } + } + } + }, + "users": { + "title": "Users", + "resourceName": "User", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, + "tooltip": { + "admin": "Admin", + "twoFactorEnabled": "2FA Enabled", + "twoFactorDisabled": "2FA Disabled" + }, + "table": { + "columns": { + "role": "Role" + } + }, + "tabs": { + "general": { + "page": { + "tooltip": { + "cannotImpersonateSelf": "You cannot impersonate yourself." + }, + "button": { + "disableTwoFactor": "Disable Two Factor", + "sendPasswordResetEmail": "Send Password Reset Email", + "impersonate": "Impersonate" + }, + "form": { + "admin": "Admin", + "adminDescription": "Admin users have full, unrestricted access to everything on the panel.", + "frozen": "Frozen", + "frozenDescription": "Frozen users cannot make any changes to their account information.", + "suspended": "Suspended", + "suspendedDescription": "Suspended users cannot access the panel in any meaningful way.", + "role": "Role" + }, + "modal": { + "delete": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete **{username}**?" + }, + "disableTwoFactor": { + "title": "Disable User Two Factor", + "content": "Are you sure you want to remove the two factor of **{username}**?", + "toast": { + "disabled": "User two factor disabled." + } + }, + "sendPasswordResetEmail": { + "title": "Send Password Reset Email", + "content": "Are you sure you want to send a password reset email to **{email}**?", + "toast": { + "sent": "Password reset email sent." + } + } + }, + "titleCreate": "Create User", + "titleUpdate": "Update User" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "User Servers", + "showOwnedOnly": "Only show users' owned servers" + } + }, + "oauthLinks": { + "title": "OAuth Links", + "page": { + "title": "User OAuth Links", + "toast": { + "added": "OAuth Link added.", + "removed": "OAuth Link removed." + }, + "modal": { + "add": { + "title": "Add OAuth Link", + "form": { + "oauthProvider": "OAuth Provider" + } + }, + "delete": { + "title": "Confirm OAuth Link Deletion", + "content": "Are you sure you want to delete the **{provider}** connection from **{username}**?" + } + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "User Activity" + } + } + } + }, + "locations": { + "title": "Locations", + "resourceName": "Location", + "tabs": { + "general": { + "page": { + "form": { + "flag": "Flag" + }, + "modal": { + "delete": { + "title": "Confirm Location Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "titleCreate": "Create Location", + "titleUpdate": "Update Location" + } + }, + "databaseHosts": { + "title": "Database Hosts", + "page": { + "title": "Location Database Hosts", + "toast": { + "created": "Location database host created.", + "deleted": "Location database host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Host" + }, + "delete": { + "title": "Confirm Location Database Host Deletion", + "content": "Are you sure you want to delete the database host **{name}** from **{location}**?" + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Location Nodes" + } + } + } + }, + "nodes": { + "title": "Nodes", + "resourceName": "Node", + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "general": { + "page": { + "tooltip": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "allInOneNode": "All-in-One Node", + "errorWhileFetchingVersion": "Error while fetching version", + "updateAvailable": "{version} (Update Available)", + "useWingsProxyUrl": "Use Wings Proxy URL" + }, + "form": { + "urlDescription": "Used for internal communication with the node.", + "publicUrlDescription": "Used for websocket connections and downloads.", + "backupConfigurationPlaceholder": "Inherit from Location", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." + }, + "button": { + "resetToken": "Reset Token", + "updateConfig": "Update Config" + }, + "toast": { + "tokenReset": "Node token reset." + }, + "alert": { + "noLocations": "You need to create at least one location before you can create nodes. Locations help organize your nodes geographically or logically." + }, + "titleCreate": "Create Node", + "titleUpdate": "Update Node" + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/pterodactyl/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "panelUrl": "Panel URL", + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the node: {error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Node Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "toast": { + "connectionLost": "Lost connection to the node statistics stream." + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "cpuThreads": "{model} ({threads} threads)", + "usedByWings": "{size} used by Wings", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "networkTraffic": "Network Traffic", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "inbound": "Inbound", + "outbound": "Outbound", + "networkInLabel": "Network In", + "networkOutLabel": "Network Out" + } + } + }, + "capacity": { + "title": "Capacity", + "page": { + "title": "Deployment Capacity", + "subtitle": "Resources allocated to servers on this node, measured against the limits configured in node settings, not the physical machine capacity. Deployment only checks memory and disk.", + "card": { + "resources": "Allocated Resources" + }, + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Under Maintenance", + "maintenanceDisabled": "Not Under Maintenance" + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "memoryOverhead": "Memory Overhead", + "servers": "Servers", + "noLimit": "No node limit", + "free": "{size} free", + "overhead": "+ {size} reserved overhead", + "cores": "{cores} cores allocated" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Node Logs", + "form": { + "logFile": "Log File", + "follow": "Follow" + }, + "button": { + "download": "Download Full Log" + }, + "toast": { + "connectionLost": "Lost connection to the node log stream." + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Node Allocations", + "tooltip": { + "clearSelection": "Clear Selection" + }, + "form": { + "ipAlias": "IP Alias" + }, + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "modal": { + "create": { + "title": "Create Node Allocations", + "button": { + "create": "Create {count}" + }, + "toast": { + "created": "{allocations} created." + } + }, + "update": { + "title": "Update Node Allocations", + "toast": { + "updated": "{allocations} updated." + } + }, + "delete": { + "title": "Confirm Node Allocations Deletion", + "content": "Are you sure you want to delete `{count}` allocations from **{name}**?", + "toast": { + "deleted": "{allocations} deleted." + } + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Node Mounts", + "toast": { + "added": "Node Mount added.", + "removed": "Node Mount removed." + }, + "modal": { + "add": { + "title": "Add Node Mount" + }, + "remove": { + "title": "Confirm Node Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Node Backups", + "input": { + "detachedOnly": "Only show detached backups" + }, + "tooltip": { + "backupNotOnSameNode": "This backup is not on the same node as the server. It is not viewable from the Client API." + }, + "toast": { + "downloadStarted": "Download started.", + "detached": "Backup detached successfully.", + "reattached": "Reattached backup to {name} successfully.", + "restoring": "Restoring backup to {name}...", + "exporting": "Exporting backup to files of {name}...", + "deleted": "Node backup deleted." + }, + "modal": { + "export": { + "title": "Export Node Backup to Files" + }, + "detach": { + "title": "Confirm Backup Detachment", + "content": "Are you sure you want to detach this backup from its server? It will not be deleted and can be reattached later." + }, + "reattach": { + "title": "Reattach Node Backup", + "description": "Reattaching a node backup will link it to a server. This is useful if the backup is detached or you want to link it to a different server. Do note that this is not a transfer tool, unless the backup is considered remote (can be accessed by multiple nodes), the server must belong to the same node as the backup." + }, + "restore": { + "title": "Restore Node Backup", + "form": { + "truncateDirectory": "Do you want to empty the filesystem of this server before restoring the backup?" + } + }, + "delete": { + "title": "Confirm Node Backup Deletion", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Node Servers", + "modal": { + "transfer": { + "title": "Transfer Servers", + "form": { + "allocationMode": "Allocation Mode", + "transferBackups": "Transfer backups", + "transferBackupsDescription": "Whether to transfer backups along with the servers." + }, + "toast": { + "started": "{servers} transfer started." + }, + "confirm": { + "title": "Confirm Server Transfers", + "content": "Are you sure you want to transfer `{count}` servers from **{from}** to **{to}**? This action cannot be undone." + }, + "enum": { + "allocationMode": { + "none": "None (scrap all allocations, server will not be automatically assigned new allocations on the destination node)", + "randomPrimary": "Randomize primary allocation (removes additional allocations)", + "randomAll": "Randomize all allocations (recommended to avoid incompatibility issues with destination node)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", + "eggConfigDeployment": "Assign allocations based on Egg deployment configuration (only works if the Egg has a deployment configuration and the destination node has compatible allocations)", + "eggConfigSelfAssignRange": "Self-assign new allocations based on Egg port range (only works if the Egg has a port range and the destination node has compatible allocations)" + } + } + }, + "powerAction": { + "title": "Confirm Power Action", + "content": "Are you sure you want to **{action}** {servers}?" + } + } + } + }, + "transfers": { + "title": "Outgoing Transfers", + "page": { + "title": "Node Transfers", + "table": { + "columns": { + "progress": "Progress", + "archiveRate": "Archive Rate", + "networkRate": "Network Rate" + } + } + } + } + }, + "modal": { + "delete": { + "title": "Confirm Node Deletion", + "content": "Are you sure you want to delete **{name}**?" + }, + "bulkConfig": { + "title": "Update Configuration - {nodes}", + "button": { + "apply": "Apply to {nodes}" + }, + "toast": { + "applied": "Configuration applied to {nodes}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "servers": { + "title": "Servers", + "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, + "general": { + "page": { + "titleCreate": "Create Server", + "titleUpdate": "Update Server", + "card": { + "basicInformation": "Basic Information", + "serverAssignment": "Server Assignment", + "resourceLimits": "Resource Limits", + "serverConfiguration": "Server Configuration", + "featureLimits": "Feature Limits", + "allocations": "Allocations", + "variables": "Variables" + }, + "alert": { + "suspended": "This server is suspended.", + "selectEggForVariables": "Please select an egg before you can configure variables." + }, + "badge": { + "serverSuspended": "Server Suspended" + }, + "form": { + "serverNamePlaceholder": "My Game Server", + "externalIdPlaceholder": "Optional external identifier", + "descriptionPlaceholder": "Server description", + "owner": "Owner", + "egg": "Egg", + "backupConfigurationPlaceholder": "Inherit from Node/Location", + "cpuLimit": "CPU Limit (%)", + "cpuLimitDescription": "The CPU limit in % that the server can use.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this server.", + "swapTooltip": "-1 will not set a limit.", + "memoryDescription": "The Memory limit of the server container.", + "memoryTooltip": "0 will not set a limit.", + "memoryOverhead": "Memory Overhead", + "memoryOverheadDescription": "Hidden Memory that will be added to the container.", + "diskSpace": "Disk Space", + "diskSpaceDescription": "The disk limit of the server.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the server container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems.", + "pinnedCpus": "Pinned CPUs", + "pinnedCpusDescription": "The CPU cores this server is pinned to.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", + "dockerImagePlaceholder": "ghcr.io/...", + "predefinedDockerImages": "Predefined Docker Images", + "predefinedDockerImagesPlaceholder": "No predefined image selected", + "timezonePlaceholder": "Europe/Amsterdam", + "startupCommandPlaceholder": "npm start", + "startupCommandCustom": "Custom", + "predefinedStartupCommands": "Predefined Startup Commands", + "startOnCompletion": "Start on Completion", + "startOnCompletionDescription": "Start server after installation completes.", + "skipInstaller": "Skip Installer", + "skipInstallerDescription": "Skip running the install script.", + "hugepagesPassthroughEnabled": "Enable Hugepages Passthrough", + "hugepagesPassthroughEnabledDescription": "Enable hugepages passthrough for the server (mounts /dev/hugepages into the container).", + "kvmPassthroughEnabled": "Enable KVM Passthrough", + "kvmPassthroughEnabledDescription": "Enable KVM passthrough for the server (allows access to /dev/kvm inside the container).", + "allocationsLimit": "Allocations", + "databasesLimit": "Databases", + "databaseAgentsLimit": "Agent Databases", + "backupsLimit": "Backups", + "schedulesLimit": "Schedules" + }, + "modal": { + "confirmNoAllocation": { + "title": "No Primary Allocation Assigned", + "content": "You are creating a server without assigning any primary allocation. Are you sure you want to continue?", + "button": { + "confirm": "Create Anyway" + } + } + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Server Allocations", + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "form": { + "notesPlaceholder": "Notes" + }, + "toast": { + "updated": "Allocation updated.", + "setPrimary": "Allocation set as primary.", + "unsetPrimary": "Allocation unset as primary.", + "removed": "Allocation removed.", + "added": "{count} allocations added." + }, + "modal": { + "add": { + "title": "Add Server Allocations", + "form": { + "allocations": "Allocations" + }, + "button": { + "add": "Add {count}" + } + }, + "remove": { + "title": "Confirm Allocation Removal", + "content": "Are you sure you want to remove **{allocation}**?" + } + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Server Variables", + "toast": { + "updated": "Server variables updated." + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Server Mounts", + "toast": { + "added": "Server Mount added.", + "deleted": "Server Mount deleted." + }, + "modal": { + "add": { + "title": "Add Server Mount" + }, + "remove": { + "title": "Confirm Server Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Server Backups", + "input": { + "partiallyDetachedOnly": "Only show partially detached backups" + } + } + }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Server Logs", + "form": { + "logType": "Log Type" + }, + "enum": { + "logType": { + "console": "Console", + "install": "Install" + } + } + } + }, + "management": { + "title": "Management", + "page": { + "title": "Server Management", + "transfer": { + "title": "Transfer", + "content": "Transfer this server and it's data to another node within this system.", + "toast": { + "started": "Server transfer started." + }, + "modal": { + "title": "Server Transfer", + "form": { + "backupsToTransfer": "Backups to transfer" + }, + "tooltip": { + "aioNotSupported": "Transfers to the All-In-One node are not supported." + }, + "confirm": { + "title": "Confirm Server Transfer", + "content": "Are you sure you want to transfer **{name}** from **{from}** to **{to}**?", + "alert": { + "notAllBackupsSelected": "You have not selected all backups to transfer, the remaining backups will become partially detached if the transfer completes successfully." + } + } + } + }, + "suspend": { + "title": "Suspend", + "content": "This will suspend the server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the server through the panel or API.", + "button": "Suspend", + "toast": { + "suspended": "Server suspended." + }, + "modal": { + "title": "Confirm Server Suspension", + "content": "Are you sure you want to suspend **{name}**? This will stop the server and prevent it from starting. All running processes will be stopped and the user will not be able to access their files or otherwise manage the server through the panel or API." + } + }, + "unsuspend": { + "title": "Unsuspend", + "content": "This will unsuspend the server, allowing it to start again. The user will be able to access their files and otherwise manage the server through the panel or API.", + "button": "Unsuspend", + "toast": { + "unsuspended": "Server unsuspended." + }, + "modal": { + "title": "Confirm Server Unsuspension", + "content": "Are you sure you want to unsuspend **{name}**? This will allow the server to start again. The user will be able to access their files and otherwise manage the server through the panel or API." + } + }, + "clearState": { + "title": "Clear State", + "content": "This will clear the server state known by the panel.", + "button": "Clear State", + "toast": { + "cleared": "Server state cleared." + }, + "modal": { + "title": "Confirm Server State Clear", + "content": "Are you sure you want to clear the state of **{name}**? This will clear any known pending transfers and status failures, please make sure it is safe to do this before clicking without reason." + } + }, + "delete": { + "title": "Delete", + "content": "This will delete the server and all of its data. This action cannot be undone.", + "toast": { + "deleted": "Server deleted." + }, + "modal": { + "title": "Confirm Server Deletion", + "description": "You are about to delete **{name}**. Are you sure?", + "form": { + "deleteBackups": "Do you want to delete backups of this server?", + "confirmServerName": "Confirm Server Name", + "confirmServerNamePlaceholder": "Server Name" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "viewClient": { + "title": "View in Client Area" + } + } + }, + "nests": { + "title": "Nests", + "resourceName": "Nest", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Nest", + "titleUpdate": "Update Nest", + "modal": { + "delete": { + "title": "Confirm Nest Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": { + "deleteEggs": "Do you want to delete all eggs in this nest?" + } + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Eggs", + "resourceName": "Egg", + "dropzone": { + "title": "Drop some files here to import as Eggs", + "subtitle": "Release to start importing" + }, + "button": { + "updateFromRepository": "Update from Repository" + }, + "toast": { + "imported": "Egg imported.", + "moved": "Egg moved.", + "movedBulk": "{eggs} moved.", + "deletedBulk": "{eggs} deleted.", + "updatedFromRepository": "{eggs} updated using their respective repository egg successfully.", + "parseFailed": "Failed to parse egg: {error}" + }, + "modal": { + "move": { + "title": "Move Egg" + }, + "moveBulk": { + "title": "Move Eggs", + "confirm": "Move {eggs}" + }, + "deleteBulk": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete `{count}` eggs?" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg", + "titleUpdate": "Update Egg", + "card": { + "startupConfiguration": "Startup Configuration", + "stopConfiguration": "Stop Configuration", + "configFiles": "Config Files Configuration" + }, + "form": { + "eggRepository": "Egg Repository", + "eggRepositoryEgg": "Egg Repository Egg", + "startupDone": "Startup Done", + "startupDoneDescription": "Console message indicating startup completion.", + "stripAnsi": "Strip ANSI from startup messages", + "stripAnsiDescription": "Removes ANSI control characters from the console output before matching startup completion.", + "stopType": "Stop Type", + "stopCommand": "Stop Command", + "stopSignal": "Stop Signal", + "parser": "Parser", + "createNewFile": "Create New File", + "createNewFileDescription": "If enabled, the file will be created if it does not exist. If disabled, the file must already exist or the replacement will fail.", + "match": "Match", + "ifValue": "If Value", + "replaceWith": "Replace With", + "insertNew": "Insert New", + "insertNewDescription": "If enabled, if no existing value matches the \"Match\" field, the \"Replace With\" value will be inserted into the file. If disabled, if no match is found, no changes will be made to the file.", + "updateExisting": "Update Existing", + "updateExistingDescription": "If enabled, if a match is found, it will be replaced with the \"Replace With\" value. If disabled, the replacement will only insert new values and will fail if a match is found.", + "startupCommands": "Startup Commands", + "forceOutgoingIp": "Force Outgoing IP", + "separatePort": "Separate IP and Port", + "separatePortDescription": "Separates the primary IP and port on the Console page instead of joining them with \":\".", + "features": "Features", + "featurePlaceholder": "Feature", + "fileDenylist": "File Deny List", + "dockerImages": "Docker Images" + }, + "enum": { + "stopType": { + "command": "Send Command", + "signal": "Send Signal", + "docker": "Docker Stop" + } + }, + "emptyConfigFiles": "No config files defined.", + "emptyReplacements": "No replacements defined.", + "button": { + "addReplacement": "Add Replacement", + "addConfigFile": "Add Config File", + "fromFile": "from File", + "fromRepository": "from Repository" + }, + "toast": { + "exported": "Egg exported.", + "updated": "Egg updated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "installationScript": { + "title": "Installation Script", + "page": { + "title": "Egg Installation Script", + "form": { + "container": "Installation Container", + "entrypoint": "Container Entrypoint" + }, + "toast": { + "updated": "Egg script updated." + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Egg Variables", + "form": { + "supportsMarkdown": "Supports Markdown formatting.", + "defaultValue": "Default Value", + "defaultValuePlaceholder": "server.jar", + "userViewable": "User Viewable", + "userEditable": "User Editable", + "secret": "Secret", + "rules": "Rules", + "rulesDescription": "See https://laravel.com/docs/12.x/validation#available-validation-rules for the available validation rules." + }, + "toast": { + "created": "Egg variable created.", + "updated": "Egg variable updated.", + "deleted": "Egg variable deleted.", + "duplicated": "Egg variable duplicated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Variable Removal", + "content": "Are you sure you want to remove **{variable}**?", + "emptyVariable": "this empty variable" + }, + "duplicate": { + "title": "Duplicate Egg Variable" + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Egg Mounts", + "toast": { + "added": "Egg Mount added.", + "deleted": "Egg Mount deleted." + }, + "modal": { + "add": { + "title": "Add Egg Mount" + }, + "delete": { + "title": "Confirm Egg Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{egg}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Egg Servers" + } + } + } + } + } + } + }, + "eggConfigurations": { + "title": "Egg Configurations", + "resourceName": "Egg Configuration", + "table": { + "columns": { + "order": "Order" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Configuration", + "titleUpdate": "Update Egg Configuration", + "form": { + "order": "Order", + "eggs": "Eggs", + "eggsPlaceholder": "Select Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." + }, + "enum": { + "deploymentType": { + "random": "Random", + "range": "Port Range", + "addPrimary": "Add to Primary", + "subtractPrimary": "Subtract from Primary", + "multiplyPrimary": "Multiply Primary", + "dividePrimary": "Divide Primary" + } + }, + "allocation": { + "title": "Allocation Configuration", + "form": { + "userSelfAssign": "User Self Assign", + "userSelfAssignDescription": "Allow users to create their own allocations from a specified port range.", + "requirePrimaryAllocation": "Require Primary Allocation", + "requirePrimaryAllocationDescription": "Whether users must always have a primary allocation.", + "automaticAllocationStart": "Automatic Allocation Start", + "automaticAllocationEnd": "Automatic Allocation End", + "dedicatedIp": "Dedicated IP", + "dedicatedIpDescription": "Assign a dedicated ip address for servers using this egg configuration.", + "primaryAllocation": "Primary Allocation", + "primaryAllocationDescription": "Configure a primary port assignment for deployment.", + "primaryStartPort": "Primary Start Port", + "primaryEndPort": "Primary End Port", + "assignToVariable": "Assign to Variable", + "assignToVariablePlaceholder": "e.g. SERVER_PORT", + "assignToVariableDescription": "Optional environment variable to receive the assigned primary port." + }, + "divider": { + "deployment": "Deployment" + }, + "additionalPorts": { + "title": "Additional Ports", + "button": "Add Rule", + "empty": "No additional port rules configured." + }, + "deployment": { + "form": { + "startPort": "Start Port", + "endPort": "End Port", + "assignToVariable": "Assign to Variable", + "assignToVariableDescription": "Optional environment variable to receive the assigned port from this rule.", + "assignToVariablePlaceholder": "e.g. SERVER_PORT" + }, + "removeRule": "Remove deployment rule" + } + }, + "startup": { + "title": "Startup Configuration", + "form": { + "allowCustomStartupCommand": "Allow Custom Startup Command", + "allowCustomStartupCommandDescription": "Allow users to set their own, non-predefined startup commands." + } + }, + "modal": { + "delete": { + "title": "Confirm Egg Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + } + } + }, + "eggRepositories": { + "title": "Egg Repositories", + "resourceName": "Egg Repository", + "table": { + "columns": { + "gitRepository": "Git Repository" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Repository", + "titleUpdate": "Update Egg Repository", + "form": { + "gitRepository": "Git Repository" + }, + "button": { + "sync": "Sync" + }, + "toast": { + "synced": "Egg repository synchronised, found {eggs}." + }, + "modal": { + "delete": { + "title": "Confirm Egg Repository Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Egg Repository Eggs", + "table": { + "columns": { + "path": "Path" + } + }, + "toast": { + "installed": "Egg installed.", + "installedBulk": "{eggs} installed." + }, + "modal": { + "install": { + "title": "Install Egg Repository Egg" + }, + "installBulk": { + "title": "Install Egg Repository Eggs", + "button": "Install {eggs}" + } + }, + "drawer": { + "noReadme": "This egg does not have a README." + } + } + } + } + }, + "databaseHosts": { + "title": "Database Hosts", + "resourceName": "Database host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Host", + "titleUpdate": "Update Database Host", + "form": { + "publicHost": "Public Host", + "publicPort": "Public Port", + "connectionCredentials": "Connection Credentials", + "credentialType": "Credential Type", + "connectionString": "Connection String", + "connectionStringPlaceholder": "mysql://username:password@host:port" + }, + "enum": { + "credentialType": { + "connectionString": "Connection String", + "details": "Details" + } + }, + "button": { + "testConnection": "Test Connection" + }, + "toast": { + "tested": "Test successfully completed." + }, + "modal": { + "delete": { + "title": "Confirm Database Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "databases": { + "title": "Databases", + "page": { + "title": "Database Host Databases", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } + } + } + } + }, + "oAuthProviders": { + "title": "OAuth Providers", + "resourceName": "OAuth Provider", + "dropzone": { + "title": "Drop some files here to import as OAuth Providers", + "subtitle": "Release to start importing" + }, + "table": { + "columns": { + "loginOnly": "Login Only", + "linkViewable": "Link Viewable", + "userManageable": "User Manageable" + } + }, + "toast": { + "imported": "OAuth Provider imported.", + "parseFailed": "Failed to parse OAuth provider: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create OAuth Provider", + "titleUpdate": "Update OAuth Provider", + "card": { + "redirectUrl": { + "title": "Redirect URL", + "unavailable": "Available after creation" + } + }, + "form": { + "clientId": "Client Id", + "clientSecret": "Client Secret", + "authUrl": "Auth URL", + "tokenUrl": "Token URL", + "infoUrl": "Info URL", + "basicAuth": "Basic Auth", + "basicAuthDescription": "Uses HTTP Basic Authentication to transmit the client id and secret, not common anymore.", + "scopes": "Scopes", + "scopesDescription": "The OAuth2 scopes to request, make sure to include scopes for email and profile info when needed.", + "identifierPath": "Identifier Path", + "identifierPathDescription": "The path used to extract the unique user identifier from the Info URL response (https://serdejsonpath.live).", + "emailPath": "Email Path", + "emailPathDescription": "The path used to extract the email from the Info URL response (https://serdejsonpath.live).", + "usernamePath": "Username Path", + "usernamePathDescription": "The path used to extract the username from the Info URL response (https://serdejsonpath.live).", + "nameFirstPath": "First Name Path", + "nameFirstPathPlaceholder": "First Name URL", + "nameFirstPathDescription": "The path used to extract the first name from the Info URL response (https://serdejsonpath.live).", + "nameLastPath": "Last Name Path", + "nameLastPathDescription": "The path used to extract the last name from the Info URL response (https://serdejsonpath.live).", + "loginOnly": "Only allow Login", + "loginBypass2fa": "Bypass 2FA on Login", + "loginBypass2faDescription": "Allows users logging in with this provider to bypass their panel 2FA.", + "linkViewable": "Link Viewable to User", + "linkViewableDescription": "Allows the user to see the connection and its identifier in the client UI.", + "userManageable": "Link Manageable by User", + "userManageableDescription": "Allows the user to connect and disconnect with this provider." + }, + "toast": { + "exported": "OAuth Provider exported." + }, + "modal": { + "delete": { + "title": "Confirm OAuth Provider Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "mappings": { + "title": "Mappings", + "page": { + "title": "OAuth Provider Mappings", + "table": { + "columns": { + "matcher": "Matcher" + } + }, + "enum": { + "mappingType": { + "role": "Role", + "serverSubuser": "Server Subuser" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" + } + }, + "toast": { + "created": "OAuth provider mapping created.", + "updated": "OAuth provider mapping updated.", + "deleted": "OAuth provider mapping deleted." + }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, + "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", + "scopesDescription": "OAuth scopes that must all have been granted for this matcher to match.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", + "mappingType": "Mapping Type", + "role": "Role", + "permissions": "Permissions" + }, + "modal": { + "add": { + "title": "Add OAuth Provider Mapping" + }, + "edit": { + "title": "Edit OAuth Provider Mapping" + }, + "delete": { + "title": "Delete OAuth Provider Mapping", + "content": "Are you sure you want to delete this mapping? This action cannot be undone." + } + } + } + }, + "users": { + "title": "Users", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, + "page": { + "title": "OAuth Provider Users", + "table": { + "columns": { + "user": "User" + } + } + } + } + } + }, + "backupConfigurations": { + "title": "Backup Configurations", + "resourceName": "Backup configuration", + "table": { + "columns": { + "disk": "Disk" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Backup Configuration", + "titleUpdate": "Update Backup Configuration", + "alert": { + "ddupBak": "Ddup-Bak is Technology Preview software, it is technically not recommended for production use. If you acknowledge, sail ahead as you wish.", + "btrfs": "Btrfs requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "zfs": "ZFS requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "pbs": "The provided API token needs the following datastore ACLs: **DatastoreAudit** for usage and listing, **DatastoreBackup** for writing backups, and **DatastoreAdmin** (or equivalent prune/delete permissions) if backup deletion or pruning is enabled." + }, + "form": { + "backupDisk": "Backup Disk", + "maintenanceEnabledDescription": "If enabled, any server using this backup configuration will not be able to create new backups, or manage existing ones.", + "shared": "Shared", + "sharedDescription": "If enabled, backups on this backup configuration will not be transferred between nodes, they will be assumed to be accessible by all nodes." + }, + "modal": { + "delete": { + "title": "Confirm Backup Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "s3": { + "title": "S3 Settings", + "form": { + "partSize": "Part Size", + "compressionType": "Compression Type", + "pathStyle": "Using path-style URLs" + } + }, + "restic": { + "title": "Restic Settings", + "form": { + "repository": "Repository", + "retryLockSeconds": "Retry Lock Seconds", + "environmentVariables": "Environment Variables", + "cronSchedule": "Cron Schedule", + "cronScheduleDescription": "Format: second minute hour day month weekday.", + "nodes": "Nodes", + "nodesPlaceholder": "Select nodes" + }, + "pruneJobs": { + "title": "Prune Jobs", + "description": "Scheduled restic prune runs. Each job runs on the configured nodes following its cron schedule.", + "button": { + "add": "Add Prune Job" + } + } + }, + "pbs": { + "title": "Proxmox Backup Server Settings", + "form": { + "url": "Server URL", + "datastore": "Datastore", + "namespace": "Namespace", + "tokenId": "Token ID", + "tokenSecret": "Token Secret", + "fingerprint": "TLS Certificate Fingerprint", + "backupIdPrefix": "Backup ID Prefix" + } + }, + "kopia": { + "title": "Kopia Settings", + "form": { + "url": "Kopia Server URL", + "fingerprint": "TLS Certificate Fingerprint", + "tags": "Backup Tags" + } + } + } + }, + "stats": { + "title": "Stats", + "page": { + "title": "Backup Configuration Stats", + "card": { + "title": "Backup Statistics" + }, + "period": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month" + }, + "periodLabel": { + "allTime": "all time", + "today": "today", + "week": "this week", + "month": "this month" + }, + "stat": { + "total": "Total backups {period}", + "successful": "Successful backups {period}", + "failed": "Failed backups {period}", + "deleted": "Deleted backups {period}" + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Backup Configuration Backups", + "toast": { + "downloadStarted": "Download started." + } + } + }, + "locations": { + "title": "Locations", + "page": { + "title": "Backup Configuration Locations" + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Backup Configuration Nodes" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Backup Configuration Servers" + } + } + } + }, + "mounts": { + "title": "Mounts", + "resourceName": "Mount", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Mount", + "titleUpdate": "Update Mount", + "alert": "Mounts are a powerful and potentially dangerous feature. Improper use can lead to data loss or security vulnerabilities (including container escapes). Make sure you understand the implications of using mounts before creating or updating them.", + "form": { + "source": "Source", + "target": "Target", + "readOnly": "Read Only", + "userMountable": "User Mountable" + }, + "modal": { + "delete": { + "title": "Confirm Mount Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Mount Eggs", + "toast": { + "added": "Mount Egg added.", + "removed": "Mount Egg deleted." + }, + "modal": { + "add": { + "title": "Add Mount Egg", + "form": { + "egg": "Egg" + } + }, + "remove": { + "title": "Confirm Mount Egg Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Mount Nodes", + "toast": { + "added": "Mount Node added.", + "removed": "Mount Node deleted." + }, + "modal": { + "add": { + "title": "Add Mount Node" + }, + "remove": { + "title": "Confirm Mount Node Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Mount Servers" + } + } + } + }, + "roles": { + "title": "Roles", + "resourceName": "Role", + "table": { + "columns": { + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Role", + "titleUpdate": "Update Role", + "alert": { + "impersonate": "This role has the `users.impersonate` permission, which allows users with this role to impersonate any other user, including administrators. Be cautious when assigning this permission to roles with less trusted users." + }, + "form": { + "requireTwoFactor": "Require Two Factor", + "requireTwoFactorDescription": "Require users with this role to use two factor authentication.", + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + }, + "modal": { + "delete": { + "title": "Confirm Role Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "users": { + "title": "Users", + "page": { + "title": "Role Users" + } + } + } + }, + "activity": { + "title": "Activity" + } + }, + "server": { + "viewAdmin": { + "title": "عرض المسؤول" + }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, + "console": { + "title": "وحدة التحكم", + "input": { + "placeholder": "اكتب أمراً...", + "ariaLabel": "إدخال أمر وحدة التحكم." + }, + "toast": { + "installCancelled": "تم إلغاء تثبيت الخادم.", + "transferCancelled": "Server transfer cancelled." + }, + "modal": { + "sshDetails": { + "title": "تفاصيل SSH", + "form": { + "command": "أمر SSH" + }, + "launch": "إطلاق" + } + }, + "notification": { + "suspended": "خادمك معلق حالياً. لا يمكن تنفيذ أي إجراءات حتى يتم رفع التعليق.", + "suspendedAdmin": "هذا الخادم معلق حالياً. بما أنك مسؤول، يمكنك لا يزال الوصول إلى الخادم، ولكن الإجراءات محدودة.", + "nodeMaintenance": "خادمك على عقدة قيد الصيانة حالياً.", + "transferring": "خادمك قيد النقل حالياً إلى عقدة أخرى.", + "restoringBackup": "خادمك يستعيد من نسخة احتياطية حالياً. يرجى الانتظار...", + "installing": "خادمك قيد التثبيت حالياً. يرجى الانتظار...", + "pendingRestart": "Your Server has pending changes that require a restart. Please restart your server to apply these changes." + }, + "message": { + "serverMarkedAs": "تم وضع علامة على الخادم كـ {state}...", + "installFailed": "فشل التثبيت.", + "installCompleted": "اكتمل التثبيت بنجاح.", + "transferFailed": "فشل النقل.", + "transferCompleted": "اكتمل النقل بنجاح. جاري إعادة الاتصال بالخادم...", + "pullingImage": "خادمك يسحب صورة docker حالياً. يرجى الانتظار...", + "pulling": "جاري السحب", + "extracting": "جاري الاستخراج" + }, + "tooltip": { + "search": "بحث", + "sshDetails": "تفاصيل SSH", + "commandHistory": "سجل الأوامر", + "decreaseFontSize": "تقليل حجم الخط", + "increaseFontSize": "زيادة حجم الخط" + }, + "drawer": { + "commandHistory": { + "title": "سجل الأوامر", + "detailTitle": "تفاصيل الأمر", + "noCommands": "لم يتم العثور على أوامر.", + "copyButton": "نسخ الأمر", + "sendButton": "إرسال الأمر", + "commandSent": "تم إرسال الأمر بنجاح." } }, "feature": { @@ -1124,6 +4009,17 @@ "button": { "accept": "قبول EULA" } + }, + "javaVersion": { + "title": "Unsupported Java Version", + "content": "This server is currently running an unsupported version of Java and cannot be started.", + "contentDetails": "Please select a supported Docker image from the list below to continue starting the server.", + "toast": { + "updated": "Docker image updated successfully." + }, + "button": { + "update": "Update Docker Image" + } } }, "details": { @@ -1158,15 +4054,25 @@ "files": { "title": "الملفات", "titleEditorViewing": "عرض {file}", + "titleEditorPlaying": "Playing {file}", "titleEditorEditing": "تعديل {file}", "titleEditorNew": "ملف جديد", + "titleDiffRevisionVsCurrent": "{file} - Revision #{revision} vs Current", + "titleDiffRevisionVsRevision": "{file} - Revision #{previousRevision} vs #{revision}", "table": { "columns": { "modified": "تم التعديل" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "جديد", + "connect": "Connect", + "connectSftp": "via SFTP", + "connectVscode": "via VS Code", "openInNewWindow": "فتح في نافذة جديدة", "rename": "إعادة التسمية", "copy": "نسخ", @@ -1204,7 +4110,9 @@ "copying": "جاري نسخ {path} إلى {destination}", "copyingMany": "جاري نسخ {files}", "receivingRemote": "جاري استلام {files} من الخادم البعيد", - "sendingRemote": "جاري إرسال {files} إلى الخادم البعيد" + "sendingRemote": "جاري إرسال {files} إلى الخادم البعيد", + "exportingBackup": "Exporting backup to {destination}", + "cancelAllOperations": "Cancel all operations" }, "dropzone": { "title": "أفلت الملفات هنا للرفع", @@ -1215,13 +4123,18 @@ "preferPhysicalSize": "إظهار الحجم الفعلي بدلاً من الحجم المنطقي", "editorMinimap": "إظهار خريطة الملف المصغرة", "editorLineOverflow": "التفاف تجاوز السطر", + "editorFontSize": "Editor Font Size", + "vscodeUriScheme": "VS Code URI Scheme", "imageViewerSmoothing": "تنعيم الصورة (مضاد للتعرج)" }, "toast": { "operationCancelled": "تم إلغاء العملية", + "allOperationsCancelled": "All operations have been cancelled.", "copyingStarted": "بدأ نسخ {files}.", "filesCouldNotBeMoved": "لم يمكن نقل الملفات.", "filesMoved": "تم نقل {files}.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "بدأ التنزيل.", "filesDeleted": "تم حذف الملفات.", "archiveCreationStarted": "بدأ إنشاء الأرشيف.", @@ -1230,14 +4143,58 @@ "filePullingStarted": "بدأ سحب الملف.", "fileRenamed": "تم إعادة تسمية الملف.", "fileCouldNotBeRenamed": "لم يمكن إعادة تسمية الملف.", + "filesRenamed": "{files} renamed.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "تم تحديث الأذونات.", - "fileSaved": "تم حفظ الملف." + "permissionsUpdatedMany": "Permissions have been updated for {files}.", + "permissionsCouldNotBeUpdated": "Permissions could not be updated.", + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "تم حفظ الملف.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." + }, + "tooltip": { + "fileHistory": "File History", + "collabEditing": "{user} is editing this file", + "largestDirectories": "Analyze directory sizes", + "dragToMove": "Drag to move", + "back": "Back {seconds} seconds", + "forward": "Forward {seconds} seconds", + "play": "Play", + "pause": "Pause", + "mute": "Mute", + "unmute": "Unmute" + }, + "drawer": { + "revisions": { + "title": "File History", + "noRevisions": "No revisions found for this file.", + "restored": "Revision restored into editor.", + "badge": { + "fullSnapshot": "Full Snapshot" + }, + "tooltip": { + "restore": "Restore this revision into the editor", + "viewDiff": "View diff against current file", + "compareToPrevious": "Compare to previous revision" + }, + "diff": { + "original": "Revision", + "current": "Current" + } + } }, "modal": { "unsavedChanges": { "title": "تغييرات غير محفوظة", "content": "لديك تغييرات غير محفوظة في محرر الملفات. هل أنت متأكد أنك تريد مغادرة هذه الصفحة؟ إذا غادرت، ستفقد تغييراتك." }, + "draftRestore": { + "title": "Restore Draft", + "content": "A draft of this file was found in your browser. Would you like to restore it?", + "contentHashMismatch": "The file has been modified on the server since this draft was saved. Restoring the draft may overwrite those changes." + }, "createArchive": { "title": "إنشاء أرشيف", "form": { @@ -1290,6 +4247,9 @@ }, "filePermissions": { "title": "أذونات الملف", + "form": { + "recursive": "Apply changes recursively to all files and subdirectories within this directory" + }, "symbolic": "رمزي:", "octal": "ثماني:", "owner": "المالك", @@ -1303,6 +4263,66 @@ "renameFile": { "title": "إعادة تسمية الملف" }, + "massRename": { + "title": "Rename Files", + "find": "Find", + "findPlaceholder": "Text to find", + "replace": "Replace with", + "replacePlaceholder": "Replacement text", + "scope": "Apply to", + "scopeName": "Name", + "scopeExtension": "Extension", + "scopeFull": "Full name", + "section": { + "matchOptions": "Match options", + "affixes": "Prefix & suffix", + "caseConversion": "Case conversion", + "numbering": "Numbering" + }, + "affix": { + "prefix": "Prefix", + "suffix": "Suffix", + "help": "Both may include {token} for the number; a suffix appends a count to every name." + }, + "option": { + "regex": "Use regular expression", + "regexDescription": "Treat the find text as a regex; reference groups with $1, $2 in the replacement.", + "caseSensitive": "Case sensitive", + "allOccurrences": "Replace all occurrences" + }, + "case": { + "label": "Convert case", + "none": "No change", + "lower": "lowercase", + "upper": "UPPERCASE", + "title": "Title Case", + "capitalize": "Capitalize" + }, + "numbering": { + "enable": "Enable numbering", + "help": "Insert {token} in the find, replace, prefix, or suffix text where the number should appear.", + "start": "Start at", + "step": "Step", + "padding": "Minimum digits" + }, + "preview": { + "title": "Preview", + "original": "Original", + "newName": "New name", + "unchanged": "Unchanged", + "conflict": "Name already in use", + "duplicate": "Duplicate target", + "invalid": "Invalid name", + "invalidRegex": "Invalid regular expression", + "empty": "No files selected." + }, + "summary": "{changed} of {total} will be renamed", + "conflictWarning": "Resolve the highlighted name conflicts before renaming." + }, + "largestDirectories": { + "title": "Largest Directories", + "empty": "No directories found." + }, "searchFiles": { "title": "بحث الملفات", "placeholder": "البحث عن الملفات...", @@ -1338,6 +4358,10 @@ "databases": { "title": "قواعد البيانات", "subtitle": "{current} من {max} قاعدة بيانات كحد أقصى تم إنشاؤها.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "هذا الخادم محدود بـ {max} قواعد بيانات." }, @@ -1352,6 +4376,165 @@ "form": { "databaseName": "اسم قاعدة البيانات" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "إنشاء قاعدة بيانات", @@ -1359,7 +4542,8 @@ "created": "تم إنشاء قاعدة البيانات." }, "form": { - "noHostsFound": "لم يتم العثور على مضيفين" + "noHostsFound": "لم يتم العثور على مضيفين", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -1411,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "إضافة مشغل", "addCondition": "إضافة شرط", "addStep": "إضافة خطوة", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "إنشاء الخطوة الأولى", "addOutput": "إضافة مخرجات", "addFile": "إضافة ملف", @@ -1423,6 +4612,7 @@ "imported": "تم استيراد الجدول.", "created": "تم إنشاء الجدول.", "updated": "تم تحديث الجدول.", + "duplicated": "Schedule duplicated.", "deleted": "تم حذف الجدول.", "triggered": "تم تشغيل الجدول.", "exported": "تم تصدير الجدول.", @@ -1430,6 +4620,7 @@ "step": { "created": "تم إنشاء خطوة الجدول.", "updated": "تم تحديث خطوة الجدول.", + "duplicated": "Schedule step duplicated.", "deleted": "تم حذف خطوة الجدول." } }, @@ -1439,12 +4630,21 @@ "and": "AND (يجب أن تكون كلها صحيحة)", "or": "OR (أي واحدة يجب أن تكون صحيحة)", "not": "NOT (يجب ألا تكون صحيحة)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "المتغير موجود", "variableContains": "المتغير يحتوي", "variableEquals": "المتغير يساوي", "variableStartsWith": "المتغير يبدأ بـ", "variableEndsWith": "المتغير ينتهي بـ" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "أصغر من", "smallerThanOrEqual": "أصغر من أو يساوي", @@ -1460,6 +4660,9 @@ "updateSchedule": { "title": "تحديث الجدول" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "تأكيد حذف الجدول", "content": "هل أنت متأكد أنك تريد حذف {name} من هذا الخادم؟" @@ -1473,12 +4676,19 @@ "deleteStep": { "title": "تأكيد حذف خطوة الجدول", "content": "هل أنت متأكد أنك تريد حذف خطوة الجدول هذه؟" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "جاري التشغيل" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "الإجراءات", "conditions": "الشروط", @@ -1514,6 +4724,7 @@ "contains": "يحتوي", "startsWith": "يبدأ بـ", "endsWith": "ينتهي بـ", + "metric": "Metric", "allMustBeTrue": "جميع الشروط يجب أن تكون صحيحة:", "anyMustBeTrue": "أي شرط يجب أن يكون صحيحاً:", "mustNotBeTrue": "الشرط يجب ألا يكون صحيحاً:" @@ -1527,11 +4738,27 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "جدول Cron" + "cronSchedule": "جدول Cron", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" + }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "على فاصل Cron {schedule}، التشغيل التالي هو {timestamp} - التشغيل الأخير كان {lastTimestamp}." - } + }, + "invalidCron": "Invalid cron expression" }, "powerAction": { "title": "إجراء الطاقة", @@ -1554,6 +4781,25 @@ "content": "عند وصول النسخة الاحتياطية إلى الحالة `{status}`." } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "سطر وحدة التحكم", "card": { @@ -1578,8 +4824,20 @@ "title": "لم يتم تكوين خطوات", "description": "هذا الجدول ليس لديه أي خطوات بعد. أضف بعض الإجراءات للبدء." }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "انتظار", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "المدة (مللي ثانية)" }, @@ -1589,12 +4847,62 @@ }, "ensure": { "title": "ضمان", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "ضمان مطابقة شرط" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "تنسيق", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "سلسلة التنسيق", "formatStringDescription": "سلسلة التنسيق. يمكن تضمين المتغيرات عن طريق تغليفها داخل {wrapper}." @@ -1605,6 +4913,7 @@ }, "matchRegex": { "title": "مطابقة Regex", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "الإدخال", "regex": "Regex", @@ -1617,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "انتظار سطر وحدة التحكم", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "المهلة (مللي ثانية)" }, @@ -1631,6 +4941,7 @@ }, "sendCommand": { "title": "إرسال أمر", + "description": "Send a command to the server console.", "renderer": { "compact": "تشغيل {command}", "detail": { @@ -1640,6 +4951,7 @@ }, "sendPower": { "title": "إرسال إشارة طاقة", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "تنفيذ {action}", "detail": { @@ -1649,19 +4961,75 @@ }, "createBackup": { "title": "إنشاء نسخة احتياطية", + "description": "Create a backup of the server files.", "form": { "backupName": "اسم النسخة الاحتياطية" }, "renderer": { "compact": "إنشاء {name}", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "اسم النسخة الاحتياطية: {name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "الملفات المتجاهلة: {files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "إنشاء مجلد", + "description": "Create a new folder in the server files.", "renderer": { "compact": "إنشاء {name} في {root}", "detail": { @@ -1672,6 +5040,7 @@ }, "writeFile": { "title": "كتابة ملف", + "description": "Write or append text to a file.", "form": { "content": "المحتوى", "appendToFile": "إلحاق بالملف" @@ -1686,6 +5055,7 @@ }, "copyFile": { "title": "نسخ ملف", + "description": "Copy a file to a new location.", "form": { "sourceFile": "الملف المصدر" }, @@ -1699,6 +5069,7 @@ }, "deleteFiles": { "title": "حذف الملفات", + "description": "Delete files or folders.", "form": { "filesToDelete": "الملفات للحذف" }, @@ -1712,6 +5083,7 @@ }, "renameFiles": { "title": "إعادة تسمية الملفات", + "description": "Rename or move files.", "form": { "files": "الملفات", "from": "من", @@ -1727,6 +5099,7 @@ }, "compressFiles": { "title": "ضغط الملفات", + "description": "Compress files into an archive.", "form": { "filesToCompress": "الملفات للضغط" }, @@ -1742,6 +5115,7 @@ }, "decompressFile": { "title": "فك ضغط ملف", + "description": "Extract an archive into a folder.", "form": { "file": "الملف" }, @@ -1755,6 +5129,7 @@ }, "updateStartupVariable": { "title": "تحديث متغير بدء التشغيل", + "description": "Change the value of a startup variable.", "renderer": { "compact": "تعيين {variable} إلى {value}", "detail": { @@ -1765,6 +5140,7 @@ }, "updateStartupCommand": { "title": "تحديث أمر بدء التشغيل", + "description": "Change the command used to start the server.", "renderer": { "compact": "تعيين إلى {command}", "detail": { @@ -1774,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "تحديث صورة Docker", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "تعيين إلى {image}", "detail": { @@ -1785,6 +5162,10 @@ }, "subusers": { "title": "المستخدمون الفرعيون", + "subtitle": "{current} of {max} maximum subusers created.", + "tooltip": { + "limitReached": "This server is limited to {max} subusers." + }, "table": { "columns": { "twoFactorEnabled": "تم تفعيل 2FA", @@ -1800,7 +5181,8 @@ }, "form": { "emailPlaceholder": "أدخل البريد الإلكتروني الذي يجب حفظ هذا المستخدم الفرعي به.", - "permissions": "الأذونات" + "permissions": "الأذونات", + "ignoredFilesDescription": "Files and directories matching these patterns will be hidden from this subuser. Uses gitignore-style glob patterns (e.g. `*.env`, `secrets/`). Prefix a pattern with `!` to un-hide a path that a broader pattern would otherwise exclude." } }, "updateSubuser": { @@ -1831,16 +5213,25 @@ "locked": "مقفل؟" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "تصفح" + "browse": "تصفح", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "بدأ التنزيل.", - "restoringBackup": "جاري استعادة النسخة الاحتياطية..." + "restoringBackup": "جاري استعادة النسخة الاحتياطية...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "إنشاء نسخة احتياطية", + "noGroup": "No group", "toast": { "created": "تم إنشاء النسخة الاحتياطية." } @@ -1854,13 +5245,61 @@ "restoreBackup": { "title": "استعادة النسخة الاحتياطية" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "تأكيد حذف النسخة الاحتياطية", "content": "هل أنت متأكد أنك تريد حذف **{name}** من هذا الخادم؟", "toast": { + "started": "Backup deletion started.", "deleted": "تم حذف النسخة الاحتياطية." } + }, + "viewMetadata": { + "title": "Backup Metadata" + } + } + }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." } }, "network": { @@ -1908,7 +5347,8 @@ "content": "لديك تغييرات غير محفوظة في متغيرات بدء التشغيل. هل أنت متأكد أنك تريد مغادرة هذه الصفحة؟ إذا غادرت، ستفقد تغييراتك." } }, - "noVariables": "لم يتم العثور على متغيرات بدء التشغيل لهذا الخادم." + "noVariables": "لم يتم العثور على متغيرات بدء التشغيل لهذا الخادم.", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "النقاط", @@ -1994,7 +5434,10 @@ } }, "activity": { - "title": "النشاط" + "title": "النشاط", + "button": { + "clearUserFilter": "Clear User Filter" + } } } } diff --git a/frontend/public/translations/de.json b/frontend/public/translations/de.json index 6ccf752fc..87027d4a3 100644 --- a/frontend/public/translations/de.json +++ b/frontend/public/translations/de.json @@ -2436,6 +2436,7 @@ }, "delete": { "title": "Löschen des Node-Backups bestätigen", + "form": {}, "alert": { "forceWarning": "Das erzwungene Löschen entfernt das Backup, auch wenn seine Konfiguration fehlt oder der Remote-Speicher nicht erreichbar ist. Die Backup-Dateien selbst werden möglicherweise nicht vollständig entfernt, sodass verwaiste Daten zurückbleiben." } @@ -3222,6 +3223,7 @@ "delete": { "title": "Datenbank-Host-Löschung bestätigen", "content": "Bist du sicher, dass du **{name}** löschen möchtest?", + "form": {}, "alert": { "forceWarning": "Das erzwungene Löschen entfernt alle Datenbanken auf diesem Host. Die Datenbanken auf dem Host selbst werden möglicherweise nicht vollständig bereinigt, wodurch verwaiste Daten zurückbleiben." } @@ -3240,6 +3242,7 @@ "toast": { "deleted": "Die Datenbank wurde gelöscht." }, + "form": {}, "alert": { "forceWarning": "Das erzwungene Löschen ignoriert die Sperre der Datenbank und den Wartungsmodus des Hosts. Die Datenbank auf dem Host selbst wird möglicherweise nicht vollständig entfernt, sodass verwaiste Daten zurückbleiben." } @@ -3275,6 +3278,7 @@ "delete": { "title": "Löschen des Datenbank-Agent-Hosts bestätigen", "content": "Bist du sicher, dass du **{name}** löschen möchtest?", + "form": {}, "alert": { "forceWarning": "Erzwungenes Löschen entfernt alle Instanzen auf diesem Host. Instanzen, für die der Agent nicht erreichbar ist, werden möglicherweise nicht vollständig bereinigt, sodass verwaiste Daten zurückbleiben." } @@ -3305,6 +3309,7 @@ "toast": { "deleted": "Verwaltete Datenbank gelöscht." }, + "form": {}, "alert": { "forceWarning": "Das erzwungene Löschen entfernt die Instanz, auch wenn der Agent nicht erreichbar ist. Die Instanz und ihre Daten auf dem Host selbst werden möglicherweise nicht vollständig entfernt, sodass verwaiste Daten zurückbleiben." } @@ -4426,6 +4431,10 @@ "file": "Abzugsdatei", "wipe": "Vorhandene Daten vor dem Import löschen" } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." } }, "table": { @@ -4437,7 +4446,8 @@ "created": "Datenbank erstellt.", "deleted": "Datenbank gelöscht.", "imported": "Datenbank-Import abgeschlossen.", - "passwordRotated": "Passwort wurde rotiert." + "passwordRotated": "Passwort wurde rotiert.", + "recreated": "Database recreated." } }, "users": { diff --git a/frontend/public/translations/es.json b/frontend/public/translations/es.json index 562188f10..4d8a9635d 100644 --- a/frontend/public/translations/es.json +++ b/frontend/public/translations/es.json @@ -39,6 +39,86 @@ "few": "{count} claves SSH", "many": "{count} claves SSH", "other": "{count} claves SSH" + }, + "asset": { + "zero": "{count} Assets", + "one": "{count} Asset", + "two": "{count} Assets", + "few": "{count} Assets", + "many": "{count} Assets", + "other": "{count} Assets" + }, + "node": { + "zero": "{count} Nodes", + "one": "{count} Node", + "two": "{count} Nodes", + "few": "{count} Nodes", + "many": "{count} Nodes", + "other": "{count} Nodes" + }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, + "allocation": { + "zero": "{count} Node Allocations", + "one": "{count} Node Allocation", + "two": "{count} Node Allocations", + "few": "{count} Node Allocations", + "many": "{count} Node Allocations", + "other": "{count} Node Allocations" + }, + "egg": { + "zero": "{count} Eggs", + "one": "{count} Egg", + "two": "{count} Eggs", + "few": "{count} Eggs", + "many": "{count} Eggs", + "other": "{count} Eggs" + }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, + "shortcut": { + "zero": "{count} Shortcuts", + "one": "{count} Shortcut", + "two": "{count} Shortcuts", + "few": "{count} Shortcuts", + "many": "{count} Shortcuts", + "other": "{count} Shortcuts" + }, + "line": { + "zero": "{count} Lines", + "one": "{count} Line", + "two": "{count} Lines", + "few": "{count} Lines", + "many": "{count} Lines", + "other": "{count} Lines" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -49,6 +129,7 @@ "save": "Guardar", "saveAndStay": "Guardar y permanecer", "edit": "Editar", + "duplicate": "Duplicate", "delete": "Eliminar", "remove": "Quitar", "enable": "Activar", @@ -65,16 +146,28 @@ "selectAll": "Seleccionar todo", "deselectAll": "Deseleccionar todo", "restore": "Restaurar", + "discard": "Discard", "download": "Descargar", "downloadAs": "Descargar como {format}", "export": "Exportar", "exportAs": "Exportar como {format}", "recreate": "Volver a crear", + "move": "Move", + "transfer": "Transfer", + "reattach": "Reattach", + "detach": "Detach", + "send": "Send", + "reset": "Reset", + "view": "View", "import": "Importar", "details": "Detalles", + "loadLogs": "Load Logs", + "sendTestEmail": "Send Test Email", "setPrimary": "Establecer como principal", "unsetPrimary": "Quitar principal", - "leavePage": "Salir de la página" + "leavePage": "Salir de la página", + "viewDocumentation": "View Documentation", + "undo": "Undo" }, "alert": { "error": "Error", @@ -88,27 +181,76 @@ "input": { "search": "Buscar..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "Restablecer al valor predeterminado", "edit": "Editar", "delete": "Eliminar", - "primary": "Principal" + "remove": "Remove", + "primary": "Principal", + "backupOnDifferentNode": "This backup is on a different node than the server. It is not viewable from the Client API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Nombre", + "newName": "New Name", "description": "Descripción", + "author": "Author", + "type": "Type", "password": "Contraseña", "host": "Host", "username": "Usuario", + "usernameOrEmail": "Username/Email", "server": "Servidor", "url": "URL", "email": "Correo", + "path": "Path", "port": "Puerto", + "provider": "Provider", "command": "Comando", + "fromAddress": "From Address", + "fromName": "From Name", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "apiKey": "API Key", + "accessKey": "Access Key", + "bucket": "Bucket", + "region": "Region", + "endpoint": "Endpoint", + "publicUrl": "Public URL", "firstName": "Nombre", "lastName": "Apellidos", "language": "Idioma", + "identifier": "Identifier", "enabled": "Activado", + "disabled": "Disabled", + "title": "Title", + "content": "Content", + "backupConfiguration": "Backup Configuration", "fileName": "Nombre del archivo", "sftpPort": "Puerto SFTP", "sftpHost": "Host SFTP", @@ -119,11 +261,26 @@ "startupCommand": "Comando de arranque", "archiveName": "Nombre del archivo", "archiveFormat": "Formato del archivo", + "compressionLevel": "Compression Level", + "multiplexChannels": "Multiplex Channels", + "multiplexChannelsDescription": "Add additional HTTP connections (and therefore also threads) for transferring split archives, total streams is 1 + multiplex channels.", + "deleteSourceBackups": "Delete source backups", + "deleteSourceBackupsDescription": "Deletes the transferred backups on the source node once transfer finishes.", + "node": "Node", + "primaryAllocation": "Primary Allocation", + "additionalAllocations": "Additional Allocations", + "externalId": "External ID", + "mount": "Mount", + "nest": "Nest", + "lines": "Lines", "databaseHost": "Host de la base de datos", + "databaseAgentHost": "Database Agent Host", "timezone": "Zona horaria", + "timezoneSystem": "System", "protocol": "Protocolo", "powerAction": "Acción de energía", "destination": "Destino", + "destinationDirectory": "Destination Directory", "directoryName": "Nombre del directorio", "locked": "Bloqueada", "portRanges": "Rangos de puertos", @@ -131,10 +288,17 @@ "currentPassword": "Contraseña actual", "confirmPassword": "Confirmar contraseña", "authenticationCode": "Código de autenticación", + "restoreStartup": "Restore the startup command, image, and variables from this backup.", "lineContains": "La línea contiene", + "filePath": "File Path", + "envVariable": "Environment Variable", + "value": "Value", "eggs": "Eggs", "ignoredFiles": "Archivos ignorados", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "Tu contraseña del panel de control", + "deploymentEnabled": "Deployment Enabled", + "maintenanceEnabled": "Maintenance Enabled", "truncateDirectory": "¿Quieres eliminar todos los archivos de este servidor antes de realizar esta acción? Esto no se puede deshacer." }, "table": { @@ -143,27 +307,60 @@ "empty": "No se encontró ningún elemento; casi parece que se están escondiendo." }, "columns": { + "id": "ID", "name": "Nombre", + "author": "Author", + "type": "Type", + "title": "Title", + "enabled": "Enabled", "description": "Descripción", "username": "Usuario", "size": "Tamaño", "lastUsed": "Último uso", "created": "Creado", + "updated": "Updated", "actor": "Actor", "event": "Evento", "ip": "IP", "when": "Cuándo", "command": "Comando", - "notes": "Notas" + "location": "Location", + "node": "Node", + "owner": "Owner", + "added": "Added", + "backupConfiguration": "Backup Configuration", + "status": "Status", + "allocation": "Allocation", + "notes": "Notas", + "source": "Source", + "target": "Target", + "checksum": "Checksum", + "files": "Files", + "server": "Server", + "address": "Address", + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, + "tabs": { + "general": "General" + }, "badge": { "active": "Activo", "inactive": "Inactivo", "enabled": "Activado", "disabled": "Desactivado", "successful": "Correcto", - "failed": "Fallido" + "failed": "Fallido", + "installed": "Installed" + }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" }, "server": { "noAllocation": "Sin asignación", @@ -217,6 +414,12 @@ "stopped": "Detenido", "restarted": "Reiniciado", "killed": "Forzado" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" } }, "unit": { @@ -233,15 +436,37 @@ "readOnly": "Solo lectura", "na": "N/A", "never": "Nunca", + "none": "None", + "unknown": "Unknown", "yes": "Sí", "no": "No", "web": "Web", "api": "API", + "default": "Default", + "custom": "Custom", "system": "Sistema", "schedule": "Programación", "impersonatedBy": "Suplantado por {username}" }, "elements": { + "routeOrderEditor": { + "title": "Route Configuration", + "label": { + "route": "Route", + "divider": "Divider", + "redirect": "Redirect" + }, + "empty": "No routes configured. Add routes, dividers, or redirects below.", + "unnamed": "(unnamed)", + "dividerPlaceholder": "Divider label (optional)", + "redirectNamePlaceholder": "Redirect name", + "destinationPlaceholder": "Destination URL (e.g. https://...)", + "selectRoutePlaceholder": "Select a route…", + "button": { + "addDivider": "Add Divider", + "addRedirect": "Add Redirect" + } + }, "errorBoundary": { "message": "La aplicación encontró un error al renderizar esta vista. Prueba a recargar la página.", "hideDetails": "Ocultar detalles", @@ -257,6 +482,13 @@ "copyManual": "Copiar al portapapeles: Ctrl+C o Command+C, Enter" } }, + "pasteOnClick": { + "toast": { + "pasted": "Pasted from clipboard.", + "failed": "Failed to paste from clipboard.", + "pasteManual": "Paste from clipboard: Ctrl+V or Command+V, Enter" + } + }, "estimatedTimeArrival": { "tooltip": { "estimating": "Calculando el tiempo de finalización...", @@ -268,7 +500,8 @@ "container": { "alert": { "impersonating": "Actualmente estás suplantando a un usuario. Ten en cuenta que tus acciones pueden afectar a la cuenta del usuario suplantado. Para salir del modo suplantación, haz clic en el botón \"Dejar de suplantar\" en la esquina inferior izquierda." - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -276,22 +509,43 @@ "stopImpersonating": "Dejar de suplantar", "openInVirtualWindow": "Abrir en ventana virtual", "openInPopup": "Abrir en ventana emergente", - "openInNewTab": "Abrir en una nueva pestaña" + "openInNewTab": "Abrir en una nueva pestaña", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { + "button": { + "copyPermissions": "Copy Permissions", + "pastePermissions": "Paste Permissions" + }, "selectedPermissions": "Permisos seleccionados ({count})", "noPermissions": "No hay permisos seleccionados." }, "selectInput": { "noResults": "No se encontraron resultados." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "No tienes permiso para guardar.", "cantDelete": "No tienes permiso para eliminar." } }, + "resource": { + "tooltip": { + "created": "{resource} created.", + "updated": "{resource} updated.", + "deleted": "{resource} deleted." + } + }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -308,6 +562,10 @@ "title": "No encontrado", "content": "No se pudo encontrar la página que buscas." }, + "suspended": { + "title": "Account Suspended", + "content": "Your account has been suspended. You cannot make changes to your account. Please contact an administrator for more information." + }, "serverConflict": { "title": "Estado del servidor en conflicto", "contentSuspended": "Este servidor está suspendido y no se puede acceder.", @@ -331,7 +589,10 @@ "scheduleDynamicInput": { "none": "Ninguno", "variable": "Variable", - "enterVariable": "Introduce el nombre de la variable a evaluar." + "enterVariable": "Introduce el nombre de la variable a evaluar.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -350,6 +611,7 @@ "toast": { "backupCompleted": "La copia de seguridad se completó correctamente.", "backupFailed": "La copia de seguridad falló.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "La restauración de la copia de seguridad se completó correctamente.", "installCompleted": "La instalación del servidor se completó correctamente.", "installFailed": "La instalación del servidor falló.", @@ -368,6 +630,7 @@ }, "copying": { "completed": "Se copió `{path}` a `{destination}` en {time}.", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", "failed": "No se pudo copiar `{path}` a `{destination}`:\n{error}" }, "copyingMany": { @@ -385,13 +648,21 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "Esperando: {file}", "uploading": "Subiendo: {file}", "uploadingFolder": "Subiendo carpeta: {folder} ({files})", + "rateLimited": "Your upload has been rate limited. Waiting...", + "cancelAllUploads": "Cancel all uploads", "toast": { "uploading": "Se inició la subida de {files}...", "cancelledFile": "Se canceló correctamente la subida de `{file}`.", - "cancelledFolder": "Se canceló correctamente la subida de `{folder}` ({files})." + "cancelledFolder": "Se canceló correctamente la subida de `{folder}` ({files}).", + "cancelledAll": "All uploads have been cancelled.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -447,6 +718,8 @@ "form": { "locationName": "Nombre de la ubicación", "locationNamePlaceholder": "Mi casa", + "locationFlag": "Location Flag", + "locationFlagPlaceholder": "The best country", "backupName": "Nombre de la configuración de copias de seguridad", "backupNamePlaceholder": "Unicorn Cloud", "backupDisk": "Disco de copias de seguridad", @@ -525,6 +798,7 @@ }, "server": { "title": "Servidor", + "existingServer": "A server has already been created. You can change the settings later in the admin menu.", "egg": { "title": "Egg", "description": "Vamos a poner en marcha tu primer servidor. ¿Qué egg te gustaría usar?", @@ -570,9 +844,14 @@ "login": "Iniciar sesión", "loginWith": "Iniciar sesión con {name}" }, + "alert": { + "urlMismatch": "The application URL does not match the current URL. Expected: `{appUrl}`, Current: `{currentUrl}`." + }, "login": { "error": { - "usernameRequired": "Introduce un usuario" + "usernameRequired": "Introduce un usuario", + "registrationDisabled": "No matching Account could be found and registration is currently disabled.", + "userAlreadyExists": "An account with this username or email already exists." }, "passkey": { "error": { @@ -590,6 +869,10 @@ "step": { "username": { "title": "Iniciar sesión", + "subtitle": "Enter your username or email address to continue", + "form": { + "usernameOrEmailPlaceholder": "Your username or email address" + }, "link": { "forgotPassword": "Olvidé mi contraseña", "notRegistered": "¿No estás registrado?", @@ -678,6 +961,9 @@ "noGroups": "No hay grupos disponibles a los que añadir el servidor", "noGroup": "Este servidor no está en ningún grupo" }, + "badge": { + "foreign": "Foreign" + }, "tabs": { "groupedServers": { "title": "Servidores agrupados", @@ -711,6 +997,13 @@ "toast": { "added": "Servidor añadido al grupo." } + }, + "removeServerFromGroup": { + "title": "Confirm Server Removal", + "content": "Are you sure you want to remove **{server}** from **{group}**?", + "toast": { + "removed": "Server removed from group." + } } }, "noGroups": "No se encontraron grupos; ¿hora de crear uno?" @@ -752,6 +1045,10 @@ "requireTwoFactor": { "title": "Se requiere autenticación en dos factores", "description": "Se requiere autenticación en dos factores en tu cuenta. Configúrala abajo para seguir usando el panel." + }, + "frozen": { + "title": "Account Frozen", + "description": "Your account has been frozen. You cannot make changes to your account until it is unfrozen. Please contact an administrator for more information." } }, "containers": { @@ -827,13 +1124,15 @@ }, "securityKeys": { "title": "Claves de seguridad", + "subtitle": "{current} of {max} maximum security keys created.", "table": { "columns": { "credentialId": "ID de credencial" } }, "tooltip": { - "secureContextRequired": "Se requiere un contexto seguro (HTTPS) para usar claves de seguridad." + "secureContextRequired": "Se requiere un contexto seguro (HTTPS) para usar claves de seguridad.", + "limitReached": "You are limited to {max} security keys." }, "modal": { "createSecurityKey": { @@ -882,6 +1181,23 @@ "subtitle": "Usa estos atajos de teclado para navegar e interactuar con el panel de forma más eficiente.", "detectedMac": "macOS detectado", "detectedWindows": "Windows/Linux detectado", + "label": { + "disabled": "Disabled", + "modified": "Modified", + "recording": "Press keys..." + }, + "button": { + "rebind": "Rebind", + "resetAll": "Reset All", + "copy": "Copy All", + "paste": "Paste" + }, + "toast": { + "imported": "Updated {shortcuts}.", + "importedNone": "No shortcuts were changed.", + "importErrors": "Ignored {unknown} and {invalid}.", + "resetAll": "All shortcuts reset to defaults." + }, "fileManager": { "title": "Gestor de archivos", "selectAll": "Seleccionar todos los archivos", @@ -917,6 +1233,10 @@ }, "sshKeys": { "title": "Claves SSH", + "subtitle": "{current} of {max} maximum ssh keys created.", + "tooltip": { + "limitReached": "You are limited to {max} ssh keys." + }, "table": { "columns": { "fingerprint": "Huella" @@ -961,6 +1281,10 @@ }, "commandSnippets": { "title": "Fragmentos de comandos", + "subtitle": "{current} of {max} maximum command snippets created.", + "tooltip": { + "limitReached": "You are limited to {max} command snippets." + }, "modal": { "createCommandSnippet": { "title": "Crear fragmento de comando", @@ -980,6 +1304,12 @@ "toast": { "removed": "Fragmento de comando eliminado." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1006,9 +1336,13 @@ }, "apiKeys": { "title": "Claves API", + "subtitle": "{current} of {max} maximum api keys created.", "button": { "apiDocumentation": "Documentación de la API" }, + "tooltip": { + "limitReached": "You are limited to {max} api keys." + }, "table": { "columns": { "key": "Clave", @@ -1042,6 +1376,12 @@ "toast": { "removed": "Clave API eliminada." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1050,67 +1390,2612 @@ "userPermissions": "Permisos de usuario", "serverPermissions": "Permisos de servidor", "adminPermissions": "Permisos de administrador" + }, + "create": { + "title": "Create API Key", + "subtitle": "An application is requesting an API key to be created for your account.", + "alert": { + "adminPermissions": "This API key requests **admin permissions**. Anyone in possession of this key will be able to perform administrative actions on this panel in your name. Only continue if you absolutely trust the requesting application.", + "callbackUrl": "After creation, the new API key will be sent to **{url}**." + }, + "noPermissions": "This API key will not have any permissions.", + "keyCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "button": { + "goToApiKeys": "Go to API Keys" + } } }, "activity": { "title": "Actividad" } }, - "server": { - "viewAdmin": { - "title": "Ver como administrador" + "admin": { + "home": { + "title": "Home", + "alert": { + "newPanelVersion": "A new version is available for the panel! You are currently on {current} and the latest version is {latest}. You may want to consider upgrading. [Click here]({upgradeUrl}) to view upgrade instructions." + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "permissionDenied": "You do not have permission to read the statistics that would have been here otherwise. For now, enjoy this bird.", + "card": { + "systemOverview": "System Overview", + "generalStatistics": "General Statistics", + "backupStatistics": "Backup Statistics" + }, + "system": { + "cpu": "CPU", + "memoryUsage": "Memory Usage ({process} used by Panel)", + "memoryValue": "{used} / {total} ({percent}%)", + "kernelVersion": "Kernel Version ({architecture})", + "containerType": "Container Type", + "databaseVersion": "Database Version ({size})", + "cacheVersion": "Cache Version", + "cacheCalls": "Cache Calls", + "cacheHits": "Cache Hits ({percent}%)", + "cacheMisses": "Cache Misses ({percent}%)", + "avgCachedCallLatency": "Avg. Cached Call Latency" + }, + "containerType": { + "none": "None detected", + "official": "Official", + "officialAio": "Official AIO", + "officialHeavy": "Official Heavy" + }, + "stats": { + "users": "Users", + "servers": "Servers", + "locations": "Locations", + "nodes": "Nodes", + "nestEggs": "Nest Eggs", + "databaseHosts": "Database Hosts", + "backupConfigurations": "Backup Configurations", + "roles": "Roles" + }, + "backup": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month", + "totalAllTime": "Total backups all time", + "successfulAllTime": "Successful backups all time", + "failedAllTime": "Failed backups all time", + "deletedAllTime": "Deleted backups all time", + "totalToday": "Total backups today", + "successfulToday": "Successful backups today", + "failedToday": "Failed backups today", + "deletedToday": "Deleted backups today", + "totalWeek": "Total backups this week", + "successfulWeek": "Successful backups this week", + "failedWeek": "Failed backups this week", + "deletedWeek": "Deleted backups this week", + "totalMonth": "Total backups this month", + "successfulMonth": "Successful backups this month", + "failedMonth": "Failed backups this month", + "deletedMonth": "Deleted backups this month", + "successfulValue": "{count} ({size})", + "deletedValue": "{count} ({size})" + } + } + }, + "updates": { + "title": "Updates", + "page": { + "alert": { + "extensionUpdateErrors": "There were errors checking for updates for some extensions." + }, + "card": { + "panelVersion": "Panel Version", + "versionHistory": "Version History", + "outdatedExtensions": "Outdated Extensions", + "outdatedNodes": "Outdated Nodes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" + }, + "panelVersion": "Your panel is currently running version `{current}`. The latest available version is `{latest}`.", + "unknown": "unknown", + "button": { + "recheck": "Recheck for Updates" + }, + "toast": { + "recheckComplete": "Recheck complete." + }, + "selectHistory": "Select an update history to view.", + "historyPanel": "Panel", + "historyExtension": "Extension: {name}", + "extensionsUpToDate": "All extensions are up to date.", + "extensionsOutdated": "Some extensions are outdated or had errors when checking for updates.", + "noChangelog": "No changelog", + "nodesUpToDate": "Seems like all nodes are up to date. ({failed} failed to check)", + "nodesOutdated": "Some nodes are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "table": { + "version": "Version", + "installed": "Installed", + "packageName": "Package Name", + "latestVersion": "Latest Version", + "changes": "Changes", + "error": "Error" + } + } + }, + "health": { + "title": "Health", + "page": { + "card": { + "generalHealth": "General Health", + "extensionMigrationHealth": "Extension Migration Health", + "desyncNodes": "Desync Nodes", + "debugMode": "Debug Mode" + }, + "appliedMigrations": "Applied Migrations ({percent}%)", + "migrationsValue": "{applied} / {total}", + "avgNtpOffset": "Avg. NTP Offset", + "noExtensions": "No extensions found.", + "nodesSynced": "Seems like all nodes have a synced clock (within 5 seconds of panel clock). ({failed} failed to check)", + "nodesDesync": "Some nodes have desync clocks (over 5 seconds off of the panel's clock). This can cause file download/console issues. ({desync} desync, {failed} failed to check)", + "debugEnabled": "Debug mode is currently enabled.", + "debugDisabled": "Debug mode is currently disabled.", + "debugResetNote": "This setting will be reset to the default ({default}) when the application restarts.", + "table": { + "packageName": "Package Name", + "applied": "Applied", + "total": "Total", + "id": "ID", + "desync": "Desync", + "appliedValue": "{applied} ({percent}%)" + }, + "button": { + "enableDebug": "Enable Debug Mode", + "disableDebug": "Disable Debug Mode" + }, + "toast": { + "debugEnabled": "Debug mode enabled.", + "debugDisabled": "Debug mode disabled." + } + } + } + } }, - "console": { - "title": "Consola", - "input": { - "placeholder": "Escribe un comando...", - "ariaLabel": "Entrada de comandos de la consola." + "settings": { + "title": "Settings", + "tabs": { + "application": { + "title": "Application", + "page": { + "title": "Application Settings", + "form": { + "icon": "Icon", + "iconLight": "Icon (Light Mode)", + "banner": "Banner", + "bannerLight": "Banner (Light Mode)", + "sessionCookie": "Session Cookie", + "sessionDurationSeconds": "Session Duration (seconds)", + "twoFactorRequirement": "Two-Factor Authentication Requirement", + "telemetryEnabled": "Enable Telemetry", + "telemetryEnabledDescription": "Allow Calagopus to collect limited and anonymous usage data to help improve the application.", + "registrationEnabled": "Enable Registration" + }, + "enum": { + "twoFactorRequirement": { + "admins": "Admins", + "allUsers": "All Users", + "none": "None" + } + }, + "button": { + "previewTelemetry": "Preview Telemetry" + }, + "toast": { + "updated": "Application settings updated." + }, + "modal": { + "disableTelemetry": { + "title": "Confirm Disabling Telemetry", + "content": "Are you sure you want to disable telemetry? Telemetry helps us improve Calagopus by providing anonymous usage data. Disabling telemetry will prevent any data from being sent." + }, + "enableRegistration": { + "title": "Confirm Enabling Registration", + "content": "Are you sure you want to enable registration? Enabling registration allows anyone to create an account on this panel. If you do not have a captcha configured, this may be a mistake." + }, + "telemetryPreview": { + "title": "Telemetry Preview" + } + } + } + }, + "storage": { + "title": "Storage", + "page": { + "title": "Storage Settings", + "form": { + "driver": "Driver" + }, + "enum": { + "driver": { + "filesystem": "Filesystem", + "s3": "S3" + } + }, + "toast": { + "updated": "Storage settings updated." + }, + "modal": { + "changeStorageType": { + "title": "Confirm Changing Storage Type", + "content": "Are you sure you want to change the storage type? Changing the storage type will cause the application to look for assets (e.g. profile pictures) in a different location, which may result in missing assets if they are not moved to the new location manually." + } + }, + "s3": { + "alert": { + "permissionsTitle": "Note on Permissions", + "permissionsIntro": "To ensure that the storage backend works correctly, please make sure the following subdirectories are publicly accessible over the \"Public URL\" you provided:", + "permissionsAssets": "This is where all admin assets (e.g., icons) will be stored.", + "permissionsAvatars": "This is where all user avatars will be stored.", + "permissionsPublicData": "This is where extensions can store public data (e.g., images)." + }, + "form": { + "pathStyle": "Using path-style URLs" + } + } + } + }, + "mail": { + "title": "Mail", + "page": { + "title": "Email Settings", + "enum": { + "provider": { + "none": "None", + "smtp": "SMTP", + "sendmail": "Sendmail Command", + "filesystem": "Filesystem" + }, + "tlsMode": { + "none": "None", + "startTls": "STARTTLS", + "implicitTls": "Implicit TLS" + } + }, + "toast": { + "updated": "Email settings updated." + }, + "modal": { + "sendTestEmail": { + "title": "Send Test Email", + "toast": { + "sent": "Test email has been sent successfully." + } + } + }, + "smtp": { + "form": { + "tlsMode": "TLS Mode", + "skipCertValidation": "Skip Certificate Validation" + } + } + } + }, + "mailTemplates": { + "title": "Mail Templates", + "page": { + "title": "Email Template Settings", + "sidebar": { + "templates": "Templates", + "loading": "Loading...", + "availableVariables": "Available Variables" + }, + "alert": { + "syntaxBefore": "Templates use the", + "syntaxLink": "MiniJinja", + "syntaxMiddle": "templating syntax. Variables are referenced with", + "syntaxAnd": "and control structures like", + "syntaxOr": "and", + "syntaxAfter": "are supported." + }, + "empty": "Select a template from the sidebar to edit it.", + "loadingTemplate": "Loading template...", + "form": { + "subject": "Subject" + }, + "toast": { + "saved": "Email template saved.", + "reset": "Email template reset to default." + }, + "modal": { + "reset": { + "title": "Reset to default", + "content": "This will discard your custom template for **{identifier}** and restore the built-in default. This cannot be undone." + } + } + } + }, + "captcha": { + "title": "Captcha", + "page": { + "title": "Captcha Settings", + "toast": { + "updated": "Captcha settings updated." + }, + "recaptcha": { + "form": { + "v3": "V3" + } + } + } + }, + "webauthn": { + "title": "Webauthn", + "page": { + "title": "Webauthn Settings", + "form": { + "rpId": "RP Id", + "rpOrigin": "RP Origin" + }, + "button": { + "autofill": "Autofill" + }, + "toast": { + "updated": "Webauthn settings updated.", + "ipNotAllowed": "Cannot use WebAuthn on an IP address." + }, + "modal": { + "changeRpId": { + "title": "Confirm Changing RP Id", + "content": "Are you sure you want to change the RP Id? Changing the RP Id will break all existing Webauthn credentials and require users to re-register their devices. This can have significant consequences, so please make sure you understand the implications before proceeding." + } + } + } + }, + "server": { + "title": "Server", + "page": { + "title": "Server Settings", + "form": { + "maxFileManagerViewSize": "Max File Manager View Size", + "maxScheduleStepCount": "Max Schedule Steps", + "maxFileManagerContentSearchSize": "Max File Manager Content Search Size", + "maxFileManagerSearchResults": "Max File Manager Search Results", + "maxSubuserCount": "Max Subuser Count", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", + "allowOverwritingCustomDockerImage": "Allow Overwriting Custom Docker Image", + "allowOverwritingCustomDockerImageDescription": "If enabled, users will be able to overwrite the Docker image specified in the server configuration using the Eggs list, even if an admin has set a custom Docker image.", + "allowViewingInstallationLogs": "Allow Viewing Installation Logs", + "allowViewingInstallationLogsDescription": "If enabled, users with console read permissions will also be able to view installation logs via the websocket connection. If disabled, installation logs will only be available for admins.", + "allowAcknowledgingInstallationFailure": "Allow Acknowledging Installation Failure", + "allowAcknowledgingInstallationFailureDescription": "If enabled, users will be able to acknowledge installation failures for servers that are in the \"Install Failed\" state, allowing them to attempt to start the server instead of having to wait for an admin. If disabled, only admins will be able to acknowledge installation failures.", + "allowViewingTransferProgress": "Allow Viewing Transfer Progress", + "allowViewingTransferProgressDescription": "If enabled, users with console read permissions will also be able to view transfer progress logs via the websocket connection. If disabled, transfer progress logs will only be available for admins.", + "containerPrelude": "Container Prelude", + "containerPreludeDescription": "The terminal prelude used for some status-related messages in the server console." + }, + "toast": { + "updated": "Server settings updated." + } + } + }, + "user": { + "title": "User", + "page": { + "title": "User Settings", + "form": { + "maxServerGroupCount": "Max Server Groups", + "maxApiKeyCount": "Max API Keys", + "maxCommandSnippetCount": "Max Command Snippets", + "maxSecurityKeyCount": "Max Security Keys", + "maxSshKeyCount": "Max SSH Keys", + "allowChangingLanguage": "Allow Changing Language", + "allowChangingLanguageDescription": "If enabled, users will be able to change their language preferences." + }, + "routeOrder": { + "title": "Client Route Order" + }, + "toast": { + "updated": "User settings updated." + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "Activity Settings", + "form": { + "adminLogRetentionDays": "Admin Activity Retention Days", + "userLogRetentionDays": "User Activity Retention Days", + "serverLogRetentionDays": "Server Activity Retention Days", + "adminLogRetentionCount": "Admin Activity Retention Count", + "userLogRetentionCount": "User Activity Retention Count", + "serverLogRetentionCount": "Server Activity Retention Count", + "serverLogAdminActivity": "Log Server Admin Activity", + "serverLogAdminActivityDescription": "Enable or disable logging of admin activity on servers where the admin isn't an owner or subuser.", + "serverLogScheduleActivity": "Log Server Schedule Activity", + "serverLogScheduleActivityDescription": "Enable or disable logging of activity done by server schedules." + }, + "toast": { + "updated": "Activity settings updated." + } + } + }, + "ratelimits": { + "title": "Ratelimits", + "page": { + "title": "Ratelimit Settings", + "form": { + "hits": "Hits", + "hitsDescription": "Maximum number of requests allowed per window.", + "windowSeconds": "Window", + "windowSecondsDescription": "Window duration in seconds." + }, + "toast": { + "updated": "Rate limit settings updated." + } + } + } + } + }, + "announcements": { + "title": "Announcements", + "resourceName": "Announcement", + "tabs": { + "general": { + "page": { + "modal": { + "delete": { + "title": "Confirm Announcement Deletion", + "content": "Are you sure you want to delete **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" + } + }, + "form": { + "dismissibleEnd": "Dismissible End", + "enabledStart": "Enabled Start", + "enabledEnd": "Enabled End", + "locations": "Locations", + "locationsDescription": "Leave empty to apply to all locations.", + "nodes": "Nodes", + "nodesDescription": "Leave empty to apply to all nodes.", + "backupConfigurations": "Backup Configurations", + "backupConfigurationsDescription": "Leave empty to apply to all backup configurations.", + "eggsPlaceholder": "Select Eggs", + "dismissible": "Dismissible" + }, + "titleCreate": "Create Announcement", + "titleUpdate": "Update Announcement" + } + } + }, + "enum": { + "announcementType": { + "info": "Info", + "success": "Success", + "warning": "Warning", + "error": "Error" + } + } + }, + "assets": { + "title": "Assets", + "button": { + "newDirectory": "New Directory", + "upload": "Upload", + "copyLink": "Copy Link" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" }, "toast": { - "installCancelled": "Instalación del servidor cancelada." + "assetDeleted": "Asset deleted.", + "assetsDeleted": "{assets} deleted." }, "modal": { - "sshDetails": { - "title": "Detalles SSH", - "form": { - "command": "Comando SSH" - }, - "launch": "Abrir" + "createDirectory": { + "title": "New Directory", + "createdAs": "Will be created at " + }, + "deleteAssets": { + "title": "Confirm Asset Deletion", + "content": "Are you sure you want to delete `{count}` assets?" + }, + "deleteAsset": { + "title": "Delete Asset", + "content": "Are you sure you want to delete this asset? This action cannot be undone." } + } + }, + "extensions": { + "title": "Extensions", + "unknownExtension": "Unknown Extension", + "alert": { + "noExtensions": "No extensions installed.", + "heavyImageMissing": "You don't seem to be using the heavy image required to install extensions, see [here]({docsUrl}) on how to switch to it." }, - "notification": { - "suspended": "Tu servidor está suspendido actualmente. No se pueden realizar acciones hasta que se levante la suspensión.", - "suspendedAdmin": "Este servidor está suspendido actualmente. Como eres administrador, aún puedes acceder al servidor, pero las acciones están limitadas.", - "nodeMaintenance": "Tu servidor está en un nodo que actualmente está en mantenimiento.", - "transferring": "Tu servidor se está transfiriendo actualmente a otro nodo.", - "restoringBackup": "Tu servidor se está restaurando desde una copia de seguridad. Espera...", - "installing": "Tu servidor se está instalando actualmente. Espera..." - }, - "message": { - "serverMarkedAs": "Servidor marcado como {state}...", - "installFailed": "La instalación ha fallado.", - "installCompleted": "La instalación se completó correctamente.", - "transferFailed": "La transferencia ha fallado.", - "transferCompleted": "La transferencia se completó correctamente. Reconectando al servidor...", - "pullingImage": "Tu servidor está descargando su imagen de Docker. Espera...", - "pulling": "Descargando", - "extracting": "Extrayendo" + "button": { + "viewBuildLogs": "View build logs", + "install": "Install extension", + "rebuild": "Rebuild extensions", + "configure": "Configure", + "back": "Back to Extensions", + "accept": "Accept", + "decline": "Decline" }, "tooltip": { - "search": "Buscar", - "sshDetails": "Detalles SSH", - "commandHistory": "Historial de comandos", - "decreaseFontSize": "Disminuir tamaño de fuente", - "increaseFontSize": "Aumentar tamaño de fuente" + "building": "The panel is currently building extension code. Please wait.", + "noPendingBuild": "No pending extensions to build.", + "noBackend": "Backend extension is required to configure this extension.", + "noConfigurationPage": "This extension does not have a configuration page defined.", + "removeExtension": "Remove extension" }, - "drawer": { - "commandHistory": { - "title": "Historial de comandos", - "detailTitle": "Detalles del comando", - "noCommands": "No se encontraron comandos.", - "copyButton": "Copiar comando", - "sendButton": "Enviar comando", - "commandSent": "Comando enviado correctamente." + "badge": { + "frontendMissing": "Frontend missing", + "backendMissing": "Backend missing", + "pendingBuild": "Pending build", + "pendingRemoval": "Pending removal" + }, + "card": { + "version": "Version", + "authors": "Authors" + }, + "section": { + "pendingExtensions": "Pending extensions", + "noPendingExtensions": "No pending extensions." + }, + "dropzone": { + "title": "Drop some files here to install as Extensions", + "subtitle": "Release to start installing" + }, + "toast": { + "buildStarted": "Extension rebuild started successfully.", + "buildCompleted": "Extension build completed. You may need to refresh the page.", + "added": "Extension `{packageName}` added successfully.", + "removed": "Extension `{packageName}` removed successfully." + }, + "notFound": { + "title": "Extension Not Found", + "content": "Extension with package name \"{packageName}\" not found." + }, + "configure": { + "title": "Configure {packageName}", + "noConfigurationPage": "This extension does not have a configuration page." + }, + "modal": { + "buildLogs": { + "title": "Build Logs", + "empty": "No logs found." + }, + "license": { + "title": "License agreement", + "description": "The extension `{packageName}` requires you to accept the following license before it can be installed." + }, + "remove": { + "title": "Remove extension", + "content": "Are you sure you want to remove the extension `{packageName}`? This action cannot be undone.", + "form": { + "removeMigrations": "Do you want to remove & rollback the database migrations of this extension?" + } + } + } + }, + "users": { + "title": "Users", + "resourceName": "User", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, + "tooltip": { + "admin": "Admin", + "twoFactorEnabled": "2FA Enabled", + "twoFactorDisabled": "2FA Disabled" + }, + "table": { + "columns": { + "role": "Role" + } + }, + "tabs": { + "general": { + "page": { + "tooltip": { + "cannotImpersonateSelf": "You cannot impersonate yourself." + }, + "button": { + "disableTwoFactor": "Disable Two Factor", + "sendPasswordResetEmail": "Send Password Reset Email", + "impersonate": "Impersonate" + }, + "form": { + "admin": "Admin", + "adminDescription": "Admin users have full, unrestricted access to everything on the panel.", + "frozen": "Frozen", + "frozenDescription": "Frozen users cannot make any changes to their account information.", + "suspended": "Suspended", + "suspendedDescription": "Suspended users cannot access the panel in any meaningful way.", + "role": "Role" + }, + "modal": { + "delete": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete **{username}**?" + }, + "disableTwoFactor": { + "title": "Disable User Two Factor", + "content": "Are you sure you want to remove the two factor of **{username}**?", + "toast": { + "disabled": "User two factor disabled." + } + }, + "sendPasswordResetEmail": { + "title": "Send Password Reset Email", + "content": "Are you sure you want to send a password reset email to **{email}**?", + "toast": { + "sent": "Password reset email sent." + } + } + }, + "titleCreate": "Create User", + "titleUpdate": "Update User" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "User Servers", + "showOwnedOnly": "Only show users' owned servers" + } + }, + "oauthLinks": { + "title": "OAuth Links", + "page": { + "title": "User OAuth Links", + "toast": { + "added": "OAuth Link added.", + "removed": "OAuth Link removed." + }, + "modal": { + "add": { + "title": "Add OAuth Link", + "form": { + "oauthProvider": "OAuth Provider" + } + }, + "delete": { + "title": "Confirm OAuth Link Deletion", + "content": "Are you sure you want to delete the **{provider}** connection from **{username}**?" + } + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "User Activity" + } + } + } + }, + "locations": { + "title": "Locations", + "resourceName": "Location", + "tabs": { + "general": { + "page": { + "form": { + "flag": "Flag" + }, + "modal": { + "delete": { + "title": "Confirm Location Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "titleCreate": "Create Location", + "titleUpdate": "Update Location" + } + }, + "databaseHosts": { + "title": "Database Hosts", + "page": { + "title": "Location Database Hosts", + "toast": { + "created": "Location database host created.", + "deleted": "Location database host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Host" + }, + "delete": { + "title": "Confirm Location Database Host Deletion", + "content": "Are you sure you want to delete the database host **{name}** from **{location}**?" + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Location Nodes" + } + } + } + }, + "nodes": { + "title": "Nodes", + "resourceName": "Node", + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "general": { + "page": { + "tooltip": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "allInOneNode": "All-in-One Node", + "errorWhileFetchingVersion": "Error while fetching version", + "updateAvailable": "{version} (Update Available)", + "useWingsProxyUrl": "Use Wings Proxy URL" + }, + "form": { + "urlDescription": "Used for internal communication with the node.", + "publicUrlDescription": "Used for websocket connections and downloads.", + "backupConfigurationPlaceholder": "Inherit from Location", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." + }, + "button": { + "resetToken": "Reset Token", + "updateConfig": "Update Config" + }, + "toast": { + "tokenReset": "Node token reset." + }, + "alert": { + "noLocations": "You need to create at least one location before you can create nodes. Locations help organize your nodes geographically or logically." + }, + "titleCreate": "Create Node", + "titleUpdate": "Update Node" + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/pterodactyl/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "panelUrl": "Panel URL", + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the node: {error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Node Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "toast": { + "connectionLost": "Lost connection to the node statistics stream." + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "cpuThreads": "{model} ({threads} threads)", + "usedByWings": "{size} used by Wings", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "networkTraffic": "Network Traffic", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "inbound": "Inbound", + "outbound": "Outbound", + "networkInLabel": "Network In", + "networkOutLabel": "Network Out" + } + } + }, + "capacity": { + "title": "Capacity", + "page": { + "title": "Deployment Capacity", + "subtitle": "Resources allocated to servers on this node, measured against the limits configured in node settings, not the physical machine capacity. Deployment only checks memory and disk.", + "card": { + "resources": "Allocated Resources" + }, + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Under Maintenance", + "maintenanceDisabled": "Not Under Maintenance" + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "memoryOverhead": "Memory Overhead", + "servers": "Servers", + "noLimit": "No node limit", + "free": "{size} free", + "overhead": "+ {size} reserved overhead", + "cores": "{cores} cores allocated" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Node Logs", + "form": { + "logFile": "Log File", + "follow": "Follow" + }, + "button": { + "download": "Download Full Log" + }, + "toast": { + "connectionLost": "Lost connection to the node log stream." + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Node Allocations", + "tooltip": { + "clearSelection": "Clear Selection" + }, + "form": { + "ipAlias": "IP Alias" + }, + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "modal": { + "create": { + "title": "Create Node Allocations", + "button": { + "create": "Create {count}" + }, + "toast": { + "created": "{allocations} created." + } + }, + "update": { + "title": "Update Node Allocations", + "toast": { + "updated": "{allocations} updated." + } + }, + "delete": { + "title": "Confirm Node Allocations Deletion", + "content": "Are you sure you want to delete `{count}` allocations from **{name}**?", + "toast": { + "deleted": "{allocations} deleted." + } + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Node Mounts", + "toast": { + "added": "Node Mount added.", + "removed": "Node Mount removed." + }, + "modal": { + "add": { + "title": "Add Node Mount" + }, + "remove": { + "title": "Confirm Node Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Node Backups", + "input": { + "detachedOnly": "Only show detached backups" + }, + "tooltip": { + "backupNotOnSameNode": "This backup is not on the same node as the server. It is not viewable from the Client API." + }, + "toast": { + "downloadStarted": "Download started.", + "detached": "Backup detached successfully.", + "reattached": "Reattached backup to {name} successfully.", + "restoring": "Restoring backup to {name}...", + "exporting": "Exporting backup to files of {name}...", + "deleted": "Node backup deleted." + }, + "modal": { + "export": { + "title": "Export Node Backup to Files" + }, + "detach": { + "title": "Confirm Backup Detachment", + "content": "Are you sure you want to detach this backup from its server? It will not be deleted and can be reattached later." + }, + "reattach": { + "title": "Reattach Node Backup", + "description": "Reattaching a node backup will link it to a server. This is useful if the backup is detached or you want to link it to a different server. Do note that this is not a transfer tool, unless the backup is considered remote (can be accessed by multiple nodes), the server must belong to the same node as the backup." + }, + "restore": { + "title": "Restore Node Backup", + "form": { + "truncateDirectory": "Do you want to empty the filesystem of this server before restoring the backup?" + } + }, + "delete": { + "title": "Confirm Node Backup Deletion", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Node Servers", + "modal": { + "transfer": { + "title": "Transfer Servers", + "form": { + "allocationMode": "Allocation Mode", + "transferBackups": "Transfer backups", + "transferBackupsDescription": "Whether to transfer backups along with the servers." + }, + "toast": { + "started": "{servers} transfer started." + }, + "confirm": { + "title": "Confirm Server Transfers", + "content": "Are you sure you want to transfer `{count}` servers from **{from}** to **{to}**? This action cannot be undone." + }, + "enum": { + "allocationMode": { + "none": "None (scrap all allocations, server will not be automatically assigned new allocations on the destination node)", + "randomPrimary": "Randomize primary allocation (removes additional allocations)", + "randomAll": "Randomize all allocations (recommended to avoid incompatibility issues with destination node)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", + "eggConfigDeployment": "Assign allocations based on Egg deployment configuration (only works if the Egg has a deployment configuration and the destination node has compatible allocations)", + "eggConfigSelfAssignRange": "Self-assign new allocations based on Egg port range (only works if the Egg has a port range and the destination node has compatible allocations)" + } + } + }, + "powerAction": { + "title": "Confirm Power Action", + "content": "Are you sure you want to **{action}** {servers}?" + } + } + } + }, + "transfers": { + "title": "Outgoing Transfers", + "page": { + "title": "Node Transfers", + "table": { + "columns": { + "progress": "Progress", + "archiveRate": "Archive Rate", + "networkRate": "Network Rate" + } + } + } + } + }, + "modal": { + "delete": { + "title": "Confirm Node Deletion", + "content": "Are you sure you want to delete **{name}**?" + }, + "bulkConfig": { + "title": "Update Configuration - {nodes}", + "button": { + "apply": "Apply to {nodes}" + }, + "toast": { + "applied": "Configuration applied to {nodes}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "servers": { + "title": "Servers", + "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, + "general": { + "page": { + "titleCreate": "Create Server", + "titleUpdate": "Update Server", + "card": { + "basicInformation": "Basic Information", + "serverAssignment": "Server Assignment", + "resourceLimits": "Resource Limits", + "serverConfiguration": "Server Configuration", + "featureLimits": "Feature Limits", + "allocations": "Allocations", + "variables": "Variables" + }, + "alert": { + "suspended": "This server is suspended.", + "selectEggForVariables": "Please select an egg before you can configure variables." + }, + "badge": { + "serverSuspended": "Server Suspended" + }, + "form": { + "serverNamePlaceholder": "My Game Server", + "externalIdPlaceholder": "Optional external identifier", + "descriptionPlaceholder": "Server description", + "owner": "Owner", + "egg": "Egg", + "backupConfigurationPlaceholder": "Inherit from Node/Location", + "cpuLimit": "CPU Limit (%)", + "cpuLimitDescription": "The CPU limit in % that the server can use.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this server.", + "swapTooltip": "-1 will not set a limit.", + "memoryDescription": "The Memory limit of the server container.", + "memoryTooltip": "0 will not set a limit.", + "memoryOverhead": "Memory Overhead", + "memoryOverheadDescription": "Hidden Memory that will be added to the container.", + "diskSpace": "Disk Space", + "diskSpaceDescription": "The disk limit of the server.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the server container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems.", + "pinnedCpus": "Pinned CPUs", + "pinnedCpusDescription": "The CPU cores this server is pinned to.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", + "dockerImagePlaceholder": "ghcr.io/...", + "predefinedDockerImages": "Predefined Docker Images", + "predefinedDockerImagesPlaceholder": "No predefined image selected", + "timezonePlaceholder": "Europe/Amsterdam", + "startupCommandPlaceholder": "npm start", + "startupCommandCustom": "Custom", + "predefinedStartupCommands": "Predefined Startup Commands", + "startOnCompletion": "Start on Completion", + "startOnCompletionDescription": "Start server after installation completes.", + "skipInstaller": "Skip Installer", + "skipInstallerDescription": "Skip running the install script.", + "hugepagesPassthroughEnabled": "Enable Hugepages Passthrough", + "hugepagesPassthroughEnabledDescription": "Enable hugepages passthrough for the server (mounts /dev/hugepages into the container).", + "kvmPassthroughEnabled": "Enable KVM Passthrough", + "kvmPassthroughEnabledDescription": "Enable KVM passthrough for the server (allows access to /dev/kvm inside the container).", + "allocationsLimit": "Allocations", + "databasesLimit": "Databases", + "databaseAgentsLimit": "Agent Databases", + "backupsLimit": "Backups", + "schedulesLimit": "Schedules" + }, + "modal": { + "confirmNoAllocation": { + "title": "No Primary Allocation Assigned", + "content": "You are creating a server without assigning any primary allocation. Are you sure you want to continue?", + "button": { + "confirm": "Create Anyway" + } + } + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Server Allocations", + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "form": { + "notesPlaceholder": "Notes" + }, + "toast": { + "updated": "Allocation updated.", + "setPrimary": "Allocation set as primary.", + "unsetPrimary": "Allocation unset as primary.", + "removed": "Allocation removed.", + "added": "{count} allocations added." + }, + "modal": { + "add": { + "title": "Add Server Allocations", + "form": { + "allocations": "Allocations" + }, + "button": { + "add": "Add {count}" + } + }, + "remove": { + "title": "Confirm Allocation Removal", + "content": "Are you sure you want to remove **{allocation}**?" + } + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Server Variables", + "toast": { + "updated": "Server variables updated." + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Server Mounts", + "toast": { + "added": "Server Mount added.", + "deleted": "Server Mount deleted." + }, + "modal": { + "add": { + "title": "Add Server Mount" + }, + "remove": { + "title": "Confirm Server Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Server Backups", + "input": { + "partiallyDetachedOnly": "Only show partially detached backups" + } + } + }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Server Logs", + "form": { + "logType": "Log Type" + }, + "enum": { + "logType": { + "console": "Console", + "install": "Install" + } + } + } + }, + "management": { + "title": "Management", + "page": { + "title": "Server Management", + "transfer": { + "title": "Transfer", + "content": "Transfer this server and it's data to another node within this system.", + "toast": { + "started": "Server transfer started." + }, + "modal": { + "title": "Server Transfer", + "form": { + "backupsToTransfer": "Backups to transfer" + }, + "tooltip": { + "aioNotSupported": "Transfers to the All-In-One node are not supported." + }, + "confirm": { + "title": "Confirm Server Transfer", + "content": "Are you sure you want to transfer **{name}** from **{from}** to **{to}**?", + "alert": { + "notAllBackupsSelected": "You have not selected all backups to transfer, the remaining backups will become partially detached if the transfer completes successfully." + } + } + } + }, + "suspend": { + "title": "Suspend", + "content": "This will suspend the server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the server through the panel or API.", + "button": "Suspend", + "toast": { + "suspended": "Server suspended." + }, + "modal": { + "title": "Confirm Server Suspension", + "content": "Are you sure you want to suspend **{name}**? This will stop the server and prevent it from starting. All running processes will be stopped and the user will not be able to access their files or otherwise manage the server through the panel or API." + } + }, + "unsuspend": { + "title": "Unsuspend", + "content": "This will unsuspend the server, allowing it to start again. The user will be able to access their files and otherwise manage the server through the panel or API.", + "button": "Unsuspend", + "toast": { + "unsuspended": "Server unsuspended." + }, + "modal": { + "title": "Confirm Server Unsuspension", + "content": "Are you sure you want to unsuspend **{name}**? This will allow the server to start again. The user will be able to access their files and otherwise manage the server through the panel or API." + } + }, + "clearState": { + "title": "Clear State", + "content": "This will clear the server state known by the panel.", + "button": "Clear State", + "toast": { + "cleared": "Server state cleared." + }, + "modal": { + "title": "Confirm Server State Clear", + "content": "Are you sure you want to clear the state of **{name}**? This will clear any known pending transfers and status failures, please make sure it is safe to do this before clicking without reason." + } + }, + "delete": { + "title": "Delete", + "content": "This will delete the server and all of its data. This action cannot be undone.", + "toast": { + "deleted": "Server deleted." + }, + "modal": { + "title": "Confirm Server Deletion", + "description": "You are about to delete **{name}**. Are you sure?", + "form": { + "deleteBackups": "Do you want to delete backups of this server?", + "confirmServerName": "Confirm Server Name", + "confirmServerNamePlaceholder": "Server Name" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "viewClient": { + "title": "View in Client Area" + } + } + }, + "nests": { + "title": "Nests", + "resourceName": "Nest", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Nest", + "titleUpdate": "Update Nest", + "modal": { + "delete": { + "title": "Confirm Nest Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": { + "deleteEggs": "Do you want to delete all eggs in this nest?" + } + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Eggs", + "resourceName": "Egg", + "dropzone": { + "title": "Drop some files here to import as Eggs", + "subtitle": "Release to start importing" + }, + "button": { + "updateFromRepository": "Update from Repository" + }, + "toast": { + "imported": "Egg imported.", + "moved": "Egg moved.", + "movedBulk": "{eggs} moved.", + "deletedBulk": "{eggs} deleted.", + "updatedFromRepository": "{eggs} updated using their respective repository egg successfully.", + "parseFailed": "Failed to parse egg: {error}" + }, + "modal": { + "move": { + "title": "Move Egg" + }, + "moveBulk": { + "title": "Move Eggs", + "confirm": "Move {eggs}" + }, + "deleteBulk": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete `{count}` eggs?" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg", + "titleUpdate": "Update Egg", + "card": { + "startupConfiguration": "Startup Configuration", + "stopConfiguration": "Stop Configuration", + "configFiles": "Config Files Configuration" + }, + "form": { + "eggRepository": "Egg Repository", + "eggRepositoryEgg": "Egg Repository Egg", + "startupDone": "Startup Done", + "startupDoneDescription": "Console message indicating startup completion.", + "stripAnsi": "Strip ANSI from startup messages", + "stripAnsiDescription": "Removes ANSI control characters from the console output before matching startup completion.", + "stopType": "Stop Type", + "stopCommand": "Stop Command", + "stopSignal": "Stop Signal", + "parser": "Parser", + "createNewFile": "Create New File", + "createNewFileDescription": "If enabled, the file will be created if it does not exist. If disabled, the file must already exist or the replacement will fail.", + "match": "Match", + "ifValue": "If Value", + "replaceWith": "Replace With", + "insertNew": "Insert New", + "insertNewDescription": "If enabled, if no existing value matches the \"Match\" field, the \"Replace With\" value will be inserted into the file. If disabled, if no match is found, no changes will be made to the file.", + "updateExisting": "Update Existing", + "updateExistingDescription": "If enabled, if a match is found, it will be replaced with the \"Replace With\" value. If disabled, the replacement will only insert new values and will fail if a match is found.", + "startupCommands": "Startup Commands", + "forceOutgoingIp": "Force Outgoing IP", + "separatePort": "Separate IP and Port", + "separatePortDescription": "Separates the primary IP and port on the Console page instead of joining them with \":\".", + "features": "Features", + "featurePlaceholder": "Feature", + "fileDenylist": "File Deny List", + "dockerImages": "Docker Images" + }, + "enum": { + "stopType": { + "command": "Send Command", + "signal": "Send Signal", + "docker": "Docker Stop" + } + }, + "emptyConfigFiles": "No config files defined.", + "emptyReplacements": "No replacements defined.", + "button": { + "addReplacement": "Add Replacement", + "addConfigFile": "Add Config File", + "fromFile": "from File", + "fromRepository": "from Repository" + }, + "toast": { + "exported": "Egg exported.", + "updated": "Egg updated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "installationScript": { + "title": "Installation Script", + "page": { + "title": "Egg Installation Script", + "form": { + "container": "Installation Container", + "entrypoint": "Container Entrypoint" + }, + "toast": { + "updated": "Egg script updated." + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Egg Variables", + "form": { + "supportsMarkdown": "Supports Markdown formatting.", + "defaultValue": "Default Value", + "defaultValuePlaceholder": "server.jar", + "userViewable": "User Viewable", + "userEditable": "User Editable", + "secret": "Secret", + "rules": "Rules", + "rulesDescription": "See https://laravel.com/docs/12.x/validation#available-validation-rules for the available validation rules." + }, + "toast": { + "created": "Egg variable created.", + "updated": "Egg variable updated.", + "deleted": "Egg variable deleted.", + "duplicated": "Egg variable duplicated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Variable Removal", + "content": "Are you sure you want to remove **{variable}**?", + "emptyVariable": "this empty variable" + }, + "duplicate": { + "title": "Duplicate Egg Variable" + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Egg Mounts", + "toast": { + "added": "Egg Mount added.", + "deleted": "Egg Mount deleted." + }, + "modal": { + "add": { + "title": "Add Egg Mount" + }, + "delete": { + "title": "Confirm Egg Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{egg}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Egg Servers" + } + } + } + } + } + } + }, + "eggConfigurations": { + "title": "Egg Configurations", + "resourceName": "Egg Configuration", + "table": { + "columns": { + "order": "Order" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Configuration", + "titleUpdate": "Update Egg Configuration", + "form": { + "order": "Order", + "eggs": "Eggs", + "eggsPlaceholder": "Select Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." + }, + "enum": { + "deploymentType": { + "random": "Random", + "range": "Port Range", + "addPrimary": "Add to Primary", + "subtractPrimary": "Subtract from Primary", + "multiplyPrimary": "Multiply Primary", + "dividePrimary": "Divide Primary" + } + }, + "allocation": { + "title": "Allocation Configuration", + "form": { + "userSelfAssign": "User Self Assign", + "userSelfAssignDescription": "Allow users to create their own allocations from a specified port range.", + "requirePrimaryAllocation": "Require Primary Allocation", + "requirePrimaryAllocationDescription": "Whether users must always have a primary allocation.", + "automaticAllocationStart": "Automatic Allocation Start", + "automaticAllocationEnd": "Automatic Allocation End", + "dedicatedIp": "Dedicated IP", + "dedicatedIpDescription": "Assign a dedicated ip address for servers using this egg configuration.", + "primaryAllocation": "Primary Allocation", + "primaryAllocationDescription": "Configure a primary port assignment for deployment.", + "primaryStartPort": "Primary Start Port", + "primaryEndPort": "Primary End Port", + "assignToVariable": "Assign to Variable", + "assignToVariablePlaceholder": "e.g. SERVER_PORT", + "assignToVariableDescription": "Optional environment variable to receive the assigned primary port." + }, + "divider": { + "deployment": "Deployment" + }, + "additionalPorts": { + "title": "Additional Ports", + "button": "Add Rule", + "empty": "No additional port rules configured." + }, + "deployment": { + "form": { + "startPort": "Start Port", + "endPort": "End Port", + "assignToVariable": "Assign to Variable", + "assignToVariableDescription": "Optional environment variable to receive the assigned port from this rule.", + "assignToVariablePlaceholder": "e.g. SERVER_PORT" + }, + "removeRule": "Remove deployment rule" + } + }, + "startup": { + "title": "Startup Configuration", + "form": { + "allowCustomStartupCommand": "Allow Custom Startup Command", + "allowCustomStartupCommandDescription": "Allow users to set their own, non-predefined startup commands." + } + }, + "modal": { + "delete": { + "title": "Confirm Egg Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + } + } + }, + "eggRepositories": { + "title": "Egg Repositories", + "resourceName": "Egg Repository", + "table": { + "columns": { + "gitRepository": "Git Repository" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Repository", + "titleUpdate": "Update Egg Repository", + "form": { + "gitRepository": "Git Repository" + }, + "button": { + "sync": "Sync" + }, + "toast": { + "synced": "Egg repository synchronised, found {eggs}." + }, + "modal": { + "delete": { + "title": "Confirm Egg Repository Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Egg Repository Eggs", + "table": { + "columns": { + "path": "Path" + } + }, + "toast": { + "installed": "Egg installed.", + "installedBulk": "{eggs} installed." + }, + "modal": { + "install": { + "title": "Install Egg Repository Egg" + }, + "installBulk": { + "title": "Install Egg Repository Eggs", + "button": "Install {eggs}" + } + }, + "drawer": { + "noReadme": "This egg does not have a README." + } + } + } + } + }, + "databaseHosts": { + "title": "Database Hosts", + "resourceName": "Database host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Host", + "titleUpdate": "Update Database Host", + "form": { + "publicHost": "Public Host", + "publicPort": "Public Port", + "connectionCredentials": "Connection Credentials", + "credentialType": "Credential Type", + "connectionString": "Connection String", + "connectionStringPlaceholder": "mysql://username:password@host:port" + }, + "enum": { + "credentialType": { + "connectionString": "Connection String", + "details": "Details" + } + }, + "button": { + "testConnection": "Test Connection" + }, + "toast": { + "tested": "Test successfully completed." + }, + "modal": { + "delete": { + "title": "Confirm Database Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "databases": { + "title": "Databases", + "page": { + "title": "Database Host Databases", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } + } + } + } + }, + "oAuthProviders": { + "title": "OAuth Providers", + "resourceName": "OAuth Provider", + "dropzone": { + "title": "Drop some files here to import as OAuth Providers", + "subtitle": "Release to start importing" + }, + "table": { + "columns": { + "loginOnly": "Login Only", + "linkViewable": "Link Viewable", + "userManageable": "User Manageable" + } + }, + "toast": { + "imported": "OAuth Provider imported.", + "parseFailed": "Failed to parse OAuth provider: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create OAuth Provider", + "titleUpdate": "Update OAuth Provider", + "card": { + "redirectUrl": { + "title": "Redirect URL", + "unavailable": "Available after creation" + } + }, + "form": { + "clientId": "Client Id", + "clientSecret": "Client Secret", + "authUrl": "Auth URL", + "tokenUrl": "Token URL", + "infoUrl": "Info URL", + "basicAuth": "Basic Auth", + "basicAuthDescription": "Uses HTTP Basic Authentication to transmit the client id and secret, not common anymore.", + "scopes": "Scopes", + "scopesDescription": "The OAuth2 scopes to request, make sure to include scopes for email and profile info when needed.", + "identifierPath": "Identifier Path", + "identifierPathDescription": "The path used to extract the unique user identifier from the Info URL response (https://serdejsonpath.live).", + "emailPath": "Email Path", + "emailPathDescription": "The path used to extract the email from the Info URL response (https://serdejsonpath.live).", + "usernamePath": "Username Path", + "usernamePathDescription": "The path used to extract the username from the Info URL response (https://serdejsonpath.live).", + "nameFirstPath": "First Name Path", + "nameFirstPathPlaceholder": "First Name URL", + "nameFirstPathDescription": "The path used to extract the first name from the Info URL response (https://serdejsonpath.live).", + "nameLastPath": "Last Name Path", + "nameLastPathDescription": "The path used to extract the last name from the Info URL response (https://serdejsonpath.live).", + "loginOnly": "Only allow Login", + "loginBypass2fa": "Bypass 2FA on Login", + "loginBypass2faDescription": "Allows users logging in with this provider to bypass their panel 2FA.", + "linkViewable": "Link Viewable to User", + "linkViewableDescription": "Allows the user to see the connection and its identifier in the client UI.", + "userManageable": "Link Manageable by User", + "userManageableDescription": "Allows the user to connect and disconnect with this provider." + }, + "toast": { + "exported": "OAuth Provider exported." + }, + "modal": { + "delete": { + "title": "Confirm OAuth Provider Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "mappings": { + "title": "Mappings", + "page": { + "title": "OAuth Provider Mappings", + "table": { + "columns": { + "matcher": "Matcher" + } + }, + "enum": { + "mappingType": { + "role": "Role", + "serverSubuser": "Server Subuser" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" + } + }, + "toast": { + "created": "OAuth provider mapping created.", + "updated": "OAuth provider mapping updated.", + "deleted": "OAuth provider mapping deleted." + }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, + "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", + "scopesDescription": "OAuth scopes that must all have been granted for this matcher to match.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", + "mappingType": "Mapping Type", + "role": "Role", + "permissions": "Permissions" + }, + "modal": { + "add": { + "title": "Add OAuth Provider Mapping" + }, + "edit": { + "title": "Edit OAuth Provider Mapping" + }, + "delete": { + "title": "Delete OAuth Provider Mapping", + "content": "Are you sure you want to delete this mapping? This action cannot be undone." + } + } + } + }, + "users": { + "title": "Users", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, + "page": { + "title": "OAuth Provider Users", + "table": { + "columns": { + "user": "User" + } + } + } + } + } + }, + "backupConfigurations": { + "title": "Backup Configurations", + "resourceName": "Backup configuration", + "table": { + "columns": { + "disk": "Disk" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Backup Configuration", + "titleUpdate": "Update Backup Configuration", + "alert": { + "ddupBak": "Ddup-Bak is Technology Preview software, it is technically not recommended for production use. If you acknowledge, sail ahead as you wish.", + "btrfs": "Btrfs requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "zfs": "ZFS requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "pbs": "The provided API token needs the following datastore ACLs: **DatastoreAudit** for usage and listing, **DatastoreBackup** for writing backups, and **DatastoreAdmin** (or equivalent prune/delete permissions) if backup deletion or pruning is enabled." + }, + "form": { + "backupDisk": "Backup Disk", + "maintenanceEnabledDescription": "If enabled, any server using this backup configuration will not be able to create new backups, or manage existing ones.", + "shared": "Shared", + "sharedDescription": "If enabled, backups on this backup configuration will not be transferred between nodes, they will be assumed to be accessible by all nodes." + }, + "modal": { + "delete": { + "title": "Confirm Backup Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "s3": { + "title": "S3 Settings", + "form": { + "partSize": "Part Size", + "compressionType": "Compression Type", + "pathStyle": "Using path-style URLs" + } + }, + "restic": { + "title": "Restic Settings", + "form": { + "repository": "Repository", + "retryLockSeconds": "Retry Lock Seconds", + "environmentVariables": "Environment Variables", + "cronSchedule": "Cron Schedule", + "cronScheduleDescription": "Format: second minute hour day month weekday.", + "nodes": "Nodes", + "nodesPlaceholder": "Select nodes" + }, + "pruneJobs": { + "title": "Prune Jobs", + "description": "Scheduled restic prune runs. Each job runs on the configured nodes following its cron schedule.", + "button": { + "add": "Add Prune Job" + } + } + }, + "pbs": { + "title": "Proxmox Backup Server Settings", + "form": { + "url": "Server URL", + "datastore": "Datastore", + "namespace": "Namespace", + "tokenId": "Token ID", + "tokenSecret": "Token Secret", + "fingerprint": "TLS Certificate Fingerprint", + "backupIdPrefix": "Backup ID Prefix" + } + }, + "kopia": { + "title": "Kopia Settings", + "form": { + "url": "Kopia Server URL", + "fingerprint": "TLS Certificate Fingerprint", + "tags": "Backup Tags" + } + } + } + }, + "stats": { + "title": "Stats", + "page": { + "title": "Backup Configuration Stats", + "card": { + "title": "Backup Statistics" + }, + "period": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month" + }, + "periodLabel": { + "allTime": "all time", + "today": "today", + "week": "this week", + "month": "this month" + }, + "stat": { + "total": "Total backups {period}", + "successful": "Successful backups {period}", + "failed": "Failed backups {period}", + "deleted": "Deleted backups {period}" + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Backup Configuration Backups", + "toast": { + "downloadStarted": "Download started." + } + } + }, + "locations": { + "title": "Locations", + "page": { + "title": "Backup Configuration Locations" + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Backup Configuration Nodes" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Backup Configuration Servers" + } + } + } + }, + "mounts": { + "title": "Mounts", + "resourceName": "Mount", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Mount", + "titleUpdate": "Update Mount", + "alert": "Mounts are a powerful and potentially dangerous feature. Improper use can lead to data loss or security vulnerabilities (including container escapes). Make sure you understand the implications of using mounts before creating or updating them.", + "form": { + "source": "Source", + "target": "Target", + "readOnly": "Read Only", + "userMountable": "User Mountable" + }, + "modal": { + "delete": { + "title": "Confirm Mount Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Mount Eggs", + "toast": { + "added": "Mount Egg added.", + "removed": "Mount Egg deleted." + }, + "modal": { + "add": { + "title": "Add Mount Egg", + "form": { + "egg": "Egg" + } + }, + "remove": { + "title": "Confirm Mount Egg Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Mount Nodes", + "toast": { + "added": "Mount Node added.", + "removed": "Mount Node deleted." + }, + "modal": { + "add": { + "title": "Add Mount Node" + }, + "remove": { + "title": "Confirm Mount Node Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Mount Servers" + } + } + } + }, + "roles": { + "title": "Roles", + "resourceName": "Role", + "table": { + "columns": { + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Role", + "titleUpdate": "Update Role", + "alert": { + "impersonate": "This role has the `users.impersonate` permission, which allows users with this role to impersonate any other user, including administrators. Be cautious when assigning this permission to roles with less trusted users." + }, + "form": { + "requireTwoFactor": "Require Two Factor", + "requireTwoFactorDescription": "Require users with this role to use two factor authentication.", + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + }, + "modal": { + "delete": { + "title": "Confirm Role Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "users": { + "title": "Users", + "page": { + "title": "Role Users" + } + } + } + }, + "activity": { + "title": "Activity" + } + }, + "server": { + "viewAdmin": { + "title": "Ver como administrador" + }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, + "console": { + "title": "Consola", + "input": { + "placeholder": "Escribe un comando...", + "ariaLabel": "Entrada de comandos de la consola." + }, + "toast": { + "installCancelled": "Instalación del servidor cancelada.", + "transferCancelled": "Server transfer cancelled." + }, + "modal": { + "sshDetails": { + "title": "Detalles SSH", + "form": { + "command": "Comando SSH" + }, + "launch": "Abrir" + } + }, + "notification": { + "suspended": "Tu servidor está suspendido actualmente. No se pueden realizar acciones hasta que se levante la suspensión.", + "suspendedAdmin": "Este servidor está suspendido actualmente. Como eres administrador, aún puedes acceder al servidor, pero las acciones están limitadas.", + "nodeMaintenance": "Tu servidor está en un nodo que actualmente está en mantenimiento.", + "transferring": "Tu servidor se está transfiriendo actualmente a otro nodo.", + "restoringBackup": "Tu servidor se está restaurando desde una copia de seguridad. Espera...", + "installing": "Tu servidor se está instalando actualmente. Espera...", + "pendingRestart": "Your Server has pending changes that require a restart. Please restart your server to apply these changes." + }, + "message": { + "serverMarkedAs": "Servidor marcado como {state}...", + "installFailed": "La instalación ha fallado.", + "installCompleted": "La instalación se completó correctamente.", + "transferFailed": "La transferencia ha fallado.", + "transferCompleted": "La transferencia se completó correctamente. Reconectando al servidor...", + "pullingImage": "Tu servidor está descargando su imagen de Docker. Espera...", + "pulling": "Descargando", + "extracting": "Extrayendo" + }, + "tooltip": { + "search": "Buscar", + "sshDetails": "Detalles SSH", + "commandHistory": "Historial de comandos", + "decreaseFontSize": "Disminuir tamaño de fuente", + "increaseFontSize": "Aumentar tamaño de fuente" + }, + "drawer": { + "commandHistory": { + "title": "Historial de comandos", + "detailTitle": "Detalles del comando", + "noCommands": "No se encontraron comandos.", + "copyButton": "Copiar comando", + "sendButton": "Enviar comando", + "commandSent": "Comando enviado correctamente." } }, "feature": { @@ -1124,6 +4009,17 @@ "button": { "accept": "Aceptar EULA" } + }, + "javaVersion": { + "title": "Unsupported Java Version", + "content": "This server is currently running an unsupported version of Java and cannot be started.", + "contentDetails": "Please select a supported Docker image from the list below to continue starting the server.", + "toast": { + "updated": "Docker image updated successfully." + }, + "button": { + "update": "Update Docker Image" + } } }, "details": { @@ -1158,15 +4054,25 @@ "files": { "title": "Archivos", "titleEditorViewing": "Viendo {file}", + "titleEditorPlaying": "Playing {file}", "titleEditorEditing": "Editando {file}", "titleEditorNew": "Nuevo archivo", + "titleDiffRevisionVsCurrent": "{file} - Revision #{revision} vs Current", + "titleDiffRevisionVsRevision": "{file} - Revision #{previousRevision} vs #{revision}", "table": { "columns": { "modified": "Modificado" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "Nuevo", + "connect": "Connect", + "connectSftp": "via SFTP", + "connectVscode": "via VS Code", "openInNewWindow": "Abrir en una nueva ventana", "rename": "Renombrar", "copy": "Copiar", @@ -1204,7 +4110,9 @@ "copying": "Copiando {path} a {destination}", "copyingMany": "Copiando {files}", "receivingRemote": "Recibiendo {files} desde el servidor remoto", - "sendingRemote": "Enviando {files} al servidor remoto" + "sendingRemote": "Enviando {files} al servidor remoto", + "exportingBackup": "Exporting backup to {destination}", + "cancelAllOperations": "Cancel all operations" }, "dropzone": { "title": "Suelta archivos aquí para subirlos", @@ -1215,13 +4123,18 @@ "preferPhysicalSize": "Mostrar tamaño físico en lugar del tamaño lógico", "editorMinimap": "Mostrar minimapa del archivo", "editorLineOverflow": "Ajustar el desbordamiento de línea", + "editorFontSize": "Editor Font Size", + "vscodeUriScheme": "VS Code URI Scheme", "imageViewerSmoothing": "Suavizar imagen (antialiasing)" }, "toast": { "operationCancelled": "Operación cancelada", + "allOperationsCancelled": "All operations have been cancelled.", "copyingStarted": "Se empezó a copiar {files}.", "filesCouldNotBeMoved": "No se pudieron mover los archivos.", "filesMoved": "{files} movidos.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "Descarga iniciada.", "filesDeleted": "Los archivos se han eliminado.", "archiveCreationStarted": "Se ha iniciado la creación del archivo.", @@ -1230,14 +4143,58 @@ "filePullingStarted": "Se ha iniciado la descarga del archivo.", "fileRenamed": "El archivo se ha renombrado.", "fileCouldNotBeRenamed": "No se pudo renombrar el archivo.", + "filesRenamed": "{files} renamed.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "Los permisos se han actualizado.", - "fileSaved": "El archivo se ha guardado." + "permissionsUpdatedMany": "Permissions have been updated for {files}.", + "permissionsCouldNotBeUpdated": "Permissions could not be updated.", + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "El archivo se ha guardado.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." + }, + "tooltip": { + "fileHistory": "File History", + "collabEditing": "{user} is editing this file", + "largestDirectories": "Analyze directory sizes", + "dragToMove": "Drag to move", + "back": "Back {seconds} seconds", + "forward": "Forward {seconds} seconds", + "play": "Play", + "pause": "Pause", + "mute": "Mute", + "unmute": "Unmute" + }, + "drawer": { + "revisions": { + "title": "File History", + "noRevisions": "No revisions found for this file.", + "restored": "Revision restored into editor.", + "badge": { + "fullSnapshot": "Full Snapshot" + }, + "tooltip": { + "restore": "Restore this revision into the editor", + "viewDiff": "View diff against current file", + "compareToPrevious": "Compare to previous revision" + }, + "diff": { + "original": "Revision", + "current": "Current" + } + } }, "modal": { "unsavedChanges": { "title": "Cambios sin guardar", "content": "Tienes cambios sin guardar en el editor de archivos. ¿Seguro que quieres salir de esta página? Si sales, se perderán tus cambios." }, + "draftRestore": { + "title": "Restore Draft", + "content": "A draft of this file was found in your browser. Would you like to restore it?", + "contentHashMismatch": "The file has been modified on the server since this draft was saved. Restoring the draft may overwrite those changes." + }, "createArchive": { "title": "Crear archivo", "form": { @@ -1290,6 +4247,9 @@ }, "filePermissions": { "title": "Permisos del archivo", + "form": { + "recursive": "Apply changes recursively to all files and subdirectories within this directory" + }, "symbolic": "Simbólico:", "octal": "Octal:", "owner": "Propietario", @@ -1303,6 +4263,66 @@ "renameFile": { "title": "Renombrar archivo" }, + "massRename": { + "title": "Rename Files", + "find": "Find", + "findPlaceholder": "Text to find", + "replace": "Replace with", + "replacePlaceholder": "Replacement text", + "scope": "Apply to", + "scopeName": "Name", + "scopeExtension": "Extension", + "scopeFull": "Full name", + "section": { + "matchOptions": "Match options", + "affixes": "Prefix & suffix", + "caseConversion": "Case conversion", + "numbering": "Numbering" + }, + "affix": { + "prefix": "Prefix", + "suffix": "Suffix", + "help": "Both may include {token} for the number; a suffix appends a count to every name." + }, + "option": { + "regex": "Use regular expression", + "regexDescription": "Treat the find text as a regex; reference groups with $1, $2 in the replacement.", + "caseSensitive": "Case sensitive", + "allOccurrences": "Replace all occurrences" + }, + "case": { + "label": "Convert case", + "none": "No change", + "lower": "lowercase", + "upper": "UPPERCASE", + "title": "Title Case", + "capitalize": "Capitalize" + }, + "numbering": { + "enable": "Enable numbering", + "help": "Insert {token} in the find, replace, prefix, or suffix text where the number should appear.", + "start": "Start at", + "step": "Step", + "padding": "Minimum digits" + }, + "preview": { + "title": "Preview", + "original": "Original", + "newName": "New name", + "unchanged": "Unchanged", + "conflict": "Name already in use", + "duplicate": "Duplicate target", + "invalid": "Invalid name", + "invalidRegex": "Invalid regular expression", + "empty": "No files selected." + }, + "summary": "{changed} of {total} will be renamed", + "conflictWarning": "Resolve the highlighted name conflicts before renaming." + }, + "largestDirectories": { + "title": "Largest Directories", + "empty": "No directories found." + }, "searchFiles": { "title": "Buscar archivos", "placeholder": "Buscar archivos...", @@ -1338,6 +4358,10 @@ "databases": { "title": "Bases de datos", "subtitle": "{current} de {max} bases de datos máximas creadas.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Este servidor está limitado a {max} bases de datos." }, @@ -1352,6 +4376,165 @@ "form": { "databaseName": "Nombre de la base de datos" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Crear base de datos", @@ -1359,7 +4542,8 @@ "created": "Base de datos creada." }, "form": { - "noHostsFound": "No se encontraron hosts" + "noHostsFound": "No se encontraron hosts", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -1411,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "Añadir disparador", "addCondition": "Añadir condición", "addStep": "Añadir paso", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "Crear primer paso", "addOutput": "Añadir salida", "addFile": "Añadir archivo", @@ -1423,6 +4612,7 @@ "imported": "Tarea programada importada.", "created": "Tarea programada creada.", "updated": "Tarea programada actualizada.", + "duplicated": "Schedule duplicated.", "deleted": "Tarea programada eliminada.", "triggered": "Tarea programada ejecutada.", "exported": "Tarea programada exportada.", @@ -1430,6 +4620,7 @@ "step": { "created": "Paso de la tarea programada creado.", "updated": "Paso de la tarea programada actualizado.", + "duplicated": "Schedule step duplicated.", "deleted": "Paso de la tarea programada eliminado." } }, @@ -1439,12 +4630,21 @@ "and": "Y (todas deben ser verdaderas)", "or": "O (cualquiera puede ser verdadera)", "not": "NO (no debe ser verdadera)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "La variable existe", "variableContains": "La variable contiene", "variableEquals": "La variable es igual", "variableStartsWith": "La variable empieza por", "variableEndsWith": "La variable termina en" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "Menor que", "smallerThanOrEqual": "Menor o igual que", @@ -1460,6 +4660,9 @@ "updateSchedule": { "title": "Actualizar tarea programada" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "Confirmar eliminación de la tarea programada", "content": "¿Seguro que quieres eliminar {name} de este servidor?" @@ -1473,12 +4676,19 @@ "deleteStep": { "title": "Confirmar eliminación del paso de tarea programada", "content": "¿Seguro que quieres eliminar este paso de la tarea programada?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "En ejecución" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "Acciones", "conditions": "Condiciones", @@ -1514,6 +4724,7 @@ "contains": "Contiene", "startsWith": "Empieza por", "endsWith": "Termina en", + "metric": "Metric", "allMustBeTrue": "Todas las condiciones deben ser verdaderas:", "anyMustBeTrue": "Cualquier condición puede ser verdadera:", "mustNotBeTrue": "La condición no debe ser verdadera:" @@ -1527,11 +4738,27 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "Programación cron" + "cronSchedule": "Programación cron", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" + }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "En el intervalo cron {schedule}. Próxima ejecución: {timestamp} - Última ejecución: {lastTimestamp}." - } + }, + "invalidCron": "Invalid cron expression" }, "powerAction": { "title": "Acción de energía", @@ -1554,6 +4781,25 @@ "content": "Cuando la copia de seguridad alcanza el estado `{status}`." } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "Línea de consola", "card": { @@ -1578,8 +4824,20 @@ "title": "No hay pasos configurados", "description": "Esta tarea programada aún no tiene pasos. Añade algunas acciones para empezar." }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "Espera", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "Duración (milisegundos)" }, @@ -1589,12 +4847,62 @@ }, "ensure": { "title": "Asegurar", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "Asegurar que una condición coincide" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "Formatear", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "Cadena de formato", "formatStringDescription": "La cadena de formato. Se pueden incluir variables envolviéndolas dentro de {wrapper}." @@ -1605,6 +4913,7 @@ }, "matchRegex": { "title": "Coincidir regex", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "Entrada", "regex": "Regex", @@ -1617,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "Esperar línea de consola", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "Tiempo de espera (milisegundos)" }, @@ -1631,6 +4941,7 @@ }, "sendCommand": { "title": "Enviar comando", + "description": "Send a command to the server console.", "renderer": { "compact": "Ejecutar {command}", "detail": { @@ -1640,6 +4951,7 @@ }, "sendPower": { "title": "Enviar señal de energía", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "Hacer {action}", "detail": { @@ -1649,19 +4961,75 @@ }, "createBackup": { "title": "Crear copia de seguridad", + "description": "Create a backup of the server files.", "form": { "backupName": "Nombre de la copia de seguridad" }, "renderer": { "compact": "Crear {name}", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "Nombre de la copia de seguridad: {name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "Archivos ignorados: {files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "Crear directorio", + "description": "Create a new folder in the server files.", "renderer": { "compact": "Crear {name} en {root}", "detail": { @@ -1672,6 +5040,7 @@ }, "writeFile": { "title": "Escribir archivo", + "description": "Write or append text to a file.", "form": { "content": "Contenido", "appendToFile": "Añadir al archivo" @@ -1686,6 +5055,7 @@ }, "copyFile": { "title": "Copiar archivo", + "description": "Copy a file to a new location.", "form": { "sourceFile": "Archivo origen" }, @@ -1699,6 +5069,7 @@ }, "deleteFiles": { "title": "Eliminar archivos", + "description": "Delete files or folders.", "form": { "filesToDelete": "Archivos a eliminar" }, @@ -1712,6 +5083,7 @@ }, "renameFiles": { "title": "Renombrar archivos", + "description": "Rename or move files.", "form": { "files": "Archivos", "from": "de", @@ -1727,6 +5099,7 @@ }, "compressFiles": { "title": "Comprimir archivos", + "description": "Compress files into an archive.", "form": { "filesToCompress": "Archivos a comprimir" }, @@ -1742,6 +5115,7 @@ }, "decompressFile": { "title": "Descomprimir archivo", + "description": "Extract an archive into a folder.", "form": { "file": "Archivo" }, @@ -1755,6 +5129,7 @@ }, "updateStartupVariable": { "title": "Actualizar variable de arranque", + "description": "Change the value of a startup variable.", "renderer": { "compact": "Establecer {variable} en {value}", "detail": { @@ -1765,6 +5140,7 @@ }, "updateStartupCommand": { "title": "Actualizar comando de arranque", + "description": "Change the command used to start the server.", "renderer": { "compact": "Establecer en {command}", "detail": { @@ -1774,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "Actualizar imagen de Docker", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "Establecer en {image}", "detail": { @@ -1785,6 +5162,10 @@ }, "subusers": { "title": "Subusuarios", + "subtitle": "{current} of {max} maximum subusers created.", + "tooltip": { + "limitReached": "This server is limited to {max} subusers." + }, "table": { "columns": { "twoFactorEnabled": "2FA activado", @@ -1800,7 +5181,8 @@ }, "form": { "emailPlaceholder": "Introduce el correo con el que se guardará este subusuario.", - "permissions": "Permisos" + "permissions": "Permisos", + "ignoredFilesDescription": "Files and directories matching these patterns will be hidden from this subuser. Uses gitignore-style glob patterns (e.g. `*.env`, `secrets/`). Prefix a pattern with `!` to un-hide a path that a broader pattern would otherwise exclude." } }, "updateSubuser": { @@ -1831,16 +5213,25 @@ "locked": "¿Bloqueada?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Explorar" + "browse": "Explorar", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "Descarga iniciada.", - "restoringBackup": "Restaurando copia de seguridad..." + "restoringBackup": "Restaurando copia de seguridad...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Crear copia de seguridad", + "noGroup": "No group", "toast": { "created": "Copia de seguridad creada." } @@ -1854,13 +5245,61 @@ "restoreBackup": { "title": "Restaurar copia de seguridad" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Confirmar eliminación de la copia de seguridad", "content": "¿Seguro que quieres eliminar **{name}** de este servidor?", "toast": { + "started": "Backup deletion started.", "deleted": "Copia de seguridad eliminada." } + }, + "viewMetadata": { + "title": "Backup Metadata" + } + } + }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." } }, "network": { @@ -1908,7 +5347,8 @@ "content": "Tienes cambios sin guardar en tus variables de arranque. ¿Seguro que quieres salir de esta página? Si sales, se perderán tus cambios." } }, - "noVariables": "No se encontraron variables de arranque para este servidor." + "noVariables": "No se encontraron variables de arranque para este servidor.", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "Montajes", @@ -1994,7 +5434,10 @@ } }, "activity": { - "title": "Actividad" + "title": "Actividad", + "button": { + "clearUserFilter": "Clear User Filter" + } } } } diff --git a/frontend/public/translations/fr.json b/frontend/public/translations/fr.json index d8a7d868e..00bcd011e 100644 --- a/frontend/public/translations/fr.json +++ b/frontend/public/translations/fr.json @@ -56,6 +56,14 @@ "many": "{count} Nœuds", "other": "{count} Nœuds" }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, "allocation": { "zero": "{count} Allocations de nœud", "one": "{count} Allocation de nœud", @@ -72,6 +80,14 @@ "many": "{count} Eggs", "other": "{count} Eggs" }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, "shortcut": { "zero": "{count} Raccourcis", "one": "{count} Raccourci", @@ -87,6 +103,22 @@ "few": "{count} Lignes", "many": "{count} Lignes", "other": "{count} Lignes" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -97,6 +129,7 @@ "save": "Sauvegarder", "saveAndStay": "Sauvegarder & Rester", "edit": "Modifier", + "duplicate": "Duplicate", "delete": "Supprimer", "remove": "Retirer", "enable": "Activer", @@ -133,7 +166,8 @@ "setPrimary": "Définir comme primaire", "unsetPrimary": "Retirer le statut primaire", "leavePage": "Quitter la page", - "viewDocumentation": "Voir la documentation" + "viewDocumentation": "Voir la documentation", + "undo": "Undo" }, "alert": { "error": "Erreur", @@ -147,6 +181,31 @@ "input": { "search": "Chercher..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "Réinitialiser à la valeur par défaut", "edit": "Modifier", @@ -156,7 +215,9 @@ "backupOnDifferentNode": "Cette sauvegarde se trouve sur un nœud différent de celui du serveur. Elle n'est pas consultable depuis l'API client." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Nom", + "newName": "New Name", "description": "Description", "author": "Auteur", "type": "Type", @@ -186,6 +247,7 @@ "language": "Langue", "identifier": "Identifiant", "enabled": "Activé", + "disabled": "Disabled", "title": "Titre", "content": "Contenu", "backupConfiguration": "Configuration de sauvegarde", @@ -212,11 +274,13 @@ "nest": "Nest", "lines": "Lignes", "databaseHost": "Hôte de base de données", + "databaseAgentHost": "Database Agent Host", "timezone": "Fuseau horaire", "timezoneSystem": "Système", "protocol": "Protocole", "powerAction": "Action d'alimentation", "destination": "Destination", + "destinationDirectory": "Destination Directory", "directoryName": "Nom du répertoire", "locked": "Verrouillé", "portRanges": "Plages de ports", @@ -231,6 +295,7 @@ "value": "Valeur", "eggs": "Eggs", "ignoredFiles": "Fichiers ignorés", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "Votre mot de passe de panel de contrôle", "deploymentEnabled": "Déploiement activé", "maintenanceEnabled": "Maintenance activée", @@ -273,7 +338,10 @@ "files": "Fichiers", "server": "Serveur", "address": "Adresse", - "eggs": "Eggs" + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, "tabs": { @@ -288,6 +356,12 @@ "failed": "Échoué", "installed": "Installé" }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" + }, "server": { "noAllocation": "Pas d'allocation", "state": { @@ -426,7 +500,8 @@ "container": { "alert": { "impersonating": "Vous usurpez un utilisateur. Vos actions peuvent affecter le compte de la personne usurpée. Pour quitter le mode usurpation, cliquez sur le bouton \"Arrêter l'usurpation\" dans le coin bas gauche." - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -434,7 +509,11 @@ "stopImpersonating": "Arrêter l'usurpation", "openInVirtualWindow": "Ouvrir dans une fenêtre virtuelle", "openInPopup": "Ouvrir dans une fenêtre contextuelle", - "openInNewTab": "Ouvrir dans un nouvel onglet" + "openInNewTab": "Ouvrir dans un nouvel onglet", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { @@ -448,6 +527,9 @@ "selectInput": { "noResults": "Aucun résultat trouvé." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "Vous n'avez pas la permission d'enregistrer.", @@ -461,6 +543,9 @@ "deleted": "{resource} supprimé." } }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -504,7 +589,10 @@ "scheduleDynamicInput": { "none": "Aucun", "variable": "Variable", - "enterVariable": "Veuillez entrer le nom de la variable à évaluer." + "enterVariable": "Veuillez entrer le nom de la variable à évaluer.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -523,6 +611,7 @@ "toast": { "backupCompleted": "Sauvegarde terminée avec succès.", "backupFailed": "Échec de la sauvegarde.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "Restauration de la sauvegarde terminée avec succès.", "installCompleted": "Installation du serveur terminée avec succès.", "installFailed": "Échec de l'installation du serveur.", @@ -559,6 +648,8 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "En attente : {file}", "uploading": "Téléversement : {file}", "uploadingFolder": "Téléversement du dossier : {folder} ({files} fichiers)", @@ -568,7 +659,10 @@ "uploading": "Téléversement de {files} démarré...", "cancelledFile": "Téléversement de `{file}` annulé avec succès.", "cancelledFolder": "Téléversement de `{folder}` ({files}) annulé avec succès.", - "cancelledAll": "Tous les téléversements ont été annulés." + "cancelledAll": "Tous les téléversements ont été annulés.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -1210,6 +1304,12 @@ "toast": { "removed": "Extrait de commande supprimé." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1276,6 +1376,12 @@ "toast": { "removed": "Clé API supprimée." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1384,7 +1490,8 @@ "panelVersion": "Version du panel", "versionHistory": "Historique des versions", "outdatedExtensions": "Extensions obsolètes", - "outdatedNodes": "Nœuds obsolètes" + "outdatedNodes": "Nœuds obsolètes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" }, "panelVersion": "Votre panel utilise actuellement la version `{current}`. La dernière version disponible est `{latest}`.", "unknown": "inconnu", @@ -1402,6 +1509,8 @@ "noChangelog": "Aucun journal des modifications", "nodesUpToDate": "Il semble que tous les nœuds soient à jour. ({failed} échec(s) de vérification)", "nodesOutdated": "Certains nœuds sont obsolètes, la dernière version disponible est `{latest}`. ({outdated} obsolète(s), {failed} échec(s) de vérification)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", "table": { "version": "Version", "installed": "Installée", @@ -1650,6 +1759,9 @@ "maxFileManagerContentSearchSize": "Taille max. de recherche de contenu du gestionnaire de fichiers", "maxFileManagerSearchResults": "Résultats de recherche max. du gestionnaire de fichiers", "maxSubuserCount": "Nombre max. de sous-utilisateurs", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", "allowOverwritingCustomDockerImage": "Autoriser l'écrasement de l'image Docker personnalisée", "allowOverwritingCustomDockerImageDescription": "Si activé, les utilisateurs pourront écraser l'image Docker spécifiée dans la configuration du serveur via la liste des Eggs, même si un administrateur a défini une image Docker personnalisée.", "allowViewingInstallationLogs": "Autoriser la consultation des journaux d'installation", @@ -1735,6 +1847,9 @@ "delete": { "title": "Confirmer la suppression de l'annonce", "content": "Êtes-vous sûr de vouloir supprimer **{title}** ?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" } }, "form": { @@ -1870,6 +1985,25 @@ "users": { "title": "Utilisateurs", "resourceName": "Utilisateur", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, "tooltip": { "admin": "Admin", "twoFactorEnabled": "2FA activé", @@ -1999,6 +2133,25 @@ } } }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, "nodes": { "title": "Nœuds", "page": { @@ -2011,6 +2164,37 @@ "title": "Nœuds", "resourceName": "Nœud", "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, "general": { "page": { "tooltip": { @@ -2024,7 +2208,10 @@ "form": { "urlDescription": "Utilisé pour la communication interne avec le nœud.", "publicUrlDescription": "Utilisé pour les connexions websocket et les téléchargements.", - "backupConfigurationPlaceholder": "Hériter de l'emplacement" + "backupConfigurationPlaceholder": "Hériter de l'emplacement", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." }, "button": { "resetToken": "Réinitialiser le token", @@ -2226,9 +2413,13 @@ "detached": "Sauvegarde détachée avec succès.", "reattached": "Sauvegarde rattachée à {name} avec succès.", "restoring": "Restauration de la sauvegarde vers {name}...", + "exporting": "Exporting backup to files of {name}...", "deleted": "Sauvegarde du nœud supprimée." }, "modal": { + "export": { + "title": "Export Node Backup to Files" + }, "detach": { "title": "Confirmer le détachement de la sauvegarde", "content": "Êtes-vous sûr de vouloir détacher cette sauvegarde de son serveur ? Elle ne sera pas supprimée et pourra être rattachée plus tard." @@ -2244,7 +2435,11 @@ } }, "delete": { - "title": "Confirmer la suppression de la sauvegarde du nœud" + "title": "Confirmer la suppression de la sauvegarde du nœud", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2273,6 +2468,7 @@ "none": "Aucun (supprime toutes les allocations, le serveur ne se verra pas attribuer automatiquement de nouvelles allocations sur le nœud de destination)", "randomPrimary": "Aléatoiriser l'allocation primaire (supprime les allocations supplémentaires)", "randomAll": "Aléatoiriser toutes les allocations (recommandé pour éviter les problèmes d'incompatibilité avec le nœud de destination)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", "eggConfigDeployment": "Attribuer les allocations selon la configuration de déploiement de l'Egg (fonctionne uniquement si l'Egg a une configuration de déploiement et que le nœud de destination a des allocations compatibles)", "eggConfigSelfAssignRange": "Auto-attribuer de nouvelles allocations selon la plage de ports de l'Egg (fonctionne uniquement si l'Egg a une plage de ports et que le nœud de destination a des allocations compatibles)" } @@ -2321,7 +2517,78 @@ "servers": { "title": "Serveurs", "resourceName": "Serveur", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, "general": { "page": { "titleCreate": "Créer un serveur", @@ -2351,23 +2618,30 @@ "backupConfigurationPlaceholder": "Hériter du nœud/de l'emplacement", "cpuLimit": "Limite CPU (%)", "cpuLimitDescription": "La limite CPU en % que le serveur peut utiliser.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", "swap": "Swap", "swapDescription": "La quantité de swap à donner à ce serveur.", + "swapTooltip": "-1 will not set a limit.", "memoryDescription": "La limite de mémoire du conteneur du serveur.", + "memoryTooltip": "0 will not set a limit.", "memoryOverhead": "Surcharge mémoire", "memoryOverheadDescription": "Mémoire cachée qui sera ajoutée au conteneur.", "diskSpace": "Espace disque", "diskSpaceDescription": "La limite de disque du serveur.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", "ioWeight": "Poids d'E/S", "ioWeightDescription": "Le poids d'E/S relatif du conteneur du serveur par rapport aux autres conteneurs.", + "ioWeightTooltip": "0-1000. May not work on all systems.", "pinnedCpus": "CPU épinglés", "pinnedCpusDescription": "Les cœurs CPU auxquels ce serveur est épinglé.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", "dockerImagePlaceholder": "ghcr.io/...", "predefinedDockerImages": "Images Docker prédéfinies", "predefinedDockerImagesPlaceholder": "Aucune image prédéfinie sélectionnée", "timezonePlaceholder": "Europe/Amsterdam", "startupCommandPlaceholder": "npm start", "startupCommandCustom": "Personnalisé", + "predefinedStartupCommands": "Predefined Startup Commands", "startOnCompletion": "Démarrer à la fin", "startOnCompletionDescription": "Démarrer le serveur une fois l'installation terminée.", "skipInstaller": "Ignorer l'installateur", @@ -2378,6 +2652,7 @@ "kvmPassthroughEnabledDescription": "Activer le passthrough KVM pour le serveur (permet l'accès à /dev/kvm à l'intérieur du conteneur).", "allocationsLimit": "Allocations", "databasesLimit": "Bases de données", + "databaseAgentsLimit": "Agent Databases", "backupsLimit": "Sauvegardes", "schedulesLimit": "Planifications" }, @@ -2465,6 +2740,17 @@ } } }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, "logs": { "title": "Journaux", "page": { @@ -2556,6 +2842,9 @@ "deleteBackups": "Voulez-vous supprimer les sauvegardes de ce serveur ?", "confirmServerName": "Confirmer le nom du serveur", "confirmServerNamePlaceholder": "Nom du serveur" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." } } } @@ -2714,13 +3003,17 @@ "toast": { "created": "Variable de l'Egg créée.", "updated": "Variable de l'Egg mise à jour.", - "deleted": "Variable de l'Egg supprimée." + "deleted": "Variable de l'Egg supprimée.", + "duplicated": "Egg variable duplicated." }, "modal": { "delete": { "title": "Confirmer le retrait de la variable de l'Egg", "content": "Êtes-vous sûr de vouloir retirer **{variable}** ?", "emptyVariable": "cette variable vide" + }, + "duplicate": { + "title": "Duplicate Egg Variable" } } } @@ -2771,7 +3064,8 @@ "form": { "order": "Ordre", "eggs": "Eggs", - "eggsPlaceholder": "Sélectionner des Eggs" + "eggsPlaceholder": "Sélectionner des Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." }, "enum": { "deploymentType": { @@ -2928,7 +3222,11 @@ "modal": { "delete": { "title": "Confirmer la suppression de l'hôte de base de données", - "content": "Êtes-vous sûr de vouloir supprimer **{name}** ?" + "content": "Êtes-vous sûr de vouloir supprimer **{name}** ?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2936,7 +3234,278 @@ "databases": { "title": "Bases de données", "page": { - "title": "Bases de données de l'hôte" + "title": "Bases de données de l'hôte", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } } } } @@ -3014,10 +3583,27 @@ "title": "Mappages", "page": { "title": "Mappages du fournisseur OAuth", + "table": { + "columns": { + "matcher": "Matcher" + } + }, "enum": { "mappingType": { "role": "Rôle", "serverSubuser": "Sous-utilisateur de serveur" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" } }, "toast": { @@ -3025,8 +3611,28 @@ "updated": "Mappage du fournisseur OAuth mis à jour.", "deleted": "Mappage du fournisseur OAuth supprimé." }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", "scopesDescription": "Scopes OAuth requis pour que ce mappage s'applique.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", "mappingType": "Type de mappage", "role": "Rôle", "permissions": "Permissions" @@ -3047,6 +3653,25 @@ }, "users": { "title": "Utilisateurs", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, "page": { "title": "Utilisateurs du fournisseur OAuth", "table": { @@ -3313,6 +3938,11 @@ "viewAdmin": { "title": "Voir dans l'espace admin" }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, "console": { "title": "Console", "input": { @@ -3434,6 +4064,10 @@ "modified": "Modifié" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "Nouveau", "connect": "Connecter", @@ -3477,6 +4111,7 @@ "copyingMany": "Copie de {files}", "receivingRemote": "Réception de {files} depuis serveur distant", "sendingRemote": "Envoi de {files} vers serveur distant", + "exportingBackup": "Exporting backup to {destination}", "cancelAllOperations": "Annuler toutes les opérations" }, "dropzone": { @@ -3488,6 +4123,7 @@ "preferPhysicalSize": "Afficher la taille physique au lieu de la taille logique", "editorMinimap": "Afficher la minicarte de fichier", "editorLineOverflow": "Saut de ligne en débordement", + "editorFontSize": "Editor Font Size", "vscodeUriScheme": "Schéma d'URI VS Code", "imageViewerSmoothing": "Adoucir l'image (anti-aliasing)" }, @@ -3497,6 +4133,8 @@ "copyingStarted": "Copie de {files} commencée.", "filesCouldNotBeMoved": "Les fichiers n'ont pas pu être déplacés.", "filesMoved": "{files} déplacés.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "Téléchargement démarré.", "filesDeleted": "Les fichiers ont été supprimés.", "archiveCreationStarted": "La création de l'archive a commencé.", @@ -3506,13 +4144,19 @@ "fileRenamed": "Le fichier a été renommé.", "fileCouldNotBeRenamed": "Le fichier n'a pas pu être renommé.", "filesRenamed": "{files} renommés.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "Les permissions ont été mises à jour.", "permissionsUpdatedMany": "Les permissions ont été mises à jour pour {files}.", "permissionsCouldNotBeUpdated": "Les permissions n'ont pas pu être mises à jour.", - "fileSaved": "Le fichier a été sauvegardé." + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "Le fichier a été sauvegardé.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." }, "tooltip": { "fileHistory": "Historique du fichier", + "collabEditing": "{user} is editing this file", "largestDirectories": "Analyser la taille des répertoires", "dragToMove": "Glisser pour déplacer", "back": "Reculer de {seconds} secondes", @@ -3714,6 +4358,10 @@ "databases": { "title": "Bases de données", "subtitle": "{current} de {max} base de données maximum créées.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Ce serveur est limité à {max} base de données." }, @@ -3728,6 +4376,165 @@ "form": { "databaseName": "Nom de base de données" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Créer base de données", @@ -3735,7 +4542,8 @@ "created": "Base de données créée." }, "form": { - "noHostsFound": "Pas d'hôtes trouvés" + "noHostsFound": "Pas d'hôtes trouvés", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -3787,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "Ajouter un déclencheur", "addCondition": "Ajouter une condition", "addStep": "Ajouter une étape", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "Créer la première étape", "addOutput": "Ajouter une sortie", "addFile": "Ajouter un fichier", @@ -3799,6 +4612,7 @@ "imported": "Planification importée.", "created": "Planification créée.", "updated": "Planification mise à jour.", + "duplicated": "Schedule duplicated.", "deleted": "Planification supprimée.", "triggered": "Planification déclenchée.", "exported": "Planification exportée.", @@ -3806,6 +4620,7 @@ "step": { "created": "Étape de planification créée.", "updated": "Étape de planification mise à jour.", + "duplicated": "Schedule step duplicated.", "deleted": "Étape de planification supprimée." } }, @@ -3815,12 +4630,21 @@ "and": "ET (toutes doivent être vraies)", "or": "OU (au moins une doit être vraie)", "not": "NON (ne doit pas être vraie)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "La variable existe", "variableContains": "La variable contient", "variableEquals": "La variable est égale à", "variableStartsWith": "La variable commence par", "variableEndsWith": "La variable se termine par" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "Inférieur à", "smallerThanOrEqual": "Inférieur ou égal à", @@ -3836,6 +4660,9 @@ "updateSchedule": { "title": "Modifier la planification" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "Confirmer la suppression de la planification", "content": "Êtes-vous sûr de vouloir supprimer {name} de ce serveur ?" @@ -3849,12 +4676,19 @@ "deleteStep": { "title": "Confirmer la suppression de l'étape de planification", "content": "Êtes-vous sûr de vouloir supprimer cette étape de planification ?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "En cours" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "Actions", "conditions": "Conditions", @@ -3890,6 +4724,7 @@ "contains": "Contient", "startsWith": "Commence par", "endsWith": "Se termine par", + "metric": "Metric", "allMustBeTrue": "Toutes les conditions doivent être vraies :", "anyMustBeTrue": "Au moins une condition doit être vraie :", "mustNotBeTrue": "La condition ne doit pas être vraie :" @@ -3903,8 +4738,23 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "Planification Cron" + "cronSchedule": "Planification Cron", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" + }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "À l'intervalle Cron {schedule}, la prochaine exécution est {timestamp} - la dernière était {lastTimestamp}." }, @@ -3931,6 +4781,25 @@ "content": "Lorsque la sauvegarde atteint le statut `{status}`." } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "Ligne de console", "card": { @@ -3955,8 +4824,20 @@ "title": "Aucune étape configurée", "description": "Cette planification n'a pas encore d'étapes. Ajoutez des actions pour commencer." }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "Attendre", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "Durée (millisecondes)" }, @@ -3966,12 +4847,62 @@ }, "ensure": { "title": "Garantir", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "Garantir qu'une condition correspond" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "Formater", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "Chaîne de format", "formatStringDescription": "La chaîne de format. Les variables peuvent être incluses en les entourant de {wrapper}." @@ -3982,6 +4913,7 @@ }, "matchRegex": { "title": "Correspondance regex", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "Entrée", "regex": "Regex", @@ -3994,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "Attendre une ligne de console", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "Délai (millisecondes)" }, @@ -4008,6 +4941,7 @@ }, "sendCommand": { "title": "Envoyer une commande", + "description": "Send a command to the server console.", "renderer": { "compact": "Exécuter {command}", "detail": { @@ -4017,6 +4951,7 @@ }, "sendPower": { "title": "Envoyer un signal d'alimentation", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "Faire {action}", "detail": { @@ -4026,19 +4961,75 @@ }, "createBackup": { "title": "Créer une sauvegarde", + "description": "Create a backup of the server files.", "form": { "backupName": "Nom de la sauvegarde" }, "renderer": { "compact": "Créer {name}", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "Nom de la sauvegarde : {name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "Fichiers ignorés : {files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "Créer un répertoire", + "description": "Create a new folder in the server files.", "renderer": { "compact": "Créer {name} dans {root}", "detail": { @@ -4049,6 +5040,7 @@ }, "writeFile": { "title": "Écrire un fichier", + "description": "Write or append text to a file.", "form": { "content": "Contenu", "appendToFile": "Ajouter au fichier" @@ -4063,6 +5055,7 @@ }, "copyFile": { "title": "Copier un fichier", + "description": "Copy a file to a new location.", "form": { "sourceFile": "Fichier source" }, @@ -4076,6 +5069,7 @@ }, "deleteFiles": { "title": "Supprimer des fichiers", + "description": "Delete files or folders.", "form": { "filesToDelete": "Fichiers à supprimer" }, @@ -4089,6 +5083,7 @@ }, "renameFiles": { "title": "Renommer des fichiers", + "description": "Rename or move files.", "form": { "files": "Fichiers", "from": "de", @@ -4104,6 +5099,7 @@ }, "compressFiles": { "title": "Compresser des fichiers", + "description": "Compress files into an archive.", "form": { "filesToCompress": "Fichiers à compresser" }, @@ -4119,6 +5115,7 @@ }, "decompressFile": { "title": "Décompresser un fichier", + "description": "Extract an archive into a folder.", "form": { "file": "Fichier" }, @@ -4132,6 +5129,7 @@ }, "updateStartupVariable": { "title": "Mettre à jour une variable de démarrage", + "description": "Change the value of a startup variable.", "renderer": { "compact": "Définir {variable} sur {value}", "detail": { @@ -4142,6 +5140,7 @@ }, "updateStartupCommand": { "title": "Mettre à jour la commande de démarrage", + "description": "Change the command used to start the server.", "renderer": { "compact": "Définir sur {command}", "detail": { @@ -4151,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "Mettre à jour l'image Docker", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "Définir sur {image}", "detail": { @@ -4213,16 +5213,25 @@ "locked": "Verrouillé ?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Parcourir" + "browse": "Parcourir", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "Téléchargement commencé.", - "restoringBackup": "Restauration de la sauvegarde..." + "restoringBackup": "Restauration de la sauvegarde...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Créer sauvegarde", + "noGroup": "No group", "toast": { "created": "Sauvegarde créée." } @@ -4236,10 +5245,14 @@ "restoreBackup": { "title": "Restaurer la sauvegarde" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Confirmer la suppression de la sauvegarde", "content": "Êtes-vous sûr de vouloir supprimer **{name}** de ce serveur ?", "toast": { + "started": "Backup deletion started.", "deleted": "Sauvegarde supprimée." } }, @@ -4248,6 +5261,47 @@ } } }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." + } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." + } + }, "network": { "title": "Réseau", "subtitle": "{current} de {max} allocations maximum assignées.", @@ -4293,7 +5347,8 @@ "content": "Vous avez des changements non sauvegardés dans vos variables de démarrage. Êtes-vous sûr de vouloir quitter cette page ? Si vous quittez, vos changements seront perdus." } }, - "noVariables": "Aucune variable de démarrage trouvée pour ce serveur." + "noVariables": "Aucune variable de démarrage trouvée pour ce serveur.", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "Montages", diff --git a/frontend/public/translations/it.json b/frontend/public/translations/it.json index 859b718bb..f40978f09 100644 --- a/frontend/public/translations/it.json +++ b/frontend/public/translations/it.json @@ -1,5 +1,13 @@ { "items": { + "byte": { + "zero": "{count} Bytes", + "one": "{count} Byte", + "two": "{count} Bytes", + "few": "{count} Bytes", + "many": "{count} Bytes", + "other": "{count} Bytes" + }, "user": { "zero": "{count} Utenti", "one": "{count} Utente", @@ -8,6 +16,22 @@ "many": "{count} Utenti", "other": "{count} Utenti" }, + "file": { + "zero": "{count} Files", + "one": "{count} File", + "two": "{count} Files", + "few": "{count} Files", + "many": "{count} Files", + "other": "{count} Files" + }, + "server": { + "zero": "{count} Servers", + "one": "{count} Server", + "two": "{count} Servers", + "few": "{count} Servers", + "many": "{count} Servers", + "other": "{count} Servers" + }, "sshKey": { "zero": "{count} Chiavi SSH", "one": "{count} Chiave SSH", @@ -15,6 +39,86 @@ "few": "{count} Chiavi SSH", "many": "{count} Chiavi SSH", "other": "{count} Chiavi SSH" + }, + "asset": { + "zero": "{count} Assets", + "one": "{count} Asset", + "two": "{count} Assets", + "few": "{count} Assets", + "many": "{count} Assets", + "other": "{count} Assets" + }, + "node": { + "zero": "{count} Nodes", + "one": "{count} Node", + "two": "{count} Nodes", + "few": "{count} Nodes", + "many": "{count} Nodes", + "other": "{count} Nodes" + }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, + "allocation": { + "zero": "{count} Node Allocations", + "one": "{count} Node Allocation", + "two": "{count} Node Allocations", + "few": "{count} Node Allocations", + "many": "{count} Node Allocations", + "other": "{count} Node Allocations" + }, + "egg": { + "zero": "{count} Eggs", + "one": "{count} Egg", + "two": "{count} Eggs", + "few": "{count} Eggs", + "many": "{count} Eggs", + "other": "{count} Eggs" + }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, + "shortcut": { + "zero": "{count} Shortcuts", + "one": "{count} Shortcut", + "two": "{count} Shortcuts", + "few": "{count} Shortcuts", + "many": "{count} Shortcuts", + "other": "{count} Shortcuts" + }, + "line": { + "zero": "{count} Lines", + "one": "{count} Line", + "two": "{count} Lines", + "few": "{count} Lines", + "many": "{count} Lines", + "other": "{count} Lines" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -25,6 +129,7 @@ "save": "Salva", "saveAndStay": "Salva e Rimani", "edit": "Modifica", + "duplicate": "Duplicate", "delete": "Elimina", "remove": "Rimuovi", "enable": "Abilita", @@ -34,29 +139,119 @@ "cancel": "Annulla", "continue": "Continua", "skip": "Salta", + "okay": "Okay", + "back": "Back", + "next": "Next", + "install": "Install", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "restore": "Restore", + "discard": "Discard", + "download": "Download", + "downloadAs": "Download as {format}", + "export": "Export", + "exportAs": "Export as {format}", + "recreate": "Recreate", + "move": "Move", + "transfer": "Transfer", + "reattach": "Reattach", + "detach": "Detach", + "send": "Send", + "reset": "Reset", + "view": "View", "import": "Importa", "details": "Dettagli", + "loadLogs": "Load Logs", + "sendTestEmail": "Send Test Email", "setPrimary": "Imposta come primaria", - "unsetPrimary": "Rimuovi come primaria" + "unsetPrimary": "Rimuovi come primaria", + "leavePage": "Leave Page", + "viewDocumentation": "View Documentation", + "undo": "Undo" + }, + "alert": { + "error": "Error", + "warning": "Warning", + "success": "Success", + "clockOffset": "Your system clock is out of sync with the server by more than 5 seconds. This may cause issues with passkey authentication and two-factor authentication. Please sync your clock if issues arise. Current offset: {offset} second(s)." + }, + "divider": { + "or": "OR" }, "input": { "search": "Cerca..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { - "primary": "Primaria" + "resetToDefault": "Reset to default", + "edit": "Edit", + "delete": "Delete", + "remove": "Remove", + "primary": "Primaria", + "backupOnDifferentNode": "This backup is on a different node than the server. It is not viewable from the Client API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Nome", + "newName": "New Name", "description": "Descrizione", + "author": "Author", + "type": "Type", "password": "Password", "host": "Host", "username": "Nome utente", + "usernameOrEmail": "Username/Email", + "server": "Server", "url": "URL", "email": "Email", + "path": "Path", + "port": "Port", + "provider": "Provider", + "command": "Command", + "fromAddress": "From Address", + "fromName": "From Name", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "apiKey": "API Key", + "accessKey": "Access Key", + "bucket": "Bucket", + "region": "Region", + "endpoint": "Endpoint", + "publicUrl": "Public URL", "firstName": "Nome", "lastName": "Cognome", "language": "Lingua", + "identifier": "Identifier", "enabled": "Abilitato", + "disabled": "Disabled", + "title": "Title", + "content": "Content", + "backupConfiguration": "Backup Configuration", + "fileName": "File Name", "sftpPort": "Porta SFTP", "sftpHost": "Host SFTP", "dockerImage": "Immagine Docker", @@ -64,13 +259,47 @@ "disk": "Disco", "serverName": "Nome server", "startupCommand": "Comando di avvio", + "archiveName": "Archive Name", + "archiveFormat": "Archive Format", + "compressionLevel": "Compression Level", + "multiplexChannels": "Multiplex Channels", + "multiplexChannelsDescription": "Add additional HTTP connections (and therefore also threads) for transferring split archives, total streams is 1 + multiplex channels.", + "deleteSourceBackups": "Delete source backups", + "deleteSourceBackupsDescription": "Deletes the transferred backups on the source node once transfer finishes.", + "node": "Node", + "primaryAllocation": "Primary Allocation", + "additionalAllocations": "Additional Allocations", + "externalId": "External ID", + "mount": "Mount", + "nest": "Nest", + "lines": "Lines", "databaseHost": "Host database", + "databaseAgentHost": "Database Agent Host", "timezone": "Fuso orario", + "timezoneSystem": "System", + "protocol": "Protocol", + "powerAction": "Power Action", + "destination": "Destination", + "destinationDirectory": "Destination Directory", + "directoryName": "Directory Name", "locked": "Bloccato", + "portRanges": "Port Ranges", + "portRangesPlaceholder": "Port Ranges (eg. 3000-4000)", "currentPassword": "Password attuale", "confirmPassword": "Conferma password", "authenticationCode": "Codice di autenticazione", - "ignoredFiles": "File ignorati" + "restoreStartup": "Restore the startup command, image, and variables from this backup.", + "lineContains": "Line Contains", + "filePath": "File Path", + "envVariable": "Environment Variable", + "value": "Value", + "eggs": "Eggs", + "ignoredFiles": "File ignorati", + "previewIgnoredFiles": "Preview ignored files", + "yourControlPanelPassword": "Your Control Panel Password", + "deploymentEnabled": "Deployment Enabled", + "maintenanceEnabled": "Maintenance Enabled", + "truncateDirectory": "Do you want to delete all files of this server before performing this action? This cannot be undone." }, "table": { "pagination": { @@ -78,25 +307,70 @@ "empty": "Nessun elemento trovato, è come se si stessero nascondendo." }, "columns": { + "id": "ID", "name": "Nome", + "author": "Author", + "type": "Type", + "title": "Title", + "enabled": "Enabled", "description": "Descrizione", "username": "Nome utente", "size": "Dimensione", "lastUsed": "Ultimo utilizzo", "created": "Creato", + "updated": "Updated", "actor": "Attore", "event": "Evento", "ip": "IP", "when": "Quando", - "notes": "Note" + "command": "Command", + "location": "Location", + "node": "Node", + "owner": "Owner", + "added": "Added", + "backupConfiguration": "Backup Configuration", + "status": "Status", + "allocation": "Allocation", + "notes": "Note", + "source": "Source", + "target": "Target", + "checksum": "Checksum", + "files": "Files", + "server": "Server", + "address": "Address", + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, + "tabs": { + "general": "General" + }, + "badge": { + "active": "Active", + "inactive": "Inactive", + "enabled": "Enabled", + "disabled": "Disabled", + "successful": "Successful", + "failed": "Failed", + "installed": "Installed" + }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" + }, "server": { "noAllocation": "Nessuna allocazione", "state": { "suspended": "Sospeso", + "transferring": "Server is being transferred", + "nodeMaintenance": "Node is under Maintenance", "restoringBackup": "Ripristino backup", - "installing": "Installazione" + "installing": "Installazione", + "installFailed": "Install Failed" } }, "enum": { @@ -108,18 +382,289 @@ "bottomCenter": "In basso al centro", "bottomRight": "In basso a destra" }, + "serverState": { + "unknown": "Unknown", + "offline": "Offline", + "running": "Running", + "starting": "Starting", + "stopping": "Stopping" + }, "serverPowerAction": { "start": "Avvia", "stop": "Ferma", "restart": "Riavvia", "kill": "Termina" + }, + "serverBackupStatus": { + "starting": "Starting", + "finished": "Finished", + "failed": "Failed" + }, + "connectionStatus": { + "connected": "Connected", + "offline": "Offline" + }, + "serverAutoStartBehavior": { + "always": "Always", + "unlessStopped": "Unless Stopped", + "never": "Never" + }, + "bulkActionServerAction": { + "started": "Started", + "stopped": "Stopped", + "restarted": "Restarted", + "killed": "Killed" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" + } + }, + "unit": { + "bytes": { + "bytes": "B", + "kibibytes": "KiB", + "mebibytes": "MiB", + "gibibytes": "GiB", + "tebibytes": "TiB", + "pebibytes": "PiB" } }, "unlimited": "Illimitato", + "readOnly": "Read-Only", "na": "N/D", + "never": "Never", + "none": "None", + "unknown": "Unknown", "yes": "Sì", "no": "No", - "system": "Sistema" + "web": "Web", + "api": "API", + "default": "Default", + "custom": "Custom", + "system": "Sistema", + "schedule": "Schedule", + "impersonatedBy": "Impersonated by {username}" + }, + "elements": { + "routeOrderEditor": { + "title": "Route Configuration", + "label": { + "route": "Route", + "divider": "Divider", + "redirect": "Redirect" + }, + "empty": "No routes configured. Add routes, dividers, or redirects below.", + "unnamed": "(unnamed)", + "dividerPlaceholder": "Divider label (optional)", + "redirectNamePlaceholder": "Redirect name", + "destinationPlaceholder": "Destination URL (e.g. https://...)", + "selectRoutePlaceholder": "Select a route…", + "button": { + "addDivider": "Add Divider", + "addRedirect": "Add Redirect" + } + }, + "errorBoundary": { + "message": "An unexpected error occurred while rendering this page. Try refreshing. If the problem persists, contact your system administrator.", + "hideDetails": "Hide Details", + "showDetails": "Show Details", + "errorMessage": "Error Message:", + "stackTrace": "Stack Trace:", + "componentStack": "Component Stack:" + }, + "copyOnClick": { + "toast": { + "copied": "Copied to clipboard.", + "failed": "Failed to copy to clipboard.", + "copyManual": "Copy to clipboard: Ctrl+C or Command+C, Enter" + } + }, + "pasteOnClick": { + "toast": { + "pasted": "Pasted from clipboard.", + "failed": "Failed to paste from clipboard.", + "pasteManual": "Paste from clipboard: Ctrl+V or Command+V, Enter" + } + }, + "estimatedTimeArrival": { + "tooltip": { + "estimating": "Estimating completion time...", + "estimated": "Estimated completion time: {time}" + }, + "calculating": "ETA: Calculating...", + "calculated": "ETA: {time}" + }, + "container": { + "alert": { + "impersonating": "You are currently impersonating a user. Please be aware that your actions may affect the impersonated user's account. To exit impersonation mode, click the \"Stop Impersonating\" button in the bottom left corner." + }, + "connectedTo": "Connected to {name}" + }, + "sidebar": { + "button": { + "logout": "Logout", + "stopImpersonating": "Stop Impersonating", + "openInVirtualWindow": "Open in Virtual Window", + "openInPopup": "Open in Popup", + "openInNewTab": "Open in New Tab", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" + } + }, + "permissionSelector": { + "button": { + "copyPermissions": "Copy Permissions", + "pastePermissions": "Paste Permissions" + }, + "selectedPermissions": "Selected Permissions ({count})", + "noPermissions": "No permissions selected." + }, + "selectInput": { + "noResults": "No Results found." + }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, + "can": { + "tooltip": { + "cantSave": "You do not have permission to save.", + "cantDelete": "You do not have permission to delete." + } + }, + "resource": { + "tooltip": { + "created": "{resource} created.", + "updated": "{resource} updated.", + "deleted": "{resource} deleted." + } + }, + "formEngine": { + "advancedMode": "Advanced mode" + }, + "activityInfoButton": { + "modal": { + "info": { + "title": "Activity Details" + } + } + }, + "screenBlock": { + "permissionDenied": { + "title": "Permission Denied", + "content": "You do not have permission to access this page." + }, + "notFound": { + "title": "Not Found", + "content": "The page you are looking for could not be found." + }, + "suspended": { + "title": "Account Suspended", + "content": "Your account has been suspended. You cannot make changes to your account. Please contact an administrator for more information." + }, + "serverConflict": { + "title": "Conflicting Server State", + "contentSuspended": "This server is suspended and cannot be accessed.", + "contentNodeMaintenance": "This server is on a node that is currently under maintenance and cannot be accessed.", + "contentTransferring": "This server is currently being transferred and cannot be accessed until the transfer is complete.", + "contentInstallFailed": "This server failed to install and cannot be accessed until acknowledged.", + "contentInstalling": "This server is currently installing and cannot be accessed until completed.", + "contentRestoringBackup": "This server is currently restoring from a backup and cannot be accessed until completed.", + "button": { + "viewInstallLogs": "View Installation Logs", + "acknowledgeFailure": "Acknowledge Failure" + }, + "modal": { + "acknowledgeFailure": { + "title": "Acknowledge Installation Failure", + "content": "By acknowledging this installation failure, you are confirming that you are aware of the failed installation and have taken any necessary steps to resolve the issue. This will allow you to regain control over the server." + } + } + } + }, + "scheduleDynamicInput": { + "none": "None", + "variable": "Variable", + "enterVariable": "Reading from a variable.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" + }, + "serverWebsocket": { + "error": { + "connectionFailed": "Unable to connect after multiple attempts. Please refresh the page.", + "connectionClosed": "Connection to server was closed. Attempting to reconnect...", + "connectionRetry": "Connection lost. Retrying (attempt {attempt})...", + "authFailed": "Authentication failed. Attempting to refresh credentials... ({error})", + "authRefreshFailed": "Failed to refresh credentials. Please refresh the page to try again.", + "permissionRevoked": "Connection closed: your access to this server has been revoked.", + "tokenRefreshLoop": "Authentication loop detected. Please refresh the page to try again." + }, + "banner": { + "retrying": "Retrying in {countdown}..." + }, + "listener": { + "toast": { + "backupCompleted": "Backup completed successfully.", + "backupFailed": "Backup failed.", + "backupDeleteFailed": "Backup deletion failed.", + "backupRestoreCompleted": "Backup restore completed successfully.", + "installCompleted": "Server Installation completed successfully.", + "installFailed": "Server Installation failed.", + "operations": { + "compressing": { + "completed": "Compressed {files} to `{path}` in {time}.", + "failed": "Failed to compress {files} to `{path}`:\n{error}" + }, + "decompressing": { + "completed": "Decompressed `{path}` to `{destination}` in {time}.", + "failed": "Failed to decompress `{path}` to `{destination}`:\n{error}" + }, + "pulling": { + "completed": "Pulled `{destination}` in {time}.", + "failed": "Failed to pull `{destination}`:\n{error}" + }, + "copying": { + "completed": "Copied `{path}` to `{destination}` in {time}.", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", + "failed": "Failed to copy `{path}` to `{destination}`:\n{error}" + }, + "copyingMany": { + "completed": "Copied {files} in {time}.", + "failed": "Failed to copy {files}:\n{error}" + }, + "copyingRemote": { + "completedFrom": "Copied {files} from remote server in {time}.", + "completedTo": "Copied {files} to remote server in {time}.", + "failedFrom": "Failed to copy {files} from remote server:\n{error}", + "failedTo": "Failed to copy {files} to remote server:\n{error}" + } + } + } + } + }, + "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", + "waiting": "Waiting: {file}", + "uploading": "Uploading: {file}", + "uploadingFolder": "Uploading folder: {folder} ({files})", + "rateLimited": "Your upload has been rate limited. Waiting...", + "cancelAllUploads": "Cancel all uploads", + "toast": { + "uploading": "Started uploading {files}...", + "cancelledFile": "Successfully cancelled upload of `{file}`.", + "cancelledFolder": "Successfully cancelled upload of `{folder}` ({files}).", + "cancelledAll": "All uploads have been cancelled.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" + } + } }, "pages": { "oobe": { @@ -173,6 +718,8 @@ "form": { "locationName": "Nome posizione", "locationNamePlaceholder": "Casa mia", + "locationFlag": "Location Flag", + "locationFlagPlaceholder": "The best country", "backupName": "Nome configurazione backup", "backupNamePlaceholder": "Unicorn Cloud", "backupDisk": "Disco di backup", @@ -184,6 +731,7 @@ }, "node": { "title": "Configurazione nodo", + "allocationsTitle": "Allocations Configuration", "form": { "name": "Nome", "namePlaceholder": "Il mio server", @@ -193,7 +741,8 @@ "publicUrlPlaceholder": "URL", "publicUrlDescription": "utilizzato per websocket/download", "sftpHostPlaceholder": "Host SFTP", - "sftpPortPlaceholder": "Porta SFTP" + "sftpPortPlaceholder": "Porta SFTP", + "ip": "IP" }, "error": { "noLocations": "Qualcosa è andato storto. Nessuna posizione trovata." @@ -202,6 +751,18 @@ "create": "Crea e continua" } }, + "nodeConfiguration": { + "title": "Node Configuration", + "error": { + "noNodes": "Something went wrong. No nodes were found.", + "connectionError": "Something went wrong. Connection Error." + }, + "successMessage": "The connection to your node was successfully verified. You may now continue.", + "configurationDescription": "Place this into the configuration file at `{file}` or run:", + "button": { + "verify": "Verify Connection" + } + }, "configuration": { "title": "Impostazioni applicazione", "form": { @@ -217,6 +778,43 @@ "submit": "Aggiorna impostazioni e continua" } }, + "eggRepositories": { + "title": "Egg Repositories", + "description": "These are the source repositories of your eggs. You may change these repositories at any time.", + "repositories": { + "pterodactylGame": { + "title": "Pterodactyl Game Eggs", + "description": "Eggs for games like Minecraft, Terraria, and a lot more." + }, + "pterodactylApplication": { + "title": "Pterodactyl Application Eggs", + "description": "Eggs for applications like Grafana, Meilisearch, and various databases." + }, + "pterodactylGeneral": { + "title": "Pterodactyl Generic Eggs", + "description": "Eggs for generic application runtimes like Node JS, Java, and Rust." + } + } + }, + "server": { + "title": "Server", + "existingServer": "A server has already been created. You can change the settings later in the admin menu.", + "egg": { + "title": "Egg", + "description": "Let's get your first server up and running. What egg would you like to use?", + "nestDescription": "To start using this egg, you will need to create a nest, nests are collections of eggs. Give it a name:" + }, + "server": { + "title": "Server", + "nestDescription": "To start using this egg, you will need to create a nest, nests are collections of eggs. Give it a name:" + }, + "error": { + "noNodes": "Something went wrong. No nodes were found." + }, + "button": { + "create": "Create & Continue" + } + }, "finished": { "title": "Configurazione completata!", "subtitle": "Il tuo pannello Calagopus è pronto all'uso", @@ -227,8 +825,13 @@ "title": "Configurazione del sistema", "subtitle": "Impostazioni e preferenze del pannello configurate" }, + "eggRepositories": { + "title": "Egg Repositories", + "subtitle": "{count} repositories" + }, "location": "Posizione", - "node": "Nodo" + "node": "Nodo", + "server": "Server" }, "badge": { "skipped": "Saltato" @@ -236,15 +839,131 @@ "button": "Vai alla dashboard" } }, + "auth": { + "button": { + "login": "Login", + "loginWith": "Login with {name}" + }, + "alert": { + "urlMismatch": "The application URL does not match the current URL. Expected: `{appUrl}`, Current: `{currentUrl}`." + }, + "login": { + "error": { + "usernameRequired": "Please enter a username", + "registrationDisabled": "No matching Account could be found and registration is currently disabled.", + "userAlreadyExists": "An account with this username or email already exists." + }, + "passkey": { + "error": { + "notSupported": "Your browser does not support passkeys.", + "unexpected": "An unexpected error occurred while using your passkey.", + "cancelled": "Passkey request was cancelled.", + "dismissed": "You dismissed or did not interact with the passkey prompt. The used key could also be not registered.", + "invalidState": "This passkey is not available or already registered.", + "notSupportedType": "Your browser or device does not support this type of passkey.", + "securityError": "Passkeys can only be used over HTTPS and with a valid domain.", + "authenticatorError": "Something went wrong with the authenticator.", + "constraintError": "The authenticator could not meet the required constraints." + } + }, + "step": { + "username": { + "title": "Login", + "subtitle": "Enter your username or email address to continue", + "form": { + "usernameOrEmailPlaceholder": "Your username or email address" + }, + "link": { + "forgotPassword": "Forgot Password", + "notRegistered": "Not registered?", + "createAccount": "Create account" + }, + "button": { + "oauthLogin": "OAuth Login" + } + }, + "passkey": { + "title": "Authenticate with Passkey", + "subtitle": "We found a passkey associated with {username}", + "button": { + "usePasskey": "Use Passkey", + "usePassword": "Use Password" + } + }, + "password": { + "title": "Enter Password", + "subtitle": "Please enter your password for {username}", + "form": { + "passwordPlaceholder": "Enter your password" + }, + "button": { + "signIn": "Sign In", + "forgotPassword": "Forgot Password" + } + }, + "totp": { + "title": "Two-Factor Authentication", + "welcomeBack": "Welcome back {username}!", + "enterCode": "Enter the 6-digit code from your authenticator app", + "button": { + "verify": "Verify Code", + "useRecoveryCode": "Use Recovery Code", + "useTotp": "Use TOTP" + } + }, + "totpRecovery": { + "subtitle": "Enter a recovery code", + "form": { + "label": "Recovery Code", + "placeholder": "Enter a recovery code" + } + } + } + }, + "register": { + "title": "Register", + "subtitle": "Please enter your details to register", + "button": { + "register": "Register" + } + }, + "forgotPassword": { + "title": "Forgot Password", + "subtitle": "Enter your email to receive instructions on how to reset your password", + "button": { + "request": "Request Password Reset" + }, + "success": "An email has been sent to you with instructions on how to reset your password." + }, + "resetPassword": { + "title": "Reset Password", + "subtitle": "Please enter your new password", + "button": { + "reset": "Reset Password" + }, + "toast": { + "success": "Password has been reset." + } + }, + "oauth": { + "title": "Authenticate with OAuth", + "subtitle": "Choose any of the providers below to login" + } + }, "account": { "home": { "title": "Server", "tooltip": { "removeFromGroup": "Rimuovi dal gruppo", "addToGroup": "Aggiungi al gruppo", + "addServerToGroup": "Add Server to Group", + "groupActions": "Group Actions", "noGroups": "Nessun gruppo disponibile a cui aggiungere il server", "noGroup": "Questo server non è in nessun gruppo" }, + "badge": { + "foreign": "Foreign" + }, "tabs": { "groupedServers": { "title": "Server raggruppati", @@ -271,6 +990,20 @@ "toast": { "deleted": "Gruppo di server eliminato." } + }, + "addServerToGroup": { + "title": "Add Server to {group}", + "noServers": "All servers are already in this group.", + "toast": { + "added": "Server added to group." + } + }, + "removeServerFromGroup": { + "title": "Confirm Server Removal", + "content": "Are you sure you want to remove **{server}** from **{group}**?", + "toast": { + "removed": "Server removed from group." + } } }, "noGroups": "Nessun gruppo trovato, è ora di crearne uno?" @@ -293,14 +1026,29 @@ } } }, + "bulkActions": { + "selectionMode": "Selection Mode", + "select": "Select server", + "deselect": "Deselect server", + "success": "Successfully {action} {servers}.", + "partial": "Successfully {action} {successfulServers}. {failedServers} failed.", + "groupActions": "Group Actions" + }, "noServers": "Nessun server trovato, è ora di aggiungerne uno?" }, + "admin": { + "title": "Admin" + }, "account": { "title": "Account", "alert": { "requireTwoFactor": { "title": "Autenticazione a due fattori richiesta", "description": "L'autenticazione a due fattori è richiesta per il tuo account. Configurala qui sotto per continuare a utilizzare il pannello." + }, + "frozen": { + "title": "Account Frozen", + "description": "Your account has been frozen. You cannot make changes to your account until it is unfrozen. Please contact an administrator for more information." } }, "containers": { @@ -326,7 +1074,8 @@ "twoFactor": { "title": "Autenticazione a due fattori", "toast": { - "disabled": "Autenticazione a due fattori disabilitata con successo." + "disabled": "Autenticazione a due fattori disabilitata con successo.", + "enabled": "Two-factor authentication enabled successfully. Please copy your recovery codes." }, "modal": { "disableTwoFactor": { @@ -348,7 +1097,8 @@ "setupTwoFactor": "Configura autenticazione a due fattori" }, "twoFactorEnabled": "La verifica a due fattori è attualmente abilitata.", - "twoFactorDisabled": "Al momento non hai la verifica a due fattori abilitata sul tuo account. Fai clic sul pulsante qui sotto per iniziare a configurarla." + "twoFactorDisabled": "Al momento non hai la verifica a due fattori abilitata sul tuo account. Fai clic sul pulsante qui sotto per iniziare a configurarla.", + "twoFactorLastUsed": "Last used: {timestamp}" }, "account": { "title": "Dettagli account", @@ -374,6 +1124,16 @@ }, "securityKeys": { "title": "Chiavi di sicurezza", + "subtitle": "{current} of {max} maximum security keys created.", + "table": { + "columns": { + "credentialId": "Credential ID" + } + }, + "tooltip": { + "secureContextRequired": "A secure context (HTTPS) is required to use security keys.", + "limitReached": "You are limited to {max} security keys." + }, "modal": { "createSecurityKey": { "title": "Crea chiave di sicurezza", @@ -416,8 +1176,67 @@ } } }, + "shortcuts": { + "title": "Keyboard Shortcuts", + "subtitle": "Use these keyboard shortcuts to navigate and interact with the panel more efficiently.", + "detectedMac": "macOS detected", + "detectedWindows": "Windows/Linux detected", + "label": { + "disabled": "Disabled", + "modified": "Modified", + "recording": "Press keys..." + }, + "button": { + "rebind": "Rebind", + "resetAll": "Reset All", + "copy": "Copy All", + "paste": "Paste" + }, + "toast": { + "imported": "Updated {shortcuts}.", + "importedNone": "No shortcuts were changed.", + "importErrors": "Ignored {unknown} and {invalid}.", + "resetAll": "All shortcuts reset to defaults." + }, + "fileManager": { + "title": "File Manager", + "selectAll": "Select all files", + "cutFiles": "Cut selected files", + "copyFiles": "Copy selected files", + "duplicateFile": "Duplicate selected file", + "pasteFiles": "Paste files", + "searchFiles": "Search files", + "moveUpDirectory": "Move Up a directory", + "moveUpSelection": "Move Up the selection", + "moveDownSelection": "Move Down the selection", + "renameFile": "Rename file", + "deselectAll": "Deselect all files", + "deleteFiles": "Delete selected files" + }, + "table": { + "title": "Table Navigation", + "previousPage": "Previous page", + "nextPage": "Next page", + "firstPage": "First page", + "lastPage": "Last page" + }, + "console": { + "title": "Server Console", + "searchContent": "Search in console output", + "previousCommand": "Previous command in history", + "nextCommand": "Next command in history" + }, + "serverList": { + "title": "Server List", + "selectServer": "Hold S and click to select/deselect server" + } + }, "sshKeys": { "title": "Chiavi SSH", + "subtitle": "{current} of {max} maximum ssh keys created.", + "tooltip": { + "limitReached": "You are limited to {max} ssh keys." + }, "table": { "columns": { "fingerprint": "Impronta digitale" @@ -429,6 +1248,9 @@ "toast": { "created": "Chiave SSH creata." }, + "button": { + "uploadKeyFile": "Upload Key File" + }, "form": { "publicKey": "Chiave pubblica" } @@ -457,6 +1279,40 @@ } } }, + "commandSnippets": { + "title": "Command Snippets", + "subtitle": "{current} of {max} maximum command snippets created.", + "tooltip": { + "limitReached": "You are limited to {max} command snippets." + }, + "modal": { + "createCommandSnippet": { + "title": "Create Command Snippet", + "toast": { + "created": "Command snippet created." + } + }, + "editCommandSnippet": { + "title": "Edit Command Snippet", + "toast": { + "updated": "Command snippet updated." + } + }, + "deleteCommandSnippet": { + "title": "Confirm Command Snippet Deletion", + "content": "Are you sure you want to delete **{name}** from your account?", + "toast": { + "removed": "Command snippet removed." + } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } + } + } + }, "oauthLinks": { "title": "Collegamenti OAuth", "button": { @@ -480,6 +1336,13 @@ }, "apiKeys": { "title": "Chiavi API", + "subtitle": "{current} of {max} maximum api keys created.", + "button": { + "apiDocumentation": "API Documentation" + }, + "tooltip": { + "limitReached": "You are limited to {max} api keys." + }, "table": { "columns": { "key": "Chiave", @@ -500,12 +1363,25 @@ "updated": "Chiave API aggiornata." } }, + "recreateApiKey": { + "title": "Recreate API Key", + "content": "Recreating an API key will generate a new key and invalidate the old one. Are you sure you want to recreate the API key **{name}**?", + "toast": { + "recreated": "API key recreated." + } + }, "deleteApiKey": { "title": "Conferma eliminazione chiave API", "content": "Sei sicuro di voler eliminare **{name}** dal tuo account?", "toast": { "removed": "Chiave API rimossa." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -514,56 +1390,2978 @@ "userPermissions": "Permessi utente", "serverPermissions": "Permessi server", "adminPermissions": "Permessi admin" + }, + "create": { + "title": "Create API Key", + "subtitle": "An application is requesting an API key to be created for your account.", + "alert": { + "adminPermissions": "This API key requests **admin permissions**. Anyone in possession of this key will be able to perform administrative actions on this panel in your name. Only continue if you absolutely trust the requesting application.", + "callbackUrl": "After creation, the new API key will be sent to **{url}**." + }, + "noPermissions": "This API key will not have any permissions.", + "keyCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "button": { + "goToApiKeys": "Go to API Keys" + } } }, "activity": { "title": "Attività" } }, - "server": { - "console": { - "title": "Console", - "input": { - "placeholder": "Digita un comando...", - "ariaLabel": "Campo di input comandi console." - }, - "message": { - "serverMarkedAs": "Server contrassegnato come {state}...", - "transferFailed": "Il trasferimento è fallito.", - "pullingImage": "Il tuo server sta attualmente scaricando la sua immagine docker. Attendere prego...", - "pulling": "Download", - "extracting": "Estrazione" - }, - "details": { - "address": "Indirizzo", - "port": "Porta", - "uptime": "Uptime", - "cpuLoad": "Carico CPU", - "memoryLoad": "Carico memoria", - "diskUsage": "Utilizzo disco", - "networkIn": "Rete (In)", - "networkOut": "Rete (Out)", - "normalizeCpuLoad": "Normalizza carico CPU (spostato al massimo 100%)" + "admin": { + "home": { + "title": "Home", + "alert": { + "newPanelVersion": "A new version is available for the panel! You are currently on {current} and the latest version is {latest}. You may want to consider upgrading. [Click here]({upgradeUrl}) to view upgrade instructions." }, - "power": { - "modal": { - "forceStop": { - "title": "Termina forzatamente processo", - "content": "Terminare forzatamente un server può causare corruzione dei dati." + "tabs": { + "overview": { + "title": "Overview", + "page": { + "permissionDenied": "You do not have permission to read the statistics that would have been here otherwise. For now, enjoy this bird.", + "card": { + "systemOverview": "System Overview", + "generalStatistics": "General Statistics", + "backupStatistics": "Backup Statistics" + }, + "system": { + "cpu": "CPU", + "memoryUsage": "Memory Usage ({process} used by Panel)", + "memoryValue": "{used} / {total} ({percent}%)", + "kernelVersion": "Kernel Version ({architecture})", + "containerType": "Container Type", + "databaseVersion": "Database Version ({size})", + "cacheVersion": "Cache Version", + "cacheCalls": "Cache Calls", + "cacheHits": "Cache Hits ({percent}%)", + "cacheMisses": "Cache Misses ({percent}%)", + "avgCachedCallLatency": "Avg. Cached Call Latency" + }, + "containerType": { + "none": "None detected", + "official": "Official", + "officialAio": "Official AIO", + "officialHeavy": "Official Heavy" + }, + "stats": { + "users": "Users", + "servers": "Servers", + "locations": "Locations", + "nodes": "Nodes", + "nestEggs": "Nest Eggs", + "databaseHosts": "Database Hosts", + "backupConfigurations": "Backup Configurations", + "roles": "Roles" + }, + "backup": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month", + "totalAllTime": "Total backups all time", + "successfulAllTime": "Successful backups all time", + "failedAllTime": "Failed backups all time", + "deletedAllTime": "Deleted backups all time", + "totalToday": "Total backups today", + "successfulToday": "Successful backups today", + "failedToday": "Failed backups today", + "deletedToday": "Deleted backups today", + "totalWeek": "Total backups this week", + "successfulWeek": "Successful backups this week", + "failedWeek": "Failed backups this week", + "deletedWeek": "Deleted backups this week", + "totalMonth": "Total backups this month", + "successfulMonth": "Successful backups this month", + "failedMonth": "Failed backups this month", + "deletedMonth": "Deleted backups this month", + "successfulValue": "{count} ({size})", + "deletedValue": "{count} ({size})" + } } - } - }, - "stats": { - "cpuLoad": "Carico CPU", - "memoryLoad": "Carico memoria", - "network": "Rete", - "inbound": "In entrata", - "outbound": "In uscita" - } + }, + "updates": { + "title": "Updates", + "page": { + "alert": { + "extensionUpdateErrors": "There were errors checking for updates for some extensions." + }, + "card": { + "panelVersion": "Panel Version", + "versionHistory": "Version History", + "outdatedExtensions": "Outdated Extensions", + "outdatedNodes": "Outdated Nodes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" + }, + "panelVersion": "Your panel is currently running version `{current}`. The latest available version is `{latest}`.", + "unknown": "unknown", + "button": { + "recheck": "Recheck for Updates" + }, + "toast": { + "recheckComplete": "Recheck complete." + }, + "selectHistory": "Select an update history to view.", + "historyPanel": "Panel", + "historyExtension": "Extension: {name}", + "extensionsUpToDate": "All extensions are up to date.", + "extensionsOutdated": "Some extensions are outdated or had errors when checking for updates.", + "noChangelog": "No changelog", + "nodesUpToDate": "Seems like all nodes are up to date. ({failed} failed to check)", + "nodesOutdated": "Some nodes are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "table": { + "version": "Version", + "installed": "Installed", + "packageName": "Package Name", + "latestVersion": "Latest Version", + "changes": "Changes", + "error": "Error" + } + } + }, + "health": { + "title": "Health", + "page": { + "card": { + "generalHealth": "General Health", + "extensionMigrationHealth": "Extension Migration Health", + "desyncNodes": "Desync Nodes", + "debugMode": "Debug Mode" + }, + "appliedMigrations": "Applied Migrations ({percent}%)", + "migrationsValue": "{applied} / {total}", + "avgNtpOffset": "Avg. NTP Offset", + "noExtensions": "No extensions found.", + "nodesSynced": "Seems like all nodes have a synced clock (within 5 seconds of panel clock). ({failed} failed to check)", + "nodesDesync": "Some nodes have desync clocks (over 5 seconds off of the panel's clock). This can cause file download/console issues. ({desync} desync, {failed} failed to check)", + "debugEnabled": "Debug mode is currently enabled.", + "debugDisabled": "Debug mode is currently disabled.", + "debugResetNote": "This setting will be reset to the default ({default}) when the application restarts.", + "table": { + "packageName": "Package Name", + "applied": "Applied", + "total": "Total", + "id": "ID", + "desync": "Desync", + "appliedValue": "{applied} ({percent}%)" + }, + "button": { + "enableDebug": "Enable Debug Mode", + "disableDebug": "Disable Debug Mode" + }, + "toast": { + "debugEnabled": "Debug mode enabled.", + "debugDisabled": "Debug mode disabled." + } + } + } + } + }, + "settings": { + "title": "Settings", + "tabs": { + "application": { + "title": "Application", + "page": { + "title": "Application Settings", + "form": { + "icon": "Icon", + "iconLight": "Icon (Light Mode)", + "banner": "Banner", + "bannerLight": "Banner (Light Mode)", + "sessionCookie": "Session Cookie", + "sessionDurationSeconds": "Session Duration (seconds)", + "twoFactorRequirement": "Two-Factor Authentication Requirement", + "telemetryEnabled": "Enable Telemetry", + "telemetryEnabledDescription": "Allow Calagopus to collect limited and anonymous usage data to help improve the application.", + "registrationEnabled": "Enable Registration" + }, + "enum": { + "twoFactorRequirement": { + "admins": "Admins", + "allUsers": "All Users", + "none": "None" + } + }, + "button": { + "previewTelemetry": "Preview Telemetry" + }, + "toast": { + "updated": "Application settings updated." + }, + "modal": { + "disableTelemetry": { + "title": "Confirm Disabling Telemetry", + "content": "Are you sure you want to disable telemetry? Telemetry helps us improve Calagopus by providing anonymous usage data. Disabling telemetry will prevent any data from being sent." + }, + "enableRegistration": { + "title": "Confirm Enabling Registration", + "content": "Are you sure you want to enable registration? Enabling registration allows anyone to create an account on this panel. If you do not have a captcha configured, this may be a mistake." + }, + "telemetryPreview": { + "title": "Telemetry Preview" + } + } + } + }, + "storage": { + "title": "Storage", + "page": { + "title": "Storage Settings", + "form": { + "driver": "Driver" + }, + "enum": { + "driver": { + "filesystem": "Filesystem", + "s3": "S3" + } + }, + "toast": { + "updated": "Storage settings updated." + }, + "modal": { + "changeStorageType": { + "title": "Confirm Changing Storage Type", + "content": "Are you sure you want to change the storage type? Changing the storage type will cause the application to look for assets (e.g. profile pictures) in a different location, which may result in missing assets if they are not moved to the new location manually." + } + }, + "s3": { + "alert": { + "permissionsTitle": "Note on Permissions", + "permissionsIntro": "To ensure that the storage backend works correctly, please make sure the following subdirectories are publicly accessible over the \"Public URL\" you provided:", + "permissionsAssets": "This is where all admin assets (e.g., icons) will be stored.", + "permissionsAvatars": "This is where all user avatars will be stored.", + "permissionsPublicData": "This is where extensions can store public data (e.g., images)." + }, + "form": { + "pathStyle": "Using path-style URLs" + } + } + } + }, + "mail": { + "title": "Mail", + "page": { + "title": "Email Settings", + "enum": { + "provider": { + "none": "None", + "smtp": "SMTP", + "sendmail": "Sendmail Command", + "filesystem": "Filesystem" + }, + "tlsMode": { + "none": "None", + "startTls": "STARTTLS", + "implicitTls": "Implicit TLS" + } + }, + "toast": { + "updated": "Email settings updated." + }, + "modal": { + "sendTestEmail": { + "title": "Send Test Email", + "toast": { + "sent": "Test email has been sent successfully." + } + } + }, + "smtp": { + "form": { + "tlsMode": "TLS Mode", + "skipCertValidation": "Skip Certificate Validation" + } + } + } + }, + "mailTemplates": { + "title": "Mail Templates", + "page": { + "title": "Email Template Settings", + "sidebar": { + "templates": "Templates", + "loading": "Loading...", + "availableVariables": "Available Variables" + }, + "alert": { + "syntaxBefore": "Templates use the", + "syntaxLink": "MiniJinja", + "syntaxMiddle": "templating syntax. Variables are referenced with", + "syntaxAnd": "and control structures like", + "syntaxOr": "and", + "syntaxAfter": "are supported." + }, + "empty": "Select a template from the sidebar to edit it.", + "loadingTemplate": "Loading template...", + "form": { + "subject": "Subject" + }, + "toast": { + "saved": "Email template saved.", + "reset": "Email template reset to default." + }, + "modal": { + "reset": { + "title": "Reset to default", + "content": "This will discard your custom template for **{identifier}** and restore the built-in default. This cannot be undone." + } + } + } + }, + "captcha": { + "title": "Captcha", + "page": { + "title": "Captcha Settings", + "toast": { + "updated": "Captcha settings updated." + }, + "recaptcha": { + "form": { + "v3": "V3" + } + } + } + }, + "webauthn": { + "title": "Webauthn", + "page": { + "title": "Webauthn Settings", + "form": { + "rpId": "RP Id", + "rpOrigin": "RP Origin" + }, + "button": { + "autofill": "Autofill" + }, + "toast": { + "updated": "Webauthn settings updated.", + "ipNotAllowed": "Cannot use WebAuthn on an IP address." + }, + "modal": { + "changeRpId": { + "title": "Confirm Changing RP Id", + "content": "Are you sure you want to change the RP Id? Changing the RP Id will break all existing Webauthn credentials and require users to re-register their devices. This can have significant consequences, so please make sure you understand the implications before proceeding." + } + } + } + }, + "server": { + "title": "Server", + "page": { + "title": "Server Settings", + "form": { + "maxFileManagerViewSize": "Max File Manager View Size", + "maxScheduleStepCount": "Max Schedule Steps", + "maxFileManagerContentSearchSize": "Max File Manager Content Search Size", + "maxFileManagerSearchResults": "Max File Manager Search Results", + "maxSubuserCount": "Max Subuser Count", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", + "allowOverwritingCustomDockerImage": "Allow Overwriting Custom Docker Image", + "allowOverwritingCustomDockerImageDescription": "If enabled, users will be able to overwrite the Docker image specified in the server configuration using the Eggs list, even if an admin has set a custom Docker image.", + "allowViewingInstallationLogs": "Allow Viewing Installation Logs", + "allowViewingInstallationLogsDescription": "If enabled, users with console read permissions will also be able to view installation logs via the websocket connection. If disabled, installation logs will only be available for admins.", + "allowAcknowledgingInstallationFailure": "Allow Acknowledging Installation Failure", + "allowAcknowledgingInstallationFailureDescription": "If enabled, users will be able to acknowledge installation failures for servers that are in the \"Install Failed\" state, allowing them to attempt to start the server instead of having to wait for an admin. If disabled, only admins will be able to acknowledge installation failures.", + "allowViewingTransferProgress": "Allow Viewing Transfer Progress", + "allowViewingTransferProgressDescription": "If enabled, users with console read permissions will also be able to view transfer progress logs via the websocket connection. If disabled, transfer progress logs will only be available for admins.", + "containerPrelude": "Container Prelude", + "containerPreludeDescription": "The terminal prelude used for some status-related messages in the server console." + }, + "toast": { + "updated": "Server settings updated." + } + } + }, + "user": { + "title": "User", + "page": { + "title": "User Settings", + "form": { + "maxServerGroupCount": "Max Server Groups", + "maxApiKeyCount": "Max API Keys", + "maxCommandSnippetCount": "Max Command Snippets", + "maxSecurityKeyCount": "Max Security Keys", + "maxSshKeyCount": "Max SSH Keys", + "allowChangingLanguage": "Allow Changing Language", + "allowChangingLanguageDescription": "If enabled, users will be able to change their language preferences." + }, + "routeOrder": { + "title": "Client Route Order" + }, + "toast": { + "updated": "User settings updated." + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "Activity Settings", + "form": { + "adminLogRetentionDays": "Admin Activity Retention Days", + "userLogRetentionDays": "User Activity Retention Days", + "serverLogRetentionDays": "Server Activity Retention Days", + "adminLogRetentionCount": "Admin Activity Retention Count", + "userLogRetentionCount": "User Activity Retention Count", + "serverLogRetentionCount": "Server Activity Retention Count", + "serverLogAdminActivity": "Log Server Admin Activity", + "serverLogAdminActivityDescription": "Enable or disable logging of admin activity on servers where the admin isn't an owner or subuser.", + "serverLogScheduleActivity": "Log Server Schedule Activity", + "serverLogScheduleActivityDescription": "Enable or disable logging of activity done by server schedules." + }, + "toast": { + "updated": "Activity settings updated." + } + } + }, + "ratelimits": { + "title": "Ratelimits", + "page": { + "title": "Ratelimit Settings", + "form": { + "hits": "Hits", + "hitsDescription": "Maximum number of requests allowed per window.", + "windowSeconds": "Window", + "windowSecondsDescription": "Window duration in seconds." + }, + "toast": { + "updated": "Rate limit settings updated." + } + } + } + } + }, + "announcements": { + "title": "Announcements", + "resourceName": "Announcement", + "tabs": { + "general": { + "page": { + "modal": { + "delete": { + "title": "Confirm Announcement Deletion", + "content": "Are you sure you want to delete **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" + } + }, + "form": { + "dismissibleEnd": "Dismissible End", + "enabledStart": "Enabled Start", + "enabledEnd": "Enabled End", + "locations": "Locations", + "locationsDescription": "Leave empty to apply to all locations.", + "nodes": "Nodes", + "nodesDescription": "Leave empty to apply to all nodes.", + "backupConfigurations": "Backup Configurations", + "backupConfigurationsDescription": "Leave empty to apply to all backup configurations.", + "eggsPlaceholder": "Select Eggs", + "dismissible": "Dismissible" + }, + "titleCreate": "Create Announcement", + "titleUpdate": "Update Announcement" + } + } + }, + "enum": { + "announcementType": { + "info": "Info", + "success": "Success", + "warning": "Warning", + "error": "Error" + } + } + }, + "assets": { + "title": "Assets", + "button": { + "newDirectory": "New Directory", + "upload": "Upload", + "copyLink": "Copy Link" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" + }, + "toast": { + "assetDeleted": "Asset deleted.", + "assetsDeleted": "{assets} deleted." + }, + "modal": { + "createDirectory": { + "title": "New Directory", + "createdAs": "Will be created at " + }, + "deleteAssets": { + "title": "Confirm Asset Deletion", + "content": "Are you sure you want to delete `{count}` assets?" + }, + "deleteAsset": { + "title": "Delete Asset", + "content": "Are you sure you want to delete this asset? This action cannot be undone." + } + } + }, + "extensions": { + "title": "Extensions", + "unknownExtension": "Unknown Extension", + "alert": { + "noExtensions": "No extensions installed.", + "heavyImageMissing": "You don't seem to be using the heavy image required to install extensions, see [here]({docsUrl}) on how to switch to it." + }, + "button": { + "viewBuildLogs": "View build logs", + "install": "Install extension", + "rebuild": "Rebuild extensions", + "configure": "Configure", + "back": "Back to Extensions", + "accept": "Accept", + "decline": "Decline" + }, + "tooltip": { + "building": "The panel is currently building extension code. Please wait.", + "noPendingBuild": "No pending extensions to build.", + "noBackend": "Backend extension is required to configure this extension.", + "noConfigurationPage": "This extension does not have a configuration page defined.", + "removeExtension": "Remove extension" + }, + "badge": { + "frontendMissing": "Frontend missing", + "backendMissing": "Backend missing", + "pendingBuild": "Pending build", + "pendingRemoval": "Pending removal" + }, + "card": { + "version": "Version", + "authors": "Authors" + }, + "section": { + "pendingExtensions": "Pending extensions", + "noPendingExtensions": "No pending extensions." + }, + "dropzone": { + "title": "Drop some files here to install as Extensions", + "subtitle": "Release to start installing" + }, + "toast": { + "buildStarted": "Extension rebuild started successfully.", + "buildCompleted": "Extension build completed. You may need to refresh the page.", + "added": "Extension `{packageName}` added successfully.", + "removed": "Extension `{packageName}` removed successfully." + }, + "notFound": { + "title": "Extension Not Found", + "content": "Extension with package name \"{packageName}\" not found." + }, + "configure": { + "title": "Configure {packageName}", + "noConfigurationPage": "This extension does not have a configuration page." + }, + "modal": { + "buildLogs": { + "title": "Build Logs", + "empty": "No logs found." + }, + "license": { + "title": "License agreement", + "description": "The extension `{packageName}` requires you to accept the following license before it can be installed." + }, + "remove": { + "title": "Remove extension", + "content": "Are you sure you want to remove the extension `{packageName}`? This action cannot be undone.", + "form": { + "removeMigrations": "Do you want to remove & rollback the database migrations of this extension?" + } + } + } + }, + "users": { + "title": "Users", + "resourceName": "User", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, + "tooltip": { + "admin": "Admin", + "twoFactorEnabled": "2FA Enabled", + "twoFactorDisabled": "2FA Disabled" + }, + "table": { + "columns": { + "role": "Role" + } + }, + "tabs": { + "general": { + "page": { + "tooltip": { + "cannotImpersonateSelf": "You cannot impersonate yourself." + }, + "button": { + "disableTwoFactor": "Disable Two Factor", + "sendPasswordResetEmail": "Send Password Reset Email", + "impersonate": "Impersonate" + }, + "form": { + "admin": "Admin", + "adminDescription": "Admin users have full, unrestricted access to everything on the panel.", + "frozen": "Frozen", + "frozenDescription": "Frozen users cannot make any changes to their account information.", + "suspended": "Suspended", + "suspendedDescription": "Suspended users cannot access the panel in any meaningful way.", + "role": "Role" + }, + "modal": { + "delete": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete **{username}**?" + }, + "disableTwoFactor": { + "title": "Disable User Two Factor", + "content": "Are you sure you want to remove the two factor of **{username}**?", + "toast": { + "disabled": "User two factor disabled." + } + }, + "sendPasswordResetEmail": { + "title": "Send Password Reset Email", + "content": "Are you sure you want to send a password reset email to **{email}**?", + "toast": { + "sent": "Password reset email sent." + } + } + }, + "titleCreate": "Create User", + "titleUpdate": "Update User" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "User Servers", + "showOwnedOnly": "Only show users' owned servers" + } + }, + "oauthLinks": { + "title": "OAuth Links", + "page": { + "title": "User OAuth Links", + "toast": { + "added": "OAuth Link added.", + "removed": "OAuth Link removed." + }, + "modal": { + "add": { + "title": "Add OAuth Link", + "form": { + "oauthProvider": "OAuth Provider" + } + }, + "delete": { + "title": "Confirm OAuth Link Deletion", + "content": "Are you sure you want to delete the **{provider}** connection from **{username}**?" + } + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "User Activity" + } + } + } + }, + "locations": { + "title": "Locations", + "resourceName": "Location", + "tabs": { + "general": { + "page": { + "form": { + "flag": "Flag" + }, + "modal": { + "delete": { + "title": "Confirm Location Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "titleCreate": "Create Location", + "titleUpdate": "Update Location" + } + }, + "databaseHosts": { + "title": "Database Hosts", + "page": { + "title": "Location Database Hosts", + "toast": { + "created": "Location database host created.", + "deleted": "Location database host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Host" + }, + "delete": { + "title": "Confirm Location Database Host Deletion", + "content": "Are you sure you want to delete the database host **{name}** from **{location}**?" + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Location Nodes" + } + } + } + }, + "nodes": { + "title": "Nodes", + "resourceName": "Node", + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "general": { + "page": { + "tooltip": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "allInOneNode": "All-in-One Node", + "errorWhileFetchingVersion": "Error while fetching version", + "updateAvailable": "{version} (Update Available)", + "useWingsProxyUrl": "Use Wings Proxy URL" + }, + "form": { + "urlDescription": "Used for internal communication with the node.", + "publicUrlDescription": "Used for websocket connections and downloads.", + "backupConfigurationPlaceholder": "Inherit from Location", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." + }, + "button": { + "resetToken": "Reset Token", + "updateConfig": "Update Config" + }, + "toast": { + "tokenReset": "Node token reset." + }, + "alert": { + "noLocations": "You need to create at least one location before you can create nodes. Locations help organize your nodes geographically or logically." + }, + "titleCreate": "Create Node", + "titleUpdate": "Update Node" + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/pterodactyl/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "panelUrl": "Panel URL", + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the node: {error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Node Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "toast": { + "connectionLost": "Lost connection to the node statistics stream." + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "cpuThreads": "{model} ({threads} threads)", + "usedByWings": "{size} used by Wings", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "networkTraffic": "Network Traffic", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "inbound": "Inbound", + "outbound": "Outbound", + "networkInLabel": "Network In", + "networkOutLabel": "Network Out" + } + } + }, + "capacity": { + "title": "Capacity", + "page": { + "title": "Deployment Capacity", + "subtitle": "Resources allocated to servers on this node, measured against the limits configured in node settings, not the physical machine capacity. Deployment only checks memory and disk.", + "card": { + "resources": "Allocated Resources" + }, + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Under Maintenance", + "maintenanceDisabled": "Not Under Maintenance" + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "memoryOverhead": "Memory Overhead", + "servers": "Servers", + "noLimit": "No node limit", + "free": "{size} free", + "overhead": "+ {size} reserved overhead", + "cores": "{cores} cores allocated" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Node Logs", + "form": { + "logFile": "Log File", + "follow": "Follow" + }, + "button": { + "download": "Download Full Log" + }, + "toast": { + "connectionLost": "Lost connection to the node log stream." + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Node Allocations", + "tooltip": { + "clearSelection": "Clear Selection" + }, + "form": { + "ipAlias": "IP Alias" + }, + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "modal": { + "create": { + "title": "Create Node Allocations", + "button": { + "create": "Create {count}" + }, + "toast": { + "created": "{allocations} created." + } + }, + "update": { + "title": "Update Node Allocations", + "toast": { + "updated": "{allocations} updated." + } + }, + "delete": { + "title": "Confirm Node Allocations Deletion", + "content": "Are you sure you want to delete `{count}` allocations from **{name}**?", + "toast": { + "deleted": "{allocations} deleted." + } + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Node Mounts", + "toast": { + "added": "Node Mount added.", + "removed": "Node Mount removed." + }, + "modal": { + "add": { + "title": "Add Node Mount" + }, + "remove": { + "title": "Confirm Node Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Node Backups", + "input": { + "detachedOnly": "Only show detached backups" + }, + "tooltip": { + "backupNotOnSameNode": "This backup is not on the same node as the server. It is not viewable from the Client API." + }, + "toast": { + "downloadStarted": "Download started.", + "detached": "Backup detached successfully.", + "reattached": "Reattached backup to {name} successfully.", + "restoring": "Restoring backup to {name}...", + "exporting": "Exporting backup to files of {name}...", + "deleted": "Node backup deleted." + }, + "modal": { + "export": { + "title": "Export Node Backup to Files" + }, + "detach": { + "title": "Confirm Backup Detachment", + "content": "Are you sure you want to detach this backup from its server? It will not be deleted and can be reattached later." + }, + "reattach": { + "title": "Reattach Node Backup", + "description": "Reattaching a node backup will link it to a server. This is useful if the backup is detached or you want to link it to a different server. Do note that this is not a transfer tool, unless the backup is considered remote (can be accessed by multiple nodes), the server must belong to the same node as the backup." + }, + "restore": { + "title": "Restore Node Backup", + "form": { + "truncateDirectory": "Do you want to empty the filesystem of this server before restoring the backup?" + } + }, + "delete": { + "title": "Confirm Node Backup Deletion", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Node Servers", + "modal": { + "transfer": { + "title": "Transfer Servers", + "form": { + "allocationMode": "Allocation Mode", + "transferBackups": "Transfer backups", + "transferBackupsDescription": "Whether to transfer backups along with the servers." + }, + "toast": { + "started": "{servers} transfer started." + }, + "confirm": { + "title": "Confirm Server Transfers", + "content": "Are you sure you want to transfer `{count}` servers from **{from}** to **{to}**? This action cannot be undone." + }, + "enum": { + "allocationMode": { + "none": "None (scrap all allocations, server will not be automatically assigned new allocations on the destination node)", + "randomPrimary": "Randomize primary allocation (removes additional allocations)", + "randomAll": "Randomize all allocations (recommended to avoid incompatibility issues with destination node)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", + "eggConfigDeployment": "Assign allocations based on Egg deployment configuration (only works if the Egg has a deployment configuration and the destination node has compatible allocations)", + "eggConfigSelfAssignRange": "Self-assign new allocations based on Egg port range (only works if the Egg has a port range and the destination node has compatible allocations)" + } + } + }, + "powerAction": { + "title": "Confirm Power Action", + "content": "Are you sure you want to **{action}** {servers}?" + } + } + } + }, + "transfers": { + "title": "Outgoing Transfers", + "page": { + "title": "Node Transfers", + "table": { + "columns": { + "progress": "Progress", + "archiveRate": "Archive Rate", + "networkRate": "Network Rate" + } + } + } + } + }, + "modal": { + "delete": { + "title": "Confirm Node Deletion", + "content": "Are you sure you want to delete **{name}**?" + }, + "bulkConfig": { + "title": "Update Configuration - {nodes}", + "button": { + "apply": "Apply to {nodes}" + }, + "toast": { + "applied": "Configuration applied to {nodes}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "servers": { + "title": "Servers", + "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, + "general": { + "page": { + "titleCreate": "Create Server", + "titleUpdate": "Update Server", + "card": { + "basicInformation": "Basic Information", + "serverAssignment": "Server Assignment", + "resourceLimits": "Resource Limits", + "serverConfiguration": "Server Configuration", + "featureLimits": "Feature Limits", + "allocations": "Allocations", + "variables": "Variables" + }, + "alert": { + "suspended": "This server is suspended.", + "selectEggForVariables": "Please select an egg before you can configure variables." + }, + "badge": { + "serverSuspended": "Server Suspended" + }, + "form": { + "serverNamePlaceholder": "My Game Server", + "externalIdPlaceholder": "Optional external identifier", + "descriptionPlaceholder": "Server description", + "owner": "Owner", + "egg": "Egg", + "backupConfigurationPlaceholder": "Inherit from Node/Location", + "cpuLimit": "CPU Limit (%)", + "cpuLimitDescription": "The CPU limit in % that the server can use.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this server.", + "swapTooltip": "-1 will not set a limit.", + "memoryDescription": "The Memory limit of the server container.", + "memoryTooltip": "0 will not set a limit.", + "memoryOverhead": "Memory Overhead", + "memoryOverheadDescription": "Hidden Memory that will be added to the container.", + "diskSpace": "Disk Space", + "diskSpaceDescription": "The disk limit of the server.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the server container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems.", + "pinnedCpus": "Pinned CPUs", + "pinnedCpusDescription": "The CPU cores this server is pinned to.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", + "dockerImagePlaceholder": "ghcr.io/...", + "predefinedDockerImages": "Predefined Docker Images", + "predefinedDockerImagesPlaceholder": "No predefined image selected", + "timezonePlaceholder": "Europe/Amsterdam", + "startupCommandPlaceholder": "npm start", + "startupCommandCustom": "Custom", + "predefinedStartupCommands": "Predefined Startup Commands", + "startOnCompletion": "Start on Completion", + "startOnCompletionDescription": "Start server after installation completes.", + "skipInstaller": "Skip Installer", + "skipInstallerDescription": "Skip running the install script.", + "hugepagesPassthroughEnabled": "Enable Hugepages Passthrough", + "hugepagesPassthroughEnabledDescription": "Enable hugepages passthrough for the server (mounts /dev/hugepages into the container).", + "kvmPassthroughEnabled": "Enable KVM Passthrough", + "kvmPassthroughEnabledDescription": "Enable KVM passthrough for the server (allows access to /dev/kvm inside the container).", + "allocationsLimit": "Allocations", + "databasesLimit": "Databases", + "databaseAgentsLimit": "Agent Databases", + "backupsLimit": "Backups", + "schedulesLimit": "Schedules" + }, + "modal": { + "confirmNoAllocation": { + "title": "No Primary Allocation Assigned", + "content": "You are creating a server without assigning any primary allocation. Are you sure you want to continue?", + "button": { + "confirm": "Create Anyway" + } + } + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Server Allocations", + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "form": { + "notesPlaceholder": "Notes" + }, + "toast": { + "updated": "Allocation updated.", + "setPrimary": "Allocation set as primary.", + "unsetPrimary": "Allocation unset as primary.", + "removed": "Allocation removed.", + "added": "{count} allocations added." + }, + "modal": { + "add": { + "title": "Add Server Allocations", + "form": { + "allocations": "Allocations" + }, + "button": { + "add": "Add {count}" + } + }, + "remove": { + "title": "Confirm Allocation Removal", + "content": "Are you sure you want to remove **{allocation}**?" + } + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Server Variables", + "toast": { + "updated": "Server variables updated." + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Server Mounts", + "toast": { + "added": "Server Mount added.", + "deleted": "Server Mount deleted." + }, + "modal": { + "add": { + "title": "Add Server Mount" + }, + "remove": { + "title": "Confirm Server Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Server Backups", + "input": { + "partiallyDetachedOnly": "Only show partially detached backups" + } + } + }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Server Logs", + "form": { + "logType": "Log Type" + }, + "enum": { + "logType": { + "console": "Console", + "install": "Install" + } + } + } + }, + "management": { + "title": "Management", + "page": { + "title": "Server Management", + "transfer": { + "title": "Transfer", + "content": "Transfer this server and it's data to another node within this system.", + "toast": { + "started": "Server transfer started." + }, + "modal": { + "title": "Server Transfer", + "form": { + "backupsToTransfer": "Backups to transfer" + }, + "tooltip": { + "aioNotSupported": "Transfers to the All-In-One node are not supported." + }, + "confirm": { + "title": "Confirm Server Transfer", + "content": "Are you sure you want to transfer **{name}** from **{from}** to **{to}**?", + "alert": { + "notAllBackupsSelected": "You have not selected all backups to transfer, the remaining backups will become partially detached if the transfer completes successfully." + } + } + } + }, + "suspend": { + "title": "Suspend", + "content": "This will suspend the server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the server through the panel or API.", + "button": "Suspend", + "toast": { + "suspended": "Server suspended." + }, + "modal": { + "title": "Confirm Server Suspension", + "content": "Are you sure you want to suspend **{name}**? This will stop the server and prevent it from starting. All running processes will be stopped and the user will not be able to access their files or otherwise manage the server through the panel or API." + } + }, + "unsuspend": { + "title": "Unsuspend", + "content": "This will unsuspend the server, allowing it to start again. The user will be able to access their files and otherwise manage the server through the panel or API.", + "button": "Unsuspend", + "toast": { + "unsuspended": "Server unsuspended." + }, + "modal": { + "title": "Confirm Server Unsuspension", + "content": "Are you sure you want to unsuspend **{name}**? This will allow the server to start again. The user will be able to access their files and otherwise manage the server through the panel or API." + } + }, + "clearState": { + "title": "Clear State", + "content": "This will clear the server state known by the panel.", + "button": "Clear State", + "toast": { + "cleared": "Server state cleared." + }, + "modal": { + "title": "Confirm Server State Clear", + "content": "Are you sure you want to clear the state of **{name}**? This will clear any known pending transfers and status failures, please make sure it is safe to do this before clicking without reason." + } + }, + "delete": { + "title": "Delete", + "content": "This will delete the server and all of its data. This action cannot be undone.", + "toast": { + "deleted": "Server deleted." + }, + "modal": { + "title": "Confirm Server Deletion", + "description": "You are about to delete **{name}**. Are you sure?", + "form": { + "deleteBackups": "Do you want to delete backups of this server?", + "confirmServerName": "Confirm Server Name", + "confirmServerNamePlaceholder": "Server Name" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "viewClient": { + "title": "View in Client Area" + } + } + }, + "nests": { + "title": "Nests", + "resourceName": "Nest", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Nest", + "titleUpdate": "Update Nest", + "modal": { + "delete": { + "title": "Confirm Nest Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": { + "deleteEggs": "Do you want to delete all eggs in this nest?" + } + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Eggs", + "resourceName": "Egg", + "dropzone": { + "title": "Drop some files here to import as Eggs", + "subtitle": "Release to start importing" + }, + "button": { + "updateFromRepository": "Update from Repository" + }, + "toast": { + "imported": "Egg imported.", + "moved": "Egg moved.", + "movedBulk": "{eggs} moved.", + "deletedBulk": "{eggs} deleted.", + "updatedFromRepository": "{eggs} updated using their respective repository egg successfully.", + "parseFailed": "Failed to parse egg: {error}" + }, + "modal": { + "move": { + "title": "Move Egg" + }, + "moveBulk": { + "title": "Move Eggs", + "confirm": "Move {eggs}" + }, + "deleteBulk": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete `{count}` eggs?" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg", + "titleUpdate": "Update Egg", + "card": { + "startupConfiguration": "Startup Configuration", + "stopConfiguration": "Stop Configuration", + "configFiles": "Config Files Configuration" + }, + "form": { + "eggRepository": "Egg Repository", + "eggRepositoryEgg": "Egg Repository Egg", + "startupDone": "Startup Done", + "startupDoneDescription": "Console message indicating startup completion.", + "stripAnsi": "Strip ANSI from startup messages", + "stripAnsiDescription": "Removes ANSI control characters from the console output before matching startup completion.", + "stopType": "Stop Type", + "stopCommand": "Stop Command", + "stopSignal": "Stop Signal", + "parser": "Parser", + "createNewFile": "Create New File", + "createNewFileDescription": "If enabled, the file will be created if it does not exist. If disabled, the file must already exist or the replacement will fail.", + "match": "Match", + "ifValue": "If Value", + "replaceWith": "Replace With", + "insertNew": "Insert New", + "insertNewDescription": "If enabled, if no existing value matches the \"Match\" field, the \"Replace With\" value will be inserted into the file. If disabled, if no match is found, no changes will be made to the file.", + "updateExisting": "Update Existing", + "updateExistingDescription": "If enabled, if a match is found, it will be replaced with the \"Replace With\" value. If disabled, the replacement will only insert new values and will fail if a match is found.", + "startupCommands": "Startup Commands", + "forceOutgoingIp": "Force Outgoing IP", + "separatePort": "Separate IP and Port", + "separatePortDescription": "Separates the primary IP and port on the Console page instead of joining them with \":\".", + "features": "Features", + "featurePlaceholder": "Feature", + "fileDenylist": "File Deny List", + "dockerImages": "Docker Images" + }, + "enum": { + "stopType": { + "command": "Send Command", + "signal": "Send Signal", + "docker": "Docker Stop" + } + }, + "emptyConfigFiles": "No config files defined.", + "emptyReplacements": "No replacements defined.", + "button": { + "addReplacement": "Add Replacement", + "addConfigFile": "Add Config File", + "fromFile": "from File", + "fromRepository": "from Repository" + }, + "toast": { + "exported": "Egg exported.", + "updated": "Egg updated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "installationScript": { + "title": "Installation Script", + "page": { + "title": "Egg Installation Script", + "form": { + "container": "Installation Container", + "entrypoint": "Container Entrypoint" + }, + "toast": { + "updated": "Egg script updated." + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Egg Variables", + "form": { + "supportsMarkdown": "Supports Markdown formatting.", + "defaultValue": "Default Value", + "defaultValuePlaceholder": "server.jar", + "userViewable": "User Viewable", + "userEditable": "User Editable", + "secret": "Secret", + "rules": "Rules", + "rulesDescription": "See https://laravel.com/docs/12.x/validation#available-validation-rules for the available validation rules." + }, + "toast": { + "created": "Egg variable created.", + "updated": "Egg variable updated.", + "deleted": "Egg variable deleted.", + "duplicated": "Egg variable duplicated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Variable Removal", + "content": "Are you sure you want to remove **{variable}**?", + "emptyVariable": "this empty variable" + }, + "duplicate": { + "title": "Duplicate Egg Variable" + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Egg Mounts", + "toast": { + "added": "Egg Mount added.", + "deleted": "Egg Mount deleted." + }, + "modal": { + "add": { + "title": "Add Egg Mount" + }, + "delete": { + "title": "Confirm Egg Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{egg}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Egg Servers" + } + } + } + } + } + } + }, + "eggConfigurations": { + "title": "Egg Configurations", + "resourceName": "Egg Configuration", + "table": { + "columns": { + "order": "Order" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Configuration", + "titleUpdate": "Update Egg Configuration", + "form": { + "order": "Order", + "eggs": "Eggs", + "eggsPlaceholder": "Select Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." + }, + "enum": { + "deploymentType": { + "random": "Random", + "range": "Port Range", + "addPrimary": "Add to Primary", + "subtractPrimary": "Subtract from Primary", + "multiplyPrimary": "Multiply Primary", + "dividePrimary": "Divide Primary" + } + }, + "allocation": { + "title": "Allocation Configuration", + "form": { + "userSelfAssign": "User Self Assign", + "userSelfAssignDescription": "Allow users to create their own allocations from a specified port range.", + "requirePrimaryAllocation": "Require Primary Allocation", + "requirePrimaryAllocationDescription": "Whether users must always have a primary allocation.", + "automaticAllocationStart": "Automatic Allocation Start", + "automaticAllocationEnd": "Automatic Allocation End", + "dedicatedIp": "Dedicated IP", + "dedicatedIpDescription": "Assign a dedicated ip address for servers using this egg configuration.", + "primaryAllocation": "Primary Allocation", + "primaryAllocationDescription": "Configure a primary port assignment for deployment.", + "primaryStartPort": "Primary Start Port", + "primaryEndPort": "Primary End Port", + "assignToVariable": "Assign to Variable", + "assignToVariablePlaceholder": "e.g. SERVER_PORT", + "assignToVariableDescription": "Optional environment variable to receive the assigned primary port." + }, + "divider": { + "deployment": "Deployment" + }, + "additionalPorts": { + "title": "Additional Ports", + "button": "Add Rule", + "empty": "No additional port rules configured." + }, + "deployment": { + "form": { + "startPort": "Start Port", + "endPort": "End Port", + "assignToVariable": "Assign to Variable", + "assignToVariableDescription": "Optional environment variable to receive the assigned port from this rule.", + "assignToVariablePlaceholder": "e.g. SERVER_PORT" + }, + "removeRule": "Remove deployment rule" + } + }, + "startup": { + "title": "Startup Configuration", + "form": { + "allowCustomStartupCommand": "Allow Custom Startup Command", + "allowCustomStartupCommandDescription": "Allow users to set their own, non-predefined startup commands." + } + }, + "modal": { + "delete": { + "title": "Confirm Egg Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + } + } + }, + "eggRepositories": { + "title": "Egg Repositories", + "resourceName": "Egg Repository", + "table": { + "columns": { + "gitRepository": "Git Repository" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Repository", + "titleUpdate": "Update Egg Repository", + "form": { + "gitRepository": "Git Repository" + }, + "button": { + "sync": "Sync" + }, + "toast": { + "synced": "Egg repository synchronised, found {eggs}." + }, + "modal": { + "delete": { + "title": "Confirm Egg Repository Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Egg Repository Eggs", + "table": { + "columns": { + "path": "Path" + } + }, + "toast": { + "installed": "Egg installed.", + "installedBulk": "{eggs} installed." + }, + "modal": { + "install": { + "title": "Install Egg Repository Egg" + }, + "installBulk": { + "title": "Install Egg Repository Eggs", + "button": "Install {eggs}" + } + }, + "drawer": { + "noReadme": "This egg does not have a README." + } + } + } + } + }, + "databaseHosts": { + "title": "Database Hosts", + "resourceName": "Database host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Host", + "titleUpdate": "Update Database Host", + "form": { + "publicHost": "Public Host", + "publicPort": "Public Port", + "connectionCredentials": "Connection Credentials", + "credentialType": "Credential Type", + "connectionString": "Connection String", + "connectionStringPlaceholder": "mysql://username:password@host:port" + }, + "enum": { + "credentialType": { + "connectionString": "Connection String", + "details": "Details" + } + }, + "button": { + "testConnection": "Test Connection" + }, + "toast": { + "tested": "Test successfully completed." + }, + "modal": { + "delete": { + "title": "Confirm Database Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "databases": { + "title": "Databases", + "page": { + "title": "Database Host Databases", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } + } + } + } + }, + "oAuthProviders": { + "title": "OAuth Providers", + "resourceName": "OAuth Provider", + "dropzone": { + "title": "Drop some files here to import as OAuth Providers", + "subtitle": "Release to start importing" + }, + "table": { + "columns": { + "loginOnly": "Login Only", + "linkViewable": "Link Viewable", + "userManageable": "User Manageable" + } + }, + "toast": { + "imported": "OAuth Provider imported.", + "parseFailed": "Failed to parse OAuth provider: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create OAuth Provider", + "titleUpdate": "Update OAuth Provider", + "card": { + "redirectUrl": { + "title": "Redirect URL", + "unavailable": "Available after creation" + } + }, + "form": { + "clientId": "Client Id", + "clientSecret": "Client Secret", + "authUrl": "Auth URL", + "tokenUrl": "Token URL", + "infoUrl": "Info URL", + "basicAuth": "Basic Auth", + "basicAuthDescription": "Uses HTTP Basic Authentication to transmit the client id and secret, not common anymore.", + "scopes": "Scopes", + "scopesDescription": "The OAuth2 scopes to request, make sure to include scopes for email and profile info when needed.", + "identifierPath": "Identifier Path", + "identifierPathDescription": "The path used to extract the unique user identifier from the Info URL response (https://serdejsonpath.live).", + "emailPath": "Email Path", + "emailPathDescription": "The path used to extract the email from the Info URL response (https://serdejsonpath.live).", + "usernamePath": "Username Path", + "usernamePathDescription": "The path used to extract the username from the Info URL response (https://serdejsonpath.live).", + "nameFirstPath": "First Name Path", + "nameFirstPathPlaceholder": "First Name URL", + "nameFirstPathDescription": "The path used to extract the first name from the Info URL response (https://serdejsonpath.live).", + "nameLastPath": "Last Name Path", + "nameLastPathDescription": "The path used to extract the last name from the Info URL response (https://serdejsonpath.live).", + "loginOnly": "Only allow Login", + "loginBypass2fa": "Bypass 2FA on Login", + "loginBypass2faDescription": "Allows users logging in with this provider to bypass their panel 2FA.", + "linkViewable": "Link Viewable to User", + "linkViewableDescription": "Allows the user to see the connection and its identifier in the client UI.", + "userManageable": "Link Manageable by User", + "userManageableDescription": "Allows the user to connect and disconnect with this provider." + }, + "toast": { + "exported": "OAuth Provider exported." + }, + "modal": { + "delete": { + "title": "Confirm OAuth Provider Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "mappings": { + "title": "Mappings", + "page": { + "title": "OAuth Provider Mappings", + "table": { + "columns": { + "matcher": "Matcher" + } + }, + "enum": { + "mappingType": { + "role": "Role", + "serverSubuser": "Server Subuser" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" + } + }, + "toast": { + "created": "OAuth provider mapping created.", + "updated": "OAuth provider mapping updated.", + "deleted": "OAuth provider mapping deleted." + }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, + "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", + "scopesDescription": "OAuth scopes that must all have been granted for this matcher to match.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", + "mappingType": "Mapping Type", + "role": "Role", + "permissions": "Permissions" + }, + "modal": { + "add": { + "title": "Add OAuth Provider Mapping" + }, + "edit": { + "title": "Edit OAuth Provider Mapping" + }, + "delete": { + "title": "Delete OAuth Provider Mapping", + "content": "Are you sure you want to delete this mapping? This action cannot be undone." + } + } + } + }, + "users": { + "title": "Users", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, + "page": { + "title": "OAuth Provider Users", + "table": { + "columns": { + "user": "User" + } + } + } + } + } + }, + "backupConfigurations": { + "title": "Backup Configurations", + "resourceName": "Backup configuration", + "table": { + "columns": { + "disk": "Disk" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Backup Configuration", + "titleUpdate": "Update Backup Configuration", + "alert": { + "ddupBak": "Ddup-Bak is Technology Preview software, it is technically not recommended for production use. If you acknowledge, sail ahead as you wish.", + "btrfs": "Btrfs requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "zfs": "ZFS requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "pbs": "The provided API token needs the following datastore ACLs: **DatastoreAudit** for usage and listing, **DatastoreBackup** for writing backups, and **DatastoreAdmin** (or equivalent prune/delete permissions) if backup deletion or pruning is enabled." + }, + "form": { + "backupDisk": "Backup Disk", + "maintenanceEnabledDescription": "If enabled, any server using this backup configuration will not be able to create new backups, or manage existing ones.", + "shared": "Shared", + "sharedDescription": "If enabled, backups on this backup configuration will not be transferred between nodes, they will be assumed to be accessible by all nodes." + }, + "modal": { + "delete": { + "title": "Confirm Backup Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "s3": { + "title": "S3 Settings", + "form": { + "partSize": "Part Size", + "compressionType": "Compression Type", + "pathStyle": "Using path-style URLs" + } + }, + "restic": { + "title": "Restic Settings", + "form": { + "repository": "Repository", + "retryLockSeconds": "Retry Lock Seconds", + "environmentVariables": "Environment Variables", + "cronSchedule": "Cron Schedule", + "cronScheduleDescription": "Format: second minute hour day month weekday.", + "nodes": "Nodes", + "nodesPlaceholder": "Select nodes" + }, + "pruneJobs": { + "title": "Prune Jobs", + "description": "Scheduled restic prune runs. Each job runs on the configured nodes following its cron schedule.", + "button": { + "add": "Add Prune Job" + } + } + }, + "pbs": { + "title": "Proxmox Backup Server Settings", + "form": { + "url": "Server URL", + "datastore": "Datastore", + "namespace": "Namespace", + "tokenId": "Token ID", + "tokenSecret": "Token Secret", + "fingerprint": "TLS Certificate Fingerprint", + "backupIdPrefix": "Backup ID Prefix" + } + }, + "kopia": { + "title": "Kopia Settings", + "form": { + "url": "Kopia Server URL", + "fingerprint": "TLS Certificate Fingerprint", + "tags": "Backup Tags" + } + } + } + }, + "stats": { + "title": "Stats", + "page": { + "title": "Backup Configuration Stats", + "card": { + "title": "Backup Statistics" + }, + "period": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month" + }, + "periodLabel": { + "allTime": "all time", + "today": "today", + "week": "this week", + "month": "this month" + }, + "stat": { + "total": "Total backups {period}", + "successful": "Successful backups {period}", + "failed": "Failed backups {period}", + "deleted": "Deleted backups {period}" + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Backup Configuration Backups", + "toast": { + "downloadStarted": "Download started." + } + } + }, + "locations": { + "title": "Locations", + "page": { + "title": "Backup Configuration Locations" + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Backup Configuration Nodes" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Backup Configuration Servers" + } + } + } + }, + "mounts": { + "title": "Mounts", + "resourceName": "Mount", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Mount", + "titleUpdate": "Update Mount", + "alert": "Mounts are a powerful and potentially dangerous feature. Improper use can lead to data loss or security vulnerabilities (including container escapes). Make sure you understand the implications of using mounts before creating or updating them.", + "form": { + "source": "Source", + "target": "Target", + "readOnly": "Read Only", + "userMountable": "User Mountable" + }, + "modal": { + "delete": { + "title": "Confirm Mount Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Mount Eggs", + "toast": { + "added": "Mount Egg added.", + "removed": "Mount Egg deleted." + }, + "modal": { + "add": { + "title": "Add Mount Egg", + "form": { + "egg": "Egg" + } + }, + "remove": { + "title": "Confirm Mount Egg Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Mount Nodes", + "toast": { + "added": "Mount Node added.", + "removed": "Mount Node deleted." + }, + "modal": { + "add": { + "title": "Add Mount Node" + }, + "remove": { + "title": "Confirm Mount Node Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Mount Servers" + } + } + } + }, + "roles": { + "title": "Roles", + "resourceName": "Role", + "table": { + "columns": { + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Role", + "titleUpdate": "Update Role", + "alert": { + "impersonate": "This role has the `users.impersonate` permission, which allows users with this role to impersonate any other user, including administrators. Be cautious when assigning this permission to roles with less trusted users." + }, + "form": { + "requireTwoFactor": "Require Two Factor", + "requireTwoFactorDescription": "Require users with this role to use two factor authentication.", + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + }, + "modal": { + "delete": { + "title": "Confirm Role Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "users": { + "title": "Users", + "page": { + "title": "Role Users" + } + } + } + }, + "activity": { + "title": "Activity" + } + }, + "server": { + "viewAdmin": { + "title": "View in Admin Area" + }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, + "console": { + "title": "Console", + "input": { + "placeholder": "Digita un comando...", + "ariaLabel": "Campo di input comandi console." + }, + "toast": { + "installCancelled": "Server install cancelled.", + "transferCancelled": "Server transfer cancelled." + }, + "modal": { + "sshDetails": { + "title": "SSH Details", + "form": { + "command": "SSH Command" + }, + "launch": "Launch" + } + }, + "notification": { + "suspended": "Your Server is currently suspended. No actions can be performed until the suspension is lifted.", + "suspendedAdmin": "This server is currently suspended. Since you are an administrator, you can still access the server, but actions are limited.", + "nodeMaintenance": "Your Server is on a node that is currently under maintenance.", + "transferring": "Your Server is currently being transferred to another node.", + "restoringBackup": "Your Server is currently restoring from a backup. Please wait...", + "installing": "Your Server is currently being installed. Please wait...", + "pendingRestart": "Your Server has pending changes that require a restart. Please restart your server to apply these changes." + }, + "message": { + "serverMarkedAs": "Server contrassegnato come {state}...", + "installFailed": "Installation has failed.", + "installCompleted": "Installation has completed successfully.", + "transferFailed": "Il trasferimento è fallito.", + "transferCompleted": "Transfer has completed successfully. Reconnecting to server...", + "pullingImage": "Il tuo server sta attualmente scaricando la sua immagine docker. Attendere prego...", + "pulling": "Download", + "extracting": "Estrazione" + }, + "tooltip": { + "search": "Search", + "sshDetails": "SSH Details", + "commandHistory": "Command History", + "decreaseFontSize": "Decrease Font Size", + "increaseFontSize": "Increase Font Size" + }, + "drawer": { + "commandHistory": { + "title": "Command History", + "detailTitle": "Command Details", + "noCommands": "No commands found.", + "copyButton": "Copy Command", + "sendButton": "Send Command", + "commandSent": "Command sent successfully." + } + }, + "feature": { + "eula": { + "title": "Minecraft EULA Agreement", + "content": "The Minecraft server requires you to accept the [Minecraft End User License Agreement](https://minecraft.net/eula) before it can start.", + "contentDetails": "By clicking \"Accept EULA\", you agree to the terms of the Minecraft EULA and the **eula.txt** file will be updated to **eula=true**.", + "toast": { + "accepted": "EULA accepted successfully." + }, + "button": { + "accept": "Accept EULA" + } + }, + "javaVersion": { + "title": "Unsupported Java Version", + "content": "This server is currently running an unsupported version of Java and cannot be started.", + "contentDetails": "Please select a supported Docker image from the list below to continue starting the server.", + "toast": { + "updated": "Docker image updated successfully." + }, + "button": { + "update": "Update Docker Image" + } + } + }, + "details": { + "address": "Indirizzo", + "port": "Porta", + "uptime": "Uptime", + "cpuLoad": "Carico CPU", + "memoryLoad": "Carico memoria", + "diskUsage": "Utilizzo disco", + "networkIn": "Rete (In)", + "networkOut": "Rete (Out)", + "normalizeCpuLoad": "Normalizza carico CPU (spostato al massimo 100%)" + }, + "power": { + "modal": { + "forceStop": { + "title": "Termina forzatamente processo", + "content": "Terminare forzatamente un server può causare corruzione dei dati." + } + } + }, + "stats": { + "cpuLoad": "Carico CPU", + "memoryLoad": "Carico memoria", + "network": "Rete", + "inbound": "In entrata", + "outbound": "In uscita" + }, + "socketConnected": "Connected ({ping}ms ping)", + "socketDisconnected": "Disconnected" + }, + "files": { + "title": "Files", + "titleEditorViewing": "Viewing {file}", + "titleEditorPlaying": "Playing {file}", + "titleEditorEditing": "Editing {file}", + "titleEditorNew": "New File", + "titleDiffRevisionVsCurrent": "{file} - Revision #{revision} vs Current", + "titleDiffRevisionVsRevision": "{file} - Revision #{previousRevision} vs #{revision}", + "table": { + "columns": { + "modified": "Modified" + } + }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, + "button": { + "new": "New", + "connect": "Connect", + "connectSftp": "via SFTP", + "connectVscode": "via VS Code", + "openInNewWindow": "Open in new Window", + "rename": "Rename", + "copy": "Copy", + "fingerprint": "Fingerprint", + "permissions": "Permissions", + "unarchive": "Unarchive", + "archive": "Archive", + "more": "More", + "remoteCopy": "Remote Copy", + "search": "Search", + "exitBackup": "Exit Backup", + "fileFromEditor": "File from Editor", + "directory": "Directory", + "fileFromPull": "File from Pull", + "fileFromUpload": "File from Upload", + "directoryFromUpload": "Directory from Upload" + }, + "actionBar": { + "copyHere": "Copy {files} here", + "moveHere": "Move {files} here" + }, + "searchBanner": { + "resultsTitle": "Search Results ({files} found)", + "query": "Query:", + "excluded": "Excluded:", + "content": "Content:", + "size": "Size:", + "min": "Min:", + "max": "Max:" + }, + "operations": { + "compressing": "Compressing {files} from {path}", + "decompressing": "Decompressing {path}", + "pulling": "Pulling {destination}", + "copying": "Copying {path} to {destination}", + "copyingMany": "Copying {files}", + "receivingRemote": "Receiving {files} from remote server", + "sendingRemote": "Sending {files} to remote server", + "exportingBackup": "Exporting backup to {destination}", + "cancelAllOperations": "Cancel all operations" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" + }, + "settings": { + "clickOnce": "Click once to open file or folder", + "preferPhysicalSize": "Show physical size instead of logical size", + "editorMinimap": "Show File Minimap", + "editorLineOverflow": "Wrap Line Overflow", + "editorFontSize": "Editor Font Size", + "vscodeUriScheme": "VS Code URI Scheme", + "imageViewerSmoothing": "Smoothen Image (Anti-Aliasing)" + }, + "toast": { + "operationCancelled": "Operation cancelled", + "allOperationsCancelled": "All operations have been cancelled.", + "copyingStarted": "{files} started copying.", + "filesCouldNotBeMoved": "Files could not be moved.", + "filesMoved": "{files} moved.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", + "downloadStarted": "Download started.", + "filesDeleted": "Files have been deleted.", + "archiveCreationStarted": "Archive creation has begun.", + "fileCopyingStarted": "File copying has started.", + "fileInfoRetrieved": "File information retrieved successfully.", + "filePullingStarted": "File pulling has started.", + "fileRenamed": "File has been renamed.", + "fileCouldNotBeRenamed": "File could not be renamed.", + "filesRenamed": "{files} renamed.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", + "permissionsUpdated": "Permissions have been updated.", + "permissionsUpdatedMany": "Permissions have been updated for {files}.", + "permissionsCouldNotBeUpdated": "Permissions could not be updated.", + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "File has been saved.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." + }, + "tooltip": { + "fileHistory": "File History", + "collabEditing": "{user} is editing this file", + "largestDirectories": "Analyze directory sizes", + "dragToMove": "Drag to move", + "back": "Back {seconds} seconds", + "forward": "Forward {seconds} seconds", + "play": "Play", + "pause": "Pause", + "mute": "Mute", + "unmute": "Unmute" + }, + "drawer": { + "revisions": { + "title": "File History", + "noRevisions": "No revisions found for this file.", + "restored": "Revision restored into editor.", + "badge": { + "fullSnapshot": "Full Snapshot" + }, + "tooltip": { + "restore": "Restore this revision into the editor", + "viewDiff": "View diff against current file", + "compareToPrevious": "Compare to previous revision" + }, + "diff": { + "original": "Revision", + "current": "Current" + } + } + }, + "modal": { + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes in the file editor. Are you sure you want to leave this page? If you leave, your changes will be lost." + }, + "draftRestore": { + "title": "Restore Draft", + "content": "A draft of this file was found in your browser. Would you like to restore it?", + "contentHashMismatch": "The file has been modified on the server since this draft was saved. Restoring the draft may overwrite those changes." + }, + "createArchive": { + "title": "Create Archive", + "form": { + "format": "Format" + }, + "createdAs": "This archive will be created as " + }, + "createDirectory": { + "title": "Create Directory", + "createdAs": "This directory will be created as " + }, + "copyFile": { + "title": "Copy File", + "createdAs": "This file will be created as " + }, + "copyRemote": { + "title": "Remote Copy Files", + "form": { + "server": "Server" + }, + "createdAs": "These files will be created on the remote server under " + }, + "fileFingerprints": { + "title": "File Fingerprint", + "form": { + "algorithm": "Algorithm", + "fingerprint": "Fingerprint" + }, + "button": { + "calculate": "Calculate Fingerprint" + } + }, + "deleteFile": { + "title": "Delete File", + "singleFileWarning": "You will not be able to recover the contents of {file} once deleted.", + "multipleFilesWarning": "You will not be able to recover the contents of the following files once deleted." + }, + "createFile": { + "title": "Create File" + }, + "details": { + "title": "File Details", + "path": "Path", + "mode": "Mode", + "logicalSize": "Logical Size", + "physicalSize": "Physical Size", + "mimeType": "MIME Type", + "lastModifiedAt": "Last Modified At", + "createdAt": "Created At" + }, + "filePermissions": { + "title": "File Permissions", + "form": { + "recursive": "Apply changes recursively to all files and subdirectories within this directory" + }, + "symbolic": "Symbolic:", + "octal": "Octal:", + "owner": "Owner", + "group": "Group", + "other": "Other", + "breakdown": "Permission Breakdown", + "readPermission": "Read permission (4)", + "writePermission": "Write permission (2)", + "executePermission": "Execute permission (1)" + }, + "renameFile": { + "title": "Rename File" + }, + "massRename": { + "title": "Rename Files", + "find": "Find", + "findPlaceholder": "Text to find", + "replace": "Replace with", + "replacePlaceholder": "Replacement text", + "scope": "Apply to", + "scopeName": "Name", + "scopeExtension": "Extension", + "scopeFull": "Full name", + "section": { + "matchOptions": "Match options", + "affixes": "Prefix & suffix", + "caseConversion": "Case conversion", + "numbering": "Numbering" + }, + "affix": { + "prefix": "Prefix", + "suffix": "Suffix", + "help": "Both may include {token} for the number; a suffix appends a count to every name." + }, + "option": { + "regex": "Use regular expression", + "regexDescription": "Treat the find text as a regex; reference groups with $1, $2 in the replacement.", + "caseSensitive": "Case sensitive", + "allOccurrences": "Replace all occurrences" + }, + "case": { + "label": "Convert case", + "none": "No change", + "lower": "lowercase", + "upper": "UPPERCASE", + "title": "Title Case", + "capitalize": "Capitalize" + }, + "numbering": { + "enable": "Enable numbering", + "help": "Insert {token} in the find, replace, prefix, or suffix text where the number should appear.", + "start": "Start at", + "step": "Step", + "padding": "Minimum digits" + }, + "preview": { + "title": "Preview", + "original": "Original", + "newName": "New name", + "unchanged": "Unchanged", + "conflict": "Name already in use", + "duplicate": "Duplicate target", + "invalid": "Invalid name", + "invalidRegex": "Invalid regular expression", + "empty": "No files selected." + }, + "summary": "{changed} of {total} will be renamed", + "conflictWarning": "Resolve the highlighted name conflicts before renaming." + }, + "largestDirectories": { + "title": "Largest Directories", + "empty": "No directories found." + }, + "searchFiles": { + "title": "Search Files", + "placeholder": "Search for files...", + "advancedFilters": "Advanced Filters", + "pathPatterns": "Path Patterns", + "include": "Include", + "exclude": "Exclude", + "caseInsensitive": "Case insensitive", + "fileContent": "File Content", + "searchText": "Search text", + "maxFileSize": "Max file size", + "includeOversized": "Include oversized files", + "includeOversizedDescription": "Includes files that match other filters but are too large to search.", + "fileSize": "File Size", + "minimum": "Minimum", + "maximum": "Maximum" + }, + "pullFile": { + "title": "Pull File", + "form": { + "fileUrl": "File URL", + "query": "Query" + }, + "createdAs": "This file will be created as ", + "pull": "Pull" + }, + "sftpDetails": { + "title": "SFTP Details", + "launch": "Launch" + } + } }, "databases": { "title": "Database", "subtitle": "{current} di {max} database massimi creati.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Questo server è limitato a {max} database." }, @@ -572,12 +4370,171 @@ "locked": "Bloccato?" } }, - "button": { - "rotatePassword": "Ruota password" - }, - "form": { - "databaseName": "Nome database" - }, + "button": { + "rotatePassword": "Ruota password" + }, + "form": { + "databaseName": "Nome database" + }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Crea database", @@ -585,7 +4542,8 @@ "created": "Database creato." }, "form": { - "noHostsFound": "Nessun host trovato" + "noHostsFound": "Nessun host trovato", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -603,6 +4561,13 @@ "jdbcConnectionString": "Stringa di connessione JDBC" } }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new one with the same connection details.", + "toast": { + "recreated": "Database recreated." + } + }, "deleteDatabase": { "title": "Conferma eliminazione database", "content": "Eliminare un database è un'azione permanente, non può essere annullata. Questo eliminerà permanentemente il database **{name}** e rimuoverà tutti i dati associati.", @@ -612,8 +4577,595 @@ } } }, + "schedules": { + "title": "Schedules", + "subtitle": "{current} of {max} maximum schedules created.", + "dropzone": { + "title": "Drop some files here to import them as Schedules", + "subtitle": "Release to start importing" + }, + "tooltip": { + "limitReached": "This server is limited to {max} schedules." + }, + "table": { + "columns": { + "lastRun": "Last Run", + "lastFailure": "Last Failure", + "status": "Status" + } + }, + "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", + "addTrigger": "Add Trigger", + "addCondition": "Add Condition", + "addStep": "Add Step", + "addElseIf": "Add Else If", + "addElse": "Add Else", + "createFirstStep": "Create First Step", + "addOutput": "Add Output", + "addFile": "Add File", + "exitEditor": "Exit Editor" + }, + "toast": { + "imported": "Schedule imported.", + "created": "Schedule created.", + "updated": "Schedule updated.", + "duplicated": "Schedule duplicated.", + "deleted": "Schedule deleted.", + "triggered": "Schedule triggered.", + "exported": "Schedule exported.", + "parseError": "Failed to parse schedule: {error}", + "step": { + "created": "Schedule step created.", + "updated": "Schedule step updated.", + "duplicated": "Schedule step duplicated.", + "deleted": "Schedule step deleted." + } + }, + "enum": { + "scheduleConditionType": { + "none": "None", + "and": "AND (All must be true)", + "or": "OR (Any must be true)", + "not": "NOT (Must not be true)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", + "variableExists": "Variable Exists", + "variableContains": "Variable Contains", + "variableEquals": "Variable Equals", + "variableStartsWith": "Variable Starts With", + "variableEndsWith": "Variable Ends With" + }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, + "scheduleComparator": { + "smallerThan": "Smaller than", + "smallerThanOrEqual": "Smaller than or equal to", + "equal": "Equal to", + "greaterThanOrEqual": "Greater than or equal to", + "greaterThan": "Greater than" + } + }, + "modal": { + "createSchedule": { + "title": "Create Schedule" + }, + "updateSchedule": { + "title": "Update Schedule" + }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, + "deleteSchedule": { + "title": "Confirm Schedule Deletion", + "content": "Are you sure you want to delete {name} from this server?" + }, + "createStep": { + "title": "Create Schedule Step" + }, + "editStep": { + "title": "Edit Schedule Step" + }, + "deleteStep": { + "title": "Confirm Schedule Step Deletion", + "content": "Are you sure you want to delete this schedule step?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." + } + }, + "view": { + "badge": { + "running": "Running" + }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, + "tabs": { + "actions": "Actions", + "conditions": "Conditions", + "triggers": "Triggers" + }, + "sections": { + "actions": "Schedule Actions", + "preConditions": "Schedule Pre-Conditions", + "triggers": "Schedule Triggers" + }, + "alert": { + "noActions": "No actions configured for this schedule", + "noTriggers": "No triggers configured for this schedule" + } + }, + "form": { + "scheduleName": "Schedule Name", + "triggersList": "Triggers", + "triggerNumber": "Trigger {number}", + "actionType": "Action Type", + "conditionType": "Condition Type", + "serverState": "Server State", + "comparator": "Comparator", + "rootPath": "Root Path", + "outputInto": "Output into", + "caseInsensitive": "Case Insensitive", + "ignoreFailure": "Ignore Failure", + "runInForeground": "Run in Foreground" + }, + "condition": { + "variable": "Variable", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "metric": "Metric", + "allMustBeTrue": "All conditions must be true:", + "anyMustBeTrue": "Any condition must be true:", + "mustNotBeTrue": "Condition must not be true:" + }, + "preCondition": { + "valueSeconds": "Value (seconds)", + "valuePercent": "Value (%)", + "value": "Value" + }, + "triggers": { + "cron": { + "title": "Time Interval (Cron)", + "form": { + "cronSchedule": "Cron Schedule", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" + }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" + }, + "timezoneHint": "Times use the server timezone ({timezone}).", + "card": { + "content": "On Cron Interval {schedule}, Next run is {timestamp} - Last run was {lastTimestamp}." + }, + "invalidCron": "Invalid cron expression" + }, + "powerAction": { + "title": "Power Action", + "card": { + "content": "When Power Action `{action}` is requested." + } + }, + "serverState": { + "title": "Server State", + "card": { + "content": "When Server State `{state}` is reached." + } + }, + "backupStatus": { + "title": "Backup Status", + "form": { + "backupStatus": "Backup Status" + }, + "card": { + "content": "When Backup reaches Status `{status}`." + } + }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, + "consoleLine": { + "title": "Console Line", + "card": { + "content": "When Console Output reaches line that contains `{contains}`" + } + }, + "crash": { + "title": "Crash", + "card": { + "content": "When Server crashes." + } + } + }, + "renderer": { + "noActionSelected": "Select an action type to configure", + "noActionDetails": "Action details not available", + "ignoreFailure": "Ignore Failure: {value}", + "foreground": "Foreground: {value}" + }, + "steps": { + "empty": { + "title": "No Steps Configured", + "description": "This schedule doesn't have any steps yet. Add some actions to get started." + }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, + "sleep": { + "title": "Sleep", + "description": "Wait for a set amount of time before continuing with the next action.", + "form": { + "duration": "Duration (milliseconds)" + }, + "renderer": { + "compact": "Sleep for {duration}ms" + } + }, + "ensure": { + "title": "Ensure", + "description": "Stop the schedule here unless a condition is true.", + "renderer": { + "compact": "Ensure a condition matches" + } + }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, + "format": { + "title": "Format", + "description": "Build a text value from variables and store it in a variable.", + "form": { + "formatString": "Format String", + "formatStringDescription": "The format string. Variables can be included by wrapping them inside {wrapper}." + }, + "renderer": { + "compact": "Format a string into {outputInto}" + } + }, + "matchRegex": { + "title": "Match Regex", + "description": "Extract parts of a text value using a regular expression.", + "form": { + "input": "Input", + "regex": "Regex", + "outputs": "Outputs", + "outputNumber": "Output {number}" + }, + "renderer": { + "compact": "Match {input} with regex {regex}" + } + }, + "waitForConsoleLine": { + "title": "Wait for Console Line", + "description": "Wait until the server console outputs a matching line.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for console line containing {contains}", + "detail": { + "lineContains": "Line must contain: {contains}", + "caseInsensitive": "Case insensitive: {value}", + "timeout": "Timeout: {timeout}" + } + } + }, + "sendCommand": { + "title": "Send Command", + "description": "Send a command to the server console.", + "renderer": { + "compact": "Run {command}", + "detail": { + "command": "Command: {command}" + } + } + }, + "sendPower": { + "title": "Send Power Signal", + "description": "Start, restart, stop or kill the server.", + "renderer": { + "compact": "Do {action}", + "detail": { + "powerAction": "Power Action: {action}" + } + } + }, + "createBackup": { + "title": "Create Backup", + "description": "Create a backup of the server files.", + "form": { + "backupName": "Backup Name" + }, + "renderer": { + "compact": "Create {name}", + "compactAuto": "Create a backup with an auto-generated name", + "detail": { + "backupName": "Backup Name: {name}", + "backupNameAuto": "Backup Name: Auto-generated", + "ignoredFiles": "Ignored Files: {files}" + } + } + }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, + "createDirectory": { + "title": "Create Directory", + "description": "Create a new folder in the server files.", + "renderer": { + "compact": "Create {name} in {root}", + "detail": { + "directory": "Directory: {name}", + "root": "Root: {root}" + } + } + }, + "writeFile": { + "title": "Write File", + "description": "Write or append text to a file.", + "form": { + "content": "Content", + "appendToFile": "Append to File" + }, + "renderer": { + "compact": "Write to {file}", + "detail": { + "file": "File: {file}", + "append": "Append: {value}" + } + } + }, + "copyFile": { + "title": "Copy File", + "description": "Copy a file to a new location.", + "form": { + "sourceFile": "Source File" + }, + "renderer": { + "compact": "Copy {file} to {destination}", + "detail": { + "from": "From: {file}", + "to": "To: {destination}" + } + } + }, + "deleteFiles": { + "title": "Delete Files", + "description": "Delete files or folders.", + "form": { + "filesToDelete": "Files to Delete" + }, + "renderer": { + "compact": "Delete {files}", + "detail": { + "root": "Root: {root}", + "files": "Files: {files}" + } + } + }, + "renameFiles": { + "title": "Rename Files", + "description": "Rename or move files.", + "form": { + "files": "Files", + "from": "from", + "to": "to" + }, + "renderer": { + "compact": "Rename {files}", + "detail": { + "root": "Root: {root}", + "files": "Files: {files}" + } + } + }, + "compressFiles": { + "title": "Compress Files", + "description": "Compress files into an archive.", + "form": { + "filesToCompress": "Files to Compress" + }, + "renderer": { + "compact": "Compress {files} in {root} to {name}", + "detail": { + "output": "Output: {name}", + "root": "Root: {root}", + "format": "Format: {format}", + "files": "Files: {files}" + } + } + }, + "decompressFile": { + "title": "Decompress File", + "description": "Extract an archive into a folder.", + "form": { + "file": "File" + }, + "renderer": { + "compact": "Decompress {file} to {root}", + "detail": { + "file": "File: {file}", + "root": "Root: {root}" + } + } + }, + "updateStartupVariable": { + "title": "Update Startup Variable", + "description": "Change the value of a startup variable.", + "renderer": { + "compact": "Set {variable} to {value}", + "detail": { + "variable": "Variable: {variable}", + "value": "Value: {value}" + } + } + }, + "updateStartupCommand": { + "title": "Update Startup Command", + "description": "Change the command used to start the server.", + "renderer": { + "compact": "Set to {command}", + "detail": { + "command": "Command: {command}" + } + } + }, + "updateStartupDockerImage": { + "title": "Update Docker Image", + "description": "Change the Docker image the server runs in.", + "renderer": { + "compact": "Set to {image}", + "detail": { + "image": "Image: {image}" + } + } + } + } + }, "subusers": { "title": "Sottoutenti", + "subtitle": "{current} of {max} maximum subusers created.", + "tooltip": { + "limitReached": "This server is limited to {max} subusers." + }, "table": { "columns": { "twoFactorEnabled": "2FA abilitato", @@ -629,7 +5181,8 @@ }, "form": { "emailPlaceholder": "Inserisci l'email con cui salvare questo sottoutente.", - "permissions": "Permessi" + "permissions": "Permessi", + "ignoredFilesDescription": "Files and directories matching these patterns will be hidden from this subuser. Uses gitignore-style glob patterns (e.g. `*.env`, `secrets/`). Prefix a pattern with `!` to un-hide a path that a broader pattern would otherwise exclude." } }, "updateSubuser": { @@ -660,16 +5213,25 @@ "locked": "Bloccato?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Sfoglia" + "browse": "Sfoglia", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "Download avviato.", - "restoringBackup": "Ripristino backup..." + "restoringBackup": "Ripristino backup...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Crea backup", + "noGroup": "No group", "toast": { "created": "Backup creato." } @@ -683,13 +5245,61 @@ "restoreBackup": { "title": "Ripristina backup" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Conferma eliminazione backup", "content": "Sei sicuro di voler eliminare **{name}** da questo server?", "toast": { + "started": "Backup deletion started.", "deleted": "Backup eliminato." } + }, + "viewMetadata": { + "title": "Backup Metadata" + } + } + }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." } }, "network": { @@ -730,10 +5340,56 @@ "startupCommandUpdated": "Comando di avvio aggiornato.", "dockerImageUpdated": "Immagine Docker aggiornata.", "variablesUpdated": "Variabili aggiornate." + }, + "modal": { + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your startup variables. Are you sure you want to leave this page? If you leave, your changes will be lost." + } + }, + "noVariables": "No startup variables found for this server.", + "predefinedStartupCommands": "Predefined Startup Commands" + }, + "mounts": { + "title": "Mounts", + "table": { + "columns": { + "target": "Target", + "mounted": "Mounted", + "readOnly": "Read Only" + } + }, + "button": { + "attach": "Attach", + "detach": "Detach" + }, + "modal": { + "attachMount": { + "title": "Attach Mount", + "content": "Do you want to attach **{name}** to `{target}`?", + "toast": { + "attached": "{name} has been mounted to your server." + } + }, + "detachMount": { + "title": "Detach Mount", + "content": "Do you want to detach **{name}** from `{target}`?", + "toast": { + "detached": "{name} has been removed from your server." + } + } } }, "settings": { "title": "Impostazioni", + "debugInformation": { + "title": "Debug Information", + "form": { + "nodeName": "Node (UUID)", + "locationName": "Location (UUID)", + "serverUuid": "Server UUID" + } + }, "rename": { "title": "Rinomina server", "toast": { @@ -755,9 +5411,19 @@ "updated": "Auto-kill del server aggiornato." } }, + "autostart": { + "title": "Auto-Start", + "form": { + "behavior": "Behavior" + }, + "toast": { + "updated": "Server auto-start behavior updated." + } + }, "reinstall": { "title": "Reinstalla server", "button": "Reinstalla server", + "content": "Reinstalling your server will stop it, and then re-run the installation script that initially set it up. **Some files may be deleted or modified during this process, please back up your data before continuing.**", "modal": { "title": "Reinstalla server", "button": "Reinstalla", @@ -768,7 +5434,10 @@ } }, "activity": { - "title": "Attività" + "title": "Attività", + "button": { + "clearUserFilter": "Clear User Filter" + } } } } diff --git a/frontend/public/translations/nl.json b/frontend/public/translations/nl.json index 12d1422f5..543a4dadd 100644 --- a/frontend/public/translations/nl.json +++ b/frontend/public/translations/nl.json @@ -56,6 +56,14 @@ "many": "{count} Nodes", "other": "{count} Nodes" }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, "allocation": { "zero": "{count} Node Allocations", "one": "{count} Node Allocation", @@ -72,6 +80,14 @@ "many": "{count} Eggs", "other": "{count} Eggs" }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, "shortcut": { "zero": "{count} Shortcuts", "one": "{count} Shortcut", @@ -87,6 +103,22 @@ "few": "{count} Lines", "many": "{count} Lines", "other": "{count} Lines" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -97,6 +129,7 @@ "save": "Opslaan", "saveAndStay": "Opslaan & Blijven", "edit": "Bewerken", + "duplicate": "Duplicate", "delete": "Verwijderen", "remove": "Verwijderen", "enable": "Inschakelen", @@ -133,7 +166,8 @@ "setPrimary": "Instellen als primair", "unsetPrimary": "Primair verwijderen", "leavePage": "Pagina verlaten", - "viewDocumentation": "View Documentation" + "viewDocumentation": "View Documentation", + "undo": "Undo" }, "alert": { "error": "Fout", @@ -147,6 +181,31 @@ "input": { "search": "Zoeken..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "Herstellen naar standaard", "edit": "Bewerken", @@ -156,7 +215,9 @@ "backupOnDifferentNode": "This backup is on a different node than the server. It is not viewable from the Client API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Naam", + "newName": "New Name", "description": "Beschrijving", "author": "Author", "type": "Type", @@ -186,6 +247,7 @@ "language": "Taal", "identifier": "Identifier", "enabled": "Ingeschakeld", + "disabled": "Disabled", "title": "Title", "content": "Content", "backupConfiguration": "Backup Configuration", @@ -212,11 +274,13 @@ "nest": "Nest", "lines": "Lines", "databaseHost": "Databasehost", + "databaseAgentHost": "Database Agent Host", "timezone": "Tijdzone", "timezoneSystem": "System", "protocol": "Protocol", "powerAction": "Stroomactie", "destination": "Bestemming", + "destinationDirectory": "Destination Directory", "directoryName": "Mapnaam", "locked": "Vergrendeld", "portRanges": "Poortbereiken", @@ -231,6 +295,7 @@ "value": "Value", "eggs": "Eggs", "ignoredFiles": "Genegeerde bestanden", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "Uw configuratiepanelwachtwoord", "deploymentEnabled": "Deployment Enabled", "maintenanceEnabled": "Maintenance Enabled", @@ -273,7 +338,10 @@ "files": "Files", "server": "Server", "address": "Address", - "eggs": "Eggs" + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, "tabs": { @@ -288,6 +356,12 @@ "failed": "Mislukt", "installed": "Installed" }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" + }, "server": { "noAllocation": "Geen allocatie", "state": { @@ -426,7 +500,8 @@ "container": { "alert": { "impersonating": "U bootst momenteel een gebruiker na. Houd er rekening mee dat uw acties gevolgen kunnen hebben voor het account van de nagebootste gebruiker. Klik op de knop \"Stop met nabootsen\" linksonder om de nagebootsmodus te verlaten." - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -434,7 +509,11 @@ "stopImpersonating": "Stop met nabootsen", "openInVirtualWindow": "Openen in virtueel venster", "openInPopup": "Openen in pop-up", - "openInNewTab": "Openen in nieuw tabblad" + "openInNewTab": "Openen in nieuw tabblad", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { @@ -448,6 +527,9 @@ "selectInput": { "noResults": "Geen resultaten gevonden." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "U heeft geen toestemming om op te slaan.", @@ -461,6 +543,9 @@ "deleted": "{resource} deleted." } }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -504,7 +589,10 @@ "scheduleDynamicInput": { "none": "Geen", "variable": "Variabele", - "enterVariable": "Voer de naam in van de variabele die geëvalueerd moet worden." + "enterVariable": "Voer de naam in van de variabele die geëvalueerd moet worden.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -523,6 +611,7 @@ "toast": { "backupCompleted": "Back-up succesvol voltooid.", "backupFailed": "Back-up mislukt.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "Back-up herstel succesvol voltooid.", "installCompleted": "Serverinstallatie succesvol voltooid.", "installFailed": "Serverinstallatie mislukt.", @@ -559,6 +648,8 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "Wachten: {file}", "uploading": "Uploaden: {file}", "uploadingFolder": "Map uploaden: {folder} ({files})", @@ -568,7 +659,10 @@ "uploading": "Uploaden van {files} gestart...", "cancelledFile": "Uploaden van `{file}` succesvol geannuleerd.", "cancelledFolder": "Uploaden van map `{folder}` ({files}) succesvol geannuleerd.", - "cancelledAll": "All uploads have been cancelled." + "cancelledAll": "All uploads have been cancelled.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -1210,6 +1304,12 @@ "toast": { "removed": "Opdrachtfragment verwijderd." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1276,6 +1376,12 @@ "toast": { "removed": "API-sleutel verwijderd." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1384,7 +1490,8 @@ "panelVersion": "Panel Version", "versionHistory": "Version History", "outdatedExtensions": "Outdated Extensions", - "outdatedNodes": "Outdated Nodes" + "outdatedNodes": "Outdated Nodes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" }, "panelVersion": "Your panel is currently running version `{current}`. The latest available version is `{latest}`.", "unknown": "unknown", @@ -1402,6 +1509,8 @@ "noChangelog": "No changelog", "nodesUpToDate": "Seems like all nodes are up to date. ({failed} failed to check)", "nodesOutdated": "Some nodes are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", "table": { "version": "Version", "installed": "Installed", @@ -1650,6 +1759,9 @@ "maxFileManagerContentSearchSize": "Max File Manager Content Search Size", "maxFileManagerSearchResults": "Max File Manager Search Results", "maxSubuserCount": "Max Subuser Count", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", "allowOverwritingCustomDockerImage": "Allow Overwriting Custom Docker Image", "allowOverwritingCustomDockerImageDescription": "If enabled, users will be able to overwrite the Docker image specified in the server configuration using the Eggs list, even if an admin has set a custom Docker image.", "allowViewingInstallationLogs": "Allow Viewing Installation Logs", @@ -1735,6 +1847,9 @@ "delete": { "title": "Confirm Announcement Deletion", "content": "Are you sure you want to delete **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" } }, "form": { @@ -1870,6 +1985,25 @@ "users": { "title": "Users", "resourceName": "User", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, "tooltip": { "admin": "Admin", "twoFactorEnabled": "2FA Enabled", @@ -1999,6 +2133,25 @@ } } }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, "nodes": { "title": "Nodes", "page": { @@ -2011,6 +2164,37 @@ "title": "Nodes", "resourceName": "Node", "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, "general": { "page": { "tooltip": { @@ -2024,7 +2208,10 @@ "form": { "urlDescription": "Used for internal communication with the node.", "publicUrlDescription": "Used for websocket connections and downloads.", - "backupConfigurationPlaceholder": "Inherit from Location" + "backupConfigurationPlaceholder": "Inherit from Location", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." }, "button": { "resetToken": "Reset Token", @@ -2226,9 +2413,13 @@ "detached": "Backup detached successfully.", "reattached": "Reattached backup to {name} successfully.", "restoring": "Restoring backup to {name}...", + "exporting": "Exporting backup to files of {name}...", "deleted": "Node backup deleted." }, "modal": { + "export": { + "title": "Export Node Backup to Files" + }, "detach": { "title": "Confirm Backup Detachment", "content": "Are you sure you want to detach this backup from its server? It will not be deleted and can be reattached later." @@ -2244,7 +2435,11 @@ } }, "delete": { - "title": "Confirm Node Backup Deletion" + "title": "Confirm Node Backup Deletion", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2273,6 +2468,7 @@ "none": "None (scrap all allocations, server will not be automatically assigned new allocations on the destination node)", "randomPrimary": "Randomize primary allocation (removes additional allocations)", "randomAll": "Randomize all allocations (recommended to avoid incompatibility issues with destination node)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", "eggConfigDeployment": "Assign allocations based on Egg deployment configuration (only works if the Egg has a deployment configuration and the destination node has compatible allocations)", "eggConfigSelfAssignRange": "Self-assign new allocations based on Egg port range (only works if the Egg has a port range and the destination node has compatible allocations)" } @@ -2321,7 +2517,78 @@ "servers": { "title": "Servers", "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, "general": { "page": { "titleCreate": "Create Server", @@ -2351,23 +2618,30 @@ "backupConfigurationPlaceholder": "Inherit from Node/Location", "cpuLimit": "CPU Limit (%)", "cpuLimitDescription": "The CPU limit in % that the server can use.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", "swap": "Swap", "swapDescription": "The amount of swap to give this server.", + "swapTooltip": "-1 will not set a limit.", "memoryDescription": "The Memory limit of the server container.", + "memoryTooltip": "0 will not set a limit.", "memoryOverhead": "Memory Overhead", "memoryOverheadDescription": "Hidden Memory that will be added to the container.", "diskSpace": "Disk Space", "diskSpaceDescription": "The disk limit of the server.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", "ioWeight": "IO Weight", "ioWeightDescription": "The relative IO Weight of the server container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems.", "pinnedCpus": "Pinned CPUs", "pinnedCpusDescription": "The CPU cores this server is pinned to.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", "dockerImagePlaceholder": "ghcr.io/...", "predefinedDockerImages": "Predefined Docker Images", "predefinedDockerImagesPlaceholder": "No predefined image selected", "timezonePlaceholder": "Europe/Amsterdam", "startupCommandPlaceholder": "npm start", "startupCommandCustom": "Custom", + "predefinedStartupCommands": "Predefined Startup Commands", "startOnCompletion": "Start on Completion", "startOnCompletionDescription": "Start server after installation completes.", "skipInstaller": "Skip Installer", @@ -2378,6 +2652,7 @@ "kvmPassthroughEnabledDescription": "Enable KVM passthrough for the server (allows access to /dev/kvm inside the container).", "allocationsLimit": "Allocations", "databasesLimit": "Databases", + "databaseAgentsLimit": "Agent Databases", "backupsLimit": "Backups", "schedulesLimit": "Schedules" }, @@ -2465,6 +2740,17 @@ } } }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, "logs": { "title": "Logs", "page": { @@ -2556,6 +2842,9 @@ "deleteBackups": "Do you want to delete backups of this server?", "confirmServerName": "Confirm Server Name", "confirmServerNamePlaceholder": "Server Name" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." } } } @@ -2714,13 +3003,17 @@ "toast": { "created": "Egg variable created.", "updated": "Egg variable updated.", - "deleted": "Egg variable deleted." + "deleted": "Egg variable deleted.", + "duplicated": "Egg variable duplicated." }, "modal": { "delete": { "title": "Confirm Egg Variable Removal", "content": "Are you sure you want to remove **{variable}**?", "emptyVariable": "this empty variable" + }, + "duplicate": { + "title": "Duplicate Egg Variable" } } } @@ -2771,7 +3064,8 @@ "form": { "order": "Order", "eggs": "Eggs", - "eggsPlaceholder": "Select Eggs" + "eggsPlaceholder": "Select Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." }, "enum": { "deploymentType": { @@ -2928,7 +3222,11 @@ "modal": { "delete": { "title": "Confirm Database Host Deletion", - "content": "Are you sure you want to delete **{name}**?" + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2936,7 +3234,278 @@ "databases": { "title": "Databases", "page": { - "title": "Database Host Databases" + "title": "Database Host Databases", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } } } } @@ -3014,10 +3583,27 @@ "title": "Mappings", "page": { "title": "OAuth Provider Mappings", + "table": { + "columns": { + "matcher": "Matcher" + } + }, "enum": { "mappingType": { "role": "Role", "serverSubuser": "Server Subuser" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" } }, "toast": { @@ -3025,8 +3611,28 @@ "updated": "OAuth provider mapping updated.", "deleted": "OAuth provider mapping deleted." }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", "scopesDescription": "OAuth scopes required for this mapping to apply.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", "mappingType": "Mapping Type", "role": "Role", "permissions": "Permissions" @@ -3047,6 +3653,25 @@ }, "users": { "title": "Users", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, "page": { "title": "OAuth Provider Users", "table": { @@ -3313,6 +3938,11 @@ "viewAdmin": { "title": "Bekijk als beheerder" }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, "console": { "title": "Console", "input": { @@ -3434,6 +4064,10 @@ "modified": "Gewijzigd" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "Nieuw", "connect": "Connect", @@ -3477,6 +4111,7 @@ "copyingMany": "{files} kopiëren", "receivingRemote": "{files} ontvangen van externe server", "sendingRemote": "{files} verzenden naar externe server", + "exportingBackup": "Exporting backup to {destination}", "cancelAllOperations": "Cancel all operations" }, "dropzone": { @@ -3488,6 +4123,7 @@ "preferPhysicalSize": "Fysieke grootte weergeven in plaats van logische grootte", "editorMinimap": "Bestandsminimap weergeven", "editorLineOverflow": "Regeloverloop inpakken", + "editorFontSize": "Editor Font Size", "vscodeUriScheme": "VS Code URI Scheme", "imageViewerSmoothing": "Afbeelding vloeiend maken (anti-aliasing)" }, @@ -3497,6 +4133,8 @@ "copyingStarted": "{files} begint met kopiëren.", "filesCouldNotBeMoved": "Bestanden konden niet worden verplaatst.", "filesMoved": "{files} verplaatst.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "Download gestart.", "filesDeleted": "Bestanden zijn verwijderd.", "archiveCreationStarted": "Aanmaken van archief gestart.", @@ -3506,13 +4144,19 @@ "fileRenamed": "Bestand is hernoemd.", "fileCouldNotBeRenamed": "Bestand kon niet worden hernoemd.", "filesRenamed": "{files} renamed.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "Rechten zijn bijgewerkt.", "permissionsUpdatedMany": "Permissions have been updated for {files}.", "permissionsCouldNotBeUpdated": "Permissions could not be updated.", - "fileSaved": "Bestand is opgeslagen." + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "Bestand is opgeslagen.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." }, "tooltip": { "fileHistory": "File History", + "collabEditing": "{user} is editing this file", "largestDirectories": "Analyze directory sizes", "dragToMove": "Drag to move", "back": "Back {seconds} seconds", @@ -3714,6 +4358,10 @@ "databases": { "title": "Databases", "subtitle": "{current} van {max} maximale databases aangemaakt.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Deze server is beperkt tot {max} databases." }, @@ -3728,6 +4376,165 @@ "form": { "databaseName": "Databasenaam" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Database aanmaken", @@ -3735,7 +4542,8 @@ "created": "Database aangemaakt." }, "form": { - "noHostsFound": "Geen hosts gevonden" + "noHostsFound": "Geen hosts gevonden", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -3787,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "Trigger toevoegen", "addCondition": "Conditie toevoegen", "addStep": "Stap toevoegen", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "Eerste stap aanmaken", "addOutput": "Uitvoer toevoegen", "addFile": "Bestand toevoegen", @@ -3799,6 +4612,7 @@ "imported": "Planning geïmporteerd.", "created": "Planning aangemaakt.", "updated": "Planning bijgewerkt.", + "duplicated": "Schedule duplicated.", "deleted": "Planning verwijderd.", "triggered": "Planning geactiveerd.", "exported": "Planning geëxporteerd.", @@ -3806,6 +4620,7 @@ "step": { "created": "Planningsstap aangemaakt.", "updated": "Planningsstap bijgewerkt.", + "duplicated": "Schedule step duplicated.", "deleted": "Planningsstap verwijderd." } }, @@ -3815,12 +4630,21 @@ "and": "EN (Alle moeten waar zijn)", "or": "OF (Minstens één moet waar zijn)", "not": "NIET (Mag niet waar zijn)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "Variabele bestaat", "variableContains": "Variabele bevat", "variableEquals": "Variabele is gelijk aan", "variableStartsWith": "Variabele begint met", "variableEndsWith": "Variabele eindigt met" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "Kleiner dan", "smallerThanOrEqual": "Kleiner dan of gelijk aan", @@ -3836,6 +4660,9 @@ "updateSchedule": { "title": "Planning bijwerken" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "Verwijderen van planning bevestigen", "content": "Weet u zeker dat u {name} wilt verwijderen van deze server?" @@ -3849,12 +4676,19 @@ "deleteStep": { "title": "Verwijderen van planningsstap bevestigen", "content": "Weet u zeker dat u deze planningsstap wilt verwijderen?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "Actief" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "Acties", "conditions": "Condities", @@ -3890,6 +4724,7 @@ "contains": "Bevat", "startsWith": "Begint met", "endsWith": "Eindigt met", + "metric": "Metric", "allMustBeTrue": "Alle condities moeten waar zijn:", "anyMustBeTrue": "Minstens één conditie moet waar zijn:", "mustNotBeTrue": "Conditie mag niet waar zijn:" @@ -3903,8 +4738,23 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "Cron-planning" + "cronSchedule": "Cron-planning", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" + }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "Op cron-interval {schedule}, volgende uitvoering is {timestamp} - laatste uitvoering was {lastTimestamp}." }, @@ -3931,6 +4781,25 @@ "content": "Wanneer back-up status `{status}` bereikt." } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "Consoleregel", "card": { @@ -3955,8 +4824,20 @@ "title": "Geen stappen geconfigureerd", "description": "Deze planning heeft nog geen stappen. Voeg acties toe om aan de slag te gaan." }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "Wachten", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "Duur (milliseconden)" }, @@ -3966,12 +4847,62 @@ }, "ensure": { "title": "Verzekeren", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "Verzeker dat een conditie overeenkomt" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "Opmaken", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "Opmaaktekenreeks", "formatStringDescription": "De opmaakreeks. Variabelen kunnen worden opgenomen door ze in {wrapper} te plaatsen." @@ -3982,6 +4913,7 @@ }, "matchRegex": { "title": "Regex vergelijken", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "Invoer", "regex": "Regex", @@ -3994,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "Wachten op consoleregel", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "Time-out (milliseconden)" }, @@ -4008,6 +4941,7 @@ }, "sendCommand": { "title": "Opdracht verzenden", + "description": "Send a command to the server console.", "renderer": { "compact": "Voer {command} uit", "detail": { @@ -4017,6 +4951,7 @@ }, "sendPower": { "title": "Stroomsignaal verzenden", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "Voer {action} uit", "detail": { @@ -4026,19 +4961,75 @@ }, "createBackup": { "title": "Back-up aanmaken", + "description": "Create a backup of the server files.", "form": { "backupName": "Back-upnaam" }, "renderer": { "compact": "Maak {name} aan", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "Back-upnaam: {name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "Genegeerde bestanden: {files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "Map aanmaken", + "description": "Create a new folder in the server files.", "renderer": { "compact": "Maak {name} aan in {root}", "detail": { @@ -4049,6 +5040,7 @@ }, "writeFile": { "title": "Bestand schrijven", + "description": "Write or append text to a file.", "form": { "content": "Inhoud", "appendToFile": "Toevoegen aan bestand" @@ -4063,6 +5055,7 @@ }, "copyFile": { "title": "Bestand kopiëren", + "description": "Copy a file to a new location.", "form": { "sourceFile": "Bronbestand" }, @@ -4076,6 +5069,7 @@ }, "deleteFiles": { "title": "Bestanden verwijderen", + "description": "Delete files or folders.", "form": { "filesToDelete": "Te verwijderen bestanden" }, @@ -4089,6 +5083,7 @@ }, "renameFiles": { "title": "Bestanden hernoemen", + "description": "Rename or move files.", "form": { "files": "Bestanden", "from": "van", @@ -4104,6 +5099,7 @@ }, "compressFiles": { "title": "Bestanden comprimeren", + "description": "Compress files into an archive.", "form": { "filesToCompress": "Te comprimeren bestanden" }, @@ -4119,6 +5115,7 @@ }, "decompressFile": { "title": "Bestand decomprimeren", + "description": "Extract an archive into a folder.", "form": { "file": "Bestand" }, @@ -4132,6 +5129,7 @@ }, "updateStartupVariable": { "title": "Opstartvariabele bijwerken", + "description": "Change the value of a startup variable.", "renderer": { "compact": "Stel {variable} in op {value}", "detail": { @@ -4142,6 +5140,7 @@ }, "updateStartupCommand": { "title": "Opstartcommando bijwerken", + "description": "Change the command used to start the server.", "renderer": { "compact": "Stel in op {command}", "detail": { @@ -4151,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "Docker-image bijwerken", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "Stel in op {image}", "detail": { @@ -4213,16 +5213,25 @@ "locked": "Vergrendeld?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Bladeren" + "browse": "Bladeren", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "Download gestart.", - "restoringBackup": "Back-up herstellen..." + "restoringBackup": "Back-up herstellen...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Back-up aanmaken", + "noGroup": "No group", "toast": { "created": "Back-up aangemaakt." } @@ -4236,10 +5245,14 @@ "restoreBackup": { "title": "Back-up herstellen" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Verwijderen van back-up bevestigen", "content": "Weet u zeker dat u **{name}** wilt verwijderen van deze server?", "toast": { + "started": "Backup deletion started.", "deleted": "Back-up verwijderd." } }, @@ -4248,6 +5261,47 @@ } } }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." + } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." + } + }, "network": { "title": "Netwerk", "subtitle": "{current} van {max} maximale allocaties toegewezen.", @@ -4293,7 +5347,8 @@ "content": "You have unsaved changes to your startup variables. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, - "noVariables": "Geen opstartvarabelen gevonden voor deze server." + "noVariables": "Geen opstartvarabelen gevonden voor deze server.", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "Koppelingen", diff --git a/frontend/public/translations/ro.json b/frontend/public/translations/ro.json index 1ed50ff0f..268f4c29c 100644 --- a/frontend/public/translations/ro.json +++ b/frontend/public/translations/ro.json @@ -1,5 +1,13 @@ { "items": { + "byte": { + "zero": "{count} Bytes", + "one": "{count} Byte", + "two": "{count} Bytes", + "few": "{count} Bytes", + "many": "{count} Bytes", + "other": "{count} Bytes" + }, "user": { "zero": "{count} Utilizatori", "one": "{count} Utilizator", @@ -8,6 +16,22 @@ "many": "{count} Utilizatori", "other": "{count} Utilizatori" }, + "file": { + "zero": "{count} Files", + "one": "{count} File", + "two": "{count} Files", + "few": "{count} Files", + "many": "{count} Files", + "other": "{count} Files" + }, + "server": { + "zero": "{count} Servers", + "one": "{count} Server", + "two": "{count} Servers", + "few": "{count} Servers", + "many": "{count} Servers", + "other": "{count} Servers" + }, "sshKey": { "zero": "{count} Chei SSH", "one": "{count} Cheie SSH", @@ -15,6 +39,86 @@ "few": "{count} Chei SSH", "many": "{count} Chei SSH", "other": "{count} Chei SSH" + }, + "asset": { + "zero": "{count} Assets", + "one": "{count} Asset", + "two": "{count} Assets", + "few": "{count} Assets", + "many": "{count} Assets", + "other": "{count} Assets" + }, + "node": { + "zero": "{count} Nodes", + "one": "{count} Node", + "two": "{count} Nodes", + "few": "{count} Nodes", + "many": "{count} Nodes", + "other": "{count} Nodes" + }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, + "allocation": { + "zero": "{count} Node Allocations", + "one": "{count} Node Allocation", + "two": "{count} Node Allocations", + "few": "{count} Node Allocations", + "many": "{count} Node Allocations", + "other": "{count} Node Allocations" + }, + "egg": { + "zero": "{count} Eggs", + "one": "{count} Egg", + "two": "{count} Eggs", + "few": "{count} Eggs", + "many": "{count} Eggs", + "other": "{count} Eggs" + }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, + "shortcut": { + "zero": "{count} Shortcuts", + "one": "{count} Shortcut", + "two": "{count} Shortcuts", + "few": "{count} Shortcuts", + "many": "{count} Shortcuts", + "other": "{count} Shortcuts" + }, + "line": { + "zero": "{count} Lines", + "one": "{count} Line", + "two": "{count} Lines", + "few": "{count} Lines", + "many": "{count} Lines", + "other": "{count} Lines" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -25,6 +129,7 @@ "save": "Salvează", "saveAndStay": "Salvează și Rămâi", "edit": "Editează", + "duplicate": "Duplicate", "delete": "Șterge", "remove": "Elimină", "enable": "Activează", @@ -34,29 +139,119 @@ "cancel": "Anulează", "continue": "Continuă", "skip": "Sari peste", + "okay": "Okay", + "back": "Back", + "next": "Next", + "install": "Install", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "restore": "Restore", + "discard": "Discard", + "download": "Download", + "downloadAs": "Download as {format}", + "export": "Export", + "exportAs": "Export as {format}", + "recreate": "Recreate", + "move": "Move", + "transfer": "Transfer", + "reattach": "Reattach", + "detach": "Detach", + "send": "Send", + "reset": "Reset", + "view": "View", "import": "Importă", "details": "Detalii", + "loadLogs": "Load Logs", + "sendTestEmail": "Send Test Email", "setPrimary": "Setează ca primar", - "unsetPrimary": "Elimină ca primar" + "unsetPrimary": "Elimină ca primar", + "leavePage": "Leave Page", + "viewDocumentation": "View Documentation", + "undo": "Undo" + }, + "alert": { + "error": "Error", + "warning": "Warning", + "success": "Success", + "clockOffset": "Your system clock is out of sync with the server by more than 5 seconds. This may cause issues with passkey authentication and two-factor authentication. Please sync your clock if issues arise. Current offset: {offset} second(s)." + }, + "divider": { + "or": "OR" }, "input": { "search": "Caută..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { - "primary": "Primar" + "resetToDefault": "Reset to default", + "edit": "Edit", + "delete": "Delete", + "remove": "Remove", + "primary": "Primar", + "backupOnDifferentNode": "This backup is on a different node than the server. It is not viewable from the Client API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Nume", + "newName": "New Name", "description": "Descriere", + "author": "Author", + "type": "Type", "password": "Parolă", "host": "Gazdă", "username": "Nume utilizator", + "usernameOrEmail": "Username/Email", + "server": "Server", "url": "URL", "email": "Email", + "path": "Path", + "port": "Port", + "provider": "Provider", + "command": "Command", + "fromAddress": "From Address", + "fromName": "From Name", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "apiKey": "API Key", + "accessKey": "Access Key", + "bucket": "Bucket", + "region": "Region", + "endpoint": "Endpoint", + "publicUrl": "Public URL", "firstName": "Prenume", "lastName": "Nume de familie", "language": "Limbă", + "identifier": "Identifier", "enabled": "Activat", + "disabled": "Disabled", + "title": "Title", + "content": "Content", + "backupConfiguration": "Backup Configuration", + "fileName": "File Name", "sftpPort": "Port SFTP", "sftpHost": "Gazdă SFTP", "dockerImage": "Imagine Docker", @@ -64,13 +259,47 @@ "disk": "Disc", "serverName": "Nume server", "startupCommand": "Comandă de pornire", + "archiveName": "Archive Name", + "archiveFormat": "Archive Format", + "compressionLevel": "Compression Level", + "multiplexChannels": "Multiplex Channels", + "multiplexChannelsDescription": "Add additional HTTP connections (and therefore also threads) for transferring split archives, total streams is 1 + multiplex channels.", + "deleteSourceBackups": "Delete source backups", + "deleteSourceBackupsDescription": "Deletes the transferred backups on the source node once transfer finishes.", + "node": "Node", + "primaryAllocation": "Primary Allocation", + "additionalAllocations": "Additional Allocations", + "externalId": "External ID", + "mount": "Mount", + "nest": "Nest", + "lines": "Lines", "databaseHost": "Gazdă bază de date", + "databaseAgentHost": "Database Agent Host", "timezone": "Fus orar", + "timezoneSystem": "System", + "protocol": "Protocol", + "powerAction": "Power Action", + "destination": "Destination", + "destinationDirectory": "Destination Directory", + "directoryName": "Directory Name", "locked": "Blocat", + "portRanges": "Port Ranges", + "portRangesPlaceholder": "Port Ranges (eg. 3000-4000)", "currentPassword": "Parolă actuală", "confirmPassword": "Confirmă parola", "authenticationCode": "Cod de autentificare", - "ignoredFiles": "Fișiere ignorate" + "restoreStartup": "Restore the startup command, image, and variables from this backup.", + "lineContains": "Line Contains", + "filePath": "File Path", + "envVariable": "Environment Variable", + "value": "Value", + "eggs": "Eggs", + "ignoredFiles": "Fișiere ignorate", + "previewIgnoredFiles": "Preview ignored files", + "yourControlPanelPassword": "Your Control Panel Password", + "deploymentEnabled": "Deployment Enabled", + "maintenanceEnabled": "Maintenance Enabled", + "truncateDirectory": "Do you want to delete all files of this server before performing this action? This cannot be undone." }, "table": { "pagination": { @@ -78,25 +307,70 @@ "empty": "Nu s-au găsit elemente, este aproape ca și cum s-ar ascunde." }, "columns": { + "id": "ID", "name": "Nume", + "author": "Author", + "type": "Type", + "title": "Title", + "enabled": "Enabled", "description": "Descriere", "username": "Nume utilizator", "size": "Dimensiune", "lastUsed": "Ultima utilizare", "created": "Creat", + "updated": "Updated", "actor": "Actor", "event": "Eveniment", "ip": "IP", "when": "Când", - "notes": "Note" + "command": "Command", + "location": "Location", + "node": "Node", + "owner": "Owner", + "added": "Added", + "backupConfiguration": "Backup Configuration", + "status": "Status", + "allocation": "Allocation", + "notes": "Note", + "source": "Source", + "target": "Target", + "checksum": "Checksum", + "files": "Files", + "server": "Server", + "address": "Address", + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, + "tabs": { + "general": "General" + }, + "badge": { + "active": "Active", + "inactive": "Inactive", + "enabled": "Enabled", + "disabled": "Disabled", + "successful": "Successful", + "failed": "Failed", + "installed": "Installed" + }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" + }, "server": { "noAllocation": "Fără alocare", "state": { "suspended": "Suspendat", + "transferring": "Server is being transferred", + "nodeMaintenance": "Node is under Maintenance", "restoringBackup": "Restaurare backup", - "installing": "Instalare" + "installing": "Instalare", + "installFailed": "Install Failed" } }, "enum": { @@ -108,18 +382,289 @@ "bottomCenter": "Centru jos", "bottomRight": "Dreapta jos" }, + "serverState": { + "unknown": "Unknown", + "offline": "Offline", + "running": "Running", + "starting": "Starting", + "stopping": "Stopping" + }, "serverPowerAction": { "start": "Pornește", "stop": "Oprește", "restart": "Repornește", "kill": "Termină" + }, + "serverBackupStatus": { + "starting": "Starting", + "finished": "Finished", + "failed": "Failed" + }, + "connectionStatus": { + "connected": "Connected", + "offline": "Offline" + }, + "serverAutoStartBehavior": { + "always": "Always", + "unlessStopped": "Unless Stopped", + "never": "Never" + }, + "bulkActionServerAction": { + "started": "Started", + "stopped": "Stopped", + "restarted": "Restarted", + "killed": "Killed" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" + } + }, + "unit": { + "bytes": { + "bytes": "B", + "kibibytes": "KiB", + "mebibytes": "MiB", + "gibibytes": "GiB", + "tebibytes": "TiB", + "pebibytes": "PiB" } }, "unlimited": "Nelimitat", + "readOnly": "Read-Only", "na": "N/A", + "never": "Never", + "none": "None", + "unknown": "Unknown", "yes": "Da", "no": "Nu", - "system": "Sistem" + "web": "Web", + "api": "API", + "default": "Default", + "custom": "Custom", + "system": "Sistem", + "schedule": "Schedule", + "impersonatedBy": "Impersonated by {username}" + }, + "elements": { + "routeOrderEditor": { + "title": "Route Configuration", + "label": { + "route": "Route", + "divider": "Divider", + "redirect": "Redirect" + }, + "empty": "No routes configured. Add routes, dividers, or redirects below.", + "unnamed": "(unnamed)", + "dividerPlaceholder": "Divider label (optional)", + "redirectNamePlaceholder": "Redirect name", + "destinationPlaceholder": "Destination URL (e.g. https://...)", + "selectRoutePlaceholder": "Select a route…", + "button": { + "addDivider": "Add Divider", + "addRedirect": "Add Redirect" + } + }, + "errorBoundary": { + "message": "An unexpected error occurred while rendering this page. Try refreshing. If the problem persists, contact your system administrator.", + "hideDetails": "Hide Details", + "showDetails": "Show Details", + "errorMessage": "Error Message:", + "stackTrace": "Stack Trace:", + "componentStack": "Component Stack:" + }, + "copyOnClick": { + "toast": { + "copied": "Copied to clipboard.", + "failed": "Failed to copy to clipboard.", + "copyManual": "Copy to clipboard: Ctrl+C or Command+C, Enter" + } + }, + "pasteOnClick": { + "toast": { + "pasted": "Pasted from clipboard.", + "failed": "Failed to paste from clipboard.", + "pasteManual": "Paste from clipboard: Ctrl+V or Command+V, Enter" + } + }, + "estimatedTimeArrival": { + "tooltip": { + "estimating": "Estimating completion time...", + "estimated": "Estimated completion time: {time}" + }, + "calculating": "ETA: Calculating...", + "calculated": "ETA: {time}" + }, + "container": { + "alert": { + "impersonating": "You are currently impersonating a user. Please be aware that your actions may affect the impersonated user's account. To exit impersonation mode, click the \"Stop Impersonating\" button in the bottom left corner." + }, + "connectedTo": "Connected to {name}" + }, + "sidebar": { + "button": { + "logout": "Logout", + "stopImpersonating": "Stop Impersonating", + "openInVirtualWindow": "Open in Virtual Window", + "openInPopup": "Open in Popup", + "openInNewTab": "Open in New Tab", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" + } + }, + "permissionSelector": { + "button": { + "copyPermissions": "Copy Permissions", + "pastePermissions": "Paste Permissions" + }, + "selectedPermissions": "Selected Permissions ({count})", + "noPermissions": "No permissions selected." + }, + "selectInput": { + "noResults": "No Results found." + }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, + "can": { + "tooltip": { + "cantSave": "You do not have permission to save.", + "cantDelete": "You do not have permission to delete." + } + }, + "resource": { + "tooltip": { + "created": "{resource} created.", + "updated": "{resource} updated.", + "deleted": "{resource} deleted." + } + }, + "formEngine": { + "advancedMode": "Advanced mode" + }, + "activityInfoButton": { + "modal": { + "info": { + "title": "Activity Details" + } + } + }, + "screenBlock": { + "permissionDenied": { + "title": "Permission Denied", + "content": "You do not have permission to access this page." + }, + "notFound": { + "title": "Not Found", + "content": "The page you are looking for could not be found." + }, + "suspended": { + "title": "Account Suspended", + "content": "Your account has been suspended. You cannot make changes to your account. Please contact an administrator for more information." + }, + "serverConflict": { + "title": "Conflicting Server State", + "contentSuspended": "This server is suspended and cannot be accessed.", + "contentNodeMaintenance": "This server is on a node that is currently under maintenance and cannot be accessed.", + "contentTransferring": "This server is currently being transferred and cannot be accessed until the transfer is complete.", + "contentInstallFailed": "This server failed to install and cannot be accessed until acknowledged.", + "contentInstalling": "This server is currently installing and cannot be accessed until completed.", + "contentRestoringBackup": "This server is currently restoring from a backup and cannot be accessed until completed.", + "button": { + "viewInstallLogs": "View Installation Logs", + "acknowledgeFailure": "Acknowledge Failure" + }, + "modal": { + "acknowledgeFailure": { + "title": "Acknowledge Installation Failure", + "content": "By acknowledging this installation failure, you are confirming that you are aware of the failed installation and have taken any necessary steps to resolve the issue. This will allow you to regain control over the server." + } + } + } + }, + "scheduleDynamicInput": { + "none": "None", + "variable": "Variable", + "enterVariable": "Reading from a variable.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" + }, + "serverWebsocket": { + "error": { + "connectionFailed": "Unable to connect after multiple attempts. Please refresh the page.", + "connectionClosed": "Connection to server was closed. Attempting to reconnect...", + "connectionRetry": "Connection lost. Retrying (attempt {attempt})...", + "authFailed": "Authentication failed. Attempting to refresh credentials... ({error})", + "authRefreshFailed": "Failed to refresh credentials. Please refresh the page to try again.", + "permissionRevoked": "Connection closed: your access to this server has been revoked.", + "tokenRefreshLoop": "Authentication loop detected. Please refresh the page to try again." + }, + "banner": { + "retrying": "Retrying in {countdown}..." + }, + "listener": { + "toast": { + "backupCompleted": "Backup completed successfully.", + "backupFailed": "Backup failed.", + "backupDeleteFailed": "Backup deletion failed.", + "backupRestoreCompleted": "Backup restore completed successfully.", + "installCompleted": "Server Installation completed successfully.", + "installFailed": "Server Installation failed.", + "operations": { + "compressing": { + "completed": "Compressed {files} to `{path}` in {time}.", + "failed": "Failed to compress {files} to `{path}`:\n{error}" + }, + "decompressing": { + "completed": "Decompressed `{path}` to `{destination}` in {time}.", + "failed": "Failed to decompress `{path}` to `{destination}`:\n{error}" + }, + "pulling": { + "completed": "Pulled `{destination}` in {time}.", + "failed": "Failed to pull `{destination}`:\n{error}" + }, + "copying": { + "completed": "Copied `{path}` to `{destination}` in {time}.", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", + "failed": "Failed to copy `{path}` to `{destination}`:\n{error}" + }, + "copyingMany": { + "completed": "Copied {files} in {time}.", + "failed": "Failed to copy {files}:\n{error}" + }, + "copyingRemote": { + "completedFrom": "Copied {files} from remote server in {time}.", + "completedTo": "Copied {files} to remote server in {time}.", + "failedFrom": "Failed to copy {files} from remote server:\n{error}", + "failedTo": "Failed to copy {files} to remote server:\n{error}" + } + } + } + } + }, + "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", + "waiting": "Waiting: {file}", + "uploading": "Uploading: {file}", + "uploadingFolder": "Uploading folder: {folder} ({files})", + "rateLimited": "Your upload has been rate limited. Waiting...", + "cancelAllUploads": "Cancel all uploads", + "toast": { + "uploading": "Started uploading {files}...", + "cancelledFile": "Successfully cancelled upload of `{file}`.", + "cancelledFolder": "Successfully cancelled upload of `{folder}` ({files}).", + "cancelledAll": "All uploads have been cancelled.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" + } + } }, "pages": { "oobe": { @@ -173,6 +718,8 @@ "form": { "locationName": "Nume locație", "locationNamePlaceholder": "Casa mea", + "locationFlag": "Location Flag", + "locationFlagPlaceholder": "The best country", "backupName": "Nume configurare backup", "backupNamePlaceholder": "Unicorn Cloud", "backupDisk": "Disc backup", @@ -184,6 +731,7 @@ }, "node": { "title": "Configurare nod", + "allocationsTitle": "Allocations Configuration", "form": { "name": "Nume", "namePlaceholder": "Serverul meu", @@ -193,7 +741,8 @@ "publicUrlPlaceholder": "URL", "publicUrlDescription": "folosit pentru websocket/descărcări", "sftpHostPlaceholder": "Gazdă SFTP", - "sftpPortPlaceholder": "Port SFTP" + "sftpPortPlaceholder": "Port SFTP", + "ip": "IP" }, "error": { "noLocations": "Ceva nu a mers bine. Nu s-au găsit locații." @@ -202,6 +751,18 @@ "create": "Creează și continuă" } }, + "nodeConfiguration": { + "title": "Node Configuration", + "error": { + "noNodes": "Something went wrong. No nodes were found.", + "connectionError": "Something went wrong. Connection Error." + }, + "successMessage": "The connection to your node was successfully verified. You may now continue.", + "configurationDescription": "Place this into the configuration file at `{file}` or run:", + "button": { + "verify": "Verify Connection" + } + }, "configuration": { "title": "Setări aplicație", "form": { @@ -217,6 +778,43 @@ "submit": "Actualizează setările și continuă" } }, + "eggRepositories": { + "title": "Egg Repositories", + "description": "These are the source repositories of your eggs. You may change these repositories at any time.", + "repositories": { + "pterodactylGame": { + "title": "Pterodactyl Game Eggs", + "description": "Eggs for games like Minecraft, Terraria, and a lot more." + }, + "pterodactylApplication": { + "title": "Pterodactyl Application Eggs", + "description": "Eggs for applications like Grafana, Meilisearch, and various databases." + }, + "pterodactylGeneral": { + "title": "Pterodactyl Generic Eggs", + "description": "Eggs for generic application runtimes like Node JS, Java, and Rust." + } + } + }, + "server": { + "title": "Server", + "existingServer": "A server has already been created. You can change the settings later in the admin menu.", + "egg": { + "title": "Egg", + "description": "Let's get your first server up and running. What egg would you like to use?", + "nestDescription": "To start using this egg, you will need to create a nest, nests are collections of eggs. Give it a name:" + }, + "server": { + "title": "Server", + "nestDescription": "To start using this egg, you will need to create a nest, nests are collections of eggs. Give it a name:" + }, + "error": { + "noNodes": "Something went wrong. No nodes were found." + }, + "button": { + "create": "Create & Continue" + } + }, "finished": { "title": "Configurare completă!", "subtitle": "Panoul tău Calagopus este gata de utilizare", @@ -227,8 +825,13 @@ "title": "Configurare sistem", "subtitle": "Setările și preferințele panoului configurate" }, + "eggRepositories": { + "title": "Egg Repositories", + "subtitle": "{count} repositories" + }, "location": "Locație", - "node": "Nod" + "node": "Nod", + "server": "Server" }, "badge": { "skipped": "Sărit peste" @@ -236,15 +839,131 @@ "button": "Mergi la tabloul de bord" } }, + "auth": { + "button": { + "login": "Login", + "loginWith": "Login with {name}" + }, + "alert": { + "urlMismatch": "The application URL does not match the current URL. Expected: `{appUrl}`, Current: `{currentUrl}`." + }, + "login": { + "error": { + "usernameRequired": "Please enter a username", + "registrationDisabled": "No matching Account could be found and registration is currently disabled.", + "userAlreadyExists": "An account with this username or email already exists." + }, + "passkey": { + "error": { + "notSupported": "Your browser does not support passkeys.", + "unexpected": "An unexpected error occurred while using your passkey.", + "cancelled": "Passkey request was cancelled.", + "dismissed": "You dismissed or did not interact with the passkey prompt. The used key could also be not registered.", + "invalidState": "This passkey is not available or already registered.", + "notSupportedType": "Your browser or device does not support this type of passkey.", + "securityError": "Passkeys can only be used over HTTPS and with a valid domain.", + "authenticatorError": "Something went wrong with the authenticator.", + "constraintError": "The authenticator could not meet the required constraints." + } + }, + "step": { + "username": { + "title": "Login", + "subtitle": "Enter your username or email address to continue", + "form": { + "usernameOrEmailPlaceholder": "Your username or email address" + }, + "link": { + "forgotPassword": "Forgot Password", + "notRegistered": "Not registered?", + "createAccount": "Create account" + }, + "button": { + "oauthLogin": "OAuth Login" + } + }, + "passkey": { + "title": "Authenticate with Passkey", + "subtitle": "We found a passkey associated with {username}", + "button": { + "usePasskey": "Use Passkey", + "usePassword": "Use Password" + } + }, + "password": { + "title": "Enter Password", + "subtitle": "Please enter your password for {username}", + "form": { + "passwordPlaceholder": "Enter your password" + }, + "button": { + "signIn": "Sign In", + "forgotPassword": "Forgot Password" + } + }, + "totp": { + "title": "Two-Factor Authentication", + "welcomeBack": "Welcome back {username}!", + "enterCode": "Enter the 6-digit code from your authenticator app", + "button": { + "verify": "Verify Code", + "useRecoveryCode": "Use Recovery Code", + "useTotp": "Use TOTP" + } + }, + "totpRecovery": { + "subtitle": "Enter a recovery code", + "form": { + "label": "Recovery Code", + "placeholder": "Enter a recovery code" + } + } + } + }, + "register": { + "title": "Register", + "subtitle": "Please enter your details to register", + "button": { + "register": "Register" + } + }, + "forgotPassword": { + "title": "Forgot Password", + "subtitle": "Enter your email to receive instructions on how to reset your password", + "button": { + "request": "Request Password Reset" + }, + "success": "An email has been sent to you with instructions on how to reset your password." + }, + "resetPassword": { + "title": "Reset Password", + "subtitle": "Please enter your new password", + "button": { + "reset": "Reset Password" + }, + "toast": { + "success": "Password has been reset." + } + }, + "oauth": { + "title": "Authenticate with OAuth", + "subtitle": "Choose any of the providers below to login" + } + }, "account": { "home": { "title": "Servere", "tooltip": { "removeFromGroup": "Elimină din grup", "addToGroup": "Adaugă la grup", + "addServerToGroup": "Add Server to Group", + "groupActions": "Group Actions", "noGroups": "Niciun grup disponibil pentru a adăuga serverul", "noGroup": "Acest server nu este în niciun grup" }, + "badge": { + "foreign": "Foreign" + }, "tabs": { "groupedServers": { "title": "Servere grupate", @@ -271,6 +990,20 @@ "toast": { "deleted": "Grup de servere șters." } + }, + "addServerToGroup": { + "title": "Add Server to {group}", + "noServers": "All servers are already in this group.", + "toast": { + "added": "Server added to group." + } + }, + "removeServerFromGroup": { + "title": "Confirm Server Removal", + "content": "Are you sure you want to remove **{server}** from **{group}**?", + "toast": { + "removed": "Server removed from group." + } } }, "noGroups": "Nu s-au găsit grupuri, este timpul să creezi unul?" @@ -293,14 +1026,29 @@ } } }, + "bulkActions": { + "selectionMode": "Selection Mode", + "select": "Select server", + "deselect": "Deselect server", + "success": "Successfully {action} {servers}.", + "partial": "Successfully {action} {successfulServers}. {failedServers} failed.", + "groupActions": "Group Actions" + }, "noServers": "Nu s-au găsit servere, este timpul să adaugi unul?" }, + "admin": { + "title": "Admin" + }, "account": { "title": "Cont", "alert": { "requireTwoFactor": { "title": "Autentificare cu doi factori necesară", "description": "Autentificarea cu doi factori este necesară pentru contul tău. Te rugăm să o configurezi mai jos pentru a continua să folosești panoul." + }, + "frozen": { + "title": "Account Frozen", + "description": "Your account has been frozen. You cannot make changes to your account until it is unfrozen. Please contact an administrator for more information." } }, "containers": { @@ -326,7 +1074,8 @@ "twoFactor": { "title": "Autentificare cu doi factori", "toast": { - "disabled": "Autentificare cu doi factori dezactivată cu succes." + "disabled": "Autentificare cu doi factori dezactivată cu succes.", + "enabled": "Two-factor authentication enabled successfully. Please copy your recovery codes." }, "modal": { "disableTwoFactor": { @@ -348,7 +1097,8 @@ "setupTwoFactor": "Configurează autentificarea cu doi factori" }, "twoFactorEnabled": "Verificarea în doi pași este activată în prezent.", - "twoFactorDisabled": "Momentan nu ai activată verificarea în doi pași pe contul tău. Apasă pe butonul de mai jos pentru a începe configurarea." + "twoFactorDisabled": "Momentan nu ai activată verificarea în doi pași pe contul tău. Apasă pe butonul de mai jos pentru a începe configurarea.", + "twoFactorLastUsed": "Last used: {timestamp}" }, "account": { "title": "Detalii cont", @@ -374,6 +1124,16 @@ }, "securityKeys": { "title": "Chei de securitate", + "subtitle": "{current} of {max} maximum security keys created.", + "table": { + "columns": { + "credentialId": "Credential ID" + } + }, + "tooltip": { + "secureContextRequired": "A secure context (HTTPS) is required to use security keys.", + "limitReached": "You are limited to {max} security keys." + }, "modal": { "createSecurityKey": { "title": "Creează cheie de securitate", @@ -416,8 +1176,67 @@ } } }, + "shortcuts": { + "title": "Keyboard Shortcuts", + "subtitle": "Use these keyboard shortcuts to navigate and interact with the panel more efficiently.", + "detectedMac": "macOS detected", + "detectedWindows": "Windows/Linux detected", + "label": { + "disabled": "Disabled", + "modified": "Modified", + "recording": "Press keys..." + }, + "button": { + "rebind": "Rebind", + "resetAll": "Reset All", + "copy": "Copy All", + "paste": "Paste" + }, + "toast": { + "imported": "Updated {shortcuts}.", + "importedNone": "No shortcuts were changed.", + "importErrors": "Ignored {unknown} and {invalid}.", + "resetAll": "All shortcuts reset to defaults." + }, + "fileManager": { + "title": "File Manager", + "selectAll": "Select all files", + "cutFiles": "Cut selected files", + "copyFiles": "Copy selected files", + "duplicateFile": "Duplicate selected file", + "pasteFiles": "Paste files", + "searchFiles": "Search files", + "moveUpDirectory": "Move Up a directory", + "moveUpSelection": "Move Up the selection", + "moveDownSelection": "Move Down the selection", + "renameFile": "Rename file", + "deselectAll": "Deselect all files", + "deleteFiles": "Delete selected files" + }, + "table": { + "title": "Table Navigation", + "previousPage": "Previous page", + "nextPage": "Next page", + "firstPage": "First page", + "lastPage": "Last page" + }, + "console": { + "title": "Server Console", + "searchContent": "Search in console output", + "previousCommand": "Previous command in history", + "nextCommand": "Next command in history" + }, + "serverList": { + "title": "Server List", + "selectServer": "Hold S and click to select/deselect server" + } + }, "sshKeys": { "title": "Chei SSH", + "subtitle": "{current} of {max} maximum ssh keys created.", + "tooltip": { + "limitReached": "You are limited to {max} ssh keys." + }, "table": { "columns": { "fingerprint": "Amprentă" @@ -429,6 +1248,9 @@ "toast": { "created": "Cheie SSH creată." }, + "button": { + "uploadKeyFile": "Upload Key File" + }, "form": { "publicKey": "Cheie publică" } @@ -457,6 +1279,40 @@ } } }, + "commandSnippets": { + "title": "Command Snippets", + "subtitle": "{current} of {max} maximum command snippets created.", + "tooltip": { + "limitReached": "You are limited to {max} command snippets." + }, + "modal": { + "createCommandSnippet": { + "title": "Create Command Snippet", + "toast": { + "created": "Command snippet created." + } + }, + "editCommandSnippet": { + "title": "Edit Command Snippet", + "toast": { + "updated": "Command snippet updated." + } + }, + "deleteCommandSnippet": { + "title": "Confirm Command Snippet Deletion", + "content": "Are you sure you want to delete **{name}** from your account?", + "toast": { + "removed": "Command snippet removed." + } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } + } + } + }, "oauthLinks": { "title": "Legături OAuth", "button": { @@ -480,6 +1336,13 @@ }, "apiKeys": { "title": "Chei API", + "subtitle": "{current} of {max} maximum api keys created.", + "button": { + "apiDocumentation": "API Documentation" + }, + "tooltip": { + "limitReached": "You are limited to {max} api keys." + }, "table": { "columns": { "key": "Cheie", @@ -500,12 +1363,25 @@ "updated": "Cheie API actualizată." } }, + "recreateApiKey": { + "title": "Recreate API Key", + "content": "Recreating an API key will generate a new key and invalidate the old one. Are you sure you want to recreate the API key **{name}**?", + "toast": { + "recreated": "API key recreated." + } + }, "deleteApiKey": { "title": "Confirmă ștergerea cheii API", "content": "Ești sigur că vrei să ștergi **{name}** din contul tău?", "toast": { "removed": "Cheie API eliminată." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -514,56 +1390,2978 @@ "userPermissions": "Permisiuni utilizator", "serverPermissions": "Permisiuni server", "adminPermissions": "Permisiuni admin" + }, + "create": { + "title": "Create API Key", + "subtitle": "An application is requesting an API key to be created for your account.", + "alert": { + "adminPermissions": "This API key requests **admin permissions**. Anyone in possession of this key will be able to perform administrative actions on this panel in your name. Only continue if you absolutely trust the requesting application.", + "callbackUrl": "After creation, the new API key will be sent to **{url}**." + }, + "noPermissions": "This API key will not have any permissions.", + "keyCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "button": { + "goToApiKeys": "Go to API Keys" + } } }, "activity": { "title": "Activitate" } }, - "server": { - "console": { - "title": "Consolă", - "input": { - "placeholder": "Tastează o comandă...", - "ariaLabel": "Câmp de introducere comenzi consolă." - }, - "message": { - "serverMarkedAs": "Server marcat ca {state}...", - "transferFailed": "Transferul a eșuat.", - "pullingImage": "Serverul tău descarcă în prezent imaginea docker. Te rugăm să aștepți...", - "pulling": "Descărcare", - "extracting": "Extragere" - }, - "details": { - "address": "Adresă", - "port": "Port", - "uptime": "Uptime", - "cpuLoad": "Încărcare CPU", - "memoryLoad": "Încărcare memorie", - "diskUsage": "Utilizare disc", - "networkIn": "Rețea (Intrare)", - "networkOut": "Rețea (Ieșire)", - "normalizeCpuLoad": "Normalizează încărcarea CPU (schimbat la maxim 100%)" + "admin": { + "home": { + "title": "Home", + "alert": { + "newPanelVersion": "A new version is available for the panel! You are currently on {current} and the latest version is {latest}. You may want to consider upgrading. [Click here]({upgradeUrl}) to view upgrade instructions." }, - "power": { - "modal": { - "forceStop": { - "title": "Oprește forțat procesul", - "content": "Oprirea forțată a unui server poate duce la coruperea datelor." + "tabs": { + "overview": { + "title": "Overview", + "page": { + "permissionDenied": "You do not have permission to read the statistics that would have been here otherwise. For now, enjoy this bird.", + "card": { + "systemOverview": "System Overview", + "generalStatistics": "General Statistics", + "backupStatistics": "Backup Statistics" + }, + "system": { + "cpu": "CPU", + "memoryUsage": "Memory Usage ({process} used by Panel)", + "memoryValue": "{used} / {total} ({percent}%)", + "kernelVersion": "Kernel Version ({architecture})", + "containerType": "Container Type", + "databaseVersion": "Database Version ({size})", + "cacheVersion": "Cache Version", + "cacheCalls": "Cache Calls", + "cacheHits": "Cache Hits ({percent}%)", + "cacheMisses": "Cache Misses ({percent}%)", + "avgCachedCallLatency": "Avg. Cached Call Latency" + }, + "containerType": { + "none": "None detected", + "official": "Official", + "officialAio": "Official AIO", + "officialHeavy": "Official Heavy" + }, + "stats": { + "users": "Users", + "servers": "Servers", + "locations": "Locations", + "nodes": "Nodes", + "nestEggs": "Nest Eggs", + "databaseHosts": "Database Hosts", + "backupConfigurations": "Backup Configurations", + "roles": "Roles" + }, + "backup": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month", + "totalAllTime": "Total backups all time", + "successfulAllTime": "Successful backups all time", + "failedAllTime": "Failed backups all time", + "deletedAllTime": "Deleted backups all time", + "totalToday": "Total backups today", + "successfulToday": "Successful backups today", + "failedToday": "Failed backups today", + "deletedToday": "Deleted backups today", + "totalWeek": "Total backups this week", + "successfulWeek": "Successful backups this week", + "failedWeek": "Failed backups this week", + "deletedWeek": "Deleted backups this week", + "totalMonth": "Total backups this month", + "successfulMonth": "Successful backups this month", + "failedMonth": "Failed backups this month", + "deletedMonth": "Deleted backups this month", + "successfulValue": "{count} ({size})", + "deletedValue": "{count} ({size})" + } } - } - }, - "stats": { - "cpuLoad": "Încărcare CPU", - "memoryLoad": "Încărcare memorie", - "network": "Rețea", - "inbound": "Intrare", - "outbound": "Ieșire" - } - }, + }, + "updates": { + "title": "Updates", + "page": { + "alert": { + "extensionUpdateErrors": "There were errors checking for updates for some extensions." + }, + "card": { + "panelVersion": "Panel Version", + "versionHistory": "Version History", + "outdatedExtensions": "Outdated Extensions", + "outdatedNodes": "Outdated Nodes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" + }, + "panelVersion": "Your panel is currently running version `{current}`. The latest available version is `{latest}`.", + "unknown": "unknown", + "button": { + "recheck": "Recheck for Updates" + }, + "toast": { + "recheckComplete": "Recheck complete." + }, + "selectHistory": "Select an update history to view.", + "historyPanel": "Panel", + "historyExtension": "Extension: {name}", + "extensionsUpToDate": "All extensions are up to date.", + "extensionsOutdated": "Some extensions are outdated or had errors when checking for updates.", + "noChangelog": "No changelog", + "nodesUpToDate": "Seems like all nodes are up to date. ({failed} failed to check)", + "nodesOutdated": "Some nodes are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "table": { + "version": "Version", + "installed": "Installed", + "packageName": "Package Name", + "latestVersion": "Latest Version", + "changes": "Changes", + "error": "Error" + } + } + }, + "health": { + "title": "Health", + "page": { + "card": { + "generalHealth": "General Health", + "extensionMigrationHealth": "Extension Migration Health", + "desyncNodes": "Desync Nodes", + "debugMode": "Debug Mode" + }, + "appliedMigrations": "Applied Migrations ({percent}%)", + "migrationsValue": "{applied} / {total}", + "avgNtpOffset": "Avg. NTP Offset", + "noExtensions": "No extensions found.", + "nodesSynced": "Seems like all nodes have a synced clock (within 5 seconds of panel clock). ({failed} failed to check)", + "nodesDesync": "Some nodes have desync clocks (over 5 seconds off of the panel's clock). This can cause file download/console issues. ({desync} desync, {failed} failed to check)", + "debugEnabled": "Debug mode is currently enabled.", + "debugDisabled": "Debug mode is currently disabled.", + "debugResetNote": "This setting will be reset to the default ({default}) when the application restarts.", + "table": { + "packageName": "Package Name", + "applied": "Applied", + "total": "Total", + "id": "ID", + "desync": "Desync", + "appliedValue": "{applied} ({percent}%)" + }, + "button": { + "enableDebug": "Enable Debug Mode", + "disableDebug": "Disable Debug Mode" + }, + "toast": { + "debugEnabled": "Debug mode enabled.", + "debugDisabled": "Debug mode disabled." + } + } + } + } + }, + "settings": { + "title": "Settings", + "tabs": { + "application": { + "title": "Application", + "page": { + "title": "Application Settings", + "form": { + "icon": "Icon", + "iconLight": "Icon (Light Mode)", + "banner": "Banner", + "bannerLight": "Banner (Light Mode)", + "sessionCookie": "Session Cookie", + "sessionDurationSeconds": "Session Duration (seconds)", + "twoFactorRequirement": "Two-Factor Authentication Requirement", + "telemetryEnabled": "Enable Telemetry", + "telemetryEnabledDescription": "Allow Calagopus to collect limited and anonymous usage data to help improve the application.", + "registrationEnabled": "Enable Registration" + }, + "enum": { + "twoFactorRequirement": { + "admins": "Admins", + "allUsers": "All Users", + "none": "None" + } + }, + "button": { + "previewTelemetry": "Preview Telemetry" + }, + "toast": { + "updated": "Application settings updated." + }, + "modal": { + "disableTelemetry": { + "title": "Confirm Disabling Telemetry", + "content": "Are you sure you want to disable telemetry? Telemetry helps us improve Calagopus by providing anonymous usage data. Disabling telemetry will prevent any data from being sent." + }, + "enableRegistration": { + "title": "Confirm Enabling Registration", + "content": "Are you sure you want to enable registration? Enabling registration allows anyone to create an account on this panel. If you do not have a captcha configured, this may be a mistake." + }, + "telemetryPreview": { + "title": "Telemetry Preview" + } + } + } + }, + "storage": { + "title": "Storage", + "page": { + "title": "Storage Settings", + "form": { + "driver": "Driver" + }, + "enum": { + "driver": { + "filesystem": "Filesystem", + "s3": "S3" + } + }, + "toast": { + "updated": "Storage settings updated." + }, + "modal": { + "changeStorageType": { + "title": "Confirm Changing Storage Type", + "content": "Are you sure you want to change the storage type? Changing the storage type will cause the application to look for assets (e.g. profile pictures) in a different location, which may result in missing assets if they are not moved to the new location manually." + } + }, + "s3": { + "alert": { + "permissionsTitle": "Note on Permissions", + "permissionsIntro": "To ensure that the storage backend works correctly, please make sure the following subdirectories are publicly accessible over the \"Public URL\" you provided:", + "permissionsAssets": "This is where all admin assets (e.g., icons) will be stored.", + "permissionsAvatars": "This is where all user avatars will be stored.", + "permissionsPublicData": "This is where extensions can store public data (e.g., images)." + }, + "form": { + "pathStyle": "Using path-style URLs" + } + } + } + }, + "mail": { + "title": "Mail", + "page": { + "title": "Email Settings", + "enum": { + "provider": { + "none": "None", + "smtp": "SMTP", + "sendmail": "Sendmail Command", + "filesystem": "Filesystem" + }, + "tlsMode": { + "none": "None", + "startTls": "STARTTLS", + "implicitTls": "Implicit TLS" + } + }, + "toast": { + "updated": "Email settings updated." + }, + "modal": { + "sendTestEmail": { + "title": "Send Test Email", + "toast": { + "sent": "Test email has been sent successfully." + } + } + }, + "smtp": { + "form": { + "tlsMode": "TLS Mode", + "skipCertValidation": "Skip Certificate Validation" + } + } + } + }, + "mailTemplates": { + "title": "Mail Templates", + "page": { + "title": "Email Template Settings", + "sidebar": { + "templates": "Templates", + "loading": "Loading...", + "availableVariables": "Available Variables" + }, + "alert": { + "syntaxBefore": "Templates use the", + "syntaxLink": "MiniJinja", + "syntaxMiddle": "templating syntax. Variables are referenced with", + "syntaxAnd": "and control structures like", + "syntaxOr": "and", + "syntaxAfter": "are supported." + }, + "empty": "Select a template from the sidebar to edit it.", + "loadingTemplate": "Loading template...", + "form": { + "subject": "Subject" + }, + "toast": { + "saved": "Email template saved.", + "reset": "Email template reset to default." + }, + "modal": { + "reset": { + "title": "Reset to default", + "content": "This will discard your custom template for **{identifier}** and restore the built-in default. This cannot be undone." + } + } + } + }, + "captcha": { + "title": "Captcha", + "page": { + "title": "Captcha Settings", + "toast": { + "updated": "Captcha settings updated." + }, + "recaptcha": { + "form": { + "v3": "V3" + } + } + } + }, + "webauthn": { + "title": "Webauthn", + "page": { + "title": "Webauthn Settings", + "form": { + "rpId": "RP Id", + "rpOrigin": "RP Origin" + }, + "button": { + "autofill": "Autofill" + }, + "toast": { + "updated": "Webauthn settings updated.", + "ipNotAllowed": "Cannot use WebAuthn on an IP address." + }, + "modal": { + "changeRpId": { + "title": "Confirm Changing RP Id", + "content": "Are you sure you want to change the RP Id? Changing the RP Id will break all existing Webauthn credentials and require users to re-register their devices. This can have significant consequences, so please make sure you understand the implications before proceeding." + } + } + } + }, + "server": { + "title": "Server", + "page": { + "title": "Server Settings", + "form": { + "maxFileManagerViewSize": "Max File Manager View Size", + "maxScheduleStepCount": "Max Schedule Steps", + "maxFileManagerContentSearchSize": "Max File Manager Content Search Size", + "maxFileManagerSearchResults": "Max File Manager Search Results", + "maxSubuserCount": "Max Subuser Count", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", + "allowOverwritingCustomDockerImage": "Allow Overwriting Custom Docker Image", + "allowOverwritingCustomDockerImageDescription": "If enabled, users will be able to overwrite the Docker image specified in the server configuration using the Eggs list, even if an admin has set a custom Docker image.", + "allowViewingInstallationLogs": "Allow Viewing Installation Logs", + "allowViewingInstallationLogsDescription": "If enabled, users with console read permissions will also be able to view installation logs via the websocket connection. If disabled, installation logs will only be available for admins.", + "allowAcknowledgingInstallationFailure": "Allow Acknowledging Installation Failure", + "allowAcknowledgingInstallationFailureDescription": "If enabled, users will be able to acknowledge installation failures for servers that are in the \"Install Failed\" state, allowing them to attempt to start the server instead of having to wait for an admin. If disabled, only admins will be able to acknowledge installation failures.", + "allowViewingTransferProgress": "Allow Viewing Transfer Progress", + "allowViewingTransferProgressDescription": "If enabled, users with console read permissions will also be able to view transfer progress logs via the websocket connection. If disabled, transfer progress logs will only be available for admins.", + "containerPrelude": "Container Prelude", + "containerPreludeDescription": "The terminal prelude used for some status-related messages in the server console." + }, + "toast": { + "updated": "Server settings updated." + } + } + }, + "user": { + "title": "User", + "page": { + "title": "User Settings", + "form": { + "maxServerGroupCount": "Max Server Groups", + "maxApiKeyCount": "Max API Keys", + "maxCommandSnippetCount": "Max Command Snippets", + "maxSecurityKeyCount": "Max Security Keys", + "maxSshKeyCount": "Max SSH Keys", + "allowChangingLanguage": "Allow Changing Language", + "allowChangingLanguageDescription": "If enabled, users will be able to change their language preferences." + }, + "routeOrder": { + "title": "Client Route Order" + }, + "toast": { + "updated": "User settings updated." + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "Activity Settings", + "form": { + "adminLogRetentionDays": "Admin Activity Retention Days", + "userLogRetentionDays": "User Activity Retention Days", + "serverLogRetentionDays": "Server Activity Retention Days", + "adminLogRetentionCount": "Admin Activity Retention Count", + "userLogRetentionCount": "User Activity Retention Count", + "serverLogRetentionCount": "Server Activity Retention Count", + "serverLogAdminActivity": "Log Server Admin Activity", + "serverLogAdminActivityDescription": "Enable or disable logging of admin activity on servers where the admin isn't an owner or subuser.", + "serverLogScheduleActivity": "Log Server Schedule Activity", + "serverLogScheduleActivityDescription": "Enable or disable logging of activity done by server schedules." + }, + "toast": { + "updated": "Activity settings updated." + } + } + }, + "ratelimits": { + "title": "Ratelimits", + "page": { + "title": "Ratelimit Settings", + "form": { + "hits": "Hits", + "hitsDescription": "Maximum number of requests allowed per window.", + "windowSeconds": "Window", + "windowSecondsDescription": "Window duration in seconds." + }, + "toast": { + "updated": "Rate limit settings updated." + } + } + } + } + }, + "announcements": { + "title": "Announcements", + "resourceName": "Announcement", + "tabs": { + "general": { + "page": { + "modal": { + "delete": { + "title": "Confirm Announcement Deletion", + "content": "Are you sure you want to delete **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" + } + }, + "form": { + "dismissibleEnd": "Dismissible End", + "enabledStart": "Enabled Start", + "enabledEnd": "Enabled End", + "locations": "Locations", + "locationsDescription": "Leave empty to apply to all locations.", + "nodes": "Nodes", + "nodesDescription": "Leave empty to apply to all nodes.", + "backupConfigurations": "Backup Configurations", + "backupConfigurationsDescription": "Leave empty to apply to all backup configurations.", + "eggsPlaceholder": "Select Eggs", + "dismissible": "Dismissible" + }, + "titleCreate": "Create Announcement", + "titleUpdate": "Update Announcement" + } + } + }, + "enum": { + "announcementType": { + "info": "Info", + "success": "Success", + "warning": "Warning", + "error": "Error" + } + } + }, + "assets": { + "title": "Assets", + "button": { + "newDirectory": "New Directory", + "upload": "Upload", + "copyLink": "Copy Link" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" + }, + "toast": { + "assetDeleted": "Asset deleted.", + "assetsDeleted": "{assets} deleted." + }, + "modal": { + "createDirectory": { + "title": "New Directory", + "createdAs": "Will be created at " + }, + "deleteAssets": { + "title": "Confirm Asset Deletion", + "content": "Are you sure you want to delete `{count}` assets?" + }, + "deleteAsset": { + "title": "Delete Asset", + "content": "Are you sure you want to delete this asset? This action cannot be undone." + } + } + }, + "extensions": { + "title": "Extensions", + "unknownExtension": "Unknown Extension", + "alert": { + "noExtensions": "No extensions installed.", + "heavyImageMissing": "You don't seem to be using the heavy image required to install extensions, see [here]({docsUrl}) on how to switch to it." + }, + "button": { + "viewBuildLogs": "View build logs", + "install": "Install extension", + "rebuild": "Rebuild extensions", + "configure": "Configure", + "back": "Back to Extensions", + "accept": "Accept", + "decline": "Decline" + }, + "tooltip": { + "building": "The panel is currently building extension code. Please wait.", + "noPendingBuild": "No pending extensions to build.", + "noBackend": "Backend extension is required to configure this extension.", + "noConfigurationPage": "This extension does not have a configuration page defined.", + "removeExtension": "Remove extension" + }, + "badge": { + "frontendMissing": "Frontend missing", + "backendMissing": "Backend missing", + "pendingBuild": "Pending build", + "pendingRemoval": "Pending removal" + }, + "card": { + "version": "Version", + "authors": "Authors" + }, + "section": { + "pendingExtensions": "Pending extensions", + "noPendingExtensions": "No pending extensions." + }, + "dropzone": { + "title": "Drop some files here to install as Extensions", + "subtitle": "Release to start installing" + }, + "toast": { + "buildStarted": "Extension rebuild started successfully.", + "buildCompleted": "Extension build completed. You may need to refresh the page.", + "added": "Extension `{packageName}` added successfully.", + "removed": "Extension `{packageName}` removed successfully." + }, + "notFound": { + "title": "Extension Not Found", + "content": "Extension with package name \"{packageName}\" not found." + }, + "configure": { + "title": "Configure {packageName}", + "noConfigurationPage": "This extension does not have a configuration page." + }, + "modal": { + "buildLogs": { + "title": "Build Logs", + "empty": "No logs found." + }, + "license": { + "title": "License agreement", + "description": "The extension `{packageName}` requires you to accept the following license before it can be installed." + }, + "remove": { + "title": "Remove extension", + "content": "Are you sure you want to remove the extension `{packageName}`? This action cannot be undone.", + "form": { + "removeMigrations": "Do you want to remove & rollback the database migrations of this extension?" + } + } + } + }, + "users": { + "title": "Users", + "resourceName": "User", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, + "tooltip": { + "admin": "Admin", + "twoFactorEnabled": "2FA Enabled", + "twoFactorDisabled": "2FA Disabled" + }, + "table": { + "columns": { + "role": "Role" + } + }, + "tabs": { + "general": { + "page": { + "tooltip": { + "cannotImpersonateSelf": "You cannot impersonate yourself." + }, + "button": { + "disableTwoFactor": "Disable Two Factor", + "sendPasswordResetEmail": "Send Password Reset Email", + "impersonate": "Impersonate" + }, + "form": { + "admin": "Admin", + "adminDescription": "Admin users have full, unrestricted access to everything on the panel.", + "frozen": "Frozen", + "frozenDescription": "Frozen users cannot make any changes to their account information.", + "suspended": "Suspended", + "suspendedDescription": "Suspended users cannot access the panel in any meaningful way.", + "role": "Role" + }, + "modal": { + "delete": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete **{username}**?" + }, + "disableTwoFactor": { + "title": "Disable User Two Factor", + "content": "Are you sure you want to remove the two factor of **{username}**?", + "toast": { + "disabled": "User two factor disabled." + } + }, + "sendPasswordResetEmail": { + "title": "Send Password Reset Email", + "content": "Are you sure you want to send a password reset email to **{email}**?", + "toast": { + "sent": "Password reset email sent." + } + } + }, + "titleCreate": "Create User", + "titleUpdate": "Update User" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "User Servers", + "showOwnedOnly": "Only show users' owned servers" + } + }, + "oauthLinks": { + "title": "OAuth Links", + "page": { + "title": "User OAuth Links", + "toast": { + "added": "OAuth Link added.", + "removed": "OAuth Link removed." + }, + "modal": { + "add": { + "title": "Add OAuth Link", + "form": { + "oauthProvider": "OAuth Provider" + } + }, + "delete": { + "title": "Confirm OAuth Link Deletion", + "content": "Are you sure you want to delete the **{provider}** connection from **{username}**?" + } + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "User Activity" + } + } + } + }, + "locations": { + "title": "Locations", + "resourceName": "Location", + "tabs": { + "general": { + "page": { + "form": { + "flag": "Flag" + }, + "modal": { + "delete": { + "title": "Confirm Location Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "titleCreate": "Create Location", + "titleUpdate": "Update Location" + } + }, + "databaseHosts": { + "title": "Database Hosts", + "page": { + "title": "Location Database Hosts", + "toast": { + "created": "Location database host created.", + "deleted": "Location database host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Host" + }, + "delete": { + "title": "Confirm Location Database Host Deletion", + "content": "Are you sure you want to delete the database host **{name}** from **{location}**?" + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Location Nodes" + } + } + } + }, + "nodes": { + "title": "Nodes", + "resourceName": "Node", + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "general": { + "page": { + "tooltip": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "allInOneNode": "All-in-One Node", + "errorWhileFetchingVersion": "Error while fetching version", + "updateAvailable": "{version} (Update Available)", + "useWingsProxyUrl": "Use Wings Proxy URL" + }, + "form": { + "urlDescription": "Used for internal communication with the node.", + "publicUrlDescription": "Used for websocket connections and downloads.", + "backupConfigurationPlaceholder": "Inherit from Location", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." + }, + "button": { + "resetToken": "Reset Token", + "updateConfig": "Update Config" + }, + "toast": { + "tokenReset": "Node token reset." + }, + "alert": { + "noLocations": "You need to create at least one location before you can create nodes. Locations help organize your nodes geographically or logically." + }, + "titleCreate": "Create Node", + "titleUpdate": "Update Node" + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/pterodactyl/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "panelUrl": "Panel URL", + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the node: {error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Node Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "toast": { + "connectionLost": "Lost connection to the node statistics stream." + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "cpuThreads": "{model} ({threads} threads)", + "usedByWings": "{size} used by Wings", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "networkTraffic": "Network Traffic", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "inbound": "Inbound", + "outbound": "Outbound", + "networkInLabel": "Network In", + "networkOutLabel": "Network Out" + } + } + }, + "capacity": { + "title": "Capacity", + "page": { + "title": "Deployment Capacity", + "subtitle": "Resources allocated to servers on this node, measured against the limits configured in node settings, not the physical machine capacity. Deployment only checks memory and disk.", + "card": { + "resources": "Allocated Resources" + }, + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Under Maintenance", + "maintenanceDisabled": "Not Under Maintenance" + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "memoryOverhead": "Memory Overhead", + "servers": "Servers", + "noLimit": "No node limit", + "free": "{size} free", + "overhead": "+ {size} reserved overhead", + "cores": "{cores} cores allocated" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Node Logs", + "form": { + "logFile": "Log File", + "follow": "Follow" + }, + "button": { + "download": "Download Full Log" + }, + "toast": { + "connectionLost": "Lost connection to the node log stream." + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Node Allocations", + "tooltip": { + "clearSelection": "Clear Selection" + }, + "form": { + "ipAlias": "IP Alias" + }, + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "modal": { + "create": { + "title": "Create Node Allocations", + "button": { + "create": "Create {count}" + }, + "toast": { + "created": "{allocations} created." + } + }, + "update": { + "title": "Update Node Allocations", + "toast": { + "updated": "{allocations} updated." + } + }, + "delete": { + "title": "Confirm Node Allocations Deletion", + "content": "Are you sure you want to delete `{count}` allocations from **{name}**?", + "toast": { + "deleted": "{allocations} deleted." + } + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Node Mounts", + "toast": { + "added": "Node Mount added.", + "removed": "Node Mount removed." + }, + "modal": { + "add": { + "title": "Add Node Mount" + }, + "remove": { + "title": "Confirm Node Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Node Backups", + "input": { + "detachedOnly": "Only show detached backups" + }, + "tooltip": { + "backupNotOnSameNode": "This backup is not on the same node as the server. It is not viewable from the Client API." + }, + "toast": { + "downloadStarted": "Download started.", + "detached": "Backup detached successfully.", + "reattached": "Reattached backup to {name} successfully.", + "restoring": "Restoring backup to {name}...", + "exporting": "Exporting backup to files of {name}...", + "deleted": "Node backup deleted." + }, + "modal": { + "export": { + "title": "Export Node Backup to Files" + }, + "detach": { + "title": "Confirm Backup Detachment", + "content": "Are you sure you want to detach this backup from its server? It will not be deleted and can be reattached later." + }, + "reattach": { + "title": "Reattach Node Backup", + "description": "Reattaching a node backup will link it to a server. This is useful if the backup is detached or you want to link it to a different server. Do note that this is not a transfer tool, unless the backup is considered remote (can be accessed by multiple nodes), the server must belong to the same node as the backup." + }, + "restore": { + "title": "Restore Node Backup", + "form": { + "truncateDirectory": "Do you want to empty the filesystem of this server before restoring the backup?" + } + }, + "delete": { + "title": "Confirm Node Backup Deletion", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Node Servers", + "modal": { + "transfer": { + "title": "Transfer Servers", + "form": { + "allocationMode": "Allocation Mode", + "transferBackups": "Transfer backups", + "transferBackupsDescription": "Whether to transfer backups along with the servers." + }, + "toast": { + "started": "{servers} transfer started." + }, + "confirm": { + "title": "Confirm Server Transfers", + "content": "Are you sure you want to transfer `{count}` servers from **{from}** to **{to}**? This action cannot be undone." + }, + "enum": { + "allocationMode": { + "none": "None (scrap all allocations, server will not be automatically assigned new allocations on the destination node)", + "randomPrimary": "Randomize primary allocation (removes additional allocations)", + "randomAll": "Randomize all allocations (recommended to avoid incompatibility issues with destination node)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", + "eggConfigDeployment": "Assign allocations based on Egg deployment configuration (only works if the Egg has a deployment configuration and the destination node has compatible allocations)", + "eggConfigSelfAssignRange": "Self-assign new allocations based on Egg port range (only works if the Egg has a port range and the destination node has compatible allocations)" + } + } + }, + "powerAction": { + "title": "Confirm Power Action", + "content": "Are you sure you want to **{action}** {servers}?" + } + } + } + }, + "transfers": { + "title": "Outgoing Transfers", + "page": { + "title": "Node Transfers", + "table": { + "columns": { + "progress": "Progress", + "archiveRate": "Archive Rate", + "networkRate": "Network Rate" + } + } + } + } + }, + "modal": { + "delete": { + "title": "Confirm Node Deletion", + "content": "Are you sure you want to delete **{name}**?" + }, + "bulkConfig": { + "title": "Update Configuration - {nodes}", + "button": { + "apply": "Apply to {nodes}" + }, + "toast": { + "applied": "Configuration applied to {nodes}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "servers": { + "title": "Servers", + "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, + "general": { + "page": { + "titleCreate": "Create Server", + "titleUpdate": "Update Server", + "card": { + "basicInformation": "Basic Information", + "serverAssignment": "Server Assignment", + "resourceLimits": "Resource Limits", + "serverConfiguration": "Server Configuration", + "featureLimits": "Feature Limits", + "allocations": "Allocations", + "variables": "Variables" + }, + "alert": { + "suspended": "This server is suspended.", + "selectEggForVariables": "Please select an egg before you can configure variables." + }, + "badge": { + "serverSuspended": "Server Suspended" + }, + "form": { + "serverNamePlaceholder": "My Game Server", + "externalIdPlaceholder": "Optional external identifier", + "descriptionPlaceholder": "Server description", + "owner": "Owner", + "egg": "Egg", + "backupConfigurationPlaceholder": "Inherit from Node/Location", + "cpuLimit": "CPU Limit (%)", + "cpuLimitDescription": "The CPU limit in % that the server can use.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this server.", + "swapTooltip": "-1 will not set a limit.", + "memoryDescription": "The Memory limit of the server container.", + "memoryTooltip": "0 will not set a limit.", + "memoryOverhead": "Memory Overhead", + "memoryOverheadDescription": "Hidden Memory that will be added to the container.", + "diskSpace": "Disk Space", + "diskSpaceDescription": "The disk limit of the server.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the server container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems.", + "pinnedCpus": "Pinned CPUs", + "pinnedCpusDescription": "The CPU cores this server is pinned to.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", + "dockerImagePlaceholder": "ghcr.io/...", + "predefinedDockerImages": "Predefined Docker Images", + "predefinedDockerImagesPlaceholder": "No predefined image selected", + "timezonePlaceholder": "Europe/Amsterdam", + "startupCommandPlaceholder": "npm start", + "startupCommandCustom": "Custom", + "predefinedStartupCommands": "Predefined Startup Commands", + "startOnCompletion": "Start on Completion", + "startOnCompletionDescription": "Start server after installation completes.", + "skipInstaller": "Skip Installer", + "skipInstallerDescription": "Skip running the install script.", + "hugepagesPassthroughEnabled": "Enable Hugepages Passthrough", + "hugepagesPassthroughEnabledDescription": "Enable hugepages passthrough for the server (mounts /dev/hugepages into the container).", + "kvmPassthroughEnabled": "Enable KVM Passthrough", + "kvmPassthroughEnabledDescription": "Enable KVM passthrough for the server (allows access to /dev/kvm inside the container).", + "allocationsLimit": "Allocations", + "databasesLimit": "Databases", + "databaseAgentsLimit": "Agent Databases", + "backupsLimit": "Backups", + "schedulesLimit": "Schedules" + }, + "modal": { + "confirmNoAllocation": { + "title": "No Primary Allocation Assigned", + "content": "You are creating a server without assigning any primary allocation. Are you sure you want to continue?", + "button": { + "confirm": "Create Anyway" + } + } + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Server Allocations", + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "form": { + "notesPlaceholder": "Notes" + }, + "toast": { + "updated": "Allocation updated.", + "setPrimary": "Allocation set as primary.", + "unsetPrimary": "Allocation unset as primary.", + "removed": "Allocation removed.", + "added": "{count} allocations added." + }, + "modal": { + "add": { + "title": "Add Server Allocations", + "form": { + "allocations": "Allocations" + }, + "button": { + "add": "Add {count}" + } + }, + "remove": { + "title": "Confirm Allocation Removal", + "content": "Are you sure you want to remove **{allocation}**?" + } + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Server Variables", + "toast": { + "updated": "Server variables updated." + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Server Mounts", + "toast": { + "added": "Server Mount added.", + "deleted": "Server Mount deleted." + }, + "modal": { + "add": { + "title": "Add Server Mount" + }, + "remove": { + "title": "Confirm Server Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Server Backups", + "input": { + "partiallyDetachedOnly": "Only show partially detached backups" + } + } + }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Server Logs", + "form": { + "logType": "Log Type" + }, + "enum": { + "logType": { + "console": "Console", + "install": "Install" + } + } + } + }, + "management": { + "title": "Management", + "page": { + "title": "Server Management", + "transfer": { + "title": "Transfer", + "content": "Transfer this server and it's data to another node within this system.", + "toast": { + "started": "Server transfer started." + }, + "modal": { + "title": "Server Transfer", + "form": { + "backupsToTransfer": "Backups to transfer" + }, + "tooltip": { + "aioNotSupported": "Transfers to the All-In-One node are not supported." + }, + "confirm": { + "title": "Confirm Server Transfer", + "content": "Are you sure you want to transfer **{name}** from **{from}** to **{to}**?", + "alert": { + "notAllBackupsSelected": "You have not selected all backups to transfer, the remaining backups will become partially detached if the transfer completes successfully." + } + } + } + }, + "suspend": { + "title": "Suspend", + "content": "This will suspend the server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the server through the panel or API.", + "button": "Suspend", + "toast": { + "suspended": "Server suspended." + }, + "modal": { + "title": "Confirm Server Suspension", + "content": "Are you sure you want to suspend **{name}**? This will stop the server and prevent it from starting. All running processes will be stopped and the user will not be able to access their files or otherwise manage the server through the panel or API." + } + }, + "unsuspend": { + "title": "Unsuspend", + "content": "This will unsuspend the server, allowing it to start again. The user will be able to access their files and otherwise manage the server through the panel or API.", + "button": "Unsuspend", + "toast": { + "unsuspended": "Server unsuspended." + }, + "modal": { + "title": "Confirm Server Unsuspension", + "content": "Are you sure you want to unsuspend **{name}**? This will allow the server to start again. The user will be able to access their files and otherwise manage the server through the panel or API." + } + }, + "clearState": { + "title": "Clear State", + "content": "This will clear the server state known by the panel.", + "button": "Clear State", + "toast": { + "cleared": "Server state cleared." + }, + "modal": { + "title": "Confirm Server State Clear", + "content": "Are you sure you want to clear the state of **{name}**? This will clear any known pending transfers and status failures, please make sure it is safe to do this before clicking without reason." + } + }, + "delete": { + "title": "Delete", + "content": "This will delete the server and all of its data. This action cannot be undone.", + "toast": { + "deleted": "Server deleted." + }, + "modal": { + "title": "Confirm Server Deletion", + "description": "You are about to delete **{name}**. Are you sure?", + "form": { + "deleteBackups": "Do you want to delete backups of this server?", + "confirmServerName": "Confirm Server Name", + "confirmServerNamePlaceholder": "Server Name" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "viewClient": { + "title": "View in Client Area" + } + } + }, + "nests": { + "title": "Nests", + "resourceName": "Nest", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Nest", + "titleUpdate": "Update Nest", + "modal": { + "delete": { + "title": "Confirm Nest Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": { + "deleteEggs": "Do you want to delete all eggs in this nest?" + } + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Eggs", + "resourceName": "Egg", + "dropzone": { + "title": "Drop some files here to import as Eggs", + "subtitle": "Release to start importing" + }, + "button": { + "updateFromRepository": "Update from Repository" + }, + "toast": { + "imported": "Egg imported.", + "moved": "Egg moved.", + "movedBulk": "{eggs} moved.", + "deletedBulk": "{eggs} deleted.", + "updatedFromRepository": "{eggs} updated using their respective repository egg successfully.", + "parseFailed": "Failed to parse egg: {error}" + }, + "modal": { + "move": { + "title": "Move Egg" + }, + "moveBulk": { + "title": "Move Eggs", + "confirm": "Move {eggs}" + }, + "deleteBulk": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete `{count}` eggs?" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg", + "titleUpdate": "Update Egg", + "card": { + "startupConfiguration": "Startup Configuration", + "stopConfiguration": "Stop Configuration", + "configFiles": "Config Files Configuration" + }, + "form": { + "eggRepository": "Egg Repository", + "eggRepositoryEgg": "Egg Repository Egg", + "startupDone": "Startup Done", + "startupDoneDescription": "Console message indicating startup completion.", + "stripAnsi": "Strip ANSI from startup messages", + "stripAnsiDescription": "Removes ANSI control characters from the console output before matching startup completion.", + "stopType": "Stop Type", + "stopCommand": "Stop Command", + "stopSignal": "Stop Signal", + "parser": "Parser", + "createNewFile": "Create New File", + "createNewFileDescription": "If enabled, the file will be created if it does not exist. If disabled, the file must already exist or the replacement will fail.", + "match": "Match", + "ifValue": "If Value", + "replaceWith": "Replace With", + "insertNew": "Insert New", + "insertNewDescription": "If enabled, if no existing value matches the \"Match\" field, the \"Replace With\" value will be inserted into the file. If disabled, if no match is found, no changes will be made to the file.", + "updateExisting": "Update Existing", + "updateExistingDescription": "If enabled, if a match is found, it will be replaced with the \"Replace With\" value. If disabled, the replacement will only insert new values and will fail if a match is found.", + "startupCommands": "Startup Commands", + "forceOutgoingIp": "Force Outgoing IP", + "separatePort": "Separate IP and Port", + "separatePortDescription": "Separates the primary IP and port on the Console page instead of joining them with \":\".", + "features": "Features", + "featurePlaceholder": "Feature", + "fileDenylist": "File Deny List", + "dockerImages": "Docker Images" + }, + "enum": { + "stopType": { + "command": "Send Command", + "signal": "Send Signal", + "docker": "Docker Stop" + } + }, + "emptyConfigFiles": "No config files defined.", + "emptyReplacements": "No replacements defined.", + "button": { + "addReplacement": "Add Replacement", + "addConfigFile": "Add Config File", + "fromFile": "from File", + "fromRepository": "from Repository" + }, + "toast": { + "exported": "Egg exported.", + "updated": "Egg updated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "installationScript": { + "title": "Installation Script", + "page": { + "title": "Egg Installation Script", + "form": { + "container": "Installation Container", + "entrypoint": "Container Entrypoint" + }, + "toast": { + "updated": "Egg script updated." + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Egg Variables", + "form": { + "supportsMarkdown": "Supports Markdown formatting.", + "defaultValue": "Default Value", + "defaultValuePlaceholder": "server.jar", + "userViewable": "User Viewable", + "userEditable": "User Editable", + "secret": "Secret", + "rules": "Rules", + "rulesDescription": "See https://laravel.com/docs/12.x/validation#available-validation-rules for the available validation rules." + }, + "toast": { + "created": "Egg variable created.", + "updated": "Egg variable updated.", + "deleted": "Egg variable deleted.", + "duplicated": "Egg variable duplicated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Variable Removal", + "content": "Are you sure you want to remove **{variable}**?", + "emptyVariable": "this empty variable" + }, + "duplicate": { + "title": "Duplicate Egg Variable" + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Egg Mounts", + "toast": { + "added": "Egg Mount added.", + "deleted": "Egg Mount deleted." + }, + "modal": { + "add": { + "title": "Add Egg Mount" + }, + "delete": { + "title": "Confirm Egg Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{egg}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Egg Servers" + } + } + } + } + } + } + }, + "eggConfigurations": { + "title": "Egg Configurations", + "resourceName": "Egg Configuration", + "table": { + "columns": { + "order": "Order" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Configuration", + "titleUpdate": "Update Egg Configuration", + "form": { + "order": "Order", + "eggs": "Eggs", + "eggsPlaceholder": "Select Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." + }, + "enum": { + "deploymentType": { + "random": "Random", + "range": "Port Range", + "addPrimary": "Add to Primary", + "subtractPrimary": "Subtract from Primary", + "multiplyPrimary": "Multiply Primary", + "dividePrimary": "Divide Primary" + } + }, + "allocation": { + "title": "Allocation Configuration", + "form": { + "userSelfAssign": "User Self Assign", + "userSelfAssignDescription": "Allow users to create their own allocations from a specified port range.", + "requirePrimaryAllocation": "Require Primary Allocation", + "requirePrimaryAllocationDescription": "Whether users must always have a primary allocation.", + "automaticAllocationStart": "Automatic Allocation Start", + "automaticAllocationEnd": "Automatic Allocation End", + "dedicatedIp": "Dedicated IP", + "dedicatedIpDescription": "Assign a dedicated ip address for servers using this egg configuration.", + "primaryAllocation": "Primary Allocation", + "primaryAllocationDescription": "Configure a primary port assignment for deployment.", + "primaryStartPort": "Primary Start Port", + "primaryEndPort": "Primary End Port", + "assignToVariable": "Assign to Variable", + "assignToVariablePlaceholder": "e.g. SERVER_PORT", + "assignToVariableDescription": "Optional environment variable to receive the assigned primary port." + }, + "divider": { + "deployment": "Deployment" + }, + "additionalPorts": { + "title": "Additional Ports", + "button": "Add Rule", + "empty": "No additional port rules configured." + }, + "deployment": { + "form": { + "startPort": "Start Port", + "endPort": "End Port", + "assignToVariable": "Assign to Variable", + "assignToVariableDescription": "Optional environment variable to receive the assigned port from this rule.", + "assignToVariablePlaceholder": "e.g. SERVER_PORT" + }, + "removeRule": "Remove deployment rule" + } + }, + "startup": { + "title": "Startup Configuration", + "form": { + "allowCustomStartupCommand": "Allow Custom Startup Command", + "allowCustomStartupCommandDescription": "Allow users to set their own, non-predefined startup commands." + } + }, + "modal": { + "delete": { + "title": "Confirm Egg Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + } + } + }, + "eggRepositories": { + "title": "Egg Repositories", + "resourceName": "Egg Repository", + "table": { + "columns": { + "gitRepository": "Git Repository" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Repository", + "titleUpdate": "Update Egg Repository", + "form": { + "gitRepository": "Git Repository" + }, + "button": { + "sync": "Sync" + }, + "toast": { + "synced": "Egg repository synchronised, found {eggs}." + }, + "modal": { + "delete": { + "title": "Confirm Egg Repository Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Egg Repository Eggs", + "table": { + "columns": { + "path": "Path" + } + }, + "toast": { + "installed": "Egg installed.", + "installedBulk": "{eggs} installed." + }, + "modal": { + "install": { + "title": "Install Egg Repository Egg" + }, + "installBulk": { + "title": "Install Egg Repository Eggs", + "button": "Install {eggs}" + } + }, + "drawer": { + "noReadme": "This egg does not have a README." + } + } + } + } + }, + "databaseHosts": { + "title": "Database Hosts", + "resourceName": "Database host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Host", + "titleUpdate": "Update Database Host", + "form": { + "publicHost": "Public Host", + "publicPort": "Public Port", + "connectionCredentials": "Connection Credentials", + "credentialType": "Credential Type", + "connectionString": "Connection String", + "connectionStringPlaceholder": "mysql://username:password@host:port" + }, + "enum": { + "credentialType": { + "connectionString": "Connection String", + "details": "Details" + } + }, + "button": { + "testConnection": "Test Connection" + }, + "toast": { + "tested": "Test successfully completed." + }, + "modal": { + "delete": { + "title": "Confirm Database Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "databases": { + "title": "Databases", + "page": { + "title": "Database Host Databases", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } + } + } + } + }, + "oAuthProviders": { + "title": "OAuth Providers", + "resourceName": "OAuth Provider", + "dropzone": { + "title": "Drop some files here to import as OAuth Providers", + "subtitle": "Release to start importing" + }, + "table": { + "columns": { + "loginOnly": "Login Only", + "linkViewable": "Link Viewable", + "userManageable": "User Manageable" + } + }, + "toast": { + "imported": "OAuth Provider imported.", + "parseFailed": "Failed to parse OAuth provider: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create OAuth Provider", + "titleUpdate": "Update OAuth Provider", + "card": { + "redirectUrl": { + "title": "Redirect URL", + "unavailable": "Available after creation" + } + }, + "form": { + "clientId": "Client Id", + "clientSecret": "Client Secret", + "authUrl": "Auth URL", + "tokenUrl": "Token URL", + "infoUrl": "Info URL", + "basicAuth": "Basic Auth", + "basicAuthDescription": "Uses HTTP Basic Authentication to transmit the client id and secret, not common anymore.", + "scopes": "Scopes", + "scopesDescription": "The OAuth2 scopes to request, make sure to include scopes for email and profile info when needed.", + "identifierPath": "Identifier Path", + "identifierPathDescription": "The path used to extract the unique user identifier from the Info URL response (https://serdejsonpath.live).", + "emailPath": "Email Path", + "emailPathDescription": "The path used to extract the email from the Info URL response (https://serdejsonpath.live).", + "usernamePath": "Username Path", + "usernamePathDescription": "The path used to extract the username from the Info URL response (https://serdejsonpath.live).", + "nameFirstPath": "First Name Path", + "nameFirstPathPlaceholder": "First Name URL", + "nameFirstPathDescription": "The path used to extract the first name from the Info URL response (https://serdejsonpath.live).", + "nameLastPath": "Last Name Path", + "nameLastPathDescription": "The path used to extract the last name from the Info URL response (https://serdejsonpath.live).", + "loginOnly": "Only allow Login", + "loginBypass2fa": "Bypass 2FA on Login", + "loginBypass2faDescription": "Allows users logging in with this provider to bypass their panel 2FA.", + "linkViewable": "Link Viewable to User", + "linkViewableDescription": "Allows the user to see the connection and its identifier in the client UI.", + "userManageable": "Link Manageable by User", + "userManageableDescription": "Allows the user to connect and disconnect with this provider." + }, + "toast": { + "exported": "OAuth Provider exported." + }, + "modal": { + "delete": { + "title": "Confirm OAuth Provider Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "mappings": { + "title": "Mappings", + "page": { + "title": "OAuth Provider Mappings", + "table": { + "columns": { + "matcher": "Matcher" + } + }, + "enum": { + "mappingType": { + "role": "Role", + "serverSubuser": "Server Subuser" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" + } + }, + "toast": { + "created": "OAuth provider mapping created.", + "updated": "OAuth provider mapping updated.", + "deleted": "OAuth provider mapping deleted." + }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, + "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", + "scopesDescription": "OAuth scopes that must all have been granted for this matcher to match.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", + "mappingType": "Mapping Type", + "role": "Role", + "permissions": "Permissions" + }, + "modal": { + "add": { + "title": "Add OAuth Provider Mapping" + }, + "edit": { + "title": "Edit OAuth Provider Mapping" + }, + "delete": { + "title": "Delete OAuth Provider Mapping", + "content": "Are you sure you want to delete this mapping? This action cannot be undone." + } + } + } + }, + "users": { + "title": "Users", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, + "page": { + "title": "OAuth Provider Users", + "table": { + "columns": { + "user": "User" + } + } + } + } + } + }, + "backupConfigurations": { + "title": "Backup Configurations", + "resourceName": "Backup configuration", + "table": { + "columns": { + "disk": "Disk" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Backup Configuration", + "titleUpdate": "Update Backup Configuration", + "alert": { + "ddupBak": "Ddup-Bak is Technology Preview software, it is technically not recommended for production use. If you acknowledge, sail ahead as you wish.", + "btrfs": "Btrfs requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "zfs": "ZFS requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "pbs": "The provided API token needs the following datastore ACLs: **DatastoreAudit** for usage and listing, **DatastoreBackup** for writing backups, and **DatastoreAdmin** (or equivalent prune/delete permissions) if backup deletion or pruning is enabled." + }, + "form": { + "backupDisk": "Backup Disk", + "maintenanceEnabledDescription": "If enabled, any server using this backup configuration will not be able to create new backups, or manage existing ones.", + "shared": "Shared", + "sharedDescription": "If enabled, backups on this backup configuration will not be transferred between nodes, they will be assumed to be accessible by all nodes." + }, + "modal": { + "delete": { + "title": "Confirm Backup Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "s3": { + "title": "S3 Settings", + "form": { + "partSize": "Part Size", + "compressionType": "Compression Type", + "pathStyle": "Using path-style URLs" + } + }, + "restic": { + "title": "Restic Settings", + "form": { + "repository": "Repository", + "retryLockSeconds": "Retry Lock Seconds", + "environmentVariables": "Environment Variables", + "cronSchedule": "Cron Schedule", + "cronScheduleDescription": "Format: second minute hour day month weekday.", + "nodes": "Nodes", + "nodesPlaceholder": "Select nodes" + }, + "pruneJobs": { + "title": "Prune Jobs", + "description": "Scheduled restic prune runs. Each job runs on the configured nodes following its cron schedule.", + "button": { + "add": "Add Prune Job" + } + } + }, + "pbs": { + "title": "Proxmox Backup Server Settings", + "form": { + "url": "Server URL", + "datastore": "Datastore", + "namespace": "Namespace", + "tokenId": "Token ID", + "tokenSecret": "Token Secret", + "fingerprint": "TLS Certificate Fingerprint", + "backupIdPrefix": "Backup ID Prefix" + } + }, + "kopia": { + "title": "Kopia Settings", + "form": { + "url": "Kopia Server URL", + "fingerprint": "TLS Certificate Fingerprint", + "tags": "Backup Tags" + } + } + } + }, + "stats": { + "title": "Stats", + "page": { + "title": "Backup Configuration Stats", + "card": { + "title": "Backup Statistics" + }, + "period": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month" + }, + "periodLabel": { + "allTime": "all time", + "today": "today", + "week": "this week", + "month": "this month" + }, + "stat": { + "total": "Total backups {period}", + "successful": "Successful backups {period}", + "failed": "Failed backups {period}", + "deleted": "Deleted backups {period}" + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Backup Configuration Backups", + "toast": { + "downloadStarted": "Download started." + } + } + }, + "locations": { + "title": "Locations", + "page": { + "title": "Backup Configuration Locations" + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Backup Configuration Nodes" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Backup Configuration Servers" + } + } + } + }, + "mounts": { + "title": "Mounts", + "resourceName": "Mount", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Mount", + "titleUpdate": "Update Mount", + "alert": "Mounts are a powerful and potentially dangerous feature. Improper use can lead to data loss or security vulnerabilities (including container escapes). Make sure you understand the implications of using mounts before creating or updating them.", + "form": { + "source": "Source", + "target": "Target", + "readOnly": "Read Only", + "userMountable": "User Mountable" + }, + "modal": { + "delete": { + "title": "Confirm Mount Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Mount Eggs", + "toast": { + "added": "Mount Egg added.", + "removed": "Mount Egg deleted." + }, + "modal": { + "add": { + "title": "Add Mount Egg", + "form": { + "egg": "Egg" + } + }, + "remove": { + "title": "Confirm Mount Egg Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Mount Nodes", + "toast": { + "added": "Mount Node added.", + "removed": "Mount Node deleted." + }, + "modal": { + "add": { + "title": "Add Mount Node" + }, + "remove": { + "title": "Confirm Mount Node Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Mount Servers" + } + } + } + }, + "roles": { + "title": "Roles", + "resourceName": "Role", + "table": { + "columns": { + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Role", + "titleUpdate": "Update Role", + "alert": { + "impersonate": "This role has the `users.impersonate` permission, which allows users with this role to impersonate any other user, including administrators. Be cautious when assigning this permission to roles with less trusted users." + }, + "form": { + "requireTwoFactor": "Require Two Factor", + "requireTwoFactorDescription": "Require users with this role to use two factor authentication.", + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + }, + "modal": { + "delete": { + "title": "Confirm Role Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "users": { + "title": "Users", + "page": { + "title": "Role Users" + } + } + } + }, + "activity": { + "title": "Activity" + } + }, + "server": { + "viewAdmin": { + "title": "View in Admin Area" + }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, + "console": { + "title": "Consolă", + "input": { + "placeholder": "Tastează o comandă...", + "ariaLabel": "Câmp de introducere comenzi consolă." + }, + "toast": { + "installCancelled": "Server install cancelled.", + "transferCancelled": "Server transfer cancelled." + }, + "modal": { + "sshDetails": { + "title": "SSH Details", + "form": { + "command": "SSH Command" + }, + "launch": "Launch" + } + }, + "notification": { + "suspended": "Your Server is currently suspended. No actions can be performed until the suspension is lifted.", + "suspendedAdmin": "This server is currently suspended. Since you are an administrator, you can still access the server, but actions are limited.", + "nodeMaintenance": "Your Server is on a node that is currently under maintenance.", + "transferring": "Your Server is currently being transferred to another node.", + "restoringBackup": "Your Server is currently restoring from a backup. Please wait...", + "installing": "Your Server is currently being installed. Please wait...", + "pendingRestart": "Your Server has pending changes that require a restart. Please restart your server to apply these changes." + }, + "message": { + "serverMarkedAs": "Server marcat ca {state}...", + "installFailed": "Installation has failed.", + "installCompleted": "Installation has completed successfully.", + "transferFailed": "Transferul a eșuat.", + "transferCompleted": "Transfer has completed successfully. Reconnecting to server...", + "pullingImage": "Serverul tău descarcă în prezent imaginea docker. Te rugăm să aștepți...", + "pulling": "Descărcare", + "extracting": "Extragere" + }, + "tooltip": { + "search": "Search", + "sshDetails": "SSH Details", + "commandHistory": "Command History", + "decreaseFontSize": "Decrease Font Size", + "increaseFontSize": "Increase Font Size" + }, + "drawer": { + "commandHistory": { + "title": "Command History", + "detailTitle": "Command Details", + "noCommands": "No commands found.", + "copyButton": "Copy Command", + "sendButton": "Send Command", + "commandSent": "Command sent successfully." + } + }, + "feature": { + "eula": { + "title": "Minecraft EULA Agreement", + "content": "The Minecraft server requires you to accept the [Minecraft End User License Agreement](https://minecraft.net/eula) before it can start.", + "contentDetails": "By clicking \"Accept EULA\", you agree to the terms of the Minecraft EULA and the **eula.txt** file will be updated to **eula=true**.", + "toast": { + "accepted": "EULA accepted successfully." + }, + "button": { + "accept": "Accept EULA" + } + }, + "javaVersion": { + "title": "Unsupported Java Version", + "content": "This server is currently running an unsupported version of Java and cannot be started.", + "contentDetails": "Please select a supported Docker image from the list below to continue starting the server.", + "toast": { + "updated": "Docker image updated successfully." + }, + "button": { + "update": "Update Docker Image" + } + } + }, + "details": { + "address": "Adresă", + "port": "Port", + "uptime": "Uptime", + "cpuLoad": "Încărcare CPU", + "memoryLoad": "Încărcare memorie", + "diskUsage": "Utilizare disc", + "networkIn": "Rețea (Intrare)", + "networkOut": "Rețea (Ieșire)", + "normalizeCpuLoad": "Normalizează încărcarea CPU (schimbat la maxim 100%)" + }, + "power": { + "modal": { + "forceStop": { + "title": "Oprește forțat procesul", + "content": "Oprirea forțată a unui server poate duce la coruperea datelor." + } + } + }, + "stats": { + "cpuLoad": "Încărcare CPU", + "memoryLoad": "Încărcare memorie", + "network": "Rețea", + "inbound": "Intrare", + "outbound": "Ieșire" + }, + "socketConnected": "Connected ({ping}ms ping)", + "socketDisconnected": "Disconnected" + }, + "files": { + "title": "Files", + "titleEditorViewing": "Viewing {file}", + "titleEditorPlaying": "Playing {file}", + "titleEditorEditing": "Editing {file}", + "titleEditorNew": "New File", + "titleDiffRevisionVsCurrent": "{file} - Revision #{revision} vs Current", + "titleDiffRevisionVsRevision": "{file} - Revision #{previousRevision} vs #{revision}", + "table": { + "columns": { + "modified": "Modified" + } + }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, + "button": { + "new": "New", + "connect": "Connect", + "connectSftp": "via SFTP", + "connectVscode": "via VS Code", + "openInNewWindow": "Open in new Window", + "rename": "Rename", + "copy": "Copy", + "fingerprint": "Fingerprint", + "permissions": "Permissions", + "unarchive": "Unarchive", + "archive": "Archive", + "more": "More", + "remoteCopy": "Remote Copy", + "search": "Search", + "exitBackup": "Exit Backup", + "fileFromEditor": "File from Editor", + "directory": "Directory", + "fileFromPull": "File from Pull", + "fileFromUpload": "File from Upload", + "directoryFromUpload": "Directory from Upload" + }, + "actionBar": { + "copyHere": "Copy {files} here", + "moveHere": "Move {files} here" + }, + "searchBanner": { + "resultsTitle": "Search Results ({files} found)", + "query": "Query:", + "excluded": "Excluded:", + "content": "Content:", + "size": "Size:", + "min": "Min:", + "max": "Max:" + }, + "operations": { + "compressing": "Compressing {files} from {path}", + "decompressing": "Decompressing {path}", + "pulling": "Pulling {destination}", + "copying": "Copying {path} to {destination}", + "copyingMany": "Copying {files}", + "receivingRemote": "Receiving {files} from remote server", + "sendingRemote": "Sending {files} to remote server", + "exportingBackup": "Exporting backup to {destination}", + "cancelAllOperations": "Cancel all operations" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" + }, + "settings": { + "clickOnce": "Click once to open file or folder", + "preferPhysicalSize": "Show physical size instead of logical size", + "editorMinimap": "Show File Minimap", + "editorLineOverflow": "Wrap Line Overflow", + "editorFontSize": "Editor Font Size", + "vscodeUriScheme": "VS Code URI Scheme", + "imageViewerSmoothing": "Smoothen Image (Anti-Aliasing)" + }, + "toast": { + "operationCancelled": "Operation cancelled", + "allOperationsCancelled": "All operations have been cancelled.", + "copyingStarted": "{files} started copying.", + "filesCouldNotBeMoved": "Files could not be moved.", + "filesMoved": "{files} moved.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", + "downloadStarted": "Download started.", + "filesDeleted": "Files have been deleted.", + "archiveCreationStarted": "Archive creation has begun.", + "fileCopyingStarted": "File copying has started.", + "fileInfoRetrieved": "File information retrieved successfully.", + "filePullingStarted": "File pulling has started.", + "fileRenamed": "File has been renamed.", + "fileCouldNotBeRenamed": "File could not be renamed.", + "filesRenamed": "{files} renamed.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", + "permissionsUpdated": "Permissions have been updated.", + "permissionsUpdatedMany": "Permissions have been updated for {files}.", + "permissionsCouldNotBeUpdated": "Permissions could not be updated.", + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "File has been saved.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." + }, + "tooltip": { + "fileHistory": "File History", + "collabEditing": "{user} is editing this file", + "largestDirectories": "Analyze directory sizes", + "dragToMove": "Drag to move", + "back": "Back {seconds} seconds", + "forward": "Forward {seconds} seconds", + "play": "Play", + "pause": "Pause", + "mute": "Mute", + "unmute": "Unmute" + }, + "drawer": { + "revisions": { + "title": "File History", + "noRevisions": "No revisions found for this file.", + "restored": "Revision restored into editor.", + "badge": { + "fullSnapshot": "Full Snapshot" + }, + "tooltip": { + "restore": "Restore this revision into the editor", + "viewDiff": "View diff against current file", + "compareToPrevious": "Compare to previous revision" + }, + "diff": { + "original": "Revision", + "current": "Current" + } + } + }, + "modal": { + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes in the file editor. Are you sure you want to leave this page? If you leave, your changes will be lost." + }, + "draftRestore": { + "title": "Restore Draft", + "content": "A draft of this file was found in your browser. Would you like to restore it?", + "contentHashMismatch": "The file has been modified on the server since this draft was saved. Restoring the draft may overwrite those changes." + }, + "createArchive": { + "title": "Create Archive", + "form": { + "format": "Format" + }, + "createdAs": "This archive will be created as " + }, + "createDirectory": { + "title": "Create Directory", + "createdAs": "This directory will be created as " + }, + "copyFile": { + "title": "Copy File", + "createdAs": "This file will be created as " + }, + "copyRemote": { + "title": "Remote Copy Files", + "form": { + "server": "Server" + }, + "createdAs": "These files will be created on the remote server under " + }, + "fileFingerprints": { + "title": "File Fingerprint", + "form": { + "algorithm": "Algorithm", + "fingerprint": "Fingerprint" + }, + "button": { + "calculate": "Calculate Fingerprint" + } + }, + "deleteFile": { + "title": "Delete File", + "singleFileWarning": "You will not be able to recover the contents of {file} once deleted.", + "multipleFilesWarning": "You will not be able to recover the contents of the following files once deleted." + }, + "createFile": { + "title": "Create File" + }, + "details": { + "title": "File Details", + "path": "Path", + "mode": "Mode", + "logicalSize": "Logical Size", + "physicalSize": "Physical Size", + "mimeType": "MIME Type", + "lastModifiedAt": "Last Modified At", + "createdAt": "Created At" + }, + "filePermissions": { + "title": "File Permissions", + "form": { + "recursive": "Apply changes recursively to all files and subdirectories within this directory" + }, + "symbolic": "Symbolic:", + "octal": "Octal:", + "owner": "Owner", + "group": "Group", + "other": "Other", + "breakdown": "Permission Breakdown", + "readPermission": "Read permission (4)", + "writePermission": "Write permission (2)", + "executePermission": "Execute permission (1)" + }, + "renameFile": { + "title": "Rename File" + }, + "massRename": { + "title": "Rename Files", + "find": "Find", + "findPlaceholder": "Text to find", + "replace": "Replace with", + "replacePlaceholder": "Replacement text", + "scope": "Apply to", + "scopeName": "Name", + "scopeExtension": "Extension", + "scopeFull": "Full name", + "section": { + "matchOptions": "Match options", + "affixes": "Prefix & suffix", + "caseConversion": "Case conversion", + "numbering": "Numbering" + }, + "affix": { + "prefix": "Prefix", + "suffix": "Suffix", + "help": "Both may include {token} for the number; a suffix appends a count to every name." + }, + "option": { + "regex": "Use regular expression", + "regexDescription": "Treat the find text as a regex; reference groups with $1, $2 in the replacement.", + "caseSensitive": "Case sensitive", + "allOccurrences": "Replace all occurrences" + }, + "case": { + "label": "Convert case", + "none": "No change", + "lower": "lowercase", + "upper": "UPPERCASE", + "title": "Title Case", + "capitalize": "Capitalize" + }, + "numbering": { + "enable": "Enable numbering", + "help": "Insert {token} in the find, replace, prefix, or suffix text where the number should appear.", + "start": "Start at", + "step": "Step", + "padding": "Minimum digits" + }, + "preview": { + "title": "Preview", + "original": "Original", + "newName": "New name", + "unchanged": "Unchanged", + "conflict": "Name already in use", + "duplicate": "Duplicate target", + "invalid": "Invalid name", + "invalidRegex": "Invalid regular expression", + "empty": "No files selected." + }, + "summary": "{changed} of {total} will be renamed", + "conflictWarning": "Resolve the highlighted name conflicts before renaming." + }, + "largestDirectories": { + "title": "Largest Directories", + "empty": "No directories found." + }, + "searchFiles": { + "title": "Search Files", + "placeholder": "Search for files...", + "advancedFilters": "Advanced Filters", + "pathPatterns": "Path Patterns", + "include": "Include", + "exclude": "Exclude", + "caseInsensitive": "Case insensitive", + "fileContent": "File Content", + "searchText": "Search text", + "maxFileSize": "Max file size", + "includeOversized": "Include oversized files", + "includeOversizedDescription": "Includes files that match other filters but are too large to search.", + "fileSize": "File Size", + "minimum": "Minimum", + "maximum": "Maximum" + }, + "pullFile": { + "title": "Pull File", + "form": { + "fileUrl": "File URL", + "query": "Query" + }, + "createdAs": "This file will be created as ", + "pull": "Pull" + }, + "sftpDetails": { + "title": "SFTP Details", + "launch": "Launch" + } + } + }, "databases": { "title": "Baze de date", "subtitle": "{current} din {max} baze de date maxime create.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Acest server este limitat la {max} baze de date." }, @@ -572,12 +4370,171 @@ "locked": "Blocat?" } }, - "button": { - "rotatePassword": "Rotește parola" - }, - "form": { - "databaseName": "Nume bază de date" - }, + "button": { + "rotatePassword": "Rotește parola" + }, + "form": { + "databaseName": "Nume bază de date" + }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Creează bază de date", @@ -585,7 +4542,8 @@ "created": "Bază de date creată." }, "form": { - "noHostsFound": "Nicio gazdă găsită" + "noHostsFound": "Nicio gazdă găsită", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -603,6 +4561,13 @@ "jdbcConnectionString": "Șir de conexiune JDBC" } }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new one with the same connection details.", + "toast": { + "recreated": "Database recreated." + } + }, "deleteDatabase": { "title": "Confirmă ștergerea bazei de date", "content": "Ștergerea unei baze de date este o acțiune permanentă, nu poate fi anulată. Aceasta va șterge permanent baza de date **{name}** și va elimina toate datele asociate.", @@ -612,8 +4577,595 @@ } } }, + "schedules": { + "title": "Schedules", + "subtitle": "{current} of {max} maximum schedules created.", + "dropzone": { + "title": "Drop some files here to import them as Schedules", + "subtitle": "Release to start importing" + }, + "tooltip": { + "limitReached": "This server is limited to {max} schedules." + }, + "table": { + "columns": { + "lastRun": "Last Run", + "lastFailure": "Last Failure", + "status": "Status" + } + }, + "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", + "addTrigger": "Add Trigger", + "addCondition": "Add Condition", + "addStep": "Add Step", + "addElseIf": "Add Else If", + "addElse": "Add Else", + "createFirstStep": "Create First Step", + "addOutput": "Add Output", + "addFile": "Add File", + "exitEditor": "Exit Editor" + }, + "toast": { + "imported": "Schedule imported.", + "created": "Schedule created.", + "updated": "Schedule updated.", + "duplicated": "Schedule duplicated.", + "deleted": "Schedule deleted.", + "triggered": "Schedule triggered.", + "exported": "Schedule exported.", + "parseError": "Failed to parse schedule: {error}", + "step": { + "created": "Schedule step created.", + "updated": "Schedule step updated.", + "duplicated": "Schedule step duplicated.", + "deleted": "Schedule step deleted." + } + }, + "enum": { + "scheduleConditionType": { + "none": "None", + "and": "AND (All must be true)", + "or": "OR (Any must be true)", + "not": "NOT (Must not be true)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", + "variableExists": "Variable Exists", + "variableContains": "Variable Contains", + "variableEquals": "Variable Equals", + "variableStartsWith": "Variable Starts With", + "variableEndsWith": "Variable Ends With" + }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, + "scheduleComparator": { + "smallerThan": "Smaller than", + "smallerThanOrEqual": "Smaller than or equal to", + "equal": "Equal to", + "greaterThanOrEqual": "Greater than or equal to", + "greaterThan": "Greater than" + } + }, + "modal": { + "createSchedule": { + "title": "Create Schedule" + }, + "updateSchedule": { + "title": "Update Schedule" + }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, + "deleteSchedule": { + "title": "Confirm Schedule Deletion", + "content": "Are you sure you want to delete {name} from this server?" + }, + "createStep": { + "title": "Create Schedule Step" + }, + "editStep": { + "title": "Edit Schedule Step" + }, + "deleteStep": { + "title": "Confirm Schedule Step Deletion", + "content": "Are you sure you want to delete this schedule step?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." + } + }, + "view": { + "badge": { + "running": "Running" + }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, + "tabs": { + "actions": "Actions", + "conditions": "Conditions", + "triggers": "Triggers" + }, + "sections": { + "actions": "Schedule Actions", + "preConditions": "Schedule Pre-Conditions", + "triggers": "Schedule Triggers" + }, + "alert": { + "noActions": "No actions configured for this schedule", + "noTriggers": "No triggers configured for this schedule" + } + }, + "form": { + "scheduleName": "Schedule Name", + "triggersList": "Triggers", + "triggerNumber": "Trigger {number}", + "actionType": "Action Type", + "conditionType": "Condition Type", + "serverState": "Server State", + "comparator": "Comparator", + "rootPath": "Root Path", + "outputInto": "Output into", + "caseInsensitive": "Case Insensitive", + "ignoreFailure": "Ignore Failure", + "runInForeground": "Run in Foreground" + }, + "condition": { + "variable": "Variable", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "metric": "Metric", + "allMustBeTrue": "All conditions must be true:", + "anyMustBeTrue": "Any condition must be true:", + "mustNotBeTrue": "Condition must not be true:" + }, + "preCondition": { + "valueSeconds": "Value (seconds)", + "valuePercent": "Value (%)", + "value": "Value" + }, + "triggers": { + "cron": { + "title": "Time Interval (Cron)", + "form": { + "cronSchedule": "Cron Schedule", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" + }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" + }, + "timezoneHint": "Times use the server timezone ({timezone}).", + "card": { + "content": "On Cron Interval {schedule}, Next run is {timestamp} - Last run was {lastTimestamp}." + }, + "invalidCron": "Invalid cron expression" + }, + "powerAction": { + "title": "Power Action", + "card": { + "content": "When Power Action `{action}` is requested." + } + }, + "serverState": { + "title": "Server State", + "card": { + "content": "When Server State `{state}` is reached." + } + }, + "backupStatus": { + "title": "Backup Status", + "form": { + "backupStatus": "Backup Status" + }, + "card": { + "content": "When Backup reaches Status `{status}`." + } + }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, + "consoleLine": { + "title": "Console Line", + "card": { + "content": "When Console Output reaches line that contains `{contains}`" + } + }, + "crash": { + "title": "Crash", + "card": { + "content": "When Server crashes." + } + } + }, + "renderer": { + "noActionSelected": "Select an action type to configure", + "noActionDetails": "Action details not available", + "ignoreFailure": "Ignore Failure: {value}", + "foreground": "Foreground: {value}" + }, + "steps": { + "empty": { + "title": "No Steps Configured", + "description": "This schedule doesn't have any steps yet. Add some actions to get started." + }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, + "sleep": { + "title": "Sleep", + "description": "Wait for a set amount of time before continuing with the next action.", + "form": { + "duration": "Duration (milliseconds)" + }, + "renderer": { + "compact": "Sleep for {duration}ms" + } + }, + "ensure": { + "title": "Ensure", + "description": "Stop the schedule here unless a condition is true.", + "renderer": { + "compact": "Ensure a condition matches" + } + }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, + "format": { + "title": "Format", + "description": "Build a text value from variables and store it in a variable.", + "form": { + "formatString": "Format String", + "formatStringDescription": "The format string. Variables can be included by wrapping them inside {wrapper}." + }, + "renderer": { + "compact": "Format a string into {outputInto}" + } + }, + "matchRegex": { + "title": "Match Regex", + "description": "Extract parts of a text value using a regular expression.", + "form": { + "input": "Input", + "regex": "Regex", + "outputs": "Outputs", + "outputNumber": "Output {number}" + }, + "renderer": { + "compact": "Match {input} with regex {regex}" + } + }, + "waitForConsoleLine": { + "title": "Wait for Console Line", + "description": "Wait until the server console outputs a matching line.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for console line containing {contains}", + "detail": { + "lineContains": "Line must contain: {contains}", + "caseInsensitive": "Case insensitive: {value}", + "timeout": "Timeout: {timeout}" + } + } + }, + "sendCommand": { + "title": "Send Command", + "description": "Send a command to the server console.", + "renderer": { + "compact": "Run {command}", + "detail": { + "command": "Command: {command}" + } + } + }, + "sendPower": { + "title": "Send Power Signal", + "description": "Start, restart, stop or kill the server.", + "renderer": { + "compact": "Do {action}", + "detail": { + "powerAction": "Power Action: {action}" + } + } + }, + "createBackup": { + "title": "Create Backup", + "description": "Create a backup of the server files.", + "form": { + "backupName": "Backup Name" + }, + "renderer": { + "compact": "Create {name}", + "compactAuto": "Create a backup with an auto-generated name", + "detail": { + "backupName": "Backup Name: {name}", + "backupNameAuto": "Backup Name: Auto-generated", + "ignoredFiles": "Ignored Files: {files}" + } + } + }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, + "createDirectory": { + "title": "Create Directory", + "description": "Create a new folder in the server files.", + "renderer": { + "compact": "Create {name} in {root}", + "detail": { + "directory": "Directory: {name}", + "root": "Root: {root}" + } + } + }, + "writeFile": { + "title": "Write File", + "description": "Write or append text to a file.", + "form": { + "content": "Content", + "appendToFile": "Append to File" + }, + "renderer": { + "compact": "Write to {file}", + "detail": { + "file": "File: {file}", + "append": "Append: {value}" + } + } + }, + "copyFile": { + "title": "Copy File", + "description": "Copy a file to a new location.", + "form": { + "sourceFile": "Source File" + }, + "renderer": { + "compact": "Copy {file} to {destination}", + "detail": { + "from": "From: {file}", + "to": "To: {destination}" + } + } + }, + "deleteFiles": { + "title": "Delete Files", + "description": "Delete files or folders.", + "form": { + "filesToDelete": "Files to Delete" + }, + "renderer": { + "compact": "Delete {files}", + "detail": { + "root": "Root: {root}", + "files": "Files: {files}" + } + } + }, + "renameFiles": { + "title": "Rename Files", + "description": "Rename or move files.", + "form": { + "files": "Files", + "from": "from", + "to": "to" + }, + "renderer": { + "compact": "Rename {files}", + "detail": { + "root": "Root: {root}", + "files": "Files: {files}" + } + } + }, + "compressFiles": { + "title": "Compress Files", + "description": "Compress files into an archive.", + "form": { + "filesToCompress": "Files to Compress" + }, + "renderer": { + "compact": "Compress {files} in {root} to {name}", + "detail": { + "output": "Output: {name}", + "root": "Root: {root}", + "format": "Format: {format}", + "files": "Files: {files}" + } + } + }, + "decompressFile": { + "title": "Decompress File", + "description": "Extract an archive into a folder.", + "form": { + "file": "File" + }, + "renderer": { + "compact": "Decompress {file} to {root}", + "detail": { + "file": "File: {file}", + "root": "Root: {root}" + } + } + }, + "updateStartupVariable": { + "title": "Update Startup Variable", + "description": "Change the value of a startup variable.", + "renderer": { + "compact": "Set {variable} to {value}", + "detail": { + "variable": "Variable: {variable}", + "value": "Value: {value}" + } + } + }, + "updateStartupCommand": { + "title": "Update Startup Command", + "description": "Change the command used to start the server.", + "renderer": { + "compact": "Set to {command}", + "detail": { + "command": "Command: {command}" + } + } + }, + "updateStartupDockerImage": { + "title": "Update Docker Image", + "description": "Change the Docker image the server runs in.", + "renderer": { + "compact": "Set to {image}", + "detail": { + "image": "Image: {image}" + } + } + } + } + }, "subusers": { "title": "Subutilizatori", + "subtitle": "{current} of {max} maximum subusers created.", + "tooltip": { + "limitReached": "This server is limited to {max} subusers." + }, "table": { "columns": { "twoFactorEnabled": "2FA activat", @@ -629,7 +5181,8 @@ }, "form": { "emailPlaceholder": "Introdu emailul cu care ar trebui salvat acest subutilizator.", - "permissions": "Permisiuni" + "permissions": "Permisiuni", + "ignoredFilesDescription": "Files and directories matching these patterns will be hidden from this subuser. Uses gitignore-style glob patterns (e.g. `*.env`, `secrets/`). Prefix a pattern with `!` to un-hide a path that a broader pattern would otherwise exclude." } }, "updateSubuser": { @@ -660,16 +5213,25 @@ "locked": "Blocat?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Răsfoiește" + "browse": "Răsfoiește", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "Descărcare începută.", - "restoringBackup": "Restaurare backup..." + "restoringBackup": "Restaurare backup...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Creează backup", + "noGroup": "No group", "toast": { "created": "Backup creat." } @@ -683,13 +5245,61 @@ "restoreBackup": { "title": "Restaurează backup" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Confirmă ștergerea backup-ului", "content": "Ești sigur că vrei să ștergi **{name}** de la acest server?", "toast": { + "started": "Backup deletion started.", "deleted": "Backup șters." } + }, + "viewMetadata": { + "title": "Backup Metadata" + } + } + }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." } }, "network": { @@ -730,10 +5340,56 @@ "startupCommandUpdated": "Comandă de pornire actualizată.", "dockerImageUpdated": "Imagine Docker actualizată.", "variablesUpdated": "Variabile actualizate." + }, + "modal": { + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your startup variables. Are you sure you want to leave this page? If you leave, your changes will be lost." + } + }, + "noVariables": "No startup variables found for this server.", + "predefinedStartupCommands": "Predefined Startup Commands" + }, + "mounts": { + "title": "Mounts", + "table": { + "columns": { + "target": "Target", + "mounted": "Mounted", + "readOnly": "Read Only" + } + }, + "button": { + "attach": "Attach", + "detach": "Detach" + }, + "modal": { + "attachMount": { + "title": "Attach Mount", + "content": "Do you want to attach **{name}** to `{target}`?", + "toast": { + "attached": "{name} has been mounted to your server." + } + }, + "detachMount": { + "title": "Detach Mount", + "content": "Do you want to detach **{name}** from `{target}`?", + "toast": { + "detached": "{name} has been removed from your server." + } + } } }, "settings": { "title": "Setări", + "debugInformation": { + "title": "Debug Information", + "form": { + "nodeName": "Node (UUID)", + "locationName": "Location (UUID)", + "serverUuid": "Server UUID" + } + }, "rename": { "title": "Redenumește server", "toast": { @@ -755,9 +5411,19 @@ "updated": "Auto-kill server actualizat." } }, + "autostart": { + "title": "Auto-Start", + "form": { + "behavior": "Behavior" + }, + "toast": { + "updated": "Server auto-start behavior updated." + } + }, "reinstall": { "title": "Reinstalează server", "button": "Reinstalează server", + "content": "Reinstalling your server will stop it, and then re-run the installation script that initially set it up. **Some files may be deleted or modified during this process, please back up your data before continuing.**", "modal": { "title": "Reinstalează server", "button": "Reinstalează", @@ -768,7 +5434,10 @@ } }, "activity": { - "title": "Activitate" + "title": "Activitate", + "button": { + "clearUserFilter": "Clear User Filter" + } } } } diff --git a/frontend/public/translations/ru.json b/frontend/public/translations/ru.json index 40994063b..3e80d683c 100644 --- a/frontend/public/translations/ru.json +++ b/frontend/public/translations/ru.json @@ -39,6 +39,86 @@ "few": "{count} SSH-ключа", "many": "{count} SSH-ключей", "other": "{count} SSH-ключей" + }, + "asset": { + "zero": "{count} Assets", + "one": "{count} Asset", + "two": "{count} Assets", + "few": "{count} Assets", + "many": "{count} Assets", + "other": "{count} Assets" + }, + "node": { + "zero": "{count} Nodes", + "one": "{count} Node", + "two": "{count} Nodes", + "few": "{count} Nodes", + "many": "{count} Nodes", + "other": "{count} Nodes" + }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, + "allocation": { + "zero": "{count} Node Allocations", + "one": "{count} Node Allocation", + "two": "{count} Node Allocations", + "few": "{count} Node Allocations", + "many": "{count} Node Allocations", + "other": "{count} Node Allocations" + }, + "egg": { + "zero": "{count} Eggs", + "one": "{count} Egg", + "two": "{count} Eggs", + "few": "{count} Eggs", + "many": "{count} Eggs", + "other": "{count} Eggs" + }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, + "shortcut": { + "zero": "{count} Shortcuts", + "one": "{count} Shortcut", + "two": "{count} Shortcuts", + "few": "{count} Shortcuts", + "many": "{count} Shortcuts", + "other": "{count} Shortcuts" + }, + "line": { + "zero": "{count} Lines", + "one": "{count} Line", + "two": "{count} Lines", + "few": "{count} Lines", + "many": "{count} Lines", + "other": "{count} Lines" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -49,6 +129,7 @@ "save": "Сохранить", "saveAndStay": "Сохранить и остаться", "edit": "Редактировать", + "duplicate": "Duplicate", "delete": "Удалить", "remove": "Убрать", "enable": "Включить", @@ -65,15 +146,28 @@ "selectAll": "Выбрать все", "deselectAll": "Снять выделение", "restore": "Восстановить", + "discard": "Discard", "download": "Скачать", "downloadAs": "Скачать как {format}", "export": "Экспорт", "exportAs": "Экспорт как {format}", + "recreate": "Recreate", + "move": "Move", + "transfer": "Transfer", + "reattach": "Reattach", + "detach": "Detach", + "send": "Send", + "reset": "Reset", + "view": "View", "import": "Импорт", "details": "Подробности", + "loadLogs": "Load Logs", + "sendTestEmail": "Send Test Email", "setPrimary": "Сделать основным", "unsetPrimary": "Убрать основной", - "leavePage": "Покинуть страницу" + "leavePage": "Покинуть страницу", + "viewDocumentation": "View Documentation", + "undo": "Undo" }, "alert": { "error": "Ошибка", @@ -87,27 +181,76 @@ "input": { "search": "Поиск..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "Сбросить по умолчанию", "edit": "Редактировать", "delete": "Удалить", - "primary": "Основной" + "remove": "Remove", + "primary": "Основной", + "backupOnDifferentNode": "This backup is on a different node than the server. It is not viewable from the Client API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Имя", + "newName": "New Name", "description": "Описание", + "author": "Author", + "type": "Type", "password": "Пароль", "host": "Хост", "username": "Имя пользователя", + "usernameOrEmail": "Username/Email", "server": "Сервер", "url": "URL", "email": "Электронная почта", + "path": "Path", "port": "Порт", + "provider": "Provider", "command": "Команда", + "fromAddress": "From Address", + "fromName": "From Name", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "apiKey": "API Key", + "accessKey": "Access Key", + "bucket": "Bucket", + "region": "Region", + "endpoint": "Endpoint", + "publicUrl": "Public URL", "firstName": "Имя", "lastName": "Фамилия", "language": "Язык", + "identifier": "Identifier", "enabled": "Включено", + "disabled": "Disabled", + "title": "Title", + "content": "Content", + "backupConfiguration": "Backup Configuration", "fileName": "Имя файла", "sftpPort": "SFTP-порт", "sftpHost": "SFTP-хост", @@ -118,11 +261,26 @@ "startupCommand": "Команда запуска", "archiveName": "Имя архива", "archiveFormat": "Формат архива", + "compressionLevel": "Compression Level", + "multiplexChannels": "Multiplex Channels", + "multiplexChannelsDescription": "Add additional HTTP connections (and therefore also threads) for transferring split archives, total streams is 1 + multiplex channels.", + "deleteSourceBackups": "Delete source backups", + "deleteSourceBackupsDescription": "Deletes the transferred backups on the source node once transfer finishes.", + "node": "Node", + "primaryAllocation": "Primary Allocation", + "additionalAllocations": "Additional Allocations", + "externalId": "External ID", + "mount": "Mount", + "nest": "Nest", + "lines": "Lines", "databaseHost": "Хост базы данных", + "databaseAgentHost": "Database Agent Host", "timezone": "Часовой пояс", + "timezoneSystem": "System", "protocol": "Протокол", "powerAction": "Действие питания", "destination": "Назначение", + "destinationDirectory": "Destination Directory", "directoryName": "Имя директории", "locked": "Заблокировано", "portRanges": "Диапазоны портов", @@ -130,10 +288,17 @@ "currentPassword": "Текущий пароль", "confirmPassword": "Подтверждение пароля", "authenticationCode": "Код аутентификации", + "restoreStartup": "Restore the startup command, image, and variables from this backup.", "lineContains": "Строка содержит", + "filePath": "File Path", + "envVariable": "Environment Variable", + "value": "Value", "eggs": "Яйца", "ignoredFiles": "Игнорируемые файлы", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "Ваш пароль от панели управления", + "deploymentEnabled": "Deployment Enabled", + "maintenanceEnabled": "Maintenance Enabled", "truncateDirectory": "Вы хотите удалить все файлы этого сервера перед выполнением этого действия? Это действие необратимо." }, "table": { @@ -142,27 +307,60 @@ "empty": "Ничего не найдено, как будто они прячутся." }, "columns": { + "id": "ID", "name": "Имя", + "author": "Author", + "type": "Type", + "title": "Title", + "enabled": "Enabled", "description": "Описание", "username": "Имя пользователя", "size": "Размер", "lastUsed": "Последнее использование", "created": "Создано", + "updated": "Updated", "actor": "Инициатор", "event": "Событие", "ip": "IP", "when": "Когда", "command": "Команда", - "notes": "Заметки" + "location": "Location", + "node": "Node", + "owner": "Owner", + "added": "Added", + "backupConfiguration": "Backup Configuration", + "status": "Status", + "allocation": "Allocation", + "notes": "Заметки", + "source": "Source", + "target": "Target", + "checksum": "Checksum", + "files": "Files", + "server": "Server", + "address": "Address", + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, + "tabs": { + "general": "General" + }, "badge": { "active": "Активен", "inactive": "Неактивен", "enabled": "Включено", "disabled": "Отключено", "successful": "Успешно", - "failed": "Ошибка" + "failed": "Ошибка", + "installed": "Installed" + }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" }, "server": { "noAllocation": "Нет выделения", @@ -216,6 +414,12 @@ "stopped": "Остановлен", "restarted": "Перезапущен", "killed": "Принудительно остановлен" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" } }, "unit": { @@ -232,15 +436,37 @@ "readOnly": "Только чтение", "na": "Н/Д", "never": "Никогда", + "none": "None", + "unknown": "Unknown", "yes": "Да", "no": "Нет", "web": "Веб", "api": "API", + "default": "Default", + "custom": "Custom", "system": "Система", "schedule": "Расписание", "impersonatedBy": "Имитация от имени {username}" }, "elements": { + "routeOrderEditor": { + "title": "Route Configuration", + "label": { + "route": "Route", + "divider": "Divider", + "redirect": "Redirect" + }, + "empty": "No routes configured. Add routes, dividers, or redirects below.", + "unnamed": "(unnamed)", + "dividerPlaceholder": "Divider label (optional)", + "redirectNamePlaceholder": "Redirect name", + "destinationPlaceholder": "Destination URL (e.g. https://...)", + "selectRoutePlaceholder": "Select a route…", + "button": { + "addDivider": "Add Divider", + "addRedirect": "Add Redirect" + } + }, "errorBoundary": { "message": "При отображении этой страницы произошла ошибка. Попробуйте обновить страницу.", "hideDetails": "Скрыть подробности", @@ -256,6 +482,13 @@ "copyManual": "Скопировать в буфер обмена: Ctrl+C или Command+C, Enter" } }, + "pasteOnClick": { + "toast": { + "pasted": "Pasted from clipboard.", + "failed": "Failed to paste from clipboard.", + "pasteManual": "Paste from clipboard: Ctrl+V or Command+V, Enter" + } + }, "estimatedTimeArrival": { "tooltip": { "estimating": "Расчёт времени завершения...", @@ -267,7 +500,8 @@ "container": { "alert": { "impersonating": "Вы сейчас действуете от имени другого пользователя. Обратите внимание, что ваши действия могут повлиять на аккаунт этого пользователя. Чтобы выйти из режима имитации, нажмите кнопку «Вернуться в свой аккаунт» в левом нижнем углу." - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -275,22 +509,43 @@ "stopImpersonating": "Вернуться в свой аккаунт", "openInVirtualWindow": "Открыть в виртуальном окне", "openInPopup": "Открыть во всплывающем окне", - "openInNewTab": "Открыть в новой вкладке" + "openInNewTab": "Открыть в новой вкладке", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { + "button": { + "copyPermissions": "Copy Permissions", + "pastePermissions": "Paste Permissions" + }, "selectedPermissions": "Выбранные разрешения ({count})", "noPermissions": "Разрешения не выбраны." }, "selectInput": { "noResults": "Результаты не найдены." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "У вас нет разрешения на сохранение.", "cantDelete": "У вас нет разрешения на удаление." } }, + "resource": { + "tooltip": { + "created": "{resource} created.", + "updated": "{resource} updated.", + "deleted": "{resource} deleted." + } + }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -307,6 +562,10 @@ "title": "Не найдено", "content": "Запрашиваемая страница не найдена." }, + "suspended": { + "title": "Account Suspended", + "content": "Your account has been suspended. You cannot make changes to your account. Please contact an administrator for more information." + }, "serverConflict": { "title": "Конфликт состояния сервера", "contentSuspended": "Этот сервер приостановлен и недоступен.", @@ -330,7 +589,10 @@ "scheduleDynamicInput": { "none": "Нет", "variable": "Переменная", - "enterVariable": "Пожалуйста, введите имя переменной для вычисления." + "enterVariable": "Пожалуйста, введите имя переменной для вычисления.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -349,6 +611,7 @@ "toast": { "backupCompleted": "Резервное копирование завершено успешно.", "backupFailed": "Ошибка резервного копирования.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "Восстановление из резервной копии завершено успешно.", "installCompleted": "Установка сервера завершена успешно.", "installFailed": "Ошибка установки сервера.", @@ -367,6 +630,7 @@ }, "copying": { "completed": "Копирование `{path}` в `{destination}` выполнено за {time}.", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", "failed": "Не удалось скопировать `{path}` в `{destination}`:\n{error}" }, "copyingMany": { @@ -384,13 +648,21 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "Ожидание: {file}", "uploading": "Загрузка: {file}", "uploadingFolder": "Загрузка папки: {folder} ({files})", + "rateLimited": "Your upload has been rate limited. Waiting...", + "cancelAllUploads": "Cancel all uploads", "toast": { "uploading": "Начата загрузка {files}...", "cancelledFile": "Загрузка `{file}` успешно отменена.", - "cancelledFolder": "Загрузка `{folder}` ({files}) успешно отменена." + "cancelledFolder": "Загрузка `{folder}` ({files}) успешно отменена.", + "cancelledAll": "All uploads have been cancelled.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -446,6 +718,8 @@ "form": { "locationName": "Название локации", "locationNamePlaceholder": "Мой дом", + "locationFlag": "Location Flag", + "locationFlagPlaceholder": "The best country", "backupName": "Название конфигурации резервного копирования", "backupNamePlaceholder": "Гараж #1", "backupDisk": "Диск для резервных копий", @@ -483,7 +757,11 @@ "noNodes": "Что-то пошло не так. Узлы не найдены.", "connectionError": "Что-то пошло не так. Ошибка подключения." }, - "successMessage": "Соединение с вашим узлом успешно проверено. Вы можете продолжить." + "successMessage": "Соединение с вашим узлом успешно проверено. Вы можете продолжить.", + "configurationDescription": "Place this into the configuration file at `{file}` or run:", + "button": { + "verify": "Verify Connection" + } }, "configuration": { "title": "Настройки приложения", @@ -520,6 +798,7 @@ }, "server": { "title": "Сервер", + "existingServer": "A server has already been created. You can change the settings later in the admin menu.", "egg": { "title": "Яйцо", "description": "Давайте запустим ваш первый сервер. Какое яйцо вы хотите использовать?", @@ -565,9 +844,14 @@ "login": "Войти", "loginWith": "Войти через {name}" }, + "alert": { + "urlMismatch": "The application URL does not match the current URL. Expected: `{appUrl}`, Current: `{currentUrl}`." + }, "login": { "error": { - "usernameRequired": "Пожалуйста, введите имя пользователя" + "usernameRequired": "Пожалуйста, введите имя пользователя", + "registrationDisabled": "No matching Account could be found and registration is currently disabled.", + "userAlreadyExists": "An account with this username or email already exists." }, "passkey": { "error": { @@ -585,6 +869,10 @@ "step": { "username": { "title": "Вход", + "subtitle": "Enter your username or email address to continue", + "form": { + "usernameOrEmailPlaceholder": "Your username or email address" + }, "link": { "forgotPassword": "Забыли пароль", "notRegistered": "Нет аккаунта?", @@ -673,6 +961,9 @@ "noGroups": "Нет доступных групп для добавления сервера", "noGroup": "Этот сервер не входит ни в одну группу" }, + "badge": { + "foreign": "Foreign" + }, "tabs": { "groupedServers": { "title": "Сгруппированные серверы", @@ -706,6 +997,13 @@ "toast": { "added": "Сервер добавлен в группу." } + }, + "removeServerFromGroup": { + "title": "Confirm Server Removal", + "content": "Are you sure you want to remove **{server}** from **{group}**?", + "toast": { + "removed": "Server removed from group." + } } }, "noGroups": "Группы не найдены, время создать одну?" @@ -747,6 +1045,10 @@ "requireTwoFactor": { "title": "Требуется двухфакторная аутентификация", "description": "Для вашей учётной записи требуется двухфакторная аутентификация. Пожалуйста, настройте её ниже, чтобы продолжить использование панели." + }, + "frozen": { + "title": "Account Frozen", + "description": "Your account has been frozen. You cannot make changes to your account until it is unfrozen. Please contact an administrator for more information." } }, "containers": { @@ -822,13 +1124,15 @@ }, "securityKeys": { "title": "Ключи безопасности", + "subtitle": "{current} of {max} maximum security keys created.", "table": { "columns": { "credentialId": "ID учётных данных" } }, "tooltip": { - "secureContextRequired": "Для использования ключей безопасности требуется безопасное соединение (HTTPS)." + "secureContextRequired": "Для использования ключей безопасности требуется безопасное соединение (HTTPS).", + "limitReached": "You are limited to {max} security keys." }, "modal": { "createSecurityKey": { @@ -877,6 +1181,23 @@ "subtitle": "Используйте эти горячие клавиши для более эффективной навигации и работы с панелью.", "detectedMac": "Обнаружена macOS", "detectedWindows": "Обнаружена Windows/Linux", + "label": { + "disabled": "Disabled", + "modified": "Modified", + "recording": "Press keys..." + }, + "button": { + "rebind": "Rebind", + "resetAll": "Reset All", + "copy": "Copy All", + "paste": "Paste" + }, + "toast": { + "imported": "Updated {shortcuts}.", + "importedNone": "No shortcuts were changed.", + "importErrors": "Ignored {unknown} and {invalid}.", + "resetAll": "All shortcuts reset to defaults." + }, "fileManager": { "title": "Файловый менеджер", "selectAll": "Выбрать все файлы", @@ -912,6 +1233,10 @@ }, "sshKeys": { "title": "SSH-ключи", + "subtitle": "{current} of {max} maximum ssh keys created.", + "tooltip": { + "limitReached": "You are limited to {max} ssh keys." + }, "table": { "columns": { "fingerprint": "Отпечаток" @@ -956,6 +1281,10 @@ }, "commandSnippets": { "title": "Шаблоны команд", + "subtitle": "{current} of {max} maximum command snippets created.", + "tooltip": { + "limitReached": "You are limited to {max} command snippets." + }, "modal": { "createCommandSnippet": { "title": "Создать шаблон команды", @@ -975,6 +1304,12 @@ "toast": { "removed": "Шаблон команды удалён." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1001,9 +1336,13 @@ }, "apiKeys": { "title": "API-ключи", + "subtitle": "{current} of {max} maximum api keys created.", "button": { "apiDocumentation": "Документация API" }, + "tooltip": { + "limitReached": "You are limited to {max} api keys." + }, "table": { "columns": { "key": "Ключ", @@ -1024,12 +1363,25 @@ "updated": "API-ключ обновлён." } }, + "recreateApiKey": { + "title": "Recreate API Key", + "content": "Recreating an API key will generate a new key and invalidate the old one. Are you sure you want to recreate the API key **{name}**?", + "toast": { + "recreated": "API key recreated." + } + }, "deleteApiKey": { "title": "Подтверждение удаления API-ключа", "content": "Вы уверены, что хотите удалить **{name}** из вашего аккаунта?", "toast": { "removed": "API-ключ удалён." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1038,62 +1390,2609 @@ "userPermissions": "Пользовательские разрешения", "serverPermissions": "Серверные разрешения", "adminPermissions": "Административные разрешения" + }, + "create": { + "title": "Create API Key", + "subtitle": "An application is requesting an API key to be created for your account.", + "alert": { + "adminPermissions": "This API key requests **admin permissions**. Anyone in possession of this key will be able to perform administrative actions on this panel in your name. Only continue if you absolutely trust the requesting application.", + "callbackUrl": "After creation, the new API key will be sent to **{url}**." + }, + "noPermissions": "This API key will not have any permissions.", + "keyCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "button": { + "goToApiKeys": "Go to API Keys" + } } }, "activity": { "title": "Активность" } }, - "server": { - "viewAdmin": { - "title": "Вид администратора" + "admin": { + "home": { + "title": "Home", + "alert": { + "newPanelVersion": "A new version is available for the panel! You are currently on {current} and the latest version is {latest}. You may want to consider upgrading. [Click here]({upgradeUrl}) to view upgrade instructions." + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "permissionDenied": "You do not have permission to read the statistics that would have been here otherwise. For now, enjoy this bird.", + "card": { + "systemOverview": "System Overview", + "generalStatistics": "General Statistics", + "backupStatistics": "Backup Statistics" + }, + "system": { + "cpu": "CPU", + "memoryUsage": "Memory Usage ({process} used by Panel)", + "memoryValue": "{used} / {total} ({percent}%)", + "kernelVersion": "Kernel Version ({architecture})", + "containerType": "Container Type", + "databaseVersion": "Database Version ({size})", + "cacheVersion": "Cache Version", + "cacheCalls": "Cache Calls", + "cacheHits": "Cache Hits ({percent}%)", + "cacheMisses": "Cache Misses ({percent}%)", + "avgCachedCallLatency": "Avg. Cached Call Latency" + }, + "containerType": { + "none": "None detected", + "official": "Official", + "officialAio": "Official AIO", + "officialHeavy": "Official Heavy" + }, + "stats": { + "users": "Users", + "servers": "Servers", + "locations": "Locations", + "nodes": "Nodes", + "nestEggs": "Nest Eggs", + "databaseHosts": "Database Hosts", + "backupConfigurations": "Backup Configurations", + "roles": "Roles" + }, + "backup": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month", + "totalAllTime": "Total backups all time", + "successfulAllTime": "Successful backups all time", + "failedAllTime": "Failed backups all time", + "deletedAllTime": "Deleted backups all time", + "totalToday": "Total backups today", + "successfulToday": "Successful backups today", + "failedToday": "Failed backups today", + "deletedToday": "Deleted backups today", + "totalWeek": "Total backups this week", + "successfulWeek": "Successful backups this week", + "failedWeek": "Failed backups this week", + "deletedWeek": "Deleted backups this week", + "totalMonth": "Total backups this month", + "successfulMonth": "Successful backups this month", + "failedMonth": "Failed backups this month", + "deletedMonth": "Deleted backups this month", + "successfulValue": "{count} ({size})", + "deletedValue": "{count} ({size})" + } + } + }, + "updates": { + "title": "Updates", + "page": { + "alert": { + "extensionUpdateErrors": "There were errors checking for updates for some extensions." + }, + "card": { + "panelVersion": "Panel Version", + "versionHistory": "Version History", + "outdatedExtensions": "Outdated Extensions", + "outdatedNodes": "Outdated Nodes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" + }, + "panelVersion": "Your panel is currently running version `{current}`. The latest available version is `{latest}`.", + "unknown": "unknown", + "button": { + "recheck": "Recheck for Updates" + }, + "toast": { + "recheckComplete": "Recheck complete." + }, + "selectHistory": "Select an update history to view.", + "historyPanel": "Panel", + "historyExtension": "Extension: {name}", + "extensionsUpToDate": "All extensions are up to date.", + "extensionsOutdated": "Some extensions are outdated or had errors when checking for updates.", + "noChangelog": "No changelog", + "nodesUpToDate": "Seems like all nodes are up to date. ({failed} failed to check)", + "nodesOutdated": "Some nodes are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "table": { + "version": "Version", + "installed": "Installed", + "packageName": "Package Name", + "latestVersion": "Latest Version", + "changes": "Changes", + "error": "Error" + } + } + }, + "health": { + "title": "Health", + "page": { + "card": { + "generalHealth": "General Health", + "extensionMigrationHealth": "Extension Migration Health", + "desyncNodes": "Desync Nodes", + "debugMode": "Debug Mode" + }, + "appliedMigrations": "Applied Migrations ({percent}%)", + "migrationsValue": "{applied} / {total}", + "avgNtpOffset": "Avg. NTP Offset", + "noExtensions": "No extensions found.", + "nodesSynced": "Seems like all nodes have a synced clock (within 5 seconds of panel clock). ({failed} failed to check)", + "nodesDesync": "Some nodes have desync clocks (over 5 seconds off of the panel's clock). This can cause file download/console issues. ({desync} desync, {failed} failed to check)", + "debugEnabled": "Debug mode is currently enabled.", + "debugDisabled": "Debug mode is currently disabled.", + "debugResetNote": "This setting will be reset to the default ({default}) when the application restarts.", + "table": { + "packageName": "Package Name", + "applied": "Applied", + "total": "Total", + "id": "ID", + "desync": "Desync", + "appliedValue": "{applied} ({percent}%)" + }, + "button": { + "enableDebug": "Enable Debug Mode", + "disableDebug": "Disable Debug Mode" + }, + "toast": { + "debugEnabled": "Debug mode enabled.", + "debugDisabled": "Debug mode disabled." + } + } + } + } }, - "console": { - "title": "Консоль", - "input": { - "placeholder": "Введите команду...", - "ariaLabel": "Поле ввода команды консоли." + "settings": { + "title": "Settings", + "tabs": { + "application": { + "title": "Application", + "page": { + "title": "Application Settings", + "form": { + "icon": "Icon", + "iconLight": "Icon (Light Mode)", + "banner": "Banner", + "bannerLight": "Banner (Light Mode)", + "sessionCookie": "Session Cookie", + "sessionDurationSeconds": "Session Duration (seconds)", + "twoFactorRequirement": "Two-Factor Authentication Requirement", + "telemetryEnabled": "Enable Telemetry", + "telemetryEnabledDescription": "Allow Calagopus to collect limited and anonymous usage data to help improve the application.", + "registrationEnabled": "Enable Registration" + }, + "enum": { + "twoFactorRequirement": { + "admins": "Admins", + "allUsers": "All Users", + "none": "None" + } + }, + "button": { + "previewTelemetry": "Preview Telemetry" + }, + "toast": { + "updated": "Application settings updated." + }, + "modal": { + "disableTelemetry": { + "title": "Confirm Disabling Telemetry", + "content": "Are you sure you want to disable telemetry? Telemetry helps us improve Calagopus by providing anonymous usage data. Disabling telemetry will prevent any data from being sent." + }, + "enableRegistration": { + "title": "Confirm Enabling Registration", + "content": "Are you sure you want to enable registration? Enabling registration allows anyone to create an account on this panel. If you do not have a captcha configured, this may be a mistake." + }, + "telemetryPreview": { + "title": "Telemetry Preview" + } + } + } + }, + "storage": { + "title": "Storage", + "page": { + "title": "Storage Settings", + "form": { + "driver": "Driver" + }, + "enum": { + "driver": { + "filesystem": "Filesystem", + "s3": "S3" + } + }, + "toast": { + "updated": "Storage settings updated." + }, + "modal": { + "changeStorageType": { + "title": "Confirm Changing Storage Type", + "content": "Are you sure you want to change the storage type? Changing the storage type will cause the application to look for assets (e.g. profile pictures) in a different location, which may result in missing assets if they are not moved to the new location manually." + } + }, + "s3": { + "alert": { + "permissionsTitle": "Note on Permissions", + "permissionsIntro": "To ensure that the storage backend works correctly, please make sure the following subdirectories are publicly accessible over the \"Public URL\" you provided:", + "permissionsAssets": "This is where all admin assets (e.g., icons) will be stored.", + "permissionsAvatars": "This is where all user avatars will be stored.", + "permissionsPublicData": "This is where extensions can store public data (e.g., images)." + }, + "form": { + "pathStyle": "Using path-style URLs" + } + } + } + }, + "mail": { + "title": "Mail", + "page": { + "title": "Email Settings", + "enum": { + "provider": { + "none": "None", + "smtp": "SMTP", + "sendmail": "Sendmail Command", + "filesystem": "Filesystem" + }, + "tlsMode": { + "none": "None", + "startTls": "STARTTLS", + "implicitTls": "Implicit TLS" + } + }, + "toast": { + "updated": "Email settings updated." + }, + "modal": { + "sendTestEmail": { + "title": "Send Test Email", + "toast": { + "sent": "Test email has been sent successfully." + } + } + }, + "smtp": { + "form": { + "tlsMode": "TLS Mode", + "skipCertValidation": "Skip Certificate Validation" + } + } + } + }, + "mailTemplates": { + "title": "Mail Templates", + "page": { + "title": "Email Template Settings", + "sidebar": { + "templates": "Templates", + "loading": "Loading...", + "availableVariables": "Available Variables" + }, + "alert": { + "syntaxBefore": "Templates use the", + "syntaxLink": "MiniJinja", + "syntaxMiddle": "templating syntax. Variables are referenced with", + "syntaxAnd": "and control structures like", + "syntaxOr": "and", + "syntaxAfter": "are supported." + }, + "empty": "Select a template from the sidebar to edit it.", + "loadingTemplate": "Loading template...", + "form": { + "subject": "Subject" + }, + "toast": { + "saved": "Email template saved.", + "reset": "Email template reset to default." + }, + "modal": { + "reset": { + "title": "Reset to default", + "content": "This will discard your custom template for **{identifier}** and restore the built-in default. This cannot be undone." + } + } + } + }, + "captcha": { + "title": "Captcha", + "page": { + "title": "Captcha Settings", + "toast": { + "updated": "Captcha settings updated." + }, + "recaptcha": { + "form": { + "v3": "V3" + } + } + } + }, + "webauthn": { + "title": "Webauthn", + "page": { + "title": "Webauthn Settings", + "form": { + "rpId": "RP Id", + "rpOrigin": "RP Origin" + }, + "button": { + "autofill": "Autofill" + }, + "toast": { + "updated": "Webauthn settings updated.", + "ipNotAllowed": "Cannot use WebAuthn on an IP address." + }, + "modal": { + "changeRpId": { + "title": "Confirm Changing RP Id", + "content": "Are you sure you want to change the RP Id? Changing the RP Id will break all existing Webauthn credentials and require users to re-register their devices. This can have significant consequences, so please make sure you understand the implications before proceeding." + } + } + } + }, + "server": { + "title": "Server", + "page": { + "title": "Server Settings", + "form": { + "maxFileManagerViewSize": "Max File Manager View Size", + "maxScheduleStepCount": "Max Schedule Steps", + "maxFileManagerContentSearchSize": "Max File Manager Content Search Size", + "maxFileManagerSearchResults": "Max File Manager Search Results", + "maxSubuserCount": "Max Subuser Count", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", + "allowOverwritingCustomDockerImage": "Allow Overwriting Custom Docker Image", + "allowOverwritingCustomDockerImageDescription": "If enabled, users will be able to overwrite the Docker image specified in the server configuration using the Eggs list, even if an admin has set a custom Docker image.", + "allowViewingInstallationLogs": "Allow Viewing Installation Logs", + "allowViewingInstallationLogsDescription": "If enabled, users with console read permissions will also be able to view installation logs via the websocket connection. If disabled, installation logs will only be available for admins.", + "allowAcknowledgingInstallationFailure": "Allow Acknowledging Installation Failure", + "allowAcknowledgingInstallationFailureDescription": "If enabled, users will be able to acknowledge installation failures for servers that are in the \"Install Failed\" state, allowing them to attempt to start the server instead of having to wait for an admin. If disabled, only admins will be able to acknowledge installation failures.", + "allowViewingTransferProgress": "Allow Viewing Transfer Progress", + "allowViewingTransferProgressDescription": "If enabled, users with console read permissions will also be able to view transfer progress logs via the websocket connection. If disabled, transfer progress logs will only be available for admins.", + "containerPrelude": "Container Prelude", + "containerPreludeDescription": "The terminal prelude used for some status-related messages in the server console." + }, + "toast": { + "updated": "Server settings updated." + } + } + }, + "user": { + "title": "User", + "page": { + "title": "User Settings", + "form": { + "maxServerGroupCount": "Max Server Groups", + "maxApiKeyCount": "Max API Keys", + "maxCommandSnippetCount": "Max Command Snippets", + "maxSecurityKeyCount": "Max Security Keys", + "maxSshKeyCount": "Max SSH Keys", + "allowChangingLanguage": "Allow Changing Language", + "allowChangingLanguageDescription": "If enabled, users will be able to change their language preferences." + }, + "routeOrder": { + "title": "Client Route Order" + }, + "toast": { + "updated": "User settings updated." + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "Activity Settings", + "form": { + "adminLogRetentionDays": "Admin Activity Retention Days", + "userLogRetentionDays": "User Activity Retention Days", + "serverLogRetentionDays": "Server Activity Retention Days", + "adminLogRetentionCount": "Admin Activity Retention Count", + "userLogRetentionCount": "User Activity Retention Count", + "serverLogRetentionCount": "Server Activity Retention Count", + "serverLogAdminActivity": "Log Server Admin Activity", + "serverLogAdminActivityDescription": "Enable or disable logging of admin activity on servers where the admin isn't an owner or subuser.", + "serverLogScheduleActivity": "Log Server Schedule Activity", + "serverLogScheduleActivityDescription": "Enable or disable logging of activity done by server schedules." + }, + "toast": { + "updated": "Activity settings updated." + } + } + }, + "ratelimits": { + "title": "Ratelimits", + "page": { + "title": "Ratelimit Settings", + "form": { + "hits": "Hits", + "hitsDescription": "Maximum number of requests allowed per window.", + "windowSeconds": "Window", + "windowSecondsDescription": "Window duration in seconds." + }, + "toast": { + "updated": "Rate limit settings updated." + } + } + } + } + }, + "announcements": { + "title": "Announcements", + "resourceName": "Announcement", + "tabs": { + "general": { + "page": { + "modal": { + "delete": { + "title": "Confirm Announcement Deletion", + "content": "Are you sure you want to delete **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" + } + }, + "form": { + "dismissibleEnd": "Dismissible End", + "enabledStart": "Enabled Start", + "enabledEnd": "Enabled End", + "locations": "Locations", + "locationsDescription": "Leave empty to apply to all locations.", + "nodes": "Nodes", + "nodesDescription": "Leave empty to apply to all nodes.", + "backupConfigurations": "Backup Configurations", + "backupConfigurationsDescription": "Leave empty to apply to all backup configurations.", + "eggsPlaceholder": "Select Eggs", + "dismissible": "Dismissible" + }, + "titleCreate": "Create Announcement", + "titleUpdate": "Update Announcement" + } + } + }, + "enum": { + "announcementType": { + "info": "Info", + "success": "Success", + "warning": "Warning", + "error": "Error" + } + } + }, + "assets": { + "title": "Assets", + "button": { + "newDirectory": "New Directory", + "upload": "Upload", + "copyLink": "Copy Link" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" }, "toast": { - "installCancelled": "Установка сервера отменена." + "assetDeleted": "Asset deleted.", + "assetsDeleted": "{assets} deleted." }, "modal": { - "sshDetails": { - "title": "Данные SSH", - "form": { - "command": "Команда SSH" - }, - "launch": "Запустить" + "createDirectory": { + "title": "New Directory", + "createdAs": "Will be created at " + }, + "deleteAssets": { + "title": "Confirm Asset Deletion", + "content": "Are you sure you want to delete `{count}` assets?" + }, + "deleteAsset": { + "title": "Delete Asset", + "content": "Are you sure you want to delete this asset? This action cannot be undone." } + } + }, + "extensions": { + "title": "Extensions", + "unknownExtension": "Unknown Extension", + "alert": { + "noExtensions": "No extensions installed.", + "heavyImageMissing": "You don't seem to be using the heavy image required to install extensions, see [here]({docsUrl}) on how to switch to it." }, - "notification": { - "nodeMaintenance": "Ваш сервер находится на узле, который сейчас на обслуживании.", - "transferring": "Ваш сервер сейчас переносится на другой узел.", - "restoringBackup": "Ваш сервер сейчас восстанавливается из резервной копии. Пожалуйста, подождите...", - "installing": "Ваш сервер сейчас устанавливается. Пожалуйста, подождите..." - }, - "message": { - "serverMarkedAs": "Сервер отмечен как {state}...", - "installFailed": "Установка не удалась.", - "installCompleted": "Установка успешно завершена.", - "transferFailed": "Перенос не удался.", - "transferCompleted": "Перенос успешно завершён. Переподключение к серверу...", - "pullingImage": "Ваш сервер сейчас загружает Docker-образ. Пожалуйста, подождите...", - "pulling": "Загрузка", - "extracting": "Распаковка" + "button": { + "viewBuildLogs": "View build logs", + "install": "Install extension", + "rebuild": "Rebuild extensions", + "configure": "Configure", + "back": "Back to Extensions", + "accept": "Accept", + "decline": "Decline" }, "tooltip": { - "search": "Поиск", - "sshDetails": "Данные SSH", - "commandHistory": "История команд", - "decreaseFontSize": "Уменьшить размер шрифта", - "increaseFontSize": "Увеличить размер шрифта" + "building": "The panel is currently building extension code. Please wait.", + "noPendingBuild": "No pending extensions to build.", + "noBackend": "Backend extension is required to configure this extension.", + "noConfigurationPage": "This extension does not have a configuration page defined.", + "removeExtension": "Remove extension" }, - "drawer": { - "commandHistory": { - "title": "История команд", - "detailTitle": "Детали команды", - "noCommands": "Команды не найдены.", + "badge": { + "frontendMissing": "Frontend missing", + "backendMissing": "Backend missing", + "pendingBuild": "Pending build", + "pendingRemoval": "Pending removal" + }, + "card": { + "version": "Version", + "authors": "Authors" + }, + "section": { + "pendingExtensions": "Pending extensions", + "noPendingExtensions": "No pending extensions." + }, + "dropzone": { + "title": "Drop some files here to install as Extensions", + "subtitle": "Release to start installing" + }, + "toast": { + "buildStarted": "Extension rebuild started successfully.", + "buildCompleted": "Extension build completed. You may need to refresh the page.", + "added": "Extension `{packageName}` added successfully.", + "removed": "Extension `{packageName}` removed successfully." + }, + "notFound": { + "title": "Extension Not Found", + "content": "Extension with package name \"{packageName}\" not found." + }, + "configure": { + "title": "Configure {packageName}", + "noConfigurationPage": "This extension does not have a configuration page." + }, + "modal": { + "buildLogs": { + "title": "Build Logs", + "empty": "No logs found." + }, + "license": { + "title": "License agreement", + "description": "The extension `{packageName}` requires you to accept the following license before it can be installed." + }, + "remove": { + "title": "Remove extension", + "content": "Are you sure you want to remove the extension `{packageName}`? This action cannot be undone.", + "form": { + "removeMigrations": "Do you want to remove & rollback the database migrations of this extension?" + } + } + } + }, + "users": { + "title": "Users", + "resourceName": "User", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, + "tooltip": { + "admin": "Admin", + "twoFactorEnabled": "2FA Enabled", + "twoFactorDisabled": "2FA Disabled" + }, + "table": { + "columns": { + "role": "Role" + } + }, + "tabs": { + "general": { + "page": { + "tooltip": { + "cannotImpersonateSelf": "You cannot impersonate yourself." + }, + "button": { + "disableTwoFactor": "Disable Two Factor", + "sendPasswordResetEmail": "Send Password Reset Email", + "impersonate": "Impersonate" + }, + "form": { + "admin": "Admin", + "adminDescription": "Admin users have full, unrestricted access to everything on the panel.", + "frozen": "Frozen", + "frozenDescription": "Frozen users cannot make any changes to their account information.", + "suspended": "Suspended", + "suspendedDescription": "Suspended users cannot access the panel in any meaningful way.", + "role": "Role" + }, + "modal": { + "delete": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete **{username}**?" + }, + "disableTwoFactor": { + "title": "Disable User Two Factor", + "content": "Are you sure you want to remove the two factor of **{username}**?", + "toast": { + "disabled": "User two factor disabled." + } + }, + "sendPasswordResetEmail": { + "title": "Send Password Reset Email", + "content": "Are you sure you want to send a password reset email to **{email}**?", + "toast": { + "sent": "Password reset email sent." + } + } + }, + "titleCreate": "Create User", + "titleUpdate": "Update User" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "User Servers", + "showOwnedOnly": "Only show users' owned servers" + } + }, + "oauthLinks": { + "title": "OAuth Links", + "page": { + "title": "User OAuth Links", + "toast": { + "added": "OAuth Link added.", + "removed": "OAuth Link removed." + }, + "modal": { + "add": { + "title": "Add OAuth Link", + "form": { + "oauthProvider": "OAuth Provider" + } + }, + "delete": { + "title": "Confirm OAuth Link Deletion", + "content": "Are you sure you want to delete the **{provider}** connection from **{username}**?" + } + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "User Activity" + } + } + } + }, + "locations": { + "title": "Locations", + "resourceName": "Location", + "tabs": { + "general": { + "page": { + "form": { + "flag": "Flag" + }, + "modal": { + "delete": { + "title": "Confirm Location Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "titleCreate": "Create Location", + "titleUpdate": "Update Location" + } + }, + "databaseHosts": { + "title": "Database Hosts", + "page": { + "title": "Location Database Hosts", + "toast": { + "created": "Location database host created.", + "deleted": "Location database host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Host" + }, + "delete": { + "title": "Confirm Location Database Host Deletion", + "content": "Are you sure you want to delete the database host **{name}** from **{location}**?" + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Location Nodes" + } + } + } + }, + "nodes": { + "title": "Nodes", + "resourceName": "Node", + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "general": { + "page": { + "tooltip": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "allInOneNode": "All-in-One Node", + "errorWhileFetchingVersion": "Error while fetching version", + "updateAvailable": "{version} (Update Available)", + "useWingsProxyUrl": "Use Wings Proxy URL" + }, + "form": { + "urlDescription": "Used for internal communication with the node.", + "publicUrlDescription": "Used for websocket connections and downloads.", + "backupConfigurationPlaceholder": "Inherit from Location", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." + }, + "button": { + "resetToken": "Reset Token", + "updateConfig": "Update Config" + }, + "toast": { + "tokenReset": "Node token reset." + }, + "alert": { + "noLocations": "You need to create at least one location before you can create nodes. Locations help organize your nodes geographically or logically." + }, + "titleCreate": "Create Node", + "titleUpdate": "Update Node" + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/pterodactyl/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "panelUrl": "Panel URL", + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the node: {error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Node Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "toast": { + "connectionLost": "Lost connection to the node statistics stream." + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "cpuThreads": "{model} ({threads} threads)", + "usedByWings": "{size} used by Wings", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "networkTraffic": "Network Traffic", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "inbound": "Inbound", + "outbound": "Outbound", + "networkInLabel": "Network In", + "networkOutLabel": "Network Out" + } + } + }, + "capacity": { + "title": "Capacity", + "page": { + "title": "Deployment Capacity", + "subtitle": "Resources allocated to servers on this node, measured against the limits configured in node settings, not the physical machine capacity. Deployment only checks memory and disk.", + "card": { + "resources": "Allocated Resources" + }, + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Under Maintenance", + "maintenanceDisabled": "Not Under Maintenance" + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "memoryOverhead": "Memory Overhead", + "servers": "Servers", + "noLimit": "No node limit", + "free": "{size} free", + "overhead": "+ {size} reserved overhead", + "cores": "{cores} cores allocated" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Node Logs", + "form": { + "logFile": "Log File", + "follow": "Follow" + }, + "button": { + "download": "Download Full Log" + }, + "toast": { + "connectionLost": "Lost connection to the node log stream." + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Node Allocations", + "tooltip": { + "clearSelection": "Clear Selection" + }, + "form": { + "ipAlias": "IP Alias" + }, + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "modal": { + "create": { + "title": "Create Node Allocations", + "button": { + "create": "Create {count}" + }, + "toast": { + "created": "{allocations} created." + } + }, + "update": { + "title": "Update Node Allocations", + "toast": { + "updated": "{allocations} updated." + } + }, + "delete": { + "title": "Confirm Node Allocations Deletion", + "content": "Are you sure you want to delete `{count}` allocations from **{name}**?", + "toast": { + "deleted": "{allocations} deleted." + } + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Node Mounts", + "toast": { + "added": "Node Mount added.", + "removed": "Node Mount removed." + }, + "modal": { + "add": { + "title": "Add Node Mount" + }, + "remove": { + "title": "Confirm Node Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Node Backups", + "input": { + "detachedOnly": "Only show detached backups" + }, + "tooltip": { + "backupNotOnSameNode": "This backup is not on the same node as the server. It is not viewable from the Client API." + }, + "toast": { + "downloadStarted": "Download started.", + "detached": "Backup detached successfully.", + "reattached": "Reattached backup to {name} successfully.", + "restoring": "Restoring backup to {name}...", + "exporting": "Exporting backup to files of {name}...", + "deleted": "Node backup deleted." + }, + "modal": { + "export": { + "title": "Export Node Backup to Files" + }, + "detach": { + "title": "Confirm Backup Detachment", + "content": "Are you sure you want to detach this backup from its server? It will not be deleted and can be reattached later." + }, + "reattach": { + "title": "Reattach Node Backup", + "description": "Reattaching a node backup will link it to a server. This is useful if the backup is detached or you want to link it to a different server. Do note that this is not a transfer tool, unless the backup is considered remote (can be accessed by multiple nodes), the server must belong to the same node as the backup." + }, + "restore": { + "title": "Restore Node Backup", + "form": { + "truncateDirectory": "Do you want to empty the filesystem of this server before restoring the backup?" + } + }, + "delete": { + "title": "Confirm Node Backup Deletion", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Node Servers", + "modal": { + "transfer": { + "title": "Transfer Servers", + "form": { + "allocationMode": "Allocation Mode", + "transferBackups": "Transfer backups", + "transferBackupsDescription": "Whether to transfer backups along with the servers." + }, + "toast": { + "started": "{servers} transfer started." + }, + "confirm": { + "title": "Confirm Server Transfers", + "content": "Are you sure you want to transfer `{count}` servers from **{from}** to **{to}**? This action cannot be undone." + }, + "enum": { + "allocationMode": { + "none": "None (scrap all allocations, server will not be automatically assigned new allocations on the destination node)", + "randomPrimary": "Randomize primary allocation (removes additional allocations)", + "randomAll": "Randomize all allocations (recommended to avoid incompatibility issues with destination node)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", + "eggConfigDeployment": "Assign allocations based on Egg deployment configuration (only works if the Egg has a deployment configuration and the destination node has compatible allocations)", + "eggConfigSelfAssignRange": "Self-assign new allocations based on Egg port range (only works if the Egg has a port range and the destination node has compatible allocations)" + } + } + }, + "powerAction": { + "title": "Confirm Power Action", + "content": "Are you sure you want to **{action}** {servers}?" + } + } + } + }, + "transfers": { + "title": "Outgoing Transfers", + "page": { + "title": "Node Transfers", + "table": { + "columns": { + "progress": "Progress", + "archiveRate": "Archive Rate", + "networkRate": "Network Rate" + } + } + } + } + }, + "modal": { + "delete": { + "title": "Confirm Node Deletion", + "content": "Are you sure you want to delete **{name}**?" + }, + "bulkConfig": { + "title": "Update Configuration - {nodes}", + "button": { + "apply": "Apply to {nodes}" + }, + "toast": { + "applied": "Configuration applied to {nodes}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "servers": { + "title": "Servers", + "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, + "general": { + "page": { + "titleCreate": "Create Server", + "titleUpdate": "Update Server", + "card": { + "basicInformation": "Basic Information", + "serverAssignment": "Server Assignment", + "resourceLimits": "Resource Limits", + "serverConfiguration": "Server Configuration", + "featureLimits": "Feature Limits", + "allocations": "Allocations", + "variables": "Variables" + }, + "alert": { + "suspended": "This server is suspended.", + "selectEggForVariables": "Please select an egg before you can configure variables." + }, + "badge": { + "serverSuspended": "Server Suspended" + }, + "form": { + "serverNamePlaceholder": "My Game Server", + "externalIdPlaceholder": "Optional external identifier", + "descriptionPlaceholder": "Server description", + "owner": "Owner", + "egg": "Egg", + "backupConfigurationPlaceholder": "Inherit from Node/Location", + "cpuLimit": "CPU Limit (%)", + "cpuLimitDescription": "The CPU limit in % that the server can use.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this server.", + "swapTooltip": "-1 will not set a limit.", + "memoryDescription": "The Memory limit of the server container.", + "memoryTooltip": "0 will not set a limit.", + "memoryOverhead": "Memory Overhead", + "memoryOverheadDescription": "Hidden Memory that will be added to the container.", + "diskSpace": "Disk Space", + "diskSpaceDescription": "The disk limit of the server.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the server container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems.", + "pinnedCpus": "Pinned CPUs", + "pinnedCpusDescription": "The CPU cores this server is pinned to.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", + "dockerImagePlaceholder": "ghcr.io/...", + "predefinedDockerImages": "Predefined Docker Images", + "predefinedDockerImagesPlaceholder": "No predefined image selected", + "timezonePlaceholder": "Europe/Amsterdam", + "startupCommandPlaceholder": "npm start", + "startupCommandCustom": "Custom", + "predefinedStartupCommands": "Predefined Startup Commands", + "startOnCompletion": "Start on Completion", + "startOnCompletionDescription": "Start server after installation completes.", + "skipInstaller": "Skip Installer", + "skipInstallerDescription": "Skip running the install script.", + "hugepagesPassthroughEnabled": "Enable Hugepages Passthrough", + "hugepagesPassthroughEnabledDescription": "Enable hugepages passthrough for the server (mounts /dev/hugepages into the container).", + "kvmPassthroughEnabled": "Enable KVM Passthrough", + "kvmPassthroughEnabledDescription": "Enable KVM passthrough for the server (allows access to /dev/kvm inside the container).", + "allocationsLimit": "Allocations", + "databasesLimit": "Databases", + "databaseAgentsLimit": "Agent Databases", + "backupsLimit": "Backups", + "schedulesLimit": "Schedules" + }, + "modal": { + "confirmNoAllocation": { + "title": "No Primary Allocation Assigned", + "content": "You are creating a server without assigning any primary allocation. Are you sure you want to continue?", + "button": { + "confirm": "Create Anyway" + } + } + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Server Allocations", + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "form": { + "notesPlaceholder": "Notes" + }, + "toast": { + "updated": "Allocation updated.", + "setPrimary": "Allocation set as primary.", + "unsetPrimary": "Allocation unset as primary.", + "removed": "Allocation removed.", + "added": "{count} allocations added." + }, + "modal": { + "add": { + "title": "Add Server Allocations", + "form": { + "allocations": "Allocations" + }, + "button": { + "add": "Add {count}" + } + }, + "remove": { + "title": "Confirm Allocation Removal", + "content": "Are you sure you want to remove **{allocation}**?" + } + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Server Variables", + "toast": { + "updated": "Server variables updated." + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Server Mounts", + "toast": { + "added": "Server Mount added.", + "deleted": "Server Mount deleted." + }, + "modal": { + "add": { + "title": "Add Server Mount" + }, + "remove": { + "title": "Confirm Server Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Server Backups", + "input": { + "partiallyDetachedOnly": "Only show partially detached backups" + } + } + }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Server Logs", + "form": { + "logType": "Log Type" + }, + "enum": { + "logType": { + "console": "Console", + "install": "Install" + } + } + } + }, + "management": { + "title": "Management", + "page": { + "title": "Server Management", + "transfer": { + "title": "Transfer", + "content": "Transfer this server and it's data to another node within this system.", + "toast": { + "started": "Server transfer started." + }, + "modal": { + "title": "Server Transfer", + "form": { + "backupsToTransfer": "Backups to transfer" + }, + "tooltip": { + "aioNotSupported": "Transfers to the All-In-One node are not supported." + }, + "confirm": { + "title": "Confirm Server Transfer", + "content": "Are you sure you want to transfer **{name}** from **{from}** to **{to}**?", + "alert": { + "notAllBackupsSelected": "You have not selected all backups to transfer, the remaining backups will become partially detached if the transfer completes successfully." + } + } + } + }, + "suspend": { + "title": "Suspend", + "content": "This will suspend the server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the server through the panel or API.", + "button": "Suspend", + "toast": { + "suspended": "Server suspended." + }, + "modal": { + "title": "Confirm Server Suspension", + "content": "Are you sure you want to suspend **{name}**? This will stop the server and prevent it from starting. All running processes will be stopped and the user will not be able to access their files or otherwise manage the server through the panel or API." + } + }, + "unsuspend": { + "title": "Unsuspend", + "content": "This will unsuspend the server, allowing it to start again. The user will be able to access their files and otherwise manage the server through the panel or API.", + "button": "Unsuspend", + "toast": { + "unsuspended": "Server unsuspended." + }, + "modal": { + "title": "Confirm Server Unsuspension", + "content": "Are you sure you want to unsuspend **{name}**? This will allow the server to start again. The user will be able to access their files and otherwise manage the server through the panel or API." + } + }, + "clearState": { + "title": "Clear State", + "content": "This will clear the server state known by the panel.", + "button": "Clear State", + "toast": { + "cleared": "Server state cleared." + }, + "modal": { + "title": "Confirm Server State Clear", + "content": "Are you sure you want to clear the state of **{name}**? This will clear any known pending transfers and status failures, please make sure it is safe to do this before clicking without reason." + } + }, + "delete": { + "title": "Delete", + "content": "This will delete the server and all of its data. This action cannot be undone.", + "toast": { + "deleted": "Server deleted." + }, + "modal": { + "title": "Confirm Server Deletion", + "description": "You are about to delete **{name}**. Are you sure?", + "form": { + "deleteBackups": "Do you want to delete backups of this server?", + "confirmServerName": "Confirm Server Name", + "confirmServerNamePlaceholder": "Server Name" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "viewClient": { + "title": "View in Client Area" + } + } + }, + "nests": { + "title": "Nests", + "resourceName": "Nest", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Nest", + "titleUpdate": "Update Nest", + "modal": { + "delete": { + "title": "Confirm Nest Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": { + "deleteEggs": "Do you want to delete all eggs in this nest?" + } + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Eggs", + "resourceName": "Egg", + "dropzone": { + "title": "Drop some files here to import as Eggs", + "subtitle": "Release to start importing" + }, + "button": { + "updateFromRepository": "Update from Repository" + }, + "toast": { + "imported": "Egg imported.", + "moved": "Egg moved.", + "movedBulk": "{eggs} moved.", + "deletedBulk": "{eggs} deleted.", + "updatedFromRepository": "{eggs} updated using their respective repository egg successfully.", + "parseFailed": "Failed to parse egg: {error}" + }, + "modal": { + "move": { + "title": "Move Egg" + }, + "moveBulk": { + "title": "Move Eggs", + "confirm": "Move {eggs}" + }, + "deleteBulk": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete `{count}` eggs?" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg", + "titleUpdate": "Update Egg", + "card": { + "startupConfiguration": "Startup Configuration", + "stopConfiguration": "Stop Configuration", + "configFiles": "Config Files Configuration" + }, + "form": { + "eggRepository": "Egg Repository", + "eggRepositoryEgg": "Egg Repository Egg", + "startupDone": "Startup Done", + "startupDoneDescription": "Console message indicating startup completion.", + "stripAnsi": "Strip ANSI from startup messages", + "stripAnsiDescription": "Removes ANSI control characters from the console output before matching startup completion.", + "stopType": "Stop Type", + "stopCommand": "Stop Command", + "stopSignal": "Stop Signal", + "parser": "Parser", + "createNewFile": "Create New File", + "createNewFileDescription": "If enabled, the file will be created if it does not exist. If disabled, the file must already exist or the replacement will fail.", + "match": "Match", + "ifValue": "If Value", + "replaceWith": "Replace With", + "insertNew": "Insert New", + "insertNewDescription": "If enabled, if no existing value matches the \"Match\" field, the \"Replace With\" value will be inserted into the file. If disabled, if no match is found, no changes will be made to the file.", + "updateExisting": "Update Existing", + "updateExistingDescription": "If enabled, if a match is found, it will be replaced with the \"Replace With\" value. If disabled, the replacement will only insert new values and will fail if a match is found.", + "startupCommands": "Startup Commands", + "forceOutgoingIp": "Force Outgoing IP", + "separatePort": "Separate IP and Port", + "separatePortDescription": "Separates the primary IP and port on the Console page instead of joining them with \":\".", + "features": "Features", + "featurePlaceholder": "Feature", + "fileDenylist": "File Deny List", + "dockerImages": "Docker Images" + }, + "enum": { + "stopType": { + "command": "Send Command", + "signal": "Send Signal", + "docker": "Docker Stop" + } + }, + "emptyConfigFiles": "No config files defined.", + "emptyReplacements": "No replacements defined.", + "button": { + "addReplacement": "Add Replacement", + "addConfigFile": "Add Config File", + "fromFile": "from File", + "fromRepository": "from Repository" + }, + "toast": { + "exported": "Egg exported.", + "updated": "Egg updated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "installationScript": { + "title": "Installation Script", + "page": { + "title": "Egg Installation Script", + "form": { + "container": "Installation Container", + "entrypoint": "Container Entrypoint" + }, + "toast": { + "updated": "Egg script updated." + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Egg Variables", + "form": { + "supportsMarkdown": "Supports Markdown formatting.", + "defaultValue": "Default Value", + "defaultValuePlaceholder": "server.jar", + "userViewable": "User Viewable", + "userEditable": "User Editable", + "secret": "Secret", + "rules": "Rules", + "rulesDescription": "See https://laravel.com/docs/12.x/validation#available-validation-rules for the available validation rules." + }, + "toast": { + "created": "Egg variable created.", + "updated": "Egg variable updated.", + "deleted": "Egg variable deleted.", + "duplicated": "Egg variable duplicated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Variable Removal", + "content": "Are you sure you want to remove **{variable}**?", + "emptyVariable": "this empty variable" + }, + "duplicate": { + "title": "Duplicate Egg Variable" + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Egg Mounts", + "toast": { + "added": "Egg Mount added.", + "deleted": "Egg Mount deleted." + }, + "modal": { + "add": { + "title": "Add Egg Mount" + }, + "delete": { + "title": "Confirm Egg Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{egg}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Egg Servers" + } + } + } + } + } + } + }, + "eggConfigurations": { + "title": "Egg Configurations", + "resourceName": "Egg Configuration", + "table": { + "columns": { + "order": "Order" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Configuration", + "titleUpdate": "Update Egg Configuration", + "form": { + "order": "Order", + "eggs": "Eggs", + "eggsPlaceholder": "Select Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." + }, + "enum": { + "deploymentType": { + "random": "Random", + "range": "Port Range", + "addPrimary": "Add to Primary", + "subtractPrimary": "Subtract from Primary", + "multiplyPrimary": "Multiply Primary", + "dividePrimary": "Divide Primary" + } + }, + "allocation": { + "title": "Allocation Configuration", + "form": { + "userSelfAssign": "User Self Assign", + "userSelfAssignDescription": "Allow users to create their own allocations from a specified port range.", + "requirePrimaryAllocation": "Require Primary Allocation", + "requirePrimaryAllocationDescription": "Whether users must always have a primary allocation.", + "automaticAllocationStart": "Automatic Allocation Start", + "automaticAllocationEnd": "Automatic Allocation End", + "dedicatedIp": "Dedicated IP", + "dedicatedIpDescription": "Assign a dedicated ip address for servers using this egg configuration.", + "primaryAllocation": "Primary Allocation", + "primaryAllocationDescription": "Configure a primary port assignment for deployment.", + "primaryStartPort": "Primary Start Port", + "primaryEndPort": "Primary End Port", + "assignToVariable": "Assign to Variable", + "assignToVariablePlaceholder": "e.g. SERVER_PORT", + "assignToVariableDescription": "Optional environment variable to receive the assigned primary port." + }, + "divider": { + "deployment": "Deployment" + }, + "additionalPorts": { + "title": "Additional Ports", + "button": "Add Rule", + "empty": "No additional port rules configured." + }, + "deployment": { + "form": { + "startPort": "Start Port", + "endPort": "End Port", + "assignToVariable": "Assign to Variable", + "assignToVariableDescription": "Optional environment variable to receive the assigned port from this rule.", + "assignToVariablePlaceholder": "e.g. SERVER_PORT" + }, + "removeRule": "Remove deployment rule" + } + }, + "startup": { + "title": "Startup Configuration", + "form": { + "allowCustomStartupCommand": "Allow Custom Startup Command", + "allowCustomStartupCommandDescription": "Allow users to set their own, non-predefined startup commands." + } + }, + "modal": { + "delete": { + "title": "Confirm Egg Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + } + } + }, + "eggRepositories": { + "title": "Egg Repositories", + "resourceName": "Egg Repository", + "table": { + "columns": { + "gitRepository": "Git Repository" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Repository", + "titleUpdate": "Update Egg Repository", + "form": { + "gitRepository": "Git Repository" + }, + "button": { + "sync": "Sync" + }, + "toast": { + "synced": "Egg repository synchronised, found {eggs}." + }, + "modal": { + "delete": { + "title": "Confirm Egg Repository Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Egg Repository Eggs", + "table": { + "columns": { + "path": "Path" + } + }, + "toast": { + "installed": "Egg installed.", + "installedBulk": "{eggs} installed." + }, + "modal": { + "install": { + "title": "Install Egg Repository Egg" + }, + "installBulk": { + "title": "Install Egg Repository Eggs", + "button": "Install {eggs}" + } + }, + "drawer": { + "noReadme": "This egg does not have a README." + } + } + } + } + }, + "databaseHosts": { + "title": "Database Hosts", + "resourceName": "Database host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Host", + "titleUpdate": "Update Database Host", + "form": { + "publicHost": "Public Host", + "publicPort": "Public Port", + "connectionCredentials": "Connection Credentials", + "credentialType": "Credential Type", + "connectionString": "Connection String", + "connectionStringPlaceholder": "mysql://username:password@host:port" + }, + "enum": { + "credentialType": { + "connectionString": "Connection String", + "details": "Details" + } + }, + "button": { + "testConnection": "Test Connection" + }, + "toast": { + "tested": "Test successfully completed." + }, + "modal": { + "delete": { + "title": "Confirm Database Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "databases": { + "title": "Databases", + "page": { + "title": "Database Host Databases", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } + } + } + } + }, + "oAuthProviders": { + "title": "OAuth Providers", + "resourceName": "OAuth Provider", + "dropzone": { + "title": "Drop some files here to import as OAuth Providers", + "subtitle": "Release to start importing" + }, + "table": { + "columns": { + "loginOnly": "Login Only", + "linkViewable": "Link Viewable", + "userManageable": "User Manageable" + } + }, + "toast": { + "imported": "OAuth Provider imported.", + "parseFailed": "Failed to parse OAuth provider: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create OAuth Provider", + "titleUpdate": "Update OAuth Provider", + "card": { + "redirectUrl": { + "title": "Redirect URL", + "unavailable": "Available after creation" + } + }, + "form": { + "clientId": "Client Id", + "clientSecret": "Client Secret", + "authUrl": "Auth URL", + "tokenUrl": "Token URL", + "infoUrl": "Info URL", + "basicAuth": "Basic Auth", + "basicAuthDescription": "Uses HTTP Basic Authentication to transmit the client id and secret, not common anymore.", + "scopes": "Scopes", + "scopesDescription": "The OAuth2 scopes to request, make sure to include scopes for email and profile info when needed.", + "identifierPath": "Identifier Path", + "identifierPathDescription": "The path used to extract the unique user identifier from the Info URL response (https://serdejsonpath.live).", + "emailPath": "Email Path", + "emailPathDescription": "The path used to extract the email from the Info URL response (https://serdejsonpath.live).", + "usernamePath": "Username Path", + "usernamePathDescription": "The path used to extract the username from the Info URL response (https://serdejsonpath.live).", + "nameFirstPath": "First Name Path", + "nameFirstPathPlaceholder": "First Name URL", + "nameFirstPathDescription": "The path used to extract the first name from the Info URL response (https://serdejsonpath.live).", + "nameLastPath": "Last Name Path", + "nameLastPathDescription": "The path used to extract the last name from the Info URL response (https://serdejsonpath.live).", + "loginOnly": "Only allow Login", + "loginBypass2fa": "Bypass 2FA on Login", + "loginBypass2faDescription": "Allows users logging in with this provider to bypass their panel 2FA.", + "linkViewable": "Link Viewable to User", + "linkViewableDescription": "Allows the user to see the connection and its identifier in the client UI.", + "userManageable": "Link Manageable by User", + "userManageableDescription": "Allows the user to connect and disconnect with this provider." + }, + "toast": { + "exported": "OAuth Provider exported." + }, + "modal": { + "delete": { + "title": "Confirm OAuth Provider Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "mappings": { + "title": "Mappings", + "page": { + "title": "OAuth Provider Mappings", + "table": { + "columns": { + "matcher": "Matcher" + } + }, + "enum": { + "mappingType": { + "role": "Role", + "serverSubuser": "Server Subuser" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" + } + }, + "toast": { + "created": "OAuth provider mapping created.", + "updated": "OAuth provider mapping updated.", + "deleted": "OAuth provider mapping deleted." + }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, + "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", + "scopesDescription": "OAuth scopes that must all have been granted for this matcher to match.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", + "mappingType": "Mapping Type", + "role": "Role", + "permissions": "Permissions" + }, + "modal": { + "add": { + "title": "Add OAuth Provider Mapping" + }, + "edit": { + "title": "Edit OAuth Provider Mapping" + }, + "delete": { + "title": "Delete OAuth Provider Mapping", + "content": "Are you sure you want to delete this mapping? This action cannot be undone." + } + } + } + }, + "users": { + "title": "Users", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, + "page": { + "title": "OAuth Provider Users", + "table": { + "columns": { + "user": "User" + } + } + } + } + } + }, + "backupConfigurations": { + "title": "Backup Configurations", + "resourceName": "Backup configuration", + "table": { + "columns": { + "disk": "Disk" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Backup Configuration", + "titleUpdate": "Update Backup Configuration", + "alert": { + "ddupBak": "Ddup-Bak is Technology Preview software, it is technically not recommended for production use. If you acknowledge, sail ahead as you wish.", + "btrfs": "Btrfs requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "zfs": "ZFS requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "pbs": "The provided API token needs the following datastore ACLs: **DatastoreAudit** for usage and listing, **DatastoreBackup** for writing backups, and **DatastoreAdmin** (or equivalent prune/delete permissions) if backup deletion or pruning is enabled." + }, + "form": { + "backupDisk": "Backup Disk", + "maintenanceEnabledDescription": "If enabled, any server using this backup configuration will not be able to create new backups, or manage existing ones.", + "shared": "Shared", + "sharedDescription": "If enabled, backups on this backup configuration will not be transferred between nodes, they will be assumed to be accessible by all nodes." + }, + "modal": { + "delete": { + "title": "Confirm Backup Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "s3": { + "title": "S3 Settings", + "form": { + "partSize": "Part Size", + "compressionType": "Compression Type", + "pathStyle": "Using path-style URLs" + } + }, + "restic": { + "title": "Restic Settings", + "form": { + "repository": "Repository", + "retryLockSeconds": "Retry Lock Seconds", + "environmentVariables": "Environment Variables", + "cronSchedule": "Cron Schedule", + "cronScheduleDescription": "Format: second minute hour day month weekday.", + "nodes": "Nodes", + "nodesPlaceholder": "Select nodes" + }, + "pruneJobs": { + "title": "Prune Jobs", + "description": "Scheduled restic prune runs. Each job runs on the configured nodes following its cron schedule.", + "button": { + "add": "Add Prune Job" + } + } + }, + "pbs": { + "title": "Proxmox Backup Server Settings", + "form": { + "url": "Server URL", + "datastore": "Datastore", + "namespace": "Namespace", + "tokenId": "Token ID", + "tokenSecret": "Token Secret", + "fingerprint": "TLS Certificate Fingerprint", + "backupIdPrefix": "Backup ID Prefix" + } + }, + "kopia": { + "title": "Kopia Settings", + "form": { + "url": "Kopia Server URL", + "fingerprint": "TLS Certificate Fingerprint", + "tags": "Backup Tags" + } + } + } + }, + "stats": { + "title": "Stats", + "page": { + "title": "Backup Configuration Stats", + "card": { + "title": "Backup Statistics" + }, + "period": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month" + }, + "periodLabel": { + "allTime": "all time", + "today": "today", + "week": "this week", + "month": "this month" + }, + "stat": { + "total": "Total backups {period}", + "successful": "Successful backups {period}", + "failed": "Failed backups {period}", + "deleted": "Deleted backups {period}" + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Backup Configuration Backups", + "toast": { + "downloadStarted": "Download started." + } + } + }, + "locations": { + "title": "Locations", + "page": { + "title": "Backup Configuration Locations" + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Backup Configuration Nodes" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Backup Configuration Servers" + } + } + } + }, + "mounts": { + "title": "Mounts", + "resourceName": "Mount", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Mount", + "titleUpdate": "Update Mount", + "alert": "Mounts are a powerful and potentially dangerous feature. Improper use can lead to data loss or security vulnerabilities (including container escapes). Make sure you understand the implications of using mounts before creating or updating them.", + "form": { + "source": "Source", + "target": "Target", + "readOnly": "Read Only", + "userMountable": "User Mountable" + }, + "modal": { + "delete": { + "title": "Confirm Mount Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Mount Eggs", + "toast": { + "added": "Mount Egg added.", + "removed": "Mount Egg deleted." + }, + "modal": { + "add": { + "title": "Add Mount Egg", + "form": { + "egg": "Egg" + } + }, + "remove": { + "title": "Confirm Mount Egg Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Mount Nodes", + "toast": { + "added": "Mount Node added.", + "removed": "Mount Node deleted." + }, + "modal": { + "add": { + "title": "Add Mount Node" + }, + "remove": { + "title": "Confirm Mount Node Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Mount Servers" + } + } + } + }, + "roles": { + "title": "Roles", + "resourceName": "Role", + "table": { + "columns": { + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Role", + "titleUpdate": "Update Role", + "alert": { + "impersonate": "This role has the `users.impersonate` permission, which allows users with this role to impersonate any other user, including administrators. Be cautious when assigning this permission to roles with less trusted users." + }, + "form": { + "requireTwoFactor": "Require Two Factor", + "requireTwoFactorDescription": "Require users with this role to use two factor authentication.", + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + }, + "modal": { + "delete": { + "title": "Confirm Role Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "users": { + "title": "Users", + "page": { + "title": "Role Users" + } + } + } + }, + "activity": { + "title": "Activity" + } + }, + "server": { + "viewAdmin": { + "title": "Вид администратора" + }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, + "console": { + "title": "Консоль", + "input": { + "placeholder": "Введите команду...", + "ariaLabel": "Поле ввода команды консоли." + }, + "toast": { + "installCancelled": "Установка сервера отменена.", + "transferCancelled": "Server transfer cancelled." + }, + "modal": { + "sshDetails": { + "title": "Данные SSH", + "form": { + "command": "Команда SSH" + }, + "launch": "Запустить" + } + }, + "notification": { + "suspended": "Your Server is currently suspended. No actions can be performed until the suspension is lifted.", + "suspendedAdmin": "This server is currently suspended. Since you are an administrator, you can still access the server, but actions are limited.", + "nodeMaintenance": "Ваш сервер находится на узле, который сейчас на обслуживании.", + "transferring": "Ваш сервер сейчас переносится на другой узел.", + "restoringBackup": "Ваш сервер сейчас восстанавливается из резервной копии. Пожалуйста, подождите...", + "installing": "Ваш сервер сейчас устанавливается. Пожалуйста, подождите...", + "pendingRestart": "Your Server has pending changes that require a restart. Please restart your server to apply these changes." + }, + "message": { + "serverMarkedAs": "Сервер отмечен как {state}...", + "installFailed": "Установка не удалась.", + "installCompleted": "Установка успешно завершена.", + "transferFailed": "Перенос не удался.", + "transferCompleted": "Перенос успешно завершён. Переподключение к серверу...", + "pullingImage": "Ваш сервер сейчас загружает Docker-образ. Пожалуйста, подождите...", + "pulling": "Загрузка", + "extracting": "Распаковка" + }, + "tooltip": { + "search": "Поиск", + "sshDetails": "Данные SSH", + "commandHistory": "История команд", + "decreaseFontSize": "Уменьшить размер шрифта", + "increaseFontSize": "Увеличить размер шрифта" + }, + "drawer": { + "commandHistory": { + "title": "История команд", + "detailTitle": "Детали команды", + "noCommands": "Команды не найдены.", "copyButton": "Копировать команду", "sendButton": "Отправить команду", "commandSent": "Команда успешно отправлена." @@ -1110,6 +4009,17 @@ "button": { "accept": "Принять EULA" } + }, + "javaVersion": { + "title": "Unsupported Java Version", + "content": "This server is currently running an unsupported version of Java and cannot be started.", + "contentDetails": "Please select a supported Docker image from the list below to continue starting the server.", + "toast": { + "updated": "Docker image updated successfully." + }, + "button": { + "update": "Update Docker Image" + } } }, "details": { @@ -1144,15 +4054,25 @@ "files": { "title": "Файлы", "titleEditorViewing": "Просмотр {file}", + "titleEditorPlaying": "Playing {file}", "titleEditorEditing": "Редактирование {file}", "titleEditorNew": "Новый файл", + "titleDiffRevisionVsCurrent": "{file} - Revision #{revision} vs Current", + "titleDiffRevisionVsRevision": "{file} - Revision #{previousRevision} vs #{revision}", "table": { "columns": { "modified": "Изменён" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "Создать", + "connect": "Connect", + "connectSftp": "via SFTP", + "connectVscode": "via VS Code", "openInNewWindow": "Открыть в новом окне", "rename": "Переименовать", "copy": "Копировать", @@ -1190,7 +4110,9 @@ "copying": "Копирование {path} в {destination}", "copyingMany": "Копирование {files}", "receivingRemote": "Получение {files} с удалённого сервера", - "sendingRemote": "Отправка {files} на удалённый сервер" + "sendingRemote": "Отправка {files} на удалённый сервер", + "exportingBackup": "Exporting backup to {destination}", + "cancelAllOperations": "Cancel all operations" }, "dropzone": { "title": "Перетащите файлы сюда для загрузки", @@ -1201,13 +4123,18 @@ "preferPhysicalSize": "Показывать физический размер вместо логического", "editorMinimap": "Показывать мини-карту файла", "editorLineOverflow": "Перенос длинных строк", + "editorFontSize": "Editor Font Size", + "vscodeUriScheme": "VS Code URI Scheme", "imageViewerSmoothing": "Сглаживание изображений (антиалиасинг)" }, "toast": { "operationCancelled": "Операция отменена", + "allOperationsCancelled": "All operations have been cancelled.", "copyingStarted": "Копирование {files} начато.", "filesCouldNotBeMoved": "Не удалось переместить файлы.", "filesMoved": "{files} перемещено.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "Скачивание начато.", "filesDeleted": "Файлы удалены.", "archiveCreationStarted": "Создание архива начато.", @@ -1216,14 +4143,58 @@ "filePullingStarted": "Загрузка файла начата.", "fileRenamed": "Файл переименован.", "fileCouldNotBeRenamed": "Не удалось переименовать файл.", + "filesRenamed": "{files} renamed.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "Права доступа обновлены.", - "fileSaved": "Файл сохранён." + "permissionsUpdatedMany": "Permissions have been updated for {files}.", + "permissionsCouldNotBeUpdated": "Permissions could not be updated.", + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "Файл сохранён.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." + }, + "tooltip": { + "fileHistory": "File History", + "collabEditing": "{user} is editing this file", + "largestDirectories": "Analyze directory sizes", + "dragToMove": "Drag to move", + "back": "Back {seconds} seconds", + "forward": "Forward {seconds} seconds", + "play": "Play", + "pause": "Pause", + "mute": "Mute", + "unmute": "Unmute" + }, + "drawer": { + "revisions": { + "title": "File History", + "noRevisions": "No revisions found for this file.", + "restored": "Revision restored into editor.", + "badge": { + "fullSnapshot": "Full Snapshot" + }, + "tooltip": { + "restore": "Restore this revision into the editor", + "viewDiff": "View diff against current file", + "compareToPrevious": "Compare to previous revision" + }, + "diff": { + "original": "Revision", + "current": "Current" + } + } }, "modal": { "unsavedChanges": { "title": "Несохранённые изменения", "content": "У вас есть несохранённые изменения в редакторе файлов. Вы уверены, что хотите покинуть эту страницу? При выходе ваши изменения будут потеряны." }, + "draftRestore": { + "title": "Restore Draft", + "content": "A draft of this file was found in your browser. Would you like to restore it?", + "contentHashMismatch": "The file has been modified on the server since this draft was saved. Restoring the draft may overwrite those changes." + }, "createArchive": { "title": "Создать архив", "form": { @@ -1276,6 +4247,9 @@ }, "filePermissions": { "title": "Права доступа к файлу", + "form": { + "recursive": "Apply changes recursively to all files and subdirectories within this directory" + }, "symbolic": "Символьные:", "octal": "Восьмеричные:", "owner": "Владелец", @@ -1289,6 +4263,66 @@ "renameFile": { "title": "Переименовать файл" }, + "massRename": { + "title": "Rename Files", + "find": "Find", + "findPlaceholder": "Text to find", + "replace": "Replace with", + "replacePlaceholder": "Replacement text", + "scope": "Apply to", + "scopeName": "Name", + "scopeExtension": "Extension", + "scopeFull": "Full name", + "section": { + "matchOptions": "Match options", + "affixes": "Prefix & suffix", + "caseConversion": "Case conversion", + "numbering": "Numbering" + }, + "affix": { + "prefix": "Prefix", + "suffix": "Suffix", + "help": "Both may include {token} for the number; a suffix appends a count to every name." + }, + "option": { + "regex": "Use regular expression", + "regexDescription": "Treat the find text as a regex; reference groups with $1, $2 in the replacement.", + "caseSensitive": "Case sensitive", + "allOccurrences": "Replace all occurrences" + }, + "case": { + "label": "Convert case", + "none": "No change", + "lower": "lowercase", + "upper": "UPPERCASE", + "title": "Title Case", + "capitalize": "Capitalize" + }, + "numbering": { + "enable": "Enable numbering", + "help": "Insert {token} in the find, replace, prefix, or suffix text where the number should appear.", + "start": "Start at", + "step": "Step", + "padding": "Minimum digits" + }, + "preview": { + "title": "Preview", + "original": "Original", + "newName": "New name", + "unchanged": "Unchanged", + "conflict": "Name already in use", + "duplicate": "Duplicate target", + "invalid": "Invalid name", + "invalidRegex": "Invalid regular expression", + "empty": "No files selected." + }, + "summary": "{changed} of {total} will be renamed", + "conflictWarning": "Resolve the highlighted name conflicts before renaming." + }, + "largestDirectories": { + "title": "Largest Directories", + "empty": "No directories found." + }, "searchFiles": { "title": "Поиск файлов", "placeholder": "Искать файлы...", @@ -1324,6 +4358,10 @@ "databases": { "title": "Базы данных", "subtitle": "Создано {current} из {max} максимальных баз данных.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Этот сервер ограничен {max} базами данных." }, @@ -1338,6 +4376,165 @@ "form": { "databaseName": "Имя базы данных" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Создать базу данных", @@ -1345,7 +4542,8 @@ "created": "База данных создана." }, "form": { - "noHostsFound": "Хосты не найдены" + "noHostsFound": "Хосты не найдены", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -1363,6 +4561,13 @@ "jdbcConnectionString": "Строка подключения JDBC" } }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new one with the same connection details.", + "toast": { + "recreated": "Database recreated." + } + }, "deleteDatabase": { "title": "Подтверждение удаления базы данных", "content": "Удаление базы данных — необратимое действие. Это навсегда удалит базу данных **{name}** и все связанные данные.", @@ -1390,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "Добавить триггер", "addCondition": "Добавить условие", "addStep": "Добавить шаг", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "Создать первый шаг", "addOutput": "Добавить вывод", "addFile": "Добавить файл", @@ -1402,6 +4612,7 @@ "imported": "Расписание импортировано.", "created": "Расписание создано.", "updated": "Расписание обновлено.", + "duplicated": "Schedule duplicated.", "deleted": "Расписание удалено.", "triggered": "Расписание запущено.", "exported": "Расписание экспортировано.", @@ -1409,6 +4620,7 @@ "step": { "created": "Шаг расписания создан.", "updated": "Шаг расписания обновлён.", + "duplicated": "Schedule step duplicated.", "deleted": "Шаг расписания удалён." } }, @@ -1418,12 +4630,21 @@ "and": "И (Все должны быть истинны)", "or": "ИЛИ (Любое должно быть истинно)", "not": "НЕ (Не должно быть истинно)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "Переменная существует", "variableContains": "Переменная содержит", "variableEquals": "Переменная равна", "variableStartsWith": "Переменная начинается с", "variableEndsWith": "Переменная заканчивается на" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "Меньше", "smallerThanOrEqual": "Меньше или равно", @@ -1439,6 +4660,9 @@ "updateSchedule": { "title": "Обновить расписание" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "Подтверждение удаления расписания", "content": "Вы уверены, что хотите удалить {name} с этого сервера?" @@ -1452,12 +4676,19 @@ "deleteStep": { "title": "Подтверждение удаления шага расписания", "content": "Вы уверены, что хотите удалить этот шаг расписания?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "Выполняется" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "Действия", "conditions": "Условия", @@ -1493,6 +4724,7 @@ "contains": "Содержит", "startsWith": "Начинается с", "endsWith": "Заканчивается на", + "metric": "Metric", "allMustBeTrue": "Все условия должны быть истинны:", "anyMustBeTrue": "Любое условие должно быть истинно:", "mustNotBeTrue": "Условие не должно быть истинно:" @@ -1506,11 +4738,27 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "Расписание Cron" + "cronSchedule": "Расписание Cron", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" + }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "По cron-интервалу {schedule}, следующий запуск {timestamp} — последний запуск {lastTimestamp}." - } + }, + "invalidCron": "Invalid cron expression" }, "powerAction": { "title": "Действие питания", @@ -1533,6 +4781,25 @@ "content": "Когда резервная копия достигает статуса `{status}`." } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "Строка консоли", "card": { @@ -1557,8 +4824,20 @@ "title": "Шаги не настроены", "description": "В этом расписании пока нет шагов. Добавьте действия для начала работы." }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "Ожидание", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "Длительность (миллисекунды)" }, @@ -1568,12 +4847,62 @@ }, "ensure": { "title": "Проверка", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "Проверить соответствие условию" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "Форматирование", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "Строка формата", "formatStringDescription": "Строка формата. Переменные можно включить, обернув их в {wrapper}." @@ -1584,6 +4913,7 @@ }, "matchRegex": { "title": "Совпадение регулярного выражения", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "Ввод", "regex": "Регулярное выражение", @@ -1596,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "Ожидание строки консоли", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "Тайм-аут (миллисекунды)" }, @@ -1610,6 +4941,7 @@ }, "sendCommand": { "title": "Отправить команду", + "description": "Send a command to the server console.", "renderer": { "compact": "Выполнить {command}", "detail": { @@ -1619,6 +4951,7 @@ }, "sendPower": { "title": "Отправить сигнал питания", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "Выполнить {action}", "detail": { @@ -1628,19 +4961,75 @@ }, "createBackup": { "title": "Создать резервную копию", + "description": "Create a backup of the server files.", "form": { "backupName": "Имя резервной копии" }, "renderer": { "compact": "Создать {name}", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "Имя резервной копии: {name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "Игнорируемые файлы: {files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "Создать директорию", + "description": "Create a new folder in the server files.", "renderer": { "compact": "Создать {name} в {root}", "detail": { @@ -1651,6 +5040,7 @@ }, "writeFile": { "title": "Записать файл", + "description": "Write or append text to a file.", "form": { "content": "Содержимое", "appendToFile": "Дописать в файл" @@ -1665,6 +5055,7 @@ }, "copyFile": { "title": "Копировать файл", + "description": "Copy a file to a new location.", "form": { "sourceFile": "Исходный файл" }, @@ -1678,6 +5069,7 @@ }, "deleteFiles": { "title": "Удалить файлы", + "description": "Delete files or folders.", "form": { "filesToDelete": "Файлы для удаления" }, @@ -1691,6 +5083,7 @@ }, "renameFiles": { "title": "Переименовать файлы", + "description": "Rename or move files.", "form": { "files": "Файлы", "from": "из", @@ -1706,6 +5099,7 @@ }, "compressFiles": { "title": "Сжать файлы", + "description": "Compress files into an archive.", "form": { "filesToCompress": "Файлы для сжатия" }, @@ -1721,6 +5115,7 @@ }, "decompressFile": { "title": "Распаковать файл", + "description": "Extract an archive into a folder.", "form": { "file": "Файл" }, @@ -1734,6 +5129,7 @@ }, "updateStartupVariable": { "title": "Обновить переменную запуска", + "description": "Change the value of a startup variable.", "renderer": { "compact": "Установить {variable} в {value}", "detail": { @@ -1744,6 +5140,7 @@ }, "updateStartupCommand": { "title": "Обновить команду запуска", + "description": "Change the command used to start the server.", "renderer": { "compact": "Установить {command}", "detail": { @@ -1753,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "Обновить Docker-образ", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "Установить {image}", "detail": { @@ -1764,6 +5162,10 @@ }, "subusers": { "title": "Субпользователи", + "subtitle": "{current} of {max} maximum subusers created.", + "tooltip": { + "limitReached": "This server is limited to {max} subusers." + }, "table": { "columns": { "twoFactorEnabled": "2FA включена", @@ -1779,7 +5181,8 @@ }, "form": { "emailPlaceholder": "Введите email для сохранения субпользователя.", - "permissions": "Разрешения" + "permissions": "Разрешения", + "ignoredFilesDescription": "Files and directories matching these patterns will be hidden from this subuser. Uses gitignore-style glob patterns (e.g. `*.env`, `secrets/`). Prefix a pattern with `!` to un-hide a path that a broader pattern would otherwise exclude." } }, "updateSubuser": { @@ -1810,16 +5213,25 @@ "locked": "Заблокировано?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Обзор" + "browse": "Обзор", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "Скачивание начато.", - "restoringBackup": "Восстановление резервной копии..." + "restoringBackup": "Восстановление резервной копии...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Создать резервную копию", + "noGroup": "No group", "toast": { "created": "Резервная копия создана." } @@ -1833,13 +5245,61 @@ "restoreBackup": { "title": "Восстановить резервную копию" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Подтверждение удаления резервной копии", "content": "Вы уверены, что хотите удалить **{name}** с этого сервера?", "toast": { + "started": "Backup deletion started.", "deleted": "Резервная копия удалена." } + }, + "viewMetadata": { + "title": "Backup Metadata" + } + } + }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." } }, "network": { @@ -1880,7 +5340,15 @@ "startupCommandUpdated": "Команда запуска обновлена.", "dockerImageUpdated": "Docker-образ обновлён.", "variablesUpdated": "Переменные обновлены." - } + }, + "modal": { + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your startup variables. Are you sure you want to leave this page? If you leave, your changes will be lost." + } + }, + "noVariables": "No startup variables found for this server.", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "Маунты", @@ -1966,7 +5434,10 @@ } }, "activity": { - "title": "Активность" + "title": "Активность", + "button": { + "clearUserFilter": "Clear User Filter" + } } } } diff --git a/frontend/public/translations/sk.json b/frontend/public/translations/sk.json index 3357702ce..49b2da21f 100644 --- a/frontend/public/translations/sk.json +++ b/frontend/public/translations/sk.json @@ -56,6 +56,14 @@ "many": "{count} uzla", "other": "{count} uzlov" }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, "allocation": { "zero": "{count} alokácií uzla", "one": "{count} alokácia uzla", @@ -72,6 +80,14 @@ "many": "{count} eggu", "other": "{count} eggov" }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, "shortcut": { "zero": "{count} skratiek", "one": "{count} skratka", @@ -87,6 +103,22 @@ "few": "{count} riadky", "many": "{count} riadkov", "other": "{count} riadkov" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -97,6 +129,7 @@ "save": "Uložiť", "saveAndStay": "Uložiť a zostať", "edit": "Upraviť", + "duplicate": "Duplicate", "delete": "Odstrániť", "remove": "Odstrániť", "enable": "Povoliť", @@ -133,7 +166,8 @@ "setPrimary": "Nastaviť primárne", "unsetPrimary": "Zrušiť primárne", "leavePage": "Opustiť stránku", - "viewDocumentation": "Zobraziť dokumentáciu" + "viewDocumentation": "Zobraziť dokumentáciu", + "undo": "Undo" }, "alert": { "error": "Chyba", @@ -147,6 +181,31 @@ "input": { "search": "Hľadať..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "Obnoviť predvolené nastavenie", "edit": "Upraviť", @@ -156,7 +215,9 @@ "backupOnDifferentNode": "Táto záloha je na inom uzle ako server. Nie je možné ju zobraziť z klientského API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Názov", + "newName": "New Name", "description": "Popis", "author": "Autor", "type": "Typ", @@ -186,6 +247,7 @@ "language": "Jazyk", "identifier": "Identifikátor", "enabled": "Povolené", + "disabled": "Disabled", "title": "Názov", "content": "Obsah", "backupConfiguration": "Konfigurácia záloh", @@ -212,11 +274,13 @@ "nest": "Nest", "lines": "Riadky", "databaseHost": "Hostiteľ databázy", + "databaseAgentHost": "Database Agent Host", "timezone": "Časové pásmo", "timezoneSystem": "Systém", "protocol": "Protokol", "powerAction": "Akcia napájania servera", "destination": "Cieľ", + "destinationDirectory": "Destination Directory", "directoryName": "Názov adresára", "locked": "Zamknuté", "portRanges": "Rozsahy portov", @@ -231,6 +295,7 @@ "value": "Hodnota", "eggs": "Eggy", "ignoredFiles": "Ignorované súbory", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "Vaše heslo ovládacieho panela", "deploymentEnabled": "Nasadenie povolené", "maintenanceEnabled": "Údržba povolená", @@ -253,6 +318,7 @@ "size": "Veľkosť", "lastUsed": "Naposledy použité", "created": "Vytvorené", + "updated": "Updated", "actor": "Aktér", "event": "Udalosť", "ip": "IP", @@ -272,7 +338,10 @@ "files": "Súbory", "server": "Server", "address": "Adresa", - "eggs": "Eggy" + "eggs": "Eggy", + "template": "Template", + "version": "Version", + "host": "Host" } }, "tabs": { @@ -287,6 +356,12 @@ "failed": "Zlyhalo", "installed": "Nainštalované" }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" + }, "server": { "noAllocation": "Bez alokácie", "state": { @@ -339,6 +414,12 @@ "stopped": "Zastavené", "restarted": "Reštartované", "killed": "Ukončené" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" } }, "unit": { @@ -419,7 +500,8 @@ "container": { "alert": { "impersonating": "Momentálne zastupujete iného používateľa. Vaše akcie môžu ovplyvniť účet zastupovaného používateľa. Režim zastupovania ukončíte tlačidlom „Zastaviť zastupovanie“ vľavo dole." - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -427,7 +509,11 @@ "stopImpersonating": "Zastaviť zastupovanie", "openInVirtualWindow": "Otvoriť vo virtuálnom okne", "openInPopup": "Otvoriť vo vyskakovacom okne", - "openInNewTab": "Otvoriť na novej karte" + "openInNewTab": "Otvoriť na novej karte", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { @@ -441,6 +527,9 @@ "selectInput": { "noResults": "Nenašli sa žiadne výsledky." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "Nemáte povolenie na uloženie.", @@ -454,6 +543,9 @@ "deleted": "{resource} odstránené." } }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -497,7 +589,10 @@ "scheduleDynamicInput": { "none": "žiadne", "variable": "Premenná", - "enterVariable": "Zadajte názov premennej na vyhodnotenie." + "enterVariable": "Zadajte názov premennej na vyhodnotenie.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -516,6 +611,7 @@ "toast": { "backupCompleted": "Zálohovanie bolo úspešne dokončené.", "backupFailed": "Zálohovanie zlyhalo.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "Obnova zálohy bola úspešne dokončená.", "installCompleted": "Inštalácia servera bola úspešne dokončená.", "installFailed": "Inštalácia servera zlyhala.", @@ -534,6 +630,7 @@ }, "copying": { "completed": "Skopírované `{path}` do `{destination}` v {time}.", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", "failed": "Nepodarilo sa skopírovať `{path}` do `{destination}`:\n{error}" }, "copyingMany": { @@ -551,6 +648,8 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "Čakanie: {file}", "uploading": "Nahráva sa: {file}", "uploadingFolder": "Nahráva sa priečinok: {folder} ({files})", @@ -560,7 +659,10 @@ "uploading": "Začalo sa nahrávanie: {files}...", "cancelledFile": "Nahrávanie `{file}` bolo úspešne zrušené.", "cancelledFolder": "Nahrávanie `{folder}` ({files}) bolo úspešne zrušené.", - "cancelledAll": "Všetky nahrávania boli zrušené." + "cancelledAll": "Všetky nahrávania boli zrušené.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -1202,6 +1304,12 @@ "toast": { "removed": "Úryvok príkazu bol odstránený." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1268,6 +1376,12 @@ "toast": { "removed": "Kľúč API bol odstránený." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1376,7 +1490,8 @@ "panelVersion": "Verzia panela", "versionHistory": "História verzií", "outdatedExtensions": "Zastarané rozšírenia", - "outdatedNodes": "Zastarané uzly" + "outdatedNodes": "Zastarané uzly", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" }, "panelVersion": "Váš panel momentálne používa verziu `{current}`. Najnovšia dostupná verzia je `{latest}`.", "unknown": "neznámy", @@ -1394,6 +1509,8 @@ "noChangelog": "Žiadny zoznam zmien", "nodesUpToDate": "Zdá sa, že všetky uzly sú aktuálne. (Kontrola zlyhala pri {failed})", "nodesOutdated": "Niektoré uzly sú zastarané, najnovšia dostupná verzia je `{latest}`. ({outdated} zastaraných, kontrola zlyhala pri {failed})", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", "table": { "version": "Verzia", "installed": "Nainštalované", @@ -1642,6 +1759,9 @@ "maxFileManagerContentSearchSize": "Maximálna veľkosť vyhľadávania obsahu správcu súborov", "maxFileManagerSearchResults": "Maximálne výsledky vyhľadávania správcu súborov", "maxSubuserCount": "Maximálny počet podužívateľov", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", "allowOverwritingCustomDockerImage": "Povoliť prepísanie vlastného obrazu Docker", "allowOverwritingCustomDockerImageDescription": "Ak je táto možnosť povolená, používatelia budú môcť prepísať obraz Docker zadaný v konfigurácii servera pomocou zoznamu eggov, aj keď správca nastavil vlastný obraz Docker.", "allowViewingInstallationLogs": "Povoliť zobrazenie denníkov inštalácie", @@ -1727,6 +1847,9 @@ "delete": { "title": "Potvrdiť odstránenie oznámenia", "content": "Naozaj chcete odstrániť **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" } }, "form": { @@ -1862,6 +1985,25 @@ "users": { "title": "Používatelia", "resourceName": "Používateľ", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, "tooltip": { "admin": "Admin", "twoFactorEnabled": "2FA povolené", @@ -1991,6 +2133,25 @@ } } }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, "nodes": { "title": "Uzly", "page": { @@ -2003,6 +2164,37 @@ "title": "Uzly", "resourceName": "Uzol", "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, "general": { "page": { "tooltip": { @@ -2016,7 +2208,10 @@ "form": { "urlDescription": "Používa sa na internú komunikáciu s uzlom.", "publicUrlDescription": "Používa sa na pripojenie cez websocket a sťahovanie.", - "backupConfigurationPlaceholder": "Zdediť z lokality" + "backupConfigurationPlaceholder": "Zdediť z lokality", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." }, "button": { "resetToken": "Resetovať token", @@ -2051,10 +2246,12 @@ "apiPort": "API port" }, "button": { - "save": "Uložiť konfiguráciu" + "save": "Uložiť konfiguráciu", + "reveal": "Reveal Configuration" }, "alert": { - "couldNotReach": "Nepodarilo sa spojiť s uzlom: {error}" + "couldNotReach": "Nepodarilo sa spojiť s uzlom: {error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." }, "toast": { "applied": "Konfigurácia bola úspešne použitá.", @@ -2216,9 +2413,13 @@ "detached": "Záloha bola úspešne odpojená.", "reattached": "Záloha bola úspešne znovu pripojená k {name}.", "restoring": "Obnovuje sa záloha na {name}...", + "exporting": "Exporting backup to files of {name}...", "deleted": "Záloha uzla bola odstránená." }, "modal": { + "export": { + "title": "Export Node Backup to Files" + }, "detach": { "title": "Potvrdiť odpojenie zálohy", "content": "Naozaj chcete odpojiť túto zálohu od jej servera? Záloha sa neodstráni a neskôr ju bude možné znovu pripojiť." @@ -2234,7 +2435,11 @@ } }, "delete": { - "title": "Potvrdiť odstránenie zálohy uzla" + "title": "Potvrdiť odstránenie zálohy uzla", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2263,6 +2468,7 @@ "none": "Žiadne (zrušiť všetky alokácie, serveru nebudú automaticky priradené nové alokácie v cieľovom uzle)", "randomPrimary": "Náhodne vybrať primárnu alokáciu (odstráni ďalšie alokácie)", "randomAll": "Náhodne vybrať všetky alokácie (odporúča sa, aby ste sa vyhli problémom s nekompatibilitou s cieľovým uzlom)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", "eggConfigDeployment": "Priradiť alokácie podľa konfigurácie nasadenia eggu (funguje iba vtedy, ak má egg konfiguráciu nasadenia a cieľový uzol má kompatibilné alokácie)", "eggConfigSelfAssignRange": "Automaticky priradiť nové alokácie podľa rozsahu portov eggu (funguje iba vtedy, ak má egg rozsah portov a cieľový uzol má kompatibilné alokácie)" } @@ -2311,7 +2517,78 @@ "servers": { "title": "Servery", "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, "general": { "page": { "titleCreate": "Vytvoriť server", @@ -2341,23 +2618,30 @@ "backupConfigurationPlaceholder": "Zdediť z uzla/lokality", "cpuLimit": "Limit CPU (%)", "cpuLimitDescription": "Limit CPU v %, ktorý môže server použiť.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", "swap": "Swap", "swapDescription": "Množstvo swapu, ktoré má tento server poskytnúť.", + "swapTooltip": "-1 will not set a limit.", "memoryDescription": "Limit pamäte kontajnera servera.", + "memoryTooltip": "0 will not set a limit.", "memoryOverhead": "Pamäťová réžia", "memoryOverheadDescription": "Skrytá pamäť, ktorá bude pridaná do kontajnera.", "diskSpace": "Priestor na disku", "diskSpaceDescription": "Diskový limit servera.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", "ioWeight": "Váha I/O", "ioWeightDescription": "Relatívna váha I/O kontajnera servera v porovnaní s inými kontajnermi.", + "ioWeightTooltip": "0-1000. May not work on all systems.", "pinnedCpus": "Pripnuté CPU", "pinnedCpusDescription": "Jadrá CPU, ku ktorým je tento server pripnutý.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", "dockerImagePlaceholder": "ghcr.io/...", "predefinedDockerImages": "Preddefinované obrazy Docker", "predefinedDockerImagesPlaceholder": "Nie je vybratý žiadny preddefinovaný obraz", "timezonePlaceholder": "Európa/Amsterdam", "startupCommandPlaceholder": "npm start", "startupCommandCustom": "Vlastné", + "predefinedStartupCommands": "Predefined Startup Commands", "startOnCompletion": "Spustiť po dokončení", "startOnCompletionDescription": "Spustí server po dokončení inštalácie.", "skipInstaller": "Preskočiť inštalačný program", @@ -2368,6 +2652,7 @@ "kvmPassthroughEnabledDescription": "Povolí KVM passthrough pre server (umožňuje prístup k /dev/kvm vnútri kontajnera).", "allocationsLimit": "Alokácie", "databasesLimit": "Databázy", + "databaseAgentsLimit": "Agent Databases", "backupsLimit": "Zálohy", "schedulesLimit": "Plány" }, @@ -2455,6 +2740,17 @@ } } }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, "logs": { "title": "Denníky", "page": { @@ -2546,6 +2842,9 @@ "deleteBackups": "Chcete odstrániť zálohy tohto servera?", "confirmServerName": "Potvrdiť názov servera", "confirmServerNamePlaceholder": "Názov servera" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." } } } @@ -2704,13 +3003,17 @@ "toast": { "created": "Premenná eggu bola vytvorená.", "updated": "Premenná eggu bola aktualizovaná.", - "deleted": "Premenná eggu bola odstránená." + "deleted": "Premenná eggu bola odstránená.", + "duplicated": "Egg variable duplicated." }, "modal": { "delete": { "title": "Potvrdiť odstránenie premennej eggu", "content": "Naozaj chcete odstrániť **{variable}**?", "emptyVariable": "túto prázdnu premennú" + }, + "duplicate": { + "title": "Duplicate Egg Variable" } } } @@ -2761,7 +3064,8 @@ "form": { "order": "Poradie", "eggs": "Eggy", - "eggsPlaceholder": "Vyberte eggy" + "eggsPlaceholder": "Vyberte eggy", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." }, "enum": { "deploymentType": { @@ -2879,6 +3183,9 @@ "title": "Nainštalovať eggy z repozitára eggov", "button": "Nainštalovať {eggs}" } + }, + "drawer": { + "noReadme": "This egg does not have a README." } } } @@ -2915,7 +3222,11 @@ "modal": { "delete": { "title": "Potvrdiť odstránenie hostiteľa databázy", - "content": "Naozaj chcete odstrániť **{name}**?" + "content": "Naozaj chcete odstrániť **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2923,7 +3234,278 @@ "databases": { "title": "Databázy", "page": { - "title": "Databázy hostiteľa" + "title": "Databázy hostiteľa", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } } } } @@ -3001,10 +3583,27 @@ "title": "Mapovania", "page": { "title": "Mapovania poskytovateľa OAuth", + "table": { + "columns": { + "matcher": "Matcher" + } + }, "enum": { "mappingType": { "role": "Rola", "serverSubuser": "Podužívateľ servera" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" } }, "toast": { @@ -3012,8 +3611,28 @@ "updated": "Mapovanie poskytovateľa OAuth bolo aktualizované.", "deleted": "Mapovanie poskytovateľa OAuth bolo odstránené." }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Rozsahy", "scopesDescription": "Rozsahy OAuth potrebné na použitie tohto mapovania.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", "mappingType": "Typ mapovania", "role": "Rola", "permissions": "Povolenia" @@ -3034,6 +3653,25 @@ }, "users": { "title": "Používatelia", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, "page": { "title": "Používatelia poskytovateľa OAuth", "table": { @@ -3061,7 +3699,8 @@ "alert": { "ddupBak": "Ddup-Bak je softvér vo fáze technologickej ukážky a neodporúča sa na produkčné použitie. Ak tomu rozumiete, môžete pokračovať.", "btrfs": "Btrfs vyžaduje na uzle dodatočné nastavenie. Ďalšie podrobnosti nájdete v [dokumentácii]({docsUrl}).", - "zfs": "ZFS vyžaduje na uzle dodatočné nastavenie. Ďalšie podrobnosti nájdete v [dokumentácii]({docsUrl})." + "zfs": "ZFS vyžaduje na uzle dodatočné nastavenie. Ďalšie podrobnosti nájdete v [dokumentácii]({docsUrl}).", + "pbs": "The provided API token needs the following datastore ACLs: **DatastoreAudit** for usage and listing, **DatastoreBackup** for writing backups, and **DatastoreAdmin** (or equivalent prune/delete permissions) if backup deletion or pruning is enabled." }, "form": { "backupDisk": "Disk pre zálohy", @@ -3079,6 +3718,7 @@ "title": "Nastavenia S3", "form": { "partSize": "Veľkosť časti", + "compressionType": "Compression Type", "pathStyle": "Používať URL vo formáte path-style" } }, @@ -3100,6 +3740,26 @@ "add": "Pridať úlohu prune" } } + }, + "pbs": { + "title": "Proxmox Backup Server Settings", + "form": { + "url": "Server URL", + "datastore": "Datastore", + "namespace": "Namespace", + "tokenId": "Token ID", + "tokenSecret": "Token Secret", + "fingerprint": "TLS Certificate Fingerprint", + "backupIdPrefix": "Backup ID Prefix" + } + }, + "kopia": { + "title": "Kopia Settings", + "form": { + "url": "Kopia Server URL", + "fingerprint": "TLS Certificate Fingerprint", + "tags": "Backup Tags" + } } } }, @@ -3278,6 +3938,11 @@ "viewAdmin": { "title": "Zobraziť v oblasti správcu" }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, "console": { "title": "Konzola", "input": { @@ -3399,6 +4064,10 @@ "modified": "Upravené" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "Nové", "connect": "Pripojiť", @@ -3442,6 +4111,7 @@ "copyingMany": "Kopíruje sa {files}", "receivingRemote": "Prijímanie {files} zo vzdialeného servera", "sendingRemote": "Odosielanie {files} na vzdialený server", + "exportingBackup": "Exporting backup to {destination}", "cancelAllOperations": "Zrušiť všetky operácie" }, "dropzone": { @@ -3453,6 +4123,7 @@ "preferPhysicalSize": "Zobraziť fyzickú veľkosť namiesto logickej veľkosti", "editorMinimap": "Zobraziť minimapu súboru", "editorLineOverflow": "Zalamovať príliš dlhé riadky", + "editorFontSize": "Editor Font Size", "vscodeUriScheme": "Schéma URI pre VS Code", "imageViewerSmoothing": "Vyhladzovanie obrázkov (anti-aliasing)" }, @@ -3462,6 +4133,8 @@ "copyingStarted": "Začalo sa kopírovanie: {files}.", "filesCouldNotBeMoved": "Súbory nebolo možné presunúť.", "filesMoved": "{files} presunuté.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "Sťahovanie začalo.", "filesDeleted": "Súbory boli odstránené.", "archiveCreationStarted": "Vytváranie archívu sa začalo.", @@ -3471,13 +4144,19 @@ "fileRenamed": "Súbor bol premenovaný.", "fileCouldNotBeRenamed": "Súbor sa nepodarilo premenovať.", "filesRenamed": "{files} premenované.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "Povolenia boli aktualizované.", "permissionsUpdatedMany": "Povolenia boli aktualizované pre {files}.", "permissionsCouldNotBeUpdated": "Povolenia sa nepodarilo aktualizovať.", - "fileSaved": "Súbor bol uložený." + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "Súbor bol uložený.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." }, "tooltip": { "fileHistory": "História súborov", + "collabEditing": "{user} is editing this file", "largestDirectories": "Analyzovať veľkosti adresárov", "dragToMove": "Potiahnutím presunúť", "back": "Späť {seconds} sekúnd", @@ -3679,6 +4358,10 @@ "databases": { "title": "Databázy", "subtitle": "Vytvorené databázy: {current} z {max}.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Tento server má limit {max} databáz." }, @@ -3693,6 +4376,165 @@ "form": { "databaseName": "Názov databázy" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Vytvoriť databázu", @@ -3700,7 +4542,8 @@ "created": "Databáza vytvorená." }, "form": { - "noHostsFound": "Nenašli sa žiadni hostitelia" + "noHostsFound": "Nenašli sa žiadni hostitelia", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -3752,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "Pridať spúšťač", "addCondition": "Pridať podmienku", "addStep": "Pridať krok", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "Vytvoriť prvý krok", "addOutput": "Pridať výstup", "addFile": "Pridať súbor", @@ -3764,6 +4612,7 @@ "imported": "Plán bol importovaný.", "created": "Plán bol vytvorený.", "updated": "Plán bol aktualizovaný.", + "duplicated": "Schedule duplicated.", "deleted": "Plán bol odstránený.", "triggered": "Plán bol spustený.", "exported": "Plán bol exportovaný.", @@ -3771,6 +4620,7 @@ "step": { "created": "Krok plánu bol vytvorený.", "updated": "Krok plánu bol aktualizovaný.", + "duplicated": "Schedule step duplicated.", "deleted": "Krok plánu bol odstránený." } }, @@ -3780,12 +4630,21 @@ "and": "A (všetko musí byť pravdivé)", "or": "ALEBO (aspoň jedno musí byť pravdivé)", "not": "NIE (nesmie byť pravdivé)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "Premenná existuje", "variableContains": "Premenná obsahuje", "variableEquals": "Premenná sa rovná", "variableStartsWith": "Premenná sa začína na", "variableEndsWith": "Premenná sa končí na" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "Menšie ako", "smallerThanOrEqual": "Menšie alebo rovné", @@ -3801,6 +4660,9 @@ "updateSchedule": { "title": "Aktualizovať plán" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "Potvrdiť odstránenie plánu", "content": "Naozaj chcete odstrániť {name} z tohto servera?" @@ -3814,12 +4676,19 @@ "deleteStep": { "title": "Potvrdiť odstránenie kroku plánu", "content": "Naozaj chcete odstrániť tento krok plánu?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "Spustený" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "Akcie", "conditions": "Podmienky", @@ -3855,6 +4724,7 @@ "contains": "Obsahuje", "startsWith": "Začína sa na", "endsWith": "Končí sa na", + "metric": "Metric", "allMustBeTrue": "Všetky podmienky musia byť splnené:", "anyMustBeTrue": "Aspoň jedna podmienka musí byť splnená:", "mustNotBeTrue": "Podmienka nesmie byť splnená:" @@ -3868,8 +4738,23 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "Cron plán" + "cronSchedule": "Cron plán", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" + }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "Podľa cron plánu {schedule}. Ďalšie spustenie: {timestamp}; posledné spustenie: {lastTimestamp}." }, @@ -3896,6 +4781,25 @@ "content": "Keď záloha dosiahne stav `{status}`." } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "Riadok konzoly", "card": { @@ -3920,8 +4824,20 @@ "title": "Nie sú nakonfigurované žiadne kroky", "description": "Tento plán zatiaľ neobsahuje žiadne kroky. Ak chcete začať, pridajte niekoľko akcií." }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "Čakanie", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "Trvanie (milisekundy)" }, @@ -3931,12 +4847,62 @@ }, "ensure": { "title": "Overiť", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "Overiť, že podmienka je splnená" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "Formátovať", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "Formátovací reťazec", "formatStringDescription": "Formátovací reťazec. Premenné možno vložiť tak, že ich uzavriete do {wrapper}." @@ -3947,6 +4913,7 @@ }, "matchRegex": { "title": "Zhoda s regulárnym výrazom", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "Vstup", "regex": "Regulárny výraz", @@ -3959,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "Počkať na riadok konzoly", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "Časový limit (milisekundy)" }, @@ -3973,6 +4941,7 @@ }, "sendCommand": { "title": "Odoslať príkaz", + "description": "Send a command to the server console.", "renderer": { "compact": "Spustiť {command}", "detail": { @@ -3982,6 +4951,7 @@ }, "sendPower": { "title": "Odoslať signál napájania", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "Vykonať {action}", "detail": { @@ -3991,19 +4961,75 @@ }, "createBackup": { "title": "Vytvoriť zálohu", + "description": "Create a backup of the server files.", "form": { "backupName": "Názov zálohy" }, "renderer": { "compact": "Vytvoriť {name}", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "Názov zálohy: {name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "Ignorované súbory: {files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "Vytvoriť adresár", + "description": "Create a new folder in the server files.", "renderer": { "compact": "Vytvoriť {name} v {root}", "detail": { @@ -4014,6 +5040,7 @@ }, "writeFile": { "title": "Zapísať súbor", + "description": "Write or append text to a file.", "form": { "content": "Obsah", "appendToFile": "Pripojiť k súboru" @@ -4028,6 +5055,7 @@ }, "copyFile": { "title": "Kopírovať súbor", + "description": "Copy a file to a new location.", "form": { "sourceFile": "Zdrojový súbor" }, @@ -4041,6 +5069,7 @@ }, "deleteFiles": { "title": "Odstrániť súbory", + "description": "Delete files or folders.", "form": { "filesToDelete": "Súbory na odstránenie" }, @@ -4054,6 +5083,7 @@ }, "renameFiles": { "title": "Premenovať súbory", + "description": "Rename or move files.", "form": { "files": "Súbory", "from": "od", @@ -4069,6 +5099,7 @@ }, "compressFiles": { "title": "Komprimovať súbory", + "description": "Compress files into an archive.", "form": { "filesToCompress": "Súbory na kompresiu" }, @@ -4084,6 +5115,7 @@ }, "decompressFile": { "title": "Dekomprimovať súbor", + "description": "Extract an archive into a folder.", "form": { "file": "Súbor" }, @@ -4097,6 +5129,7 @@ }, "updateStartupVariable": { "title": "Aktualizovať spúšťaciu premennú", + "description": "Change the value of a startup variable.", "renderer": { "compact": "Nastaviť {variable} na {value}", "detail": { @@ -4107,6 +5140,7 @@ }, "updateStartupCommand": { "title": "Aktualizovať príkaz na spustenie", + "description": "Change the command used to start the server.", "renderer": { "compact": "Nastaviť na {command}", "detail": { @@ -4116,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "Aktualizovať obraz Docker", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "Nastaviť na {image}", "detail": { @@ -4178,16 +5213,25 @@ "locked": "Zamknuté?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Prehľadávať" + "browse": "Prehľadávať", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "Sťahovanie začalo.", - "restoringBackup": "Obnovuje sa záloha..." + "restoringBackup": "Obnovuje sa záloha...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Vytvoriť zálohu", + "noGroup": "No group", "toast": { "created": "Záloha bola vytvorená." } @@ -4201,10 +5245,14 @@ "restoreBackup": { "title": "Obnoviť zálohu" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Potvrdiť odstránenie zálohy", "content": "Naozaj chcete odstrániť **{name}** z tohto servera?", "toast": { + "started": "Backup deletion started.", "deleted": "Záloha bola odstránená." } }, @@ -4213,6 +5261,47 @@ } } }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." + } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." + } + }, "network": { "title": "Sieť", "subtitle": "Použité alokácie: {current} z {max}.", @@ -4258,7 +5347,8 @@ "content": "Máte neuložené zmeny spúšťacích premenných. Naozaj chcete opustiť túto stránku? Ak odídete, vaše zmeny sa stratia." } }, - "noVariables": "Pre tento server sa nenašli žiadne spúšťacie premenné." + "noVariables": "Pre tento server sa nenašli žiadne spúšťacie premenné.", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "Mounty", diff --git a/frontend/public/translations/sv.json b/frontend/public/translations/sv.json index 4a6358f0a..c6ad1183a 100644 --- a/frontend/public/translations/sv.json +++ b/frontend/public/translations/sv.json @@ -39,6 +39,86 @@ "few": "{count} SSH-nycklar", "many": "{count} SSH-nycklar", "other": "{count} SSH-nycklar" + }, + "asset": { + "zero": "{count} Assets", + "one": "{count} Asset", + "two": "{count} Assets", + "few": "{count} Assets", + "many": "{count} Assets", + "other": "{count} Assets" + }, + "node": { + "zero": "{count} Nodes", + "one": "{count} Node", + "two": "{count} Nodes", + "few": "{count} Nodes", + "many": "{count} Nodes", + "other": "{count} Nodes" + }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, + "allocation": { + "zero": "{count} Node Allocations", + "one": "{count} Node Allocation", + "two": "{count} Node Allocations", + "few": "{count} Node Allocations", + "many": "{count} Node Allocations", + "other": "{count} Node Allocations" + }, + "egg": { + "zero": "{count} Eggs", + "one": "{count} Egg", + "two": "{count} Eggs", + "few": "{count} Eggs", + "many": "{count} Eggs", + "other": "{count} Eggs" + }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, + "shortcut": { + "zero": "{count} Shortcuts", + "one": "{count} Shortcut", + "two": "{count} Shortcuts", + "few": "{count} Shortcuts", + "many": "{count} Shortcuts", + "other": "{count} Shortcuts" + }, + "line": { + "zero": "{count} Lines", + "one": "{count} Line", + "two": "{count} Lines", + "few": "{count} Lines", + "many": "{count} Lines", + "other": "{count} Lines" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -49,6 +129,7 @@ "save": "Spara", "saveAndStay": "Spara & Stanna", "edit": "Redigera", + "duplicate": "Duplicate", "delete": "Ta bort", "remove": "Ta bort", "enable": "Aktivera", @@ -65,16 +146,28 @@ "selectAll": "Välj alla", "deselectAll": "Avvälj alla", "restore": "Återställ", + "discard": "Discard", "download": "Ladda ner", "downloadAs": "Ladda ner som {format}", "export": "Export", "exportAs": "Exportera som {format}", "recreate": "Skapa om", + "move": "Move", + "transfer": "Transfer", + "reattach": "Reattach", + "detach": "Detach", + "send": "Send", + "reset": "Reset", + "view": "View", "import": "Importera", "details": "Detaljer", + "loadLogs": "Load Logs", + "sendTestEmail": "Send Test Email", "setPrimary": "Ange som Primär", "unsetPrimary": "Avlägsna Primär Status", - "leavePage": "Lämna sidan" + "leavePage": "Lämna sidan", + "viewDocumentation": "View Documentation", + "undo": "Undo" }, "alert": { "error": "Fel", @@ -88,27 +181,76 @@ "input": { "search": "Sök..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "Återställ till standard", "edit": "Redigera", "delete": "Ta bort", - "primary": "Primär" + "remove": "Remove", + "primary": "Primär", + "backupOnDifferentNode": "This backup is on a different node than the server. It is not viewable from the Client API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Namn", + "newName": "New Name", "description": "Beskrivning", + "author": "Author", + "type": "Type", "password": "Lösenord", "host": "Värd", "username": "Användarnamn", + "usernameOrEmail": "Username/Email", "server": "Server", "url": "URL", "email": "E-post", + "path": "Path", "port": "Port", + "provider": "Provider", "command": "Kommando", + "fromAddress": "From Address", + "fromName": "From Name", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "apiKey": "API Key", + "accessKey": "Access Key", + "bucket": "Bucket", + "region": "Region", + "endpoint": "Endpoint", + "publicUrl": "Public URL", "firstName": "Förnamn", "lastName": "Efternamn", "language": "Språk", + "identifier": "Identifier", "enabled": "Aktiverad", + "disabled": "Disabled", + "title": "Title", + "content": "Content", + "backupConfiguration": "Backup Configuration", "fileName": "Filnamn", "sftpPort": "SFTP Port", "sftpHost": "SFTP Host", @@ -119,11 +261,26 @@ "startupCommand": "Startkommando", "archiveName": "Arkivnamn", "archiveFormat": "Arkivformat", + "compressionLevel": "Compression Level", + "multiplexChannels": "Multiplex Channels", + "multiplexChannelsDescription": "Add additional HTTP connections (and therefore also threads) for transferring split archives, total streams is 1 + multiplex channels.", + "deleteSourceBackups": "Delete source backups", + "deleteSourceBackupsDescription": "Deletes the transferred backups on the source node once transfer finishes.", + "node": "Node", + "primaryAllocation": "Primary Allocation", + "additionalAllocations": "Additional Allocations", + "externalId": "External ID", + "mount": "Mount", + "nest": "Nest", + "lines": "Lines", "databaseHost": "Databas Host", + "databaseAgentHost": "Database Agent Host", "timezone": "Tidszon", + "timezoneSystem": "System", "protocol": "Protokoll", "powerAction": "Strömmåtgärd", "destination": "Destination", + "destinationDirectory": "Destination Directory", "directoryName": "Katalognamn", "locked": "Låst", "portRanges": "Port Avstånd", @@ -131,10 +288,17 @@ "currentPassword": "Nuvarande Lösenord", "confirmPassword": "Bekräfta Lösenord", "authenticationCode": "Autentiseringskod", + "restoreStartup": "Restore the startup command, image, and variables from this backup.", "lineContains": "Linje innehåller", + "filePath": "File Path", + "envVariable": "Environment Variable", + "value": "Value", "eggs": "Eggs", "ignoredFiles": "Ignorerade Filer", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "Ditt Control Panel Lösenord", + "deploymentEnabled": "Deployment Enabled", + "maintenanceEnabled": "Maintenance Enabled", "truncateDirectory": "Vill du ta bort alla filer på denna server innan du utför denna åtgärd? Detta kan inte ångras." }, "table": { @@ -143,20 +307,46 @@ "empty": "Inga objekt kunde hittas, det är nästan som om de döljer sig." }, "columns": { + "id": "ID", "name": "Namn", + "author": "Author", + "type": "Type", + "title": "Title", + "enabled": "Enabled", "description": "Beskrivning", "username": "Användarnamn", "size": "Storlek", "lastUsed": "Senast Använd", "created": "Skapad", + "updated": "Updated", "actor": "Aktör", "event": "Händelse", "ip": "IP", "when": "När", "command": "Kommando", - "notes": "Anteckningar" + "location": "Location", + "node": "Node", + "owner": "Owner", + "added": "Added", + "backupConfiguration": "Backup Configuration", + "status": "Status", + "allocation": "Allocation", + "notes": "Anteckningar", + "source": "Source", + "target": "Target", + "checksum": "Checksum", + "files": "Files", + "server": "Server", + "address": "Address", + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, + "tabs": { + "general": "General" + }, "badge": { "active": "Aktiv", "inactive": "Inaktiv", @@ -166,6 +356,12 @@ "failed": "Misslyckad", "installed": "Installerad" }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" + }, "server": { "noAllocation": "Ingen Allokering", "state": { @@ -218,6 +414,12 @@ "stopped": "Stoppad", "restarted": "Omstartad", "killed": "Dödad" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" } }, "unit": { @@ -234,15 +436,37 @@ "readOnly": "Skrivskyddad", "na": "N/A", "never": "Aldrig", + "none": "None", + "unknown": "Unknown", "yes": "Ja", "no": "Nej", "web": "Webb", "api": "API", + "default": "Default", + "custom": "Custom", "system": "System", "schedule": "Schema", "impersonatedBy": "Imiterad av {username}" }, "elements": { + "routeOrderEditor": { + "title": "Route Configuration", + "label": { + "route": "Route", + "divider": "Divider", + "redirect": "Redirect" + }, + "empty": "No routes configured. Add routes, dividers, or redirects below.", + "unnamed": "(unnamed)", + "dividerPlaceholder": "Divider label (optional)", + "redirectNamePlaceholder": "Redirect name", + "destinationPlaceholder": "Destination URL (e.g. https://...)", + "selectRoutePlaceholder": "Select a route…", + "button": { + "addDivider": "Add Divider", + "addRedirect": "Add Redirect" + } + }, "errorBoundary": { "message": "Ett oväntat fel uppstod när sidan renderades. Försök att uppdatera. Om problemet kvarstår kontaktar du systemadministratören.", "hideDetails": "Dölj Detaljer", @@ -258,6 +482,13 @@ "copyManual": "Kopiera till urklipp: Ctrl+C eller Command+C, Enter" } }, + "pasteOnClick": { + "toast": { + "pasted": "Pasted from clipboard.", + "failed": "Failed to paste from clipboard.", + "pasteManual": "Paste from clipboard: Ctrl+V or Command+V, Enter" + } + }, "estimatedTimeArrival": { "tooltip": { "estimating": "Uppskattar färdigställandetid...", @@ -269,7 +500,8 @@ "container": { "alert": { "impersonating": "Du utger dig för att vara en annan användare. Observera att dina handlingar kan påverka den utgivna användarens konto. För att avsluta utgivandeläget klickar du på knappen \"Sluta utge dig\" i det nedre vänstra hörnet." - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -277,22 +509,43 @@ "stopImpersonating": "Sluta utge dig", "openInVirtualWindow": "Öppna i Virtuellt Fönster", "openInPopup": "Öppna i Popup", - "openInNewTab": "Öppna i Ny Flik" + "openInNewTab": "Öppna i Ny Flik", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { + "button": { + "copyPermissions": "Copy Permissions", + "pastePermissions": "Paste Permissions" + }, "selectedPermissions": "Valda behörigheter ({count})", "noPermissions": "Inga behörigheter valda." }, "selectInput": { "noResults": "Inga resultat hittades." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "Du har inte behörighet att spara.", "cantDelete": "Du har inte behörighet att ta bort." } }, + "resource": { + "tooltip": { + "created": "{resource} created.", + "updated": "{resource} updated.", + "deleted": "{resource} deleted." + } + }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -309,6 +562,10 @@ "title": "Hittades inte", "content": "Sidan du letar efter kunde inte hittas." }, + "suspended": { + "title": "Account Suspended", + "content": "Your account has been suspended. You cannot make changes to your account. Please contact an administrator for more information." + }, "serverConflict": { "title": "Servertillstånd i konflikt", "contentSuspended": "Den här servern är pausad och kan inte nås.", @@ -332,7 +589,10 @@ "scheduleDynamicInput": { "none": "Ingen", "variable": "Variabel", - "enterVariable": "Ange variabelnamnet för utvärdering." + "enterVariable": "Ange variabelnamnet för utvärdering.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -351,6 +611,7 @@ "toast": { "backupCompleted": "Säkerhetskopieringen har slutförts.", "backupFailed": "Säkerhetskopieringen misslyckades.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "Återställning av säkerhetskopia har slutförts.", "installCompleted": "Serverinstallationen är slutförd.", "installFailed": "Serverinstallationen misslyckades.", @@ -369,6 +630,7 @@ }, "copying": { "completed": "Kopierade `{path}` till `{destination}` på {time}.", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", "failed": "Det gick inte att kopiera `{path}` till `{destination}`:\n{error}" }, "copyingMany": { @@ -386,13 +648,21 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "Väntar: {file}", "uploading": "Laddar upp: {file}", "uploadingFolder": "Laddar upp mapp: {folder} ({files})", + "rateLimited": "Your upload has been rate limited. Waiting...", + "cancelAllUploads": "Cancel all uploads", "toast": { "uploading": "Började ladda upp {files}...", "cancelledFile": "Uppladdningen avbröts `{file}`.", - "cancelledFolder": "Uppladdningen av `{folder}` ({files}) har avbrutits." + "cancelledFolder": "Uppladdningen av `{folder}` ({files}) har avbrutits.", + "cancelledAll": "All uploads have been cancelled.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -448,6 +718,8 @@ "form": { "locationName": "Platsnamn", "locationNamePlaceholder": "Mitt hem", + "locationFlag": "Location Flag", + "locationFlagPlaceholder": "The best country", "backupName": "Säkerhetskopieringskonfigurationsnamn", "backupNamePlaceholder": "Unicorn Cloud", "backupDisk": "Säkerhetskopieringsskiva", @@ -572,6 +844,9 @@ "login": "Logga in", "loginWith": "Logga in med {name}" }, + "alert": { + "urlMismatch": "The application URL does not match the current URL. Expected: `{appUrl}`, Current: `{currentUrl}`." + }, "login": { "error": { "usernameRequired": "Vänligen ange ett användarnamn", @@ -594,6 +869,10 @@ "step": { "username": { "title": "Logga in", + "subtitle": "Enter your username or email address to continue", + "form": { + "usernameOrEmailPlaceholder": "Your username or email address" + }, "link": { "forgotPassword": "Glömt lösenord", "notRegistered": "Inte registrerad?", @@ -682,6 +961,9 @@ "noGroups": "Inga grupper tillgängliga att lägga till server i", "noGroup": "Denna server är inte i någon grupp" }, + "badge": { + "foreign": "Foreign" + }, "tabs": { "groupedServers": { "title": "Grupperade servrar", @@ -715,6 +997,13 @@ "toast": { "added": "Servern har lagts till i gruppen." } + }, + "removeServerFromGroup": { + "title": "Confirm Server Removal", + "content": "Are you sure you want to remove **{server}** from **{group}**?", + "toast": { + "removed": "Server removed from group." + } } }, "noGroups": "Inga grupper kunde hittas, dags att skapa en?" @@ -756,6 +1045,10 @@ "requireTwoFactor": { "title": "Tvåfaktorsautentisering krävs", "description": "Tvåfaktorsautentisering krävs på ditt konto. Vänligen konfigurera det nedan för att fortsätta använda panelen." + }, + "frozen": { + "title": "Account Frozen", + "description": "Your account has been frozen. You cannot make changes to your account until it is unfrozen. Please contact an administrator for more information." } }, "containers": { @@ -831,13 +1124,15 @@ }, "securityKeys": { "title": "Säkerhetsnycklar", + "subtitle": "{current} of {max} maximum security keys created.", "table": { "columns": { "credentialId": "Autentiserings-ID" } }, "tooltip": { - "secureContextRequired": "Ett säkert sammanhang (HTTPS) krävs för att använda säkerhetsnycklar." + "secureContextRequired": "Ett säkert sammanhang (HTTPS) krävs för att använda säkerhetsnycklar.", + "limitReached": "You are limited to {max} security keys." }, "modal": { "createSecurityKey": { @@ -886,6 +1181,23 @@ "subtitle": "Använd dessa kortkommandon för att navigera och interagera med panelen mer effektivt.", "detectedMac": "macOS upptäckt", "detectedWindows": "Windows/Linux upptäckt", + "label": { + "disabled": "Disabled", + "modified": "Modified", + "recording": "Press keys..." + }, + "button": { + "rebind": "Rebind", + "resetAll": "Reset All", + "copy": "Copy All", + "paste": "Paste" + }, + "toast": { + "imported": "Updated {shortcuts}.", + "importedNone": "No shortcuts were changed.", + "importErrors": "Ignored {unknown} and {invalid}.", + "resetAll": "All shortcuts reset to defaults." + }, "fileManager": { "title": "Filhanteraren", "selectAll": "Välj alla filer", @@ -921,6 +1233,10 @@ }, "sshKeys": { "title": "SSH-nycklar", + "subtitle": "{current} of {max} maximum ssh keys created.", + "tooltip": { + "limitReached": "You are limited to {max} ssh keys." + }, "table": { "columns": { "fingerprint": "Fingeravtryck" @@ -965,6 +1281,10 @@ }, "commandSnippets": { "title": "Kommandosnuttar", + "subtitle": "{current} of {max} maximum command snippets created.", + "tooltip": { + "limitReached": "You are limited to {max} command snippets." + }, "modal": { "createCommandSnippet": { "title": "Skapa kommandosnutt", @@ -984,6 +1304,12 @@ "toast": { "removed": "Kommandosnutt borttagen." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1010,9 +1336,13 @@ }, "apiKeys": { "title": "API-nycklar", + "subtitle": "{current} of {max} maximum api keys created.", "button": { "apiDocumentation": "API dokumentation" }, + "tooltip": { + "limitReached": "You are limited to {max} api keys." + }, "table": { "columns": { "key": "Nyckel", @@ -1046,6 +1376,12 @@ "toast": { "removed": "API-nyckel borttagen." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1054,66 +1390,2610 @@ "userPermissions": "Användarbehörigheter", "serverPermissions": "Serverbehörigheter", "adminPermissions": "Adminbehörigheter" + }, + "create": { + "title": "Create API Key", + "subtitle": "An application is requesting an API key to be created for your account.", + "alert": { + "adminPermissions": "This API key requests **admin permissions**. Anyone in possession of this key will be able to perform administrative actions on this panel in your name. Only continue if you absolutely trust the requesting application.", + "callbackUrl": "After creation, the new API key will be sent to **{url}**." + }, + "noPermissions": "This API key will not have any permissions.", + "keyCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "button": { + "goToApiKeys": "Go to API Keys" + } } }, "activity": { "title": "Aktivitetslogg" } }, - "server": { - "viewAdmin": { - "title": "Visa admin" + "admin": { + "home": { + "title": "Home", + "alert": { + "newPanelVersion": "A new version is available for the panel! You are currently on {current} and the latest version is {latest}. You may want to consider upgrading. [Click here]({upgradeUrl}) to view upgrade instructions." + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "permissionDenied": "You do not have permission to read the statistics that would have been here otherwise. For now, enjoy this bird.", + "card": { + "systemOverview": "System Overview", + "generalStatistics": "General Statistics", + "backupStatistics": "Backup Statistics" + }, + "system": { + "cpu": "CPU", + "memoryUsage": "Memory Usage ({process} used by Panel)", + "memoryValue": "{used} / {total} ({percent}%)", + "kernelVersion": "Kernel Version ({architecture})", + "containerType": "Container Type", + "databaseVersion": "Database Version ({size})", + "cacheVersion": "Cache Version", + "cacheCalls": "Cache Calls", + "cacheHits": "Cache Hits ({percent}%)", + "cacheMisses": "Cache Misses ({percent}%)", + "avgCachedCallLatency": "Avg. Cached Call Latency" + }, + "containerType": { + "none": "None detected", + "official": "Official", + "officialAio": "Official AIO", + "officialHeavy": "Official Heavy" + }, + "stats": { + "users": "Users", + "servers": "Servers", + "locations": "Locations", + "nodes": "Nodes", + "nestEggs": "Nest Eggs", + "databaseHosts": "Database Hosts", + "backupConfigurations": "Backup Configurations", + "roles": "Roles" + }, + "backup": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month", + "totalAllTime": "Total backups all time", + "successfulAllTime": "Successful backups all time", + "failedAllTime": "Failed backups all time", + "deletedAllTime": "Deleted backups all time", + "totalToday": "Total backups today", + "successfulToday": "Successful backups today", + "failedToday": "Failed backups today", + "deletedToday": "Deleted backups today", + "totalWeek": "Total backups this week", + "successfulWeek": "Successful backups this week", + "failedWeek": "Failed backups this week", + "deletedWeek": "Deleted backups this week", + "totalMonth": "Total backups this month", + "successfulMonth": "Successful backups this month", + "failedMonth": "Failed backups this month", + "deletedMonth": "Deleted backups this month", + "successfulValue": "{count} ({size})", + "deletedValue": "{count} ({size})" + } + } + }, + "updates": { + "title": "Updates", + "page": { + "alert": { + "extensionUpdateErrors": "There were errors checking for updates for some extensions." + }, + "card": { + "panelVersion": "Panel Version", + "versionHistory": "Version History", + "outdatedExtensions": "Outdated Extensions", + "outdatedNodes": "Outdated Nodes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" + }, + "panelVersion": "Your panel is currently running version `{current}`. The latest available version is `{latest}`.", + "unknown": "unknown", + "button": { + "recheck": "Recheck for Updates" + }, + "toast": { + "recheckComplete": "Recheck complete." + }, + "selectHistory": "Select an update history to view.", + "historyPanel": "Panel", + "historyExtension": "Extension: {name}", + "extensionsUpToDate": "All extensions are up to date.", + "extensionsOutdated": "Some extensions are outdated or had errors when checking for updates.", + "noChangelog": "No changelog", + "nodesUpToDate": "Seems like all nodes are up to date. ({failed} failed to check)", + "nodesOutdated": "Some nodes are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "table": { + "version": "Version", + "installed": "Installed", + "packageName": "Package Name", + "latestVersion": "Latest Version", + "changes": "Changes", + "error": "Error" + } + } + }, + "health": { + "title": "Health", + "page": { + "card": { + "generalHealth": "General Health", + "extensionMigrationHealth": "Extension Migration Health", + "desyncNodes": "Desync Nodes", + "debugMode": "Debug Mode" + }, + "appliedMigrations": "Applied Migrations ({percent}%)", + "migrationsValue": "{applied} / {total}", + "avgNtpOffset": "Avg. NTP Offset", + "noExtensions": "No extensions found.", + "nodesSynced": "Seems like all nodes have a synced clock (within 5 seconds of panel clock). ({failed} failed to check)", + "nodesDesync": "Some nodes have desync clocks (over 5 seconds off of the panel's clock). This can cause file download/console issues. ({desync} desync, {failed} failed to check)", + "debugEnabled": "Debug mode is currently enabled.", + "debugDisabled": "Debug mode is currently disabled.", + "debugResetNote": "This setting will be reset to the default ({default}) when the application restarts.", + "table": { + "packageName": "Package Name", + "applied": "Applied", + "total": "Total", + "id": "ID", + "desync": "Desync", + "appliedValue": "{applied} ({percent}%)" + }, + "button": { + "enableDebug": "Enable Debug Mode", + "disableDebug": "Disable Debug Mode" + }, + "toast": { + "debugEnabled": "Debug mode enabled.", + "debugDisabled": "Debug mode disabled." + } + } + } + } }, - "console": { - "title": "Konsol", - "input": { - "placeholder": "Skriv ett kommando...", - "ariaLabel": "Ingång för konsolkommando." + "settings": { + "title": "Settings", + "tabs": { + "application": { + "title": "Application", + "page": { + "title": "Application Settings", + "form": { + "icon": "Icon", + "iconLight": "Icon (Light Mode)", + "banner": "Banner", + "bannerLight": "Banner (Light Mode)", + "sessionCookie": "Session Cookie", + "sessionDurationSeconds": "Session Duration (seconds)", + "twoFactorRequirement": "Two-Factor Authentication Requirement", + "telemetryEnabled": "Enable Telemetry", + "telemetryEnabledDescription": "Allow Calagopus to collect limited and anonymous usage data to help improve the application.", + "registrationEnabled": "Enable Registration" + }, + "enum": { + "twoFactorRequirement": { + "admins": "Admins", + "allUsers": "All Users", + "none": "None" + } + }, + "button": { + "previewTelemetry": "Preview Telemetry" + }, + "toast": { + "updated": "Application settings updated." + }, + "modal": { + "disableTelemetry": { + "title": "Confirm Disabling Telemetry", + "content": "Are you sure you want to disable telemetry? Telemetry helps us improve Calagopus by providing anonymous usage data. Disabling telemetry will prevent any data from being sent." + }, + "enableRegistration": { + "title": "Confirm Enabling Registration", + "content": "Are you sure you want to enable registration? Enabling registration allows anyone to create an account on this panel. If you do not have a captcha configured, this may be a mistake." + }, + "telemetryPreview": { + "title": "Telemetry Preview" + } + } + } + }, + "storage": { + "title": "Storage", + "page": { + "title": "Storage Settings", + "form": { + "driver": "Driver" + }, + "enum": { + "driver": { + "filesystem": "Filesystem", + "s3": "S3" + } + }, + "toast": { + "updated": "Storage settings updated." + }, + "modal": { + "changeStorageType": { + "title": "Confirm Changing Storage Type", + "content": "Are you sure you want to change the storage type? Changing the storage type will cause the application to look for assets (e.g. profile pictures) in a different location, which may result in missing assets if they are not moved to the new location manually." + } + }, + "s3": { + "alert": { + "permissionsTitle": "Note on Permissions", + "permissionsIntro": "To ensure that the storage backend works correctly, please make sure the following subdirectories are publicly accessible over the \"Public URL\" you provided:", + "permissionsAssets": "This is where all admin assets (e.g., icons) will be stored.", + "permissionsAvatars": "This is where all user avatars will be stored.", + "permissionsPublicData": "This is where extensions can store public data (e.g., images)." + }, + "form": { + "pathStyle": "Using path-style URLs" + } + } + } + }, + "mail": { + "title": "Mail", + "page": { + "title": "Email Settings", + "enum": { + "provider": { + "none": "None", + "smtp": "SMTP", + "sendmail": "Sendmail Command", + "filesystem": "Filesystem" + }, + "tlsMode": { + "none": "None", + "startTls": "STARTTLS", + "implicitTls": "Implicit TLS" + } + }, + "toast": { + "updated": "Email settings updated." + }, + "modal": { + "sendTestEmail": { + "title": "Send Test Email", + "toast": { + "sent": "Test email has been sent successfully." + } + } + }, + "smtp": { + "form": { + "tlsMode": "TLS Mode", + "skipCertValidation": "Skip Certificate Validation" + } + } + } + }, + "mailTemplates": { + "title": "Mail Templates", + "page": { + "title": "Email Template Settings", + "sidebar": { + "templates": "Templates", + "loading": "Loading...", + "availableVariables": "Available Variables" + }, + "alert": { + "syntaxBefore": "Templates use the", + "syntaxLink": "MiniJinja", + "syntaxMiddle": "templating syntax. Variables are referenced with", + "syntaxAnd": "and control structures like", + "syntaxOr": "and", + "syntaxAfter": "are supported." + }, + "empty": "Select a template from the sidebar to edit it.", + "loadingTemplate": "Loading template...", + "form": { + "subject": "Subject" + }, + "toast": { + "saved": "Email template saved.", + "reset": "Email template reset to default." + }, + "modal": { + "reset": { + "title": "Reset to default", + "content": "This will discard your custom template for **{identifier}** and restore the built-in default. This cannot be undone." + } + } + } + }, + "captcha": { + "title": "Captcha", + "page": { + "title": "Captcha Settings", + "toast": { + "updated": "Captcha settings updated." + }, + "recaptcha": { + "form": { + "v3": "V3" + } + } + } + }, + "webauthn": { + "title": "Webauthn", + "page": { + "title": "Webauthn Settings", + "form": { + "rpId": "RP Id", + "rpOrigin": "RP Origin" + }, + "button": { + "autofill": "Autofill" + }, + "toast": { + "updated": "Webauthn settings updated.", + "ipNotAllowed": "Cannot use WebAuthn on an IP address." + }, + "modal": { + "changeRpId": { + "title": "Confirm Changing RP Id", + "content": "Are you sure you want to change the RP Id? Changing the RP Id will break all existing Webauthn credentials and require users to re-register their devices. This can have significant consequences, so please make sure you understand the implications before proceeding." + } + } + } + }, + "server": { + "title": "Server", + "page": { + "title": "Server Settings", + "form": { + "maxFileManagerViewSize": "Max File Manager View Size", + "maxScheduleStepCount": "Max Schedule Steps", + "maxFileManagerContentSearchSize": "Max File Manager Content Search Size", + "maxFileManagerSearchResults": "Max File Manager Search Results", + "maxSubuserCount": "Max Subuser Count", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", + "allowOverwritingCustomDockerImage": "Allow Overwriting Custom Docker Image", + "allowOverwritingCustomDockerImageDescription": "If enabled, users will be able to overwrite the Docker image specified in the server configuration using the Eggs list, even if an admin has set a custom Docker image.", + "allowViewingInstallationLogs": "Allow Viewing Installation Logs", + "allowViewingInstallationLogsDescription": "If enabled, users with console read permissions will also be able to view installation logs via the websocket connection. If disabled, installation logs will only be available for admins.", + "allowAcknowledgingInstallationFailure": "Allow Acknowledging Installation Failure", + "allowAcknowledgingInstallationFailureDescription": "If enabled, users will be able to acknowledge installation failures for servers that are in the \"Install Failed\" state, allowing them to attempt to start the server instead of having to wait for an admin. If disabled, only admins will be able to acknowledge installation failures.", + "allowViewingTransferProgress": "Allow Viewing Transfer Progress", + "allowViewingTransferProgressDescription": "If enabled, users with console read permissions will also be able to view transfer progress logs via the websocket connection. If disabled, transfer progress logs will only be available for admins.", + "containerPrelude": "Container Prelude", + "containerPreludeDescription": "The terminal prelude used for some status-related messages in the server console." + }, + "toast": { + "updated": "Server settings updated." + } + } + }, + "user": { + "title": "User", + "page": { + "title": "User Settings", + "form": { + "maxServerGroupCount": "Max Server Groups", + "maxApiKeyCount": "Max API Keys", + "maxCommandSnippetCount": "Max Command Snippets", + "maxSecurityKeyCount": "Max Security Keys", + "maxSshKeyCount": "Max SSH Keys", + "allowChangingLanguage": "Allow Changing Language", + "allowChangingLanguageDescription": "If enabled, users will be able to change their language preferences." + }, + "routeOrder": { + "title": "Client Route Order" + }, + "toast": { + "updated": "User settings updated." + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "Activity Settings", + "form": { + "adminLogRetentionDays": "Admin Activity Retention Days", + "userLogRetentionDays": "User Activity Retention Days", + "serverLogRetentionDays": "Server Activity Retention Days", + "adminLogRetentionCount": "Admin Activity Retention Count", + "userLogRetentionCount": "User Activity Retention Count", + "serverLogRetentionCount": "Server Activity Retention Count", + "serverLogAdminActivity": "Log Server Admin Activity", + "serverLogAdminActivityDescription": "Enable or disable logging of admin activity on servers where the admin isn't an owner or subuser.", + "serverLogScheduleActivity": "Log Server Schedule Activity", + "serverLogScheduleActivityDescription": "Enable or disable logging of activity done by server schedules." + }, + "toast": { + "updated": "Activity settings updated." + } + } + }, + "ratelimits": { + "title": "Ratelimits", + "page": { + "title": "Ratelimit Settings", + "form": { + "hits": "Hits", + "hitsDescription": "Maximum number of requests allowed per window.", + "windowSeconds": "Window", + "windowSecondsDescription": "Window duration in seconds." + }, + "toast": { + "updated": "Rate limit settings updated." + } + } + } + } + }, + "announcements": { + "title": "Announcements", + "resourceName": "Announcement", + "tabs": { + "general": { + "page": { + "modal": { + "delete": { + "title": "Confirm Announcement Deletion", + "content": "Are you sure you want to delete **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" + } + }, + "form": { + "dismissibleEnd": "Dismissible End", + "enabledStart": "Enabled Start", + "enabledEnd": "Enabled End", + "locations": "Locations", + "locationsDescription": "Leave empty to apply to all locations.", + "nodes": "Nodes", + "nodesDescription": "Leave empty to apply to all nodes.", + "backupConfigurations": "Backup Configurations", + "backupConfigurationsDescription": "Leave empty to apply to all backup configurations.", + "eggsPlaceholder": "Select Eggs", + "dismissible": "Dismissible" + }, + "titleCreate": "Create Announcement", + "titleUpdate": "Update Announcement" + } + } + }, + "enum": { + "announcementType": { + "info": "Info", + "success": "Success", + "warning": "Warning", + "error": "Error" + } + } + }, + "assets": { + "title": "Assets", + "button": { + "newDirectory": "New Directory", + "upload": "Upload", + "copyLink": "Copy Link" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" }, "toast": { - "installCancelled": "Serverinstallationen avbröts.", - "transferCancelled": "Serveröverföring avbruten." + "assetDeleted": "Asset deleted.", + "assetsDeleted": "{assets} deleted." }, "modal": { - "sshDetails": { - "title": "SSH Detaljer", - "form": { - "command": "SSH kommando" - }, - "launch": "Lansera" + "createDirectory": { + "title": "New Directory", + "createdAs": "Will be created at " + }, + "deleteAssets": { + "title": "Confirm Asset Deletion", + "content": "Are you sure you want to delete `{count}` assets?" + }, + "deleteAsset": { + "title": "Delete Asset", + "content": "Are you sure you want to delete this asset? This action cannot be undone." } + } + }, + "extensions": { + "title": "Extensions", + "unknownExtension": "Unknown Extension", + "alert": { + "noExtensions": "No extensions installed.", + "heavyImageMissing": "You don't seem to be using the heavy image required to install extensions, see [here]({docsUrl}) on how to switch to it." }, - "notification": { - "suspended": "Din server är för närvarande avstängd. Inga åtgärder kan utföras förrän avstängningen har upphävts.", - "suspendedAdmin": "Den här servern är för närvarande avstängd. Eftersom du är administratör kan du fortfarande komma åt servern, men åtgärderna är begränsade.", - "nodeMaintenance": "Din server finns på en nod som för närvarande är under underhåll.", - "transferring": "Din server överförs för närvarande till en annan node..", - "restoringBackup": "Din server återställer för närvarande från en säkerhetskopia. Vänligen vänta...", - "installing": "Din server installeras för närvarande. Vänligen vänta..." - }, - "message": { - "serverMarkedAs": "Server markerad som {state}...", - "installFailed": "Installationen misslyckades.", - "installCompleted": "Installationen har slutförts.", - "transferFailed": "Överföringen misslyckades.", - "transferCompleted": "Överföringen har slutförts. Återansluter till servern...", - "pullingImage": "Din server drar nu ner sin docker-bild. Vänligen vänta...", - "pulling": "Drar ner", - "extracting": "Extraherar" + "button": { + "viewBuildLogs": "View build logs", + "install": "Install extension", + "rebuild": "Rebuild extensions", + "configure": "Configure", + "back": "Back to Extensions", + "accept": "Accept", + "decline": "Decline" }, "tooltip": { - "search": "Sök", - "sshDetails": "SSH Detaljer", - "commandHistory": "Kommandohistorik", - "decreaseFontSize": "Minska teckenstorleken", - "increaseFontSize": "Öka teckenstorleken" + "building": "The panel is currently building extension code. Please wait.", + "noPendingBuild": "No pending extensions to build.", + "noBackend": "Backend extension is required to configure this extension.", + "noConfigurationPage": "This extension does not have a configuration page defined.", + "removeExtension": "Remove extension" }, - "drawer": { - "commandHistory": { - "title": "Kommandohistorik", - "detailTitle": "Kommandodetaljer", - "noCommands": "Inga kommandon hittades.", - "copyButton": "Kopiera kommando", + "badge": { + "frontendMissing": "Frontend missing", + "backendMissing": "Backend missing", + "pendingBuild": "Pending build", + "pendingRemoval": "Pending removal" + }, + "card": { + "version": "Version", + "authors": "Authors" + }, + "section": { + "pendingExtensions": "Pending extensions", + "noPendingExtensions": "No pending extensions." + }, + "dropzone": { + "title": "Drop some files here to install as Extensions", + "subtitle": "Release to start installing" + }, + "toast": { + "buildStarted": "Extension rebuild started successfully.", + "buildCompleted": "Extension build completed. You may need to refresh the page.", + "added": "Extension `{packageName}` added successfully.", + "removed": "Extension `{packageName}` removed successfully." + }, + "notFound": { + "title": "Extension Not Found", + "content": "Extension with package name \"{packageName}\" not found." + }, + "configure": { + "title": "Configure {packageName}", + "noConfigurationPage": "This extension does not have a configuration page." + }, + "modal": { + "buildLogs": { + "title": "Build Logs", + "empty": "No logs found." + }, + "license": { + "title": "License agreement", + "description": "The extension `{packageName}` requires you to accept the following license before it can be installed." + }, + "remove": { + "title": "Remove extension", + "content": "Are you sure you want to remove the extension `{packageName}`? This action cannot be undone.", + "form": { + "removeMigrations": "Do you want to remove & rollback the database migrations of this extension?" + } + } + } + }, + "users": { + "title": "Users", + "resourceName": "User", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, + "tooltip": { + "admin": "Admin", + "twoFactorEnabled": "2FA Enabled", + "twoFactorDisabled": "2FA Disabled" + }, + "table": { + "columns": { + "role": "Role" + } + }, + "tabs": { + "general": { + "page": { + "tooltip": { + "cannotImpersonateSelf": "You cannot impersonate yourself." + }, + "button": { + "disableTwoFactor": "Disable Two Factor", + "sendPasswordResetEmail": "Send Password Reset Email", + "impersonate": "Impersonate" + }, + "form": { + "admin": "Admin", + "adminDescription": "Admin users have full, unrestricted access to everything on the panel.", + "frozen": "Frozen", + "frozenDescription": "Frozen users cannot make any changes to their account information.", + "suspended": "Suspended", + "suspendedDescription": "Suspended users cannot access the panel in any meaningful way.", + "role": "Role" + }, + "modal": { + "delete": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete **{username}**?" + }, + "disableTwoFactor": { + "title": "Disable User Two Factor", + "content": "Are you sure you want to remove the two factor of **{username}**?", + "toast": { + "disabled": "User two factor disabled." + } + }, + "sendPasswordResetEmail": { + "title": "Send Password Reset Email", + "content": "Are you sure you want to send a password reset email to **{email}**?", + "toast": { + "sent": "Password reset email sent." + } + } + }, + "titleCreate": "Create User", + "titleUpdate": "Update User" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "User Servers", + "showOwnedOnly": "Only show users' owned servers" + } + }, + "oauthLinks": { + "title": "OAuth Links", + "page": { + "title": "User OAuth Links", + "toast": { + "added": "OAuth Link added.", + "removed": "OAuth Link removed." + }, + "modal": { + "add": { + "title": "Add OAuth Link", + "form": { + "oauthProvider": "OAuth Provider" + } + }, + "delete": { + "title": "Confirm OAuth Link Deletion", + "content": "Are you sure you want to delete the **{provider}** connection from **{username}**?" + } + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "User Activity" + } + } + } + }, + "locations": { + "title": "Locations", + "resourceName": "Location", + "tabs": { + "general": { + "page": { + "form": { + "flag": "Flag" + }, + "modal": { + "delete": { + "title": "Confirm Location Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "titleCreate": "Create Location", + "titleUpdate": "Update Location" + } + }, + "databaseHosts": { + "title": "Database Hosts", + "page": { + "title": "Location Database Hosts", + "toast": { + "created": "Location database host created.", + "deleted": "Location database host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Host" + }, + "delete": { + "title": "Confirm Location Database Host Deletion", + "content": "Are you sure you want to delete the database host **{name}** from **{location}**?" + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Location Nodes" + } + } + } + }, + "nodes": { + "title": "Nodes", + "resourceName": "Node", + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "general": { + "page": { + "tooltip": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "allInOneNode": "All-in-One Node", + "errorWhileFetchingVersion": "Error while fetching version", + "updateAvailable": "{version} (Update Available)", + "useWingsProxyUrl": "Use Wings Proxy URL" + }, + "form": { + "urlDescription": "Used for internal communication with the node.", + "publicUrlDescription": "Used for websocket connections and downloads.", + "backupConfigurationPlaceholder": "Inherit from Location", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." + }, + "button": { + "resetToken": "Reset Token", + "updateConfig": "Update Config" + }, + "toast": { + "tokenReset": "Node token reset." + }, + "alert": { + "noLocations": "You need to create at least one location before you can create nodes. Locations help organize your nodes geographically or logically." + }, + "titleCreate": "Create Node", + "titleUpdate": "Update Node" + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/pterodactyl/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "panelUrl": "Panel URL", + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the node: {error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Node Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "toast": { + "connectionLost": "Lost connection to the node statistics stream." + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "cpuThreads": "{model} ({threads} threads)", + "usedByWings": "{size} used by Wings", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "networkTraffic": "Network Traffic", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "inbound": "Inbound", + "outbound": "Outbound", + "networkInLabel": "Network In", + "networkOutLabel": "Network Out" + } + } + }, + "capacity": { + "title": "Capacity", + "page": { + "title": "Deployment Capacity", + "subtitle": "Resources allocated to servers on this node, measured against the limits configured in node settings, not the physical machine capacity. Deployment only checks memory and disk.", + "card": { + "resources": "Allocated Resources" + }, + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Under Maintenance", + "maintenanceDisabled": "Not Under Maintenance" + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "memoryOverhead": "Memory Overhead", + "servers": "Servers", + "noLimit": "No node limit", + "free": "{size} free", + "overhead": "+ {size} reserved overhead", + "cores": "{cores} cores allocated" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Node Logs", + "form": { + "logFile": "Log File", + "follow": "Follow" + }, + "button": { + "download": "Download Full Log" + }, + "toast": { + "connectionLost": "Lost connection to the node log stream." + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Node Allocations", + "tooltip": { + "clearSelection": "Clear Selection" + }, + "form": { + "ipAlias": "IP Alias" + }, + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "modal": { + "create": { + "title": "Create Node Allocations", + "button": { + "create": "Create {count}" + }, + "toast": { + "created": "{allocations} created." + } + }, + "update": { + "title": "Update Node Allocations", + "toast": { + "updated": "{allocations} updated." + } + }, + "delete": { + "title": "Confirm Node Allocations Deletion", + "content": "Are you sure you want to delete `{count}` allocations from **{name}**?", + "toast": { + "deleted": "{allocations} deleted." + } + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Node Mounts", + "toast": { + "added": "Node Mount added.", + "removed": "Node Mount removed." + }, + "modal": { + "add": { + "title": "Add Node Mount" + }, + "remove": { + "title": "Confirm Node Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Node Backups", + "input": { + "detachedOnly": "Only show detached backups" + }, + "tooltip": { + "backupNotOnSameNode": "This backup is not on the same node as the server. It is not viewable from the Client API." + }, + "toast": { + "downloadStarted": "Download started.", + "detached": "Backup detached successfully.", + "reattached": "Reattached backup to {name} successfully.", + "restoring": "Restoring backup to {name}...", + "exporting": "Exporting backup to files of {name}...", + "deleted": "Node backup deleted." + }, + "modal": { + "export": { + "title": "Export Node Backup to Files" + }, + "detach": { + "title": "Confirm Backup Detachment", + "content": "Are you sure you want to detach this backup from its server? It will not be deleted and can be reattached later." + }, + "reattach": { + "title": "Reattach Node Backup", + "description": "Reattaching a node backup will link it to a server. This is useful if the backup is detached or you want to link it to a different server. Do note that this is not a transfer tool, unless the backup is considered remote (can be accessed by multiple nodes), the server must belong to the same node as the backup." + }, + "restore": { + "title": "Restore Node Backup", + "form": { + "truncateDirectory": "Do you want to empty the filesystem of this server before restoring the backup?" + } + }, + "delete": { + "title": "Confirm Node Backup Deletion", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Node Servers", + "modal": { + "transfer": { + "title": "Transfer Servers", + "form": { + "allocationMode": "Allocation Mode", + "transferBackups": "Transfer backups", + "transferBackupsDescription": "Whether to transfer backups along with the servers." + }, + "toast": { + "started": "{servers} transfer started." + }, + "confirm": { + "title": "Confirm Server Transfers", + "content": "Are you sure you want to transfer `{count}` servers from **{from}** to **{to}**? This action cannot be undone." + }, + "enum": { + "allocationMode": { + "none": "None (scrap all allocations, server will not be automatically assigned new allocations on the destination node)", + "randomPrimary": "Randomize primary allocation (removes additional allocations)", + "randomAll": "Randomize all allocations (recommended to avoid incompatibility issues with destination node)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", + "eggConfigDeployment": "Assign allocations based on Egg deployment configuration (only works if the Egg has a deployment configuration and the destination node has compatible allocations)", + "eggConfigSelfAssignRange": "Self-assign new allocations based on Egg port range (only works if the Egg has a port range and the destination node has compatible allocations)" + } + } + }, + "powerAction": { + "title": "Confirm Power Action", + "content": "Are you sure you want to **{action}** {servers}?" + } + } + } + }, + "transfers": { + "title": "Outgoing Transfers", + "page": { + "title": "Node Transfers", + "table": { + "columns": { + "progress": "Progress", + "archiveRate": "Archive Rate", + "networkRate": "Network Rate" + } + } + } + } + }, + "modal": { + "delete": { + "title": "Confirm Node Deletion", + "content": "Are you sure you want to delete **{name}**?" + }, + "bulkConfig": { + "title": "Update Configuration - {nodes}", + "button": { + "apply": "Apply to {nodes}" + }, + "toast": { + "applied": "Configuration applied to {nodes}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "servers": { + "title": "Servers", + "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, + "general": { + "page": { + "titleCreate": "Create Server", + "titleUpdate": "Update Server", + "card": { + "basicInformation": "Basic Information", + "serverAssignment": "Server Assignment", + "resourceLimits": "Resource Limits", + "serverConfiguration": "Server Configuration", + "featureLimits": "Feature Limits", + "allocations": "Allocations", + "variables": "Variables" + }, + "alert": { + "suspended": "This server is suspended.", + "selectEggForVariables": "Please select an egg before you can configure variables." + }, + "badge": { + "serverSuspended": "Server Suspended" + }, + "form": { + "serverNamePlaceholder": "My Game Server", + "externalIdPlaceholder": "Optional external identifier", + "descriptionPlaceholder": "Server description", + "owner": "Owner", + "egg": "Egg", + "backupConfigurationPlaceholder": "Inherit from Node/Location", + "cpuLimit": "CPU Limit (%)", + "cpuLimitDescription": "The CPU limit in % that the server can use.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this server.", + "swapTooltip": "-1 will not set a limit.", + "memoryDescription": "The Memory limit of the server container.", + "memoryTooltip": "0 will not set a limit.", + "memoryOverhead": "Memory Overhead", + "memoryOverheadDescription": "Hidden Memory that will be added to the container.", + "diskSpace": "Disk Space", + "diskSpaceDescription": "The disk limit of the server.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the server container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems.", + "pinnedCpus": "Pinned CPUs", + "pinnedCpusDescription": "The CPU cores this server is pinned to.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", + "dockerImagePlaceholder": "ghcr.io/...", + "predefinedDockerImages": "Predefined Docker Images", + "predefinedDockerImagesPlaceholder": "No predefined image selected", + "timezonePlaceholder": "Europe/Amsterdam", + "startupCommandPlaceholder": "npm start", + "startupCommandCustom": "Custom", + "predefinedStartupCommands": "Predefined Startup Commands", + "startOnCompletion": "Start on Completion", + "startOnCompletionDescription": "Start server after installation completes.", + "skipInstaller": "Skip Installer", + "skipInstallerDescription": "Skip running the install script.", + "hugepagesPassthroughEnabled": "Enable Hugepages Passthrough", + "hugepagesPassthroughEnabledDescription": "Enable hugepages passthrough for the server (mounts /dev/hugepages into the container).", + "kvmPassthroughEnabled": "Enable KVM Passthrough", + "kvmPassthroughEnabledDescription": "Enable KVM passthrough for the server (allows access to /dev/kvm inside the container).", + "allocationsLimit": "Allocations", + "databasesLimit": "Databases", + "databaseAgentsLimit": "Agent Databases", + "backupsLimit": "Backups", + "schedulesLimit": "Schedules" + }, + "modal": { + "confirmNoAllocation": { + "title": "No Primary Allocation Assigned", + "content": "You are creating a server without assigning any primary allocation. Are you sure you want to continue?", + "button": { + "confirm": "Create Anyway" + } + } + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Server Allocations", + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "form": { + "notesPlaceholder": "Notes" + }, + "toast": { + "updated": "Allocation updated.", + "setPrimary": "Allocation set as primary.", + "unsetPrimary": "Allocation unset as primary.", + "removed": "Allocation removed.", + "added": "{count} allocations added." + }, + "modal": { + "add": { + "title": "Add Server Allocations", + "form": { + "allocations": "Allocations" + }, + "button": { + "add": "Add {count}" + } + }, + "remove": { + "title": "Confirm Allocation Removal", + "content": "Are you sure you want to remove **{allocation}**?" + } + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Server Variables", + "toast": { + "updated": "Server variables updated." + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Server Mounts", + "toast": { + "added": "Server Mount added.", + "deleted": "Server Mount deleted." + }, + "modal": { + "add": { + "title": "Add Server Mount" + }, + "remove": { + "title": "Confirm Server Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Server Backups", + "input": { + "partiallyDetachedOnly": "Only show partially detached backups" + } + } + }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Server Logs", + "form": { + "logType": "Log Type" + }, + "enum": { + "logType": { + "console": "Console", + "install": "Install" + } + } + } + }, + "management": { + "title": "Management", + "page": { + "title": "Server Management", + "transfer": { + "title": "Transfer", + "content": "Transfer this server and it's data to another node within this system.", + "toast": { + "started": "Server transfer started." + }, + "modal": { + "title": "Server Transfer", + "form": { + "backupsToTransfer": "Backups to transfer" + }, + "tooltip": { + "aioNotSupported": "Transfers to the All-In-One node are not supported." + }, + "confirm": { + "title": "Confirm Server Transfer", + "content": "Are you sure you want to transfer **{name}** from **{from}** to **{to}**?", + "alert": { + "notAllBackupsSelected": "You have not selected all backups to transfer, the remaining backups will become partially detached if the transfer completes successfully." + } + } + } + }, + "suspend": { + "title": "Suspend", + "content": "This will suspend the server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the server through the panel or API.", + "button": "Suspend", + "toast": { + "suspended": "Server suspended." + }, + "modal": { + "title": "Confirm Server Suspension", + "content": "Are you sure you want to suspend **{name}**? This will stop the server and prevent it from starting. All running processes will be stopped and the user will not be able to access their files or otherwise manage the server through the panel or API." + } + }, + "unsuspend": { + "title": "Unsuspend", + "content": "This will unsuspend the server, allowing it to start again. The user will be able to access their files and otherwise manage the server through the panel or API.", + "button": "Unsuspend", + "toast": { + "unsuspended": "Server unsuspended." + }, + "modal": { + "title": "Confirm Server Unsuspension", + "content": "Are you sure you want to unsuspend **{name}**? This will allow the server to start again. The user will be able to access their files and otherwise manage the server through the panel or API." + } + }, + "clearState": { + "title": "Clear State", + "content": "This will clear the server state known by the panel.", + "button": "Clear State", + "toast": { + "cleared": "Server state cleared." + }, + "modal": { + "title": "Confirm Server State Clear", + "content": "Are you sure you want to clear the state of **{name}**? This will clear any known pending transfers and status failures, please make sure it is safe to do this before clicking without reason." + } + }, + "delete": { + "title": "Delete", + "content": "This will delete the server and all of its data. This action cannot be undone.", + "toast": { + "deleted": "Server deleted." + }, + "modal": { + "title": "Confirm Server Deletion", + "description": "You are about to delete **{name}**. Are you sure?", + "form": { + "deleteBackups": "Do you want to delete backups of this server?", + "confirmServerName": "Confirm Server Name", + "confirmServerNamePlaceholder": "Server Name" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "viewClient": { + "title": "View in Client Area" + } + } + }, + "nests": { + "title": "Nests", + "resourceName": "Nest", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Nest", + "titleUpdate": "Update Nest", + "modal": { + "delete": { + "title": "Confirm Nest Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": { + "deleteEggs": "Do you want to delete all eggs in this nest?" + } + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Eggs", + "resourceName": "Egg", + "dropzone": { + "title": "Drop some files here to import as Eggs", + "subtitle": "Release to start importing" + }, + "button": { + "updateFromRepository": "Update from Repository" + }, + "toast": { + "imported": "Egg imported.", + "moved": "Egg moved.", + "movedBulk": "{eggs} moved.", + "deletedBulk": "{eggs} deleted.", + "updatedFromRepository": "{eggs} updated using their respective repository egg successfully.", + "parseFailed": "Failed to parse egg: {error}" + }, + "modal": { + "move": { + "title": "Move Egg" + }, + "moveBulk": { + "title": "Move Eggs", + "confirm": "Move {eggs}" + }, + "deleteBulk": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete `{count}` eggs?" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg", + "titleUpdate": "Update Egg", + "card": { + "startupConfiguration": "Startup Configuration", + "stopConfiguration": "Stop Configuration", + "configFiles": "Config Files Configuration" + }, + "form": { + "eggRepository": "Egg Repository", + "eggRepositoryEgg": "Egg Repository Egg", + "startupDone": "Startup Done", + "startupDoneDescription": "Console message indicating startup completion.", + "stripAnsi": "Strip ANSI from startup messages", + "stripAnsiDescription": "Removes ANSI control characters from the console output before matching startup completion.", + "stopType": "Stop Type", + "stopCommand": "Stop Command", + "stopSignal": "Stop Signal", + "parser": "Parser", + "createNewFile": "Create New File", + "createNewFileDescription": "If enabled, the file will be created if it does not exist. If disabled, the file must already exist or the replacement will fail.", + "match": "Match", + "ifValue": "If Value", + "replaceWith": "Replace With", + "insertNew": "Insert New", + "insertNewDescription": "If enabled, if no existing value matches the \"Match\" field, the \"Replace With\" value will be inserted into the file. If disabled, if no match is found, no changes will be made to the file.", + "updateExisting": "Update Existing", + "updateExistingDescription": "If enabled, if a match is found, it will be replaced with the \"Replace With\" value. If disabled, the replacement will only insert new values and will fail if a match is found.", + "startupCommands": "Startup Commands", + "forceOutgoingIp": "Force Outgoing IP", + "separatePort": "Separate IP and Port", + "separatePortDescription": "Separates the primary IP and port on the Console page instead of joining them with \":\".", + "features": "Features", + "featurePlaceholder": "Feature", + "fileDenylist": "File Deny List", + "dockerImages": "Docker Images" + }, + "enum": { + "stopType": { + "command": "Send Command", + "signal": "Send Signal", + "docker": "Docker Stop" + } + }, + "emptyConfigFiles": "No config files defined.", + "emptyReplacements": "No replacements defined.", + "button": { + "addReplacement": "Add Replacement", + "addConfigFile": "Add Config File", + "fromFile": "from File", + "fromRepository": "from Repository" + }, + "toast": { + "exported": "Egg exported.", + "updated": "Egg updated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "installationScript": { + "title": "Installation Script", + "page": { + "title": "Egg Installation Script", + "form": { + "container": "Installation Container", + "entrypoint": "Container Entrypoint" + }, + "toast": { + "updated": "Egg script updated." + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Egg Variables", + "form": { + "supportsMarkdown": "Supports Markdown formatting.", + "defaultValue": "Default Value", + "defaultValuePlaceholder": "server.jar", + "userViewable": "User Viewable", + "userEditable": "User Editable", + "secret": "Secret", + "rules": "Rules", + "rulesDescription": "See https://laravel.com/docs/12.x/validation#available-validation-rules for the available validation rules." + }, + "toast": { + "created": "Egg variable created.", + "updated": "Egg variable updated.", + "deleted": "Egg variable deleted.", + "duplicated": "Egg variable duplicated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Variable Removal", + "content": "Are you sure you want to remove **{variable}**?", + "emptyVariable": "this empty variable" + }, + "duplicate": { + "title": "Duplicate Egg Variable" + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Egg Mounts", + "toast": { + "added": "Egg Mount added.", + "deleted": "Egg Mount deleted." + }, + "modal": { + "add": { + "title": "Add Egg Mount" + }, + "delete": { + "title": "Confirm Egg Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{egg}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Egg Servers" + } + } + } + } + } + } + }, + "eggConfigurations": { + "title": "Egg Configurations", + "resourceName": "Egg Configuration", + "table": { + "columns": { + "order": "Order" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Configuration", + "titleUpdate": "Update Egg Configuration", + "form": { + "order": "Order", + "eggs": "Eggs", + "eggsPlaceholder": "Select Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." + }, + "enum": { + "deploymentType": { + "random": "Random", + "range": "Port Range", + "addPrimary": "Add to Primary", + "subtractPrimary": "Subtract from Primary", + "multiplyPrimary": "Multiply Primary", + "dividePrimary": "Divide Primary" + } + }, + "allocation": { + "title": "Allocation Configuration", + "form": { + "userSelfAssign": "User Self Assign", + "userSelfAssignDescription": "Allow users to create their own allocations from a specified port range.", + "requirePrimaryAllocation": "Require Primary Allocation", + "requirePrimaryAllocationDescription": "Whether users must always have a primary allocation.", + "automaticAllocationStart": "Automatic Allocation Start", + "automaticAllocationEnd": "Automatic Allocation End", + "dedicatedIp": "Dedicated IP", + "dedicatedIpDescription": "Assign a dedicated ip address for servers using this egg configuration.", + "primaryAllocation": "Primary Allocation", + "primaryAllocationDescription": "Configure a primary port assignment for deployment.", + "primaryStartPort": "Primary Start Port", + "primaryEndPort": "Primary End Port", + "assignToVariable": "Assign to Variable", + "assignToVariablePlaceholder": "e.g. SERVER_PORT", + "assignToVariableDescription": "Optional environment variable to receive the assigned primary port." + }, + "divider": { + "deployment": "Deployment" + }, + "additionalPorts": { + "title": "Additional Ports", + "button": "Add Rule", + "empty": "No additional port rules configured." + }, + "deployment": { + "form": { + "startPort": "Start Port", + "endPort": "End Port", + "assignToVariable": "Assign to Variable", + "assignToVariableDescription": "Optional environment variable to receive the assigned port from this rule.", + "assignToVariablePlaceholder": "e.g. SERVER_PORT" + }, + "removeRule": "Remove deployment rule" + } + }, + "startup": { + "title": "Startup Configuration", + "form": { + "allowCustomStartupCommand": "Allow Custom Startup Command", + "allowCustomStartupCommandDescription": "Allow users to set their own, non-predefined startup commands." + } + }, + "modal": { + "delete": { + "title": "Confirm Egg Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + } + } + }, + "eggRepositories": { + "title": "Egg Repositories", + "resourceName": "Egg Repository", + "table": { + "columns": { + "gitRepository": "Git Repository" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Repository", + "titleUpdate": "Update Egg Repository", + "form": { + "gitRepository": "Git Repository" + }, + "button": { + "sync": "Sync" + }, + "toast": { + "synced": "Egg repository synchronised, found {eggs}." + }, + "modal": { + "delete": { + "title": "Confirm Egg Repository Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Egg Repository Eggs", + "table": { + "columns": { + "path": "Path" + } + }, + "toast": { + "installed": "Egg installed.", + "installedBulk": "{eggs} installed." + }, + "modal": { + "install": { + "title": "Install Egg Repository Egg" + }, + "installBulk": { + "title": "Install Egg Repository Eggs", + "button": "Install {eggs}" + } + }, + "drawer": { + "noReadme": "This egg does not have a README." + } + } + } + } + }, + "databaseHosts": { + "title": "Database Hosts", + "resourceName": "Database host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Host", + "titleUpdate": "Update Database Host", + "form": { + "publicHost": "Public Host", + "publicPort": "Public Port", + "connectionCredentials": "Connection Credentials", + "credentialType": "Credential Type", + "connectionString": "Connection String", + "connectionStringPlaceholder": "mysql://username:password@host:port" + }, + "enum": { + "credentialType": { + "connectionString": "Connection String", + "details": "Details" + } + }, + "button": { + "testConnection": "Test Connection" + }, + "toast": { + "tested": "Test successfully completed." + }, + "modal": { + "delete": { + "title": "Confirm Database Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "databases": { + "title": "Databases", + "page": { + "title": "Database Host Databases", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } + } + } + } + }, + "oAuthProviders": { + "title": "OAuth Providers", + "resourceName": "OAuth Provider", + "dropzone": { + "title": "Drop some files here to import as OAuth Providers", + "subtitle": "Release to start importing" + }, + "table": { + "columns": { + "loginOnly": "Login Only", + "linkViewable": "Link Viewable", + "userManageable": "User Manageable" + } + }, + "toast": { + "imported": "OAuth Provider imported.", + "parseFailed": "Failed to parse OAuth provider: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create OAuth Provider", + "titleUpdate": "Update OAuth Provider", + "card": { + "redirectUrl": { + "title": "Redirect URL", + "unavailable": "Available after creation" + } + }, + "form": { + "clientId": "Client Id", + "clientSecret": "Client Secret", + "authUrl": "Auth URL", + "tokenUrl": "Token URL", + "infoUrl": "Info URL", + "basicAuth": "Basic Auth", + "basicAuthDescription": "Uses HTTP Basic Authentication to transmit the client id and secret, not common anymore.", + "scopes": "Scopes", + "scopesDescription": "The OAuth2 scopes to request, make sure to include scopes for email and profile info when needed.", + "identifierPath": "Identifier Path", + "identifierPathDescription": "The path used to extract the unique user identifier from the Info URL response (https://serdejsonpath.live).", + "emailPath": "Email Path", + "emailPathDescription": "The path used to extract the email from the Info URL response (https://serdejsonpath.live).", + "usernamePath": "Username Path", + "usernamePathDescription": "The path used to extract the username from the Info URL response (https://serdejsonpath.live).", + "nameFirstPath": "First Name Path", + "nameFirstPathPlaceholder": "First Name URL", + "nameFirstPathDescription": "The path used to extract the first name from the Info URL response (https://serdejsonpath.live).", + "nameLastPath": "Last Name Path", + "nameLastPathDescription": "The path used to extract the last name from the Info URL response (https://serdejsonpath.live).", + "loginOnly": "Only allow Login", + "loginBypass2fa": "Bypass 2FA on Login", + "loginBypass2faDescription": "Allows users logging in with this provider to bypass their panel 2FA.", + "linkViewable": "Link Viewable to User", + "linkViewableDescription": "Allows the user to see the connection and its identifier in the client UI.", + "userManageable": "Link Manageable by User", + "userManageableDescription": "Allows the user to connect and disconnect with this provider." + }, + "toast": { + "exported": "OAuth Provider exported." + }, + "modal": { + "delete": { + "title": "Confirm OAuth Provider Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "mappings": { + "title": "Mappings", + "page": { + "title": "OAuth Provider Mappings", + "table": { + "columns": { + "matcher": "Matcher" + } + }, + "enum": { + "mappingType": { + "role": "Role", + "serverSubuser": "Server Subuser" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" + } + }, + "toast": { + "created": "OAuth provider mapping created.", + "updated": "OAuth provider mapping updated.", + "deleted": "OAuth provider mapping deleted." + }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, + "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", + "scopesDescription": "OAuth scopes that must all have been granted for this matcher to match.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", + "mappingType": "Mapping Type", + "role": "Role", + "permissions": "Permissions" + }, + "modal": { + "add": { + "title": "Add OAuth Provider Mapping" + }, + "edit": { + "title": "Edit OAuth Provider Mapping" + }, + "delete": { + "title": "Delete OAuth Provider Mapping", + "content": "Are you sure you want to delete this mapping? This action cannot be undone." + } + } + } + }, + "users": { + "title": "Users", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, + "page": { + "title": "OAuth Provider Users", + "table": { + "columns": { + "user": "User" + } + } + } + } + } + }, + "backupConfigurations": { + "title": "Backup Configurations", + "resourceName": "Backup configuration", + "table": { + "columns": { + "disk": "Disk" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Backup Configuration", + "titleUpdate": "Update Backup Configuration", + "alert": { + "ddupBak": "Ddup-Bak is Technology Preview software, it is technically not recommended for production use. If you acknowledge, sail ahead as you wish.", + "btrfs": "Btrfs requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "zfs": "ZFS requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "pbs": "The provided API token needs the following datastore ACLs: **DatastoreAudit** for usage and listing, **DatastoreBackup** for writing backups, and **DatastoreAdmin** (or equivalent prune/delete permissions) if backup deletion or pruning is enabled." + }, + "form": { + "backupDisk": "Backup Disk", + "maintenanceEnabledDescription": "If enabled, any server using this backup configuration will not be able to create new backups, or manage existing ones.", + "shared": "Shared", + "sharedDescription": "If enabled, backups on this backup configuration will not be transferred between nodes, they will be assumed to be accessible by all nodes." + }, + "modal": { + "delete": { + "title": "Confirm Backup Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "s3": { + "title": "S3 Settings", + "form": { + "partSize": "Part Size", + "compressionType": "Compression Type", + "pathStyle": "Using path-style URLs" + } + }, + "restic": { + "title": "Restic Settings", + "form": { + "repository": "Repository", + "retryLockSeconds": "Retry Lock Seconds", + "environmentVariables": "Environment Variables", + "cronSchedule": "Cron Schedule", + "cronScheduleDescription": "Format: second minute hour day month weekday.", + "nodes": "Nodes", + "nodesPlaceholder": "Select nodes" + }, + "pruneJobs": { + "title": "Prune Jobs", + "description": "Scheduled restic prune runs. Each job runs on the configured nodes following its cron schedule.", + "button": { + "add": "Add Prune Job" + } + } + }, + "pbs": { + "title": "Proxmox Backup Server Settings", + "form": { + "url": "Server URL", + "datastore": "Datastore", + "namespace": "Namespace", + "tokenId": "Token ID", + "tokenSecret": "Token Secret", + "fingerprint": "TLS Certificate Fingerprint", + "backupIdPrefix": "Backup ID Prefix" + } + }, + "kopia": { + "title": "Kopia Settings", + "form": { + "url": "Kopia Server URL", + "fingerprint": "TLS Certificate Fingerprint", + "tags": "Backup Tags" + } + } + } + }, + "stats": { + "title": "Stats", + "page": { + "title": "Backup Configuration Stats", + "card": { + "title": "Backup Statistics" + }, + "period": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month" + }, + "periodLabel": { + "allTime": "all time", + "today": "today", + "week": "this week", + "month": "this month" + }, + "stat": { + "total": "Total backups {period}", + "successful": "Successful backups {period}", + "failed": "Failed backups {period}", + "deleted": "Deleted backups {period}" + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Backup Configuration Backups", + "toast": { + "downloadStarted": "Download started." + } + } + }, + "locations": { + "title": "Locations", + "page": { + "title": "Backup Configuration Locations" + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Backup Configuration Nodes" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Backup Configuration Servers" + } + } + } + }, + "mounts": { + "title": "Mounts", + "resourceName": "Mount", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Mount", + "titleUpdate": "Update Mount", + "alert": "Mounts are a powerful and potentially dangerous feature. Improper use can lead to data loss or security vulnerabilities (including container escapes). Make sure you understand the implications of using mounts before creating or updating them.", + "form": { + "source": "Source", + "target": "Target", + "readOnly": "Read Only", + "userMountable": "User Mountable" + }, + "modal": { + "delete": { + "title": "Confirm Mount Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Mount Eggs", + "toast": { + "added": "Mount Egg added.", + "removed": "Mount Egg deleted." + }, + "modal": { + "add": { + "title": "Add Mount Egg", + "form": { + "egg": "Egg" + } + }, + "remove": { + "title": "Confirm Mount Egg Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Mount Nodes", + "toast": { + "added": "Mount Node added.", + "removed": "Mount Node deleted." + }, + "modal": { + "add": { + "title": "Add Mount Node" + }, + "remove": { + "title": "Confirm Mount Node Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Mount Servers" + } + } + } + }, + "roles": { + "title": "Roles", + "resourceName": "Role", + "table": { + "columns": { + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Role", + "titleUpdate": "Update Role", + "alert": { + "impersonate": "This role has the `users.impersonate` permission, which allows users with this role to impersonate any other user, including administrators. Be cautious when assigning this permission to roles with less trusted users." + }, + "form": { + "requireTwoFactor": "Require Two Factor", + "requireTwoFactorDescription": "Require users with this role to use two factor authentication.", + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + }, + "modal": { + "delete": { + "title": "Confirm Role Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "users": { + "title": "Users", + "page": { + "title": "Role Users" + } + } + } + }, + "activity": { + "title": "Activity" + } + }, + "server": { + "viewAdmin": { + "title": "Visa admin" + }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, + "console": { + "title": "Konsol", + "input": { + "placeholder": "Skriv ett kommando...", + "ariaLabel": "Ingång för konsolkommando." + }, + "toast": { + "installCancelled": "Serverinstallationen avbröts.", + "transferCancelled": "Serveröverföring avbruten." + }, + "modal": { + "sshDetails": { + "title": "SSH Detaljer", + "form": { + "command": "SSH kommando" + }, + "launch": "Lansera" + } + }, + "notification": { + "suspended": "Din server är för närvarande avstängd. Inga åtgärder kan utföras förrän avstängningen har upphävts.", + "suspendedAdmin": "Den här servern är för närvarande avstängd. Eftersom du är administratör kan du fortfarande komma åt servern, men åtgärderna är begränsade.", + "nodeMaintenance": "Din server finns på en nod som för närvarande är under underhåll.", + "transferring": "Din server överförs för närvarande till en annan node..", + "restoringBackup": "Din server återställer för närvarande från en säkerhetskopia. Vänligen vänta...", + "installing": "Din server installeras för närvarande. Vänligen vänta...", + "pendingRestart": "Your Server has pending changes that require a restart. Please restart your server to apply these changes." + }, + "message": { + "serverMarkedAs": "Server markerad som {state}...", + "installFailed": "Installationen misslyckades.", + "installCompleted": "Installationen har slutförts.", + "transferFailed": "Överföringen misslyckades.", + "transferCompleted": "Överföringen har slutförts. Återansluter till servern...", + "pullingImage": "Din server drar nu ner sin docker-bild. Vänligen vänta...", + "pulling": "Drar ner", + "extracting": "Extraherar" + }, + "tooltip": { + "search": "Sök", + "sshDetails": "SSH Detaljer", + "commandHistory": "Kommandohistorik", + "decreaseFontSize": "Minska teckenstorleken", + "increaseFontSize": "Öka teckenstorleken" + }, + "drawer": { + "commandHistory": { + "title": "Kommandohistorik", + "detailTitle": "Kommandodetaljer", + "noCommands": "Inga kommandon hittades.", + "copyButton": "Kopiera kommando", "sendButton": "Skicka kommando", "commandSent": "Kommando skickat." } @@ -1129,6 +4009,17 @@ "button": { "accept": "Acceptera EULA" } + }, + "javaVersion": { + "title": "Unsupported Java Version", + "content": "This server is currently running an unsupported version of Java and cannot be started.", + "contentDetails": "Please select a supported Docker image from the list below to continue starting the server.", + "toast": { + "updated": "Docker image updated successfully." + }, + "button": { + "update": "Update Docker Image" + } } }, "details": { @@ -1163,15 +4054,25 @@ "files": { "title": "Filer", "titleEditorViewing": "Visa {file}", + "titleEditorPlaying": "Playing {file}", "titleEditorEditing": "Redigera {file}", "titleEditorNew": "Ny fil", + "titleDiffRevisionVsCurrent": "{file} - Revision #{revision} vs Current", + "titleDiffRevisionVsRevision": "{file} - Revision #{previousRevision} vs #{revision}", "table": { "columns": { "modified": "Ändrad" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "Ny", + "connect": "Connect", + "connectSftp": "via SFTP", + "connectVscode": "via VS Code", "openInNewWindow": "Öppna i nytt fönster", "rename": "Döp om", "copy": "Kopiera", @@ -1209,7 +4110,9 @@ "copying": "Kopierar {path} till {destination}", "copyingMany": "Kopierar {files}", "receivingRemote": "Tar emot {files} från remote server", - "sendingRemote": "Skickar {files} till remote server" + "sendingRemote": "Skickar {files} till remote server", + "exportingBackup": "Exporting backup to {destination}", + "cancelAllOperations": "Cancel all operations" }, "dropzone": { "title": "Släpp filer här för att ladda upp", @@ -1220,13 +4123,18 @@ "preferPhysicalSize": "Visa fysisk storlek istället för logisk storlek", "editorMinimap": "Visa filminikarta", "editorLineOverflow": "Överfylld radbrytning", + "editorFontSize": "Editor Font Size", + "vscodeUriScheme": "VS Code URI Scheme", "imageViewerSmoothing": "Jämna ut bilden (antialiasing)" }, "toast": { "operationCancelled": "Åtgärden avbröts", + "allOperationsCancelled": "All operations have been cancelled.", "copyingStarted": "{files} har börjat kopieras.", "filesCouldNotBeMoved": "Filer kunde inte flyttas.", "filesMoved": "{files} har flyttats.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "Nedladdning har börjat.", "filesDeleted": "Filer har tagits bort.", "archiveCreationStarted": "Arkivering har börjat.", @@ -1235,14 +4143,58 @@ "filePullingStarted": "Filkopiering har börjat.", "fileRenamed": "Filen har döpts om.", "fileCouldNotBeRenamed": "Filen kunde inte döpas om.", + "filesRenamed": "{files} renamed.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "Behörigheter har uppdaterats.", - "fileSaved": "Filen har sparats." + "permissionsUpdatedMany": "Permissions have been updated for {files}.", + "permissionsCouldNotBeUpdated": "Permissions could not be updated.", + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "Filen har sparats.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." + }, + "tooltip": { + "fileHistory": "File History", + "collabEditing": "{user} is editing this file", + "largestDirectories": "Analyze directory sizes", + "dragToMove": "Drag to move", + "back": "Back {seconds} seconds", + "forward": "Forward {seconds} seconds", + "play": "Play", + "pause": "Pause", + "mute": "Mute", + "unmute": "Unmute" + }, + "drawer": { + "revisions": { + "title": "File History", + "noRevisions": "No revisions found for this file.", + "restored": "Revision restored into editor.", + "badge": { + "fullSnapshot": "Full Snapshot" + }, + "tooltip": { + "restore": "Restore this revision into the editor", + "viewDiff": "View diff against current file", + "compareToPrevious": "Compare to previous revision" + }, + "diff": { + "original": "Revision", + "current": "Current" + } + } }, "modal": { "unsavedChanges": { "title": "Osparade ändringar", "content": "Du har osparade ändringar i filredigeringen. Är du säker på att du vill lämna den här sidan? Om du lämnar sidan kommer dina ändringar att förloras." }, + "draftRestore": { + "title": "Restore Draft", + "content": "A draft of this file was found in your browser. Would you like to restore it?", + "contentHashMismatch": "The file has been modified on the server since this draft was saved. Restoring the draft may overwrite those changes." + }, "createArchive": { "title": "Skapa arkiv", "form": { @@ -1295,6 +4247,9 @@ }, "filePermissions": { "title": "Filbehörigheter", + "form": { + "recursive": "Apply changes recursively to all files and subdirectories within this directory" + }, "symbolic": "Symbolisk:", "octal": "Octal:", "owner": "Ägare", @@ -1308,6 +4263,66 @@ "renameFile": { "title": "Byt namn på fil" }, + "massRename": { + "title": "Rename Files", + "find": "Find", + "findPlaceholder": "Text to find", + "replace": "Replace with", + "replacePlaceholder": "Replacement text", + "scope": "Apply to", + "scopeName": "Name", + "scopeExtension": "Extension", + "scopeFull": "Full name", + "section": { + "matchOptions": "Match options", + "affixes": "Prefix & suffix", + "caseConversion": "Case conversion", + "numbering": "Numbering" + }, + "affix": { + "prefix": "Prefix", + "suffix": "Suffix", + "help": "Both may include {token} for the number; a suffix appends a count to every name." + }, + "option": { + "regex": "Use regular expression", + "regexDescription": "Treat the find text as a regex; reference groups with $1, $2 in the replacement.", + "caseSensitive": "Case sensitive", + "allOccurrences": "Replace all occurrences" + }, + "case": { + "label": "Convert case", + "none": "No change", + "lower": "lowercase", + "upper": "UPPERCASE", + "title": "Title Case", + "capitalize": "Capitalize" + }, + "numbering": { + "enable": "Enable numbering", + "help": "Insert {token} in the find, replace, prefix, or suffix text where the number should appear.", + "start": "Start at", + "step": "Step", + "padding": "Minimum digits" + }, + "preview": { + "title": "Preview", + "original": "Original", + "newName": "New name", + "unchanged": "Unchanged", + "conflict": "Name already in use", + "duplicate": "Duplicate target", + "invalid": "Invalid name", + "invalidRegex": "Invalid regular expression", + "empty": "No files selected." + }, + "summary": "{changed} of {total} will be renamed", + "conflictWarning": "Resolve the highlighted name conflicts before renaming." + }, + "largestDirectories": { + "title": "Largest Directories", + "empty": "No directories found." + }, "searchFiles": { "title": "Sök efter filer", "placeholder": "Sök efter filer...", @@ -1343,6 +4358,10 @@ "databases": { "title": "Databaser", "subtitle": "{current} av maximalt {max} databaser skapade.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Denna server är begränsad till {max} databaser." }, @@ -1357,6 +4376,165 @@ "form": { "databaseName": "Databasnamn" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Skapa databas", @@ -1364,7 +4542,8 @@ "created": "Databas skapad." }, "form": { - "noHostsFound": "Inga värdar hittades" + "noHostsFound": "Inga värdar hittades", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -1416,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "Lägg till utlösare", "addCondition": "Lägg till villkor", "addStep": "Lägg till steg", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "Skapa första steget", "addOutput": "Lägg till utdata", "addFile": "Lägg till fil", @@ -1428,6 +4612,7 @@ "imported": "Schema importerat.", "created": "Schema skapat.", "updated": "Schema uppdaterat.", + "duplicated": "Schedule duplicated.", "deleted": "Schema borttaget.", "triggered": "Schema utlöst.", "exported": "Schema exporterat.", @@ -1435,6 +4620,7 @@ "step": { "created": "Schema steg skapat.", "updated": "Schema steg uppdaterat.", + "duplicated": "Schedule step duplicated.", "deleted": "Schema steg borttaget." } }, @@ -1444,12 +4630,21 @@ "and": "OCH (Allt måste vara sant)", "or": "ELLER (Vilken som helst måste vara sant)", "not": "INTE (Måste inte vara sant)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "Variabeln finns", "variableContains": "Variabeln innehåller", "variableEquals": "Variabeln är lika med", "variableStartsWith": "Variabeln börjar med", "variableEndsWith": "Variabeln slutar med" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "Mindre än", "smallerThanOrEqual": "Mindre än eller lika med", @@ -1465,6 +4660,9 @@ "updateSchedule": { "title": "Uppdatera schema" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "Bekräfta borttagning av schema", "content": "Är du säker på att du vill ta bort {name} från den här servern?" @@ -1478,12 +4676,19 @@ "deleteStep": { "title": "Bekräfta borttagning av schema steg", "content": "Är du säker på att du vill ta bort detta schema steg?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "Running" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "Åtgärder", "conditions": "Villkor", @@ -1519,6 +4724,7 @@ "contains": "Innehåller", "startsWith": "Börjar med", "endsWith": "Slutar med", + "metric": "Metric", "allMustBeTrue": "Alla villkor måste vara sanna:", "anyMustBeTrue": "Något villkor måste vara sann:", "mustNotBeTrue": "Villkor får inte vara sant:" @@ -1532,11 +4738,27 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "Cron Schema" + "cronSchedule": "Cron Schema", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" + }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "På Cron-intervallet {schedule} är nästa körning {timestamp} - Senaste körningen var {lastTimestamp}." - } + }, + "invalidCron": "Invalid cron expression" }, "powerAction": { "title": "Power Action", @@ -1559,6 +4781,25 @@ "content": "När Backup nås Status `{status}`." } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "Konsollinje", "card": { @@ -1583,8 +4824,20 @@ "title": "Inga steg konfigurerade", "description": "Det här schemat har inga steg ännu. Lägg till några åtgärder för att komma igång." }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "Sov", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "Varaktighet (millisekunder)" }, @@ -1594,12 +4847,62 @@ }, "ensure": { "title": "Säkerställ", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "Säkerställ att ett villkor matchar" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "Format", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "Formatera sträng", "formatStringDescription": "Formatsträngen. Variabler kan inkluderas genom att omsluta dem i {wrapper}." @@ -1610,6 +4913,7 @@ }, "matchRegex": { "title": "Matcha Regex", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "Input", "regex": "Regex", @@ -1622,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "Vänta på Konsollinje", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "Timeout (millisekunder)" }, @@ -1636,6 +4941,7 @@ }, "sendCommand": { "title": "Skicka Kommando", + "description": "Send a command to the server console.", "renderer": { "compact": "Kör {command}", "detail": { @@ -1645,6 +4951,7 @@ }, "sendPower": { "title": "Skicka Strömsignal", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "Gör {action}", "detail": { @@ -1654,19 +4961,75 @@ }, "createBackup": { "title": "Skapa säkerhetskopia", + "description": "Create a backup of the server files.", "form": { "backupName": "Säkerhetskopieringsnamn" }, "renderer": { "compact": "Skapa {name}", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "Säkerhetskopieringsnamn: {name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "Ignorerade filer: {files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "Skapa Katalog", + "description": "Create a new folder in the server files.", "renderer": { "compact": "Skapa {name} i {root}", "detail": { @@ -1677,6 +5040,7 @@ }, "writeFile": { "title": "Skriv Fil", + "description": "Write or append text to a file.", "form": { "content": "Innehåll", "appendToFile": "Lägg till i fil" @@ -1691,6 +5055,7 @@ }, "copyFile": { "title": "Kopiera Fil", + "description": "Copy a file to a new location.", "form": { "sourceFile": "Källfil" }, @@ -1704,6 +5069,7 @@ }, "deleteFiles": { "title": "Ta Bort Filer", + "description": "Delete files or folders.", "form": { "filesToDelete": "Filer att Ta Bort" }, @@ -1717,6 +5083,7 @@ }, "renameFiles": { "title": "Döp om Filer", + "description": "Rename or move files.", "form": { "files": "Filer", "from": "från", @@ -1732,6 +5099,7 @@ }, "compressFiles": { "title": "Komprimera Filer", + "description": "Compress files into an archive.", "form": { "filesToCompress": "Filer att komprimera" }, @@ -1747,6 +5115,7 @@ }, "decompressFile": { "title": "Dekomprimera Fil", + "description": "Extract an archive into a folder.", "form": { "file": "Fil" }, @@ -1760,6 +5129,7 @@ }, "updateStartupVariable": { "title": "Uppdatera Startvariabel", + "description": "Change the value of a startup variable.", "renderer": { "compact": "Sätt {variable} till {value}", "detail": { @@ -1770,6 +5140,7 @@ }, "updateStartupCommand": { "title": "Uppdatera startkommando", + "description": "Change the command used to start the server.", "renderer": { "compact": "Sätt till {command}", "detail": { @@ -1779,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "Uppdatera Docker Image", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "Sätt till {image}", "detail": { @@ -1790,6 +5162,10 @@ }, "subusers": { "title": "Underanvändare", + "subtitle": "{current} of {max} maximum subusers created.", + "tooltip": { + "limitReached": "This server is limited to {max} subusers." + }, "table": { "columns": { "twoFactorEnabled": "2FA aktiverad", @@ -1805,7 +5181,8 @@ }, "form": { "emailPlaceholder": "Ange den e-postadress som denna underanvändare ska sparas som.", - "permissions": "Behörigheter" + "permissions": "Behörigheter", + "ignoredFilesDescription": "Files and directories matching these patterns will be hidden from this subuser. Uses gitignore-style glob patterns (e.g. `*.env`, `secrets/`). Prefix a pattern with `!` to un-hide a path that a broader pattern would otherwise exclude." } }, "updateSubuser": { @@ -1836,16 +5213,25 @@ "locked": "Låst?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Bläddra" + "browse": "Bläddra", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "Nedladdningen startade.", - "restoringBackup": "Återställer säkerhetskopia..." + "restoringBackup": "Återställer säkerhetskopia...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Skapa Säkerhetskopia", + "noGroup": "No group", "toast": { "created": "Säkerhetskopia skapad." } @@ -1859,15 +5245,63 @@ "restoreBackup": { "title": "Återställ Säkerhetskopia" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Bekräfta Borttagning av Säkerhetskopia", "content": "Är du säker på att du vill ta bort **{name}** från den här servern?", "toast": { + "started": "Backup deletion started.", "deleted": "Säkerhetskopia borttagen." } + }, + "viewMetadata": { + "title": "Backup Metadata" } } }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." + } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." + } + }, "network": { "title": "Nätverk", "subtitle": "{current} av {max} maximala allokeringar tilldelade.", @@ -1913,7 +5347,8 @@ "content": "Du har osparade ändringar i dina startvariabler. Är du säker på att du vill lämna den här sidan? Om du lämnar sidan kommer dina ändringar att gå förlorade." } }, - "noVariables": "Inga startvariabler hittades för den här servern." + "noVariables": "Inga startvariabler hittades för den här servern.", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "Mounts", @@ -1999,7 +5434,10 @@ } }, "activity": { - "title": "Aktivitet" + "title": "Aktivitet", + "button": { + "clearUserFilter": "Clear User Filter" + } } } } diff --git a/frontend/public/translations/tr.json b/frontend/public/translations/tr.json index a79577ff9..d7a59ada7 100644 --- a/frontend/public/translations/tr.json +++ b/frontend/public/translations/tr.json @@ -39,6 +39,86 @@ "few": "{count} SSH Anahtarı", "many": "{count} SSH Anahtarı", "other": "{count} SSH Anahtarı" + }, + "asset": { + "zero": "{count} Assets", + "one": "{count} Asset", + "two": "{count} Assets", + "few": "{count} Assets", + "many": "{count} Assets", + "other": "{count} Assets" + }, + "node": { + "zero": "{count} Nodes", + "one": "{count} Node", + "two": "{count} Nodes", + "few": "{count} Nodes", + "many": "{count} Nodes", + "other": "{count} Nodes" + }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, + "allocation": { + "zero": "{count} Node Allocations", + "one": "{count} Node Allocation", + "two": "{count} Node Allocations", + "few": "{count} Node Allocations", + "many": "{count} Node Allocations", + "other": "{count} Node Allocations" + }, + "egg": { + "zero": "{count} Eggs", + "one": "{count} Egg", + "two": "{count} Eggs", + "few": "{count} Eggs", + "many": "{count} Eggs", + "other": "{count} Eggs" + }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, + "shortcut": { + "zero": "{count} Shortcuts", + "one": "{count} Shortcut", + "two": "{count} Shortcuts", + "few": "{count} Shortcuts", + "many": "{count} Shortcuts", + "other": "{count} Shortcuts" + }, + "line": { + "zero": "{count} Lines", + "one": "{count} Line", + "two": "{count} Lines", + "few": "{count} Lines", + "many": "{count} Lines", + "other": "{count} Lines" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -49,6 +129,7 @@ "save": "Kaydet", "saveAndStay": "Kaydet ve Kal", "edit": "Düzenle", + "duplicate": "Duplicate", "delete": "Sil", "remove": "Kaldır", "enable": "Etkinleştir", @@ -65,16 +146,28 @@ "selectAll": "Tümünü Seç", "deselectAll": "Seçimi Kaldır", "restore": "Geri Yükle", + "discard": "Discard", "download": "İndir", "downloadAs": "{format} olarak indir", "export": "Dışa Aktar", "exportAs": "{format} olarak dışa aktar", "recreate": "Yeniden Oluştur", + "move": "Move", + "transfer": "Transfer", + "reattach": "Reattach", + "detach": "Detach", + "send": "Send", + "reset": "Reset", + "view": "View", "import": "İçe Aktar", "details": "Detaylar", + "loadLogs": "Load Logs", + "sendTestEmail": "Send Test Email", "setPrimary": "Birincil Yap", "unsetPrimary": "Birincilliği Kaldır", - "leavePage": "Sayfadan Ayrıl" + "leavePage": "Sayfadan Ayrıl", + "viewDocumentation": "View Documentation", + "undo": "Undo" }, "alert": { "error": "Hata", @@ -88,27 +181,76 @@ "input": { "search": "Ara..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "Varsayılana sıfırla", "edit": "Düzenle", "delete": "Sil", - "primary": "Birincil" + "remove": "Remove", + "primary": "Birincil", + "backupOnDifferentNode": "This backup is on a different node than the server. It is not viewable from the Client API." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "İsim", + "newName": "New Name", "description": "Açıklama", + "author": "Author", + "type": "Type", "password": "Şifre", "host": "Host", "username": "Kullanıcı Adı", + "usernameOrEmail": "Username/Email", "server": "Sunucu", "url": "URL", "email": "E-posta", + "path": "Path", "port": "Port", + "provider": "Provider", "command": "Komut", + "fromAddress": "From Address", + "fromName": "From Name", + "siteKey": "Site Key", + "secretKey": "Secret Key", + "apiKey": "API Key", + "accessKey": "Access Key", + "bucket": "Bucket", + "region": "Region", + "endpoint": "Endpoint", + "publicUrl": "Public URL", "firstName": "Ad", "lastName": "Soyad", "language": "Dil", + "identifier": "Identifier", "enabled": "Etkin", + "disabled": "Disabled", + "title": "Title", + "content": "Content", + "backupConfiguration": "Backup Configuration", "fileName": "Dosya Adı", "sftpPort": "SFTP Port", "sftpHost": "SFTP Host", @@ -119,11 +261,26 @@ "startupCommand": "Başlangıç Komutu", "archiveName": "Arşiv Adı", "archiveFormat": "Arşiv Formatı", + "compressionLevel": "Compression Level", + "multiplexChannels": "Multiplex Channels", + "multiplexChannelsDescription": "Add additional HTTP connections (and therefore also threads) for transferring split archives, total streams is 1 + multiplex channels.", + "deleteSourceBackups": "Delete source backups", + "deleteSourceBackupsDescription": "Deletes the transferred backups on the source node once transfer finishes.", + "node": "Node", + "primaryAllocation": "Primary Allocation", + "additionalAllocations": "Additional Allocations", + "externalId": "External ID", + "mount": "Mount", + "nest": "Nest", + "lines": "Lines", "databaseHost": "Veritabanı Hostu", + "databaseAgentHost": "Database Agent Host", "timezone": "Zaman Dilimi", + "timezoneSystem": "System", "protocol": "Protokol", "powerAction": "Güç Eylemi", "destination": "Hedef", + "destinationDirectory": "Destination Directory", "directoryName": "Dizin Adı", "locked": "Kilitli", "portRanges": "Port Aralıkları", @@ -131,10 +288,17 @@ "currentPassword": "Mevcut Şifre", "confirmPassword": "Şifreyi Onayla", "authenticationCode": "Doğrulama Kodu", + "restoreStartup": "Restore the startup command, image, and variables from this backup.", "lineContains": "Satır şunu içerir", + "filePath": "File Path", + "envVariable": "Environment Variable", + "value": "Value", "eggs": "Egg'ler", "ignoredFiles": "Yoksayılan Dosyalar", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "Kontrol Paneli Şifreniz", + "deploymentEnabled": "Deployment Enabled", + "maintenanceEnabled": "Maintenance Enabled", "truncateDirectory": "Bu işlemi yapmadan önce bu sunucudaki tüm dosyaları silmek istiyor musunuz? Bu işlem geri alınamaz." }, "table": { @@ -143,27 +307,60 @@ "empty": "Hiçbir öğe bulunamadı, sanki saklanıyorlar." }, "columns": { + "id": "ID", "name": "İsim", + "author": "Author", + "type": "Type", + "title": "Title", + "enabled": "Enabled", "description": "Açıklama", "username": "Kullanıcı Adı", "size": "Boyut", "lastUsed": "Son Kullanım Tarihi", "created": "Oluşturulma", + "updated": "Updated", "actor": "Olayı Gerçekleştiren", "event": "Yapılan İşlem", "ip": "İşlemi Gerçekleştiren IP Adresi", "when": "İşlemin Gerçekleştiği Zaman", "command": "Komut", - "notes": "Notlar" + "location": "Location", + "node": "Node", + "owner": "Owner", + "added": "Added", + "backupConfiguration": "Backup Configuration", + "status": "Status", + "allocation": "Allocation", + "notes": "Notlar", + "source": "Source", + "target": "Target", + "checksum": "Checksum", + "files": "Files", + "server": "Server", + "address": "Address", + "eggs": "Eggs", + "template": "Template", + "version": "Version", + "host": "Host" } }, + "tabs": { + "general": "General" + }, "badge": { "active": "Aktif", "inactive": "Pasif", "enabled": "Etkin", "disabled": "Devre Dışı", "successful": "Başarılı", - "failed": "Hata" + "failed": "Hata", + "installed": "Installed" + }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" }, "server": { "noAllocation": "Tahsis Yok", @@ -217,6 +414,12 @@ "stopped": "Durduruldu", "restarted": "Yeniden Başlatıldı", "killed": "Zorla Durduruldu" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" } }, "unit": { @@ -233,15 +436,37 @@ "readOnly": "Salt Okunur", "na": "N/A", "never": "Asla", + "none": "None", + "unknown": "Unknown", "yes": "Evet", "no": "Hayır", "web": "Web", "api": "API", + "default": "Default", + "custom": "Custom", "system": "Sistem", "schedule": "Zamanlayıcı", "impersonatedBy": "{username} tarafından taklit ediliyor" }, "elements": { + "routeOrderEditor": { + "title": "Route Configuration", + "label": { + "route": "Route", + "divider": "Divider", + "redirect": "Redirect" + }, + "empty": "No routes configured. Add routes, dividers, or redirects below.", + "unnamed": "(unnamed)", + "dividerPlaceholder": "Divider label (optional)", + "redirectNamePlaceholder": "Redirect name", + "destinationPlaceholder": "Destination URL (e.g. https://...)", + "selectRoutePlaceholder": "Select a route…", + "button": { + "addDivider": "Add Divider", + "addRedirect": "Add Redirect" + } + }, "errorBoundary": { "message": "Uygulama bu görünümü işlerken bir hatayla karşılaştı. Sayfayı yenilemeyi deneyin.", "hideDetails": "Detayları Gizle", @@ -257,6 +482,13 @@ "copyManual": "Panoya kopyalayın: Ctrl+C veya Command+C, Enter" } }, + "pasteOnClick": { + "toast": { + "pasted": "Pasted from clipboard.", + "failed": "Failed to paste from clipboard.", + "pasteManual": "Paste from clipboard: Ctrl+V or Command+V, Enter" + } + }, "estimatedTimeArrival": { "tooltip": { "estimating": "Tamamlanma süresi hesaplanıyor...", @@ -268,7 +500,8 @@ "container": { "alert": { "impersonating": "Şu anda bir kullanıcıyı taklit ediyorsunuz. Eylemlerinizin kullanıcının hesabını etkileyebileceğini unutmayın. Moddan çıkmak için sol alttaki \"Taklit Etmeyi Durdur\" butonuna tıklayın." - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -276,22 +509,43 @@ "stopImpersonating": "Taklit Etmeyi Durdur", "openInVirtualWindow": "Sanal Pencerede Aç", "openInPopup": "Popup Olarak Aç", - "openInNewTab": "Yeni Sekmede Aç" + "openInNewTab": "Yeni Sekmede Aç", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { + "button": { + "copyPermissions": "Copy Permissions", + "pastePermissions": "Paste Permissions" + }, "selectedPermissions": "Seçili Yetkiler ({count})", "noPermissions": "Hiçbir yetki seçilmedi." }, "selectInput": { "noResults": "Sonuç bulunamadı." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "Kaydetme yetkiniz yok.", "cantDelete": "Silme yetkiniz yok." } }, + "resource": { + "tooltip": { + "created": "{resource} created.", + "updated": "{resource} updated.", + "deleted": "{resource} deleted." + } + }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -308,6 +562,10 @@ "title": "Bulunamadı", "content": "Aradığınız sayfa bulunamadı." }, + "suspended": { + "title": "Account Suspended", + "content": "Your account has been suspended. You cannot make changes to your account. Please contact an administrator for more information." + }, "serverConflict": { "title": "Çakışan Sunucu Durumu", "contentSuspended": "Bu sunucu askıya alınmış ve erişilemez.", @@ -331,7 +589,10 @@ "scheduleDynamicInput": { "none": "Yok", "variable": "Değişken", - "enterVariable": "Lütfen değerlendirilecek değişken adını girin." + "enterVariable": "Lütfen değerlendirilecek değişken adını girin.", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -350,6 +611,7 @@ "toast": { "backupCompleted": "Yedekleme başarıyla tamamlandı.", "backupFailed": "Yedekleme başarısız oldu.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "Yedek geri yükleme başarıyla tamamlandı.", "installCompleted": "Sunucu kurulumu başarıyla tamamlandı.", "installFailed": "Sunucu kurulumu başarısız oldu.", @@ -368,6 +630,7 @@ }, "copying": { "completed": "`{path}` dosyası `{destination}` konumuna {time} içinde kopyalandı.", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", "failed": "`{path}` dosyası `{destination}` konumuna kopyalanamadı:\n{error}" }, "copyingMany": { @@ -385,13 +648,21 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "Bekliyor: {file}", "uploading": "Yükleniyor: {file}", "uploadingFolder": "Klasör yükleniyor: {folder} ({files})", + "rateLimited": "Your upload has been rate limited. Waiting...", + "cancelAllUploads": "Cancel all uploads", "toast": { "uploading": "{files} yüklenmeye başlandı...", "cancelledFile": "`{file}` yüklemesi başarıyla iptal edildi.", - "cancelledFolder": "`{folder}` ({files}) yüklemesi başarıyla iptal edildi." + "cancelledFolder": "`{folder}` ({files}) yüklemesi başarıyla iptal edildi.", + "cancelledAll": "All uploads have been cancelled.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -447,6 +718,8 @@ "form": { "locationName": "Lokasyon Adı", "locationNamePlaceholder": "Evim", + "locationFlag": "Location Flag", + "locationFlagPlaceholder": "The best country", "backupName": "Yedekleme Yapılandırma Adı", "backupNamePlaceholder": "Bulut Yedek", "backupDisk": "Yedekleme Diski", @@ -525,6 +798,7 @@ }, "server": { "title": "Sunucu", + "existingServer": "A server has already been created. You can change the settings later in the admin menu.", "egg": { "title": "Egg", "description": "İlk sunucunuzu kuralım. Hangi Egg'i kullanmak istersiniz?", @@ -570,9 +844,14 @@ "login": "Giriş Yap", "loginWith": "{name} ile Giriş Yap" }, + "alert": { + "urlMismatch": "The application URL does not match the current URL. Expected: `{appUrl}`, Current: `{currentUrl}`." + }, "login": { "error": { - "usernameRequired": "Lütfen bir kullanıcı adı girin" + "usernameRequired": "Lütfen bir kullanıcı adı girin", + "registrationDisabled": "No matching Account could be found and registration is currently disabled.", + "userAlreadyExists": "An account with this username or email already exists." }, "passkey": { "error": { @@ -590,6 +869,10 @@ "step": { "username": { "title": "Giriş Yap", + "subtitle": "Enter your username or email address to continue", + "form": { + "usernameOrEmailPlaceholder": "Your username or email address" + }, "link": { "forgotPassword": "Şifremi Unuttum", "notRegistered": "Kayıtlı değil misiniz?", @@ -678,6 +961,9 @@ "noGroups": "Sunucu eklenecek grup bulunmuyor", "noGroup": "Bu sunucu herhangi bir grupta değil" }, + "badge": { + "foreign": "Foreign" + }, "tabs": { "groupedServers": { "title": "Gruplandırılmış Sunucular", @@ -711,6 +997,13 @@ "toast": { "added": "Sunucu gruba eklendi." } + }, + "removeServerFromGroup": { + "title": "Confirm Server Removal", + "content": "Are you sure you want to remove **{server}** from **{group}**?", + "toast": { + "removed": "Server removed from group." + } } }, "noGroups": "Hiç grup bulunamadı, bir tane oluşturmaya ne dersiniz?" @@ -752,6 +1045,10 @@ "requireTwoFactor": { "title": "İki Faktörlü Doğrulama Gerekli", "description": "Hesabınızda İki Faktörlü Doğrulama gereklidir. Paneli kullanmaya devam etmek için lütfen aşağıdan kurulumu yapın." + }, + "frozen": { + "title": "Account Frozen", + "description": "Your account has been frozen. You cannot make changes to your account until it is unfrozen. Please contact an administrator for more information." } }, "containers": { @@ -827,13 +1124,15 @@ }, "securityKeys": { "title": "Güvenlik Anahtarları", + "subtitle": "{current} of {max} maximum security keys created.", "table": { "columns": { "credentialId": "Kimlik Bilgisi (Credential) ID" } }, "tooltip": { - "secureContextRequired": "Güvenlik anahtarlarını kullanmak için güvenli bir bağlam (HTTPS) gereklidir." + "secureContextRequired": "Güvenlik anahtarlarını kullanmak için güvenli bir bağlam (HTTPS) gereklidir.", + "limitReached": "You are limited to {max} security keys." }, "modal": { "createSecurityKey": { @@ -882,6 +1181,23 @@ "subtitle": "Panelde daha verimli gezinmek ve etkileşimde bulunmak için bu klavye kısayollarını kullanın.", "detectedMac": "macOS algılandı", "detectedWindows": "Windows/Linux algılandı", + "label": { + "disabled": "Disabled", + "modified": "Modified", + "recording": "Press keys..." + }, + "button": { + "rebind": "Rebind", + "resetAll": "Reset All", + "copy": "Copy All", + "paste": "Paste" + }, + "toast": { + "imported": "Updated {shortcuts}.", + "importedNone": "No shortcuts were changed.", + "importErrors": "Ignored {unknown} and {invalid}.", + "resetAll": "All shortcuts reset to defaults." + }, "fileManager": { "title": "Dosya Yöneticisi", "selectAll": "Tüm dosyaları seç", @@ -917,6 +1233,10 @@ }, "sshKeys": { "title": "SSH Anahtarları", + "subtitle": "{current} of {max} maximum ssh keys created.", + "tooltip": { + "limitReached": "You are limited to {max} ssh keys." + }, "table": { "columns": { "fingerprint": "Parmak İzi" @@ -961,6 +1281,10 @@ }, "commandSnippets": { "title": "Komut Parçacıkları (Snippets)", + "subtitle": "{current} of {max} maximum command snippets created.", + "tooltip": { + "limitReached": "You are limited to {max} command snippets." + }, "modal": { "createCommandSnippet": { "title": "Komut Parçacığı Oluştur", @@ -980,6 +1304,12 @@ "toast": { "removed": "Komut parçacığı kaldırıldı." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1006,9 +1336,13 @@ }, "apiKeys": { "title": "API Anahtarları", + "subtitle": "{current} of {max} maximum api keys created.", "button": { "apiDocumentation": "API Dokümantasyonu" }, + "tooltip": { + "limitReached": "You are limited to {max} api keys." + }, "table": { "columns": { "key": "Anahtar", @@ -1029,12 +1363,25 @@ "updated": "API anahtarı güncellendi." } }, + "recreateApiKey": { + "title": "Recreate API Key", + "content": "Recreating an API key will generate a new key and invalidate the old one. Are you sure you want to recreate the API key **{name}**?", + "toast": { + "recreated": "API key recreated." + } + }, "deleteApiKey": { "title": "API Anahtarı Silme Onayı", "content": "**{name}** anahtarını hesabınızdan silmek istediğinize emin misiniz?", "toast": { "removed": "API anahtarı kaldırıldı." } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1043,64 +1390,2611 @@ "userPermissions": "Kullanıcı Yetkileri", "serverPermissions": "Sunucu Yetkileri", "adminPermissions": "Yönetici Yetkileri" + }, + "create": { + "title": "Create API Key", + "subtitle": "An application is requesting an API key to be created for your account.", + "alert": { + "adminPermissions": "This API key requests **admin permissions**. Anyone in possession of this key will be able to perform administrative actions on this panel in your name. Only continue if you absolutely trust the requesting application.", + "callbackUrl": "After creation, the new API key will be sent to **{url}**." + }, + "noPermissions": "This API key will not have any permissions.", + "keyCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "button": { + "goToApiKeys": "Go to API Keys" + } } }, "activity": { "title": "Aktivite" } }, - "server": { - "viewAdmin": { - "title": "Yönetici görünümü" + "admin": { + "home": { + "title": "Home", + "alert": { + "newPanelVersion": "A new version is available for the panel! You are currently on {current} and the latest version is {latest}. You may want to consider upgrading. [Click here]({upgradeUrl}) to view upgrade instructions." + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "permissionDenied": "You do not have permission to read the statistics that would have been here otherwise. For now, enjoy this bird.", + "card": { + "systemOverview": "System Overview", + "generalStatistics": "General Statistics", + "backupStatistics": "Backup Statistics" + }, + "system": { + "cpu": "CPU", + "memoryUsage": "Memory Usage ({process} used by Panel)", + "memoryValue": "{used} / {total} ({percent}%)", + "kernelVersion": "Kernel Version ({architecture})", + "containerType": "Container Type", + "databaseVersion": "Database Version ({size})", + "cacheVersion": "Cache Version", + "cacheCalls": "Cache Calls", + "cacheHits": "Cache Hits ({percent}%)", + "cacheMisses": "Cache Misses ({percent}%)", + "avgCachedCallLatency": "Avg. Cached Call Latency" + }, + "containerType": { + "none": "None detected", + "official": "Official", + "officialAio": "Official AIO", + "officialHeavy": "Official Heavy" + }, + "stats": { + "users": "Users", + "servers": "Servers", + "locations": "Locations", + "nodes": "Nodes", + "nestEggs": "Nest Eggs", + "databaseHosts": "Database Hosts", + "backupConfigurations": "Backup Configurations", + "roles": "Roles" + }, + "backup": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month", + "totalAllTime": "Total backups all time", + "successfulAllTime": "Successful backups all time", + "failedAllTime": "Failed backups all time", + "deletedAllTime": "Deleted backups all time", + "totalToday": "Total backups today", + "successfulToday": "Successful backups today", + "failedToday": "Failed backups today", + "deletedToday": "Deleted backups today", + "totalWeek": "Total backups this week", + "successfulWeek": "Successful backups this week", + "failedWeek": "Failed backups this week", + "deletedWeek": "Deleted backups this week", + "totalMonth": "Total backups this month", + "successfulMonth": "Successful backups this month", + "failedMonth": "Failed backups this month", + "deletedMonth": "Deleted backups this month", + "successfulValue": "{count} ({size})", + "deletedValue": "{count} ({size})" + } + } + }, + "updates": { + "title": "Updates", + "page": { + "alert": { + "extensionUpdateErrors": "There were errors checking for updates for some extensions." + }, + "card": { + "panelVersion": "Panel Version", + "versionHistory": "Version History", + "outdatedExtensions": "Outdated Extensions", + "outdatedNodes": "Outdated Nodes", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" + }, + "panelVersion": "Your panel is currently running version `{current}`. The latest available version is `{latest}`.", + "unknown": "unknown", + "button": { + "recheck": "Recheck for Updates" + }, + "toast": { + "recheckComplete": "Recheck complete." + }, + "selectHistory": "Select an update history to view.", + "historyPanel": "Panel", + "historyExtension": "Extension: {name}", + "extensionsUpToDate": "All extensions are up to date.", + "extensionsOutdated": "Some extensions are outdated or had errors when checking for updates.", + "noChangelog": "No changelog", + "nodesUpToDate": "Seems like all nodes are up to date. ({failed} failed to check)", + "nodesOutdated": "Some nodes are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", + "table": { + "version": "Version", + "installed": "Installed", + "packageName": "Package Name", + "latestVersion": "Latest Version", + "changes": "Changes", + "error": "Error" + } + } + }, + "health": { + "title": "Health", + "page": { + "card": { + "generalHealth": "General Health", + "extensionMigrationHealth": "Extension Migration Health", + "desyncNodes": "Desync Nodes", + "debugMode": "Debug Mode" + }, + "appliedMigrations": "Applied Migrations ({percent}%)", + "migrationsValue": "{applied} / {total}", + "avgNtpOffset": "Avg. NTP Offset", + "noExtensions": "No extensions found.", + "nodesSynced": "Seems like all nodes have a synced clock (within 5 seconds of panel clock). ({failed} failed to check)", + "nodesDesync": "Some nodes have desync clocks (over 5 seconds off of the panel's clock). This can cause file download/console issues. ({desync} desync, {failed} failed to check)", + "debugEnabled": "Debug mode is currently enabled.", + "debugDisabled": "Debug mode is currently disabled.", + "debugResetNote": "This setting will be reset to the default ({default}) when the application restarts.", + "table": { + "packageName": "Package Name", + "applied": "Applied", + "total": "Total", + "id": "ID", + "desync": "Desync", + "appliedValue": "{applied} ({percent}%)" + }, + "button": { + "enableDebug": "Enable Debug Mode", + "disableDebug": "Disable Debug Mode" + }, + "toast": { + "debugEnabled": "Debug mode enabled.", + "debugDisabled": "Debug mode disabled." + } + } + } + } }, - "console": { - "title": "Konsol", - "input": { - "placeholder": "Bir komut yazın...", - "ariaLabel": "Konsol komut girişi." + "settings": { + "title": "Settings", + "tabs": { + "application": { + "title": "Application", + "page": { + "title": "Application Settings", + "form": { + "icon": "Icon", + "iconLight": "Icon (Light Mode)", + "banner": "Banner", + "bannerLight": "Banner (Light Mode)", + "sessionCookie": "Session Cookie", + "sessionDurationSeconds": "Session Duration (seconds)", + "twoFactorRequirement": "Two-Factor Authentication Requirement", + "telemetryEnabled": "Enable Telemetry", + "telemetryEnabledDescription": "Allow Calagopus to collect limited and anonymous usage data to help improve the application.", + "registrationEnabled": "Enable Registration" + }, + "enum": { + "twoFactorRequirement": { + "admins": "Admins", + "allUsers": "All Users", + "none": "None" + } + }, + "button": { + "previewTelemetry": "Preview Telemetry" + }, + "toast": { + "updated": "Application settings updated." + }, + "modal": { + "disableTelemetry": { + "title": "Confirm Disabling Telemetry", + "content": "Are you sure you want to disable telemetry? Telemetry helps us improve Calagopus by providing anonymous usage data. Disabling telemetry will prevent any data from being sent." + }, + "enableRegistration": { + "title": "Confirm Enabling Registration", + "content": "Are you sure you want to enable registration? Enabling registration allows anyone to create an account on this panel. If you do not have a captcha configured, this may be a mistake." + }, + "telemetryPreview": { + "title": "Telemetry Preview" + } + } + } + }, + "storage": { + "title": "Storage", + "page": { + "title": "Storage Settings", + "form": { + "driver": "Driver" + }, + "enum": { + "driver": { + "filesystem": "Filesystem", + "s3": "S3" + } + }, + "toast": { + "updated": "Storage settings updated." + }, + "modal": { + "changeStorageType": { + "title": "Confirm Changing Storage Type", + "content": "Are you sure you want to change the storage type? Changing the storage type will cause the application to look for assets (e.g. profile pictures) in a different location, which may result in missing assets if they are not moved to the new location manually." + } + }, + "s3": { + "alert": { + "permissionsTitle": "Note on Permissions", + "permissionsIntro": "To ensure that the storage backend works correctly, please make sure the following subdirectories are publicly accessible over the \"Public URL\" you provided:", + "permissionsAssets": "This is where all admin assets (e.g., icons) will be stored.", + "permissionsAvatars": "This is where all user avatars will be stored.", + "permissionsPublicData": "This is where extensions can store public data (e.g., images)." + }, + "form": { + "pathStyle": "Using path-style URLs" + } + } + } + }, + "mail": { + "title": "Mail", + "page": { + "title": "Email Settings", + "enum": { + "provider": { + "none": "None", + "smtp": "SMTP", + "sendmail": "Sendmail Command", + "filesystem": "Filesystem" + }, + "tlsMode": { + "none": "None", + "startTls": "STARTTLS", + "implicitTls": "Implicit TLS" + } + }, + "toast": { + "updated": "Email settings updated." + }, + "modal": { + "sendTestEmail": { + "title": "Send Test Email", + "toast": { + "sent": "Test email has been sent successfully." + } + } + }, + "smtp": { + "form": { + "tlsMode": "TLS Mode", + "skipCertValidation": "Skip Certificate Validation" + } + } + } + }, + "mailTemplates": { + "title": "Mail Templates", + "page": { + "title": "Email Template Settings", + "sidebar": { + "templates": "Templates", + "loading": "Loading...", + "availableVariables": "Available Variables" + }, + "alert": { + "syntaxBefore": "Templates use the", + "syntaxLink": "MiniJinja", + "syntaxMiddle": "templating syntax. Variables are referenced with", + "syntaxAnd": "and control structures like", + "syntaxOr": "and", + "syntaxAfter": "are supported." + }, + "empty": "Select a template from the sidebar to edit it.", + "loadingTemplate": "Loading template...", + "form": { + "subject": "Subject" + }, + "toast": { + "saved": "Email template saved.", + "reset": "Email template reset to default." + }, + "modal": { + "reset": { + "title": "Reset to default", + "content": "This will discard your custom template for **{identifier}** and restore the built-in default. This cannot be undone." + } + } + } + }, + "captcha": { + "title": "Captcha", + "page": { + "title": "Captcha Settings", + "toast": { + "updated": "Captcha settings updated." + }, + "recaptcha": { + "form": { + "v3": "V3" + } + } + } + }, + "webauthn": { + "title": "Webauthn", + "page": { + "title": "Webauthn Settings", + "form": { + "rpId": "RP Id", + "rpOrigin": "RP Origin" + }, + "button": { + "autofill": "Autofill" + }, + "toast": { + "updated": "Webauthn settings updated.", + "ipNotAllowed": "Cannot use WebAuthn on an IP address." + }, + "modal": { + "changeRpId": { + "title": "Confirm Changing RP Id", + "content": "Are you sure you want to change the RP Id? Changing the RP Id will break all existing Webauthn credentials and require users to re-register their devices. This can have significant consequences, so please make sure you understand the implications before proceeding." + } + } + } + }, + "server": { + "title": "Server", + "page": { + "title": "Server Settings", + "form": { + "maxFileManagerViewSize": "Max File Manager View Size", + "maxScheduleStepCount": "Max Schedule Steps", + "maxFileManagerContentSearchSize": "Max File Manager Content Search Size", + "maxFileManagerSearchResults": "Max File Manager Search Results", + "maxSubuserCount": "Max Subuser Count", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", + "allowOverwritingCustomDockerImage": "Allow Overwriting Custom Docker Image", + "allowOverwritingCustomDockerImageDescription": "If enabled, users will be able to overwrite the Docker image specified in the server configuration using the Eggs list, even if an admin has set a custom Docker image.", + "allowViewingInstallationLogs": "Allow Viewing Installation Logs", + "allowViewingInstallationLogsDescription": "If enabled, users with console read permissions will also be able to view installation logs via the websocket connection. If disabled, installation logs will only be available for admins.", + "allowAcknowledgingInstallationFailure": "Allow Acknowledging Installation Failure", + "allowAcknowledgingInstallationFailureDescription": "If enabled, users will be able to acknowledge installation failures for servers that are in the \"Install Failed\" state, allowing them to attempt to start the server instead of having to wait for an admin. If disabled, only admins will be able to acknowledge installation failures.", + "allowViewingTransferProgress": "Allow Viewing Transfer Progress", + "allowViewingTransferProgressDescription": "If enabled, users with console read permissions will also be able to view transfer progress logs via the websocket connection. If disabled, transfer progress logs will only be available for admins.", + "containerPrelude": "Container Prelude", + "containerPreludeDescription": "The terminal prelude used for some status-related messages in the server console." + }, + "toast": { + "updated": "Server settings updated." + } + } + }, + "user": { + "title": "User", + "page": { + "title": "User Settings", + "form": { + "maxServerGroupCount": "Max Server Groups", + "maxApiKeyCount": "Max API Keys", + "maxCommandSnippetCount": "Max Command Snippets", + "maxSecurityKeyCount": "Max Security Keys", + "maxSshKeyCount": "Max SSH Keys", + "allowChangingLanguage": "Allow Changing Language", + "allowChangingLanguageDescription": "If enabled, users will be able to change their language preferences." + }, + "routeOrder": { + "title": "Client Route Order" + }, + "toast": { + "updated": "User settings updated." + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "Activity Settings", + "form": { + "adminLogRetentionDays": "Admin Activity Retention Days", + "userLogRetentionDays": "User Activity Retention Days", + "serverLogRetentionDays": "Server Activity Retention Days", + "adminLogRetentionCount": "Admin Activity Retention Count", + "userLogRetentionCount": "User Activity Retention Count", + "serverLogRetentionCount": "Server Activity Retention Count", + "serverLogAdminActivity": "Log Server Admin Activity", + "serverLogAdminActivityDescription": "Enable or disable logging of admin activity on servers where the admin isn't an owner or subuser.", + "serverLogScheduleActivity": "Log Server Schedule Activity", + "serverLogScheduleActivityDescription": "Enable or disable logging of activity done by server schedules." + }, + "toast": { + "updated": "Activity settings updated." + } + } + }, + "ratelimits": { + "title": "Ratelimits", + "page": { + "title": "Ratelimit Settings", + "form": { + "hits": "Hits", + "hitsDescription": "Maximum number of requests allowed per window.", + "windowSeconds": "Window", + "windowSecondsDescription": "Window duration in seconds." + }, + "toast": { + "updated": "Rate limit settings updated." + } + } + } + } + }, + "announcements": { + "title": "Announcements", + "resourceName": "Announcement", + "tabs": { + "general": { + "page": { + "modal": { + "delete": { + "title": "Confirm Announcement Deletion", + "content": "Are you sure you want to delete **{title}**?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" + } + }, + "form": { + "dismissibleEnd": "Dismissible End", + "enabledStart": "Enabled Start", + "enabledEnd": "Enabled End", + "locations": "Locations", + "locationsDescription": "Leave empty to apply to all locations.", + "nodes": "Nodes", + "nodesDescription": "Leave empty to apply to all nodes.", + "backupConfigurations": "Backup Configurations", + "backupConfigurationsDescription": "Leave empty to apply to all backup configurations.", + "eggsPlaceholder": "Select Eggs", + "dismissible": "Dismissible" + }, + "titleCreate": "Create Announcement", + "titleUpdate": "Update Announcement" + } + } + }, + "enum": { + "announcementType": { + "info": "Info", + "success": "Success", + "warning": "Warning", + "error": "Error" + } + } + }, + "assets": { + "title": "Assets", + "button": { + "newDirectory": "New Directory", + "upload": "Upload", + "copyLink": "Copy Link" + }, + "dropzone": { + "title": "Drop files here to upload", + "subtitle": "Release to start uploading" }, "toast": { - "installCancelled": "Sunucu kurulumu iptal edildi." + "assetDeleted": "Asset deleted.", + "assetsDeleted": "{assets} deleted." }, "modal": { - "sshDetails": { - "title": "SSH Detayları", - "form": { - "command": "SSH Komutu" - }, - "launch": "Başlat" + "createDirectory": { + "title": "New Directory", + "createdAs": "Will be created at " + }, + "deleteAssets": { + "title": "Confirm Asset Deletion", + "content": "Are you sure you want to delete `{count}` assets?" + }, + "deleteAsset": { + "title": "Delete Asset", + "content": "Are you sure you want to delete this asset? This action cannot be undone." } + } + }, + "extensions": { + "title": "Extensions", + "unknownExtension": "Unknown Extension", + "alert": { + "noExtensions": "No extensions installed.", + "heavyImageMissing": "You don't seem to be using the heavy image required to install extensions, see [here]({docsUrl}) on how to switch to it." }, - "notification": { - "nodeMaintenance": "Sunucunuz şu anda bakımda olan bir node üzerinde bulunuyor.", - "transferring": "Sunucunuz şu anda başka bir node'a taşınıyor.", - "restoringBackup": "Sunucunuz şu anda bir yedekten geri yükleniyor. Lütfen bekleyin...", - "installing": "Sunucunuz şu anda kuruluyor. Lütfen bekleyin..." - }, - "message": { - "serverMarkedAs": "Sunucu {state} olarak işaretlendi...", - "installFailed": "Kurulum başarısız oldu.", - "installCompleted": "Kurulum başarıyla tamamlandı.", - "transferFailed": "Taşıma başarısız oldu.", - "transferCompleted": "Taşıma başarıyla tamamlandı. Sunucuya yeniden bağlanılıyor...", - "pullingImage": "Sunucunuz docker imajını çekiyor. Lütfen bekleyin...", - "pulling": "Çekiliyor", - "extracting": "Çıkartılıyor" + "button": { + "viewBuildLogs": "View build logs", + "install": "Install extension", + "rebuild": "Rebuild extensions", + "configure": "Configure", + "back": "Back to Extensions", + "accept": "Accept", + "decline": "Decline" }, "tooltip": { - "search": "Ara", - "sshDetails": "SSH Detayları", - "commandHistory": "Komut Geçmişi", - "decreaseFontSize": "Yazı Boyutunu Azalt", - "increaseFontSize": "Yazı Boyutunu Artır" + "building": "The panel is currently building extension code. Please wait.", + "noPendingBuild": "No pending extensions to build.", + "noBackend": "Backend extension is required to configure this extension.", + "noConfigurationPage": "This extension does not have a configuration page defined.", + "removeExtension": "Remove extension" }, - "drawer": { - "commandHistory": { - "title": "Komut Geçmişi", - "detailTitle": "Komut Detayları", - "noCommands": "Komut bulunamadı.", - "copyButton": "Komutu Kopyala", - "sendButton": "Komutu Gönder", + "badge": { + "frontendMissing": "Frontend missing", + "backendMissing": "Backend missing", + "pendingBuild": "Pending build", + "pendingRemoval": "Pending removal" + }, + "card": { + "version": "Version", + "authors": "Authors" + }, + "section": { + "pendingExtensions": "Pending extensions", + "noPendingExtensions": "No pending extensions." + }, + "dropzone": { + "title": "Drop some files here to install as Extensions", + "subtitle": "Release to start installing" + }, + "toast": { + "buildStarted": "Extension rebuild started successfully.", + "buildCompleted": "Extension build completed. You may need to refresh the page.", + "added": "Extension `{packageName}` added successfully.", + "removed": "Extension `{packageName}` removed successfully." + }, + "notFound": { + "title": "Extension Not Found", + "content": "Extension with package name \"{packageName}\" not found." + }, + "configure": { + "title": "Configure {packageName}", + "noConfigurationPage": "This extension does not have a configuration page." + }, + "modal": { + "buildLogs": { + "title": "Build Logs", + "empty": "No logs found." + }, + "license": { + "title": "License agreement", + "description": "The extension `{packageName}` requires you to accept the following license before it can be installed." + }, + "remove": { + "title": "Remove extension", + "content": "Are you sure you want to remove the extension `{packageName}`? This action cannot be undone.", + "form": { + "removeMigrations": "Do you want to remove & rollback the database migrations of this extension?" + } + } + } + }, + "users": { + "title": "Users", + "resourceName": "User", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, + "tooltip": { + "admin": "Admin", + "twoFactorEnabled": "2FA Enabled", + "twoFactorDisabled": "2FA Disabled" + }, + "table": { + "columns": { + "role": "Role" + } + }, + "tabs": { + "general": { + "page": { + "tooltip": { + "cannotImpersonateSelf": "You cannot impersonate yourself." + }, + "button": { + "disableTwoFactor": "Disable Two Factor", + "sendPasswordResetEmail": "Send Password Reset Email", + "impersonate": "Impersonate" + }, + "form": { + "admin": "Admin", + "adminDescription": "Admin users have full, unrestricted access to everything on the panel.", + "frozen": "Frozen", + "frozenDescription": "Frozen users cannot make any changes to their account information.", + "suspended": "Suspended", + "suspendedDescription": "Suspended users cannot access the panel in any meaningful way.", + "role": "Role" + }, + "modal": { + "delete": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete **{username}**?" + }, + "disableTwoFactor": { + "title": "Disable User Two Factor", + "content": "Are you sure you want to remove the two factor of **{username}**?", + "toast": { + "disabled": "User two factor disabled." + } + }, + "sendPasswordResetEmail": { + "title": "Send Password Reset Email", + "content": "Are you sure you want to send a password reset email to **{email}**?", + "toast": { + "sent": "Password reset email sent." + } + } + }, + "titleCreate": "Create User", + "titleUpdate": "Update User" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "User Servers", + "showOwnedOnly": "Only show users' owned servers" + } + }, + "oauthLinks": { + "title": "OAuth Links", + "page": { + "title": "User OAuth Links", + "toast": { + "added": "OAuth Link added.", + "removed": "OAuth Link removed." + }, + "modal": { + "add": { + "title": "Add OAuth Link", + "form": { + "oauthProvider": "OAuth Provider" + } + }, + "delete": { + "title": "Confirm OAuth Link Deletion", + "content": "Are you sure you want to delete the **{provider}** connection from **{username}**?" + } + } + } + }, + "activity": { + "title": "Activity", + "page": { + "title": "User Activity" + } + } + } + }, + "locations": { + "title": "Locations", + "resourceName": "Location", + "tabs": { + "general": { + "page": { + "form": { + "flag": "Flag" + }, + "modal": { + "delete": { + "title": "Confirm Location Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "titleCreate": "Create Location", + "titleUpdate": "Update Location" + } + }, + "databaseHosts": { + "title": "Database Hosts", + "page": { + "title": "Location Database Hosts", + "toast": { + "created": "Location database host created.", + "deleted": "Location database host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Host" + }, + "delete": { + "title": "Confirm Location Database Host Deletion", + "content": "Are you sure you want to delete the database host **{name}** from **{location}**?" + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Location Nodes" + } + } + } + }, + "nodes": { + "title": "Nodes", + "resourceName": "Node", + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "general": { + "page": { + "tooltip": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "allInOneNode": "All-in-One Node", + "errorWhileFetchingVersion": "Error while fetching version", + "updateAvailable": "{version} (Update Available)", + "useWingsProxyUrl": "Use Wings Proxy URL" + }, + "form": { + "urlDescription": "Used for internal communication with the node.", + "publicUrlDescription": "Used for websocket connections and downloads.", + "backupConfigurationPlaceholder": "Inherit from Location", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." + }, + "button": { + "resetToken": "Reset Token", + "updateConfig": "Update Config" + }, + "toast": { + "tokenReset": "Node token reset." + }, + "alert": { + "noLocations": "You need to create at least one location before you can create nodes. Locations help organize your nodes geographically or logically." + }, + "titleCreate": "Create Node", + "titleUpdate": "Update Node" + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/pterodactyl/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "panelUrl": "Panel URL", + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the node: {error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Node Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "toast": { + "connectionLost": "Lost connection to the node statistics stream." + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "network": "Network", + "cpuThreads": "{model} ({threads} threads)", + "usedByWings": "{size} used by Wings", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "networkTraffic": "Network Traffic", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "inbound": "Inbound", + "outbound": "Outbound", + "networkInLabel": "Network In", + "networkOutLabel": "Network Out" + } + } + }, + "capacity": { + "title": "Capacity", + "page": { + "title": "Deployment Capacity", + "subtitle": "Resources allocated to servers on this node, measured against the limits configured in node settings, not the physical machine capacity. Deployment only checks memory and disk.", + "card": { + "resources": "Allocated Resources" + }, + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Under Maintenance", + "maintenanceDisabled": "Not Under Maintenance" + }, + "label": { + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "memoryOverhead": "Memory Overhead", + "servers": "Servers", + "noLimit": "No node limit", + "free": "{size} free", + "overhead": "+ {size} reserved overhead", + "cores": "{cores} cores allocated" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Node Logs", + "form": { + "logFile": "Log File", + "follow": "Follow" + }, + "button": { + "download": "Download Full Log" + }, + "toast": { + "connectionLost": "Lost connection to the node log stream." + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Node Allocations", + "tooltip": { + "clearSelection": "Clear Selection" + }, + "form": { + "ipAlias": "IP Alias" + }, + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "modal": { + "create": { + "title": "Create Node Allocations", + "button": { + "create": "Create {count}" + }, + "toast": { + "created": "{allocations} created." + } + }, + "update": { + "title": "Update Node Allocations", + "toast": { + "updated": "{allocations} updated." + } + }, + "delete": { + "title": "Confirm Node Allocations Deletion", + "content": "Are you sure you want to delete `{count}` allocations from **{name}**?", + "toast": { + "deleted": "{allocations} deleted." + } + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Node Mounts", + "toast": { + "added": "Node Mount added.", + "removed": "Node Mount removed." + }, + "modal": { + "add": { + "title": "Add Node Mount" + }, + "remove": { + "title": "Confirm Node Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Node Backups", + "input": { + "detachedOnly": "Only show detached backups" + }, + "tooltip": { + "backupNotOnSameNode": "This backup is not on the same node as the server. It is not viewable from the Client API." + }, + "toast": { + "downloadStarted": "Download started.", + "detached": "Backup detached successfully.", + "reattached": "Reattached backup to {name} successfully.", + "restoring": "Restoring backup to {name}...", + "exporting": "Exporting backup to files of {name}...", + "deleted": "Node backup deleted." + }, + "modal": { + "export": { + "title": "Export Node Backup to Files" + }, + "detach": { + "title": "Confirm Backup Detachment", + "content": "Are you sure you want to detach this backup from its server? It will not be deleted and can be reattached later." + }, + "reattach": { + "title": "Reattach Node Backup", + "description": "Reattaching a node backup will link it to a server. This is useful if the backup is detached or you want to link it to a different server. Do note that this is not a transfer tool, unless the backup is considered remote (can be accessed by multiple nodes), the server must belong to the same node as the backup." + }, + "restore": { + "title": "Restore Node Backup", + "form": { + "truncateDirectory": "Do you want to empty the filesystem of this server before restoring the backup?" + } + }, + "delete": { + "title": "Confirm Node Backup Deletion", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Node Servers", + "modal": { + "transfer": { + "title": "Transfer Servers", + "form": { + "allocationMode": "Allocation Mode", + "transferBackups": "Transfer backups", + "transferBackupsDescription": "Whether to transfer backups along with the servers." + }, + "toast": { + "started": "{servers} transfer started." + }, + "confirm": { + "title": "Confirm Server Transfers", + "content": "Are you sure you want to transfer `{count}` servers from **{from}** to **{to}**? This action cannot be undone." + }, + "enum": { + "allocationMode": { + "none": "None (scrap all allocations, server will not be automatically assigned new allocations on the destination node)", + "randomPrimary": "Randomize primary allocation (removes additional allocations)", + "randomAll": "Randomize all allocations (recommended to avoid incompatibility issues with destination node)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", + "eggConfigDeployment": "Assign allocations based on Egg deployment configuration (only works if the Egg has a deployment configuration and the destination node has compatible allocations)", + "eggConfigSelfAssignRange": "Self-assign new allocations based on Egg port range (only works if the Egg has a port range and the destination node has compatible allocations)" + } + } + }, + "powerAction": { + "title": "Confirm Power Action", + "content": "Are you sure you want to **{action}** {servers}?" + } + } + } + }, + "transfers": { + "title": "Outgoing Transfers", + "page": { + "title": "Node Transfers", + "table": { + "columns": { + "progress": "Progress", + "archiveRate": "Archive Rate", + "networkRate": "Network Rate" + } + } + } + } + }, + "modal": { + "delete": { + "title": "Confirm Node Deletion", + "content": "Are you sure you want to delete **{name}**?" + }, + "bulkConfig": { + "title": "Update Configuration - {nodes}", + "button": { + "apply": "Apply to {nodes}" + }, + "toast": { + "applied": "Configuration applied to {nodes}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "servers": { + "title": "Servers", + "resourceName": "Server", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, + "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, + "general": { + "page": { + "titleCreate": "Create Server", + "titleUpdate": "Update Server", + "card": { + "basicInformation": "Basic Information", + "serverAssignment": "Server Assignment", + "resourceLimits": "Resource Limits", + "serverConfiguration": "Server Configuration", + "featureLimits": "Feature Limits", + "allocations": "Allocations", + "variables": "Variables" + }, + "alert": { + "suspended": "This server is suspended.", + "selectEggForVariables": "Please select an egg before you can configure variables." + }, + "badge": { + "serverSuspended": "Server Suspended" + }, + "form": { + "serverNamePlaceholder": "My Game Server", + "externalIdPlaceholder": "Optional external identifier", + "descriptionPlaceholder": "Server description", + "owner": "Owner", + "egg": "Egg", + "backupConfigurationPlaceholder": "Inherit from Node/Location", + "cpuLimit": "CPU Limit (%)", + "cpuLimitDescription": "The CPU limit in % that the server can use.", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this server.", + "swapTooltip": "-1 will not set a limit.", + "memoryDescription": "The Memory limit of the server container.", + "memoryTooltip": "0 will not set a limit.", + "memoryOverhead": "Memory Overhead", + "memoryOverheadDescription": "Hidden Memory that will be added to the container.", + "diskSpace": "Disk Space", + "diskSpaceDescription": "The disk limit of the server.", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the server container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems.", + "pinnedCpus": "Pinned CPUs", + "pinnedCpusDescription": "The CPU cores this server is pinned to.", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", + "dockerImagePlaceholder": "ghcr.io/...", + "predefinedDockerImages": "Predefined Docker Images", + "predefinedDockerImagesPlaceholder": "No predefined image selected", + "timezonePlaceholder": "Europe/Amsterdam", + "startupCommandPlaceholder": "npm start", + "startupCommandCustom": "Custom", + "predefinedStartupCommands": "Predefined Startup Commands", + "startOnCompletion": "Start on Completion", + "startOnCompletionDescription": "Start server after installation completes.", + "skipInstaller": "Skip Installer", + "skipInstallerDescription": "Skip running the install script.", + "hugepagesPassthroughEnabled": "Enable Hugepages Passthrough", + "hugepagesPassthroughEnabledDescription": "Enable hugepages passthrough for the server (mounts /dev/hugepages into the container).", + "kvmPassthroughEnabled": "Enable KVM Passthrough", + "kvmPassthroughEnabledDescription": "Enable KVM passthrough for the server (allows access to /dev/kvm inside the container).", + "allocationsLimit": "Allocations", + "databasesLimit": "Databases", + "databaseAgentsLimit": "Agent Databases", + "backupsLimit": "Backups", + "schedulesLimit": "Schedules" + }, + "modal": { + "confirmNoAllocation": { + "title": "No Primary Allocation Assigned", + "content": "You are creating a server without assigning any primary allocation. Are you sure you want to continue?", + "button": { + "confirm": "Create Anyway" + } + } + } + } + }, + "allocations": { + "title": "Allocations", + "page": { + "title": "Server Allocations", + "table": { + "columns": { + "ipAlias": "IP Alias" + } + }, + "form": { + "notesPlaceholder": "Notes" + }, + "toast": { + "updated": "Allocation updated.", + "setPrimary": "Allocation set as primary.", + "unsetPrimary": "Allocation unset as primary.", + "removed": "Allocation removed.", + "added": "{count} allocations added." + }, + "modal": { + "add": { + "title": "Add Server Allocations", + "form": { + "allocations": "Allocations" + }, + "button": { + "add": "Add {count}" + } + }, + "remove": { + "title": "Confirm Allocation Removal", + "content": "Are you sure you want to remove **{allocation}**?" + } + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Server Variables", + "toast": { + "updated": "Server variables updated." + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Server Mounts", + "toast": { + "added": "Server Mount added.", + "deleted": "Server Mount deleted." + }, + "modal": { + "add": { + "title": "Add Server Mount" + }, + "remove": { + "title": "Confirm Server Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Server Backups", + "input": { + "partiallyDetachedOnly": "Only show partially detached backups" + } + } + }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, + "logs": { + "title": "Logs", + "page": { + "title": "Server Logs", + "form": { + "logType": "Log Type" + }, + "enum": { + "logType": { + "console": "Console", + "install": "Install" + } + } + } + }, + "management": { + "title": "Management", + "page": { + "title": "Server Management", + "transfer": { + "title": "Transfer", + "content": "Transfer this server and it's data to another node within this system.", + "toast": { + "started": "Server transfer started." + }, + "modal": { + "title": "Server Transfer", + "form": { + "backupsToTransfer": "Backups to transfer" + }, + "tooltip": { + "aioNotSupported": "Transfers to the All-In-One node are not supported." + }, + "confirm": { + "title": "Confirm Server Transfer", + "content": "Are you sure you want to transfer **{name}** from **{from}** to **{to}**?", + "alert": { + "notAllBackupsSelected": "You have not selected all backups to transfer, the remaining backups will become partially detached if the transfer completes successfully." + } + } + } + }, + "suspend": { + "title": "Suspend", + "content": "This will suspend the server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the server through the panel or API.", + "button": "Suspend", + "toast": { + "suspended": "Server suspended." + }, + "modal": { + "title": "Confirm Server Suspension", + "content": "Are you sure you want to suspend **{name}**? This will stop the server and prevent it from starting. All running processes will be stopped and the user will not be able to access their files or otherwise manage the server through the panel or API." + } + }, + "unsuspend": { + "title": "Unsuspend", + "content": "This will unsuspend the server, allowing it to start again. The user will be able to access their files and otherwise manage the server through the panel or API.", + "button": "Unsuspend", + "toast": { + "unsuspended": "Server unsuspended." + }, + "modal": { + "title": "Confirm Server Unsuspension", + "content": "Are you sure you want to unsuspend **{name}**? This will allow the server to start again. The user will be able to access their files and otherwise manage the server through the panel or API." + } + }, + "clearState": { + "title": "Clear State", + "content": "This will clear the server state known by the panel.", + "button": "Clear State", + "toast": { + "cleared": "Server state cleared." + }, + "modal": { + "title": "Confirm Server State Clear", + "content": "Are you sure you want to clear the state of **{name}**? This will clear any known pending transfers and status failures, please make sure it is safe to do this before clicking without reason." + } + }, + "delete": { + "title": "Delete", + "content": "This will delete the server and all of its data. This action cannot be undone.", + "toast": { + "deleted": "Server deleted." + }, + "modal": { + "title": "Confirm Server Deletion", + "description": "You are about to delete **{name}**. Are you sure?", + "form": { + "deleteBackups": "Do you want to delete backups of this server?", + "confirmServerName": "Confirm Server Name", + "confirmServerNamePlaceholder": "Server Name" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "viewClient": { + "title": "View in Client Area" + } + } + }, + "nests": { + "title": "Nests", + "resourceName": "Nest", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Nest", + "titleUpdate": "Update Nest", + "modal": { + "delete": { + "title": "Confirm Nest Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": { + "deleteEggs": "Do you want to delete all eggs in this nest?" + } + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Eggs", + "resourceName": "Egg", + "dropzone": { + "title": "Drop some files here to import as Eggs", + "subtitle": "Release to start importing" + }, + "button": { + "updateFromRepository": "Update from Repository" + }, + "toast": { + "imported": "Egg imported.", + "moved": "Egg moved.", + "movedBulk": "{eggs} moved.", + "deletedBulk": "{eggs} deleted.", + "updatedFromRepository": "{eggs} updated using their respective repository egg successfully.", + "parseFailed": "Failed to parse egg: {error}" + }, + "modal": { + "move": { + "title": "Move Egg" + }, + "moveBulk": { + "title": "Move Eggs", + "confirm": "Move {eggs}" + }, + "deleteBulk": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete `{count}` eggs?" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg", + "titleUpdate": "Update Egg", + "card": { + "startupConfiguration": "Startup Configuration", + "stopConfiguration": "Stop Configuration", + "configFiles": "Config Files Configuration" + }, + "form": { + "eggRepository": "Egg Repository", + "eggRepositoryEgg": "Egg Repository Egg", + "startupDone": "Startup Done", + "startupDoneDescription": "Console message indicating startup completion.", + "stripAnsi": "Strip ANSI from startup messages", + "stripAnsiDescription": "Removes ANSI control characters from the console output before matching startup completion.", + "stopType": "Stop Type", + "stopCommand": "Stop Command", + "stopSignal": "Stop Signal", + "parser": "Parser", + "createNewFile": "Create New File", + "createNewFileDescription": "If enabled, the file will be created if it does not exist. If disabled, the file must already exist or the replacement will fail.", + "match": "Match", + "ifValue": "If Value", + "replaceWith": "Replace With", + "insertNew": "Insert New", + "insertNewDescription": "If enabled, if no existing value matches the \"Match\" field, the \"Replace With\" value will be inserted into the file. If disabled, if no match is found, no changes will be made to the file.", + "updateExisting": "Update Existing", + "updateExistingDescription": "If enabled, if a match is found, it will be replaced with the \"Replace With\" value. If disabled, the replacement will only insert new values and will fail if a match is found.", + "startupCommands": "Startup Commands", + "forceOutgoingIp": "Force Outgoing IP", + "separatePort": "Separate IP and Port", + "separatePortDescription": "Separates the primary IP and port on the Console page instead of joining them with \":\".", + "features": "Features", + "featurePlaceholder": "Feature", + "fileDenylist": "File Deny List", + "dockerImages": "Docker Images" + }, + "enum": { + "stopType": { + "command": "Send Command", + "signal": "Send Signal", + "docker": "Docker Stop" + } + }, + "emptyConfigFiles": "No config files defined.", + "emptyReplacements": "No replacements defined.", + "button": { + "addReplacement": "Add Replacement", + "addConfigFile": "Add Config File", + "fromFile": "from File", + "fromRepository": "from Repository" + }, + "toast": { + "exported": "Egg exported.", + "updated": "Egg updated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "installationScript": { + "title": "Installation Script", + "page": { + "title": "Egg Installation Script", + "form": { + "container": "Installation Container", + "entrypoint": "Container Entrypoint" + }, + "toast": { + "updated": "Egg script updated." + } + } + }, + "variables": { + "title": "Variables", + "page": { + "title": "Egg Variables", + "form": { + "supportsMarkdown": "Supports Markdown formatting.", + "defaultValue": "Default Value", + "defaultValuePlaceholder": "server.jar", + "userViewable": "User Viewable", + "userEditable": "User Editable", + "secret": "Secret", + "rules": "Rules", + "rulesDescription": "See https://laravel.com/docs/12.x/validation#available-validation-rules for the available validation rules." + }, + "toast": { + "created": "Egg variable created.", + "updated": "Egg variable updated.", + "deleted": "Egg variable deleted.", + "duplicated": "Egg variable duplicated." + }, + "modal": { + "delete": { + "title": "Confirm Egg Variable Removal", + "content": "Are you sure you want to remove **{variable}**?", + "emptyVariable": "this empty variable" + }, + "duplicate": { + "title": "Duplicate Egg Variable" + } + } + } + }, + "mounts": { + "title": "Mounts", + "page": { + "title": "Egg Mounts", + "toast": { + "added": "Egg Mount added.", + "deleted": "Egg Mount deleted." + }, + "modal": { + "add": { + "title": "Add Egg Mount" + }, + "delete": { + "title": "Confirm Egg Mount Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{egg}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Egg Servers" + } + } + } + } + } + } + }, + "eggConfigurations": { + "title": "Egg Configurations", + "resourceName": "Egg Configuration", + "table": { + "columns": { + "order": "Order" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Configuration", + "titleUpdate": "Update Egg Configuration", + "form": { + "order": "Order", + "eggs": "Eggs", + "eggsPlaceholder": "Select Eggs", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." + }, + "enum": { + "deploymentType": { + "random": "Random", + "range": "Port Range", + "addPrimary": "Add to Primary", + "subtractPrimary": "Subtract from Primary", + "multiplyPrimary": "Multiply Primary", + "dividePrimary": "Divide Primary" + } + }, + "allocation": { + "title": "Allocation Configuration", + "form": { + "userSelfAssign": "User Self Assign", + "userSelfAssignDescription": "Allow users to create their own allocations from a specified port range.", + "requirePrimaryAllocation": "Require Primary Allocation", + "requirePrimaryAllocationDescription": "Whether users must always have a primary allocation.", + "automaticAllocationStart": "Automatic Allocation Start", + "automaticAllocationEnd": "Automatic Allocation End", + "dedicatedIp": "Dedicated IP", + "dedicatedIpDescription": "Assign a dedicated ip address for servers using this egg configuration.", + "primaryAllocation": "Primary Allocation", + "primaryAllocationDescription": "Configure a primary port assignment for deployment.", + "primaryStartPort": "Primary Start Port", + "primaryEndPort": "Primary End Port", + "assignToVariable": "Assign to Variable", + "assignToVariablePlaceholder": "e.g. SERVER_PORT", + "assignToVariableDescription": "Optional environment variable to receive the assigned primary port." + }, + "divider": { + "deployment": "Deployment" + }, + "additionalPorts": { + "title": "Additional Ports", + "button": "Add Rule", + "empty": "No additional port rules configured." + }, + "deployment": { + "form": { + "startPort": "Start Port", + "endPort": "End Port", + "assignToVariable": "Assign to Variable", + "assignToVariableDescription": "Optional environment variable to receive the assigned port from this rule.", + "assignToVariablePlaceholder": "e.g. SERVER_PORT" + }, + "removeRule": "Remove deployment rule" + } + }, + "startup": { + "title": "Startup Configuration", + "form": { + "allowCustomStartupCommand": "Allow Custom Startup Command", + "allowCustomStartupCommandDescription": "Allow users to set their own, non-predefined startup commands." + } + }, + "modal": { + "delete": { + "title": "Confirm Egg Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + } + } + }, + "eggRepositories": { + "title": "Egg Repositories", + "resourceName": "Egg Repository", + "table": { + "columns": { + "gitRepository": "Git Repository" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Egg Repository", + "titleUpdate": "Update Egg Repository", + "form": { + "gitRepository": "Git Repository" + }, + "button": { + "sync": "Sync" + }, + "toast": { + "synced": "Egg repository synchronised, found {eggs}." + }, + "modal": { + "delete": { + "title": "Confirm Egg Repository Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Egg Repository Eggs", + "table": { + "columns": { + "path": "Path" + } + }, + "toast": { + "installed": "Egg installed.", + "installedBulk": "{eggs} installed." + }, + "modal": { + "install": { + "title": "Install Egg Repository Egg" + }, + "installBulk": { + "title": "Install Egg Repository Eggs", + "button": "Install {eggs}" + } + }, + "drawer": { + "noReadme": "This egg does not have a README." + } + } + } + } + }, + "databaseHosts": { + "title": "Database Hosts", + "resourceName": "Database host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Host", + "titleUpdate": "Update Database Host", + "form": { + "publicHost": "Public Host", + "publicPort": "Public Port", + "connectionCredentials": "Connection Credentials", + "credentialType": "Credential Type", + "connectionString": "Connection String", + "connectionStringPlaceholder": "mysql://username:password@host:port" + }, + "enum": { + "credentialType": { + "connectionString": "Connection String", + "details": "Details" + } + }, + "button": { + "testConnection": "Test Connection" + }, + "toast": { + "tested": "Test successfully completed." + }, + "modal": { + "delete": { + "title": "Confirm Database Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "databases": { + "title": "Databases", + "page": { + "title": "Database Host Databases", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } + } + } + } + }, + "oAuthProviders": { + "title": "OAuth Providers", + "resourceName": "OAuth Provider", + "dropzone": { + "title": "Drop some files here to import as OAuth Providers", + "subtitle": "Release to start importing" + }, + "table": { + "columns": { + "loginOnly": "Login Only", + "linkViewable": "Link Viewable", + "userManageable": "User Manageable" + } + }, + "toast": { + "imported": "OAuth Provider imported.", + "parseFailed": "Failed to parse OAuth provider: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create OAuth Provider", + "titleUpdate": "Update OAuth Provider", + "card": { + "redirectUrl": { + "title": "Redirect URL", + "unavailable": "Available after creation" + } + }, + "form": { + "clientId": "Client Id", + "clientSecret": "Client Secret", + "authUrl": "Auth URL", + "tokenUrl": "Token URL", + "infoUrl": "Info URL", + "basicAuth": "Basic Auth", + "basicAuthDescription": "Uses HTTP Basic Authentication to transmit the client id and secret, not common anymore.", + "scopes": "Scopes", + "scopesDescription": "The OAuth2 scopes to request, make sure to include scopes for email and profile info when needed.", + "identifierPath": "Identifier Path", + "identifierPathDescription": "The path used to extract the unique user identifier from the Info URL response (https://serdejsonpath.live).", + "emailPath": "Email Path", + "emailPathDescription": "The path used to extract the email from the Info URL response (https://serdejsonpath.live).", + "usernamePath": "Username Path", + "usernamePathDescription": "The path used to extract the username from the Info URL response (https://serdejsonpath.live).", + "nameFirstPath": "First Name Path", + "nameFirstPathPlaceholder": "First Name URL", + "nameFirstPathDescription": "The path used to extract the first name from the Info URL response (https://serdejsonpath.live).", + "nameLastPath": "Last Name Path", + "nameLastPathDescription": "The path used to extract the last name from the Info URL response (https://serdejsonpath.live).", + "loginOnly": "Only allow Login", + "loginBypass2fa": "Bypass 2FA on Login", + "loginBypass2faDescription": "Allows users logging in with this provider to bypass their panel 2FA.", + "linkViewable": "Link Viewable to User", + "linkViewableDescription": "Allows the user to see the connection and its identifier in the client UI.", + "userManageable": "Link Manageable by User", + "userManageableDescription": "Allows the user to connect and disconnect with this provider." + }, + "toast": { + "exported": "OAuth Provider exported." + }, + "modal": { + "delete": { + "title": "Confirm OAuth Provider Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "mappings": { + "title": "Mappings", + "page": { + "title": "OAuth Provider Mappings", + "table": { + "columns": { + "matcher": "Matcher" + } + }, + "enum": { + "mappingType": { + "role": "Role", + "serverSubuser": "Server Subuser" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" + } + }, + "toast": { + "created": "OAuth provider mapping created.", + "updated": "OAuth provider mapping updated.", + "deleted": "OAuth provider mapping deleted." + }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, + "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Scopes", + "scopesDescription": "OAuth scopes that must all have been granted for this matcher to match.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", + "mappingType": "Mapping Type", + "role": "Role", + "permissions": "Permissions" + }, + "modal": { + "add": { + "title": "Add OAuth Provider Mapping" + }, + "edit": { + "title": "Edit OAuth Provider Mapping" + }, + "delete": { + "title": "Delete OAuth Provider Mapping", + "content": "Are you sure you want to delete this mapping? This action cannot be undone." + } + } + } + }, + "users": { + "title": "Users", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, + "page": { + "title": "OAuth Provider Users", + "table": { + "columns": { + "user": "User" + } + } + } + } + } + }, + "backupConfigurations": { + "title": "Backup Configurations", + "resourceName": "Backup configuration", + "table": { + "columns": { + "disk": "Disk" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Backup Configuration", + "titleUpdate": "Update Backup Configuration", + "alert": { + "ddupBak": "Ddup-Bak is Technology Preview software, it is technically not recommended for production use. If you acknowledge, sail ahead as you wish.", + "btrfs": "Btrfs requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "zfs": "ZFS requires additional setup on the node to work, please [see the documentation]({docsUrl}) for more details.", + "pbs": "The provided API token needs the following datastore ACLs: **DatastoreAudit** for usage and listing, **DatastoreBackup** for writing backups, and **DatastoreAdmin** (or equivalent prune/delete permissions) if backup deletion or pruning is enabled." + }, + "form": { + "backupDisk": "Backup Disk", + "maintenanceEnabledDescription": "If enabled, any server using this backup configuration will not be able to create new backups, or manage existing ones.", + "shared": "Shared", + "sharedDescription": "If enabled, backups on this backup configuration will not be transferred between nodes, they will be assumed to be accessible by all nodes." + }, + "modal": { + "delete": { + "title": "Confirm Backup Configuration Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + }, + "s3": { + "title": "S3 Settings", + "form": { + "partSize": "Part Size", + "compressionType": "Compression Type", + "pathStyle": "Using path-style URLs" + } + }, + "restic": { + "title": "Restic Settings", + "form": { + "repository": "Repository", + "retryLockSeconds": "Retry Lock Seconds", + "environmentVariables": "Environment Variables", + "cronSchedule": "Cron Schedule", + "cronScheduleDescription": "Format: second minute hour day month weekday.", + "nodes": "Nodes", + "nodesPlaceholder": "Select nodes" + }, + "pruneJobs": { + "title": "Prune Jobs", + "description": "Scheduled restic prune runs. Each job runs on the configured nodes following its cron schedule.", + "button": { + "add": "Add Prune Job" + } + } + }, + "pbs": { + "title": "Proxmox Backup Server Settings", + "form": { + "url": "Server URL", + "datastore": "Datastore", + "namespace": "Namespace", + "tokenId": "Token ID", + "tokenSecret": "Token Secret", + "fingerprint": "TLS Certificate Fingerprint", + "backupIdPrefix": "Backup ID Prefix" + } + }, + "kopia": { + "title": "Kopia Settings", + "form": { + "url": "Kopia Server URL", + "fingerprint": "TLS Certificate Fingerprint", + "tags": "Backup Tags" + } + } + } + }, + "stats": { + "title": "Stats", + "page": { + "title": "Backup Configuration Stats", + "card": { + "title": "Backup Statistics" + }, + "period": { + "allTime": "All Time", + "today": "Today", + "week": "This Week", + "month": "This Month" + }, + "periodLabel": { + "allTime": "all time", + "today": "today", + "week": "this week", + "month": "this month" + }, + "stat": { + "total": "Total backups {period}", + "successful": "Successful backups {period}", + "failed": "Failed backups {period}", + "deleted": "Deleted backups {period}" + } + } + }, + "backups": { + "title": "Backups", + "page": { + "title": "Backup Configuration Backups", + "toast": { + "downloadStarted": "Download started." + } + } + }, + "locations": { + "title": "Locations", + "page": { + "title": "Backup Configuration Locations" + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Backup Configuration Nodes" + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Backup Configuration Servers" + } + } + } + }, + "mounts": { + "title": "Mounts", + "resourceName": "Mount", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Mount", + "titleUpdate": "Update Mount", + "alert": "Mounts are a powerful and potentially dangerous feature. Improper use can lead to data loss or security vulnerabilities (including container escapes). Make sure you understand the implications of using mounts before creating or updating them.", + "form": { + "source": "Source", + "target": "Target", + "readOnly": "Read Only", + "userMountable": "User Mountable" + }, + "modal": { + "delete": { + "title": "Confirm Mount Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "eggs": { + "title": "Eggs", + "page": { + "title": "Mount Eggs", + "toast": { + "added": "Mount Egg added.", + "removed": "Mount Egg deleted." + }, + "modal": { + "add": { + "title": "Add Mount Egg", + "form": { + "egg": "Egg" + } + }, + "remove": { + "title": "Confirm Mount Egg Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "nodes": { + "title": "Nodes", + "page": { + "title": "Mount Nodes", + "toast": { + "added": "Mount Node added.", + "removed": "Mount Node deleted." + }, + "modal": { + "add": { + "title": "Add Mount Node" + }, + "remove": { + "title": "Confirm Mount Node Removal", + "content": "Are you sure you want to remove the mount **{mount}** from **{name}**?" + } + } + } + }, + "servers": { + "title": "Servers", + "page": { + "title": "Mount Servers" + } + } + } + }, + "roles": { + "title": "Roles", + "resourceName": "Role", + "table": { + "columns": { + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + } + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Role", + "titleUpdate": "Update Role", + "alert": { + "impersonate": "This role has the `users.impersonate` permission, which allows users with this role to impersonate any other user, including administrators. Be cautious when assigning this permission to roles with less trusted users." + }, + "form": { + "requireTwoFactor": "Require Two Factor", + "requireTwoFactorDescription": "Require users with this role to use two factor authentication.", + "serverPermissions": "Server Permissions", + "adminPermissions": "Admin Permissions" + }, + "modal": { + "delete": { + "title": "Confirm Role Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "users": { + "title": "Users", + "page": { + "title": "Role Users" + } + } + } + }, + "activity": { + "title": "Activity" + } + }, + "server": { + "viewAdmin": { + "title": "Yönetici görünümü" + }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, + "console": { + "title": "Konsol", + "input": { + "placeholder": "Bir komut yazın...", + "ariaLabel": "Konsol komut girişi." + }, + "toast": { + "installCancelled": "Sunucu kurulumu iptal edildi.", + "transferCancelled": "Server transfer cancelled." + }, + "modal": { + "sshDetails": { + "title": "SSH Detayları", + "form": { + "command": "SSH Komutu" + }, + "launch": "Başlat" + } + }, + "notification": { + "suspended": "Your Server is currently suspended. No actions can be performed until the suspension is lifted.", + "suspendedAdmin": "This server is currently suspended. Since you are an administrator, you can still access the server, but actions are limited.", + "nodeMaintenance": "Sunucunuz şu anda bakımda olan bir node üzerinde bulunuyor.", + "transferring": "Sunucunuz şu anda başka bir node'a taşınıyor.", + "restoringBackup": "Sunucunuz şu anda bir yedekten geri yükleniyor. Lütfen bekleyin...", + "installing": "Sunucunuz şu anda kuruluyor. Lütfen bekleyin...", + "pendingRestart": "Your Server has pending changes that require a restart. Please restart your server to apply these changes." + }, + "message": { + "serverMarkedAs": "Sunucu {state} olarak işaretlendi...", + "installFailed": "Kurulum başarısız oldu.", + "installCompleted": "Kurulum başarıyla tamamlandı.", + "transferFailed": "Taşıma başarısız oldu.", + "transferCompleted": "Taşıma başarıyla tamamlandı. Sunucuya yeniden bağlanılıyor...", + "pullingImage": "Sunucunuz docker imajını çekiyor. Lütfen bekleyin...", + "pulling": "Çekiliyor", + "extracting": "Çıkartılıyor" + }, + "tooltip": { + "search": "Ara", + "sshDetails": "SSH Detayları", + "commandHistory": "Komut Geçmişi", + "decreaseFontSize": "Yazı Boyutunu Azalt", + "increaseFontSize": "Yazı Boyutunu Artır" + }, + "drawer": { + "commandHistory": { + "title": "Komut Geçmişi", + "detailTitle": "Komut Detayları", + "noCommands": "Komut bulunamadı.", + "copyButton": "Komutu Kopyala", + "sendButton": "Komutu Gönder", "commandSent": "Komut başarıyla gönderildi." } }, @@ -1115,6 +4009,17 @@ "button": { "accept": "EULA'yı Kabul Et" } + }, + "javaVersion": { + "title": "Unsupported Java Version", + "content": "This server is currently running an unsupported version of Java and cannot be started.", + "contentDetails": "Please select a supported Docker image from the list below to continue starting the server.", + "toast": { + "updated": "Docker image updated successfully." + }, + "button": { + "update": "Update Docker Image" + } } }, "details": { @@ -1149,15 +4054,25 @@ "files": { "title": "Dosyalar", "titleEditorViewing": "{file} Görüntüleniyor", + "titleEditorPlaying": "Playing {file}", "titleEditorEditing": "{file} Düzenleniyor", "titleEditorNew": "Yeni Dosya", + "titleDiffRevisionVsCurrent": "{file} - Revision #{revision} vs Current", + "titleDiffRevisionVsRevision": "{file} - Revision #{previousRevision} vs #{revision}", "table": { "columns": { "modified": "Değiştirilme" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "Yeni", + "connect": "Connect", + "connectSftp": "via SFTP", + "connectVscode": "via VS Code", "openInNewWindow": "Yeni Pencerede Aç", "rename": "Yeniden Adlandır", "copy": "Kopyala", @@ -1195,7 +4110,9 @@ "copying": "{path} -> {destination} kopyalanıyor", "copyingMany": "{files} kopyalanıyor", "receivingRemote": "Uzak sunucudan {files} alınıyor", - "sendingRemote": "{files} uzak sunucuya gönderiliyor" + "sendingRemote": "{files} uzak sunucuya gönderiliyor", + "exportingBackup": "Exporting backup to {destination}", + "cancelAllOperations": "Cancel all operations" }, "dropzone": { "title": "Yüklemek için dosyaları buraya bırakın", @@ -1206,13 +4123,18 @@ "preferPhysicalSize": "Mantıksal boyut yerine fiziksel boyutu göster", "editorMinimap": "Dosya Minimap'ini Göster", "editorLineOverflow": "Satır Taşmasını Kaydır", + "editorFontSize": "Editor Font Size", + "vscodeUriScheme": "VS Code URI Scheme", "imageViewerSmoothing": "Görüntü Yumuşatma (Anti-Aliasing)" }, "toast": { "operationCancelled": "İşlem iptal edildi", + "allOperationsCancelled": "All operations have been cancelled.", "copyingStarted": "{files} kopyalanmaya başlandı.", "filesCouldNotBeMoved": "Dosyalar taşınamadı.", "filesMoved": "{files} taşındı.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "İndirme başlatıldı.", "filesDeleted": "Dosyalar silindi.", "archiveCreationStarted": "Arşiv oluşturma başladı.", @@ -1221,14 +4143,58 @@ "filePullingStarted": "Dosya çekme işlemi başladı.", "fileRenamed": "Dosya yeniden adlandırıldı.", "fileCouldNotBeRenamed": "Dosya yeniden adlandırılamadı.", + "filesRenamed": "{files} renamed.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "İzinler güncellendi.", - "fileSaved": "Dosya kaydedildi." + "permissionsUpdatedMany": "Permissions have been updated for {files}.", + "permissionsCouldNotBeUpdated": "Permissions could not be updated.", + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "Dosya kaydedildi.", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." + }, + "tooltip": { + "fileHistory": "File History", + "collabEditing": "{user} is editing this file", + "largestDirectories": "Analyze directory sizes", + "dragToMove": "Drag to move", + "back": "Back {seconds} seconds", + "forward": "Forward {seconds} seconds", + "play": "Play", + "pause": "Pause", + "mute": "Mute", + "unmute": "Unmute" + }, + "drawer": { + "revisions": { + "title": "File History", + "noRevisions": "No revisions found for this file.", + "restored": "Revision restored into editor.", + "badge": { + "fullSnapshot": "Full Snapshot" + }, + "tooltip": { + "restore": "Restore this revision into the editor", + "viewDiff": "View diff against current file", + "compareToPrevious": "Compare to previous revision" + }, + "diff": { + "original": "Revision", + "current": "Current" + } + } }, "modal": { "unsavedChanges": { "title": "Kaydedilmemiş Değişiklikler", "content": "Dosya editöründe kaydedilmemiş değişiklikleriniz var. Sayfadan ayrılmak istediğinize emin misiniz? Ayrılırsanız değişiklikleriniz kaybolacaktır." }, + "draftRestore": { + "title": "Restore Draft", + "content": "A draft of this file was found in your browser. Would you like to restore it?", + "contentHashMismatch": "The file has been modified on the server since this draft was saved. Restoring the draft may overwrite those changes." + }, "createArchive": { "title": "Arşiv Oluştur", "form": { @@ -1281,6 +4247,9 @@ }, "filePermissions": { "title": "Dosya İzinleri", + "form": { + "recursive": "Apply changes recursively to all files and subdirectories within this directory" + }, "symbolic": "Sembolik:", "octal": "Sekizlik (Octal):", "owner": "Sahip", @@ -1294,6 +4263,66 @@ "renameFile": { "title": "Dosyayı Yeniden Adlandır" }, + "massRename": { + "title": "Rename Files", + "find": "Find", + "findPlaceholder": "Text to find", + "replace": "Replace with", + "replacePlaceholder": "Replacement text", + "scope": "Apply to", + "scopeName": "Name", + "scopeExtension": "Extension", + "scopeFull": "Full name", + "section": { + "matchOptions": "Match options", + "affixes": "Prefix & suffix", + "caseConversion": "Case conversion", + "numbering": "Numbering" + }, + "affix": { + "prefix": "Prefix", + "suffix": "Suffix", + "help": "Both may include {token} for the number; a suffix appends a count to every name." + }, + "option": { + "regex": "Use regular expression", + "regexDescription": "Treat the find text as a regex; reference groups with $1, $2 in the replacement.", + "caseSensitive": "Case sensitive", + "allOccurrences": "Replace all occurrences" + }, + "case": { + "label": "Convert case", + "none": "No change", + "lower": "lowercase", + "upper": "UPPERCASE", + "title": "Title Case", + "capitalize": "Capitalize" + }, + "numbering": { + "enable": "Enable numbering", + "help": "Insert {token} in the find, replace, prefix, or suffix text where the number should appear.", + "start": "Start at", + "step": "Step", + "padding": "Minimum digits" + }, + "preview": { + "title": "Preview", + "original": "Original", + "newName": "New name", + "unchanged": "Unchanged", + "conflict": "Name already in use", + "duplicate": "Duplicate target", + "invalid": "Invalid name", + "invalidRegex": "Invalid regular expression", + "empty": "No files selected." + }, + "summary": "{changed} of {total} will be renamed", + "conflictWarning": "Resolve the highlighted name conflicts before renaming." + }, + "largestDirectories": { + "title": "Largest Directories", + "empty": "No directories found." + }, "searchFiles": { "title": "Dosya Ara", "placeholder": "Dosyaları ara...", @@ -1329,6 +4358,10 @@ "databases": { "title": "Veritabanları", "subtitle": "Maksimum {max} veritabanından {current} tanesi oluşturuldu.", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "Bu sunucu {max} veritabanı ile sınırlıdır." }, @@ -1343,6 +4376,165 @@ "form": { "databaseName": "Veritabanı Adı" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "Veritabanı Oluştur", @@ -1350,7 +4542,8 @@ "created": "Veritabanı oluşturuldu." }, "form": { - "noHostsFound": "Host bulunamadı" + "noHostsFound": "Host bulunamadı", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -1402,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "Tetikleyici Ekle", "addCondition": "Koşul Ekle", "addStep": "Adım Ekle", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "İlk Adımı Oluştur", "addOutput": "Çıktı Ekle", "addFile": "Dosya Ekle", @@ -1414,6 +4612,7 @@ "imported": "Zamanlayıcı içe aktarıldı.", "created": "Zamanlayıcı oluşturuldu.", "updated": "Zamanlayıcı güncellendi.", + "duplicated": "Schedule duplicated.", "deleted": "Zamanlayıcı silindi.", "triggered": "Zamanlayıcı tetiklendi.", "exported": "Zamanlayıcı dışa aktarıldı.", @@ -1421,6 +4620,7 @@ "step": { "created": "Zamanlayıcı adımı oluşturuldu.", "updated": "Zamanlayıcı adımı güncellendi.", + "duplicated": "Schedule step duplicated.", "deleted": "Zamanlayıcı adımı silindi." } }, @@ -1430,12 +4630,21 @@ "and": "VE (Hepsi doğru olmalı)", "or": "VEYA (Herhangi biri doğru olmalı)", "not": "DEĞİL (Doğru olmamalı)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "Değişken Mevcut", "variableContains": "Değişken Şunu İçeriyor", "variableEquals": "Değişken Şuna Eşit", "variableStartsWith": "Değişken Şununla Başlıyor", "variableEndsWith": "Değişken Şununla Bitiyor" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "Küçüktür", "smallerThanOrEqual": "Küçük eşittir", @@ -1451,6 +4660,9 @@ "updateSchedule": { "title": "Zamanlayıcıyı Güncelle" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "Zamanlayıcı Silme Onayı", "content": "{name} zamanlayıcısını bu sunucudan silmek istediğinize emin misiniz?" @@ -1464,12 +4676,19 @@ "deleteStep": { "title": "Zamanlayıcı Adımı Silme Onayı", "content": "Bu zamanlayıcı adımını silmek istediğinize emin misiniz?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "Çalışıyor" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "Eylemler", "conditions": "Koşullar", @@ -1505,6 +4724,7 @@ "contains": "İçerir", "startsWith": "Başlar", "endsWith": "Biter", + "metric": "Metric", "allMustBeTrue": "Tüm koşullar doğru olmalıdır:", "anyMustBeTrue": "Herhangi bir koşul doğru olmalıdır:", "mustNotBeTrue": "Koşul doğru olmamalıdır:" @@ -1518,11 +4738,27 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "Cron Zamanlaması" + "cronSchedule": "Cron Zamanlaması", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" + }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "{schedule} Cron aralığında, Sonraki çalışma: {timestamp} - Son çalışma: {lastTimestamp}." - } + }, + "invalidCron": "Invalid cron expression" }, "powerAction": { "title": "Güç Eylemi", @@ -1545,6 +4781,25 @@ "content": "Yedek `{status}` durumuna ulaştığında." } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "Konsol Satırı", "card": { @@ -1569,8 +4824,20 @@ "title": "Adım Yapılandırılmadı", "description": "bu zamanlayıcının henüz hiç adımı yok. Başlamak için bazı eylemler ekleyin." }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "Uyut/Beklet (Sleep)", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "Süre (milisaniye)" }, @@ -1580,12 +4847,62 @@ }, "ensure": { "title": "Doğrula (Ensure)", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "Bir koşulun eşleştiğini doğrula" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "Formatla", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "Format Dizgesi", "formatStringDescription": "Biçim dizesi. Değişkenler {wrapper} içine sarılarak eklenebilir." @@ -1596,6 +4913,7 @@ }, "matchRegex": { "title": "Regex Eşleştir", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "Girdi", "regex": "Regex", @@ -1608,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "Konsol Satırını Bekle", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "Zaman aşımı (milisaniye)" }, @@ -1622,6 +4941,7 @@ }, "sendCommand": { "title": "Komut Gönder", + "description": "Send a command to the server console.", "renderer": { "compact": "{command} komutunu çalıştır", "detail": { @@ -1631,6 +4951,7 @@ }, "sendPower": { "title": "Güç Sinyali Gönder", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "{action} işlemini yap", "detail": { @@ -1640,19 +4961,75 @@ }, "createBackup": { "title": "Yedek Oluştur", + "description": "Create a backup of the server files.", "form": { "backupName": "Yedek Adı" }, "renderer": { "compact": "{name} yedeğini oluştur", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "Yedek Adı: {name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "Yoksayılan Dosyalar: {files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "Dizin Oluştur", + "description": "Create a new folder in the server files.", "renderer": { "compact": "{root} içinde {name} oluştur", "detail": { @@ -1663,6 +5040,7 @@ }, "writeFile": { "title": "Dosya Yaz", + "description": "Write or append text to a file.", "form": { "content": "İçerik", "appendToFile": "Dosyanın Sonuna Ekle" @@ -1677,6 +5055,7 @@ }, "copyFile": { "title": "Dosyayı Kopyala", + "description": "Copy a file to a new location.", "form": { "sourceFile": "Kaynak Dosya" }, @@ -1690,6 +5069,7 @@ }, "deleteFiles": { "title": "Dosyaları Sil", + "description": "Delete files or folders.", "form": { "filesToDelete": "Silinecek Dosyalar" }, @@ -1703,6 +5083,7 @@ }, "renameFiles": { "title": "Dosyaları Yeniden Adlandır", + "description": "Rename or move files.", "form": { "files": "Dosyalar", "from": "Kaynak", @@ -1718,6 +5099,7 @@ }, "compressFiles": { "title": "Dosyaları Sıkıştır", + "description": "Compress files into an archive.", "form": { "filesToCompress": "Sıkıştırılacak Dosyalar" }, @@ -1733,6 +5115,7 @@ }, "decompressFile": { "title": "Arşivi Aç", + "description": "Extract an archive into a folder.", "form": { "file": "Dosya" }, @@ -1746,6 +5129,7 @@ }, "updateStartupVariable": { "title": "Başlangıç Değişkenini Güncelle", + "description": "Change the value of a startup variable.", "renderer": { "compact": "{variable} değişkenini {value} yap", "detail": { @@ -1756,6 +5140,7 @@ }, "updateStartupCommand": { "title": "Başlangıç Komutunu Güncelle", + "description": "Change the command used to start the server.", "renderer": { "compact": "{command} olarak ayarla", "detail": { @@ -1765,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "Docker İmajını Güncelle", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "{image} olarak ayarla", "detail": { @@ -1776,6 +5162,10 @@ }, "subusers": { "title": "Alt Kullanıcılar", + "subtitle": "{current} of {max} maximum subusers created.", + "tooltip": { + "limitReached": "This server is limited to {max} subusers." + }, "table": { "columns": { "twoFactorEnabled": "2FA Etkin", @@ -1791,7 +5181,8 @@ }, "form": { "emailPlaceholder": "Alt kullanıcının kaydedileceği e-posta adresini girin.", - "permissions": "Yetkiler" + "permissions": "Yetkiler", + "ignoredFilesDescription": "Files and directories matching these patterns will be hidden from this subuser. Uses gitignore-style glob patterns (e.g. `*.env`, `secrets/`). Prefix a pattern with `!` to un-hide a path that a broader pattern would otherwise exclude." } }, "updateSubuser": { @@ -1822,16 +5213,25 @@ "locked": "Kilitli?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "Göz At" + "browse": "Göz At", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "İndirme başlatıldı.", - "restoringBackup": "Yedek geri yükleniyor..." + "restoringBackup": "Yedek geri yükleniyor...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "Yedek Oluştur", + "noGroup": "No group", "toast": { "created": "Yedek oluşturuldu." } @@ -1845,13 +5245,61 @@ "restoreBackup": { "title": "Yedeği Geri Yükle" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "Yedek Silme Onayı", "content": "**{name}** yedeğini bu sunucudan silmek istediğinize emin misiniz?", "toast": { + "started": "Backup deletion started.", "deleted": "Yedek silindi." } + }, + "viewMetadata": { + "title": "Backup Metadata" + } + } + }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." } }, "network": { @@ -1893,7 +5341,14 @@ "dockerImageUpdated": "Docker imajı güncellendi.", "variablesUpdated": "Değişkenler güncellendi." }, - "noVariables": "Bu sunucu için başlangıç değişkeni bulunamadı." + "modal": { + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your startup variables. Are you sure you want to leave this page? If you leave, your changes will be lost." + } + }, + "noVariables": "Bu sunucu için başlangıç değişkeni bulunamadı.", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "Bağlama Noktaları (Mounts)", @@ -1979,7 +5434,10 @@ } }, "activity": { - "title": "Aktivite" + "title": "Aktivite", + "button": { + "clearUserFilter": "Clear User Filter" + } } } } diff --git a/frontend/public/translations/vi.json b/frontend/public/translations/vi.json index 5d80b8c04..7b82d8ced 100644 --- a/frontend/public/translations/vi.json +++ b/frontend/public/translations/vi.json @@ -80,6 +80,14 @@ "many": "{count} Egg", "other": "{count} Egg" }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, "shortcut": { "zero": "{count} Phím Tắt", "one": "{count} Phím Tắt", @@ -158,7 +166,8 @@ "setPrimary": "Đặt làm Chính", "unsetPrimary": "Bỏ Chính", "leavePage": "Rời Khỏi Trang", - "viewDocumentation": "Xem Tài Liệu" + "viewDocumentation": "Xem Tài Liệu", + "undo": "Undo" }, "alert": { "error": "Lỗi", @@ -206,6 +215,7 @@ "backupOnDifferentNode": "Bản sao lưu này nằm trên một node khác với máy chủ. Không thể xem từ API Client." }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "Tên", "newName": "Tên mới", "description": "Mô tả", @@ -237,6 +247,7 @@ "language": "Ngôn ngữ", "identifier": "Mã Định Danh", "enabled": "Bật", + "disabled": "Disabled", "title": "Tiêu đề", "content": "Nội dung", "backupConfiguration": "Cấu Hình Sao Lưu", @@ -284,6 +295,7 @@ "value": "Giá trị", "eggs": "Eggs", "ignoredFiles": "Tệp Bị Bỏ Qua", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "Mật Khẩu Bảng Điều Khiển Của Bạn", "deploymentEnabled": "Bật Triển Khai", "maintenanceEnabled": "Bật Bảo Trì", @@ -327,7 +339,9 @@ "server": "Máy chủ", "address": "Địa chỉ", "eggs": "Egg", - "template": "Mẫu" + "template": "Mẫu", + "version": "Version", + "host": "Host" } }, "tabs": { @@ -343,7 +357,10 @@ "installed": "Đã cài đặt" }, "label": { - "noSubdirectories": "Không có thư mục con" + "noSubdirectories": "Không có thư mục con", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" }, "server": { "noAllocation": "Không có địa chỉ ip.", @@ -492,7 +509,11 @@ "stopImpersonating": "Dừng mạo danh", "openInVirtualWindow": "Mở trong cửa sổ ảo", "openInPopup": "Mở trong cửa sổ pop-up", - "openInNewTab": "Mở trong tab mới" + "openInNewTab": "Mở trong tab mới", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { @@ -506,6 +527,9 @@ "selectInput": { "noResults": "Không tìm thấy kết quả." }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "Bạn không có quyền để lưu.", @@ -587,6 +611,7 @@ "toast": { "backupCompleted": "Sao lưu hoàn tất", "backupFailed": "Sao lưu thất bại.", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "Khôi phục sao lưu hoàn tất.", "installCompleted": "Cài đặt máy chủ hoàn tất.", "installFailed": "Cài đặt máy chủ thất bại.", @@ -623,6 +648,8 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "Đang Chờ: {file}", "uploading": "Đang Tải Lên: {file}", "uploadingFolder": "Đang Tải Lên Thư Mục: {folder} ({files})", @@ -632,7 +659,10 @@ "uploading": "Đang tải lên {files}...", "cancelledFile": "Đã hủy `{file}`.", "cancelledFolder": "Đã hủy tải lên `{folder}` ({files}).", - "cancelledAll": "Tất cả các tải lên đã bị hủy." + "cancelledAll": "Tất cả các tải lên đã bị hủy.", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -1274,6 +1304,12 @@ "toast": { "removed": "Đoạn lệnh đã được xóa." } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -2172,7 +2208,10 @@ "form": { "urlDescription": "Được sử dụng để liên lạc nội bộ với node.", "publicUrlDescription": "Được sử dụng cho kết nối websocket và tải xuống.", - "backupConfigurationPlaceholder": "Kế Thừa Từ Vị Trí" + "backupConfigurationPlaceholder": "Kế Thừa Từ Vị Trí", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." }, "button": { "resetToken": "Đặt Lại Token", @@ -2396,7 +2435,11 @@ } }, "delete": { - "title": "Xác Nhận Xóa Sao Lưu Node" + "title": "Xác Nhận Xóa Sao Lưu Node", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2697,6 +2740,17 @@ } } }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, "logs": { "title": "Nhật Ký", "page": { @@ -2788,6 +2842,9 @@ "deleteBackups": "Bạn có muốn xóa sao lưu của máy chủ này?", "confirmServerName": "Xác Nhận Tên Máy Chủ", "confirmServerNamePlaceholder": "Tên Máy Chủ" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." } } } @@ -2946,13 +3003,17 @@ "toast": { "created": "Biến egg đã được tạo.", "updated": "Biến egg đã được cập nhật.", - "deleted": "Biến egg đã được xóa." + "deleted": "Biến egg đã được xóa.", + "duplicated": "Egg variable duplicated." }, "modal": { "delete": { "title": "Xác Nhận Xóa Biến Egg", "content": "Bạn có chắc muốn xóa **{variable}** không?", "emptyVariable": "biến trống này" + }, + "duplicate": { + "title": "Duplicate Egg Variable" } } } @@ -3161,7 +3222,11 @@ "modal": { "delete": { "title": "Xác Nhận Xóa Máy Chủ CSDL", - "content": "Bạn có chắc muốn xóa **{name}** không?" + "content": "Bạn có chắc muốn xóa **{name}** không?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -3169,7 +3234,20 @@ "databases": { "title": "Cơ Sở Dữ Liệu", "page": { - "title": "Cơ Sở Dữ Liệu Máy Chủ" + "title": "Cơ Sở Dữ Liệu Máy Chủ", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } } } } @@ -3199,7 +3277,11 @@ "modal": { "delete": { "title": "Xác nhận Xóa Máy Chủ Agent Cơ Sở Dữ Liệu", - "content": "Bạn có chắc chắn muốn xóa **{name}** không?" + "content": "Bạn có chắc chắn muốn xóa **{name}** không?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -3207,7 +3289,32 @@ "instances": { "title": "Các Phiên Bản", "page": { - "title": "Các Phiên Bản" + "title": "Các Phiên Bản", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } } }, "configuration": { @@ -3348,6 +3455,7 @@ "toast": { "exported": "Đã xuất Mẫu Agent Cơ Sở Dữ Liệu." }, + "version": "Version {version}", "form": { "dockerImages": "Hình Ảnh Docker", "env": "Biến Môi Trường", @@ -3382,7 +3490,22 @@ "instances": { "title": "Các Phiên Bản", "page": { - "title": "Các Phiên Bản" + "title": "Các Phiên Bản", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } } } } @@ -3460,10 +3583,27 @@ "title": "Ánh Xạ", "page": { "title": "Ánh Xạ Nhà Cung Cấp OAuth", + "table": { + "columns": { + "matcher": "Matcher" + } + }, "enum": { "mappingType": { "role": "Vai Trò", "serverSubuser": "Người Dùng Phụ Máy Chủ" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" } }, "toast": { @@ -3471,8 +3611,28 @@ "updated": "Ánh xạ nhà cung cấp OAuth đã được cập nhật.", "deleted": "Ánh xạ nhà cung cấp OAuth đã được xóa." }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "Phạm Vi", "scopesDescription": "Phạm vi OAuth cần thiết để ánh xạ này áp dụng.", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", "mappingType": "Loại Ánh Xạ", "role": "Vai Trò", "permissions": "Quyền" @@ -3493,6 +3653,25 @@ }, "users": { "title": "Người Dùng", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, "page": { "title": "Người Dùng Nhà Cung Cấp OAuth", "table": { @@ -3954,6 +4133,8 @@ "copyingStarted": "{files} bắt đầu sao chép.", "filesCouldNotBeMoved": "Tệp không thể được di chuyển.", "filesMoved": "{files} đã được di chuyển.", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "Tải xuống đã bắt đầu.", "filesDeleted": "Tệp đã được xóa.", "archiveCreationStarted": "Tạo kho lưu trữ đã bắt đầu.", @@ -3963,9 +4144,13 @@ "fileRenamed": "Tệp đã được đổi tên.", "fileCouldNotBeRenamed": "Tệp không thể được đổi tên.", "filesRenamed": "{files} đã được đổi tên.", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "Quyền đã được cập nhật.", "permissionsUpdatedMany": "Quyền đã được cập nhật cho {files}.", "permissionsCouldNotBeUpdated": "Không thể cập nhật quyền.", + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", "fileSaved": "Tệp đã được lưu.", "collabSaveTimeout": "Không thể lưu tệp, daemon không phản hồi kịp thời." }, @@ -4194,6 +4379,10 @@ "instance": { "title": "Cơ Sở Dữ Liệu Được Quản Lý", "subtitle": "Đã tạo {current} cơ sở dữ liệu được quản lý.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, "tooltip": { "limitReached": "Máy chủ này bị giới hạn ở {max} cơ sở dữ liệu được quản lý." }, @@ -4242,6 +4431,10 @@ "file": "Tệp Sao Lưu (Dump File)", "wipe": "Xóa dữ liệu hiện có trước khi nhập" } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." } }, "table": { @@ -4253,7 +4446,8 @@ "created": "Đã tạo cơ sở dữ liệu.", "deleted": "Đã xóa cơ sở dữ liệu.", "imported": "Đã hoàn thành nhập cơ sở dữ liệu.", - "passwordRotated": "Mật khẩu đã được xoay vòng." + "passwordRotated": "Mật khẩu đã được xoay vòng.", + "recreated": "Database recreated." } }, "users": { @@ -4314,6 +4508,13 @@ "updated": "Đã cập nhật cơ sở dữ liệu được quản lý." } }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, "deleteDatabaseInstance": { "title": "Xác nhận Xóa Cơ Sở Dữ Liệu Được Quản Lý", "content": "Xóa cơ sở dữ liệu được quản lý là một hành động vĩnh viễn và không thể hoàn tác. Hành động này sẽ xóa vĩnh viễn cơ sở dữ liệu **{name}** và loại bỏ tất cả dữ liệu liên quan.", @@ -4324,8 +4525,13 @@ "credentials": { "title": "Thông Tin Đăng Nhập Cơ Sở Dữ Liệu", "form": { - "database": "Cơ sở dữ liệu" + "database": "Cơ sở dữ liệu", + "jdbcConnectionString": "JDBC Connection String" } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." } } }, @@ -4336,7 +4542,8 @@ "created": "Cơ sở dữ liệu đã được tạo." }, "form": { - "noHostsFound": "Không tìm thấy máy chủ nào" + "noHostsFound": "Không tìm thấy máy chủ nào", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -4775,8 +4982,10 @@ "backupSelector": "Bản Sao Lưu Cần Khôi Phục", "selector": { "latest": "Bản Sao Lưu Mới Nhất", + "oldest": "Oldest Backup", "uuid": "Bản Sao Lưu Cụ Thể (UUID)", - "name": "Theo Tên (khớp mới nhất)" + "name": "Theo Tên (khớp mới nhất)", + "oldestFirst": "Match the oldest backup instead of the newest" }, "backupUuid": "UUID Sao Lưu", "backupName": "Tên Bản Sao Lưu", @@ -4787,8 +4996,10 @@ "renderer": { "compact": "Khôi phục bản sao lưu {backup}", "compactLatest": "Khôi phục bản sao lưu mới nhất", + "compactOldest": "Restore the oldest backup", "detail": { "backupLatest": "Bản sao lưu: Bản sao lưu thành công mới nhất", + "backupOldest": "Backup: Oldest successful backup", "backupUuid": "UUID Sao Lưu: {uuid}", "backupName": "Tên Bản Sao Lưu: {name}", "truncateDirectory": "Xóa tất cả tệp trước: {value}", @@ -4796,6 +5007,26 @@ } } }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "Tạo Thư Mục", "description": "Tạo một thư mục mới trong các tệp máy chủ.", @@ -4982,6 +5213,10 @@ "locked": "Khóa?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { "browse": "Duyệt", "exportToFiles": "Xuất ra Tệp", @@ -5017,6 +5252,7 @@ "title": "Xác Nhận Xóa Sao Lưu", "content": "Bạn có chắc muốn xóa **{name}** khỏi máy chủ này không?", "toast": { + "started": "Backup deletion started.", "deleted": "Sao lưu đã được xóa." } }, diff --git a/frontend/public/translations/zh.json b/frontend/public/translations/zh.json index cf6dcbf42..1c32163a9 100644 --- a/frontend/public/translations/zh.json +++ b/frontend/public/translations/zh.json @@ -56,6 +56,14 @@ "many": "{count} 個節點", "other": "{count} 個節點" }, + "databaseAgentHost": { + "zero": "{count} Database Agent Hosts", + "one": "{count} Database Agent Host", + "two": "{count} Database Agent Hosts", + "few": "{count} Database Agent Hosts", + "many": "{count} Database Agent Hosts", + "other": "{count} Database Agent Hosts" + }, "allocation": { "zero": "{count} 個節點分配", "one": "{count} 個節點分配", @@ -72,6 +80,14 @@ "many": "{count} 個 Egg", "other": "{count} 個 Egg" }, + "instance": { + "zero": "{count} Instances", + "one": "{count} Instance", + "two": "{count} Instances", + "few": "{count} Instances", + "many": "{count} Instances", + "other": "{count} Instances" + }, "shortcut": { "zero": "{count} 個快捷鍵", "one": "{count} 個快捷鍵", @@ -87,6 +103,22 @@ "few": "{count} 行", "many": "{count} 行", "other": "{count} 行" + }, + "backup": { + "zero": "{count} Backups", + "one": "{count} Backup", + "two": "{count} Backups", + "few": "{count} Backups", + "many": "{count} Backups", + "other": "{count} Backups" + }, + "day": { + "zero": "{count} Days", + "one": "{count} Day", + "two": "{count} Days", + "few": "{count} Days", + "many": "{count} Days", + "other": "{count} Days" } }, "translations": { @@ -97,6 +129,7 @@ "save": "儲存", "saveAndStay": "儲存並停留", "edit": "編輯", + "duplicate": "Duplicate", "delete": "刪除", "remove": "移除", "enable": "啟用", @@ -133,7 +166,8 @@ "setPrimary": "設為主要", "unsetPrimary": "取消主要", "leavePage": "離開頁面", - "viewDocumentation": "檢視文件" + "viewDocumentation": "檢視文件", + "undo": "Undo" }, "alert": { "error": "錯誤", @@ -147,6 +181,31 @@ "input": { "search": "搜尋..." }, + "elements": { + "jsonInput": { + "enum": { + "type": { + "string": "String", + "number": "Number", + "boolean": "Boolean", + "object": "Object", + "array": "Array", + "null": "Null" + } + }, + "textMode": "Text", + "jsonMode": "JSON", + "invalidJson": "Invalid JSON" + } + }, + "modal": { + "duplicate": { + "title": "Duplicate {resource}" + } + }, + "toast": { + "duplicated": "{resource} duplicated." + }, "tooltip": { "resetToDefault": "重設為預設值", "edit": "編輯", @@ -156,7 +215,9 @@ "backupOnDifferentNode": "此備份位於與伺服器不同的節點上,無法從客戶端 API 檢視。" }, "form": { + "force": "Do you want to execute this deletion forcefully?", "name": "名稱", + "newName": "New Name", "description": "描述", "author": "作者", "type": "類型", @@ -186,6 +247,7 @@ "language": "語言", "identifier": "識別碼", "enabled": "已啟用", + "disabled": "Disabled", "title": "標題", "content": "內容", "backupConfiguration": "備份設定", @@ -212,11 +274,13 @@ "nest": "Nest", "lines": "行數", "databaseHost": "資料庫主機", + "databaseAgentHost": "Database Agent Host", "timezone": "時區", "timezoneSystem": "系統", "protocol": "通訊協定", "powerAction": "電源動作", "destination": "目的地", + "destinationDirectory": "Destination Directory", "directoryName": "目錄名稱", "locked": "已鎖定", "portRanges": "連接埠範圍", @@ -231,6 +295,7 @@ "value": "值", "eggs": "Egg", "ignoredFiles": "忽略的檔案", + "previewIgnoredFiles": "Preview ignored files", "yourControlPanelPassword": "你的控制面板密碼", "deploymentEnabled": "部署已啟用", "maintenanceEnabled": "維護已啟用", @@ -253,6 +318,7 @@ "size": "大小", "lastUsed": "上次使用", "created": "已建立", + "updated": "Updated", "actor": "操作者", "event": "事件", "ip": "IP", @@ -272,7 +338,10 @@ "files": "檔案", "server": "伺服器", "address": "位址", - "eggs": "Egg" + "eggs": "Egg", + "template": "Template", + "version": "Version", + "host": "Host" } }, "tabs": { @@ -287,6 +356,12 @@ "failed": "失敗", "installed": "已安裝" }, + "label": { + "noSubdirectories": "No subdirectories", + "emptyDirectory": "This directory is empty", + "ignored": "Ignored", + "showingFirstEntries": "Showing the first {count} entries" + }, "server": { "noAllocation": "無分配", "state": { @@ -339,6 +414,12 @@ "stopped": "已停止", "restarted": "已重新啟動", "killed": "已強制終止" + }, + "compressionLevel": { + "bestSpeed": "Best Speed", + "goodSpeed": "Good Speed", + "goodCompression": "Good Compression", + "bestCompression": "Best Compression" } }, "unit": { @@ -419,7 +500,8 @@ "container": { "alert": { "impersonating": "你目前正在模擬某位使用者的身分。請注意,你的操作可能會影響被模擬使用者的帳戶。若要離開模擬身分模式,請點選左下角的「停止模擬身分」按鈕。" - } + }, + "connectedTo": "Connected to {name}" }, "sidebar": { "button": { @@ -427,7 +509,11 @@ "stopImpersonating": "停止模擬身分", "openInVirtualWindow": "在虛擬視窗中開啟", "openInPopup": "在彈出視窗中開啟", - "openInNewTab": "在新分頁中開啟" + "openInNewTab": "在新分頁中開啟", + "theme": "Theme", + "themeAuto": "Auto", + "themeDark": "Dark", + "themeLight": "Light" } }, "permissionSelector": { @@ -441,6 +527,9 @@ "selectInput": { "noResults": "找不到結果。" }, + "serverSelect": { + "showOtherUsersServers": "Show other user's servers" + }, "can": { "tooltip": { "cantSave": "你沒有儲存權限。", @@ -454,6 +543,9 @@ "deleted": "已刪除 {resource}。" } }, + "formEngine": { + "advancedMode": "Advanced mode" + }, "activityInfoButton": { "modal": { "info": { @@ -497,7 +589,10 @@ "scheduleDynamicInput": { "none": "無", "variable": "變數", - "enterVariable": "請輸入要評估的變數名稱。" + "enterVariable": "請輸入要評估的變數名稱。", + "useVariable": "Use a variable instead of plain text", + "usePlainText": "Use plain text instead of a variable", + "optionalPlaceholder": "None (optional)" }, "serverWebsocket": { "error": { @@ -516,6 +611,7 @@ "toast": { "backupCompleted": "備份已成功完成。", "backupFailed": "備份失敗。", + "backupDeleteFailed": "Backup deletion failed.", "backupRestoreCompleted": "備份還原已成功完成。", "installCompleted": "伺服器安裝已成功完成。", "installFailed": "伺服器安裝失敗。", @@ -534,6 +630,7 @@ }, "copying": { "completed": "已在 {time} 內將 `{path}` 複製到 `{destination}`。", + "completedMany": "Copied `{path}` to `{destination}` ({files}) in {time}.", "failed": "無法將 `{path}` 複製到 `{destination}`:\n{error}" }, "copyingMany": { @@ -551,6 +648,8 @@ } }, "fileUpload": { + "title": "Uploading {files}", + "adminAssets": "Admin Assets", "waiting": "等待中:{file}", "uploading": "上傳中:{file}", "uploadingFolder": "正在上傳資料夾:{folder}({files})", @@ -560,7 +659,10 @@ "uploading": "已開始上傳 {files}...", "cancelledFile": "已成功取消上傳 `{file}`。", "cancelledFolder": "已成功取消上傳 `{folder}`({files})。", - "cancelledAll": "所有上傳都已取消。" + "cancelledAll": "所有上傳都已取消。", + "completedServer": "Finished uploading {files} to `{server}`.", + "completedAssets": "Finished uploading {files} to the admin assets.", + "showFiles": "Show files" } } }, @@ -1202,6 +1304,12 @@ "toast": { "removed": "指令片段已移除。" } + }, + "duplicateCommandSnippet": { + "title": "Duplicate Command Snippet", + "toast": { + "duplicated": "Command snippet duplicated." + } } } }, @@ -1268,6 +1376,12 @@ "toast": { "removed": "API 金鑰已移除。" } + }, + "apiKeyToken": { + "titleCreated": "API Key Created", + "titleRecreated": "API Key Recreated", + "descriptionCreated": "Your new API key has been created. Make sure to copy it now, as it will not be shown again.", + "descriptionRecreated": "Your API key has been recreated. Make sure to copy the new key now, as it will not be shown again." } }, "form": { @@ -1376,7 +1490,8 @@ "panelVersion": "面板版本", "versionHistory": "版本歷史", "outdatedExtensions": "過期的擴充功能", - "outdatedNodes": "過期的節點" + "outdatedNodes": "過期的節點", + "outdatedDatabaseAgentHosts": "Outdated Database Agent Hosts" }, "panelVersion": "你的面板目前執行版本 `{current}`,最新可用版本為 `{latest}`。", "unknown": "未知", @@ -1394,6 +1509,8 @@ "noChangelog": "無變更紀錄", "nodesUpToDate": "所有節點似乎都是最新版本。({failed} 個檢查失敗)", "nodesOutdated": "部分節點已過期,最新可用版本為 `{latest}`。({outdated} 個過期,{failed} 個檢查失敗)", + "databaseAgentHostsUpToDate": "Seems like all database agent hosts are up to date. ({failed} failed to check)", + "databaseAgentHostsOutdated": "Some database agent hosts are outdated, the latest available version is `{latest}`. ({outdated} outdated, {failed} failed to check)", "table": { "version": "版本", "installed": "已安裝", @@ -1642,6 +1759,9 @@ "maxFileManagerContentSearchSize": "檔案管理器最大內容搜尋大小", "maxFileManagerSearchResults": "檔案管理器最大搜尋結果數", "maxSubuserCount": "最大子使用者數量", + "maxBackupGroupCount": "Max Backup Groups per Server", + "maxDatabaseInstanceDatabaseCount": "Max Databases per Database Instance", + "maxDatabaseInstanceUserCount": "Max Users per Database Instance", "allowOverwritingCustomDockerImage": "允許覆寫自訂 Docker 映像檔", "allowOverwritingCustomDockerImageDescription": "若啟用,即使管理員已設定自訂 Docker 映像檔,使用者仍可使用 Egg 清單覆寫伺服器設定中指定的 Docker 映像檔。", "allowViewingInstallationLogs": "允許檢視安裝紀錄", @@ -1727,6 +1847,9 @@ "delete": { "title": "確認刪除公告", "content": "你確定要刪除 **{title}** 嗎?" + }, + "duplicate": { + "content": "Are you sure you want to duplicate **{title}**?" } }, "form": { @@ -1862,6 +1985,25 @@ "users": { "title": "使用者", "resourceName": "使用者", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-user-001", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "role": "Role", + "viewUser": "View User" + }, + "notFound": "No user found with that external ID." + } + }, "tooltip": { "admin": "管理員", "twoFactorEnabled": "2FA 已啟用", @@ -1991,6 +2133,25 @@ } } }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "page": { + "title": "Location Database Agent Hosts", + "toast": { + "created": "Location database agent host created.", + "deleted": "Location database agent host deleted." + }, + "modal": { + "create": { + "title": "Create Location Database Agent Host" + }, + "delete": { + "title": "Confirm Location Database Agent Host Deletion", + "content": "Are you sure you want to delete the database agent host **{name}** from **{location}**?" + } + } + } + }, "nodes": { "title": "節點", "page": { @@ -2003,6 +2164,37 @@ "title": "節點", "resourceName": "節點", "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Node Overview", + "card": { + "nodeDetails": "Node Details", + "systemInfo": "System Information" + }, + "label": { + "location": "Location", + "url": "Internal URL", + "publicUrl": "Public URL", + "sftpAddress": "SFTP Address", + "backupConfiguration": "Backup Configuration", + "description": "Description", + "createdAt": "Created", + "inheritedFromLocation": "Inherited from Location", + "none": "None", + "wingsVersion": "Wings Version", + "cpu": "CPU", + "memory": "Memory", + "servers": "Servers", + "architecture": "Architecture", + "kernelVersion": "Kernel Version", + "unavailable": "Unavailable" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, "general": { "page": { "tooltip": { @@ -2016,7 +2208,10 @@ "form": { "urlDescription": "用於與節點進行內部通訊。", "publicUrlDescription": "用於 websocket 連線與下載。", - "backupConfigurationPlaceholder": "繼承自位置" + "backupConfigurationPlaceholder": "繼承自位置", + "memoryDescription": "The total memory available for servers on this node.", + "diskDescription": "The total disk available for servers on this node.", + "unlimitedTooltip": "0 will not set a limit." }, "button": { "resetToken": "重設權杖", @@ -2051,10 +2246,12 @@ "apiPort": "API 連接埠" }, "button": { - "save": "儲存設定" + "save": "儲存設定", + "reveal": "Reveal Configuration" }, "alert": { - "couldNotReach": "無法連線到節點:{error}" + "couldNotReach": "無法連線到節點:{error}", + "tokenWarning": "The configuration below contains the node token. Reveal it only when needed." }, "toast": { "applied": "設定已成功套用。", @@ -2216,9 +2413,13 @@ "detached": "備份已成功卸離。", "reattached": "已成功將備份重新附加到 {name}。", "restoring": "正在將備份還原到 {name}...", + "exporting": "Exporting backup to files of {name}...", "deleted": "節點備份已刪除。" }, "modal": { + "export": { + "title": "Export Node Backup to Files" + }, "detach": { "title": "確認卸離備份", "content": "你確定要將此備份從其伺服器卸離嗎?它不會被刪除,且稍後可以重新附加。" @@ -2234,7 +2435,11 @@ } }, "delete": { - "title": "確認刪除節點備份" + "title": "確認刪除節點備份", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the backup even if its configuration is missing or the remote storage cannot be reached. The backup files themselves may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2263,6 +2468,7 @@ "none": "無(捨棄所有分配,伺服器不會在目標節點自動獲得新分配)", "randomPrimary": "隨機化主要分配(移除額外分配)", "randomAll": "隨機化所有分配(建議使用以避免與目標節點的相容性問題)", + "preservePorts": "Preserve port numbers (reuses the same port numbers on the destination node where available, falls back to random allocations otherwise)", "eggConfigDeployment": "根據 Egg 部署設定分配(僅在 Egg 有部署設定且目標節點有相容分配時有效)", "eggConfigSelfAssignRange": "根據 Egg 連接埠範圍自行分配新分配(僅在 Egg 有連接埠範圍且目標節點有相容分配時有效)" } @@ -2311,7 +2517,78 @@ "servers": { "title": "伺服器", "resourceName": "伺服器", + "externalIdLookup": { + "button": "Find by External ID", + "modal": { + "title": "Look Up by External ID", + "form": { + "externalId": "External ID", + "externalIdPlaceholder": "e.g. my-server-001", + "search": "Search" + }, + "result": { + "title": "Server Found", + "name": "Name", + "owner": "Owner", + "node": "Node", + "viewServer": "View Server" + }, + "notFound": "No server found with that external ID." + } + }, "tabs": { + "overview": { + "title": "Overview", + "page": { + "title": "Server Overview", + "card": { + "owner": "Owner", + "nodeAndLocation": "Node & Location", + "serverDetails": "Server Details", + "resourceLimits": "Resource Limits", + "featureLimits": "Feature Limits" + }, + "label": { + "email": "Email", + "language": "Language", + "createdAt": "Created", + "node": "Node", + "location": "Location", + "memoryLimit": "Memory Limit", + "diskLimit": "Disk Limit", + "sftpAddress": "SFTP Address", + "primaryAllocation": "Primary Allocation", + "none": "None", + "dockerImage": "Docker Image", + "nest": "Nest", + "egg": "Egg", + "timezone": "Timezone", + "autoKill": "Auto-Kill", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "swap": "Swap", + "allocations": "Allocations", + "databases": "Databases", + "databaseAgents": "Agent Databases", + "backups": "Backups", + "schedules": "Schedules", + "unlimited": "Unlimited", + "autoKillSeconds": "{seconds}s", + "autoKillDisabled": "Disabled", + "externalId": "External ID", + "uuid": "UUID" + }, + "badge": { + "suspended": "Suspended", + "transferring": "Transferring", + "installing": "Installing", + "installFailed": "Install Failed", + "restoringBackup": "Restoring Backup", + "admin": "Admin" + } + } + }, "general": { "page": { "titleCreate": "建立伺服器", @@ -2341,23 +2618,30 @@ "backupConfigurationPlaceholder": "繼承自節點/位置", "cpuLimit": "CPU 限制(%)", "cpuLimitDescription": "伺服器可使用的 CPU 限制百分比。", + "cpuLimitTooltip": "1 thread = 100%. 0 will not set a limit.", "swap": "Swap", "swapDescription": "分配給此伺服器的 swap 大小。", + "swapTooltip": "-1 will not set a limit.", "memoryDescription": "伺服器容器的記憶體限制。", + "memoryTooltip": "0 will not set a limit.", "memoryOverhead": "記憶體額外開銷", "memoryOverheadDescription": "將新增至容器的隱藏記憶體。", "diskSpace": "磁碟空間", "diskSpaceDescription": "伺服器的磁碟限制。", + "diskSpaceTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", "ioWeight": "IO 權重", "ioWeightDescription": "伺服器容器相對於其他容器的 IO 權重。", + "ioWeightTooltip": "0-1000. May not work on all systems.", "pinnedCpus": "固定 CPU", "pinnedCpusDescription": "此伺服器固定使用的 CPU 核心。", + "pinnedCpusTooltip": "By index, e.g. 0, 1, 2. Leave empty to allow all cores.", "dockerImagePlaceholder": "ghcr.io/...", "predefinedDockerImages": "預定義 Docker 映像檔", "predefinedDockerImagesPlaceholder": "未選取預定義映像檔", "timezonePlaceholder": "Europe/Amsterdam", "startupCommandPlaceholder": "npm start", "startupCommandCustom": "自訂", + "predefinedStartupCommands": "Predefined Startup Commands", "startOnCompletion": "完成後啟動", "startOnCompletionDescription": "安裝完成後啟動伺服器。", "skipInstaller": "略過安裝程式", @@ -2368,6 +2652,7 @@ "kvmPassthroughEnabledDescription": "為伺服器啟用 KVM 透傳(允許在容器內存取 /dev/kvm)。", "allocationsLimit": "分配", "databasesLimit": "資料庫", + "databaseAgentsLimit": "Agent Databases", "backupsLimit": "備份", "schedulesLimit": "排程" }, @@ -2455,6 +2740,17 @@ } } }, + "databases": { + "title": "Databases", + "page": { + "databases": { + "title": "Classic Databases" + }, + "instances": { + "title": "Managed Databases" + } + } + }, "logs": { "title": "紀錄", "page": { @@ -2546,6 +2842,9 @@ "deleteBackups": "你要刪除此伺服器的備份嗎?", "confirmServerName": "確認伺服器名稱", "confirmServerNamePlaceholder": "伺服器名稱" + }, + "alert": { + "forceWarning": "Force deletion skips the normal shutdown sequence. The server files on the node may not be fully cleaned up, leaving orphaned data behind." } } } @@ -2704,13 +3003,17 @@ "toast": { "created": "Egg 變數已建立。", "updated": "Egg 變數已更新。", - "deleted": "Egg 變數已刪除。" + "deleted": "Egg 變數已刪除。", + "duplicated": "Egg variable duplicated." }, "modal": { "delete": { "title": "確認移除 Egg 變數", "content": "你確定要移除 **{variable}** 嗎?", "emptyVariable": "此空白變數" + }, + "duplicate": { + "title": "Duplicate Egg Variable" } } } @@ -2761,7 +3064,8 @@ "form": { "order": "順序", "eggs": "Egg", - "eggsPlaceholder": "選取 Egg" + "eggsPlaceholder": "選取 Egg", + "eggsEmpty": "No eggs are configured. Create a nest and egg before creating an egg configuration." }, "enum": { "deploymentType": { @@ -2879,6 +3183,9 @@ "title": "安裝 Egg 儲存庫 Egg", "button": "安裝 {eggs}" } + }, + "drawer": { + "noReadme": "This egg does not have a README." } } } @@ -2915,7 +3222,11 @@ "modal": { "delete": { "title": "確認刪除資料庫主機", - "content": "你確定要刪除 **{name}** 嗎?" + "content": "你確定要刪除 **{name}** 嗎?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all databases on this host. The databases on the host itself may not be fully cleaned up, leaving orphaned data behind." + } } } } @@ -2923,7 +3234,278 @@ "databases": { "title": "資料庫", "page": { - "title": "資料庫主機資料庫" + "title": "資料庫主機資料庫", + "modal": { + "delete": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Database has been deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion ignores the database lock and the host maintenance state. The database on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + } + } + }, + "databaseAgentHosts": { + "title": "Database Agent Hosts", + "resourceName": "Database agent host", + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Host", + "titleUpdate": "Update Database Agent Host", + "form": { + "typeEnabled": "Enabled", + "typePublicHost": "Public Host", + "typePublicPort": "Public Port" + }, + "button": { + "resetToken": "Reset Token", + "testConnection": "Test Connection", + "updateConfig": "Update Config" + }, + "toast": { + "tested": "Test successfully completed.", + "tokenReset": "Database agent host token reset." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Host Deletion", + "content": "Are you sure you want to delete **{name}**?", + "form": {}, + "alert": { + "forceWarning": "Force deletion removes all instances on this host. Instances the agent cannot be reached for may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "modal": { + "editInstance": { + "title": "Edit {name}", + "toast": { + "updated": "Instance has been updated." + }, + "form": { + "image": "Docker Image", + "imageDescription": "Pins the instance to a specific docker image. Leave empty to follow the template image, including future template updates.", + "env": "Environment Overrides", + "override": "Override {field}" + } + }, + "deleteInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Are you sure you want to delete **{name}**?", + "toast": { + "deleted": "Managed database deleted." + }, + "form": {}, + "alert": { + "forceWarning": "Force deletion removes the instance even if the agent cannot be reached. The instance and its data on the host itself may not be fully cleaned up, leaving orphaned data behind." + } + } + } + } + }, + "configuration": { + "title": "Configuration", + "page": { + "title": "Configuration", + "section": { + "initialSetup": "Initial Setup", + "liveConfiguration": "Live Configuration" + }, + "description": { + "placeFile": "Place this into the configuration file at `/etc/calagopus-db-agent/config.yml` or run" + }, + "tooltip": { + "copyCommand": "Copy command" + }, + "form": { + "apiPort": "API Port" + }, + "button": { + "save": "Save Configuration", + "reveal": "Reveal Configuration" + }, + "alert": { + "couldNotReach": "Could not reach the database agent host: {error}", + "tokenWarning": "The configuration below contains the host token. Reveal it only when needed." + }, + "toast": { + "applied": "Configuration applied successfully.", + "submittedNotApplied": "Configuration was submitted but not applied.", + "invalidYaml": "Invalid YAML: {error}" + } + } + }, + "overview": { + "title": "Overview", + "page": { + "title": "Database Agent Host Overview", + "status": { + "deploymentEnabled": "Deployment Enabled", + "deploymentDisabled": "Deployment Disabled", + "maintenanceEnabled": "Maintenance Enabled", + "maintenanceDisabled": "Maintenance Disabled" + }, + "card": { + "hostDetails": "Host Details", + "systemInfo": "System Information", + "resources": "Allocated Resources" + }, + "label": { + "url": "URL", + "description": "Description", + "createdAt": "Created", + "version": "Version", + "cpu": "CPU", + "memory": "Memory", + "disk": "Disk", + "instances": "Instances", + "kernelVersion": "Kernel Version", + "architecture": "Architecture", + "unavailable": "Unavailable", + "noLimit": "No host limit", + "free": "{size} free", + "cores": "{cores} cores allocated" + }, + "badge": { + "updateAvailable": "Update Available" + } + } + }, + "statistics": { + "title": "Statistics", + "page": { + "title": "Database Agent Host Statistics", + "card": { + "resources": "Resources", + "graphs": "Graphs" + }, + "label": { + "cpu": "CPU", + "cpuThreads": "{model} ({threads} threads)", + "memory": "Memory", + "usedByAgent": "{size} used by the agent", + "disk": "Disk", + "network": "Network", + "networkIn": "In: {in}", + "networkOut": "Out: {out}" + }, + "chart": { + "cpuLoad": "CPU Load", + "memoryUsage": "Memory Usage", + "diskIo": "Disk I/O", + "diskRead": "Disk Read", + "diskWrite": "Disk Write", + "networkTraffic": "Network Traffic", + "networkInLabel": "Inbound", + "networkOutLabel": "Outbound", + "inbound": "Inbound", + "outbound": "Outbound" + }, + "toast": { + "connectionLost": "Connection to the database agent host was lost." + } + } + } + }, + "modal": { + "bulkConfig": { + "title": "Update Configuration - {hosts}", + "button": { + "apply": "Apply to {hosts}" + }, + "toast": { + "applied": "Configuration applied to {hosts}." + }, + "error": { + "invalidYaml": "Invalid YAML: {error}" + } + } + } + }, + "databaseAgentTemplates": { + "title": "Database Agent Templates", + "resourceName": "Database agent template", + "dropzone": { + "title": "Drop some files here to import as Database Agent Templates", + "subtitle": "Release to start importing" + }, + "toast": { + "imported": "Database Agent Template imported.", + "parseFailed": "Failed to parse database agent template: {error}" + }, + "tabs": { + "general": { + "page": { + "titleCreate": "Create Database Agent Template", + "titleUpdate": "Update Database Agent Template", + "toast": { + "exported": "Database Agent Template exported." + }, + "version": "Version {version}", + "form": { + "dockerImages": "Docker Images", + "env": "Environment Variables", + "volumes": "Volumes", + "socketPath": "Socket Path", + "socketPathDescription": "The unix socket file path inside the database container, must match where the configured image actually creates its socket.", + "imageUid": "Image UID", + "imageGid": "Image GID", + "cmd": "Command", + "memoryDescription": "The Memory limit of the database container.", + "memoryTooltip": "0 will not set a limit.", + "swap": "Swap", + "swapDescription": "The amount of swap to give this database.", + "swapTooltip": "-1 will not set a limit.", + "diskDescription": "The disk limit of the database.", + "diskTooltip": "0 will not set a limit. This is a soft-limit unless the disk limiter is configured on Wings.", + "cpu": "CPU Limit (%)", + "cpuDescription": "The CPU limit in % that the database can use.", + "cpuTooltip": "1 thread = 100%. 0 will not set a limit.", + "ioWeight": "IO Weight", + "ioWeightDescription": "The relative IO Weight of the database container compared to other containers.", + "ioWeightTooltip": "0-1000. May not work on all systems." + }, + "modal": { + "delete": { + "title": "Confirm Database Agent Template Deletion", + "content": "Are you sure you want to delete **{name}**?" + } + } + } + }, + "instances": { + "title": "Instances", + "page": { + "title": "Instances", + "outdated": "Outdated", + "button": { + "applyUpdates": "Apply Updates", + "applyAllUpdates": "Update All Outdated" + }, + "toast": { + "updated": "Applied template updates to {instances}." + }, + "modal": { + "applyUpdates": { + "title": "Apply Template Updates", + "content": "This will push the current configuration of **{name}** to the {count} selected instances. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped.", + "contentAll": "This will push the current configuration of **{name}** to every outdated instance, including instances not shown by the current search. Instances will be restarted to apply the new configuration. Locked instances and instances on hosts in maintenance mode are skipped." + } + } } } } @@ -3001,10 +3583,27 @@ "title": "對應", "page": { "title": "OAuth 提供者對應", + "table": { + "columns": { + "matcher": "Matcher" + } + }, "enum": { "mappingType": { "role": "角色", "serverSubuser": "伺服器子使用者" + }, + "matcherType": { + "none": "None (Always applies)", + "and": "AND (All must match)", + "or": "OR (Any must match)", + "not": "NOT (Must not match)", + "scopes": "Granted Scopes", + "fieldExists": "Field Exists", + "fieldEquals": "Field Equals", + "fieldContains": "Field Contains", + "fieldStartsWith": "Field Starts With", + "fieldEndsWith": "Field Ends With" } }, "toast": { @@ -3012,8 +3611,28 @@ "updated": "OAuth 提供者對應已更新。", "deleted": "OAuth 提供者對應已刪除。" }, + "button": { + "addMatcher": "Add Matcher" + }, + "matcher": { + "allMustMatch": "All matchers must match:", + "anyMustMatch": "Any matcher must match:", + "mustNotMatch": "Matcher must not match:" + }, "form": { + "matcher": "Matcher", + "matcherDescription": "Decides whether this mapping applies to a user logging in with this provider.", + "matcherType": "Matcher Type", + "scopes": "範圍", "scopesDescription": "此對應套用所需的 OAuth 範圍。", + "path": "Field Path", + "pathDescription": "The path used to extract the compared field from the Info URL response (https://serdejsonpath.live).", + "equals": "Equals", + "contains": "Contains", + "startsWith": "Starts With", + "endsWith": "Ends With", + "revokeUnmatched": "Revoke when not matched", + "revokeUnmatchedDescription": "Removes the assigned role or server subuser again when the matcher no longer matches on a later login.", "mappingType": "對應類型", "role": "角色", "permissions": "權限" @@ -3034,6 +3653,25 @@ }, "users": { "title": "使用者", + "identifierLookup": { + "button": "Find by Identifier", + "modal": { + "title": "Look Up by Identifier", + "form": { + "identifier": "Identifier", + "identifierPlaceholder": "e.g. email or username", + "search": "Search" + }, + "result": { + "title": "User Found", + "username": "Username", + "email": "Email", + "identifier": "Identifier", + "viewUser": "View User" + }, + "notFound": "No user found with that identifier." + } + }, "page": { "title": "OAuth 提供者使用者", "table": { @@ -3080,6 +3718,7 @@ "title": "S3 設定", "form": { "partSize": "分段大小", + "compressionType": "Compression Type", "pathStyle": "使用路徑樣式 URL" } }, @@ -3299,6 +3938,11 @@ "viewAdmin": { "title": "查看管理" }, + "selector": { + "title": "Select a Server", + "description": "Choose which server you want to navigate to.", + "descriptionWithPage": "Select a server to go to **{page}**." + }, "console": { "title": "主控台", "input": { @@ -3420,6 +4064,10 @@ "modified": "已修改" } }, + "diskUsage": { + "title": "Disk Usage", + "details": "{used} of {total} used ({percentage}%)" + }, "button": { "new": "新增", "connect": "連線", @@ -3463,6 +4111,7 @@ "copyingMany": "正在複製 {files}", "receivingRemote": "正在從遠端伺服器接收 {files}", "sendingRemote": "正在傳送 {files} 到遠端伺服器", + "exportingBackup": "Exporting backup to {destination}", "cancelAllOperations": "取消所有操作" }, "dropzone": { @@ -3474,6 +4123,7 @@ "preferPhysicalSize": "顯示實體大小而非邏輯大小", "editorMinimap": "顯示檔案迷你地圖", "editorLineOverflow": "換行顯示超出內容", + "editorFontSize": "Editor Font Size", "vscodeUriScheme": "VS Code URI 協定", "imageViewerSmoothing": "平滑圖片(反鋸齒)" }, @@ -3483,6 +4133,8 @@ "copyingStarted": "{files} 已開始複製。", "filesCouldNotBeMoved": "無法移動檔案。", "filesMoved": "{files} 已移動。", + "moveUndone": "Move of {files} undone.", + "moveCouldNotBeUndone": "Move could not be undone.", "downloadStarted": "下載已開始。", "filesDeleted": "檔案已刪除。", "archiveCreationStarted": "已開始建立壓縮檔。", @@ -3492,13 +4144,19 @@ "fileRenamed": "檔案已重新命名。", "fileCouldNotBeRenamed": "無法重新命名檔案。", "filesRenamed": "已重新命名 {files}。", + "renameUndone": "Rename undone.", + "renameCouldNotBeUndone": "Rename could not be undone.", "permissionsUpdated": "權限已更新。", "permissionsUpdatedMany": "已更新 {files} 的權限。", "permissionsCouldNotBeUpdated": "無法更新權限。", - "fileSaved": "檔案已儲存。" + "permissionsRestored": "Permissions restored.", + "permissionsCouldNotBeRestored": "Permissions could not be restored.", + "fileSaved": "檔案已儲存。", + "collabSaveTimeout": "The file could not be saved, the daemon did not respond in time." }, "tooltip": { "fileHistory": "檔案歷史", + "collabEditing": "{user} is editing this file", "largestDirectories": "分析目錄大小", "dragToMove": "拖曳以移動", "back": "後退 {seconds} 秒", @@ -3700,6 +4358,10 @@ "databases": { "title": "資料庫", "subtitle": "已建立 {current} / {max} 個資料庫。", + "classic": { + "title": "Classic Databases", + "subtitle": "{current} databases created." + }, "tooltip": { "limitReached": "此伺服器最多只能使用 {max} 個資料庫。" }, @@ -3714,6 +4376,165 @@ "form": { "databaseName": "資料庫名稱" }, + "instance": { + "title": "Managed Databases", + "subtitle": "{current} managed databases created.", + "updateAvailable": "Update Available", + "button": { + "applyUpdate": "Apply Update" + }, + "tooltip": { + "limitReached": "This server is limited to {max} managed databases." + }, + "view": { + "tabs": { + "databases": "Databases", + "users": "Users", + "logs": "Logs" + }, + "stats": { + "uptime": "Uptime", + "cpuLoad": "CPU Load", + "memoryLoad": "Memory Load", + "diskUsage": "Disk Usage" + } + }, + "databases": { + "title": "Databases", + "subtitle": "{current} of {max} maximum databases created.", + "tooltip": { + "offline": "The instance must be running to create databases.", + "noUser": "This database has no user attached yet. Create a user to access it.", + "limitReached": "This instance is limited to {max} databases." + }, + "button": { + "export": "Export", + "import": "Import" + }, + "modal": { + "createDatabase": { + "title": "Create Database", + "content": "Creates a new database with its own user inside this managed database instance. The credentials will be shown in the table afterwards." + }, + "deleteDatabase": { + "title": "Confirm Database Deletion", + "content": "Are you sure you want to delete the database for user **{username}**? This permanently deletes the database and all data within it." + }, + "exportDatabase": { + "title": "Export Database", + "content": "Download a dump of this database. Large databases may take a while to prepare." + }, + "importDatabase": { + "title": "Import Database", + "content": "Upload a dump to import into this database. Large imports may take a while to complete.", + "form": { + "file": "Dump File", + "wipe": "Wipe existing data before importing" + } + }, + "recreateDatabase": { + "title": "Confirm Database Recreation", + "content": "Recreating a database will permanently delete all data in the **{name}** database and create a new empty one with the same name and user access." + } + }, + "table": { + "columns": { + "database": "Database" + } + }, + "toast": { + "created": "Database created.", + "deleted": "Database deleted.", + "imported": "Database import completed.", + "passwordRotated": "Password has been rotated.", + "recreated": "Database recreated." + } + }, + "users": { + "title": "Users", + "subtitle": "{current} of {max} maximum users created.", + "tooltip": { + "limitReached": "This instance is limited to {max} users." + }, + "modal": { + "createUser": { + "title": "Create User", + "content": "Creates a new user inside this managed database instance. The credentials will be shown in the table afterwards.", + "form": { + "database": "Database", + "databaseHint": "The database this user will be granted access to.", + "databaseRequired": "Please select a database." + } + }, + "deleteUser": { + "title": "Confirm User Deletion", + "content": "Are you sure you want to delete the user **{username}**? This cannot be undone." + } + }, + "toast": { + "created": "User created.", + "deleted": "User deleted." + } + }, + "power": { + "toast": { + "start": "Managed database is starting.", + "stop": "Managed database is stopping.", + "restart": "Managed database is restarting.", + "kill": "Managed database has been killed." + }, + "modal": { + "forceKill": { + "title": "Forcibly Kill Database", + "content": "Forcibly killing a database can lead to data corruption." + } + } + }, + "modal": { + "createDatabaseInstance": { + "title": "Create Managed Database", + "toast": { + "created": "Managed database created." + }, + "form": { + "template": "Template", + "noTemplatesFound": "No templates available", + "image": "Docker Image" + } + }, + "editDatabaseInstance": { + "title": "Edit Managed Database", + "toast": { + "updated": "Managed database updated." + } + }, + "applyDatabaseInstanceUpdate": { + "title": "Apply Template Update", + "content": "This will update **{name}** to the latest template configuration. The database will be restarted to apply the new configuration.", + "toast": { + "applied": "Template update applied." + } + }, + "deleteDatabaseInstance": { + "title": "Confirm Managed Database Deletion", + "content": "Deleting a managed database is a permanent action, it cannot be undone. This will permanently delete the **{name}** database and remove all associated data.", + "toast": { + "deleted": "Managed database deleted." + } + }, + "credentials": { + "title": "Database Credentials", + "form": { + "database": "Database", + "jdbcConnectionString": "JDBC Connection String" + } + }, + "exportInstance": { + "title": "Export Instance", + "content": "Download a dump of this managed database instance. Large instances may take a while to prepare." + } + } + }, "modal": { "createDatabase": { "title": "建立資料庫", @@ -3721,7 +4542,8 @@ "created": "資料庫已建立。" }, "form": { - "noHostsFound": "找不到主機" + "noHostsFound": "找不到主機", + "hostInMaintenance": "Under Maintenance" } }, "editDatabase": { @@ -3773,9 +4595,14 @@ } }, "button": { + "runNow": "Run Now", + "runNowWithConditions": "Run now (check conditions first)", + "runNowIgnoreConditions": "Run now (ignore conditions)", "addTrigger": "新增觸發器", "addCondition": "新增條件", "addStep": "新增步驟", + "addElseIf": "Add Else If", + "addElse": "Add Else", "createFirstStep": "建立第一個步驟", "addOutput": "新增輸出", "addFile": "新增檔案", @@ -3785,6 +4612,7 @@ "imported": "排程已匯入。", "created": "排程已建立。", "updated": "排程已更新。", + "duplicated": "Schedule duplicated.", "deleted": "排程已刪除。", "triggered": "排程已觸發。", "exported": "排程已匯出。", @@ -3792,6 +4620,7 @@ "step": { "created": "排程步驟已建立。", "updated": "排程步驟已更新。", + "duplicated": "Schedule step duplicated.", "deleted": "排程步驟已刪除。" } }, @@ -3801,12 +4630,21 @@ "and": "AND(全部都必須為真)", "or": "OR(任一為真即可)", "not": "NOT(不得為真)", + "serverState": "Server State", + "uptime": "Uptime", + "resourceUsage": "Resource Usage", + "fileExists": "File Exists", "variableExists": "變數存在", "variableContains": "變數包含", "variableEquals": "變數等於", "variableStartsWith": "變數開頭為", "variableEndsWith": "變數結尾為" }, + "scheduleResourceMetric": { + "cpu": "CPU Usage", + "memory": "Memory Usage", + "disk": "Disk Usage" + }, "scheduleComparator": { "smallerThan": "小於", "smallerThanOrEqual": "小於或等於", @@ -3822,6 +4660,9 @@ "updateSchedule": { "title": "更新排程" }, + "duplicateSchedule": { + "title": "Duplicate Schedule" + }, "deleteSchedule": { "title": "確認刪除排程", "content": "你確定要從此伺服器刪除 {name} 嗎?" @@ -3835,12 +4676,19 @@ "deleteStep": { "title": "確認刪除排程步驟", "content": "你確定要刪除此排程步驟嗎?" + }, + "unsavedChanges": { + "title": "Unsaved Changes", + "content": "You have unsaved changes to your schedule conditions. Are you sure you want to leave this page? If you leave, your changes will be lost." } }, "view": { "badge": { "running": "執行中" }, + "tooltip": { + "cannotRun": "Cannot run a disabled schedule" + }, "tabs": { "actions": "動作", "conditions": "條件", @@ -3876,6 +4724,7 @@ "contains": "包含", "startsWith": "開頭為", "endsWith": "結尾為", + "metric": "Metric", "allMustBeTrue": "所有條件都必須為真:", "anyMustBeTrue": "任一條件必須為真:", "mustNotBeTrue": "條件不得為真:" @@ -3889,8 +4738,23 @@ "cron": { "title": "Cron", "form": { - "cronSchedule": "Cron 排程" + "cronSchedule": "Cron 排程", + "frequency": "Runs", + "intervalMinutes": "Every (minutes)", + "intervalHours": "Every (hours)", + "time": "At", + "weekday": "On", + "dayOfMonth": "On day", + "advanced": "Edit as cron expression" + }, + "frequency": { + "everyMinutes": "Every few minutes", + "everyHours": "Every few hours", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" }, + "timezoneHint": "Times use the server timezone ({timezone}).", "card": { "content": "在 Cron 間隔 {schedule} 執行,下次執行為 {timestamp},上次執行為 {lastTimestamp}。" }, @@ -3917,6 +4781,25 @@ "content": "當備份達到狀態 `{status}` 時。" } }, + "scheduleCompletion": { + "title": "Schedule Completion", + "form": { + "schedule": "Schedule", + "completionStatus": "Completion Status" + }, + "card": { + "content": "When Schedule `{schedule}` completes with Status `{status}`." + } + }, + "resourceUsage": { + "title": "Resource Usage", + "form": { + "forSeconds": "For (seconds)" + }, + "card": { + "content": "When {metric} is {comparator} `{value}`." + } + }, "consoleLine": { "title": "主控台行", "card": { @@ -3941,8 +4824,20 @@ "title": "未設定步驟", "description": "此排程尚未有任何步驟。新增一些動作即可開始。" }, + "warning": { + "unclosedIf": "An \"If\" block is missing its \"End If\". All remaining steps run as part of the block.", + "orphanBranch": "There is an \"Else\", \"Else If\" or \"End If\" step without a matching \"If\" before it." + }, + "groups": { + "server": "Server", + "backups": "Backups", + "files": "Files", + "startup": "Startup Settings", + "advanced": "Advanced Logic" + }, "sleep": { "title": "等待", + "description": "Wait for a set amount of time before continuing with the next action.", "form": { "duration": "持續時間(毫秒)" }, @@ -3952,12 +4847,62 @@ }, "ensure": { "title": "確保", + "description": "Stop the schedule here unless a condition is true.", "renderer": { "compact": "確保符合某個條件" } }, + "if": { + "title": "If", + "description": "Run the following steps only when a condition is true, until Else/End If. A matching End If is added automatically.", + "renderer": { + "compact": "If a condition matches" + } + }, + "elseIf": { + "title": "Else If", + "description": "Run the following steps when no earlier branch ran and a condition is true.", + "renderer": { + "compact": "Else if a condition matches" + } + }, + "else": { + "title": "Else", + "description": "Run the following steps when no earlier branch of the If block ran.", + "renderer": { + "compact": "Otherwise" + } + }, + "endIf": { + "title": "End If", + "description": "Close the current If block.", + "renderer": { + "compact": "End of the If block" + } + }, + "exit": { + "title": "Exit", + "description": "Stop the schedule here, marking the run as successful or failed.", + "form": { + "successful": "Mark run as successful" + }, + "renderer": { + "compact": "Exit the schedule ({successful})" + } + }, + "waitForState": { + "title": "Wait for Server State", + "description": "Wait until the server reaches a power state.", + "form": { + "timeout": "Timeout (milliseconds)" + }, + "renderer": { + "compact": "Wait {timeout} for server to be {state}" + } + }, "format": { "title": "格式化", + "description": "Build a text value from variables and store it in a variable.", "form": { "formatString": "格式字串", "formatStringDescription": "格式字符串。可以通过将变量包装在 {wrapper} 中来包含它们。" @@ -3968,6 +4913,7 @@ }, "matchRegex": { "title": "比對 Regex", + "description": "Extract parts of a text value using a regular expression.", "form": { "input": "輸入", "regex": "Regex", @@ -3980,6 +4926,7 @@ }, "waitForConsoleLine": { "title": "等待主控台行", + "description": "Wait until the server console outputs a matching line.", "form": { "timeout": "逾時(毫秒)" }, @@ -3994,6 +4941,7 @@ }, "sendCommand": { "title": "傳送指令", + "description": "Send a command to the server console.", "renderer": { "compact": "執行 {command}", "detail": { @@ -4003,6 +4951,7 @@ }, "sendPower": { "title": "傳送電源訊號", + "description": "Start, restart, stop or kill the server.", "renderer": { "compact": "執行 {action}", "detail": { @@ -4012,19 +4961,75 @@ }, "createBackup": { "title": "建立備份", + "description": "Create a backup of the server files.", "form": { "backupName": "備份名稱" }, "renderer": { "compact": "建立 {name}", + "compactAuto": "Create a backup with an auto-generated name", "detail": { "backupName": "備份名稱:{name}", + "backupNameAuto": "Backup Name: Auto-generated", "ignoredFiles": "忽略的檔案:{files}" } } }, + "restoreBackup": { + "title": "Restore Backup", + "description": "Stop the server and restore a backup of the server files.", + "form": { + "backupSelector": "Backup to Restore", + "selector": { + "latest": "Latest Backup", + "oldest": "Oldest Backup", + "uuid": "Specific Backup (UUID)", + "name": "By Name", + "oldestFirst": "Match the oldest backup instead of the newest" + }, + "backupUuid": "Backup UUID", + "backupName": "Backup Name", + "truncateDirectory": "Delete all files before restore", + "restoreStartup": "Restore startup settings", + "warning": "Restoring stops the server and overwrites its files. The schedule waits until the restore has finished before continuing. Avoid combining this step with power or server state triggers that could re-trigger the schedule." + }, + "renderer": { + "compact": "Restore backup {backup}", + "compactLatest": "Restore the latest backup", + "compactOldest": "Restore the oldest backup", + "detail": { + "backupLatest": "Backup: Latest successful backup", + "backupOldest": "Backup: Oldest successful backup", + "backupUuid": "Backup UUID: {uuid}", + "backupName": "Backup Name: {name}", + "truncateDirectory": "Delete all files first: {value}", + "restoreStartup": "Restore startup settings: {value}" + } + } + }, + "deleteBackup": { + "title": "Delete Backup", + "description": "Delete a backup selected by the backup selector.", + "form": { + "warning": "This permanently deletes the selected backup, including its files on the node. Locked backups are skipped." + } + }, + "moveBackup": { + "title": "Move Backup", + "description": "Move a backup selected by the backup selector into a backup group.", + "form": { + "targetGroup": "Target Backup Group" + }, + "renderer": { + "detail": { + "targetGroup": "Target Group: {uuid}", + "targetGroupNone": "Target Group: None (ungrouped)" + } + } + }, "createDirectory": { "title": "建立目錄", + "description": "Create a new folder in the server files.", "renderer": { "compact": "在 {root} 建立 {name}", "detail": { @@ -4035,6 +5040,7 @@ }, "writeFile": { "title": "寫入檔案", + "description": "Write or append text to a file.", "form": { "content": "內容", "appendToFile": "附加到檔案" @@ -4049,6 +5055,7 @@ }, "copyFile": { "title": "複製檔案", + "description": "Copy a file to a new location.", "form": { "sourceFile": "來源檔案" }, @@ -4062,6 +5069,7 @@ }, "deleteFiles": { "title": "刪除檔案", + "description": "Delete files or folders.", "form": { "filesToDelete": "要刪除的檔案" }, @@ -4075,6 +5083,7 @@ }, "renameFiles": { "title": "重新命名檔案", + "description": "Rename or move files.", "form": { "files": "檔案", "from": "從", @@ -4090,6 +5099,7 @@ }, "compressFiles": { "title": "壓縮檔案", + "description": "Compress files into an archive.", "form": { "filesToCompress": "要壓縮的檔案" }, @@ -4105,6 +5115,7 @@ }, "decompressFile": { "title": "解壓縮檔案", + "description": "Extract an archive into a folder.", "form": { "file": "檔案" }, @@ -4118,6 +5129,7 @@ }, "updateStartupVariable": { "title": "更新啟動變數", + "description": "Change the value of a startup variable.", "renderer": { "compact": "將 {variable} 設為 {value}", "detail": { @@ -4128,6 +5140,7 @@ }, "updateStartupCommand": { "title": "更新啟動指令", + "description": "Change the command used to start the server.", "renderer": { "compact": "設為 {command}", "detail": { @@ -4137,6 +5150,7 @@ }, "updateStartupDockerImage": { "title": "更新 Docker 映像檔", + "description": "Change the Docker image the server runs in.", "renderer": { "compact": "設為 {image}", "detail": { @@ -4199,16 +5213,25 @@ "locked": "已鎖定?" } }, + "badge": { + "deleting": "Deleting…", + "deleteFailed": "Deletion failed" + }, "button": { - "browse": "瀏覽" + "browse": "瀏覽", + "exportToFiles": "Export to Files", + "createBackup": "Create Backup", + "createGroup": "Create Backup Group" }, "toast": { "downloadStarted": "下載已開始。", - "restoringBackup": "正在還原備份..." + "restoringBackup": "正在還原備份...", + "exportStarted": "Backup export started." }, "modal": { "createBackup": { "title": "建立備份", + "noGroup": "No group", "toast": { "created": "備份已建立。" } @@ -4222,10 +5245,14 @@ "restoreBackup": { "title": "還原備份" }, + "exportBackup": { + "title": "Export Backup to Files" + }, "deleteBackup": { "title": "確認刪除備份", "content": "你確定要從此伺服器刪除 **{name}** 嗎?", "toast": { + "started": "Backup deletion started.", "deleted": "備份已刪除。" } }, @@ -4234,6 +5261,47 @@ } } }, + "backupGroups": { + "title": "Backup Groups", + "group": "Backup Group", + "ungrouped": "Ungrouped", + "noBackups": "This group has no backups yet.", + "button": { + "createInGroup": "Create backup in this group" + }, + "badge": { + "keepCount": "Keep {count}", + "keepDays": "Keep {days}", + "noRetention": "No auto-deletion", + "allLocked": "All locked" + }, + "form": { + "retentionCount": "Keep count", + "retentionCountDescription": "Maximum number of usable backups to keep in this group. Leave empty for no limit.", + "retentionDays": "Keep days", + "retentionDaysDescription": "Delete backups in this group older than this many days. Leave empty for no limit.", + "noRetentionDescription": "With no retention set, this group is just a label and never deletes backups automatically." + }, + "modal": { + "createGroup": { + "title": "Create Backup Group" + }, + "updateGroup": { + "title": "Edit Backup Group" + }, + "deleteGroup": { + "title": "Confirm Backup Group Deletion", + "content": "Are you sure you want to delete **{name}**? {backups} in this group will become ungrouped and follow standard rotation.", + "lockBackups": "Lock backups", + "lockBackupsDescription": "Locks all backups in this group before deletion so they cannot be rotated out automatically." + } + }, + "toast": { + "created": "Backup group created.", + "updated": "Backup group updated.", + "deleted": "Backup group deleted." + } + }, "network": { "title": "網路", "subtitle": "已指派 {current} / {max} 個分配。", @@ -4279,7 +5347,8 @@ "content": "你的啟動變數有未儲存的變更。你確定要離開此頁面嗎?若離開,變更將會遺失。" } }, - "noVariables": "找不到此伺服器的啟動變數。" + "noVariables": "找不到此伺服器的啟動變數。", + "predefinedStartupCommands": "Predefined Startup Commands" }, "mounts": { "title": "掛載",