diff --git a/CHANGELOG.md b/CHANGELOG.md index d8ef09b..c2d34d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,37 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/spec/v2.0.0.ht --- +## [2.37.0] — 2026-08-07 + +Alle 24 EU-Amtssprachen statt zwei. + +### ✨ Added +- **Sprachauswahl als gebündeltes Vokabular** (`config/vocabularies/language.json`). Bisher standen + fest im Code nur Deutsch und Englisch zur Wahl — und zwar nicht nur beim Sprachfeld des + Datensatzes, sondern auch in allen drei Übersetzungs-Repeatern und bei der Standardsprache in + den Einstellungen. Mehrsprachige Metadaten waren damit praktisch auf Englisch beschränkt, + obwohl das Plugin sie als Funktion führt. + +### ℹ️ Hintergrund +Die Begrenzung lag ausschließlich in der Auswahlliste: `odw_resolve_language_tag()` setzte alle +24 EU-Sprachcodes schon vorher korrekt nach BCP-47 um (`DEU` → `de`, `POL` → `pl` …). Die +JSON-LD-Ausgabe war also längst vorbereitet, das Formular bot die Sprachen nur nicht an. + +Deutsch und Englisch stehen weiterhin an erster Stelle, die übrigen 22 alphabetisch darunter. +Bleibt die Vokabulardatei einmal aus, fällt die Auswahl auf Deutsch und Englisch zurück — ohne +mindestens eine Sprache ließe sich weder eine Übersetzung pflegen noch eine Standardsprache +wählen. + +Wie bei den anderen gebündelten Vokabularen stehen die Bezeichnungen in der JSON-Datei und +durchlaufen damit nicht die Übersetzungsdateien. Das ISO-Kürzel im Label („Polnisch (PL)") +macht den Eintrag trotzdem eindeutig. + +### 📝 Dokumentation +- Die Roadmap in `CLAUDE.md` führte `access-right` und die EU-Sprachliste als offen. Das + `access-right`-Vokabular liegt seit Längerem vor; beide Punkte sind jetzt als erledigt vermerkt. + +--- + ## [2.36.0] — 2026-08-07 Überarbeitetes Formular-Design — Typografie, Abstände, Eingabefelder. diff --git a/CLAUDE.md b/CLAUDE.md index 393398e..b4e1e9b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -730,7 +730,7 @@ Update **both** locations: - MINOR: New features (backward-compatible) - PATCH: Bug fixes only -Current: **v2.36.0** +Current: **v2.37.0** --- @@ -766,6 +766,9 @@ Neue technische Festlegungen gehören dorthin, nicht in README oder CLAUDE.md. Dokument) + `&format=turtle` über den dependency-freien `ODW_Rdf`-Serializer; Admin-Box mit den kopierfertigen URLs. Gegen die gebündelten SHACL-Shapes validiert (DCAT-AP.de: konform). - **Reproduzierbare Abhängigkeiten (v2.34.0):** `vendor/` ist nicht mehr eingecheckt (siehe Quick Start). +- **Gebündelte Vokabulare vervollständigt (v2.37.0):** `access-right` (3 Stufen) und `language` + (alle 24 EU-Amtssprachen) liegen unter `config/vocabularies/`. Die Sprachauswahl bot vorher nur + Deutsch und Englisch, obwohl `odw_resolve_language_tag()` alle 24 Codes bereits umsetzen konnte. - **Content Negotiation (v2.35.0):** Alle drei Endpunkte liefern `jsonld`/`json`/`turtle`; ohne `?format=` entscheidet der `Accept`-Header (q-Werte, `Vary: Accept`). Explizites `?format=` hat Vorrang. @@ -777,8 +780,8 @@ Neue technische Festlegungen gehören dorthin, nicht in README oder CLAUDE.md. - **Gutenberg-Block** für die Download-Card (Alternative zum Shortcode). - **Mehrsprachigkeit der Oberfläche** (WPML/Polylang) — das Datenmodell unterstützt Mehrsprachigkeit bereits, die Integration fehlt. -- **Optional/künftig:** weitere gebündelte Vokabulare (`access-right`, vollständige EU-Sprachliste); - Registry-getriebenes Formular-/JSON-LD-Rendering (Aufräumarbeit ohne sichtbaren Nutzen). +- **Optional/künftig:** Registry-getriebenes Formular-/JSON-LD-Rendering (Aufräumarbeit ohne + sichtbaren Nutzen). > **Hinweis zu i18n:** Im aktuellen Container ist `msgfmt` nicht verfügbar. Die `.mo` wird daher per > gebündeltem, dependency-freiem PO→MO-Skript neu erzeugt: @@ -869,6 +872,6 @@ Neue technische Festlegungen gehören dorthin, nicht in README oder CLAUDE.md. --- -**Zuletzt aktualisiert**: Version 2.36.0 (August 2026) +**Zuletzt aktualisiert**: Version 2.37.0 (August 2026) **Autor**: Open Data Wizard Team (nozilla) **License**: GPL-2.0-or-later diff --git a/README.md b/README.md index a52b8ae..ad0231f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ![PHP Version](https://img.shields.io/badge/PHP-%3E%3D%208.1-8892BF?style=flat-square&logo=php&logoColor=white) ![WordPress](https://img.shields.io/badge/WordPress-compatible-21759B?style=flat-square&logo=wordpress&logoColor=white) ![DCAT-AP](https://img.shields.io/badge/DCAT--AP-3.0-brightgreen?style=flat-square) -![Version](https://img.shields.io/badge/Version-2.36.0-brightgreen?style=flat-square) +![Version](https://img.shields.io/badge/Version-2.37.0-brightgreen?style=flat-square) ![PRs Welcome](https://img.shields.io/badge/PRs-willkommen-brightgreen?style=flat-square) 📖 [Dokumentation](DOCUMENTATION.md) · 📋 [Feld-Referenz](docs/FELD-REFERENZ.md) · 📐 [Technische Spezifikation](TECHNICAL-SPEC.md) · 📝 [Changelog](CHANGELOG.md) · 🛡️ [Security](SECURITY.md) · ⚖️ [Lizenz](LICENSE) @@ -101,7 +101,7 @@ allgemeinverständlicher Erklärung je Feld steht in [`docs/FELD-REFERENZ.md`](d - **Mehrere Distributionen** je Datensatz — dieselben Daten z. B. als CSV *und* JSON, jeweils mit eigener Lizenz, Größe und Format -**Statt Freitext kontrollierte Vokabulare:** Themen, Dateiformate, Sprachen, Lizenzen, Zugriffsrechte +**Statt Freitext kontrollierte Vokabulare:** Themen, Dateiformate, Sprachen (alle 24 EU-Amtssprachen), Lizenzen, Zugriffsrechte und Aktualisierungsfrequenzen stammen aus den offiziellen EU- und DCAT-AP.de-Listen. Sie wählen „Umwelt" — gespeichert wird die dazugehörige URI. diff --git a/config/vocabularies/language.json b/config/vocabularies/language.json new file mode 100644 index 0000000..896502f --- /dev/null +++ b/config/vocabularies/language.json @@ -0,0 +1,98 @@ +[ + { + "value": "http://publications.europa.eu/resource/authority/language/DEU", + "label": "Deutsch (DE)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/ENG", + "label": "Englisch (EN)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/BUL", + "label": "Bulgarisch (BG)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/DAN", + "label": "Dänisch (DA)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/EST", + "label": "Estnisch (ET)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/FIN", + "label": "Finnisch (FI)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/FRA", + "label": "Französisch (FR)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/ELL", + "label": "Griechisch (EL)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/GLE", + "label": "Irisch (GA)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/ITA", + "label": "Italienisch (IT)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/HRV", + "label": "Kroatisch (HR)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/LAV", + "label": "Lettisch (LV)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/LIT", + "label": "Litauisch (LT)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/MLT", + "label": "Maltesisch (MT)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/NLD", + "label": "Niederländisch (NL)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/POL", + "label": "Polnisch (PL)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/POR", + "label": "Portugiesisch (PT)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/RON", + "label": "Rumänisch (RO)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/SWE", + "label": "Schwedisch (SV)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/SLK", + "label": "Slowakisch (SK)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/SLV", + "label": "Slowenisch (SL)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/SPA", + "label": "Spanisch (ES)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/CES", + "label": "Tschechisch (CS)" + }, + { + "value": "http://publications.europa.eu/resource/authority/language/HUN", + "label": "Ungarisch (HU)" + } +] diff --git a/includes/class-fields.php b/includes/class-fields.php index 127ba88..adc96e3 100644 --- a/includes/class-fields.php +++ b/includes/class-fields.php @@ -1187,12 +1187,22 @@ public static function get_format_eu_uri( string $format ): string { * @return array */ public static function get_language_options(): array { - $base = 'http://publications.europa.eu/resource/authority/language/'; - return array( - '' => __( '— Bitte wählen —', 'open-data-wizard' ), - $base . 'DEU' => __( 'Deutsch (DE)', 'open-data-wizard' ), - $base . 'ENG' => __( 'Englisch (EN)', 'open-data-wizard' ), - ); + $options = array( '' => __( '— Bitte wählen —', 'open-data-wizard' ) ); + + foreach ( self::load_vocabulary( 'language' ) as $entry ) { + $options[ $entry['value'] ] = $entry['label']; + } + + // Rückfallebene, falls die Vokabulardatei fehlt oder unlesbar ist: + // Ohne mindestens eine Sprache ließen sich weder mehrsprachige Literale + // pflegen noch eine Standardsprache in den Einstellungen wählen. + if ( 1 === count( $options ) ) { + $base = 'http://publications.europa.eu/resource/authority/language/'; + $options[ $base . 'DEU' ] = __( 'Deutsch (DE)', 'open-data-wizard' ); + $options[ $base . 'ENG' ] = __( 'Englisch (EN)', 'open-data-wizard' ); + } + + return $options; } /** diff --git a/open-data-wizard.php b/open-data-wizard.php index feff1ab..9b5bf38 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.36.0 + * Version: 2.37.0 * Requires at least: 6.4 * Requires PHP: 8.1 * Author: nozilla @@ -26,7 +26,7 @@ exit; } -define( 'ODW_VERSION', '2.36.0' ); +define( 'ODW_VERSION', '2.37.0' ); define( 'ODW_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'ODW_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'ODW_PLUGIN_FILE', __FILE__ );