From 79d78fb9be009f0e5921c156f93985ea6f54d40b Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 10:03:17 +0000 Subject: [PATCH 1/7] fix: Vier Punkte aus dem Usability-Test (v2.40.3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aus den acht Anmerkungen des Testers die vier, die keine Entscheidung brauchten. Die übrigen vier sind entschieden und als Arbeitspakete notiert. 1. Pflichtfeld-Hinweis umformuliert. Der bisherige Satz stolperte über sich selbst; der Vorschlag des Testers ist schlicht besser. 2. Beispiele aus den Tooltips fester Auswahllisten entfernt. Ein Beispiel, das nur die Optionen des Dropdowns wiederholt, hilft niemandem. Der Tester fand einen Fall — eine systematische Suche nach select-Feldern mit add_options und "Beispiel:" im Hilfetext ergab acht: Thema, Sprache, Format, Lizenz, Verfügbarkeit, Aktualisierungsfrequenz, Verwaltungsebene, HVD-Kategorie. Erklärende Sätze sind geblieben, gestrichen wurde nur der Beispielteil. 3. "Kardinalität" heißt jetzt durchgängig "Multiplizität" — so nennt es die deutsche Spezifikation DCAT-AP.de. 52 Stellen im Katalog plus die generierte Feld-Referenz. Offenlegung: Ich verlasse mich hier auf die Quellenangabe des Testers. Die gebündelten deutschen Shape-Dateien verwenden keinen der beiden Begriffe, und dcat-ap.de ist über den Egress-Proxy nicht erreichbar. 4. dct:subject war fälschlich als "DCAT-AP-Definition" ausgewiesen. Ein Abgleich aller 43 Katalog-Eigenschaften gegen die gebündelten offiziellen SHACL-Shapes (Turtle-Präfixe dateiweise aufgelöst — Dublin Core heißt dort "dc:", nicht "dct:") zeigt genau zwei Ausreißer: dct:subject gehört nicht zum Profil, und dcatap:hvdCategory stammt aus der HVD-Erweiterung statt aus DCAT-AP 3.0. Beides steht jetzt in der jeweiligen Definition. Die Eigenschaften bleiben erhalten — RDF erlaubt zusätzliche Aussagen, und CESSDA wie ZiviZ sind für die Zielgruppe gewollt. Aus der Gegenprüfung nachgezogen: Die Beschreibung der Verwaltungsebene nannte "Kreis" und "Kommune", die Auswahlliste bietet "Landkreis" und "Gemeinde". Außerdem zehn verwaiste Übersetzungseinträge entfernt, die durch die Textänderungen ohne Fundstelle im Code zurückblieben; bin/check-i18n.py prüft nur auf fehlende, nicht auf überzählige Einträge. 243 Tests grün, PHPCS ohne Befund, Paketprüfung und i18n sauber. https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq --- CHANGELOG.md | 34 ++++++++++ README.md | 2 +- config/dcat-ap-fields.php | 2 +- config/field-catalog.php | 102 ++++++++++++++-------------- config/shacl/README.md | 2 +- docs/FELD-REFERENZ.md | 102 ++++++++++++++-------------- includes/class-admin.php | 4 +- includes/class-fields.php | 16 ++--- languages/open-data-wizard-en_US.mo | Bin 67547 -> 66848 bytes languages/open-data-wizard-en_US.po | 43 ++++-------- languages/open-data-wizard.pot | 45 ++++-------- open-data-wizard.php | 4 +- package.json | 2 +- 13 files changed, 181 insertions(+), 177 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca4774aa..e4338607 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,40 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/spec/v2.0.0.ht --- +## [2.40.3] — 2026-08-27 + +Vier Punkte aus einem Usability-Test — und was beim Nachprüfen sonst noch auffiel. + +### 🐛 Fixed +- **`dct:subject` war fälschlich als DCAT-AP-Definition ausgewiesen.** Die Eigenschaft (CESSDA- + Themenklassifikation, ZiviZ-Engagementfeld) gehört nicht zum Profil — in den mitgelieferten + offiziellen SHACL-Shapes taucht sie für Datensätze nirgends auf. Zulässig ist sie trotzdem, + RDF erlaubt zusätzliche Aussagen, und sie bleibt bewusst erhalten; die Feld-Referenz sagt jetzt + aber dazu, dass streng profilkonforme Portale sie ignorieren dürfen. Beim systematischen + Abgleich aller 43 Katalog-Eigenschaften gegen die Shapes fiel ein zweiter Fall auf: + `dcatap:hvdCategory` stammt aus der HVD-Erweiterung (EU-Verordnung 2023/138), nicht aus dem + Kernprofil DCAT-AP 3.0. Auch vermerkt. +- **Die Verwaltungsebene nannte Optionen, die es nicht gibt.** Die Beschreibung sprach von + „Kreis" und „Kommune", die Auswahlliste bietet „Landkreis" und „Gemeinde". + +### 🎨 Changed +- **Pflichtfeld-Hinweis umformuliert:** „* Pflichtfeld für die Veröffentlichung. Als Entwurf + können Sie den Datensatz jederzeit speichern." Der bisherige Satz stolperte über sich selbst. +- **Beispiele aus den Tooltips fester Auswahllisten entfernt.** Ein Beispiel, das nur die + Optionen des Dropdowns wiederholt, hilft niemandem. Der Tester fand einen Fall — es waren + acht: Thema, Sprache, Format, Lizenz, Verfügbarkeit, Aktualisierungsfrequenz, Verwaltungsebene + und HVD-Kategorie. Erklärende Sätze sind geblieben, gestrichen wurde nur der Beispielteil. +- **„Kardinalität" heißt jetzt durchgängig „Multiplizität"** — den Begriff verwendet die + deutsche Spezifikation DCAT-AP.de. Betrifft 52 Stellen im Feld-Katalog und die daraus + generierte Feld-Referenz. + +### 🧹 Aufgeräumt +- Zehn verwaiste Übersetzungseinträge entfernt, die durch die Textänderungen ohne Fundstelle + im Code zurückgeblieben waren. `bin/check-i18n.py` prüft nur auf fehlende, nicht auf + überzählige Einträge — die CI hätte das nicht gemeldet. + +--- + ## [2.40.2] — 2026-08-23 Zwei Rückmeldungen aus dem Backend. diff --git a/README.md b/README.md index 1da7bc91..186d3783 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

Lizenz - Version + Version DCAT-AP 3.0 PHP >= 8.1 WordPress 6.4+ diff --git a/config/dcat-ap-fields.php b/config/dcat-ap-fields.php index 5d2d3cfb..828a3cdd 100644 --- a/config/dcat-ap-fields.php +++ b/config/dcat-ap-fields.php @@ -17,7 +17,7 @@ * profile — 'ap' (DCAT-AP 3.0) | 'ap.de' (DCAT-AP.de) | 'hvd' (High-Value-Dataset) * tier — 'mandatory' | 'recommended' | 'optional' (vom Plugin erzwungene Stufe) * range — 'literal' | 'literal-lang' | 'uri' | 'node' (JSON-LD-Wertform) - * cardinality — '0..1' | '0..n' | '1..1' | '1..n' (Kardinalität laut Profil) + * cardinality — '0..1' | '0..n' | '1..1' | '1..n' (Multiplizität laut Profil) * entity — 'dataset' | 'distribution' | 'catalog' (Ziel-Entität) * vocab — ID eines kontrollierten Vokabulars (falls zutreffend), sonst '' * diff --git a/config/field-catalog.php b/config/field-catalog.php index 2539b224..3382dd75 100644 --- a/config/field-catalog.php +++ b/config/field-catalog.php @@ -46,7 +46,7 @@ 'vocab' => '', 'q_dcat' => 'Welche Stelle ist `dct:publisher` (verantwortliche Herausgeberin) des Datensatzes?', 'q_human' => 'Wer gibt diese Daten heraus?', - 'desc_dcat' => '`dct:publisher` benennt die für die Bereitstellung des Datensatzes verantwortliche Stelle (eine `foaf:Agent`-Entität). In DCAT-AP 3.0 ist die Angabe verpflichtend (Kardinalität 1..1). Idealerweise wird die Organisation über eine URI referenziert; als Minimalform genügt der Name (`foaf:name`).', + 'desc_dcat' => '`dct:publisher` benennt die für die Bereitstellung des Datensatzes verantwortliche Stelle (eine `foaf:Agent`-Entität). In DCAT-AP 3.0 ist die Angabe verpflichtend (Multiplizität 1..1). Idealerweise wird die Organisation über eine URI referenziert; als Minimalform genügt der Name (`foaf:name`).', 'desc_human' => 'Tragen Sie hier die Organisation ein, die die Daten offiziell veröffentlicht — also wer dafür verantwortlich ist, dass die Daten bereitstehen. Das ist oft eine Behörde, ein Amt oder ein Verein. Beispiel: „Statistisches Landesamt Musterstadt" oder „Umweltbundesamt".', ), array( @@ -58,7 +58,7 @@ 'vocab' => 'data-theme', 'q_dcat' => 'Welchem `dcat:theme` (Datenthema) ist der Datensatz zugeordnet?', 'q_human' => 'Welchem Thema ist dieser Datensatz zugeordnet?', - 'desc_dcat' => '`dcat:theme` ordnet den Datensatz einer oder mehreren Kategorien zu. In DCAT-AP wird das kontrollierte EU-Vokabular „Data Theme" (`http://publications.europa.eu/resource/authority/data-theme/`) verwendet, z. B. `ENVI` (Umwelt) oder `EDUC` (Bildung). Kardinalität 0..n.', + 'desc_dcat' => '`dcat:theme` ordnet den Datensatz einer oder mehreren Kategorien zu. In DCAT-AP wird das kontrollierte EU-Vokabular „Data Theme" (`http://publications.europa.eu/resource/authority/data-theme/`) verwendet, z. B. `ENVI` (Umwelt) oder `EDUC` (Bildung). Multiplizität 0..n.', 'desc_human' => 'Wählen Sie das Themengebiet, zu dem die Daten am besten passen — ähnlich einer Schublade, in die der Datensatz einsortiert wird. Das hilft anderen, Ihre Daten über Themenfilter zu finden. Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur.', ), array( @@ -70,7 +70,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `dcat:keyword` (Schlagwörter) beschreiben den Datensatz?', 'q_human' => 'Mit welchen Schlagworten finde ich diese Daten?', - 'desc_dcat' => '`dcat:keyword` sind freie, sprachlich getaggte Schlagwörter zur Verbesserung der Auffindbarkeit (`literal-lang`, Kardinalität 0..n). Anders als `dcat:theme` sind sie nicht an ein kontrolliertes Vokabular gebunden. Je Schlagwort ein Wert.', + 'desc_dcat' => '`dcat:keyword` sind freie, sprachlich getaggte Schlagwörter zur Verbesserung der Auffindbarkeit (`literal-lang`, Multiplizität 0..n). Anders als `dcat:theme` sind sie nicht an ein kontrolliertes Vokabular gebunden. Je Schlagwort ein Wert.', 'desc_human' => 'Tragen Sie einzelne Schlagwörter ein, unter denen man Ihre Daten suchen würde — jedes Wort in eine eigene Zeile. Sie ergänzen das Thema und machen die Daten leichter auffindbar. Beispiel: Umwelt, Wasser, Luftverschmutzung.', ), array( @@ -82,7 +82,7 @@ 'vocab' => 'cessda', 'q_dcat' => 'Welches `dct:subject` (Fachthema) nach CESSDA-Vokabular beschreibt den Datensatz?', 'q_human' => 'Welchem Themenfeld nach CESSDA ordnen Sie den Datensatz zu?', - 'desc_dcat' => '`dct:subject` verweist auf ein fachliches Thema aus einem kontrollierten Vokabular — hier die CESSDA Topic Classification (Version 4.2.3). Der Wert ist die Konzept-URI aus dem CESSDA-Vokabular. Mehrfachangabe möglich (Kardinalität 0..n); erscheint zusammen mit anderen Themenzuordnungen als Liste.', + 'desc_dcat' => '`dct:subject` verweist auf ein fachliches Thema aus einem kontrollierten Vokabular — hier die CESSDA Topic Classification (Version 4.2.3). Der Wert ist die Konzept-URI aus dem CESSDA-Vokabular. Mehrfachangabe möglich (Multiplizität 0..n); erscheint zusammen mit anderen Themenzuordnungen als Liste. Hinweis: `dct:subject` gehört nicht zum DCAT-AP.de-Profil — die offiziellen SHACL-Shapes kennen die Eigenschaft für Datensätze nicht. Als Dublin-Core-Angabe ist sie zulässig (RDF erlaubt zusätzliche Aussagen) und wird hier bewusst ausgegeben; streng profilkonforme Portale können sie ignorieren.', 'desc_human' => 'Optional für sozial- und wirtschaftswissenschaftliche Daten: Ordnen Sie den Datensatz einem Fachthema aus dem CESSDA-Katalog zu (ein europäischer Standard für Forschungsdaten). Tippen Sie das Thema ein und wählen Sie aus der Vorschlagsliste. Beispiel: Volkszählungen, Migration, Wirtschaftspolitik.', ), array( @@ -94,7 +94,7 @@ 'vocab' => 'engagementfeld', 'q_dcat' => 'Welches `dct:subject` (Engagementfeld) nach ZiviZ-Vokabular beschreibt den Datensatz?', 'q_human' => 'Welchem Engagementfeld ist dieser Datensatz zuzuordnen?', - 'desc_dcat' => '`dct:subject` mit einem Konzept aus dem ZiviZ-Vokabular „Engagementfeld" (`https://ziviz.de/def/engagementfeld/`), das zivilgesellschaftliche Tätigkeitsfelder klassifiziert. Der Wert ist die Konzept-URI; die Label→URI-Auflösung erfolgt beim Speichern. Mehrfachangabe möglich (Kardinalität 0..n).', + 'desc_dcat' => '`dct:subject` mit einem Konzept aus dem ZiviZ-Vokabular „Engagementfeld" (`https://ziviz.de/def/engagementfeld/`), das zivilgesellschaftliche Tätigkeitsfelder klassifiziert. Der Wert ist die Konzept-URI; die Label→URI-Auflösung erfolgt beim Speichern. Mehrfachangabe möglich (Multiplizität 0..n). Hinweis: `dct:subject` gehört nicht zum DCAT-AP.de-Profil — die offiziellen SHACL-Shapes kennen die Eigenschaft für Datensätze nicht. Als Dublin-Core-Angabe ist sie zulässig (RDF erlaubt zusätzliche Aussagen) und wird hier bewusst ausgegeben; streng profilkonforme Portale können sie ignorieren.', 'desc_human' => 'Optional für Organisationen der Zivilgesellschaft: Ordnen Sie den Datensatz einem Engagementfeld zu — also dem gesellschaftlichen Bereich, in dem Sie aktiv sind. Wählen Sie einen Eintrag aus der Liste; die passende Kennung wird automatisch gesetzt. Beispiel: Kultur, Sport, Umwelt- und Naturschutz.', ), array( @@ -106,7 +106,7 @@ 'vocab' => '', 'q_dcat' => 'Wie lautet die `dct:description` (Freitextbeschreibung) des Datensatzes?', 'q_human' => 'Worum geht es in diesem Datensatz?', - 'desc_dcat' => '`dct:description` ist eine frei formulierte, sprachlich getaggte Beschreibung des Datensatzes (`literal-lang`). In DCAT-AP 3.0 verpflichtend (Kardinalität 1..n je Sprache). Sie ergänzt den Titel um Inhalt, Kontext, Erhebungsmethode und Abgrenzung des Datensatzes.', + 'desc_dcat' => '`dct:description` ist eine frei formulierte, sprachlich getaggte Beschreibung des Datensatzes (`literal-lang`). In DCAT-AP 3.0 verpflichtend (Multiplizität 1..n je Sprache). Sie ergänzt den Titel um Inhalt, Kontext, Erhebungsmethode und Abgrenzung des Datensatzes.', 'desc_human' => 'Beschreiben Sie in eigenen Worten, was in den Daten steckt: Worum geht es, was kann man damit machen, was ist enthalten? Ein bis zwei Absätze reichen. Beispiel: „Überblick über die bevölkerungsreichsten Städte Deutschlands mit Einwohnerzahlen und Entwicklung seit 2010."', ), @@ -123,7 +123,7 @@ 'vocab' => 'language', 'q_dcat' => 'In welcher `dct:language` (Sprache) liegen die Daten vor?', 'q_human' => 'In welcher Sprache sind die Daten?', - 'desc_dcat' => '`dct:language` gibt die Sprache des Datensatzes an, referenziert über das EU-Authority-Vokabular „Language" (`http://publications.europa.eu/resource/authority/language/`, z. B. `DEU`, `ENG`). Kardinalität 0..n — mehrsprachige Datensätze können mehrere Sprachen angeben.', + 'desc_dcat' => '`dct:language` gibt die Sprache des Datensatzes an, referenziert über das EU-Authority-Vokabular „Language" (`http://publications.europa.eu/resource/authority/language/`, z. B. `DEU`, `ENG`). Multiplizität 0..n — mehrsprachige Datensätze können mehrere Sprachen angeben.', 'desc_human' => 'Geben Sie an, in welcher Sprache die Inhalte der Daten verfasst sind (z. B. die Spaltenüberschriften und Texte). Das hilft Nutzenden einzuschätzen, ob sie die Daten verstehen. Beispiel: Deutsch, Englisch.', ), @@ -140,7 +140,7 @@ 'vocab' => '', 'q_dcat' => 'Unter welcher `dcat:accessURL` ist die Distribution erreichbar?', 'q_human' => 'Wo kann man die Datei herunterladen oder ansehen?', - 'desc_dcat' => '`dcat:accessURL` verweist auf eine Ressource, über die auf die Distribution zugegriffen werden kann (Range `rdfs:Resource`, Kardinalität 1..n je Distribution). Sie kann auf eine Landing-Page, einen Feed, einen Endpunkt oder — bei direktem Download — dieselbe Ressource wie `dcat:downloadURL` zeigen. Pflichtangabe je Distribution.', + 'desc_dcat' => '`dcat:accessURL` verweist auf eine Ressource, über die auf die Distribution zugegriffen werden kann (Range `rdfs:Resource`, Multiplizität 1..n je Distribution). Sie kann auf eine Landing-Page, einen Feed, einen Endpunkt oder — bei direktem Download — dieselbe Ressource wie `dcat:downloadURL` zeigen. Pflichtangabe je Distribution.', 'desc_human' => 'Tragen Sie den Link ein, unter dem Ihre Daten zu finden sind — die Adresse einer Datei zum Herunterladen oder einer Seite, auf der die Daten liegen. Alternativ laden Sie die Datei über die Mediathek-Box hoch; dann wird dieser Link automatisch gesetzt und Sie müssen ihn nicht selbst eintippen. Beispiel: https://beispiel.de/daten/statistik.csv.', ), array( @@ -152,7 +152,7 @@ 'vocab' => 'file-type', 'q_dcat' => 'Welches `dct:format` (Dateiformat) hat die Distribution?', 'q_human' => 'In welchem Format ist die Datei?', - 'desc_dcat' => '`dct:format` gibt das Format der Distribution an, referenziert über das EU-Authority-Vokabular „File Type" (`http://publications.europa.eu/resource/authority/file-type/`, z. B. `CSV`, `JSON`, `PDF`). Kardinalität 0..1. Ergänzt `dcat:mediaType` (MIME-Typ) um das anwendungsnahe Format.', + 'desc_dcat' => '`dct:format` gibt das Format der Distribution an, referenziert über das EU-Authority-Vokabular „File Type" (`http://publications.europa.eu/resource/authority/file-type/`, z. B. `CSV`, `JSON`, `PDF`). Multiplizität 0..1. Ergänzt `dcat:mediaType` (MIME-Typ) um das anwendungsnahe Format.', 'desc_human' => 'Wählen Sie das Format der bereitgestellten Datei. Daran erkennen Nutzende, mit welchem Programm sie die Daten öffnen können. Maschinenlesbare, offene Formate wie CSV oder JSON sind besonders empfehlenswert. Beispiel: CSV, JSON, PDF.', ), array( @@ -164,7 +164,7 @@ 'vocab' => '', 'q_dcat' => 'Wie groß ist die Distribution laut `dcat:byteSize` (in Bytes)?', 'q_human' => 'Wie groß ist die Datei?', - 'desc_dcat' => '`dcat:byteSize` gibt die Größe der Distribution in Bytes als nicht-negative Ganzzahl an (`xsd:nonNegativeInteger`, Kardinalität 0..1). Bei einem Mediathek-Upload wird der Wert automatisch aus der Datei ermittelt.', + 'desc_dcat' => '`dcat:byteSize` gibt die Größe der Distribution in Bytes als nicht-negative Ganzzahl an (`xsd:nonNegativeInteger`, Multiplizität 0..1). Bei einem Mediathek-Upload wird der Wert automatisch aus der Datei ermittelt.', 'desc_human' => 'Die Dateigröße in Bytes — nur die reine Zahl. Nutzende sehen so vorab, wie viel sie herunterladen. Bei hochgeladenen Dateien wird die Größe automatisch berechnet. Beispiel: 2048576 (das sind rund 2 MB).', ), array( @@ -200,7 +200,7 @@ 'vocab' => '', 'q_dcat' => 'Welcher `dcatde:licenseAttributionByText` (Namensnennungstext) ist bei Nachnutzung anzugeben?', 'q_human' => 'Welcher Namensnennungstext soll bei Weiternutzung angegeben werden?', - 'desc_dcat' => '`dcatde:licenseAttributionByText` (DCAT-AP.de) enthält den exakten Namensnennungstext, den Nachnutzende bei Lizenzen mit Namensnennungspflicht (z. B. CC-BY, DL-DE-BY) zitieren müssen. Freitext (`literal`), Kardinalität 0..1.', + 'desc_dcat' => '`dcatde:licenseAttributionByText` (DCAT-AP.de) enthält den exakten Namensnennungstext, den Nachnutzende bei Lizenzen mit Namensnennungspflicht (z. B. CC-BY, DL-DE-BY) zitieren müssen. Freitext (`literal`), Multiplizität 0..1.', 'desc_human' => 'Bei Lizenzen mit Namensnennung („BY") geben Sie hier vor, wie andere Sie nennen sollen, wenn sie Ihre Daten verwenden. So bekommen Sie korrekt Credit. Beispiel: „Datenquelle: Stadt Musterstadt, 2026".', ), array( @@ -212,7 +212,7 @@ 'vocab' => 'planned-availability', 'q_dcat' => 'Welche `dcatap:availability` (Verfügbarkeitsgarantie) hat die Distribution?', 'q_human' => 'Wie dauerhaft ist diese Datei verfügbar?', - 'desc_dcat' => '`dcatap:availability` beschreibt die geplante Verfügbarkeit einer Distribution über das EU-Vokabular „Planned Availability" (z. B. `AVAILABLE`, `TEMPORARY`, `EXPERIMENTAL`, `STABLE`). Kardinalität 0..1. Gibt Nachnutzenden Planungssicherheit.', + 'desc_dcat' => '`dcatap:availability` beschreibt die geplante Verfügbarkeit einer Distribution über das EU-Vokabular „Planned Availability" (z. B. `AVAILABLE`, `TEMPORARY`, `EXPERIMENTAL`, `STABLE`). Multiplizität 0..1. Gibt Nachnutzenden Planungssicherheit.', 'desc_human' => 'Geben Sie an, wie verlässlich die Datei langfristig erreichbar bleibt — dauerhaft, nur vorübergehend oder experimentell. Das hilft anderen einzuschätzen, ob sie sich auf den Link verlassen können. Beispiel: Dauerhaft verfügbar.', ), @@ -229,7 +229,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `dcat:landingPage` (Projekt-/Infoseite) gehört zum Datensatz?', 'q_human' => 'Wo finde ich mehr Informationen zu diesem Projekt?', - 'desc_dcat' => '`dcat:landingPage` verweist auf eine menschenlesbare Webseite mit weiteren Informationen zum Datensatz (Range `foaf:Document`, Kardinalität 0..n). Anders als `dcat:accessURL` führt sie nicht direkt zu den Daten, sondern zu Kontext, Dokumentation oder Projektbeschreibung.', + 'desc_dcat' => '`dcat:landingPage` verweist auf eine menschenlesbare Webseite mit weiteren Informationen zum Datensatz (Range `foaf:Document`, Multiplizität 0..n). Anders als `dcat:accessURL` führt sie nicht direkt zu den Daten, sondern zu Kontext, Dokumentation oder Projektbeschreibung.', 'desc_human' => 'Verlinken Sie eine Webseite, auf der man mehr über die Daten oder das Projekt erfährt — etwa eine Projekt- oder Dokumentationsseite. Das ist nicht der direkte Download, sondern die „Über uns"-Seite zu den Daten. Beispiel: https://beispiel.de/projekt.', ), array( @@ -241,7 +241,7 @@ 'vocab' => '', 'q_dcat' => 'Wann wurde der Datensatz `dct:issued` (erstveröffentlicht)?', 'q_human' => 'Wann wurden diese Daten zum ersten Mal veröffentlicht?', - 'desc_dcat' => '`dct:issued` ist das Datum der formalen Erstveröffentlichung des Datensatzes, typisiert als `xsd:date` bzw. `xsd:dateTime`. Kardinalität 0..1. Nicht zu verwechseln mit `dct:modified` (letzte Änderung) oder dem Erhebungszeitraum (`dct:temporal`).', + 'desc_dcat' => '`dct:issued` ist das Datum der formalen Erstveröffentlichung des Datensatzes, typisiert als `xsd:date` bzw. `xsd:dateTime`. Multiplizität 0..1. Nicht zu verwechseln mit `dct:modified` (letzte Änderung) oder dem Erhebungszeitraum (`dct:temporal`).', 'desc_human' => 'Geben Sie das Datum an, an dem die Daten erstmals veröffentlicht wurden. Das ist der „Geburtstag" des Datensatzes, nicht der Zeitraum, den die Daten abdecken. Beispiel: 2024-01-15.', ), array( @@ -258,7 +258,7 @@ 'auto' => true, 'q_dcat' => 'Wann wurde der Datensatz zuletzt `dct:modified` (geändert)?', 'q_human' => 'Wann wurden diese Daten zuletzt aktualisiert?', - 'desc_dcat' => '`dct:modified` gibt das Datum der letzten inhaltlichen Änderung des Datensatzes an (`xsd:date`/`xsd:dateTime`, Kardinalität 0..1). Das Plugin setzt diesen Wert bei jeder Speicherung automatisch; ein Eingabefeld gibt es bewusst nicht, da eine manuelle Angabe beim nächsten Speichern überschrieben würde.', + 'desc_dcat' => '`dct:modified` gibt das Datum der letzten inhaltlichen Änderung des Datensatzes an (`xsd:date`/`xsd:dateTime`, Multiplizität 0..1). Das Plugin setzt diesen Wert bei jeder Speicherung automatisch; ein Eingabefeld gibt es bewusst nicht, da eine manuelle Angabe beim nächsten Speichern überschrieben würde.', 'desc_human' => 'Das Datum der letzten Aktualisierung. Es wird beim Speichern automatisch gesetzt, sodass Nutzende immer sehen, wie aktuell die Daten sind — Sie müssen dafür nichts eintragen. Beispiel: 2026-04-22.', ), array( @@ -270,7 +270,7 @@ 'vocab' => 'frequency', 'q_dcat' => 'Welche `dct:accrualPeriodicity` (Aktualisierungsfrequenz) hat der Datensatz?', 'q_human' => 'Wie oft werden diese Daten aktualisiert?', - 'desc_dcat' => '`dct:accrualPeriodicity` gibt an, in welchem Rhythmus der Datensatz aktualisiert wird, referenziert über das EU-Vokabular „Frequency" (`http://publications.europa.eu/resource/authority/frequency/`, z. B. `DAILY`, `MONTHLY`, `ANNUAL`). Kardinalität 0..1.', + 'desc_dcat' => '`dct:accrualPeriodicity` gibt an, in welchem Rhythmus der Datensatz aktualisiert wird, referenziert über das EU-Vokabular „Frequency" (`http://publications.europa.eu/resource/authority/frequency/`, z. B. `DAILY`, `MONTHLY`, `ANNUAL`). Multiplizität 0..1.', 'desc_human' => 'Geben Sie an, wie regelmäßig neue Daten hinzukommen — täglich, monatlich, jährlich oder unregelmäßig. Nutzende wissen dann, wie oft sich ein erneuter Blick lohnt. Beispiel: Jährlich.', ), array( @@ -282,8 +282,8 @@ 'vocab' => 'politicalGeocodingLevel', 'q_dcat' => 'Welche `dcatde:politicalGeocodingLevelURI` (Verwaltungsebene) betrifft der Datensatz?', 'q_human' => 'Auf welcher Verwaltungsebene wurden diese Daten erhoben?', - 'desc_dcat' => '`dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular (Bund, Land, Kreis, Kommune). Kardinalität 0..1. Ergänzt die konkrete Gebietsangabe.', - 'desc_human' => 'Wählen Sie, auf welcher staatlichen Ebene die Daten angesiedelt sind — Bund, Land, Kreis oder Kommune. Das ordnet die Daten geografisch-administrativ ein. Beispiel: Kommune.', + 'desc_dcat' => '`dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular (Bund, Land, Kreis, Kommune). Multiplizität 0..1. Ergänzt die konkrete Gebietsangabe.', + 'desc_human' => 'Wählen Sie, auf welcher staatlichen Ebene die Daten angesiedelt sind — Bund, Land, Landkreis oder Gemeinde. Das ordnet die Daten geografisch-administrativ ein. Beispiel: Gemeinde.', ), array( 'key' => 'political_geocoding_uri', @@ -294,7 +294,7 @@ 'vocab' => '', 'q_dcat' => 'Welches `dcatde:politicalGeocodingURI` (amtliches Gebiet) beschreibt den räumlichen Bezug?', 'q_human' => 'Auf welches amtliche Gebiet beziehen sich die Daten?', - 'desc_dcat' => '`dcatde:politicalGeocodingURI` (DCAT-AP.de) referenziert ein konkretes amtliches Gebiet über eine URI (z. B. amtlicher Regionalschlüssel/AGS als URI). Kardinalität 0..n. Ermöglicht die eindeutige, maschinenlesbare Verortung.', + 'desc_dcat' => '`dcatde:politicalGeocodingURI` (DCAT-AP.de) referenziert ein konkretes amtliches Gebiet über eine URI (z. B. amtlicher Regionalschlüssel/AGS als URI). Multiplizität 0..n. Ermöglicht die eindeutige, maschinenlesbare Verortung.', 'desc_human' => 'Verlinken Sie das genaue amtliche Gebiet, auf das sich die Daten beziehen — als offizielle Kennung (z. B. Gemeindeschlüssel). Damit ist eindeutig, welche Region gemeint ist. Beispiel: die URI zum amtlichen Gemeindeschlüssel Ihrer Stadt.', ), array( @@ -306,7 +306,7 @@ 'vocab' => '', 'q_dcat' => 'Wie lautet die `dcatde:geocodingDescription` (textuelle Beschreibung des räumlichen Bezugs)?', 'q_human' => 'Wie lässt sich der räumliche Bezug in Worten beschreiben?', - 'desc_dcat' => '`dcatde:geocodingDescription` (DCAT-AP.de) ist eine frei formulierte textuelle Beschreibung der räumlichen Abdeckung (`literal`/`literal-lang`). Kardinalität 0..n. Ergänzt die maschinenlesbaren Angaben `dct:spatial` und `dcatde:politicalGeocodingURI` um eine menschenlesbare Erläuterung.', + 'desc_dcat' => '`dcatde:geocodingDescription` (DCAT-AP.de) ist eine frei formulierte textuelle Beschreibung der räumlichen Abdeckung (`literal`/`literal-lang`). Multiplizität 0..n. Ergänzt die maschinenlesbaren Angaben `dct:spatial` und `dcatde:politicalGeocodingURI` um eine menschenlesbare Erläuterung.', 'desc_human' => 'Beschreiben Sie den räumlichen Bezug zusätzlich in Worten — etwa wenn ein Gebietsschlüssel allein nicht genau genug ist. Das hilft Nutzenden, die Abdeckung einzuordnen. Beispiel: „Stadtgebiet Musterstadt ohne den Ortsteil X".', ), array( @@ -318,7 +318,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `dct:spatial` (geografische Abdeckung) hat der Datensatz?', 'q_human' => 'Welche geografische Region betreffen diese Daten?', - 'desc_dcat' => '`dct:spatial` beschreibt die räumliche Abdeckung des Datensatzes (Range `dct:Location`). Als Wert dient eine Gebiets-URI (z. B. GeoNames, EU-Continents) oder eine Freitext-Ortsangabe. Kardinalität 0..n.', + 'desc_dcat' => '`dct:spatial` beschreibt die räumliche Abdeckung des Datensatzes (Range `dct:Location`). Als Wert dient eine Gebiets-URI (z. B. GeoNames, EU-Continents) oder eine Freitext-Ortsangabe. Multiplizität 0..n.', 'desc_human' => 'Geben Sie an, welches geografische Gebiet die Daten abdecken — eine Stadt, ein Bundesland, ein Land oder eine Region. So finden Nutzende Daten zu ihrer Gegend. Beispiel: Musterstadt oder Bayern.', ), array( @@ -330,7 +330,7 @@ 'vocab' => '', 'q_dcat' => 'Ab welchem `dct:temporal`-Startdatum gilt der Abdeckungszeitraum?', 'q_human' => 'Ab wann sind diese Daten gültig?', - 'desc_dcat' => '`dct:temporal` beschreibt den Zeitraum, den die Daten inhaltlich abdecken (Range `dct:PeriodOfTime`). Dieses Feld liefert die Startangabe (`dcat:startDate`) des Intervalls. Kardinalität 0..1. Nicht zu verwechseln mit `dct:issued` (Veröffentlichung).', + 'desc_dcat' => '`dct:temporal` beschreibt den Zeitraum, den die Daten inhaltlich abdecken (Range `dct:PeriodOfTime`). Dieses Feld liefert die Startangabe (`dcat:startDate`) des Intervalls. Multiplizität 0..1. Nicht zu verwechseln mit `dct:issued` (Veröffentlichung).', 'desc_human' => 'Der Beginn des Zeitraums, den die Daten inhaltlich beschreiben — also ab wann die erfassten Werte gelten. Das ist der abgedeckte Zeitraum, nicht das Veröffentlichungsdatum. Beispiel: 2020-01-01.', ), array( @@ -342,7 +342,7 @@ 'vocab' => '', 'q_dcat' => 'Bis zu welchem `dct:temporal`-Enddatum gilt der Abdeckungszeitraum?', 'q_human' => 'Bis wann sind diese Daten gültig?', - 'desc_dcat' => '`dct:temporal` liefert hier die Endangabe (`dcat:endDate`) des abgedeckten Zeitintervalls (Range `dct:PeriodOfTime`). Kardinalität 0..1. Zusammen mit dem Startdatum ergibt sich der vollständige Abdeckungszeitraum.', + 'desc_dcat' => '`dct:temporal` liefert hier die Endangabe (`dcat:endDate`) des abgedeckten Zeitintervalls (Range `dct:PeriodOfTime`). Multiplizität 0..1. Zusammen mit dem Startdatum ergibt sich der vollständige Abdeckungszeitraum.', 'desc_human' => 'Das Ende des Zeitraums, den die Daten abdecken — bis wann die erfassten Werte reichen. Bleibt das Feld leer, gilt der Zeitraum als offen (bis heute fortlaufend). Beispiel: 2025-12-31.', ), array( @@ -354,7 +354,7 @@ 'vocab' => '', 'q_dcat' => 'Wie lautet der `vcard:fn` (Name) des `dcat:contactPoint`?', 'q_human' => 'Wer ist Ansprechperson für Fragen zu diesen Daten?', - 'desc_dcat' => 'Teil des `dcat:contactPoint` (Range `vcard:Kind`): `vcard:fn` benennt die Kontaktstelle oder -person für Rückfragen zum Datensatz. Kardinalität des Kontaktpunkts 0..n. Name, E-Mail und URL bilden zusammen einen Kontaktpunkt.', + 'desc_dcat' => 'Teil des `dcat:contactPoint` (Range `vcard:Kind`): `vcard:fn` benennt die Kontaktstelle oder -person für Rückfragen zum Datensatz. Multiplizität des Kontaktpunkts 0..n. Name, E-Mail und URL bilden zusammen einen Kontaktpunkt.', 'desc_human' => 'Nennen Sie, an wen sich Nutzende bei Fragen wenden können — eine Person oder eine Abteilung. So ist klar, wer für die Daten zuständig ist. Beispiel: Open-Data-Team der Stadt Musterstadt.', ), array( @@ -366,7 +366,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `vcard:hasEmail` gehört zum `dcat:contactPoint`?', 'q_human' => 'Unter welcher E-Mail-Adresse kann ich Fragen stellen?', - 'desc_dcat' => 'Teil des `dcat:contactPoint`: `vcard:hasEmail` liefert die E-Mail-Adresse der Kontaktstelle (als `mailto:`-URI serialisiert). Kardinalität 0..1 je Kontaktpunkt.', + 'desc_dcat' => 'Teil des `dcat:contactPoint`: `vcard:hasEmail` liefert die E-Mail-Adresse der Kontaktstelle (als `mailto:`-URI serialisiert). Multiplizität 0..1 je Kontaktpunkt.', 'desc_human' => 'Die E-Mail-Adresse, unter der man Fragen zu den Daten stellen kann. Das ist der einfachste Weg für Nachnutzende, Sie zu erreichen. Beispiel: opendata@musterstadt.de.', ), array( @@ -378,7 +378,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `vcard:hasURL` gehört zum `dcat:contactPoint`?', 'q_human' => 'Auf welcher Website finde ich weitere Kontaktinformationen?', - 'desc_dcat' => 'Teil des `dcat:contactPoint`: `vcard:hasURL` verweist auf eine Webseite mit weiteren Kontaktinformationen der zuständigen Stelle. Kardinalität 0..1 je Kontaktpunkt.', + 'desc_dcat' => 'Teil des `dcat:contactPoint`: `vcard:hasURL` verweist auf eine Webseite mit weiteren Kontaktinformationen der zuständigen Stelle. Multiplizität 0..1 je Kontaktpunkt.', 'desc_human' => 'Verlinken Sie optional eine Kontakt- oder Impressumsseite mit weiteren Wegen, Sie zu erreichen. Ergänzt E-Mail und Name um eine Anlaufstelle im Web. Beispiel: https://musterstadt.de/kontakt.', ), array( @@ -390,7 +390,7 @@ 'vocab' => 'contributors', 'q_dcat' => 'Welche `dcatde:contributorID` (bereitstellende Stelle) gilt im GovData-Verbund?', 'q_human' => 'Welche Stelle stellt diese Daten im GovData-Verbund bereit?', - 'desc_dcat' => '`dcatde:contributorID` (DCAT-AP.de) ist die offizielle Kennung der im GovData-Verbund bereitstellenden Stelle, referenziert über das gebündelte Contributors-Vokabular. Kardinalität 0..n. Dient der Zuordnung im nationalen Metadatenverbund.', + 'desc_dcat' => '`dcatde:contributorID` (DCAT-AP.de) ist die offizielle Kennung der im GovData-Verbund bereitstellenden Stelle, referenziert über das gebündelte Contributors-Vokabular. Multiplizität 0..n. Dient der Zuordnung im nationalen Metadatenverbund.', 'desc_human' => 'Nur für Stellen, die im deutschen GovData-Verbund veröffentlichen: Wählen Sie Ihre Stelle aus der Liste; die zugehörige offizielle Kennung wird automatisch verwendet. Für die meisten Nutzenden ist dieses Feld nicht relevant. Beispiel: Bundesministerium des Innern.', ), array( @@ -402,7 +402,7 @@ 'vocab' => '', 'q_dcat' => 'Wer ist `dcatde:originator` (ursprünglicher Urheber) der Daten?', 'q_human' => 'Wer hat diese Daten ursprünglich erstellt?', - 'desc_dcat' => '`dcatde:originator` (DCAT-AP.de) benennt die Stelle, von der die Daten ursprünglich stammen (Range `foaf:Agent`). Kann von Herausgeber (`dct:publisher`) und Ersteller (`dct:creator`) abweichen. Kardinalität 0..n.', + 'desc_dcat' => '`dcatde:originator` (DCAT-AP.de) benennt die Stelle, von der die Daten ursprünglich stammen (Range `foaf:Agent`). Kann von Herausgeber (`dct:publisher`) und Ersteller (`dct:creator`) abweichen. Multiplizität 0..n.', 'desc_human' => 'Nennen Sie die Stelle, von der die Daten ursprünglich stammen — das kann eine andere sein als die, die sie jetzt veröffentlicht. So bleibt die Herkunft nachvollziehbar. Beispiel: Statistisches Landesamt.', ), array( @@ -414,7 +414,7 @@ 'vocab' => '', 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dcatde:originator`?', 'q_human' => 'Wie lautet die E-Mail-Adresse des Urhebers?', - 'desc_dcat' => 'Ergänzt `dcatde:originator` um eine E-Mail-Adresse des ursprünglichen Urhebers (als `mailto:`-URI). Optional, Kardinalität 0..1.', + 'desc_dcat' => 'Ergänzt `dcatde:originator` um eine E-Mail-Adresse des ursprünglichen Urhebers (als `mailto:`-URI). Optional, Multiplizität 0..1.', 'desc_human' => 'Optional die E-Mail-Adresse der ursprünglichen Urheber-Stelle, falls abweichend erreichbar. Beispiel: statistik@landesamt.de.', ), array( @@ -426,7 +426,7 @@ 'vocab' => '', 'q_dcat' => 'Wer ist `dcatde:maintainer` (pflegende Stelle) der Daten?', 'q_human' => 'Wer pflegt diese Daten laufend?', - 'desc_dcat' => '`dcatde:maintainer` (DCAT-AP.de) benennt die für die laufende Pflege und Aktualisierung zuständige Stelle (Range `foaf:Agent`). Kardinalität 0..n. Kann von Herausgeber und Urheber abweichen.', + 'desc_dcat' => '`dcatde:maintainer` (DCAT-AP.de) benennt die für die laufende Pflege und Aktualisierung zuständige Stelle (Range `foaf:Agent`). Multiplizität 0..n. Kann von Herausgeber und Urheber abweichen.', 'desc_human' => 'Nennen Sie, wer die Daten laufend betreut und aktuell hält. Das ist die Stelle, die sich um Updates kümmert — nicht unbedingt die, die sie erstellt hat. Beispiel: Open-Data-Team.', ), array( @@ -438,7 +438,7 @@ 'vocab' => '', 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dcatde:maintainer`?', 'q_human' => 'Wie lautet die E-Mail-Adresse der pflegenden Stelle?', - 'desc_dcat' => 'Ergänzt `dcatde:maintainer` um eine E-Mail-Adresse der pflegenden Stelle (als `mailto:`-URI). Optional, Kardinalität 0..1.', + 'desc_dcat' => 'Ergänzt `dcatde:maintainer` um eine E-Mail-Adresse der pflegenden Stelle (als `mailto:`-URI). Optional, Multiplizität 0..1.', 'desc_human' => 'Optional die E-Mail-Adresse der Stelle, die die Daten pflegt. Beispiel: opendata@beispiel.de.', ), array( @@ -450,7 +450,7 @@ 'vocab' => '', 'q_dcat' => 'Auf welcher `dcatde:legalBasis` (Rechtsgrundlage) beruht die Bereitstellung?', 'q_human' => 'Auf welcher rechtlichen Grundlage werden die Daten bereitgestellt?', - 'desc_dcat' => '`dcatde:legalBasis` (DCAT-AP.de) nennt das Gesetz oder die Verordnung, die die Bereitstellung der Daten regelt (Freitext, `literal`). Kardinalität 0..n.', + 'desc_dcat' => '`dcatde:legalBasis` (DCAT-AP.de) nennt das Gesetz oder die Verordnung, die die Bereitstellung der Daten regelt (Freitext, `literal`). Multiplizität 0..n.', 'desc_human' => 'Falls es eine gesetzliche Grundlage für die Veröffentlichung gibt, nennen Sie sie hier. Das schafft Transparenz über die rechtliche Verpflichtung oder Erlaubnis. Beispiel: § 12a EGovG (E-Government-Gesetz).', ), array( @@ -462,7 +462,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `dcatde:qualityProcessURI` dokumentiert das Qualitätssicherungs-Verfahren?', 'q_human' => 'Wo ist das Qualitätssicherungs-Verfahren dokumentiert?', - 'desc_dcat' => '`dcatde:qualityProcessURI` (DCAT-AP.de) verweist per URI auf eine Beschreibung des Qualitätssicherungs-Prozesses des Datensatzes. Kardinalität 0..1.', + 'desc_dcat' => '`dcatde:qualityProcessURI` (DCAT-AP.de) verweist per URI auf eine Beschreibung des Qualitätssicherungs-Prozesses des Datensatzes. Multiplizität 0..1.', 'desc_human' => 'Verlinken Sie optional eine Seite, die beschreibt, wie Sie die Qualität der Daten sichern (z. B. Prüfschritte). Das stärkt das Vertrauen in Ihre Daten. Beispiel: https://beispiel.de/qualitaetssicherung.', ), array( @@ -474,7 +474,7 @@ 'vocab' => 'access-right', 'q_dcat' => 'Welche `dct:accessRights` (Zugriffsklassifikation) gelten für den Datensatz?', 'q_human' => 'Wer darf auf diese Daten zugreifen?', - 'desc_dcat' => '`dct:accessRights` klassifiziert den Zugriffsstatus über das EU-Vokabular „Access Right" (`PUBLIC`, `RESTRICTED`, `NON_PUBLIC`). Kardinalität 0..1. Relevant für die MQA-Dimension Wiederverwendbarkeit.', + 'desc_dcat' => '`dct:accessRights` klassifiziert den Zugriffsstatus über das EU-Vokabular „Access Right" (`PUBLIC`, `RESTRICTED`, `NON_PUBLIC`). Multiplizität 0..1. Relevant für die MQA-Dimension Wiederverwendbarkeit.', 'desc_human' => 'Geben Sie an, ob die Daten für alle offen (öffentlich), nur eingeschränkt oder gar nicht öffentlich zugänglich sind. Für offene Daten ist das in der Regel „öffentlich". Beispiel: Öffentlich.', ), array( @@ -486,7 +486,7 @@ 'vocab' => 'data-theme', 'q_dcat' => 'Welches zusätzliche `dcat:theme` (EU-Themen-URI) gilt für den Datensatz?', 'q_human' => 'Welches weitere EU-Thema möchten Sie ergänzen?', - 'desc_dcat' => 'Zusätzliches `dcat:theme` als direkte EU-Themen-URI (`http://publications.europa.eu/resource/authority/data-theme/…`). Ergänzt die Themen-Auswahl aus Tab 1 um weitere Themen. Kardinalität 0..n.', + 'desc_dcat' => 'Zusätzliches `dcat:theme` als direkte EU-Themen-URI (`http://publications.europa.eu/resource/authority/data-theme/…`). Ergänzt die Themen-Auswahl aus Tab 1 um weitere Themen. Multiplizität 0..n.', 'desc_human' => 'Falls Ihr Datensatz zu mehr als einem Thema passt, ergänzen Sie hier ein weiteres EU-Thema aus der Vorschlagsliste. Das erhöht die Auffindbarkeit über mehrere Themenfilter. Beispiel: Umwelt zusätzlich zu Gesundheit.', ), array( @@ -510,7 +510,7 @@ 'vocab' => 'hvd-category', 'q_dcat' => 'Welcher `dcatap:hvdCategory` (HVD-Kategorie) gehört der Datensatz an?', 'q_human' => 'Welcher HVD-Kategorie gehört dieser Datensatz an?', - 'desc_dcat' => '`dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Kardinalität 0..n.', + 'desc_dcat' => '`dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Multiplizität 0..n. Hinweis: Die Eigenschaft stammt aus der HVD-Erweiterung zu DCAT-AP (EU-Durchführungsverordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0; die mitgelieferten Kern-Shapes prüfen sie deshalb nicht.', 'desc_human' => 'Wenn es ein hochwertiger Datensatz ist, wählen Sie hier die passende der sechs EU-HVD-Kategorien. Damit ordnen Sie den Datensatz korrekt in das EU-Schema ein. Beispiel: Georaum, Mobilität, Statistik.', ), array( @@ -522,7 +522,7 @@ 'vocab' => '', 'q_dcat' => 'Welcher `dct:identifier` (eindeutige Kennung) identifiziert den Datensatz?', 'q_human' => 'Welche eindeutige Kennung hat dieser Datensatz?', - 'desc_dcat' => '`dct:identifier` ist eine eindeutige, im System der Herausgeberin vergebene Kennung des Datensatzes (Freitext/`literal`). Kardinalität 0..n. Ermöglicht die stabile Referenzierung über Systemgrenzen hinweg.', + 'desc_dcat' => '`dct:identifier` ist eine eindeutige, im System der Herausgeberin vergebene Kennung des Datensatzes (Freitext/`literal`). Multiplizität 0..n. Ermöglicht die stabile Referenzierung über Systemgrenzen hinweg.', 'desc_human' => 'Falls Ihr Datensatz eine feste Kennnummer aus Ihrem eigenen System hat, tragen Sie sie hier ein. So bleibt der Datensatz eindeutig identifizierbar. Beispiel: DS-2026-00042.', ), array( @@ -534,7 +534,7 @@ 'vocab' => 'dataset-type', 'q_dcat' => 'Welchen `dct:type` (Datensatz-Typ) hat der Datensatz?', 'q_human' => 'Um welchen Typ von Datensatz handelt es sich?', - 'desc_dcat' => '`dct:type` klassifiziert die Art des Datensatzes, idealerweise über das EU-Vokabular „Dataset Type". Kardinalität 0..1. Unterscheidet z. B. Erhebungsdaten, Registerdaten oder Geodaten.', + 'desc_dcat' => '`dct:type` klassifiziert die Art des Datensatzes, idealerweise über das EU-Vokabular „Dataset Type". Multiplizität 0..1. Unterscheidet z. B. Erhebungsdaten, Registerdaten oder Geodaten.', 'desc_human' => 'Geben Sie an, um welche Art von Datensatz es sich grundsätzlich handelt. Das hilft bei der groben Einordnung. Beispiel: Statistische Erhebung, Geodaten.', ), array( @@ -546,7 +546,7 @@ 'vocab' => '', 'q_dcat' => 'Wer ist `dct:creator` (Ersteller) des Datensatzes?', 'q_human' => 'Wer hat diese Daten erstellt?', - 'desc_dcat' => '`dct:creator` benennt die primär für die Erstellung des Datensatzes verantwortliche Stelle oder Person (Range `foaf:Agent`). Kardinalität 0..n. Unterscheidet sich vom Herausgeber (`dct:publisher`), der für die Bereitstellung verantwortlich ist.', + 'desc_dcat' => '`dct:creator` benennt die primär für die Erstellung des Datensatzes verantwortliche Stelle oder Person (Range `foaf:Agent`). Multiplizität 0..n. Unterscheidet sich vom Herausgeber (`dct:publisher`), der für die Bereitstellung verantwortlich ist.', 'desc_human' => 'Nennen Sie, wer die Daten inhaltlich erstellt hat — die Person oder Stelle, die die eigentliche Arbeit gemacht hat. Das kann von der herausgebenden Organisation abweichen. Beispiel: Forschungsgruppe Stadtklima.', ), array( @@ -558,7 +558,7 @@ 'vocab' => '', 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dct:creator`?', 'q_human' => 'Wie lautet die E-Mail-Adresse des Erstellers?', - 'desc_dcat' => 'Ergänzt `dct:creator` um eine E-Mail-Adresse der erstellenden Stelle (als `mailto:`-URI). Optional, Kardinalität 0..1.', + 'desc_dcat' => 'Ergänzt `dct:creator` um eine E-Mail-Adresse der erstellenden Stelle (als `mailto:`-URI). Optional, Multiplizität 0..1.', 'desc_human' => 'Optional die E-Mail-Adresse der erstellenden Person oder Stelle. Beispiel: forschung@beispiel.de.', ), array( @@ -570,7 +570,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `owl:versionInfo` (Versionsbezeichnung) hat der Datensatz?', 'q_human' => 'Welche Version hat dieser Datensatz?', - 'desc_dcat' => '`owl:versionInfo` gibt die Versionsbezeichnung des Datensatzes als Freitext an (`literal`). Kardinalität 0..1. Erlaubt die Unterscheidung aufeinanderfolgender Ausgaben desselben Datensatzes.', + 'desc_dcat' => '`owl:versionInfo` gibt die Versionsbezeichnung des Datensatzes als Freitext an (`literal`). Multiplizität 0..1. Erlaubt die Unterscheidung aufeinanderfolgender Ausgaben desselben Datensatzes.', 'desc_human' => 'Falls es mehrere Ausgaben Ihrer Daten gibt, tragen Sie die Versionsnummer ein. So wissen Nutzende, welche Fassung sie vor sich haben. Beispiel: 2.0.', ), array( @@ -582,7 +582,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `adms:versionNotes` (Änderungshinweise) beschreiben diese Version?', 'q_human' => 'Was hat sich in dieser Version geändert?', - 'desc_dcat' => '`adms:versionNotes` beschreibt die Änderungen gegenüber der Vorversion als sprachlich getaggten Freitext (`literal-lang`). Kardinalität 0..n. Ergänzt `owl:versionInfo` um den inhaltlichen Änderungsverlauf.', + 'desc_dcat' => '`adms:versionNotes` beschreibt die Änderungen gegenüber der Vorversion als sprachlich getaggten Freitext (`literal-lang`). Multiplizität 0..n. Ergänzt `owl:versionInfo` um den inhaltlichen Änderungsverlauf.', 'desc_human' => 'Beschreiben Sie kurz, was sich gegenüber der letzten Version geändert hat — wie ein Änderungsprotokoll. Nutzende sehen so, ob sich ein erneuter Download lohnt. Beispiel: „Daten für 2025 ergänzt, Tippfehler korrigiert."', ), array( @@ -594,7 +594,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `dcat:spatialResolutionInMeters` (räumliche Auflösung) haben die Daten?', 'q_human' => 'Welche räumliche Auflösung haben die Daten (in Metern)?', - 'desc_dcat' => '`dcat:spatialResolutionInMeters` gibt die kleinste räumlich unterscheidbare Einheit in Metern an (`xsd:decimal`). Kardinalität 0..n. Relevant vor allem für Geodaten und Rasterdaten.', + 'desc_dcat' => '`dcat:spatialResolutionInMeters` gibt die kleinste räumlich unterscheidbare Einheit in Metern an (`xsd:decimal`). Multiplizität 0..n. Relevant vor allem für Geodaten und Rasterdaten.', 'desc_human' => 'Bei Geodaten: Geben Sie an, wie fein die Daten räumlich aufgelöst sind — der kleinste unterscheidbare Abstand in Metern. Ein kleiner Wert bedeutet detailliertere Daten. Beispiel: 10 (Raster von 10 Metern).', ), array( @@ -606,7 +606,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `dcat:temporalResolution` (zeitliche Auflösung) haben die Daten?', 'q_human' => 'Welche zeitliche Auflösung haben die Daten?', - 'desc_dcat' => '`dcat:temporalResolution` gibt die kleinste zeitlich unterscheidbare Einheit als ISO-8601-Dauer an (`xsd:duration`). Kardinalität 0..1. Beschreibt z. B. den Messabstand einer Zeitreihe.', + 'desc_dcat' => '`dcat:temporalResolution` gibt die kleinste zeitlich unterscheidbare Einheit als ISO-8601-Dauer an (`xsd:duration`). Multiplizität 0..1. Beschreibt z. B. den Messabstand einer Zeitreihe.', 'desc_human' => 'Bei Zeitreihen: Geben Sie an, in welchem zeitlichen Abstand die Werte erfasst sind — z. B. stündlich, täglich, monatlich. Format ist die ISO-8601-Dauer. Beispiel: P1D (ein Tag) oder PT1H (eine Stunde).', ), array( @@ -618,7 +618,7 @@ 'vocab' => '', 'q_dcat' => 'Welchem `dct:conformsTo` (Standard/Schema) entsprechen die Daten?', 'q_human' => 'Welchem Standard oder Schema entsprechen die Daten?', - 'desc_dcat' => '`dct:conformsTo` verweist auf einen implementierten Standard, ein Anwendungsprofil oder ein Schema, dem die Daten entsprechen (Range `dct:Standard`, per URI oder Bezeichnung). Kardinalität 0..n.', + 'desc_dcat' => '`dct:conformsTo` verweist auf einen implementierten Standard, ein Anwendungsprofil oder ein Schema, dem die Daten entsprechen (Range `dct:Standard`, per URI oder Bezeichnung). Multiplizität 0..n.', 'desc_human' => 'Falls Ihre Daten einem bestimmten Standard oder Schema folgen, nennen Sie ihn hier. So können Systeme die Daten korrekt interpretieren. Beispiel: INSPIRE, XÖV oder ein fachliches Datenschema.', ), array( @@ -630,7 +630,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `dct:provenance` (Herkunft/Entstehung) hat der Datensatz?', 'q_human' => 'Woher stammen die Daten und wie sind sie entstanden?', - 'desc_dcat' => '`dct:provenance` beschreibt die Herkunft und Entstehungsgeschichte des Datensatzes (Range `dct:ProvenanceStatement`, Freitext). Kardinalität 0..n. Dokumentiert Erhebungs- und Verarbeitungsschritte.', + 'desc_dcat' => '`dct:provenance` beschreibt die Herkunft und Entstehungsgeschichte des Datensatzes (Range `dct:ProvenanceStatement`, Freitext). Multiplizität 0..n. Dokumentiert Erhebungs- und Verarbeitungsschritte.', 'desc_human' => 'Beschreiben Sie, woher die Daten kommen und wie sie entstanden sind — z. B. aus welcher Erhebung oder welchem Verfahren. Das macht die Daten nachvollziehbar und vertrauenswürdig. Beispiel: „Erhoben im Rahmen der Bürgerbefragung 2025, anonymisiert aufbereitet."', ), array( @@ -642,7 +642,7 @@ 'vocab' => '', 'q_dcat' => 'Wie lautet der `dct:title` der Distribution?', 'q_human' => 'Wie heißt die bereitgestellte Datei/Distribution?', - 'desc_dcat' => '`dct:title` auf Ebene der Distribution benennt die konkrete bereitgestellte Ressource (`literal-lang`). Kardinalität 0..n. Nützlich, wenn der Distributionsname vom Datensatztitel abweicht.', + 'desc_dcat' => '`dct:title` auf Ebene der Distribution benennt die konkrete bereitgestellte Ressource (`literal-lang`). Multiplizität 0..n. Nützlich, wenn der Distributionsname vom Datensatztitel abweicht.', 'desc_human' => 'Geben Sie der bereitgestellten Datei einen eigenen Namen, falls er sich vom Titel des Datensatzes unterscheidet. Beispiel: „Rohdaten CSV 2025".', ), array( @@ -654,7 +654,7 @@ 'vocab' => '', 'q_dcat' => 'Wie lautet die `dct:description` der Distribution?', 'q_human' => 'Wie lässt sich die Distribution beschreiben?', - 'desc_dcat' => '`dct:description` auf Distributionsebene beschreibt die konkrete Datei/Ressource (`literal-lang`). Kardinalität 0..n. Ergänzt die Datensatzbeschreibung um distributionsspezifische Hinweise (z. B. Spaltenaufbau).', + 'desc_dcat' => '`dct:description` auf Distributionsebene beschreibt die konkrete Datei/Ressource (`literal-lang`). Multiplizität 0..n. Ergänzt die Datensatzbeschreibung um distributionsspezifische Hinweise (z. B. Spaltenaufbau).', 'desc_human' => 'Beschreiben Sie die konkrete Datei näher — etwa welche Spalten sie enthält oder wie sie aufgebaut ist. Das hilft beim direkten Umgang mit der Datei. Beispiel: „Spalten: Jahr, Stadt, Einwohner; Trennzeichen Semikolon."', ), array( @@ -666,7 +666,7 @@ 'vocab' => '', 'q_dcat' => 'Unter welcher `dcat:downloadURL` ist die Datei direkt herunterladbar?', 'q_human' => 'Wie lautet der direkte Download-Link zur Datei?', - 'desc_dcat' => '`dcat:downloadURL` verweist auf eine direkt herunterladbare Datei (Range `rdfs:Resource`). Anders als `dcat:accessURL` garantiert sie einen unmittelbaren Download derselben Ressource. Kardinalität 0..n. Relevant für die MQA-Dimension Zugänglichkeit.', + 'desc_dcat' => '`dcat:downloadURL` verweist auf eine direkt herunterladbare Datei (Range `rdfs:Resource`). Anders als `dcat:accessURL` garantiert sie einen unmittelbaren Download derselben Ressource. Multiplizität 0..n. Relevant für die MQA-Dimension Zugänglichkeit.', 'desc_human' => 'Falls es einen direkten Link gibt, der die Datei sofort herunterlädt (ohne Umweg über eine Seite), tragen Sie ihn hier ein. Das ist der bequemste Weg für Nachnutzende. Beispiel: https://beispiel.de/daten/statistik.csv.', ), array( @@ -678,7 +678,7 @@ 'vocab' => 'iana-media-type', 'q_dcat' => 'Welchen `dcat:mediaType` (IANA-MIME-Typ) hat die Distribution?', 'q_human' => 'Welchen Medientyp (MIME) hat die Datei?', - 'desc_dcat' => '`dcat:mediaType` gibt den Medientyp der Distribution als IANA-Media-Type an (z. B. `text/csv`, `application/json`), referenziert über das IANA-Media-Types-Register. Kardinalität 0..1. Ergänzt `dct:format` um den technischen MIME-Typ.', + 'desc_dcat' => '`dcat:mediaType` gibt den Medientyp der Distribution als IANA-Media-Type an (z. B. `text/csv`, `application/json`), referenziert über das IANA-Media-Types-Register. Multiplizität 0..1. Ergänzt `dct:format` um den technischen MIME-Typ.', 'desc_human' => 'Der technische Medientyp der Datei (MIME-Typ) — die maschinenlesbare Entsprechung zum Format. Systeme erkennen daran, wie sie die Datei behandeln müssen. Beispiel: text/csv, application/json.', ), array( @@ -690,7 +690,7 @@ 'vocab' => '', 'q_dcat' => 'Welche `dct:rights` (Nutzungsrechte) gelten für die Distribution?', 'q_human' => 'Welche Nutzungsrechte gelten für die Datei?', - 'desc_dcat' => '`dct:rights` beschreibt rechtliche Hinweise zur Distribution jenseits der Lizenz — etwa Urheberrechts- oder Zugriffsvermerke (Range `dct:RightsStatement`, Freitext oder URI). Kardinalität 0..1.', + 'desc_dcat' => '`dct:rights` beschreibt rechtliche Hinweise zur Distribution jenseits der Lizenz — etwa Urheberrechts- oder Zugriffsvermerke (Range `dct:RightsStatement`, Freitext oder URI). Multiplizität 0..1.', 'desc_human' => 'Ergänzende rechtliche Hinweise zur Datei, die über die Lizenz hinausgehen — z. B. Urheberrechtsvermerke. Für viele offene Datensätze bleibt das leer. Beispiel: „© Stadt Musterstadt 2026".', ), ); diff --git a/config/shacl/README.md b/config/shacl/README.md index b22ce907..055f64af 100644 --- a/config/shacl/README.md +++ b/config/shacl/README.md @@ -22,7 +22,7 @@ Grundlage, gegen die diese Ausgabe geprüft wird (u. a. für die MQA-Metrik „D ### Datei-Beschreibungen -- **`dcat-ap-SHACL.ttl`** — Die generischen DCAT-AP-3.0-Constraints der EU (SEMIC). Enthält alle Pflichtfelder und Kardinalitäten für DCAT-AP-konforme Metadaten. +- **`dcat-ap-SHACL.ttl`** — Die generischen DCAT-AP-3.0-Constraints der EU (SEMIC). Enthält alle Pflichtfelder und Multiplizitäten für DCAT-AP-konforme Metadaten. - **`dcat-ap-SHACL-DE.ttl`** — Die DCAT-AP.de-Ergänzungen/-Anpassungen. Enthält deutschsprachige Fehlermeldungen, deaktivierte Shapes und Severity-Overrides. Für dieses Plugin besonders relevant, da `dcatde:`-Felder ausgegeben werden. - **`dcat-ap-spec-german-additions.ttl`** — Zusätzliche deutsche Shapes (u.a. `foaf:Agent`-Constraints für `dcatde:originator`/`maintainer`). - **`dcat-ap-de-deprecated.ttl`** — Deprecation-Hinweise für veraltete Felder. diff --git a/docs/FELD-REFERENZ.md b/docs/FELD-REFERENZ.md index a73ae47a..f150c49f 100644 --- a/docs/FELD-REFERENZ.md +++ b/docs/FELD-REFERENZ.md @@ -91,7 +91,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wer gibt diese Daten heraus? -**3 · DCAT-AP-Langbeschreibung:** `dct:publisher` benennt die für die Bereitstellung des Datensatzes verantwortliche Stelle (eine `foaf:Agent`-Entität). In DCAT-AP 3.0 ist die Angabe verpflichtend (Kardinalität 1..1). Idealerweise wird die Organisation über eine URI referenziert; als Minimalform genügt der Name (`foaf:name`). +**3 · DCAT-AP-Langbeschreibung:** `dct:publisher` benennt die für die Bereitstellung des Datensatzes verantwortliche Stelle (eine `foaf:Agent`-Entität). In DCAT-AP 3.0 ist die Angabe verpflichtend (Multiplizität 1..1). Idealerweise wird die Organisation über eine URI referenziert; als Minimalform genügt der Name (`foaf:name`). **4 · Verständliche Langbeschreibung:** Tragen Sie hier die Organisation ein, die die Daten offiziell veröffentlicht — also wer dafür verantwortlich ist, dass die Daten bereitstehen. Das ist oft eine Behörde, ein Amt oder ein Verein. Beispiel: „Statistisches Landesamt Musterstadt" oder „Umweltbundesamt". @@ -108,7 +108,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welchem Thema ist dieser Datensatz zugeordnet? -**3 · DCAT-AP-Langbeschreibung:** `dcat:theme` ordnet den Datensatz einer oder mehreren Kategorien zu. In DCAT-AP wird das kontrollierte EU-Vokabular „Data Theme" (`http://publications.europa.eu/resource/authority/data-theme/`) verwendet, z. B. `ENVI` (Umwelt) oder `EDUC` (Bildung). Kardinalität 0..n. +**3 · DCAT-AP-Langbeschreibung:** `dcat:theme` ordnet den Datensatz einer oder mehreren Kategorien zu. In DCAT-AP wird das kontrollierte EU-Vokabular „Data Theme" (`http://publications.europa.eu/resource/authority/data-theme/`) verwendet, z. B. `ENVI` (Umwelt) oder `EDUC` (Bildung). Multiplizität 0..n. **4 · Verständliche Langbeschreibung:** Wählen Sie das Themengebiet, zu dem die Daten am besten passen — ähnlich einer Schublade, in die der Datensatz einsortiert wird. Das hilft anderen, Ihre Daten über Themenfilter zu finden. Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur. @@ -125,7 +125,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Mit welchen Schlagworten finde ich diese Daten? -**3 · DCAT-AP-Langbeschreibung:** `dcat:keyword` sind freie, sprachlich getaggte Schlagwörter zur Verbesserung der Auffindbarkeit (`literal-lang`, Kardinalität 0..n). Anders als `dcat:theme` sind sie nicht an ein kontrolliertes Vokabular gebunden. Je Schlagwort ein Wert. +**3 · DCAT-AP-Langbeschreibung:** `dcat:keyword` sind freie, sprachlich getaggte Schlagwörter zur Verbesserung der Auffindbarkeit (`literal-lang`, Multiplizität 0..n). Anders als `dcat:theme` sind sie nicht an ein kontrolliertes Vokabular gebunden. Je Schlagwort ein Wert. **4 · Verständliche Langbeschreibung:** Tragen Sie einzelne Schlagwörter ein, unter denen man Ihre Daten suchen würde — jedes Wort in eine eigene Zeile. Sie ergänzen das Thema und machen die Daten leichter auffindbar. Beispiel: Umwelt, Wasser, Luftverschmutzung. @@ -142,7 +142,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welchem Themenfeld nach CESSDA ordnen Sie den Datensatz zu? -**3 · DCAT-AP-Langbeschreibung:** `dct:subject` verweist auf ein fachliches Thema aus einem kontrollierten Vokabular — hier die CESSDA Topic Classification (Version 4.2.3). Der Wert ist die Konzept-URI aus dem CESSDA-Vokabular. Mehrfachangabe möglich (Kardinalität 0..n); erscheint zusammen mit anderen Themenzuordnungen als Liste. +**3 · DCAT-AP-Langbeschreibung:** `dct:subject` verweist auf ein fachliches Thema aus einem kontrollierten Vokabular — hier die CESSDA Topic Classification (Version 4.2.3). Der Wert ist die Konzept-URI aus dem CESSDA-Vokabular. Mehrfachangabe möglich (Multiplizität 0..n); erscheint zusammen mit anderen Themenzuordnungen als Liste. Hinweis: `dct:subject` gehört nicht zum DCAT-AP.de-Profil — die offiziellen SHACL-Shapes kennen die Eigenschaft für Datensätze nicht. Als Dublin-Core-Angabe ist sie zulässig (RDF erlaubt zusätzliche Aussagen) und wird hier bewusst ausgegeben; streng profilkonforme Portale können sie ignorieren. **4 · Verständliche Langbeschreibung:** Optional für sozial- und wirtschaftswissenschaftliche Daten: Ordnen Sie den Datensatz einem Fachthema aus dem CESSDA-Katalog zu (ein europäischer Standard für Forschungsdaten). Tippen Sie das Thema ein und wählen Sie aus der Vorschlagsliste. Beispiel: Volkszählungen, Migration, Wirtschaftspolitik. @@ -159,7 +159,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welchem Engagementfeld ist dieser Datensatz zuzuordnen? -**3 · DCAT-AP-Langbeschreibung:** `dct:subject` mit einem Konzept aus dem ZiviZ-Vokabular „Engagementfeld" (`https://ziviz.de/def/engagementfeld/`), das zivilgesellschaftliche Tätigkeitsfelder klassifiziert. Der Wert ist die Konzept-URI; die Label→URI-Auflösung erfolgt beim Speichern. Mehrfachangabe möglich (Kardinalität 0..n). +**3 · DCAT-AP-Langbeschreibung:** `dct:subject` mit einem Konzept aus dem ZiviZ-Vokabular „Engagementfeld" (`https://ziviz.de/def/engagementfeld/`), das zivilgesellschaftliche Tätigkeitsfelder klassifiziert. Der Wert ist die Konzept-URI; die Label→URI-Auflösung erfolgt beim Speichern. Mehrfachangabe möglich (Multiplizität 0..n). Hinweis: `dct:subject` gehört nicht zum DCAT-AP.de-Profil — die offiziellen SHACL-Shapes kennen die Eigenschaft für Datensätze nicht. Als Dublin-Core-Angabe ist sie zulässig (RDF erlaubt zusätzliche Aussagen) und wird hier bewusst ausgegeben; streng profilkonforme Portale können sie ignorieren. **4 · Verständliche Langbeschreibung:** Optional für Organisationen der Zivilgesellschaft: Ordnen Sie den Datensatz einem Engagementfeld zu — also dem gesellschaftlichen Bereich, in dem Sie aktiv sind. Wählen Sie einen Eintrag aus der Liste; die passende Kennung wird automatisch gesetzt. Beispiel: Kultur, Sport, Umwelt- und Naturschutz. @@ -176,7 +176,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Worum geht es in diesem Datensatz? -**3 · DCAT-AP-Langbeschreibung:** `dct:description` ist eine frei formulierte, sprachlich getaggte Beschreibung des Datensatzes (`literal-lang`). In DCAT-AP 3.0 verpflichtend (Kardinalität 1..n je Sprache). Sie ergänzt den Titel um Inhalt, Kontext, Erhebungsmethode und Abgrenzung des Datensatzes. +**3 · DCAT-AP-Langbeschreibung:** `dct:description` ist eine frei formulierte, sprachlich getaggte Beschreibung des Datensatzes (`literal-lang`). In DCAT-AP 3.0 verpflichtend (Multiplizität 1..n je Sprache). Sie ergänzt den Titel um Inhalt, Kontext, Erhebungsmethode und Abgrenzung des Datensatzes. **4 · Verständliche Langbeschreibung:** Beschreiben Sie in eigenen Worten, was in den Daten steckt: Worum geht es, was kann man damit machen, was ist enthalten? Ein bis zwei Absätze reichen. Beispiel: „Überblick über die bevölkerungsreichsten Städte Deutschlands mit Einwohnerzahlen und Entwicklung seit 2010." @@ -197,7 +197,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** In welcher Sprache sind die Daten? -**3 · DCAT-AP-Langbeschreibung:** `dct:language` gibt die Sprache des Datensatzes an, referenziert über das EU-Authority-Vokabular „Language" (`http://publications.europa.eu/resource/authority/language/`, z. B. `DEU`, `ENG`). Kardinalität 0..n — mehrsprachige Datensätze können mehrere Sprachen angeben. +**3 · DCAT-AP-Langbeschreibung:** `dct:language` gibt die Sprache des Datensatzes an, referenziert über das EU-Authority-Vokabular „Language" (`http://publications.europa.eu/resource/authority/language/`, z. B. `DEU`, `ENG`). Multiplizität 0..n — mehrsprachige Datensätze können mehrere Sprachen angeben. **4 · Verständliche Langbeschreibung:** Geben Sie an, in welcher Sprache die Inhalte der Daten verfasst sind (z. B. die Spaltenüberschriften und Texte). Das hilft Nutzenden einzuschätzen, ob sie die Daten verstehen. Beispiel: Deutsch, Englisch. @@ -218,7 +218,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wo kann man die Datei herunterladen oder ansehen? -**3 · DCAT-AP-Langbeschreibung:** `dcat:accessURL` verweist auf eine Ressource, über die auf die Distribution zugegriffen werden kann (Range `rdfs:Resource`, Kardinalität 1..n je Distribution). Sie kann auf eine Landing-Page, einen Feed, einen Endpunkt oder — bei direktem Download — dieselbe Ressource wie `dcat:downloadURL` zeigen. Pflichtangabe je Distribution. +**3 · DCAT-AP-Langbeschreibung:** `dcat:accessURL` verweist auf eine Ressource, über die auf die Distribution zugegriffen werden kann (Range `rdfs:Resource`, Multiplizität 1..n je Distribution). Sie kann auf eine Landing-Page, einen Feed, einen Endpunkt oder — bei direktem Download — dieselbe Ressource wie `dcat:downloadURL` zeigen. Pflichtangabe je Distribution. **4 · Verständliche Langbeschreibung:** Tragen Sie den Link ein, unter dem Ihre Daten zu finden sind — die Adresse einer Datei zum Herunterladen oder einer Seite, auf der die Daten liegen. Alternativ laden Sie die Datei über die Mediathek-Box hoch; dann wird dieser Link automatisch gesetzt und Sie müssen ihn nicht selbst eintippen. Beispiel: https://beispiel.de/daten/statistik.csv. @@ -235,7 +235,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** In welchem Format ist die Datei? -**3 · DCAT-AP-Langbeschreibung:** `dct:format` gibt das Format der Distribution an, referenziert über das EU-Authority-Vokabular „File Type" (`http://publications.europa.eu/resource/authority/file-type/`, z. B. `CSV`, `JSON`, `PDF`). Kardinalität 0..1. Ergänzt `dcat:mediaType` (MIME-Typ) um das anwendungsnahe Format. +**3 · DCAT-AP-Langbeschreibung:** `dct:format` gibt das Format der Distribution an, referenziert über das EU-Authority-Vokabular „File Type" (`http://publications.europa.eu/resource/authority/file-type/`, z. B. `CSV`, `JSON`, `PDF`). Multiplizität 0..1. Ergänzt `dcat:mediaType` (MIME-Typ) um das anwendungsnahe Format. **4 · Verständliche Langbeschreibung:** Wählen Sie das Format der bereitgestellten Datei. Daran erkennen Nutzende, mit welchem Programm sie die Daten öffnen können. Maschinenlesbare, offene Formate wie CSV oder JSON sind besonders empfehlenswert. Beispiel: CSV, JSON, PDF. @@ -252,7 +252,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie groß ist die Datei? -**3 · DCAT-AP-Langbeschreibung:** `dcat:byteSize` gibt die Größe der Distribution in Bytes als nicht-negative Ganzzahl an (`xsd:nonNegativeInteger`, Kardinalität 0..1). Bei einem Mediathek-Upload wird der Wert automatisch aus der Datei ermittelt. +**3 · DCAT-AP-Langbeschreibung:** `dcat:byteSize` gibt die Größe der Distribution in Bytes als nicht-negative Ganzzahl an (`xsd:nonNegativeInteger`, Multiplizität 0..1). Bei einem Mediathek-Upload wird der Wert automatisch aus der Datei ermittelt. **4 · Verständliche Langbeschreibung:** Die Dateigröße in Bytes — nur die reine Zahl. Nutzende sehen so vorab, wie viel sie herunterladen. Bei hochgeladenen Dateien wird die Größe automatisch berechnet. Beispiel: 2048576 (das sind rund 2 MB). @@ -303,7 +303,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welcher Namensnennungstext soll bei Weiternutzung angegeben werden? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:licenseAttributionByText` (DCAT-AP.de) enthält den exakten Namensnennungstext, den Nachnutzende bei Lizenzen mit Namensnennungspflicht (z. B. CC-BY, DL-DE-BY) zitieren müssen. Freitext (`literal`), Kardinalität 0..1. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:licenseAttributionByText` (DCAT-AP.de) enthält den exakten Namensnennungstext, den Nachnutzende bei Lizenzen mit Namensnennungspflicht (z. B. CC-BY, DL-DE-BY) zitieren müssen. Freitext (`literal`), Multiplizität 0..1. **4 · Verständliche Langbeschreibung:** Bei Lizenzen mit Namensnennung („BY") geben Sie hier vor, wie andere Sie nennen sollen, wenn sie Ihre Daten verwenden. So bekommen Sie korrekt Credit. Beispiel: „Datenquelle: Stadt Musterstadt, 2026". @@ -320,7 +320,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie dauerhaft ist diese Datei verfügbar? -**3 · DCAT-AP-Langbeschreibung:** `dcatap:availability` beschreibt die geplante Verfügbarkeit einer Distribution über das EU-Vokabular „Planned Availability" (z. B. `AVAILABLE`, `TEMPORARY`, `EXPERIMENTAL`, `STABLE`). Kardinalität 0..1. Gibt Nachnutzenden Planungssicherheit. +**3 · DCAT-AP-Langbeschreibung:** `dcatap:availability` beschreibt die geplante Verfügbarkeit einer Distribution über das EU-Vokabular „Planned Availability" (z. B. `AVAILABLE`, `TEMPORARY`, `EXPERIMENTAL`, `STABLE`). Multiplizität 0..1. Gibt Nachnutzenden Planungssicherheit. **4 · Verständliche Langbeschreibung:** Geben Sie an, wie verlässlich die Datei langfristig erreichbar bleibt — dauerhaft, nur vorübergehend oder experimentell. Das hilft anderen einzuschätzen, ob sie sich auf den Link verlassen können. Beispiel: Dauerhaft verfügbar. @@ -341,7 +341,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wo finde ich mehr Informationen zu diesem Projekt? -**3 · DCAT-AP-Langbeschreibung:** `dcat:landingPage` verweist auf eine menschenlesbare Webseite mit weiteren Informationen zum Datensatz (Range `foaf:Document`, Kardinalität 0..n). Anders als `dcat:accessURL` führt sie nicht direkt zu den Daten, sondern zu Kontext, Dokumentation oder Projektbeschreibung. +**3 · DCAT-AP-Langbeschreibung:** `dcat:landingPage` verweist auf eine menschenlesbare Webseite mit weiteren Informationen zum Datensatz (Range `foaf:Document`, Multiplizität 0..n). Anders als `dcat:accessURL` führt sie nicht direkt zu den Daten, sondern zu Kontext, Dokumentation oder Projektbeschreibung. **4 · Verständliche Langbeschreibung:** Verlinken Sie eine Webseite, auf der man mehr über die Daten oder das Projekt erfährt — etwa eine Projekt- oder Dokumentationsseite. Das ist nicht der direkte Download, sondern die „Über uns"-Seite zu den Daten. Beispiel: https://beispiel.de/projekt. @@ -358,7 +358,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wann wurden diese Daten zum ersten Mal veröffentlicht? -**3 · DCAT-AP-Langbeschreibung:** `dct:issued` ist das Datum der formalen Erstveröffentlichung des Datensatzes, typisiert als `xsd:date` bzw. `xsd:dateTime`. Kardinalität 0..1. Nicht zu verwechseln mit `dct:modified` (letzte Änderung) oder dem Erhebungszeitraum (`dct:temporal`). +**3 · DCAT-AP-Langbeschreibung:** `dct:issued` ist das Datum der formalen Erstveröffentlichung des Datensatzes, typisiert als `xsd:date` bzw. `xsd:dateTime`. Multiplizität 0..1. Nicht zu verwechseln mit `dct:modified` (letzte Änderung) oder dem Erhebungszeitraum (`dct:temporal`). **4 · Verständliche Langbeschreibung:** Geben Sie das Datum an, an dem die Daten erstmals veröffentlicht wurden. Das ist der „Geburtstag" des Datensatzes, nicht der Zeitraum, den die Daten abdecken. Beispiel: 2024-01-15. @@ -375,7 +375,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wann wurden diese Daten zuletzt aktualisiert? -**3 · DCAT-AP-Langbeschreibung:** `dct:modified` gibt das Datum der letzten inhaltlichen Änderung des Datensatzes an (`xsd:date`/`xsd:dateTime`, Kardinalität 0..1). Das Plugin setzt diesen Wert bei jeder Speicherung automatisch; ein Eingabefeld gibt es bewusst nicht, da eine manuelle Angabe beim nächsten Speichern überschrieben würde. +**3 · DCAT-AP-Langbeschreibung:** `dct:modified` gibt das Datum der letzten inhaltlichen Änderung des Datensatzes an (`xsd:date`/`xsd:dateTime`, Multiplizität 0..1). Das Plugin setzt diesen Wert bei jeder Speicherung automatisch; ein Eingabefeld gibt es bewusst nicht, da eine manuelle Angabe beim nächsten Speichern überschrieben würde. **4 · Verständliche Langbeschreibung:** Das Datum der letzten Aktualisierung. Es wird beim Speichern automatisch gesetzt, sodass Nutzende immer sehen, wie aktuell die Daten sind — Sie müssen dafür nichts eintragen. Beispiel: 2026-04-22. @@ -392,7 +392,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie oft werden diese Daten aktualisiert? -**3 · DCAT-AP-Langbeschreibung:** `dct:accrualPeriodicity` gibt an, in welchem Rhythmus der Datensatz aktualisiert wird, referenziert über das EU-Vokabular „Frequency" (`http://publications.europa.eu/resource/authority/frequency/`, z. B. `DAILY`, `MONTHLY`, `ANNUAL`). Kardinalität 0..1. +**3 · DCAT-AP-Langbeschreibung:** `dct:accrualPeriodicity` gibt an, in welchem Rhythmus der Datensatz aktualisiert wird, referenziert über das EU-Vokabular „Frequency" (`http://publications.europa.eu/resource/authority/frequency/`, z. B. `DAILY`, `MONTHLY`, `ANNUAL`). Multiplizität 0..1. **4 · Verständliche Langbeschreibung:** Geben Sie an, wie regelmäßig neue Daten hinzukommen — täglich, monatlich, jährlich oder unregelmäßig. Nutzende wissen dann, wie oft sich ein erneuter Blick lohnt. Beispiel: Jährlich. @@ -409,9 +409,9 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Auf welcher Verwaltungsebene wurden diese Daten erhoben? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular (Bund, Land, Kreis, Kommune). Kardinalität 0..1. Ergänzt die konkrete Gebietsangabe. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular (Bund, Land, Kreis, Kommune). Multiplizität 0..1. Ergänzt die konkrete Gebietsangabe. -**4 · Verständliche Langbeschreibung:** Wählen Sie, auf welcher staatlichen Ebene die Daten angesiedelt sind — Bund, Land, Kreis oder Kommune. Das ordnet die Daten geografisch-administrativ ein. Beispiel: Kommune. +**4 · Verständliche Langbeschreibung:** Wählen Sie, auf welcher staatlichen Ebene die Daten angesiedelt sind — Bund, Land, Landkreis oder Gemeinde. Das ordnet die Daten geografisch-administrativ ein. Beispiel: Gemeinde. ### Auf welches amtliche Gebiet beziehen sich die Daten? @@ -426,7 +426,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Auf welches amtliche Gebiet beziehen sich die Daten? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:politicalGeocodingURI` (DCAT-AP.de) referenziert ein konkretes amtliches Gebiet über eine URI (z. B. amtlicher Regionalschlüssel/AGS als URI). Kardinalität 0..n. Ermöglicht die eindeutige, maschinenlesbare Verortung. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:politicalGeocodingURI` (DCAT-AP.de) referenziert ein konkretes amtliches Gebiet über eine URI (z. B. amtlicher Regionalschlüssel/AGS als URI). Multiplizität 0..n. Ermöglicht die eindeutige, maschinenlesbare Verortung. **4 · Verständliche Langbeschreibung:** Verlinken Sie das genaue amtliche Gebiet, auf das sich die Daten beziehen — als offizielle Kennung (z. B. Gemeindeschlüssel). Damit ist eindeutig, welche Region gemeint ist. Beispiel: die URI zum amtlichen Gemeindeschlüssel Ihrer Stadt. @@ -443,7 +443,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie lässt sich der räumliche Bezug in Worten beschreiben? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:geocodingDescription` (DCAT-AP.de) ist eine frei formulierte textuelle Beschreibung der räumlichen Abdeckung (`literal`/`literal-lang`). Kardinalität 0..n. Ergänzt die maschinenlesbaren Angaben `dct:spatial` und `dcatde:politicalGeocodingURI` um eine menschenlesbare Erläuterung. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:geocodingDescription` (DCAT-AP.de) ist eine frei formulierte textuelle Beschreibung der räumlichen Abdeckung (`literal`/`literal-lang`). Multiplizität 0..n. Ergänzt die maschinenlesbaren Angaben `dct:spatial` und `dcatde:politicalGeocodingURI` um eine menschenlesbare Erläuterung. **4 · Verständliche Langbeschreibung:** Beschreiben Sie den räumlichen Bezug zusätzlich in Worten — etwa wenn ein Gebietsschlüssel allein nicht genau genug ist. Das hilft Nutzenden, die Abdeckung einzuordnen. Beispiel: „Stadtgebiet Musterstadt ohne den Ortsteil X". @@ -460,7 +460,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welche geografische Region betreffen diese Daten? -**3 · DCAT-AP-Langbeschreibung:** `dct:spatial` beschreibt die räumliche Abdeckung des Datensatzes (Range `dct:Location`). Als Wert dient eine Gebiets-URI (z. B. GeoNames, EU-Continents) oder eine Freitext-Ortsangabe. Kardinalität 0..n. +**3 · DCAT-AP-Langbeschreibung:** `dct:spatial` beschreibt die räumliche Abdeckung des Datensatzes (Range `dct:Location`). Als Wert dient eine Gebiets-URI (z. B. GeoNames, EU-Continents) oder eine Freitext-Ortsangabe. Multiplizität 0..n. **4 · Verständliche Langbeschreibung:** Geben Sie an, welches geografische Gebiet die Daten abdecken — eine Stadt, ein Bundesland, ein Land oder eine Region. So finden Nutzende Daten zu ihrer Gegend. Beispiel: Musterstadt oder Bayern. @@ -477,7 +477,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Ab wann sind diese Daten gültig? -**3 · DCAT-AP-Langbeschreibung:** `dct:temporal` beschreibt den Zeitraum, den die Daten inhaltlich abdecken (Range `dct:PeriodOfTime`). Dieses Feld liefert die Startangabe (`dcat:startDate`) des Intervalls. Kardinalität 0..1. Nicht zu verwechseln mit `dct:issued` (Veröffentlichung). +**3 · DCAT-AP-Langbeschreibung:** `dct:temporal` beschreibt den Zeitraum, den die Daten inhaltlich abdecken (Range `dct:PeriodOfTime`). Dieses Feld liefert die Startangabe (`dcat:startDate`) des Intervalls. Multiplizität 0..1. Nicht zu verwechseln mit `dct:issued` (Veröffentlichung). **4 · Verständliche Langbeschreibung:** Der Beginn des Zeitraums, den die Daten inhaltlich beschreiben — also ab wann die erfassten Werte gelten. Das ist der abgedeckte Zeitraum, nicht das Veröffentlichungsdatum. Beispiel: 2020-01-01. @@ -494,7 +494,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Bis wann sind diese Daten gültig? -**3 · DCAT-AP-Langbeschreibung:** `dct:temporal` liefert hier die Endangabe (`dcat:endDate`) des abgedeckten Zeitintervalls (Range `dct:PeriodOfTime`). Kardinalität 0..1. Zusammen mit dem Startdatum ergibt sich der vollständige Abdeckungszeitraum. +**3 · DCAT-AP-Langbeschreibung:** `dct:temporal` liefert hier die Endangabe (`dcat:endDate`) des abgedeckten Zeitintervalls (Range `dct:PeriodOfTime`). Multiplizität 0..1. Zusammen mit dem Startdatum ergibt sich der vollständige Abdeckungszeitraum. **4 · Verständliche Langbeschreibung:** Das Ende des Zeitraums, den die Daten abdecken — bis wann die erfassten Werte reichen. Bleibt das Feld leer, gilt der Zeitraum als offen (bis heute fortlaufend). Beispiel: 2025-12-31. @@ -511,7 +511,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wer ist Ansprechperson für Fragen zu diesen Daten? -**3 · DCAT-AP-Langbeschreibung:** Teil des `dcat:contactPoint` (Range `vcard:Kind`): `vcard:fn` benennt die Kontaktstelle oder -person für Rückfragen zum Datensatz. Kardinalität des Kontaktpunkts 0..n. Name, E-Mail und URL bilden zusammen einen Kontaktpunkt. +**3 · DCAT-AP-Langbeschreibung:** Teil des `dcat:contactPoint` (Range `vcard:Kind`): `vcard:fn` benennt die Kontaktstelle oder -person für Rückfragen zum Datensatz. Multiplizität des Kontaktpunkts 0..n. Name, E-Mail und URL bilden zusammen einen Kontaktpunkt. **4 · Verständliche Langbeschreibung:** Nennen Sie, an wen sich Nutzende bei Fragen wenden können — eine Person oder eine Abteilung. So ist klar, wer für die Daten zuständig ist. Beispiel: Open-Data-Team der Stadt Musterstadt. @@ -528,7 +528,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Unter welcher E-Mail-Adresse kann ich Fragen stellen? -**3 · DCAT-AP-Langbeschreibung:** Teil des `dcat:contactPoint`: `vcard:hasEmail` liefert die E-Mail-Adresse der Kontaktstelle (als `mailto:`-URI serialisiert). Kardinalität 0..1 je Kontaktpunkt. +**3 · DCAT-AP-Langbeschreibung:** Teil des `dcat:contactPoint`: `vcard:hasEmail` liefert die E-Mail-Adresse der Kontaktstelle (als `mailto:`-URI serialisiert). Multiplizität 0..1 je Kontaktpunkt. **4 · Verständliche Langbeschreibung:** Die E-Mail-Adresse, unter der man Fragen zu den Daten stellen kann. Das ist der einfachste Weg für Nachnutzende, Sie zu erreichen. Beispiel: opendata@musterstadt.de. @@ -545,7 +545,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Auf welcher Website finde ich weitere Kontaktinformationen? -**3 · DCAT-AP-Langbeschreibung:** Teil des `dcat:contactPoint`: `vcard:hasURL` verweist auf eine Webseite mit weiteren Kontaktinformationen der zuständigen Stelle. Kardinalität 0..1 je Kontaktpunkt. +**3 · DCAT-AP-Langbeschreibung:** Teil des `dcat:contactPoint`: `vcard:hasURL` verweist auf eine Webseite mit weiteren Kontaktinformationen der zuständigen Stelle. Multiplizität 0..1 je Kontaktpunkt. **4 · Verständliche Langbeschreibung:** Verlinken Sie optional eine Kontakt- oder Impressumsseite mit weiteren Wegen, Sie zu erreichen. Ergänzt E-Mail und Name um eine Anlaufstelle im Web. Beispiel: https://musterstadt.de/kontakt. @@ -562,7 +562,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welche Stelle stellt diese Daten im GovData-Verbund bereit? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:contributorID` (DCAT-AP.de) ist die offizielle Kennung der im GovData-Verbund bereitstellenden Stelle, referenziert über das gebündelte Contributors-Vokabular. Kardinalität 0..n. Dient der Zuordnung im nationalen Metadatenverbund. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:contributorID` (DCAT-AP.de) ist die offizielle Kennung der im GovData-Verbund bereitstellenden Stelle, referenziert über das gebündelte Contributors-Vokabular. Multiplizität 0..n. Dient der Zuordnung im nationalen Metadatenverbund. **4 · Verständliche Langbeschreibung:** Nur für Stellen, die im deutschen GovData-Verbund veröffentlichen: Wählen Sie Ihre Stelle aus der Liste; die zugehörige offizielle Kennung wird automatisch verwendet. Für die meisten Nutzenden ist dieses Feld nicht relevant. Beispiel: Bundesministerium des Innern. @@ -579,7 +579,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wer hat diese Daten ursprünglich erstellt? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:originator` (DCAT-AP.de) benennt die Stelle, von der die Daten ursprünglich stammen (Range `foaf:Agent`). Kann von Herausgeber (`dct:publisher`) und Ersteller (`dct:creator`) abweichen. Kardinalität 0..n. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:originator` (DCAT-AP.de) benennt die Stelle, von der die Daten ursprünglich stammen (Range `foaf:Agent`). Kann von Herausgeber (`dct:publisher`) und Ersteller (`dct:creator`) abweichen. Multiplizität 0..n. **4 · Verständliche Langbeschreibung:** Nennen Sie die Stelle, von der die Daten ursprünglich stammen — das kann eine andere sein als die, die sie jetzt veröffentlicht. So bleibt die Herkunft nachvollziehbar. Beispiel: Statistisches Landesamt. @@ -596,7 +596,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie lautet die E-Mail-Adresse des Urhebers? -**3 · DCAT-AP-Langbeschreibung:** Ergänzt `dcatde:originator` um eine E-Mail-Adresse des ursprünglichen Urhebers (als `mailto:`-URI). Optional, Kardinalität 0..1. +**3 · DCAT-AP-Langbeschreibung:** Ergänzt `dcatde:originator` um eine E-Mail-Adresse des ursprünglichen Urhebers (als `mailto:`-URI). Optional, Multiplizität 0..1. **4 · Verständliche Langbeschreibung:** Optional die E-Mail-Adresse der ursprünglichen Urheber-Stelle, falls abweichend erreichbar. Beispiel: statistik@landesamt.de. @@ -613,7 +613,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wer pflegt diese Daten laufend? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:maintainer` (DCAT-AP.de) benennt die für die laufende Pflege und Aktualisierung zuständige Stelle (Range `foaf:Agent`). Kardinalität 0..n. Kann von Herausgeber und Urheber abweichen. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:maintainer` (DCAT-AP.de) benennt die für die laufende Pflege und Aktualisierung zuständige Stelle (Range `foaf:Agent`). Multiplizität 0..n. Kann von Herausgeber und Urheber abweichen. **4 · Verständliche Langbeschreibung:** Nennen Sie, wer die Daten laufend betreut und aktuell hält. Das ist die Stelle, die sich um Updates kümmert — nicht unbedingt die, die sie erstellt hat. Beispiel: Open-Data-Team. @@ -630,7 +630,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie lautet die E-Mail-Adresse der pflegenden Stelle? -**3 · DCAT-AP-Langbeschreibung:** Ergänzt `dcatde:maintainer` um eine E-Mail-Adresse der pflegenden Stelle (als `mailto:`-URI). Optional, Kardinalität 0..1. +**3 · DCAT-AP-Langbeschreibung:** Ergänzt `dcatde:maintainer` um eine E-Mail-Adresse der pflegenden Stelle (als `mailto:`-URI). Optional, Multiplizität 0..1. **4 · Verständliche Langbeschreibung:** Optional die E-Mail-Adresse der Stelle, die die Daten pflegt. Beispiel: opendata@beispiel.de. @@ -647,7 +647,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Auf welcher rechtlichen Grundlage werden die Daten bereitgestellt? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:legalBasis` (DCAT-AP.de) nennt das Gesetz oder die Verordnung, die die Bereitstellung der Daten regelt (Freitext, `literal`). Kardinalität 0..n. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:legalBasis` (DCAT-AP.de) nennt das Gesetz oder die Verordnung, die die Bereitstellung der Daten regelt (Freitext, `literal`). Multiplizität 0..n. **4 · Verständliche Langbeschreibung:** Falls es eine gesetzliche Grundlage für die Veröffentlichung gibt, nennen Sie sie hier. Das schafft Transparenz über die rechtliche Verpflichtung oder Erlaubnis. Beispiel: § 12a EGovG (E-Government-Gesetz). @@ -664,7 +664,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wo ist das Qualitätssicherungs-Verfahren dokumentiert? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:qualityProcessURI` (DCAT-AP.de) verweist per URI auf eine Beschreibung des Qualitätssicherungs-Prozesses des Datensatzes. Kardinalität 0..1. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:qualityProcessURI` (DCAT-AP.de) verweist per URI auf eine Beschreibung des Qualitätssicherungs-Prozesses des Datensatzes. Multiplizität 0..1. **4 · Verständliche Langbeschreibung:** Verlinken Sie optional eine Seite, die beschreibt, wie Sie die Qualität der Daten sichern (z. B. Prüfschritte). Das stärkt das Vertrauen in Ihre Daten. Beispiel: https://beispiel.de/qualitaetssicherung. @@ -681,7 +681,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wer darf auf diese Daten zugreifen? -**3 · DCAT-AP-Langbeschreibung:** `dct:accessRights` klassifiziert den Zugriffsstatus über das EU-Vokabular „Access Right" (`PUBLIC`, `RESTRICTED`, `NON_PUBLIC`). Kardinalität 0..1. Relevant für die MQA-Dimension Wiederverwendbarkeit. +**3 · DCAT-AP-Langbeschreibung:** `dct:accessRights` klassifiziert den Zugriffsstatus über das EU-Vokabular „Access Right" (`PUBLIC`, `RESTRICTED`, `NON_PUBLIC`). Multiplizität 0..1. Relevant für die MQA-Dimension Wiederverwendbarkeit. **4 · Verständliche Langbeschreibung:** Geben Sie an, ob die Daten für alle offen (öffentlich), nur eingeschränkt oder gar nicht öffentlich zugänglich sind. Für offene Daten ist das in der Regel „öffentlich". Beispiel: Öffentlich. @@ -698,7 +698,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welches weitere EU-Thema möchten Sie ergänzen? -**3 · DCAT-AP-Langbeschreibung:** Zusätzliches `dcat:theme` als direkte EU-Themen-URI (`http://publications.europa.eu/resource/authority/data-theme/…`). Ergänzt die Themen-Auswahl aus Tab 1 um weitere Themen. Kardinalität 0..n. +**3 · DCAT-AP-Langbeschreibung:** Zusätzliches `dcat:theme` als direkte EU-Themen-URI (`http://publications.europa.eu/resource/authority/data-theme/…`). Ergänzt die Themen-Auswahl aus Tab 1 um weitere Themen. Multiplizität 0..n. **4 · Verständliche Langbeschreibung:** Falls Ihr Datensatz zu mehr als einem Thema passt, ergänzen Sie hier ein weiteres EU-Thema aus der Vorschlagsliste. Das erhöht die Auffindbarkeit über mehrere Themenfilter. Beispiel: Umwelt zusätzlich zu Gesundheit. @@ -732,7 +732,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welcher HVD-Kategorie gehört dieser Datensatz an? -**3 · DCAT-AP-Langbeschreibung:** `dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Kardinalität 0..n. +**3 · DCAT-AP-Langbeschreibung:** `dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Multiplizität 0..n. Hinweis: Die Eigenschaft stammt aus der HVD-Erweiterung zu DCAT-AP (EU-Durchführungsverordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0; die mitgelieferten Kern-Shapes prüfen sie deshalb nicht. **4 · Verständliche Langbeschreibung:** Wenn es ein hochwertiger Datensatz ist, wählen Sie hier die passende der sechs EU-HVD-Kategorien. Damit ordnen Sie den Datensatz korrekt in das EU-Schema ein. Beispiel: Georaum, Mobilität, Statistik. @@ -749,7 +749,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welche eindeutige Kennung hat dieser Datensatz? -**3 · DCAT-AP-Langbeschreibung:** `dct:identifier` ist eine eindeutige, im System der Herausgeberin vergebene Kennung des Datensatzes (Freitext/`literal`). Kardinalität 0..n. Ermöglicht die stabile Referenzierung über Systemgrenzen hinweg. +**3 · DCAT-AP-Langbeschreibung:** `dct:identifier` ist eine eindeutige, im System der Herausgeberin vergebene Kennung des Datensatzes (Freitext/`literal`). Multiplizität 0..n. Ermöglicht die stabile Referenzierung über Systemgrenzen hinweg. **4 · Verständliche Langbeschreibung:** Falls Ihr Datensatz eine feste Kennnummer aus Ihrem eigenen System hat, tragen Sie sie hier ein. So bleibt der Datensatz eindeutig identifizierbar. Beispiel: DS-2026-00042. @@ -766,7 +766,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Um welchen Typ von Datensatz handelt es sich? -**3 · DCAT-AP-Langbeschreibung:** `dct:type` klassifiziert die Art des Datensatzes, idealerweise über das EU-Vokabular „Dataset Type". Kardinalität 0..1. Unterscheidet z. B. Erhebungsdaten, Registerdaten oder Geodaten. +**3 · DCAT-AP-Langbeschreibung:** `dct:type` klassifiziert die Art des Datensatzes, idealerweise über das EU-Vokabular „Dataset Type". Multiplizität 0..1. Unterscheidet z. B. Erhebungsdaten, Registerdaten oder Geodaten. **4 · Verständliche Langbeschreibung:** Geben Sie an, um welche Art von Datensatz es sich grundsätzlich handelt. Das hilft bei der groben Einordnung. Beispiel: Statistische Erhebung, Geodaten. @@ -783,7 +783,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wer hat diese Daten erstellt? -**3 · DCAT-AP-Langbeschreibung:** `dct:creator` benennt die primär für die Erstellung des Datensatzes verantwortliche Stelle oder Person (Range `foaf:Agent`). Kardinalität 0..n. Unterscheidet sich vom Herausgeber (`dct:publisher`), der für die Bereitstellung verantwortlich ist. +**3 · DCAT-AP-Langbeschreibung:** `dct:creator` benennt die primär für die Erstellung des Datensatzes verantwortliche Stelle oder Person (Range `foaf:Agent`). Multiplizität 0..n. Unterscheidet sich vom Herausgeber (`dct:publisher`), der für die Bereitstellung verantwortlich ist. **4 · Verständliche Langbeschreibung:** Nennen Sie, wer die Daten inhaltlich erstellt hat — die Person oder Stelle, die die eigentliche Arbeit gemacht hat. Das kann von der herausgebenden Organisation abweichen. Beispiel: Forschungsgruppe Stadtklima. @@ -800,7 +800,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie lautet die E-Mail-Adresse des Erstellers? -**3 · DCAT-AP-Langbeschreibung:** Ergänzt `dct:creator` um eine E-Mail-Adresse der erstellenden Stelle (als `mailto:`-URI). Optional, Kardinalität 0..1. +**3 · DCAT-AP-Langbeschreibung:** Ergänzt `dct:creator` um eine E-Mail-Adresse der erstellenden Stelle (als `mailto:`-URI). Optional, Multiplizität 0..1. **4 · Verständliche Langbeschreibung:** Optional die E-Mail-Adresse der erstellenden Person oder Stelle. Beispiel: forschung@beispiel.de. @@ -817,7 +817,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welche Version hat dieser Datensatz? -**3 · DCAT-AP-Langbeschreibung:** `owl:versionInfo` gibt die Versionsbezeichnung des Datensatzes als Freitext an (`literal`). Kardinalität 0..1. Erlaubt die Unterscheidung aufeinanderfolgender Ausgaben desselben Datensatzes. +**3 · DCAT-AP-Langbeschreibung:** `owl:versionInfo` gibt die Versionsbezeichnung des Datensatzes als Freitext an (`literal`). Multiplizität 0..1. Erlaubt die Unterscheidung aufeinanderfolgender Ausgaben desselben Datensatzes. **4 · Verständliche Langbeschreibung:** Falls es mehrere Ausgaben Ihrer Daten gibt, tragen Sie die Versionsnummer ein. So wissen Nutzende, welche Fassung sie vor sich haben. Beispiel: 2.0. @@ -834,7 +834,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Was hat sich in dieser Version geändert? -**3 · DCAT-AP-Langbeschreibung:** `adms:versionNotes` beschreibt die Änderungen gegenüber der Vorversion als sprachlich getaggten Freitext (`literal-lang`). Kardinalität 0..n. Ergänzt `owl:versionInfo` um den inhaltlichen Änderungsverlauf. +**3 · DCAT-AP-Langbeschreibung:** `adms:versionNotes` beschreibt die Änderungen gegenüber der Vorversion als sprachlich getaggten Freitext (`literal-lang`). Multiplizität 0..n. Ergänzt `owl:versionInfo` um den inhaltlichen Änderungsverlauf. **4 · Verständliche Langbeschreibung:** Beschreiben Sie kurz, was sich gegenüber der letzten Version geändert hat — wie ein Änderungsprotokoll. Nutzende sehen so, ob sich ein erneuter Download lohnt. Beispiel: „Daten für 2025 ergänzt, Tippfehler korrigiert." @@ -851,7 +851,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welche räumliche Auflösung haben die Daten (in Metern)? -**3 · DCAT-AP-Langbeschreibung:** `dcat:spatialResolutionInMeters` gibt die kleinste räumlich unterscheidbare Einheit in Metern an (`xsd:decimal`). Kardinalität 0..n. Relevant vor allem für Geodaten und Rasterdaten. +**3 · DCAT-AP-Langbeschreibung:** `dcat:spatialResolutionInMeters` gibt die kleinste räumlich unterscheidbare Einheit in Metern an (`xsd:decimal`). Multiplizität 0..n. Relevant vor allem für Geodaten und Rasterdaten. **4 · Verständliche Langbeschreibung:** Bei Geodaten: Geben Sie an, wie fein die Daten räumlich aufgelöst sind — der kleinste unterscheidbare Abstand in Metern. Ein kleiner Wert bedeutet detailliertere Daten. Beispiel: 10 (Raster von 10 Metern). @@ -868,7 +868,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welche zeitliche Auflösung haben die Daten? -**3 · DCAT-AP-Langbeschreibung:** `dcat:temporalResolution` gibt die kleinste zeitlich unterscheidbare Einheit als ISO-8601-Dauer an (`xsd:duration`). Kardinalität 0..1. Beschreibt z. B. den Messabstand einer Zeitreihe. +**3 · DCAT-AP-Langbeschreibung:** `dcat:temporalResolution` gibt die kleinste zeitlich unterscheidbare Einheit als ISO-8601-Dauer an (`xsd:duration`). Multiplizität 0..1. Beschreibt z. B. den Messabstand einer Zeitreihe. **4 · Verständliche Langbeschreibung:** Bei Zeitreihen: Geben Sie an, in welchem zeitlichen Abstand die Werte erfasst sind — z. B. stündlich, täglich, monatlich. Format ist die ISO-8601-Dauer. Beispiel: P1D (ein Tag) oder PT1H (eine Stunde). @@ -885,7 +885,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welchem Standard oder Schema entsprechen die Daten? -**3 · DCAT-AP-Langbeschreibung:** `dct:conformsTo` verweist auf einen implementierten Standard, ein Anwendungsprofil oder ein Schema, dem die Daten entsprechen (Range `dct:Standard`, per URI oder Bezeichnung). Kardinalität 0..n. +**3 · DCAT-AP-Langbeschreibung:** `dct:conformsTo` verweist auf einen implementierten Standard, ein Anwendungsprofil oder ein Schema, dem die Daten entsprechen (Range `dct:Standard`, per URI oder Bezeichnung). Multiplizität 0..n. **4 · Verständliche Langbeschreibung:** Falls Ihre Daten einem bestimmten Standard oder Schema folgen, nennen Sie ihn hier. So können Systeme die Daten korrekt interpretieren. Beispiel: INSPIRE, XÖV oder ein fachliches Datenschema. @@ -902,7 +902,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Woher stammen die Daten und wie sind sie entstanden? -**3 · DCAT-AP-Langbeschreibung:** `dct:provenance` beschreibt die Herkunft und Entstehungsgeschichte des Datensatzes (Range `dct:ProvenanceStatement`, Freitext). Kardinalität 0..n. Dokumentiert Erhebungs- und Verarbeitungsschritte. +**3 · DCAT-AP-Langbeschreibung:** `dct:provenance` beschreibt die Herkunft und Entstehungsgeschichte des Datensatzes (Range `dct:ProvenanceStatement`, Freitext). Multiplizität 0..n. Dokumentiert Erhebungs- und Verarbeitungsschritte. **4 · Verständliche Langbeschreibung:** Beschreiben Sie, woher die Daten kommen und wie sie entstanden sind — z. B. aus welcher Erhebung oder welchem Verfahren. Das macht die Daten nachvollziehbar und vertrauenswürdig. Beispiel: „Erhoben im Rahmen der Bürgerbefragung 2025, anonymisiert aufbereitet." @@ -919,7 +919,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie heißt die bereitgestellte Datei/Distribution? -**3 · DCAT-AP-Langbeschreibung:** `dct:title` auf Ebene der Distribution benennt die konkrete bereitgestellte Ressource (`literal-lang`). Kardinalität 0..n. Nützlich, wenn der Distributionsname vom Datensatztitel abweicht. +**3 · DCAT-AP-Langbeschreibung:** `dct:title` auf Ebene der Distribution benennt die konkrete bereitgestellte Ressource (`literal-lang`). Multiplizität 0..n. Nützlich, wenn der Distributionsname vom Datensatztitel abweicht. **4 · Verständliche Langbeschreibung:** Geben Sie der bereitgestellten Datei einen eigenen Namen, falls er sich vom Titel des Datensatzes unterscheidet. Beispiel: „Rohdaten CSV 2025". @@ -936,7 +936,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie lässt sich die Distribution beschreiben? -**3 · DCAT-AP-Langbeschreibung:** `dct:description` auf Distributionsebene beschreibt die konkrete Datei/Ressource (`literal-lang`). Kardinalität 0..n. Ergänzt die Datensatzbeschreibung um distributionsspezifische Hinweise (z. B. Spaltenaufbau). +**3 · DCAT-AP-Langbeschreibung:** `dct:description` auf Distributionsebene beschreibt die konkrete Datei/Ressource (`literal-lang`). Multiplizität 0..n. Ergänzt die Datensatzbeschreibung um distributionsspezifische Hinweise (z. B. Spaltenaufbau). **4 · Verständliche Langbeschreibung:** Beschreiben Sie die konkrete Datei näher — etwa welche Spalten sie enthält oder wie sie aufgebaut ist. Das hilft beim direkten Umgang mit der Datei. Beispiel: „Spalten: Jahr, Stadt, Einwohner; Trennzeichen Semikolon." @@ -953,7 +953,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wie lautet der direkte Download-Link zur Datei? -**3 · DCAT-AP-Langbeschreibung:** `dcat:downloadURL` verweist auf eine direkt herunterladbare Datei (Range `rdfs:Resource`). Anders als `dcat:accessURL` garantiert sie einen unmittelbaren Download derselben Ressource. Kardinalität 0..n. Relevant für die MQA-Dimension Zugänglichkeit. +**3 · DCAT-AP-Langbeschreibung:** `dcat:downloadURL` verweist auf eine direkt herunterladbare Datei (Range `rdfs:Resource`). Anders als `dcat:accessURL` garantiert sie einen unmittelbaren Download derselben Ressource. Multiplizität 0..n. Relevant für die MQA-Dimension Zugänglichkeit. **4 · Verständliche Langbeschreibung:** Falls es einen direkten Link gibt, der die Datei sofort herunterlädt (ohne Umweg über eine Seite), tragen Sie ihn hier ein. Das ist der bequemste Weg für Nachnutzende. Beispiel: https://beispiel.de/daten/statistik.csv. @@ -970,7 +970,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welchen Medientyp (MIME) hat die Datei? -**3 · DCAT-AP-Langbeschreibung:** `dcat:mediaType` gibt den Medientyp der Distribution als IANA-Media-Type an (z. B. `text/csv`, `application/json`), referenziert über das IANA-Media-Types-Register. Kardinalität 0..1. Ergänzt `dct:format` um den technischen MIME-Typ. +**3 · DCAT-AP-Langbeschreibung:** `dcat:mediaType` gibt den Medientyp der Distribution als IANA-Media-Type an (z. B. `text/csv`, `application/json`), referenziert über das IANA-Media-Types-Register. Multiplizität 0..1. Ergänzt `dct:format` um den technischen MIME-Typ. **4 · Verständliche Langbeschreibung:** Der technische Medientyp der Datei (MIME-Typ) — die maschinenlesbare Entsprechung zum Format. Systeme erkennen daran, wie sie die Datei behandeln müssen. Beispiel: text/csv, application/json. @@ -987,7 +987,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welche Nutzungsrechte gelten für die Datei? -**3 · DCAT-AP-Langbeschreibung:** `dct:rights` beschreibt rechtliche Hinweise zur Distribution jenseits der Lizenz — etwa Urheberrechts- oder Zugriffsvermerke (Range `dct:RightsStatement`, Freitext oder URI). Kardinalität 0..1. +**3 · DCAT-AP-Langbeschreibung:** `dct:rights` beschreibt rechtliche Hinweise zur Distribution jenseits der Lizenz — etwa Urheberrechts- oder Zugriffsvermerke (Range `dct:RightsStatement`, Freitext oder URI). Multiplizität 0..1. **4 · Verständliche Langbeschreibung:** Ergänzende rechtliche Hinweise zur Datei, die über die Lizenz hinausgehen — z. B. Urheberrechtsvermerke. Für viele offene Datensätze bleibt das leer. Beispiel: „© Stadt Musterstadt 2026". diff --git a/includes/class-admin.php b/includes/class-admin.php index 354629bc..20d5cd25 100644 --- a/includes/class-admin.php +++ b/includes/class-admin.php @@ -419,8 +419,8 @@ public static function enqueue_assets( string $hook ): void { ), 'required' => array( 'star' => '*', - 'starTitle' => __( 'Pflichtfeld zum Veröffentlichen', 'open-data-wizard' ), - 'legend' => __( '* Pflichtfeld zum Veröffentlichen. Als Entwurf können Sie jederzeit unvollständig speichern.', 'open-data-wizard' ), + 'starTitle' => __( 'Pflichtfeld für die Veröffentlichung', 'open-data-wizard' ), + 'legend' => __( '* Pflichtfeld für die Veröffentlichung. Als Entwurf können Sie den Datensatz jederzeit speichern.', 'open-data-wizard' ), 'keys' => array( '_odw_publisher', '_odw_description', '_odw_license' ), ), 'livePreview' => array( diff --git a/includes/class-fields.php b/includes/class-fields.php index adc96e3c..d7fe3fdb 100644 --- a/includes/class-fields.php +++ b/includes/class-fields.php @@ -85,7 +85,7 @@ private static function register_required_fields(): void { Field::make( 'select', 'odw_theme', __( 'Welchem Thema ist dieser Datensatz zugeordnet?', 'open-data-wizard' ) ) ->add_options( self::get_theme_options() ) - ->set_help_text( __( 'THEMA (dcat:theme)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur', 'open-data-wizard' ) ), + ->set_help_text( __( 'THEMA (dcat:theme)', 'open-data-wizard' ) ), // Schlagworte gehören zur inhaltlichen Erschließung und stehen // deshalb bei Thema, CESSDA und Engagementfeld statt bei Sprache @@ -137,7 +137,7 @@ private static function register_required_fields(): void { Field::make( 'select', 'odw_language', __( 'In welcher Sprache sind die Daten?', 'open-data-wizard' ) ) ->set_default_value( class_exists( 'ODW_Settings' ) ? (string) ODW_Settings::get( 'default_language' ) : '' ) ->add_options( self::get_language_options() ) - ->set_help_text( __( 'SPRACHE (dct:language)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: Deutsch, Englisch', 'open-data-wizard' ) ), + ->set_help_text( __( 'SPRACHE (dct:language)', 'open-data-wizard' ) ), Field::make( 'html', 'odw_hint_translations' ) ->set_html( '

' . esc_html__( 'Übersetzungen (optional)', 'open-data-wizard' ) . '

' . esc_html__( 'Titel, Beschreibung und Schlagworte zusätzlich in weiteren Sprachen — für mehrsprachige, DCAT-AP-konforme Metadaten. Die Angaben in Tab 1 bleiben die Hauptsprache.', 'open-data-wizard' ) . '

' ), @@ -235,7 +235,7 @@ static function (): string { Field::make( 'select', 'odw_format', __( 'In welchem Format ist die Datei?', 'open-data-wizard' ) ) ->add_options( self::get_format_options() ) - ->set_help_text( __( 'FORMAT (dct:format)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: CSV, JSON, PDF', 'open-data-wizard' ) ), + ->set_help_text( __( 'FORMAT (dct:format)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_byte_size', __( 'Dateigröße (Bytes)', 'open-data-wizard' ) ) ->set_attribute( 'type', 'number' ) @@ -247,7 +247,7 @@ static function (): string { ->set_attribute( 'data-odw-required', '1' ) ->set_default_value( class_exists( 'ODW_Settings' ) ? (string) ODW_Settings::get( 'default_license' ) : '' ) ->add_options( self::get_license_options() ) - ->set_help_text( __( 'LIZENZ (dct:license)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: CC0 1.0, CC-BY 4.0 – Diese bestimmt, wie andere die Daten nutzen dürfen.', 'open-data-wizard' ) ), + ->set_help_text( __( 'LIZENZ (dct:license)', 'open-data-wizard' ) . "\n\n" . __( 'Diese bestimmt, wie andere die Daten nutzen dürfen.', 'open-data-wizard' ) ), Field::make( 'html', 'odw_license_info' ) ->set_html( '' ), @@ -287,7 +287,7 @@ static function (): string { Field::make( 'select', 'odw_availability', __( 'Wie verlässlich bleibt diese Datei abrufbar?', 'open-data-wizard' ) ) ->add_options( self::get_availability_options() ) - ->set_help_text( __( 'PLANBARE VERFÜGBARKEIT (dcatap:availability)', 'open-data-wizard' ) . "\n\n" . __( 'Wie verlässlich/dauerhaft ist der Zugriff auf diese Datei geplant? Beispiel: Stabil, Verfügbar, Temporär', 'open-data-wizard' ) ), + ->set_help_text( __( 'PLANBARE VERFÜGBARKEIT (dcatap:availability)', 'open-data-wizard' ) . "\n\n" . __( 'Wie verlässlich/dauerhaft ist der Zugriff auf diese Datei geplant?', 'open-data-wizard' ) ), Field::make( 'complex', 'odw_extra_distributions', __( 'Weitere Distributionen', 'open-data-wizard' ) ) ->set_help_text( __( 'MEHRERE DISTRIBUTIONEN (dcat:distribution)', 'open-data-wizard' ) . "\n\n" . __( 'Optional: zusätzliche Zugänge zu diesem Datensatz — z. B. dieselben Daten in einem weiteren Format oder unter einer anderen URL. Die oben angegebene Datei bleibt die primäre Distribution.', 'open-data-wizard' ) ) @@ -387,14 +387,14 @@ static function (): string { Field::make( 'select', 'odw_accrual_periodicity', __( 'Wie oft werden diese Daten aktualisiert?', 'open-data-wizard' ) ) ->add_options( self::get_periodicity_options() ) - ->set_help_text( __( 'AKTUALISIERUNGSFREQUENZ (dct:accrualPeriodicity)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: Täglich, Monatlich, Jährlich, Unregelmäßig', 'open-data-wizard' ) ), + ->set_help_text( __( 'AKTUALISIERUNGSFREQUENZ (dct:accrualPeriodicity)', 'open-data-wizard' ) ), Field::make( 'html', 'odw_ext_hint_coverage' ) ->set_html( '

' . esc_html__( 'Abdeckung', 'open-data-wizard' ) . '

' ), Field::make( 'select', 'odw_political_geocoding_level', __( 'Auf welcher Verwaltungsebene wurden diese Daten erhoben?', 'open-data-wizard' ) ) ->add_options( self::get_political_geocoding_level_options() ) - ->set_help_text( __( 'VERWALTUNGSEBENE (dcatde:politicalGeocodingLevelURI)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: Gemeinde, Landkreis, Land, Bund', 'open-data-wizard' ) ), + ->set_help_text( __( 'VERWALTUNGSEBENE (dcatde:politicalGeocodingLevelURI)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_political_geocoding_uri', __( 'Auf welches amtliche Gebiet beziehen sich die Daten?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'url' ) @@ -542,7 +542,7 @@ static function (): string { Field::make( 'select', 'odw_hvd_category', __( 'Welcher HVD-Kategorie gehört dieser Datensatz an?', 'open-data-wizard' ) ) ->add_options( self::get_hvd_category_options() ) - ->set_help_text( __( 'HVD-KATEGORIE (dcatap:hvdCategory)', 'open-data-wizard' ) . "\n\n" . __( 'Eine der sechs EU-Themenkategorien. Beispiel: Georaum, Meteorologie, Mobilität', 'open-data-wizard' ) ) + ->set_help_text( __( 'HVD-KATEGORIE (dcatap:hvdCategory)', 'open-data-wizard' ) . "\n\n" . __( 'Eine der sechs EU-Themenkategorien.', 'open-data-wizard' ) ) ->set_conditional_logic( array( array( diff --git a/languages/open-data-wizard-en_US.mo b/languages/open-data-wizard-en_US.mo index ab7ea123cba7a6c40a8aac9437e8daf7706f24a0..9b072c1577660d7335072978d9791b405d8f519e 100644 GIT binary patch delta 10436 zcmaLbd3a4%+sE;pG(sjKi6jz{BO-}RB{8cZD569WYATK7L_&lFL0Ubg(xQ)tG{#m@ zb2UYjQbkckwW_98Rp-{+8ahzJ^Zi--y59fZUcG$QT6^y`-0NQZoRe?nd90Z2;kppu zQEu^HiMwUh!DE4{{oj8t#9CG=)yWu#TQCaG;Xu5PL$N;>N8`z^2&jam#9f1=t$bU$Q=i_#sL zhM*!d1*_mZREOpGByK@<^f$8oR#HpLB7Lm>sQaeb_2pQT`eD=p&tV{1t%!dR29ZhH z(}t+*?u5$r;aD60i|TMAYUPJ86o0X=KS13d+S;-LFb%bkOss`P=)hU1+**&?+QTji zZ7H0>r!nve^I#6@#;K^8uEZMn9>(CusE)6qCgR@4OfVeDN2@t%t8!2aEW$cC6SW0z zp(5-0fPw}%ibT=6fJ%-KW~JkljtX5LR7Xx!2uo3sS%Lnz3pK${Q5}C{U%!lcA9%Dg zD-K6ZAQp*~%W6kK5BA1)a2Tos|Mu)JMxq8ffgA7&7GQarWqpM1WT;kp5a;0ud>yko zT2?iDfHYZEI}s^2vLBC8&nAHibp9K4HgB*uun!mRBZ+MF>S9^E60Di{8*as}xRies zsh?0QtCMb$H5E0HzNiHaLq)0>lW{R>VV|JxJA-MAZ~a7}AvWk{_O>V1qh5mAv&E<_ zdJlO8SVvIz-^Eyre##_QchpvmLcO?L_-L;&p85x<)AlQ_LZ9y36HcLmf*v@EgYY_P zPrLE9sEUKo53^An7NJ7>3Tk2tQ2ngMQrwT4NSh4vd{5NMpTPvoML%4SLHxZate`;y zZA8_#qV{|@_Qx|=9Ut#$uD3-Uv#vXz&v#0NNJ!E=*8YoL``^FFSdyK z!d}E*D_z^$Okf9kQs0Z}@DOSxKVvffg-O_eMA3bHP$3h+*jcjM>`;_!#x4QSXIJ zyL|*IlI7SM-^D1rf{Ki*I@8dK>YyUg4K=_Z)Bw5YgHur}d=>TJ2ISpi?LckKZ4AK2 z2AGuvV{_`GQO~VIP3!<_oUbvM@vX}goHV!%G!q$)4(jEonQlkr#Mh_}enJg&2Q?Aj zL1ut3)M;pjVK@XE<0Nd2Z{r&L4M*UsgNc&P|34IT-g`W2_IeryQhyCK@Oli#t*9jZ z9JM89P!qUz%*3ncz_e@=iD9TyF$UG|1lzf&tyzh2cm%cJo7u#_K7|@NX3tVl zZ>kK8#7U^*vjmltM^GU>g`6ns8ur385=hs}PzzX&>UT40i%y}o=0{Yr{)MESRVCMD z-o-<6&Bt&79&saCa4U}IEusm;kuf^g{ZRwWLgmH+)ZV|2O>i4V<0Vw~S08C6&>5Aq zndpJTQO^~)DAcAf1GT5iQQ2F83i%Nv(XEgI6VhUAMtv5x$33Vw-b2jC^igJom3W)_ ze$<3^6mkUdJnHz(7;Qd7T;+CQFGg|U5=Nl!81ur3$0X`wZC4_FSjUk(wb~Z(Nr!LP zTE(0Q>e;vtdyeIsH2RM-Tk{M)O+6o(n9JHlK?8h;+H=40=7p1l%J!D%k7-yPdt(e{ zp&!1C4RIm*;yzRaKf_6Q5j}BOiOKqW)YdJ;0G;S1_&fTbXQ^oqKnL|C+YHnIqj4@yM6I+6FM&9$ftqLw)P%aDt1X406q@34RLD2c2H1nhLHDs~Yal77qx~b2?jQ4Y_fbNDq`=U zj^Q3uh(ERc5fzC$*c@YDd9-ksHIza;4X>akunlz@&Y(KDf)VIG+teMXy={(K*+A45 zmZB!U4mHuA@Nuj*$3(CNwxm7+b^mJA?@#Llg;W~6=9-nX!C2}A7>BQ63Vw*%+doht zZ1Sr46zh-usE@~+cnme+z5g-acE3eU)N3BUBe5ZBfx9q;@vY+&Mx#4dwSr-F%A97%@>lMsK|{+U0+g8{9`EW zqCqqJ0X4AyLX%9XsL(xu4jhbuI2lWDK5oQni_8Qou{!mASO<@zCU_NVVDMtoPYl+i z-eocI51=rB2HjAAckl)D!;&TDff?vUeGO{m@8V7rg?duP1y_T8<1Y&Kj*TE2M zhMHIgY9S+C6cQ;&UD$*^cm$uo)2N9BEHir?g`w2bP!k`B+L}?Qm6xIhdN+@!O4>;7L>nze8`lfttuYdW@)-brPH6eQbiME6l4i535lhjXK{Gu`0fSU2qNh z<2BSo9-t=Tv(ofDGo#KWi=9!GU_4YiWcwI*2_ z*tWFofn&Iyg#++QY>bKPOoWD@`k8LmD^UHP#AbK{T|ZKYTW@CSv%%aDf=aTc7={_B zbDNLJZv1pY?cwf?mbDX4pzfRVwt17TMTPhrX5t-GWHUAybFeD)(oMv_3WaGjC~IHF zI9!Da;isq-+{K32;2raE+!IwFiN08l4R94I2M*hQjhg6X)XE>)MpT#uwyq%l;ate1 zK{FnM%GPUlYv6OJ<2A-^pN2`)m!lURv#*~)MeZVM;_h2ae_>didJLvwQ%uHuROlC@ zBIjCR7v4clU>9noXHXNlWM98y>$%ko6o`6*C7_OFJJkJMZTs8iA-iWyL`|qcrTODi z6RfH8f0n{jE?mNAaO5`gcfJFt$c%c=vR=YTxCkGj23)k=tZW7TLj4qym)5Qw=I;qP zoZ35SRU&GIEm1jD*+aVIL7|G_A%x7*}SCuHT;P|5gK5d~%Mbd1IgcKvg#L;W@eV9gIrhta4c z>VfJw8}^ zp*miKp12VMaSO)c$EXNgv#;O9D%9Qfnft4vB3d0gVWWM-Uwb^B22Ert`r~YDipww@ zPheZTh8;2SBQww#yiI*FY9ht^&5zHSs09@tFxfr@HQ|@BF3v+OwBmrvB+(ukQfatp z-xzbytSAXXXzz>K%TcHmEJWS^J{I9sd>w~;Y`%K^ivy{rA2Ro^Mn&cjrr}BS##*jV z%-?Jr=t;v6)E+reZ@vlWfvZq6UWc)`0~ML?um%2$npl&=W}tqUKs_53(Rru=SD+U3 zHtId%IzXW|h0m}W{)Wx)57Z5@M@%j>Mjfa2*c_MOqpd*=a1E7|4^UeXbkzKPAPzN= zS*ZIfQCn~vy>$MsQ_yky2i1|^r)C9pQ5`0rk}wT5^C8#}OE3jj;2b=OgK_9F^YeN) z#!3lbkc?ZfBYuyO82zQ$icY8r_Cj?$ z02P_h7=yDg9xG50_!=Yd7HZFHo;25!Pz&pijj;42@mF@gO@lhzj5;2Nu?>2kGJDq* zYf|rnnwZmWe+dJq{}=u6E!45wg4NOYwCN`tGu@atj>U>IWLw!y)u zftK3WkD(&+EvmnJsATv56&c@(qo5Ajs{zx|fmwEa8Y*NVLWIc65c&@HvGRcnMQ5>LPC|?2C196>3ZNq6RvS+SBh*dum-W zTj7JDR0HryOu)`qgkAA{RD|6wn~4QoCjOo@q|&elTVWyI!5GZDV!lAkLp@lI%7OKm zgZu64u~*IeAqjO~J50ph7=bQag>PULY=6y6pz}52KY<1(4K49ooP;6QO?^I=QvVbc zq0YaXkh@SFFGL^QhKk5Otcu@b1H6d6u=*cn%bvpo>LV}-7rH3u!Goxe-Jj7L!*7_C z#$Y|_?NJjLh8lR8?M|#o{VY205_+NcO*63|45#kERD1%p z-=^DRIQ0@#@-0A@Cxv}>!zZXv{fP=y-3R7@baYU6Vg$}a4X_%O%@Beu?t>AN=;!$}t*4sTS_rUIAM^3)e(a%|YV0&(^vv6ENes#Av_y2TXd8MRPoys0%BmH8>W|cS{w2$uuDRxO|L^mhd-?zG`vIJF z3#*-5T+RP^SheLA|CwFIvSRRdeMSHM&#@Mk)q(Ihw!{GbrwO*gF_?}Ma5Ls(P=aMe zpbu-~BGizpFc`Nv{ds~CcxU@yFg(HP&x zvi4wi+=#bv2d+x8tj;*7tz~t>xtM}`up54deKC<;bYy<3h=z8y5vOB0Ds`>fn~A%i zGSVM|F~^CEkg=?%u@)Z0aD3nK3&-zKI}c7anVg7?h-adIA&uoUsDfov=yV*6e8+kg zwer7X7pzL2HDM2AvsM8r#m}J@co?;_FYqU9%J#LenETD=2^dTK0P3ve-cSDHX*^EH zumH8ETx# z$g#23btV7W`TNd;-=pGs6sjI}L+vmf>thLqd=ynb(8JI)WXK)=+=ic^ zzW;b1t|~r*8mAv8@nsy3UJOd*fMO|Xqn-O%)?(fNel*t5aT0@YDknv!cosGcu&e`k zjQG?5Gth>C=8YHnfMpG*e+u$0vEIh7@jK+d*6BeeL-B*nhQ?q#{Zmm3D8stUZ>^)D z6z#+$JcZg(^&#fLaAZ?fJnC>}qiXsTYQWv7Qk_DT<`(h_u>#Y~^C`&N+sZ;47otkE z1^s%%9iX8UU&L1UGwPZ(<7KcO2cZtjHGB|*hFaDmI2u*U-57{Rur?k?jdu=%@D^%e zzoNzoWsq5z_#pY$N?xKv1H6uP@G!Q*hEbd!xR;%K3aV zR-PH;VpvBo7OQ5kDU8n`|9Ld>>Ci+cv1Wi}T|%w++C$WcScMLS&`h&{c&tI3fEutJ z*2AHggcGq1E=E0f0F}|VQ5pCa^;~uT2y<^cVp}>gQK^}aC-5F>XD3GTa{^n9GG}Eq zDz%5O4<5yE4B=rNJ{yD4gL+ZtDKgOjLK-otJf^{{!fjX-5)25LtO zP?^|`n&1d(f{!o+ucCJNBkFtg$M6#p<58syVs>{47L(nE}gzE2(J+L48 zHPAd7vvD(~V6!Y!vvHV6yc)HWcd;DLqcX50+w6QjYQbAE9pA%V7?EQ#Hxg~)EvQT! zL*0tAIpkjhU!+6+fT~T1+x&R!fHA~lu_?~PXk3dr&3iEpzeL@hs=4M+c0gscCvtPG zQJ8^SoX_u~HV`z)Zw8K@WLDM_Rhu-_X`P51WUB~k;Zf{~r|@V1>E`9J3om%g0-nh? z_xdf=?YN0L8^5AzU&Cw8P-ARHJls!1r+)@2H9JwK_8?Zn6R0nq!YI6fbup;GWTGLa z6L&x^kTn;T$@9oBQ`SxFjV%k!8Sx-%waQT&^vCj6xlJPxwW9bb97G&|x_&n>0q;2` zOf`pbIL6XH4fVoVhHdaO$B<&nVh*bdazU)k$g!~kON^88s_y@B8i)Acbsv-BtWr~( z!#IriW7NW$O*0b=Le+dahTuvJ#0{tgZ$a&BKic>{*2Zh7jr@YOu-SCy{0aei*foDcBhoVSB8=O#B{I zy1|c`Lp=F0>aUv3qC=@$gj&cBR4HC}`VXPb!dIA%ok&{-K8{-8C#Z~kgZf^`9LxF; z!*B{-!piG5*Zf^D1NFVf<~mRUb~_JrnP(1RFVxO5P-h|!wZrA8Te1_C%F&OT zH=qltiuEXV#h;L*SsfT$@lI5H6;mB>2G7_`EoZjX*j(8aA zly66sLvnkmq)a_V-QTRMI!@bxM{hv7h#j9OTE4gFRV8cK0n#{sBJjKj)9gbBnI z*b1+s7SM2!xeZ-W-+vHeG1rObV-w=%P?5kG8MA=isMv#paV6&CCDb@W%gpZ=**J)J z9{SU19HXH(RrE4*7~5eI@eouAW?>K9g{tj$*by5nHz^*BT2KMj!k1Cse+`wH%cv68 zSz$_)f-2$273ANhF@ugixC-yXbEwn>tTb<~`>;9j0Mx(*sM@YU9i}%?nR^dy{08e| z&1d-mg|YYwE<-J_*D7;+(pHgw)#ed8w89x!7uTbWyRaU9jA3}$`TQsRnK)>*`QcLK zIrDrd)}+5ZYUkasD(0XToacPL$Z@%!hIa4*M&V|R#J5ljJB!-MkEp{Kvc~kMU+xE=LsK8{-W71Yju#yVJIt(ni?fJOs4+B){fzQm7UbN~aQCVu^SQ-UjK z6W4yh{A!hiV~OWs9$vr*d|;hf-~?0#^D!77MJ?n>Ox4f-0*7NOoQg{68q`^N+3|qm2~4B^GHRUU&E{+j zM*kE#vT3x%llU-Jd)d4R$D<}#f?e zs6%-Sqw(?<^52w(wUtx^Fc_-l!?$tZFc0-$lkMi!+XGdSshEjNP^Gx+cn1TC>+LW< z=c7=!Dh^v>7fiw|Y=ujAkpBc4`{`(eS5R@4ohGG;s25Tf48;kKQ&0ey9axU>Fvl7Ba_t?zfhhhP4(o(JNRV-@+g~h5Et;$A3BALyn78 z_ituF`;i-Ky^q>J;cH|S=in%;vd8>;;26|Ks&RLp(ESgkv67Azs0ouedD>ZLyo~wC zfwwaDnSX$|gQJOEZV-f1iY)9?*sN*@*p}mf}p7q}}aSFx|k4KeaHu^Q- z(=>E=_MiqnjvC-Qd>kVVnJ=uyOyX@g9IG5Q6OY7d#CfO;7N9mT4OP1Ns57$+wSWy+ zh=&f7f32kLTjtHy7ghT~*aF9)QuT!M`7>CZc$E{sfbqneuphpMs%`BGvydnZC2oS9 zumkEadax%xQQXCjJ3+HtwR{cy<47O4Sv$V1F+fEoeN5O3idk!7|iD$55HMfvxclDy1#n zHxs6yc9e=W@e$N}!;Lx%eyseN;C%ij>MR^ZZjs+QO+(kD{V}IDs0p4x9m*A`Qf$TX zcnDi#+;Q{#5L5{!p%$S_!sPln&wWi=A;(Q#7 zKVomp{Ls{FIR+CSL>=Cvs8pXv4g4hrqVp%&KqWBw??J{X1{qH27}iLc^d;@>a{2c0yxYX-&?0kL%wX^TA9fqAUr#lrj-UF!HF%fku z)}u=I1=ho>r^vrncGvkJ_EWR7mZ+L_!!bArRkMw#fyyy6fQ4fT4me{Lyzi`ejaQ zsOMK>d)(%HegXByi~G#{UpV7YrSNa3!C2NCs8p}~-268CDrzBV7tE<2hk8#ez*yXl z&F~oZ!kegD)cy<8{|HVbp5u5C-Nbz_TGm6j8R_y{cW7*-lj6=8N1TPKKwYL+y04;~@+pKJCO8(I)=ciKD+Y8%sui9v^h2 zQ4=?y4%If)Lf&@#1X~baK}}repJswKsEO})9E#Dzxv0|3#bn%vX?PuDuvA2R^R}vdCmNz^DtD3SD_ZR74^OM@gV*K3vuan^IoxT znBN~-puX4U2Km>i?@dPzj&UA%6ZL{P;ym~%CKCS>b^0U!Wq#T0gw=^pqZaTvPRG00 z1xvp(Z`K{CIN_%G_rYvbhCcVxP|73!Z3a%l5aKjcMn+>G&cOR{4rbsctcgEiYpin1 z{O*{9`rcT)AOD2PXgO-52QeN`qZZ)*g@$(2;kGdY>k${BjdM{Gtw$|vD>lNt*a1(X zY992xd9EpHyf#ie1ii!~usObk+R(RHNB93GjRtgBKbV?CU=zXw)Q;0o0~TWfEXzqU^HYM(ZHoCDHEPx}8H~cQh>$=^EBk!7&4ngg_7Jm^p=!x2K5q81#*ci`aC%l7=u)P&f`G-q7>iW%g;(6GTcqb}TXHd^q3kawzi5(E& zudHn!IyAuq)DBi*93DY^;WBFCfGPo%HMG$t?vFZ@x!4eko&H70;j*@3F1~@Qu}Rf{ z%G+=N^-6!Qsz0D|0jKED;kfO55LGRp^0c-SlqXP|r_8 zy)oyZevH3@D$zF7^B+2%_S4XS7cmmQbquIsb`*u0I2qgE0E|T+hT=0g5I3Mocol8D zixJp3&^*@(wXgwL3m-zw7d?T7uHSSF!>6z-t_v)m)grh`^;x9__QEnhi{JYO!Igrxl7z$Z%O$V$xu39&u|q?@w)#{6@Kp@=q@gB75;Ax^2#P|n%%shw9u37nc`yEGZXC`Pl>PC zlTA`ed@dh5%5~?si(THb6Ps3y$#HqSJX26q=*v@MrrT94J;hX@)axp?exJ!*IL%XB zR9L{S6K!`+X|~JfDPrb4x6A9JleZF@>=S9Z3$q{Q|W*}go&To2t-yspARcaA!< e+`axgffDa!kA0@GG1D}8cNNbp-*IPZ&Hn%#uUP*8 diff --git a/languages/open-data-wizard-en_US.po b/languages/open-data-wizard-en_US.po index 00cdd115..5a6c4ce8 100644 --- a/languages/open-data-wizard-en_US.po +++ b/languages/open-data-wizard-en_US.po @@ -33,6 +33,9 @@ msgstr "(optional)" msgid "(von max. %d)" msgstr "(of max. %d)" +msgid "* Pflichtfeld für die Veröffentlichung. Als Entwurf können Sie den Datensatz jederzeit speichern." +msgstr "* Required for publishing. You can save the dataset as a draft at any time." + msgid "1 — Grundlegende Informationen" msgstr "1 — Basic Information" @@ -156,33 +159,15 @@ msgstr "Example: 2024-01-15" msgid "Beispiel: 2024-12-31" msgstr "Example: 2024-12-31" -msgid "Beispiel: CC0 1.0, CC-BY 4.0 – Diese bestimmt, wie andere die Daten nutzen dürfen." -msgstr "Example: CC0 1.0, CC-BY 4.0 – this determines how others may use the data." - -msgid "Beispiel: CSV, JSON, PDF" -msgstr "Example: CSV, JSON, PDF" - -msgid "Beispiel: Deutsch, Englisch" -msgstr "Example: German, English" - msgid "Beispiel: Ein Überblick über die bevölkerungsreichsten Städte in Deutschland mit statistischen Daten zu Einwohnerzahl und Entwicklung." msgstr "Example: An overview of the most populous cities in Germany with statistical data on population and development." -msgid "Beispiel: Gemeinde, Landkreis, Land, Bund" -msgstr "Example: municipality, district, state, federal" - msgid "Beispiel: Musterstadt Statistikamt, Umweltbundesamt, Verbraucherzentrale e.V." msgstr "Example: Sampletown Statistics Office, Federal Environment Agency, Consumer Advice Center" msgid "Beispiel: Open Data Team, Statistisches Landesamt" msgstr "Example: Open Data Team, State Statistical Office" -msgid "Beispiel: Täglich, Monatlich, Jährlich, Unregelmäßig" -msgstr "Example: daily, monthly, yearly, irregular" - -msgid "Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur" -msgstr "Example: environment, education, health, economy, culture" - msgid "Beispiel: Zivilgesellschaftliche Organisationen" msgstr "Example: Civil society organizations" @@ -444,6 +429,9 @@ msgstr "The preview shows the generated JSON-LD based on the most recently saved msgid "Diese Werte werden beim Anlegen eines neuen Datensatzes automatisch vorausgefüllt." msgstr "These values are pre-filled automatically when creating a new dataset." +msgid "Diese bestimmt, wie andere die Daten nutzen dürfen." +msgstr "This determines how others may use the data." + msgid "Dieser Datensatz ist nicht veröffentlicht." msgstr "This dataset is not published." @@ -474,6 +462,12 @@ msgstr "Distribution with URL (dcat:accessURL)" msgid "Distribution mit Zugriffs-URL (dcat:accessURL)" msgstr "Distribution with access URL (dcat:accessURL)" +msgid "Eine der sechs EU-Themenkategorien." +msgstr "One of the six EU thematic categories." + +msgid "Pflichtfeld für die Veröffentlichung" +msgstr "Required for publishing" + msgid "Primäre Distribution — weitere Angaben" msgstr "Primary distribution — further details" @@ -534,9 +528,6 @@ msgstr "A demo dataset with a sample CSV was created automatically. Insert this msgid "Ein Fehler ist aufgetreten." msgstr "An error occurred." -msgid "Eine der sechs EU-Themenkategorien. Beispiel: Georaum, Meteorologie, Mobilität" -msgstr "One of the six EU thematic categories. Example: Geospatial, Meteorological, Mobility" - msgid "Eine eindeutige Kennung des Datensatzes (z. B. DOI oder interne ID). Beispiel: 10.1234/abcd" msgstr "A unique identifier of the dataset (e.g. DOI or internal ID). Example: 10.1234/abcd" @@ -1558,8 +1549,8 @@ msgstr "How can the distribution be described?" msgid "Wie oft werden diese Daten aktualisiert?" msgstr "How often are these data updated?" -msgid "Wie verlässlich/dauerhaft ist der Zugriff auf diese Datei geplant? Beispiel: Stabil, Verfügbar, Temporär" -msgstr "How reliable/durable is access to this file planned to be? Example: Stable, Available, Temporary" +msgid "Wie verlässlich/dauerhaft ist der Zugriff auf diese Datei geplant?" +msgstr "How reliable/permanent is access to this file intended to be?" msgid "Wiederverwendbarkeit" msgstr "Reusability" @@ -1766,12 +1757,6 @@ msgstr "Tab %s" msgid "Zum Feld springen" msgstr "Go to field" -msgid "Pflichtfeld zum Veröffentlichen" -msgstr "Required for publishing" - -msgid "* Pflichtfeld zum Veröffentlichen. Als Entwurf können Sie jederzeit unvollständig speichern." -msgstr "* Required for publishing. You can always save an incomplete draft." - msgid "Link zur Datei oder Datei-Upload" msgstr "Link to the file or file upload" diff --git a/languages/open-data-wizard.pot b/languages/open-data-wizard.pot index 93531a0d..6fa77b98 100644 --- a/languages/open-data-wizard.pot +++ b/languages/open-data-wizard.pot @@ -15,6 +15,9 @@ msgstr "" msgid "(optional)" msgstr "" +msgid "* Pflichtfeld für die Veröffentlichung. Als Entwurf können Sie den Datensatz jederzeit speichern." +msgstr "" + msgid "1 — Grundlegende Informationen" msgstr "" @@ -87,33 +90,15 @@ msgstr "" msgid "Beispiel: 2024-12-31" msgstr "" -msgid "Beispiel: CC0 1.0, CC-BY 4.0 – Diese bestimmt, wie andere die Daten nutzen dürfen." -msgstr "" - -msgid "Beispiel: CSV, JSON, PDF" -msgstr "" - -msgid "Beispiel: Deutsch, Englisch" -msgstr "" - msgid "Beispiel: Ein Überblick über die bevölkerungsreichsten Städte in Deutschland mit statistischen Daten zu Einwohnerzahl und Entwicklung." msgstr "" -msgid "Beispiel: Gemeinde, Landkreis, Land, Bund" -msgstr "" - msgid "Beispiel: Musterstadt Statistikamt, Umweltbundesamt, Verbraucherzentrale e.V." msgstr "" msgid "Beispiel: Open Data Team, Statistisches Landesamt" msgstr "" -msgid "Beispiel: Täglich, Monatlich, Jährlich, Unregelmäßig" -msgstr "" - -msgid "Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur" -msgstr "" - msgid "Beispiel: Zivilgesellschaftliche Organisationen" msgstr "" @@ -318,6 +303,9 @@ msgstr "" msgid "Diese Werte werden beim Anlegen eines neuen Datensatzes automatisch vorausgefüllt." msgstr "" +msgid "Diese bestimmt, wie andere die Daten nutzen dürfen." +msgstr "" + msgid "Dieser Datensatz ist nicht veröffentlicht." msgstr "" @@ -348,6 +336,9 @@ msgstr "" msgid "Ein Fehler ist aufgetreten." msgstr "" +msgid "Eine der sechs EU-Themenkategorien." +msgstr "" + msgid "Einheit" msgstr "" @@ -700,6 +691,9 @@ msgstr "" msgid "Pflichtangaben" msgstr "" +msgid "Pflichtfeld für die Veröffentlichung" +msgstr "" + msgid "Pflichtfelder" msgstr "" @@ -922,6 +916,9 @@ msgstr "" msgid "Wie oft werden diese Daten aktualisiert?" msgstr "" +msgid "Wie verlässlich/dauerhaft ist der Zugriff auf diese Datei geplant?" +msgstr "" + msgid "Willkommen im Open Data Wizard" msgstr "" @@ -1042,9 +1039,6 @@ msgstr "" msgid "HVD-KATEGORIE (dcatap:hvdCategory)" msgstr "" -msgid "Eine der sechs EU-Themenkategorien. Beispiel: Georaum, Meteorologie, Mobilität" -msgstr "" - msgid "Georaum (Geospatial)" msgstr "" @@ -1072,9 +1066,6 @@ msgstr "" msgid "PLANBARE VERFÜGBARKEIT (dcatap:availability)" msgstr "" -msgid "Wie verlässlich/dauerhaft ist der Zugriff auf diese Datei geplant? Beispiel: Stabil, Verfügbar, Temporär" -msgstr "" - msgid "Verfügbar (mittelfristige Planung)" msgstr "" @@ -1390,12 +1381,6 @@ msgstr "" msgid "Zum Feld springen" msgstr "" -msgid "Pflichtfeld zum Veröffentlichen" -msgstr "" - -msgid "* Pflichtfeld zum Veröffentlichen. Als Entwurf können Sie jederzeit unvollständig speichern." -msgstr "" - msgid "Link zur Datei oder Datei-Upload" msgstr "" diff --git a/open-data-wizard.php b/open-data-wizard.php index 2553581e..61f08ea4 100644 --- a/open-data-wizard.php +++ b/open-data-wizard.php @@ -3,7 +3,7 @@ * Plugin Name: Open Data Wizard * Plugin URI: https://github.com/daimpad/OpenDataWizard * Description: DCAT-AP 3.0 konforme Open Data Metadatenverwaltung für WordPress. Bereitstellung als maschinenlesbarer JSON-LD-Endpoint für offene Daten. - * Version: 2.40.2 + * Version: 2.40.3 * Requires at least: 6.4 * Requires PHP: 8.1 * Author: nozilla @@ -26,7 +26,7 @@ exit; } -define( 'ODW_VERSION', '2.40.2' ); +define( 'ODW_VERSION', '2.40.3' ); define( 'ODW_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'ODW_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'ODW_PLUGIN_FILE', __FILE__ ); diff --git a/package.json b/package.json index 6c54f69b..ba21d773 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-data-wizard", - "version": "2.40.2", + "version": "2.40.3", "description": "WordPress plugin for publishing open data as DCAT-AP 3.0 compliant metadata", "author": "Open Data Wizard Team", "license": "GPL-2.0-or-later", From aef84d30ef5f597de7d06a93cad3e6a35814ba17 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 10:23:30 +0000 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20Halbheiten=20aus=20der=20Gegenpr?= =?UTF-8?q?=C3=BCfung=20nachgezogen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eine adversarische Prüfung des vorigen Commits durch vier unabhängige Linsen hat neun Befunde bestätigt. Sechs davon waren echte Halbheiten meinerseits: - Der neue Pflichtfeld-Wortlaut stand nur in der Legende unter dem Formular. "Als Entwurf können Sie jederzeit unvollständig speichern" lebte weiter in der Meldung nach blockierter Veröffentlichung (class-validation.php), auf der Einstiegsseite (class-admin.php) und im README. - Die Einstiegsseite versprach "Jedes Feld hat hilfreiche Beispiele, die Sie über das ⓘ-Symbol einblenden" — nach dem Entfernen der acht Beispiele für fünf Felder schlicht falsch. Der Satz benennt jetzt die Aufteilung: ⓘ zeigt den DCAT-AP-Begriff, "Mehr erfahren" die ausführliche Erklärung. - "Kardinalität" blieb in TECHNICAL-SPEC.md stehen — ausgerechnet dort, wo dieselbe Feld-Registry beschrieben wird, deren Docblock ich umgestellt hatte. Die Behauptung "durchgängig" im Changelog stimmte damit nicht. - Die Spaltenabkürzung "Norm-Kard." in zwei Tabellen hätte eine Wortersetzung nie erfasst. Jetzt "Norm-Mult." samt Legende — eine Legende, die eine Abkürzung auf ein anderes Wort auflöst, wäre schlimmer als der alte Begriff. - Die Kreis/Kommune-Korrektur war halb: Der fachliche Beschreibungstext nannte weiter die falschen Ebenen. - "die mitgelieferten Kern-Shapes prüfen sie deshalb nicht" war zu schwach formuliert: KEINE der sechs Shape-Dateien erwähnt hvdCategory (case-insensitive Suche über config/shacl/*.ttl: null Treffer). Zwei weitere Befunde bleiben bewusst offen, weil sie die eben getroffene Entscheidung U-1 vorwegnehmen: Die Beispiele stehen weiterhin im "Mehr erfahren"-Panel, und fünf Tooltips zeigen nur noch den technischen Begriff. Genau so ist die Rollentrennung gedacht — U-1 räumt die verbliebene Doppelung auf. 243 Tests grün, PHPCS ohne Befund, i18n und Paketprüfung sauber, Feld-Referenz neu generiert. https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq --- CHANGELOG.md | 17 ++++++++++++++--- README.md | 2 +- TECHNICAL-SPEC.md | 10 +++++----- config/field-catalog.php | 4 ++-- docs/FELD-REFERENZ.md | 4 ++-- includes/class-admin.php | 2 +- includes/class-validation.php | 2 +- languages/open-data-wizard-en_US.mo | Bin 66848 -> 66958 bytes languages/open-data-wizard-en_US.po | 12 ++++++------ languages/open-data-wizard.pot | 12 ++++++------ 10 files changed, 38 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4338607..8c66ebd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,8 @@ Vier Punkte aus einem Usability-Test — und was beim Nachprüfen sonst noch auf `dcatap:hvdCategory` stammt aus der HVD-Erweiterung (EU-Verordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0. Auch vermerkt. - **Die Verwaltungsebene nannte Optionen, die es nicht gibt.** Die Beschreibung sprach von - „Kreis" und „Kommune", die Auswahlliste bietet „Landkreis" und „Gemeinde". + „Kreis" und „Kommune", die Auswahlliste bietet „Landkreis" und „Gemeinde". Betraf beide + Beschreibungstexte, den allgemeinverständlichen und den fachlichen. ### 🎨 Changed - **Pflichtfeld-Hinweis umformuliert:** „* Pflichtfeld für die Veröffentlichung. Als Entwurf @@ -31,8 +32,18 @@ Vier Punkte aus einem Usability-Test — und was beim Nachprüfen sonst noch auf acht: Thema, Sprache, Format, Lizenz, Verfügbarkeit, Aktualisierungsfrequenz, Verwaltungsebene und HVD-Kategorie. Erklärende Sätze sind geblieben, gestrichen wurde nur der Beispielteil. - **„Kardinalität" heißt jetzt durchgängig „Multiplizität"** — den Begriff verwendet die - deutsche Spezifikation DCAT-AP.de. Betrifft 52 Stellen im Feld-Katalog und die daraus - generierte Feld-Referenz. + deutsche Spezifikation DCAT-AP.de. Betrifft 52 Stellen im Feld-Katalog, die daraus generierte + Feld-Referenz und `TECHNICAL-SPEC.md`. Dort auch die Spaltenabkürzung „Norm-Kard." → + „Norm-Mult.": Eine reine Wortersetzung hätte sie nicht erfasst, und eine Legende, die eine + Abkürzung auf ein anderes Wort auflöst, ist schlimmer als der alte Begriff. +- **Der neue Pflichtfeld-Wortlaut gilt jetzt überall.** Beim ersten Anlauf hatte ich nur die + Legende unter dem Formular geändert; „Als Entwurf können Sie jederzeit unvollständig + speichern" stand weiter in der Meldung nach blockierter Veröffentlichung, auf der + Einstiegsseite und im README. +- **Die Einstiegsseite versprach Beispiele, die es nicht mehr gibt.** „Jedes Feld hat hilfreiche + Beispiele, die Sie über das ⓘ-Symbol einblenden" stimmte nach dem Entfernen der acht Beispiele + nicht mehr. Der Satz benennt jetzt die tatsächliche Aufteilung: ⓘ zeigt den DCAT-AP-Begriff, + „Mehr erfahren" die ausführliche Erklärung. ### 🧹 Aufgeräumt - Zehn verwaiste Übersetzungseinträge entfernt, die durch die Textänderungen ohne Fundstelle diff --git a/README.md b/README.md index 186d3783..638abdc6 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Das Wizard-Formular wurde vollständig überarbeitet, um es auch ohne DCAT-AP-Ke - **Validierungsmeldungen in Klartext, mit Ort:** Wird die Veröffentlichung blockiert, nennt die Meldung den Tab und den verständlichen Feldnamen (der technische DCAT-AP-Begriff steht nur klein daneben) — ein Klick auf „Zum Feld springen" öffnet den passenden Tab und hebt das Feld hervor ### 🧭 Geführter Wizard -Fünf-Tab-Assistent mit praktischen Beispielen. Pflichtfelder sind mit einem roten Sternchen (`*`) gekennzeichnet; als **Entwurf** lässt sich jederzeit unvollständig speichern — erst zum **Veröffentlichen** müssen alle Pflichtangaben ausgefüllt sein. +Fünf-Tab-Assistent mit praktischen Beispielen. Pflichtfelder sind mit einem roten Sternchen (`*`) gekennzeichnet; als **Entwurf** lässt sich der Datensatz jederzeit speichern — erst zum **Veröffentlichen** müssen alle Pflichtangaben ausgefüllt sein. 1. **Grundlegende Informationen** — „Wer gibt diese Daten heraus?", „Worum geht es in diesem Datensatz?", „Welchem Thema ist dieser Datensatz zugeordnet?", „Mit welchen Schlagworten finde ich diese Daten?". Weniger häufige Einordnungen (CESSDA-Themenklassifikation, ZiviZ-Engagementfeld) liegen in einer aufklappbaren Untergruppe am Tab-Ende. 2. **Sprache & Übersetzungen** — die Sprache der Daten sowie Titel, Beschreibung und Schlagworte in weiteren Sprachen diff --git a/TECHNICAL-SPEC.md b/TECHNICAL-SPEC.md index d4c9c38b..e7ec5d4e 100644 --- a/TECHNICAL-SPEC.md +++ b/TECHNICAL-SPEC.md @@ -40,7 +40,7 @@ Bausatz: | Baustein (piveau) | Inhalt | ODW-Pendant | |---|---|---| -| `input-definition.ts` | Alle Felder: Typ, DCAT-Prädikat, Kardinalität, Validierung, Vokabular | `config/dcat-ap-fields.php` (erweiterbar) | +| `input-definition.ts` | Alle Felder: Typ, DCAT-Prädikat, Multiplizität, Validierung, Vokabular | `config/dcat-ap-fields.php` (erweiterbar) | | `page-content-config.js` | Zuordnung Feld → Wizard-Schritt (Essentials/Additionals) | Tab-Zuordnung in `class-fields.php` | | `prefixes.js` | Namespace-Präfixe für JSON-LD | `odw_build_dataset_jsonld()` (`@context`) | | `vocab-prefixes.js` | Basis-URIs der kontrollierten Vokabulare | `dct-format-list.php`, `licenses.txt`, CESSDA-RDF | @@ -106,12 +106,12 @@ DCAT-AP verlangt für viele Felder URIs aus EU-Authority-Tables statt Freitext. ### 4. Vollständiger DCAT-AP-Feldkatalog & Gap-Analyse **Legende** — Profil: `AP` = DCAT-AP 3.0 · `DE` = DCAT-AP.de 2.0 · `HVD` = High-Value-Dataset-Pflicht · -Norm-Kard.: Kardinalität laut Standard (`M`andatory/`R`ecommended/`O`ptional) · +Norm-Mult.: Multiplizität laut Standard (`M`andatory/`R`ecommended/`O`ptional) · ODW: ✅ vorhanden · ⚠️ teilweise/Freitext · ❌ fehlt. #### 4.1 Dataset (`dcat:Dataset`) -| DCAT-Prädikat | Range | Profil | Norm-Kard. | ODW | +| DCAT-Prädikat | Range | Profil | Norm-Mult. | ODW | |---|---|---|---|---| | `dct:title` | lang-Literal | AP | M (1..n) | ✅ | | `dct:description` | lang-Literal | AP | M (1..n) | ✅ | @@ -149,7 +149,7 @@ ODW: ✅ vorhanden · ⚠️ teilweise/Freitext · ❌ fehlt. #### 4.2 Distribution (`dcat:Distribution`) -| DCAT-Prädikat | Range | Profil | Norm-Kard. | ODW | +| DCAT-Prädikat | Range | Profil | Norm-Mult. | ODW | |---|---|---|---|---| | `dcat:accessURL` | URI | AP | M (1..n) | ✅ | | `dcat:downloadURL` | URI | AP | O (0..n) | ✅ | @@ -184,7 +184,7 @@ unterstützt; `dct:license`, `dct:language`, `dcat:themeTaxonomy` und `dct:spati Jeder Registry-Eintrag trägt die Basis-Schlüssel `key`, `meta_key`, `dcat_prop`, `label`, `points`, `required` sowie seit v2.5.1 die **deklarativen Schema-Metadaten** `profile`, `tier`, `range`, `cardinality`, `entity`, `vocab`. -Damit ist die Registry die dokumentierte Single Source of Truth für Pflichtigkeit, Kardinalität und Wertform +Damit ist die Registry die dokumentierte Single Source of Truth für Pflichtigkeit, Multiplizität und Wertform (wie piveaus `input-definition.ts`). Die Metadaten sind **abwärtskompatibel** — bestehende Konsumenten (Qualität, Validierung) lesen weiterhin nur die Basis-Schlüssel; das 0–100-Punkteschema bleibt unverändert. Eine Schema-Validierung sichert die Invarianten (`tests/test-registry-schema.php`): diff --git a/config/field-catalog.php b/config/field-catalog.php index 3382dd75..9471857c 100644 --- a/config/field-catalog.php +++ b/config/field-catalog.php @@ -282,7 +282,7 @@ 'vocab' => 'politicalGeocodingLevel', 'q_dcat' => 'Welche `dcatde:politicalGeocodingLevelURI` (Verwaltungsebene) betrifft der Datensatz?', 'q_human' => 'Auf welcher Verwaltungsebene wurden diese Daten erhoben?', - 'desc_dcat' => '`dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular (Bund, Land, Kreis, Kommune). Multiplizität 0..1. Ergänzt die konkrete Gebietsangabe.', + 'desc_dcat' => '`dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular; im Formular wählbar als Bund, Land, Landkreis und Gemeinde. Multiplizität 0..1. Ergänzt die konkrete Gebietsangabe.', 'desc_human' => 'Wählen Sie, auf welcher staatlichen Ebene die Daten angesiedelt sind — Bund, Land, Landkreis oder Gemeinde. Das ordnet die Daten geografisch-administrativ ein. Beispiel: Gemeinde.', ), array( @@ -510,7 +510,7 @@ 'vocab' => 'hvd-category', 'q_dcat' => 'Welcher `dcatap:hvdCategory` (HVD-Kategorie) gehört der Datensatz an?', 'q_human' => 'Welcher HVD-Kategorie gehört dieser Datensatz an?', - 'desc_dcat' => '`dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Multiplizität 0..n. Hinweis: Die Eigenschaft stammt aus der HVD-Erweiterung zu DCAT-AP (EU-Durchführungsverordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0; die mitgelieferten Kern-Shapes prüfen sie deshalb nicht.', + 'desc_dcat' => '`dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Multiplizität 0..n. Hinweis: Die Eigenschaft stammt aus der HVD-Erweiterung zu DCAT-AP (EU-Durchführungsverordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0; keine der mitgelieferten SHACL-Shapes prüft sie deshalb.', 'desc_human' => 'Wenn es ein hochwertiger Datensatz ist, wählen Sie hier die passende der sechs EU-HVD-Kategorien. Damit ordnen Sie den Datensatz korrekt in das EU-Schema ein. Beispiel: Georaum, Mobilität, Statistik.', ), array( diff --git a/docs/FELD-REFERENZ.md b/docs/FELD-REFERENZ.md index f150c49f..13ce796b 100644 --- a/docs/FELD-REFERENZ.md +++ b/docs/FELD-REFERENZ.md @@ -409,7 +409,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Auf welcher Verwaltungsebene wurden diese Daten erhoben? -**3 · DCAT-AP-Langbeschreibung:** `dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular (Bund, Land, Kreis, Kommune). Multiplizität 0..1. Ergänzt die konkrete Gebietsangabe. +**3 · DCAT-AP-Langbeschreibung:** `dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular; im Formular wählbar als Bund, Land, Landkreis und Gemeinde. Multiplizität 0..1. Ergänzt die konkrete Gebietsangabe. **4 · Verständliche Langbeschreibung:** Wählen Sie, auf welcher staatlichen Ebene die Daten angesiedelt sind — Bund, Land, Landkreis oder Gemeinde. Das ordnet die Daten geografisch-administrativ ein. Beispiel: Gemeinde. @@ -732,7 +732,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welcher HVD-Kategorie gehört dieser Datensatz an? -**3 · DCAT-AP-Langbeschreibung:** `dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Multiplizität 0..n. Hinweis: Die Eigenschaft stammt aus der HVD-Erweiterung zu DCAT-AP (EU-Durchführungsverordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0; die mitgelieferten Kern-Shapes prüfen sie deshalb nicht. +**3 · DCAT-AP-Langbeschreibung:** `dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Multiplizität 0..n. Hinweis: Die Eigenschaft stammt aus der HVD-Erweiterung zu DCAT-AP (EU-Durchführungsverordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0; keine der mitgelieferten SHACL-Shapes prüft sie deshalb. **4 · Verständliche Langbeschreibung:** Wenn es ein hochwertiger Datensatz ist, wählen Sie hier die passende der sechs EU-HVD-Kategorien. Damit ordnen Sie den Datensatz korrekt in das EU-Schema ein. Beispiel: Georaum, Mobilität, Statistik. diff --git a/includes/class-admin.php b/includes/class-admin.php index 20d5cd25..4a0f7996 100644 --- a/includes/class-admin.php +++ b/includes/class-admin.php @@ -790,7 +790,7 @@ class="odw-introduction-figure"

- +

diff --git a/includes/class-validation.php b/includes/class-validation.php index e7727dd8..492edb35 100644 --- a/includes/class-validation.php +++ b/includes/class-validation.php @@ -484,7 +484,7 @@ public static function show_validation_notice(): void { } echo ''; - echo '

' . esc_html__( 'Der Datensatz wurde als Entwurf gespeichert. Bitte alle Pflichtangaben befüllen und erneut veröffentlichen. Als Entwurf können Sie jederzeit unvollständig speichern.', 'open-data-wizard' ) . '

'; + echo '

' . esc_html__( 'Der Datensatz wurde als Entwurf gespeichert. Bitte alle Pflichtangaben befüllen und erneut veröffentlichen. Als Entwurf können Sie den Datensatz jederzeit speichern.', 'open-data-wizard' ) . '

'; echo ''; } } diff --git a/languages/open-data-wizard-en_US.mo b/languages/open-data-wizard-en_US.mo index 9b072c1577660d7335072978d9791b405d8f519e..049b578da2a0597d596c4a2ca7feb08e466df93f 100644 GIT binary patch delta 9333 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 aD9+)V)BQEAw;3+`uj_hUuj~E!%!>;GR?iRE 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 Je=EE1{{TuyFbn_y diff --git a/languages/open-data-wizard-en_US.po b/languages/open-data-wizard-en_US.po index 5a6c4ce8..65f943ff 100644 --- a/languages/open-data-wizard-en_US.po +++ b/languages/open-data-wizard-en_US.po @@ -399,6 +399,9 @@ msgstr "Uninstallation" msgid "Demo-Datensatz bearbeiten" msgstr "Edit demo dataset" +msgid "Der Datensatz wurde als Entwurf gespeichert. Bitte alle Pflichtangaben befüllen und erneut veröffentlichen. Als Entwurf können Sie den Datensatz jederzeit speichern." +msgstr "The dataset was saved as a draft. Please fill in all required fields and publish again. You can save the dataset as a draft at any time." + msgid "Der Datensatz wurde als Entwurf gespeichert. Bitte alle Pflichtfelder befüllen und erneut veröffentlichen." msgstr "The dataset was saved as a draft. Please fill in all required fields and publish again." @@ -420,6 +423,9 @@ msgstr "The Idea" msgid "Die JSON-LD-Ansicht unten zeigt das zuletzt gespeicherte Ergebnis." msgstr "The JSON-LD view below shows the last saved result." +msgid "Die Pflichtfelder sind mit einem roten Sternchen (*) gekennzeichnet. Als Entwurf können Sie den Datensatz jederzeit speichern – erst zum Veröffentlichen müssen alle Pflichtfelder ausgefüllt sein. Zu jedem Feld gibt es Erläuterungen: Das ⓘ-Symbol zeigt den DCAT-AP-Begriff, „Mehr erfahren\" die ausführliche Erklärung mit Beispielen." +msgstr "Required fields are marked with a red asterisk (*). You can save the dataset as a draft at any time — only publishing requires every mandatory field. Each field comes with guidance: the ⓘ icon shows the DCAT-AP term, \"Learn more\" the full explanation with examples." + msgid "Die Qualitätsprüfung bewertet die Vollständigkeit der Metadaten. Die Werte werden bei jedem Speichern neu berechnet – Änderungen im Formular wirken sich erst nach dem Speichern auf das Ergebnis aus." msgstr "The quality check evaluates the completeness of the metadata. The values are recalculated each time you save – changes in the form only affect the result after saving." @@ -1775,9 +1781,6 @@ msgstr "Data provision" msgid "Folgende Pflichtangaben fehlen oder sind leer:" msgstr "The following required fields are missing or empty:" -msgid "Der Datensatz wurde als Entwurf gespeichert. Bitte alle Pflichtangaben befüllen und erneut veröffentlichen. Als Entwurf können Sie jederzeit unvollständig speichern." -msgstr "The dataset was saved as a draft. Please complete all required fields and publish again. You can always save an incomplete draft." - msgid "Welchem Thema ist dieser Datensatz zugeordnet?" msgstr "Which theme is this dataset assigned to?" @@ -1823,9 +1826,6 @@ msgstr "The language of the data and — if desired — title, description and k msgid "Wer gibt diese Daten heraus? Worum geht es? Welchem Thema ist der Datensatz zugeordnet? Und mit welchen Schlagworten findet man ihn? Optional lassen sich unter „Weitere Einordnung\" eine Themenklassifikation und ein Engagementfeld ergänzen." msgstr "Who publishes these data? What are they about? Which theme is the dataset assigned to? And which keywords lead people to it? Optionally, a topic classification and a field of civic engagement can be added under \"Further classification\"." -msgid "Die Pflichtfelder sind mit einem roten Sternchen (*) gekennzeichnet. Als Entwurf können Sie jederzeit unvollständig speichern – erst zum Veröffentlichen müssen alle Pflichtfelder ausgefüllt sein. Jedes Feld hat hilfreiche Beispiele, die Sie über das ⓘ-Symbol einblenden." -msgstr "Required fields are marked with a red asterisk (*). You can always save an incomplete draft — only publishing requires all mandatory fields to be filled in. Every field has helpful examples that you can reveal via the ⓘ icon." - msgid "DCAT-AP.de · Turtle (empfohlen)" diff --git a/languages/open-data-wizard.pot b/languages/open-data-wizard.pot index 6fa77b98..dd501829 100644 --- a/languages/open-data-wizard.pot +++ b/languages/open-data-wizard.pot @@ -276,6 +276,9 @@ msgstr "" msgid "Demo-Datensatz bearbeiten" msgstr "" +msgid "Der Datensatz wurde als Entwurf gespeichert. Bitte alle Pflichtangaben befüllen und erneut veröffentlichen. Als Entwurf können Sie den Datensatz jederzeit speichern." +msgstr "" + msgid "Der Datensatz wurde als Entwurf gespeichert. Bitte alle Pflichtfelder befüllen und erneut veröffentlichen." msgstr "" @@ -294,6 +297,9 @@ msgstr "" msgid "Die Idee" msgstr "" +msgid "Die Pflichtfelder sind mit einem roten Sternchen (*) gekennzeichnet. Als Entwurf können Sie den Datensatz jederzeit speichern – erst zum Veröffentlichen müssen alle Pflichtfelder ausgefüllt sein. Zu jedem Feld gibt es Erläuterungen: Das ⓘ-Symbol zeigt den DCAT-AP-Begriff, „Mehr erfahren\" die ausführliche Erklärung mit Beispielen." +msgstr "" + msgid "Die Qualitätsprüfung bewertet die Vollständigkeit der Metadaten. Die Werte werden bei jedem Speichern neu berechnet – Änderungen im Formular wirken sich erst nach dem Speichern auf das Ergebnis aus." msgstr "" @@ -1399,9 +1405,6 @@ msgstr "" msgid "Folgende Pflichtangaben fehlen oder sind leer:" msgstr "" -msgid "Der Datensatz wurde als Entwurf gespeichert. Bitte alle Pflichtangaben befüllen und erneut veröffentlichen. Als Entwurf können Sie jederzeit unvollständig speichern." -msgstr "" - msgid "Welchem Thema ist dieser Datensatz zugeordnet?" msgstr "" @@ -1447,9 +1450,6 @@ msgstr "" msgid "Wer gibt diese Daten heraus? Worum geht es? Welchem Thema ist der Datensatz zugeordnet? Und mit welchen Schlagworten findet man ihn? Optional lassen sich unter „Weitere Einordnung\" eine Themenklassifikation und ein Engagementfeld ergänzen." msgstr "" -msgid "Die Pflichtfelder sind mit einem roten Sternchen (*) gekennzeichnet. Als Entwurf können Sie jederzeit unvollständig speichern – erst zum Veröffentlichen müssen alle Pflichtfelder ausgefüllt sein. Jedes Feld hat hilfreiche Beispiele, die Sie über das ⓘ-Symbol einblenden." -msgstr "" - msgid "DCAT-AP.de · Turtle (empfohlen)" From c8fc35c36de0358a4cdf2e1b46423d8a20bccf62 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 10:51:24 +0000 Subject: [PATCH 3/7] feat: Hilfetext-Rollen getrennt, Merkmalsliste im Panel (v2.41.0, U-1 + U-2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zwei Punkte aus dem Usability-Test, die zusammengehören. U-1 — Rollentrennung: Das ⓘ-Tooltip trägt nur noch den DCAT-AP-Begriff, alles Erklärende steht im "Mehr erfahren"-Panel. Vorher stand beides an beiden Orten, beim Herausgeber sogar mit unterschiedlichen Beispielen. Betrifft 42 Felder. Eine Inventur über alle Tooltips hat dabei zwei Dinge zutage gefördert, die ein blindes Kürzen zerstört hätte: - Neun Tooltips trugen BEDIENHINWEISE, die im Katalog fehlten — die Vorbelegung der Zugriffsrechte, "zwei Wege, einer genügt" bei der Zugriffs-URL, dass HVD nur öffentliche Stellen betrifft, dass bei Auflösung, Medientyp und Typ eine URL statt einer Bezeichnung erwartet wird. Diese Sätze sind jetzt in desc_human überführt, statt verloren zu gehen. - Fünf Felder hatten überhaupt keinen Fachbegriff im Tooltip, sondern schon dort Prosa: die drei Kontaktfelder, die eigene Lizenz-URI und die HVD-Kennzeichnung. Sie tragen jetzt den Begriff, den das JSON-LD tatsächlich ausgibt (vcard:fn, vcard:hasEmail, vcard:hasURL, dct:license, dcatap:applicableLegislation) — am Builder nachgeprüft. Eine Ausnahme mit Begründung: Das Wiederholfeld für weitere Distributionen behält seinen Hilfetext. Für dieses Feld gibt es keinen Katalogeintrag, das Panel erscheint dort also gar nicht — der Tooltip ist die einzige Erklärung. U-2 — Merkmalsliste: Über der Definition stehen jetzt zwei Zeilen, Eigenschaft und Multiplizität. Meine ursprüngliche Annahme, beides läge in config/dcat-ap-fields.php strukturiert vor, war falsch: Das ist die Punkte-Registry der Qualitätsberechnung mit zehn Einträgen, sie deckt 13 der 53 Felder ab. Die Multiplizität stand dafür in 49 Definitionstexten maschinenlesbar; vier habe ich präzisiert, dann ist sie als eigener Schlüssel `cardinality` in alle 53 Einträge gewandert. Der Wertebereich bleibt außen vor — er wäre für 40 Felder geraten gewesen. Zwei neue Unit-Tests halten den strukturierten Wert und die Angabe im Definitionstext zusammen. Zwei neue E2E-Tests prüfen das Panel (beide Zeilen mit Wert, darunter beide Langtexte) und dass im Tooltip kein Beispiel zurückkehrt. Nebenbei behoben: bin/check-i18n.py hat config/ nie gescannt, obwohl mqa-metrics.php und dcat-ap-fields.php ihre Beschriftungen über __() führen — für 31 Zeichenketten hätte eine fehlende Übersetzung also nie jemand gemeldet. Aufgefallen, weil ich beim Aufräumen der Kataloge beinahe genau diese Einträge gelöscht hätte; die Prüfung hätte geschwiegen. Dazu die Schlagwort-Beschreibung, deren Beispiel der eigenen Regel widersprach (ein Wort je Zeile, dann ein Komma-Beispiel), und die README, die noch "Jedes Feld hat konkrete Beispiele" im Tooltip versprach. 245 Tests grün, PHPCS ohne Befund, i18n und Paketprüfung sauber. https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq --- CHANGELOG.md | 39 + README.md | 6 +- assets/css/admin.css | 23 + assets/js/odw-admin-fields.js | 32 + bin/check-i18n.py | 4 + config/field-catalog.php | 1311 ++++++++++++++------------- docs/FELD-REFERENZ.md | 79 +- includes/class-admin.php | 2 + includes/class-field-reference.php | 14 +- includes/class-fields.php | 84 +- languages/open-data-wizard-en_US.mo | Bin 66958 -> 67632 bytes languages/open-data-wizard-en_US.po | 21 + languages/open-data-wizard.pot | 21 + open-data-wizard.php | 4 +- package.json | 2 +- tests/e2e/admin-workflow.spec.js | 31 + tests/test-field-catalog.php | 35 + 17 files changed, 1013 insertions(+), 695 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c66ebd2..c080ab8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,45 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/spec/v2.0.0.ht --- +## [2.41.0] — 2026-08-27 + +Zwei Punkte aus dem Usability-Test, die zusammengehören: Hilfetexte haben jetzt je einen Ort, +und die Definition zeigt ihre Struktur. + +### ✨ Added +- **Merkmalsliste über jeder Definition.** Das „Mehr erfahren"-Panel nennt oben in zwei Zeilen + die DCAT-AP-Eigenschaft und die Multiplizität, darunter folgen wie bisher Alltagssprache und + Definition. Der Tester hatte bemerkt, dass die Definitionstexte einer festen Struktur folgen, + diese aber nur im Fließtext steht. +- **`cardinality` als eigenes Feld im Katalog** — für alle 53 Einträge. Zwei neue Tests halten + den strukturierten Wert und die Angabe im Definitionstext zusammen; ohne sie laufen beide + auseinander, sobald jemand nur eine Seite anfasst. + +### 🎨 Changed +- **Tooltip und „Mehr erfahren" haben getrennte Rollen.** Das ⓘ trägt nur noch den DCAT-AP-Begriff, + alles Erklärende steht im Panel. Vorher stand beides an beiden Orten — beim Herausgeber sogar + mit unterschiedlichen Beispielen. Betrifft 42 Felder. +- **Fünf Felder hatten gar keinen Fachbegriff im Tooltip**, sondern schon dort Prosa: die drei + Kontaktfelder, die eigene Lizenz-URI und die HVD-Kennzeichnung. Sie tragen jetzt ihren + tatsächlich ausgegebenen Begriff (`vcard:fn`, `vcard:hasEmail`, `vcard:hasURL`, `dct:license`, + `dcatap:applicableLegislation`). +- **Das Schlagwort-Beispiel widersprach seiner eigenen Regel.** Der Text verlangte ein Wort je + Zeile und nannte dann ein Beispiel mit Kommas — wer nur den Katalog las, tippte genau die + falsche Form. + +### 🐛 Fixed +- **`bin/check-i18n.py` übersah `config/`.** `mqa-metrics.php` und `dcat-ap-fields.php` führen + ihre Beschriftungen über `__()`, standen aber nicht in der Dateiliste der Prüfung — für 31 + Zeichenketten hätte eine fehlende Übersetzung also nie jemand gemeldet. Aufgefallen ist es, + weil ich beim Aufräumen der Kataloge beinahe genau diese Einträge gelöscht hätte. + +### ℹ️ Eine Ausnahme mit Begründung +Das Wiederholfeld für weitere Distributionen behält seinen Hilfetext: Für dieses Feld gibt es +keinen Katalogeintrag, das Panel erscheint dort also gar nicht — der Tooltip ist die einzige +Erklärung, die es hat. + +--- + ## [2.40.3] — 2026-08-27 Vier Punkte aus einem Usability-Test — und was beim Nachprüfen sonst noch auffiel. diff --git a/README.md b/README.md index 638abdc6..d537bbaa 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

Lizenz - Version + Version DCAT-AP 3.0 PHP >= 8.1 WordPress 6.4+ @@ -85,8 +85,8 @@ Eigener Bereich im WordPress-Backend mit Übersicht, Filterung und Statusverwalt ### 😊 Benutzerfreundliche Formularsprache Das Wizard-Formular wurde vollständig überarbeitet, um es auch ohne DCAT-AP-Kenntnisse intuitiv zu machen: - **Klare Fragen statt technischer Begriffe:** Statt „Herausgebende Organisation (dct:publisher)" fragt das Plugin: „Wer gibt diese Daten heraus?" -- **Hilfreiche Beispiele:** Jedes Feld hat konkrete, praxisnahe Beispiele -- **Ursprüngliche Labels in Hilfetexten:** DCAT-AP Bezeichnungen und technische Details bleiben in den Hilfetexten sichtbar +- **Zwei Hilfen mit klaren Rollen:** Das ⓘ-Symbol zeigt den DCAT-AP-Begriff des Feldes — der schnelle Blick für alle, die wissen wollen, was das im Standard ist. „Mehr erfahren" klappt die ausführliche Erklärung auf: die DCAT-AP-Eigenschaft und ihre Multiplizität als Kurzangabe, darunter eine Erklärung in Alltagssprache mit Beispiel und die normkonforme Definition +- **Jede Information an genau einem Ort:** Dadurch können Kurzhilfe und Langtext sich nicht mehr widersprechen - **Validierungsmeldungen in Klartext, mit Ort:** Wird die Veröffentlichung blockiert, nennt die Meldung den Tab und den verständlichen Feldnamen (der technische DCAT-AP-Begriff steht nur klein daneben) — ein Klick auf „Zum Feld springen" öffnet den passenden Tab und hebt das Feld hervor ### 🧭 Geführter Wizard diff --git a/assets/css/admin.css b/assets/css/admin.css index 411d5c78..a66b60cf 100644 --- a/assets/css/admin.css +++ b/assets/css/admin.css @@ -1043,6 +1043,29 @@ input.odw-cessda-input, border-radius: 0 var(--odw-radius, 4px) var(--odw-radius, 4px) 0; } +/* Merkmalsliste über der Definition: zwei Spalten, damit Beschriftung und + Wert untereinander fluchten. Der Wert steht in Monospace — es sind + technische Bezeichner, keine Prosa. */ +.odw-field-more__facts { + display: grid; + grid-template-columns: max-content 1fr; + gap: 2px 10px; + margin: 0 0 10px; + padding: 0 0 8px; + border-bottom: 1px solid var(--odw-color-border, #c3c4c7); +} + +.odw-field-more__facts dt { + margin: 0; + color: var(--odw-color-text-muted, #50575e); +} + +.odw-field-more__facts dd { + margin: 0; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + color: var(--odw-color-text, #1d2327); +} + .odw-field-more__block { margin: 0 0 8px; line-height: 1.5; diff --git a/assets/js/odw-admin-fields.js b/assets/js/odw-admin-fields.js index 78f60e59..4957bbd1 100644 --- a/assets/js/odw-admin-fields.js +++ b/assets/js/odw-admin-fields.js @@ -574,6 +574,34 @@ return p; } + // Zwei Merkmale über der Definition: die DCAT-AP-Eigenschaft und die + // Multiplizität. Beide stehen bisher nur mitten im Fließtext — als eigene + // Zeilen sind sie auf einen Blick erfassbar. + function moreFacts( cfg, field ) { + var rows = [ + [ cfg.prop || 'Eigenschaft', field.dcat_prop ], + [ cfg.mult || 'Multiplizität', field.cardinality ] + ].filter( function ( row ) { + return row[ 1 ]; + } ); + + if ( ! rows.length ) { + return null; + } + + var dl = document.createElement( 'dl' ); + dl.className = 'odw-field-more__facts'; + rows.forEach( function ( row ) { + var dt = document.createElement( 'dt' ); + dt.textContent = row[ 0 ]; + var dd = document.createElement( 'dd' ); + dd.textContent = row[ 1 ]; + dl.appendChild( dt ); + dl.appendChild( dd ); + } ); + return dl; + } + function initFieldMore() { var cfg = data.fieldMore || {}; var catalog = data.fieldCatalog || []; @@ -605,6 +633,10 @@ // formale Definition allein keine Hilfe ist. var body = document.createElement( 'div' ); body.className = 'odw-field-more__body'; + var facts = moreFacts( cfg, f ); + if ( facts ) { + body.appendChild( facts ); + } if ( f.desc_human ) { body.appendChild( moreBlock( cfg.plain, f.desc_human ) ); } diff --git a/bin/check-i18n.py b/bin/check-i18n.py index c419d02c..2533dc1d 100755 --- a/bin/check-i18n.py +++ b/bin/check-i18n.py @@ -37,6 +37,10 @@ def source_strings(): found = set() files = [os.path.join(ROOT, 'open-data-wizard.php')] files += sorted(glob.glob(os.path.join(ROOT, 'includes', '*.php'))) + # config/ ebenfalls: mqa-metrics.php und dcat-ap-fields.php führen ihre + # Labels über __(). Sie standen bis v2.41.0 nicht in dieser Liste — die + # Prüfung meldete für sie also nie eine fehlende Übersetzung. + files += sorted(glob.glob(os.path.join(ROOT, 'config', '*.php'))) for path in files: src = io.open(path, encoding='utf-8').read() diff --git a/config/field-catalog.php b/config/field-catalog.php index 9471857c..f7c8559e 100644 --- a/config/field-catalog.php +++ b/config/field-catalog.php @@ -38,76 +38,82 @@ // ========================================================================= array( - 'key' => 'publisher', - 'meta_key' => '_odw_publisher', - 'dcat_prop' => 'dct:publisher', - 'tab' => '1 — Grundlegende Informationen', - 'tier' => 'mandatory', - 'vocab' => '', - 'q_dcat' => 'Welche Stelle ist `dct:publisher` (verantwortliche Herausgeberin) des Datensatzes?', - 'q_human' => 'Wer gibt diese Daten heraus?', - 'desc_dcat' => '`dct:publisher` benennt die für die Bereitstellung des Datensatzes verantwortliche Stelle (eine `foaf:Agent`-Entität). In DCAT-AP 3.0 ist die Angabe verpflichtend (Multiplizität 1..1). Idealerweise wird die Organisation über eine URI referenziert; als Minimalform genügt der Name (`foaf:name`).', - 'desc_human' => 'Tragen Sie hier die Organisation ein, die die Daten offiziell veröffentlicht — also wer dafür verantwortlich ist, dass die Daten bereitstehen. Das ist oft eine Behörde, ein Amt oder ein Verein. Beispiel: „Statistisches Landesamt Musterstadt" oder „Umweltbundesamt".', - ), - array( - 'key' => 'theme', - 'meta_key' => '_odw_theme', - 'dcat_prop' => 'dcat:theme', - 'tab' => '1 — Grundlegende Informationen', - 'tier' => 'recommended', - 'vocab' => 'data-theme', - 'q_dcat' => 'Welchem `dcat:theme` (Datenthema) ist der Datensatz zugeordnet?', - 'q_human' => 'Welchem Thema ist dieser Datensatz zugeordnet?', - 'desc_dcat' => '`dcat:theme` ordnet den Datensatz einer oder mehreren Kategorien zu. In DCAT-AP wird das kontrollierte EU-Vokabular „Data Theme" (`http://publications.europa.eu/resource/authority/data-theme/`) verwendet, z. B. `ENVI` (Umwelt) oder `EDUC` (Bildung). Multiplizität 0..n.', - 'desc_human' => 'Wählen Sie das Themengebiet, zu dem die Daten am besten passen — ähnlich einer Schublade, in die der Datensatz einsortiert wird. Das hilft anderen, Ihre Daten über Themenfilter zu finden. Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur.', - ), - array( - 'key' => 'keywords', - 'meta_key' => '_odw_keywords', - 'dcat_prop' => 'dcat:keyword', - 'tab' => '1 — Grundlegende Informationen', - 'tier' => 'recommended', - 'vocab' => '', - 'q_dcat' => 'Welche `dcat:keyword` (Schlagwörter) beschreiben den Datensatz?', - 'q_human' => 'Mit welchen Schlagworten finde ich diese Daten?', - 'desc_dcat' => '`dcat:keyword` sind freie, sprachlich getaggte Schlagwörter zur Verbesserung der Auffindbarkeit (`literal-lang`, Multiplizität 0..n). Anders als `dcat:theme` sind sie nicht an ein kontrolliertes Vokabular gebunden. Je Schlagwort ein Wert.', - 'desc_human' => 'Tragen Sie einzelne Schlagwörter ein, unter denen man Ihre Daten suchen würde — jedes Wort in eine eigene Zeile. Sie ergänzen das Thema und machen die Daten leichter auffindbar. Beispiel: Umwelt, Wasser, Luftverschmutzung.', - ), - array( - 'key' => 'cessda_topic', - 'meta_key' => '_odw_cessda_topic', - 'dcat_prop' => 'dct:subject', - 'tab' => '1 — Grundlegende Informationen', - 'tier' => 'optional', - 'vocab' => 'cessda', - 'q_dcat' => 'Welches `dct:subject` (Fachthema) nach CESSDA-Vokabular beschreibt den Datensatz?', - 'q_human' => 'Welchem Themenfeld nach CESSDA ordnen Sie den Datensatz zu?', - 'desc_dcat' => '`dct:subject` verweist auf ein fachliches Thema aus einem kontrollierten Vokabular — hier die CESSDA Topic Classification (Version 4.2.3). Der Wert ist die Konzept-URI aus dem CESSDA-Vokabular. Mehrfachangabe möglich (Multiplizität 0..n); erscheint zusammen mit anderen Themenzuordnungen als Liste. Hinweis: `dct:subject` gehört nicht zum DCAT-AP.de-Profil — die offiziellen SHACL-Shapes kennen die Eigenschaft für Datensätze nicht. Als Dublin-Core-Angabe ist sie zulässig (RDF erlaubt zusätzliche Aussagen) und wird hier bewusst ausgegeben; streng profilkonforme Portale können sie ignorieren.', - 'desc_human' => 'Optional für sozial- und wirtschaftswissenschaftliche Daten: Ordnen Sie den Datensatz einem Fachthema aus dem CESSDA-Katalog zu (ein europäischer Standard für Forschungsdaten). Tippen Sie das Thema ein und wählen Sie aus der Vorschlagsliste. Beispiel: Volkszählungen, Migration, Wirtschaftspolitik.', - ), - array( - 'key' => 'engagementfeld', - 'meta_key' => '_odw_engagementfeld', - 'dcat_prop' => 'dct:subject', - 'tab' => '1 — Grundlegende Informationen', - 'tier' => 'optional', - 'vocab' => 'engagementfeld', - 'q_dcat' => 'Welches `dct:subject` (Engagementfeld) nach ZiviZ-Vokabular beschreibt den Datensatz?', - 'q_human' => 'Welchem Engagementfeld ist dieser Datensatz zuzuordnen?', - 'desc_dcat' => '`dct:subject` mit einem Konzept aus dem ZiviZ-Vokabular „Engagementfeld" (`https://ziviz.de/def/engagementfeld/`), das zivilgesellschaftliche Tätigkeitsfelder klassifiziert. Der Wert ist die Konzept-URI; die Label→URI-Auflösung erfolgt beim Speichern. Mehrfachangabe möglich (Multiplizität 0..n). Hinweis: `dct:subject` gehört nicht zum DCAT-AP.de-Profil — die offiziellen SHACL-Shapes kennen die Eigenschaft für Datensätze nicht. Als Dublin-Core-Angabe ist sie zulässig (RDF erlaubt zusätzliche Aussagen) und wird hier bewusst ausgegeben; streng profilkonforme Portale können sie ignorieren.', - 'desc_human' => 'Optional für Organisationen der Zivilgesellschaft: Ordnen Sie den Datensatz einem Engagementfeld zu — also dem gesellschaftlichen Bereich, in dem Sie aktiv sind. Wählen Sie einen Eintrag aus der Liste; die passende Kennung wird automatisch gesetzt. Beispiel: Kultur, Sport, Umwelt- und Naturschutz.', - ), - array( - 'key' => 'description', - 'meta_key' => '_odw_description', - 'dcat_prop' => 'dct:description', - 'tab' => '1 — Grundlegende Informationen', - 'tier' => 'mandatory', - 'vocab' => '', - 'q_dcat' => 'Wie lautet die `dct:description` (Freitextbeschreibung) des Datensatzes?', - 'q_human' => 'Worum geht es in diesem Datensatz?', - 'desc_dcat' => '`dct:description` ist eine frei formulierte, sprachlich getaggte Beschreibung des Datensatzes (`literal-lang`). In DCAT-AP 3.0 verpflichtend (Multiplizität 1..n je Sprache). Sie ergänzt den Titel um Inhalt, Kontext, Erhebungsmethode und Abgrenzung des Datensatzes.', - 'desc_human' => 'Beschreiben Sie in eigenen Worten, was in den Daten steckt: Worum geht es, was kann man damit machen, was ist enthalten? Ein bis zwei Absätze reichen. Beispiel: „Überblick über die bevölkerungsreichsten Städte Deutschlands mit Einwohnerzahlen und Entwicklung seit 2010."', + 'key' => 'publisher', + 'meta_key' => '_odw_publisher', + 'dcat_prop' => 'dct:publisher', + 'cardinality' => '1..1', + 'tab' => '1 — Grundlegende Informationen', + 'tier' => 'mandatory', + 'vocab' => '', + 'q_dcat' => 'Welche Stelle ist `dct:publisher` (verantwortliche Herausgeberin) des Datensatzes?', + 'q_human' => 'Wer gibt diese Daten heraus?', + 'desc_dcat' => '`dct:publisher` benennt die für die Bereitstellung des Datensatzes verantwortliche Stelle (eine `foaf:Agent`-Entität). In DCAT-AP 3.0 ist die Angabe verpflichtend (Multiplizität 1..1). Idealerweise wird die Organisation über eine URI referenziert; als Minimalform genügt der Name (`foaf:name`).', + 'desc_human' => 'Tragen Sie hier die Organisation ein, die die Daten offiziell veröffentlicht — also wer dafür verantwortlich ist, dass die Daten bereitstehen. Das ist oft eine Behörde, ein Amt oder ein Verein. Beispiel: „Statistisches Landesamt Musterstadt" oder „Umweltbundesamt".', + ), + array( + 'key' => 'theme', + 'meta_key' => '_odw_theme', + 'dcat_prop' => 'dcat:theme', + 'cardinality' => '0..n', + 'tab' => '1 — Grundlegende Informationen', + 'tier' => 'recommended', + 'vocab' => 'data-theme', + 'q_dcat' => 'Welchem `dcat:theme` (Datenthema) ist der Datensatz zugeordnet?', + 'q_human' => 'Welchem Thema ist dieser Datensatz zugeordnet?', + 'desc_dcat' => '`dcat:theme` ordnet den Datensatz einer oder mehreren Kategorien zu. In DCAT-AP wird das kontrollierte EU-Vokabular „Data Theme" (`http://publications.europa.eu/resource/authority/data-theme/`) verwendet, z. B. `ENVI` (Umwelt) oder `EDUC` (Bildung). Multiplizität 0..n.', + 'desc_human' => 'Wählen Sie das Themengebiet, zu dem die Daten am besten passen — ähnlich einer Schublade, in die der Datensatz einsortiert wird. Das hilft anderen, Ihre Daten über Themenfilter zu finden. Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur.', + ), + array( + 'key' => 'keywords', + 'meta_key' => '_odw_keywords', + 'dcat_prop' => 'dcat:keyword', + 'cardinality' => '0..n', + 'tab' => '1 — Grundlegende Informationen', + 'tier' => 'recommended', + 'vocab' => '', + 'q_dcat' => 'Welche `dcat:keyword` (Schlagwörter) beschreiben den Datensatz?', + 'q_human' => 'Mit welchen Schlagworten finde ich diese Daten?', + 'desc_dcat' => '`dcat:keyword` sind freie, sprachlich getaggte Schlagwörter zur Verbesserung der Auffindbarkeit (`literal-lang`, Multiplizität 0..n). Anders als `dcat:theme` sind sie nicht an ein kontrolliertes Vokabular gebunden. Je Schlagwort ein Wert.', + 'desc_human' => 'Tragen Sie einzelne Schlagwörter ein, unter denen man Ihre Daten suchen würde — jedes Wort in eine eigene Zeile. Sie ergänzen das Thema und machen die Daten leichter auffindbar. Beispiel: erst „Umwelt", darunter „Wasser", darunter „Luftverschmutzung". Trennen Sie die Schlagwörter nicht mit Komma.', + ), + array( + 'key' => 'cessda_topic', + 'meta_key' => '_odw_cessda_topic', + 'dcat_prop' => 'dct:subject', + 'cardinality' => '0..n', + 'tab' => '1 — Grundlegende Informationen', + 'tier' => 'optional', + 'vocab' => 'cessda', + 'q_dcat' => 'Welches `dct:subject` (Fachthema) nach CESSDA-Vokabular beschreibt den Datensatz?', + 'q_human' => 'Welchem Themenfeld nach CESSDA ordnen Sie den Datensatz zu?', + 'desc_dcat' => '`dct:subject` verweist auf ein fachliches Thema aus einem kontrollierten Vokabular — hier die CESSDA Topic Classification (Version 4.2.3). Der Wert ist die Konzept-URI aus dem CESSDA-Vokabular. Mehrfachangabe möglich (Multiplizität 0..n); erscheint zusammen mit anderen Themenzuordnungen als Liste. Hinweis: `dct:subject` gehört nicht zum DCAT-AP.de-Profil — die offiziellen SHACL-Shapes kennen die Eigenschaft für Datensätze nicht. Als Dublin-Core-Angabe ist sie zulässig (RDF erlaubt zusätzliche Aussagen) und wird hier bewusst ausgegeben; streng profilkonforme Portale können sie ignorieren.', + 'desc_human' => 'Optional für sozial- und wirtschaftswissenschaftliche Daten: Ordnen Sie den Datensatz einem Fachthema aus dem CESSDA-Katalog zu (ein europäischer Standard für Forschungsdaten). Tippen Sie das Thema ein und wählen Sie aus der Vorschlagsliste. Beispiel: Volkszählungen, Migration, Wirtschaftspolitik.', + ), + array( + 'key' => 'engagementfeld', + 'meta_key' => '_odw_engagementfeld', + 'dcat_prop' => 'dct:subject', + 'cardinality' => '0..n', + 'tab' => '1 — Grundlegende Informationen', + 'tier' => 'optional', + 'vocab' => 'engagementfeld', + 'q_dcat' => 'Welches `dct:subject` (Engagementfeld) nach ZiviZ-Vokabular beschreibt den Datensatz?', + 'q_human' => 'Welchem Engagementfeld ist dieser Datensatz zuzuordnen?', + 'desc_dcat' => '`dct:subject` mit einem Konzept aus dem ZiviZ-Vokabular „Engagementfeld" (`https://ziviz.de/def/engagementfeld/`), das zivilgesellschaftliche Tätigkeitsfelder klassifiziert. Der Wert ist die Konzept-URI; die Label→URI-Auflösung erfolgt beim Speichern. Mehrfachangabe möglich (Multiplizität 0..n). Hinweis: `dct:subject` gehört nicht zum DCAT-AP.de-Profil — die offiziellen SHACL-Shapes kennen die Eigenschaft für Datensätze nicht. Als Dublin-Core-Angabe ist sie zulässig (RDF erlaubt zusätzliche Aussagen) und wird hier bewusst ausgegeben; streng profilkonforme Portale können sie ignorieren.', + 'desc_human' => 'Optional für Organisationen der Zivilgesellschaft: Ordnen Sie den Datensatz einem Engagementfeld zu — also dem gesellschaftlichen Bereich, in dem Sie aktiv sind. Wählen Sie einen Eintrag aus der Liste; die passende Kennung wird automatisch gesetzt. Beispiel: Kultur, Sport, Umwelt- und Naturschutz.', + ), + array( + 'key' => 'description', + 'meta_key' => '_odw_description', + 'dcat_prop' => 'dct:description', + 'cardinality' => '1..n', + 'tab' => '1 — Grundlegende Informationen', + 'tier' => 'mandatory', + 'vocab' => '', + 'q_dcat' => 'Wie lautet die `dct:description` (Freitextbeschreibung) des Datensatzes?', + 'q_human' => 'Worum geht es in diesem Datensatz?', + 'desc_dcat' => '`dct:description` ist eine frei formulierte, sprachlich getaggte Beschreibung des Datensatzes (`literal-lang`). In DCAT-AP 3.0 verpflichtend (Multiplizität 1..n je Sprache). Sie ergänzt den Titel um Inhalt, Kontext, Erhebungsmethode und Abgrenzung des Datensatzes.', + 'desc_human' => 'Beschreiben Sie in eigenen Worten, was in den Daten steckt: Worum geht es, was kann man damit machen, was ist enthalten? Ein bis zwei Absätze reichen. Beispiel: „Überblick über die bevölkerungsreichsten Städte Deutschlands mit Einwohnerzahlen und Entwicklung seit 2010."', ), // ========================================================================= @@ -115,16 +121,17 @@ // ========================================================================= array( - 'key' => 'language', - 'meta_key' => '_odw_language', - 'dcat_prop' => 'dct:language', - 'tab' => '2 — Sprache & Übersetzungen', - 'tier' => 'recommended', - 'vocab' => 'language', - 'q_dcat' => 'In welcher `dct:language` (Sprache) liegen die Daten vor?', - 'q_human' => 'In welcher Sprache sind die Daten?', - 'desc_dcat' => '`dct:language` gibt die Sprache des Datensatzes an, referenziert über das EU-Authority-Vokabular „Language" (`http://publications.europa.eu/resource/authority/language/`, z. B. `DEU`, `ENG`). Multiplizität 0..n — mehrsprachige Datensätze können mehrere Sprachen angeben.', - 'desc_human' => 'Geben Sie an, in welcher Sprache die Inhalte der Daten verfasst sind (z. B. die Spaltenüberschriften und Texte). Das hilft Nutzenden einzuschätzen, ob sie die Daten verstehen. Beispiel: Deutsch, Englisch.', + 'key' => 'language', + 'meta_key' => '_odw_language', + 'dcat_prop' => 'dct:language', + 'cardinality' => '0..n', + 'tab' => '2 — Sprache & Übersetzungen', + 'tier' => 'recommended', + 'vocab' => 'language', + 'q_dcat' => 'In welcher `dct:language` (Sprache) liegen die Daten vor?', + 'q_human' => 'In welcher Sprache sind die Daten?', + 'desc_dcat' => '`dct:language` gibt die Sprache des Datensatzes an, referenziert über das EU-Authority-Vokabular „Language" (`http://publications.europa.eu/resource/authority/language/`, z. B. `DEU`, `ENG`). Multiplizität 0..n — mehrsprachige Datensätze können mehrere Sprachen angeben.', + 'desc_human' => 'Geben Sie an, in welcher Sprache die Inhalte der Daten verfasst sind (z. B. die Spaltenüberschriften und Texte). Das hilft Nutzenden einzuschätzen, ob sie die Daten verstehen. Beispiel: Deutsch, Englisch.', ), // ========================================================================= @@ -132,88 +139,95 @@ // ========================================================================= array( - 'key' => 'access_url', - 'meta_key' => '_odw_access_url', - 'dcat_prop' => 'dcat:accessURL', - 'tab' => '3 — Datenbereitstellung', - 'tier' => 'mandatory', - 'vocab' => '', - 'q_dcat' => 'Unter welcher `dcat:accessURL` ist die Distribution erreichbar?', - 'q_human' => 'Wo kann man die Datei herunterladen oder ansehen?', - 'desc_dcat' => '`dcat:accessURL` verweist auf eine Ressource, über die auf die Distribution zugegriffen werden kann (Range `rdfs:Resource`, Multiplizität 1..n je Distribution). Sie kann auf eine Landing-Page, einen Feed, einen Endpunkt oder — bei direktem Download — dieselbe Ressource wie `dcat:downloadURL` zeigen. Pflichtangabe je Distribution.', - 'desc_human' => 'Tragen Sie den Link ein, unter dem Ihre Daten zu finden sind — die Adresse einer Datei zum Herunterladen oder einer Seite, auf der die Daten liegen. Alternativ laden Sie die Datei über die Mediathek-Box hoch; dann wird dieser Link automatisch gesetzt und Sie müssen ihn nicht selbst eintippen. Beispiel: https://beispiel.de/daten/statistik.csv.', - ), - array( - 'key' => 'format', - 'meta_key' => '_odw_format', - 'dcat_prop' => 'dct:format', - 'tab' => '3 — Datenbereitstellung', - 'tier' => 'recommended', - 'vocab' => 'file-type', - 'q_dcat' => 'Welches `dct:format` (Dateiformat) hat die Distribution?', - 'q_human' => 'In welchem Format ist die Datei?', - 'desc_dcat' => '`dct:format` gibt das Format der Distribution an, referenziert über das EU-Authority-Vokabular „File Type" (`http://publications.europa.eu/resource/authority/file-type/`, z. B. `CSV`, `JSON`, `PDF`). Multiplizität 0..1. Ergänzt `dcat:mediaType` (MIME-Typ) um das anwendungsnahe Format.', - 'desc_human' => 'Wählen Sie das Format der bereitgestellten Datei. Daran erkennen Nutzende, mit welchem Programm sie die Daten öffnen können. Maschinenlesbare, offene Formate wie CSV oder JSON sind besonders empfehlenswert. Beispiel: CSV, JSON, PDF.', - ), - array( - 'key' => 'byte_size', - 'meta_key' => '_odw_byte_size', - 'dcat_prop' => 'dcat:byteSize', - 'tab' => '3 — Datenbereitstellung', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Wie groß ist die Distribution laut `dcat:byteSize` (in Bytes)?', - 'q_human' => 'Wie groß ist die Datei?', - 'desc_dcat' => '`dcat:byteSize` gibt die Größe der Distribution in Bytes als nicht-negative Ganzzahl an (`xsd:nonNegativeInteger`, Multiplizität 0..1). Bei einem Mediathek-Upload wird der Wert automatisch aus der Datei ermittelt.', - 'desc_human' => 'Die Dateigröße in Bytes — nur die reine Zahl. Nutzende sehen so vorab, wie viel sie herunterladen. Bei hochgeladenen Dateien wird die Größe automatisch berechnet. Beispiel: 2048576 (das sind rund 2 MB).', - ), - array( - 'key' => 'license', - 'meta_key' => '_odw_license', - 'dcat_prop' => 'dct:license', - 'tab' => '3 — Datenbereitstellung', - 'tier' => 'mandatory', - 'vocab' => 'licenses', - 'q_dcat' => 'Unter welcher `dct:license` (Lizenz) steht die Distribution?', - 'q_human' => 'Unter welcher Lizenz sind diese Daten verfügbar?', - 'desc_dcat' => '`dct:license` benennt das rechtliche Dokument, unter dem die Distribution bereitgestellt wird (Range `dct:LicenseDocument`, referenziert per URI). Verpflichtend für die Wiederverwendbarkeit. Empfohlen werden URIs offener Lizenzen (Creative Commons, Datenlizenz Deutschland, DCAT-AP.de-Lizenzregister).', - 'desc_human' => 'Legen Sie fest, was andere mit Ihren Daten tun dürfen — das regelt die Lizenz. Wählen Sie eine der vorgeschlagenen Standardlizenzen; „offene" Lizenzen erlauben die freie Weiternutzung. Ohne Lizenz sind Daten rechtlich unklar und kaum nachnutzbar. Beispiel: CC-BY 4.0 (Namensnennung).', - ), - array( - 'key' => 'license_custom', - 'meta_key' => '_odw_license_custom', - 'dcat_prop' => 'dct:license', - 'tab' => '3 — Datenbereitstellung', - 'tier' => 'conditional', - 'vocab' => 'licenses', - 'q_dcat' => 'Welche `dct:license`-URI gilt, wenn keine Standardlizenz zutrifft?', - 'q_human' => 'Welche eigene Lizenz-URI möchten Sie angeben?', - 'desc_dcat' => 'Nur relevant, wenn im Lizenzfeld „Sonstige" gewählt wurde: Hier wird die `dct:license`-URI einer nicht in der Standardliste enthaltenen Lizenz eingetragen. Das Auto-Suggest bietet zusätzlich die URIs des DCAT-AP.de-Lizenzregisters (`http://dcat-ap.de/def/licenses/…`) an.', - 'desc_human' => 'Dieses Feld erscheint nur, wenn Sie oben „Sonstige" Lizenz gewählt haben. Tragen Sie dann die Web-Adresse (URI) Ihrer Lizenz ein oder wählen Sie eine aus der Vorschlagsliste. Beispiel: http://dcat-ap.de/def/licenses/dl-by-de/2.0.', - ), - array( - 'key' => 'attribution_text', - 'meta_key' => '_odw_attribution_text', - 'dcat_prop' => 'dcatde:licenseAttributionByText', - 'tab' => '3 — Datenbereitstellung', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welcher `dcatde:licenseAttributionByText` (Namensnennungstext) ist bei Nachnutzung anzugeben?', - 'q_human' => 'Welcher Namensnennungstext soll bei Weiternutzung angegeben werden?', - 'desc_dcat' => '`dcatde:licenseAttributionByText` (DCAT-AP.de) enthält den exakten Namensnennungstext, den Nachnutzende bei Lizenzen mit Namensnennungspflicht (z. B. CC-BY, DL-DE-BY) zitieren müssen. Freitext (`literal`), Multiplizität 0..1.', - 'desc_human' => 'Bei Lizenzen mit Namensnennung („BY") geben Sie hier vor, wie andere Sie nennen sollen, wenn sie Ihre Daten verwenden. So bekommen Sie korrekt Credit. Beispiel: „Datenquelle: Stadt Musterstadt, 2026".', - ), - array( - 'key' => 'availability', - 'meta_key' => '_odw_availability', - 'dcat_prop' => 'dcatap:availability', - 'tab' => '3 — Datenbereitstellung', - 'tier' => 'optional', - 'vocab' => 'planned-availability', - 'q_dcat' => 'Welche `dcatap:availability` (Verfügbarkeitsgarantie) hat die Distribution?', - 'q_human' => 'Wie dauerhaft ist diese Datei verfügbar?', - 'desc_dcat' => '`dcatap:availability` beschreibt die geplante Verfügbarkeit einer Distribution über das EU-Vokabular „Planned Availability" (z. B. `AVAILABLE`, `TEMPORARY`, `EXPERIMENTAL`, `STABLE`). Multiplizität 0..1. Gibt Nachnutzenden Planungssicherheit.', - 'desc_human' => 'Geben Sie an, wie verlässlich die Datei langfristig erreichbar bleibt — dauerhaft, nur vorübergehend oder experimentell. Das hilft anderen einzuschätzen, ob sie sich auf den Link verlassen können. Beispiel: Dauerhaft verfügbar.', + 'key' => 'access_url', + 'meta_key' => '_odw_access_url', + 'dcat_prop' => 'dcat:accessURL', + 'cardinality' => '1..n', + 'tab' => '3 — Datenbereitstellung', + 'tier' => 'mandatory', + 'vocab' => '', + 'q_dcat' => 'Unter welcher `dcat:accessURL` ist die Distribution erreichbar?', + 'q_human' => 'Wo kann man die Datei herunterladen oder ansehen?', + 'desc_dcat' => '`dcat:accessURL` verweist auf eine Ressource, über die auf die Distribution zugegriffen werden kann (Range `rdfs:Resource`, Multiplizität 1..n je Distribution). Sie kann auf eine Landing-Page, einen Feed, einen Endpunkt oder — bei direktem Download — dieselbe Ressource wie `dcat:downloadURL` zeigen. Pflichtangabe je Distribution.', + 'desc_human' => 'Tragen Sie den Link ein, unter dem Ihre Daten zu finden sind — die Adresse einer Datei zum Herunterladen oder einer Seite, auf der die Daten liegen. Alternativ laden Sie die Datei über die Mediathek-Box hoch; dann wird dieser Link automatisch gesetzt und Sie müssen ihn nicht selbst eintippen. Beispiel: https://beispiel.de/daten/statistik.csv.', + ), + array( + 'key' => 'format', + 'meta_key' => '_odw_format', + 'dcat_prop' => 'dct:format', + 'cardinality' => '0..1', + 'tab' => '3 — Datenbereitstellung', + 'tier' => 'recommended', + 'vocab' => 'file-type', + 'q_dcat' => 'Welches `dct:format` (Dateiformat) hat die Distribution?', + 'q_human' => 'In welchem Format ist die Datei?', + 'desc_dcat' => '`dct:format` gibt das Format der Distribution an, referenziert über das EU-Authority-Vokabular „File Type" (`http://publications.europa.eu/resource/authority/file-type/`, z. B. `CSV`, `JSON`, `PDF`). Multiplizität 0..1. Ergänzt `dcat:mediaType` (MIME-Typ) um das anwendungsnahe Format.', + 'desc_human' => 'Wählen Sie das Format der bereitgestellten Datei. Daran erkennen Nutzende, mit welchem Programm sie die Daten öffnen können. Maschinenlesbare, offene Formate wie CSV oder JSON sind besonders empfehlenswert. Beispiel: CSV, JSON, PDF.', + ), + array( + 'key' => 'byte_size', + 'meta_key' => '_odw_byte_size', + 'dcat_prop' => 'dcat:byteSize', + 'cardinality' => '0..1', + 'tab' => '3 — Datenbereitstellung', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Wie groß ist die Distribution laut `dcat:byteSize` (in Bytes)?', + 'q_human' => 'Wie groß ist die Datei?', + 'desc_dcat' => '`dcat:byteSize` gibt die Größe der Distribution in Bytes als nicht-negative Ganzzahl an (`xsd:nonNegativeInteger`, Multiplizität 0..1). Bei einem Mediathek-Upload wird der Wert automatisch aus der Datei ermittelt.', + 'desc_human' => 'Die Dateigröße in Bytes — nur die reine Zahl. Nutzende sehen so vorab, wie viel sie herunterladen. Bei hochgeladenen Dateien wird die Größe automatisch berechnet. Beispiel: 2048576 (das sind rund 2 MB).', + ), + array( + 'key' => 'license', + 'meta_key' => '_odw_license', + 'dcat_prop' => 'dct:license', + 'cardinality' => '0..1', + 'tab' => '3 — Datenbereitstellung', + 'tier' => 'mandatory', + 'vocab' => 'licenses', + 'q_dcat' => 'Unter welcher `dct:license` (Lizenz) steht die Distribution?', + 'q_human' => 'Unter welcher Lizenz sind diese Daten verfügbar?', + 'desc_dcat' => '`dct:license` benennt das rechtliche Dokument, unter dem die Distribution bereitgestellt wird (Range `dct:LicenseDocument`, referenziert per URI). Multiplizität 0..1 je Distribution; das Plugin erzwingt die Angabe, weil ohne Lizenz keine Nachnutzung möglich ist. Empfohlen werden URIs offener Lizenzen (Creative Commons, Datenlizenz Deutschland, DCAT-AP.de-Lizenzregister).', + 'desc_human' => 'Legen Sie fest, was andere mit Ihren Daten tun dürfen — das regelt die Lizenz. Wählen Sie eine der vorgeschlagenen Standardlizenzen; „offene" Lizenzen erlauben die freie Weiternutzung. Ohne Lizenz sind Daten rechtlich unklar und kaum nachnutzbar. Beispiel: CC-BY 4.0 (Namensnennung).', + ), + array( + 'key' => 'license_custom', + 'meta_key' => '_odw_license_custom', + 'dcat_prop' => 'dct:license', + 'cardinality' => '0..1', + 'tab' => '3 — Datenbereitstellung', + 'tier' => 'conditional', + 'vocab' => 'licenses', + 'q_dcat' => 'Welche `dct:license`-URI gilt, wenn keine Standardlizenz zutrifft?', + 'q_human' => 'Welche eigene Lizenz-URI möchten Sie angeben?', + 'desc_dcat' => 'Nur relevant, wenn im Lizenzfeld „Sonstige" gewählt wurde: Hier wird die `dct:license`-URI einer nicht in der Standardliste enthaltenen Lizenz eingetragen. Das Auto-Suggest bietet zusätzlich die URIs des DCAT-AP.de-Lizenzregisters (`http://dcat-ap.de/def/licenses/…`) an. Multiplizität 0..1 je Distribution — es ist dieselbe Eigenschaft wie oben.', + 'desc_human' => 'Dieses Feld erscheint nur, wenn Sie oben „Sonstige" Lizenz gewählt haben. Tragen Sie dann die Web-Adresse (URI) Ihrer Lizenz ein oder wählen Sie eine aus der Vorschlagsliste. Beispiel: http://dcat-ap.de/def/licenses/dl-by-de/2.0.', + ), + array( + 'key' => 'attribution_text', + 'meta_key' => '_odw_attribution_text', + 'dcat_prop' => 'dcatde:licenseAttributionByText', + 'cardinality' => '0..1', + 'tab' => '3 — Datenbereitstellung', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welcher `dcatde:licenseAttributionByText` (Namensnennungstext) ist bei Nachnutzung anzugeben?', + 'q_human' => 'Welcher Namensnennungstext soll bei Weiternutzung angegeben werden?', + 'desc_dcat' => '`dcatde:licenseAttributionByText` (DCAT-AP.de) enthält den exakten Namensnennungstext, den Nachnutzende bei Lizenzen mit Namensnennungspflicht (z. B. CC-BY, DL-DE-BY) zitieren müssen. Freitext (`literal`), Multiplizität 0..1.', + 'desc_human' => 'Bei Lizenzen mit Namensnennung („BY") geben Sie hier vor, wie andere Sie nennen sollen, wenn sie Ihre Daten verwenden. So bekommen Sie korrekt Credit. Beispiel: „Datenquelle: Stadt Musterstadt, 2026".', + ), + array( + 'key' => 'availability', + 'meta_key' => '_odw_availability', + 'dcat_prop' => 'dcatap:availability', + 'cardinality' => '0..1', + 'tab' => '3 — Datenbereitstellung', + 'tier' => 'optional', + 'vocab' => 'planned-availability', + 'q_dcat' => 'Welche `dcatap:availability` (Verfügbarkeitsgarantie) hat die Distribution?', + 'q_human' => 'Wie dauerhaft ist diese Datei verfügbar?', + 'desc_dcat' => '`dcatap:availability` beschreibt die geplante Verfügbarkeit einer Distribution über das EU-Vokabular „Planned Availability" (z. B. `AVAILABLE`, `TEMPORARY`, `EXPERIMENTAL`, `STABLE`). Multiplizität 0..1. Gibt Nachnutzenden Planungssicherheit.', + 'desc_human' => 'Geben Sie an, wie verlässlich die Datei langfristig erreichbar bleibt — dauerhaft, nur vorübergehend oder experimentell. Das hilft anderen einzuschätzen, ob sie sich auf den Link verlassen können. Beispiel: Dauerhaft verfügbar.', ), // ========================================================================= @@ -221,476 +235,515 @@ // ========================================================================= array( - 'key' => 'landing_page', - 'meta_key' => '_odw_landing_page', - 'dcat_prop' => 'dcat:landingPage', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `dcat:landingPage` (Projekt-/Infoseite) gehört zum Datensatz?', - 'q_human' => 'Wo finde ich mehr Informationen zu diesem Projekt?', - 'desc_dcat' => '`dcat:landingPage` verweist auf eine menschenlesbare Webseite mit weiteren Informationen zum Datensatz (Range `foaf:Document`, Multiplizität 0..n). Anders als `dcat:accessURL` führt sie nicht direkt zu den Daten, sondern zu Kontext, Dokumentation oder Projektbeschreibung.', - 'desc_human' => 'Verlinken Sie eine Webseite, auf der man mehr über die Daten oder das Projekt erfährt — etwa eine Projekt- oder Dokumentationsseite. Das ist nicht der direkte Download, sondern die „Über uns"-Seite zu den Daten. Beispiel: https://beispiel.de/projekt.', - ), - array( - 'key' => 'issued', - 'meta_key' => '_odw_issued', - 'dcat_prop' => 'dct:issued', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'recommended', - 'vocab' => '', - 'q_dcat' => 'Wann wurde der Datensatz `dct:issued` (erstveröffentlicht)?', - 'q_human' => 'Wann wurden diese Daten zum ersten Mal veröffentlicht?', - 'desc_dcat' => '`dct:issued` ist das Datum der formalen Erstveröffentlichung des Datensatzes, typisiert als `xsd:date` bzw. `xsd:dateTime`. Multiplizität 0..1. Nicht zu verwechseln mit `dct:modified` (letzte Änderung) oder dem Erhebungszeitraum (`dct:temporal`).', - 'desc_human' => 'Geben Sie das Datum an, an dem die Daten erstmals veröffentlicht wurden. Das ist der „Geburtstag" des Datensatzes, nicht der Zeitraum, den die Daten abdecken. Beispiel: 2024-01-15.', - ), - array( - 'key' => 'modified', - 'meta_key' => '_odw_modified', - 'dcat_prop' => 'dct:modified', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'recommended', - 'vocab' => '', + 'key' => 'landing_page', + 'meta_key' => '_odw_landing_page', + 'dcat_prop' => 'dcat:landingPage', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `dcat:landingPage` (Projekt-/Infoseite) gehört zum Datensatz?', + 'q_human' => 'Wo finde ich mehr Informationen zu diesem Projekt?', + 'desc_dcat' => '`dcat:landingPage` verweist auf eine menschenlesbare Webseite mit weiteren Informationen zum Datensatz (Range `foaf:Document`, Multiplizität 0..n). Anders als `dcat:accessURL` führt sie nicht direkt zu den Daten, sondern zu Kontext, Dokumentation oder Projektbeschreibung.', + 'desc_human' => 'Verlinken Sie eine Webseite, auf der man mehr über die Daten oder das Projekt erfährt — etwa eine Projekt- oder Dokumentationsseite. Das ist nicht der direkte Download, sondern die „Über uns"-Seite zu den Daten. Beispiel: https://beispiel.de/projekt.', + ), + array( + 'key' => 'issued', + 'meta_key' => '_odw_issued', + 'dcat_prop' => 'dct:issued', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'recommended', + 'vocab' => '', + 'q_dcat' => 'Wann wurde der Datensatz `dct:issued` (erstveröffentlicht)?', + 'q_human' => 'Wann wurden diese Daten zum ersten Mal veröffentlicht?', + 'desc_dcat' => '`dct:issued` ist das Datum der formalen Erstveröffentlichung des Datensatzes, typisiert als `xsd:date` bzw. `xsd:dateTime`. Multiplizität 0..1. Nicht zu verwechseln mit `dct:modified` (letzte Änderung) oder dem Erhebungszeitraum (`dct:temporal`).', + 'desc_human' => 'Geben Sie das Datum an, an dem die Daten erstmals veröffentlicht wurden. Das ist der „Geburtstag" des Datensatzes, nicht der Zeitraum, den die Daten abdecken. Beispiel: 2024-01-15.', + ), + array( + 'key' => 'modified', + 'meta_key' => '_odw_modified', + 'dcat_prop' => 'dct:modified', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'recommended', + 'vocab' => '', // Kein Formularfeld: Der Wert wird beim Speichern automatisch gesetzt. // Das Flag nimmt den Eintrag von der Formular-Abdeckungsprüfung aus, // ohne die Eigenschaft aus der Feld-Referenz zu entfernen — sie steht // weiterhin im veröffentlichten JSON-LD. - 'auto' => true, - 'q_dcat' => 'Wann wurde der Datensatz zuletzt `dct:modified` (geändert)?', - 'q_human' => 'Wann wurden diese Daten zuletzt aktualisiert?', - 'desc_dcat' => '`dct:modified` gibt das Datum der letzten inhaltlichen Änderung des Datensatzes an (`xsd:date`/`xsd:dateTime`, Multiplizität 0..1). Das Plugin setzt diesen Wert bei jeder Speicherung automatisch; ein Eingabefeld gibt es bewusst nicht, da eine manuelle Angabe beim nächsten Speichern überschrieben würde.', - 'desc_human' => 'Das Datum der letzten Aktualisierung. Es wird beim Speichern automatisch gesetzt, sodass Nutzende immer sehen, wie aktuell die Daten sind — Sie müssen dafür nichts eintragen. Beispiel: 2026-04-22.', - ), - array( - 'key' => 'accrual_periodicity', - 'meta_key' => '_odw_accrual_periodicity', - 'dcat_prop' => 'dct:accrualPeriodicity', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'frequency', - 'q_dcat' => 'Welche `dct:accrualPeriodicity` (Aktualisierungsfrequenz) hat der Datensatz?', - 'q_human' => 'Wie oft werden diese Daten aktualisiert?', - 'desc_dcat' => '`dct:accrualPeriodicity` gibt an, in welchem Rhythmus der Datensatz aktualisiert wird, referenziert über das EU-Vokabular „Frequency" (`http://publications.europa.eu/resource/authority/frequency/`, z. B. `DAILY`, `MONTHLY`, `ANNUAL`). Multiplizität 0..1.', - 'desc_human' => 'Geben Sie an, wie regelmäßig neue Daten hinzukommen — täglich, monatlich, jährlich oder unregelmäßig. Nutzende wissen dann, wie oft sich ein erneuter Blick lohnt. Beispiel: Jährlich.', - ), - array( - 'key' => 'political_geocoding_level', - 'meta_key' => '_odw_political_geocoding_level', - 'dcat_prop' => 'dcatde:politicalGeocodingLevelURI', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'politicalGeocodingLevel', - 'q_dcat' => 'Welche `dcatde:politicalGeocodingLevelURI` (Verwaltungsebene) betrifft der Datensatz?', - 'q_human' => 'Auf welcher Verwaltungsebene wurden diese Daten erhoben?', - 'desc_dcat' => '`dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular; im Formular wählbar als Bund, Land, Landkreis und Gemeinde. Multiplizität 0..1. Ergänzt die konkrete Gebietsangabe.', - 'desc_human' => 'Wählen Sie, auf welcher staatlichen Ebene die Daten angesiedelt sind — Bund, Land, Landkreis oder Gemeinde. Das ordnet die Daten geografisch-administrativ ein. Beispiel: Gemeinde.', - ), - array( - 'key' => 'political_geocoding_uri', - 'meta_key' => '_odw_political_geocoding_uri', - 'dcat_prop' => 'dcatde:politicalGeocodingURI', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welches `dcatde:politicalGeocodingURI` (amtliches Gebiet) beschreibt den räumlichen Bezug?', - 'q_human' => 'Auf welches amtliche Gebiet beziehen sich die Daten?', - 'desc_dcat' => '`dcatde:politicalGeocodingURI` (DCAT-AP.de) referenziert ein konkretes amtliches Gebiet über eine URI (z. B. amtlicher Regionalschlüssel/AGS als URI). Multiplizität 0..n. Ermöglicht die eindeutige, maschinenlesbare Verortung.', - 'desc_human' => 'Verlinken Sie das genaue amtliche Gebiet, auf das sich die Daten beziehen — als offizielle Kennung (z. B. Gemeindeschlüssel). Damit ist eindeutig, welche Region gemeint ist. Beispiel: die URI zum amtlichen Gemeindeschlüssel Ihrer Stadt.', - ), - array( - 'key' => 'geocoding_description', - 'meta_key' => '_odw_geocoding_description', - 'dcat_prop' => 'dcatde:geocodingDescription', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Wie lautet die `dcatde:geocodingDescription` (textuelle Beschreibung des räumlichen Bezugs)?', - 'q_human' => 'Wie lässt sich der räumliche Bezug in Worten beschreiben?', - 'desc_dcat' => '`dcatde:geocodingDescription` (DCAT-AP.de) ist eine frei formulierte textuelle Beschreibung der räumlichen Abdeckung (`literal`/`literal-lang`). Multiplizität 0..n. Ergänzt die maschinenlesbaren Angaben `dct:spatial` und `dcatde:politicalGeocodingURI` um eine menschenlesbare Erläuterung.', - 'desc_human' => 'Beschreiben Sie den räumlichen Bezug zusätzlich in Worten — etwa wenn ein Gebietsschlüssel allein nicht genau genug ist. Das hilft Nutzenden, die Abdeckung einzuordnen. Beispiel: „Stadtgebiet Musterstadt ohne den Ortsteil X".', - ), - array( - 'key' => 'spatial', - 'meta_key' => '_odw_spatial', - 'dcat_prop' => 'dct:spatial', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `dct:spatial` (geografische Abdeckung) hat der Datensatz?', - 'q_human' => 'Welche geografische Region betreffen diese Daten?', - 'desc_dcat' => '`dct:spatial` beschreibt die räumliche Abdeckung des Datensatzes (Range `dct:Location`). Als Wert dient eine Gebiets-URI (z. B. GeoNames, EU-Continents) oder eine Freitext-Ortsangabe. Multiplizität 0..n.', - 'desc_human' => 'Geben Sie an, welches geografische Gebiet die Daten abdecken — eine Stadt, ein Bundesland, ein Land oder eine Region. So finden Nutzende Daten zu ihrer Gegend. Beispiel: Musterstadt oder Bayern.', - ), - array( - 'key' => 'temporal_start', - 'meta_key' => '_odw_temporal_start', - 'dcat_prop' => 'dct:temporal', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Ab welchem `dct:temporal`-Startdatum gilt der Abdeckungszeitraum?', - 'q_human' => 'Ab wann sind diese Daten gültig?', - 'desc_dcat' => '`dct:temporal` beschreibt den Zeitraum, den die Daten inhaltlich abdecken (Range `dct:PeriodOfTime`). Dieses Feld liefert die Startangabe (`dcat:startDate`) des Intervalls. Multiplizität 0..1. Nicht zu verwechseln mit `dct:issued` (Veröffentlichung).', - 'desc_human' => 'Der Beginn des Zeitraums, den die Daten inhaltlich beschreiben — also ab wann die erfassten Werte gelten. Das ist der abgedeckte Zeitraum, nicht das Veröffentlichungsdatum. Beispiel: 2020-01-01.', - ), - array( - 'key' => 'temporal_end', - 'meta_key' => '_odw_temporal_end', - 'dcat_prop' => 'dct:temporal', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Bis zu welchem `dct:temporal`-Enddatum gilt der Abdeckungszeitraum?', - 'q_human' => 'Bis wann sind diese Daten gültig?', - 'desc_dcat' => '`dct:temporal` liefert hier die Endangabe (`dcat:endDate`) des abgedeckten Zeitintervalls (Range `dct:PeriodOfTime`). Multiplizität 0..1. Zusammen mit dem Startdatum ergibt sich der vollständige Abdeckungszeitraum.', - 'desc_human' => 'Das Ende des Zeitraums, den die Daten abdecken — bis wann die erfassten Werte reichen. Bleibt das Feld leer, gilt der Zeitraum als offen (bis heute fortlaufend). Beispiel: 2025-12-31.', - ), - array( - 'key' => 'contact_name', - 'meta_key' => '_odw_contact_name', - 'dcat_prop' => 'dcat:contactPoint', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Wie lautet der `vcard:fn` (Name) des `dcat:contactPoint`?', - 'q_human' => 'Wer ist Ansprechperson für Fragen zu diesen Daten?', - 'desc_dcat' => 'Teil des `dcat:contactPoint` (Range `vcard:Kind`): `vcard:fn` benennt die Kontaktstelle oder -person für Rückfragen zum Datensatz. Multiplizität des Kontaktpunkts 0..n. Name, E-Mail und URL bilden zusammen einen Kontaktpunkt.', - 'desc_human' => 'Nennen Sie, an wen sich Nutzende bei Fragen wenden können — eine Person oder eine Abteilung. So ist klar, wer für die Daten zuständig ist. Beispiel: Open-Data-Team der Stadt Musterstadt.', - ), - array( - 'key' => 'contact_email', - 'meta_key' => '_odw_contact_email', - 'dcat_prop' => 'dcat:contactPoint', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `vcard:hasEmail` gehört zum `dcat:contactPoint`?', - 'q_human' => 'Unter welcher E-Mail-Adresse kann ich Fragen stellen?', - 'desc_dcat' => 'Teil des `dcat:contactPoint`: `vcard:hasEmail` liefert die E-Mail-Adresse der Kontaktstelle (als `mailto:`-URI serialisiert). Multiplizität 0..1 je Kontaktpunkt.', - 'desc_human' => 'Die E-Mail-Adresse, unter der man Fragen zu den Daten stellen kann. Das ist der einfachste Weg für Nachnutzende, Sie zu erreichen. Beispiel: opendata@musterstadt.de.', - ), - array( - 'key' => 'contact_url', - 'meta_key' => '_odw_contact_url', - 'dcat_prop' => 'dcat:contactPoint', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `vcard:hasURL` gehört zum `dcat:contactPoint`?', - 'q_human' => 'Auf welcher Website finde ich weitere Kontaktinformationen?', - 'desc_dcat' => 'Teil des `dcat:contactPoint`: `vcard:hasURL` verweist auf eine Webseite mit weiteren Kontaktinformationen der zuständigen Stelle. Multiplizität 0..1 je Kontaktpunkt.', - 'desc_human' => 'Verlinken Sie optional eine Kontakt- oder Impressumsseite mit weiteren Wegen, Sie zu erreichen. Ergänzt E-Mail und Name um eine Anlaufstelle im Web. Beispiel: https://musterstadt.de/kontakt.', - ), - array( - 'key' => 'contributor_id', - 'meta_key' => '_odw_contributor_id', - 'dcat_prop' => 'dcatde:contributorID', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'contributors', - 'q_dcat' => 'Welche `dcatde:contributorID` (bereitstellende Stelle) gilt im GovData-Verbund?', - 'q_human' => 'Welche Stelle stellt diese Daten im GovData-Verbund bereit?', - 'desc_dcat' => '`dcatde:contributorID` (DCAT-AP.de) ist die offizielle Kennung der im GovData-Verbund bereitstellenden Stelle, referenziert über das gebündelte Contributors-Vokabular. Multiplizität 0..n. Dient der Zuordnung im nationalen Metadatenverbund.', - 'desc_human' => 'Nur für Stellen, die im deutschen GovData-Verbund veröffentlichen: Wählen Sie Ihre Stelle aus der Liste; die zugehörige offizielle Kennung wird automatisch verwendet. Für die meisten Nutzenden ist dieses Feld nicht relevant. Beispiel: Bundesministerium des Innern.', - ), - array( - 'key' => 'originator_name', - 'meta_key' => '_odw_originator_name', - 'dcat_prop' => 'dcatde:originator', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Wer ist `dcatde:originator` (ursprünglicher Urheber) der Daten?', - 'q_human' => 'Wer hat diese Daten ursprünglich erstellt?', - 'desc_dcat' => '`dcatde:originator` (DCAT-AP.de) benennt die Stelle, von der die Daten ursprünglich stammen (Range `foaf:Agent`). Kann von Herausgeber (`dct:publisher`) und Ersteller (`dct:creator`) abweichen. Multiplizität 0..n.', - 'desc_human' => 'Nennen Sie die Stelle, von der die Daten ursprünglich stammen — das kann eine andere sein als die, die sie jetzt veröffentlicht. So bleibt die Herkunft nachvollziehbar. Beispiel: Statistisches Landesamt.', - ), - array( - 'key' => 'originator_email', - 'meta_key' => '_odw_originator_email', - 'dcat_prop' => 'dcatde:originator', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dcatde:originator`?', - 'q_human' => 'Wie lautet die E-Mail-Adresse des Urhebers?', - 'desc_dcat' => 'Ergänzt `dcatde:originator` um eine E-Mail-Adresse des ursprünglichen Urhebers (als `mailto:`-URI). Optional, Multiplizität 0..1.', - 'desc_human' => 'Optional die E-Mail-Adresse der ursprünglichen Urheber-Stelle, falls abweichend erreichbar. Beispiel: statistik@landesamt.de.', - ), - array( - 'key' => 'maintainer_name', - 'meta_key' => '_odw_maintainer_name', - 'dcat_prop' => 'dcatde:maintainer', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Wer ist `dcatde:maintainer` (pflegende Stelle) der Daten?', - 'q_human' => 'Wer pflegt diese Daten laufend?', - 'desc_dcat' => '`dcatde:maintainer` (DCAT-AP.de) benennt die für die laufende Pflege und Aktualisierung zuständige Stelle (Range `foaf:Agent`). Multiplizität 0..n. Kann von Herausgeber und Urheber abweichen.', - 'desc_human' => 'Nennen Sie, wer die Daten laufend betreut und aktuell hält. Das ist die Stelle, die sich um Updates kümmert — nicht unbedingt die, die sie erstellt hat. Beispiel: Open-Data-Team.', - ), - array( - 'key' => 'maintainer_email', - 'meta_key' => '_odw_maintainer_email', - 'dcat_prop' => 'dcatde:maintainer', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dcatde:maintainer`?', - 'q_human' => 'Wie lautet die E-Mail-Adresse der pflegenden Stelle?', - 'desc_dcat' => 'Ergänzt `dcatde:maintainer` um eine E-Mail-Adresse der pflegenden Stelle (als `mailto:`-URI). Optional, Multiplizität 0..1.', - 'desc_human' => 'Optional die E-Mail-Adresse der Stelle, die die Daten pflegt. Beispiel: opendata@beispiel.de.', - ), - array( - 'key' => 'legal_basis', - 'meta_key' => '_odw_legal_basis', - 'dcat_prop' => 'dcatde:legalBasis', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Auf welcher `dcatde:legalBasis` (Rechtsgrundlage) beruht die Bereitstellung?', - 'q_human' => 'Auf welcher rechtlichen Grundlage werden die Daten bereitgestellt?', - 'desc_dcat' => '`dcatde:legalBasis` (DCAT-AP.de) nennt das Gesetz oder die Verordnung, die die Bereitstellung der Daten regelt (Freitext, `literal`). Multiplizität 0..n.', - 'desc_human' => 'Falls es eine gesetzliche Grundlage für die Veröffentlichung gibt, nennen Sie sie hier. Das schafft Transparenz über die rechtliche Verpflichtung oder Erlaubnis. Beispiel: § 12a EGovG (E-Government-Gesetz).', - ), - array( - 'key' => 'quality_process_uri', - 'meta_key' => '_odw_quality_process_uri', - 'dcat_prop' => 'dcatde:qualityProcessURI', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `dcatde:qualityProcessURI` dokumentiert das Qualitätssicherungs-Verfahren?', - 'q_human' => 'Wo ist das Qualitätssicherungs-Verfahren dokumentiert?', - 'desc_dcat' => '`dcatde:qualityProcessURI` (DCAT-AP.de) verweist per URI auf eine Beschreibung des Qualitätssicherungs-Prozesses des Datensatzes. Multiplizität 0..1.', - 'desc_human' => 'Verlinken Sie optional eine Seite, die beschreibt, wie Sie die Qualität der Daten sichern (z. B. Prüfschritte). Das stärkt das Vertrauen in Ihre Daten. Beispiel: https://beispiel.de/qualitaetssicherung.', - ), - array( - 'key' => 'access_rights', - 'meta_key' => '_odw_access_rights', - 'dcat_prop' => 'dct:accessRights', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'access-right', - 'q_dcat' => 'Welche `dct:accessRights` (Zugriffsklassifikation) gelten für den Datensatz?', - 'q_human' => 'Wer darf auf diese Daten zugreifen?', - 'desc_dcat' => '`dct:accessRights` klassifiziert den Zugriffsstatus über das EU-Vokabular „Access Right" (`PUBLIC`, `RESTRICTED`, `NON_PUBLIC`). Multiplizität 0..1. Relevant für die MQA-Dimension Wiederverwendbarkeit.', - 'desc_human' => 'Geben Sie an, ob die Daten für alle offen (öffentlich), nur eingeschränkt oder gar nicht öffentlich zugänglich sind. Für offene Daten ist das in der Regel „öffentlich". Beispiel: Öffentlich.', - ), - array( - 'key' => 'theme_uri', - 'meta_key' => '_odw_theme_uri', - 'dcat_prop' => 'dcat:theme', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'data-theme', - 'q_dcat' => 'Welches zusätzliche `dcat:theme` (EU-Themen-URI) gilt für den Datensatz?', - 'q_human' => 'Welches weitere EU-Thema möchten Sie ergänzen?', - 'desc_dcat' => 'Zusätzliches `dcat:theme` als direkte EU-Themen-URI (`http://publications.europa.eu/resource/authority/data-theme/…`). Ergänzt die Themen-Auswahl aus Tab 1 um weitere Themen. Multiplizität 0..n.', - 'desc_human' => 'Falls Ihr Datensatz zu mehr als einem Thema passt, ergänzen Sie hier ein weiteres EU-Thema aus der Vorschlagsliste. Das erhöht die Auffindbarkeit über mehrere Themenfilter. Beispiel: Umwelt zusätzlich zu Gesundheit.', - ), - array( - 'key' => 'is_hvd', - 'meta_key' => '_odw_is_hvd', - 'dcat_prop' => 'dcatap:applicableLegislation', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Ist der Datensatz ein High-Value-Dataset nach `dcatap:applicableLegislation` (EU-VO 2023/138)?', - 'q_human' => 'Ist dies ein hochwertiger Datensatz (HVD)?', - 'desc_dcat' => 'Kennzeichen, ob der Datensatz ein High-Value-Dataset im Sinne der EU-Durchführungsverordnung 2023/138 ist. Ist es gesetzt, wird `dcatap:applicableLegislation` (Verweis auf die Verordnung) ausgegeben und das Feld HVD-Kategorie relevant.', - 'desc_human' => '„High-Value-Datasets" sind von der EU als besonders wertvoll eingestufte Datensätze (z. B. Geo-, Umwelt- oder Mobilitätsdaten). Setzen Sie dies nur, wenn Ihr Datensatz in eine der offiziellen HVD-Kategorien fällt — im Zweifel „Nein". Beispiel: Ja, bei amtlichen Geodaten.', - ), - array( - 'key' => 'hvd_category', - 'meta_key' => '_odw_hvd_category', - 'dcat_prop' => 'dcatap:hvdCategory', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'hvd-category', - 'q_dcat' => 'Welcher `dcatap:hvdCategory` (HVD-Kategorie) gehört der Datensatz an?', - 'q_human' => 'Welcher HVD-Kategorie gehört dieser Datensatz an?', - 'desc_dcat' => '`dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Multiplizität 0..n. Hinweis: Die Eigenschaft stammt aus der HVD-Erweiterung zu DCAT-AP (EU-Durchführungsverordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0; keine der mitgelieferten SHACL-Shapes prüft sie deshalb.', - 'desc_human' => 'Wenn es ein hochwertiger Datensatz ist, wählen Sie hier die passende der sechs EU-HVD-Kategorien. Damit ordnen Sie den Datensatz korrekt in das EU-Schema ein. Beispiel: Georaum, Mobilität, Statistik.', - ), - array( - 'key' => 'identifier', - 'meta_key' => '_odw_identifier', - 'dcat_prop' => 'dct:identifier', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welcher `dct:identifier` (eindeutige Kennung) identifiziert den Datensatz?', - 'q_human' => 'Welche eindeutige Kennung hat dieser Datensatz?', - 'desc_dcat' => '`dct:identifier` ist eine eindeutige, im System der Herausgeberin vergebene Kennung des Datensatzes (Freitext/`literal`). Multiplizität 0..n. Ermöglicht die stabile Referenzierung über Systemgrenzen hinweg.', - 'desc_human' => 'Falls Ihr Datensatz eine feste Kennnummer aus Ihrem eigenen System hat, tragen Sie sie hier ein. So bleibt der Datensatz eindeutig identifizierbar. Beispiel: DS-2026-00042.', - ), - array( - 'key' => 'type', - 'meta_key' => '_odw_type', - 'dcat_prop' => 'dct:type', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'dataset-type', - 'q_dcat' => 'Welchen `dct:type` (Datensatz-Typ) hat der Datensatz?', - 'q_human' => 'Um welchen Typ von Datensatz handelt es sich?', - 'desc_dcat' => '`dct:type` klassifiziert die Art des Datensatzes, idealerweise über das EU-Vokabular „Dataset Type". Multiplizität 0..1. Unterscheidet z. B. Erhebungsdaten, Registerdaten oder Geodaten.', - 'desc_human' => 'Geben Sie an, um welche Art von Datensatz es sich grundsätzlich handelt. Das hilft bei der groben Einordnung. Beispiel: Statistische Erhebung, Geodaten.', - ), - array( - 'key' => 'creator_name', - 'meta_key' => '_odw_creator_name', - 'dcat_prop' => 'dct:creator', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Wer ist `dct:creator` (Ersteller) des Datensatzes?', - 'q_human' => 'Wer hat diese Daten erstellt?', - 'desc_dcat' => '`dct:creator` benennt die primär für die Erstellung des Datensatzes verantwortliche Stelle oder Person (Range `foaf:Agent`). Multiplizität 0..n. Unterscheidet sich vom Herausgeber (`dct:publisher`), der für die Bereitstellung verantwortlich ist.', - 'desc_human' => 'Nennen Sie, wer die Daten inhaltlich erstellt hat — die Person oder Stelle, die die eigentliche Arbeit gemacht hat. Das kann von der herausgebenden Organisation abweichen. Beispiel: Forschungsgruppe Stadtklima.', - ), - array( - 'key' => 'creator_email', - 'meta_key' => '_odw_creator_email', - 'dcat_prop' => 'dct:creator', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dct:creator`?', - 'q_human' => 'Wie lautet die E-Mail-Adresse des Erstellers?', - 'desc_dcat' => 'Ergänzt `dct:creator` um eine E-Mail-Adresse der erstellenden Stelle (als `mailto:`-URI). Optional, Multiplizität 0..1.', - 'desc_human' => 'Optional die E-Mail-Adresse der erstellenden Person oder Stelle. Beispiel: forschung@beispiel.de.', - ), - array( - 'key' => 'version', - 'meta_key' => '_odw_version', - 'dcat_prop' => 'owl:versionInfo', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `owl:versionInfo` (Versionsbezeichnung) hat der Datensatz?', - 'q_human' => 'Welche Version hat dieser Datensatz?', - 'desc_dcat' => '`owl:versionInfo` gibt die Versionsbezeichnung des Datensatzes als Freitext an (`literal`). Multiplizität 0..1. Erlaubt die Unterscheidung aufeinanderfolgender Ausgaben desselben Datensatzes.', - 'desc_human' => 'Falls es mehrere Ausgaben Ihrer Daten gibt, tragen Sie die Versionsnummer ein. So wissen Nutzende, welche Fassung sie vor sich haben. Beispiel: 2.0.', - ), - array( - 'key' => 'version_notes', - 'meta_key' => '_odw_version_notes', - 'dcat_prop' => 'adms:versionNotes', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `adms:versionNotes` (Änderungshinweise) beschreiben diese Version?', - 'q_human' => 'Was hat sich in dieser Version geändert?', - 'desc_dcat' => '`adms:versionNotes` beschreibt die Änderungen gegenüber der Vorversion als sprachlich getaggten Freitext (`literal-lang`). Multiplizität 0..n. Ergänzt `owl:versionInfo` um den inhaltlichen Änderungsverlauf.', - 'desc_human' => 'Beschreiben Sie kurz, was sich gegenüber der letzten Version geändert hat — wie ein Änderungsprotokoll. Nutzende sehen so, ob sich ein erneuter Download lohnt. Beispiel: „Daten für 2025 ergänzt, Tippfehler korrigiert."', - ), - array( - 'key' => 'spatial_resolution', - 'meta_key' => '_odw_spatial_resolution', - 'dcat_prop' => 'dcat:spatialResolutionInMeters', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `dcat:spatialResolutionInMeters` (räumliche Auflösung) haben die Daten?', - 'q_human' => 'Welche räumliche Auflösung haben die Daten (in Metern)?', - 'desc_dcat' => '`dcat:spatialResolutionInMeters` gibt die kleinste räumlich unterscheidbare Einheit in Metern an (`xsd:decimal`). Multiplizität 0..n. Relevant vor allem für Geodaten und Rasterdaten.', - 'desc_human' => 'Bei Geodaten: Geben Sie an, wie fein die Daten räumlich aufgelöst sind — der kleinste unterscheidbare Abstand in Metern. Ein kleiner Wert bedeutet detailliertere Daten. Beispiel: 10 (Raster von 10 Metern).', - ), - array( - 'key' => 'temporal_resolution', - 'meta_key' => '_odw_temporal_resolution', - 'dcat_prop' => 'dcat:temporalResolution', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `dcat:temporalResolution` (zeitliche Auflösung) haben die Daten?', - 'q_human' => 'Welche zeitliche Auflösung haben die Daten?', - 'desc_dcat' => '`dcat:temporalResolution` gibt die kleinste zeitlich unterscheidbare Einheit als ISO-8601-Dauer an (`xsd:duration`). Multiplizität 0..1. Beschreibt z. B. den Messabstand einer Zeitreihe.', - 'desc_human' => 'Bei Zeitreihen: Geben Sie an, in welchem zeitlichen Abstand die Werte erfasst sind — z. B. stündlich, täglich, monatlich. Format ist die ISO-8601-Dauer. Beispiel: P1D (ein Tag) oder PT1H (eine Stunde).', - ), - array( - 'key' => 'conforms_to', - 'meta_key' => '_odw_conforms_to', - 'dcat_prop' => 'dct:conformsTo', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welchem `dct:conformsTo` (Standard/Schema) entsprechen die Daten?', - 'q_human' => 'Welchem Standard oder Schema entsprechen die Daten?', - 'desc_dcat' => '`dct:conformsTo` verweist auf einen implementierten Standard, ein Anwendungsprofil oder ein Schema, dem die Daten entsprechen (Range `dct:Standard`, per URI oder Bezeichnung). Multiplizität 0..n.', - 'desc_human' => 'Falls Ihre Daten einem bestimmten Standard oder Schema folgen, nennen Sie ihn hier. So können Systeme die Daten korrekt interpretieren. Beispiel: INSPIRE, XÖV oder ein fachliches Datenschema.', - ), - array( - 'key' => 'provenance', - 'meta_key' => '_odw_provenance', - 'dcat_prop' => 'dct:provenance', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `dct:provenance` (Herkunft/Entstehung) hat der Datensatz?', - 'q_human' => 'Woher stammen die Daten und wie sind sie entstanden?', - 'desc_dcat' => '`dct:provenance` beschreibt die Herkunft und Entstehungsgeschichte des Datensatzes (Range `dct:ProvenanceStatement`, Freitext). Multiplizität 0..n. Dokumentiert Erhebungs- und Verarbeitungsschritte.', - 'desc_human' => 'Beschreiben Sie, woher die Daten kommen und wie sie entstanden sind — z. B. aus welcher Erhebung oder welchem Verfahren. Das macht die Daten nachvollziehbar und vertrauenswürdig. Beispiel: „Erhoben im Rahmen der Bürgerbefragung 2025, anonymisiert aufbereitet."', - ), - array( - 'key' => 'dist_title', - 'meta_key' => '_odw_dist_title', - 'dcat_prop' => 'dct:title', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Wie lautet der `dct:title` der Distribution?', - 'q_human' => 'Wie heißt die bereitgestellte Datei/Distribution?', - 'desc_dcat' => '`dct:title` auf Ebene der Distribution benennt die konkrete bereitgestellte Ressource (`literal-lang`). Multiplizität 0..n. Nützlich, wenn der Distributionsname vom Datensatztitel abweicht.', - 'desc_human' => 'Geben Sie der bereitgestellten Datei einen eigenen Namen, falls er sich vom Titel des Datensatzes unterscheidet. Beispiel: „Rohdaten CSV 2025".', - ), - array( - 'key' => 'dist_description', - 'meta_key' => '_odw_dist_description', - 'dcat_prop' => 'dct:description', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Wie lautet die `dct:description` der Distribution?', - 'q_human' => 'Wie lässt sich die Distribution beschreiben?', - 'desc_dcat' => '`dct:description` auf Distributionsebene beschreibt die konkrete Datei/Ressource (`literal-lang`). Multiplizität 0..n. Ergänzt die Datensatzbeschreibung um distributionsspezifische Hinweise (z. B. Spaltenaufbau).', - 'desc_human' => 'Beschreiben Sie die konkrete Datei näher — etwa welche Spalten sie enthält oder wie sie aufgebaut ist. Das hilft beim direkten Umgang mit der Datei. Beispiel: „Spalten: Jahr, Stadt, Einwohner; Trennzeichen Semikolon."', - ), - array( - 'key' => 'download_url', - 'meta_key' => '_odw_download_url', - 'dcat_prop' => 'dcat:downloadURL', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Unter welcher `dcat:downloadURL` ist die Datei direkt herunterladbar?', - 'q_human' => 'Wie lautet der direkte Download-Link zur Datei?', - 'desc_dcat' => '`dcat:downloadURL` verweist auf eine direkt herunterladbare Datei (Range `rdfs:Resource`). Anders als `dcat:accessURL` garantiert sie einen unmittelbaren Download derselben Ressource. Multiplizität 0..n. Relevant für die MQA-Dimension Zugänglichkeit.', - 'desc_human' => 'Falls es einen direkten Link gibt, der die Datei sofort herunterlädt (ohne Umweg über eine Seite), tragen Sie ihn hier ein. Das ist der bequemste Weg für Nachnutzende. Beispiel: https://beispiel.de/daten/statistik.csv.', - ), - array( - 'key' => 'media_type', - 'meta_key' => '_odw_media_type', - 'dcat_prop' => 'dcat:mediaType', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'iana-media-type', - 'q_dcat' => 'Welchen `dcat:mediaType` (IANA-MIME-Typ) hat die Distribution?', - 'q_human' => 'Welchen Medientyp (MIME) hat die Datei?', - 'desc_dcat' => '`dcat:mediaType` gibt den Medientyp der Distribution als IANA-Media-Type an (z. B. `text/csv`, `application/json`), referenziert über das IANA-Media-Types-Register. Multiplizität 0..1. Ergänzt `dct:format` um den technischen MIME-Typ.', - 'desc_human' => 'Der technische Medientyp der Datei (MIME-Typ) — die maschinenlesbare Entsprechung zum Format. Systeme erkennen daran, wie sie die Datei behandeln müssen. Beispiel: text/csv, application/json.', - ), - array( - 'key' => 'dist_rights', - 'meta_key' => '_odw_dist_rights', - 'dcat_prop' => 'dct:rights', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => '', - 'q_dcat' => 'Welche `dct:rights` (Nutzungsrechte) gelten für die Distribution?', - 'q_human' => 'Welche Nutzungsrechte gelten für die Datei?', - 'desc_dcat' => '`dct:rights` beschreibt rechtliche Hinweise zur Distribution jenseits der Lizenz — etwa Urheberrechts- oder Zugriffsvermerke (Range `dct:RightsStatement`, Freitext oder URI). Multiplizität 0..1.', - 'desc_human' => 'Ergänzende rechtliche Hinweise zur Datei, die über die Lizenz hinausgehen — z. B. Urheberrechtsvermerke. Für viele offene Datensätze bleibt das leer. Beispiel: „© Stadt Musterstadt 2026".', + 'auto' => true, + 'q_dcat' => 'Wann wurde der Datensatz zuletzt `dct:modified` (geändert)?', + 'q_human' => 'Wann wurden diese Daten zuletzt aktualisiert?', + 'desc_dcat' => '`dct:modified` gibt das Datum der letzten inhaltlichen Änderung des Datensatzes an (`xsd:date`/`xsd:dateTime`, Multiplizität 0..1). Das Plugin setzt diesen Wert bei jeder Speicherung automatisch; ein Eingabefeld gibt es bewusst nicht, da eine manuelle Angabe beim nächsten Speichern überschrieben würde.', + 'desc_human' => 'Das Datum der letzten Aktualisierung. Es wird beim Speichern automatisch gesetzt, sodass Nutzende immer sehen, wie aktuell die Daten sind — Sie müssen dafür nichts eintragen. Beispiel: 2026-04-22.', + ), + array( + 'key' => 'accrual_periodicity', + 'meta_key' => '_odw_accrual_periodicity', + 'dcat_prop' => 'dct:accrualPeriodicity', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => 'frequency', + 'q_dcat' => 'Welche `dct:accrualPeriodicity` (Aktualisierungsfrequenz) hat der Datensatz?', + 'q_human' => 'Wie oft werden diese Daten aktualisiert?', + 'desc_dcat' => '`dct:accrualPeriodicity` gibt an, in welchem Rhythmus der Datensatz aktualisiert wird, referenziert über das EU-Vokabular „Frequency" (`http://publications.europa.eu/resource/authority/frequency/`, z. B. `DAILY`, `MONTHLY`, `ANNUAL`). Multiplizität 0..1.', + 'desc_human' => 'Geben Sie an, wie regelmäßig neue Daten hinzukommen — täglich, monatlich, jährlich oder unregelmäßig. Nutzende wissen dann, wie oft sich ein erneuter Blick lohnt. Beispiel: Jährlich.', + ), + array( + 'key' => 'political_geocoding_level', + 'meta_key' => '_odw_political_geocoding_level', + 'dcat_prop' => 'dcatde:politicalGeocodingLevelURI', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => 'politicalGeocodingLevel', + 'q_dcat' => 'Welche `dcatde:politicalGeocodingLevelURI` (Verwaltungsebene) betrifft der Datensatz?', + 'q_human' => 'Auf welcher Verwaltungsebene wurden diese Daten erhoben?', + 'desc_dcat' => '`dcatde:politicalGeocodingLevelURI` (DCAT-AP.de) klassifiziert die administrative Ebene des räumlichen Bezugs über das GovData-Vokabular; im Formular wählbar als Bund, Land, Landkreis und Gemeinde. Multiplizität 0..1. Ergänzt die konkrete Gebietsangabe.', + 'desc_human' => 'Wählen Sie, auf welcher staatlichen Ebene die Daten angesiedelt sind — Bund, Land, Landkreis oder Gemeinde. Das ordnet die Daten geografisch-administrativ ein. Beispiel: Gemeinde.', + ), + array( + 'key' => 'political_geocoding_uri', + 'meta_key' => '_odw_political_geocoding_uri', + 'dcat_prop' => 'dcatde:politicalGeocodingURI', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welches `dcatde:politicalGeocodingURI` (amtliches Gebiet) beschreibt den räumlichen Bezug?', + 'q_human' => 'Auf welches amtliche Gebiet beziehen sich die Daten?', + 'desc_dcat' => '`dcatde:politicalGeocodingURI` (DCAT-AP.de) referenziert ein konkretes amtliches Gebiet über eine URI (z. B. amtlicher Regionalschlüssel/AGS als URI). Multiplizität 0..n. Ermöglicht die eindeutige, maschinenlesbare Verortung.', + 'desc_human' => 'Verlinken Sie das genaue amtliche Gebiet, auf das sich die Daten beziehen — als offizielle Kennung (z. B. Gemeindeschlüssel). Damit ist eindeutig, welche Region gemeint ist. Beispiel: die URI zum amtlichen Gemeindeschlüssel Ihrer Stadt.', + ), + array( + 'key' => 'geocoding_description', + 'meta_key' => '_odw_geocoding_description', + 'dcat_prop' => 'dcatde:geocodingDescription', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Wie lautet die `dcatde:geocodingDescription` (textuelle Beschreibung des räumlichen Bezugs)?', + 'q_human' => 'Wie lässt sich der räumliche Bezug in Worten beschreiben?', + 'desc_dcat' => '`dcatde:geocodingDescription` (DCAT-AP.de) ist eine frei formulierte textuelle Beschreibung der räumlichen Abdeckung (`literal`/`literal-lang`). Multiplizität 0..n. Ergänzt die maschinenlesbaren Angaben `dct:spatial` und `dcatde:politicalGeocodingURI` um eine menschenlesbare Erläuterung.', + 'desc_human' => 'Beschreiben Sie den räumlichen Bezug zusätzlich in Worten — etwa wenn ein Gebietsschlüssel allein nicht genau genug ist. Das hilft Nutzenden, die Abdeckung einzuordnen. Beispiel: „Stadtgebiet Musterstadt ohne den Ortsteil X".', + ), + array( + 'key' => 'spatial', + 'meta_key' => '_odw_spatial', + 'dcat_prop' => 'dct:spatial', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `dct:spatial` (geografische Abdeckung) hat der Datensatz?', + 'q_human' => 'Welche geografische Region betreffen diese Daten?', + 'desc_dcat' => '`dct:spatial` beschreibt die räumliche Abdeckung des Datensatzes (Range `dct:Location`). Als Wert dient eine Gebiets-URI (z. B. GeoNames, EU-Continents) oder eine Freitext-Ortsangabe. Multiplizität 0..n.', + 'desc_human' => 'Geben Sie an, welches geografische Gebiet die Daten abdecken — eine Stadt, ein Bundesland, ein Land oder eine Region. So finden Nutzende Daten zu ihrer Gegend. Beispiel: Musterstadt oder Bayern. Wählen Sie die Region aus der Vorschlagsliste — dann wird die passende Kennung automatisch gesetzt — oder tippen Sie das Gebiet einfach selbst ein.', + ), + array( + 'key' => 'temporal_start', + 'meta_key' => '_odw_temporal_start', + 'dcat_prop' => 'dct:temporal', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Ab welchem `dct:temporal`-Startdatum gilt der Abdeckungszeitraum?', + 'q_human' => 'Ab wann sind diese Daten gültig?', + 'desc_dcat' => '`dct:temporal` beschreibt den Zeitraum, den die Daten inhaltlich abdecken (Range `dct:PeriodOfTime`). Dieses Feld liefert die Startangabe (`dcat:startDate`) des Intervalls. Multiplizität 0..1. Nicht zu verwechseln mit `dct:issued` (Veröffentlichung).', + 'desc_human' => 'Der Beginn des Zeitraums, den die Daten inhaltlich beschreiben — also ab wann die erfassten Werte gelten. Das ist der abgedeckte Zeitraum, nicht das Veröffentlichungsdatum. Beispiel: 2020-01-01.', + ), + array( + 'key' => 'temporal_end', + 'meta_key' => '_odw_temporal_end', + 'dcat_prop' => 'dct:temporal', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Bis zu welchem `dct:temporal`-Enddatum gilt der Abdeckungszeitraum?', + 'q_human' => 'Bis wann sind diese Daten gültig?', + 'desc_dcat' => '`dct:temporal` liefert hier die Endangabe (`dcat:endDate`) des abgedeckten Zeitintervalls (Range `dct:PeriodOfTime`). Multiplizität 0..1. Zusammen mit dem Startdatum ergibt sich der vollständige Abdeckungszeitraum.', + 'desc_human' => 'Das Ende des Zeitraums, den die Daten abdecken — bis wann die erfassten Werte reichen. Bleibt das Feld leer, gilt der Zeitraum als offen (bis heute fortlaufend). Beispiel: 2025-12-31.', + ), + array( + 'key' => 'contact_name', + 'meta_key' => '_odw_contact_name', + 'dcat_prop' => 'dcat:contactPoint', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Wie lautet der `vcard:fn` (Name) des `dcat:contactPoint`?', + 'q_human' => 'Wer ist Ansprechperson für Fragen zu diesen Daten?', + 'desc_dcat' => 'Teil des `dcat:contactPoint` (Range `vcard:Kind`): `vcard:fn` benennt die Kontaktstelle oder -person für Rückfragen zum Datensatz. Multiplizität 0..1 je Kontaktpunkt; ein Datensatz kann mehrere Kontaktpunkte tragen (0..n). Name, E-Mail und URL bilden zusammen einen Kontaktpunkt.', + 'desc_human' => 'Nennen Sie, an wen sich Nutzende bei Fragen wenden können — eine Person oder eine Abteilung. So ist klar, wer für die Daten zuständig ist. Beispiel: Open-Data-Team der Stadt Musterstadt.', + ), + array( + 'key' => 'contact_email', + 'meta_key' => '_odw_contact_email', + 'dcat_prop' => 'dcat:contactPoint', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `vcard:hasEmail` gehört zum `dcat:contactPoint`?', + 'q_human' => 'Unter welcher E-Mail-Adresse kann ich Fragen stellen?', + 'desc_dcat' => 'Teil des `dcat:contactPoint`: `vcard:hasEmail` liefert die E-Mail-Adresse der Kontaktstelle (als `mailto:`-URI serialisiert). Multiplizität 0..1 je Kontaktpunkt.', + 'desc_human' => 'Die E-Mail-Adresse, unter der man Fragen zu den Daten stellen kann. Das ist der einfachste Weg für Nachnutzende, Sie zu erreichen. Beispiel: opendata@musterstadt.de.', + ), + array( + 'key' => 'contact_url', + 'meta_key' => '_odw_contact_url', + 'dcat_prop' => 'dcat:contactPoint', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `vcard:hasURL` gehört zum `dcat:contactPoint`?', + 'q_human' => 'Auf welcher Website finde ich weitere Kontaktinformationen?', + 'desc_dcat' => 'Teil des `dcat:contactPoint`: `vcard:hasURL` verweist auf eine Webseite mit weiteren Kontaktinformationen der zuständigen Stelle. Multiplizität 0..1 je Kontaktpunkt.', + 'desc_human' => 'Verlinken Sie optional eine Kontakt- oder Impressumsseite mit weiteren Wegen, Sie zu erreichen. Ergänzt E-Mail und Name um eine Anlaufstelle im Web. Beispiel: https://musterstadt.de/kontakt.', + ), + array( + 'key' => 'contributor_id', + 'meta_key' => '_odw_contributor_id', + 'dcat_prop' => 'dcatde:contributorID', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => 'contributors', + 'q_dcat' => 'Welche `dcatde:contributorID` (bereitstellende Stelle) gilt im GovData-Verbund?', + 'q_human' => 'Welche Stelle stellt diese Daten im GovData-Verbund bereit?', + 'desc_dcat' => '`dcatde:contributorID` (DCAT-AP.de) ist die offizielle Kennung der im GovData-Verbund bereitstellenden Stelle, referenziert über das gebündelte Contributors-Vokabular. Multiplizität 0..n. Dient der Zuordnung im nationalen Metadatenverbund.', + 'desc_human' => 'Nur für Stellen, die im deutschen GovData-Verbund veröffentlichen: Wählen Sie Ihre Stelle aus der Liste; die zugehörige offizielle Kennung wird automatisch verwendet. Für die meisten Nutzenden ist dieses Feld nicht relevant. Beispiel: Bundesministerium des Innern.', + ), + array( + 'key' => 'originator_name', + 'meta_key' => '_odw_originator_name', + 'dcat_prop' => 'dcatde:originator', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Wer ist `dcatde:originator` (ursprünglicher Urheber) der Daten?', + 'q_human' => 'Wer hat diese Daten ursprünglich erstellt?', + 'desc_dcat' => '`dcatde:originator` (DCAT-AP.de) benennt die Stelle, von der die Daten ursprünglich stammen (Range `foaf:Agent`). Kann von Herausgeber (`dct:publisher`) und Ersteller (`dct:creator`) abweichen. Multiplizität 0..n.', + 'desc_human' => 'Nennen Sie die Stelle, von der die Daten ursprünglich stammen — das kann eine andere sein als die, die sie jetzt veröffentlicht. So bleibt die Herkunft nachvollziehbar. Beispiel: Statistisches Landesamt.', + ), + array( + 'key' => 'originator_email', + 'meta_key' => '_odw_originator_email', + 'dcat_prop' => 'dcatde:originator', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dcatde:originator`?', + 'q_human' => 'Wie lautet die E-Mail-Adresse des Urhebers?', + 'desc_dcat' => 'Ergänzt `dcatde:originator` um eine E-Mail-Adresse des ursprünglichen Urhebers (als `mailto:`-URI). Optional, Multiplizität 0..1.', + 'desc_human' => 'Optional die E-Mail-Adresse der ursprünglichen Urheber-Stelle, falls abweichend erreichbar. Beispiel: statistik@landesamt.de.', + ), + array( + 'key' => 'maintainer_name', + 'meta_key' => '_odw_maintainer_name', + 'dcat_prop' => 'dcatde:maintainer', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Wer ist `dcatde:maintainer` (pflegende Stelle) der Daten?', + 'q_human' => 'Wer pflegt diese Daten laufend?', + 'desc_dcat' => '`dcatde:maintainer` (DCAT-AP.de) benennt die für die laufende Pflege und Aktualisierung zuständige Stelle (Range `foaf:Agent`). Multiplizität 0..n. Kann von Herausgeber und Urheber abweichen.', + 'desc_human' => 'Nennen Sie, wer die Daten laufend betreut und aktuell hält. Das ist die Stelle, die sich um Updates kümmert — nicht unbedingt die, die sie erstellt hat. Beispiel: Open-Data-Team.', + ), + array( + 'key' => 'maintainer_email', + 'meta_key' => '_odw_maintainer_email', + 'dcat_prop' => 'dcatde:maintainer', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dcatde:maintainer`?', + 'q_human' => 'Wie lautet die E-Mail-Adresse der pflegenden Stelle?', + 'desc_dcat' => 'Ergänzt `dcatde:maintainer` um eine E-Mail-Adresse der pflegenden Stelle (als `mailto:`-URI). Optional, Multiplizität 0..1.', + 'desc_human' => 'Optional die E-Mail-Adresse der Stelle, die die Daten pflegt. Beispiel: opendata@beispiel.de.', + ), + array( + 'key' => 'legal_basis', + 'meta_key' => '_odw_legal_basis', + 'dcat_prop' => 'dcatde:legalBasis', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Auf welcher `dcatde:legalBasis` (Rechtsgrundlage) beruht die Bereitstellung?', + 'q_human' => 'Auf welcher rechtlichen Grundlage werden die Daten bereitgestellt?', + 'desc_dcat' => '`dcatde:legalBasis` (DCAT-AP.de) nennt das Gesetz oder die Verordnung, die die Bereitstellung der Daten regelt (Freitext, `literal`). Multiplizität 0..n.', + 'desc_human' => 'Falls es eine gesetzliche Grundlage für die Veröffentlichung gibt, nennen Sie sie hier. Das schafft Transparenz über die rechtliche Verpflichtung oder Erlaubnis. Beispiel: § 12a EGovG (E-Government-Gesetz).', + ), + array( + 'key' => 'quality_process_uri', + 'meta_key' => '_odw_quality_process_uri', + 'dcat_prop' => 'dcatde:qualityProcessURI', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `dcatde:qualityProcessURI` dokumentiert das Qualitätssicherungs-Verfahren?', + 'q_human' => 'Wo ist das Qualitätssicherungs-Verfahren dokumentiert?', + 'desc_dcat' => '`dcatde:qualityProcessURI` (DCAT-AP.de) verweist per URI auf eine Beschreibung des Qualitätssicherungs-Prozesses des Datensatzes. Multiplizität 0..1.', + 'desc_human' => 'Verlinken Sie optional eine Seite, die beschreibt, wie Sie die Qualität der Daten sichern (z. B. Prüfschritte). Das stärkt das Vertrauen in Ihre Daten. Beispiel: https://beispiel.de/qualitaetssicherung.', + ), + array( + 'key' => 'access_rights', + 'meta_key' => '_odw_access_rights', + 'dcat_prop' => 'dct:accessRights', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => 'access-right', + 'q_dcat' => 'Welche `dct:accessRights` (Zugriffsklassifikation) gelten für den Datensatz?', + 'q_human' => 'Wer darf auf diese Daten zugreifen?', + 'desc_dcat' => '`dct:accessRights` klassifiziert den Zugriffsstatus über das EU-Vokabular „Access Right" (`PUBLIC`, `RESTRICTED`, `NON_PUBLIC`). Multiplizität 0..1. Relevant für die MQA-Dimension Wiederverwendbarkeit.', + 'desc_human' => 'Geben Sie an, ob die Daten für alle offen (öffentlich), nur eingeschränkt oder gar nicht öffentlich zugänglich sind. Für offene Daten ist das in der Regel „öffentlich". Beispiel: Öffentlich. „Öffentlich" ist bereits vorausgewählt — ändern Sie die Angabe nur, wenn der Zugriff eingeschränkt oder gar nicht öffentlich ist.', + ), + array( + 'key' => 'theme_uri', + 'meta_key' => '_odw_theme_uri', + 'dcat_prop' => 'dcat:theme', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => 'data-theme', + 'q_dcat' => 'Welches zusätzliche `dcat:theme` (EU-Themen-URI) gilt für den Datensatz?', + 'q_human' => 'Welches weitere EU-Thema möchten Sie ergänzen?', + 'desc_dcat' => 'Zusätzliches `dcat:theme` als direkte EU-Themen-URI (`http://publications.europa.eu/resource/authority/data-theme/…`). Ergänzt die Themen-Auswahl aus Tab 1 um weitere Themen. Multiplizität 0..n.', + 'desc_human' => 'Falls Ihr Datensatz zu mehr als einem Thema passt, ergänzen Sie hier ein weiteres EU-Thema aus der Vorschlagsliste. Das erhöht die Auffindbarkeit über mehrere Themenfilter. Beispiel: Umwelt zusätzlich zu Gesundheit.', + ), + array( + 'key' => 'is_hvd', + 'meta_key' => '_odw_is_hvd', + 'dcat_prop' => 'dcatap:applicableLegislation', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Ist der Datensatz ein High-Value-Dataset nach `dcatap:applicableLegislation` (EU-VO 2023/138)?', + 'q_human' => 'Ist dies ein hochwertiger Datensatz (HVD)?', + 'desc_dcat' => 'Kennzeichen, ob der Datensatz ein High-Value-Dataset im Sinne der EU-Durchführungsverordnung 2023/138 ist. Ist es gesetzt, wird `dcatap:applicableLegislation` (Verweis auf die Verordnung) ausgegeben und das Feld HVD-Kategorie relevant. Multiplizität 0..1.', + 'desc_human' => '„High-Value-Datasets" sind von der EU als besonders wertvoll eingestufte Datensätze (z. B. Geo-, Umwelt- oder Mobilitätsdaten). Setzen Sie dies nur, wenn Ihr Datensatz in eine der offiziellen HVD-Kategorien fällt — im Zweifel „Nein". Beispiel: Ja, bei amtlichen Geodaten. Das betrifft ausschließlich öffentliche Stellen — Vereine, Verbände und andere zivilgesellschaftliche Organisationen können das Feld leer lassen.', + ), + array( + 'key' => 'hvd_category', + 'meta_key' => '_odw_hvd_category', + 'dcat_prop' => 'dcatap:hvdCategory', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => 'hvd-category', + 'q_dcat' => 'Welcher `dcatap:hvdCategory` (HVD-Kategorie) gehört der Datensatz an?', + 'q_human' => 'Welcher HVD-Kategorie gehört dieser Datensatz an?', + 'desc_dcat' => '`dcatap:hvdCategory` ordnet ein High-Value-Dataset einer der sechs HVD-Kategorien der EU zu (Geospatial, Erdbeobachtung/Umwelt, Meteorologie, Statistik, Unternehmen, Mobilität), referenziert per EU-URI. Nur relevant, wenn HVD gesetzt ist. Multiplizität 0..n. Hinweis: Die Eigenschaft stammt aus der HVD-Erweiterung zu DCAT-AP (EU-Durchführungsverordnung 2023/138), nicht aus dem Kernprofil DCAT-AP 3.0; keine der mitgelieferten SHACL-Shapes prüft sie deshalb.', + 'desc_human' => 'Wenn es ein hochwertiger Datensatz ist, wählen Sie hier die passende der sechs EU-HVD-Kategorien. Damit ordnen Sie den Datensatz korrekt in das EU-Schema ein. Beispiel: Georaum, Mobilität, Statistik.', + ), + array( + 'key' => 'identifier', + 'meta_key' => '_odw_identifier', + 'dcat_prop' => 'dct:identifier', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welcher `dct:identifier` (eindeutige Kennung) identifiziert den Datensatz?', + 'q_human' => 'Welche eindeutige Kennung hat dieser Datensatz?', + 'desc_dcat' => '`dct:identifier` ist eine eindeutige, im System der Herausgeberin vergebene Kennung des Datensatzes (Freitext/`literal`). Multiplizität 0..n. Ermöglicht die stabile Referenzierung über Systemgrenzen hinweg.', + 'desc_human' => 'Falls Ihr Datensatz eine feste Kennnummer aus Ihrem eigenen System hat, tragen Sie sie hier ein. So bleibt der Datensatz eindeutig identifizierbar. Beispiel: DS-2026-00042. Neben einer internen Nummer können Sie hier auch eine dauerhafte, extern vergebene Kennung wie einen DOI eintragen.', + ), + array( + 'key' => 'type', + 'meta_key' => '_odw_type', + 'dcat_prop' => 'dct:type', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => 'dataset-type', + 'q_dcat' => 'Welchen `dct:type` (Datensatz-Typ) hat der Datensatz?', + 'q_human' => 'Um welchen Typ von Datensatz handelt es sich?', + 'desc_dcat' => '`dct:type` klassifiziert die Art des Datensatzes, idealerweise über das EU-Vokabular „Dataset Type". Multiplizität 0..1. Unterscheidet z. B. Erhebungsdaten, Registerdaten oder Geodaten.', + 'desc_human' => 'Geben Sie an, um welche Art von Datensatz es sich grundsätzlich handelt. Das hilft bei der groben Einordnung. Beispiel: Statistische Erhebung, Geodaten. Einzutragen ist die vollständige Web-Adresse des passenden Eintrags aus der EU-Liste der Datensatz-Typen, nicht die Bezeichnung als Text.', + ), + array( + 'key' => 'creator_name', + 'meta_key' => '_odw_creator_name', + 'dcat_prop' => 'dct:creator', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Wer ist `dct:creator` (Ersteller) des Datensatzes?', + 'q_human' => 'Wer hat diese Daten erstellt?', + 'desc_dcat' => '`dct:creator` benennt die primär für die Erstellung des Datensatzes verantwortliche Stelle oder Person (Range `foaf:Agent`). Multiplizität 0..n. Unterscheidet sich vom Herausgeber (`dct:publisher`), der für die Bereitstellung verantwortlich ist.', + 'desc_human' => 'Nennen Sie, wer die Daten inhaltlich erstellt hat — die Person oder Stelle, die die eigentliche Arbeit gemacht hat. Das kann von der herausgebenden Organisation abweichen. Beispiel: Forschungsgruppe Stadtklima.', + ), + array( + 'key' => 'creator_email', + 'meta_key' => '_odw_creator_email', + 'dcat_prop' => 'dct:creator', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche E-Mail-Adresse gehört zum `dct:creator`?', + 'q_human' => 'Wie lautet die E-Mail-Adresse des Erstellers?', + 'desc_dcat' => 'Ergänzt `dct:creator` um eine E-Mail-Adresse der erstellenden Stelle (als `mailto:`-URI). Optional, Multiplizität 0..1.', + 'desc_human' => 'Optional die E-Mail-Adresse der erstellenden Person oder Stelle. Beispiel: forschung@beispiel.de.', + ), + array( + 'key' => 'version', + 'meta_key' => '_odw_version', + 'dcat_prop' => 'owl:versionInfo', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `owl:versionInfo` (Versionsbezeichnung) hat der Datensatz?', + 'q_human' => 'Welche Version hat dieser Datensatz?', + 'desc_dcat' => '`owl:versionInfo` gibt die Versionsbezeichnung des Datensatzes als Freitext an (`literal`). Multiplizität 0..1. Erlaubt die Unterscheidung aufeinanderfolgender Ausgaben desselben Datensatzes.', + 'desc_human' => 'Falls es mehrere Ausgaben Ihrer Daten gibt, tragen Sie die Versionsnummer ein. So wissen Nutzende, welche Fassung sie vor sich haben. Beispiel: 2.0.', + ), + array( + 'key' => 'version_notes', + 'meta_key' => '_odw_version_notes', + 'dcat_prop' => 'adms:versionNotes', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `adms:versionNotes` (Änderungshinweise) beschreiben diese Version?', + 'q_human' => 'Was hat sich in dieser Version geändert?', + 'desc_dcat' => '`adms:versionNotes` beschreibt die Änderungen gegenüber der Vorversion als sprachlich getaggten Freitext (`literal-lang`). Multiplizität 0..n. Ergänzt `owl:versionInfo` um den inhaltlichen Änderungsverlauf.', + 'desc_human' => 'Beschreiben Sie kurz, was sich gegenüber der letzten Version geändert hat — wie ein Änderungsprotokoll. Nutzende sehen so, ob sich ein erneuter Download lohnt. Beispiel: „Daten für 2025 ergänzt, Tippfehler korrigiert."', + ), + array( + 'key' => 'spatial_resolution', + 'meta_key' => '_odw_spatial_resolution', + 'dcat_prop' => 'dcat:spatialResolutionInMeters', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `dcat:spatialResolutionInMeters` (räumliche Auflösung) haben die Daten?', + 'q_human' => 'Welche räumliche Auflösung haben die Daten (in Metern)?', + 'desc_dcat' => '`dcat:spatialResolutionInMeters` gibt die kleinste räumlich unterscheidbare Einheit in Metern an (`xsd:decimal`). Multiplizität 0..n. Relevant vor allem für Geodaten und Rasterdaten.', + 'desc_human' => 'Bei Geodaten: Geben Sie an, wie fein die Daten räumlich aufgelöst sind — der kleinste unterscheidbare Abstand in Metern. Ein kleiner Wert bedeutet detailliertere Daten. Beispiel: 10 (Raster von 10 Metern). Tragen Sie dabei nur die Zahl ein, ohne die Einheit dahinterzuschreiben.', + ), + array( + 'key' => 'temporal_resolution', + 'meta_key' => '_odw_temporal_resolution', + 'dcat_prop' => 'dcat:temporalResolution', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `dcat:temporalResolution` (zeitliche Auflösung) haben die Daten?', + 'q_human' => 'Welche zeitliche Auflösung haben die Daten?', + 'desc_dcat' => '`dcat:temporalResolution` gibt die kleinste zeitlich unterscheidbare Einheit als ISO-8601-Dauer an (`xsd:duration`). Multiplizität 0..1. Beschreibt z. B. den Messabstand einer Zeitreihe.', + 'desc_human' => 'Bei Zeitreihen: Geben Sie an, in welchem zeitlichen Abstand die Werte erfasst sind — z. B. stündlich, täglich, monatlich. Format ist die ISO-8601-Dauer. Beispiel: P1D (ein Tag) oder PT1H (eine Stunde).', + ), + array( + 'key' => 'conforms_to', + 'meta_key' => '_odw_conforms_to', + 'dcat_prop' => 'dct:conformsTo', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welchem `dct:conformsTo` (Standard/Schema) entsprechen die Daten?', + 'q_human' => 'Welchem Standard oder Schema entsprechen die Daten?', + 'desc_dcat' => '`dct:conformsTo` verweist auf einen implementierten Standard, ein Anwendungsprofil oder ein Schema, dem die Daten entsprechen (Range `dct:Standard`, per URI oder Bezeichnung). Multiplizität 0..n.', + 'desc_human' => 'Falls Ihre Daten einem bestimmten Standard oder Schema folgen, nennen Sie ihn hier. So können Systeme die Daten korrekt interpretieren. Beispiel: INSPIRE, XÖV oder ein fachliches Datenschema. Einzutragen ist die Web-Adresse, unter der der Standard beschrieben ist.', + ), + array( + 'key' => 'provenance', + 'meta_key' => '_odw_provenance', + 'dcat_prop' => 'dct:provenance', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `dct:provenance` (Herkunft/Entstehung) hat der Datensatz?', + 'q_human' => 'Woher stammen die Daten und wie sind sie entstanden?', + 'desc_dcat' => '`dct:provenance` beschreibt die Herkunft und Entstehungsgeschichte des Datensatzes (Range `dct:ProvenanceStatement`, Freitext). Multiplizität 0..n. Dokumentiert Erhebungs- und Verarbeitungsschritte.', + 'desc_human' => 'Beschreiben Sie, woher die Daten kommen und wie sie entstanden sind — z. B. aus welcher Erhebung oder welchem Verfahren. Das macht die Daten nachvollziehbar und vertrauenswürdig. Beispiel: „Erhoben im Rahmen der Bürgerbefragung 2025, anonymisiert aufbereitet."', + ), + array( + 'key' => 'dist_title', + 'meta_key' => '_odw_dist_title', + 'dcat_prop' => 'dct:title', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Wie lautet der `dct:title` der Distribution?', + 'q_human' => 'Wie heißt die bereitgestellte Datei/Distribution?', + 'desc_dcat' => '`dct:title` auf Ebene der Distribution benennt die konkrete bereitgestellte Ressource (`literal-lang`). Multiplizität 0..n. Nützlich, wenn der Distributionsname vom Datensatztitel abweicht.', + 'desc_human' => 'Geben Sie der bereitgestellten Datei einen eigenen Namen, falls er sich vom Titel des Datensatzes unterscheidet. Beispiel: „Rohdaten CSV 2025".', + ), + array( + 'key' => 'dist_description', + 'meta_key' => '_odw_dist_description', + 'dcat_prop' => 'dct:description', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Wie lautet die `dct:description` der Distribution?', + 'q_human' => 'Wie lässt sich die Distribution beschreiben?', + 'desc_dcat' => '`dct:description` auf Distributionsebene beschreibt die konkrete Datei/Ressource (`literal-lang`). Multiplizität 0..n. Ergänzt die Datensatzbeschreibung um distributionsspezifische Hinweise (z. B. Spaltenaufbau).', + 'desc_human' => 'Beschreiben Sie die konkrete Datei näher — etwa welche Spalten sie enthält oder wie sie aufgebaut ist. Das hilft beim direkten Umgang mit der Datei. Beispiel: „Spalten: Jahr, Stadt, Einwohner; Trennzeichen Semikolon."', + ), + array( + 'key' => 'download_url', + 'meta_key' => '_odw_download_url', + 'dcat_prop' => 'dcat:downloadURL', + 'cardinality' => '0..n', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Unter welcher `dcat:downloadURL` ist die Datei direkt herunterladbar?', + 'q_human' => 'Wie lautet der direkte Download-Link zur Datei?', + 'desc_dcat' => '`dcat:downloadURL` verweist auf eine direkt herunterladbare Datei (Range `rdfs:Resource`). Anders als `dcat:accessURL` garantiert sie einen unmittelbaren Download derselben Ressource. Multiplizität 0..n. Relevant für die MQA-Dimension Zugänglichkeit.', + 'desc_human' => 'Falls es einen direkten Link gibt, der die Datei sofort herunterlädt (ohne Umweg über eine Seite), tragen Sie ihn hier ein. Das ist der bequemste Weg für Nachnutzende. Beispiel: https://beispiel.de/daten/statistik.csv.', + ), + array( + 'key' => 'media_type', + 'meta_key' => '_odw_media_type', + 'dcat_prop' => 'dcat:mediaType', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => 'iana-media-type', + 'q_dcat' => 'Welchen `dcat:mediaType` (IANA-MIME-Typ) hat die Distribution?', + 'q_human' => 'Welchen Medientyp (MIME) hat die Datei?', + 'desc_dcat' => '`dcat:mediaType` gibt den Medientyp der Distribution als IANA-Media-Type an (z. B. `text/csv`, `application/json`), referenziert über das IANA-Media-Types-Register. Multiplizität 0..1. Ergänzt `dct:format` um den technischen MIME-Typ.', + 'desc_human' => 'Der technische Medientyp der Datei (MIME-Typ) — die maschinenlesbare Entsprechung zum Format. Systeme erkennen daran, wie sie die Datei behandeln müssen. Beispiel: text/csv, application/json. Einzutragen ist die vollständige Web-Adresse aus dem IANA-Verzeichnis, zum Beispiel https://www.iana.org/assignments/media-types/text/csv.', + ), + array( + 'key' => 'dist_rights', + 'meta_key' => '_odw_dist_rights', + 'dcat_prop' => 'dct:rights', + 'cardinality' => '0..1', + 'tab' => '4 — Erweiterte Angaben', + 'tier' => 'optional', + 'vocab' => '', + 'q_dcat' => 'Welche `dct:rights` (Nutzungsrechte) gelten für die Distribution?', + 'q_human' => 'Welche Nutzungsrechte gelten für die Datei?', + 'desc_dcat' => '`dct:rights` beschreibt rechtliche Hinweise zur Distribution jenseits der Lizenz — etwa Urheberrechts- oder Zugriffsvermerke (Range `dct:RightsStatement`, Freitext oder URI). Multiplizität 0..1.', + 'desc_human' => 'Ergänzende rechtliche Hinweise zur Datei, die über die Lizenz hinausgehen — z. B. Urheberrechtsvermerke. Für viele offene Datensätze bleibt das leer. Beispiel: „© Stadt Musterstadt 2026".', ), ); diff --git a/docs/FELD-REFERENZ.md b/docs/FELD-REFERENZ.md index 13ce796b..a4dfedc7 100644 --- a/docs/FELD-REFERENZ.md +++ b/docs/FELD-REFERENZ.md @@ -84,6 +84,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:publisher` | | Meta-Key | `_odw_publisher` | +| Multiplizität | `1..1` | | Stufe | Pflicht | | Vokabular | — | @@ -101,6 +102,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:theme` | | Meta-Key | `_odw_theme` | +| Multiplizität | `0..n` | | Stufe | Empfohlen | | Vokabular | `data-theme` | @@ -118,6 +120,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:keyword` | | Meta-Key | `_odw_keywords` | +| Multiplizität | `0..n` | | Stufe | Empfohlen | | Vokabular | — | @@ -127,7 +130,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **3 · DCAT-AP-Langbeschreibung:** `dcat:keyword` sind freie, sprachlich getaggte Schlagwörter zur Verbesserung der Auffindbarkeit (`literal-lang`, Multiplizität 0..n). Anders als `dcat:theme` sind sie nicht an ein kontrolliertes Vokabular gebunden. Je Schlagwort ein Wert. -**4 · Verständliche Langbeschreibung:** Tragen Sie einzelne Schlagwörter ein, unter denen man Ihre Daten suchen würde — jedes Wort in eine eigene Zeile. Sie ergänzen das Thema und machen die Daten leichter auffindbar. Beispiel: Umwelt, Wasser, Luftverschmutzung. +**4 · Verständliche Langbeschreibung:** Tragen Sie einzelne Schlagwörter ein, unter denen man Ihre Daten suchen würde — jedes Wort in eine eigene Zeile. Sie ergänzen das Thema und machen die Daten leichter auffindbar. Beispiel: erst „Umwelt", darunter „Wasser", darunter „Luftverschmutzung". Trennen Sie die Schlagwörter nicht mit Komma. ### Welchem Themenfeld nach CESSDA ordnen Sie den Datensatz zu? @@ -135,6 +138,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:subject` | | Meta-Key | `_odw_cessda_topic` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | `cessda` | @@ -152,6 +156,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:subject` | | Meta-Key | `_odw_engagementfeld` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | `engagementfeld` | @@ -169,6 +174,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:description` | | Meta-Key | `_odw_description` | +| Multiplizität | `1..n` | | Stufe | Pflicht | | Vokabular | — | @@ -190,6 +196,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:language` | | Meta-Key | `_odw_language` | +| Multiplizität | `0..n` | | Stufe | Empfohlen | | Vokabular | `language` | @@ -211,6 +218,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:accessURL` | | Meta-Key | `_odw_access_url` | +| Multiplizität | `1..n` | | Stufe | Pflicht | | Vokabular | — | @@ -228,6 +236,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:format` | | Meta-Key | `_odw_format` | +| Multiplizität | `0..1` | | Stufe | Empfohlen | | Vokabular | `file-type` | @@ -245,6 +254,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:byteSize` | | Meta-Key | `_odw_byte_size` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -262,6 +272,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:license` | | Meta-Key | `_odw_license` | +| Multiplizität | `0..1` | | Stufe | Pflicht | | Vokabular | `licenses` | @@ -269,7 +280,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Unter welcher Lizenz sind diese Daten verfügbar? -**3 · DCAT-AP-Langbeschreibung:** `dct:license` benennt das rechtliche Dokument, unter dem die Distribution bereitgestellt wird (Range `dct:LicenseDocument`, referenziert per URI). Verpflichtend für die Wiederverwendbarkeit. Empfohlen werden URIs offener Lizenzen (Creative Commons, Datenlizenz Deutschland, DCAT-AP.de-Lizenzregister). +**3 · DCAT-AP-Langbeschreibung:** `dct:license` benennt das rechtliche Dokument, unter dem die Distribution bereitgestellt wird (Range `dct:LicenseDocument`, referenziert per URI). Multiplizität 0..1 je Distribution; das Plugin erzwingt die Angabe, weil ohne Lizenz keine Nachnutzung möglich ist. Empfohlen werden URIs offener Lizenzen (Creative Commons, Datenlizenz Deutschland, DCAT-AP.de-Lizenzregister). **4 · Verständliche Langbeschreibung:** Legen Sie fest, was andere mit Ihren Daten tun dürfen — das regelt die Lizenz. Wählen Sie eine der vorgeschlagenen Standardlizenzen; „offene" Lizenzen erlauben die freie Weiternutzung. Ohne Lizenz sind Daten rechtlich unklar und kaum nachnutzbar. Beispiel: CC-BY 4.0 (Namensnennung). @@ -279,6 +290,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:license` | | Meta-Key | `_odw_license_custom` | +| Multiplizität | `0..1` | | Stufe | Bedingt | | Vokabular | `licenses` | @@ -286,7 +298,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Welche eigene Lizenz-URI möchten Sie angeben? -**3 · DCAT-AP-Langbeschreibung:** Nur relevant, wenn im Lizenzfeld „Sonstige" gewählt wurde: Hier wird die `dct:license`-URI einer nicht in der Standardliste enthaltenen Lizenz eingetragen. Das Auto-Suggest bietet zusätzlich die URIs des DCAT-AP.de-Lizenzregisters (`http://dcat-ap.de/def/licenses/…`) an. +**3 · DCAT-AP-Langbeschreibung:** Nur relevant, wenn im Lizenzfeld „Sonstige" gewählt wurde: Hier wird die `dct:license`-URI einer nicht in der Standardliste enthaltenen Lizenz eingetragen. Das Auto-Suggest bietet zusätzlich die URIs des DCAT-AP.de-Lizenzregisters (`http://dcat-ap.de/def/licenses/…`) an. Multiplizität 0..1 je Distribution — es ist dieselbe Eigenschaft wie oben. **4 · Verständliche Langbeschreibung:** Dieses Feld erscheint nur, wenn Sie oben „Sonstige" Lizenz gewählt haben. Tragen Sie dann die Web-Adresse (URI) Ihrer Lizenz ein oder wählen Sie eine aus der Vorschlagsliste. Beispiel: http://dcat-ap.de/def/licenses/dl-by-de/2.0. @@ -296,6 +308,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:licenseAttributionByText` | | Meta-Key | `_odw_attribution_text` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -313,6 +326,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatap:availability` | | Meta-Key | `_odw_availability` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | `planned-availability` | @@ -334,6 +348,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:landingPage` | | Meta-Key | `_odw_landing_page` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -351,6 +366,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:issued` | | Meta-Key | `_odw_issued` | +| Multiplizität | `0..1` | | Stufe | Empfohlen | | Vokabular | — | @@ -368,6 +384,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:modified` | | Meta-Key | `_odw_modified` | +| Multiplizität | `0..1` | | Stufe | Empfohlen | | Vokabular | — | @@ -385,6 +402,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:accrualPeriodicity` | | Meta-Key | `_odw_accrual_periodicity` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | `frequency` | @@ -402,6 +420,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:politicalGeocodingLevelURI` | | Meta-Key | `_odw_political_geocoding_level` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | `politicalGeocodingLevel` | @@ -419,6 +438,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:politicalGeocodingURI` | | Meta-Key | `_odw_political_geocoding_uri` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -436,6 +456,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:geocodingDescription` | | Meta-Key | `_odw_geocoding_description` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -453,6 +474,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:spatial` | | Meta-Key | `_odw_spatial` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -462,7 +484,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **3 · DCAT-AP-Langbeschreibung:** `dct:spatial` beschreibt die räumliche Abdeckung des Datensatzes (Range `dct:Location`). Als Wert dient eine Gebiets-URI (z. B. GeoNames, EU-Continents) oder eine Freitext-Ortsangabe. Multiplizität 0..n. -**4 · Verständliche Langbeschreibung:** Geben Sie an, welches geografische Gebiet die Daten abdecken — eine Stadt, ein Bundesland, ein Land oder eine Region. So finden Nutzende Daten zu ihrer Gegend. Beispiel: Musterstadt oder Bayern. +**4 · Verständliche Langbeschreibung:** Geben Sie an, welches geografische Gebiet die Daten abdecken — eine Stadt, ein Bundesland, ein Land oder eine Region. So finden Nutzende Daten zu ihrer Gegend. Beispiel: Musterstadt oder Bayern. Wählen Sie die Region aus der Vorschlagsliste — dann wird die passende Kennung automatisch gesetzt — oder tippen Sie das Gebiet einfach selbst ein. ### Ab wann sind diese Daten gültig? @@ -470,6 +492,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:temporal` | | Meta-Key | `_odw_temporal_start` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -487,6 +510,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:temporal` | | Meta-Key | `_odw_temporal_end` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -504,6 +528,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:contactPoint` | | Meta-Key | `_odw_contact_name` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -511,7 +536,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Wer ist Ansprechperson für Fragen zu diesen Daten? -**3 · DCAT-AP-Langbeschreibung:** Teil des `dcat:contactPoint` (Range `vcard:Kind`): `vcard:fn` benennt die Kontaktstelle oder -person für Rückfragen zum Datensatz. Multiplizität des Kontaktpunkts 0..n. Name, E-Mail und URL bilden zusammen einen Kontaktpunkt. +**3 · DCAT-AP-Langbeschreibung:** Teil des `dcat:contactPoint` (Range `vcard:Kind`): `vcard:fn` benennt die Kontaktstelle oder -person für Rückfragen zum Datensatz. Multiplizität 0..1 je Kontaktpunkt; ein Datensatz kann mehrere Kontaktpunkte tragen (0..n). Name, E-Mail und URL bilden zusammen einen Kontaktpunkt. **4 · Verständliche Langbeschreibung:** Nennen Sie, an wen sich Nutzende bei Fragen wenden können — eine Person oder eine Abteilung. So ist klar, wer für die Daten zuständig ist. Beispiel: Open-Data-Team der Stadt Musterstadt. @@ -521,6 +546,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:contactPoint` | | Meta-Key | `_odw_contact_email` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -538,6 +564,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:contactPoint` | | Meta-Key | `_odw_contact_url` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -555,6 +582,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:contributorID` | | Meta-Key | `_odw_contributor_id` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | `contributors` | @@ -572,6 +600,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:originator` | | Meta-Key | `_odw_originator_name` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -589,6 +618,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:originator` | | Meta-Key | `_odw_originator_email` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -606,6 +636,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:maintainer` | | Meta-Key | `_odw_maintainer_name` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -623,6 +654,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:maintainer` | | Meta-Key | `_odw_maintainer_email` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -640,6 +672,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:legalBasis` | | Meta-Key | `_odw_legal_basis` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -657,6 +690,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatde:qualityProcessURI` | | Meta-Key | `_odw_quality_process_uri` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -674,6 +708,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:accessRights` | | Meta-Key | `_odw_access_rights` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | `access-right` | @@ -683,7 +718,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **3 · DCAT-AP-Langbeschreibung:** `dct:accessRights` klassifiziert den Zugriffsstatus über das EU-Vokabular „Access Right" (`PUBLIC`, `RESTRICTED`, `NON_PUBLIC`). Multiplizität 0..1. Relevant für die MQA-Dimension Wiederverwendbarkeit. -**4 · Verständliche Langbeschreibung:** Geben Sie an, ob die Daten für alle offen (öffentlich), nur eingeschränkt oder gar nicht öffentlich zugänglich sind. Für offene Daten ist das in der Regel „öffentlich". Beispiel: Öffentlich. +**4 · Verständliche Langbeschreibung:** Geben Sie an, ob die Daten für alle offen (öffentlich), nur eingeschränkt oder gar nicht öffentlich zugänglich sind. Für offene Daten ist das in der Regel „öffentlich". Beispiel: Öffentlich. „Öffentlich" ist bereits vorausgewählt — ändern Sie die Angabe nur, wenn der Zugriff eingeschränkt oder gar nicht öffentlich ist. ### Welches weitere EU-Thema möchten Sie ergänzen? @@ -691,6 +726,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:theme` | | Meta-Key | `_odw_theme_uri` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | `data-theme` | @@ -708,6 +744,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatap:applicableLegislation` | | Meta-Key | `_odw_is_hvd` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -715,9 +752,9 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **2 · Verständliche Frage:** Ist dies ein hochwertiger Datensatz (HVD)? -**3 · DCAT-AP-Langbeschreibung:** Kennzeichen, ob der Datensatz ein High-Value-Dataset im Sinne der EU-Durchführungsverordnung 2023/138 ist. Ist es gesetzt, wird `dcatap:applicableLegislation` (Verweis auf die Verordnung) ausgegeben und das Feld HVD-Kategorie relevant. +**3 · DCAT-AP-Langbeschreibung:** Kennzeichen, ob der Datensatz ein High-Value-Dataset im Sinne der EU-Durchführungsverordnung 2023/138 ist. Ist es gesetzt, wird `dcatap:applicableLegislation` (Verweis auf die Verordnung) ausgegeben und das Feld HVD-Kategorie relevant. Multiplizität 0..1. -**4 · Verständliche Langbeschreibung:** „High-Value-Datasets" sind von der EU als besonders wertvoll eingestufte Datensätze (z. B. Geo-, Umwelt- oder Mobilitätsdaten). Setzen Sie dies nur, wenn Ihr Datensatz in eine der offiziellen HVD-Kategorien fällt — im Zweifel „Nein". Beispiel: Ja, bei amtlichen Geodaten. +**4 · Verständliche Langbeschreibung:** „High-Value-Datasets" sind von der EU als besonders wertvoll eingestufte Datensätze (z. B. Geo-, Umwelt- oder Mobilitätsdaten). Setzen Sie dies nur, wenn Ihr Datensatz in eine der offiziellen HVD-Kategorien fällt — im Zweifel „Nein". Beispiel: Ja, bei amtlichen Geodaten. Das betrifft ausschließlich öffentliche Stellen — Vereine, Verbände und andere zivilgesellschaftliche Organisationen können das Feld leer lassen. ### Welcher HVD-Kategorie gehört dieser Datensatz an? @@ -725,6 +762,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcatap:hvdCategory` | | Meta-Key | `_odw_hvd_category` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | `hvd-category` | @@ -742,6 +780,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:identifier` | | Meta-Key | `_odw_identifier` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -751,7 +790,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **3 · DCAT-AP-Langbeschreibung:** `dct:identifier` ist eine eindeutige, im System der Herausgeberin vergebene Kennung des Datensatzes (Freitext/`literal`). Multiplizität 0..n. Ermöglicht die stabile Referenzierung über Systemgrenzen hinweg. -**4 · Verständliche Langbeschreibung:** Falls Ihr Datensatz eine feste Kennnummer aus Ihrem eigenen System hat, tragen Sie sie hier ein. So bleibt der Datensatz eindeutig identifizierbar. Beispiel: DS-2026-00042. +**4 · Verständliche Langbeschreibung:** Falls Ihr Datensatz eine feste Kennnummer aus Ihrem eigenen System hat, tragen Sie sie hier ein. So bleibt der Datensatz eindeutig identifizierbar. Beispiel: DS-2026-00042. Neben einer internen Nummer können Sie hier auch eine dauerhafte, extern vergebene Kennung wie einen DOI eintragen. ### Um welchen Typ von Datensatz handelt es sich? @@ -759,6 +798,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:type` | | Meta-Key | `_odw_type` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | `dataset-type` | @@ -768,7 +808,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **3 · DCAT-AP-Langbeschreibung:** `dct:type` klassifiziert die Art des Datensatzes, idealerweise über das EU-Vokabular „Dataset Type". Multiplizität 0..1. Unterscheidet z. B. Erhebungsdaten, Registerdaten oder Geodaten. -**4 · Verständliche Langbeschreibung:** Geben Sie an, um welche Art von Datensatz es sich grundsätzlich handelt. Das hilft bei der groben Einordnung. Beispiel: Statistische Erhebung, Geodaten. +**4 · Verständliche Langbeschreibung:** Geben Sie an, um welche Art von Datensatz es sich grundsätzlich handelt. Das hilft bei der groben Einordnung. Beispiel: Statistische Erhebung, Geodaten. Einzutragen ist die vollständige Web-Adresse des passenden Eintrags aus der EU-Liste der Datensatz-Typen, nicht die Bezeichnung als Text. ### Wer hat diese Daten erstellt? @@ -776,6 +816,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:creator` | | Meta-Key | `_odw_creator_name` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -793,6 +834,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:creator` | | Meta-Key | `_odw_creator_email` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -810,6 +852,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `owl:versionInfo` | | Meta-Key | `_odw_version` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -827,6 +870,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `adms:versionNotes` | | Meta-Key | `_odw_version_notes` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -844,6 +888,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:spatialResolutionInMeters` | | Meta-Key | `_odw_spatial_resolution` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -853,7 +898,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **3 · DCAT-AP-Langbeschreibung:** `dcat:spatialResolutionInMeters` gibt die kleinste räumlich unterscheidbare Einheit in Metern an (`xsd:decimal`). Multiplizität 0..n. Relevant vor allem für Geodaten und Rasterdaten. -**4 · Verständliche Langbeschreibung:** Bei Geodaten: Geben Sie an, wie fein die Daten räumlich aufgelöst sind — der kleinste unterscheidbare Abstand in Metern. Ein kleiner Wert bedeutet detailliertere Daten. Beispiel: 10 (Raster von 10 Metern). +**4 · Verständliche Langbeschreibung:** Bei Geodaten: Geben Sie an, wie fein die Daten räumlich aufgelöst sind — der kleinste unterscheidbare Abstand in Metern. Ein kleiner Wert bedeutet detailliertere Daten. Beispiel: 10 (Raster von 10 Metern). Tragen Sie dabei nur die Zahl ein, ohne die Einheit dahinterzuschreiben. ### Welche zeitliche Auflösung haben die Daten? @@ -861,6 +906,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:temporalResolution` | | Meta-Key | `_odw_temporal_resolution` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | @@ -878,6 +924,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:conformsTo` | | Meta-Key | `_odw_conforms_to` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -887,7 +934,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **3 · DCAT-AP-Langbeschreibung:** `dct:conformsTo` verweist auf einen implementierten Standard, ein Anwendungsprofil oder ein Schema, dem die Daten entsprechen (Range `dct:Standard`, per URI oder Bezeichnung). Multiplizität 0..n. -**4 · Verständliche Langbeschreibung:** Falls Ihre Daten einem bestimmten Standard oder Schema folgen, nennen Sie ihn hier. So können Systeme die Daten korrekt interpretieren. Beispiel: INSPIRE, XÖV oder ein fachliches Datenschema. +**4 · Verständliche Langbeschreibung:** Falls Ihre Daten einem bestimmten Standard oder Schema folgen, nennen Sie ihn hier. So können Systeme die Daten korrekt interpretieren. Beispiel: INSPIRE, XÖV oder ein fachliches Datenschema. Einzutragen ist die Web-Adresse, unter der der Standard beschrieben ist. ### Woher stammen die Daten und wie sind sie entstanden? @@ -895,6 +942,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:provenance` | | Meta-Key | `_odw_provenance` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -912,6 +960,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:title` | | Meta-Key | `_odw_dist_title` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -929,6 +978,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:description` | | Meta-Key | `_odw_dist_description` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -946,6 +996,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:downloadURL` | | Meta-Key | `_odw_download_url` | +| Multiplizität | `0..n` | | Stufe | Optional | | Vokabular | — | @@ -963,6 +1014,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dcat:mediaType` | | Meta-Key | `_odw_media_type` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | `iana-media-type` | @@ -972,7 +1024,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **3 · DCAT-AP-Langbeschreibung:** `dcat:mediaType` gibt den Medientyp der Distribution als IANA-Media-Type an (z. B. `text/csv`, `application/json`), referenziert über das IANA-Media-Types-Register. Multiplizität 0..1. Ergänzt `dct:format` um den technischen MIME-Typ. -**4 · Verständliche Langbeschreibung:** Der technische Medientyp der Datei (MIME-Typ) — die maschinenlesbare Entsprechung zum Format. Systeme erkennen daran, wie sie die Datei behandeln müssen. Beispiel: text/csv, application/json. +**4 · Verständliche Langbeschreibung:** Der technische Medientyp der Datei (MIME-Typ) — die maschinenlesbare Entsprechung zum Format. Systeme erkennen daran, wie sie die Datei behandeln müssen. Beispiel: text/csv, application/json. Einzutragen ist die vollständige Web-Adresse aus dem IANA-Verzeichnis, zum Beispiel https://www.iana.org/assignments/media-types/text/csv. ### Welche Nutzungsrechte gelten für die Datei? @@ -980,6 +1032,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld |---|---| | DCAT-Property | `dct:rights` | | Meta-Key | `_odw_dist_rights` | +| Multiplizität | `0..1` | | Stufe | Optional | | Vokabular | — | diff --git a/includes/class-admin.php b/includes/class-admin.php index 4a0f7996..0eaf79f4 100644 --- a/includes/class-admin.php +++ b/includes/class-admin.php @@ -446,6 +446,8 @@ public static function enqueue_assets( string $hook ): void { 'toggle' => __( 'Mehr erfahren', 'open-data-wizard' ), 'dcat' => __( 'DCAT-AP-Definition', 'open-data-wizard' ), 'plain' => __( 'Einfach erklärt', 'open-data-wizard' ), + 'prop' => __( 'Eigenschaft', 'open-data-wizard' ), + 'mult' => __( 'Multiplizität', 'open-data-wizard' ), ), ) ); diff --git a/includes/class-field-reference.php b/includes/class-field-reference.php index 2f7418dc..50c19a5c 100644 --- a/includes/class-field-reference.php +++ b/includes/class-field-reference.php @@ -62,17 +62,20 @@ public static function load_catalog(): array { * Returns a compact catalog map for the admin JS ("Mehr erfahren" panels). * * Only the fields needed on the client are exposed: the distribution meta key - * (to locate the DOM field) and the two long descriptions. + * (to locate the DOM field), the two long descriptions und die beiden + * Merkmale, die das Panel als Kurzangabe über der Definition zeigt. * - * @return array + * @return array */ public static function js_map(): array { $map = array(); foreach ( self::load_catalog() as $field ) { $map[] = array( - 'meta_key' => (string) $field['meta_key'], - 'desc_dcat' => (string) $field['desc_dcat'], - 'desc_human' => (string) $field['desc_human'], + 'meta_key' => (string) $field['meta_key'], + 'dcat_prop' => (string) ( $field['dcat_prop'] ?? '' ), + 'cardinality' => (string) ( $field['cardinality'] ?? '' ), + 'desc_dcat' => (string) $field['desc_dcat'], + 'desc_human' => (string) $field['desc_human'], ); } return $map; @@ -137,6 +140,7 @@ public static function build(): string { $out[] = '|---|---|'; $out[] = '| DCAT-Property | `' . $field['dcat_prop'] . '` |'; $out[] = '| Meta-Key | `' . ( '' !== $field['meta_key'] ? $field['meta_key'] : '—' ) . '` |'; + $out[] = '| Multiplizität | `' . ( '' !== ( $field['cardinality'] ?? '' ) ? $field['cardinality'] : '—' ) . '` |'; $out[] = '| Stufe | ' . $tier . ' |'; $out[] = '| Vokabular | ' . $vocab . ' |'; $out[] = ''; diff --git a/includes/class-fields.php b/includes/class-fields.php index d7fe3fdb..01a90176 100644 --- a/includes/class-fields.php +++ b/includes/class-fields.php @@ -72,7 +72,7 @@ private static function register_required_fields(): void { ->set_attribute( 'data-odw-required', '1' ) ->set_default_value( class_exists( 'ODW_Settings' ) ? (string) ODW_Settings::get( 'default_publisher' ) : '' ) ->set_attribute( 'placeholder', __( 'z.B. Musterorganisation e.V.', 'open-data-wizard' ) ) - ->set_help_text( __( 'HERAUSGEBENDE ORGANISATION (dct:publisher)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: Musterstadt Statistikamt, Umweltbundesamt, Verbraucherzentrale e.V.', 'open-data-wizard' ) ), + ->set_help_text( __( 'HERAUSGEBENDE ORGANISATION (dct:publisher)', 'open-data-wizard' ) ), // Beschreibung direkt nach dem Herausgeber (beide Pflicht), damit die // zwei wichtigsten Angaben oben stehen (B3). @@ -81,7 +81,7 @@ private static function register_required_fields(): void { ->set_attribute( 'data-odw-required', '1' ) ->set_rows( 5 ) ->set_attribute( 'placeholder', __( 'Kurze Beschreibung des Datensatzes…', 'open-data-wizard' ) ) - ->set_help_text( __( 'BESCHREIBUNG (dct:description)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: Ein Überblick über die bevölkerungsreichsten Städte in Deutschland mit statistischen Daten zu Einwohnerzahl und Entwicklung.', 'open-data-wizard' ) ), + ->set_help_text( __( 'BESCHREIBUNG (dct:description)', 'open-data-wizard' ) ), Field::make( 'select', 'odw_theme', __( 'Welchem Thema ist dieser Datensatz zugeordnet?', 'open-data-wizard' ) ) ->add_options( self::get_theme_options() ) @@ -94,7 +94,7 @@ private static function register_required_fields(): void { Field::make( 'textarea', 'odw_keywords', __( 'Mit welchen Schlagworten finde ich diese Daten?', 'open-data-wizard' ) ) ->set_rows( 3 ) ->set_attribute( 'placeholder', __( "Umwelt\nWasser\nLuftverschmutzung", 'open-data-wizard' ) ) - ->set_help_text( __( 'SCHLAGWORTE (dcat:keyword)', 'open-data-wizard' ) . "\n\n" . __( "Jedes Schlagwort in eine eigene Zeile (nicht mit Komma trennen). Beispiel:\nUmwelt\nWasser\nLuftverschmutzung", 'open-data-wizard' ) ), + ->set_help_text( __( 'SCHLAGWORTE (dcat:keyword)', 'open-data-wizard' ) ), // Weniger häufige Einordnungen (CESSDA, ZiviZ) als aufklappbare // Untergruppe ans Tab-Ende — entschlackt den Einstieg für die @@ -109,7 +109,7 @@ private static function register_required_fields(): void { Field::make( 'text', 'odw_cessda_topic', __( 'Ordnen Sie den Datensatz einem oder mehreren Themenfeld nach CESSDA-Vokabular zu', 'open-data-wizard' ) ) ->set_attribute( 'data-odw-backing', 'cessda' ) - ->set_help_text( __( 'CESSDA THEMENKLASSIFIKATION (dct:subject)', 'open-data-wizard' ) . "\n\n" . __( 'Aus dem CESSDA Controlled Vocabulary (Version 4.2.3, Deutsch). Beispiel: Volkszählungen, Migration, Wirtschaftspolitik', 'open-data-wizard' ) ), + ->set_help_text( __( 'CESSDA THEMENKLASSIFIKATION (dct:subject)', 'open-data-wizard' ) ), // Der Wert landet als dct:subject am Datensatz, nicht am Herausgeber. // Die Frage muss das abbilden — sonst tragen Redakteur:innen das @@ -118,7 +118,7 @@ private static function register_required_fields(): void { Field::make( 'text', 'odw_engagementfeld', __( 'Welchem Engagementfeld ist dieser Datensatz zuzuordnen?', 'open-data-wizard' ) ) ->set_attribute( 'data-odw-vocab', 'engagementfeld' ) ->set_attribute( 'placeholder', __( 'Engagementfeld eintippen oder auswählen…', 'open-data-wizard' ) ) - ->set_help_text( __( 'ENGAGEMENTFELD (ZiviZ, dct:subject)', 'open-data-wizard' ) . "\n\n" . __( 'Optional: Ordnen Sie den Datensatz einem Engagementfeld der Zivilgesellschaft nach dem ZiviZ-Vokabular zu. Feld aus der Liste wählen — die zugehörige URI wird automatisch verwendet. Beispiel: Kultur, Sport, Umwelt- und Naturschutz.', 'open-data-wizard' ) ), + ->set_help_text( __( 'ENGAGEMENTFELD (ZiviZ, dct:subject)', 'open-data-wizard' ) ), ) ) @@ -216,7 +216,7 @@ private static function register_required_fields(): void { Field::make( 'text', 'odw_access_url', __( 'Ergänzen Sie den Link zu Ihrem Datensatz oder laden Sie die Datei in die Mediathek hoch', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', 'https://beispiel.de/daten/datei.csv' ) ->set_attribute( 'type', 'url' ) - ->set_help_text( __( 'ZUGRIFFS-URL (dcat:accessURL)', 'open-data-wizard' ) . "\n\n" . __( 'Zwei Wege — einer genügt: Tragen Sie hier den Link zu Ihrer Datei ein ODER laden Sie die Datei direkt darunter aus der Mediathek hoch. Bei einem Upload wird die URL beim Speichern automatisch übernommen; dieses Feld können Sie dann leer lassen.', 'open-data-wizard' ) ), + ->set_help_text( __( 'ZUGRIFFS-URL (dcat:accessURL)', 'open-data-wizard' ) ), // Der Datei-Upload stand früher als eigene Meta-Box in der // Seitenleiste — zwei Orte für denselben Sachverhalt, die zu @@ -247,7 +247,7 @@ static function (): string { ->set_attribute( 'data-odw-required', '1' ) ->set_default_value( class_exists( 'ODW_Settings' ) ? (string) ODW_Settings::get( 'default_license' ) : '' ) ->add_options( self::get_license_options() ) - ->set_help_text( __( 'LIZENZ (dct:license)', 'open-data-wizard' ) . "\n\n" . __( 'Diese bestimmt, wie andere die Daten nutzen dürfen.', 'open-data-wizard' ) ), + ->set_help_text( __( 'LIZENZ (dct:license)', 'open-data-wizard' ) ), Field::make( 'html', 'odw_license_info' ) ->set_html( '

' ), @@ -255,7 +255,7 @@ static function (): string { Field::make( 'text', 'odw_license_custom', __( 'Lizenz-URI eingeben oder auswählen', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'https://example.org/meine-lizenz', 'open-data-wizard' ) ) ->set_attribute( 'data-odw-autosuggest', 'license_custom' ) - ->set_help_text( __( 'EIGENE LIZENZ-URI', 'open-data-wizard' ) . "\n\n" . __( 'Vollständige URI der Lizenz eingeben oder aus der Liste auswählen. Beispiel: https://creativecommons.org/licenses/by/4.0/', 'open-data-wizard' ) ) + ->set_help_text( __( 'EIGENE LIZENZ-URI (dct:license)', 'open-data-wizard' ) ) ->set_conditional_logic( array( array( @@ -268,7 +268,7 @@ static function (): string { Field::make( 'text', 'odw_attribution_text', __( 'Welcher Namensnennungstext soll bei Weiternutzung angegeben werden?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'optional – nur bei CC BY oder CC BY-SA', 'open-data-wizard' ) ) - ->set_help_text( __( 'NAMENSNENNUNGSTEXT (dcatde:licenseAttributionByText)', 'open-data-wizard' ) . "\n\n" . __( 'Empfohlen bei CC BY und CC BY-SA Lizenzen. Beispiel: Datensatz von Musterorganisation e.V., bereitgestellt unter CC BY 4.0', 'open-data-wizard' ) ) + ->set_help_text( __( 'NAMENSNENNUNGSTEXT (dcatde:licenseAttributionByText)', 'open-data-wizard' ) ) ->set_conditional_logic( array( 'relation' => 'OR', @@ -287,7 +287,7 @@ static function (): string { Field::make( 'select', 'odw_availability', __( 'Wie verlässlich bleibt diese Datei abrufbar?', 'open-data-wizard' ) ) ->add_options( self::get_availability_options() ) - ->set_help_text( __( 'PLANBARE VERFÜGBARKEIT (dcatap:availability)', 'open-data-wizard' ) . "\n\n" . __( 'Wie verlässlich/dauerhaft ist der Zugriff auf diese Datei geplant?', 'open-data-wizard' ) ), + ->set_help_text( __( 'PLANBARE VERFÜGBARKEIT (dcatap:availability)', 'open-data-wizard' ) ), Field::make( 'complex', 'odw_extra_distributions', __( 'Weitere Distributionen', 'open-data-wizard' ) ) ->set_help_text( __( 'MEHRERE DISTRIBUTIONEN (dcat:distribution)', 'open-data-wizard' ) . "\n\n" . __( 'Optional: zusätzliche Zugänge zu diesem Datensatz — z. B. dieselben Daten in einem weiteren Format oder unter einer anderen URL. Die oben angegebene Datei bleibt die primäre Distribution.', 'open-data-wizard' ) ) @@ -356,7 +356,7 @@ static function (): string { Field::make( 'text', 'odw_landing_page', __( 'Wo finde ich die Projektseite zu diesen Daten?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'url' ) ->set_attribute( 'placeholder', 'https://beispiel.de/projekt' ) - ->set_help_text( __( 'PROJEKTSEITE (dcat:landingPage)', 'open-data-wizard' ) . "\n\n" . __( 'URL der Projektwebsite oder des Datenportals mit weiteren Informationen zum Datensatz. Beispiel: https://beispiel.de/projekt', 'open-data-wizard' ) ), + ->set_help_text( __( 'PROJEKTSEITE (dcat:landingPage)', 'open-data-wizard' ) ), // Erstveröffentlichung und Aktualisierungsfrequenz beschreiben // beide die Aktualität des Datensatzes und stehen deshalb hier @@ -369,7 +369,7 @@ static function (): string { 'locale' => 'de', ) ) - ->set_help_text( __( 'VERÖFFENTLICHUNGSDATUM (dct:issued)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: 2024-01-15', 'open-data-wizard' ) ), + ->set_help_text( __( 'VERÖFFENTLICHUNGSDATUM (dct:issued)', 'open-data-wizard' ) ), // Das Änderungsdatum (dct:modified) hat kein Eingabefeld mehr: // ODW_Fields::set_modified_date() überschreibt _odw_modified bei @@ -399,16 +399,16 @@ static function (): string { Field::make( 'text', 'odw_political_geocoding_uri', __( 'Auf welches amtliche Gebiet beziehen sich die Daten?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'url' ) ->set_attribute( 'placeholder', 'http://dcat-ap.de/def/politicalGeocoding/regionalKey/09' ) - ->set_help_text( __( 'AMTLICHER GEBIETSSCHLÜSSEL (dcatde:politicalGeocodingURI)', 'open-data-wizard' ) . "\n\n" . __( 'URI des amtlichen Regional-/Gemeindeschlüssels (AGS/ARS). Beispiel: http://dcat-ap.de/def/politicalGeocoding/regionalKey/09', 'open-data-wizard' ) ), + ->set_help_text( __( 'AMTLICHER GEBIETSSCHLÜSSEL (dcatde:politicalGeocodingURI)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_geocoding_description', __( 'Wie lässt sich der räumliche Bezug in Worten beschreiben?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'z.B. Stadtgebiet Musterstadt ohne Ortsteil X', 'open-data-wizard' ) ) - ->set_help_text( __( 'RÄUMLICHE BESCHREIBUNG (dcatde:geocodingDescription)', 'open-data-wizard' ) . "\n\n" . __( 'Freitextbeschreibung des räumlichen Bezugs, ergänzend zum amtlichen Gebietsschlüssel. Beispiel: Stadtgebiet Musterstadt', 'open-data-wizard' ) ), + ->set_help_text( __( 'RÄUMLICHE BESCHREIBUNG (dcatde:geocodingDescription)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_spatial', __( 'Welche geografische Region betreffen diese Daten?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'Region aus der Liste wählen oder eintippen…', 'open-data-wizard' ) ) ->set_attribute( 'data-odw-autosuggest', 'spatial' ) - ->set_help_text( __( 'GEOGRAPHISCHE ABDECKUNG (dct:spatial)', 'open-data-wizard' ) . "\n\n" . __( 'Region aus der Liste wählen (mit GeoNames verknüpft) oder Freitext/URI eingeben. Beispiel: Deutschland, Bayern, Berlin', 'open-data-wizard' ) ), + ->set_help_text( __( 'GEOGRAPHISCHE ABDECKUNG (dct:spatial)', 'open-data-wizard' ) ), Field::make( 'date', 'odw_temporal_start', __( 'Ab wann reicht der Zeitraum, den die Daten abdecken?', 'open-data-wizard' ) ) ->set_storage_format( 'Y-m-d' ) @@ -418,7 +418,7 @@ static function (): string { 'locale' => 'de', ) ) - ->set_help_text( __( 'ZEITLICHER BEZUG — START (dct:temporal)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: 2024-01-01', 'open-data-wizard' ) ), + ->set_help_text( __( 'ZEITLICHER BEZUG — START (dct:temporal)', 'open-data-wizard' ) ), Field::make( 'date', 'odw_temporal_end', __( 'Bis wann reicht der Zeitraum, den die Daten abdecken?', 'open-data-wizard' ) ) ->set_storage_format( 'Y-m-d' ) @@ -428,7 +428,7 @@ static function (): string { 'locale' => 'de', ) ) - ->set_help_text( __( 'ZEITLICHER BEZUG — ENDE (dct:temporal)', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: 2024-12-31', 'open-data-wizard' ) ), + ->set_help_text( __( 'ZEITLICHER BEZUG — ENDE (dct:temporal)', 'open-data-wizard' ) ), Field::make( 'html', 'odw_ext_hint_contact' ) ->set_html( '

' . esc_html__( 'Kontakt', 'open-data-wizard' ) . '

' ), @@ -438,17 +438,17 @@ static function (): string { // Organisation, und genau das zeigt das Beispiel im Hilfetext. Field::make( 'text', 'odw_contact_name', __( 'An wen kann ich mich bei Fragen zu diesen Daten wenden?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'z.B. Open Data Team', 'open-data-wizard' ) ) - ->set_help_text( __( 'Name einer Person, eines Teams oder einer Organisation.', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: Open Data Team, Statistisches Landesamt', 'open-data-wizard' ) ), + ->set_help_text( __( 'KONTAKTPUNKT · NAME (dcat:contactPoint / vcard:fn)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_contact_email', __( 'Unter welcher E-Mail-Adresse kann ich Fragen stellen?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'email' ) ->set_attribute( 'placeholder', 'opendata@beispiel.de' ) - ->set_help_text( __( 'E-Mail-Adresse für Rückfragen.', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: opendata@beispiel.de', 'open-data-wizard' ) ), + ->set_help_text( __( 'KONTAKTPUNKT · E-MAIL (dcat:contactPoint / vcard:hasEmail)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_contact_url', __( 'Auf welcher Website finde ich weitere Kontaktinformationen?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'url' ) ->set_attribute( 'placeholder', 'https://beispiel.de/kontakt' ) - ->set_help_text( __( 'Website mit weiteren Kontaktinformationen.', 'open-data-wizard' ) . "\n\n" . __( 'Beispiel: https://beispiel.de/kontakt', 'open-data-wizard' ) ), + ->set_help_text( __( 'KONTAKTPUNKT · WEBSITE (dcat:contactPoint / vcard:hasURL)', 'open-data-wizard' ) ), // "Erweiterte Angaben" — the groups below are individually // collapsible (progressive enhancement via odw-admin-fields.js: @@ -470,11 +470,11 @@ static function (): string { Field::make( 'text', 'odw_contributor_id', __( 'Welche Stelle stellt diese Daten im GovData-Verbund bereit?', 'open-data-wizard' ) ) ->set_attribute( 'data-odw-vocab', 'contributors' ) ->set_attribute( 'placeholder', __( 'Stelle eintippen oder auswählen…', 'open-data-wizard' ) ) - ->set_help_text( __( 'CONTRIBUTOR-ID (dcatde:contributorID)', 'open-data-wizard' ) . "\n\n" . __( 'Offizielle Kennung der bereitstellenden Stelle aus dem DCAT-AP.de-Verzeichnis. Stelle aus der Liste wählen; die zugehörige offizielle URI wird automatisch verwendet.', 'open-data-wizard' ) ), + ->set_help_text( __( 'CONTRIBUTOR-ID (dcatde:contributorID)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_originator_name', __( 'Wer hat diese Daten ursprünglich erstellt?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'z.B. Statistisches Landesamt', 'open-data-wizard' ) ) - ->set_help_text( __( 'URHEBER (dcatde:originator)', 'open-data-wizard' ) . "\n\n" . __( 'Stelle, von der die Daten ursprünglich stammen (kann von Herausgeber abweichen).', 'open-data-wizard' ) ), + ->set_help_text( __( 'URHEBER (dcatde:originator)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_originator_email', __( 'E-Mail des Urhebers', 'open-data-wizard' ) ) ->set_attribute( 'type', 'email' ) @@ -483,7 +483,7 @@ static function (): string { Field::make( 'text', 'odw_maintainer_name', __( 'Wer pflegt diese Daten laufend?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'z.B. Open Data Team', 'open-data-wizard' ) ) - ->set_help_text( __( 'PFLEGENDE STELLE (dcatde:maintainer)', 'open-data-wizard' ) . "\n\n" . __( 'Stelle, die für die laufende Pflege/Aktualisierung der Daten zuständig ist.', 'open-data-wizard' ) ), + ->set_help_text( __( 'PFLEGENDE STELLE (dcatde:maintainer)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_maintainer_email', __( 'E-Mail der pflegenden Stelle', 'open-data-wizard' ) ) ->set_attribute( 'type', 'email' ) @@ -493,12 +493,12 @@ static function (): string { Field::make( 'textarea', 'odw_legal_basis', __( 'Auf welcher rechtlichen Grundlage werden die Daten bereitgestellt?', 'open-data-wizard' ) ) ->set_rows( 2 ) ->set_attribute( 'placeholder', __( 'z.B. § 12a EGovG, Informationsweiterverwendungsgesetz (IWG)', 'open-data-wizard' ) ) - ->set_help_text( __( 'RECHTSGRUNDLAGE (dcatde:legalBasis)', 'open-data-wizard' ) . "\n\n" . __( 'Gesetz/Verordnung, das die Bereitstellung regelt. Beispiel: § 12a EGovG', 'open-data-wizard' ) ), + ->set_help_text( __( 'RECHTSGRUNDLAGE (dcatde:legalBasis)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_quality_process_uri', __( 'Wo ist das Qualitätssicherungs-Verfahren dokumentiert?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'url' ) ->set_attribute( 'placeholder', 'https://beispiel.de/qualitaetssicherung' ) - ->set_help_text( __( 'QUALITÄTSPROZESS (dcatde:qualityProcessURI)', 'open-data-wizard' ) . "\n\n" . __( 'URL zur Beschreibung des Qualitätssicherungs-Prozesses (optional).', 'open-data-wizard' ) ), + ->set_help_text( __( 'QUALITÄTSPROZESS (dcatde:qualityProcessURI)', 'open-data-wizard' ) ), Field::make( 'html', 'odw_ext_hint_access' ) ->set_html( @@ -516,12 +516,12 @@ static function (): string { Field::make( 'select', 'odw_access_rights', __( 'Wer darf auf diese Daten zugreifen?', 'open-data-wizard' ) ) ->add_options( self::get_access_rights_options() ) ->set_default_value( 'http://publications.europa.eu/resource/authority/access-right/PUBLIC' ) - ->set_help_text( __( 'ZUGRIFFSRECHTE (dct:accessRights)', 'open-data-wizard' ) . "\n\n" . __( 'Zugriffs-Klassifikation des Datensatzes. Vorbelegt mit „Öffentlich“ — bitte ändern, wenn die Daten nur eingeschränkt oder gar nicht öffentlich zugänglich sind.', 'open-data-wizard' ) ), + ->set_help_text( __( 'ZUGRIFFSRECHTE (dct:accessRights)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_theme_uri', __( 'Weiteres EU-Thema (Themen-URI)?', 'open-data-wizard' ) ) ->set_attribute( 'data-odw-vocab', 'data-theme' ) ->set_attribute( 'placeholder', __( 'EU-Datenthema eintippen oder auswählen…', 'open-data-wizard' ) ) - ->set_help_text( __( 'ZUSÄTZLICHES THEMA (dcat:theme)', 'open-data-wizard' ) . "\n\n" . __( 'Optional ein weiteres Thema aus der offiziellen EU-Themenliste (ergänzt das Thema aus Tab 1).', 'open-data-wizard' ) ), + ->set_help_text( __( 'ZUSÄTZLICHES THEMA (dcat:theme)', 'open-data-wizard' ) ), Field::make( 'html', 'odw_ext_hint_hvd' ) ->set_html( @@ -538,11 +538,11 @@ static function (): string { // für wen sie gedacht sind. Field::make( 'select', 'odw_is_hvd', __( 'Nur für öffentliche Stellen: Ist dies ein hochwertiger Datensatz (HVD)?', 'open-data-wizard' ) ) ->add_options( self::get_hvd_flag_options() ) - ->set_help_text( __( 'HIGH-VALUE-DATENSATZ (EU-Durchführungsverordnung 2023/138)', 'open-data-wizard' ) . "\n\n" . __( 'Betrifft ausschließlich öffentliche Stellen — Vereine, Verbände und andere zivilgesellschaftliche Organisationen können dieses Feld leer lassen. Hochwertige Datensätze (HVD) sind von der EU festgelegte Datensätze mit besonderem Nutzen für Wirtschaft und Gesellschaft. Falls zutreffend, wählen Sie unten die passende Kategorie.', 'open-data-wizard' ) ), + ->set_help_text( __( 'HOCHWERTIGER DATENSATZ (dcatap:applicableLegislation)', 'open-data-wizard' ) ), Field::make( 'select', 'odw_hvd_category', __( 'Welcher HVD-Kategorie gehört dieser Datensatz an?', 'open-data-wizard' ) ) ->add_options( self::get_hvd_category_options() ) - ->set_help_text( __( 'HVD-KATEGORIE (dcatap:hvdCategory)', 'open-data-wizard' ) . "\n\n" . __( 'Eine der sechs EU-Themenkategorien.', 'open-data-wizard' ) ) + ->set_help_text( __( 'HVD-KATEGORIE (dcatap:hvdCategory)', 'open-data-wizard' ) ) ->set_conditional_logic( array( array( @@ -563,16 +563,16 @@ static function (): string { Field::make( 'text', 'odw_identifier', __( 'Welche eindeutige Kennung hat dieser Datensatz?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'z. B. DOI oder interne ID', 'open-data-wizard' ) ) - ->set_help_text( __( 'IDENTIFIER (dct:identifier)', 'open-data-wizard' ) . "\n\n" . __( 'Eine eindeutige Kennung des Datensatzes (z. B. DOI oder interne ID). Beispiel: 10.1234/abcd', 'open-data-wizard' ) ), + ->set_help_text( __( 'IDENTIFIER (dct:identifier)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_type', __( 'Um welchen Typ von Datensatz handelt es sich?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'url' ) ->set_attribute( 'placeholder', 'http://publications.europa.eu/resource/authority/dataset-type/...' ) - ->set_help_text( __( 'DATENSATZ-TYP (dct:type)', 'open-data-wizard' ) . "\n\n" . __( 'URI aus der EU-Liste „dataset-type". Beispiel: http://publications.europa.eu/resource/authority/dataset-type/STATISTICAL', 'open-data-wizard' ) ), + ->set_help_text( __( 'DATENSATZ-TYP (dct:type)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_creator_name', __( 'Wer hat diese Daten erstellt?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'z. B. Statistisches Amt', 'open-data-wizard' ) ) - ->set_help_text( __( 'ERSTELLER (dct:creator)', 'open-data-wizard' ) . "\n\n" . __( 'Stelle oder Person, die die Daten erstellt hat (kann vom Herausgeber abweichen).', 'open-data-wizard' ) ), + ->set_help_text( __( 'ERSTELLER (dct:creator)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_creator_email', __( 'E-Mail-Adresse des Erstellers (optional).', 'open-data-wizard' ) ) ->set_attribute( 'type', 'email' ) @@ -580,28 +580,28 @@ static function (): string { Field::make( 'text', 'odw_version', __( 'Welche Version hat dieser Datensatz?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'z. B. 1.0', 'open-data-wizard' ) ) - ->set_help_text( __( 'VERSION (owl:versionInfo)', 'open-data-wizard' ) . "\n\n" . __( 'Versionsbezeichnung des Datensatzes. Beispiel: 1.0, 2024-Q1', 'open-data-wizard' ) ), + ->set_help_text( __( 'VERSION (owl:versionInfo)', 'open-data-wizard' ) ), Field::make( 'textarea', 'odw_version_notes', __( 'Was hat sich in dieser Version geändert?', 'open-data-wizard' ) ) ->set_rows( 2 ) - ->set_help_text( __( 'VERSIONSHINWEISE (adms:versionNotes)', 'open-data-wizard' ) . "\n\n" . __( 'Kurze Beschreibung der Änderungen gegenüber der Vorversion.', 'open-data-wizard' ) ), + ->set_help_text( __( 'VERSIONSHINWEISE (adms:versionNotes)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_spatial_resolution', __( 'Welche räumliche Auflösung haben die Daten (in Metern)?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', __( 'z. B. 30', 'open-data-wizard' ) ) - ->set_help_text( __( 'RÄUMLICHE AUFLÖSUNG IN METERN (dcat:spatialResolutionInMeters)', 'open-data-wizard' ) . "\n\n" . __( 'Kleinste räumlich auflösbare Distanz in Metern (nur Zahl). Beispiel: 30', 'open-data-wizard' ) ), + ->set_help_text( __( 'RÄUMLICHE AUFLÖSUNG IN METERN (dcat:spatialResolutionInMeters)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_temporal_resolution', __( 'Welche zeitliche Auflösung haben die Daten?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', 'P1D' ) - ->set_help_text( __( 'ZEITLICHE AUFLÖSUNG (dcat:temporalResolution)', 'open-data-wizard' ) . "\n\n" . __( 'Als ISO-8601-Dauer. Beispiel: P1D (täglich), PT1H (stündlich)', 'open-data-wizard' ) ), + ->set_help_text( __( 'ZEITLICHE AUFLÖSUNG (dcat:temporalResolution)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_conforms_to', __( 'Welchem Standard oder Schema entsprechen die Daten?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'url' ) ->set_attribute( 'placeholder', 'https://…' ) - ->set_help_text( __( 'KONFORM ZU (dct:conformsTo)', 'open-data-wizard' ) . "\n\n" . __( 'URI des Standards/Anwendungsprofils, dem die Daten folgen.', 'open-data-wizard' ) ), + ->set_help_text( __( 'KONFORM ZU (dct:conformsTo)', 'open-data-wizard' ) ), Field::make( 'textarea', 'odw_provenance', __( 'Woher stammen die Daten und wie sind sie entstanden?', 'open-data-wizard' ) ) ->set_rows( 2 ) - ->set_help_text( __( 'HERKUNFT (dct:provenance)', 'open-data-wizard' ) . "\n\n" . __( 'Freitext zur Entstehung und Herkunft der Daten.', 'open-data-wizard' ) ), + ->set_help_text( __( 'HERKUNFT (dct:provenance)', 'open-data-wizard' ) ), // Die Überschrift benennt ausdrücklich die primäre Distribution: // Die Felder dieser Sektion sind Singular-Felder und gelten nicht @@ -615,7 +615,7 @@ static function (): string { ), Field::make( 'text', 'odw_dist_title', __( 'Wie heißt die bereitgestellte Datei/Distribution?', 'open-data-wizard' ) ) - ->set_help_text( __( 'TITEL DER DISTRIBUTION (dct:title)', 'open-data-wizard' ) . "\n\n" . __( 'Kurzer Titel der Distribution. Beispiel: Gesamtdaten als CSV', 'open-data-wizard' ) ), + ->set_help_text( __( 'TITEL DER DISTRIBUTION (dct:title)', 'open-data-wizard' ) ), Field::make( 'textarea', 'odw_dist_description', __( 'Wie lässt sich die Distribution beschreiben?', 'open-data-wizard' ) ) ->set_rows( 2 ) @@ -624,14 +624,14 @@ static function (): string { Field::make( 'text', 'odw_download_url', __( 'Direkter Download-Link zur Datei?', 'open-data-wizard' ) ) ->set_attribute( 'type', 'url' ) ->set_attribute( 'placeholder', 'https://beispiel.de/daten/datei.csv' ) - ->set_help_text( __( 'DOWNLOAD-URL (dcat:downloadURL)', 'open-data-wizard' ) . "\n\n" . __( 'Direkte URL zum Herunterladen der Datei (im Gegensatz zur Zugriffs-URL).', 'open-data-wizard' ) ), + ->set_help_text( __( 'DOWNLOAD-URL (dcat:downloadURL)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_media_type', __( 'Welchen Medientyp (MIME) hat die Datei?', 'open-data-wizard' ) ) ->set_attribute( 'placeholder', 'https://www.iana.org/assignments/media-types/text/csv' ) - ->set_help_text( __( 'MEDIENTYP (dcat:mediaType)', 'open-data-wizard' ) . "\n\n" . __( 'IANA-Media-Type als URI. Beispiel: https://www.iana.org/assignments/media-types/text/csv', 'open-data-wizard' ) ), + ->set_help_text( __( 'MEDIENTYP (dcat:mediaType)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_dist_rights', __( 'Welche Nutzungsrechte gelten für die Datei?', 'open-data-wizard' ) ) - ->set_help_text( __( 'RECHTE (dct:rights)', 'open-data-wizard' ) . "\n\n" . __( 'URI oder Freitext zu den Nutzungsrechten der Distribution.', 'open-data-wizard' ) ), + ->set_help_text( __( 'RECHTE (dct:rights)', 'open-data-wizard' ) ), ) ) diff --git a/languages/open-data-wizard-en_US.mo b/languages/open-data-wizard-en_US.mo index 049b578da2a0597d596c4a2ca7feb08e466df93f..8b2caecc89e36d684bef3bc6efbb42bfa8acdc04 100644 GIT binary patch delta 10822 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 diff --git a/languages/open-data-wizard-en_US.po b/languages/open-data-wizard-en_US.po index 65f943ff..c1e4675a 100644 --- a/languages/open-data-wizard-en_US.po +++ b/languages/open-data-wizard-en_US.po @@ -468,9 +468,30 @@ msgstr "Distribution with URL (dcat:accessURL)" msgid "Distribution mit Zugriffs-URL (dcat:accessURL)" msgstr "Distribution with access URL (dcat:accessURL)" +msgid "EIGENE LIZENZ-URI (dct:license)" +msgstr "CUSTOM LICENCE URI (dct:license)" + +msgid "Eigenschaft" +msgstr "Property" + msgid "Eine der sechs EU-Themenkategorien." msgstr "One of the six EU thematic categories." +msgid "HOCHWERTIGER DATENSATZ (dcatap:applicableLegislation)" +msgstr "HIGH-VALUE DATASET (dcatap:applicableLegislation)" + +msgid "KONTAKTPUNKT · E-MAIL (dcat:contactPoint / vcard:hasEmail)" +msgstr "CONTACT POINT · EMAIL (dcat:contactPoint / vcard:hasEmail)" + +msgid "KONTAKTPUNKT · NAME (dcat:contactPoint / vcard:fn)" +msgstr "CONTACT POINT · NAME (dcat:contactPoint / vcard:fn)" + +msgid "KONTAKTPUNKT · WEBSITE (dcat:contactPoint / vcard:hasURL)" +msgstr "CONTACT POINT · WEBSITE (dcat:contactPoint / vcard:hasURL)" + +msgid "Multiplizität" +msgstr "Multiplicity" + msgid "Pflichtfeld für die Veröffentlichung" msgstr "Required for publishing" diff --git a/languages/open-data-wizard.pot b/languages/open-data-wizard.pot index dd501829..9750245d 100644 --- a/languages/open-data-wizard.pot +++ b/languages/open-data-wizard.pot @@ -336,6 +336,12 @@ msgstr "" msgid "EIGENE LIZENZ-URI" msgstr "" +msgid "EIGENE LIZENZ-URI (dct:license)" +msgstr "" + +msgid "Eigenschaft" +msgstr "" + msgid "Ein Demo-Datensatz mit Beispiel-CSV wurde automatisch erstellt. Fügen Sie diesen Shortcode in einen Beitrag oder eine Seite ein, um die Download-Card anzuzeigen:" msgstr "" @@ -444,6 +450,9 @@ msgstr "" msgid "HERAUSGEBENDE ORGANISATION (dct:publisher)" msgstr "" +msgid "HOCHWERTIGER DATENSATZ (dcatap:applicableLegislation)" +msgstr "" + msgid "Harvest-Endpoint" msgstr "" @@ -516,6 +525,15 @@ msgstr "" msgid "Jährlich" msgstr "" +msgid "KONTAKTPUNKT · E-MAIL (dcat:contactPoint / vcard:hasEmail)" +msgstr "" + +msgid "KONTAKTPUNKT · NAME (dcat:contactPoint / vcard:fn)" +msgstr "" + +msgid "KONTAKTPUNKT · WEBSITE (dcat:contactPoint / vcard:hasURL)" +msgstr "" + msgid "Katalog" msgstr "" @@ -624,6 +642,9 @@ msgstr "" msgid "Monatlich" msgstr "" +msgid "Multiplizität" +msgstr "" + msgid "Musterorganisation e.V." msgstr "" diff --git a/open-data-wizard.php b/open-data-wizard.php index 61f08ea4..d375be37 100644 --- a/open-data-wizard.php +++ b/open-data-wizard.php @@ -3,7 +3,7 @@ * Plugin Name: Open Data Wizard * Plugin URI: https://github.com/daimpad/OpenDataWizard * Description: DCAT-AP 3.0 konforme Open Data Metadatenverwaltung für WordPress. Bereitstellung als maschinenlesbarer JSON-LD-Endpoint für offene Daten. - * Version: 2.40.3 + * Version: 2.41.0 * Requires at least: 6.4 * Requires PHP: 8.1 * Author: nozilla @@ -26,7 +26,7 @@ exit; } -define( 'ODW_VERSION', '2.40.3' ); +define( 'ODW_VERSION', '2.41.0' ); define( 'ODW_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'ODW_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'ODW_PLUGIN_FILE', __FILE__ ); diff --git a/package.json b/package.json index ba21d773..53ff439d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-data-wizard", - "version": "2.40.3", + "version": "2.41.0", "description": "WordPress plugin for publishing open data as DCAT-AP 3.0 compliant metadata", "author": "Open Data Wizard Team", "license": "GPL-2.0-or-later", diff --git a/tests/e2e/admin-workflow.spec.js b/tests/e2e/admin-workflow.spec.js index b6136b00..4f821043 100644 --- a/tests/e2e/admin-workflow.spec.js +++ b/tests/e2e/admin-workflow.spec.js @@ -103,6 +103,37 @@ test.describe('Formular', () => { await expect(page.locator(cfField('odw_publisher'))).toHaveValue('Stadt Musterstadt'); }); + test('„Mehr erfahren" zeigt Merkmale, Erklärung und Definition', async ({ page }) => { + await page.goto('/wp-admin/post-new.php?post_type=odw_dataset'); + + // Das Panel hängt am Feld, nicht am Reiter — der Herausgeber steht in Tab 1. + const panel = page.locator('.cf-field', { has: page.locator(cfField('odw_publisher')) }) + .locator('details.odw-field-more'); + await expect(panel).toBeVisible(); + await panel.locator('summary').click(); + + // Zwei Merkmalszeilen über der Definition: Eigenschaft und Multiplizität. + // Beide standen vorher nur mitten im Fließtext. + const facts = panel.locator('.odw-field-more__facts'); + await expect(facts.locator('dt')).toHaveText(['Eigenschaft', 'Multiplizität']); + await expect(facts.locator('dd')).toHaveText(['dct:publisher', '1..1']); + + // Darunter unverändert beide Langtexte. + await expect(panel).toContainText('Einfach erklärt'); + await expect(panel).toContainText('DCAT-AP-Definition'); + }); + + test('das Tooltip trägt nur noch den Fachbegriff', async ({ page }) => { + await page.goto('/wp-admin/post-new.php?post_type=odw_dataset'); + + // Rollentrennung: Im ⓘ steht der DCAT-AP-Begriff, alles Erklärende liegt + // im Panel. Das Beispiel, das früher hier stand, darf nicht zurückkehren. + const tip = page.locator('.cf-field', { has: page.locator(cfField('odw_publisher')) }) + .locator('.odw-help-pop'); + await expect(tip).toContainText('dct:publisher'); + await expect(tip).not.toContainText('Beispiel'); + }); + test('wechselt auf den zweiten Reiter', async ({ page }) => { await page.goto('/wp-admin/post-new.php?post_type=odw_dataset'); diff --git a/tests/test-field-catalog.php b/tests/test-field-catalog.php index 20529132..21ced74a 100644 --- a/tests/test-field-catalog.php +++ b/tests/test-field-catalog.php @@ -210,4 +210,39 @@ public function test_generated_doc_is_in_sync(): void { 'docs/FELD-REFERENZ.md is out of date — run: php bin/generate-field-reference.php' ); } + + /** + * Every entry carries an explicit multiplicity. + * + * Die Angabe steuert seit v2.41.0 die Merkmalsliste im „Mehr erfahren"-Panel. + * Fehlt sie, bleibt die Zeile dort still leer — deshalb hier eine harte Zusage. + */ + public function test_every_entry_has_a_cardinality(): void { + foreach ( $this->catalog as $field ) { + $this->assertMatchesRegularExpression( + '/^[01]\.\.[1n]$/', + (string) ( $field['cardinality'] ?? '' ), + 'Feld ' . $field['key'] . ' hat keine gültige Multiplizität.' + ); + } + } + + /** + * The structured multiplicity agrees with the one stated in the prose. + * + * Beide Angaben stehen im selben Eintrag und werden von Hand gepflegt. Ohne + * diese Prüfung laufen sie auseinander, sobald jemand nur eine der beiden + * anfasst — und das Panel zeigt dann etwas anderes als die Definition darunter. + */ + public function test_cardinality_matches_the_prose(): void { + foreach ( $this->catalog as $field ) { + $matched = preg_match( '/Multiplizität\s+([01]\.\.[1n])/u', (string) $field['desc_dcat'], $m ); + $this->assertSame( 1, $matched, 'Feld ' . $field['key'] . ' nennt keine Multiplizität im Definitionstext.' ); + $this->assertSame( + (string) $field['cardinality'], + $m[1], + 'Feld ' . $field['key'] . ': strukturierte Multiplizität und Definitionstext weichen ab.' + ); + } + } } From fbe683ca16d7adfa9591d61c3d507fb2cad5aa7e Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 10:55:29 +0000 Subject: [PATCH 4/7] feat: Link auf die Spezifikation je Profil-Klasse (U-3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Am Fuß jedes „Mehr erfahren"-Panels steht jetzt „Im Standard nachlesen: Datensatz" bzw. „: Distribution" mit Verweis auf den passenden Abschnitt von DCAT-AP.de 3.0. Auch in der Feld-Referenz als eigene Tabellenzeile. Bewusst je Klasse und nicht je Feld: Die feldgenauen Anker der Spezifikation (etwa #datensatz-herausgeber) ließen sich von hier aus nicht überprüfen, weil dcat-ap.de über den Egress-Proxy nicht erreichbar ist. 53 ungeprüfte Anker hätten geheißen, dass einige ins Leere zeigen; bei den drei Klassen-Ankern führt ein Irrtum schlimmstenfalls an den Anfang des richtigen Dokuments. Damit der Link auf den richtigen Abschnitt zeigt, trägt der Katalog jetzt `entity`: 41 Felder am Datensatz, 12 an der Distribution. Die Zuordnung ist nicht geschätzt, sondern aus odw_build_distribution_node() abgeleitet — dort steht, welche Werte in den Distributions-Knoten wandern. Gegen die Registry-Angaben in config/dcat-ap-fields.php geprüft: null Abweichungen über den eindeutigen Meta-Key. Zwei scheinbare Abweichungen bei dist_title und dist_description waren Artefakte der Gegenprobe selbst: Beide tragen dct:title bzw. dct:description, und über diesen Fallback traf die Prüfung den Datensatz-Eintrag der Registry. Am Builder gegengelesen — beide werden tatsächlich in den Distributions-Knoten geschrieben. Drei neue Unit-Tests: jeder Eintrag hat eine gültige Klasse, jede Klasse löst sich zu einer URL auf der offiziellen Domain auf, und die Liste der Distributions-Felder stimmt mit dem Builder überein. Dazu eine E2E-Zusicherung auf den Link im Panel. 248 Tests grün, PHPCS ohne Befund, i18n und Paketprüfung sauber. https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq --- CHANGELOG.md | 8 ++++ assets/css/admin.css | 12 ++++++ assets/js/odw-admin-fields.js | 14 +++++++ config/field-catalog.php | 53 +++++++++++++++++++++++ docs/FELD-REFERENZ.md | 53 +++++++++++++++++++++++ includes/class-admin.php | 6 +++ includes/class-field-reference.php | 40 +++++++++++++++++- languages/open-data-wizard-en_US.mo | Bin 67632 -> 67694 bytes languages/open-data-wizard-en_US.po | 3 ++ languages/open-data-wizard.pot | 3 ++ tests/e2e/admin-workflow.spec.js | 9 ++++ tests/test-field-catalog.php | 63 ++++++++++++++++++++++++++++ 12 files changed, 263 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c080ab8f..fe8a07a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,14 @@ und die Definition zeigt ihre Struktur. - **`cardinality` als eigenes Feld im Katalog** — für alle 53 Einträge. Zwei neue Tests halten den strukturierten Wert und die Angabe im Definitionstext zusammen; ohne sie laufen beide auseinander, sobald jemand nur eine Seite anfasst. +- **Link auf die Spezifikation je Profil-Klasse.** Am Fuß jedes Panels steht „Im Standard + nachlesen: Datensatz" bzw. „: Distribution" mit Verweis auf den passenden Abschnitt von + DCAT-AP.de 3.0. Bewusst je Klasse und nicht je Feld: Die feldgenauen Anker ließen sich von + hier aus nicht überprüfen — bei den drei Klassen-Ankern führt ein Irrtum schlimmstenfalls an + den Anfang des richtigen Dokuments. Die Zuordnung der 12 Distributions-Felder stammt aus + `odw_build_distribution_node()` und wird von einem Test dagegen gehalten. +- **`entity` als eigenes Feld im Katalog** — 41 Datensatz-, 12 Distributions-Felder, + gegengeprüft gegen die Registry. ### 🎨 Changed - **Tooltip und „Mehr erfahren" haben getrennte Rollen.** Das ⓘ trägt nur noch den DCAT-AP-Begriff, diff --git a/assets/css/admin.css b/assets/css/admin.css index a66b60cf..9e83bc89 100644 --- a/assets/css/admin.css +++ b/assets/css/admin.css @@ -1066,6 +1066,18 @@ input.odw-cessda-input, color: var(--odw-color-text, #1d2327); } +.odw-field-more__spec { + display: inline-block; + margin-top: 2px; + color: var( --odw-color-primary, #2271b1 ); + text-decoration: none; +} + +.odw-field-more__spec:hover, +.odw-field-more__spec:focus-visible { + text-decoration: underline; +} + .odw-field-more__block { margin: 0 0 8px; line-height: 1.5; diff --git a/assets/js/odw-admin-fields.js b/assets/js/odw-admin-fields.js index 4957bbd1..22d288a8 100644 --- a/assets/js/odw-admin-fields.js +++ b/assets/js/odw-admin-fields.js @@ -643,6 +643,20 @@ if ( f.desc_dcat ) { body.appendChild( moreBlock( cfg.dcat, f.desc_dcat ) ); } + if ( f.spec_url ) { + // Ein Link je Profil-Klasse, nicht je Feld: Die feldgenauen Anker + // der Spezifikation ließen sich nicht überprüfen — hier landet man + // im schlimmsten Fall am Anfang des richtigen Dokuments. + var names = cfg.ent || {}; + var link = document.createElement( 'a' ); + link.className = 'odw-field-more__spec'; + link.href = f.spec_url; + link.target = '_blank'; + link.rel = 'noopener noreferrer'; + link.textContent = ( cfg.spec || 'Im Standard nachlesen' ) + + ( names[ f.entity ] ? ': ' + names[ f.entity ] : '' ) + ' ↗'; + body.appendChild( link ); + } details.appendChild( body ); field.appendChild( details ); } ); diff --git a/config/field-catalog.php b/config/field-catalog.php index f7c8559e..0db9523c 100644 --- a/config/field-catalog.php +++ b/config/field-catalog.php @@ -42,6 +42,7 @@ 'meta_key' => '_odw_publisher', 'dcat_prop' => 'dct:publisher', 'cardinality' => '1..1', + 'entity' => 'dataset', 'tab' => '1 — Grundlegende Informationen', 'tier' => 'mandatory', 'vocab' => '', @@ -55,6 +56,7 @@ 'meta_key' => '_odw_theme', 'dcat_prop' => 'dcat:theme', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '1 — Grundlegende Informationen', 'tier' => 'recommended', 'vocab' => 'data-theme', @@ -68,6 +70,7 @@ 'meta_key' => '_odw_keywords', 'dcat_prop' => 'dcat:keyword', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '1 — Grundlegende Informationen', 'tier' => 'recommended', 'vocab' => '', @@ -81,6 +84,7 @@ 'meta_key' => '_odw_cessda_topic', 'dcat_prop' => 'dct:subject', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '1 — Grundlegende Informationen', 'tier' => 'optional', 'vocab' => 'cessda', @@ -94,6 +98,7 @@ 'meta_key' => '_odw_engagementfeld', 'dcat_prop' => 'dct:subject', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '1 — Grundlegende Informationen', 'tier' => 'optional', 'vocab' => 'engagementfeld', @@ -107,6 +112,7 @@ 'meta_key' => '_odw_description', 'dcat_prop' => 'dct:description', 'cardinality' => '1..n', + 'entity' => 'dataset', 'tab' => '1 — Grundlegende Informationen', 'tier' => 'mandatory', 'vocab' => '', @@ -125,6 +131,7 @@ 'meta_key' => '_odw_language', 'dcat_prop' => 'dct:language', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '2 — Sprache & Übersetzungen', 'tier' => 'recommended', 'vocab' => 'language', @@ -143,6 +150,7 @@ 'meta_key' => '_odw_access_url', 'dcat_prop' => 'dcat:accessURL', 'cardinality' => '1..n', + 'entity' => 'distribution', 'tab' => '3 — Datenbereitstellung', 'tier' => 'mandatory', 'vocab' => '', @@ -156,6 +164,7 @@ 'meta_key' => '_odw_format', 'dcat_prop' => 'dct:format', 'cardinality' => '0..1', + 'entity' => 'distribution', 'tab' => '3 — Datenbereitstellung', 'tier' => 'recommended', 'vocab' => 'file-type', @@ -169,6 +178,7 @@ 'meta_key' => '_odw_byte_size', 'dcat_prop' => 'dcat:byteSize', 'cardinality' => '0..1', + 'entity' => 'distribution', 'tab' => '3 — Datenbereitstellung', 'tier' => 'optional', 'vocab' => '', @@ -182,6 +192,7 @@ 'meta_key' => '_odw_license', 'dcat_prop' => 'dct:license', 'cardinality' => '0..1', + 'entity' => 'distribution', 'tab' => '3 — Datenbereitstellung', 'tier' => 'mandatory', 'vocab' => 'licenses', @@ -195,6 +206,7 @@ 'meta_key' => '_odw_license_custom', 'dcat_prop' => 'dct:license', 'cardinality' => '0..1', + 'entity' => 'distribution', 'tab' => '3 — Datenbereitstellung', 'tier' => 'conditional', 'vocab' => 'licenses', @@ -208,6 +220,7 @@ 'meta_key' => '_odw_attribution_text', 'dcat_prop' => 'dcatde:licenseAttributionByText', 'cardinality' => '0..1', + 'entity' => 'distribution', 'tab' => '3 — Datenbereitstellung', 'tier' => 'optional', 'vocab' => '', @@ -221,6 +234,7 @@ 'meta_key' => '_odw_availability', 'dcat_prop' => 'dcatap:availability', 'cardinality' => '0..1', + 'entity' => 'distribution', 'tab' => '3 — Datenbereitstellung', 'tier' => 'optional', 'vocab' => 'planned-availability', @@ -239,6 +253,7 @@ 'meta_key' => '_odw_landing_page', 'dcat_prop' => 'dcat:landingPage', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -252,6 +267,7 @@ 'meta_key' => '_odw_issued', 'dcat_prop' => 'dct:issued', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'recommended', 'vocab' => '', @@ -265,6 +281,7 @@ 'meta_key' => '_odw_modified', 'dcat_prop' => 'dct:modified', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'recommended', 'vocab' => '', @@ -283,6 +300,7 @@ 'meta_key' => '_odw_accrual_periodicity', 'dcat_prop' => 'dct:accrualPeriodicity', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => 'frequency', @@ -296,6 +314,7 @@ 'meta_key' => '_odw_political_geocoding_level', 'dcat_prop' => 'dcatde:politicalGeocodingLevelURI', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => 'politicalGeocodingLevel', @@ -309,6 +328,7 @@ 'meta_key' => '_odw_political_geocoding_uri', 'dcat_prop' => 'dcatde:politicalGeocodingURI', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -322,6 +342,7 @@ 'meta_key' => '_odw_geocoding_description', 'dcat_prop' => 'dcatde:geocodingDescription', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -335,6 +356,7 @@ 'meta_key' => '_odw_spatial', 'dcat_prop' => 'dct:spatial', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -348,6 +370,7 @@ 'meta_key' => '_odw_temporal_start', 'dcat_prop' => 'dct:temporal', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -361,6 +384,7 @@ 'meta_key' => '_odw_temporal_end', 'dcat_prop' => 'dct:temporal', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -374,6 +398,7 @@ 'meta_key' => '_odw_contact_name', 'dcat_prop' => 'dcat:contactPoint', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -387,6 +412,7 @@ 'meta_key' => '_odw_contact_email', 'dcat_prop' => 'dcat:contactPoint', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -400,6 +426,7 @@ 'meta_key' => '_odw_contact_url', 'dcat_prop' => 'dcat:contactPoint', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -413,6 +440,7 @@ 'meta_key' => '_odw_contributor_id', 'dcat_prop' => 'dcatde:contributorID', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => 'contributors', @@ -426,6 +454,7 @@ 'meta_key' => '_odw_originator_name', 'dcat_prop' => 'dcatde:originator', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -439,6 +468,7 @@ 'meta_key' => '_odw_originator_email', 'dcat_prop' => 'dcatde:originator', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -452,6 +482,7 @@ 'meta_key' => '_odw_maintainer_name', 'dcat_prop' => 'dcatde:maintainer', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -465,6 +496,7 @@ 'meta_key' => '_odw_maintainer_email', 'dcat_prop' => 'dcatde:maintainer', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -478,6 +510,7 @@ 'meta_key' => '_odw_legal_basis', 'dcat_prop' => 'dcatde:legalBasis', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -491,6 +524,7 @@ 'meta_key' => '_odw_quality_process_uri', 'dcat_prop' => 'dcatde:qualityProcessURI', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -504,6 +538,7 @@ 'meta_key' => '_odw_access_rights', 'dcat_prop' => 'dct:accessRights', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => 'access-right', @@ -517,6 +552,7 @@ 'meta_key' => '_odw_theme_uri', 'dcat_prop' => 'dcat:theme', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => 'data-theme', @@ -530,6 +566,7 @@ 'meta_key' => '_odw_is_hvd', 'dcat_prop' => 'dcatap:applicableLegislation', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -543,6 +580,7 @@ 'meta_key' => '_odw_hvd_category', 'dcat_prop' => 'dcatap:hvdCategory', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => 'hvd-category', @@ -556,6 +594,7 @@ 'meta_key' => '_odw_identifier', 'dcat_prop' => 'dct:identifier', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -569,6 +608,7 @@ 'meta_key' => '_odw_type', 'dcat_prop' => 'dct:type', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => 'dataset-type', @@ -582,6 +622,7 @@ 'meta_key' => '_odw_creator_name', 'dcat_prop' => 'dct:creator', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -595,6 +636,7 @@ 'meta_key' => '_odw_creator_email', 'dcat_prop' => 'dct:creator', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -608,6 +650,7 @@ 'meta_key' => '_odw_version', 'dcat_prop' => 'owl:versionInfo', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -621,6 +664,7 @@ 'meta_key' => '_odw_version_notes', 'dcat_prop' => 'adms:versionNotes', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -634,6 +678,7 @@ 'meta_key' => '_odw_spatial_resolution', 'dcat_prop' => 'dcat:spatialResolutionInMeters', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -647,6 +692,7 @@ 'meta_key' => '_odw_temporal_resolution', 'dcat_prop' => 'dcat:temporalResolution', 'cardinality' => '0..1', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -660,6 +706,7 @@ 'meta_key' => '_odw_conforms_to', 'dcat_prop' => 'dct:conformsTo', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -673,6 +720,7 @@ 'meta_key' => '_odw_provenance', 'dcat_prop' => 'dct:provenance', 'cardinality' => '0..n', + 'entity' => 'dataset', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -686,6 +734,7 @@ 'meta_key' => '_odw_dist_title', 'dcat_prop' => 'dct:title', 'cardinality' => '0..n', + 'entity' => 'distribution', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -699,6 +748,7 @@ 'meta_key' => '_odw_dist_description', 'dcat_prop' => 'dct:description', 'cardinality' => '0..n', + 'entity' => 'distribution', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -712,6 +762,7 @@ 'meta_key' => '_odw_download_url', 'dcat_prop' => 'dcat:downloadURL', 'cardinality' => '0..n', + 'entity' => 'distribution', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', @@ -725,6 +776,7 @@ 'meta_key' => '_odw_media_type', 'dcat_prop' => 'dcat:mediaType', 'cardinality' => '0..1', + 'entity' => 'distribution', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => 'iana-media-type', @@ -738,6 +790,7 @@ 'meta_key' => '_odw_dist_rights', 'dcat_prop' => 'dct:rights', 'cardinality' => '0..1', + 'entity' => 'distribution', 'tab' => '4 — Erweiterte Angaben', 'tier' => 'optional', 'vocab' => '', diff --git a/docs/FELD-REFERENZ.md b/docs/FELD-REFERENZ.md index a4dfedc7..5641dae0 100644 --- a/docs/FELD-REFERENZ.md +++ b/docs/FELD-REFERENZ.md @@ -85,6 +85,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:publisher` | | Meta-Key | `_odw_publisher` | | Multiplizität | `1..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Pflicht | | Vokabular | — | @@ -103,6 +104,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:theme` | | Meta-Key | `_odw_theme` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Empfohlen | | Vokabular | `data-theme` | @@ -121,6 +123,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:keyword` | | Meta-Key | `_odw_keywords` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Empfohlen | | Vokabular | — | @@ -139,6 +142,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:subject` | | Meta-Key | `_odw_cessda_topic` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `cessda` | @@ -157,6 +161,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:subject` | | Meta-Key | `_odw_engagementfeld` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `engagementfeld` | @@ -175,6 +180,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:description` | | Meta-Key | `_odw_description` | | Multiplizität | `1..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Pflicht | | Vokabular | — | @@ -197,6 +203,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:language` | | Meta-Key | `_odw_language` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Empfohlen | | Vokabular | `language` | @@ -219,6 +226,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:accessURL` | | Meta-Key | `_odw_access_url` | | Multiplizität | `1..n` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Pflicht | | Vokabular | — | @@ -237,6 +245,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:format` | | Meta-Key | `_odw_format` | | Multiplizität | `0..1` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Empfohlen | | Vokabular | `file-type` | @@ -255,6 +264,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:byteSize` | | Meta-Key | `_odw_byte_size` | | Multiplizität | `0..1` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Optional | | Vokabular | — | @@ -273,6 +283,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:license` | | Meta-Key | `_odw_license` | | Multiplizität | `0..1` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Pflicht | | Vokabular | `licenses` | @@ -291,6 +302,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:license` | | Meta-Key | `_odw_license_custom` | | Multiplizität | `0..1` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Bedingt | | Vokabular | `licenses` | @@ -309,6 +321,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:licenseAttributionByText` | | Meta-Key | `_odw_attribution_text` | | Multiplizität | `0..1` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Optional | | Vokabular | — | @@ -327,6 +340,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatap:availability` | | Meta-Key | `_odw_availability` | | Multiplizität | `0..1` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Optional | | Vokabular | `planned-availability` | @@ -349,6 +363,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:landingPage` | | Meta-Key | `_odw_landing_page` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -367,6 +382,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:issued` | | Meta-Key | `_odw_issued` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Empfohlen | | Vokabular | — | @@ -385,6 +401,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:modified` | | Meta-Key | `_odw_modified` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Empfohlen | | Vokabular | — | @@ -403,6 +420,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:accrualPeriodicity` | | Meta-Key | `_odw_accrual_periodicity` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `frequency` | @@ -421,6 +439,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:politicalGeocodingLevelURI` | | Meta-Key | `_odw_political_geocoding_level` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `politicalGeocodingLevel` | @@ -439,6 +458,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:politicalGeocodingURI` | | Meta-Key | `_odw_political_geocoding_uri` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -457,6 +477,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:geocodingDescription` | | Meta-Key | `_odw_geocoding_description` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -475,6 +496,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:spatial` | | Meta-Key | `_odw_spatial` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -493,6 +515,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:temporal` | | Meta-Key | `_odw_temporal_start` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -511,6 +534,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:temporal` | | Meta-Key | `_odw_temporal_end` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -529,6 +553,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:contactPoint` | | Meta-Key | `_odw_contact_name` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -547,6 +572,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:contactPoint` | | Meta-Key | `_odw_contact_email` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -565,6 +591,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:contactPoint` | | Meta-Key | `_odw_contact_url` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -583,6 +610,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:contributorID` | | Meta-Key | `_odw_contributor_id` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `contributors` | @@ -601,6 +629,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:originator` | | Meta-Key | `_odw_originator_name` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -619,6 +648,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:originator` | | Meta-Key | `_odw_originator_email` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -637,6 +667,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:maintainer` | | Meta-Key | `_odw_maintainer_name` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -655,6 +686,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:maintainer` | | Meta-Key | `_odw_maintainer_email` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -673,6 +705,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:legalBasis` | | Meta-Key | `_odw_legal_basis` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -691,6 +724,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatde:qualityProcessURI` | | Meta-Key | `_odw_quality_process_uri` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -709,6 +743,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:accessRights` | | Meta-Key | `_odw_access_rights` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `access-right` | @@ -727,6 +762,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:theme` | | Meta-Key | `_odw_theme_uri` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `data-theme` | @@ -745,6 +781,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatap:applicableLegislation` | | Meta-Key | `_odw_is_hvd` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -763,6 +800,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcatap:hvdCategory` | | Meta-Key | `_odw_hvd_category` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `hvd-category` | @@ -781,6 +819,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:identifier` | | Meta-Key | `_odw_identifier` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -799,6 +838,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:type` | | Meta-Key | `_odw_type` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | `dataset-type` | @@ -817,6 +857,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:creator` | | Meta-Key | `_odw_creator_name` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -835,6 +876,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:creator` | | Meta-Key | `_odw_creator_email` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -853,6 +895,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `owl:versionInfo` | | Meta-Key | `_odw_version` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -871,6 +914,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `adms:versionNotes` | | Meta-Key | `_odw_version_notes` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -889,6 +933,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:spatialResolutionInMeters` | | Meta-Key | `_odw_spatial_resolution` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -907,6 +952,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:temporalResolution` | | Meta-Key | `_odw_temporal_resolution` | | Multiplizität | `0..1` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -925,6 +971,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:conformsTo` | | Meta-Key | `_odw_conforms_to` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -943,6 +990,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:provenance` | | Meta-Key | `_odw_provenance` | | Multiplizität | `0..n` | +| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | | Stufe | Optional | | Vokabular | — | @@ -961,6 +1009,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:title` | | Meta-Key | `_odw_dist_title` | | Multiplizität | `0..n` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Optional | | Vokabular | — | @@ -979,6 +1028,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:description` | | Meta-Key | `_odw_dist_description` | | Multiplizität | `0..n` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Optional | | Vokabular | — | @@ -997,6 +1047,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:downloadURL` | | Meta-Key | `_odw_download_url` | | Multiplizität | `0..n` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Optional | | Vokabular | — | @@ -1015,6 +1066,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dcat:mediaType` | | Meta-Key | `_odw_media_type` | | Multiplizität | `0..1` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Optional | | Vokabular | `iana-media-type` | @@ -1033,6 +1085,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld | DCAT-Property | `dct:rights` | | Meta-Key | `_odw_dist_rights` | | Multiplizität | `0..1` | +| Profil-Klasse | [Distribution](https://www.dcat-ap.de/def/dcatde/3.0/spec/#distribution) | | Stufe | Optional | | Vokabular | — | diff --git a/includes/class-admin.php b/includes/class-admin.php index 0eaf79f4..3c3cbf1a 100644 --- a/includes/class-admin.php +++ b/includes/class-admin.php @@ -448,6 +448,12 @@ public static function enqueue_assets( string $hook ): void { 'plain' => __( 'Einfach erklärt', 'open-data-wizard' ), 'prop' => __( 'Eigenschaft', 'open-data-wizard' ), 'mult' => __( 'Multiplizität', 'open-data-wizard' ), + 'spec' => __( 'Im Standard nachlesen', 'open-data-wizard' ), + 'ent' => array( + 'dataset' => __( 'Datensatz', 'open-data-wizard' ), + 'distribution' => __( 'Distribution', 'open-data-wizard' ), + 'catalog' => __( 'Katalog', 'open-data-wizard' ), + ), ), ) ); diff --git a/includes/class-field-reference.php b/includes/class-field-reference.php index 50c19a5c..c9b89a97 100644 --- a/includes/class-field-reference.php +++ b/includes/class-field-reference.php @@ -43,6 +43,38 @@ class ODW_Field_Reference { 'conditional' => 'Bedingt', ); + /** + * Abschnitt der DCAT-AP.de-Spezifikation je Profil-Klasse. + * + * Bewusst grobkörnig — ein Link je Klasse statt je Feld. Die feldgenauen + * Anker (etwa `#datensatz-herausgeber`) ließen sich hier nicht überprüfen, + * weil dcat-ap.de aus der Entwicklungsumgebung nicht erreichbar ist; ein + * falscher Anker führte zu 53 Links, von denen einige ins Leere zeigen. + * Bei den drei Klassen-Ankern ist der Schaden im Fehlerfall null: Der + * Browser landet dann am Seitenanfang, also weiterhin im richtigen Dokument. + * + * @var array + */ + private const SPEC_ANCHORS = array( + 'dataset' => 'datensatz', + 'distribution' => 'distribution', + 'catalog' => 'katalog', + ); + + /** Basis-URL der Spezifikation. */ + private const SPEC_BASE = 'https://www.dcat-ap.de/def/dcatde/3.0/spec/'; + + /** + * Returns the spec section URL for a profile class, or '' when unknown. + * + * @param string $entity Profile class ('dataset', 'distribution', 'catalog'). + * @return string + */ + public static function spec_url( string $entity ): string { + $anchor = self::SPEC_ANCHORS[ $entity ] ?? ''; + return '' !== $anchor ? self::SPEC_BASE . '#' . $anchor : ''; + } + /** * Loads the field catalog array. * @@ -65,7 +97,7 @@ public static function load_catalog(): array { * (to locate the DOM field), the two long descriptions und die beiden * Merkmale, die das Panel als Kurzangabe über der Definition zeigt. * - * @return array + * @return array */ public static function js_map(): array { $map = array(); @@ -74,6 +106,8 @@ public static function js_map(): array { 'meta_key' => (string) $field['meta_key'], 'dcat_prop' => (string) ( $field['dcat_prop'] ?? '' ), 'cardinality' => (string) ( $field['cardinality'] ?? '' ), + 'entity' => (string) ( $field['entity'] ?? '' ), + 'spec_url' => self::spec_url( (string) ( $field['entity'] ?? '' ) ), 'desc_dcat' => (string) $field['desc_dcat'], 'desc_human' => (string) $field['desc_human'], ); @@ -141,6 +175,10 @@ public static function build(): string { $out[] = '| DCAT-Property | `' . $field['dcat_prop'] . '` |'; $out[] = '| Meta-Key | `' . ( '' !== $field['meta_key'] ? $field['meta_key'] : '—' ) . '` |'; $out[] = '| Multiplizität | `' . ( '' !== ( $field['cardinality'] ?? '' ) ? $field['cardinality'] : '—' ) . '` |'; + $spec = self::spec_url( (string) ( $field['entity'] ?? '' ) ); + $out[] = '| Profil-Klasse | ' . ( '' !== $spec + ? '[' . ( 'distribution' === $field['entity'] ? 'Distribution' : 'Datensatz' ) . '](' . $spec . ') |' + : '— |' ); $out[] = '| Stufe | ' . $tier . ' |'; $out[] = '| Vokabular | ' . $vocab . ' |'; $out[] = ''; diff --git a/languages/open-data-wizard-en_US.mo b/languages/open-data-wizard-en_US.mo index 8b2caecc89e36d684bef3bc6efbb42bfa8acdc04..8c8526b7bdffdd0e5d9e5a003958899c37d75cc0 100644 GIT binary patch delta 10380 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 { // Darunter unverändert beide Langtexte. await expect(panel).toContainText('Einfach erklärt'); await expect(panel).toContainText('DCAT-AP-Definition'); + + // Und ein Link auf den Abschnitt der Spezifikation, der zu dieser + // Profil-Klasse gehört — der Herausgeber steht am Datensatz. + const spec = panel.locator('a.odw-field-more__spec'); + await expect(spec).toHaveAttribute( + 'href', + 'https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz' + ); + await expect(spec).toContainText('Datensatz'); }); test('das Tooltip trägt nur noch den Fachbegriff', async ({ page }) => { diff --git a/tests/test-field-catalog.php b/tests/test-field-catalog.php index 21ced74a..457ca43a 100644 --- a/tests/test-field-catalog.php +++ b/tests/test-field-catalog.php @@ -245,4 +245,67 @@ public function test_cardinality_matches_the_prose(): void { ); } } + + /** + * Every entry names the profile class it belongs to. + * + * Die Klasse steuert den Link auf den passenden Abschnitt der + * DCAT-AP.de-Spezifikation. Fehlt sie, verschwindet der Link stillschweigend. + */ + public function test_every_entry_has_an_entity(): void { + foreach ( $this->catalog as $field ) { + $this->assertContains( + (string) ( $field['entity'] ?? '' ), + array( 'dataset', 'distribution', 'catalog' ), + 'Feld ' . $field['key'] . ' hat keine gültige Profil-Klasse.' + ); + } + } + + /** + * Each entity resolves to a spec URL on the official domain. + */ + public function test_entity_resolves_to_a_spec_url(): void { + foreach ( $this->catalog as $field ) { + $url = ODW_Field_Reference::spec_url( (string) $field['entity'] ); + $this->assertStringStartsWith( + 'https://www.dcat-ap.de/def/dcatde/3.0/spec/#', + $url, + 'Feld ' . $field['key'] . ' liefert keine Spezifikations-URL.' + ); + } + } + + /** + * Distribution-level fields are exactly those the distribution node builds. + * + * Die Zuordnung stammt aus odw_build_distribution_node(); läuft sie + * auseinander, verweist der Link auf den falschen Abschnitt. + */ + public function test_distribution_fields_match_the_builder(): void { + $erwartet = array( + 'access_url', + 'attribution_text', + 'availability', + 'byte_size', + 'dist_description', + 'dist_rights', + 'dist_title', + 'download_url', + 'format', + 'license', + 'license_custom', + 'media_type', + ); + + $tatsaechlich = array(); + foreach ( $this->catalog as $field ) { + if ( 'distribution' === ( $field['entity'] ?? '' ) ) { + $tatsaechlich[] = (string) $field['key']; + } + } + sort( $tatsaechlich ); + + $this->assertSame( $erwartet, $tatsaechlich ); + } } From 58130b5441f613d8ae304520b2df819cb36741b5 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 11:06:12 +0000 Subject: [PATCH 5/7] feat: dcat:theme als Mehrfachauswahl, mit Migration (U-4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Das Auswahlfeld in Tab 1 und das Tipp-Feld unter „Erweiterte Angaben" sind durch ein Mehrfachfeld mit den EU-Themen ersetzt. dcat:theme erlaubt laut Profil 0..n Themen; vorher waren es höchstens zwei, auf zwei verschiedene Arten zu bedienen. Der Umbau war größer als mein Kostenvoranschlag: Carbon Fields legt Mehrfachwerte nicht unter `_odw_theme` ab, sondern unter `_odw_theme|||N|value`. Damit hätten zwei Stellen still ihre Funktion verloren, die die Datenbank direkt abfragen: - der Themenfilter des Katalogs (?theme=…) über eine meta_query, und - die Sortierung der Listenspalte über meta_key/meta_value. Beides läuft jetzt über eine flache Spiegelung, die bei jedem Speichern mitgeschrieben wird: `_odw_theme_index` mit einer Zeile je Thema für den Filter, `_odw_theme_sort` mit dem Label des ersten Themas für die Sortierung. Der bestehende E2E-Test auf ?theme=Bildung prüft den Filter mit. Eine einmalige Migration überführt bestehende Datensätze beim ersten Aufruf des Backends: alter Einzelwert plus das frühere Zusatzfeld werden zusammengeführt, über carbon_set_post_meta() geschrieben und die alten flachen Zeilen entfernt. Bewusst über die öffentliche API und nicht über selbstgebaute Schlüssel — das Format ist ein Interna von Carbon Fields. Ein Normalisierer trägt die Last: normalize_themes() nimmt Array, einzelnen String und die deutschen Kurzlabels der Auswahlliste vor v2.5.0 („Bildung"), löst alles zu EU-URIs auf und entdoppelt. Sieben Fälle als Datenprovider abgesichert — darunter, dass „Bildung" und „Kultur" beide auf EDUC zeigen und nur einmal erscheinen. Mit angepasst: JSON-LD-Builder, Qualitätsprüfung, Listenspalte, Shortcode, Batch-Import (nimmt jetzt mehrere Themen an), Demo-Datensatz, E2E-Saat, SHACL-Fixtures und der Feld-Katalog (theme_uri entfällt, 52 statt 53 Felder). Zwei bestehende Tests haben den Umbau erwischt und mussten mitziehen: Der Abdeckungstest kannte den Feldtyp „multiselect" nicht, und das Terminologie-Glossar verlangte „Thema" im Singular. Beide prüfen jetzt das Richtige, statt das Alte. 255 Tests grün, PHPCS ohne Befund, i18n und Paketprüfung sauber. https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq --- CHANGELOG.md | 16 +++ config/field-catalog.php | 18 +-- docs/FELD-REFERENZ.md | 28 +---- includes/class-admin.php | 6 +- includes/class-batch-import.php | 26 ++++- includes/class-fields.php | 156 +++++++++++++++++++++----- includes/class-quality.php | 2 +- includes/class-rest-api.php | 2 +- includes/class-setup.php | 59 +++++++++- includes/class-shortcode.php | 6 +- languages/open-data-wizard-en_US.mo | Bin 67694 -> 67800 bytes languages/open-data-wizard-en_US.po | 3 + languages/open-data-wizard.pot | 3 + tests/e2e/admin-workflow.spec.js | 13 +++ tests/e2e/mu-plugins/odw-e2e-seed.php | 20 +++- tests/shacl/generate-fixtures.php | 7 +- tests/test-field-catalog.php | 10 +- tests/test-fields-extended.php | 18 ++- tests/test-fields.php | 45 ++++++++ 19 files changed, 337 insertions(+), 101 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe8a07a2..7f23e0ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,12 @@ und die Definition zeigt ihre Struktur. - **`entity` als eigenes Feld im Katalog** — 41 Datensatz-, 12 Distributions-Felder, gegengeprüft gegen die Registry. +### ✨ Added (Fortsetzung) +- **Thema ist eine Mehrfachauswahl.** `dcat:theme` erlaubt laut Profil 0..n Themen; das Formular + bot ein Auswahlfeld in Tab 1 und ein Tipp-Feld unter „Erweiterte Angaben" — zusammen höchstens + zwei, auf zwei verschiedene Arten. Beide sind durch ein Mehrfachfeld mit den EU-Themen ersetzt. + Der Batch-Import nimmt jetzt ebenfalls mehrere Themen an (Komma- oder Zeilentrennung). + ### 🎨 Changed - **Tooltip und „Mehr erfahren" haben getrennte Rollen.** Das ⓘ trägt nur noch den DCAT-AP-Begriff, alles Erklärende steht im Panel. Vorher stand beides an beiden Orten — beim Herausgeber sogar @@ -42,6 +48,16 @@ und die Definition zeigt ihre Struktur. falsche Form. ### 🐛 Fixed +- **Migration der Themen, damit nichts verlorengeht.** Carbon Fields legt Mehrfachwerte unter + eigenen Meta-Keys ab (`_odw_theme|||0|value`), die alten flachen Zeilen wären unsichtbar + geworden. Eine einmalige Umschreibung überführt beim ersten Aufruf des Backends alle + Datensätze — über `carbon_set_post_meta()`, nicht über selbstgebaute Schlüssel, weil deren + Format ein Interna der Bibliothek ist. +- **Themenfilter und Sortierung wären still kaputtgegangen.** Beide fragten die Datenbank auf + `_odw_theme` ab und hätten Mehrfachwerte nicht mehr gefunden. Das Plugin schreibt die Auswahl + deshalb zusätzlich flach: `_odw_theme_index` (eine Zeile je Thema) für den Katalogfilter, + `_odw_theme_sort` für die Spaltensortierung. Der bestehende E2E-Test auf `?theme=Bildung` + prüft das mit. - **`bin/check-i18n.py` übersah `config/`.** `mqa-metrics.php` und `dcat-ap-fields.php` führen ihre Beschriftungen über `__()`, standen aber nicht in der Dateiliste der Prüfung — für 31 Zeichenketten hätte eine fehlende Übersetzung also nie jemand gemeldet. Aufgefallen ist es, diff --git a/config/field-catalog.php b/config/field-catalog.php index 0db9523c..953309a3 100644 --- a/config/field-catalog.php +++ b/config/field-catalog.php @@ -61,9 +61,9 @@ 'tier' => 'recommended', 'vocab' => 'data-theme', 'q_dcat' => 'Welchem `dcat:theme` (Datenthema) ist der Datensatz zugeordnet?', - 'q_human' => 'Welchem Thema ist dieser Datensatz zugeordnet?', + 'q_human' => 'Welchen Themen ist dieser Datensatz zugeordnet?', 'desc_dcat' => '`dcat:theme` ordnet den Datensatz einer oder mehreren Kategorien zu. In DCAT-AP wird das kontrollierte EU-Vokabular „Data Theme" (`http://publications.europa.eu/resource/authority/data-theme/`) verwendet, z. B. `ENVI` (Umwelt) oder `EDUC` (Bildung). Multiplizität 0..n.', - 'desc_human' => 'Wählen Sie das Themengebiet, zu dem die Daten am besten passen — ähnlich einer Schublade, in die der Datensatz einsortiert wird. Das hilft anderen, Ihre Daten über Themenfilter zu finden. Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur.', + 'desc_human' => 'Wählen Sie ein oder mehrere Themengebiete, zu denen die Daten passen — ähnlich einer Schublade, in die der Datensatz einsortiert wird. Das hilft anderen, Ihre Daten über Themenfilter zu finden. Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur.', ), array( 'key' => 'keywords', @@ -547,20 +547,6 @@ 'desc_dcat' => '`dct:accessRights` klassifiziert den Zugriffsstatus über das EU-Vokabular „Access Right" (`PUBLIC`, `RESTRICTED`, `NON_PUBLIC`). Multiplizität 0..1. Relevant für die MQA-Dimension Wiederverwendbarkeit.', 'desc_human' => 'Geben Sie an, ob die Daten für alle offen (öffentlich), nur eingeschränkt oder gar nicht öffentlich zugänglich sind. Für offene Daten ist das in der Regel „öffentlich". Beispiel: Öffentlich. „Öffentlich" ist bereits vorausgewählt — ändern Sie die Angabe nur, wenn der Zugriff eingeschränkt oder gar nicht öffentlich ist.', ), - array( - 'key' => 'theme_uri', - 'meta_key' => '_odw_theme_uri', - 'dcat_prop' => 'dcat:theme', - 'cardinality' => '0..n', - 'entity' => 'dataset', - 'tab' => '4 — Erweiterte Angaben', - 'tier' => 'optional', - 'vocab' => 'data-theme', - 'q_dcat' => 'Welches zusätzliche `dcat:theme` (EU-Themen-URI) gilt für den Datensatz?', - 'q_human' => 'Welches weitere EU-Thema möchten Sie ergänzen?', - 'desc_dcat' => 'Zusätzliches `dcat:theme` als direkte EU-Themen-URI (`http://publications.europa.eu/resource/authority/data-theme/…`). Ergänzt die Themen-Auswahl aus Tab 1 um weitere Themen. Multiplizität 0..n.', - 'desc_human' => 'Falls Ihr Datensatz zu mehr als einem Thema passt, ergänzen Sie hier ein weiteres EU-Thema aus der Vorschlagsliste. Das erhöht die Auffindbarkeit über mehrere Themenfilter. Beispiel: Umwelt zusätzlich zu Gesundheit.', - ), array( 'key' => 'is_hvd', 'meta_key' => '_odw_is_hvd', diff --git a/docs/FELD-REFERENZ.md b/docs/FELD-REFERENZ.md index 5641dae0..f10b18bd 100644 --- a/docs/FELD-REFERENZ.md +++ b/docs/FELD-REFERENZ.md @@ -18,7 +18,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld - **1 — Grundlegende Informationen** - [Wer gibt diese Daten heraus?](#wer-gibt-diese-daten-heraus) - - [Welchem Thema ist dieser Datensatz zugeordnet?](#welchem-thema-ist-dieser-datensatz-zugeordnet) + - [Welchen Themen ist dieser Datensatz zugeordnet?](#welchen-themen-ist-dieser-datensatz-zugeordnet) - [Mit welchen Schlagworten finde ich diese Daten?](#mit-welchen-schlagworten-finde-ich-diese-daten) - [Welchem Themenfeld nach CESSDA ordnen Sie den Datensatz zu?](#welchem-themenfeld-nach-cessda-ordnen-sie-den-datensatz-zu) - [Welchem Engagementfeld ist dieser Datensatz zuzuordnen?](#welchem-engagementfeld-ist-dieser-datensatz-zuzuordnen) @@ -55,7 +55,6 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld - [Auf welcher rechtlichen Grundlage werden die Daten bereitgestellt?](#auf-welcher-rechtlichen-grundlage-werden-die-daten-bereitgestellt) - [Wo ist das Qualitätssicherungs-Verfahren dokumentiert?](#wo-ist-das-qualitätssicherungs-verfahren-dokumentiert) - [Wer darf auf diese Daten zugreifen?](#wer-darf-auf-diese-daten-zugreifen) - - [Welches weitere EU-Thema möchten Sie ergänzen?](#welches-weitere-eu-thema-möchten-sie-ergänzen) - [Ist dies ein hochwertiger Datensatz (HVD)?](#ist-dies-ein-hochwertiger-datensatz-hvd) - [Welcher HVD-Kategorie gehört dieser Datensatz an?](#welcher-hvd-kategorie-gehört-dieser-datensatz-an) - [Welche eindeutige Kennung hat dieser Datensatz?](#welche-eindeutige-kennung-hat-dieser-datensatz) @@ -97,7 +96,7 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **4 · Verständliche Langbeschreibung:** Tragen Sie hier die Organisation ein, die die Daten offiziell veröffentlicht — also wer dafür verantwortlich ist, dass die Daten bereitstehen. Das ist oft eine Behörde, ein Amt oder ein Verein. Beispiel: „Statistisches Landesamt Musterstadt" oder „Umweltbundesamt". -### Welchem Thema ist dieser Datensatz zugeordnet? +### Welchen Themen ist dieser Datensatz zugeordnet? | Eigenschaft | Wert | |---|---| @@ -110,11 +109,11 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **1 · DCAT-AP-Frage:** Welchem `dcat:theme` (Datenthema) ist der Datensatz zugeordnet? -**2 · Verständliche Frage:** Welchem Thema ist dieser Datensatz zugeordnet? +**2 · Verständliche Frage:** Welchen Themen ist dieser Datensatz zugeordnet? **3 · DCAT-AP-Langbeschreibung:** `dcat:theme` ordnet den Datensatz einer oder mehreren Kategorien zu. In DCAT-AP wird das kontrollierte EU-Vokabular „Data Theme" (`http://publications.europa.eu/resource/authority/data-theme/`) verwendet, z. B. `ENVI` (Umwelt) oder `EDUC` (Bildung). Multiplizität 0..n. -**4 · Verständliche Langbeschreibung:** Wählen Sie das Themengebiet, zu dem die Daten am besten passen — ähnlich einer Schublade, in die der Datensatz einsortiert wird. Das hilft anderen, Ihre Daten über Themenfilter zu finden. Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur. +**4 · Verständliche Langbeschreibung:** Wählen Sie ein oder mehrere Themengebiete, zu denen die Daten passen — ähnlich einer Schublade, in die der Datensatz einsortiert wird. Das hilft anderen, Ihre Daten über Themenfilter zu finden. Beispiel: Umwelt, Bildung, Gesundheit, Wirtschaft, Kultur. ### Mit welchen Schlagworten finde ich diese Daten? @@ -755,25 +754,6 @@ Legende der Stufen-Spalte: **Pflicht** (Veröffentlichung wird ohne dieses Feld **4 · Verständliche Langbeschreibung:** Geben Sie an, ob die Daten für alle offen (öffentlich), nur eingeschränkt oder gar nicht öffentlich zugänglich sind. Für offene Daten ist das in der Regel „öffentlich". Beispiel: Öffentlich. „Öffentlich" ist bereits vorausgewählt — ändern Sie die Angabe nur, wenn der Zugriff eingeschränkt oder gar nicht öffentlich ist. -### Welches weitere EU-Thema möchten Sie ergänzen? - -| Eigenschaft | Wert | -|---|---| -| DCAT-Property | `dcat:theme` | -| Meta-Key | `_odw_theme_uri` | -| Multiplizität | `0..n` | -| Profil-Klasse | [Datensatz](https://www.dcat-ap.de/def/dcatde/3.0/spec/#datensatz) | -| Stufe | Optional | -| Vokabular | `data-theme` | - -**1 · DCAT-AP-Frage:** Welches zusätzliche `dcat:theme` (EU-Themen-URI) gilt für den Datensatz? - -**2 · Verständliche Frage:** Welches weitere EU-Thema möchten Sie ergänzen? - -**3 · DCAT-AP-Langbeschreibung:** Zusätzliches `dcat:theme` als direkte EU-Themen-URI (`http://publications.europa.eu/resource/authority/data-theme/…`). Ergänzt die Themen-Auswahl aus Tab 1 um weitere Themen. Multiplizität 0..n. - -**4 · Verständliche Langbeschreibung:** Falls Ihr Datensatz zu mehr als einem Thema passt, ergänzen Sie hier ein weiteres EU-Thema aus der Vorschlagsliste. Das erhöht die Auffindbarkeit über mehrere Themenfilter. Beispiel: Umwelt zusätzlich zu Gesundheit. - ### Ist dies ein hochwertiger Datensatz (HVD)? | Eigenschaft | Wert | diff --git a/includes/class-admin.php b/includes/class-admin.php index 3c3cbf1a..1a6858ce 100644 --- a/includes/class-admin.php +++ b/includes/class-admin.php @@ -137,8 +137,8 @@ public static function render_column( string $column, int $post_id ): void { break; case 'odw_theme': - $theme = (string) carbon_get_post_meta( $post_id, 'odw_theme' ); - echo esc_html( '' !== $theme ? ODW_Fields::resolve_label( 'theme', $theme ) : '—' ); + $themes = ODW_Fields::theme_labels( $post_id ); + echo esc_html( array() !== $themes ? implode( ', ', $themes ) : '—' ); break; case 'odw_status': @@ -236,7 +236,7 @@ public static function handle_meta_orderby( WP_Query $query ): void { } if ( 'odw_theme' === $query->get( 'orderby' ) ) { - $query->set( 'meta_key', '_odw_theme' ); + $query->set( 'meta_key', '_odw_theme_sort' ); $query->set( 'orderby', 'meta_value' ); } diff --git a/includes/class-batch-import.php b/includes/class-batch-import.php index 482969f9..f4302da4 100644 --- a/includes/class-batch-import.php +++ b/includes/class-batch-import.php @@ -479,13 +479,15 @@ private static function create_dataset_from_record( array $record, int $row_inde if ( isset( $record[ $field ] ) && ! empty( $record[ $field ] ) ) { $value = (string) $record[ $field ]; + if ( 'theme' === $field ) { + // Themen werden weiter unten gesetzt: Seit v2.41.0 ist das Feld + // eine Mehrfachauswahl und muss über die Carbon-Fields-API + // geschrieben werden, nicht über den flachen Meta-Key. + continue; + } + if ( 'byte_size' === $field ) { $value = (string) absint( $value ); - } elseif ( 'theme' === $field ) { - // Code (SOCI) oder Label → gespeicherte EU-URI. - $value = class_exists( 'ODW_Fields' ) - ? ODW_Fields::resolve_theme_uri( sanitize_text_field( $value ) ) - : sanitize_text_field( $value ); } elseif ( 'keywords' === $field ) { // Schlagworte werden intern zeilengetrennt gespeichert. Import // erlaubt Komma- ODER Zeilentrennung — beides zu Zeilen normalisieren. @@ -509,6 +511,20 @@ static function ( string $keyword ): bool { } } + // Themen: Mehrfachauswahl seit v2.41.0. Der Import erlaubt Komma- oder + // Zeilentrennung, jeder Eintrag wird zur EU-URI aufgelöst. Geschrieben + // wird über carbon_set_post_meta(), weil Carbon Fields Mehrfachwerte + // unter eigenen Meta-Keys ablegt; die flache Spiegelung zieht danach nach. + if ( isset( $record['theme'] ) && '' !== trim( (string) $record['theme'] ) && class_exists( 'ODW_Fields' ) ) { + $split = preg_split( '/[\r\n,]+/', self::neutralize_formula( (string) $record['theme'] ) ); + $themes = ODW_Fields::normalize_themes( is_array( $split ) ? $split : array() ); + + if ( array() !== $themes ) { + carbon_set_post_meta( $post_id, 'odw_theme', $themes ); + ODW_Fields::sync_theme_index( $post_id ); + } + } + // Set import tracking. update_post_meta( $post_id, '_odw_imported', current_time( 'mysql' ) ); diff --git a/includes/class-fields.php b/includes/class-fields.php index 01a90176..c3a44d4e 100644 --- a/includes/class-fields.php +++ b/includes/class-fields.php @@ -32,6 +32,11 @@ public static function init(): void { // save_post_{post_type} grundsätzlich DAVOR — nur mit 'save_post'@20 läuft // das Auto-Update nach CF und wird nicht vom Formularwert überschrieben. add_action( 'save_post', array( self::class, 'set_modified_date' ), 20, 2 ); + // Auf 'save_post'@30, NICHT auf save_post_odw_dataset: WordPress feuert + // save_post_{post_type} vor save_post, die Spiegelung liefe dann vor + // Carbon Fields und läse den alten Wert. Die Typprüfung steht in der + // Methode. + add_action( 'save_post', array( self::class, 'sync_theme_index' ), 30 ); } /** @@ -83,8 +88,12 @@ private static function register_required_fields(): void { ->set_attribute( 'placeholder', __( 'Kurze Beschreibung des Datensatzes…', 'open-data-wizard' ) ) ->set_help_text( __( 'BESCHREIBUNG (dct:description)', 'open-data-wizard' ) ), - Field::make( 'select', 'odw_theme', __( 'Welchem Thema ist dieser Datensatz zugeordnet?', 'open-data-wizard' ) ) - ->add_options( self::get_theme_options() ) + // Mehrfachauswahl statt Einzelauswahl: dcat:theme erlaubt laut Profil + // 0..n Themen. Vorher gab es ein Auswahlfeld hier und ein + // Vorschlagsfeld unter „Erweiterte Angaben" — zwei Bedienarten + // für dieselbe Sache, zusammen höchstens zwei Themen. + Field::make( 'multiselect', 'odw_theme', __( 'Welchen Themen ist dieser Datensatz zugeordnet?', 'open-data-wizard' ) ) + ->add_options( self::get_theme_options_multi() ) ->set_help_text( __( 'THEMA (dcat:theme)', 'open-data-wizard' ) ), // Schlagworte gehören zur inhaltlichen Erschließung und stehen @@ -518,11 +527,6 @@ static function (): string { ->set_default_value( 'http://publications.europa.eu/resource/authority/access-right/PUBLIC' ) ->set_help_text( __( 'ZUGRIFFSRECHTE (dct:accessRights)', 'open-data-wizard' ) ), - Field::make( 'text', 'odw_theme_uri', __( 'Weiteres EU-Thema (Themen-URI)?', 'open-data-wizard' ) ) - ->set_attribute( 'data-odw-vocab', 'data-theme' ) - ->set_attribute( 'placeholder', __( 'EU-Datenthema eintippen oder auswählen…', 'open-data-wizard' ) ) - ->set_help_text( __( 'ZUSÄTZLICHES THEMA (dcat:theme)', 'open-data-wizard' ) ), - Field::make( 'html', 'odw_ext_hint_hvd' ) ->set_html( '' ), - Field::make( 'text', 'odw_contributor_id', __( 'Welche Stelle stellt diese Daten im GovData-Verbund bereit?', 'open-data-wizard' ) ) - ->set_attribute( 'data-odw-vocab', 'contributors' ) - ->set_attribute( 'placeholder', __( 'Stelle eintippen oder auswählen…', 'open-data-wizard' ) ) + // Auswahlfeld statt Tipp-Feld: 69 Einträge sind für eine Liste + // noch handhabbar, und die Stelle wird genau einmal gewählt. + Field::make( 'select', 'odw_contributor_id', __( 'Welche Stelle stellt diese Daten im GovData-Verbund bereit?', 'open-data-wizard' ) ) + ->add_options( self::vocabulary_options( 'contributors', __( '— Keine Angabe —', 'open-data-wizard' ) ) ) ->set_help_text( __( 'CONTRIBUTOR-ID (dcatde:contributorID)', 'open-data-wizard' ) ), Field::make( 'text', 'odw_originator_name', __( 'Wer hat diese Daten ursprünglich erstellt?', 'open-data-wizard' ) ) @@ -1040,6 +1045,12 @@ public static function resolve_label( string $vocab, string $value ): string { case 'cessda': $map = self::load_cessda_options(); break; + case 'engagementfeld': + case 'contributors': + // Gebündelte Vokabulare: seit v2.41.0 Auswahlfelder, deren + // gespeicherte URI im Frontend als Label erscheinen soll. + $map = self::vocabulary_options( $vocab ); + break; default: $map = array(); } @@ -1047,6 +1058,53 @@ public static function resolve_label( string $vocab, string $value ): string { return isset( $map[ $value ] ) && '' !== (string) $map[ $value ] ? (string) $map[ $value ] : $value; } + /** + * Ein gebündeltes Vokabular als URI → Label Map für Auswahlfelder. + * + * @param string $id Vokabular-ID (Dateiname ohne .json). + * @param string $placeholder Optionaler Platzhalter-Eintrag mit leerem Wert. + * @return array + */ + public static function vocabulary_options( string $id, string $placeholder = '' ): array { + $options = array(); + if ( '' !== $placeholder ) { + $options[''] = $placeholder; + } + foreach ( self::load_vocabulary( $id ) as $entry ) { + $options[ $entry['value'] ] = $entry['label']; + } + return $options; + } + + /** + * Bringt einen gespeicherten Vokabularwert auf eine Liste von URIs. + * + * Wie normalize_themes(), aber für die gebündelten Vokabulare: Array + * (Mehrfachauswahl), einzelner String oder ein Label, das vor der Umstellung + * im Textfeld stand und erst aufgelöst werden muss. + * + * @param mixed $value Gespeicherter Wert. + * @param string $vocab Vokabular-ID. + * @return array + */ + public static function normalize_vocabulary( $value, string $vocab ): array { + $werte = is_array( $value ) ? $value : array( $value ); + $out = array(); + + foreach ( $werte as $einzeln ) { + $einzeln = trim( (string) $einzeln ); + if ( '' === $einzeln ) { + continue; + } + $uri = odw_resolve_vocab_uri( $einzeln, $vocab ); + if ( '' !== $uri && ! in_array( $uri, $out, true ) ) { + $out[] = $uri; + } + } + + return $out; + } + /** * Flache Spiegelung der gewählten Themen für Abfragen. * @@ -1096,6 +1154,26 @@ public static function theme_labels( int $post_id ): array { return $out; } + /** + * Labels aller gewählten Konzepte eines gebündelten Vokabulars. + * + * Gegenstück zu theme_labels() für die übrigen Mehrfachauswahlen; kann eine + * URI nicht aufgelöst werden, steht sie selbst da statt einer Lücke. + * + * @param int $post_id Dataset post ID. + * @param string $field Carbon-Feld-Schlüssel, z. B. "odw_engagementfeld". + * @param string $vocab Vokabular-ID. + * @return array + */ + public static function vocabulary_labels( int $post_id, string $field, string $vocab ): array { + $out = array(); + foreach ( self::normalize_vocabulary( carbon_get_post_meta( $post_id, $field ), $vocab ) as $uri ) { + $label = self::resolve_label( $vocab, $uri ); + $out[] = '' !== $label ? $label : $uri; + } + return $out; + } + /** * Bringt den gespeicherten Themenwert auf eine Liste von EU-URIs. * @@ -1892,7 +1970,7 @@ function odw_build_dataset_jsonld( int $post_id ): ?array { $dist_attribution = (string) carbon_get_post_meta( $post_id, 'odw_attribution_text' ); $dist_availability = (string) carbon_get_post_meta( $post_id, 'odw_availability' ); $cessda_topic = (string) carbon_get_post_meta( $post_id, 'odw_cessda_topic' ); - $engagementfeld = (string) carbon_get_post_meta( $post_id, 'odw_engagementfeld' ); + $engagementfeld = carbon_get_post_meta( $post_id, 'odw_engagementfeld' ); // Extended DCAT-AP fields (Tab 4). $landing_page = (string) carbon_get_post_meta( $post_id, 'odw_landing_page' ); @@ -2017,11 +2095,11 @@ function odw_build_dataset_jsonld( int $post_id ): ?array { if ( ! empty( $cessda_topic ) ) { $subjects[] = array( '@id' => odw_sanitize_jsonld_id( (string) $cessda_topic ) ); } - if ( ! empty( $engagementfeld ) ) { - $engagement_uri = odw_resolve_vocab_uri( $engagementfeld, 'engagementfeld' ); - if ( '' !== $engagement_uri ) { - $subjects[] = array( '@id' => odw_sanitize_jsonld_id( $engagement_uri ) ); - } + // Seit v2.41.0 ist das Engagementfeld eine Mehrfachauswahl. normalize_vocabulary() + // nimmt daneben weiterhin den einzelnen String entgegen, den Datensätze vor der + // Migration tragen, und löst ein Label zur URI auf. + foreach ( ODW_Fields::normalize_vocabulary( $engagementfeld, 'engagementfeld' ) as $engagement_uri ) { + $subjects[] = array( '@id' => odw_sanitize_jsonld_id( $engagement_uri ) ); } if ( ! empty( $subjects ) ) { $dataset['dct:subject'] = 1 === count( $subjects ) ? $subjects[0] : $subjects; diff --git a/includes/class-setup.php b/includes/class-setup.php index 2643a07b..0a3ccab3 100644 --- a/includes/class-setup.php +++ b/includes/class-setup.php @@ -25,7 +25,7 @@ class ODW_Setup { private const DEMO_OPTION = 'odw_demo_post_id'; private const WELCOME_OPTION = 'odw_show_welcome'; private const REDIRECT_OPTION = 'odw_activation_redirect'; - private const THEME_MIGRATED = 'odw_theme_multi_migrated'; + private const MULTI_MIGRATED = 'odw_multi_value_migrated'; /** * Custom capability, die Batch-Import & Co. schützt. @@ -50,25 +50,26 @@ public static function init(): void { add_action( 'admin_init', array( self::class, 'maybe_grant_capability' ) ); add_action( 'admin_init', array( self::class, 'maybe_redirect_to_intro' ) ); add_action( 'admin_init', array( self::class, 'maybe_create_demo' ) ); - add_action( 'admin_init', array( self::class, 'maybe_migrate_themes' ) ); + add_action( 'admin_init', array( self::class, 'maybe_migrate_multi_values' ) ); add_action( 'admin_init', array( self::class, 'handle_dismiss' ) ); add_action( 'admin_notices', array( self::class, 'render_welcome_notice' ) ); } /** - * Überführt Einzel-Themen in die Mehrfachauswahl (einmalig, ab v2.41.0). + * Überführt Einzelwerte in die Mehrfachauswahlen (einmalig, ab v2.41.0). * - * Bis v2.40.x war `odw_theme` ein Auswahlfeld und lag flach unter - * `_odw_theme`; ein zweites Thema konnte unter `_odw_theme_uri` stehen. - * Carbon Fields legt Mehrfachwerte unter eigenen Meta-Keys ab, die alten - * Zeilen wären also unsichtbar geworden — deshalb diese Umschreibung. + * Betroffen sind `odw_theme` und `odw_engagementfeld`. Bis v2.40.x waren + * beide Auswahl- bzw. Textfelder und lagen flach unter `_odw_theme` bzw. + * `_odw_engagementfeld`; ein zweites Thema konnte unter `_odw_theme_uri` + * stehen. Carbon Fields legt Mehrfachwerte unter eigenen Meta-Keys ab, die + * alten Zeilen wären also unsichtbar geworden — deshalb diese Umschreibung. * * Geschrieben wird über carbon_set_post_meta(), nicht über selbstgebaute * Meta-Keys: Das Schlüsselformat ist ein Interna von Carbon Fields und * darf sich ändern. */ - public static function maybe_migrate_themes(): void { - if ( get_option( self::THEME_MIGRATED ) ) { + public static function maybe_migrate_multi_values(): void { + if ( get_option( self::MULTI_MIGRATED ) ) { return; } if ( ! function_exists( 'carbon_set_post_meta' ) || ! class_exists( 'ODW_Fields' ) ) { @@ -102,9 +103,21 @@ public static function maybe_migrate_themes(): void { // eingelesen — mit dann womöglich überholten Werten. delete_post_meta( $post_id, '_odw_theme' ); delete_post_meta( $post_id, '_odw_theme_uri' ); + + // Engagementfeld: bis v2.40.x ein Textfeld mit Autosuggest, das + // entweder die URI oder — bei von Hand eingetragenen Werten — das + // Label enthielt. normalize_vocabulary() löst beides auf. + $alt_engagement = get_post_meta( $post_id, '_odw_engagementfeld', true ); + $engagement = ODW_Fields::normalize_vocabulary( $alt_engagement, 'engagementfeld' ); + + if ( array() !== $engagement ) { + carbon_set_post_meta( $post_id, 'odw_engagementfeld', $engagement ); + } + + delete_post_meta( $post_id, '_odw_engagementfeld' ); } - update_option( self::THEME_MIGRATED, '1', false ); + update_option( self::MULTI_MIGRATED, '1', false ); } /** diff --git a/includes/class-shortcode.php b/includes/class-shortcode.php index 49e8dc2b..b369f272 100644 --- a/includes/class-shortcode.php +++ b/includes/class-shortcode.php @@ -290,7 +290,11 @@ private static function collect_metadata_rows( int $post_id, string $license_lab class_exists( 'ODW_Fields' ) ? implode( ', ', ODW_Fields::theme_labels( $post_id ) ) : '' ); $add( __( 'CESSDA-Themenfeld', 'open-data-wizard' ), self::label( 'cessda', 'odw_cessda_topic', $post_id ) ); - $add( __( 'Engagementfeld', 'open-data-wizard' ), self::meta( $post_id, 'odw_engagementfeld' ) ); + // Engagementfelder sind seit v2.41.0 eine Mehrfachauswahl — alle anzeigen. + $add( + __( 'Engagementfeld', 'open-data-wizard' ), + class_exists( 'ODW_Fields' ) ? implode( ', ', ODW_Fields::vocabulary_labels( $post_id, 'odw_engagementfeld', 'engagementfeld' ) ) : '' + ); $add( __( 'Sprache', 'open-data-wizard' ), self::label( 'language', 'odw_language', $post_id ) ); $keywords = array_filter( array_map( 'trim', explode( "\n", self::meta( $post_id, 'odw_keywords' ) ) ) ); diff --git a/languages/open-data-wizard-en_US.mo b/languages/open-data-wizard-en_US.mo index cf63d00aa80432a1a6b634bbc6f3aaf31bee82e8..8a33c6685775759911cfcfcd1313401c22557ffb 100644 GIT binary patch delta 10479 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 F{{Y*if@uH% delta 10398 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 diff --git a/languages/open-data-wizard-en_US.po b/languages/open-data-wizard-en_US.po index fa4a5640..60d437bf 100644 --- a/languages/open-data-wizard-en_US.po +++ b/languages/open-data-wizard-en_US.po @@ -780,8 +780,11 @@ msgstr "In three steps: fill in the form, generate DCAT-AP.de metadata, portals msgid "In welche Kategorie gehört dieser Datensatz?" msgstr "Which category does this dataset belong to?" -msgid "Welchem Engagementfeld ist dieser Datensatz zuzuordnen?" -msgstr "Which field of civic engagement does this dataset belong to?" +msgid "Welchen Engagementfeldern ist dieser Datensatz zuzuordnen?" +msgstr "Which fields of civic engagement does this dataset belong to?" + +msgid "— Keine Angabe —" +msgstr "— Not specified —" msgid "In welchem Format ist die Datei?" msgstr "What format is the file in?" diff --git a/languages/open-data-wizard.pot b/languages/open-data-wizard.pot index ca820143..97b1b563 100644 --- a/languages/open-data-wizard.pot +++ b/languages/open-data-wizard.pot @@ -1534,7 +1534,10 @@ msgstr "" msgid "Davon steuert der Wizard %d Punkte selbst bei: Das Änderungsdatum wird bei jedem Speichern automatisch gesetzt. Deshalb steht auch ein noch leerer Datensatz nicht bei 0 %%." msgstr "" -msgid "Welchem Engagementfeld ist dieser Datensatz zuzuordnen?" +msgid "Welchen Engagementfeldern ist dieser Datensatz zuzuordnen?" +msgstr "" + +msgid "— Keine Angabe —" msgstr "" msgid "(ohne Titel, ID %d)" diff --git a/tests/e2e/admin-workflow.spec.js b/tests/e2e/admin-workflow.spec.js index d49da8d9..eb859cb0 100644 --- a/tests/e2e/admin-workflow.spec.js +++ b/tests/e2e/admin-workflow.spec.js @@ -156,6 +156,48 @@ test.describe('Formular', () => { await expect(page.locator(cfField('odw_theme_uri'))).toHaveCount(0); }); + test('Engagementfeld ist eine Mehrfachauswahl, keine Vorschlagsliste', async ({ page }) => { + await page.goto('/wp-admin/post-new.php?post_type=odw_dataset'); + + // Seit v2.41.0 ein Mehrfachfeld mit den 16 ZiviZ-Feldern. Vorher ein + // Textfeld mit datalist — die Auswahl war erst nach dem Tippen zu sehen. + await page.locator('[data-odw-section-toggle="tab1extra"]').click(); + + const feld = page.locator('.cf-field', { has: page.locator(cfField('odw_engagementfeld')) }); + await expect(feld.locator('select[multiple], .cf-multiselect')).toHaveCount(1); + await expect(feld).toContainText('Umwelt- und Naturschutz'); + }); + + test('die CESSDA-Vorschläge öffnen sich beim Anklicken', async ({ page }) => { + await page.goto('/wp-admin/post-new.php?post_type=odw_dataset'); + + await page.locator('[data-odw-section-toggle="tab1extra"]').click(); + + // Eigene Liste statt : Ein natives datalist ist Browser-Chrome + // und für Playwright unsichtbar — und es öffnet erst beim Tippen, was der + // Tester bemängelt hatte. + const eingabe = page.locator('.odw-cessda-input'); + const liste = page.locator('.odw-suggest__list'); + + await expect(liste).toBeHidden(); + await eingabe.click(); + await expect(liste).toBeVisible(); + + // Leeres Feld zeigt alles, Tippen grenzt ein. + const alle = await liste.locator('li:not([hidden])').count(); + expect(alle).toBeGreaterThan(1); + + await eingabe.fill('Migration'); + const gefiltert = await liste.locator('li:not([hidden])').count(); + expect(gefiltert).toBeLessThan(alle); + + // Ein Klick auf den Vorschlag trägt das Label ein und legt die URI im + // verborgenen Feld ab — das ist der Wert, der als dct:subject rausgeht. + await liste.locator('li:not([hidden])').first().click(); + await expect(liste).toBeHidden(); + await expect(page.locator(cfField('odw_cessda_topic'))).toHaveValue(/^https?:\/\//); + }); + test('wechselt auf den zweiten Reiter', async ({ page }) => { await page.goto('/wp-admin/post-new.php?post_type=odw_dataset'); diff --git a/tests/test-fields-extended.php b/tests/test-fields-extended.php index c96ec1f1..e735bf88 100644 --- a/tests/test-fields-extended.php +++ b/tests/test-fields-extended.php @@ -350,6 +350,59 @@ public function test_build_emits_cessda_topic_as_dct_subject(): void { $this->assertArrayNotHasKey( 'cessda:topic', $result ); } + /** + * Das Engagementfeld ist seit v2.41.0 eine Mehrfachauswahl: Alle gewählten + * Konzepte stehen unter dct:subject, zusammen mit dem CESSDA-Thema. + */ + public function test_build_emits_all_engagement_fields_as_dct_subject(): void { + $this->load_fields(); + + $base = 'https://ziviz.de/def/engagementfeld/'; + $cessda = 'https://vocabularies.cessda.eu/urn/urn:ddi:int.cessda.cv:TopicClassification:4.2.3:de:1.0'; + + $this->setup_jsonld_mocks( + 22, + 'odw_dataset', + array( + 'odw_cessda_topic' => $cessda, + 'odw_engagementfeld' => array( $base . 'sport', $base . 'kultur' ), + ) + ); + + $result = odw_build_dataset_jsonld( 22 ); + + $this->assertIsArray( $result ); + $this->assertSame( + array( + array( '@id' => $cessda ), + array( '@id' => $base . 'sport' ), + array( '@id' => $base . 'kultur' ), + ), + $result['dct:subject'] + ); + } + + /** + * Ein einzelner String — so lagen die Werte vor der Migration — ergibt + * weiterhin genau ein dct:subject, kein verschachteltes Array. + */ + public function test_build_accepts_engagement_field_as_single_string(): void { + $this->load_fields(); + + $uri = 'https://ziviz.de/def/engagementfeld/medien'; + + $this->setup_jsonld_mocks( + 23, + 'odw_dataset', + array( 'odw_engagementfeld' => $uri ) + ); + + $result = odw_build_dataset_jsonld( 23 ); + + $this->assertIsArray( $result ); + $this->assertSame( array( '@id' => $uri ), $result['dct:subject'] ); + } + /** * When a dataset is flagged HVD with a category, both dcatap:hvdCategory and * dcatap:applicableLegislation are emitted (the latter pinned to Reg 2023/138). diff --git a/tests/test-fields.php b/tests/test-fields.php index b41b92eb..7f71f11f 100644 --- a/tests/test-fields.php +++ b/tests/test-fields.php @@ -428,4 +428,57 @@ public function provide_theme_values(): array { 'Leerwerte dazwischen' => array( array( '', 'Bildung', ' ' ), array( $base . 'EDUC' ) ), ); } + + /** + * Dasselbe für die gebündelten Vokabulare (Engagementfeld & Co.). + * + * Anders als beim Thema gibt es hier keine Alt-Labels aus einer früheren + * Auswahlliste — wohl aber Werte, die vor v2.41.0 von Hand ins Textfeld + * getippt wurden und deshalb das Label statt der URI enthalten. + * + * @dataProvider provide_vocabulary_values + * + * @param mixed $value Gespeicherter Wert. + * @param array $expected Erwartete URI-Liste. + */ + public function test_normalize_vocabulary( $value, array $expected ): void { + \WP_Mock::userFunction( '__' )->andReturnArg( 0 ); + \WP_Mock::userFunction( 'apply_filters' )->andReturnArg( 1 ); + if ( ! defined( 'DAY_IN_SECONDS' ) ) { + define( 'DAY_IN_SECONDS', 86400 ); + } + \WP_Mock::userFunction( 'get_transient' )->andReturn( false ); + \WP_Mock::userFunction( 'set_transient' )->andReturn( true ); + if ( ! class_exists( 'ODW_Fields' ) ) { + require_once ODW_PLUGIN_DIR . 'includes/class-fields.php'; + } + + $this->assertSame( $expected, ODW_Fields::normalize_vocabulary( $value, 'engagementfeld' ) ); + } + + /** + * Stored engagement-field values and the URI list they must produce. + * + * @return array}> + */ + public function provide_vocabulary_values(): array { + $base = 'https://ziviz.de/def/engagementfeld/'; + + return array( + 'Array von URIs' => array( + array( $base . 'sport', $base . 'kultur' ), + array( $base . 'sport', $base . 'kultur' ), + ), + 'einzelner String' => array( $base . 'sport', array( $base . 'sport' ) ), + 'Label statt URI' => array( 'Bildung und Erziehung', array( $base . 'bildungUNDerziehung' ) ), + 'Duplikat entfaellt' => array( + array( $base . 'sport', $base . 'sport' ), + array( $base . 'sport' ), + ), + 'unbekanntes Label' => array( 'Gibt es nicht', array() ), + 'leerer String' => array( '', array() ), + 'leeres Array' => array( array(), array() ), + 'Leerwert dazwischen' => array( array( '', $base . 'sport' ), array( $base . 'sport' ) ), + ); + } } From 4ba86e654665e85af2f90eb998816b4232f6e635 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 27 Aug 2026 11:20:43 +0000 Subject: [PATCH 7/7] fix: Themenfilter, PHPStan-Ignore und E2E-Selektoren aus dem CI-Lauf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drei Befunde aus dem roten Lauf zu U-4: - /catalog?theme=Bildung fand nichts mehr. Der Filter löste den Parameter über resolve_theme_uri() auf, der Index wird aber über normalize_themes() geschrieben — und das EU-Vokabular kennt „Bildung" nicht, dort heißt es „Bildung, Kultur und Sport". Der Filter nimmt jetzt dieselbe Auflösung wie das Speichern; Harvester mit dem alten deutschen Kurznamen bekommen weiter Treffer. Genau der Fall, für den der E2E-Test da ist. - PHPStan kannte carbon_set_post_meta nicht. Das Ignore-Muster listete nur den Getter; class-setup.php fiel nicht auf, weil dort ein function_exists()-Guard steht. - Die E2E-Selektoren auf die Mehrfachauswahl trafen nichts. Carbon Fields 3.6 rendert multiselect über react-select: ein
, kein . Die Klasse + // „cf-multiselect" allein gibt es nicht — sie ist nur der classNamePrefix + // für cf-multiselect__control, __menu und so weiter. + await expect(themeField.locator('.cf-multiselect__select')).toHaveCount(1); // Das frühere Zusatzfeld gibt es nicht mehr. await expect(page.locator(cfField('odw_theme_uri'))).toHaveCount(0); @@ -164,8 +168,13 @@ test.describe('Formular', () => { await page.locator('[data-odw-section-toggle="tab1extra"]').click(); const feld = page.locator('.cf-field', { has: page.locator(cfField('odw_engagementfeld')) }); - await expect(feld.locator('select[multiple], .cf-multiselect')).toHaveCount(1); - await expect(feld).toContainText('Umwelt- und Naturschutz'); + await expect(feld.locator('.cf-multiselect__select')).toHaveCount(1); + + // react-select hängt die Optionen erst ins DOM, wenn das Menü offen ist — + // ohne den Klick steht dort nur der Platzhalter, und eine Zusicherung auf + // den Optionstext wäre grün, egal welche Optionen das Feld hat. + await feld.locator('.cf-multiselect__control').click(); + await expect(feld.locator('.cf-multiselect__menu')).toContainText('Umwelt- und Naturschutz'); }); test('die CESSDA-Vorschläge öffnen sich beim Anklicken', async ({ page }) => {