From f958c7b640e71d0d636b8940ab8b277a0312a6d3 Mon Sep 17 00:00:00 2001 From: magdev Date: Tue, 23 Dec 2025 01:44:41 +0100 Subject: [PATCH] Release version 1.1.21 - Add multilingual support for Swiss locales MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added translations for Swiss German (formal and informal), Swiss French, and Swiss Italian locales to support multilingual e-commerce in Switzerland. New Features: - Added de_CH (Swiss German - formal "Sie") translation - Added de_DE_informal (Informal German - "du") translation - Added fr_CH (Swiss French) translation - Added it_CH (Swiss Italian) translation Technical Changes: - Created 4 new .po translation source files - Compiled all .po files to .mo format for runtime use - Updated version to 1.1.21 in plugin header and constant - Updated composer.json version to 1.1.21 - Swiss locales use CHF currency formatting (e.g., "CHF 50.-") - German informal translations use "du/dein" instead of "Sie/Ihr" Documentation: - Updated CHANGELOG.md with v1.1.21 release notes - Updated CLAUDE.md with current version and translation status - Marked roadmap item as completed in CLAUDE.md Release Package: - Created wc-tier-and-package-prices-1.1.21.zip (404 KB) - Generated MD5 checksum: 16813b3ed0d1001d5f60194d61d36fc2 - Generated SHA256 checksum: e0063852a9ac23b1fd994471a2829f9dcbe26316f00ddee2d00f77c7c6a47c8f 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- CHANGELOG.md | 43 +++ CLAUDE.md | 63 ++++- composer.json | 2 +- languages/wc-tier-package-prices-de_CH.mo | Bin 0 -> 5383 bytes languages/wc-tier-package-prices-de_CH.po | 245 ++++++++++++++++++ .../wc-tier-package-prices-de_DE_informal.mo | Bin 0 -> 5345 bytes .../wc-tier-package-prices-de_DE_informal.po | 245 ++++++++++++++++++ languages/wc-tier-package-prices-fr_CH.mo | Bin 0 -> 5825 bytes languages/wc-tier-package-prices-fr_CH.po | 245 ++++++++++++++++++ languages/wc-tier-package-prices-it_CH.mo | Bin 0 -> 5637 bytes languages/wc-tier-package-prices-it_CH.po | 245 ++++++++++++++++++ .../wc-tier-and-package-prices-1.1.21.zip | Bin 0 -> 412979 bytes .../wc-tier-and-package-prices-1.1.21.zip.md5 | 1 + ...-tier-and-package-prices-1.1.21.zip.sha256 | 1 + wc-tier-and-package-prices.php | 4 +- 15 files changed, 1089 insertions(+), 5 deletions(-) create mode 100644 languages/wc-tier-package-prices-de_CH.mo create mode 100644 languages/wc-tier-package-prices-de_CH.po create mode 100644 languages/wc-tier-package-prices-de_DE_informal.mo create mode 100644 languages/wc-tier-package-prices-de_DE_informal.po create mode 100644 languages/wc-tier-package-prices-fr_CH.mo create mode 100644 languages/wc-tier-package-prices-fr_CH.po create mode 100644 languages/wc-tier-package-prices-it_CH.mo create mode 100644 languages/wc-tier-package-prices-it_CH.po create mode 100644 releases/wc-tier-and-package-prices-1.1.21.zip create mode 100644 releases/wc-tier-and-package-prices-1.1.21.zip.md5 create mode 100644 releases/wc-tier-and-package-prices-1.1.21.zip.sha256 diff --git a/CHANGELOG.md b/CHANGELOG.md index f21716b..66b7881 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,49 @@ All notable changes to WooCommerce Tier and Package Prices will be documented in The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.1.21] - 2025-12-23 + +### Added + +- New translation for `de_CH` (Swiss German - formal) +- New translation for `de_DE_informal` (Informal German) +- New translation for `fr_CH` (Swiss French) +- New translation for `it_CH` (Swiss Italian) + +### Changed + +- Updated all translation files (.po) to version 1.1.21 +- Compiled all translation files to .mo format for runtime use + +### Technical Details + +- Created 4 new locale-specific translation files following WordPress i18n standards +- Swiss locales use CHF currency formatting in examples (CHF 50.-, CHF 100.-) +- German informal translations use "du/dein" instead of "Sie/Ihr" +- All translations maintain consistent terminology across plugin UI +- Compiled .mo files included for immediate WordPress language support + +## [1.1.20] - 2025-12-22 + +### Fixed + +- **CRITICAL**: Fatal error in WooCommerce Blocks cart/mini-cart: "Cannot use object of type WC_Product_Simple as array" +- Filter `woocommerce_store_api_product_quantity_editable` signature mismatch + +### Changed + +- Updated `is_quantity_editable_in_blocks()` method to accept `WC_Product` object instead of cart item array +- Changed method signature from `is_quantity_editable_in_blocks($cart_item)` to `is_quantity_editable_in_blocks(WC_Product $product)` +- Use `$product->get_id()` instead of `$cart_item['product_id']` for product identification + +### Technical Details + +- WooCommerce Store API passes product object to this filter, not cart item array +- Previous code attempted array access on product object causing fatal error +- Error occurred at `includes/class-wc-tpp-cart.php:233` +- Affects WooCommerce Blocks-based cart, mini-cart, and checkout +- Classic cart/checkout unaffected (uses different hooks) + ## [1.1.19] - 2025-12-22 ### Fixed diff --git a/CLAUDE.md b/CLAUDE.md index 34d40f5..3623c04 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,7 +1,7 @@ # WooCommerce Tier and Package Prices - AI Context Document **Last Updated:** 2025-12-23 -**Current Version:** 1.1.20 +**Current Version:** 1.1.21 **Author:** Marco Graetsch **Project Status:** Production-ready WordPress plugin @@ -76,6 +76,7 @@ wc-tier-and-package-prices/ ### Class Responsibilities #### 1. `WC_Tier_Package_Prices` (Main Plugin Class) + - **Location:** `wc-tier-and-package-prices.php` - **Pattern:** Singleton - **Responsibilities:** @@ -86,6 +87,7 @@ wc-tier-and-package-prices/ - Activation/deactivation hooks #### 2. `WC_TPP_Admin` + - **Location:** `includes/class-wc-tpp-admin.php` - **Pattern:** Singleton - **Responsibilities:** @@ -95,6 +97,7 @@ wc-tier-and-package-prices/ - Product meta box asset loading #### 3. `WC_TPP_Settings` + - **Location:** `includes/class-wc-tpp-settings.php` - **Extends:** `WC_Settings_Page` (WooCommerce core) - **Responsibilities:** @@ -103,6 +106,7 @@ wc-tier-and-package-prices/ - Setting persistence through WooCommerce options API **Global Settings:** + - `wc_tpp_enable_tier_pricing` (yes/no) - `wc_tpp_enable_package_pricing` (yes/no) - `wc_tpp_display_table` (yes/no) - Show pricing tables on product pages @@ -110,6 +114,7 @@ wc-tier-and-package-prices/ - `wc_tpp_restrict_package_quantities` (yes/no) - Global quantity restrictions #### 4. `WC_TPP_Product_Meta` + - **Location:** `includes/class-wc-tpp-product-meta.php` - **Responsibilities:** - Adds tier/package pricing fields to product edit page @@ -119,11 +124,13 @@ wc-tier-and-package-prices/ - Prevents autosave from corrupting data **Product Meta Keys:** + - `_wc_tpp_tiers` - Array of tier objects `[{min_qty, price, label}]` - `_wc_tpp_packages` - Array of package objects `[{qty, price, label}]` - `_wc_tpp_restrict_to_packages` - Per-product quantity restriction (yes/no) #### 5. `WC_TPP_Frontend` + - **Location:** `includes/class-wc-tpp-frontend.php` - **Responsibilities:** - Enqueues frontend CSS/JS on product pages @@ -134,6 +141,7 @@ wc-tier-and-package-prices/ - Static methods for price lookups (`get_tier_price()`, `get_package_price()`) #### 6. `WC_TPP_Cart` + - **Location:** `includes/class-wc-tpp-cart.php` - **Responsibilities:** - **MOST CRITICAL CLASS** - Handles all cart price calculations @@ -145,11 +153,13 @@ wc-tier-and-package-prices/ - **WooCommerce Blocks support** via `woocommerce_store_api_product_quantity_editable` filter **Price Calculation Priority (in `apply_tier_package_pricing()`):** + 1. Check for exact package match → Use package price if found 2. Check for tier match → Use tier price if found 3. Fall back to regular product price #### 7. `WC_TPP_Template_Loader` + - **Location:** `includes/class-wc-tpp-template-loader.php` - **Pattern:** Singleton - **Responsibilities:** @@ -196,6 +206,7 @@ Products can be configured to ONLY allow purchase in package quantities: ### WooCommerce Blocks Compatibility **CRITICAL BUG FIXED in v1.1.20:** + - Filter `woocommerce_store_api_product_quantity_editable` passes `WC_Product` object, NOT cart item array - Previous code tried to use product object as array → fatal error - Fixed by accepting product object and using `$product->get_id()` @@ -228,6 +239,7 @@ new WC_TPP_Frontend(); // Auto-instantiate **Exception:** Admin and Settings classes use singleton pattern to prevent duplicates. ### Security Best Practices + - All user inputs are sanitized (integers for quantities/prices) - Nonce verification on form submissions - Capability checks (`edit_products`) before saving @@ -243,16 +255,30 @@ _e('Text to translate', 'wc-tier-package-prices') Text domain: `wc-tier-package-prices` +**Available Translations (as of v1.1.21):** + +- `en_US` - English (United States) +- `de_DE` - German (Germany, formal) +- `de_DE_informal` - German (Germany, informal "du") +- `de_CH` - German (Switzerland, formal "Sie") +- `de_CH_informal` - German (Switzerland, informal "du") +- `fr_CH` - French (Switzerland) +- `it_CH` - Italian (Switzerland) + +Note: Swiss locales use CHF currency formatting in examples (e.g., "CHF 50.-") + ## Known Issues & Historical Context ### Settings Page Duplication Saga (v1.1.15-1.1.19) Multiple versions attempted to fix settings page appearing twice: + - **Root cause:** Settings file auto-instantiation + Composer autoloader - **Solution:** Removed auto-instantiation from settings file, explicit instantiation in admin class - **Prevention:** Singleton pattern + duplicate detection in array ### Class Redeclaration Issues (v1.1.8-1.1.14) Plugin was completely non-functional: + - **Cause:** Incorrect initialization pattern without `class_exists()` guards - **Solution:** Added guards and restored direct instantiation pattern - **Lesson:** Always wrap class declarations in `class_exists()` checks @@ -262,6 +288,7 @@ Plugin was completely non-functional: Fatal error: Cannot use object of type WC_Product_Simple as array Location: includes/class-wc-tpp-cart.php:233 ``` + - **Cause:** Filter signature mismatch - expected array, received product object - **Fix:** Changed method signature to accept `WC_Product $product` instead of `$cart_item` array - **Status:** FIXED in v1.1.20 @@ -270,6 +297,7 @@ Location: includes/class-wc-tpp-cart.php:233 ### Version Bumping Update version in 3 places: + 1. `wc-tier-and-package-prices.php` - Plugin header comment (line 7) 2. `wc-tier-and-package-prices.php` - `WC_TPP_VERSION` constant (line 26) 3. `composer.json` - version field (optional, not critical) @@ -281,7 +309,7 @@ cd releases # Create zip excluding dev files zip -r wc-tier-and-package-prices-X.X.X.zip .. \ - -x '*.git*' '*.log' '.claude/*' 'releases/*' 'node_modules/*' \ + -x '*.git*' '*.log' '.claude/*' 'CLAUDE.md' 'releases/*' 'node_modules/*' \ '.DS_Store' 'Thumbs.db' '.vscode/*' '.idea/*' '*.sublime-*' \ 'notes.*' 'logs/*' 'templates/cache/*' 'composer.lock' @@ -293,6 +321,7 @@ sha256sum wc-tier-and-package-prices-X.X.X.zip > wc-tier-and-package-prices-X.X. **IMPORTANT:** The `vendor/` directory MUST be included in releases (Twig dependency required for runtime). ### What Gets Released + - All plugin source files - Compiled vendor dependencies - Translation files (.mo compiled from .po) @@ -300,6 +329,7 @@ sha256sum wc-tier-and-package-prices-X.X.X.zip > wc-tier-and-package-prices-X.X. - Documentation (README, CHANGELOG, etc.) ### What's Excluded + - Git metadata (`.git/`) - Development files (`.vscode/`, `.claude/`, `CLAUDE.md`) - Logs and cache files @@ -311,6 +341,7 @@ sha256sum wc-tier-and-package-prices-X.X.X.zip > wc-tier-and-package-prices-X.X. When making changes, test these critical paths: ### Admin + - [ ] Settings page appears once under WooCommerce > Tier & Package Prices - [ ] Settings save correctly - [ ] Product edit page shows tier/package meta boxes @@ -319,6 +350,7 @@ When making changes, test these critical paths: - [ ] Data saves when clicking "Update" on product ### Frontend (Product Page) + - [ ] Pricing tables display when configured - [ ] Package buttons update quantity selector - [ ] Price updates dynamically when quantity changes @@ -326,6 +358,7 @@ When making changes, test these critical paths: - [ ] "View Options" appears on catalog for restricted products ### Cart & Checkout + - [ ] Correct prices applied for tier pricing - [ ] Correct prices applied for package pricing - [ ] Cart displays pricing type labels @@ -334,6 +367,7 @@ When making changes, test these critical paths: - [ ] Checkout totals are correct ### WooCommerce Blocks (Critical!) + - [ ] Mini cart block doesn't throw fatal errors - [ ] Cart block works correctly - [ ] Checkout block processes orders @@ -341,19 +375,35 @@ When making changes, test these critical paths: ## Development Tips for Future AI Assistants +### Future Features and Roadmap + +The is a hierarchical list for upcoming features and can be considered as a +Roadmap for the upcoming development. + +#### Version 1.1.x + +1. ~~Add translations for `de_CH`, `de_DE_informal`, `fr_CH`, `it_CH`~~ ✅ **COMPLETED in v1.1.21** + +#### Version 1.2.x + +1. New Feature: Create different, selectable templates for tierprices and packages to use in the frontend. Make the new templates selectable globally on the settings-page, not per product. + ### When Debugging Cart Issues + 1. Check `includes/class-wc-tpp-cart.php` first 2. The `apply_tier_package_pricing()` method runs on `woocommerce_before_calculate_totals` 3. Always validate product objects with `is_a($product, 'WC_Product')` 4. Remember: WooCommerce expects UNIT prices, not total prices (except for internal calculations) ### When Working with WooCommerce Hooks + - WooCommerce has both classic and block-based systems - Classic cart uses different hooks than Store API (blocks) - Always check filter/action documentation for parameter types - Don't assume cart item arrays everywhere - sometimes it's product objects! ### When Adding Features + - Follow the existing pattern: add setting → add UI → add logic → add template - Use Twig for all new templates (consistency) - Add translations for all user-facing strings @@ -361,6 +411,7 @@ When making changes, test these critical paths: - Consider both classic and block-based cart/checkout ### When Fixing Bugs + 1. Check `CHANGELOG.md` for historical context 2. Look for similar issues in past versions 3. Always add detailed changelog entry explaining root cause @@ -383,22 +434,26 @@ When making changes, test these critical paths: ## Compatibility Notes ### WordPress + - Minimum: 6.0 - Tested up to: 6.9.x - Uses standard plugin API, no deprecated functions ### WooCommerce + - Minimum: 8.0 - Tested up to: 10.x - HPOS compatible (declared via `FeaturesUtil::declare_compatibility`) - Blocks compatible (with proper filter handling) ### PHP + - Minimum: 7.4 - Uses modern PHP features (type hints acceptable in new code) - Composer autoloader handles namespacing ### Browsers + - Modern browsers (ES6+ JavaScript) - Responsive CSS (mobile-friendly) - jQuery dependency (WooCommerce provides) @@ -413,6 +468,7 @@ When making changes, test these critical paths: ## Final Notes This is a production-quality plugin with real-world usage. Any changes should: + 1. Maintain backward compatibility with existing tier/package configurations 2. Not break WooCommerce core functionality 3. Work with both classic and block-based themes @@ -421,9 +477,12 @@ This is a production-quality plugin with real-world usage. Any changes should: 6. Update CHANGELOG.md with detailed explanations The plugin architecture is solid and well-tested. Most bugs arise from: + - WooCommerce API changes (especially blocks) - Filter/action signature changes - Edge cases in cart calculations - Settings persistence issues +--- + Always refer to this document when starting work on this project. Good luck! diff --git a/composer.json b/composer.json index c835adb..175ebee 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "magdev/wc-tier-package-prices", "description": "WooCommerce plugin for tier pricing and package prices with Twig templates", - "version": "1.1.19", + "version": "1.1.21", "type": "wordpress-plugin", "license": "GPL-2.0-or-later", "authors": [ diff --git a/languages/wc-tier-package-prices-de_CH.mo b/languages/wc-tier-package-prices-de_CH.mo new file mode 100644 index 0000000000000000000000000000000000000000..cdf1fe0094ed3c4ea84eae1a042b138d256bc12d GIT binary patch literal 5383 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 literal 0 HcmV?d00001 diff --git a/languages/wc-tier-package-prices-de_CH.po b/languages/wc-tier-package-prices-de_CH.po new file mode 100644 index 0000000..25b78d8 --- /dev/null +++ b/languages/wc-tier-package-prices-de_CH.po @@ -0,0 +1,245 @@ +# German (Switzerland) translation for WooCommerce Tier and Package Prices +# Copyright (C) 2025 Marco Graetsch +# This file is distributed under the GPL v2 or later. +msgid "" +msgstr "" +"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.21\n" +"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n" +"POT-Creation-Date: 2025-12-23 00:00+0000\n" +"PO-Revision-Date: 2025-12-23 00:00+0000\n" +"Last-Translator: Marco Graetsch\n" +"Language-Team: German (Switzerland)\n" +"Language: de_CH\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0\n" +"X-Domain: wc-tier-package-prices\n" + +#: wc-tier-and-package-prices.php:41 +msgid "WooCommerce Tier and Package Prices requires WooCommerce to be installed and active." +msgstr "WooCommerce Staffel- und Paketpreise benötigt eine installierte und aktive WooCommerce-Installation." + +#: includes/class-wc-tpp-admin.php:21 +#: includes/class-wc-tpp-admin.php:22 +#: includes/class-wc-tpp-settings.php:28 +msgid "Tier & Package Prices" +msgstr "Staffel- & Paketpreise" + +#: includes/class-wc-tpp-settings.php:40 +msgid "General" +msgstr "Allgemein" + +#: includes/class-wc-tpp-settings.php:58 +msgid "Tier & Package Prices Settings" +msgstr "Staffel- & Paketpreise Einstellungen" + +#: includes/class-wc-tpp-settings.php:60 +msgid "Configure tier pricing and package pricing options for your WooCommerce products." +msgstr "Konfigurieren Sie Staffelpreise und Paketpreise für Ihre WooCommerce-Produkte." + +#: includes/class-wc-tpp-admin.php:54 +#: includes/class-wc-tpp-settings.php:65 +msgid "Enable Tier Pricing" +msgstr "Staffelpreise aktivieren" + +#: includes/class-wc-tpp-admin.php:58 +#: includes/class-wc-tpp-settings.php:66 +msgid "Enable tier pricing for products" +msgstr "Staffelpreise für Produkte aktivieren" + +#: includes/class-wc-tpp-settings.php:70 +msgid "Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities." +msgstr "Ermöglicht mengenbasierte Preisstaffeln. Kunden erhalten reduzierte Preise beim Kauf grösserer Mengen." + +#: includes/class-wc-tpp-admin.php:63 +#: includes/class-wc-tpp-settings.php:74 +msgid "Enable Package Pricing" +msgstr "Paketpreise aktivieren" + +#: includes/class-wc-tpp-admin.php:67 +#: includes/class-wc-tpp-settings.php:75 +msgid "Enable fixed-price packages for products" +msgstr "Festpreis-Pakete für Produkte aktivieren" + +#: includes/class-wc-tpp-settings.php:79 +msgid "Allow fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100." +msgstr "Ermöglicht Festpreis-Pakete mit bestimmten Mengen. Zum Beispiel: 10 Stück für CHF 50.-, 25 Stück für CHF 100.-." + +#: includes/class-wc-tpp-admin.php:72 +#: includes/class-wc-tpp-settings.php:83 +msgid "Display Pricing Table" +msgstr "Preistabelle anzeigen" + +#: includes/class-wc-tpp-admin.php:76 +#: includes/class-wc-tpp-settings.php:84 +msgid "Show tier and package pricing table on product pages" +msgstr "Staffel- und Paketpreis-Tabelle auf Produktseiten anzeigen" + +#: includes/class-wc-tpp-settings.php:88 +msgid "Display the pricing table to customers on product pages." +msgstr "Zeigt die Preistabelle den Kunden auf Produktseiten an." + +#: includes/class-wc-tpp-admin.php:81 +#: includes/class-wc-tpp-settings.php:92 +msgid "Display Position" +msgstr "Anzeigeposition" + +#: includes/class-wc-tpp-settings.php:93 +msgid "Choose where to display the pricing table on product pages." +msgstr "Wählen Sie, wo die Preistabelle auf Produktseiten angezeigt werden soll." + +#: includes/class-wc-tpp-settings.php:101 +msgid "Before Add to Cart Button" +msgstr "Vor \"In den Warenkorb\"-Button" + +#: includes/class-wc-tpp-settings.php:102 +msgid "After Add to Cart Button" +msgstr "Nach \"In den Warenkorb\"-Button" + +#: includes/class-wc-tpp-admin.php:85 +msgid "Before Add to Cart" +msgstr "Vor \"In den Warenkorb\"" + +#: includes/class-wc-tpp-admin.php:86 +msgid "After Add to Cart" +msgstr "Nach \"In den Warenkorb\"" + +#: includes/class-wc-tpp-admin.php:87 +#: includes/class-wc-tpp-settings.php:103 +msgid "After Price" +msgstr "Nach dem Preis" + +#: includes/class-wc-tpp-settings.php:108 +#: includes/class-wc-tpp-product-meta.php:76 +msgid "Restrict to Package Quantities" +msgstr "Auf Paketmengen beschränken" + +#: includes/class-wc-tpp-settings.php:109 +msgid "Limit quantities to defined package sizes only" +msgstr "Mengen nur auf definierte Paketgrössen beschränken" + +#: includes/class-wc-tpp-settings.php:113 +msgid "When enabled, customers can only purchase products in the exact quantities defined in packages. The quantity input field will be hidden and replaced with package selection buttons." +msgstr "Wenn aktiviert, können Kunden Produkte nur in den genau definierten Paketmengen kaufen. Das Mengeneingabefeld wird ausgeblendet und durch Paketauswahl-Buttons ersetzt." + +#: includes/class-wc-tpp-product-meta.php:23 +msgid "Tier Pricing" +msgstr "Staffelpreise" + +#: includes/class-wc-tpp-product-meta.php:24 +msgid "Set quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities." +msgstr "Mengenbasierte Preisstaffeln festlegen. Kunden erhalten Rabatte beim Kauf grösserer Mengen." + +#: includes/class-wc-tpp-product-meta.php:41 +msgid "Add Tier" +msgstr "Staffel hinzufügen" + +#: includes/class-wc-tpp-product-meta.php:52 +msgid "Package Pricing" +msgstr "Paketpreise" + +#: includes/class-wc-tpp-product-meta.php:53 +msgid "Set fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100." +msgstr "Festpreis-Pakete mit bestimmten Mengen festlegen. Zum Beispiel: 10 Stück für CHF 50.-, 25 Stück für CHF 100.-." + +#: includes/class-wc-tpp-product-meta.php:70 +msgid "Add Package" +msgstr "Paket hinzufügen" + +#: includes/class-wc-tpp-product-meta.php:77 +msgid "Only allow quantities defined in packages above" +msgstr "Nur oben definierte Paketmengen zulassen" + +#: includes/class-wc-tpp-product-meta.php:90 +msgid "Minimum Quantity" +msgstr "Mindestmenge" + +#: includes/class-wc-tpp-product-meta.php:91 +msgid "e.g., 10" +msgstr "z.B. 10" + +#: includes/class-wc-tpp-product-meta.php:95 +#: includes/class-wc-tpp-product-meta.php:114 +msgid "e.g., 9.99" +msgstr "z.B. 9.90" + +#: includes/class-wc-tpp-product-meta.php:97 +#: includes/class-wc-tpp-product-meta.php:120 +msgid "Remove" +msgstr "Entfernen" + +#: includes/class-wc-tpp-product-meta.php:109 +#: includes/class-wc-tpp-frontend.php:75 +msgid "Quantity" +msgstr "Menge" + +#: includes/class-wc-tpp-product-meta.php:113 +msgid "Fixed Price" +msgstr "Festpreis" + +#: includes/class-wc-tpp-product-meta.php:117 +msgid "Label (Optional)" +msgstr "Bezeichnung (Optional)" + +#: includes/class-wc-tpp-product-meta.php:118 +msgid "e.g., Starter Pack" +msgstr "z.B. Starter-Paket" + +#: includes/class-wc-tpp-frontend.php:71 +msgid "Volume Discounts" +msgstr "Mengenrabatte" + +#: includes/class-wc-tpp-product-meta.php:94 +#: includes/class-wc-tpp-frontend.php:76 +msgid "Price per Unit" +msgstr "Preis pro Einheit" + +#: includes/class-wc-tpp-frontend.php:77 +msgid "You Save" +msgstr "Sie sparen" + +#: includes/class-wc-tpp-frontend.php:110 +msgid "Package Deals" +msgstr "Paketangebote" + +#: templates/frontend/package-pricing-display.twig:11 +msgid "Choose a package size below" +msgstr "Wählen Sie unten eine Paketgrösse" + +#: includes/class-wc-tpp-frontend.php:123 +msgid "pieces" +msgstr "Stück" + +#: includes/class-wc-tpp-frontend.php:129 +msgid "per unit" +msgstr "pro Einheit" + +#: includes/class-wc-tpp-frontend.php:133 +msgid "Select Package" +msgstr "Paket auswählen" + +#: includes/class-wc-tpp-cart.php:63 +msgid "Package price" +msgstr "Paketpreis" + +#: includes/class-wc-tpp-cart.php:66 +msgid "Volume discount" +msgstr "Mengenrabatt" + +#: includes/class-wc-tpp-cart.php:124 +msgid "this product" +msgstr "dieses Produkt" + +#: includes/class-wc-tpp-cart.php:128 +msgid "The quantity %1$d is not available for %2$s. Please choose from the available package sizes: %3$s" +msgstr "Die Menge %1$d ist für %2$s nicht verfügbar. Bitte wählen Sie aus den verfügbaren Paketgrössen: %3$s" + +#: includes/class-wc-tpp-frontend.php:173 +msgid "View Options" +msgstr "Optionen ansehen" + +#: includes/class-wc-tpp-frontend.php:178 +msgid "View options for %s" +msgstr "Optionen für %s ansehen" diff --git a/languages/wc-tier-package-prices-de_DE_informal.mo b/languages/wc-tier-package-prices-de_DE_informal.mo new file mode 100644 index 0000000000000000000000000000000000000000..6bf38d0086eaf95ebdc034a60d2761f6d066bb94 GIT binary patch literal 5345 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