From 0e8d2d10971b5e3963d891148088f0da3a20935c Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Jul 2026 14:31:09 +0000 Subject: [PATCH] feat: Redesign the [odw_dataset] download card (v2.18.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New layout for the frontend shortcode card: - Large dataset name; a "Metadaten JSON" link (top-right) downloads the JSON-LD - Prominent download button (downloadURL → media file → accessURL) - Colorful small badges: file format · file size · license - Collapsible accordion ("Alle Metadaten anzeigen") listing every populated metadata field (publisher, description, theme, CESSDA, language, keywords, URLs, format, time period, contact, …) Frontend CSS reworked accordingly; 18 new UI strings translated in en_US. Version 2.18.0. Tests: 151 pass, PHPStan clean, PHPCS exit 0. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq --- CHANGELOG.md | 12 ++ README.md | 2 +- assets/css/frontend.css | 195 ++++++++++----------- includes/class-shortcode.php | 254 ++++++++++++++++++++-------- languages/open-data-wizard-en_US.mo | Bin 49479 -> 50270 bytes languages/open-data-wizard-en_US.po | 54 ++++++ open-data-wizard.php | 4 +- 7 files changed, 349 insertions(+), 172 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7992ff6..b21fcc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/spec/v2.0.0.ht --- +## [2.18.0] — 2026-07-09 + +### 💅 Changed — Download-Card (`[odw_dataset]`) neu gestaltet +- **Datensatzname groß** oben, rechts daneben ein Link **„Metadaten JSON"** (lädt das JSON-LD herunter). +- Prominenter **Download-Button** zur bereitgestellten Datei (Download-URL → Mediathek-Datei → Zugriffs-URL). +- Darunter **bunte Badges** in kleiner Schrift: **Dateiformat · Dateigröße · Lizenz**. +- **Aufklappbares Accordion** („Alle Metadaten anzeigen") mit **allen angegebenen Metadatenfeldern** + (Herausgeber, Beschreibung, Thema, CESSDA, Sprache, Schlagworte, URLs, Format, Zeitraum, Kontakt u. v. m.). +- Frontend-CSS entsprechend überarbeitet; 18 neue UI-Strings in `en_US` übersetzt. + +--- + ## [2.17.0] — 2026-07-09 ### ✨ Added diff --git a/README.md b/README.md index 16cfd90..3483be4 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.17.0-brightgreen?style=flat-square) +![Version](https://img.shields.io/badge/Version-2.18.0-brightgreen?style=flat-square) ![PRs Welcome](https://img.shields.io/badge/PRs-willkommen-brightgreen?style=flat-square) 📖 [Dokumentation](DOCUMENTATION.md) · 📐 [Technische Spezifikation](TECHNICAL-SPEC.md) · 📝 [Changelog](CHANGELOG.md) · 🛡️ [Security](SECURITY.md) · ⚖️ [Lizenz](LICENSE) diff --git a/assets/css/frontend.css b/assets/css/frontend.css index 46add5b..036aa55 100644 --- a/assets/css/frontend.css +++ b/assets/css/frontend.css @@ -1,161 +1,166 @@ /** * Open Data Wizard — Frontend Styles (Download-Card) * - * Nur strukturelle Styles (Abstände, Layout, Rahmen). - * Farben und Schriften werden vom aktiven Theme geerbt. + * Aufbau: Name groß + „Metadaten JSON" rechts · Download-Button · bunte Badges + * (Format/Größe/Lizenz) · Accordion mit allen Metadatenfeldern. + * + * Struktur erbt Theme-Farben (currentColor); die Badges und der Download-Button + * verwenden bewusst eigene Akzentfarben, damit sie „bunt" hervorstechen. */ -/* ========================================================================= - Download-Card - ========================================================================= */ - .odw-download-card { - border: 1px solid currentColor; - border-radius: 4px; - padding: 1.25rem; + border: 1px solid rgba(128, 128, 128, 0.35); + border-radius: 8px; + padding: 1.25rem 1.4rem; margin: 1.5rem 0; - opacity: 0.99; /* Stacking context für border-color inherit */ } -/* Header: Titel + Thema-Badge nebeneinander */ -.odw-download-card__header { +/* --- Kopf: Titel groß + Metadaten-JSON-Link rechts --- */ +.odw-download-card__top { display: flex; flex-wrap: wrap; - align-items: flex-start; + align-items: baseline; justify-content: space-between; - gap: 0.5rem 0.75rem; - margin-bottom: 0.875rem; + gap: 0.4rem 1rem; + margin-bottom: 1rem; } .odw-download-card__title { margin: 0; - font-size: 1.1em; - font-weight: 600; - line-height: 1.3; + font-size: 1.6em; + font-weight: 700; + line-height: 1.25; flex: 1 1 auto; } -.odw-download-card__theme { +.odw-download-card__metajson { flex-shrink: 0; - display: inline-block; - padding: 0.2em 0.65em; - border: 1px solid currentColor; - border-radius: 99px; - font-size: 0.8em; - opacity: 0.65; + font-size: 0.82em; + text-decoration: none; + opacity: 0.75; white-space: nowrap; } -/* Metadaten-Liste */ -.odw-download-card__meta { - display: grid; - grid-template-columns: max-content 1fr; - gap: 0.3rem 1rem; - margin: 0 0 1rem; - padding: 0; - font-size: 0.9em; -} - -.odw-download-card__meta-row { - display: contents; +.odw-download-card__metajson:hover { + opacity: 1; + text-decoration: underline; } -.odw-download-card__meta dt { - font-weight: 500; - opacity: 0.65; +/* --- Download-Button (Akzent) --- */ +.odw-download-card__download { + display: inline-block; + padding: 0.6em 1.4em; + background: #2563eb; + color: #fff; + border-radius: 6px; + font-weight: 600; + font-size: 1em; + text-decoration: none; + line-height: 1.3; + transition: background 0.15s ease; } -.odw-download-card__meta dd { - margin: 0; +.odw-download-card__download:hover, +.odw-download-card__download:focus { + background: #1d4ed8; + color: #fff; } -/* Footer: Download-Button + Datei-Info */ -.odw-download-card__footer { +/* --- Bunte Badges: Format · Größe · Lizenz --- */ +.odw-download-card__badges { display: flex; flex-wrap: wrap; - align-items: center; - gap: 0.625rem; - padding-top: 0.875rem; - border-top: 1px solid currentColor; - opacity: inherit; + gap: 0.4rem; + margin: 0.9rem 0 0; } -.odw-download-card__button { +.odw-badge { display: inline-block; - padding: 0.45em 1.1em; - border: 1px solid currentColor; - border-radius: 3px; + padding: 0.2em 0.7em; + border-radius: 99px; + font-size: 0.78em; font-weight: 600; - font-size: 0.9em; - text-decoration: none; - line-height: 1.4; + line-height: 1.5; } -.odw-download-card__button:hover { - opacity: 0.8; -} +.odw-badge--format { background: #e7f0fd; color: #1c4e80; } +.odw-badge--size { background: #e6f4ea; color: #1a7f37; } +.odw-badge--license { background: #fdf3e2; color: #8a5a00; } -.odw-download-card__file-info { - font-size: 0.85em; - opacity: 0.65; +/* --- Accordion mit allen Metadatenfeldern --- */ +.odw-download-card__details { + margin-top: 1.1rem; + border-top: 1px solid rgba(128, 128, 128, 0.25); + padding-top: 0.75rem; } -.odw-download-card__button--meta { - margin-left: auto; - font-weight: normal; - opacity: 0.75; - font-size: 0.85em; +.odw-download-card__details summary { + cursor: pointer; + font-size: 0.9em; + font-weight: 600; + opacity: 0.85; + list-style-position: inside; } -.odw-download-card__button--meta:hover { +.odw-download-card__details summary:hover { opacity: 1; } -/* Keywords */ -.odw-download-card__keywords { - display: flex; - flex-wrap: wrap; - gap: 0.35rem; - margin-bottom: 1rem; +.odw-download-card__details[open] summary { + margin-bottom: 0.75rem; } -.odw-download-card__keyword { - display: inline-block; - padding: 0.15em 0.6em; - border: 1px solid currentColor; - border-radius: 99px; - font-size: 0.8em; +.odw-download-card__metalist { + display: grid; + grid-template-columns: max-content 1fr; + gap: 0.45rem 1.1rem; + margin: 0; + font-size: 0.9em; +} + +.odw-metarow { + display: contents; +} + +.odw-download-card__metalist dt { + font-weight: 600; opacity: 0.6; } +.odw-download-card__metalist dd { + margin: 0; + word-break: break-word; +} + +.odw-download-card__metalist a { + word-break: break-all; +} + /* ========================================================================= Responsive ========================================================================= */ @media screen and (max-width: 480px) { - .odw-download-card__header { - flex-direction: column; - } - - .odw-download-card__meta { - grid-template-columns: 1fr; - gap: 0; + .odw-download-card__title { + font-size: 1.35em; } - .odw-download-card__meta-row { + .odw-download-card__download { display: block; - margin-bottom: 0.4rem; + text-align: center; } - .odw-download-card__meta dt { - display: inline; + .odw-download-card__metalist { + grid-template-columns: 1fr; + gap: 0; } - .odw-download-card__meta dt::after { - content: ': '; + .odw-metarow { + display: block; + margin-bottom: 0.5rem; } - .odw-download-card__meta dd { - display: inline; + .odw-download-card__metalist dt { + display: block; } } diff --git a/includes/class-shortcode.php b/includes/class-shortcode.php index a43150d..5fb30cc 100644 --- a/includes/class-shortcode.php +++ b/includes/class-shortcode.php @@ -2,15 +2,15 @@ /** * Shortcode [odw_dataset id="…"] — Download-Card für Frontend * - * Liest Metadaten direkt via get_post_meta(); keine Carbon Fields Abhängigkeit. + * Liest Metadaten via Carbon Fields / get_post_meta(); keine harte CF-Abhängigkeit. * - * Datei-Metadaten (_odw_file_size, _odw_file_format) werden seit v1.8.0 beim - * Speichern vorberechnet (ODW_Admin::save_file_attachment) und hier direkt - * gelesen. Für ältere Datensätze ohne diese Meta-Einträge greift ein Fallback - * auf filesize()/pathinfo() zur Laufzeit. + * Aufbau der Karte (v2.18.0): + * 1. Datensatzname (groß) + Link „Metadaten JSON" (rechts) + * 2. Download-Button zur bereitgestellten Datei + * 3. Bunte Badges: Dateiformat · Dateigröße · Lizenz + * 4. Aufklappbares Accordion mit allen angegebenen Metadatenfeldern * - * CSS wird lazy per wp_register_style / wp_enqueue_style eingebunden: - * assets/css/frontend.css wird nur auf Seiten geladen, die den Shortcode rendern. + * CSS wird lazy eingebunden: assets/css/frontend.css nur auf Seiten mit Shortcode. * * @package OpenDataWizard */ @@ -37,8 +37,7 @@ public static function init(): void { } /** - * Nur registrieren — tatsächlich eingebunden wird erst beim Rendern, - * damit CSS nur auf Seiten geladen wird, die den Shortcode verwenden. + * Nur registrieren — tatsächlich eingebunden wird erst beim Rendern. */ public static function register_assets(): void { wp_register_style( @@ -49,6 +48,20 @@ public static function register_assets(): void { ); } + /** + * Reads a Carbon Fields value with a get_post_meta fallback. + * + * @param int $post_id Post ID. + * @param string $key Carbon field key (e.g. 'odw_publisher'). + * @return string + */ + private static function meta( int $post_id, string $key ): string { + if ( function_exists( 'carbon_get_post_meta' ) ) { + return trim( (string) carbon_get_post_meta( $post_id, $key ) ); + } + return trim( (string) get_post_meta( $post_id, '_' . $key, true ) ); + } + /** * Shortcode-Handler — gibt HTML zurück, kein direktes echo. * @@ -71,27 +84,22 @@ public static function render( $atts ): string { wp_enqueue_style( 'odw-frontend' ); - // --- Metadaten --- - $title = get_the_title( $post ); - $theme = (string) get_post_meta( $post_id, '_odw_theme', true ); - $file_id = (int) get_post_meta( $post_id, '_odw_file_id', true ); + $title = get_the_title( $post ); - // License from post meta. + // --- License label --- $license_label = ''; - if ( function_exists( 'carbon_get_post_meta' ) ) { - $license_uri = (string) carbon_get_post_meta( $post_id, 'odw_license' ); - if ( 'sonstige' === $license_uri ) { - $license_label = (string) carbon_get_post_meta( $post_id, 'odw_license_custom' ); - } elseif ( '' !== $license_uri ) { - $license_label = ODW_Fields::get_license_label( $license_uri ); + $license_uri = self::meta( $post_id, 'odw_license' ); + if ( 'sonstige' === $license_uri ) { + $license_label = self::meta( $post_id, 'odw_license_custom' ); + if ( class_exists( 'ODW_Fields' ) && '' !== $license_label ) { + $license_label = ODW_Fields::get_license_label( $license_label ); } + } elseif ( '' !== $license_uri && class_exists( 'ODW_Fields' ) ) { + $license_label = ODW_Fields::get_license_label( $license_uri ); } - // Keywords: newline-separated string → array of trimmed, non-empty values. - $keywords_raw = (string) get_post_meta( $post_id, '_odw_keywords', true ); - $keywords = array_filter( array_map( 'trim', explode( "\n", $keywords_raw ) ) ); - - // --- Datei-Informationen aus der Mediathek --- + // --- File (media library) --- + $file_id = (int) get_post_meta( $post_id, '_odw_file_id', true ); $file_url = ''; $file_size = ''; $file_format = ''; @@ -99,9 +107,7 @@ public static function render( $atts ): string { if ( $file_id > 0 ) { $url = wp_get_attachment_url( $file_id ); if ( $url ) { - $file_url = $url; - - // Use pre-computed meta (set on save) — fall back to runtime on old entries. + $file_url = $url; $stored_format = (string) get_post_meta( $post_id, '_odw_file_format', true ); $file_format = $stored_format ? $stored_format : strtoupper( (string) pathinfo( $url, PATHINFO_EXTENSION ) ); @@ -117,72 +123,172 @@ public static function render( $atts ): string { } } + // Format from the form takes precedence over the derived file extension. + $form_format = self::meta( $post_id, 'odw_format' ); + if ( '' !== $form_format ) { + $file_format = $form_format; + } + + // byteSize from the form when no media-library size is available. + if ( '' === $file_size ) { + $byte_size = (int) self::meta( $post_id, 'odw_byte_size' ); + if ( $byte_size > 0 ) { + $file_size = self::format_bytes( $byte_size ); + } + } + + // --- Download target: downloadURL → media file → accessURL --- + $download_url = self::meta( $post_id, 'odw_download_url' ); + if ( '' === $download_url ) { + $download_url = '' !== $file_url ? $file_url : self::meta( $post_id, 'odw_access_url' ); + } + $metadata_url = rest_url( 'datenatlas/v1/datasets/' . $post_id ); + $meta_rows = self::collect_metadata_rows( $post_id, $license_label, $file_size ); - // --- HTML aufbauen --- + // --- HTML --- ob_start(); ?>
-
-

- - - + - -
-
-
-
-
-
+ + + + - -
- - + +
+ +
- + +
+ +
+ +
+
+
+ %s', + esc_url( $row['value'] ), + esc_html( $row['value'] ) + ); + } else { + echo nl2br( esc_html( $row['value'] ) ); + } + ?> +
+
+ +
+
+
+ */ + private static function collect_metadata_rows( int $post_id, string $license_label, string $file_size ): array { + $rows = array(); + + $add = static function ( string $label, string $value, bool $url = false ) use ( &$rows ): void { + if ( '' !== trim( $value ) ) { + $rows[] = array( + 'label' => $label, + 'value' => trim( $value ), + 'url' => $url, + ); + } + }; + + $add( __( 'Herausgeber', 'open-data-wizard' ), self::meta( $post_id, 'odw_publisher' ) ); + $add( __( 'Beschreibung', 'open-data-wizard' ), self::meta( $post_id, 'odw_description' ) ); + $add( __( 'Thema', 'open-data-wizard' ), self::meta( $post_id, 'odw_theme' ) ); + $add( __( 'CESSDA-Themenfeld', 'open-data-wizard' ), self::meta( $post_id, 'odw_cessda_topic' ), true ); + $add( __( 'Sprache', 'open-data-wizard' ), self::meta( $post_id, 'odw_language' ), true ); + + $keywords = array_filter( array_map( 'trim', explode( "\n", self::meta( $post_id, 'odw_keywords' ) ) ) ); + $add( __( 'Schlagworte', 'open-data-wizard' ), implode( ', ', $keywords ) ); + + $add( __( 'Zugriffs-URL', 'open-data-wizard' ), self::meta( $post_id, 'odw_access_url' ), true ); + $add( __( 'Download-URL', 'open-data-wizard' ), self::meta( $post_id, 'odw_download_url' ), true ); + $add( __( 'Format', 'open-data-wizard' ), self::meta( $post_id, 'odw_format' ) ); + $add( __( 'Media-Type', 'open-data-wizard' ), self::meta( $post_id, 'odw_media_type' ), true ); + $add( __( 'Dateigröße', 'open-data-wizard' ), $file_size ); + $add( __( 'Lizenz', 'open-data-wizard' ), $license_label ); + $add( __( 'Namensnennung', 'open-data-wizard' ), self::meta( $post_id, 'odw_attribution_text' ) ); + $add( __( 'Zugriffsrechte', 'open-data-wizard' ), self::meta( $post_id, 'odw_access_rights' ), true ); + + $add( __( 'Räumliche Abdeckung', 'open-data-wizard' ), self::meta( $post_id, 'odw_spatial' ) ); + + $t_start = self::meta( $post_id, 'odw_temporal_start' ); + $t_end = self::meta( $post_id, 'odw_temporal_end' ); + if ( '' !== $t_start || '' !== $t_end ) { + $add( __( 'Zeitraum', 'open-data-wizard' ), trim( $t_start . ' – ' . $t_end, ' –' ) ); + } + + $add( __( 'Veröffentlicht', 'open-data-wizard' ), self::meta( $post_id, 'odw_issued' ) ); + $add( __( 'Aktualisiert', 'open-data-wizard' ), self::meta( $post_id, 'odw_modified' ) ); + $add( __( 'Projektseite', 'open-data-wizard' ), self::meta( $post_id, 'odw_landing_page' ), true ); + $add( __( 'Aktualisierungsfrequenz', 'open-data-wizard' ), self::meta( $post_id, 'odw_accrual_periodicity' ), true ); + $add( __( 'Urheber', 'open-data-wizard' ), self::meta( $post_id, 'odw_originator_name' ) ); + $add( __( 'Pflegende Stelle', 'open-data-wizard' ), self::meta( $post_id, 'odw_maintainer_name' ) ); + + $contact = array_filter( + array( + self::meta( $post_id, 'odw_contact_name' ), + self::meta( $post_id, 'odw_contact_email' ), + ) + ); + $add( __( 'Kontakt', 'open-data-wizard' ), implode( ' · ', $contact ) ); + $add( __( 'Kontakt-Website', 'open-data-wizard' ), self::meta( $post_id, 'odw_contact_url' ), true ); + + return $rows; + } + /** * Formatiert eine Byte-Anzahl als lesbare Größenangabe (B / KB / MB / GB). * diff --git a/languages/open-data-wizard-en_US.mo b/languages/open-data-wizard-en_US.mo index 83e16473a79b9c7d543bfbc04c88d83c55632da0..8bc337a684a490890425d540417a857780dac2b6 100644 GIT binary patch delta 8812 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 diff --git a/languages/open-data-wizard-en_US.po b/languages/open-data-wizard-en_US.po index bce0e5a..796b80e 100644 --- a/languages/open-data-wizard-en_US.po +++ b/languages/open-data-wizard-en_US.po @@ -66,15 +66,24 @@ msgstr "Coverage" msgid "AccessURL erreichbar (dcat:accessURL)" msgstr "AccessURL reachable (dcat:accessURL)" +msgid "Aktualisiert" +msgstr "Updated" + msgid "Aktualisiert sich automatisch, während Sie die Felder ausfüllen — ohne Speichern." msgstr "Updates automatically as you fill in the fields — no saving required." +msgid "Aktualisierungsfrequenz" +msgstr "Update frequency" + msgid "Alle Datensätze" msgstr "All Datasets" msgid "Alle Datensätze, Metadaten und Plugin-Optionen beim Deinstallieren unwiderruflich löschen." msgstr "Irreversibly delete all datasets, metadata and plugin options on uninstall." +msgid "Alle Metadaten anzeigen" +msgstr "Show all metadata" + msgid "Alle Pflichtangaben ausgefüllt" msgstr "All required fields completed" @@ -237,6 +246,9 @@ msgstr "CESSDA Topic Classification" msgid "CESSDA-THEMENKLASSIFIKATION (dct:subject)" msgstr "CESSDA TOPIC CLASSIFICATION (dct:subject)" +msgid "CESSDA-Themenfeld" +msgstr "CESSDA topic" + msgid "CONTRIBUTOR-ID (dcatde:contributorID)" msgstr "CONTRIBUTOR ID (dcatde:contributorID)" @@ -291,6 +303,9 @@ msgstr "Select / upload file" msgid "Datei auswählen oder hochladen" msgstr "Select or upload file" +msgid "Datei herunterladen" +msgstr "Download file" + msgid "Datei hochladen" msgstr "Upload file" @@ -423,6 +438,9 @@ msgstr "Distribution — advanced" msgid "Download-Datei (Mediathek)" msgstr "Download file (media library)" +msgid "Download-URL" +msgstr "Download URL" + msgid "Download-URL, Format, Dateigröße, Lizenz und Zuschreibungstext." msgstr "Download URL, format, file size, license and attribution text." @@ -765,6 +783,9 @@ msgstr "Click to select" msgid "Kontakt" msgstr "Contact" +msgid "Kontakt-Website" +msgstr "Contact website" + msgid "Kontaktpunkt (dcat:contactPoint)" msgstr "Contact point (dcat:contactPoint)" @@ -840,12 +861,18 @@ msgstr "Maximum of %d datasets reached — further elements were ignored." msgid "Maximale Anzahl von %d Datensätzen erreicht — weitere Zeilen wurden ignoriert." msgstr "Maximum of %d datasets reached — further rows were ignored." +msgid "Media-Type" +msgstr "Media type" + msgid "Media-Type gesetzt (dcat:mediaType)" msgstr "Media type set (dcat:mediaType)" msgid "Metadaten (JSON-LD)" msgstr "Metadata (JSON-LD)" +msgid "Metadaten JSON" +msgstr "Metadata JSON" + msgid "Metadaten des Datenkatalogs — erscheinen in der REST-API-Antwort des Catalog-Endpoints." msgstr "Metadata of the data catalog — appears in the REST API response of the catalog endpoint." @@ -879,6 +906,9 @@ msgstr "Name of the publishing organization" msgid "Name oder Organisation der Ansprechperson." msgstr "Name or organization of the contact person." +msgid "Namensnennung" +msgstr "Attribution" + msgid "Nein" msgstr "No" @@ -957,12 +987,18 @@ msgstr "Pagination" msgid "Perfekt" msgstr "Perfect" +msgid "Pflegende Stelle" +msgstr "Maintainer" + msgid "Pflichtangaben" msgstr "Required information" msgid "Pflichtfelder" msgstr "Required fields" +msgid "Projektseite" +msgstr "Project page" + msgid "Projektseite & Aktualität" msgstr "Project page & timeliness" @@ -1020,6 +1056,9 @@ msgstr "Regions & Cities" msgid "RÄUMLICHE AUFLÖSUNG IN METERN (dcat:spatialResolutionInMeters)" msgstr "SPATIAL RESOLUTION IN METERS (dcat:spatialResolutionInMeters)" +msgid "Räumliche Abdeckung" +msgstr "Spatial coverage" + msgid "Räumliche Abdeckung (dct:spatial)" msgstr "Spatial coverage (dct:spatial)" @@ -1029,6 +1068,9 @@ msgstr "KEYWORDS (dcat:keyword)" msgid "SPRACHE (dct:language)" msgstr "LANGUAGE (dct:language)" +msgid "Schlagworte" +msgstr "Keywords" + msgid "Schlagworte (dcat:keyword)" msgstr "Keywords (dcat:keyword)" @@ -1056,6 +1098,9 @@ msgstr "Save the dataset to update the preview." msgid "Speichern Sie den Datensatz, um sie zu aktualisieren." msgstr "Save the dataset to update it." +msgid "Sprache" +msgstr "Language" + msgid "Sprache (dct:language)" msgstr "Language (dct:language)" @@ -1179,6 +1224,9 @@ msgstr "Under which license are these data available?" msgid "Unternehmen und Eigentümerschaft von Unternehmen" msgstr "Companies and company ownership" +msgid "Urheber" +msgstr "Originator" + msgid "VERSION (owl:versionInfo)" msgstr "VERSION (owl:versionInfo)" @@ -1413,6 +1461,9 @@ msgstr "Row %d: column count does not match." msgid "Zeitliche Abdeckung (dct:temporal)" msgstr "Temporal coverage (dct:temporal)" +msgid "Zeitraum" +msgstr "Time period" + msgid "Zu diesem Datensatz hochgeladen" msgstr "Uploaded to this dataset" @@ -1431,6 +1482,9 @@ msgstr "Access classification of the dataset. Example: Public, Restricted, Non-p msgid "Zugriffs-URL" msgstr "Access URL" +msgid "Zugriffsrechte" +msgstr "Access rights" + msgid "Zugriffsrechte aus Vokabular" msgstr "Access rights from vocabulary" diff --git a/open-data-wizard.php b/open-data-wizard.php index 9c39374..d8332ae 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.17.0 + * Version: 2.18.0 * Requires at least: 6.4 * Requires PHP: 8.1 * Author: nozilla @@ -26,7 +26,7 @@ exit; } -define( 'ODW_VERSION', '2.17.0' ); +define( 'ODW_VERSION', '2.18.0' ); define( 'ODW_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'ODW_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'ODW_PLUGIN_FILE', __FILE__ );