diff --git a/CHANGELOG.md b/CHANGELOG.md index c463668..df03204 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.4] - 2026-01-23 + +### Added + +- Current version display on single product pages for licensed products +- Version number shown directly under the product title +- Frontend CSS styling for version badge with monospace font + +### Technical Details + +- Added `displayCurrentVersion()` method to `LicensedProductType` class +- Hooked to `woocommerce_single_product_summary` at priority 6 (after title) +- Added `enqueueFrontendStyles()` to load CSS on product pages +- Uses `LicensedProduct::get_current_version()` to fetch latest version + ## [0.3.3] - 2026-01-22 ### Fixed diff --git a/CLAUDE.md b/CLAUDE.md index d01a294..b9a49eb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -878,3 +878,57 @@ Updated OpenAPI specification to document response signing feature added in v0.2 - Created release package: `releases/wc-licensed-product-0.3.2.zip` (810 KB) - SHA256: `ca33c81516b5dcf4a80b3192d8ae4ad39a7bf67196a1f729b563c5ae01b1d39c` - Tagged as `v0.3.2` and pushed to `main` branch + +### 2026-01-22 - Version 0.3.3 - Bug Fix & License Testing + +**Overview:** + +Fixed version deactivation bug and added license testing functionality. + +**Bug Fix:** + +- Fixed version deactivation button not working in admin product versions table +- Root cause: Parameters in wrong order in `VersionAdminController::ajaxToggleVersion()` +- Changed from `updateVersion($versionId, null, null, !$currentlyActive)` to `updateVersion($versionId, null, !$currentlyActive, null)` + +**Implemented:** + +- Added "Test" action to license overview to validate licenses against `/validate` API endpoint +- Test License modal showing license key, domain, and validation results +- AJAX handler `handleAjaxTestLicense()` for license testing + +**Modified files:** + +- `src/Admin/VersionAdminController.php` - Fixed parameter order in toggle method +- `src/Admin/AdminController.php` - Added Test action to PHP fallback and AJAX handler +- `templates/admin/licenses.html.twig` - Added Test action and modal to Twig template + +**Release v0.3.3:** + +- Created release package: `releases/wc-licensed-product-0.3.3.zip` (795 KB) +- SHA256: `a06d29eabc2da08613ae13874ed152b8ea9363b8284a2e9bdda414e32777558c` +- Tagged as `v0.3.3` and pushed to `main` branch + +### 2026-01-23 - Version 0.3.4 - Frontend Version Display + +**Overview:** + +Added current version display on single product pages for licensed products. + +**Implemented:** + +- Current version displayed directly under the product title +- Styled version badge with monospace font and subtle blue background +- Frontend CSS automatically loaded on licensed product pages + +**Modified files:** + +- `src/Product/LicensedProductType.php` - Added `displayCurrentVersion()` and `enqueueFrontendStyles()` methods +- `assets/css/frontend.css` - Added `.wclp-product-version` styles + +**Technical notes:** + +- Uses `woocommerce_single_product_summary` hook at priority 6 (after title at priority 5) +- Only displays for licensed product type +- Only displays if product has at least one version defined +- Uses `LicensedProduct::get_current_version()` which queries `VersionManager::getLatestVersion()` diff --git a/assets/css/frontend.css b/assets/css/frontend.css index bde49eb..885f7e5 100644 --- a/assets/css/frontend.css +++ b/assets/css/frontend.css @@ -528,3 +528,24 @@ color: #721c24; border: 1px solid #f5c6cb; } + +/* Product Version Display (Single Product Page) */ +.wclp-product-version { + margin: 0.5em 0 1em 0; + font-size: 0.95em; + color: #666; +} + +.wclp-product-version .version-label { + font-weight: 500; + color: #555; +} + +.wclp-product-version .version-number { + font-family: 'SF Mono', Monaco, Consolas, monospace; + background: #e7f3ff; + padding: 0.15em 0.5em; + border-radius: 3px; + color: #2271b1; + font-weight: 500; +} diff --git a/composer.lock b/composer.lock index 220b32f..3f5e60c 100644 --- a/composer.lock +++ b/composer.lock @@ -12,7 +12,7 @@ "source": { "type": "git", "url": "https://src.bundespruefstelle.ch/magdev/wc-licensed-product-client.git", - "reference": "83037ea0c2d9e365cf9ec0ad50251d3ebc7e4782" + "reference": "a3a957914fd6ef74cb479e213d1d3bc0606f496b" }, "require": { "php": "^8.3", @@ -52,7 +52,7 @@ "issues": "https://src.bundespruefstelle.ch/magdev/wc-licensed-product-client/issues", "source": "https://src.bundespruefstelle.ch/magdev/wc-licensed-product-client" }, - "time": "2026-01-22T15:24:57+00:00" + "time": "2026-01-22T20:05:48+00:00" }, { "name": "psr/cache", diff --git a/languages/wc-licensed-product-de_CH.mo b/languages/wc-licensed-product-de_CH.mo index d5a2e65..570e7e1 100644 Binary files a/languages/wc-licensed-product-de_CH.mo and b/languages/wc-licensed-product-de_CH.mo differ diff --git a/languages/wc-licensed-product-de_CH.po b/languages/wc-licensed-product-de_CH.po index 19d6aaf..07f0ac1 100644 --- a/languages/wc-licensed-product-de_CH.po +++ b/languages/wc-licensed-product-de_CH.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: WC Licensed Product 0.3.1\n" "Report-Msgid-Bugs-To: magdev3.0@gmail.com\n" -"POT-Creation-Date: 2026-01-23 11:41+0100\n" +"POT-Creation-Date: 2026-01-23 11:54+0100\n" "PO-Revision-Date: 2026-01-22T17:15:00+00:00\n" "Last-Translator: Marco Graetsch \n" "Language-Team: German (Switzerland) \n" @@ -79,9 +79,9 @@ msgstr "" "Lizenzen werden generiert, sobald die Bestellung als bezahlt/abgeschlossen " "markiert wird." -#: src/Admin/OrderLicenseController.php:144 src/Admin/AdminController.php:1280 +#: src/Admin/OrderLicenseController.php:144 +#: src/Admin/SettingsController.php:142 src/Admin/AdminController.php:1280 #: src/Admin/AdminController.php:1431 src/Admin/AdminController.php:1480 -#: src/Admin/SettingsController.php:142 #: src/Email/LicenseEmailController.php:230 msgid "License Key" msgstr "Lizenzschlüssel" @@ -129,11 +129,11 @@ msgstr "Domain bearbeiten" msgid "Cancel" msgstr "Abbrechen" -#: src/Admin/OrderLicenseController.php:201 src/Admin/AdminController.php:151 +#: src/Admin/OrderLicenseController.php:201 +#: src/Admin/SettingsController.php:192 src/Admin/AdminController.php:151 #: src/Admin/AdminController.php:266 src/Admin/AdminController.php:1362 -#: src/Admin/AdminController.php:1602 src/Admin/SettingsController.php:192 -#: src/Product/LicensedProductType.php:104 -#: src/Product/LicensedProductType.php:152 +#: src/Admin/AdminController.php:1602 src/Product/LicensedProductType.php:110 +#: src/Product/LicensedProductType.php:158 msgid "Lifetime" msgstr "Lebenslang" @@ -213,6 +213,179 @@ msgstr "Lizenz-Domain aktualisiert." msgid "Failed to update license domain." msgstr "Lizenz-Domain konnte nicht aktualisiert werden." +#: src/Admin/SettingsController.php:54 +msgid "Licensed Products" +msgstr "Lizensierte Produkte" + +#: src/Admin/SettingsController.php:64 src/Admin/SettingsController.php:128 +msgid "Plugin License" +msgstr "Plugin-Lizenz" + +#: src/Admin/SettingsController.php:65 +msgid "Default Settings" +msgstr "Standardeinstellungen" + +#: src/Admin/SettingsController.php:66 +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: src/Admin/SettingsController.php:130 +msgid "" +"Configure the license for this plugin. A valid license is required for " +"frontend features to work." +msgstr "" +"Konfigurieren Sie die Lizenz für dieses Plugin. Eine gültige Lizenz ist " +"erforderlich, damit die Frontend-Funktionen funktionieren." + +#: src/Admin/SettingsController.php:134 +msgid "License Server URL" +msgstr "Lizenzserver-URL" + +#: src/Admin/SettingsController.php:136 +msgid "The URL of the license server (e.g., https://shop.example.com)." +msgstr "Die URL des Lizenzservers (z.B. https://shop.example.com)." + +#: src/Admin/SettingsController.php:144 +msgid "Your license key in XXXX-XXXX-XXXX-XXXX format." +msgstr "Ihr Lizenzschlüssel im Format XXXX-XXXX-XXXX-XXXX." + +#: src/Admin/SettingsController.php:150 +msgid "Server Secret (Optional)" +msgstr "Server-Secret (Optional)" + +#: src/Admin/SettingsController.php:152 +msgid "" +"If the license server uses signed responses, enter the shared secret here " +"for enhanced security." +msgstr "" +"Falls der Lizenzserver signierte Antworten verwendet, geben Sie hier das " +"gemeinsame Secret für erhöhte Sicherheit ein." + +#: src/Admin/SettingsController.php:170 +msgid "Default License Settings" +msgstr "Standard Lizenz-Einstellungen" + +#: src/Admin/SettingsController.php:172 +msgid "" +"These settings serve as defaults for new licensed products. Individual " +"product settings override these defaults." +msgstr "" +"Diese Einstellungen dienen als Standard für neue lizensierte Produkte. " +"Individuelle Produkteinstellungen überschreiben diese Standards." + +#: src/Admin/SettingsController.php:176 +msgid "Default Max Activations" +msgstr "Standard Max. Aktivierungen" + +#: src/Admin/SettingsController.php:178 +msgid "Default maximum number of domain activations per license." +msgstr "Standard maximale Anzahl der Domain-Aktivierungen pro Lizenz." + +#: src/Admin/SettingsController.php:187 +msgid "Default License Validity (Days)" +msgstr "Standard Lizenz-Gültigkeit (Tage)" + +#: src/Admin/SettingsController.php:189 +msgid "" +"Default number of days a license is valid. Leave empty or set to 0 for " +"lifetime licenses." +msgstr "" +"Standard Anzahl Tage, die eine Lizenz gültig ist. Leer lassen oder auf 0 " +"setzen für lebenslange Lizenzen." + +#: src/Admin/SettingsController.php:199 +msgid "Default Bind to Major Version" +msgstr "Standard An Hauptversion binden" + +#: src/Admin/SettingsController.php:201 +msgid "" +"If enabled, licenses are bound to the major version at purchase time by " +"default." +msgstr "" +"Falls aktiviert, werden Lizenzen standardmässig an die Hauptversion zum " +"Kaufzeitpunkt gebunden." + +#: src/Admin/SettingsController.php:219 +msgid "Expiration Warning Schedule" +msgstr "Ablaufwarnung Zeitplan" + +#: src/Admin/SettingsController.php:223 +#, php-format +msgid "" +"Configure when expiration warning emails are sent. To customize the email " +"template, enable/disable, or change the subject, go to %s." +msgstr "" +"Konfigurieren Sie, wann Ablaufwarnungs-E-Mails gesendet werden. Um die E-" +"Mail-Vorlage anzupassen, zu aktivieren/deaktivieren oder den Betreff zu " +"ändern, gehen Sie zu %s." + +#: src/Admin/SettingsController.php:225 +msgid "WooCommerce > Settings > Emails > License Expiration Warning" +msgstr "WooCommerce > Einstellungen > E-Mails > Lizenzablauf-Warnung" + +#: src/Admin/SettingsController.php:230 +msgid "First Warning (Days Before)" +msgstr "Erste Warnung (Tage vorher)" + +#: src/Admin/SettingsController.php:232 +msgid "Days before expiration to send the first warning email." +msgstr "Tage vor Ablauf, um die erste Warn-E-Mail zu senden." + +#: src/Admin/SettingsController.php:241 +msgid "Second Warning (Days Before)" +msgstr "Zweite Warnung (Tage vorher)" + +#: src/Admin/SettingsController.php:243 +msgid "" +"Days before expiration to send the second warning email. Set to 0 to disable." +msgstr "" +"Tage vor Ablauf, um die zweite Warn-E-Mail zu senden. Setzen Sie auf 0, um " +"sie zu deaktivieren." + +#: src/Admin/SettingsController.php:283 +msgid "Running on localhost - license validation bypassed." +msgstr "Läuft auf localhost - Lizenzvalidierung übersprungen." + +#: src/Admin/SettingsController.php:291 +msgid "License is valid and active." +msgstr "Lizenz ist gültig und aktiv." + +#: src/Admin/SettingsController.php:297 +msgid "License is not valid. Frontend features are disabled." +msgstr "Lizenz ist ungültig. Frontend-Funktionen sind deaktiviert." + +#: src/Admin/SettingsController.php:308 src/Admin/SettingsController.php:344 +msgid "Verify License" +msgstr "Lizenz überprüfen" + +#: src/Admin/SettingsController.php:322 +msgid "Verifying..." +msgstr "Überprüfe..." + +#: src/Admin/SettingsController.php:341 +msgid "Request failed." +msgstr "Anfrage fehlgeschlagen." + +#: src/Admin/SettingsController.php:454 src/Admin/AdminController.php:455 +#: src/Admin/AdminController.php:475 src/Admin/AdminController.php:493 +#: src/Admin/AdminController.php:511 src/Admin/AdminController.php:531 +#: src/Admin/AdminController.php:549 src/Admin/AdminController.php:616 +#: src/Admin/AdminController.php:806 src/Frontend/AccountController.php:326 +msgid "Security check failed." +msgstr "Sicherheitsüberprüfung fehlgeschlagen." + +#: src/Admin/SettingsController.php:458 +msgid "Insufficient permissions." +msgstr "Unzureichende Berechtigungen." + +#: src/Admin/SettingsController.php:467 +msgid "License verified successfully!" +msgstr "Lizenz erfolgreich überprüft!" + +#: src/Admin/SettingsController.php:469 +msgid "License validation failed." +msgstr "Lizenzvalidierung fehlgeschlagen." + #: src/Admin/AdminController.php:93 msgid "Overview" msgstr "Übersicht" @@ -333,14 +506,6 @@ msgstr "Lizenz konnte nicht widerrufen werden." msgid "License key and domain are required." msgstr "Lizenzschlüssel und Domain sind erforderlich." -#: src/Admin/AdminController.php:455 src/Admin/AdminController.php:475 -#: src/Admin/AdminController.php:493 src/Admin/AdminController.php:511 -#: src/Admin/AdminController.php:531 src/Admin/AdminController.php:549 -#: src/Admin/AdminController.php:616 src/Admin/AdminController.php:806 -#: src/Admin/SettingsController.php:454 src/Frontend/AccountController.php:326 -msgid "Security check failed." -msgstr "Sicherheitsüberprüfung fehlgeschlagen." - #: src/Admin/AdminController.php:576 msgid "You do not have permission to export licenses." msgstr "Sie haben keine Berechtigung, Lizenzen zu exportieren." @@ -815,171 +980,6 @@ msgstr "Lizenz" msgid "No domain specified" msgstr "Keine Domain angegeben" -#: src/Admin/SettingsController.php:54 -msgid "Licensed Products" -msgstr "Lizensierte Produkte" - -#: src/Admin/SettingsController.php:64 src/Admin/SettingsController.php:128 -msgid "Plugin License" -msgstr "Plugin-Lizenz" - -#: src/Admin/SettingsController.php:65 -msgid "Default Settings" -msgstr "Standardeinstellungen" - -#: src/Admin/SettingsController.php:66 -msgid "Notifications" -msgstr "Benachrichtigungen" - -#: src/Admin/SettingsController.php:130 -msgid "" -"Configure the license for this plugin. A valid license is required for " -"frontend features to work." -msgstr "" -"Konfigurieren Sie die Lizenz für dieses Plugin. Eine gültige Lizenz ist " -"erforderlich, damit die Frontend-Funktionen funktionieren." - -#: src/Admin/SettingsController.php:134 -msgid "License Server URL" -msgstr "Lizenzserver-URL" - -#: src/Admin/SettingsController.php:136 -msgid "The URL of the license server (e.g., https://shop.example.com)." -msgstr "Die URL des Lizenzservers (z.B. https://shop.example.com)." - -#: src/Admin/SettingsController.php:144 -msgid "Your license key in XXXX-XXXX-XXXX-XXXX format." -msgstr "Ihr Lizenzschlüssel im Format XXXX-XXXX-XXXX-XXXX." - -#: src/Admin/SettingsController.php:150 -msgid "Server Secret (Optional)" -msgstr "Server-Secret (Optional)" - -#: src/Admin/SettingsController.php:152 -msgid "" -"If the license server uses signed responses, enter the shared secret here " -"for enhanced security." -msgstr "" -"Falls der Lizenzserver signierte Antworten verwendet, geben Sie hier das " -"gemeinsame Secret für erhöhte Sicherheit ein." - -#: src/Admin/SettingsController.php:170 -msgid "Default License Settings" -msgstr "Standard Lizenz-Einstellungen" - -#: src/Admin/SettingsController.php:172 -msgid "" -"These settings serve as defaults for new licensed products. Individual " -"product settings override these defaults." -msgstr "" -"Diese Einstellungen dienen als Standard für neue lizensierte Produkte. " -"Individuelle Produkteinstellungen überschreiben diese Standards." - -#: src/Admin/SettingsController.php:176 -msgid "Default Max Activations" -msgstr "Standard Max. Aktivierungen" - -#: src/Admin/SettingsController.php:178 -msgid "Default maximum number of domain activations per license." -msgstr "Standard maximale Anzahl der Domain-Aktivierungen pro Lizenz." - -#: src/Admin/SettingsController.php:187 -msgid "Default License Validity (Days)" -msgstr "Standard Lizenz-Gültigkeit (Tage)" - -#: src/Admin/SettingsController.php:189 -msgid "" -"Default number of days a license is valid. Leave empty or set to 0 for " -"lifetime licenses." -msgstr "" -"Standard Anzahl Tage, die eine Lizenz gültig ist. Leer lassen oder auf 0 " -"setzen für lebenslange Lizenzen." - -#: src/Admin/SettingsController.php:199 -msgid "Default Bind to Major Version" -msgstr "Standard An Hauptversion binden" - -#: src/Admin/SettingsController.php:201 -msgid "" -"If enabled, licenses are bound to the major version at purchase time by " -"default." -msgstr "" -"Falls aktiviert, werden Lizenzen standardmässig an die Hauptversion zum " -"Kaufzeitpunkt gebunden." - -#: src/Admin/SettingsController.php:219 -msgid "Expiration Warning Schedule" -msgstr "Ablaufwarnung Zeitplan" - -#: src/Admin/SettingsController.php:223 -#, php-format -msgid "" -"Configure when expiration warning emails are sent. To customize the email " -"template, enable/disable, or change the subject, go to %s." -msgstr "" -"Konfigurieren Sie, wann Ablaufwarnungs-E-Mails gesendet werden. Um die E-" -"Mail-Vorlage anzupassen, zu aktivieren/deaktivieren oder den Betreff zu " -"ändern, gehen Sie zu %s." - -#: src/Admin/SettingsController.php:225 -msgid "WooCommerce > Settings > Emails > License Expiration Warning" -msgstr "WooCommerce > Einstellungen > E-Mails > Lizenzablauf-Warnung" - -#: src/Admin/SettingsController.php:230 -msgid "First Warning (Days Before)" -msgstr "Erste Warnung (Tage vorher)" - -#: src/Admin/SettingsController.php:232 -msgid "Days before expiration to send the first warning email." -msgstr "Tage vor Ablauf, um die erste Warn-E-Mail zu senden." - -#: src/Admin/SettingsController.php:241 -msgid "Second Warning (Days Before)" -msgstr "Zweite Warnung (Tage vorher)" - -#: src/Admin/SettingsController.php:243 -msgid "" -"Days before expiration to send the second warning email. Set to 0 to disable." -msgstr "" -"Tage vor Ablauf, um die zweite Warn-E-Mail zu senden. Setzen Sie auf 0, um " -"sie zu deaktivieren." - -#: src/Admin/SettingsController.php:283 -msgid "Running on localhost - license validation bypassed." -msgstr "Läuft auf localhost - Lizenzvalidierung übersprungen." - -#: src/Admin/SettingsController.php:291 -msgid "License is valid and active." -msgstr "Lizenz ist gültig und aktiv." - -#: src/Admin/SettingsController.php:297 -msgid "License is not valid. Frontend features are disabled." -msgstr "Lizenz ist ungültig. Frontend-Funktionen sind deaktiviert." - -#: src/Admin/SettingsController.php:308 src/Admin/SettingsController.php:344 -msgid "Verify License" -msgstr "Lizenz überprüfen" - -#: src/Admin/SettingsController.php:322 -msgid "Verifying..." -msgstr "Überprüfe..." - -#: src/Admin/SettingsController.php:341 -msgid "Request failed." -msgstr "Anfrage fehlgeschlagen." - -#: src/Admin/SettingsController.php:458 -msgid "Insufficient permissions." -msgstr "Unzureichende Berechtigungen." - -#: src/Admin/SettingsController.php:467 -msgid "License verified successfully!" -msgstr "Lizenz erfolgreich überprüft!" - -#: src/Admin/SettingsController.php:469 -msgid "License validation failed." -msgstr "Lizenzvalidierung fehlgeschlagen." - #: src/Admin/VersionAdminController.php:58 msgid "Product Versions" msgstr "Produktversionen" @@ -1252,51 +1252,51 @@ msgstr "Lizenzeinstellungen nicht konfiguriert." msgid "Could not connect to license server." msgstr "Verbindung zum Lizenzserver konnte nicht hergestellt werden." -#: src/Product/LicensedProductType.php:55 +#: src/Product/LicensedProductType.php:61 msgid "Licensed Product" msgstr "Lizensiertes Produkt" -#: src/Product/LicensedProductType.php:76 +#: src/Product/LicensedProductType.php:82 msgid "License Settings" msgstr "Lizenz-Einstellungen" -#: src/Product/LicensedProductType.php:103 +#: src/Product/LicensedProductType.php:109 #, php-format msgid "%d days" msgstr "%d Tage" -#: src/Product/LicensedProductType.php:113 +#: src/Product/LicensedProductType.php:119 #, php-format msgid "Leave fields empty to use default settings from %s." msgstr "Felder leer lassen, um Standardeinstellungen von %s zu verwenden." -#: src/Product/LicensedProductType.php:115 +#: src/Product/LicensedProductType.php:121 msgid "WooCommerce > Settings > Licensed Products" msgstr "WooCommerce > Einstellungen > Lizensierte Produkte" -#: src/Product/LicensedProductType.php:122 +#: src/Product/LicensedProductType.php:128 msgid "Max Activations" msgstr "Max. Aktivierungen" -#: src/Product/LicensedProductType.php:125 +#: src/Product/LicensedProductType.php:131 #, php-format msgid "Maximum number of domain activations per license. Default: %d" msgstr "Maximale Anzahl der Domain-Aktivierungen pro Lizenz. Standard: %d" -#: src/Product/LicensedProductType.php:140 +#: src/Product/LicensedProductType.php:146 msgid "License Validity (Days)" msgstr "Lizenz-Gültigkeit (Tage)" -#: src/Product/LicensedProductType.php:143 +#: src/Product/LicensedProductType.php:149 #, php-format msgid "Number of days the license is valid. Leave empty for default (%s)." msgstr "Anzahl Tage, die die Lizenz gültig ist. Leer lassen für Standard (%s)." -#: src/Product/LicensedProductType.php:158 +#: src/Product/LicensedProductType.php:164 msgid "Bind to Major Version" msgstr "An Hauptversion binden" -#: src/Product/LicensedProductType.php:161 +#: src/Product/LicensedProductType.php:167 #, php-format msgid "" "If enabled, licenses are bound to the major version at purchase time. " @@ -1305,14 +1305,18 @@ msgstr "" "Falls aktiviert, werden Lizenzen an die Hauptversion zum Kaufzeitpunkt " "gebunden. Standard: %s" -#: src/Product/LicensedProductType.php:162 +#: src/Product/LicensedProductType.php:168 msgid "Yes" msgstr "Ja" -#: src/Product/LicensedProductType.php:162 +#: src/Product/LicensedProductType.php:168 msgid "No" msgstr "Nein" +#: src/Product/LicensedProductType.php:288 +msgid "Version:" +msgstr "Version:" + #: src/Product/VersionManager.php:166 msgid "Attachment file not found." msgstr "Anhangs-Datei nicht gefunden." diff --git a/languages/wc-licensed-product.pot b/languages/wc-licensed-product.pot index 6a758e5..d4f31dd 100644 --- a/languages/wc-licensed-product.pot +++ b/languages/wc-licensed-product.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Marco Graetsch -# This file is distributed under the same license as the WooCommerce Licensed Product package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the WC Licensed Product package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: WooCommerce Licensed Product 0.3.3\n" +"Project-Id-Version: WC Licensed Product 0.3.4\n" "Report-Msgid-Bugs-To: magdev3.0@gmail.com\n" -"POT-Creation-Date: 2026-01-23 11:41+0100\n" +"POT-Creation-Date: 2026-01-23 11:54+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -75,9 +75,9 @@ msgstr "" msgid "Licenses will be generated when the order is marked as paid/completed." msgstr "" -#: src/Admin/OrderLicenseController.php:144 src/Admin/AdminController.php:1280 +#: src/Admin/OrderLicenseController.php:144 +#: src/Admin/SettingsController.php:142 src/Admin/AdminController.php:1280 #: src/Admin/AdminController.php:1431 src/Admin/AdminController.php:1480 -#: src/Admin/SettingsController.php:142 #: src/Email/LicenseEmailController.php:230 msgid "License Key" msgstr "" @@ -125,11 +125,11 @@ msgstr "" msgid "Cancel" msgstr "" -#: src/Admin/OrderLicenseController.php:201 src/Admin/AdminController.php:151 +#: src/Admin/OrderLicenseController.php:201 +#: src/Admin/SettingsController.php:192 src/Admin/AdminController.php:151 #: src/Admin/AdminController.php:266 src/Admin/AdminController.php:1362 -#: src/Admin/AdminController.php:1602 src/Admin/SettingsController.php:192 -#: src/Product/LicensedProductType.php:104 -#: src/Product/LicensedProductType.php:152 +#: src/Admin/AdminController.php:1602 src/Product/LicensedProductType.php:110 +#: src/Product/LicensedProductType.php:158 msgid "Lifetime" msgstr "" @@ -207,6 +207,164 @@ msgstr "" msgid "Failed to update license domain." msgstr "" +#: src/Admin/SettingsController.php:54 +msgid "Licensed Products" +msgstr "" + +#: src/Admin/SettingsController.php:64 src/Admin/SettingsController.php:128 +msgid "Plugin License" +msgstr "" + +#: src/Admin/SettingsController.php:65 +msgid "Default Settings" +msgstr "" + +#: src/Admin/SettingsController.php:66 +msgid "Notifications" +msgstr "" + +#: src/Admin/SettingsController.php:130 +msgid "" +"Configure the license for this plugin. A valid license is required for " +"frontend features to work." +msgstr "" + +#: src/Admin/SettingsController.php:134 +msgid "License Server URL" +msgstr "" + +#: src/Admin/SettingsController.php:136 +msgid "The URL of the license server (e.g., https://shop.example.com)." +msgstr "" + +#: src/Admin/SettingsController.php:144 +msgid "Your license key in XXXX-XXXX-XXXX-XXXX format." +msgstr "" + +#: src/Admin/SettingsController.php:150 +msgid "Server Secret (Optional)" +msgstr "" + +#: src/Admin/SettingsController.php:152 +msgid "" +"If the license server uses signed responses, enter the shared secret here " +"for enhanced security." +msgstr "" + +#: src/Admin/SettingsController.php:170 +msgid "Default License Settings" +msgstr "" + +#: src/Admin/SettingsController.php:172 +msgid "" +"These settings serve as defaults for new licensed products. Individual " +"product settings override these defaults." +msgstr "" + +#: src/Admin/SettingsController.php:176 +msgid "Default Max Activations" +msgstr "" + +#: src/Admin/SettingsController.php:178 +msgid "Default maximum number of domain activations per license." +msgstr "" + +#: src/Admin/SettingsController.php:187 +msgid "Default License Validity (Days)" +msgstr "" + +#: src/Admin/SettingsController.php:189 +msgid "" +"Default number of days a license is valid. Leave empty or set to 0 for " +"lifetime licenses." +msgstr "" + +#: src/Admin/SettingsController.php:199 +msgid "Default Bind to Major Version" +msgstr "" + +#: src/Admin/SettingsController.php:201 +msgid "" +"If enabled, licenses are bound to the major version at purchase time by " +"default." +msgstr "" + +#: src/Admin/SettingsController.php:219 +msgid "Expiration Warning Schedule" +msgstr "" + +#: src/Admin/SettingsController.php:223 +#, php-format +msgid "" +"Configure when expiration warning emails are sent. To customize the email " +"template, enable/disable, or change the subject, go to %s." +msgstr "" + +#: src/Admin/SettingsController.php:225 +msgid "WooCommerce > Settings > Emails > License Expiration Warning" +msgstr "" + +#: src/Admin/SettingsController.php:230 +msgid "First Warning (Days Before)" +msgstr "" + +#: src/Admin/SettingsController.php:232 +msgid "Days before expiration to send the first warning email." +msgstr "" + +#: src/Admin/SettingsController.php:241 +msgid "Second Warning (Days Before)" +msgstr "" + +#: src/Admin/SettingsController.php:243 +msgid "" +"Days before expiration to send the second warning email. Set to 0 to disable." +msgstr "" + +#: src/Admin/SettingsController.php:283 +msgid "Running on localhost - license validation bypassed." +msgstr "" + +#: src/Admin/SettingsController.php:291 +msgid "License is valid and active." +msgstr "" + +#: src/Admin/SettingsController.php:297 +msgid "License is not valid. Frontend features are disabled." +msgstr "" + +#: src/Admin/SettingsController.php:308 src/Admin/SettingsController.php:344 +msgid "Verify License" +msgstr "" + +#: src/Admin/SettingsController.php:322 +msgid "Verifying..." +msgstr "" + +#: src/Admin/SettingsController.php:341 +msgid "Request failed." +msgstr "" + +#: src/Admin/SettingsController.php:454 src/Admin/AdminController.php:455 +#: src/Admin/AdminController.php:475 src/Admin/AdminController.php:493 +#: src/Admin/AdminController.php:511 src/Admin/AdminController.php:531 +#: src/Admin/AdminController.php:549 src/Admin/AdminController.php:616 +#: src/Admin/AdminController.php:806 src/Frontend/AccountController.php:326 +msgid "Security check failed." +msgstr "" + +#: src/Admin/SettingsController.php:458 +msgid "Insufficient permissions." +msgstr "" + +#: src/Admin/SettingsController.php:467 +msgid "License verified successfully!" +msgstr "" + +#: src/Admin/SettingsController.php:469 +msgid "License validation failed." +msgstr "" + #: src/Admin/AdminController.php:93 msgid "Overview" msgstr "" @@ -325,14 +483,6 @@ msgstr "" msgid "License key and domain are required." msgstr "" -#: src/Admin/AdminController.php:455 src/Admin/AdminController.php:475 -#: src/Admin/AdminController.php:493 src/Admin/AdminController.php:511 -#: src/Admin/AdminController.php:531 src/Admin/AdminController.php:549 -#: src/Admin/AdminController.php:616 src/Admin/AdminController.php:806 -#: src/Admin/SettingsController.php:454 src/Frontend/AccountController.php:326 -msgid "Security check failed." -msgstr "" - #: src/Admin/AdminController.php:576 msgid "You do not have permission to export licenses." msgstr "" @@ -800,156 +950,6 @@ msgstr "" msgid "No domain specified" msgstr "" -#: src/Admin/SettingsController.php:54 -msgid "Licensed Products" -msgstr "" - -#: src/Admin/SettingsController.php:64 src/Admin/SettingsController.php:128 -msgid "Plugin License" -msgstr "" - -#: src/Admin/SettingsController.php:65 -msgid "Default Settings" -msgstr "" - -#: src/Admin/SettingsController.php:66 -msgid "Notifications" -msgstr "" - -#: src/Admin/SettingsController.php:130 -msgid "" -"Configure the license for this plugin. A valid license is required for " -"frontend features to work." -msgstr "" - -#: src/Admin/SettingsController.php:134 -msgid "License Server URL" -msgstr "" - -#: src/Admin/SettingsController.php:136 -msgid "The URL of the license server (e.g., https://shop.example.com)." -msgstr "" - -#: src/Admin/SettingsController.php:144 -msgid "Your license key in XXXX-XXXX-XXXX-XXXX format." -msgstr "" - -#: src/Admin/SettingsController.php:150 -msgid "Server Secret (Optional)" -msgstr "" - -#: src/Admin/SettingsController.php:152 -msgid "" -"If the license server uses signed responses, enter the shared secret here " -"for enhanced security." -msgstr "" - -#: src/Admin/SettingsController.php:170 -msgid "Default License Settings" -msgstr "" - -#: src/Admin/SettingsController.php:172 -msgid "" -"These settings serve as defaults for new licensed products. Individual " -"product settings override these defaults." -msgstr "" - -#: src/Admin/SettingsController.php:176 -msgid "Default Max Activations" -msgstr "" - -#: src/Admin/SettingsController.php:178 -msgid "Default maximum number of domain activations per license." -msgstr "" - -#: src/Admin/SettingsController.php:187 -msgid "Default License Validity (Days)" -msgstr "" - -#: src/Admin/SettingsController.php:189 -msgid "" -"Default number of days a license is valid. Leave empty or set to 0 for " -"lifetime licenses." -msgstr "" - -#: src/Admin/SettingsController.php:199 -msgid "Default Bind to Major Version" -msgstr "" - -#: src/Admin/SettingsController.php:201 -msgid "" -"If enabled, licenses are bound to the major version at purchase time by " -"default." -msgstr "" - -#: src/Admin/SettingsController.php:219 -msgid "Expiration Warning Schedule" -msgstr "" - -#: src/Admin/SettingsController.php:223 -#, php-format -msgid "" -"Configure when expiration warning emails are sent. To customize the email " -"template, enable/disable, or change the subject, go to %s." -msgstr "" - -#: src/Admin/SettingsController.php:225 -msgid "WooCommerce > Settings > Emails > License Expiration Warning" -msgstr "" - -#: src/Admin/SettingsController.php:230 -msgid "First Warning (Days Before)" -msgstr "" - -#: src/Admin/SettingsController.php:232 -msgid "Days before expiration to send the first warning email." -msgstr "" - -#: src/Admin/SettingsController.php:241 -msgid "Second Warning (Days Before)" -msgstr "" - -#: src/Admin/SettingsController.php:243 -msgid "" -"Days before expiration to send the second warning email. Set to 0 to disable." -msgstr "" - -#: src/Admin/SettingsController.php:283 -msgid "Running on localhost - license validation bypassed." -msgstr "" - -#: src/Admin/SettingsController.php:291 -msgid "License is valid and active." -msgstr "" - -#: src/Admin/SettingsController.php:297 -msgid "License is not valid. Frontend features are disabled." -msgstr "" - -#: src/Admin/SettingsController.php:308 src/Admin/SettingsController.php:344 -msgid "Verify License" -msgstr "" - -#: src/Admin/SettingsController.php:322 -msgid "Verifying..." -msgstr "" - -#: src/Admin/SettingsController.php:341 -msgid "Request failed." -msgstr "" - -#: src/Admin/SettingsController.php:458 -msgid "Insufficient permissions." -msgstr "" - -#: src/Admin/SettingsController.php:467 -msgid "License verified successfully!" -msgstr "" - -#: src/Admin/SettingsController.php:469 -msgid "License validation failed." -msgstr "" - #: src/Admin/VersionAdminController.php:58 msgid "Product Versions" msgstr "" @@ -1212,65 +1212,69 @@ msgstr "" msgid "Could not connect to license server." msgstr "" -#: src/Product/LicensedProductType.php:55 +#: src/Product/LicensedProductType.php:61 msgid "Licensed Product" msgstr "" -#: src/Product/LicensedProductType.php:76 +#: src/Product/LicensedProductType.php:82 msgid "License Settings" msgstr "" -#: src/Product/LicensedProductType.php:103 +#: src/Product/LicensedProductType.php:109 #, php-format msgid "%d days" msgstr "" -#: src/Product/LicensedProductType.php:113 +#: src/Product/LicensedProductType.php:119 #, php-format msgid "Leave fields empty to use default settings from %s." msgstr "" -#: src/Product/LicensedProductType.php:115 +#: src/Product/LicensedProductType.php:121 msgid "WooCommerce > Settings > Licensed Products" msgstr "" -#: src/Product/LicensedProductType.php:122 +#: src/Product/LicensedProductType.php:128 msgid "Max Activations" msgstr "" -#: src/Product/LicensedProductType.php:125 +#: src/Product/LicensedProductType.php:131 #, php-format msgid "Maximum number of domain activations per license. Default: %d" msgstr "" -#: src/Product/LicensedProductType.php:140 +#: src/Product/LicensedProductType.php:146 msgid "License Validity (Days)" msgstr "" -#: src/Product/LicensedProductType.php:143 +#: src/Product/LicensedProductType.php:149 #, php-format msgid "Number of days the license is valid. Leave empty for default (%s)." msgstr "" -#: src/Product/LicensedProductType.php:158 +#: src/Product/LicensedProductType.php:164 msgid "Bind to Major Version" msgstr "" -#: src/Product/LicensedProductType.php:161 +#: src/Product/LicensedProductType.php:167 #, php-format msgid "" "If enabled, licenses are bound to the major version at purchase time. " "Default: %s" msgstr "" -#: src/Product/LicensedProductType.php:162 +#: src/Product/LicensedProductType.php:168 msgid "Yes" msgstr "" -#: src/Product/LicensedProductType.php:162 +#: src/Product/LicensedProductType.php:168 msgid "No" msgstr "" +#: src/Product/LicensedProductType.php:288 +msgid "Version:" +msgstr "" + #: src/Product/VersionManager.php:166 msgid "Attachment file not found." msgstr "" diff --git a/src/Product/LicensedProductType.php b/src/Product/LicensedProductType.php index 3b30e28..0a903c3 100644 --- a/src/Product/LicensedProductType.php +++ b/src/Product/LicensedProductType.php @@ -45,6 +45,12 @@ final class LicensedProductType // Make product virtual by default add_filter('woocommerce_product_is_virtual', [$this, 'isVirtual'], 10, 2); + + // Display current version under product title on single product page + add_action('woocommerce_single_product_summary', [$this, 'displayCurrentVersion'], 6); + + // Enqueue frontend CSS for licensed products on single product pages + add_action('wp_enqueue_scripts', [$this, 'enqueueFrontendStyles']); } /** @@ -235,4 +241,52 @@ final class LicensedProductType } return $isVirtual; } + + /** + * Enqueue frontend styles for licensed products on single product pages + */ + public function enqueueFrontendStyles(): void + { + if (!is_product()) { + return; + } + + global $product; + + if (!$product || !$product->is_type('licensed')) { + return; + } + + wp_enqueue_style( + 'wc-licensed-product-frontend', + WC_LICENSED_PRODUCT_PLUGIN_URL . 'assets/css/frontend.css', + [], + WC_LICENSED_PRODUCT_VERSION + ); + } + + /** + * Display current version under product title on single product page + */ + public function displayCurrentVersion(): void + { + global $product; + + if (!$product || !$product->is_type('licensed')) { + return; + } + + /** @var LicensedProduct $product */ + $version = $product->get_current_version(); + + if (empty($version)) { + return; + } + + printf( + '

%s %s

', + esc_html__('Version:', 'wc-licensed-product'), + esc_html($version) + ); + } } diff --git a/wc-licensed-product.php b/wc-licensed-product.php index 178b7f3..d7fc007 100644 --- a/wc-licensed-product.php +++ b/wc-licensed-product.php @@ -3,7 +3,7 @@ * Plugin Name: WooCommerce Licensed Product * Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-licensed-product * Description: WooCommerce plugin to sell software products using license keys with domain-based validation. - * Version: 0.3.3 + * Version: 0.3.4 * Author: Marco Graetsch * Author URI: https://src.bundespruefstelle.ch/magdev * License: GPL-2.0-or-later @@ -28,7 +28,7 @@ if (!defined('ABSPATH')) { } // Plugin constants -define('WC_LICENSED_PRODUCT_VERSION', '0.3.3'); +define('WC_LICENSED_PRODUCT_VERSION', '0.3.4'); define('WC_LICENSED_PRODUCT_PLUGIN_FILE', __FILE__); define('WC_LICENSED_PRODUCT_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('WC_LICENSED_PRODUCT_PLUGIN_URL', plugin_dir_url(__FILE__));