From 8434d950ddbcd2160576a271bd5e4c1d0f984274 Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 11 Nov 2026 00:33:32 +0100 Subject: [PATCH] Add German front-office translations The German language pack leaves ~180 shop strings in English (search bar, cart, room cards, footer, account menu). docker/apply-translations.php fills only missing keys from docker/translations-de-front.php and fixes English values in the theme language file; docker/find-missing-translations.php lists remaining gaps. Module/theme de.php files are git-ignored upstream (downloaded on install), so the script is re-run after each install. Also includes the language-pack updates the installer wrote to the tracked module de.php files. Co-Authored-By: Claude Opus 5.5 --- docker-compose.yml | 4 + docker/apply-translations.php | 74 ++++++++ docker/find-missing-translations.php | 89 +++++++++ docker/translations-de-front.php | 201 +++++++++++++++++++++ modules/bankwire/translations/de.php | 7 + modules/blocksocial/translations/de.php | 2 + modules/blockuserinfo/translations/de.php | 13 ++ modules/cheque/translations/de.php | 9 + modules/qlohotelreview/translations/de.php | 6 + 9 files changed, 405 insertions(+) create mode 100644 docker/apply-translations.php create mode 100644 docker/find-missing-translations.php create mode 100644 docker/translations-de-front.php diff --git a/docker-compose.yml b/docker-compose.yml index 0e8143bb8..0db83be52 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,10 @@ # --timezone=Europe/Berlin --domain=localhost:8080 --db_server=db --db_user=qloapps \ # --db_password= --db_name=qloapps --email= --password= \ # --newsletter=0 +# +# Then (as www-data): fill German front-office gaps and load the Wasserrad demo content: +# docker compose exec -u www-data app php docker/apply-translations.php de +# docker compose exec -u www-data app php docker/seed-wasserrad-demo.php services: app: diff --git a/docker/apply-translations.php b/docker/apply-translations.php new file mode 100644 index 000000000..179116225 --- /dev/null +++ b/docker/apply-translations.php @@ -0,0 +1,74 @@ +/translations/.php. + * Usage: docker compose exec -u www-data app php docker/apply-translations.php [iso] + * Reads the dictionary docker/translations--front.php (English => target language) + * and only fills keys that are missing; existing translations are never overwritten. + */ +if (PHP_SAPI !== 'cli') { + exit; +} +$iso = isset($argv[1]) ? $argv[1] : 'de'; +$root = realpath(__DIR__.'/..'); +$dict = require __DIR__.'/translations-'.$iso.'-front.php'; + +$json = shell_exec('php '.escapeshellarg(__DIR__.'/find-missing-translations.php').' '.escapeshellarg($iso).' 2>/dev/null'); +$missing = json_decode($json, true); +if (!is_array($missing)) { + fwrite(STDERR, "Could not read missing translations\n"); + exit(1); +} + +$added = 0; +$untranslated = array(); +foreach ($missing['modules'] as $mod => $entries) { + $lines = array(); + foreach ($entries as $key => $english) { + if (!isset($dict[$english])) { + $untranslated[$mod][] = $english; + continue; + } + $lines[] = '$_MODULE['.var_export($key, true).'] = '.var_export($dict[$english], true).';'; + } + if (!$lines) { + continue; + } + $file = $root.'/modules/'.$mod.'/translations/'.$iso.'.php'; + if (!is_file($file)) { + @mkdir(dirname($file), 0755, true); + file_put_contents($file, "') { + $content = rtrim(substr($content, 0, -2)); + } + // Some language-pack files end with "return $_MODULE;" - new lines must go before it. + $hasReturn = (bool)preg_match('/\n\s*return \$_MODULE;\s*$/', $content); + if ($hasReturn) { + $content = rtrim(preg_replace('/\n\s*return \$_MODULE;\s*$/', '', $content)); + } + $content .= "\n\n// Added by docker/apply-translations.php\n".implode("\n", $lines)."\n"; + if ($hasReturn) { + $content .= "\nreturn \$_MODULE;\n"; + } + file_put_contents($file, $content); + $added += count($lines); + echo sprintf(" %-26s +%d\n", $mod, count($lines)); +} +// Theme strings the language pack "translates" with English text: replace those values. +$themeFixes = isset($dict['__theme_value_fixes']) ? $dict['__theme_value_fixes'] : array(); +$themeFile = $root.'/themes/hotel-reservation-theme/lang/'.$iso.'.php'; +if ($themeFixes && is_file($themeFile)) { + $c = file_get_contents($themeFile); + $n = 0; + foreach ($themeFixes as $from => $to) { + $c = str_replace('= '.var_export($from, true).';', '= '.var_export($to, true).';', $c, $count); + $n += $count; + } + file_put_contents($themeFile, $c); + echo " theme lang fixes $n\n"; +} + +echo "Added $added translations.\n"; +$skip = array_sum(array_map('count', $untranslated)); +echo "Not in dictionary: $skip (mostly back-office modules)\n"; diff --git a/docker/find-missing-translations.php b/docker/find-missing-translations.php new file mode 100644 index 000000000..d840792bd --- /dev/null +++ b/docker/find-missing-translations.php @@ -0,0 +1,89 @@ + missing.json + * Scans theme templates and the front templates of active front modules. + */ +if (PHP_SAPI !== 'cli') { + exit; +} +$iso = isset($argv[1]) ? $argv[1] : 'de'; +$root = realpath(__DIR__.'/..'); +$theme = $root.'/themes/hotel-reservation-theme'; + +$_LANG = array(); +include $theme.'/lang/'.$iso.'.php'; +$themeLang = $_LANG; + +$re = '/\{l\s+s=(?:\'((?:[^\'\\\\]|\\\\.)*)\'|"((?:[^"\\\\]|\\\\.)*)")(?:\s+mod=[\'"]([\w-]+)[\'"])?[^}]*\}/'; +$out = array('theme' => array(), 'modules' => array()); +$moduleLangCache = array(); + +$moduleLang = function ($mod) use (&$moduleLangCache, $root, $theme, $iso) { + if (!isset($moduleLangCache[$mod])) { + $_MODULE = array(); + foreach (array($root.'/modules/'.$mod.'/translations/'.$iso.'.php', $theme.'/modules/'.$mod.'/translations/'.$iso.'.php') as $f) { + if (is_file($f)) { + include $f; + } + } + $moduleLangCache[$mod] = $_MODULE; + } + return $moduleLangCache[$mod]; +}; + +$files = array(); +$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($theme, FilesystemIterator::SKIP_DOTS)); +foreach ($it as $f) { + if (substr($f, -4) === '.tpl' && strpos($f, '/mobile/') === false && strpos($f, '/pdf/') === false) { + $files[] = (string)$f; + } +} +// older modules keep front templates in the module root +foreach (glob($root.'/modules/*/*.tpl') as $f) { + $files[] = $f; +} +foreach (glob($root.'/modules/*/views/templates/{hook,front}/*.tpl', GLOB_BRACE) as $f) { + $files[] = $f; +} +foreach (glob($root.'/modules/*/views/templates/{hook,front}/*/*.tpl', GLOB_BRACE) as $f) { + $files[] = $f; +} + +foreach ($files as $file) { + $src = file_get_contents($file); + if (!preg_match_all($re, $src, $m, PREG_SET_ORDER)) { + continue; + } + $base = basename($file, '.tpl'); + foreach ($m as $match) { + $string = $match[1] !== '' ? $match[1] : (isset($match[2]) ? $match[2] : ''); + $string = stripslashes($string); + $mod = isset($match[3]) ? $match[3] : ''; + $md5 = md5(str_replace('\'', '\\\'', $string)); + if ($mod === '' && strpos($file, '/modules/') === false || $mod === '' && strpos($file, $theme) === 0 && strpos($file, $theme.'/modules/') === false) { + $key = $base.'_'.$md5; + if (empty($themeLang[$key])) { + $out['theme'][$key] = $string; + } + } else { + if ($mod === '') { + preg_match('#/modules/([\w-]+)/#', $file, $mm); + $mod = $mm[1]; + } + $lang = $moduleLang($mod); + $md5m = md5($string); + $k1 = strtolower('<{'.$mod.'}hotel-reservation-theme>'.$base).'_'.$md5m; + $k2 = strtolower('<{'.$mod.'}prestashop>'.$base).'_'.$md5m; + if (empty($lang[$k1]) && empty($lang[$k2])) { + $out['modules'][$mod][$k2] = $string; + } + } + } +} +$counts = array('theme' => count($out['theme'])); +foreach ($out['modules'] as $mod => $s) { + $counts[$mod] = count($s); +} +fwrite(STDERR, json_encode($counts, JSON_PRETTY_PRINT).PHP_EOL); +echo json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); diff --git a/docker/translations-de-front.php b/docker/translations-de-front.php new file mode 100644 index 000000000..7810ffd21 --- /dev/null +++ b/docker/translations-de-front.php @@ -0,0 +1,201 @@ + German. + */ +return array( + // shared + 'View Details' => 'Details ansehen', + 'Your' => 'Ihre', + 'bookings have' => 'Buchungen wurden', + 'booking has' => 'Buchung wurde', + 'been created successfully!' => 'erfolgreich angelegt!', + "If the client chooses to pay by bank wire, the order's status will change to 'Waiting for Payment.'" => "Wählt der Gast Banküberweisung, wechselt der Status der Buchung auf „Zahlung ausstehend“.", + "Please confirm your order by clicking 'I confirm my order'" => "Bitte bestätigen Sie Ihre Buchung mit „Ich bestätige meine Buchung“.", + 'I confirm my order' => 'Ich bestätige meine Buchung', + "If the client chooses this payment method, the order status will change to 'Waiting for payment.'" => "Wählt der Gast diese Zahlungsart, wechselt der Status der Buchung auf „Zahlung ausstehend“.", + + // blockcart + 'View my booking cart' => 'Meine Buchungsauswahl ansehen', + 'Cart' => 'Warenkorb', + 'Rooms' => 'Zimmer', + 'No products' => 'Keine Zimmer ausgewählt', + 'Delete' => 'Löschen', + 'To be determined' => 'Wird noch ermittelt', + 'Free shipping!' => 'Kostenloser Versand!', + 'Shipping' => 'Versand', + 'Wrapping' => 'Verpackung', + 'Room and Service Tax' => 'Steuern auf Zimmer und Leistungen', + 'Total Tourism Tax' => 'Kurtaxe gesamt', + 'Total Taxes' => 'Steuern gesamt', + 'Convenience Fees' => 'Servicegebühren', + 'Total' => 'Gesamt', + 'Prices are tax included' => 'Preise inkl. MwSt.', + 'Prices are tax excluded' => 'Preise zzgl. MwSt.', + 'Check out' => 'Zur Kasse', + 'Close window' => 'Fenster schließen', + 'Room successfully added to your cart' => 'Zimmer wurde zu Ihrer Buchung hinzugefügt', + 'Product successfully added to your cart' => 'Leistung wurde zu Ihrer Buchung hinzugefügt', + 'Time Duration' => 'Zeitraum', + 'Property Name' => 'Unterkunft', + 'Unit Price' => 'Einzelpreis', + 'Room occupancy' => 'Belegung', + 'Rooms quantity added' => 'Anzahl hinzugefügter Zimmer', + 'Quantity' => 'Menge', + 'Room type cost' => 'Zimmerpreis', + 'There are [1]%d[/1] item(s) in your cart.' => 'Ihre Buchung enthält [1]%d[/1] Positionen.', + '1 item in your cart.' => 'Ihre Buchung enthält 1 Position.', + 'Total Rooms Cost in cart' => 'Zimmerpreis gesamt', + '(tax excl.)' => '(zzgl. MwSt.)', + '(tax incl.)' => '(inkl. MwSt.)', + 'Total Product Cost in cart' => 'Leistungen gesamt', + 'Total shipping' => 'Versand gesamt', + 'Continue browsing' => 'Weiter stöbern', + 'Proceed to checkout' => 'Zur Kasse', + 'Some Error occurred.Please try again.' => 'Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.', + 'Customization #' => 'Anpassung #', + 'remove this product from my cart' => 'diese Leistung aus meiner Buchung entfernen', + 'Free!' => 'Kostenlos!', + 'Adults' => 'Erwachsene', + 'Children' => 'Kinder', + 'Price' => 'Preis', + 'Total Qty.' => 'Menge gesamt', + 'Variant' => 'Variante', + 'Qty' => 'Menge', + 'Duration' => 'Dauer', + 'Capacity' => 'Kapazität', + 'Remove this room from my cart' => 'Dieses Zimmer aus meiner Buchung entfernen', + 'No internet. Please check your internet connection.' => 'Keine Internetverbindung. Bitte prüfen Sie Ihre Verbindung.', + 'Product detail' => 'Details', + 'Qty.' => 'Menge', + 'Remove' => 'Entfernen', + 'remove this room from my cart' => 'dieses Zimmer aus meiner Buchung entfernen', + 'Customization #%d:' => 'Anpassung #%d:', + 'Customers who bought this product also bought:' => 'Gäste buchten außerdem:', + + // blockmyaccount / blockuserinfo + 'My account' => 'Mein Konto', + 'My orders' => 'Meine Buchungen', + 'My merchandise returns' => 'Meine Rücksendungen', + 'My credit slips' => 'Meine Gutschriften', + 'My personal info' => 'Meine persönlichen Daten', + 'My vouchers' => 'Meine Gutscheine', + 'Sign out' => 'Abmelden', + 'Accounts' => 'Konto', + 'Bookings' => 'Buchungen', + 'Logout' => 'Abmelden', + 'View my customer account' => 'Mein Kundenkonto ansehen', + 'Accounts Settings' => 'Kontoeinstellungen', + 'Log me out' => 'Abmelden', + 'Sign Out' => 'Abmelden', + 'Log in to your customer account' => 'Zu Ihrem Kundenkonto anmelden', + 'Sign in' => 'Anmelden', + + // blocknewsletter + 'GET NOTIFICATIONS' => 'NEUIGKEITEN ERHALTEN', + 'Your email address' => 'Ihre E-Mail-Adresse', + 'Subscribe' => 'Anmelden', + 'No internet. Please try later.' => 'Keine Internetverbindung. Bitte versuchen Sie es später.', + 'You have unsubscribed successfully.' => 'Sie haben sich erfolgreich abgemeldet.', + 'You will be redirected to home page in ' => 'Sie werden weitergeleitet zur Startseite in ', + 'seconds.' => 'Sekunden.', + 'Home Page' => 'Startseite', + 'Thank you for subscribing to our newsletter.' => 'Vielen Dank für Ihre Anmeldung zu unserem Newsletter.', + + // blocksocial / blocknavigationmenu / blockcurrencies + 'Follow us on' => 'Folgen Sie uns', + 'Explore' => 'Entdecken', + '%s (%s)' => '%s (%s)', + + // hotelreservationsystem + 'Cancelled' => 'Storniert', + 'Refunded' => 'Erstattet', + 'Denied' => 'Abgelehnt', + 'Refunded amount' => 'Erstatteter Betrag', + 'Payment mode' => 'Zahlungsart', + 'Transaction ID' => 'Transaktions-ID', + 'Voucher' => 'Gutschein', + 'Credit Slip' => 'Gutschrift', + ' All rights reserved. | Powered by' => ' Alle Rechte vorbehalten. | Betrieben mit', + 'All rights reserved' => 'Alle Rechte vorbehalten', + 'Call Us : ' => 'Telefon: ', + 'Email : ' => 'E-Mail: ', + 'Directions' => 'Anfahrt', + + // qlohotelreview + 'Allowed formats are: .jpg, .jpeg, .png' => 'Erlaubte Formate: .jpg, .jpeg, .png', + 'Sum up your review' => 'Fassen Sie Ihre Bewertung zusammen', + 'Type here...' => 'Hier schreiben …', + ' people found it helpful.' => ' Personen fanden das hilfreich.', + + // qlopaypalcommerce + 'Pay using Paypal payment options.' => 'Mit den Zahlungsarten von PayPal bezahlen.', + 'Pay using Paypal' => 'Mit PayPal bezahlen', + 'Please wait...' => 'Bitte warten …', + 'You have cancelled payment by PayPal. You can retry with PayPal or try a different payment method.' => 'Sie haben die Zahlung mit PayPal abgebrochen. Versuchen Sie es erneut oder wählen Sie eine andere Zahlungsart.', + 'Your order on %s is complete.' => 'Ihre Buchung bei %s ist abgeschlossen.', + 'Total Amount Paid' => 'Bezahlter Gesamtbetrag', + 'An email has been sent with this information.' => 'Sie erhalten diese Informationen auch per E-Mail.', + 'Your order will be sent as soon as possible.' => 'Ihre Buchung wird schnellstmöglich bearbeitet.', + 'If you have questions, comments or concerns, please contact our' => 'Bei Fragen, Anmerkungen oder Anliegen wenden Sie sich bitte an unser', + 'expert customer support team' => 'Service-Team', + 'We noticed a problem with your payment. Please contact our' => 'Bei Ihrer Zahlung ist ein Problem aufgetreten. Bitte wenden Sie sich an unser', + 'Your payment has been failed due to following reason:' => 'Ihre Zahlung ist aus folgendem Grund fehlgeschlagen:', + 'Error:' => 'Fehler:', + 'Error Description:' => 'Fehlerbeschreibung:', + 'Other payment methods' => 'Andere Zahlungsarten', + + // home blocks + 'Interior' => 'Ambiente', + 'payment accepted' => 'Zahlungsarten', + 'Amenities' => 'Ausstattung', + 'Testimonials' => 'Gästestimmen', + + // wkhotelfilterblock + 'Filters' => 'Filter', + 'Clear all' => 'Alle zurücksetzen', + 'Clear Filter' => 'Filter zurücksetzen', + 'Apply' => 'Anwenden', + 'Sort' => 'Sortieren', + 'Sort by' => 'Sortieren nach', + 'Filter' => 'Filter', + 'View More' => 'Mehr anzeigen', + 'Book Now' => 'Jetzt buchen', + + // wkhotelroom + 'night' => 'Nacht', + 'Book now' => 'Jetzt buchen', + 'View' => 'Ansehen', + 'Our Rooms' => 'Unsere Zimmer', + + // wkroomsearchblock + 'Searched results for' => 'Suchergebnisse für', + 'Days' => 'Tage', + 'Nights' => 'Nächte', + 'Night' => 'Nacht', + 'Search Rooms' => 'Zimmer suchen', + 'Make Booking' => 'Jetzt buchen', + 'Modify Search' => 'Suche ändern', + 'Property Location' => 'Ort', + 'Select Property' => 'Unterkunft wählen', + 'Check-in' => 'Anreise', + 'Check-out' => 'Abreise', + 'Check-in - Check-out' => 'Anreise – Abreise', + 'Adult' => 'Erwachsener', + 'Child' => 'Kind', + 'Room' => 'Zimmer', + '1 Adult, 1 Room' => '1 Erwachsener, 1 Zimmer', + 'Below' => 'Unter', + 'years' => 'Jahre', + 'All Children' => 'Alle Kinder', + 'Select 1' => 'Alter wählen', + 'Under 1' => 'Unter 1', + 'Room - 1' => 'Zimmer – 1', + 'Add Room' => 'Zimmer hinzufügen', + 'Done' => 'Fertig', + + // values in themes/hotel-reservation-theme/lang/de.php that the language pack left in English + '__theme_value_fixes' => array( + 'Check-In - Check-Out' => 'Anreise – Abreise', + ), +); diff --git a/modules/bankwire/translations/de.php b/modules/bankwire/translations/de.php index 12538908e..5aa089c16 100644 --- a/modules/bankwire/translations/de.php +++ b/modules/bankwire/translations/de.php @@ -59,3 +59,10 @@ $_MODULE['<{bankwire}prestashop>mail_template_text_6702a6e3bc2dce95c3e3b61fe578f $_MODULE['<{bankwire}prestashop>mail_template_text_21e4851289ecc91b65023c2563344aa7'] = 'Kontoinhaber:'; $_MODULE['<{bankwire}prestashop>mail_template_text_20a650d87733bd5895c979de29864a73'] = 'Kontodetails:'; $_MODULE['<{bankwire}prestashop>mail_template_text_312d898d92d8ba90499ef0dac27270be'] = 'Bankadresse:'; + +// Added by docker/apply-translations.php +$_MODULE['<{bankwire}prestashop>payment_return_4ff70f7b2e5a74415de360150a6e59d3'] = 'Ihre'; +$_MODULE['<{bankwire}prestashop>payment_return_b020dd24318376f939f91f8fcb7266f6'] = 'Buchungen wurden'; +$_MODULE['<{bankwire}prestashop>payment_return_642b829e2ed9b9fece9b1d810bbc0f3b'] = 'Buchung wurde'; +$_MODULE['<{bankwire}prestashop>payment_return_659623af9479cd8813485e4e4a5a96c3'] = 'erfolgreich angelegt!'; +$_MODULE['<{bankwire}prestashop>infos_4b316ae03d310dab57ae13629736443b'] = 'Wählt der Gast Banküberweisung, wechselt der Status der Buchung auf „Zahlung ausstehend“.'; diff --git a/modules/blocksocial/translations/de.php b/modules/blocksocial/translations/de.php index ad820edd5..35dae029a 100644 --- a/modules/blocksocial/translations/de.php +++ b/modules/blocksocial/translations/de.php @@ -35,5 +35,7 @@ $_MODULE['<{blocksocial}prestashop>blocksocial_55f015a0c5605702f913536afe70cfb0' $_MODULE['<{blocksocial}prestashop>blocksocial_970cfba66b8380fb97b742e4571356c6'] = 'YouTube'; $_MODULE['<{blocksocial}prestashop>blocksocial_dda8dc38128a8c843ba9f496d6ee7186'] = 'Google Plus'; +// Added by docker/apply-translations.php +$_MODULE['<{blocksocial}prestashop>blocksocial_738bc5faa88e6b0fa0e7e3385d7e4ee3'] = 'Folgen Sie uns'; return $_MODULE; diff --git a/modules/blockuserinfo/translations/de.php b/modules/blockuserinfo/translations/de.php index 2a8b95ca6..89ab0f82b 100644 --- a/modules/blockuserinfo/translations/de.php +++ b/modules/blockuserinfo/translations/de.php @@ -23,5 +23,18 @@ $_MODULE['<{blockuserinfo}prestashop>nav_c87aacf5673fada1108c9f809d354311'] = 'A $_MODULE['<{blockuserinfo}prestashop>nav_d4151a9a3959bdd43690735737034f27'] = 'Anmelden zu Ihrem Kundenbereich'; $_MODULE['<{blockuserinfo}prestashop>nav_b6d4223e60986fa4c9af77ee5f7149c5'] = 'Anmelden'; +// Added by docker/apply-translations.php +$_MODULE['<{blockuserinfo}prestashop>nav_9b945efebb006547a94415eadaa12921'] = 'Konto'; +$_MODULE['<{blockuserinfo}prestashop>nav_a35529bfcfdfab2dc01946af64cd2ce4'] = 'Buchungen'; +$_MODULE['<{blockuserinfo}prestashop>nav_0323de4f66a1700e2173e9bcdce02715'] = 'Abmelden'; + +// Added by docker/apply-translations.php +$_MODULE['<{blockuserinfo}prestashop>nav-xs_a35529bfcfdfab2dc01946af64cd2ce4'] = 'Buchungen'; +$_MODULE['<{blockuserinfo}prestashop>nav-xs_2cbfb6731610056e1d0aaacde07096c1'] = 'Mein Kundenkonto ansehen'; +$_MODULE['<{blockuserinfo}prestashop>nav-xs_802ae618edcbffbf50f9a0a69d358452'] = 'Kontoeinstellungen'; +$_MODULE['<{blockuserinfo}prestashop>nav-xs_4b877ba8588b19f1b278510bf2b57ebb'] = 'Abmelden'; +$_MODULE['<{blockuserinfo}prestashop>nav-xs_375e08625a2c38089b9e3a60f0e68325'] = 'Abmelden'; +$_MODULE['<{blockuserinfo}prestashop>nav-xs_d4151a9a3959bdd43690735737034f27'] = 'Zu Ihrem Kundenkonto anmelden'; +$_MODULE['<{blockuserinfo}prestashop>nav-xs_b6d4223e60986fa4c9af77ee5f7149c5'] = 'Anmelden'; return $_MODULE; diff --git a/modules/cheque/translations/de.php b/modules/cheque/translations/de.php index c3dee3b04..c4facad46 100644 --- a/modules/cheque/translations/de.php +++ b/modules/cheque/translations/de.php @@ -53,3 +53,12 @@ $_MODULE['<{cheque}prestashop>mail_template_text_b6592595266708e46d1d420ab715321 $_MODULE['<{cheque}prestashop>mail_template_text_6702a6e3bc2dce95c3e3b61fe578f29c'] = 'Menge:'; $_MODULE['<{cheque}prestashop>mail_template_text_1c3bd8f6bd066270354607c08f930baf'] = 'Zahlbar im Auftrag von:'; $_MODULE['<{cheque}prestashop>mail_template_text_8f1fb2295c4289bae9fc26549b4b45f2'] = 'Bitte senden Sie Ihren Scheck an:'; + +// Added by docker/apply-translations.php +$_MODULE['<{cheque}prestashop>payment_execution_648020a0c34e9e10c63d362fe3e69f34'] = 'Bitte bestätigen Sie Ihre Buchung mit „Ich bestätige meine Buchung“.'; +$_MODULE['<{cheque}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'Ich bestätige meine Buchung'; +$_MODULE['<{cheque}prestashop>infos_f4d0e8e3f5ba72e95d69115dd9c899cc'] = 'Wählt der Gast diese Zahlungsart, wechselt der Status der Buchung auf „Zahlung ausstehend“.'; +$_MODULE['<{cheque}prestashop>payment_return_4ff70f7b2e5a74415de360150a6e59d3'] = 'Ihre'; +$_MODULE['<{cheque}prestashop>payment_return_b020dd24318376f939f91f8fcb7266f6'] = 'Buchungen wurden'; +$_MODULE['<{cheque}prestashop>payment_return_642b829e2ed9b9fece9b1d810bbc0f3b'] = 'Buchung wurde'; +$_MODULE['<{cheque}prestashop>payment_return_659623af9479cd8813485e4e4a5a96c3'] = 'erfolgreich angelegt!'; diff --git a/modules/qlohotelreview/translations/de.php b/modules/qlohotelreview/translations/de.php index 55428a743..7ebcdb02d 100644 --- a/modules/qlohotelreview/translations/de.php +++ b/modules/qlohotelreview/translations/de.php @@ -145,3 +145,9 @@ $_MODULE['<{qlohotelreview}prestashop>review_a0f942858344588234dda2fae9516ce9'] $_MODULE['<{qlohotelreview}prestashop>review_4f887556bd5dd9354f971969048e9364'] = '%1$d Personen fanden es hilfreich.'; $_MODULE['<{qlohotelreview}prestashop>review_28b3b1e564a00f572c5d4e21da986d49'] = 'Missbrauch melden'; $_MODULE['<{qlohotelreview}prestashop>review_5337e185f4fe875860eb0258b7cf9b6f'] = 'hat geantwortet'; + +// Added by docker/apply-translations.php +$_MODULE['<{qlohotelreview}prestashop>add-review-popup_c61874c892c6285f24df8c9f890e4689'] = 'Erlaubte Formate: .jpg, .jpeg, .png'; +$_MODULE['<{qlohotelreview}prestashop>add-review-popup_52678fb44b16d274aa055532744e6bdb'] = 'Fassen Sie Ihre Bewertung zusammen'; +$_MODULE['<{qlohotelreview}prestashop>add-review-popup_ab881e45810d878ec93fefe487708820'] = 'Hier schreiben …'; +$_MODULE['<{qlohotelreview}prestashop>review_0d2c413dc146dabfab6c7a796330ed50'] = ' Personen fanden das hilfreich.';