6 Commits

Author SHA1 Message Date
f7490de69b Release v0.2.2 - Display file checksums in UI
Features:
- Add SHA256 column to admin product versions table
- Display file hash in customer account downloads section
- Style checksum file upload field consistently with package upload

Changes:
- Admin versions table shows truncated hash with full hash on hover
- Customer downloads show hash with shield icon indicator
- Updated German translations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 17:35:25 +01:00
d2bf9aa330 Style checksum file upload field to match package upload field
- Changed plain file input to styled button with filename display
- Added Select/Remove buttons for checksum file upload
- Updated JavaScript handlers for styled checksum file input
- Updated German translation for new button text

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 17:26:48 +01:00
d00a2235ef Clean up roadmap after v0.2.1 release
- Remove known bug (checksum field issue was fixed)
- Remove completed v0.2.1 tasks from roadmap
- Add v0.2.1 version link to CHANGELOG

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 17:22:59 +01:00
27c9a22739 Add v0.2.1 release package
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 17:16:44 +01:00
fc2fe70576 v0.2.1: Change SHA256 input to file upload field
- Replace SHA256 text input with file upload field for checksum files
- Add readChecksumFile() JavaScript function using FileReader API
- Support .sha256 and .txt checksum file formats
- Add Promise-based async handling for file reading
- Add localized error messages for checksum file validation
- Update translations (de_CH) with new strings

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 17:13:27 +01:00
f5a1e55710 Add v0.2.0 release package
- wc-licensed-product-0.2.0.zip (486 KB)
- SHA256: 20d90f61721b4579cb979cd19b0262f3286c3510dcb0345fe5e8da2703e3836f

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 16:59:56 +01:00
16 changed files with 499 additions and 325 deletions

View File

@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.2.2] - 2026-01-22
### Added
- SHA256 checksum column in admin product versions table
- File hash display in customer account downloads section
- Visual indicators for file integrity verification
### Changed
- Checksum file upload field now styled consistently with package upload field
- Download list items now show truncated hash with full hash on hover
### Technical Details
- ProductVersion `getFileHash()` method now exposed in admin and frontend views
- Frontend CSS extended with `.download-hash` styles
- Admin CSS extended with `.file-hash` styles
## [0.2.1] - 2026-01-22
### Changed
- SHA256 hash input changed from text field to file upload field
- Checksum files (.sha256 or .txt) can now be uploaded directly
- Improved user experience for version integrity verification
### Technical Details
- Added `readChecksumFile()` JavaScript function using FileReader API with Promise support
- Checksum file format supports both "hash filename" and plain "hash" formats
- Added localized error messages for checksum file validation
## [0.2.0] - 2026-01-22
### Added
@@ -340,7 +373,9 @@ define('WC_LICENSE_SERVER_SECRET', 'your-secure-random-string-min-32-chars');
- WordPress REST API integration
- Custom WooCommerce product type extending WC_Product
[Unreleased]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.2.0...HEAD
[Unreleased]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.2.2...HEAD
[0.2.2]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.2.1...v0.2.2
[0.2.1]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.2.0...v0.2.1
[0.2.0]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.1.0...v0.2.0
[0.1.0]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.11...v0.1.0
[0.0.11]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.10...v0.0.11

View File

@@ -34,9 +34,13 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w
### Known Bugs
No known bugs at the moment
No known bugs at the moment.
No planned features at this time. See Session History for completed work.
### Version 0.3.0
- Implement License check using the composer package `magdev/wc-licensed-product-client` located in the local folder `/home/magdev/workspaces/php/wc-licensed-product-client`
- Add license configuration to the plugins settings page
- Hide frontend parts if no valid license is provided
## Technical Stack

View File

@@ -43,6 +43,13 @@
font-size: 0.9em;
}
/* File Hash */
code.file-hash {
cursor: help;
font-size: 0.85em;
color: #666;
}
/* License Product Tab */
#woocommerce-product-data .show_if_licensed {
display: block !important;

View File

@@ -247,6 +247,30 @@
margin-left: auto;
}
.download-hash {
display: inline-flex;
align-items: center;
gap: 0.25em;
font-size: 0.8em;
color: #666;
}
.download-hash .dashicons {
font-size: 14px;
width: 14px;
height: 14px;
color: #28a745;
}
.download-hash code {
font-family: 'SF Mono', Monaco, Consolas, monospace;
background: #f5f5f5;
padding: 0.2em 0.4em;
border-radius: 3px;
font-size: 0.9em;
color: #666;
}
/* Domain Field */
#licensed-product-domain-field {
margin-top: 2em;

View File

@@ -23,6 +23,11 @@
$('#upload-version-file-btn').on('click', this.openMediaUploader.bind(this));
$('#remove-version-file-btn').on('click', this.removeSelectedFile);
// Checksum file events
$('#select-checksum-file-btn').on('click', this.triggerChecksumFileSelect);
$('#new_checksum_file').on('change', this.onChecksumFileSelected);
$('#remove-checksum-file-btn').on('click', this.removeChecksumFile);
// Listen for product type changes
$('#product-type').on('change', this.onProductTypeChange);
@@ -101,9 +106,72 @@
$('#selected_file_name').text('');
$('#remove-version-file-btn').hide();
// Hide and clear SHA256 hash field
// Hide and clear checksum file field
$('#sha256-hash-row').hide();
$('#new_file_hash').val('');
$('#new_checksum_file').val('');
$('#selected_checksum_name').text('');
$('#remove-checksum-file-btn').hide();
},
/**
* Trigger checksum file input click
*/
triggerChecksumFileSelect: function(e) {
e.preventDefault();
$('#new_checksum_file').trigger('click');
},
/**
* Handle checksum file selection
*/
onChecksumFileSelected: function(e) {
var file = e.target.files[0];
if (file) {
$('#selected_checksum_name').text(file.name);
$('#remove-checksum-file-btn').show();
} else {
$('#selected_checksum_name').text('');
$('#remove-checksum-file-btn').hide();
}
},
/**
* Remove selected checksum file
*/
removeChecksumFile: function(e) {
e.preventDefault();
$('#new_checksum_file').val('');
$('#selected_checksum_name').text('');
$('#remove-checksum-file-btn').hide();
},
/**
* Read checksum from uploaded file
* Supports formats: "hash filename" or just "hash"
*/
readChecksumFile: function(file) {
return new Promise(function(resolve, reject) {
if (!file) {
resolve('');
return;
}
var reader = new FileReader();
reader.onload = function(e) {
var content = e.target.result.trim();
// Extract hash from content (format: "hash filename" or just "hash")
var match = content.match(/^([a-fA-F0-9]{64})/);
if (match) {
resolve(match[1].toLowerCase());
} else {
reject(new Error(wcLicensedProductVersions.strings.invalidChecksumFile || 'Invalid checksum file format'));
}
};
reader.onerror = function() {
reject(new Error(wcLicensedProductVersions.strings.checksumReadError || 'Failed to read checksum file'));
};
reader.readAsText(file);
});
},
/**
@@ -134,13 +202,14 @@
addVersion: function(e) {
e.preventDefault();
var self = WCLicensedProductVersions;
var $btn = $(this);
var $spinner = $btn.siblings('.spinner');
var productId = $btn.data('product-id');
var version = $('#new_version').val().trim();
var releaseNotes = $('#new_release_notes').val().trim();
var attachmentId = $('#new_attachment_id').val();
var fileHash = $('#new_file_hash').val().trim();
var checksumFile = $('#new_checksum_file')[0].files[0];
// Validate version
if (!version) {
@@ -156,6 +225,8 @@
$btn.prop('disabled', true);
$spinner.addClass('is-active');
// Read checksum file if provided, then submit
self.readChecksumFile(checksumFile).then(function(fileHash) {
$.ajax({
url: wcLicensedProductVersions.ajaxUrl,
type: 'POST',
@@ -183,7 +254,9 @@
$('#selected_file_name').text('');
$('#remove-version-file-btn').hide();
$('#sha256-hash-row').hide();
$('#new_file_hash').val('');
$('#new_checksum_file').val('');
$('#selected_checksum_name').text('');
$('#remove-checksum-file-btn').hide();
} else {
alert(response.data.message || wcLicensedProductVersions.strings.error);
}
@@ -196,6 +269,11 @@
$spinner.removeClass('is-active');
}
});
}).catch(function(error) {
alert(error.message);
$btn.prop('disabled', false);
$spinner.removeClass('is-active');
});
},
deleteVersion: function(e) {

View File

@@ -3,10 +3,10 @@
# This file is distributed under the GPL-2.0-or-later.
msgid ""
msgstr ""
"Project-Id-Version: WC Licensed Product 0.2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-22 11:52+0100\n"
"PO-Revision-Date: 2026-01-21T00:00:00+00:00\n"
"Project-Id-Version: WC Licensed Product 0.2.1\n"
"Report-Msgid-Bugs-To: magdev3.0@gmail.com\n"
"POT-Creation-Date: 2026-01-22 17:32+0100\n"
"PO-Revision-Date: 2026-01-22T17:15:00+00:00\n"
"Last-Translator: Marco Graetsch <magdev3.0@gmail.com>\n"
"Language-Team: German (Switzerland) <de_CH@li.org>\n"
"Language: de_CH\n"
@@ -15,7 +15,6 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. translators: %s: WooCommerce plugin name
#: wc-licensed-product.php:61
#, php-format
msgid "%s requires WooCommerce to be installed and active."
@@ -82,7 +81,7 @@ msgstr "Bearbeiten"
#: src/Admin/AdminController.php:146 src/Admin/AdminController.php:1303
#: src/Admin/AdminController.php:1323 src/Admin/AdminController.php:1344
#: src/Admin/OrderLicenseController.php:185
#: src/Frontend/AccountController.php:270
#: src/Frontend/AccountController.php:271
msgid "Cancel"
msgstr "Abbrechen"
@@ -100,25 +99,25 @@ msgstr "Speichern"
msgid "Lifetime"
msgstr "Lebenslang"
#: src/Admin/AdminController.php:149 src/Frontend/AccountController.php:308
#: src/Admin/AdminController.php:149 src/Frontend/AccountController.php:309
msgid "Copied!"
msgstr "Kopiert!"
#: src/Admin/AdminController.php:150 src/Frontend/AccountController.php:309
#: src/Admin/AdminController.php:150 src/Frontend/AccountController.php:310
msgid "Copy failed"
msgstr "Kopieren fehlgeschlagen"
#: src/Admin/AdminController.php:153 src/Admin/AdminController.php:875
#: src/Admin/AdminController.php:1194 src/Admin/AdminController.php:1317
#: src/Admin/VersionAdminController.php:165
#: src/Admin/VersionAdminController.php:381
#: src/Admin/VersionAdminController.php:180
#: src/Admin/VersionAdminController.php:409
msgid "Active"
msgstr "Aktiv"
#: src/Admin/AdminController.php:154 src/Admin/AdminController.php:882
#: src/Admin/AdminController.php:1195 src/Admin/AdminController.php:1318
#: src/Admin/VersionAdminController.php:165
#: src/Admin/VersionAdminController.php:381
#: src/Admin/VersionAdminController.php:180
#: src/Admin/VersionAdminController.php:409
msgid "Inactive"
msgstr "Inaktiv"
@@ -136,9 +135,9 @@ msgstr "Widerrufen"
#: src/Admin/AdminController.php:246 src/Admin/AdminController.php:298
#: src/Admin/AdminController.php:336 src/Admin/OrderLicenseController.php:301
#: src/Admin/OrderLicenseController.php:340
#: src/Admin/VersionAdminController.php:240
#: src/Admin/VersionAdminController.php:305
#: src/Admin/VersionAdminController.php:331
#: src/Admin/VersionAdminController.php:257
#: src/Admin/VersionAdminController.php:326
#: src/Admin/VersionAdminController.php:352
msgid "Permission denied."
msgstr "Zugriff verweigert."
@@ -209,7 +208,7 @@ msgstr "Lizenz konnte nicht widerrufen werden."
#: src/Admin/AdminController.php:466 src/Admin/AdminController.php:484
#: src/Admin/AdminController.php:504 src/Admin/AdminController.php:522
#: src/Admin/AdminController.php:589 src/Admin/AdminController.php:779
#: src/Frontend/AccountController.php:325
#: src/Frontend/AccountController.php:326
msgid "Security check failed."
msgstr "Sicherheitsüberprüfung fehlgeschlagen."
@@ -285,7 +284,6 @@ msgstr "Lizenz erfolgreich verlängert."
msgid "License set to lifetime successfully."
msgstr "Lizenz erfolgreich auf lebenslang gesetzt."
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1068
#, php-format
msgid "%d license activated."
@@ -293,7 +291,6 @@ msgid_plural "%d licenses activated."
msgstr[0] "%d Lizenz aktiviert."
msgstr[1] "%d Lizenzen aktiviert."
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1076
#, php-format
msgid "%d license deactivated."
@@ -301,7 +298,6 @@ msgid_plural "%d licenses deactivated."
msgstr[0] "%d Lizenz deaktiviert."
msgstr[1] "%d Lizenzen deaktiviert."
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1084
#, php-format
msgid "%d license revoked."
@@ -309,7 +305,6 @@ msgid_plural "%d licenses revoked."
msgstr[0] "%d Lizenz widerrufen."
msgstr[1] "%d Lizenzen widerrufen."
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1092
#, php-format
msgid "%d license deleted."
@@ -317,7 +312,6 @@ msgid_plural "%d licenses deleted."
msgstr[0] "%d Lizenz gelöscht."
msgstr[1] "%d Lizenzen gelöscht."
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1100
#, php-format
msgid "%d license extended."
@@ -339,7 +333,6 @@ msgstr ""
msgid "No licenses to export."
msgstr "Keine Lizenzen zum Exportieren."
#. translators: %d: number of licenses imported
#: src/Admin/AdminController.php:1121
#, php-format
msgid "%d license imported."
@@ -347,7 +340,6 @@ msgid_plural "%d licenses imported."
msgstr[0] "%d Lizenz importiert."
msgstr[1] "%d Lizenzen importiert."
#. translators: %d: number of licenses updated
#: src/Admin/AdminController.php:1128
#, php-format
msgid "%d updated."
@@ -355,7 +347,6 @@ msgid_plural "%d updated."
msgstr[0] "%d aktualisiert."
msgstr[1] "%d aktualisiert."
#. translators: %d: number of licenses skipped
#: src/Admin/AdminController.php:1136
#, php-format
msgid "%d skipped."
@@ -363,7 +354,6 @@ msgid_plural "%d skipped."
msgstr[0] "%d übersprungen."
msgstr[1] "%d übersprungen."
#. translators: %d: number of errors
#: src/Admin/AdminController.php:1144
#, php-format
msgid "%d error."
@@ -440,14 +430,14 @@ msgid "Bulk Actions"
msgstr "Massenaktionen"
#: src/Admin/AdminController.php:1235 src/Admin/AdminController.php:1407
#: src/Admin/VersionAdminController.php:171
#: src/Admin/VersionAdminController.php:387
#: src/Admin/VersionAdminController.php:186
#: src/Admin/VersionAdminController.php:415
msgid "Activate"
msgstr "Aktivieren"
#: src/Admin/AdminController.php:1236 src/Admin/AdminController.php:1408
#: src/Admin/VersionAdminController.php:171
#: src/Admin/VersionAdminController.php:387
#: src/Admin/VersionAdminController.php:186
#: src/Admin/VersionAdminController.php:415
msgid "Deactivate"
msgstr "Deaktivieren"
@@ -469,8 +459,8 @@ msgid "Extend 1 year"
msgstr "1 Jahr verlängern"
#: src/Admin/AdminController.php:1241 src/Admin/AdminController.php:1377
#: src/Admin/AdminController.php:1413 src/Admin/VersionAdminController.php:174
#: src/Admin/VersionAdminController.php:390
#: src/Admin/AdminController.php:1413 src/Admin/VersionAdminController.php:189
#: src/Admin/VersionAdminController.php:418
msgid "Delete"
msgstr "Löschen"
@@ -502,7 +492,7 @@ msgstr "Domain"
#: src/Admin/AdminController.php:1257 src/Admin/AdminController.php:1395
#: src/Admin/OrderLicenseController.php:147
#: src/Admin/VersionAdminController.php:132
#: src/Admin/VersionAdminController.php:140
msgid "Status"
msgstr "Status"
@@ -518,7 +508,7 @@ msgstr "Läuft ab"
#: src/Admin/AdminController.php:1260 src/Admin/AdminController.php:1398
#: src/Admin/OrderLicenseController.php:149
#: src/Admin/VersionAdminController.php:134
#: src/Admin/VersionAdminController.php:142
msgid "Actions"
msgstr "Aktionen"
@@ -526,7 +516,7 @@ msgstr "Aktionen"
msgid "No licenses found."
msgstr "Keine Lizenzen gefunden."
#: src/Admin/AdminController.php:1276 src/Frontend/AccountController.php:193
#: src/Admin/AdminController.php:1276 src/Frontend/AccountController.php:194
msgid "Copy to clipboard"
msgstr "In Zwischenablage kopieren"
@@ -680,8 +670,8 @@ msgstr ""
"automatisch bestehende Lizenz-Domains."
#: src/Admin/OrderLicenseController.php:116
#: src/Checkout/CheckoutController.php:89
#: src/Checkout/CheckoutBlocksIntegration.php:102
#: src/Checkout/CheckoutController.php:89
msgid "example.com"
msgstr "beispiel.ch"
@@ -712,7 +702,6 @@ msgstr "Domain bearbeiten"
msgid "View in Licenses"
msgstr "In Lizenzen anzeigen"
#. translators: %s: Link to licenses page
#: src/Admin/OrderLicenseController.php:221
#, php-format
msgid "For more actions (revoke, extend, delete), go to the %s page."
@@ -729,8 +718,8 @@ msgid "Error saving. Please try again."
msgstr "Fehler beim Speichern. Bitte versuchen Sie es erneut."
#: src/Admin/OrderLicenseController.php:288
#: src/Frontend/AccountController.php:313
#: src/Frontend/AccountController.php:345
#: src/Frontend/AccountController.php:314
#: src/Frontend/AccountController.php:346
msgid "Please enter a valid domain."
msgstr "Bitte geben Sie eine gültige Domain ein."
@@ -748,7 +737,7 @@ msgid "Order domain updated."
msgstr "Bestellungs-Domain aktualisiert."
#: src/Admin/OrderLicenseController.php:363
#: src/Frontend/AccountController.php:351
#: src/Frontend/AccountController.php:352
#: src/Frontend/DownloadController.php:105
msgid "License not found."
msgstr "Lizenz nicht gefunden."
@@ -813,7 +802,6 @@ msgstr ""
msgid "Expiration Warning Schedule"
msgstr "Ablaufwarnung Zeitplan"
#. translators: %s: URL to WooCommerce email settings
#: src/Admin/SettingsController.php:101
#, php-format
msgid ""
@@ -856,7 +844,7 @@ msgid "Add New Version"
msgstr "Neue Version hinzufügen"
#: src/Admin/VersionAdminController.php:81
#: src/Admin/VersionAdminController.php:129
#: src/Admin/VersionAdminController.php:136
msgid "Version"
msgstr "Version"
@@ -865,7 +853,7 @@ msgid "Use semantic versioning (e.g., 1.0.0)"
msgstr "Verwenden Sie semantische Versionierung (z.B. 1.0.0)"
#: src/Admin/VersionAdminController.php:88
#: src/Admin/VersionAdminController.php:130
#: src/Admin/VersionAdminController.php:137
msgid "Download File"
msgstr "Download-Datei"
@@ -874,6 +862,7 @@ msgid "Select File"
msgstr "Datei auswählen"
#: src/Admin/VersionAdminController.php:96
#: src/Admin/VersionAdminController.php:110
msgid "Remove"
msgstr "Entfernen"
@@ -886,119 +875,138 @@ msgstr ""
"Version wird automatisch aus dem Dateinamen erkannt (z.B. plugin-v1.2.3.zip)."
#: src/Admin/VersionAdminController.php:102
msgid "Or External URL"
msgstr "Oder externe URL"
msgid "Checksum File"
msgstr "Prüfsummendatei"
#: src/Admin/VersionAdminController.php:105
#: src/Admin/VersionAdminController.php:107
msgid "Select Checksum File"
msgstr "Prüfsummendatei auswählen"
#: src/Admin/VersionAdminController.php:112
msgid ""
"Alternative: Enter an external download URL instead of uploading a file."
"Upload a SHA256 checksum file (.sha256 or .txt) to verify file integrity."
msgstr ""
"Alternativ: Geben Sie eine externe Download-URL ein, anstatt eine Datei "
"hochzuladen."
"Laden Sie eine SHA256-Prüfsummendatei (.sha256 oder .txt) hoch, um die "
"Dateiintegrität zu überprüfen."
#: src/Admin/VersionAdminController.php:109
#: src/Admin/VersionAdminController.php:131
#: src/Admin/VersionAdminController.php:116
#: src/Admin/VersionAdminController.php:139
msgid "Release Notes"
msgstr "Versionshinweise"
#: src/Admin/VersionAdminController.php:117
#: src/Admin/VersionAdminController.php:124
msgid "Add Version"
msgstr "Version hinzufügen"
#: src/Admin/VersionAdminController.php:125
#: src/Admin/VersionAdminController.php:132
msgid "Existing Versions"
msgstr "Vorhandene Versionen"
#: src/Admin/VersionAdminController.php:133
#: src/Admin/VersionAdminController.php:138
msgid "SHA256"
msgstr "SHA256"
#: src/Admin/VersionAdminController.php:141
msgid "Released"
msgstr "Veröffentlicht"
#: src/Admin/VersionAdminController.php:140
#: src/Admin/VersionAdminController.php:148
msgid "No versions found. Add your first version above."
msgstr "Keine Versionen gefunden. Fügen Sie Ihre erste Version oben hinzu."
#: src/Admin/VersionAdminController.php:156
#: src/Admin/VersionAdminController.php:372
#: src/Admin/VersionAdminController.php:164
#: src/Admin/VersionAdminController.php:393
msgid "Uploaded file"
msgstr "Hochgeladene Datei"
#: src/Admin/VersionAdminController.php:159
#: src/Admin/VersionAdminController.php:375
#: src/Admin/VersionAdminController.php:167
#: src/Admin/VersionAdminController.php:396
msgid "No download file"
msgstr "Keine Download-Datei"
#: src/Admin/VersionAdminController.php:215
#: src/Admin/VersionAdminController.php:230
msgid "Are you sure you want to delete this version?"
msgstr "Sind Sie sicher, dass Sie diese Version löschen möchten?"
#: src/Admin/VersionAdminController.php:216
#: src/Admin/VersionAdminController.php:231
msgid "Please enter a version number."
msgstr "Bitte geben Sie eine Versionsnummer ein."
#: src/Admin/VersionAdminController.php:217
#: src/Admin/VersionAdminController.php:232
msgid "Please enter a valid version number (e.g., 1.0.0)."
msgstr "Bitte geben Sie eine gültige Versionsnummer ein (z.B. 1.0.0)."
#: src/Admin/VersionAdminController.php:218
#: src/Admin/VersionAdminController.php:233
msgid "An error occurred. Please try again."
msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut."
#: src/Admin/VersionAdminController.php:219
#: src/Admin/VersionAdminController.php:234
msgid "Select Download File"
msgstr "Download-Datei auswählen"
#: src/Admin/VersionAdminController.php:220
#: src/Admin/VersionAdminController.php:235
msgid "Use this file"
msgstr "Diese Datei verwenden"
#: src/Admin/VersionAdminController.php:250
#: src/Admin/VersionAdminController.php:236
msgid ""
"Invalid checksum file format. File must contain a 64-character SHA256 hash."
msgstr ""
"Ungültiges Prüfsummendateiformat. Die Datei muss einen 64-stelligen SHA256-"
"Hash enthalten."
#: src/Admin/VersionAdminController.php:237
msgid "Failed to read checksum file."
msgstr "Prüfsummendatei konnte nicht gelesen werden."
#: src/Admin/VersionAdminController.php:267
msgid "Product ID and version are required."
msgstr "Produkt-ID und Version sind erforderlich."
#: src/Admin/VersionAdminController.php:255
#: src/Admin/VersionAdminController.php:272
msgid "Invalid version format. Use semantic versioning (e.g., 1.0.0)."
msgstr ""
"Ungültiges Versionsformat. Verwenden Sie semantische Versionierung (z.B. "
"1.0.0)."
#: src/Admin/VersionAdminController.php:260
#: src/Admin/VersionAdminController.php:277
msgid "This version already exists."
msgstr "Diese Version existiert bereits."
#: src/Admin/VersionAdminController.php:266
#: src/Admin/VersionAdminController.php:283
msgid "Product not found."
msgstr "Produkt nicht gefunden."
#: src/Admin/VersionAdminController.php:270
#: src/Admin/VersionAdminController.php:287
msgid "This product is not a licensed product."
msgstr "Dieses Produkt ist kein lizensiertes Produkt."
#: src/Admin/VersionAdminController.php:283
#: src/Admin/VersionAdminController.php:304
msgid "Failed to create version."
msgstr "Version konnte nicht erstellt werden."
#: src/Admin/VersionAdminController.php:291
#: src/Admin/VersionAdminController.php:312
msgid "Version added successfully."
msgstr "Version erfolgreich hinzugefügt."
#: src/Admin/VersionAdminController.php:311
#: src/Admin/VersionAdminController.php:338
#: src/Admin/VersionAdminController.php:332
#: src/Admin/VersionAdminController.php:359
msgid "Version ID is required."
msgstr "Versions-ID ist erforderlich."
#: src/Admin/VersionAdminController.php:317
#: src/Admin/VersionAdminController.php:338
msgid "Failed to delete version."
msgstr "Version konnte nicht gelöscht werden."
#: src/Admin/VersionAdminController.php:320
#: src/Admin/VersionAdminController.php:341
msgid "Version deleted successfully."
msgstr "Version erfolgreich gelöscht."
#: src/Admin/VersionAdminController.php:344
#: src/Admin/VersionAdminController.php:365
msgid "Failed to update version."
msgstr "Version konnte nicht aktualisiert werden."
#: src/Admin/VersionAdminController.php:348
#: src/Admin/VersionAdminController.php:369
msgid "Version updated successfully."
msgstr "Version erfolgreich aktualisiert."
@@ -1031,28 +1039,32 @@ msgstr "Lizenz konnte nicht aktiviert werden."
msgid "License activated successfully."
msgstr "Lizenz erfolgreich aktiviert."
#: src/Checkout/CheckoutController.php:78
#: src/Checkout/CheckoutBlocksIntegration.php:104
msgid "License Domain"
msgstr "Lizenz-Domain"
#: src/Checkout/CheckoutController.php:81
#: src/Checkout/CheckoutBlocksIntegration.php:101
#: src/Checkout/CheckoutController.php:81
msgid "Domain for License Activation"
msgstr "Domain für Lizenz-Aktivierung"
#: src/Checkout/CheckoutController.php:82
msgid "required"
msgstr "erforderlich"
#: src/Checkout/CheckoutController.php:93
#: src/Checkout/CheckoutBlocksIntegration.php:103
#: src/Checkout/CheckoutController.php:93
msgid ""
"Enter the domain where you will use this license (without http:// or www)."
msgstr ""
"Geben Sie die Domain ein, auf der Sie diese Lizenz verwenden möchten (ohne "
"http:// oder www)."
#: src/Checkout/CheckoutBlocksIntegration.php:104
#: src/Checkout/CheckoutController.php:78
msgid "License Domain"
msgstr "Lizenz-Domain"
#: src/Checkout/CheckoutBlocksIntegration.php:105
msgid "Please enter a valid domain for your license activation."
msgstr "Bitte geben Sie eine gültige Domain für Ihre Lizenz-Aktivierung ein."
#: src/Checkout/CheckoutController.php:82
msgid "required"
msgstr "erforderlich"
#: src/Checkout/CheckoutController.php:115
msgid "Please enter a domain for your license activation."
msgstr "Bitte geben Sie eine Domain für Ihre Lizenz-Aktivierung ein."
@@ -1067,10 +1079,6 @@ msgstr "Bitte geben Sie einen gültigen Domain-Namen ein."
msgid "License Domain:"
msgstr "Lizenz-Domain:"
#: src/Checkout/CheckoutBlocksIntegration.php:105
msgid "Please enter a valid domain for your license activation."
msgstr "Bitte geben Sie eine gültige Domain für Ihre Lizenz-Aktivierung ein."
#: src/Checkout/StoreApiExtension.php:85
msgid "Domain for license activation"
msgstr "Domain für Lizenz-Aktivierung"
@@ -1080,7 +1088,7 @@ msgstr "Domain für Lizenz-Aktivierung"
#: src/Email/LicenseEmailController.php:281
#: src/Email/LicenseExpirationEmail.php:207
#: src/Email/LicenseExpirationEmail.php:270
#: src/Frontend/AccountController.php:189
#: src/Frontend/AccountController.php:190
msgid "License Key:"
msgstr "Lizenzschlüssel:"
@@ -1095,7 +1103,7 @@ msgstr "Lizensierte Domain:"
#: src/Email/LicenseEmailController.php:248
#: src/Email/LicenseEmailController.php:287
#: src/Frontend/AccountController.php:217
#: src/Frontend/AccountController.php:218
msgid "Never"
msgstr "Nie"
@@ -1112,7 +1120,7 @@ msgstr "IHRE LIZENZSCHLÜSSEL"
#: src/Email/LicenseEmailController.php:284
#: src/Email/LicenseExpirationEmail.php:219
#: src/Email/LicenseExpirationEmail.php:272
#: src/Frontend/AccountController.php:212
#: src/Frontend/AccountController.php:213
msgid "Expires:"
msgstr "Läuft ab:"
@@ -1141,7 +1149,7 @@ msgid "License Expiration Notice"
msgstr "Lizenzablauf-Benachrichtigung"
#: src/Email/LicenseExpirationEmail.php:107
#: src/Frontend/AccountController.php:139 src/License/LicenseManager.php:760
#: src/Frontend/AccountController.php:140 src/License/LicenseManager.php:760
msgid "Unknown Product"
msgstr "Unbekanntes Produkt"
@@ -1175,7 +1183,7 @@ msgstr "Produkt:"
#: src/Email/LicenseExpirationEmail.php:215
#: src/Email/LicenseExpirationEmail.php:271
#: src/Frontend/AccountController.php:200
#: src/Frontend/AccountController.php:201
msgid "Domain:"
msgstr "Domain:"
@@ -1192,7 +1200,6 @@ msgstr ""
"Um dieses Produkt weiterhin zu nutzen, verlängern Sie bitte Ihre Lizenz vor "
"dem Ablaufdatum."
#. translators: %s: list of placeholders
#: src/Email/LicenseExpirationEmail.php:301
#, php-format
msgid "Available placeholders: %s"
@@ -1234,61 +1241,61 @@ msgstr "Wählen Sie, welches E-Mail-Format gesendet werden soll."
msgid "Please log in to view your licenses."
msgstr "Bitte melden Sie sich an, um Ihre Lizenzen zu sehen."
#: src/Frontend/AccountController.php:164
#: src/Frontend/AccountController.php:165
msgid "You have no licenses yet."
msgstr "Sie haben noch keine Lizenzen."
#: src/Frontend/AccountController.php:206
#: src/Frontend/AccountController.php:207
msgid "Transfer to new domain"
msgstr "Auf neue Domain übertragen"
#: src/Frontend/AccountController.php:208
#: src/Frontend/AccountController.php:209
msgid "Transfer"
msgstr "Übertragen"
#: src/Frontend/AccountController.php:225
#: src/Frontend/AccountController.php:226
msgid "Available Downloads"
msgstr "Verfügbare Downloads"
#: src/Frontend/AccountController.php:231
#: src/Frontend/AccountController.php:232
#, php-format
msgid "Version %s"
msgstr "Version %s"
#: src/Frontend/AccountController.php:248
#: src/Frontend/AccountController.php:249
msgid "Close"
msgstr "Schliessen"
#: src/Frontend/AccountController.php:249
#: src/Frontend/AccountController.php:250
msgid "Transfer License to New Domain"
msgstr "Lizenz auf neue Domain übertragen"
#: src/Frontend/AccountController.php:254
#: src/Frontend/AccountController.php:255
msgid "Current Domain"
msgstr "Aktuelle Domain"
#: src/Frontend/AccountController.php:259
#: src/Frontend/AccountController.php:260
msgid "New Domain"
msgstr "Neue Domain"
#: src/Frontend/AccountController.php:263
#: src/Frontend/AccountController.php:264
msgid "Enter the new domain without http:// or www."
msgstr "Geben Sie die neue Domain ohne http:// oder www ein."
#: src/Frontend/AccountController.php:268
#: src/Frontend/AccountController.php:269
msgid "Transfer License"
msgstr "Lizenz übertragen"
#: src/Frontend/AccountController.php:310
#: src/Frontend/AccountController.php:377
#: src/Frontend/AccountController.php:311
#: src/Frontend/AccountController.php:378
msgid "License transferred successfully!"
msgstr "Lizenz erfolgreich übertragen!"
#: src/Frontend/AccountController.php:311
#: src/Frontend/AccountController.php:312
msgid "Transfer failed. Please try again."
msgstr "Übertragung fehlgeschlagen. Bitte versuchen Sie es erneut."
#: src/Frontend/AccountController.php:312
#: src/Frontend/AccountController.php:313
msgid ""
"Are you sure you want to transfer this license to a new domain? This action "
"cannot be undone."
@@ -1296,31 +1303,31 @@ msgstr ""
"Sind Sie sicher, dass Sie diese Lizenz auf eine neue Domain übertragen "
"möchten? Diese Aktion kann nicht rückgängig gemacht werden."
#: src/Frontend/AccountController.php:331
#: src/Frontend/AccountController.php:332
msgid "Please log in to transfer a license."
msgstr "Bitte melden Sie sich an, um eine Lizenz zu übertragen."
#: src/Frontend/AccountController.php:337
#: src/Frontend/AccountController.php:338
msgid "Invalid license."
msgstr "Ungültige Lizenz."
#: src/Frontend/AccountController.php:355
#: src/Frontend/AccountController.php:356
msgid "You do not have permission to transfer this license."
msgstr "Sie haben keine Berechtigung, diese Lizenz zu übertragen."
#: src/Frontend/AccountController.php:360
#: src/Frontend/AccountController.php:361
msgid "Revoked licenses cannot be transferred."
msgstr "Widerrufene Lizenzen können nicht übertragen werden."
#: src/Frontend/AccountController.php:364
#: src/Frontend/AccountController.php:365
msgid "Expired licenses cannot be transferred."
msgstr "Abgelaufene Lizenzen können nicht übertragen werden."
#: src/Frontend/AccountController.php:369
#: src/Frontend/AccountController.php:370
msgid "The new domain is the same as the current domain."
msgstr "Die neue Domain ist dieselbe wie die aktuelle Domain."
#: src/Frontend/AccountController.php:381
#: src/Frontend/AccountController.php:382
msgid "Failed to transfer license. Please try again."
msgstr "Lizenzübertragung fehlgeschlagen. Bitte versuchen Sie es erneut."
@@ -1404,7 +1411,6 @@ msgstr "Lizenz-Einstellungen"
msgid "%d days"
msgstr "%d Tage"
#. translators: %s: URL to settings page
#: src/Product/LicensedProductType.php:113
#, php-format
msgid "Leave fields empty to use default settings from %s."
@@ -1418,7 +1424,6 @@ msgstr "WooCommerce > Einstellungen > Lizensierte Produkte"
msgid "Max Activations"
msgstr "Max. Aktivierungen"
#. translators: %d: default max activations value
#: src/Product/LicensedProductType.php:125
#, php-format
msgid "Maximum number of domain activations per license. Default: %d"
@@ -1428,7 +1433,6 @@ msgstr "Maximale Anzahl der Domain-Aktivierungen pro Lizenz. Standard: %d"
msgid "License Validity (Days)"
msgstr "Lizenz-Gültigkeit (Tage)"
#. translators: %s: default validity value
#: src/Product/LicensedProductType.php:143
#, php-format
msgid "Number of days the license is valid. Leave empty for default (%s)."
@@ -1438,7 +1442,6 @@ msgstr "Anzahl Tage, die die Lizenz gültig ist. Leer lassen für Standard (%s).
msgid "Bind to Major Version"
msgstr "An Hauptversion binden"
#. translators: %s: default bind to version value (Yes/No)
#: src/Product/LicensedProductType.php:161
#, php-format
msgid ""
@@ -1456,32 +1459,34 @@ msgstr "Ja"
msgid "No"
msgstr "Nein"
#: src/Admin/VersionAdminController.php:101
msgid "SHA256 Hash"
msgstr "SHA256 Prüfsumme"
#: src/Admin/VersionAdminController.php:103
msgid "Enter SHA256 checksum..."
msgstr "SHA256 Prüfsumme eingeben..."
#: src/Admin/VersionAdminController.php:104
msgid ""
"SHA256 checksum of the uploaded file (optional but recommended for integrity "
"verification)."
msgstr ""
"SHA256 Prüfsumme der hochgeladenen Datei (optional, aber empfohlen zur "
"Integritätsprüfung)."
#: src/Product/VersionManager.php:67
#: src/Product/VersionManager.php:166
msgid "Attachment file not found."
msgstr "Anhangs-Datei nicht gefunden."
#. translators: 1: provided hash, 2: calculated hash
#: src/Product/VersionManager.php:73
#: src/Product/VersionManager.php:177
#, php-format
msgid "File checksum does not match. Expected: %1$s, Got: %2$s"
msgstr "Datei-Prüfsumme stimmt nicht überein. Erwartet: %1$s, Erhalten: %2$s"
#~ msgid "Or External URL"
#~ msgstr "Oder externe URL"
#~ msgid ""
#~ "Alternative: Enter an external download URL instead of uploading a file."
#~ msgstr ""
#~ "Alternativ: Geben Sie eine externe Download-URL ein, anstatt eine Datei "
#~ "hochzuladen."
#~ msgid "Enter SHA256 checksum..."
#~ msgstr "SHA256 Prüfsumme eingeben..."
#~ msgid ""
#~ "SHA256 checksum of the uploaded file (optional but recommended for "
#~ "integrity verification)."
#~ msgstr ""
#~ "SHA256 Prüfsumme der hochgeladenen Datei (optional, aber empfohlen zur "
#~ "Integritätsprüfung)."
#~ msgid "Maximum number of domain activations per license. Default: 1"
#~ msgstr "Maximale Anzahl der Domain-Aktivierungen pro Lizenz. Standard: 1"

View File

@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: WooCommerce Licensed Product 0.2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-22 11:52+0100\n"
"Project-Id-Version: WooCommerce Licensed Product 0.2.2\n"
"Report-Msgid-Bugs-To: magdev3.0@gmail.com\n"
"POT-Creation-Date: 2026-01-22 17:32+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,7 +18,6 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#. translators: %s: WooCommerce plugin name
#: wc-licensed-product.php:61
#, php-format
msgid "%s requires WooCommerce to be installed and active."
@@ -81,7 +80,7 @@ msgstr ""
#: src/Admin/AdminController.php:146 src/Admin/AdminController.php:1303
#: src/Admin/AdminController.php:1323 src/Admin/AdminController.php:1344
#: src/Admin/OrderLicenseController.php:185
#: src/Frontend/AccountController.php:270
#: src/Frontend/AccountController.php:271
msgid "Cancel"
msgstr ""
@@ -99,25 +98,25 @@ msgstr ""
msgid "Lifetime"
msgstr ""
#: src/Admin/AdminController.php:149 src/Frontend/AccountController.php:308
#: src/Admin/AdminController.php:149 src/Frontend/AccountController.php:309
msgid "Copied!"
msgstr ""
#: src/Admin/AdminController.php:150 src/Frontend/AccountController.php:309
#: src/Admin/AdminController.php:150 src/Frontend/AccountController.php:310
msgid "Copy failed"
msgstr ""
#: src/Admin/AdminController.php:153 src/Admin/AdminController.php:875
#: src/Admin/AdminController.php:1194 src/Admin/AdminController.php:1317
#: src/Admin/VersionAdminController.php:165
#: src/Admin/VersionAdminController.php:381
#: src/Admin/VersionAdminController.php:180
#: src/Admin/VersionAdminController.php:409
msgid "Active"
msgstr ""
#: src/Admin/AdminController.php:154 src/Admin/AdminController.php:882
#: src/Admin/AdminController.php:1195 src/Admin/AdminController.php:1318
#: src/Admin/VersionAdminController.php:165
#: src/Admin/VersionAdminController.php:381
#: src/Admin/VersionAdminController.php:180
#: src/Admin/VersionAdminController.php:409
msgid "Inactive"
msgstr ""
@@ -135,9 +134,9 @@ msgstr ""
#: src/Admin/AdminController.php:246 src/Admin/AdminController.php:298
#: src/Admin/AdminController.php:336 src/Admin/OrderLicenseController.php:301
#: src/Admin/OrderLicenseController.php:340
#: src/Admin/VersionAdminController.php:240
#: src/Admin/VersionAdminController.php:305
#: src/Admin/VersionAdminController.php:331
#: src/Admin/VersionAdminController.php:257
#: src/Admin/VersionAdminController.php:326
#: src/Admin/VersionAdminController.php:352
msgid "Permission denied."
msgstr ""
@@ -208,7 +207,7 @@ msgstr ""
#: src/Admin/AdminController.php:466 src/Admin/AdminController.php:484
#: src/Admin/AdminController.php:504 src/Admin/AdminController.php:522
#: src/Admin/AdminController.php:589 src/Admin/AdminController.php:779
#: src/Frontend/AccountController.php:325
#: src/Frontend/AccountController.php:326
msgid "Security check failed."
msgstr ""
@@ -284,7 +283,6 @@ msgstr ""
msgid "License set to lifetime successfully."
msgstr ""
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1068
#, php-format
msgid "%d license activated."
@@ -292,7 +290,6 @@ msgid_plural "%d licenses activated."
msgstr[0] ""
msgstr[1] ""
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1076
#, php-format
msgid "%d license deactivated."
@@ -300,7 +297,6 @@ msgid_plural "%d licenses deactivated."
msgstr[0] ""
msgstr[1] ""
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1084
#, php-format
msgid "%d license revoked."
@@ -308,7 +304,6 @@ msgid_plural "%d licenses revoked."
msgstr[0] ""
msgstr[1] ""
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1092
#, php-format
msgid "%d license deleted."
@@ -316,7 +311,6 @@ msgid_plural "%d licenses deleted."
msgstr[0] ""
msgstr[1] ""
#. translators: %d: number of licenses
#: src/Admin/AdminController.php:1100
#, php-format
msgid "%d license extended."
@@ -336,7 +330,6 @@ msgstr ""
msgid "No licenses to export."
msgstr ""
#. translators: %d: number of licenses imported
#: src/Admin/AdminController.php:1121
#, php-format
msgid "%d license imported."
@@ -344,7 +337,6 @@ msgid_plural "%d licenses imported."
msgstr[0] ""
msgstr[1] ""
#. translators: %d: number of licenses updated
#: src/Admin/AdminController.php:1128
#, php-format
msgid "%d updated."
@@ -352,7 +344,6 @@ msgid_plural "%d updated."
msgstr[0] ""
msgstr[1] ""
#. translators: %d: number of licenses skipped
#: src/Admin/AdminController.php:1136
#, php-format
msgid "%d skipped."
@@ -360,7 +351,6 @@ msgid_plural "%d skipped."
msgstr[0] ""
msgstr[1] ""
#. translators: %d: number of errors
#: src/Admin/AdminController.php:1144
#, php-format
msgid "%d error."
@@ -437,14 +427,14 @@ msgid "Bulk Actions"
msgstr ""
#: src/Admin/AdminController.php:1235 src/Admin/AdminController.php:1407
#: src/Admin/VersionAdminController.php:171
#: src/Admin/VersionAdminController.php:387
#: src/Admin/VersionAdminController.php:186
#: src/Admin/VersionAdminController.php:415
msgid "Activate"
msgstr ""
#: src/Admin/AdminController.php:1236 src/Admin/AdminController.php:1408
#: src/Admin/VersionAdminController.php:171
#: src/Admin/VersionAdminController.php:387
#: src/Admin/VersionAdminController.php:186
#: src/Admin/VersionAdminController.php:415
msgid "Deactivate"
msgstr ""
@@ -466,8 +456,8 @@ msgid "Extend 1 year"
msgstr ""
#: src/Admin/AdminController.php:1241 src/Admin/AdminController.php:1377
#: src/Admin/AdminController.php:1413 src/Admin/VersionAdminController.php:174
#: src/Admin/VersionAdminController.php:390
#: src/Admin/AdminController.php:1413 src/Admin/VersionAdminController.php:189
#: src/Admin/VersionAdminController.php:418
msgid "Delete"
msgstr ""
@@ -499,7 +489,7 @@ msgstr ""
#: src/Admin/AdminController.php:1257 src/Admin/AdminController.php:1395
#: src/Admin/OrderLicenseController.php:147
#: src/Admin/VersionAdminController.php:132
#: src/Admin/VersionAdminController.php:140
msgid "Status"
msgstr ""
@@ -515,7 +505,7 @@ msgstr ""
#: src/Admin/AdminController.php:1260 src/Admin/AdminController.php:1398
#: src/Admin/OrderLicenseController.php:149
#: src/Admin/VersionAdminController.php:134
#: src/Admin/VersionAdminController.php:142
msgid "Actions"
msgstr ""
@@ -523,7 +513,7 @@ msgstr ""
msgid "No licenses found."
msgstr ""
#: src/Admin/AdminController.php:1276 src/Frontend/AccountController.php:193
#: src/Admin/AdminController.php:1276 src/Frontend/AccountController.php:194
msgid "Copy to clipboard"
msgstr ""
@@ -670,8 +660,8 @@ msgid ""
msgstr ""
#: src/Admin/OrderLicenseController.php:116
#: src/Checkout/CheckoutController.php:89
#: src/Checkout/CheckoutBlocksIntegration.php:102
#: src/Checkout/CheckoutController.php:89
msgid "example.com"
msgstr ""
@@ -697,7 +687,6 @@ msgstr ""
msgid "View in Licenses"
msgstr ""
#. translators: %s: Link to licenses page
#: src/Admin/OrderLicenseController.php:221
#, php-format
msgid "For more actions (revoke, extend, delete), go to the %s page."
@@ -712,8 +701,8 @@ msgid "Error saving. Please try again."
msgstr ""
#: src/Admin/OrderLicenseController.php:288
#: src/Frontend/AccountController.php:313
#: src/Frontend/AccountController.php:345
#: src/Frontend/AccountController.php:314
#: src/Frontend/AccountController.php:346
msgid "Please enter a valid domain."
msgstr ""
@@ -731,7 +720,7 @@ msgid "Order domain updated."
msgstr ""
#: src/Admin/OrderLicenseController.php:363
#: src/Frontend/AccountController.php:351
#: src/Frontend/AccountController.php:352
#: src/Frontend/DownloadController.php:105
msgid "License not found."
msgstr ""
@@ -790,7 +779,6 @@ msgstr ""
msgid "Expiration Warning Schedule"
msgstr ""
#. translators: %s: URL to WooCommerce email settings
#: src/Admin/SettingsController.php:101
#, php-format
msgid ""
@@ -828,7 +816,7 @@ msgid "Add New Version"
msgstr ""
#: src/Admin/VersionAdminController.php:81
#: src/Admin/VersionAdminController.php:129
#: src/Admin/VersionAdminController.php:136
msgid "Version"
msgstr ""
@@ -837,7 +825,7 @@ msgid "Use semantic versioning (e.g., 1.0.0)"
msgstr ""
#: src/Admin/VersionAdminController.php:88
#: src/Admin/VersionAdminController.php:130
#: src/Admin/VersionAdminController.php:137
msgid "Download File"
msgstr ""
@@ -846,6 +834,7 @@ msgid "Select File"
msgstr ""
#: src/Admin/VersionAdminController.php:96
#: src/Admin/VersionAdminController.php:110
msgid "Remove"
msgstr ""
@@ -856,115 +845,132 @@ msgid ""
msgstr ""
#: src/Admin/VersionAdminController.php:102
msgid "Or External URL"
msgid "Checksum File"
msgstr ""
#: src/Admin/VersionAdminController.php:105
#: src/Admin/VersionAdminController.php:107
msgid "Select Checksum File"
msgstr ""
#: src/Admin/VersionAdminController.php:112
msgid ""
"Alternative: Enter an external download URL instead of uploading a file."
"Upload a SHA256 checksum file (.sha256 or .txt) to verify file integrity."
msgstr ""
#: src/Admin/VersionAdminController.php:109
#: src/Admin/VersionAdminController.php:131
#: src/Admin/VersionAdminController.php:116
#: src/Admin/VersionAdminController.php:139
msgid "Release Notes"
msgstr ""
#: src/Admin/VersionAdminController.php:117
#: src/Admin/VersionAdminController.php:124
msgid "Add Version"
msgstr ""
#: src/Admin/VersionAdminController.php:125
#: src/Admin/VersionAdminController.php:132
msgid "Existing Versions"
msgstr ""
#: src/Admin/VersionAdminController.php:133
#: src/Admin/VersionAdminController.php:138
msgid "SHA256"
msgstr ""
#: src/Admin/VersionAdminController.php:141
msgid "Released"
msgstr ""
#: src/Admin/VersionAdminController.php:140
#: src/Admin/VersionAdminController.php:148
msgid "No versions found. Add your first version above."
msgstr ""
#: src/Admin/VersionAdminController.php:156
#: src/Admin/VersionAdminController.php:372
#: src/Admin/VersionAdminController.php:164
#: src/Admin/VersionAdminController.php:393
msgid "Uploaded file"
msgstr ""
#: src/Admin/VersionAdminController.php:159
#: src/Admin/VersionAdminController.php:375
#: src/Admin/VersionAdminController.php:167
#: src/Admin/VersionAdminController.php:396
msgid "No download file"
msgstr ""
#: src/Admin/VersionAdminController.php:215
#: src/Admin/VersionAdminController.php:230
msgid "Are you sure you want to delete this version?"
msgstr ""
#: src/Admin/VersionAdminController.php:216
#: src/Admin/VersionAdminController.php:231
msgid "Please enter a version number."
msgstr ""
#: src/Admin/VersionAdminController.php:217
#: src/Admin/VersionAdminController.php:232
msgid "Please enter a valid version number (e.g., 1.0.0)."
msgstr ""
#: src/Admin/VersionAdminController.php:218
#: src/Admin/VersionAdminController.php:233
msgid "An error occurred. Please try again."
msgstr ""
#: src/Admin/VersionAdminController.php:219
#: src/Admin/VersionAdminController.php:234
msgid "Select Download File"
msgstr ""
#: src/Admin/VersionAdminController.php:220
#: src/Admin/VersionAdminController.php:235
msgid "Use this file"
msgstr ""
#: src/Admin/VersionAdminController.php:250
#: src/Admin/VersionAdminController.php:236
msgid ""
"Invalid checksum file format. File must contain a 64-character SHA256 hash."
msgstr ""
#: src/Admin/VersionAdminController.php:237
msgid "Failed to read checksum file."
msgstr ""
#: src/Admin/VersionAdminController.php:267
msgid "Product ID and version are required."
msgstr ""
#: src/Admin/VersionAdminController.php:255
#: src/Admin/VersionAdminController.php:272
msgid "Invalid version format. Use semantic versioning (e.g., 1.0.0)."
msgstr ""
#: src/Admin/VersionAdminController.php:260
#: src/Admin/VersionAdminController.php:277
msgid "This version already exists."
msgstr ""
#: src/Admin/VersionAdminController.php:266
#: src/Admin/VersionAdminController.php:283
msgid "Product not found."
msgstr ""
#: src/Admin/VersionAdminController.php:270
#: src/Admin/VersionAdminController.php:287
msgid "This product is not a licensed product."
msgstr ""
#: src/Admin/VersionAdminController.php:283
#: src/Admin/VersionAdminController.php:304
msgid "Failed to create version."
msgstr ""
#: src/Admin/VersionAdminController.php:291
#: src/Admin/VersionAdminController.php:312
msgid "Version added successfully."
msgstr ""
#: src/Admin/VersionAdminController.php:311
#: src/Admin/VersionAdminController.php:338
#: src/Admin/VersionAdminController.php:332
#: src/Admin/VersionAdminController.php:359
msgid "Version ID is required."
msgstr ""
#: src/Admin/VersionAdminController.php:317
#: src/Admin/VersionAdminController.php:338
msgid "Failed to delete version."
msgstr ""
#: src/Admin/VersionAdminController.php:320
#: src/Admin/VersionAdminController.php:341
msgid "Version deleted successfully."
msgstr ""
#: src/Admin/VersionAdminController.php:344
#: src/Admin/VersionAdminController.php:365
msgid "Failed to update version."
msgstr ""
#: src/Admin/VersionAdminController.php:348
#: src/Admin/VersionAdminController.php:369
msgid "Version updated successfully."
msgstr ""
@@ -997,26 +1003,30 @@ msgstr ""
msgid "License activated successfully."
msgstr ""
#: src/Checkout/CheckoutController.php:78
#: src/Checkout/CheckoutBlocksIntegration.php:101
#: src/Checkout/CheckoutController.php:81
msgid "Domain for License Activation"
msgstr ""
#: src/Checkout/CheckoutBlocksIntegration.php:103
#: src/Checkout/CheckoutController.php:93
msgid ""
"Enter the domain where you will use this license (without http:// or www)."
msgstr ""
#: src/Checkout/CheckoutBlocksIntegration.php:104
#: src/Checkout/CheckoutController.php:78
msgid "License Domain"
msgstr ""
#: src/Checkout/CheckoutController.php:81
#: src/Checkout/CheckoutBlocksIntegration.php:101
msgid "Domain for License Activation"
#: src/Checkout/CheckoutBlocksIntegration.php:105
msgid "Please enter a valid domain for your license activation."
msgstr ""
#: src/Checkout/CheckoutController.php:82
msgid "required"
msgstr ""
#: src/Checkout/CheckoutController.php:93
#: src/Checkout/CheckoutBlocksIntegration.php:103
msgid ""
"Enter the domain where you will use this license (without http:// or www)."
msgstr ""
#: src/Checkout/CheckoutController.php:115
msgid "Please enter a domain for your license activation."
msgstr ""
@@ -1031,10 +1041,6 @@ msgstr ""
msgid "License Domain:"
msgstr ""
#: src/Checkout/CheckoutBlocksIntegration.php:105
msgid "Please enter a valid domain for your license activation."
msgstr ""
#: src/Checkout/StoreApiExtension.php:85
msgid "Domain for license activation"
msgstr ""
@@ -1044,7 +1050,7 @@ msgstr ""
#: src/Email/LicenseEmailController.php:281
#: src/Email/LicenseExpirationEmail.php:207
#: src/Email/LicenseExpirationEmail.php:270
#: src/Frontend/AccountController.php:189
#: src/Frontend/AccountController.php:190
msgid "License Key:"
msgstr ""
@@ -1059,7 +1065,7 @@ msgstr ""
#: src/Email/LicenseEmailController.php:248
#: src/Email/LicenseEmailController.php:287
#: src/Frontend/AccountController.php:217
#: src/Frontend/AccountController.php:218
msgid "Never"
msgstr ""
@@ -1075,7 +1081,7 @@ msgstr ""
#: src/Email/LicenseEmailController.php:284
#: src/Email/LicenseExpirationEmail.php:219
#: src/Email/LicenseExpirationEmail.php:272
#: src/Frontend/AccountController.php:212
#: src/Frontend/AccountController.php:213
msgid "Expires:"
msgstr ""
@@ -1100,7 +1106,7 @@ msgid "License Expiration Notice"
msgstr ""
#: src/Email/LicenseExpirationEmail.php:107
#: src/Frontend/AccountController.php:139 src/License/LicenseManager.php:760
#: src/Frontend/AccountController.php:140 src/License/LicenseManager.php:760
msgid "Unknown Product"
msgstr ""
@@ -1134,7 +1140,7 @@ msgstr ""
#: src/Email/LicenseExpirationEmail.php:215
#: src/Email/LicenseExpirationEmail.php:271
#: src/Frontend/AccountController.php:200
#: src/Frontend/AccountController.php:201
msgid "Domain:"
msgstr ""
@@ -1149,7 +1155,6 @@ msgid ""
"expiration date."
msgstr ""
#. translators: %s: list of placeholders
#: src/Email/LicenseExpirationEmail.php:301
#, php-format
msgid "Available placeholders: %s"
@@ -1191,91 +1196,91 @@ msgstr ""
msgid "Please log in to view your licenses."
msgstr ""
#: src/Frontend/AccountController.php:164
#: src/Frontend/AccountController.php:165
msgid "You have no licenses yet."
msgstr ""
#: src/Frontend/AccountController.php:206
#: src/Frontend/AccountController.php:207
msgid "Transfer to new domain"
msgstr ""
#: src/Frontend/AccountController.php:208
#: src/Frontend/AccountController.php:209
msgid "Transfer"
msgstr ""
#: src/Frontend/AccountController.php:225
#: src/Frontend/AccountController.php:226
msgid "Available Downloads"
msgstr ""
#: src/Frontend/AccountController.php:231
#: src/Frontend/AccountController.php:232
#, php-format
msgid "Version %s"
msgstr ""
#: src/Frontend/AccountController.php:248
#: src/Frontend/AccountController.php:249
msgid "Close"
msgstr ""
#: src/Frontend/AccountController.php:249
#: src/Frontend/AccountController.php:250
msgid "Transfer License to New Domain"
msgstr ""
#: src/Frontend/AccountController.php:254
#: src/Frontend/AccountController.php:255
msgid "Current Domain"
msgstr ""
#: src/Frontend/AccountController.php:259
#: src/Frontend/AccountController.php:260
msgid "New Domain"
msgstr ""
#: src/Frontend/AccountController.php:263
#: src/Frontend/AccountController.php:264
msgid "Enter the new domain without http:// or www."
msgstr ""
#: src/Frontend/AccountController.php:268
#: src/Frontend/AccountController.php:269
msgid "Transfer License"
msgstr ""
#: src/Frontend/AccountController.php:310
#: src/Frontend/AccountController.php:377
#: src/Frontend/AccountController.php:311
#: src/Frontend/AccountController.php:378
msgid "License transferred successfully!"
msgstr ""
#: src/Frontend/AccountController.php:311
#: src/Frontend/AccountController.php:312
msgid "Transfer failed. Please try again."
msgstr ""
#: src/Frontend/AccountController.php:312
#: src/Frontend/AccountController.php:313
msgid ""
"Are you sure you want to transfer this license to a new domain? This action "
"cannot be undone."
msgstr ""
#: src/Frontend/AccountController.php:331
#: src/Frontend/AccountController.php:332
msgid "Please log in to transfer a license."
msgstr ""
#: src/Frontend/AccountController.php:337
#: src/Frontend/AccountController.php:338
msgid "Invalid license."
msgstr ""
#: src/Frontend/AccountController.php:355
#: src/Frontend/AccountController.php:356
msgid "You do not have permission to transfer this license."
msgstr ""
#: src/Frontend/AccountController.php:360
#: src/Frontend/AccountController.php:361
msgid "Revoked licenses cannot be transferred."
msgstr ""
#: src/Frontend/AccountController.php:364
#: src/Frontend/AccountController.php:365
msgid "Expired licenses cannot be transferred."
msgstr ""
#: src/Frontend/AccountController.php:369
#: src/Frontend/AccountController.php:370
msgid "The new domain is the same as the current domain."
msgstr ""
#: src/Frontend/AccountController.php:381
#: src/Frontend/AccountController.php:382
msgid "Failed to transfer license. Please try again."
msgstr ""
@@ -1359,7 +1364,6 @@ msgstr ""
msgid "%d days"
msgstr ""
#. translators: %s: URL to settings page
#: src/Product/LicensedProductType.php:113
#, php-format
msgid "Leave fields empty to use default settings from %s."
@@ -1373,7 +1377,6 @@ msgstr ""
msgid "Max Activations"
msgstr ""
#. translators: %d: default max activations value
#: src/Product/LicensedProductType.php:125
#, php-format
msgid "Maximum number of domain activations per license. Default: %d"
@@ -1383,7 +1386,6 @@ msgstr ""
msgid "License Validity (Days)"
msgstr ""
#. translators: %s: default validity value
#: src/Product/LicensedProductType.php:143
#, php-format
msgid "Number of days the license is valid. Leave empty for default (%s)."
@@ -1393,7 +1395,6 @@ msgstr ""
msgid "Bind to Major Version"
msgstr ""
#. translators: %s: default bind to version value (Yes/No)
#: src/Product/LicensedProductType.php:161
#, php-format
msgid ""
@@ -1409,24 +1410,11 @@ msgstr ""
msgid "No"
msgstr ""
#: src/Admin/VersionAdminController.php:101
msgid "SHA256 Hash"
msgstr ""
#: src/Admin/VersionAdminController.php:103
msgid "Enter SHA256 checksum..."
msgstr ""
#: src/Admin/VersionAdminController.php:104
msgid "SHA256 checksum of the uploaded file (optional but recommended for integrity verification)."
msgstr ""
#: src/Product/VersionManager.php:67
#: src/Product/VersionManager.php:166
msgid "Attachment file not found."
msgstr ""
#. translators: 1: provided hash, 2: calculated hash
#: src/Product/VersionManager.php:73
#: src/Product/VersionManager.php:177
#, php-format
msgid "File checksum does not match. Expected: %1$s, Got: %2$s"
msgstr ""

View File

@@ -0,0 +1 @@
20d90f61721b4579cb979cd19b0262f3286c3510dcb0345fe5e8da2703e3836f wc-licensed-product-0.2.0.zip

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
7b895090538f9063fac1509b6f7a40a2b71dc9958b3a255cbfcc60d0320ae5e5 releases/wc-licensed-product-0.2.1.zip

View File

@@ -99,10 +99,17 @@ final class VersionAdminController
</td>
</tr>
<tr id="sha256-hash-row" style="display: none;">
<th><label for="new_file_hash"><?php esc_html_e('SHA256 Hash', 'wc-licensed-product'); ?></label></th>
<th><label for="new_checksum_file"><?php esc_html_e('Checksum File', 'wc-licensed-product'); ?></label></th>
<td>
<input type="text" id="new_file_hash" name="new_file_hash" class="large-text" placeholder="<?php esc_attr_e('Enter SHA256 checksum...', 'wc-licensed-product'); ?>" pattern="[a-fA-F0-9]{64}" />
<p class="description"><?php esc_html_e('SHA256 checksum of the uploaded file (optional but recommended for integrity verification).', 'wc-licensed-product'); ?></p>
<input type="file" id="new_checksum_file" name="new_checksum_file" accept=".sha256,.txt" style="display: none;" />
<span id="selected_checksum_name" class="selected-file-name"></span>
<button type="button" class="button" id="select-checksum-file-btn">
<?php esc_html_e('Select Checksum File', 'wc-licensed-product'); ?>
</button>
<button type="button" class="button" id="remove-checksum-file-btn" style="display: none;">
<?php esc_html_e('Remove', 'wc-licensed-product'); ?>
</button>
<p class="description"><?php esc_html_e('Upload a SHA256 checksum file (.sha256 or .txt) to verify file integrity.', 'wc-licensed-product'); ?></p>
</td>
</tr>
<tr>
@@ -128,6 +135,7 @@ final class VersionAdminController
<tr>
<th><?php esc_html_e('Version', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Download File', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('SHA256', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Release Notes', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Status', 'wc-licensed-product'); ?></th>
<th><?php esc_html_e('Released', 'wc-licensed-product'); ?></th>
@@ -137,7 +145,7 @@ final class VersionAdminController
<tbody>
<?php if (empty($versions)): ?>
<tr class="no-versions">
<td colspan="6"><?php esc_html_e('No versions found. Add your first version above.', 'wc-licensed-product'); ?></td>
<td colspan="7"><?php esc_html_e('No versions found. Add your first version above.', 'wc-licensed-product'); ?></td>
</tr>
<?php else: ?>
<?php foreach ($versions as $version): ?>
@@ -159,6 +167,13 @@ final class VersionAdminController
<em><?php esc_html_e('No download file', 'wc-licensed-product'); ?></em>
<?php endif; ?>
</td>
<td>
<?php if ($version->getFileHash()): ?>
<code class="file-hash" title="<?php echo esc_attr($version->getFileHash()); ?>"><?php echo esc_html(substr($version->getFileHash(), 0, 12)); ?>...</code>
<?php else: ?>
<em>—</em>
<?php endif; ?>
</td>
<td><?php echo esc_html($version->getReleaseNotes() ? wp_trim_words($version->getReleaseNotes(), 10) : '—'); ?></td>
<td>
<span class="version-status version-status-<?php echo $version->isActive() ? 'active' : 'inactive'; ?>">
@@ -218,6 +233,8 @@ final class VersionAdminController
'error' => __('An error occurred. Please try again.', 'wc-licensed-product'),
'selectFile' => __('Select Download File', 'wc-licensed-product'),
'useThisFile' => __('Use this file', 'wc-licensed-product'),
'invalidChecksumFile' => __('Invalid checksum file format. File must contain a 64-character SHA256 hash.', 'wc-licensed-product'),
'checksumReadError' => __('Failed to read checksum file.', 'wc-licensed-product'),
],
]);
@@ -379,6 +396,13 @@ final class VersionAdminController
<em><?php esc_html_e('No download file', 'wc-licensed-product'); ?></em>
<?php endif; ?>
</td>
<td>
<?php if ($version->getFileHash()): ?>
<code class="file-hash" title="<?php echo esc_attr($version->getFileHash()); ?>"><?php echo esc_html(substr($version->getFileHash(), 0, 12)); ?>...</code>
<?php else: ?>
<em>—</em>
<?php endif; ?>
</td>
<td><?php echo esc_html($version->getReleaseNotes() ? wp_trim_words($version->getReleaseNotes(), 10) : '—'); ?></td>
<td>
<span class="version-status version-status-<?php echo $version->isActive() ? 'active' : 'inactive'; ?>">

View File

@@ -129,6 +129,7 @@ final class AccountController
),
'release_notes' => $version->getReleaseNotes(),
'released_at' => $version->getReleasedAt()->format(get_option('date_format')),
'file_hash' => $version->getFileHash(),
];
}
}

View File

@@ -64,6 +64,12 @@
</a>
<span class="download-version">v{{ esc_html(download.version) }}</span>
<span class="download-date">{{ esc_html(download.released_at) }}</span>
{% if download.file_hash %}
<span class="download-hash" title="{{ esc_attr(download.file_hash) }}">
<span class="dashicons dashicons-shield"></span>
<code>{{ download.file_hash[:12] }}...</code>
</span>
{% endif %}
</li>
{% endfor %}
</ul>

View File

@@ -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.2.0
* Version: 0.2.2
* 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.2.0');
define('WC_LICENSED_PRODUCT_VERSION', '0.2.2');
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__));