diff --git a/components/providers/i18n-provider.tsx b/components/providers/i18n-provider.tsx index 9e9d52d..a0960ee 100644 --- a/components/providers/i18n-provider.tsx +++ b/components/providers/i18n-provider.tsx @@ -1,14 +1,14 @@ "use client" import { useEffect, useRef, useState } from "react" -import { initI18n, RTL_LOCALES } from "@/lib/i18n" +import { DEFAULT_LOCALE, initI18n, isRtlLocale, normalizeLocale } from "@/lib/i18n" import { DirectionProvider } from "@/components/ui/direction" import i18n from "i18next" type Dir = "ltr" | "rtl" function getDir(lang: string): Dir { - return RTL_LOCALES.has(lang.split("-")[0]) ? "rtl" : "ltr" + return isRtlLocale(lang) ? "rtl" : "ltr" } export function I18nProvider({ children }: { children: React.ReactNode }) { @@ -17,7 +17,9 @@ export function I18nProvider({ children }: { children: React.ReactNode }) { const mountedRef = useRef(true) const applyDir = (lang: string) => { + const locale = normalizeLocale(lang) const d = getDir(lang) + document.documentElement.lang = locale document.documentElement.dir = d setDir(d) } @@ -27,12 +29,15 @@ export function I18nProvider({ children }: { children: React.ReactNode }) { initI18n() .then(() => { if (mountedRef.current) { - applyDir(i18n.language ?? "en") + applyDir(i18n.resolvedLanguage ?? i18n.language ?? DEFAULT_LOCALE) setReady(true) } }) .catch(() => { - if (mountedRef.current) setReady(true) + if (mountedRef.current) { + applyDir(DEFAULT_LOCALE) + setReady(true) + } }) const handler = (lng: string) => applyDir(lng) diff --git a/i18n/locales/ar-MA.json b/i18n/locales/ar-MA.json index 7441ab0..fbd505d 100644 --- a/i18n/locales/ar-MA.json +++ b/i18n/locales/ar-MA.json @@ -708,8 +708,6 @@ "Send events via MQTT broker": "إرسال الأحداث عبر وسيط MQTT", "Send events via NATS": "إرسال الأحداث عبر NATS", "Send events via Pulsar": "إرسال الأحداث عبر Pulsar", - "Send events via NATS": "إرسال الأحداث عبر NATS", - "Send events via Pulsar": "إرسال الأحداث عبر Pulsar", "Server Address": "عنوان الخادم", "Server Configuration": "إعداد الخادم", "Server Host": "مضيف الخادم", @@ -1098,8 +1096,8 @@ "Failed to save OIDC provider": "فشل حفظ موفر OIDC", "Failed to validate OIDC configuration": "فشل التحقق من إعدادات OIDC", "Groups Claim": "مطالبة المجموعات", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "مطالبة الأدوار", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "اختياري. مطالبة منفصلة لقيم الأدوار (مثل roles). اتركه فارغًا لاستخدام مطالبة المجموعات فقط.", "Issuer": "الجهة المصدّرة", "Leave empty to keep current secret": "اتركه فارغًا للاحتفاظ بالسر الحالي", "Loading...": "جارٍ التحميل...", @@ -1136,5 +1134,129 @@ "Validate": "تحقق", "Validating...": "جارٍ التحقق...", "View and manage persisted OIDC providers.": "اعرض وأدر موفري OIDC المحفوظين.", - "You have unsaved OIDC changes. Do you want to discard them?": "لديك تغييرات OIDC غير محفوظة. هل تريد تجاهلها؟" + "You have unsaved OIDC changes. Do you want to discard them?": "لديك تغييرات OIDC غير محفوظة. هل تريد تجاهلها؟", + "a": "a", + "Add {type} Audit Target": "إضافة هدف تدقيق {type}", + "Add Audit Target": "إضافة هدف تدقيق", + "API not ready": "واجهة API غير جاهزة", + "Are you sure you want to delete this audit target?": "هل أنت متأكد من حذف هدف التدقيق هذا؟", + "Are you sure you want to delete this tag?": "هل أنت متأكد من حذف هذه العلامة؟", + "Are you sure you want to delete this user?": "هل أنت متأكد من حذف هذا المستخدم؟", + "ARN": "ARN", + "Audit is disabled": "التدقيق معطل", + "Audit is disabled. Enable audit before managing audit targets.": "التدقيق معطل. فعّل التدقيق قبل إدارة أهداف التدقيق.", + "Audit target created successfully": "تم إنشاء هدف التدقيق بنجاح", + "Audit Targets": "أهداف التدقيق", + "AWS S3": "AWS S3", + "Back to Login": "العودة إلى تسجيل الدخول", + "Bucket name is required": "اسم الحاوية مطلوب", + "Bucket names must be 3-63 characters long": "يجب أن يتراوح طول أسماء الحاويات بين 3 و63 حرفًا", + "Bucket names must not contain uppercase letters": "يجب ألا تحتوي أسماء الحاويات على أحرف كبيرة", + "Bucket not found": "لم يتم العثور على الحاوية", + "Cancel Deletion": "إلغاء الحذف", + "Cancel Key Deletion": "إلغاء حذف المفتاح", + "Client ID is required": "معرف العميل مطلوب", + "Collecting files": "جارٍ جمع الملفات", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "يجمع ويعرض مؤشرات الأداء الرئيسية مثل المعالج والذاكرة وإدخال/إخراج القرص عبر مخططات مرئية لمساعدة المستخدمين على فهم حالة تشغيل النظام واختناقات الأداء", + "Comma-separated audience IDs.": "معرفات الجمهور مفصولة بفواصل.", + "Console": "Console", + "Content Type": "نوع المحتوى", + "Controlled by {envKey}": "يتحكم فيه {envKey}", + "Copy Path": "نسخ المسار", + "Create an audit target to forward audit logs.": "أنشئ هدف تدقيق لإعادة توجيه سجلات التدقيق.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "حالة الخلفية الحالية للحاويات والمستخدمين والمجموعات والسياسات وقواعد انتهاء دورة الحياة المنسوخة.", + "Default": "افتراضي", + "Delete Tag": "حذف العلامة", + "Delete task created": "تم إنشاء مهمة الحذف", + "Deletion Date": "تاريخ الحذف", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "حالة نسخ الموقع التفصيلية غير متاحة بعد على هذا الخادم. لا تزال معلومات النظراء الأساسية معروضة أدناه.", + "div": "div", + "Download Failed": "فشل التنزيل", + "Download ready": "التنزيل جاهز", + "Downloading files": "جارٍ تنزيل الملفات", + "e.g., app-default": "e.g., app-default", + "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "يحتاج كل موقع بعيد إلى نقطة نهاية وبيانات اعتماد مسؤول حتى يتمكن العنقود من إكمال مصافحة الانضمام.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "يستخدم كل موقع بعيد بيانات اعتماد المسؤول الخاصة به لإكمال مصافحة النسخ الأولية.", + "Enable audit in Settings before managing audit targets.": "فعّل التدقيق في الإعدادات قبل إدارة أهداف التدقيق.", + "Enable notify in Settings before managing bucket event subscriptions.": "فعّل الإشعارات في الإعدادات قبل إدارة اشتراكات أحداث الحاوية.", + "Enable notify in Settings before managing event destinations.": "فعّل الإشعارات في الإعدادات قبل إدارة وجهات الأحداث.", + "Enter prefix...": "أدخل البادئة...", + "ENV": "ENV", + "Environment variables are controlling some switches": "تتحكم متغيرات البيئة في بعض المفاتيح", + "Example: http://localhost:9000 or https://your-domain.com": "Example: http://localhost:9000 or https://your-domain.com", + "Exit Fullscreen": "الخروج من وضع ملء الشاشة", + "Failed to create audit target": "فشل إنشاء هدف التدقيق", + "Failed to generate secure random keys": "فشل إنشاء مفاتيح عشوائية آمنة", + "Failed to load key details": "فشل تحميل تفاصيل المفتاح", + "Failed to load module switches": "فشل تحميل مفاتيح الوحدات", + "File Permissions": "أذونات الملف", + "Formatted": "منسق", + "Fullscreen": "ملء الشاشة", + "Getting URL": "جارٍ الحصول على URL", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "الصحة", + "Healthy": "سليم", + "Key Manager": "مدير المفاتيح", + "Leave blank to keep the stored Vault token.": "اتركه فارغًا للاحتفاظ برمز Vault المخزن.", + "Max Cached Keys": "الحد الأقصى للمفاتيح المخزنة مؤقتًا", + "Metadata": "البيانات الوصفية", + "Minio": "Minio", + "Module switch is managed by environment variables": "يُدار مفتاح الوحدة بواسطة متغيرات البيئة", + "Module switches saved": "تم حفظ مفاتيح الوحدات", + "New access key has been created": "تم إنشاء مفتاح وصول جديد", + "No Audit Targets": "لا توجد أهداف تدقيق", + "No files to download": "لا توجد ملفات للتنزيل", + "No options available": "لا توجد خيارات متاحة", + "No tags": "لا توجد علامات", + "Notify": "الإشعارات", + "Notify is disabled": "الإشعارات معطلة", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "الإشعارات معطلة. فعّل الإشعارات قبل إدارة اشتراكات أحداث الحاوية.", + "Notify is disabled. Enable notify before managing event destinations.": "الإشعارات معطلة. فعّل الإشعارات قبل إدارة وجهات الأحداث.", + "Origin": "الأصل", + "Other Audiences": "جماهير أخرى", + "password length cannot be less than 8 characters and greater than 40 characters": "يجب أن يتراوح طول كلمة المرور بين 8 و40 حرفًا", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "عضوية النظراء وعناصر تحكم النسخ القابلة للتحرير، المتوافقة مع واجهة API لنسخ المواقع في خلفية RustFS وتدفق إدارة المواقع بأسلوب MinIO.", + "Please enter GCS credentials JSON": "يرجى إدخال JSON بيانات اعتماد GCS", + "Please remove members first": "يرجى إزالة الأعضاء أولًا", + "Please select audit target type": "يرجى تحديد نوع هدف التدقيق", + "Previous": "السابق", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "يوفر آليات مفصلة لمراقبة الأداء والتنبيه لمساعدة المسؤولين على فهم حالة النظام في الوقت الفعلي وضمان استقراره وموثوقيته", + "Quota Save Failed": "فشل حفظ الحصة", + "Raw": "خام", + "Read-only OIDC settings": "إعدادات OIDC للقراءة فقط", + "Read-only settings": "إعدادات للقراءة فقط", + "Request failed": "فشل الطلب", + "s3fs": "s3fs", + "Select backend type": "حدد نوع الخلفية", + "sha256": "sha256", + "State": "الحالة", + "Stored token is hidden. Enter a new token only to replace it.": "الرمز المخزن مخفي. أدخل رمزًا جديدًا فقط لاستبداله.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "يكتشف الخادم الموقع الحالي تلقائيًا. أضف موقعًا بعيدًا واحدًا أو أكثر للانضمام إلى مجموعة النسخ.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "يُستخدم هذا المفتاح كافتراضي للمنصة لكل من SSE-KMS وSSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "لم يعرّض هذا الخادم واجهة API لنسخ المواقع بعد، لذلك تعرض الصفحة رسالة بديلة واضحة بدلًا من خطأ NotImplemented الخام.", + "This user already exists": "هذا المستخدم موجود بالفعل", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "تعذر الوصول إلى نقطة نهاية صحة خادم RustFS", + "Unhealthy": "غير سليم", + "Update license": "تحديث الترخيص", + "Update the deployment environment first before changing ENV-managed module switches.": "حدّث بيئة النشر أولًا قبل تغيير مفاتيح الوحدات المُدارة بواسطة ENV.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "حدّث تفاصيل النظراء التي يستخدمها RustFS لإدارة نسخ المواقع. سيتم الاحتفاظ بالحقول غير المعروضة هنا من التكوين الحالي.", + "update:name": "update:name", + "update:show": "update:show", + "update:visible": "update:visible", + "Usage": "الاستخدام", + "Webhook": "Webhook", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "عندما تنفذ الخلفية نقطة نهاية معلومات نسخ المواقع، ستعرض هذه الصفحة تلقائيًا مواقع النظراء وملخصات الحالة وإجراءات الإدارة.", + "X-Amz-Algorithm": "X-Amz-Algorithm", + "X-Amz-Content-Sha256": "X-Amz-Content-Sha256", + "X-Amz-Credential": "X-Amz-Credential", + "X-Amz-Date": "X-Amz-Date", + "X-Amz-Expires": "X-Amz-Expires", + "X-Amz-Security-Token": "X-Amz-Security-Token", + "X-Amz-Signature": "X-Amz-Signature", + "X-Amz-SignedHeaders": "X-Amz-SignedHeaders", + "X-Amz-Target": "X-Amz-Target", + "You do not have permission to update module switches.": "ليست لديك صلاحية تحديث مفاتيح الوحدات.", + "You do not have permission to update OIDC providers.": "ليست لديك صلاحية تحديث موفري OIDC." } diff --git a/i18n/locales/de-DE.json b/i18n/locales/de-DE.json index 897b7fe..9386c2b 100644 --- a/i18n/locales/de-DE.json +++ b/i18n/locales/de-DE.json @@ -262,7 +262,7 @@ "Exporting...": "Exportieren...", "External MinIO tier": "Externes MinIO-Tier", "Failed": "Fehlgeschlagen ({count})", - "Failed Status": "Fehlgeschlagen({count})", + "Failed Status": "Fehlgeschlagen", "Failed to clear cache": "Cache konnte nicht gelöscht werden", "Failed to configure bucket encryption": "Bucket-Verschlüsselung konnte nicht konfiguriert werden", "Failed to create event target": "Ereignisziel konnte nicht erstellt werden", @@ -727,8 +727,6 @@ "Send events via MQTT broker": "Ereignisse über MQTT-Broker senden", "Send events via NATS": "Ereignisse über NATS senden", "Send events via Pulsar": "Ereignisse über Pulsar senden", - "Send events via NATS": "Ereignisse über NATS senden", - "Send events via Pulsar": "Ereignisse über Pulsar senden", "Server Address": "Serveradresse", "Server Configuration": "Serverkonfiguration", "Server Host": "Server-Host", @@ -914,8 +912,8 @@ "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", "empty is indicates permanent validity": "Leer bedeutet dauerhafte Gültigkeit", "en-US": "en-US", - "failed": "Fehlgeschlagen({count})", - "in progress": "{total} Aufgaben in Bearbeitung ({processing} werden verarbeitet, {completed} abgeschlossen)", + "failed": "Fehlgeschlagen", + "in progress": "In Bearbeitung", "notice": "beachten", "password length cannot be less than 8 characters and greater than 16 characters": "Passwortlänge darf nicht weniger als 8 Zeichen und nicht mehr als 16 Zeichen sein", "paused": "Pausiert", @@ -1013,7 +1011,7 @@ "Enable ILM expiry rule replication for every site?": "Replikation von ILM-Ablaufregeln für alle Sites aktivieren?", "Disable ILM expiry rule replication for every site?": "Replikation von ILM-Ablaufregeln für alle Sites deaktivieren?", "Save Success": "Erfolgreich gespeichert", - "Site": "Site", + "Site": "Standort", "Unnamed Site": "Unbenannte Site", "Peer site": "Peer-Site", "Deployment ID": "Bereitstellungs-ID", @@ -1029,7 +1027,7 @@ "The server detects the local site identity from the active RustFS deployment.": "Der Server erkennt die lokale Site-Identität aus der aktiven RustFS-Bereitstellung.", "Replication Summary": "Replikationsübersicht", "Overview of replicated configuration and object replication activity.": "Überblick über replizierte Konfigurationen und Objekt-Replikationsaktivitäten.", - "Sites": "Sites", + "Sites": "Standorte", "Replicated Objects": "Replizierte Objekte", "Replicated Size": "Replizierte Größe", "Replicated Scope": "Replikationsumfang", @@ -1045,8 +1043,8 @@ "Peer Sites": "Peer-Sites", "Add a remote site to initialize site replication for this deployment.": "Fügen Sie eine entfernte Site hinzu, um die Site-Replikation für diese Bereitstellung zu initialisieren.", "Set Up Site Replication": "Site-Replikation einrichten", - "site": "Site", - "sites": "Sites", + "site": "Standort", + "sites": "Standorte", "Endpoint must be unique": "Endpunkt muss eindeutig sein", "Site replication configuration saved": "Konfiguration der Site-Replikation gespeichert", "Expand replication group": "Replikationsgruppe erweitern", @@ -1111,8 +1109,8 @@ "Failed to save OIDC provider": "OIDC-Anbieter konnte nicht gespeichert werden", "Failed to validate OIDC configuration": "OIDC-Konfiguration konnte nicht validiert werden", "Groups Claim": "Gruppen-Claim", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "Rollen-Claim", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separater Claim für Rollenwerte (z. B. roles). Leer lassen, um nur den Gruppen-Claim zu verwenden.", "Issuer": "Aussteller", "Leave empty to keep current secret": "Leer lassen, um das aktuelle Secret beizubehalten", "Loading...": "Wird geladen...", @@ -1149,5 +1147,116 @@ "Validate": "Validieren", "Validating...": "Wird validiert...", "View and manage persisted OIDC providers.": "Persistierte OIDC-Anbieter anzeigen und verwalten.", - "You have unsaved OIDC changes. Do you want to discard them?": "Sie haben ungespeicherte OIDC-Änderungen. Möchten Sie sie verwerfen?" + "You have unsaved OIDC changes. Do you want to discard them?": "Sie haben ungespeicherte OIDC-Änderungen. Möchten Sie sie verwerfen?", + "Add {type} Audit Target": "{type}-Audit-Ziel hinzufügen", + "Add Audit Target": "Audit-Ziel hinzufügen", + "API not ready": "API ist nicht bereit", + "Are you sure you want to delete this audit target?": "Möchten Sie dieses Audit-Ziel wirklich löschen?", + "Are you sure you want to delete this tag?": "Möchten Sie dieses Tag wirklich löschen?", + "Are you sure you want to delete this user?": "Möchten Sie diesen Benutzer wirklich löschen?", + "Audit is disabled": "Audit ist deaktiviert", + "Audit is disabled. Enable audit before managing audit targets.": "Audit ist deaktiviert. Aktivieren Sie Audit, bevor Sie Audit-Ziele verwalten.", + "Audit target created successfully": "Audit-Ziel erfolgreich erstellt", + "Audit Targets": "Audit-Ziele", + "Back to Login": "Zurück zur Anmeldung", + "Bucket name is required": "Bucket-Name ist erforderlich", + "Bucket names must be 3-63 characters long": "Bucket-Namen müssen 3 bis 63 Zeichen lang sein", + "Bucket names must not contain uppercase letters": "Bucket-Namen dürfen keine Großbuchstaben enthalten", + "Bucket not found": "Bucket nicht gefunden", + "Cancel Deletion": "Löschung abbrechen", + "Cancel Key Deletion": "Schlüssellöschung abbrechen", + "Client ID is required": "Client-ID ist erforderlich", + "Collecting files": "Dateien werden gesammelt", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Erfasst und visualisiert wichtige Leistungsindikatoren wie CPU, Arbeitsspeicher und Festplatten-I/O, damit Benutzer den Systemzustand und Leistungsengpässe nachvollziehen können", + "Comma-separated audience IDs.": "Audience-IDs durch Kommas getrennt eingeben.", + "Console": "Console", + "Content Type": "Inhaltstyp", + "Controlled by {envKey}": "Gesteuert durch {envKey}", + "Copy Path": "Pfad kopieren", + "Create an audit target to forward audit logs.": "Erstellen Sie ein Audit-Ziel, um Audit-Protokolle weiterzuleiten.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Aktueller Backend-Status für replizierte Buckets, Benutzer, Gruppen, Richtlinien und Ablaufregeln des Lebenszyklus.", + "Default": "Standard", + "Delete Tag": "Tag löschen", + "Delete task created": "Löschaufgabe erstellt", + "Deletion Date": "Löschdatum", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "Der detaillierte Status der Standortreplikation ist auf diesem Server noch nicht verfügbar. Grundlegende Peer-Informationen werden unten weiterhin angezeigt.", + "Download Failed": "Download fehlgeschlagen", + "Download ready": "Download bereit", + "Downloading files": "Dateien werden heruntergeladen", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Jeder Remote-Standort benötigt einen Endpunkt und Administrator-Anmeldedaten, damit der Cluster den Beitritts-Handshake abschließen kann.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Jeder Remote-Standort verwendet seine Administrator-Anmeldedaten, um den initialen Replikations-Handshake abzuschließen.", + "Enable audit in Settings before managing audit targets.": "Aktivieren Sie Audit in den Einstellungen, bevor Sie Audit-Ziele verwalten.", + "Enable notify in Settings before managing bucket event subscriptions.": "Aktivieren Sie Benachrichtigungen in den Einstellungen, bevor Sie Bucket-Ereignisabonnements verwalten.", + "Enable notify in Settings before managing event destinations.": "Aktivieren Sie Benachrichtigungen in den Einstellungen, bevor Sie Ereignisziele verwalten.", + "Enter prefix...": "Präfix eingeben...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Einige Schalter werden durch Umgebungsvariablen gesteuert", + "Exit Fullscreen": "Vollbild beenden", + "Failed to create audit target": "Audit-Ziel konnte nicht erstellt werden", + "Failed to generate secure random keys": "Sichere Zufallsschlüssel konnten nicht erzeugt werden", + "Failed to load key details": "Schlüsseldetails konnten nicht geladen werden", + "Failed to load module switches": "Modulschalter konnten nicht geladen werden", + "File Permissions": "Dateiberechtigungen", + "Formatted": "Formatiert", + "Fullscreen": "Vollbild", + "Getting URL": "URL wird abgerufen", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Integritätsstatus", + "Healthy": "Fehlerfrei", + "Key Manager": "Schlüsselverwaltung", + "Leave blank to keep the stored Vault token.": "Leer lassen, um das gespeicherte Vault-Token beizubehalten.", + "Max Cached Keys": "Maximal zwischengespeicherte Schlüssel", + "Metadata": "Metadaten", + "Module switch is managed by environment variables": "Der Modulschalter wird durch Umgebungsvariablen verwaltet", + "Module switches saved": "Modulschalter gespeichert", + "New access key has been created": "Neuer Zugriffsschlüssel wurde erstellt", + "No Audit Targets": "Keine Audit-Ziele", + "No files to download": "Keine Dateien zum Herunterladen", + "No options available": "Keine Optionen verfügbar", + "No tags": "Keine Tags", + "Notify": "Benachrichtigungen", + "Notify is disabled": "Benachrichtigungen sind deaktiviert", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Benachrichtigungen sind deaktiviert. Aktivieren Sie sie, bevor Sie Bucket-Ereignisabonnements verwalten.", + "Notify is disabled. Enable notify before managing event destinations.": "Benachrichtigungen sind deaktiviert. Aktivieren Sie sie, bevor Sie Ereignisziele verwalten.", + "Origin": "Ursprung", + "Other Audiences": "Weitere Audiences", + "password length cannot be less than 8 characters and greater than 40 characters": "Das Passwort muss mindestens 8 und höchstens 40 Zeichen lang sein", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Peer-Mitgliedschaft und bearbeitbare Replikationssteuerungen, abgestimmt auf die RustFS-Backend-API für Standortreplikation und den MinIO-ähnlichen Standortverwaltungsablauf.", + "Please enter GCS credentials JSON": "Bitte GCS-Anmeldedaten als JSON eingeben", + "Please remove members first": "Bitte entfernen Sie zuerst die Mitglieder", + "Please select audit target type": "Bitte Audit-Zieltyp auswählen", + "Previous": "Zurück", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Bietet detaillierte Leistungsüberwachung und Alarmierungsmechanismen, damit Administratoren den Systemzustand in Echtzeit verstehen und Stabilität sowie Zuverlässigkeit sicherstellen können", + "Quota Save Failed": "Speichern des Kontingents fehlgeschlagen", + "Raw": "Rohdaten", + "Read-only OIDC settings": "Schreibgeschützte OIDC-Einstellungen", + "Read-only settings": "Schreibgeschützte Einstellungen", + "Request failed": "Anfrage fehlgeschlagen", + "Select backend type": "Backend-Typ auswählen", + "sha256": "sha256", + "State": "Zustand", + "Stored token is hidden. Enter a new token only to replace it.": "Das gespeicherte Token ist ausgeblendet. Geben Sie nur zum Ersetzen ein neues Token ein.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "Der aktuelle Standort wird automatisch vom Server erkannt. Fügen Sie einen oder mehrere Remote-Standorte hinzu, um der Replikationsgruppe beizutreten.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Dieser Schlüssel wird als Plattformstandard für SSE-KMS und SSE-S3 verwendet.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Dieser Server stellt die API für Standortreplikation noch nicht bereit. Daher zeigt die Seite eine verständliche Ausweichmeldung statt eines rohen NotImplemented-Fehlers.", + "This user already exists": "Dieser Benutzer existiert bereits", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "Der Integritätsendpunkt des RustFS-Servers ist nicht erreichbar", + "Unhealthy": "Fehlerhaft", + "Update license": "Lizenz aktualisieren", + "Update the deployment environment first before changing ENV-managed module switches.": "Aktualisieren Sie zuerst die Bereitstellungsumgebung, bevor Sie ENV-verwaltete Modulschalter ändern.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Aktualisieren Sie die Peer-Details, die RustFS für die Verwaltung der Standortreplikation verwendet. Hier nicht angezeigte Felder werden aus der aktuellen Konfiguration beibehalten.", + "Usage": "Nutzung", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Sobald das Backend den Informationsendpunkt für Standortreplikation implementiert, zeigt diese Seite automatisch Peer-Standorte, Statuszusammenfassungen und Verwaltungsaktionen an.", + "X-Amz-Algorithm": "X-Amz-Algorithm", + "X-Amz-Content-Sha256": "X-Amz-Content-Sha256", + "X-Amz-Credential": "X-Amz-Credential", + "X-Amz-Date": "X-Amz-Date", + "X-Amz-Expires": "X-Amz-Expires", + "X-Amz-Security-Token": "X-Amz-Security-Token", + "X-Amz-Signature": "X-Amz-Signature", + "X-Amz-SignedHeaders": "X-Amz-SignedHeaders", + "X-Amz-Target": "X-Amz-Target", + "You do not have permission to update module switches.": "Sie haben keine Berechtigung, Modulschalter zu aktualisieren.", + "You do not have permission to update OIDC providers.": "Sie haben keine Berechtigung, OIDC-Anbieter zu aktualisieren." } diff --git a/i18n/locales/en-US.json b/i18n/locales/en-US.json index e01a258..1632e77 100644 --- a/i18n/locales/en-US.json +++ b/i18n/locales/en-US.json @@ -1158,5 +1158,105 @@ "The value is used only for the initial join request.": "The value is used only for the initial join request.", "Select": "Select", "Object Naming Mode": "Object Naming Mode", - "Optional": "Optional" + "Optional": "Optional", + "a": "a", + "Add {type} Audit Target": "Add {type} Audit Target", + "Add Audit Target": "Add Audit Target", + "API not ready": "API not ready", + "Are you sure you want to delete this audit target?": "Are you sure you want to delete this audit target?", + "Are you sure you want to delete this tag?": "Are you sure you want to delete this tag?", + "Are you sure you want to delete this user?": "Are you sure you want to delete this user?", + "ARN": "ARN", + "Audit is disabled": "Audit is disabled", + "Audit is disabled. Enable audit before managing audit targets.": "Audit is disabled. Enable audit before managing audit targets.", + "Audit target created successfully": "Audit target created successfully", + "Audit Targets": "Audit Targets", + "AWS S3": "AWS S3", + "Back to Login": "Back to Login", + "Bucket name is required": "Bucket name is required", + "Bucket not found": "Bucket not found", + "Cancel Deletion": "Cancel Deletion", + "Cancel Key Deletion": "Cancel Key Deletion", + "Client ID is required": "Client ID is required", + "Collecting files": "Collecting files", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks", + "Comma-separated audience IDs.": "Comma-separated audience IDs.", + "Content Type": "Content Type", + "Copy Path": "Copy Path", + "Create an audit target to forward audit logs.": "Create an audit target to forward audit logs.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.", + "Delete Tag": "Delete Tag", + "Delete task created": "Delete task created", + "Deletion Date": "Deletion Date", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.", + "div": "div", + "Download Failed": "Download Failed", + "Download ready": "Download ready", + "Downloading files": "Downloading files", + "e.g., app-default": "e.g., app-default", + "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Each remote site uses its administrator credentials to complete the initial replication handshake.", + "Enable audit in Settings before managing audit targets.": "Enable audit in Settings before managing audit targets.", + "Enter prefix...": "Enter prefix...", + "Example: http://localhost:9000 or https://your-domain.com": "Example: http://localhost:9000 or https://your-domain.com", + "Exit Fullscreen": "Exit Fullscreen", + "Failed to create audit target": "Failed to create audit target", + "Failed to generate secure random keys": "Failed to generate secure random keys", + "Failed to load key details": "Failed to load key details", + "File Permissions": "File Permissions", + "Formatted": "Formatted", + "Fullscreen": "Fullscreen", + "Getting URL": "Getting URL", + "Health": "Health", + "Healthy": "Healthy", + "Key Manager": "Key Manager", + "Max Cached Keys": "Max Cached Keys", + "Metadata": "Metadata", + "Minio": "Minio", + "New access key has been created": "New access key has been created", + "No Audit Targets": "No Audit Targets", + "No files to download": "No files to download", + "No options available": "No options available", + "No tags": "No tags", + "Origin": "Origin", + "Other Audiences": "Other Audiences", + "password length cannot be less than 8 characters and greater than 40 characters": "password length cannot be less than 8 characters and greater than 40 characters", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.", + "Please enter GCS credentials JSON": "Please enter GCS credentials JSON", + "Please remove members first": "Please remove members first", + "Please select audit target type": "Please select audit target type", + "Previous": "Previous", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability", + "Quota Save Failed": "Quota Save Failed", + "Raw": "Raw", + "Request failed": "Request failed", + "s3fs": "s3fs", + "Select backend type": "Select backend type", + "sha256": "sha256", + "State": "State", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "This key is used as the platform default for SSE-KMS and SSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.", + "This user already exists": "This user already exists", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "Unable to reach RustFS server health endpoint", + "Unhealthy": "Unhealthy", + "Update license": "Update license", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.", + "update:name": "update:name", + "update:show": "update:show", + "update:visible": "update:visible", + "Usage": "Usage", + "Webhook": "Webhook", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.", + "X-Amz-Algorithm": "X-Amz-Algorithm", + "X-Amz-Content-Sha256": "X-Amz-Content-Sha256", + "X-Amz-Credential": "X-Amz-Credential", + "X-Amz-Date": "X-Amz-Date", + "X-Amz-Expires": "X-Amz-Expires", + "X-Amz-Security-Token": "X-Amz-Security-Token", + "X-Amz-Signature": "X-Amz-Signature", + "X-Amz-SignedHeaders": "X-Amz-SignedHeaders", + "X-Amz-Target": "X-Amz-Target" } diff --git a/i18n/locales/es-ES.json b/i18n/locales/es-ES.json index d52fdd1..78983da 100644 --- a/i18n/locales/es-ES.json +++ b/i18n/locales/es-ES.json @@ -262,7 +262,7 @@ "Exporting...": "Exportando...", "External MinIO tier": "Nivel MinIO externo", "Failed": "Error({count})", - "Failed Status": "Fallido({count})", + "Failed Status": "Fallido", "Failed to clear cache": "Error al limpiar la caché", "Failed to configure bucket encryption": "Error al configurar el cifrado del bucket", "Failed to create event target": "Error al crear destino de evento", @@ -334,7 +334,7 @@ "Import Success": "Importación Exitosa", "Import/Export": "Importar/Exportar", "Importing...": "Importando...", - "In Progress": "{total} tareas en progreso ({procesamiento} procesamiento, {completado} completado)", + "In Progress": "{total} tareas en progreso ({processing} procesando, {completed} completadas)", "Inactive": "Inactivo", "Include objects that already exist in the source bucket.": "Incluir objetos que ya existen en el bucket de origen.", "Infinite Scaling": "Escalabilidad Infinita", @@ -921,8 +921,8 @@ "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", "empty is indicates permanent validity": "Vacío indica validez permanente", "en-US": "es-US", - "failed": "Fallido({count})", - "in progress": "{total} tareas en progreso ({processing} procesando, {completed} completadas)", + "failed": "Fallido", + "in progress": "En progreso", "notice": "aviso", "password length cannot be less than 8 characters and greater than 16 characters": "La longitud de la contraseña no puede ser menor de 8 caracteres y mayor de 16 caracteres", "paused": "En Pausa", @@ -1118,8 +1118,8 @@ "Failed to save OIDC provider": "No se pudo guardar el proveedor OIDC", "Failed to validate OIDC configuration": "No se pudo validar la configuración OIDC", "Groups Claim": "Claim de grupos", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "Claim de roles", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Opcional. Claim separado para valores de rol (por ejemplo, roles). Déjalo vacío para usar solo el claim de grupos.", "Issuer": "Emisor", "Leave empty to keep current secret": "Déjelo vacío para conservar el secreto actual", "Loading...": "Cargando...", @@ -1146,7 +1146,7 @@ "Redirect URI will be resolved dynamically at runtime.": "La URI de redirección se resolverá dinámicamente en tiempo de ejecución.", "Restart Required": "Reinicio requerido", "Role Policy": "Política de rol", - "Scopes": "Scopes", + "Scopes": "Ámbitos", "Scopes must include openid": "Los scopes deben incluir openid", "Secret Configured": "Secreto configurado", "Token Endpoint": "Endpoint de token", @@ -1156,5 +1156,107 @@ "Validate": "Validar", "Validating...": "Validando...", "View and manage persisted OIDC providers.": "Vea y administre los proveedores OIDC persistidos.", - "You have unsaved OIDC changes. Do you want to discard them?": "Tiene cambios de OIDC sin guardar. ¿Desea descartarlos?" + "You have unsaved OIDC changes. Do you want to discard them?": "Tiene cambios de OIDC sin guardar. ¿Desea descartarlos?", + "Add {type} Audit Target": "Añadir destino de auditoría {type}", + "Add Audit Target": "Añadir destino de auditoría", + "API not ready": "La API no está preparada", + "Are you sure you want to delete this audit target?": "¿Seguro que quieres eliminar este destino de auditoría?", + "Are you sure you want to delete this tag?": "¿Seguro que quieres eliminar esta etiqueta?", + "Are you sure you want to delete this user?": "¿Seguro que quieres eliminar este usuario?", + "Audit is disabled": "La auditoría está deshabilitada", + "Audit is disabled. Enable audit before managing audit targets.": "La auditoría está deshabilitada. Habilita la auditoría antes de gestionar destinos de auditoría.", + "Audit target created successfully": "Destino de auditoría creado correctamente", + "Audit Targets": "Destinos de auditoría", + "Back to Login": "Volver al inicio de sesión", + "Bucket name is required": "El nombre del bucket es obligatorio", + "Bucket names must be 3-63 characters long": "Los nombres de bucket deben tener entre 3 y 63 caracteres", + "Bucket names must not contain uppercase letters": "Los nombres de bucket no deben contener letras mayúsculas", + "Bucket not found": "Bucket no encontrado", + "Cancel Deletion": "Cancelar eliminación", + "Cancel Key Deletion": "Cancelar eliminación de clave", + "Client ID is required": "El ID de cliente es obligatorio", + "Collecting files": "Recopilando archivos", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Recopila y muestra indicadores clave de rendimiento, como CPU, memoria y E/S de disco, mediante gráficos para ayudar a comprender el estado del sistema y los cuellos de botella de rendimiento", + "Comma-separated audience IDs.": "IDs de audiencia separados por comas.", + "Console": "Console", + "Content Type": "Tipo de contenido", + "Controlled by {envKey}": "Controlado por {envKey}", + "Copy Path": "Copiar ruta", + "Create an audit target to forward audit logs.": "Crea un destino de auditoría para reenviar registros de auditoría.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Estado actual del backend para buckets, usuarios, grupos, políticas y reglas de expiración del ciclo de vida replicados.", + "Default": "Predeterminado", + "Delete Tag": "Eliminar etiqueta", + "Delete task created": "Tarea de eliminación creada", + "Deletion Date": "Fecha de eliminación", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "El estado detallado de la replicación de sitio aún no está disponible en este servidor. La información básica de pares se sigue mostrando abajo.", + "Download Failed": "Descarga fallida", + "Download ready": "Descarga lista", + "Downloading files": "Descargando archivos", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Cada sitio remoto necesita un endpoint y credenciales de administrador para que el clúster complete el handshake de unión.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Cada sitio remoto usa sus credenciales de administrador para completar el handshake inicial de replicación.", + "Enable audit in Settings before managing audit targets.": "Habilita la auditoría en Configuración antes de gestionar destinos de auditoría.", + "Enable notify in Settings before managing bucket event subscriptions.": "Habilita las notificaciones en Configuración antes de gestionar suscripciones a eventos de bucket.", + "Enable notify in Settings before managing event destinations.": "Habilita las notificaciones en Configuración antes de gestionar destinos de eventos.", + "Enter prefix...": "Introducir prefijo...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Algunos interruptores están controlados por variables de entorno", + "Exit Fullscreen": "Salir de pantalla completa", + "Failed to create audit target": "No se pudo crear el destino de auditoría", + "Failed to generate secure random keys": "No se pudieron generar claves aleatorias seguras", + "Failed to load key details": "No se pudieron cargar los detalles de la clave", + "Failed to load module switches": "No se pudieron cargar los interruptores de módulo", + "File Permissions": "Permisos de archivo", + "Formatted": "Formateado", + "Fullscreen": "Pantalla completa", + "Getting URL": "Obteniendo URL", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Estado de salud", + "Healthy": "Correcto", + "Key Manager": "Gestor de claves", + "Leave blank to keep the stored Vault token.": "Déjalo en blanco para conservar el token de Vault almacenado.", + "Max Cached Keys": "Máximo de claves en caché", + "Metadata": "Metadatos", + "Module switch is managed by environment variables": "El interruptor de módulo está gestionado por variables de entorno", + "Module switches saved": "Interruptores de módulo guardados", + "New access key has been created": "Se ha creado una nueva clave de acceso", + "No Audit Targets": "Sin destinos de auditoría", + "No files to download": "No hay archivos para descargar", + "No options available": "No hay opciones disponibles", + "No tags": "Sin etiquetas", + "Notify": "Notificaciones", + "Notify is disabled": "Las notificaciones están deshabilitadas", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Las notificaciones están deshabilitadas. Habilítalas antes de gestionar suscripciones a eventos de bucket.", + "Notify is disabled. Enable notify before managing event destinations.": "Las notificaciones están deshabilitadas. Habilítalas antes de gestionar destinos de eventos.", + "Origin": "Origen", + "Other Audiences": "Otras audiencias", + "password length cannot be less than 8 characters and greater than 40 characters": "La contraseña debe tener entre 8 y 40 caracteres", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Pertenencia de pares y controles de replicación editables, alineados con la API backend de replicación de sitio de RustFS y el flujo de gestión de sitios estilo MinIO.", + "Please enter GCS credentials JSON": "Introduce el JSON de credenciales de GCS", + "Please remove members first": "Elimina primero los miembros", + "Please select audit target type": "Selecciona el tipo de destino de auditoría", + "Previous": "Anterior", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Proporciona mecanismos detallados de monitorización de rendimiento y alertas para ayudar a los administradores a comprender el estado del sistema en tiempo real y garantizar su estabilidad y fiabilidad", + "Quota Save Failed": "Error al guardar la cuota", + "Raw": "Sin procesar", + "Read-only OIDC settings": "Configuración OIDC de solo lectura", + "Read-only settings": "Configuración de solo lectura", + "Request failed": "La solicitud falló", + "Select backend type": "Seleccionar tipo de backend", + "sha256": "sha256", + "State": "Estado", + "Stored token is hidden. Enter a new token only to replace it.": "El token almacenado está oculto. Introduce uno nuevo solo para reemplazarlo.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "El sitio actual se detecta automáticamente por el servidor. Añade uno o más sitios remotos para unirte al grupo de replicación.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Esta clave se usa como valor predeterminado de la plataforma para SSE-KMS y SSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Este servidor aún no expone la API de replicación de sitio, por lo que la página muestra una alternativa clara en lugar de un error NotImplemented sin procesar.", + "This user already exists": "Este usuario ya existe", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "No se puede acceder al endpoint de salud del servidor RustFS", + "Unhealthy": "Con problemas", + "Update license": "Actualizar licencia", + "Update the deployment environment first before changing ENV-managed module switches.": "Actualiza primero el entorno de despliegue antes de cambiar interruptores de módulo gestionados por ENV.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Actualiza los detalles de pares que RustFS usa para gestionar la replicación de sitio. Los campos no mostrados aquí se conservan de la configuración actual.", + "Usage": "Uso", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Cuando el backend implemente el endpoint de información de replicación de sitio, esta página mostrará automáticamente sitios pares, resúmenes de estado y acciones de gestión.", + "You do not have permission to update module switches.": "No tienes permiso para actualizar interruptores de módulo.", + "You do not have permission to update OIDC providers.": "No tienes permiso para actualizar proveedores OIDC." } diff --git a/i18n/locales/fr-FR.json b/i18n/locales/fr-FR.json index fdcab5b..25c02ed 100644 --- a/i18n/locales/fr-FR.json +++ b/i18n/locales/fr-FR.json @@ -1120,8 +1120,8 @@ "Failed to save OIDC provider": "Échec de l'enregistrement du fournisseur OIDC", "Failed to validate OIDC configuration": "Échec de la validation de la configuration OIDC", "Groups Claim": "Claim des groupes", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "Claim de rôles", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Facultatif. Claim distinct pour les valeurs de rôle (par exemple roles). Laissez vide pour utiliser uniquement le claim des groupes.", "Issuer": "Émetteur", "Leave empty to keep current secret": "Laissez vide pour conserver le secret actuel", "Loading...": "Chargement...", @@ -1148,7 +1148,7 @@ "Redirect URI will be resolved dynamically at runtime.": "L'URI de redirection sera résolue dynamiquement à l'exécution.", "Restart Required": "Redémarrage requis", "Role Policy": "Politique de rôle", - "Scopes": "Scopes", + "Scopes": "Portées", "Scopes must include openid": "Les scopes doivent inclure openid", "Secret Configured": "Secret configuré", "Token Endpoint": "Point de terminaison du jeton", @@ -1158,5 +1158,105 @@ "Validate": "Valider", "Validating...": "Validation...", "View and manage persisted OIDC providers.": "Afficher et gérer les fournisseurs OIDC persistés.", - "You have unsaved OIDC changes. Do you want to discard them?": "Vous avez des modifications OIDC non enregistrées. Voulez-vous les ignorer ?" + "You have unsaved OIDC changes. Do you want to discard them?": "Vous avez des modifications OIDC non enregistrées. Voulez-vous les ignorer ?", + "Add {type} Audit Target": "Ajouter une cible d’audit {type}", + "Add Audit Target": "Ajouter une cible d’audit", + "API not ready": "API non prête", + "Are you sure you want to delete this audit target?": "Voulez-vous vraiment supprimer cette cible d’audit ?", + "Are you sure you want to delete this tag?": "Voulez-vous vraiment supprimer cette étiquette ?", + "Are you sure you want to delete this user?": "Voulez-vous vraiment supprimer cet utilisateur ?", + "Audit is disabled": "L’audit est désactivé", + "Audit is disabled. Enable audit before managing audit targets.": "L’audit est désactivé. Activez l’audit avant de gérer les cibles d’audit.", + "Audit target created successfully": "Cible d’audit créée avec succès", + "Audit Targets": "Cibles d’audit", + "Back to Login": "Retour à la connexion", + "Bucket name is required": "Le nom du bucket est requis", + "Bucket names must be 3-63 characters long": "Les noms de bucket doivent comporter entre 3 et 63 caractères", + "Bucket names must not contain uppercase letters": "Les noms de bucket ne doivent pas contenir de majuscules", + "Bucket not found": "Bucket introuvable", + "Cancel Deletion": "Annuler la suppression", + "Cancel Key Deletion": "Annuler la suppression de la clé", + "Client ID is required": "L’ID client est requis", + "Collecting files": "Collecte des fichiers", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Collecte et affiche les indicateurs clés de performance, comme le CPU, la mémoire et les E/S disque, sous forme de graphiques afin d’aider les utilisateurs à comprendre l’état du système et les goulots d’étranglement", + "Comma-separated audience IDs.": "IDs d’audience séparés par des virgules.", + "Console": "Console", + "Content Type": "Type de contenu", + "Controlled by {envKey}": "Contrôlé par {envKey}", + "Copy Path": "Copier le chemin", + "Create an audit target to forward audit logs.": "Créez une cible d’audit pour transférer les journaux d’audit.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "État actuel du backend pour les buckets, utilisateurs, groupes, politiques et règles d’expiration du cycle de vie répliqués.", + "Default": "Par défaut", + "Delete Tag": "Supprimer l’étiquette", + "Delete task created": "Tâche de suppression créée", + "Deletion Date": "Date de suppression", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "L’état détaillé de la réplication de site n’est pas encore disponible sur ce serveur. Les informations de base sur les pairs restent affichées ci-dessous.", + "Download Failed": "Échec du téléchargement", + "Download ready": "Téléchargement prêt", + "Downloading files": "Téléchargement des fichiers", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Chaque site distant nécessite un point de terminaison et des identifiants administrateur afin que le cluster puisse terminer la poignée de main d’adhésion.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Chaque site distant utilise ses identifiants administrateur pour terminer la poignée de main initiale de réplication.", + "Enable audit in Settings before managing audit targets.": "Activez l’audit dans les paramètres avant de gérer les cibles d’audit.", + "Enable notify in Settings before managing bucket event subscriptions.": "Activez les notifications dans les paramètres avant de gérer les abonnements aux événements de bucket.", + "Enable notify in Settings before managing event destinations.": "Activez les notifications dans les paramètres avant de gérer les destinations d’événements.", + "Enter prefix...": "Saisir un préfixe...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Certaines options sont contrôlées par des variables d’environnement", + "Exit Fullscreen": "Quitter le plein écran", + "Failed to create audit target": "Échec de la création de la cible d’audit", + "Failed to generate secure random keys": "Échec de la génération de clés aléatoires sécurisées", + "Failed to load key details": "Échec du chargement des détails de la clé", + "Failed to load module switches": "Échec du chargement des options de module", + "File Permissions": "Autorisations du fichier", + "Formatted": "Formaté", + "Fullscreen": "Plein écran", + "Getting URL": "Obtention de l’URL", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Santé", + "Healthy": "Sain", + "Key Manager": "Gestionnaire de clés", + "Leave blank to keep the stored Vault token.": "Laissez vide pour conserver le jeton Vault enregistré.", + "Max Cached Keys": "Nombre maximal de clés en cache", + "Metadata": "Métadonnées", + "Module switch is managed by environment variables": "L’option de module est gérée par des variables d’environnement", + "Module switches saved": "Options de module enregistrées", + "New access key has been created": "Une nouvelle clé d’accès a été créée", + "No Audit Targets": "Aucune cible d’audit", + "No files to download": "Aucun fichier à télécharger", + "No options available": "Aucune option disponible", + "No tags": "Aucune étiquette", + "Notify": "Notifications", + "Notify is disabled": "Les notifications sont désactivées", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Les notifications sont désactivées. Activez-les avant de gérer les abonnements aux événements de bucket.", + "Notify is disabled. Enable notify before managing event destinations.": "Les notifications sont désactivées. Activez-les avant de gérer les destinations d’événements.", + "Origin": "Origine", + "Other Audiences": "Autres audiences", + "password length cannot be less than 8 characters and greater than 40 characters": "Le mot de passe doit contenir entre 8 et 40 caractères", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Appartenance des pairs et contrôles de réplication modifiables, alignés sur l’API backend de réplication de site RustFS et le flux de gestion de site de type MinIO.", + "Please enter GCS credentials JSON": "Veuillez saisir le JSON des identifiants GCS", + "Please remove members first": "Veuillez d’abord supprimer les membres", + "Please select audit target type": "Veuillez sélectionner le type de cible d’audit", + "Previous": "Précédent", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Fournit des mécanismes détaillés de surveillance des performances et d’alerte afin d’aider les administrateurs à comprendre l’état du système en temps réel et à garantir sa stabilité et sa fiabilité", + "Quota Save Failed": "Échec de l’enregistrement du quota", + "Raw": "Brut", + "Read-only OIDC settings": "Paramètres OIDC en lecture seule", + "Read-only settings": "Paramètres en lecture seule", + "Request failed": "Échec de la requête", + "Select backend type": "Sélectionner le type de backend", + "State": "État", + "Stored token is hidden. Enter a new token only to replace it.": "Le jeton enregistré est masqué. Saisissez un nouveau jeton uniquement pour le remplacer.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "Le site actuel est détecté automatiquement par le serveur. Ajoutez un ou plusieurs sites distants pour rejoindre le groupe de réplication.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Cette clé est utilisée comme clé par défaut de la plateforme pour SSE-KMS et SSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Ce serveur n’expose pas encore l’API de réplication de site ; la page affiche donc un message de secours clair au lieu d’une erreur NotImplemented brute.", + "This user already exists": "Cet utilisateur existe déjà", + "Unable to reach RustFS server health endpoint": "Impossible d’atteindre le point de terminaison de santé du serveur RustFS", + "Unhealthy": "Défaillant", + "Update license": "Mettre à jour la licence", + "Update the deployment environment first before changing ENV-managed module switches.": "Mettez d’abord à jour l’environnement de déploiement avant de modifier les options de module gérées par ENV.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Mettez à jour les détails des pairs utilisés par RustFS pour la gestion de la réplication de site. Les champs non affichés ici sont conservés depuis la configuration actuelle.", + "Usage": "Utilisation", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Lorsque le backend implémentera le point de terminaison d’informations de réplication de site, cette page affichera automatiquement les sites pairs, les résumés d’état et les actions de gestion.", + "You do not have permission to update module switches.": "Vous n’avez pas l’autorisation de mettre à jour les options de module.", + "You do not have permission to update OIDC providers.": "Vous n’avez pas l’autorisation de mettre à jour les fournisseurs OIDC." } diff --git a/i18n/locales/id-ID.json b/i18n/locales/id-ID.json index fd0fc77..1c14f34 100644 --- a/i18n/locales/id-ID.json +++ b/i18n/locales/id-ID.json @@ -1118,8 +1118,8 @@ "Failed to save OIDC provider": "Gagal menyimpan penyedia OIDC", "Failed to validate OIDC configuration": "Gagal memvalidasi konfigurasi OIDC", "Groups Claim": "Groups Claim", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Opsional. Separate claim for role values (e.g. roles). Biarkan kosong untuk menggunakan group claim saja.", + "Roles Claim": "Klaim Peran", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Opsional. Klaim terpisah untuk nilai peran (misalnya roles). Biarkan kosong untuk hanya menggunakan klaim grup.", "Issuer": "Issuer", "Leave empty to keep current secret": "Biarkan kosong untuk mempertahankan secret saat ini", "Loading...": "Memuat...", @@ -1146,7 +1146,7 @@ "Redirect URI will be resolved dynamically at runtime.": "Redirect URI akan ditentukan secara dinamis saat runtime.", "Restart Required": "Perlu Restart", "Role Policy": "Kebijakan Peran", - "Scopes": "Scopes", + "Scopes": "Cakupan", "Scopes must include openid": "Scopes harus menyertakan openid", "Secret Configured": "Secret Dikonfigurasi", "Token Endpoint": "Token Endpoint", @@ -1156,5 +1156,107 @@ "Validate": "Validasi", "Validating...": "Memvalidasi...", "View and manage persisted OIDC providers.": "Lihat dan kelola penyedia OIDC yang tersimpan.", - "You have unsaved OIDC changes. Do you want to discard them?": "Anda memiliki perubahan OIDC yang belum disimpan. Apakah Anda ingin membuangnya?" + "You have unsaved OIDC changes. Do you want to discard them?": "Anda memiliki perubahan OIDC yang belum disimpan. Apakah Anda ingin membuangnya?", + "Add {type} Audit Target": "Tambahkan Target Audit {type}", + "Add Audit Target": "Tambahkan Target Audit", + "API not ready": "API belum siap", + "Are you sure you want to delete this audit target?": "Yakin ingin menghapus target audit ini?", + "Are you sure you want to delete this tag?": "Yakin ingin menghapus tag ini?", + "Are you sure you want to delete this user?": "Yakin ingin menghapus pengguna ini?", + "Audit is disabled": "Audit dinonaktifkan", + "Audit is disabled. Enable audit before managing audit targets.": "Audit dinonaktifkan. Aktifkan audit sebelum mengelola target audit.", + "Audit target created successfully": "Target audit berhasil dibuat", + "Audit Targets": "Target Audit", + "Back to Login": "Kembali ke Login", + "Bucket name is required": "Nama bucket wajib diisi", + "Bucket names must be 3-63 characters long": "Nama bucket harus terdiri dari 3-63 karakter", + "Bucket names must not contain uppercase letters": "Nama bucket tidak boleh berisi huruf besar", + "Bucket not found": "Bucket tidak ditemukan", + "Cancel Deletion": "Batalkan Penghapusan", + "Cancel Key Deletion": "Batalkan Penghapusan Kunci", + "Client ID is required": "ID klien wajib diisi", + "Collecting files": "Mengumpulkan file", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Mengumpulkan dan menampilkan indikator kinerja utama seperti CPU, memori, dan I/O disk melalui grafik, sehingga pengguna dapat memahami status operasi sistem dan hambatan kinerja", + "Comma-separated audience IDs.": "ID audiens dipisahkan dengan koma.", + "Console": "Console", + "Content Type": "Tipe Konten", + "Controlled by {envKey}": "Dikontrol oleh {envKey}", + "Copy Path": "Salin Path", + "Create an audit target to forward audit logs.": "Buat target audit untuk meneruskan log audit.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Status backend saat ini untuk bucket, pengguna, grup, kebijakan, dan aturan kedaluwarsa siklus hidup yang direplikasi.", + "Default": "Default", + "Delete Tag": "Hapus Tag", + "Delete task created": "Tugas penghapusan dibuat", + "Deletion Date": "Tanggal Penghapusan", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "Status replikasi situs yang terperinci belum tersedia di server ini. Informasi peer dasar tetap ditampilkan di bawah.", + "Download Failed": "Unduhan Gagal", + "Download ready": "Unduhan siap", + "Downloading files": "Mengunduh file", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Setiap situs jarak jauh memerlukan endpoint dan kredensial administrator agar kluster dapat menyelesaikan handshake bergabung.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Setiap situs jarak jauh menggunakan kredensial administratornya untuk menyelesaikan handshake replikasi awal.", + "Enable audit in Settings before managing audit targets.": "Aktifkan audit di Pengaturan sebelum mengelola target audit.", + "Enable notify in Settings before managing bucket event subscriptions.": "Aktifkan notifikasi di Pengaturan sebelum mengelola langganan event bucket.", + "Enable notify in Settings before managing event destinations.": "Aktifkan notifikasi di Pengaturan sebelum mengelola tujuan event.", + "Enter prefix...": "Masukkan prefiks...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Beberapa switch dikontrol oleh variabel lingkungan", + "Exit Fullscreen": "Keluar dari Layar Penuh", + "Failed to create audit target": "Gagal membuat target audit", + "Failed to generate secure random keys": "Gagal membuat kunci acak yang aman", + "Failed to load key details": "Gagal memuat detail kunci", + "Failed to load module switches": "Gagal memuat switch modul", + "File Permissions": "Izin File", + "Formatted": "Diformat", + "Fullscreen": "Layar Penuh", + "Getting URL": "Mengambil URL", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Kesehatan", + "Healthy": "Sehat", + "Key Manager": "Pengelola Kunci", + "Leave blank to keep the stored Vault token.": "Biarkan kosong untuk mempertahankan token Vault yang tersimpan.", + "Max Cached Keys": "Maksimum Kunci Tercache", + "Metadata": "Metadata", + "Module switch is managed by environment variables": "Switch modul dikelola oleh variabel lingkungan", + "Module switches saved": "Switch modul disimpan", + "New access key has been created": "Kunci akses baru telah dibuat", + "No Audit Targets": "Tidak ada Target Audit", + "No files to download": "Tidak ada file untuk diunduh", + "No options available": "Tidak ada opsi yang tersedia", + "No tags": "Tidak ada tag", + "Notify": "Notifikasi", + "Notify is disabled": "Notifikasi dinonaktifkan", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Notifikasi dinonaktifkan. Aktifkan notifikasi sebelum mengelola langganan event bucket.", + "Notify is disabled. Enable notify before managing event destinations.": "Notifikasi dinonaktifkan. Aktifkan notifikasi sebelum mengelola tujuan event.", + "Origin": "Asal", + "Other Audiences": "Audiens Lain", + "password length cannot be less than 8 characters and greater than 40 characters": "Panjang kata sandi harus antara 8 hingga 40 karakter", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Keanggotaan peer dan kontrol replikasi yang dapat diedit, selaras dengan API replikasi situs backend RustFS dan alur pengelolaan situs bergaya MinIO.", + "Please enter GCS credentials JSON": "Masukkan JSON kredensial GCS", + "Please remove members first": "Hapus anggota terlebih dahulu", + "Please select audit target type": "Pilih tipe target audit", + "Previous": "Sebelumnya", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Menyediakan pemantauan kinerja dan mekanisme peringatan yang terperinci untuk membantu administrator memahami status sistem secara real time serta memastikan stabilitas dan keandalan sistem", + "Quota Save Failed": "Gagal Menyimpan Kuota", + "Raw": "Mentah", + "Read-only OIDC settings": "Pengaturan OIDC hanya-baca", + "Read-only settings": "Pengaturan hanya-baca", + "Request failed": "Permintaan gagal", + "Select backend type": "Pilih tipe backend", + "State": "Status", + "Stored token is hidden. Enter a new token only to replace it.": "Token yang tersimpan disembunyikan. Masukkan token baru hanya untuk menggantinya.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "Situs saat ini terdeteksi otomatis oleh server. Tambahkan satu atau beberapa situs jarak jauh untuk bergabung ke grup replikasi.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Kunci ini digunakan sebagai default platform untuk SSE-KMS dan SSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Server ini belum mengekspos API replikasi situs, sehingga halaman menampilkan fallback yang mudah dipahami, bukan error NotImplemented mentah.", + "This user already exists": "Pengguna ini sudah ada", + "Unable to reach RustFS server health endpoint": "Tidak dapat menjangkau endpoint kesehatan server RustFS", + "Unhealthy": "Tidak sehat", + "Update the deployment environment first before changing ENV-managed module switches.": "Perbarui lingkungan deployment terlebih dahulu sebelum mengubah switch modul yang dikelola ENV.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Perbarui detail peer yang digunakan RustFS untuk pengelolaan replikasi situs. Kolom yang tidak ditampilkan di sini dipertahankan dari konfigurasi saat ini.", + "update:name": "update:name", + "update:show": "update:show", + "update:visible": "update:visible", + "Usage": "Penggunaan", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Saat backend mengimplementasikan endpoint informasi replikasi situs, halaman ini akan otomatis menampilkan situs peer, ringkasan status, dan tindakan pengelolaan.", + "You do not have permission to update module switches.": "Anda tidak memiliki izin untuk memperbarui switch modul.", + "You do not have permission to update OIDC providers.": "Anda tidak memiliki izin untuk memperbarui penyedia OIDC." } diff --git a/i18n/locales/it-IT.json b/i18n/locales/it-IT.json index 1856eef..502c076 100644 --- a/i18n/locales/it-IT.json +++ b/i18n/locales/it-IT.json @@ -262,7 +262,7 @@ "Exporting...": "Esportazione...", "External MinIO tier": "Tier MinIO esterno", "Failed": "Non riuscito ({count})", - "Failed Status": "Non riuscito({count})", + "Failed Status": "Non riuscito", "Failed to clear cache": "Impossibile pulire la cache", "Failed to configure bucket encryption": "Impossibile configurare la crittografia bucket", "Failed to create event target": "Impossibile creare la destinazione evento", @@ -552,7 +552,7 @@ "Pause": "Pausa", "Paused": "In pausa", "Paused (with count)": "In pausa({count})", - "Pending": "In sospeso({conteggio})", + "Pending": "In sospeso({count})", "Pending Deletion": "Eliminazione in attesa", "Performance": "Prestazioni", "Platinum Service": "Servizio Platinum", @@ -784,7 +784,7 @@ "Sync delete markers to destination bucket.": "Sincronizza marker eliminazione al bucket destinazione.", "Synchronous": "Sincrono", "Tag": "Etichetta", - "Tag Delete Failed": "Eliminazione tag non riuscita: {errore}", + "Tag Delete Failed": "Eliminazione tag non riuscita: {error}", "Tag Key": "Chiave tag", "Tag Key Placeholder": "Segnaposto chiave tag", "Tag Name": "Nome tag", @@ -921,8 +921,8 @@ "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", "empty is indicates permanent validity": "Vuoto indica validità permanente", "en-US": "it-USA", - "failed": "Non riuscito({count})", - "in progress": "{total} attività in corso ({processing} in elaborazione, {completed} completate)", + "failed": "Non riuscito", + "in progress": "In corso", "notice": "avviso", "password length cannot be less than 8 characters and greater than 16 characters": "La lunghezza della password non può essere inferiore a 8 caratteri e superiore a 16 caratteri", "paused": "In pausa", @@ -1119,8 +1119,8 @@ "Failed to save OIDC provider": "Impossibile salvare il provider OIDC", "Failed to validate OIDC configuration": "Impossibile validare la configurazione OIDC", "Groups Claim": "Claim gruppi", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "Claim dei ruoli", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Facoltativo. Claim separato per i valori di ruolo (ad esempio roles). Lascia vuoto per usare solo il claim dei gruppi.", "Issuer": "Issuer", "Leave empty to keep current secret": "Lascia vuoto per mantenere il segreto corrente", "Loading...": "Caricamento...", @@ -1147,7 +1147,7 @@ "Redirect URI will be resolved dynamically at runtime.": "L'URI di reindirizzamento verrà risolto dinamicamente in fase di esecuzione.", "Restart Required": "Riavvio richiesto", "Role Policy": "Criterio di ruolo", - "Scopes": "Scopes", + "Scopes": "Ambiti", "Scopes must include openid": "Gli scopes devono includere openid", "Secret Configured": "Segreto configurato", "Token Endpoint": "Endpoint token", @@ -1157,5 +1157,106 @@ "Validate": "Valida", "Validating...": "Validazione...", "View and manage persisted OIDC providers.": "Visualizza e gestisci i provider OIDC persistiti.", - "You have unsaved OIDC changes. Do you want to discard them?": "Hai modifiche OIDC non salvate. Vuoi scartarle?" + "You have unsaved OIDC changes. Do you want to discard them?": "Hai modifiche OIDC non salvate. Vuoi scartarle?", + "Add {type} Audit Target": "Aggiungi destinazione di audit {type}", + "Add Audit Target": "Aggiungi destinazione di audit", + "API not ready": "API non pronta", + "Are you sure you want to delete this audit target?": "Vuoi davvero eliminare questa destinazione di audit?", + "Are you sure you want to delete this tag?": "Vuoi davvero eliminare questo tag?", + "Are you sure you want to delete this user?": "Vuoi davvero eliminare questo utente?", + "Audit is disabled": "L’audit è disabilitato", + "Audit is disabled. Enable audit before managing audit targets.": "L’audit è disabilitato. Abilita l’audit prima di gestire le destinazioni di audit.", + "Audit target created successfully": "Destinazione di audit creata correttamente", + "Audit Targets": "Destinazioni di audit", + "Back to Login": "Torna al login", + "Bucket name is required": "Il nome del bucket è obbligatorio", + "Bucket names must be 3-63 characters long": "I nomi dei bucket devono contenere da 3 a 63 caratteri", + "Bucket names must not contain uppercase letters": "I nomi dei bucket non devono contenere lettere maiuscole", + "Bucket not found": "Bucket non trovato", + "Cancel Deletion": "Annulla eliminazione", + "Cancel Key Deletion": "Annulla eliminazione chiave", + "Client ID is required": "L’ID client è obbligatorio", + "Collecting files": "Raccolta dei file", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Raccoglie e visualizza indicatori chiave di prestazione, come CPU, memoria e I/O disco, tramite grafici per aiutare gli utenti a comprendere lo stato del sistema e i colli di bottiglia delle prestazioni", + "Comma-separated audience IDs.": "ID audience separati da virgole.", + "Console": "Console", + "Content Type": "Tipo di contenuto", + "Controlled by {envKey}": "Controllato da {envKey}", + "Copy Path": "Copia percorso", + "Create an audit target to forward audit logs.": "Crea una destinazione di audit per inoltrare i log di audit.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Stato attuale del backend per bucket, utenti, gruppi, policy e regole di scadenza del ciclo di vita replicati.", + "Default": "Predefinito", + "Delete Tag": "Elimina tag", + "Delete task created": "Attività di eliminazione creata", + "Deletion Date": "Data di eliminazione", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "Lo stato dettagliato della replica del sito non è ancora disponibile su questo server. Le informazioni di base sui peer sono comunque mostrate sotto.", + "Download Failed": "Download non riuscito", + "Download ready": "Download pronto", + "Downloading files": "Download dei file", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Ogni sito remoto richiede un endpoint e credenziali amministrative affinché il cluster possa completare l’handshake di join.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Ogni sito remoto usa le proprie credenziali amministrative per completare l’handshake iniziale di replica.", + "Enable audit in Settings before managing audit targets.": "Abilita l’audit nelle Impostazioni prima di gestire le destinazioni di audit.", + "Enable notify in Settings before managing bucket event subscriptions.": "Abilita le notifiche nelle Impostazioni prima di gestire le sottoscrizioni agli eventi del bucket.", + "Enable notify in Settings before managing event destinations.": "Abilita le notifiche nelle Impostazioni prima di gestire le destinazioni degli eventi.", + "Enter prefix...": "Inserisci prefisso...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Alcuni interruttori sono controllati da variabili d’ambiente", + "Exit Fullscreen": "Esci da schermo intero", + "Failed to create audit target": "Creazione della destinazione di audit non riuscita", + "Failed to generate secure random keys": "Generazione di chiavi casuali sicure non riuscita", + "Failed to load key details": "Caricamento dei dettagli della chiave non riuscito", + "Failed to load module switches": "Caricamento degli interruttori dei moduli non riuscito", + "File Permissions": "Permessi file", + "Formatted": "Formattato", + "Fullscreen": "Schermo intero", + "Getting URL": "Recupero URL", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Integrità", + "Healthy": "Integro", + "Key Manager": "Gestore chiavi", + "Leave blank to keep the stored Vault token.": "Lascia vuoto per mantenere il token Vault salvato.", + "Max Cached Keys": "Numero massimo di chiavi in cache", + "Metadata": "Metadati", + "Module switch is managed by environment variables": "L’interruttore del modulo è gestito da variabili d’ambiente", + "Module switches saved": "Interruttori dei moduli salvati", + "New access key has been created": "È stata creata una nuova chiave di accesso", + "No Audit Targets": "Nessuna destinazione di audit", + "No files to download": "Nessun file da scaricare", + "No options available": "Nessuna opzione disponibile", + "No tags": "Nessun tag", + "Notify": "Notifiche", + "Notify is disabled": "Le notifiche sono disabilitate", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Le notifiche sono disabilitate. Abilitale prima di gestire le sottoscrizioni agli eventi del bucket.", + "Notify is disabled. Enable notify before managing event destinations.": "Le notifiche sono disabilitate. Abilitale prima di gestire le destinazioni degli eventi.", + "Origin": "Origine", + "Other Audiences": "Altre audience", + "password length cannot be less than 8 characters and greater than 40 characters": "La password deve avere una lunghezza compresa tra 8 e 40 caratteri", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Appartenenza dei peer e controlli di replica modificabili, allineati all’API backend di replica del sito di RustFS e al flusso di gestione siti in stile MinIO.", + "Please enter GCS credentials JSON": "Inserisci il JSON delle credenziali GCS", + "Please remove members first": "Rimuovi prima i membri", + "Please select audit target type": "Seleziona il tipo di destinazione di audit", + "Previous": "Precedente", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Fornisce monitoraggio dettagliato delle prestazioni e meccanismi di avviso per aiutare gli amministratori a comprendere lo stato del sistema in tempo reale e garantirne stabilità e affidabilità", + "Quota Save Failed": "Salvataggio quota non riuscito", + "Raw": "Grezzo", + "Read-only OIDC settings": "Impostazioni OIDC in sola lettura", + "Read-only settings": "Impostazioni in sola lettura", + "Request failed": "Richiesta non riuscita", + "Select backend type": "Seleziona tipo di backend", + "State": "Stato", + "Stored token is hidden. Enter a new token only to replace it.": "Il token salvato è nascosto. Inserisci un nuovo token solo per sostituirlo.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "Il sito corrente viene rilevato automaticamente dal server. Aggiungi uno o più siti remoti per entrare nel gruppo di replica.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Questa chiave viene usata come predefinita della piattaforma per SSE-KMS e SSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Questo server non espone ancora l’API di replica del sito, quindi la pagina mostra un messaggio alternativo chiaro invece di un errore NotImplemented grezzo.", + "This user already exists": "Questo utente esiste già", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "Impossibile raggiungere l’endpoint di integrità del server RustFS", + "Unhealthy": "Non integro", + "Update license": "Aggiorna licenza", + "Update the deployment environment first before changing ENV-managed module switches.": "Aggiorna prima l’ambiente di distribuzione prima di modificare interruttori dei moduli gestiti da ENV.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Aggiorna i dettagli dei peer che RustFS usa per la gestione della replica del sito. I campi non mostrati qui vengono preservati dalla configurazione corrente.", + "Usage": "Utilizzo", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Quando il backend implementerà l’endpoint informativo della replica del sito, questa pagina mostrerà automaticamente siti peer, riepiloghi di stato e azioni di gestione.", + "You do not have permission to update module switches.": "Non disponi dell’autorizzazione per aggiornare gli interruttori dei moduli.", + "You do not have permission to update OIDC providers.": "Non disponi dell’autorizzazione per aggiornare i provider OIDC." } diff --git a/i18n/locales/ja-JP.json b/i18n/locales/ja-JP.json index 8732bd8..5668374 100644 --- a/i18n/locales/ja-JP.json +++ b/i18n/locales/ja-JP.json @@ -262,7 +262,7 @@ "Exporting...": "エクスポート中...", "External MinIO tier": "外部MinIOティア", "Failed": "失敗しました({count})", - "Failed Status": "失敗({count})", + "Failed Status": "失敗", "Failed to clear cache": "キャッシュのクリアに失敗しました", "Failed to configure bucket encryption": "バケット暗号化の設定に失敗しました", "Failed to create event target": "イベント先の作成に失敗しました", @@ -727,8 +727,6 @@ "Send events via MQTT broker": "MQTTブローカー経由でイベントを送信", "Send events via NATS": "NATS経由でイベントを送信", "Send events via Pulsar": "Pulsar経由でイベントを送信", - "Send events via NATS": "NATS経由でイベントを送信", - "Send events via Pulsar": "Pulsar経由でイベントを送信", "Server Address": "サーバーアドレス", "Server Configuration": "サーバー設定", "Server Host": "サーバーホスト", @@ -923,8 +921,8 @@ "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", "empty is indicates permanent validity": "空は永続的な有効性を示します", "en-US": "en-US", - "failed": "失敗({count})", - "in progress": "{total}件のタスクが進行中({processing}件処理中、{completed}件完了)", + "failed": "失敗", + "in progress": "進行中", "notice": "知らせ", "password length cannot be less than 8 characters and greater than 16 characters": "パスワードの長さは8文字未満、16文字を超えることはできません", "paused": "一時停止中", @@ -1117,8 +1115,8 @@ "Failed to save OIDC provider": "OIDC プロバイダーの保存に失敗しました", "Failed to validate OIDC configuration": "OIDC 設定の検証に失敗しました", "Groups Claim": "グループクレーム", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "ロールクレーム", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "任意。ロール値用の別クレーム(例: roles)です。空のままにすると groups クレームのみを使用します。", "Issuer": "発行者", "Leave empty to keep current secret": "現在のシークレットを維持するには空欄のままにしてください", "Loading...": "読み込み中...", @@ -1155,5 +1153,110 @@ "Validate": "検証", "Validating...": "検証中...", "View and manage persisted OIDC providers.": "永続化された OIDC プロバイダーを表示および管理します。", - "You have unsaved OIDC changes. Do you want to discard them?": "未保存の OIDC 変更があります。破棄しますか?" + "You have unsaved OIDC changes. Do you want to discard them?": "未保存の OIDC 変更があります。破棄しますか?", + "Add {type} Audit Target": "{type} 監査ターゲットを追加", + "Add Audit Target": "監査ターゲットを追加", + "API not ready": "API の準備ができていません", + "Are you sure you want to delete this audit target?": "この監査ターゲットを削除してもよろしいですか?", + "Are you sure you want to delete this tag?": "このタグを削除してもよろしいですか?", + "Are you sure you want to delete this user?": "このユーザーを削除してもよろしいですか?", + "Audit is disabled": "監査は無効です", + "Audit is disabled. Enable audit before managing audit targets.": "監査は無効です。監査ターゲットを管理する前に監査を有効にしてください。", + "Audit target created successfully": "監査ターゲットを作成しました", + "Audit Targets": "監査ターゲット", + "Back to Login": "ログインに戻る", + "Bucket name is required": "バケット名は必須です", + "Bucket names must be 3-63 characters long": "バケット名は 3〜63 文字である必要があります", + "Bucket names must not contain uppercase letters": "バケット名に大文字を含めることはできません", + "Bucket not found": "バケットが見つかりません", + "Cancel Deletion": "削除をキャンセル", + "Cancel Key Deletion": "キー削除をキャンセル", + "Client ID is required": "クライアント ID は必須です", + "Collecting files": "ファイルを収集中", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "CPU、メモリ、ディスク I/O などの主要な性能指標をグラフで収集・表示し、システムの稼働状況と性能ボトルネックの把握を支援します", + "Comma-separated audience IDs.": "複数の Audience ID はカンマで区切ってください。", + "Console": "Console", + "Content Type": "コンテンツタイプ", + "Controlled by {envKey}": "{envKey} によって制御されています", + "Copy Path": "パスをコピー", + "Create an audit target to forward audit logs.": "監査ログを転送する監査ターゲットを作成します。", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "複製対象のバケット、ユーザー、グループ、ポリシー、ライフサイクル期限切れルールの現在のバックエンド状態。", + "Default": "デフォルト", + "Delete Tag": "タグを削除", + "Delete task created": "削除タスクを作成しました", + "Deletion Date": "削除日", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "このサーバーでは詳細なサイトレプリケーション状態をまだ利用できません。基本的なピア情報は下に表示されます。", + "Download Failed": "ダウンロードに失敗しました", + "Download ready": "ダウンロードの準備ができました", + "Downloading files": "ファイルをダウンロード中", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "クラスターが参加ハンドシェイクを完了できるよう、各リモートサイトにはエンドポイントと管理者認証情報が必要です。", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "各リモートサイトは管理者認証情報を使用して初期レプリケーションハンドシェイクを完了します。", + "Enable audit in Settings before managing audit targets.": "監査ターゲットを管理する前に、設定で監査を有効にしてください。", + "Enable notify in Settings before managing bucket event subscriptions.": "バケットイベントサブスクリプションを管理する前に、設定で通知を有効にしてください。", + "Enable notify in Settings before managing event destinations.": "イベント宛先を管理する前に、設定で通知を有効にしてください。", + "Enter prefix...": "プレフィックスを入力...", + "ENV": "ENV", + "Environment variables are controlling some switches": "一部のスイッチは環境変数によって制御されています", + "Exit Fullscreen": "全画面表示を終了", + "Failed to create audit target": "監査ターゲットの作成に失敗しました", + "Failed to generate secure random keys": "安全なランダムキーの生成に失敗しました", + "Failed to load key details": "キー詳細の読み込みに失敗しました", + "Failed to load module switches": "モジュールスイッチの読み込みに失敗しました", + "File Permissions": "ファイル権限", + "Formatted": "整形済み", + "Fullscreen": "全画面表示", + "Getting URL": "URL を取得中", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "ヘルス", + "Healthy": "正常", + "Key Manager": "キーマネージャー", + "Leave blank to keep the stored Vault token.": "保存済みの Vault トークンを保持するには空のままにしてください。", + "Max Cached Keys": "最大キャッシュキー数", + "Metadata": "メタデータ", + "Module switch is managed by environment variables": "モジュールスイッチは環境変数で管理されています", + "Module switches saved": "モジュールスイッチを保存しました", + "New access key has been created": "新しいアクセスキーが作成されました", + "No Audit Targets": "監査ターゲットはありません", + "No files to download": "ダウンロードするファイルはありません", + "No options available": "利用できるオプションはありません", + "No tags": "タグはありません", + "Notify": "通知", + "Notify is disabled": "通知は無効です", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "通知は無効です。バケットイベントサブスクリプションを管理する前に通知を有効にしてください。", + "Notify is disabled. Enable notify before managing event destinations.": "通知は無効です。イベント宛先を管理する前に通知を有効にしてください。", + "Origin": "オリジン", + "Other Audiences": "その他の Audience", + "password length cannot be less than 8 characters and greater than 40 characters": "パスワードの長さは 8 文字以上 40 文字以下である必要があります", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "RustFS バックエンドのサイトレプリケーション API と MinIO 形式のサイト管理フローに合わせた、ピアメンバーシップと編集可能なレプリケーション制御です。", + "Please enter GCS credentials JSON": "GCS 認証情報 JSON を入力してください", + "Please remove members first": "先にメンバーを削除してください", + "Please select audit target type": "監査ターゲットの種類を選択してください", + "Previous": "前へ", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "詳細な性能監視とアラート機能を提供し、管理者がシステム状態をリアルタイムに把握して安定性と信頼性を確保できるようにします", + "Quota Save Failed": "クォータの保存に失敗しました", + "Raw": "未加工", + "Read-only OIDC settings": "読み取り専用の OIDC 設定", + "Read-only settings": "読み取り専用設定", + "Request failed": "リクエストに失敗しました", + "Select backend type": "バックエンドタイプを選択", + "sha256": "sha256", + "State": "状態", + "Stored token is hidden. Enter a new token only to replace it.": "保存済みトークンは非表示です。置き換える場合のみ新しいトークンを入力してください。", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "現在のサイトはサーバーによって自動検出されます。レプリケーショングループに参加するには、1 つ以上のリモートサイトを追加してください。", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "このキーは、プラットフォームの SSE-KMS および SSE-S3 のデフォルトキーとして使用されます。", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "このサーバーではサイトレプリケーション API がまだ公開されていないため、生の NotImplemented エラーではなく分かりやすい代替表示を行います。", + "This user already exists": "このユーザーは既に存在します", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "RustFS サーバーのヘルスエンドポイントに到達できません", + "Unhealthy": "異常", + "Update license": "ライセンスを更新", + "Update the deployment environment first before changing ENV-managed module switches.": "ENV 管理のモジュールスイッチを変更する前に、まずデプロイ環境を更新してください。", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "RustFS がサイトレプリケーション管理に使用するピア詳細を更新します。ここに表示されないフィールドは現在の設定から保持されます。", + "update:name": "update:name", + "update:show": "update:show", + "update:visible": "update:visible", + "Usage": "使用量", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "バックエンドがサイトレプリケーション情報エンドポイントを実装すると、このページにピアサイト、状態サマリー、管理操作が自動的に表示されます。", + "You do not have permission to update module switches.": "モジュールスイッチを更新する権限がありません。", + "You do not have permission to update OIDC providers.": "OIDC プロバイダーを更新する権限がありません。" } diff --git a/i18n/locales/ko-KR.json b/i18n/locales/ko-KR.json index a13298e..145d637 100644 --- a/i18n/locales/ko-KR.json +++ b/i18n/locales/ko-KR.json @@ -262,7 +262,7 @@ "Exporting...": "내보내는 중...", "External MinIO tier": "외부 MinIO 티어", "Failed": "실패({count})", - "Failed Status": "실패({count})", + "Failed Status": "실패", "Failed to clear cache": "캐시 지우기 실패", "Failed to configure bucket encryption": "버킷 암호화 구성 실패", "Failed to create event target": "이벤트 대상 생성 실패", @@ -921,8 +921,8 @@ "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", "empty is indicates permanent validity": "비어 있으면 영구 유효성을 나타냅니다", "en-US": "en-US", - "failed": "실패({count})", - "in progress": "{total}개 작업 진행 중 ({processing}개 처리 중, {completed}개 완료)", + "failed": "실패", + "in progress": "진행 중", "notice": "알아채다", "password length cannot be less than 8 characters and greater than 16 characters": "비밀번호 길이는 8자 미만, 16자 초과일 수 없습니다", "paused": "일시 중지됨", @@ -1115,8 +1115,8 @@ "Failed to save OIDC provider": "OIDC 공급자 저장에 실패했습니다", "Failed to validate OIDC configuration": "OIDC 구성 검증에 실패했습니다", "Groups Claim": "그룹 클레임", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "역할 클레임", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "선택 사항입니다. 역할 값용 별도 클레임(예: roles)입니다. 비워 두면 groups 클레임만 사용합니다.", "Issuer": "발급자", "Leave empty to keep current secret": "현재 시크릿을 유지하려면 비워 두세요", "Loading...": "불러오는 중...", @@ -1153,5 +1153,110 @@ "Validate": "검증", "Validating...": "검증 중...", "View and manage persisted OIDC providers.": "영구 저장된 OIDC 공급자를 보고 관리합니다.", - "You have unsaved OIDC changes. Do you want to discard them?": "저장되지 않은 OIDC 변경 사항이 있습니다. 버리시겠습니까?" + "You have unsaved OIDC changes. Do you want to discard them?": "저장되지 않은 OIDC 변경 사항이 있습니다. 버리시겠습니까?", + "Add {type} Audit Target": "{type} 감사 대상 추가", + "Add Audit Target": "감사 대상 추가", + "API not ready": "API가 준비되지 않았습니다", + "Are you sure you want to delete this audit target?": "이 감사 대상을 삭제하시겠습니까?", + "Are you sure you want to delete this tag?": "이 태그를 삭제하시겠습니까?", + "Are you sure you want to delete this user?": "이 사용자를 삭제하시겠습니까?", + "Audit is disabled": "감사가 비활성화되어 있습니다", + "Audit is disabled. Enable audit before managing audit targets.": "감사가 비활성화되어 있습니다. 감사 대상을 관리하기 전에 감사를 활성화하세요.", + "Audit target created successfully": "감사 대상이 생성되었습니다", + "Audit Targets": "감사 대상", + "Back to Login": "로그인으로 돌아가기", + "Bucket name is required": "버킷 이름은 필수입니다", + "Bucket names must be 3-63 characters long": "버킷 이름은 3~63자여야 합니다", + "Bucket names must not contain uppercase letters": "버킷 이름에는 대문자를 포함할 수 없습니다", + "Bucket not found": "버킷을 찾을 수 없습니다", + "Cancel Deletion": "삭제 취소", + "Cancel Key Deletion": "키 삭제 취소", + "Client ID is required": "클라이언트 ID는 필수입니다", + "Collecting files": "파일 수집 중", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "CPU, 메모리, 디스크 I/O 등의 핵심 성능 지표를 시각화된 차트로 수집하고 표시하여 시스템 운영 상태와 성능 병목을 파악할 수 있도록 돕습니다", + "Comma-separated audience IDs.": "여러 Audience ID는 쉼표로 구분하세요.", + "Console": "Console", + "Content Type": "콘텐츠 유형", + "Controlled by {envKey}": "{envKey}에서 제어됨", + "Copy Path": "경로 복사", + "Create an audit target to forward audit logs.": "감사 로그를 전달할 감사 대상을 생성합니다.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "복제된 버킷, 사용자, 그룹, 정책 및 수명 주기 만료 규칙의 현재 백엔드 상태입니다.", + "Default": "기본값", + "Delete Tag": "태그 삭제", + "Delete task created": "삭제 작업이 생성되었습니다", + "Deletion Date": "삭제 날짜", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "이 서버에서는 아직 자세한 사이트 복제 상태를 사용할 수 없습니다. 기본 피어 정보는 아래에 계속 표시됩니다.", + "Download Failed": "다운로드 실패", + "Download ready": "다운로드 준비 완료", + "Downloading files": "파일 다운로드 중", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "클러스터가 가입 핸드셰이크를 완료하려면 각 원격 사이트에 엔드포인트와 관리자 자격 증명이 필요합니다.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "각 원격 사이트는 관리자 자격 증명을 사용하여 초기 복제 핸드셰이크를 완료합니다.", + "Enable audit in Settings before managing audit targets.": "감사 대상을 관리하기 전에 설정에서 감사를 활성화하세요.", + "Enable notify in Settings before managing bucket event subscriptions.": "버킷 이벤트 구독을 관리하기 전에 설정에서 알림을 활성화하세요.", + "Enable notify in Settings before managing event destinations.": "이벤트 대상을 관리하기 전에 설정에서 알림을 활성화하세요.", + "Enter prefix...": "접두사 입력...", + "ENV": "ENV", + "Environment variables are controlling some switches": "일부 스위치는 환경 변수로 제어됩니다", + "Exit Fullscreen": "전체 화면 종료", + "Failed to create audit target": "감사 대상 생성 실패", + "Failed to generate secure random keys": "보안 난수 키 생성 실패", + "Failed to load key details": "키 세부 정보 로드 실패", + "Failed to load module switches": "모듈 스위치 로드 실패", + "File Permissions": "파일 권한", + "Formatted": "서식 지정됨", + "Fullscreen": "전체 화면", + "Getting URL": "URL 가져오는 중", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "상태", + "Healthy": "정상", + "Key Manager": "키 관리자", + "Leave blank to keep the stored Vault token.": "저장된 Vault 토큰을 유지하려면 비워 두세요.", + "Max Cached Keys": "최대 캐시 키 수", + "Metadata": "메타데이터", + "Module switch is managed by environment variables": "모듈 스위치는 환경 변수로 관리됩니다", + "Module switches saved": "모듈 스위치가 저장되었습니다", + "New access key has been created": "새 액세스 키가 생성되었습니다", + "No Audit Targets": "감사 대상 없음", + "No files to download": "다운로드할 파일이 없습니다", + "No options available": "사용 가능한 옵션이 없습니다", + "No tags": "태그 없음", + "Notify": "알림", + "Notify is disabled": "알림이 비활성화되어 있습니다", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "알림이 비활성화되어 있습니다. 버킷 이벤트 구독을 관리하기 전에 알림을 활성화하세요.", + "Notify is disabled. Enable notify before managing event destinations.": "알림이 비활성화되어 있습니다. 이벤트 대상을 관리하기 전에 알림을 활성화하세요.", + "Origin": "오리진", + "Other Audiences": "기타 Audience", + "password length cannot be less than 8 characters and greater than 40 characters": "비밀번호 길이는 8자 이상 40자 이하여야 합니다", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "RustFS 백엔드 사이트 복제 API 및 MinIO 스타일 사이트 관리 흐름에 맞춘 피어 멤버십과 편집 가능한 복제 제어입니다.", + "Please enter GCS credentials JSON": "GCS 자격 증명 JSON을 입력하세요", + "Please remove members first": "먼저 구성원을 제거하세요", + "Please select audit target type": "감사 대상 유형을 선택하세요", + "Previous": "이전", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "관리자가 시스템 상태를 실시간으로 파악하고 안정성과 신뢰성을 보장할 수 있도록 상세한 성능 모니터링 및 알림 메커니즘을 제공합니다", + "Quota Save Failed": "할당량 저장 실패", + "Raw": "원본", + "Read-only OIDC settings": "읽기 전용 OIDC 설정", + "Read-only settings": "읽기 전용 설정", + "Request failed": "요청 실패", + "Select backend type": "백엔드 유형 선택", + "sha256": "sha256", + "State": "상태", + "Stored token is hidden. Enter a new token only to replace it.": "저장된 토큰은 숨겨져 있습니다. 교체할 때만 새 토큰을 입력하세요.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "현재 사이트는 서버에서 자동으로 감지됩니다. 복제 그룹에 참여하려면 하나 이상의 원격 사이트를 추가하세요.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "이 키는 플랫폼의 SSE-KMS 및 SSE-S3 기본 키로 사용됩니다.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "이 서버는 아직 사이트 복제 API를 노출하지 않았으므로 원시 NotImplemented 오류 대신 친절한 대체 화면을 표시합니다.", + "This user already exists": "이 사용자는 이미 존재합니다", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "RustFS 서버 상태 엔드포인트에 연결할 수 없습니다", + "Unhealthy": "비정상", + "Update license": "라이선스 업데이트", + "Update the deployment environment first before changing ENV-managed module switches.": "ENV 관리 모듈 스위치를 변경하기 전에 먼저 배포 환경을 업데이트하세요.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "RustFS가 사이트 복제 관리에 사용하는 피어 세부 정보를 업데이트합니다. 여기에 표시되지 않은 필드는 현재 구성에서 유지됩니다.", + "update:name": "update:name", + "update:show": "update:show", + "update:visible": "update:visible", + "Usage": "사용량", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "백엔드가 사이트 복제 정보 엔드포인트를 구현하면 이 페이지에 피어 사이트, 상태 요약 및 관리 작업이 자동으로 표시됩니다.", + "You do not have permission to update module switches.": "모듈 스위치를 업데이트할 권한이 없습니다.", + "You do not have permission to update OIDC providers.": "OIDC 공급자를 업데이트할 권한이 없습니다." } diff --git a/i18n/locales/pt-BR.json b/i18n/locales/pt-BR.json index 8649edd..e63e00f 100644 --- a/i18n/locales/pt-BR.json +++ b/i18n/locales/pt-BR.json @@ -126,7 +126,7 @@ "Clear Records": "Limpar Registros", "Click or drag ZIP file to this area to upload": "Clique ou arraste o arquivo ZIP para esta área para fazer upload", "Close": "Fechar", - "Completed": "Concluído({contagem})", + "Completed": "Concluído({count})", "Configuration": "Configuração", "Configuration Information": "Informações de Configuração", "Configuration is saved locally in your browser": "A configuração é salva localmente no seu navegador", @@ -204,7 +204,7 @@ "Delete Selected": "Excluir Selecionados", "Delete Success": "Exclusão Bem-sucedida", "Delete Tag Confirm": "Confirmar Exclusão de Tag", - "Deleting": "Excluindo({contagem})", + "Deleting": "Excluindo({count})", "Deleting...": "Excluindo...", "Description": "Descrição", "Destination Bucket": "Bucket de Destino", @@ -261,8 +261,8 @@ "Export all IAM configurations including users, groups, policies, and access keys in a ZIP file.": "Exporte todas as configurações do IAM, incluindo usuários, grupos, políticas e chaves de acesso em um arquivo ZIP.", "Exporting...": "Exportando...", "External MinIO tier": "Tier MinIO externo", - "Failed": "Falha ({contagem})", - "Failed Status": "Falhou({count})", + "Failed": "Falha({count})", + "Failed Status": "Falhou", "Failed to clear cache": "Falha ao limpar cache", "Failed to configure bucket encryption": "Falha ao configurar criptografia do bucket", "Failed to create event target": "Falha ao criar destino de evento", @@ -727,8 +727,6 @@ "Send events via MQTT broker": "Enviar eventos via corretor MQTT", "Send events via NATS": "Enviar eventos via NATS", "Send events via Pulsar": "Enviar eventos via Pulsar", - "Send events via NATS": "Enviar eventos via NATS", - "Send events via Pulsar": "Enviar eventos via Pulsar", "Server Address": "Endereço do Servidor", "Server Configuration": "Configuração do Servidor", "Server Host": "Host do Servidor", @@ -923,8 +921,8 @@ "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", "empty is indicates permanent validity": "Vazio indica validade permanente", "en-US": "en-EUA", - "failed": "Falhou({count})", - "in progress": "{total} tarefas em progresso ({processing} processando, {completed} concluídas)", + "failed": "Falhou", + "in progress": "Em progresso", "notice": "perceber", "password length cannot be less than 8 characters and greater than 16 characters": "O comprimento da senha não pode ser menor que 8 caracteres e maior que 16 caracteres", "paused": "Pausado", @@ -1121,8 +1119,8 @@ "Failed to save OIDC provider": "Falha ao salvar provedor OIDC", "Failed to validate OIDC configuration": "Falha ao validar a configuração OIDC", "Groups Claim": "Claim de grupos", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "Claim de funções", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Opcional. Claim separado para valores de função (por exemplo, roles). Deixe vazio para usar apenas o claim de grupos.", "Issuer": "Emissor", "Leave empty to keep current secret": "Deixe em branco para manter o segredo atual", "Loading...": "Carregando...", @@ -1149,7 +1147,7 @@ "Redirect URI will be resolved dynamically at runtime.": "A URI de redirecionamento será resolvida dinamicamente em tempo de execução.", "Restart Required": "Reinicialização necessária", "Role Policy": "Política de função", - "Scopes": "Scopes", + "Scopes": "Escopos", "Scopes must include openid": "Os scopes devem incluir openid", "Secret Configured": "Segredo configurado", "Token Endpoint": "Endpoint de token", @@ -1159,5 +1157,106 @@ "Validate": "Validar", "Validating...": "Validando...", "View and manage persisted OIDC providers.": "Visualize e gerencie os provedores OIDC persistidos.", - "You have unsaved OIDC changes. Do you want to discard them?": "Você tem alterações de OIDC não salvas. Deseja descartá-las?" + "You have unsaved OIDC changes. Do you want to discard them?": "Você tem alterações de OIDC não salvas. Deseja descartá-las?", + "Add {type} Audit Target": "Adicionar destino de auditoria {type}", + "Add Audit Target": "Adicionar destino de auditoria", + "API not ready": "API ainda não está pronta", + "Are you sure you want to delete this audit target?": "Tem certeza de que deseja excluir este destino de auditoria?", + "Are you sure you want to delete this tag?": "Tem certeza de que deseja excluir esta tag?", + "Are you sure you want to delete this user?": "Tem certeza de que deseja excluir este usuário?", + "Audit is disabled": "A auditoria está desativada", + "Audit is disabled. Enable audit before managing audit targets.": "A auditoria está desativada. Ative a auditoria antes de gerenciar destinos de auditoria.", + "Audit target created successfully": "Destino de auditoria criado com sucesso", + "Audit Targets": "Destinos de auditoria", + "Back to Login": "Voltar ao login", + "Bucket name is required": "O nome do bucket é obrigatório", + "Bucket names must be 3-63 characters long": "Os nomes de bucket devem ter entre 3 e 63 caracteres", + "Bucket names must not contain uppercase letters": "Os nomes de bucket não devem conter letras maiúsculas", + "Bucket not found": "Bucket não encontrado", + "Cancel Deletion": "Cancelar exclusão", + "Cancel Key Deletion": "Cancelar exclusão da chave", + "Client ID is required": "O ID do cliente é obrigatório", + "Collecting files": "Coletando arquivos", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Coleta e exibe indicadores-chave de desempenho, como CPU, memória e E/S de disco, por meio de gráficos para ajudar os usuários a entender o estado do sistema e gargalos de desempenho", + "Comma-separated audience IDs.": "IDs de audiência separados por vírgulas.", + "Console": "Console", + "Content Type": "Tipo de conteúdo", + "Controlled by {envKey}": "Controlado por {envKey}", + "Copy Path": "Copiar caminho", + "Create an audit target to forward audit logs.": "Crie um destino de auditoria para encaminhar logs de auditoria.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Status atual do backend para buckets, usuários, grupos, políticas e regras de expiração do ciclo de vida replicados.", + "Default": "Padrão", + "Delete Tag": "Excluir tag", + "Delete task created": "Tarefa de exclusão criada", + "Deletion Date": "Data de exclusão", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "O status detalhado da replicação de site ainda não está disponível neste servidor. As informações básicas dos pares continuam sendo exibidas abaixo.", + "Download Failed": "Falha no download", + "Download ready": "Download pronto", + "Downloading files": "Baixando arquivos", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Cada site remoto precisa de um endpoint e credenciais de administrador para que o cluster conclua o handshake de entrada.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Cada site remoto usa suas credenciais de administrador para concluir o handshake inicial de replicação.", + "Enable audit in Settings before managing audit targets.": "Ative a auditoria em Configurações antes de gerenciar destinos de auditoria.", + "Enable notify in Settings before managing bucket event subscriptions.": "Ative as notificações em Configurações antes de gerenciar assinaturas de eventos de bucket.", + "Enable notify in Settings before managing event destinations.": "Ative as notificações em Configurações antes de gerenciar destinos de eventos.", + "Enter prefix...": "Digite o prefixo...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Algumas chaves são controladas por variáveis de ambiente", + "Exit Fullscreen": "Sair da tela cheia", + "Failed to create audit target": "Falha ao criar destino de auditoria", + "Failed to generate secure random keys": "Falha ao gerar chaves aleatórias seguras", + "Failed to load key details": "Falha ao carregar detalhes da chave", + "Failed to load module switches": "Falha ao carregar chaves de módulo", + "File Permissions": "Permissões de arquivo", + "Formatted": "Formatado", + "Fullscreen": "Tela cheia", + "Getting URL": "Obtendo URL", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Saúde", + "Healthy": "Saudável", + "Key Manager": "Gerenciador de chaves", + "Leave blank to keep the stored Vault token.": "Deixe em branco para manter o token do Vault armazenado.", + "Max Cached Keys": "Máximo de chaves em cache", + "Metadata": "Metadados", + "Module switch is managed by environment variables": "A chave do módulo é gerenciada por variáveis de ambiente", + "Module switches saved": "Chaves de módulo salvas", + "New access key has been created": "Uma nova chave de acesso foi criada", + "No Audit Targets": "Nenhum destino de auditoria", + "No files to download": "Nenhum arquivo para baixar", + "No options available": "Nenhuma opção disponível", + "No tags": "Nenhuma tag", + "Notify": "Notificações", + "Notify is disabled": "As notificações estão desativadas", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "As notificações estão desativadas. Ative-as antes de gerenciar assinaturas de eventos de bucket.", + "Notify is disabled. Enable notify before managing event destinations.": "As notificações estão desativadas. Ative-as antes de gerenciar destinos de eventos.", + "Origin": "Origem", + "Other Audiences": "Outras audiências", + "password length cannot be less than 8 characters and greater than 40 characters": "A senha deve ter entre 8 e 40 caracteres", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Associação de pares e controles de replicação editáveis, alinhados à API backend de replicação de site do RustFS e ao fluxo de gerenciamento de sites no estilo MinIO.", + "Please enter GCS credentials JSON": "Insira o JSON de credenciais do GCS", + "Please remove members first": "Remova os membros primeiro", + "Please select audit target type": "Selecione o tipo de destino de auditoria", + "Previous": "Anterior", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Fornece monitoramento detalhado de desempenho e mecanismos de alerta para ajudar administradores a entender o status do sistema em tempo real e garantir estabilidade e confiabilidade", + "Quota Save Failed": "Falha ao salvar cota", + "Raw": "Bruto", + "Read-only OIDC settings": "Configurações OIDC somente leitura", + "Read-only settings": "Configurações somente leitura", + "Request failed": "Falha na solicitação", + "Select backend type": "Selecionar tipo de backend", + "State": "Estado", + "Stored token is hidden. Enter a new token only to replace it.": "O token armazenado está oculto. Insira um novo token apenas para substituí-lo.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "O site atual é detectado automaticamente pelo servidor. Adicione um ou mais sites remotos para entrar no grupo de replicação.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Esta chave é usada como padrão da plataforma para SSE-KMS e SSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Este servidor ainda não expôs a API de replicação de site, portanto a página mostra uma alternativa amigável em vez de um erro NotImplemented bruto.", + "This user already exists": "Este usuário já existe", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "Não foi possível acessar o endpoint de saúde do servidor RustFS", + "Unhealthy": "Com problemas", + "Update license": "Atualizar licença", + "Update the deployment environment first before changing ENV-managed module switches.": "Atualize primeiro o ambiente de implantação antes de alterar chaves de módulo gerenciadas por ENV.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Atualize os detalhes dos pares que o RustFS usa para gerenciar a replicação de site. Campos não exibidos aqui são preservados da configuração atual.", + "Usage": "Uso", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Quando o backend implementar o endpoint de informações de replicação de site, esta página mostrará automaticamente sites pares, resumos de status e ações de gerenciamento.", + "You do not have permission to update module switches.": "Você não tem permissão para atualizar chaves de módulo.", + "You do not have permission to update OIDC providers.": "Você não tem permissão para atualizar provedores OIDC." } diff --git a/i18n/locales/ru-RU.json b/i18n/locales/ru-RU.json index 55b8e90..f202351 100644 --- a/i18n/locales/ru-RU.json +++ b/i18n/locales/ru-RU.json @@ -262,7 +262,7 @@ "Exporting...": "Экспорт...", "External MinIO tier": "Внешний уровень MinIO", "Failed": "Не удалось({count})", - "Failed Status": "Ошибка({count})", + "Failed Status": "Ошибка", "Failed to clear cache": "Не удалось очистить кэш", "Failed to configure bucket encryption": "Не удалось настроить шифрование бакета", "Failed to create event target": "Не удалось создать назначение события", @@ -727,8 +727,6 @@ "Send events via MQTT broker": "Отправлять события через брокер MQTT", "Send events via NATS": "Отправлять события через NATS", "Send events via Pulsar": "Отправлять события через Pulsar", - "Send events via NATS": "Отправлять события через NATS", - "Send events via Pulsar": "Отправлять события через Pulsar", "Server Address": "Адрес сервера", "Server Configuration": "Конфигурация сервера", "Server Host": "Хост сервера", @@ -919,8 +917,8 @@ "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", "empty is indicates permanent validity": "Пустое значение указывает на постоянную действительность", "en-US": "ru-RU", - "failed": "Ошибка ({count})", - "in progress": "{total} задач в процессе ({processing} обрабатывается, {completed} завершено)", + "failed": "Ошибка", + "in progress": "В процессе", "notice": "уведомление", "password length cannot be less than 8 characters and greater than 16 characters": "Длина пароля не может быть менее 8 символов и более 16 символов", "paused": "Приостановлено", @@ -1118,8 +1116,8 @@ "Failed to save OIDC provider": "Не удалось сохранить OIDC-провайдера", "Failed to validate OIDC configuration": "Не удалось проверить конфигурацию OIDC", "Groups Claim": "Claim групп", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "Claim ролей", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Необязательно. Отдельный claim для значений ролей (например, roles). Оставьте пустым, чтобы использовать только claim групп.", "Issuer": "Издатель", "Leave empty to keep current secret": "Оставьте пустым, чтобы сохранить текущий секрет", "Loading...": "Загрузка...", @@ -1146,7 +1144,7 @@ "Redirect URI will be resolved dynamically at runtime.": "URI перенаправления будет определен динамически во время выполнения.", "Restart Required": "Требуется перезапуск", "Role Policy": "Политика роли", - "Scopes": "Области", + "Scopes": "Области доступа", "Scopes must include openid": "Области должны включать openid", "Secret Configured": "Секрет настроен", "Token Endpoint": "Эндпоинт токена", @@ -1156,5 +1154,109 @@ "Validate": "Проверить", "Validating...": "Проверка...", "View and manage persisted OIDC providers.": "Просматривайте и управляйте сохраненными OIDC-провайдерами.", - "You have unsaved OIDC changes. Do you want to discard them?": "У вас есть несохраненные изменения OIDC. Отменить их?" + "You have unsaved OIDC changes. Do you want to discard them?": "У вас есть несохраненные изменения OIDC. Отменить их?", + "Add {type} Audit Target": "Добавить цель аудита {type}", + "Add Audit Target": "Добавить цель аудита", + "API not ready": "API не готов", + "Are you sure you want to delete this audit target?": "Вы уверены, что хотите удалить эту цель аудита?", + "Are you sure you want to delete this tag?": "Вы уверены, что хотите удалить этот тег?", + "Are you sure you want to delete this user?": "Вы уверены, что хотите удалить этого пользователя?", + "Audit is disabled": "Аудит отключен", + "Audit is disabled. Enable audit before managing audit targets.": "Аудит отключен. Включите аудит перед управлением целями аудита.", + "Audit target created successfully": "Цель аудита успешно создана", + "Audit Targets": "Цели аудита", + "Back to Login": "Вернуться к входу", + "Bucket name is required": "Имя бакета обязательно", + "Bucket names must be 3-63 characters long": "Имена бакетов должны содержать от 3 до 63 символов", + "Bucket names must not contain uppercase letters": "Имена бакетов не должны содержать заглавные буквы", + "Bucket not found": "Бакет не найден", + "Cancel Deletion": "Отменить удаление", + "Cancel Key Deletion": "Отменить удаление ключа", + "Client ID is required": "ID клиента обязателен", + "Collecting files": "Сбор файлов", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Собирает и отображает ключевые показатели производительности, такие как CPU, память и дисковый I/O, в виде графиков, помогая понять состояние системы и узкие места производительности", + "Comma-separated audience IDs.": "ID аудиторий, разделенные запятыми.", + "Console": "Console", + "Content Type": "Тип содержимого", + "Controlled by {envKey}": "Управляется {envKey}", + "Copy Path": "Копировать путь", + "Create an audit target to forward audit logs.": "Создайте цель аудита для пересылки журналов аудита.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Текущий статус backend для реплицированных бакетов, пользователей, групп, политик и правил истечения жизненного цикла.", + "Default": "По умолчанию", + "Delete Tag": "Удалить тег", + "Delete task created": "Задача удаления создана", + "Deletion Date": "Дата удаления", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "Подробный статус репликации сайта на этом сервере пока недоступен. Ниже по-прежнему отображается базовая информация о пирах.", + "Download Failed": "Не удалось скачать", + "Download ready": "Скачивание готово", + "Downloading files": "Скачивание файлов", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Каждому удаленному сайту нужны endpoint и учетные данные администратора, чтобы кластер мог завершить handshake присоединения.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Каждый удаленный сайт использует учетные данные администратора для завершения начального handshake репликации.", + "Enable audit in Settings before managing audit targets.": "Включите аудит в настройках перед управлением целями аудита.", + "Enable notify in Settings before managing bucket event subscriptions.": "Включите уведомления в настройках перед управлением подписками на события бакета.", + "Enable notify in Settings before managing event destinations.": "Включите уведомления в настройках перед управлением назначениями событий.", + "Enter prefix...": "Введите префикс...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Некоторые переключатели управляются переменными окружения", + "Exit Fullscreen": "Выйти из полноэкранного режима", + "Failed to create audit target": "Не удалось создать цель аудита", + "Failed to generate secure random keys": "Не удалось сгенерировать безопасные случайные ключи", + "Failed to load key details": "Не удалось загрузить сведения о ключе", + "Failed to load module switches": "Не удалось загрузить переключатели модулей", + "File Permissions": "Права доступа к файлу", + "Formatted": "Отформатировано", + "Fullscreen": "Полноэкранный режим", + "Getting URL": "Получение URL", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Состояние", + "Healthy": "Исправен", + "Key Manager": "Менеджер ключей", + "Leave blank to keep the stored Vault token.": "Оставьте пустым, чтобы сохранить текущий токен Vault.", + "Max Cached Keys": "Максимум кэшированных ключей", + "Metadata": "Метаданные", + "Module switch is managed by environment variables": "Переключатель модуля управляется переменными окружения", + "Module switches saved": "Переключатели модулей сохранены", + "New access key has been created": "Новый ключ доступа создан", + "No Audit Targets": "Нет целей аудита", + "No files to download": "Нет файлов для скачивания", + "No options available": "Нет доступных вариантов", + "No tags": "Нет тегов", + "Notify": "Уведомления", + "Notify is disabled": "Уведомления отключены", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Уведомления отключены. Включите их перед управлением подписками на события бакета.", + "Notify is disabled. Enable notify before managing event destinations.": "Уведомления отключены. Включите их перед управлением назначениями событий.", + "Origin": "Источник", + "Other Audiences": "Другие аудитории", + "password length cannot be less than 8 characters and greater than 40 characters": "Длина пароля должна быть от 8 до 40 символов", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Состав пиров и редактируемые элементы управления репликацией, согласованные с backend API репликации сайтов RustFS и потоком управления сайтами в стиле MinIO.", + "Please enter GCS credentials JSON": "Введите JSON учетных данных GCS", + "Please remove members first": "Сначала удалите участников", + "Please select audit target type": "Выберите тип цели аудита", + "Previous": "Назад", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Предоставляет подробный мониторинг производительности и механизмы оповещений, помогая администраторам в реальном времени понимать состояние системы и обеспечивать ее стабильность и надежность", + "Quota Save Failed": "Не удалось сохранить квоту", + "Raw": "Исходный", + "Read-only OIDC settings": "Настройки OIDC только для чтения", + "Read-only settings": "Настройки только для чтения", + "Request failed": "Запрос не выполнен", + "Select backend type": "Выберите тип backend", + "State": "Состояние", + "Stored token is hidden. Enter a new token only to replace it.": "Сохраненный токен скрыт. Введите новый токен только для его замены.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "Текущий сайт определяется сервером автоматически. Добавьте один или несколько удаленных сайтов, чтобы присоединиться к группе репликации.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Этот ключ используется платформой по умолчанию для SSE-KMS и SSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Этот сервер еще не предоставляет API репликации сайтов, поэтому страница показывает понятное резервное сообщение вместо необработанной ошибки NotImplemented.", + "This user already exists": "Этот пользователь уже существует", + "Unable to reach RustFS server health endpoint": "Не удалось обратиться к endpoint состояния сервера RustFS", + "Unhealthy": "Неисправен", + "Update license": "Обновить лицензию", + "Update the deployment environment first before changing ENV-managed module switches.": "Сначала обновите среду развертывания, прежде чем менять переключатели модулей, управляемые ENV.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Обновите сведения о пирах, которые RustFS использует для управления репликацией сайтов. Поля, не показанные здесь, сохраняются из текущей конфигурации.", + "Usage": "Использование", + "WEBHOOK_CLIENT_CA": "Webhook Client CA", + "WEBHOOK_CLIENT_CERT": "Webhook Client Certificate", + "WEBHOOK_CLIENT_KEY": "Webhook Client Key", + "WEBHOOK_SKIP_TLS_VERIFY": "Webhook Skip TLS Verify", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Когда backend реализует endpoint информации о репликации сайтов, эта страница автоматически покажет сайты-пиры, сводки статуса и действия управления.", + "You do not have permission to update module switches.": "У вас нет разрешения на обновление переключателей модулей.", + "You do not have permission to update OIDC providers.": "У вас нет разрешения на обновление провайдеров OIDC." } diff --git a/i18n/locales/tr-TR.json b/i18n/locales/tr-TR.json index b34ca4b..7dc453e 100644 --- a/i18n/locales/tr-TR.json +++ b/i18n/locales/tr-TR.json @@ -727,8 +727,6 @@ "Send events via MQTT broker": "Olayları MQTT komisyoncusu aracılığıyla gönder", "Send events via NATS": "Olayları NATS aracılığıyla gönder", "Send events via Pulsar": "Olayları Pulsar aracılığıyla gönder", - "Send events via NATS": "Olayları NATS aracılığıyla gönder", - "Send events via Pulsar": "Olayları Pulsar aracılığıyla gönder", "Server Address": "Sunucu Adresi", "Server Configuration": "Sunucu Yapılandırması", "Server Host": "Sunucu Ana Bilgisayarı", @@ -883,7 +881,7 @@ "WORM": "SOLUCAN", "Waiting": "Bekliyor", "Warning": "Uyarı", - "Webhook": "Web kancası", + "Webhook": "Webhook", "Wednesday": "Çarşamba", "Weekly MB/s Change Trend": "Haftalık MB/sn Değişim Trendi", "YEARS": "YIL", @@ -1109,8 +1107,8 @@ "Failed to save OIDC provider": "OIDC sağlayıcısı kaydedilemedi", "Failed to validate OIDC configuration": "OIDC yapılandırması doğrulanamadı", "Groups Claim": "Gruplar Claim", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "Rol claim'i", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "İsteğe bağlı. Rol değerleri için ayrı claim (ör. roles). Yalnızca groups claim'ini kullanmak için boş bırakın.", "Issuer": "Yayıncı", "Leave empty to keep current secret": "Geçerli sırrı korumak için boş bırakın", "Loading...": "Yükleniyor...", @@ -1147,5 +1145,118 @@ "Validate": "Doğrula", "Validating...": "Doğrulanıyor...", "View and manage persisted OIDC providers.": "Kalıcı OIDC sağlayıcılarını görüntüleyin ve yönetin.", - "You have unsaved OIDC changes. Do you want to discard them?": "Kaydedilmemiş OIDC değişiklikleriniz var. Bunları göz ardı etmek istiyor musunuz?" + "You have unsaved OIDC changes. Do you want to discard them?": "Kaydedilmemiş OIDC değişiklikleriniz var. Bunları göz ardı etmek istiyor musunuz?", + "Add {type} Audit Target": "{type} denetim hedefi ekle", + "Add Audit Target": "Denetim hedefi ekle", + "API not ready": "API hazır değil", + "Are you sure you want to delete this audit target?": "Bu denetim hedefini silmek istediğinizden emin misiniz?", + "Are you sure you want to delete this tag?": "Bu etiketi silmek istediğinizden emin misiniz?", + "Are you sure you want to delete this user?": "Bu kullanıcıyı silmek istediğinizden emin misiniz?", + "Audit is disabled": "Denetim devre dışı", + "Audit is disabled. Enable audit before managing audit targets.": "Denetim devre dışı. Denetim hedeflerini yönetmeden önce denetimi etkinleştirin.", + "Audit target created successfully": "Denetim hedefi başarıyla oluşturuldu", + "Audit Targets": "Denetim hedefleri", + "Back to Login": "Girişe dön", + "Bucket name is required": "Bucket adı zorunludur", + "Bucket names must be 3-63 characters long": "Bucket adları 3-63 karakter uzunluğunda olmalıdır", + "Bucket names must not contain uppercase letters": "Bucket adları büyük harf içeremez", + "Bucket not found": "Bucket bulunamadı", + "Cancel Deletion": "Silmeyi iptal et", + "Cancel Key Deletion": "Anahtar silmeyi iptal et", + "Client ID is required": "İstemci ID zorunludur", + "Collecting files": "Dosyalar toplanıyor", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "CPU, bellek ve disk G/Ç gibi temel performans göstergelerini grafiklerle toplar ve gösterir; kullanıcıların sistem çalışma durumunu ve performans darboğazlarını anlamasına yardımcı olur", + "Comma-separated audience IDs.": "Virgülle ayrılmış hedef kitle ID'leri.", + "Console": "Console", + "Content Type": "İçerik türü", + "Controlled by {envKey}": "{envKey} tarafından kontrol edilir", + "Copy Path": "Yolu kopyala", + "Create an audit target to forward audit logs.": "Denetim günlüklerini iletmek için bir denetim hedefi oluşturun.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Çoğaltılan bucket'lar, kullanıcılar, gruplar, politikalar ve yaşam döngüsü sona erme kuralları için geçerli backend durumu.", + "Default": "Varsayılan", + "Delete Tag": "Etiketi sil", + "Delete task created": "Silme görevi oluşturuldu", + "Deletion Date": "Silme tarihi", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "Ayrıntılı site çoğaltma durumu bu sunucuda henüz kullanılamıyor. Temel eş bilgileri aşağıda gösterilmeye devam eder.", + "Download Failed": "İndirme başarısız", + "Download ready": "İndirme hazır", + "Downloading files": "Dosyalar indiriliyor", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Kümenin katılım el sıkışmasını tamamlayabilmesi için her uzak sitenin bir endpoint'e ve yönetici kimlik bilgilerine ihtiyacı vardır.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Her uzak site, ilk çoğaltma el sıkışmasını tamamlamak için yönetici kimlik bilgilerini kullanır.", + "Enable audit in Settings before managing audit targets.": "Denetim hedeflerini yönetmeden önce Ayarlar'da denetimi etkinleştirin.", + "Enable notify in Settings before managing bucket event subscriptions.": "Bucket olay aboneliklerini yönetmeden önce Ayarlar'da bildirimleri etkinleştirin.", + "Enable notify in Settings before managing event destinations.": "Olay hedeflerini yönetmeden önce Ayarlar'da bildirimleri etkinleştirin.", + "Enter prefix...": "Önek girin...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Bazı anahtarlar ortam değişkenleri tarafından kontrol ediliyor", + "Exit Fullscreen": "Tam ekrandan çık", + "Failed to create audit target": "Denetim hedefi oluşturulamadı", + "Failed to generate secure random keys": "Güvenli rastgele anahtarlar oluşturulamadı", + "Failed to load key details": "Anahtar ayrıntıları yüklenemedi", + "Failed to load module switches": "Modül anahtarları yüklenemedi", + "File Permissions": "Dosya izinleri", + "Formatted": "Biçimlendirilmiş", + "Fullscreen": "Tam ekran", + "Getting URL": "URL alınıyor", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Sağlık", + "Healthy": "Sağlıklı", + "Key Manager": "Anahtar yöneticisi", + "Leave blank to keep the stored Vault token.": "Saklanan Vault token'ını korumak için boş bırakın.", + "Max Cached Keys": "En fazla önbelleğe alınan anahtar", + "Metadata": "Meta veri", + "Module switch is managed by environment variables": "Modül anahtarı ortam değişkenleri tarafından yönetiliyor", + "Module switches saved": "Modül anahtarları kaydedildi", + "New access key has been created": "Yeni erişim anahtarı oluşturuldu", + "No Audit Targets": "Denetim hedefi yok", + "No files to download": "İndirilecek dosya yok", + "No options available": "Kullanılabilir seçenek yok", + "No tags": "Etiket yok", + "Notify": "Bildirimler", + "Notify is disabled": "Bildirimler devre dışı", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Bildirimler devre dışı. Bucket olay aboneliklerini yönetmeden önce bildirimleri etkinleştirin.", + "Notify is disabled. Enable notify before managing event destinations.": "Bildirimler devre dışı. Olay hedeflerini yönetmeden önce bildirimleri etkinleştirin.", + "Origin": "Kaynak", + "Other Audiences": "Diğer hedef kitleler", + "password length cannot be less than 8 characters and greater than 40 characters": "Parola uzunluğu 8 karakterden az ve 40 karakterden fazla olamaz", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "RustFS backend site çoğaltma API'si ve MinIO tarzı site yönetim akışıyla uyumlu eş üyeliği ve düzenlenebilir çoğaltma kontrolleri.", + "Please enter GCS credentials JSON": "Lütfen GCS kimlik bilgileri JSON'unu girin", + "Please remove members first": "Lütfen önce üyeleri kaldırın", + "Please select audit target type": "Lütfen denetim hedefi türünü seçin", + "Previous": "Önceki", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Yöneticilerin sistem durumunu gerçek zamanlı anlamasına, kararlılık ve güvenilirliği sağlamasına yardımcı olmak için ayrıntılı performans izleme ve uyarı mekanizmaları sunar", + "Quota Save Failed": "Kota kaydedilemedi", + "Raw": "Ham", + "Read-only OIDC settings": "Salt okunur OIDC ayarları", + "Read-only settings": "Salt okunur ayarlar", + "Request failed": "İstek başarısız", + "Select backend type": "Backend türünü seçin", + "sha256": "sha256", + "State": "Durum", + "Stored token is hidden. Enter a new token only to replace it.": "Saklanan token gizlidir. Yalnızca değiştirmek için yeni bir token girin.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "Geçerli site sunucu tarafından otomatik olarak algılanır. Çoğaltma grubuna katılmak için bir veya daha fazla uzak site ekleyin.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Bu anahtar, SSE-KMS ve SSE-S3 için platform varsayılanı olarak kullanılır.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Bu sunucu site çoğaltma API'sini henüz sunmadığı için sayfa ham NotImplemented hatası yerine anlaşılır bir yedek mesaj gösterir.", + "This user already exists": "Bu kullanıcı zaten var", + "Unable to reach RustFS server health endpoint": "RustFS sunucu sağlık endpoint'ine ulaşılamıyor", + "Unhealthy": "Sağlıksız", + "Update the deployment environment first before changing ENV-managed module switches.": "ENV tarafından yönetilen modül anahtarlarını değiştirmeden önce dağıtım ortamını güncelleyin.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "RustFS'nin site çoğaltma yönetimi için kullandığı eş ayrıntılarını güncelleyin. Burada gösterilmeyen alanlar mevcut yapılandırmadan korunur.", + "Usage": "Kullanım", + "WEBHOOK_CLIENT_CA": "Webhook Client CA", + "WEBHOOK_CLIENT_CERT": "Webhook Client Certificate", + "WEBHOOK_CLIENT_KEY": "Webhook Client Key", + "WEBHOOK_SKIP_TLS_VERIFY": "Webhook Skip TLS Verify", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Backend site çoğaltma bilgisi endpoint'ini uyguladığında bu sayfa otomatik olarak eş siteleri, durum özetlerini ve yönetim işlemlerini gösterir.", + "X-Amz-Algorithm": "X-Amz-Algorithm", + "X-Amz-Content-Sha256": "X-Amz-Content-Sha256", + "X-Amz-Credential": "X-Amz-Credential", + "X-Amz-Date": "X-Amz-Date", + "X-Amz-Expires": "X-Amz-Expires", + "X-Amz-Security-Token": "X-Amz-Security-Token", + "X-Amz-Signature": "X-Amz-Signature", + "X-Amz-SignedHeaders": "X-Amz-SignedHeaders", + "X-Amz-Target": "X-Amz-Target", + "You do not have permission to update module switches.": "Modül anahtarlarını güncelleme izniniz yok.", + "You do not have permission to update OIDC providers.": "OIDC sağlayıcılarını güncelleme izniniz yok." } diff --git a/i18n/locales/vi-VN.json b/i18n/locales/vi-VN.json index 940e49a..b1ebe63 100644 --- a/i18n/locales/vi-VN.json +++ b/i18n/locales/vi-VN.json @@ -1015,7 +1015,7 @@ "The server detects the local site identity from the active RustFS deployment.": "Máy chủ phát hiện danh tính site cục bộ từ bản triển khai RustFS đang hoạt động.", "Replication Summary": "Tóm tắt sao chép", "Overview of replicated configuration and object replication activity.": "Tổng quan về cấu hình đã sao chép và hoạt động sao chép đối tượng.", - "Sites": "Các site", + "Sites": "Site", "Replicated Objects": "Đối tượng đã sao chép", "Replicated Size": "Dung lượng đã sao chép", "Replicated Scope": "Phạm vi sao chép", @@ -1096,8 +1096,8 @@ "Failed to save OIDC provider": "Lưu nhà cung cấp OIDC thất bại", "Failed to validate OIDC configuration": "Xác thực cấu hình OIDC thất bại", "Groups Claim": "Claim nhóm", - "Roles Claim": "Roles Claim", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.", + "Roles Claim": "Claim vai trò", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "Tùy chọn. Claim riêng cho giá trị vai trò (ví dụ: roles). Để trống để chỉ dùng claim nhóm.", "Issuer": "Nhà phát hành", "Leave empty to keep current secret": "Để trống để giữ secret hiện tại", "Loading...": "Đang tải...", @@ -1134,5 +1134,129 @@ "Validate": "Xác thực", "Validating...": "Đang xác thực...", "View and manage persisted OIDC providers.": "Xem và quản lý các nhà cung cấp OIDC đã lưu.", - "You have unsaved OIDC changes. Do you want to discard them?": "Bạn có thay đổi OIDC chưa lưu. Bạn có muốn bỏ chúng không?" + "You have unsaved OIDC changes. Do you want to discard them?": "Bạn có thay đổi OIDC chưa lưu. Bạn có muốn bỏ chúng không?", + "a": "a", + "Add {type} Audit Target": "Thêm đích kiểm toán {type}", + "Add Audit Target": "Thêm đích kiểm toán", + "API not ready": "API chưa sẵn sàng", + "Are you sure you want to delete this audit target?": "Bạn có chắc muốn xóa đích kiểm toán này không?", + "Are you sure you want to delete this tag?": "Bạn có chắc muốn xóa thẻ này không?", + "Are you sure you want to delete this user?": "Bạn có chắc muốn xóa người dùng này không?", + "ARN": "ARN", + "Audit is disabled": "Kiểm toán đã bị tắt", + "Audit is disabled. Enable audit before managing audit targets.": "Kiểm toán đã bị tắt. Hãy bật kiểm toán trước khi quản lý đích kiểm toán.", + "Audit target created successfully": "Đã tạo đích kiểm toán thành công", + "Audit Targets": "Đích kiểm toán", + "AWS S3": "AWS S3", + "Back to Login": "Quay lại đăng nhập", + "Bucket name is required": "Tên bucket là bắt buộc", + "Bucket names must be 3-63 characters long": "Tên bucket phải dài từ 3 đến 63 ký tự", + "Bucket names must not contain uppercase letters": "Tên bucket không được chứa chữ hoa", + "Bucket not found": "Không tìm thấy bucket", + "Cancel Deletion": "Hủy xóa", + "Cancel Key Deletion": "Hủy xóa khóa", + "Client ID is required": "Client ID là bắt buộc", + "Collecting files": "Đang thu thập tệp", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "Thu thập và hiển thị các chỉ số hiệu năng chính như CPU, bộ nhớ, I/O đĩa qua biểu đồ trực quan, giúp người dùng hiểu trạng thái vận hành hệ thống và các điểm nghẽn hiệu năng", + "Comma-separated audience IDs.": "Các ID đối tượng, phân tách bằng dấu phẩy.", + "Console": "Console", + "Content Type": "Loại nội dung", + "Controlled by {envKey}": "Được kiểm soát bởi {envKey}", + "Copy Path": "Sao chép đường dẫn", + "Create an audit target to forward audit logs.": "Tạo đích kiểm toán để chuyển tiếp nhật ký kiểm toán.", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "Trạng thái backend hiện tại của các bucket, người dùng, nhóm, chính sách và quy tắc hết hạn vòng đời được sao chép.", + "Default": "Mặc định", + "Delete Tag": "Xóa thẻ", + "Delete task created": "Đã tạo tác vụ xóa", + "Deletion Date": "Ngày xóa", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "Trạng thái sao chép site chi tiết chưa khả dụng trên máy chủ này. Thông tin peer cơ bản vẫn được hiển thị bên dưới.", + "div": "div", + "Download Failed": "Tải xuống thất bại", + "Download ready": "Tải xuống đã sẵn sàng", + "Downloading files": "Đang tải tệp xuống", + "e.g., app-default": "e.g., app-default", + "e.g., https://vault.example.com:8200": "e.g., https://vault.example.com:8200", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "Mỗi site từ xa cần một endpoint và thông tin xác thực quản trị viên để cụm hoàn tất handshake tham gia.", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "Mỗi site từ xa sử dụng thông tin xác thực quản trị viên để hoàn tất handshake sao chép ban đầu.", + "Enable audit in Settings before managing audit targets.": "Hãy bật kiểm toán trong Cài đặt trước khi quản lý đích kiểm toán.", + "Enable notify in Settings before managing bucket event subscriptions.": "Hãy bật thông báo trong Cài đặt trước khi quản lý đăng ký sự kiện bucket.", + "Enable notify in Settings before managing event destinations.": "Hãy bật thông báo trong Cài đặt trước khi quản lý đích sự kiện.", + "Enter prefix...": "Nhập tiền tố...", + "ENV": "ENV", + "Environment variables are controlling some switches": "Một số công tắc đang được biến môi trường kiểm soát", + "Example: http://localhost:9000 or https://your-domain.com": "Example: http://localhost:9000 or https://your-domain.com", + "Exit Fullscreen": "Thoát toàn màn hình", + "Failed to create audit target": "Không thể tạo đích kiểm toán", + "Failed to generate secure random keys": "Không thể tạo khóa ngẫu nhiên an toàn", + "Failed to load key details": "Không thể tải chi tiết khóa", + "Failed to load module switches": "Không thể tải công tắc module", + "File Permissions": "Quyền tệp", + "Formatted": "Đã định dạng", + "Fullscreen": "Toàn màn hình", + "Getting URL": "Đang lấy URL", + "HashiCorp Vault KV2": "HashiCorp Vault KV2", + "Health": "Sức khỏe", + "Healthy": "Khỏe mạnh", + "Key Manager": "Trình quản lý khóa", + "Leave blank to keep the stored Vault token.": "Để trống để giữ token Vault đã lưu.", + "Max Cached Keys": "Số khóa lưu cache tối đa", + "Metadata": "Siêu dữ liệu", + "Minio": "Minio", + "Module switch is managed by environment variables": "Công tắc module được quản lý bởi biến môi trường", + "Module switches saved": "Đã lưu công tắc module", + "New access key has been created": "Khóa truy cập mới đã được tạo", + "No Audit Targets": "Không có đích kiểm toán", + "No files to download": "Không có tệp để tải xuống", + "No options available": "Không có tùy chọn khả dụng", + "No tags": "Không có thẻ", + "Notify": "Thông báo", + "Notify is disabled": "Thông báo đã bị tắt", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Thông báo đã bị tắt. Hãy bật thông báo trước khi quản lý đăng ký sự kiện bucket.", + "Notify is disabled. Enable notify before managing event destinations.": "Thông báo đã bị tắt. Hãy bật thông báo trước khi quản lý đích sự kiện.", + "Origin": "Nguồn gốc", + "Other Audiences": "Đối tượng khác", + "password length cannot be less than 8 characters and greater than 40 characters": "Mật khẩu phải dài từ 8 đến 40 ký tự", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "Thành viên peer và các điều khiển sao chép có thể chỉnh sửa, phù hợp với API sao chép site backend của RustFS và luồng quản lý site kiểu MinIO.", + "Please enter GCS credentials JSON": "Vui lòng nhập JSON thông tin xác thực GCS", + "Please remove members first": "Vui lòng xóa thành viên trước", + "Please select audit target type": "Vui lòng chọn loại đích kiểm toán", + "Previous": "Trước", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "Cung cấp cơ chế giám sát hiệu năng và cảnh báo chi tiết, giúp quản trị viên hiểu trạng thái hệ thống theo thời gian thực và đảm bảo tính ổn định, tin cậy", + "Quota Save Failed": "Lưu hạn ngạch thất bại", + "Raw": "Thô", + "Read-only OIDC settings": "Cài đặt OIDC chỉ đọc", + "Read-only settings": "Cài đặt chỉ đọc", + "Request failed": "Yêu cầu thất bại", + "s3fs": "s3fs", + "Select backend type": "Chọn loại backend", + "sha256": "sha256", + "State": "Trạng thái", + "Stored token is hidden. Enter a new token only to replace it.": "Token đã lưu đang bị ẩn. Chỉ nhập token mới khi muốn thay thế.", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "Site hiện tại được máy chủ tự động phát hiện. Thêm một hoặc nhiều site từ xa để tham gia nhóm sao chép.", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "Khóa này được dùng làm khóa mặc định của nền tảng cho SSE-KMS và SSE-S3.", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "Máy chủ này chưa mở API sao chép site, nên trang sẽ hiển thị thông báo dự phòng thân thiện thay vì lỗi NotImplemented thô.", + "This user already exists": "Người dùng này đã tồn tại", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "Không thể truy cập endpoint sức khỏe của máy chủ RustFS", + "Unhealthy": "Không khỏe mạnh", + "Update license": "Cập nhật giấy phép", + "Update the deployment environment first before changing ENV-managed module switches.": "Hãy cập nhật môi trường triển khai trước khi thay đổi công tắc module do ENV quản lý.", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "Cập nhật chi tiết peer mà RustFS dùng để quản lý sao chép site. Các trường không hiển thị ở đây sẽ được giữ từ cấu hình hiện tại.", + "update:name": "update:name", + "update:show": "update:show", + "update:visible": "update:visible", + "Usage": "Mức sử dụng", + "Webhook": "Webhook", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "Khi backend triển khai endpoint thông tin sao chép site, trang này sẽ tự động hiển thị các site peer, tóm tắt trạng thái và thao tác quản lý.", + "X-Amz-Algorithm": "X-Amz-Algorithm", + "X-Amz-Content-Sha256": "X-Amz-Content-Sha256", + "X-Amz-Credential": "X-Amz-Credential", + "X-Amz-Date": "X-Amz-Date", + "X-Amz-Expires": "X-Amz-Expires", + "X-Amz-Security-Token": "X-Amz-Security-Token", + "X-Amz-Signature": "X-Amz-Signature", + "X-Amz-SignedHeaders": "X-Amz-SignedHeaders", + "X-Amz-Target": "X-Amz-Target", + "You do not have permission to update module switches.": "Bạn không có quyền cập nhật công tắc module.", + "You do not have permission to update OIDC providers.": "Bạn không có quyền cập nhật nhà cung cấp OIDC." } diff --git a/i18n/locales/zh-CN.json b/i18n/locales/zh-CN.json index c9df756..2f3c591 100644 --- a/i18n/locales/zh-CN.json +++ b/i18n/locales/zh-CN.json @@ -244,8 +244,8 @@ "ENV": "环境变量", "Emergency Response": "紧急响应", "Enable Cache": "启用缓存", - "Enable notify in Settings before managing bucket event subscriptions.": "请先在设置中启用 notify,再管理存储桶事件订阅。", - "Enable notify in Settings before managing event destinations.": "请先在设置中启用 notify,再管理事件目标。", + "Enable notify in Settings before managing bucket event subscriptions.": "请先在设置中启用通知,再管理存储桶事件订阅。", + "Enable notify in Settings before managing event destinations.": "请先在设置中启用通知,再管理事件目标。", "Enable Storage Encryption": "启用存储空间加密", "Enable caching for better performance, default: true": "启用缓存以提高性能,默认:true", "Enable secure transport when connecting to endpoint.": "连接到端点时启用安全传输。", @@ -260,7 +260,7 @@ "Enter AppRole Role ID": "输入 AppRole 角色 ID", "Enter AppRole Secret ID": "输入AppRole Secret ID", "Enter your Vault authentication token": "输入您的Vault认证令牌", - "Leave blank to keep the stored Vault token.": "留空则继续使用已存储的 Vault 令牌。", + "Leave blank to keep the stored Vault token.": "留空以保留已存储的 Vault 令牌。", "Enterprise": "企业版", "Enterprise License": "企业版许可证", "Enterprise Service Level": "企业服务级别", @@ -517,9 +517,9 @@ "New Secret Key": "新密钥", "New user has been created": "新用户已创建", "Notify": "通知", - "Notify is disabled": "Notify 已禁用", - "Notify is disabled. Enable notify before managing bucket event subscriptions.": "Notify 已禁用。请先启用 notify,再管理存储桶事件订阅。", - "Notify is disabled. Enable notify before managing event destinations.": "Notify 已禁用。请先启用 notify,再管理事件目标。", + "Notify is disabled": "通知已禁用", + "Notify is disabled. Enable notify before managing bucket event subscriptions.": "通知已禁用。请先启用通知,再管理存储桶事件订阅。", + "Notify is disabled. Enable notify before managing event destinations.": "通知已禁用。请先启用通知,再管理事件目标。", "Next": "下一页", "Next Page": "下一页", "No": "否", @@ -688,7 +688,7 @@ "Replicate Delete": "复制删除", "Request timeout in seconds, default: 30": "请求超时时间(秒),默认:30", "Required: Vault authentication token": "必需:Vault 认证令牌", - "Stored token is hidden. Enter a new token only to replace it.": "已存储的令牌不会显示;仅在需要替换时输入新令牌。", + "Stored token is hidden. Enter a new token only to replace it.": "已存储的令牌已隐藏。仅在需要替换时输入新令牌。", "Reset": "重置", "Reset to Default": "重置为默认", "Reset to default successfully": "重置为默认成功", @@ -761,8 +761,6 @@ "Send events via MQTT broker": "通过 MQTT 代理发送事件", "Send events via NATS": "通过 NATS 发送事件", "Send events via Pulsar": "通过 Pulsar 发送事件", - "Send events via NATS": "通过 NATS 发送事件", - "Send events via Pulsar": "通过 Pulsar 发送事件", "Server Address": "服务器地址", "Server Configuration": "服务器配置", "Server Host": "服务器主机", @@ -842,7 +840,7 @@ "This action cannot be undone and will bypass the normal deletion process.": "此操作无法撤销,将绕过正常删除过程。", "This action cannot be undone.": "此操作无法撤销。", "This link will expire when your session ends or at the specified time.": "此链接将会在您的登录会话结束或达到指定时间后失效。", - "This user already exists": "该用户已存在", + "This user already exists": "此用户已存在", "Thursday": "星期四", "Tier": "存储层", "Tier Type": "存储层类型", @@ -879,7 +877,7 @@ "Update Success": "更新成功", "Update failed": "更新失败", "Update success": "更新成功", - "Update the deployment environment first before changing ENV-managed module switches.": "修改由环境变量管理的模块开关前,请先更新部署环境。", + "Update the deployment environment first before changing ENV-managed module switches.": "更改由 ENV 管理的模块开关前,请先更新部署环境。", "Updated At": "更新时间", "Updated successfully": "更新成功", "Upload": "上传", @@ -935,8 +933,8 @@ "Year": "年", "Yes": "是", "You do not have permission to access this page. This may be due to insufficient permissions or not being logged in.": "您没有访问该页面的权限,可能是权限不足或未登录。", - "You do not have permission to update OIDC providers.": "您没有权限更新 OIDC 提供方。", - "You do not have permission to update module switches.": "您没有权限更新模块开关。", + "You do not have permission to update OIDC providers.": "您没有更新 OIDC 提供商的权限。", + "You do not have permission to update module switches.": "您没有更新模块开关的权限。", "Your browser does not support the audio tag": "您的浏览器不支持音频标签", "Your browser does not support the video tag": "您的浏览器不支持视频标签", "Your session has expired. Please log in again.": "您的会话已过期。请重新登录。", @@ -998,7 +996,7 @@ "Failed to validate OIDC configuration": "OIDC 配置校验失败", "Groups Claim": "分组声明", "Roles Claim": "角色声明", - "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "可选。角色值的独立声明名(例如 roles)。留空则仅使用分组声明。", + "Optional. Separate claim for role values (e.g. roles). Leave empty to use groups claim only.": "可选。用于角色值的独立声明(例如 roles)。留空则仅使用组声明。", "Issuer": "签发者", "Leave empty to keep current secret": "留空表示保留当前密钥", "Loading...": "加载中...", @@ -1171,5 +1169,94 @@ "The value is used only for the initial join request.": "该值仅用于初次加入请求。", "Select": "选择", "Object Naming Mode": "对象命名模式", - "Optional": "可选" + "Optional": "可选", + "Add {type} Audit Target": "添加 {type} 审计目标", + "Add Audit Target": "添加审计目标", + "API not ready": "API 未就绪", + "Are you sure you want to delete this audit target?": "确定要删除此审计目标吗?", + "Are you sure you want to delete this tag?": "确定要删除此标签吗?", + "Are you sure you want to delete this user?": "确定要删除此用户吗?", + "Audit is disabled": "审计已禁用", + "Audit is disabled. Enable audit before managing audit targets.": "审计已禁用。请先在设置中启用审计,再管理审计目标。", + "Audit target created successfully": "审计目标创建成功", + "Audit Targets": "审计目标", + "Back to Login": "返回登录", + "Bucket name is required": "存储桶名称为必填项", + "Bucket not found": "未找到存储桶", + "Cancel Deletion": "取消删除", + "Cancel Key Deletion": "取消密钥删除", + "Client ID is required": "客户端 ID 为必填项", + "Collecting files": "正在收集文件", + "Collects and displays key performance indicators (such as CPU, memory, disk I/O, etc.) through visualized charts to help users understand system operation status and performance bottlenecks": "通过可视化图表收集并展示 CPU、内存、磁盘 I/O 等关键性能指标,帮助用户了解系统运行状态和性能瓶颈", + "Comma-separated audience IDs.": "多个受众 ID 请用逗号分隔。", + "Content Type": "内容类型", + "Copy Path": "复制路径", + "Create an audit target to forward audit logs.": "创建审计目标以转发审计日志。", + "Current backend status for replicated buckets, users, groups, policies, and lifecycle expiry rules.": "复制存储桶、用户、用户组、策略和生命周期过期规则的当前后端状态。", + "Delete Tag": "删除标签", + "Delete task created": "删除任务已创建", + "Deletion Date": "删除日期", + "Detailed site replication status is not available on this server yet. Basic peer information is still shown below.": "此服务器尚未提供详细的站点复制状态。下方仍会显示基础对等站点信息。", + "Download Failed": "下载失败", + "Download ready": "下载已就绪", + "Downloading files": "正在下载文件", + "Each remote site needs an endpoint and administrator credentials so the cluster can complete the join handshake.": "每个远程站点都需要端点和管理员凭证,以便集群完成加入握手。", + "Each remote site uses its administrator credentials to complete the initial replication handshake.": "每个远程站点都会使用其管理员凭证完成初始复制握手。", + "Enable audit in Settings before managing audit targets.": "请先在设置中启用审计,再管理审计目标。", + "Enter prefix...": "输入前缀...", + "Exit Fullscreen": "退出全屏", + "Failed to create audit target": "创建审计目标失败", + "Failed to generate secure random keys": "生成安全随机密钥失败", + "Failed to load key details": "加载密钥详情失败", + "File Permissions": "文件权限", + "Formatted": "已格式化", + "Fullscreen": "全屏", + "Getting URL": "正在获取 URL", + "Health": "健康状态", + "Healthy": "健康", + "Key Manager": "密钥管理器", + "Max Cached Keys": "最大缓存密钥数", + "Metadata": "元数据", + "New access key has been created": "新的访问密钥已创建", + "No Audit Targets": "无审计目标", + "No files to download": "没有可下载的文件", + "No options available": "没有可用选项", + "No tags": "无标签", + "Origin": "来源", + "Other Audiences": "其他受众", + "password length cannot be less than 8 characters and greater than 40 characters": "密码长度不能少于 8 个字符且不能超过 40 个字符", + "Peer membership and editable replication controls, aligned with the RustFS backend site replication API and MinIO-style site management flow.": "对等站点成员关系和可编辑的复制控制,与 RustFS 后端站点复制 API 及 MinIO 风格的站点管理流程保持一致。", + "Please enter GCS credentials JSON": "请输入 GCS 凭证 JSON", + "Please remove members first": "请先移除成员", + "Please select audit target type": "请选择审计目标类型", + "Previous": "上一页", + "Provides detailed performance monitoring and alerting mechanisms to help administrators understand system status in real-time and ensure system stability and reliability": "提供详细的性能监控和告警机制,帮助管理员实时了解系统状态,确保系统稳定可靠运行", + "Quota Save Failed": "配额保存失败", + "Raw": "原始", + "Request failed": "请求失败", + "Select backend type": "选择后端类型", + "sha256": "sha256", + "State": "状态", + "The current site is detected automatically by the server. Add one or more remote sites to join the replication group.": "当前站点由服务器自动检测。请添加一个或多个远程站点以加入复制组。", + "This key is used as the platform default for SSE-KMS and SSE-S3.": "此密钥将作为平台的 SSE-KMS 和 SSE-S3 默认密钥。", + "This server has not exposed the site replication API yet, so the page now shows a friendly fallback instead of a raw NotImplemented error.": "此服务器尚未开放站点复制 API,因此页面会显示友好的降级提示,而不是原始的 NotImplemented 错误。", + "transit": "transit", + "Unable to reach RustFS server health endpoint": "无法访问 RustFS 服务器健康检查端点", + "Unhealthy": "异常", + "Update license": "更新许可证", + "Update the peer details that RustFS uses for site replication management. Fields not shown here are preserved from the current configuration.": "更新 RustFS 用于站点复制管理的对等站点详情。此处未显示的字段会保留当前配置。", + "update:name": "update:name", + "update:show": "update:show", + "update:visible": "update:visible", + "Usage": "用量", + "When the backend implements the site replication info endpoint, this page will automatically show peer sites, status summaries, and management actions.": "后端实现站点复制信息端点后,此页面会自动显示对等站点、状态摘要和管理操作。", + "X-Amz-Algorithm": "X-Amz-Algorithm", + "X-Amz-Content-Sha256": "X-Amz-Content-Sha256", + "X-Amz-Credential": "X-Amz-Credential", + "X-Amz-Date": "X-Amz-Date", + "X-Amz-Expires": "X-Amz-Expires", + "X-Amz-Security-Token": "X-Amz-Security-Token", + "X-Amz-Signature": "X-Amz-Signature", + "X-Amz-SignedHeaders": "X-Amz-SignedHeaders", + "X-Amz-Target": "X-Amz-Target" } diff --git a/lib/i18n-config.js b/lib/i18n-config.js new file mode 100644 index 0000000..60dcc55 --- /dev/null +++ b/lib/i18n-config.js @@ -0,0 +1,77 @@ +export const DEFAULT_LOCALE = "en" + +export const LOCALE_FILE_MAP = { + en: "en-US", + ar: "ar-MA", + zh: "zh-CN", + ja: "ja-JP", + ko: "ko-KR", + de: "de-DE", + fr: "fr-FR", + es: "es-ES", + pt: "pt-BR", + it: "it-IT", + ru: "ru-RU", + tr: "tr-TR", + id: "id-ID", + vi: "vi-VN", +} + +export const LOCALE_CODES = Object.keys(LOCALE_FILE_MAP) +export const RTL_LOCALES = new Set(["ar"]) + +const LOCALE_ALIASES = { + ar: "ar", + arma: "ar", + de: "de", + dede: "de", + en: "en", + enus: "en", + es: "es", + eses: "es", + fr: "fr", + frfr: "fr", + id: "id", + idid: "id", + it: "it", + itit: "it", + ja: "ja", + jajp: "ja", + ko: "ko", + kokr: "ko", + pt: "pt", + ptbr: "pt", + ru: "ru", + ruru: "ru", + tr: "tr", + trtr: "tr", + vi: "vi", + vivn: "vi", + zh: "zh", + zhcn: "zh", + zhhans: "zh", +} + +function isLocale(value) { + return Object.prototype.hasOwnProperty.call(LOCALE_FILE_MAP, value) +} + +export function normalizeLocale(value) { + if (!value) return DEFAULT_LOCALE + + const normalized = value.trim().replace(/_/g, "-").toLowerCase() + const compact = normalized.replace(/-/g, "") + const alias = LOCALE_ALIASES[compact] + if (alias) return alias + + const language = normalized.split("-")[0] + return isLocale(language) ? language : DEFAULT_LOCALE +} + +export function getLocaleFile(value) { + return LOCALE_FILE_MAP[normalizeLocale(value)] +} + +export function isRtlLocale(value) { + return RTL_LOCALES.has(normalizeLocale(value)) +} diff --git a/lib/i18n-config.ts b/lib/i18n-config.ts new file mode 100644 index 0000000..b9723d5 --- /dev/null +++ b/lib/i18n-config.ts @@ -0,0 +1,79 @@ +export const DEFAULT_LOCALE = "en" + +export const LOCALE_FILE_MAP = { + en: "en-US", + ar: "ar-MA", + zh: "zh-CN", + ja: "ja-JP", + ko: "ko-KR", + de: "de-DE", + fr: "fr-FR", + es: "es-ES", + pt: "pt-BR", + it: "it-IT", + ru: "ru-RU", + tr: "tr-TR", + id: "id-ID", + vi: "vi-VN", +} as const + +export type Locale = keyof typeof LOCALE_FILE_MAP + +export const LOCALE_CODES = Object.keys(LOCALE_FILE_MAP) as Locale[] +export const RTL_LOCALES = new Set(["ar"]) + +const LOCALE_ALIASES: Record = { + ar: "ar", + arma: "ar", + de: "de", + dede: "de", + en: "en", + enus: "en", + es: "es", + eses: "es", + fr: "fr", + frfr: "fr", + id: "id", + idid: "id", + it: "it", + itit: "it", + ja: "ja", + jajp: "ja", + ko: "ko", + kokr: "ko", + pt: "pt", + ptbr: "pt", + ru: "ru", + ruru: "ru", + tr: "tr", + trtr: "tr", + vi: "vi", + vivn: "vi", + zh: "zh", + zhcn: "zh", + zhhans: "zh", +} + +function isLocale(value: string): value is Locale { + return Object.prototype.hasOwnProperty.call(LOCALE_FILE_MAP, value) +} + +export function normalizeLocale(value: string | null | undefined): Locale { + if (!value) return DEFAULT_LOCALE + + const normalized = value.trim().replace(/_/g, "-").toLowerCase() + const compact = normalized.replace(/-/g, "") + const alias = LOCALE_ALIASES[compact] + if (alias) return alias + + const language = normalized.split("-")[0] + return isLocale(language) ? language : DEFAULT_LOCALE +} + +export function getLocaleFile(value: string | null | undefined): (typeof LOCALE_FILE_MAP)[Locale] { + return LOCALE_FILE_MAP[normalizeLocale(value)] +} + +export function isRtlLocale(value: string | null | undefined): boolean { + return RTL_LOCALES.has(normalizeLocale(value)) +} diff --git a/lib/i18n.ts b/lib/i18n.ts index a58d18e..7b91aa5 100644 --- a/lib/i18n.ts +++ b/lib/i18n.ts @@ -4,65 +4,84 @@ import i18n from "i18next" import { initReactI18next } from "react-i18next" import LanguageDetector from "i18next-browser-languagedetector" import { loadThemeLocaleOverride } from "@/lib/theme/locales" - -// Map short locale codes (from Nuxt i18n_redirected) to locale file names -const LOCALE_FILE_MAP: Record = { - en: "en-US", - ar: "ar-MA", - zh: "zh-CN", - ja: "ja-JP", - ko: "ko-KR", - de: "de-DE", - fr: "fr-FR", - es: "es-ES", - pt: "pt-BR", - it: "it-IT", - ru: "ru-RU", - tr: "tr-TR", - id: "id-ID", - vi: "vi-VN", -} - -export type Locale = keyof typeof LOCALE_FILE_MAP -export const LOCALE_CODES: Locale[] = Object.keys(LOCALE_FILE_MAP) as Locale[] -export const RTL_LOCALES = new Set(["ar"]) +import { DEFAULT_LOCALE, LOCALE_CODES, LOCALE_FILE_MAP, normalizeLocale } from "@/lib/i18n-config" const loadLocale = async (file: string) => { const mod = await import(`@/i18n/locales/${file}.json`) return mod.default } -export async function initI18n() { - const resources: Record }> = {} +let initPromise: Promise | null = null - for (const [code, file] of Object.entries(LOCALE_FILE_MAP)) { - const baseLocale = await loadLocale(file) - const themeOverride = await loadThemeLocaleOverride(file) +function createLanguageDetector() { + const detector = new LanguageDetector() - resources[code] = { - translation: themeOverride ? { ...baseLocale, ...themeOverride } : baseLocale, - } - } + detector.addDetector({ + name: "legacyStorage", + lookup() { + if (typeof window === "undefined") return undefined - await i18n - .use(LanguageDetector) - .use(initReactI18next) - .init({ - resources, - fallbackLng: "en", - supportedLngs: LOCALE_CODES, - interpolation: { - escapeValue: false, - prefix: "{", - suffix: "}", - }, - detection: { - order: ["cookie", "localStorage", "navigator"], - lookupCookie: "i18n_redirected", - lookupLocalStorage: "i18n_redirected", - caches: ["cookie", "localStorage"], - }, - }) + return window.localStorage.getItem("i18n_redirected") ?? window.localStorage.getItem("lang") ?? undefined + }, + cacheUserLanguage(lng) { + if (typeof window === "undefined") return - return i18n + const locale = normalizeLocale(lng) + window.localStorage.setItem("i18n_redirected", locale) + window.localStorage.setItem("lang", locale) + }, + }) + + return detector } + +export async function initI18n() { + if (i18n.isInitialized) return i18n + if (initPromise) return initPromise + + initPromise = (async () => { + const resources: Record }> = {} + + for (const [code, file] of Object.entries(LOCALE_FILE_MAP)) { + const baseLocale = await loadLocale(file) + const themeOverride = await loadThemeLocaleOverride(file) + + resources[code] = { + translation: themeOverride ? { ...baseLocale, ...themeOverride } : baseLocale, + } + } + + const languageDetector = createLanguageDetector() + + await i18n + .use(languageDetector) + .use(initReactI18next) + .init({ + resources, + fallbackLng: DEFAULT_LOCALE, + supportedLngs: LOCALE_CODES, + nonExplicitSupportedLngs: true, + load: "languageOnly", + interpolation: { + escapeValue: false, + prefix: "{", + suffix: "}", + }, + returnNull: false, + detection: { + order: ["querystring", "legacyStorage", "cookie", "localStorage", "navigator", "htmlTag"], + lookupQuerystring: "lang", + lookupCookie: "i18n_redirected", + lookupLocalStorage: "i18n_redirected", + caches: ["cookie", "localStorage"], + convertDetectedLanguage: normalizeLocale, + }, + }) + + return i18n + })() + + return initPromise +} + +export { DEFAULT_LOCALE, LOCALE_CODES, RTL_LOCALES, isRtlLocale, normalizeLocale, type Locale } from "@/lib/i18n-config" diff --git a/lib/theme/locales.ts b/lib/theme/locales.ts index 0ef699a..f799f19 100644 --- a/lib/theme/locales.ts +++ b/lib/theme/locales.ts @@ -3,9 +3,10 @@ import { buildRoute } from "@/lib/routes" import { getThemeId } from "@/lib/theme/manifest" -let localeIndexPromise: Promise> | null = null +const localeIndexPromises = new Map>>() async function getThemeLocaleIndex(themeId: string): Promise> { + let localeIndexPromise = localeIndexPromises.get(themeId) if (!localeIndexPromise) { localeIndexPromise = (async () => { try { @@ -19,6 +20,7 @@ async function getThemeLocaleIndex(themeId: string): Promise> { return new Set() } })() + localeIndexPromises.set(themeId, localeIndexPromise) } return localeIndexPromise diff --git a/tests/lib/i18n-config.test.js b/tests/lib/i18n-config.test.js new file mode 100644 index 0000000..4f490b4 --- /dev/null +++ b/tests/lib/i18n-config.test.js @@ -0,0 +1,27 @@ +import test from "node:test" +import assert from "node:assert/strict" + +import { DEFAULT_LOCALE, getLocaleFile, isRtlLocale, normalizeLocale } from "../../lib/i18n-config.js" + +test("normalizeLocale accepts supported, browser, and legacy locale values", () => { + assert.equal(DEFAULT_LOCALE, "en") + assert.equal(normalizeLocale("en-US"), "en") + assert.equal(normalizeLocale("zh_CN"), "zh") + assert.equal(normalizeLocale("zhCN"), "zh") + assert.equal(normalizeLocale("pt-BR"), "pt") + assert.equal(normalizeLocale("pt_BR"), "pt") + assert.equal(normalizeLocale("ar-MA"), "ar") + assert.equal(normalizeLocale("unknown"), "en") +}) + +test("getLocaleFile resolves normalized locales to bundled locale files", () => { + assert.equal(getLocaleFile("en-US"), "en-US") + assert.equal(getLocaleFile("zh_CN"), "zh-CN") + assert.equal(getLocaleFile("pt-BR"), "pt-BR") +}) + +test("isRtlLocale detects right-to-left languages after normalization", () => { + assert.equal(isRtlLocale("ar-MA"), true) + assert.equal(isRtlLocale("ar"), true) + assert.equal(isRtlLocale("en-US"), false) +}) diff --git a/tests/lib/i18n-locales.test.js b/tests/lib/i18n-locales.test.js new file mode 100644 index 0000000..f40bfc0 --- /dev/null +++ b/tests/lib/i18n-locales.test.js @@ -0,0 +1,88 @@ +import test from "node:test" +import assert from "node:assert/strict" +import fs from "node:fs" +import path from "node:path" + +const localeDir = path.resolve("i18n/locales") +const sourceRoots = ["app", "components", "contexts", "hooks", "lib", "config"] +const sourceExtensions = new Set([".ts", ".tsx", ".js", ".jsx"]) + +function readLocale(file) { + return JSON.parse(fs.readFileSync(path.join(localeDir, file), "utf8")) +} + +function walkSourceFiles(dir, files = []) { + if (!fs.existsSync(dir)) return files + + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const filePath = path.join(dir, entry.name) + if (entry.isDirectory()) { + if (entry.name !== "node_modules") walkSourceFiles(filePath, files) + continue + } + + if (sourceExtensions.has(path.extname(entry.name))) files.push(filePath) + } + + return files +} + +function extractLiteralTranslationKeys(source) { + const keys = new Set() + const translationCall = /\bt\(\s*(["'`])((?:\\.|(?!\1)[\s\S])*?)\1/g + let match + + while ((match = translationCall.exec(source))) { + if (!match[2].includes("${")) { + keys.add(match[2].replace(/\\'/g, "'").replace(/\\"/g, '"')) + } + } + + return keys +} + +function extractPlaceholders(value) { + return [...value.matchAll(/\{[^{}]+\}/g)].map(([placeholder]) => placeholder).sort() +} + +test("all locale files provide the same keys as en-US", () => { + const referenceKeys = Object.keys(readLocale("en-US.json")).sort() + const localeFiles = fs + .readdirSync(localeDir) + .filter((file) => file.endsWith(".json")) + .sort() + + for (const file of localeFiles) { + assert.deepEqual(Object.keys(readLocale(file)).sort(), referenceKeys, file) + } +}) + +test("en-US contains every literal translation key used by the app", () => { + const enUS = readLocale("en-US.json") + const usedKeys = new Set() + + for (const file of sourceRoots.flatMap((root) => walkSourceFiles(root))) { + for (const key of extractLiteralTranslationKeys(fs.readFileSync(file, "utf8"))) { + usedKeys.add(key) + } + } + + const missing = [...usedKeys].filter((key) => !(key in enUS)).sort() + assert.deepEqual(missing, []) +}) + +test("translated locale values preserve interpolation placeholders", () => { + const enUS = readLocale("en-US.json") + const localeFiles = fs + .readdirSync(localeDir) + .filter((file) => file.endsWith(".json") && file !== "en-US.json") + .sort() + + for (const file of localeFiles) { + const locale = readLocale(file) + + for (const [key, value] of Object.entries(enUS)) { + assert.deepEqual(extractPlaceholders(locale[key]), extractPlaceholders(value), `${file}: ${key}`) + } + } +})