diff --git a/shared/src/i18n/ar/storage.ts b/shared/src/i18n/ar/storage.ts index 8217974d3..87f46f7f1 100644 --- a/shared/src/i18n/ar/storage.ts +++ b/shared/src/i18n/ar/storage.ts @@ -71,5 +71,20 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'يوجد ملف بذرة storage-config.json لكن يتم تجاهله — صفوف الإعدادات موجودة بالفعل. أدر التخزين من هنا.', 'storage.health.failureLine': 'فشلت عملية {op} لـ {key} على {backend}: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'أهداف المرآة', + 'storage.mirror.targetsHelp': 'كل عملية كتابة على هذه الواجهة الخلفية تُنسخ أيضًا إلى كل هدف محدد.', + 'storage.mirror.latencyNote': + 'تُكتب النسخ المتماثلة واحدة تلو الأخرى أثناء كل عملية رفع — أي هدف بطيء أو يتعذّر الوصول إليه يُبطئ كل عملية رفع لكل فئة على هذه الواجهة الخلفية.', + 'storage.mirror.mirroredTo': 'معكوسة إلى: {targets}', + 'storage.mirror.replicaOf': 'نسخة من: {primaries}', + 'storage.mirror.cacheWarning': + 'غير مستحسن: تحتوي هذه الفئة على محتوى قابل لإعادة الجلب — نسخه عادةً ما يكون مضيعة للموارد.', + 'storage.mirror.degenerate.duplicate-mirror': + 'مرآة ثانية تُغلّف {primary} — تُدير اللوحة الأولى فقط؛ أزل هذه لإدارة المرآة من {primary}.', + 'storage.mirror.degenerate.env-primary': 'تُغلّف واجهة خلفية معرّفة بواسطة متغيّر بيئة — غير قابلة للتعديل هنا.', + 'storage.mirror.degenerate.missing-primary': 'تشير إلى واجهة خلفية لم تعد موجودة.', + 'storage.remove.usedAsReplicaBy': 'مستخدَمة كنسخة متماثلة بواسطة: {primaries}', }; export default storage; diff --git a/shared/src/i18n/br/storage.ts b/shared/src/i18n/br/storage.ts index e1a55a786..3d2498b8c 100644 --- a/shared/src/i18n/br/storage.ts +++ b/shared/src/i18n/br/storage.ts @@ -71,5 +71,20 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Um arquivo semente storage-config.json está presente, mas é ignorado — já existem linhas de configuração. Gerencie o armazenamento aqui.', 'storage.health.failureLine': '{op} de {key} em {backend} falhou: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Destinos do espelho', + 'storage.mirror.targetsHelp': 'Cada gravação neste backend também é copiada para cada destino selecionado.', + 'storage.mirror.latencyNote': + 'As réplicas são gravadas uma após a outra durante cada envio — um destino lento ou inacessível torna mais lento todo envio de toda categoria neste backend.', + 'storage.mirror.mirroredTo': 'Espelhado para: {targets}', + 'storage.mirror.replicaOf': 'Réplica de: {primaries}', + 'storage.mirror.cacheWarning': + 'Não recomendado: esta categoria contém conteúdo que pode ser buscado novamente — replicá-lo geralmente é um desperdício.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Um segundo espelho envolve {primary} — o painel gerencia apenas o primeiro; remova este para gerenciar o espelhamento a partir de {primary}.', + 'storage.mirror.degenerate.env-primary': 'Envolve um backend definido por variável de ambiente — não editável aqui.', + 'storage.mirror.degenerate.missing-primary': 'Referencia um backend que não existe mais.', + 'storage.remove.usedAsReplicaBy': 'Usado como réplica por: {primaries}', }; export default storage; diff --git a/shared/src/i18n/ca/storage.ts b/shared/src/i18n/ca/storage.ts index 697eb3593..052e7294d 100644 --- a/shared/src/i18n/ca/storage.ts +++ b/shared/src/i18n/ca/storage.ts @@ -72,5 +72,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': "Hi ha un fitxer llavor storage-config.json present però s'ignora — ja existeixen files de configuració. Gestiona l'emmagatzematge aquí.", 'storage.health.failureLine': '{op} de {key} a {backend} ha fallat: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Objectius del mirall', + 'storage.mirror.targetsHelp': 'Cada escriptura en aquest backend també es copia a cada objectiu seleccionat.', + 'storage.mirror.latencyNote': + "Les rèpliques s'escriuen una després de l'altra durant cada pujada — un objectiu lent o inabastable alenteix cada pujada de cada categoria en aquest backend.", + 'storage.mirror.mirroredTo': 'Reflectit a: {targets}', + 'storage.mirror.replicaOf': 'Rèplica de: {primaries}', + 'storage.mirror.cacheWarning': + 'No recomanat: aquesta categoria conté contingut que es pot tornar a obtenir — replicar-lo sol ser un malbaratament.', + 'storage.mirror.degenerate.duplicate-mirror': + "Un segon mirall embolcalla {primary} — el panell només gestiona el primer; elimina'l per gestionar el mirall des de {primary}.", + 'storage.mirror.degenerate.env-primary': + "Embolcalla un backend definit per una variable d'entorn — no editable aquí.", + 'storage.mirror.degenerate.missing-primary': 'Fa referència a un backend que ja no existeix.', + 'storage.remove.usedAsReplicaBy': 'Utilitzat com a rèplica per: {primaries}', }; export default storage; diff --git a/shared/src/i18n/cs/storage.ts b/shared/src/i18n/cs/storage.ts index 6dd85d653..f0c7ac893 100644 --- a/shared/src/i18n/cs/storage.ts +++ b/shared/src/i18n/cs/storage.ts @@ -71,5 +71,20 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Je přítomen seed soubor storage-config.json, ale je ignorován — konfigurační řádky již existují. Spravujte úložiště zde.', 'storage.health.failureLine': '{op} u {key} na {backend} selhalo: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Cíle zrcadla', + 'storage.mirror.targetsHelp': 'Každý zápis do tohoto backendu se také zkopíruje do každého vybraného cíle.', + 'storage.mirror.latencyNote': + 'Repliky se zapisují jedna po druhé během každého nahrávání — pomalý nebo nedostupný cíl zpomalí každé nahrávání každé kategorie na tomto backendu.', + 'storage.mirror.mirroredTo': 'Zrcadleno do: {targets}', + 'storage.mirror.replicaOf': 'Replika: {primaries}', + 'storage.mirror.cacheWarning': + 'Nedoporučeno: tato kategorie obsahuje znovu získatelný obsah — jeho replikace je obvykle zbytečná.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Druhé zrcadlo obaluje {primary} — panel spravuje pouze první; odeberte toto pro správu zrcadlení z {primary}.', + 'storage.mirror.degenerate.env-primary': 'Obaluje backend definovaný proměnnou prostředí — zde needitovatelné.', + 'storage.mirror.degenerate.missing-primary': 'Odkazuje na backend, který již neexistuje.', + 'storage.remove.usedAsReplicaBy': 'Používáno jako replika: {primaries}', }; export default storage; diff --git a/shared/src/i18n/de/storage.ts b/shared/src/i18n/de/storage.ts index 1807c8694..490e66294 100644 --- a/shared/src/i18n/de/storage.ts +++ b/shared/src/i18n/de/storage.ts @@ -73,5 +73,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Eine storage-config.json-Seed-Datei ist vorhanden, wird aber ignoriert — Konfigurationszeilen existieren bereits. Verwalte den Speicher hier.', 'storage.health.failureLine': '{op} von {key} auf {backend} fehlgeschlagen: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Spiegelziele', + 'storage.mirror.targetsHelp': 'Jeder Schreibvorgang auf diesem Backend wird auch auf jedes ausgewählte Ziel kopiert.', + 'storage.mirror.latencyNote': + 'Repliken werden bei jedem Upload nacheinander geschrieben — ein langsames oder nicht erreichbares Ziel verlangsamt jeden Upload jeder Kategorie auf diesem Backend.', + 'storage.mirror.mirroredTo': 'Gespiegelt auf: {targets}', + 'storage.mirror.replicaOf': 'Replik von: {primaries}', + 'storage.mirror.cacheWarning': + 'Nicht empfohlen: Diese Kategorie enthält erneut abrufbare Inhalte — sie zu replizieren ist meist verschwendet.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Ein zweiter Spiegel umschließt {primary} — das Panel verwaltet nur den ersten; entferne diesen, um die Spiegelung ab {primary} zu verwalten.', + 'storage.mirror.degenerate.env-primary': + 'Umschließt ein durch Umgebungsvariable definiertes Backend — hier nicht bearbeitbar.', + 'storage.mirror.degenerate.missing-primary': 'Verweist auf ein Backend, das nicht mehr existiert.', + 'storage.remove.usedAsReplicaBy': 'Als Replik verwendet von: {primaries}', }; export default storage; diff --git a/shared/src/i18n/en/storage.ts b/shared/src/i18n/en/storage.ts index 280aa9e41..8f46ce139 100644 --- a/shared/src/i18n/en/storage.ts +++ b/shared/src/i18n/en/storage.ts @@ -88,5 +88,20 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'A storage-config.json seed file is present but ignored — configuration rows already exist. Manage storage here.', 'storage.health.failureLine': '{op} of {key} on {backend} failed: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Mirror targets', + 'storage.mirror.targetsHelp': 'Every write to this backend is also copied to each selected target.', + 'storage.mirror.latencyNote': + 'Replicas are written one after another during each upload — a slow or unreachable target slows every upload of every category on this backend.', + 'storage.mirror.mirroredTo': 'Mirrored to: {targets}', + 'storage.mirror.replicaOf': 'Replica of: {primaries}', + 'storage.mirror.cacheWarning': + 'Not recommended: this category holds re-fetchable content — replicating it is usually wasteful.', + 'storage.mirror.degenerate.duplicate-mirror': + 'A second mirror wraps {primary} — the panel manages only the first; remove this one to manage mirroring from {primary}.', + 'storage.mirror.degenerate.env-primary': 'Wraps an environment-defined backend — not editable here.', + 'storage.mirror.degenerate.missing-primary': 'References a backend that no longer exists.', + 'storage.remove.usedAsReplicaBy': 'Used as replica by: {primaries}', }; export default storage; diff --git a/shared/src/i18n/es/storage.ts b/shared/src/i18n/es/storage.ts index 0e9fc3b1d..508438d5e 100644 --- a/shared/src/i18n/es/storage.ts +++ b/shared/src/i18n/es/storage.ts @@ -73,5 +73,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Hay un archivo semilla storage-config.json presente pero ignorado — ya existen filas de configuración. Gestiona el almacenamiento aquí.', 'storage.health.failureLine': '{op} de {key} en {backend} falló: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Destinos del espejo', + 'storage.mirror.targetsHelp': 'Cada escritura en este backend también se copia a cada destino seleccionado.', + 'storage.mirror.latencyNote': + 'Las réplicas se escriben una tras otra durante cada subida — un destino lento o inaccesible ralentiza cada subida de cada categoría en este backend.', + 'storage.mirror.mirroredTo': 'Reflejado en: {targets}', + 'storage.mirror.replicaOf': 'Réplica de: {primaries}', + 'storage.mirror.cacheWarning': + 'No recomendado: esta categoría contiene contenido que se puede volver a obtener — replicarlo suele ser un desperdicio.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Un segundo espejo envuelve {primary} — el panel solo gestiona el primero; elimina este para gestionar el espejado desde {primary}.', + 'storage.mirror.degenerate.env-primary': + 'Envuelve un backend definido por una variable de entorno — no editable aquí.', + 'storage.mirror.degenerate.missing-primary': 'Hace referencia a un backend que ya no existe.', + 'storage.remove.usedAsReplicaBy': 'Usado como réplica por: {primaries}', }; export default storage; diff --git a/shared/src/i18n/fr/storage.ts b/shared/src/i18n/fr/storage.ts index c89330a8f..8f3f2e774 100644 --- a/shared/src/i18n/fr/storage.ts +++ b/shared/src/i18n/fr/storage.ts @@ -73,5 +73,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Un fichier de départ storage-config.json est présent mais ignoré — des lignes de configuration existent déjà. Gère le stockage ici.', 'storage.health.failureLine': '{op} de {key} sur {backend} a échoué : {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Cibles du miroir', + 'storage.mirror.targetsHelp': 'Chaque écriture sur ce backend est également copiée vers chaque cible sélectionnée.', + 'storage.mirror.latencyNote': + "Les répliques sont écrites l'une après l'autre à chaque envoi — une cible lente ou inaccessible ralentit chaque envoi de chaque catégorie sur ce backend.", + 'storage.mirror.mirroredTo': 'Reflété vers : {targets}', + 'storage.mirror.replicaOf': 'Réplique de : {primaries}', + 'storage.mirror.cacheWarning': + 'Non recommandé : cette catégorie contient du contenu récupérable à nouveau — le répliquer est généralement inutile.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Un second miroir enveloppe {primary} — le panneau ne gère que le premier ; supprime celui-ci pour gérer le miroir depuis {primary}.', + 'storage.mirror.degenerate.env-primary': + "Enveloppe un backend défini par une variable d'environnement — non modifiable ici.", + 'storage.mirror.degenerate.missing-primary': "Référence un backend qui n'existe plus.", + 'storage.remove.usedAsReplicaBy': 'Utilisé comme réplique par : {primaries}', }; export default storage; diff --git a/shared/src/i18n/gr/storage.ts b/shared/src/i18n/gr/storage.ts index 31eeefe2e..36992d9d7 100644 --- a/shared/src/i18n/gr/storage.ts +++ b/shared/src/i18n/gr/storage.ts @@ -73,5 +73,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Υπάρχει αρχείο seed storage-config.json αλλά αγνοείται — υπάρχουν ήδη γραμμές ρύθμισης. Διαχειρίσου την αποθήκευση εδώ.', 'storage.health.failureLine': '{op} του {key} στο {backend} απέτυχε: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Στόχοι καθρέφτη', + 'storage.mirror.targetsHelp': 'Κάθε εγγραφή σε αυτό το backend αντιγράφεται επίσης σε κάθε επιλεγμένο στόχο.', + 'storage.mirror.latencyNote': + 'Τα αντίγραφα γράφονται το ένα μετά το άλλο σε κάθε μεταφόρτωση — ένας αργός ή μη προσβάσιμος στόχος επιβραδύνει κάθε μεταφόρτωση κάθε κατηγορίας σε αυτό το backend.', + 'storage.mirror.mirroredTo': 'Αντικατοπτρίζεται σε: {targets}', + 'storage.mirror.replicaOf': 'Αντίγραφο του: {primaries}', + 'storage.mirror.cacheWarning': + 'Δεν συνιστάται: αυτή η κατηγορία περιέχει περιεχόμενο που μπορεί να ανακτηθεί ξανά — η αναπαραγωγή του είναι συνήθως σπατάλη.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Ένας δεύτερος καθρέφτης τυλίγει το {primary} — ο πίνακας διαχειρίζεται μόνο τον πρώτο· αφαίρεσε αυτόν για να διαχειριστείς την αντικατοπτρισμό από το {primary}.', + 'storage.mirror.degenerate.env-primary': + 'Τυλίγει ένα backend που ορίζεται από μεταβλητή περιβάλλοντος — δεν επεξεργάζεται εδώ.', + 'storage.mirror.degenerate.missing-primary': 'Αναφέρεται σε ένα backend που δεν υπάρχει πια.', + 'storage.remove.usedAsReplicaBy': 'Χρησιμοποιείται ως αντίγραφο από: {primaries}', }; export default storage; diff --git a/shared/src/i18n/hu/storage.ts b/shared/src/i18n/hu/storage.ts index a62da0731..3c8492a9a 100644 --- a/shared/src/i18n/hu/storage.ts +++ b/shared/src/i18n/hu/storage.ts @@ -73,5 +73,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Egy storage-config.json seed fájl jelen van, de figyelmen kívül marad — konfigurációs sorok már léteznek. A tárhelyet itt kezelheted.', 'storage.health.failureLine': '{op} sikertelen: {key} ezen: {backend} — {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Tükör célok', + 'storage.mirror.targetsHelp': 'Az ebbe a backendbe történő minden írás minden kiválasztott célra is átmásolódik.', + 'storage.mirror.latencyNote': + 'A replikák egymás után íródnak minden feltöltés során — egy lassú vagy elérhetetlen cél lelassítja e backend minden kategóriájának minden feltöltését.', + 'storage.mirror.mirroredTo': 'Tükrözve ide: {targets}', + 'storage.mirror.replicaOf': 'Replika innen: {primaries}', + 'storage.mirror.cacheWarning': + 'Nem ajánlott: ez a kategória újra lekérhető tartalmat tartalmaz — a replikálása általában felesleges.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Egy második tükör veszi körül a(z) {primary} elemet — a panel csak az elsőt kezeli; távolítsd el ezt, hogy a tükrözést a(z) {primary} elemtől kezelhesd.', + 'storage.mirror.degenerate.env-primary': + 'Egy környezeti változóval definiált backendet vesz körül — itt nem szerkeszthető.', + 'storage.mirror.degenerate.missing-primary': 'Egy már nem létező backendre hivatkozik.', + 'storage.remove.usedAsReplicaBy': 'Replikaként használja: {primaries}', }; export default storage; diff --git a/shared/src/i18n/id/storage.ts b/shared/src/i18n/id/storage.ts index 2c26b11aa..7564f013f 100644 --- a/shared/src/i18n/id/storage.ts +++ b/shared/src/i18n/id/storage.ts @@ -73,5 +73,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'File seed storage-config.json ada tetapi diabaikan — baris konfigurasi sudah ada. Kelola penyimpanan di sini.', 'storage.health.failureLine': '{op} pada {key} di {backend} gagal: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Target cermin', + 'storage.mirror.targetsHelp': 'Setiap penulisan ke backend ini juga disalin ke setiap target yang dipilih.', + 'storage.mirror.latencyNote': + 'Replika ditulis satu per satu selama setiap unggahan — target yang lambat atau tidak terjangkau memperlambat setiap unggahan setiap kategori pada backend ini.', + 'storage.mirror.mirroredTo': 'Dicerminkan ke: {targets}', + 'storage.mirror.replicaOf': 'Replika dari: {primaries}', + 'storage.mirror.cacheWarning': + 'Tidak disarankan: kategori ini menyimpan konten yang dapat diambil ulang — mereplikasinya biasanya sia-sia.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Cermin kedua membungkus {primary} — panel hanya mengelola yang pertama; hapus yang ini untuk mengelola pencerminan dari {primary}.', + 'storage.mirror.degenerate.env-primary': + 'Membungkus backend yang ditentukan oleh variabel lingkungan — tidak dapat diedit di sini.', + 'storage.mirror.degenerate.missing-primary': 'Merujuk ke backend yang sudah tidak ada.', + 'storage.remove.usedAsReplicaBy': 'Digunakan sebagai replika oleh: {primaries}', }; export default storage; diff --git a/shared/src/i18n/it/storage.ts b/shared/src/i18n/it/storage.ts index deb1737c8..d0b3168b9 100644 --- a/shared/src/i18n/it/storage.ts +++ b/shared/src/i18n/it/storage.ts @@ -73,5 +73,22 @@ const storage: TranslationStrings = { 'storage.health.seedFile': "È presente un file seed storage-config.json ma viene ignorato — esistono già righe di configurazione. Gestisci l'archiviazione qui.", 'storage.health.failureLine': '{op} di {key} su {backend} non riuscito: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Destinazioni mirror', + 'storage.mirror.targetsHelp': + 'Ogni scrittura su questo backend viene copiata anche su ogni destinazione selezionata.', + 'storage.mirror.latencyNote': + "Le repliche vengono scritte una dopo l'altra durante ogni caricamento — una destinazione lenta o irraggiungibile rallenta ogni caricamento di ogni categoria su questo backend.", + 'storage.mirror.mirroredTo': 'Rispecchiato su: {targets}', + 'storage.mirror.replicaOf': 'Replica di: {primaries}', + 'storage.mirror.cacheWarning': + 'Non consigliato: questa categoria contiene contenuti riottenibili — replicarli è di solito uno spreco.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Un secondo mirror avvolge {primary} — il pannello gestisce solo il primo; rimuovi questo per gestire il mirroring da {primary}.', + 'storage.mirror.degenerate.env-primary': + "Avvolge un backend definito da una variabile d'ambiente — non modificabile qui.", + 'storage.mirror.degenerate.missing-primary': 'Fa riferimento a un backend che non esiste più.', + 'storage.remove.usedAsReplicaBy': 'Usato come replica da: {primaries}', }; export default storage; diff --git a/shared/src/i18n/ja/storage.ts b/shared/src/i18n/ja/storage.ts index dcc2b3fa3..6392683d2 100644 --- a/shared/src/i18n/ja/storage.ts +++ b/shared/src/i18n/ja/storage.ts @@ -71,5 +71,20 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'storage-config.jsonのシードファイルが存在しますが無視されます — 設定行は既に存在します。ここでストレージを管理してください。', 'storage.health.failureLine': '{backend}での{key}の{op}が失敗しました: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'ミラー先', + 'storage.mirror.targetsHelp': 'このバックエンドへの書き込みは、選択した各ターゲットにもコピーされます。', + 'storage.mirror.latencyNote': + 'レプリカは各アップロード中に順番に書き込まれます — 遅いターゲットや到達不能なターゲットがあると、このバックエンド上のすべてのカテゴリのすべてのアップロードが遅くなります。', + 'storage.mirror.mirroredTo': 'ミラー先: {targets}', + 'storage.mirror.replicaOf': 'レプリカ元: {primaries}', + 'storage.mirror.cacheWarning': '非推奨: このカテゴリは再取得可能なコンテンツを保持しています — 複製は通常無駄です。', + 'storage.mirror.degenerate.duplicate-mirror': + '2つ目のミラーが{primary}をラップしています — パネルは最初のものだけを管理します。{primary}からのミラーリングを管理するには、これを削除してください。', + 'storage.mirror.degenerate.env-primary': + '環境変数で定義されたバックエンドをラップしています — ここでは編集できません。', + 'storage.mirror.degenerate.missing-primary': 'もう存在しないバックエンドを参照しています。', + 'storage.remove.usedAsReplicaBy': 'レプリカとして使用中: {primaries}', }; export default storage; diff --git a/shared/src/i18n/ko/storage.ts b/shared/src/i18n/ko/storage.ts index 150b06af1..c0511d935 100644 --- a/shared/src/i18n/ko/storage.ts +++ b/shared/src/i18n/ko/storage.ts @@ -71,5 +71,20 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'storage-config.json 시드 파일이 있지만 무시됩니다 — 구성 행이 이미 존재합니다. 여기에서 스토리지를 관리하세요.', 'storage.health.failureLine': '{backend}에서 {key}의 {op}이(가) 실패했습니다: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': '미러 대상', + 'storage.mirror.targetsHelp': '이 백엔드에 대한 모든 쓰기는 선택된 각 대상에도 복사됩니다.', + 'storage.mirror.latencyNote': + '복제본은 업로드할 때마다 순차적으로 기록됩니다 — 느리거나 접근할 수 없는 대상이 있으면 이 백엔드의 모든 카테고리의 모든 업로드가 느려집니다.', + 'storage.mirror.mirroredTo': '미러링 대상: {targets}', + 'storage.mirror.replicaOf': '복제본 출처: {primaries}', + 'storage.mirror.cacheWarning': + '권장하지 않음: 이 카테고리는 다시 가져올 수 있는 콘텐츠를 포함합니다 — 복제하는 것은 대개 낭비입니다.', + 'storage.mirror.degenerate.duplicate-mirror': + '두 번째 미러가 {primary}을(를) 감싸고 있습니다 — 패널은 첫 번째만 관리합니다. {primary}에서 미러링을 관리하려면 이것을 제거하세요.', + 'storage.mirror.degenerate.env-primary': '환경 변수로 정의된 백엔드를 감싸고 있습니다 — 여기서는 편집할 수 없습니다.', + 'storage.mirror.degenerate.missing-primary': '더 이상 존재하지 않는 백엔드를 참조합니다.', + 'storage.remove.usedAsReplicaBy': '다음의 복제본으로 사용됨: {primaries}', }; export default storage; diff --git a/shared/src/i18n/nl/storage.ts b/shared/src/i18n/nl/storage.ts index 624395852..e5a81453d 100644 --- a/shared/src/i18n/nl/storage.ts +++ b/shared/src/i18n/nl/storage.ts @@ -73,5 +73,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Er is een storage-config.json seedbestand aanwezig maar dit wordt genegeerd — configuratierijen bestaan al. Beheer de opslag hier.', 'storage.health.failureLine': '{op} van {key} op {backend} mislukt: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Mirrordoelen', + 'storage.mirror.targetsHelp': 'Elke schrijfactie naar deze backend wordt ook gekopieerd naar elk geselecteerd doel.', + 'storage.mirror.latencyNote': + "Replica's worden bij elke upload één voor één geschreven — een traag of onbereikbaar doel vertraagt elke upload van elke categorie op deze backend.", + 'storage.mirror.mirroredTo': 'Gespiegeld naar: {targets}', + 'storage.mirror.replicaOf': 'Replica van: {primaries}', + 'storage.mirror.cacheWarning': + 'Niet aanbevolen: deze categorie bevat opnieuw ophaalbare inhoud — repliceren is meestal verspilling.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Een tweede mirror omhult {primary} — het paneel beheert alleen de eerste; verwijder deze om spiegeling vanaf {primary} te beheren.', + 'storage.mirror.degenerate.env-primary': + 'Omhult een backend die door een omgevingsvariabele is gedefinieerd — hier niet bewerkbaar.', + 'storage.mirror.degenerate.missing-primary': 'Verwijst naar een backend die niet meer bestaat.', + 'storage.remove.usedAsReplicaBy': 'Gebruikt als replica door: {primaries}', }; export default storage; diff --git a/shared/src/i18n/pl/storage.ts b/shared/src/i18n/pl/storage.ts index 482247e25..515e5a75b 100644 --- a/shared/src/i18n/pl/storage.ts +++ b/shared/src/i18n/pl/storage.ts @@ -72,5 +72,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Plik startowy storage-config.json jest obecny, ale ignorowany — wiersze konfiguracji już istnieją. Zarządzaj magazynem tutaj.', 'storage.health.failureLine': '{op} dla {key} na {backend} nie powiodło się: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Cele mirrora', + 'storage.mirror.targetsHelp': 'Każdy zapis do tego backendu jest również kopiowany do każdego wybranego celu.', + 'storage.mirror.latencyNote': + 'Repliki są zapisywane jedna po drugiej podczas każdego przesyłania — wolny lub niedostępny cel spowalnia każde przesyłanie każdej kategorii na tym backendzie.', + 'storage.mirror.mirroredTo': 'Lustrzane do: {targets}', + 'storage.mirror.replicaOf': 'Replika: {primaries}', + 'storage.mirror.cacheWarning': + 'Niezalecane: ta kategoria zawiera treści możliwe do ponownego pobrania — ich replikowanie jest zwykle marnotrawstwem.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Drugi mirror otacza {primary} — panel zarządza tylko pierwszym; usuń ten, aby zarządzać mirrorowaniem z {primary}.', + 'storage.mirror.degenerate.env-primary': + 'Otacza backend zdefiniowany przez zmienną środowiskową — nieedytowalny tutaj.', + 'storage.mirror.degenerate.missing-primary': 'Odwołuje się do backendu, który już nie istnieje.', + 'storage.remove.usedAsReplicaBy': 'Używany jako replika przez: {primaries}', }; export default storage; diff --git a/shared/src/i18n/ru/storage.ts b/shared/src/i18n/ru/storage.ts index 8eb037c66..1bb24dab5 100644 --- a/shared/src/i18n/ru/storage.ts +++ b/shared/src/i18n/ru/storage.ts @@ -73,5 +73,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Присутствует файл-заготовка storage-config.json, но он игнорируется — строки конфигурации уже существуют. Управляйте хранилищем здесь.', 'storage.health.failureLine': '{op} для {key} на {backend} не удалось: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Цели зеркала', + 'storage.mirror.targetsHelp': 'Каждая запись в этот бэкенд также копируется в каждую выбранную цель.', + 'storage.mirror.latencyNote': + 'Реплики записываются последовательно, одна за другой, при каждой загрузке — медленная или недоступная цель замедляет каждую загрузку каждой категории на этом бэкенде.', + 'storage.mirror.mirroredTo': 'Зеркалируется в: {targets}', + 'storage.mirror.replicaOf': 'Реплика с: {primaries}', + 'storage.mirror.cacheWarning': + 'Не рекомендуется: эта категория содержит контент, который можно получить заново — его репликация обычно бесполезна.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Второе зеркало оборачивает {primary} — панель управляет только первым; удалите это, чтобы управлять зеркалированием от {primary}.', + 'storage.mirror.degenerate.env-primary': + 'Оборачивает бэкенд, определённый переменной окружения — здесь не редактируется.', + 'storage.mirror.degenerate.missing-primary': 'Ссылается на бэкенд, которого больше не существует.', + 'storage.remove.usedAsReplicaBy': 'Используется как реплика в: {primaries}', }; export default storage; diff --git a/shared/src/i18n/sv/storage.ts b/shared/src/i18n/sv/storage.ts index 9f9a26412..3fc7e464e 100644 --- a/shared/src/i18n/sv/storage.ts +++ b/shared/src/i18n/sv/storage.ts @@ -72,5 +72,20 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'En storage-config.json-startfil finns men ignoreras — konfigurationsrader finns redan. Hantera lagringen här.', 'storage.health.failureLine': '{op} av {key} på {backend} misslyckades: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Spegelmål', + 'storage.mirror.targetsHelp': 'Varje skrivning till denna backend kopieras även till varje valt mål.', + 'storage.mirror.latencyNote': + 'Repliker skrivs en efter en under varje uppladdning — ett långsamt eller onåbart mål saktar ner varje uppladdning av varje kategori på denna backend.', + 'storage.mirror.mirroredTo': 'Speglad till: {targets}', + 'storage.mirror.replicaOf': 'Replik av: {primaries}', + 'storage.mirror.cacheWarning': + 'Rekommenderas inte: denna kategori innehåller innehåll som kan hämtas på nytt — att replikera det är oftast slöseri.', + 'storage.mirror.degenerate.duplicate-mirror': + 'En andra spegel omsluter {primary} — panelen hanterar bara den första; ta bort den här för att hantera spegling från {primary}.', + 'storage.mirror.degenerate.env-primary': 'Omsluter en backend definierad av en miljövariabel — inte redigerbar här.', + 'storage.mirror.degenerate.missing-primary': 'Refererar till en backend som inte längre finns.', + 'storage.remove.usedAsReplicaBy': 'Används som replik av: {primaries}', }; export default storage; diff --git a/shared/src/i18n/tr/storage.ts b/shared/src/i18n/tr/storage.ts index 4236d898c..e3f897380 100644 --- a/shared/src/i18n/tr/storage.ts +++ b/shared/src/i18n/tr/storage.ts @@ -72,5 +72,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Bir storage-config.json tohum dosyası mevcut ama yok sayılıyor — yapılandırma satırları zaten var. Depolamayı buradan yönetin.', 'storage.health.failureLine': '{backend} üzerinde {key} için {op} başarısız oldu: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Ayna hedefleri', + 'storage.mirror.targetsHelp': 'Bu arka uca yapılan her yazma, seçilen her hedefe de kopyalanır.', + 'storage.mirror.latencyNote': + 'Kopyalar her yüklemede sırayla yazılır — yavaş veya erişilemeyen bir hedef, bu arka uçtaki her kategorinin her yüklemesini yavaşlatır.', + 'storage.mirror.mirroredTo': 'Şuraya aynalandı: {targets}', + 'storage.mirror.replicaOf': 'Şunun kopyası: {primaries}', + 'storage.mirror.cacheWarning': + 'Önerilmez: bu kategori yeniden alınabilir içerik barındırıyor — bunu çoğaltmak genellikle israftır.', + 'storage.mirror.degenerate.duplicate-mirror': + 'İkinci bir ayna {primary} öğesini sarmalıyor — panel yalnızca ilkini yönetir; {primary} üzerinden aynalamayı yönetmek için bunu kaldırın.', + 'storage.mirror.degenerate.env-primary': + 'Ortam değişkeniyle tanımlanmış bir arka ucu sarmalıyor — burada düzenlenemez.', + 'storage.mirror.degenerate.missing-primary': 'Artık var olmayan bir arka uca başvuruyor.', + 'storage.remove.usedAsReplicaBy': 'Kopya olarak kullanan: {primaries}', }; export default storage; diff --git a/shared/src/i18n/uk/storage.ts b/shared/src/i18n/uk/storage.ts index 6d85dc453..3ef42a720 100644 --- a/shared/src/i18n/uk/storage.ts +++ b/shared/src/i18n/uk/storage.ts @@ -73,5 +73,20 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Присутній файл-заготовка storage-config.json, але він ігнорується — рядки конфігурації вже існують. Керуйте сховищем тут.', 'storage.health.failureLine': '{op} для {key} на {backend} не вдалося: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Цілі дзеркала', + 'storage.mirror.targetsHelp': 'Кожен запис у цей бекенд також копіюється в кожну вибрану ціль.', + 'storage.mirror.latencyNote': + 'Репліки записуються одна за одною під час кожного завантаження — повільна або недоступна ціль сповільнює кожне завантаження кожної категорії на цьому бекенді.', + 'storage.mirror.mirroredTo': 'Дзеркалюється в: {targets}', + 'storage.mirror.replicaOf': 'Репліка з: {primaries}', + 'storage.mirror.cacheWarning': + 'Не рекомендується: ця категорія містить контент, який можна отримати повторно — його реплікація зазвичай марна.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Друге дзеркало обгортає {primary} — панель керує лише першим; вилучіть це, щоб керувати дзеркалюванням від {primary}.', + 'storage.mirror.degenerate.env-primary': 'Обгортає бекенд, визначений змінною середовища — тут не редагується.', + 'storage.mirror.degenerate.missing-primary': 'Посилається на бекенд, якого більше не існує.', + 'storage.remove.usedAsReplicaBy': 'Використовується як репліка: {primaries}', }; export default storage; diff --git a/shared/src/i18n/vi/storage.ts b/shared/src/i18n/vi/storage.ts index 8d62a1115..3f83b8b5b 100644 --- a/shared/src/i18n/vi/storage.ts +++ b/shared/src/i18n/vi/storage.ts @@ -72,5 +72,21 @@ const storage: TranslationStrings = { 'storage.health.seedFile': 'Có tệp khởi tạo storage-config.json nhưng bị bỏ qua — các dòng cấu hình đã tồn tại. Quản lý lưu trữ tại đây.', 'storage.health.failureLine': '{op} của {key} trên {backend} thất bại: {error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': 'Đích của bản sao gương', + 'storage.mirror.targetsHelp': 'Mọi thao tác ghi vào backend này cũng được sao chép đến từng đích đã chọn.', + 'storage.mirror.latencyNote': + 'Các bản sao được ghi lần lượt trong mỗi lần tải lên — một đích chậm hoặc không thể truy cập sẽ làm chậm mọi lần tải lên của mọi danh mục trên backend này.', + 'storage.mirror.mirroredTo': 'Được nhân bản đến: {targets}', + 'storage.mirror.replicaOf': 'Bản sao của: {primaries}', + 'storage.mirror.cacheWarning': + 'Không khuyến nghị: danh mục này chứa nội dung có thể lấy lại được — sao chép nó thường là lãng phí.', + 'storage.mirror.degenerate.duplicate-mirror': + 'Một bản sao gương thứ hai bao quanh {primary} — bảng điều khiển chỉ quản lý bản đầu tiên; hãy xóa mục này để quản lý việc nhân bản từ {primary}.', + 'storage.mirror.degenerate.env-primary': + 'Bao quanh một backend được xác định bởi biến môi trường — không thể chỉnh sửa tại đây.', + 'storage.mirror.degenerate.missing-primary': 'Tham chiếu đến một backend không còn tồn tại.', + 'storage.remove.usedAsReplicaBy': 'Được dùng làm bản sao bởi: {primaries}', }; export default storage; diff --git a/shared/src/i18n/zh-TW/storage.ts b/shared/src/i18n/zh-TW/storage.ts index a12de2c2f..01bbc856e 100644 --- a/shared/src/i18n/zh-TW/storage.ts +++ b/shared/src/i18n/zh-TW/storage.ts @@ -68,5 +68,18 @@ const storage: TranslationStrings = { 'storage.health.allClear': '未記錄任何複本失敗。', 'storage.health.seedFile': '存在 storage-config.json 種子檔案但已被忽略 — 設定資料列已存在。請在此管理儲存。', 'storage.health.failureLine': '{backend} 上 {key} 的 {op} 失敗:{error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': '鏡像目標', + 'storage.mirror.targetsHelp': '對此後端的每次寫入也會複製到每個選定的目標。', + 'storage.mirror.latencyNote': '每次上傳時,複本會依序寫入 — 緩慢或無法連線的目標會拖慢此後端上每個分類的每次上傳。', + 'storage.mirror.mirroredTo': '已鏡像至:{targets}', + 'storage.mirror.replicaOf': '複本來源:{primaries}', + 'storage.mirror.cacheWarning': '不建議:此分類儲存的是可重新取得的內容 — 複製它通常是浪費的。', + 'storage.mirror.degenerate.duplicate-mirror': + '第二個鏡像包覆了 {primary} — 面板僅管理第一個;移除此項以從 {primary} 管理鏡像。', + 'storage.mirror.degenerate.env-primary': '包覆了一個由環境變數定義的後端 — 此處不可編輯。', + 'storage.mirror.degenerate.missing-primary': '參照了一個已不存在的後端。', + 'storage.remove.usedAsReplicaBy': '被用作複本,使用者:{primaries}', }; export default storage; diff --git a/shared/src/i18n/zh/storage.ts b/shared/src/i18n/zh/storage.ts index 311905a26..2ee7ad8b7 100644 --- a/shared/src/i18n/zh/storage.ts +++ b/shared/src/i18n/zh/storage.ts @@ -68,5 +68,18 @@ const storage: TranslationStrings = { 'storage.health.allClear': '未记录任何副本故障。', 'storage.health.seedFile': '存在 storage-config.json 种子文件但已被忽略 — 配置行已存在。请在此管理存储。', 'storage.health.failureLine': '{backend} 上 {key} 的 {op} 失败:{error}', + + // Replicas-on-primary mirror UX (2026-08-20 spec) + 'storage.mirror.targets': '镜像目标', + 'storage.mirror.targetsHelp': '对该后端的每次写入也会复制到每个选定的目标。', + 'storage.mirror.latencyNote': '每次上传时,副本会依次写入 — 缓慢或无法访问的目标会拖慢该后端上每个分类的每次上传。', + 'storage.mirror.mirroredTo': '已镜像至:{targets}', + 'storage.mirror.replicaOf': '副本来源:{primaries}', + 'storage.mirror.cacheWarning': '不建议:此分类保存的是可重新获取的内容 — 复制它通常是浪费的。', + 'storage.mirror.degenerate.duplicate-mirror': + '第二个镜像包裹了 {primary} — 面板仅管理第一个;移除此项以从 {primary} 管理镜像。', + 'storage.mirror.degenerate.env-primary': '包裹了一个由环境变量定义的后端 — 此处不可编辑。', + 'storage.mirror.degenerate.missing-primary': '引用了一个已不存在的后端。', + 'storage.remove.usedAsReplicaBy': '被用作副本,使用者:{primaries}', }; export default storage;