diff --git a/package.json b/package.json index 79f0a01..805549b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/files-webui", - "version": "0.1.21", + "version": "0.1.22", "private": true, "type": "module", "main": "webui/src/index.ts", diff --git a/pyproject.toml b/pyproject.toml index 6243a4a..ce5b77d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-files" -version = "0.1.21" +version = "0.1.22" description = "GovOPlaN files module with backend and WebUI integration." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_files/backend/german_structured_documentation.py b/src/govoplan_files/backend/german_structured_documentation.py new file mode 100644 index 0000000..68fc57c --- /dev/null +++ b/src/govoplan_files/backend/german_structured_documentation.py @@ -0,0 +1,458 @@ +"""German translations for public structured documentation metadata.""" + +from __future__ import annotations + +from typing import Any + + +GERMAN_STRUCTURED_TRANSLATIONS: dict[str, dict[str, Any]] = {'files.assurance.process-and-release-readiness': {'outcome': 'Der Prozess oder die ' + 'Veröffentlichung hat eine explizite ' + 'Genehmigungsaufzeichnung, die an ' + 'abgestimmte Versionen, ' + 'repräsentative Nachweise, bekannte ' + 'Einschränkungen und eigene ' + 'Restrisiken gebunden ist.', + 'prerequisites': ['Ein benannter ' + 'Prozessbesitzer hat die ' + 'beabsichtigten Benutzer, ' + 'Datenklassifizierung, ' + 'Aufbewahrungserwartungen und ' + 'Integrationen definiert.', + 'Ein Kandidaten-Release wird ' + 'in einer sauberen Datenbank ' + 'und einer Upgrade-Kopie mit ' + 'ausgerichteten Python-, ' + 'Root-Paket-, WebUI-Paket- ' + 'und Modulmanifestversionen ' + 'installiert.', + 'Repräsentative zugelassene ' + 'und verweigerte Konten, ' + 'begrenzte Testdateien und ' + 'ein koordiniertes ' + 'Datenbank-/Blob-/Key-Wiederherstellungsset ' + 'sind verfügbar.'], + 'steps': ['Vergleichen Sie die ' + 'Prozessanforderungen mit der ' + 'implementierten / geplanten Grenze ' + 'des Handbuchs und notieren Sie jede ' + 'nicht unterstützte Anforderung oder ' + 'Kompensationskontrolle.', + 'Bestätigen Sie die ' + 'Versionsausrichtung, wenden Sie ' + 'Migrationen auf bereinigte und ' + 'aktualisierte Datenbanken an und ' + 'führen Sie das Repository sowie ' + 'Meta-Repository-Sicherheits- und ' + 'Statikanalyse-Gates aus.', + 'Übung erlaubt und verweigert ' + 'persönlichen, Gruppen und teilen Sie ' + 'den Zugriff mit repräsentativen ' + 'Konten.', + 'Übung begrenzte Archivvorschau und ' + 'Bestätigung, jede erforderliche ' + 'Konfliktstrategie, Organisation, ' + 'Download und weiche Löschung.', + 'Wenn Konnektoren konfiguriert sind, ' + 'überprüfen Sie die ' + 'Richtlinienerklärung und einen ' + 'angehängten HTTP-Provider; ' + 'überprüfen Sie die ' + 'Installateur-eigene Garage, wenn Sie ' + 'ausgewählt sind, und üben Sie dann ' + 'konfigurierte S3-Retries/Aliases und ' + 'SMB-Reconnect/Referral-Ziele unter ' + 'der Bereitstellungsrichtlinie für ' + 'das private Netzwerk aus, um zu ' + 'bestätigen, dass eine inkompatible ' + 'SDK-Transportnaht nicht geschlossen ' + 'ist.', + 'Stellen Sie ein koordiniertes ' + 'Datenbank-/Blob-/Key-Backup wieder ' + 'her und vergleichen Sie ' + 'repräsentative heruntergeladene ' + 'Bytes mit den aufgezeichneten ' + 'SHA-256-Prüfsummen.', + 'Notieren Sie die getesteten ' + 'Versionen, Ergebnisse, bekannte ' + 'Einschränkungen, Evidenzorte, ' + 'Restrisiken, Eigentümer und ' + 'Genehmigungsentscheidung.'], + 'verification': 'Ein Überprüfer kann die ' + 'aufgezeichneten ' + 'Berechtigungs-/Verweigerungs-, ' + 'Integritäts-, Konnektor- und ' + 'Wiederherstellungsüberprüfungen ' + 'reproduzieren und jede nicht ' + 'erfüllte Anforderung auf eine ' + 'dokumentierte Einschränkung ' + 'oder akzeptierte ' + 'Kompensationskontrolle ' + 'zurückführen.'}, + 'files.forms-runtime.managed-evidence': {'limitations': ['Das erste Signaturprofil ist eine ' + 'authentifizierte Bestätigung; ' + 'fortgeschrittene und qualifizierte ' + 'elektronische Signaturen erfordern ' + 'einen separaten Anbieter.'], + 'outcome': 'Der Entwurf verweist auf eine ' + 'unveränderliche verwaltete Dateiversion mit ' + 'genauen Prüfsummennachweisen.', + 'prerequisites': ['Formulare Laufzeit und Dateien sind ' + 'aktiviert, und das Aufnahmeprofil hat ' + 'eine aktive Benutzerdepotbank für den ' + 'gleichen Mandant.'], + 'steps': ['Fordern Sie eine Beweisbewilligung für ' + 'Dateien von der editierbaren Formularinstanz ' + 'an, laden Sie sie über die zurückgegebene ' + 'einmalige Trägerroute hoch und fügen Sie dann ' + 'die zurückgegebene Beweisreferenz zum Entwurf ' + 'hinzu.'], + 'verification': 'Reichen Sie das Formular ein und ' + 'vergewissern Sie sich, dass geänderte, ' + 'gelöschte, unter Quarantäne gestellte, ' + 'mieterübergreifende und ' + 'gebührenübergreifende Referenzen ' + 'abgelehnt werden.'}, + 'files.governed-connectors-and-provenance': {'limitations': ['Die manuelle ' + 'Ordner-Synchronisierung plant keine ' + 'zukünftigen Runs oder mutiert, ' + 'löscht, umbenennt, verschiebt oder ' + 'ändert ACLs für entfernte Inhalte.', + 'Ein erfolgreicher Teildurchlauf ist ' + 'keine vollständige Abdeckung, wenn ' + 'die Antwort verkürzt wird oder ' + 'Überprüfungsergebnisse enthält.'], + 'outcome': 'Zulässige Konnektordateien werden zu ' + 'verwalteten Assets oder Versionen, ' + 'während jede Ausnahme explizit und ' + 'überprüfbar bleibt.', + 'prerequisites': ['Ein sichtbarer aktiver ' + 'Verbindungsraum verwendet ' + 'manuelle Synchronisierung und ' + 'Links zu einem zugänglichen ' + 'verwalteten Benutzer- oder ' + 'Gruppenraum.', + 'Der Betreiber hat ' + 'file:file:upload und die ' + 'effektive Konnektorrichtlinie ' + 'erlaubt die angeforderten Root- ' + 'und Source-Pfade.'], + 'steps': ['Öffnen Sie den Ordner des verknüpften ' + 'Verbinders, wählen Sie den Ordner Sync ' + 'und überprüfen Sie das verwaltete Ziel.', + 'Halten Sie den sicheren Sprung ' + 'standardmäßig oder wählen Sie explizit ' + 'umbenennen, ablehnen oder überschreiben ' + 'für nicht verwandte Zielkollisionen.', + 'Legen Sie die Auswahl der begrenzten ' + 'Dateianzahl und des Unterordners fest, ' + 'führen Sie die Synchronisierung aus und ' + 'überprüfen Sie jedes eingegebene ' + 'Elementergebnis und jede ' + 'Abkürzungswarnung.', + 'Setzen Sie einen verkürzten Lauf aus ' + 'einem schmaleren entfernten Ordner fort; ' + 'konfigurieren Sie die Planung separat, ' + 'wenn eine Hintergrundoperation ' + 'erforderlich ist.'], + 'verification': 'Vergleichen Sie die ' + 'Antwortzusammenfassung und die ' + 'Ergebnisse pro Element mit dem ' + 'Auditereignis ' + 'files.connector.folder synced und ' + 'prüfen Sie dann die Herkunft der ' + 'erstellten, aktualisierten und ' + 'unveränderten repräsentativen ' + 'Assets.'}, + 'files.privacy.data-subject-requests': {'limitations': ['E-Mail-, Konto- oder ' + 'Identitätsselektoren allein können nicht ' + 'von Dateien aufgelöst werden, da Dateien ' + 'nicht im Besitz des ' + 'Access-Verzeichnisses sind; geben Sie ' + 'die bestätigte Mitgliedschaftsreferenz ' + 'an.', + 'Der Anbieter bettet keine rohen ' + 'Dateiinhalte in den JSON-Export ein und ' + 'führt niemals eine physische ' + 'Blob-Löschung als DSAR-Nebenwirkung ' + 'durch.'], + 'outcome': 'Dateieigene Betreffreferenzen werden ' + 'überprüft oder entfernt, ohne den ' + 'zurückgehaltenen Inhalt oder Nachweise ' + 'stillschweigend zu zerstören.', + 'prerequisites': ['Die Anfrage wurde autorisiert und ' + 'enthält eine direkte ' + 'Mandantenmitgliedschaft oder eine ' + 'Betreffreferenz Dateien.', + 'Der Datenschutzprüfer kann den ' + 'Zugriffsexport von der Löschbehörde ' + 'und der Löschbehörde für Dateien ' + 'unterscheiden.'], + 'steps': ['Führen Sie die Anbietersuche aus und ' + 'bestätigen Sie die vollständige Abdeckung der ' + 'Dateiberichte anstelle eines ausgefallenen ' + 'oder abwesenden Anbieters.', + 'Überprüfen Sie Datei-/Versionsmetadaten, ' + 'Gründe für die Aufbewahrung von Nachweisen und ' + 'den Quellpfad für die manuelle ' + 'Inhaltsüberprüfung.', + 'Generieren Sie den Löschplan und führen Sie ' + 'nur die genehmigten reversiblen ' + 'Aktienrücknahme- oder Subjektreferenzaktionen ' + 'aus.', + 'Für die genehmigte Byte-Löschung lösen Sie ' + 'jeden Lifecycle-Blocker auf und verwenden Sie ' + 'Files Purge Preview, Execution und Blob ' + 'Garbage Collection separat.'], + 'verification': 'Bestätigen Sie, dass jeder ' + 'Dateidatensatz eine Aufbewahrungs-, ' + 'Überprüfungs-, Widerrufs- oder ' + 'Loslösungsdisposition hat und prüfen Sie ' + 'jede separate Bereinigung durch seine ' + 'Audit- und Wiederherstellungsnachweise.'}, + 'files.records.exact-version-source': {'outcome': 'Records behält eine exakt geregelte Referenz, ' + 'während Files Byte Authority bleibt.', + 'prerequisites': ['Die genaue Dateiversion existiert und ' + 'übergibt das aktuelle Files Integrity ' + 'Gate.', + 'Sie haben derzeit die Datei Lesezugriff ' + 'und Records Einreichung Behörde.'], + 'steps': ['Wählen Sie die genaue verwaltete Dateiversion ' + 'aus, die zum institutionellen Datensatz gehört.', + 'Wählen Sie den Zieldatensatz und geben Sie den ' + 'Zugangszweck und den Anmeldegrund an.', + 'Bestätigen Sie die Einreichung; Dateien ' + 'überprüft den aktuellen Zugriff erneut und löst ' + 'die genaue Version auf.', + 'Öffnen Sie die Datensatzchronologie und ' + 'überprüfen Sie die Versionsidentität und den ' + 'SHA-256 Digest.']}, + 'files.reference.integrity-recovery-and-fail-closed-transports': {'verification': 'Führen Sie ' + 'nach der ' + 'Wiederherstellung ' + 'einen ' + 'Checksummen-fähigen ' + 'Integritätsscan ' + 'aus, lösen Sie ' + 'jedes fehlende ' + '/ korrupte ' + 'Finden, ' + 'genehmigen ' + 'oder behalten ' + 'Sie jedes ' + 'gemeldete ' + 'Waisenkind, ' + 'inspizieren ' + 'Sie die ' + 'Wiederherstellungsvorgänge ' + 'von Dateien in ' + 'Ops, ' + 'überprüfen Sie ' + 'den ' + 'autorisierten ' + 'und ' + 'verweigerten ' + 'Zugriff und ' + 'testen Sie ' + 'konfigurierte ' + 'HTTP-, S3- und ' + 'SMB-Verbindungen ' + 'mit ihrer ' + 'aufgezeichneten ' + 'Zieltopologie.'}, + 'files.reference.shared-storage-profile': {'limitations': ['Installer-verwaltete Garage ist ' + 'Single-Node, es sei denn, ein ' + 'externer Multi-Node-Cluster wird ' + 'separat betrieben.', + 'Die Anwendung erstellt oder ' + 'verifiziert keine ' + 'PostgreSQL/Objekt/Schlüssel-Backups.'], + 'verification': 'Führen Sie die ' + 'Dateispeicher-Round-Trip-Prüfung und ' + 'eine koordinierte ' + 'Wiederherstellungsübung gegen die ' + 'genaue Bereitstellungstopologie aus.'}, + 'files.tabular-content': {'consequence_classes': {'fail_closed': 'Nicht verfügbare, ' + 'überdimensionierte, unter ' + 'Quarantäne gestellte oder nicht ' + 'autorisierte Inhalte werden ' + 'nicht analysiert oder in der ' + 'Vorschau angezeigt.', + 'pin_exact_version': 'Eine Quelle behält ihre ' + 'überprüfte ' + 'unveränderliche ' + 'Dateiversion, bis sie ' + 'explizit aktualisiert ' + 'wird.', + 'preserve_file_controls': 'Zugriff auf Dateien, ' + 'Integrität, ' + 'Verschlüsselung, ' + 'Aufbewahrung und ' + 'rechtliche Kontrolle ' + 'bleiben ' + 'autoritativ.'}}, + 'files.workflow.delete-managed-files': {'limitations': ['Löschung ist eine weiche Löschung, keine ' + 'harte Säuberung.', + 'Die Wiederherstellung schlägt fehl, wenn ' + 'eine aktive Datei, ein Ordner oder ein ' + 'Verbindungsraum bereits den Pfad oder ' + 'das Label verwendet.'], + 'outcome': 'Der ausgewählte Inhalt wird aus aktiven ' + 'Dateiansichten unter dem aktuellen ' + 'Soft-Löschmodell ausgeblendet.', + 'prerequisites': ['Sie können die ausgewählten ' + 'verwalteten Inhalte anzeigen und ' + 'löschen und haben Schreib- oder ' + 'Eigentümerzugriff auf jedes betroffene ' + 'Asset oder jeden Ordner.', + 'Sie haben den gesamten Ordnerbaum beim ' + 'rekursiven Löschen überprüft.'], + 'steps': ['Öffnen Sie Dateien und wählen Sie die Dateien ' + 'oder den Ordner zum Löschen aus.', + 'Überprüfen Sie die Auswahl und, für einen ' + 'Ordner, alle Inhalte darunter.', + 'Bestätigen Sie die Löschaktion.', + 'Erfrischen oder öffnen Sie den Raum und ' + 'überprüfen Sie, ob die ausgewählten Pfade ' + 'nicht mehr aktiv sind.'], + 'verification': 'Bestätigen Sie, dass die gelöschten ' + 'Pfade nicht mehr im aktiven Raum ' + 'erscheinen; behandeln Sie die Aktion ' + 'nicht als physisches Löschen.'}, + 'files.workflow.find-and-download-files': {'outcome': 'Die autorisierten aktuellen Dateibytes ' + 'oder das generierte Archiv werden auf das ' + 'lokale Gerät heruntergeladen.', + 'prerequisites': ['Sie können verwaltete Dateien im ' + 'entsprechenden Bereich anzeigen und ' + 'herunterladen.'], + 'steps': ['Öffnen Sie Dateien und wählen Sie den ' + 'entsprechenden Personen- oder Gruppenraum ' + 'aus.', + 'Navigieren Sie in Ordnern, sortieren Sie ' + 'die Liste oder verwenden Sie ein Pfad- / ' + 'Namensmuster, um den beabsichtigten Inhalt ' + 'zu finden.', + 'Überprüfen Sie den angezeigten Besitzer, ' + 'Pfad, Größe, Prüfsumme und Versionsdetails.', + 'Laden Sie eine aktuelle Dateiversion ' + 'herunter oder wählen Sie mehrere Dateien ' + 'aus und wählen Sie ZIP herunterladen.'], + 'verification': 'Bestätigen Sie die heruntergeladenen ' + 'Namen und vergleichen Sie, wo ' + 'Integrität wichtig ist, die ' + 'Dateibytes mit der angezeigten ' + 'Prüfsumme.'}, + 'files.workflow.organize-managed-files': {'outcome': 'Der ausgewählte Inhalt hat den ' + 'beabsichtigten verwalteten Eigentümer und ' + 'logischen Pfad.', + 'prerequisites': ['Sie können verwaltete Dateien ' + 'anzeigen und organisieren.', + 'Sie haben Schreib- oder ' + 'Eigentümerzugriff auf alle von der ' + 'Operation verwendeten Quellelemente ' + 'und Zielbereiche; die globale ' + 'Organisationsberechtigung allein ' + 'gewährt keinen Ressourcenzugriff.'], + 'steps': ['Öffnen Sie Dateien und wählen Sie den ' + 'persönlichen oder Gruppenraum zum ' + 'Organisieren aus.', + 'Erstellen Sie die erforderlichen Zielordner ' + 'oder wählen Sie die Dateien und Ordner aus, ' + 'um sie umzubenennen, zu verschieben oder zu ' + 'kopieren.', + 'Wählen Sie das Ziel aus und lösen Sie jeden ' + 'Zielkonflikt explizit.', + 'Wenden Sie die Operation an und öffnen Sie ' + 'den Zielordner erneut.'], + 'verification': 'Bestätigen Sie jeden resultierenden ' + 'Pfad und Besitzer; für eine Bewegung ' + 'bestätigen Sie auch, dass der alte ' + 'Pfad verschwunden ist, und für eine ' + 'Kopie bestätigen Sie, dass die Quelle ' + 'verbleibt.'}, + 'files.workflow.restore-retain-and-purge': {'limitations': ['Automatische zeitbasierte ' + 'Bereinigungsplanung ist nicht ' + 'enthalten; ein autorisierter ' + 'handelnde Person startet Vorschau, ' + 'Ausführung und Blob-Sammlung.', + 'Der Verschlüsselungsumschlag eines ' + 'geschützten Blobs folgt der eigenen ' + 'Aufbewahrungs- und ' + 'Schlüssel-Verwahrungsrichtlinie des ' + 'Verschlüsselungsmoduls.'], + 'outcome': 'Berechtigte Metadaten und nicht ' + 'referenzierte Bytes werden mit separat ' + 'überprüfbaren Richtlinien-, Audit- und ' + 'Wiederherstellungsnachweisen gelöscht.', + 'prerequisites': ['Die handelnde Person hat die ' + 'eindeutige Wiederherstellungs-, ' + 'Aufbewahrungs- oder ' + 'Bereinigungsberechtigung, die für ' + 'die beabsichtigte Aktion ' + 'erforderlich ist.', + 'Ein Bereinigungsziel ist bereits ' + 'sanft gelöscht und alle abhängigen ' + 'Nachweise oder Aktien wurden ' + 'rechtmäßig gelöst.'], + 'steps': ['Festlegen oder Überprüfen von ' + 'Aufbewahrungs- und Haltezustand unter ' + 'Verwendung der angezeigten ' + 'Lifecycle-Revision.', + 'Überprüfen Sie zum Wiederherstellen, ob ' + 'der ursprüngliche Pfad oder das ' + 'ursprüngliche Label frei ist, und stellen ' + 'Sie die gleiche Ressource wieder her.', + 'Erstellen Sie zum Löschen eine begrenzte ' + 'Purge-Vorschau und lösen Sie jeden ' + 'benannten Blocker auf.', + 'Führen Sie die passende Vorschau mit einem ' + 'idempotency-Schlüssel, PURGE-Bestätigung ' + 'und Genehmigungsreferenz aus.', + 'Führen Sie eine begrenzte ' + 'Blob-Garbage-Sammlung aus und prüfen Sie ' + 'alle Wiederherstellungs- oder ' + 'Ergebnis-unbekannten Operationen in Ops.'], + 'verification': 'Überprüfen Sie, ob die ' + 'Asset-/Versionszeilen fehlen, der ' + 'Blob bleibt referenziert, nicht ' + 'referenzierte Bytes fehlen nach GC ' + 'und jede Operation hat eine gültige ' + 'Wiederherstellungsnachweiskette.'}, + 'files.workflow.share-managed-files': {'limitations': ['Kampagnenziel-Zuschüsse werden ' + 'normalerweise durch die ' + 'Kampagnenintegration erstellt und nicht ' + 'manuell im Dateidialog ausgewählt.', + 'Ein Benutzer kann den Zugriff über einen ' + 'anderen aktiven direkten Zuschuss oder ' + 'Besitzpfad behalten, nachdem eine Aktie ' + 'widerrufen wurde.', + 'Ausgewählte benutzererklärungen erfordern ' + 'die richtlinienberechtigung und sind nur ' + 'diagnosen; sie geben sich nicht als ' + 'benutzer aus oder gewähren dateizugriff.'], + 'outcome': 'Direkter Zugriff hat die angeforderte ' + 'Berechtigung und Lebensdauer, während das ' + 'verwaltete Asset seinen Eigentümer behält.', + 'prerequisites': ['Sie haben die Freigabeberechtigung für ' + 'Dateien und besitzen die Datei oder ' + 'verwalten Dateiräume für den aktiven ' + 'Mandanten.', + 'Das beabsichtigte Benutzer-, Gruppen-, ' + 'Mandant- oder Kampagnenziel existiert ' + 'und ist aktiv.'], + 'steps': ['Wählen Sie eine verwaltete Datei aus, wählen ' + 'Sie Shares verwalten und überprüfen Sie die ' + 'effektiven und historischen direkten Zuschüsse.', + 'Wählen Sie den beabsichtigten Benutzer, die ' + 'Gruppe oder den Mandanten aus und wählen Sie ' + 'den Zugriff lesen, schreiben oder verwalten ' + 'sowie einen optionalen Ablauf.', + 'Geben oder aktualisieren Sie die Freigabe, ohne ' + 'den Dateibesitz zu ändern.', + 'Widerrufen Sie einen Zuschuss, wenn er nicht ' + 'mehr benötigt wird; wiederholter Widerruf ist ' + 'ein No-Op.'], + 'verification': 'Testen Sie einen beabsichtigten und einen ' + 'verweigerten Pfad, verfallen oder ' + 'widerrufen Sie die Gewährung und stellen ' + 'Sie sicher, dass nur noch unabhängige ' + 'Zugangspfade verbleiben.'}} diff --git a/src/govoplan_files/backend/manifest.py b/src/govoplan_files/backend/manifest.py index dfea66c..f0b3dcb 100644 --- a/src/govoplan_files/backend/manifest.py +++ b/src/govoplan_files/backend/manifest.py @@ -1,5 +1,8 @@ from __future__ import annotations +from govoplan_core.core.modules import with_documentation_structured_translations +from govoplan_files.backend.german_structured_documentation import GERMAN_STRUCTURED_TRANSLATIONS + from dataclasses import replace from pathlib import Path @@ -455,7 +458,7 @@ def _dsar_provider(context: ModuleContext) -> object: manifest = ModuleManifest( id="files", name="Files", - version="0.1.21", + version="0.1.22", required_capabilities=( CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR, @@ -1879,5 +1882,10 @@ manifest = ModuleManifest( ) +manifest = with_documentation_structured_translations( + manifest, locale="de", translations=GERMAN_STRUCTURED_TRANSLATIONS +) + + def get_manifest() -> ModuleManifest: return manifest diff --git a/webui/package.json b/webui/package.json index f0289f9..6089c6e 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/files-webui", - "version": "0.1.21", + "version": "0.1.22", "private": true, "type": "module", "main": "src/index.ts",