Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,50 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/spec/v2.0.0.ht

---

## [2.47.5] — 2026-11-06

### 🐛 Fixed
- **Carbon-Fields-Bedienelemente auf Deutsch.** Im Formular standen auch in einem deutschen
WordPress englische Texte von Carbon Fields: „There are no entries yet.“ und
„Add Distribution“ im Wiederholungsfeld „Weitere Distributionen“ (ebenso bei den
Übersetzungs-Wiederholungsfeldern in Tab 2), „Select Date“ am Datumsfeld, „No options.“,
„Collapse All“ u. a. Zwei Ursachen:
- Carbon Fields 3.6.11 bringt für seine Oberflächen-Domain `carbon-fields-ui` keine deutsche
Datei mit. Das Plugin liefert sie jetzt selbst aus
(`languages/carbon-fields-ui-de_DE.po`/`.mo`, Anrede „Sie“), nicht in `vendor/`.
- Carbon Fields gibt seine UI-Übersetzungen nicht über `wp_set_script_translations()` weiter,
sondern über `wp_localize_script()` als `cf.config.locale`, das die Oberfläche an
`setLocaleData()` übergibt. Seit WordPress 6.5 liefert
`get_translations_for_domain()->entries` dafür eine Liste statt einer nach msgid
geschlüsselten Tabelle; Carbon Fields übernimmt die Listenindizes als msgids, und keine
Übersetzung erreicht die Oberfläche — auch die mitgelieferten (z. B. fr_FR) nicht. Die neue
Klasse `ODW_Carbon_Fields_L10n` baut die Daten im Filter `carbon_fields_config` korrekt
geschlüsselt neu auf und lädt für alle deutschen Locales (de_DE, de_DE_formal, de_AT, de_CH …)
die gebündelte Datei.
- **Mehrfachauswahl (Themen, Engagementfelder):** Platzhalter „Select...“ und die Meldung
„No options“ im Aufklappmenü sind feste Vorgaben der Bibliothek react-select und laufen durch
keine Textdomain. `assets/js/odw-carbon-fields-l10n.js` ersetzt sie durch „Auswählen…“ und
„Keine passenden Optionen“ (über die Plugin-Domain; en_US erhält das englische Original).
- **„Datum wählen“ statt „Select Date“:** Der Button am Datumsfeld kommt jetzt regulär aus der
Übersetzung. Der bisherige Tausch in `odw-datepicker-de.js` suchte „Select Date“ als
Platzhalter des Eingabefelds — es ist aber die Beschriftung eines Buttons, der Tausch blieb
deshalb wirkungslos und ist entfallen.
- **Kalender auf englischen Installationen englisch.** Die Datumsfelder stellten flatpickr fest
auf `locale: 'de'`, und `odw-datepicker-de.js` lud die deutsche Sprachdatei für jede Locale —
auf en_US standen deutsche Monats- und Wochentagsnamen neben englischen Beschriftungen. Die
Kalendersprache folgt jetzt der Oberfläche (`ODW_Fields::date_picker_options()`: `de` bei
deutscher Locale, sonst `default`), und die Sprachdatei wird nur für deutsche Locales geladen.

### 🧪 Tests
- `tests/test-carbon-fields-l10n.php`: Schlüsselbildung mit WP_Translations (nur `__get()`,
Liste) und älteren Übersetzungsobjekten, Laden nur bei deutscher Locale, gebündelte `.mo`
passend zur `.po`, Kalendersprache je Locale.
- E2E (`admin-workflow.spec.js`): Das deutsche Formular zeigt „Noch keine Einträge vorhanden.“,
„Distribution hinzufügen“, „Datum wählen“ und deutsche Wochentage im Kalender, aber keinen der
englischen Texte.

---

## [2.47.4] — 2026-11-06

### 🔧 Changed
Expand Down
26 changes: 22 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ open-data-wizard/
│ ├── class-samples.php # Beispieldaten laden/entfernen (_odw_sample), nie im Endpunkt
│ ├── class-post-types.php # CPT: odw_dataset
│ ├── class-fields.php # Carbon Fields Formular (5 Tabs)
│ ├── class-carbon-fields-l10n.php # Deutsche UI-Texte für Carbon Fields (Filter carbon_fields_config)
│ ├── class-validation.php # Publishing-Validation
│ ├── class-quality.php # Qualitäts-Scoring (0-100)
│ ├── class-admin.php # Admin UI, Spalten, Intro-Seite
Expand All @@ -113,7 +114,8 @@ open-data-wizard/
│ │ ├── odw-catalog.js # Katalog: Schlagwort-Aufklappfeld, Einklappen auf dem Handy
│ │ ├── wizard-tabs.js # Tab-Navigation mit SessionStorage
│ │ ├── odw-admin-fields.js # Field-Initialization, Autosuggest
│ │ └── odw-file-upload.js # File-Upload Handler (wp.media)
│ │ ├── odw-file-upload.js # File-Upload Handler (wp.media)
│ │ └── odw-carbon-fields-l10n.js # Feste react-select-Texte der Mehrfachauswahl („Select...")
│ └── images/ # Icons, Logos
├── config/
│ ├── phpcs.xml # WordPress Coding Standards
Expand Down Expand Up @@ -145,6 +147,7 @@ open-data-wizard/
│ ├── test-rest-delta.php # REST: Delta, Content Negotiation, Ausschlüsse (Beispiele, Passwort)
│ ├── test-batch-import.php # Batch-Import: Parsing, Spalten, Vokabulare, Beispieldateien
│ ├── test-samples.php # Beispieldaten: Laden/Entfernen/Übernehmen, Demo-Migration
│ ├── test-carbon-fields-l10n.php # Carbon-Fields-UI auf Deutsch: Locale-Daten, gebündelte .mo
│ ├── test-cli.php # CLI Commands Tests
│ ├── test-validation.php, test-rdf.php, test-vocabulary.php, test-registry-schema.php,
│ │ test-field-catalog.php, test-shacl-shapes.php
Expand All @@ -155,7 +158,8 @@ open-data-wizard/
├── languages/
│ ├── open-data-wizard.pot # i18n Translation Template
│ ├── open-data-wizard-en_US.po # Englische Übersetzung (Quelle)
│ └── open-data-wizard-en_US.mo # Englische Übersetzung (kompiliert)
│ ├── open-data-wizard-en_US.mo # Englische Übersetzung (kompiliert)
│ └── carbon-fields-ui-de_DE.po/.mo # Deutsche Texte der Carbon-Fields-Oberfläche
├── README.md # User-facing Dokumentation (DE) + Doku-Navigation
├── DOCUMENTATION.md # Technische Dokumentation (Architektur, REST-API, CLI …)
├── TECHNICAL-SPEC.md # Technische Spezifikationen + DCAT-AP-Roadmap/Umsetzungsstand
Expand Down Expand Up @@ -194,6 +198,7 @@ Externe Harvester rufen /catalog, /datasets/<id>, oder /delta ab
| **ODW_Samples** | Beispieldaten aus `samples/import-example.json` laden/entfernen/übernehmen; Kennzeichen `_odw_sample` hält sie aus `/catalog`, `/datasets`, `/delta` heraus und im Frontend-Katalog nur für die Redaktion sichtbar (oder `show_demo="1"`) | `load()`, `remove()`, `adopt()`, `is_sample()`, `exclude_clause()` |
| **ODW_Post_Types** | CPT Registrierung mit Capabilities | `register()` |
| **ODW_Fields** | Carbon Fields Formular (5 Tabs) + JSON-LD Builder | `register_required_fields()`, `odw_build_dataset_jsonld()` |
| **ODW_Carbon_Fields_L10n** | Deutsche Texte der Carbon-Fields-Oberfläche (Domain `carbon-fields-ui`): lädt `languages/carbon-fields-ui-de_DE.mo` für alle `de*`-Locales und baut `cf.config.locale` nach msgid geschlüsselt neu auf (Carbon Fields scheitert daran seit WP 6.5) | `filter_config()`, `locale_data()`, `is_german_locale()` |
| **ODW_Validation** | Publish-Blocking bei fehlenden Pflichtfeldern | `intercept_publish()`, `validate()` |
| **ODW_Quality** | Qualitäts-Scoring & Caching | `calculate()`, `get_level()` |
| **ODW_Admin** | Admin UI (Spalten, Intro-Seite, Datei-Upload-Widget in Tab 3) | `register_introduction_page()`, `render_column()`, `file_upload_html()`, `save_file_attachment()` |
Expand Down Expand Up @@ -454,6 +459,17 @@ esc_attr__( 'Attribute Text', 'open-data-wizard' )
- **English**: `languages/open-data-wizard-en_US.po` / `.mo` — overrides the German
source strings on `en_US` installs (rund 750 Einträge)
- Loaded via `load_plugin_textdomain()` on `init` hook

**Carbon-Fields-Oberfläche (`carbon-fields-ui`).** Bedienelemente wie „Add %s", „There are no
entries yet.", „Select Date" stammen aus Carbon Fields, nicht aus dem Plugin. Carbon Fields
bringt dafür kein Deutsch mit und reicht seine Übersetzungen nicht über
`wp_set_script_translations()`, sondern über den Filter `carbon_fields_config`
(`cf.config.locale` → `setLocaleData()`) an die Oberfläche. `ODW_Carbon_Fields_L10n` setzt dort
an; die Übersetzung liegt in `languages/carbon-fields-ui-de_DE.po` (nach Änderungen mit
`bin/compile-mo.py` neu kompilieren), **nie in `vendor/`**. Platzhalter „Select..." und
„No options" der Mehrfachauswahl sind feste react-select-Texte und werden von
`assets/js/odw-carbon-fields-l10n.js` getauscht. Nach einem Carbon-Fields-Update prüfen, ob neue
`__( '…', 'carbon-fields-ui' )`-Aufrufe dazugekommen sind.
- The `.mo` is generated without gettext tooling; if strings change, regenerate
the `.po`/`.mo` (see the generator approach in the v2.3.0 PR)

Expand Down Expand Up @@ -828,7 +844,7 @@ Update **both** locations:
- MINOR: New features (backward-compatible)
- PATCH: Bug fixes only

Current: **v2.47.4**
Current: **v2.47.5**

---

Expand Down Expand Up @@ -882,6 +898,8 @@ Neue technische Festlegungen gehören dorthin, nicht in README oder CLAUDE.md.
- **Beispieldaten statt Demo-Datensatz (v2.47.0):** leerer Start, Laden/Entfernen per Klick oder
WP-CLI, nie in einem Harvest-Endpunkt, im Frontend nur für die Redaktion.
- **Nur öffentliche Datensätze in den Endpunkten, CI mit Leserechten (v2.47.1).**
- **Carbon-Fields-Bedienelemente auf Deutsch (v2.47.5):** gebündelte `carbon-fields-ui`-Übersetzung
und korrekt geschlüsselte Locale-Daten (siehe Internationalisierung).

### ☐ Noch offen / geplant

Expand Down Expand Up @@ -981,6 +999,6 @@ Neue technische Festlegungen gehören dorthin, nicht in README oder CLAUDE.md.

---

**Zuletzt aktualisiert**: Version 2.47.4 (November 2026)
**Zuletzt aktualisiert**: Version 2.47.5 (November 2026)
**Autor**: Open Data Wizard Team (nozilla)
**License**: GPL-2.0-or-later
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<p align="center">
<img src="https://img.shields.io/github/license/daimpad/OpenDataWizard?style=flat-square&color=03FF9A&labelColor=101010&label=Lizenz" alt="Lizenz">
<img src="https://img.shields.io/badge/Version-2.47.4-03FF9A?style=flat-square&labelColor=101010" alt="Version">
<img src="https://img.shields.io/badge/Version-2.47.5-03FF9A?style=flat-square&labelColor=101010" alt="Version">
<img src="https://img.shields.io/badge/DCAT--AP-3.0-03FF9A?style=flat-square&labelColor=101010" alt="DCAT-AP 3.0">
<img src="https://img.shields.io/badge/PHP-%3E%3D%208.1-03FF9A?style=flat-square&labelColor=101010&logo=php&logoColor=white" alt="PHP >= 8.1">
<img src="https://img.shields.io/badge/WordPress-6.4%2B-03FF9A?style=flat-square&labelColor=101010&logo=wordpress&logoColor=white" alt="WordPress 6.4+">
Expand Down
59 changes: 59 additions & 0 deletions assets/js/odw-carbon-fields-l10n.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/* global odwCarbonFieldsL10n */
/**
* Open Data Wizard — Texte der Mehrfachauswahl, die keine Übersetzung erreicht.
*
* Die Mehrfachauswahl von Carbon Fields (Themen, Engagementfelder) baut auf
* react-select auf. Dessen Platzhalter „Select..." und die Meldung
* „No options" im Aufklappmenü sind Vorgaben der Bibliothek; Carbon Fields
* reicht dafür keine Eigenschaft durch, und sie laufen durch keine Textdomain.
* Alle übrigen Carbon-Fields-Texte kommen regulär über die Übersetzung
* (siehe includes/class-carbon-fields-l10n.php) und werden hier nicht angefasst.
*
* Getauscht wird nur Text, der exakt dem englischen Original entspricht, und
* nur in den Elementen mit dem Klassenpräfix `cf-multiselect`, das Carbon
* Fields an react-select übergibt. React schreibt diesen Text nicht erneut,
* solange er sich nicht ändert; erscheint das Element neu (Menü öffnen,
* Auswahl leeren), fängt der MutationObserver es wieder ab.
*/
( function () {
'use strict';

var map = ( typeof odwCarbonFieldsL10n !== 'undefined' && odwCarbonFieldsL10n.reactSelect ) || {};

var SELECTOR = '.cf-multiselect__placeholder, .cf-multiselect__menu-notice';

function localize( el ) {
var text = el.textContent;
if ( Object.prototype.hasOwnProperty.call( map, text ) && map[ text ] && map[ text ] !== text ) {
el.textContent = map[ text ];
}
}

function scan( root ) {
if ( ! root || root.nodeType !== 1 ) {
return;
}
if ( root.matches( SELECTOR ) ) {
localize( root );
}
root.querySelectorAll( SELECTOR ).forEach( localize );
}

function start() {
if ( Object.keys( map ).length === 0 ) {
return;
}
scan( document.body );
new MutationObserver( function ( mutations ) {
mutations.forEach( function ( mutation ) {
mutation.addedNodes.forEach( scan );
} );
} ).observe( document.body, { childList: true, subtree: true } );
}

if ( document.readyState === 'loading' ) {
document.addEventListener( 'DOMContentLoaded', start );
} else {
start();
}
} )();
13 changes: 8 additions & 5 deletions assets/js/odw-datepicker-de.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,14 @@
* Open Data Wizard — German localization for the Carbon Fields date picker (flatpickr).
*
* Registers the German locale on the global flatpickr instance and re-localizes
* any pickers that were already initialised, so month names, weekday names and
* the "Select Date" placeholder appear in German.
* any pickers that were already initialised, so month and weekday names appear
* in German. Enqueued for German locales only (ODW_Admin::enqueue_assets());
* the date fields pick their calendar locale to match
* (ODW_Fields::date_picker_options()).
*
* The "Select Date" button is not handled here: it is a regular Carbon Fields
* UI string and comes from languages/carbon-fields-ui-de_DE.mo via
* ODW_Carbon_Fields_L10n.
*/
( function () {
'use strict';
Expand Down Expand Up @@ -57,9 +63,6 @@
if ( input._flatpickr ) {
input._flatpickr.set( 'locale', German );
}
if ( input.placeholder === 'Select Date' || input.placeholder === 'Select date' ) {
input.placeholder = 'Datum wählen…';
}
} );
}

Expand Down
24 changes: 22 additions & 2 deletions includes/class-admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -453,13 +453,33 @@ public static function enqueue_assets( string $hook ): void {
)
);

// Deutsche Monats- und Wochentagsnamen für den Kalender nur bei
// deutscher Oberfläche; die Datumsfelder wählen ihre Kalendersprache
// passend dazu (ODW_Fields::date_picker_options()).
if ( ODW_Carbon_Fields_L10n::is_german_locale() ) {
wp_enqueue_script(
'odw-datepicker-de',
ODW_PLUGIN_URL . 'assets/js/odw-datepicker-de.js',
array(),
ODW_VERSION,
true
);
}

// Platzhalter und Leermeldung der Mehrfachauswahl (react-select).
// Die übrigen Carbon-Fields-Texte kommen über ODW_Carbon_Fields_L10n.
wp_enqueue_script(
'odw-datepicker-de',
ODW_PLUGIN_URL . 'assets/js/odw-datepicker-de.js',
'odw-carbon-fields-l10n',
ODW_PLUGIN_URL . 'assets/js/odw-carbon-fields-l10n.js',
array(),
ODW_VERSION,
true
);
wp_localize_script(
'odw-carbon-fields-l10n',
'odwCarbonFieldsL10n',
array( 'reactSelect' => ODW_Carbon_Fields_L10n::react_select_strings() )
);

global $post;
$file_id = $post ? (int) get_post_meta( $post->ID, '_odw_file_id', true ) : 0;
Expand Down
Loading
Loading