From a32260dc87e85decb81443b3e3c97aa24cfd45cd Mon Sep 17 00:00:00 2001 From: Viktor Miller Date: Fri, 6 Feb 2026 23:51:56 +0900 Subject: [PATCH] feat(09-02): wrap form-facing strings and localize JS validation - Wrap all room names and 90+ furniture item names in __() - Wrap all additional work section labels and field names in __() - Wrap all form renderer UI strings (headers, labels, buttons) in gettext - Pass translated address field labels to render methods - Wrap validation error messages in class-form-handler - Force German locale for email generation via switch_to_locale() - Restore locale after email with restore_previous_locale() - Add wp_localize_script() for JS validation messages - Update form.js to use umzugslisteL10n for translated strings - Email generator remains untouched (hardcoded German as required) - Email subject stays hardcoded German (not wrapped in gettext) - All PHP files pass syntax check - 163 gettext calls in furniture-data, 26 in form-renderer --- assets/js/form.js | 16 +- includes/class-form-handler.php | 37 ++-- includes/class-form-renderer.php | 90 +++++---- includes/class-furniture-data.php | 326 +++++++++++++++--------------- includes/class-shortcode.php | 8 + 5 files changed, 253 insertions(+), 224 deletions(-) diff --git a/assets/js/form.js b/assets/js/form.js index a0300eb..b0d70b3 100644 --- a/assets/js/form.js +++ b/assets/js/form.js @@ -9,6 +9,14 @@ (function($) { 'use strict'; + // Localized strings with fallbacks + var l10n = typeof umzugslisteL10n !== 'undefined' ? umzugslisteL10n : { + fieldRequired: 'This field is required', + invalidEmail: 'Please enter a valid email address', + selectMovingDate: 'Please select a complete moving date', + enterFurnitureItem: 'Please enter at least one furniture item' + }; + /** * Parse German decimal format to float * Converts "0,40" or "0.40" to 0.40 @@ -224,14 +232,14 @@ // Check required fields if (isRequired && !validateRequired(value)) { - showFieldError($field, 'Dieses Feld ist erforderlich'); + showFieldError($field, l10n.fieldRequired); return false; } // Check email format if (fieldName === 'info[eE-Mail]' && value) { if (!validateEmail(value)) { - showFieldError($field, 'Bitte geben Sie eine gültige E-Mail-Adresse ein'); + showFieldError($field, l10n.invalidEmail); return false; } } @@ -282,7 +290,7 @@ // Validate date if (!validateDate()) { - errors.push('Bitte wählen Sie ein vollständiges Umzugsdatum'); + errors.push(l10n.selectMovingDate); isValid = false; } @@ -295,7 +303,7 @@ // Validate furniture items if (!validateFurnitureItems()) { - errors.push('Bitte geben Sie mindestens ein Möbelstück ein'); + errors.push(l10n.enterFurnitureItem); isValid = false; // Scroll to first room table diff --git a/includes/class-form-handler.php b/includes/class-form-handler.php index a4825cf..88e951c 100644 --- a/includes/class-form-handler.php +++ b/includes/class-form-handler.php @@ -57,7 +57,7 @@ class Umzugsliste_Form_Handler { // Verify nonce if ( ! isset( $_POST['umzugsliste_nonce'] ) || ! wp_verify_nonce( $_POST['umzugsliste_nonce'], 'umzugsliste_submit' ) ) { - wp_die( 'Security verification failed. Please try again.' ); + wp_die( __( 'Security verification failed. Please try again.', 'siegel-umzugsliste' ) ); } // Extract form_id from POST @@ -72,7 +72,7 @@ class Umzugsliste_Form_Handler { $verified = $captcha->verify_response( $_POST ); if ( ! $verified ) { $captcha_error = array( - 'messages' => array( 'Captcha-Verifizierung fehlgeschlagen. Bitte versuchen Sie es erneut.' ), + 'messages' => array( __( 'Captcha verification failed. Please try again.', 'siegel-umzugsliste' ) ), 'fields' => array(), ); set_transient( 'umzugsliste_errors_' . $form_id, $captcha_error, 300 ); @@ -142,29 +142,30 @@ class Umzugsliste_Form_Handler { // Required fields $required_fields = array( - 'bName' => 'Name (Beladeadresse)', - 'bStrasse' => 'Straße (Beladeadresse)', - 'bort' => 'PLZ/Ort (Beladeadresse)', - 'bTelefon' => 'Telefon (Beladeadresse)', - 'eName' => 'Name (Entladeadresse)', - 'eStrasse' => 'Straße (Entladeadresse)', - 'eort' => 'PLZ/Ort (Entladeadresse)', + 'bName' => __( 'Name (Loading Address)', 'siegel-umzugsliste' ), + 'bStrasse' => __( 'Street (Loading Address)', 'siegel-umzugsliste' ), + 'bort' => __( 'ZIP/City (Loading Address)', 'siegel-umzugsliste' ), + 'bTelefon' => __( 'Phone (Loading Address)', 'siegel-umzugsliste' ), + 'eName' => __( 'Name (Unloading Address)', 'siegel-umzugsliste' ), + 'eStrasse' => __( 'Street (Unloading Address)', 'siegel-umzugsliste' ), + 'eort' => __( 'ZIP/City (Unloading Address)', 'siegel-umzugsliste' ), ); foreach ( $required_fields as $field => $label ) { if ( empty( $data[ $field ] ) ) { - $errors[] = 'Pflichtfeld fehlt: ' . $label; + /* translators: %s: field label */ + $errors[] = sprintf( __( 'Required field missing: %s', 'siegel-umzugsliste' ), $label ); } } // Validate email if provided if ( ! empty( $data['info']['eE-Mail'] ) && ! is_email( $data['info']['eE-Mail'] ) ) { - $errors[] = 'Ungültige E-Mail-Adresse'; + $errors[] = __( 'Invalid email address', 'siegel-umzugsliste' ); } // Validate date if ( empty( $data['day'] ) || empty( $data['month'] ) || empty( $data['year'] ) ) { - $errors[] = 'Umzugstermin fehlt'; + $errors[] = __( 'Moving date is missing', 'siegel-umzugsliste' ); } // Check if at least one furniture item has quantity @@ -188,7 +189,7 @@ class Umzugsliste_Form_Handler { } if ( ! $has_items ) { - $errors[] = 'Bitte geben Sie mindestens eine Möbelmenge ein'; + $errors[] = __( 'Please enter at least one furniture quantity', 'siegel-umzugsliste' ); } return $errors; @@ -324,13 +325,16 @@ class Umzugsliste_Form_Handler { * @return bool True on success */ private function send_email( $entry_id, $data ) { - // Generate email HTML + // Force German locale for email generation + switch_to_locale( 'de_DE' ); + + // Generate email HTML (all __() calls now return German) $email_html = Umzugsliste_Email_Generator::generate( $data ); // Get receiver email from settings $to = get_option( 'umzugsliste_receiver_email', get_option( 'admin_email' ) ); - // Subject + // Subject (stays hardcoded in German - not wrapped in gettext) $subject = 'Internetanfrage - Anfrage vom ' . date( 'd.m.Y H:i' ); // Headers @@ -346,6 +350,9 @@ class Umzugsliste_Form_Handler { // Send email $sent = wp_mail( $to, $subject, $email_html, $headers ); + // Restore original locale + restore_previous_locale(); + // Update CPT meta if ( $entry_id ) { update_post_meta( $entry_id, '_umzugsliste_email_sent', $sent ); diff --git a/includes/class-form-renderer.php b/includes/class-form-renderer.php index ff9ec1d..6ea4e1e 100644 --- a/includes/class-form-renderer.php +++ b/includes/class-form-renderer.php @@ -64,7 +64,7 @@ class Umzugsliste_Form_Renderer { delete_transient( 'umzugsliste_errors_' . $form_id ); ?>
-

Bitte korrigieren Sie folgende Fehler:

+