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] ## [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 ## [0.2.0] - 2026-01-22
### Added ### Added
@@ -340,7 +373,9 @@ define('WC_LICENSE_SERVER_SECRET', 'your-secure-random-string-min-32-chars');
- WordPress REST API integration - WordPress REST API integration
- Custom WooCommerce product type extending WC_Product - 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.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.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 [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 ### 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 ## Technical Stack

View File

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

View File

@@ -247,6 +247,30 @@
margin-left: auto; 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 */ /* Domain Field */
#licensed-product-domain-field { #licensed-product-domain-field {
margin-top: 2em; margin-top: 2em;

View File

@@ -23,6 +23,11 @@
$('#upload-version-file-btn').on('click', this.openMediaUploader.bind(this)); $('#upload-version-file-btn').on('click', this.openMediaUploader.bind(this));
$('#remove-version-file-btn').on('click', this.removeSelectedFile); $('#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 // Listen for product type changes
$('#product-type').on('change', this.onProductTypeChange); $('#product-type').on('change', this.onProductTypeChange);
@@ -101,9 +106,72 @@
$('#selected_file_name').text(''); $('#selected_file_name').text('');
$('#remove-version-file-btn').hide(); $('#remove-version-file-btn').hide();
// Hide and clear SHA256 hash field // Hide and clear checksum file field
$('#sha256-hash-row').hide(); $('#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) { addVersion: function(e) {
e.preventDefault(); e.preventDefault();
var self = WCLicensedProductVersions;
var $btn = $(this); var $btn = $(this);
var $spinner = $btn.siblings('.spinner'); var $spinner = $btn.siblings('.spinner');
var productId = $btn.data('product-id'); var productId = $btn.data('product-id');
var version = $('#new_version').val().trim(); var version = $('#new_version').val().trim();
var releaseNotes = $('#new_release_notes').val().trim(); var releaseNotes = $('#new_release_notes').val().trim();
var attachmentId = $('#new_attachment_id').val(); var attachmentId = $('#new_attachment_id').val();
var fileHash = $('#new_file_hash').val().trim(); var checksumFile = $('#new_checksum_file')[0].files[0];
// Validate version // Validate version
if (!version) { if (!version) {
@@ -156,6 +225,8 @@
$btn.prop('disabled', true); $btn.prop('disabled', true);
$spinner.addClass('is-active'); $spinner.addClass('is-active');
// Read checksum file if provided, then submit
self.readChecksumFile(checksumFile).then(function(fileHash) {
$.ajax({ $.ajax({
url: wcLicensedProductVersions.ajaxUrl, url: wcLicensedProductVersions.ajaxUrl,
type: 'POST', type: 'POST',
@@ -183,7 +254,9 @@
$('#selected_file_name').text(''); $('#selected_file_name').text('');
$('#remove-version-file-btn').hide(); $('#remove-version-file-btn').hide();
$('#sha256-hash-row').hide(); $('#sha256-hash-row').hide();
$('#new_file_hash').val(''); $('#new_checksum_file').val('');
$('#selected_checksum_name').text('');
$('#remove-checksum-file-btn').hide();
} else { } else {
alert(response.data.message || wcLicensedProductVersions.strings.error); alert(response.data.message || wcLicensedProductVersions.strings.error);
} }
@@ -196,6 +269,11 @@
$spinner.removeClass('is-active'); $spinner.removeClass('is-active');
} }
}); });
}).catch(function(error) {
alert(error.message);
$btn.prop('disabled', false);
$spinner.removeClass('is-active');
});
}, },
deleteVersion: function(e) { deleteVersion: function(e) {

View File

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

View File

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

View File

@@ -64,6 +64,12 @@
</a> </a>
<span class="download-version">v{{ esc_html(download.version) }}</span> <span class="download-version">v{{ esc_html(download.version) }}</span>
<span class="download-date">{{ esc_html(download.released_at) }}</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> </li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@@ -3,7 +3,7 @@
* Plugin Name: WooCommerce Licensed Product * Plugin Name: WooCommerce Licensed Product
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-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. * 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: Marco Graetsch
* Author URI: https://src.bundespruefstelle.ch/magdev * Author URI: https://src.bundespruefstelle.ch/magdev
* License: GPL-2.0-or-later * License: GPL-2.0-or-later
@@ -28,7 +28,7 @@ if (!defined('ABSPATH')) {
} }
// Plugin constants // 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_FILE', __FILE__);
define('WC_LICENSED_PRODUCT_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('WC_LICENSED_PRODUCT_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('WC_LICENSED_PRODUCT_PLUGIN_URL', plugin_dir_url(__FILE__)); define('WC_LICENSED_PRODUCT_PLUGIN_URL', plugin_dir_url(__FILE__));