Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/fluent-booking/app/Hooks/Handlers/BlockEditorHandler.php
+++ b/fluent-booking/app/Hooks/Handlers/BlockEditorHandler.php
@@ -321,11 +321,11 @@
public function fcalRenderBookingManagementBlock($attributes)
{
- $calendarIds = Arr::get($attributes, 'calendarIds', []);
+ $calendarIds = array_map('intval', (array) Arr::get($attributes, 'calendarIds', []));
$title = sanitize_text_field(Arr::get($attributes, 'title'));
- $period = sanitize_text_field(Arr::get($attributes, 'period', 'all'));
+ $period = sanitize_key(Arr::get($attributes, 'period', 'all'));
$perPage = intval(Arr::get($attributes, 'perPage', 10));
@@ -335,23 +335,43 @@
$noBookingsMessage = sanitize_text_field(Arr::get($attributes, 'noBookingsMessage'));
- return do_shortcode("[fluent_booking_lists title="$title" period=$period per_page=$perPage filter=$showFilter pagination=$showPagination no_bookings="$noBookingsMessage" calendar_ids=" . implode(',', $calendarIds) . "]");
+ $shortcode = sprintf(
+ '[fluent_booking_lists title="%s" period=%s per_page=%d filter=%s pagination=%s no_bookings="%s" calendar_ids=%s]',
+ esc_attr($title),
+ $period,
+ $perPage,
+ $showFilter,
+ $showPagination,
+ esc_attr($noBookingsMessage),
+ implode(',', $calendarIds)
+ );
+
+ return do_shortcode($shortcode);
}
public function fcalRenderBlock($attributes)
{
- $output = '<style>
- :root {
- --fcal_primary_color: ' . esc_attr($attributes['primary_color']) . ' !important;
- --fcal_date_radius: ' . esc_attr($attributes['date_round']) . ' !important;
- --fcal_avatar_radius: ' . esc_attr($attributes['avatarStyle']) . ' !important;
- }
- </style>';
+ $primaryColor = sanitize_hex_color(Arr::get($attributes, 'primary_color', ''));
+ $dateRadius = self::sanitizeCssLength(Arr::get($attributes, 'date_round', ''));
+ $avatarRadius = self::sanitizeCssLength(Arr::get($attributes, 'avatarStyle', ''));
+
+ $output = '<style>:root {';
+ if ($primaryColor) {
+ $output .= '--fcal_primary_color: ' . $primaryColor . ' !important;';
+ }
+ if ($dateRadius) {
+ $output .= '--fcal_date_radius: ' . $dateRadius . ' !important;';
+ }
+ if ($avatarRadius) {
+ $output .= '--fcal_avatar_radius: ' . $avatarRadius . ' !important;';
+ }
+ $output .= '}</style>';
- $slotId = (int) $attributes['slotId'];
- $disableHost = $attributes['hideHostInfo'];
- $theme = Arr::get($attributes, 'theme', 'light');
- $eventHash = Arr::get($attributes, 'eventHash');
+ $slotId = (int) Arr::get($attributes, 'slotId');
+ $disableHost = Arr::isTrue($attributes, 'hideHostInfo') ? 'yes' : 'no';
+ $theme = sanitize_key(Arr::get($attributes, 'theme', 'light'));
+ $eventHash = sanitize_text_field(Arr::get($attributes, 'eventHash', ''));
+ $align = sanitize_html_class(Arr::get($attributes, 'align', ''));
$slot = CalendarSlot::find($slotId);
@@ -360,14 +380,28 @@
if (!$slot) {
return '';
}
- $slotId = $slot->id;
+ $slotId = (int) $slot->id;
+ $eventHash = (string) $slot->hash;
}
- $output .= '<div class="fluent-booking-calendar-block align' . Arr::get($attributes, 'align') . '">';
+ $output .= '<div class="fluent-booking-calendar-block align' . esc_attr($align) . '">';
- $output .= do_shortcode("[fluent_booking id=$slotId disable_author=$disableHost theme=$theme hash=$eventHash]");
+ $output .= do_shortcode(sprintf(
+ '[fluent_booking id=%d disable_author=%s theme=%s hash=%s]',
+ $slotId,
+ $disableHost,
+ $theme,
+ esc_attr($eventHash)
+ ));
$output .= '</div>';
return $output;
}
+
+ private static function sanitizeCssLength($value)
+ {
+ $value = trim((string) $value);
+
+ return preg_match('/^d{1,3}(.d+)?(px|%|em|rem)$/', $value) ? $value : '';
+ }
}
--- a/fluent-booking/app/Hooks/Handlers/FrontEndHandler.php
+++ b/fluent-booking/app/Hooks/Handlers/FrontEndHandler.php
@@ -699,7 +699,7 @@
public function ajaxScheduleMeeting()
{
- if (!$this->checkPublicAjaxRateLimit('schedule_meeting', 15)) {
+ if (!Helper::checkRateLimit('schedule_meeting', 15)) {
wp_send_json_error(['message' => __('Too many requests. Please try again in a minute.', 'fluent-booking')], 429);
}
@@ -949,7 +949,7 @@
public function ajaxGetAvailableDates()
{
- if (!$this->checkPublicAjaxRateLimit('available_dates', 30)) {
+ if (!Helper::checkRateLimit('available_dates', 30)) {
wp_send_json_error(['message' => __('Too many requests. Please try again in a minute.', 'fluent-booking')], 429);
}
@@ -1131,7 +1131,7 @@
public function ajaxHandleCancelMeeting()
{
- if (!$this->checkPublicAjaxRateLimit('cancel_meeting', 15)) {
+ if (!Helper::checkRateLimit('cancel_meeting', 15)) {
wp_send_json_error(['message' => __('Too many requests. Please try again in a minute.', 'fluent-booking')], 429);
}
@@ -1186,37 +1186,6 @@
exit;
}
- /**
- * Per-IP rate limit for public booking AJAX. Uses transients; 60s window.
- *
- * @param string $action Action name (e.g. schedule_meeting, available_dates, cancel_meeting).
- * @param int $limit Max requests per window.
- * @param int $window Window in seconds.
- * @return bool True if under limit (and count incremented), false if over limit.
- */
- private function checkPublicAjaxRateLimit($action, $limit, $window = 60)
- {
- $args = apply_filters('fluent_booking/public_ajax_ratelimit', [
- 'limit' => $limit,
- 'window' => $window,
- ], $action);
-
- $limit = max(1, (int) (isset($args['limit']) ? $args['limit'] : $limit));
- $window = max(1, (int) (isset($args['window']) ? $args['window'] : $window));
-
- $ip = Helper::getIp();
- $key = 'fcal_ratelimit_' . $action . '_' . md5($ip);
- $count = (int) get_transient($key);
-
- if ($count >= $limit) {
- return false;
- }
-
- set_transient($key, $count + 1, $window);
-
- return true;
- }
-
private static function sanitize_mapped_data($settings)
{
$sanitizerMap = [
--- a/fluent-booking/app/Hooks/filters.php
+++ b/fluent-booking/app/Hooks/filters.php
@@ -1,5 +1,7 @@
<?php
+defined('ABSPATH') || exit;
+
use FluentBookingFrameworkSupportArr;
use FluentBookingAppServicesCurrenciesHelper;
use FluentBookingAppServicesDateTimeHelper;
--- a/fluent-booking/app/Hooks/includes.php
+++ b/fluent-booking/app/Hooks/includes.php
@@ -1,5 +1,7 @@
<?php
+defined('ABSPATH') || exit;
+
/*
* Require any extra files here. For example::
* require_once "shortcodes.php";
--- a/fluent-booking/app/Http/Controllers/SchedulesController.php
+++ b/fluent-booking/app/Http/Controllers/SchedulesController.php
@@ -515,6 +515,7 @@
return $booking;
}
+ // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
throw (new ModelNotFoundException)->setModel(Booking::class, [$bookingId]);
}
--- a/fluent-booking/app/Http/Policies/AvailabilityPolicy.php
+++ b/fluent-booking/app/Http/Policies/AvailabilityPolicy.php
@@ -23,9 +23,14 @@
return true;
}
- if ($request->schedule_id) {
- $availability = FluentBookingAppModelsAvailability::find($request->schedule_id);
-
+ // Resolve the schedule from the URL route only — request-body values
+ // must not be permitted to redirect the authorization target.
+ $urlParams = (array) $request->get_url_params();
+ $scheduleId = isset($urlParams['schedule_id']) ? (int) $urlParams['schedule_id'] : 0;
+
+ if ($scheduleId) {
+ $availability = FluentBookingAppModelsAvailability::find($scheduleId);
+
if (!$availability) {
return false;
}
--- a/fluent-booking/app/Http/Policies/CalendarEventPolicy.php
+++ b/fluent-booking/app/Http/Policies/CalendarEventPolicy.php
@@ -20,8 +20,14 @@
return true;
}
- if ($request->event_id) {
- $calendarEvent = CalendarSlot::find($request->event_id);
+ // Resolve event_id from the URL route only — request-body values
+ // must not be permitted to redirect the authorization target.
+ // The /bookings/ index route has no placeholder so guard the access.
+ $urlParams = (array) $request->get_url_params();
+ $eventId = isset($urlParams['event_id']) ? (int) $urlParams['event_id'] : 0;
+
+ if ($eventId) {
+ $calendarEvent = CalendarSlot::find($eventId);
if (!$calendarEvent) {
return false;
}
--- a/fluent-booking/app/Http/Policies/CalendarPolicy.php
+++ b/fluent-booking/app/Http/Policies/CalendarPolicy.php
@@ -21,14 +21,15 @@
return true;
}
- $calendarId = $request->id ?: $request->calendar_id;
+ // Resolve IDs strictly from URL route params; request-body values
+ // must never be allowed to redirect the authorization target.
+ $calendarId = (int) $this->getRouteParam($request, 'id');
+ $eventId = (int) $this->getRouteParam($request, 'event_id');
if (!$calendarId) {
return apply_filters('fluent_booking/verify_calendar_api', current_user_can('manage_options'), $request);
}
- $eventId = $request->event_id;
-
if ($eventId && !CalendarSlot::where('calendar_id', $calendarId)->where('id', $eventId)->exists()) {
return false;
}
@@ -80,7 +81,7 @@
return true;
}
- $calendarId = $request->id;
+ $calendarId = (int) $this->getRouteParam($request, 'id');
$calendar = Calendar::find($calendarId);
@@ -102,15 +103,26 @@
return true;
}
- $eventId = $request->event_id;
+ $eventId = (int) $this->getRouteParam($request, 'event_id');
if (!$eventId || !PermissionManager::canUpdateCalendarEvent($eventId)) {
return false;
}
- $sourceCalendarId = intval($request->id);
+ $sourceCalendarId = (int) $this->getRouteParam($request, 'id');
$destinationCalendarId = intval($request->get('new_calendar_id')) ?: $sourceCalendarId;
return PermissionManager::canWriteCalendar($destinationCalendarId);
}
+
+ /**
+ * Read a URL-only route parameter safely. Some routes under this prefix
+ * (event-lists, root listing, create) have no path placeholder, so a
+ * direct array access would emit an undefined-array-key warning.
+ */
+ private function getRouteParam(Request $request, $key)
+ {
+ $params = (array) $request->get_url_params();
+ return isset($params[$key]) ? $params[$key] : null;
+ }
}
--- a/fluent-booking/app/Http/Policies/MeetingPolicy.php
+++ b/fluent-booking/app/Http/Policies/MeetingPolicy.php
@@ -21,19 +21,23 @@
return true;
}
+ // Authorize only against the URL route parameter so request-body
+ // values cannot override the resource being acted on.
+ $bookingId = $this->getRouteBookingId($request);
+
if ($request->method() == 'GET') {
if (PermissionManager::userCan(['manage_own_calendar','read_all_bookings'])) {
return true;
}
- if ($request->id) {
- $booking = Booking::find($request->id);
+ if ($bookingId) {
+ $booking = Booking::find($bookingId);
return $this->hasBookingAccess($booking);
}
}
- if ($request->id) {
- $booking = Booking::find($request->id);
+ if ($bookingId) {
+ $booking = Booking::find($bookingId);
return $this->hasBookingAccess($booking);
}
@@ -50,7 +54,13 @@
return true;
}
- $booking = Booking::where('group_id', $request->group_id)->first();
+ $groupId = $this->getRouteParam($request, 'group_id');
+
+ if (!$groupId) {
+ return false;
+ }
+
+ $booking = Booking::where('group_id', $groupId)->first();
return $this->hasBookingAccess($booking);
}
@@ -71,15 +81,40 @@
return true;
}
- if (!$request->id) {
+ $bookingId = $this->getRouteBookingId($request);
+
+ if (!$bookingId) {
return false;
}
- $booking = Booking::find($request->id);
+ $booking = Booking::find($bookingId);
return $this->hasBookingAccess($booking);
}
+ /**
+ * Resolve the booking ID from the URL route parameter only.
+ *
+ * Why: merged request inputs let JSON body values shadow URL params,
+ * which previously allowed authorizing against an attacker-owned ID
+ * while the controller acted on the URL-targeted victim ID.
+ */
+ private function getRouteBookingId(Request $request)
+ {
+ return $this->getRouteParam($request, 'id');
+ }
+
+ /**
+ * Read a URL-only route parameter safely. Routes such as /schedules/
+ * and /schedules/export have no path placeholders, so a direct
+ * access would emit an undefined-array-key warning under PHP 8.
+ */
+ private function getRouteParam(Request $request, $key)
+ {
+ $params = (array) $request->get_url_params();
+ return isset($params[$key]) ? $params[$key] : null;
+ }
+
private function hasBookingAccess($booking)
{
if (!$booking) {
--- a/fluent-booking/app/Http/Routes/routes.php
+++ b/fluent-booking/app/Http/Routes/routes.php
@@ -1,5 +1,7 @@
<?php
+defined('ABSPATH') || exit;
+
/**
* @var $router FluentBookingFrameworkHttpRouter
*/
--- a/fluent-booking/app/Services/Helper.php
+++ b/fluent-booking/app/Services/Helper.php
@@ -2352,7 +2352,38 @@
if ($ins) {
return sanitize_text_field($ins);
}
-
+
return get_option('template');
}
+
+ /**
+ * Per-IP fixed-window rate limiter for public AJAX/REST endpoints.
+ *
+ * @param string $action Action name (e.g. apply_coupon, schedule_meeting).
+ * @param int $limit Max requests per window.
+ * @param int $window Window in seconds.
+ * @return bool True if under the limit (and the count was incremented),
+ * false if over.
+ */
+ public static function checkRateLimit($action, $limit, $window = 60)
+ {
+ $args = apply_filters('fluent_booking/public_ajax_ratelimit', [
+ 'limit' => $limit,
+ 'window' => $window,
+ ], $action);
+
+ $limit = max(1, (int) (isset($args['limit']) ? $args['limit'] : $limit));
+ $window = max(1, (int) (isset($args['window']) ? $args['window'] : $window));
+
+ $key = 'fcal_ratelimit_' . $action . '_' . md5(self::getIp());
+ $count = (int) get_transient($key);
+
+ if ($count >= $limit) {
+ return false;
+ }
+
+ set_transient($key, $count + 1, $window);
+
+ return true;
+ }
}
--- a/fluent-booking/app/Services/Integrations/FluentCRM/FluentCrmInit.php
+++ b/fluent-booking/app/Services/Integrations/FluentCRM/FluentCrmInit.php
@@ -149,6 +149,7 @@
$url = admin_url('admin.php?page=fluent-booking#/scheduled-events?email=' . rawurlencode($contact->email) . '&period=all&author=all');
return '<p class="fcal_crm_view_all"><a style="color:#2271b1;padding:0 12px;text-decoration:underline" href="' . esc_url($url) . '">'
+ /* translators: %d: total number of meetings */
. sprintf(esc_html__('View all meetings (%d)', 'fluent-booking'), (int) $total)
. '</a></p>';
}
--- a/fluent-booking/app/Services/Integrations/integrations.php
+++ b/fluent-booking/app/Services/Integrations/integrations.php
@@ -1,5 +1,7 @@
<?php
+defined('ABSPATH') || exit;
+
/*
* Global Modules Intialization
*/
--- a/fluent-booking/app/Services/TransStrings.php
+++ b/fluent-booking/app/Services/TransStrings.php
@@ -1103,7 +1103,8 @@
'Export CSV' => __('Export CSV', 'fluent-booking'),
'Export Guests' => __('Export Guests', 'fluent-booking'),
'Export limited' => __('Export limited', 'fluent-booking'),
- 'Exported first %s of %s bookings. Use filters to narrow down.' => __('Exported first %s of %s bookings. Use filters to narrow down.', 'fluent-booking'),
+ /* translators: 1: exported count, 2: total count */
+ 'Exported first %1$s of %2$s bookings. Use filters to narrow down.' => __('Exported first %1$s of %2$s bookings. Use filters to narrow down.', 'fluent-booking'),
'Failed to generate CSV.' => __('Failed to generate CSV.', 'fluent-booking'),
'From Email' => __('From Email', 'fluent-booking'),
'From Name' => __('From Name', 'fluent-booking'),
--- a/fluent-booking/assets/Blocks/images/index.php
+++ b/fluent-booking/assets/Blocks/images/index.php
@@ -1,3 +0,0 @@
-<?php
-
-// Silence is golden
No newline at end of file
--- a/fluent-booking/assets/public/index.php
+++ b/fluent-booking/assets/public/index.php
@@ -0,0 +1,3 @@
+<?php
+
+// Silence is golden
No newline at end of file
--- a/fluent-booking/database/Migrations/BookingActivityMigrator.php
+++ b/fluent-booking/database/Migrations/BookingActivityMigrator.php
@@ -19,6 +19,7 @@
$indexPrefix = $wpdb->prefix .'fcal_ba_';
if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
$sql = "CREATE TABLE $table (
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`booking_id` BIGINT UNSIGNED NOT NULL,
--- a/fluent-booking/database/Migrations/BookingHostMigrator.php
+++ b/fluent-booking/database/Migrations/BookingHostMigrator.php
@@ -14,6 +14,7 @@
$table = $wpdb->prefix . static::$tableName;
if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
$sql = "CREATE TABLE $table (
`id` BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`booking_id` BIGINT(20) UNSIGNED NOT NULL,
--- a/fluent-booking/database/Migrations/BookingMetaMigrator.php
+++ b/fluent-booking/database/Migrations/BookingMetaMigrator.php
@@ -20,6 +20,7 @@
$indexPrefix = $wpdb->prefix .'fcal_bmt_';
if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
$sql = "CREATE TABLE $table (
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`booking_id` BIGINT NULL,
--- a/fluent-booking/database/Migrations/BookingMigrator.php
+++ b/fluent-booking/database/Migrations/BookingMigrator.php
@@ -15,6 +15,7 @@
$table = $wpdb->prefix . static::$tableName;
if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
$sql = "CREATE TABLE $table (
`id` BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`hash` VARCHAR(192) NULL,
--- a/fluent-booking/database/Migrations/CalendarMigrator.php
+++ b/fluent-booking/database/Migrations/CalendarMigrator.php
@@ -15,6 +15,7 @@
$table = $wpdb->prefix . static::$tableName;
if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
$sql = "CREATE TABLE $table (
`id` BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`hash` VARCHAR(192) NULL,
--- a/fluent-booking/database/Migrations/CalendarSlotsMigrator.php
+++ b/fluent-booking/database/Migrations/CalendarSlotsMigrator.php
@@ -15,6 +15,7 @@
$table = $wpdb->prefix . static::$tableName;
if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
$sql = "CREATE TABLE $table (
`id` BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`hash` VARCHAR(192) NULL,
--- a/fluent-booking/database/Migrations/MetaMigrator.php
+++ b/fluent-booking/database/Migrations/MetaMigrator.php
@@ -19,6 +19,7 @@
$indexPrefix = $wpdb->prefix .'fcal_mt_';
if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table)) != $table) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
+ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange
$sql = "CREATE TABLE $table (
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`object_type` VARCHAR(50) NOT NULL,
--- a/fluent-booking/fluent-booking.php
+++ b/fluent-booking/fluent-booking.php
@@ -2,7 +2,7 @@
/**
Plugin Name: FluentBooking - Appointment Scheduling & Booking Solution
Description: FluentBooking is the ultimate solution for booking appointments, meetings, webinars, events, sales calls, and more.
-Version: 2.1.0
+Version: 2.1.1
Author: Appointment & Booking Solution Team - WPManageNinja
Author URI: https://fluentbooking.com
Plugin URI: https://fluentbooking.com/pricing/
@@ -19,10 +19,10 @@
define('FLUENT_BOOKING_DIR', plugin_dir_path(__FILE__));
define('FLUENT_BOOKING_URL', plugin_dir_url(__FILE__));
-define('FLUENT_BOOKING_VERSION', '2.1.0');
+define('FLUENT_BOOKING_VERSION', '2.1.1');
define('FLUENT_BOOKING_DB_VERSION', '1.0.1');
-define('FLUENT_BOOKING_ASSETS_VERSION', '2.1.0');
-define('FLUENT_BOOKING_MIN_PRO_VERSION', '2.1.0');
+define('FLUENT_BOOKING_ASSETS_VERSION', '2.1.1');
+define('FLUENT_BOOKING_MIN_PRO_VERSION', '2.1.1');
require __DIR__ . '/vendor/autoload.php';
--- a/fluent-booking/language/fluent-booking-de_DE.l10n.php
+++ b/fluent-booking/language/fluent-booking-de_DE.l10n.php
@@ -1,2 +1,2 @@
<?php
-return ['project-id-version'=>'Fluent Booking','report-msgid-bugs-to'=>'','pot-creation-date'=>'2023-10-26 16:40+0000','po-revision-date'=>'2026-05-12 12:51+0000','last-translator'=>'','language-team'=>'German','language'=>'de_DE','plural-forms'=>'nplurals=2; plural=n != 1;','mime-version'=>'1.0','content-type'=>'text/plain; charset=UTF-8','content-transfer-encoding'=>'8bit','x-generator'=>'Loco https://localise.biz/','x-loco-version'=>'2.6.11; wp-6.6.2','x-domain'=>'fluent-booking','x-loco-fallback'=>'de_DE_formal','x-loco-template'=>'language/fluent-booking-de_DE_formal.po','x-loco-template-mode'=>'PO,JSON','messages'=>[' (Host phone number)'=>'(Telefonnummer des Organisators)',' ago'=>'zuvor',' Email'=>'E-Mail',' from now'=>'von jetzt an',' Name'=>'Name','%1$s meeting between %2$s and %3$s'=>'%1s Treffen zwischen %2s und %3s','%s already exists'=>'%s existiert bereits','%s field is required'=>'%s-Feld ist erforderlich','%s has been updated'=>'%s wurde aktualisiert','%s is required'=>'%s ist erforderlich','(Optional) The selected tags will be removed from the contact (if exist)'=>'(Optional) Die ausgewählten Tags werden aus dem Kontakt entfernt (falls vorhanden)','(Required Permission)'=>'(Erlaubnis erforderlich)','(Will Take Less Than a Minute!)'=>'(Dauert weniger als eine Minute!)','+ Add Another Limit'=>'+ Ein weiteres Limit hinzufügen','+ Add Another Reminder'=>'+ Eine weitere Erinnerung hinzufügen','+ Add more questions for invitees'=>'+ Weitere Fragen für Teilnehmer hinzufügen','+ Add new option'=>'+ Neue Option hinzufügen','+Add more questions for invitees'=>'+Weitere Fragen für die Teilnehmer hinzufügen','- Administrator (Owner)'=>'- Administrator (Eigentümer)','1 Day'=>'1 Tag','1 Hour'=>'1 Stunde','1 minute'=>'1 Minute','10 Minutes'=>'10 Minuten','10 minutes'=>'10 Minuten','105 Minutes'=>'105 Minuten','12 Hours'=>'12 Stunden','120 Minutes'=>'120 Minuten','12h'=>'12 Std.','15 Minutes'=>'15 Minuten','15 minutes'=>'15 Minuten','150 Minutes'=>'150 Minuten','180 Minutes'=>'180 Minuten','2 Days'=>'2 Tage','2 Hours'=>'2 Stunden','20 Minutes'=>'20 Minuten','240 Minutes'=>'240 Minuten','24h'=>'24 Std.','3 Hours'=>'3 Stunden','30 Minutes'=>'30 Minuten','40 Minutes'=>'40 Minuten','45 Minutes'=>'45 Minuten','480 Minutes'=>'480 Minuten','5 Minutes'=>'5 Minuten','5 minutes'=>'5 Minuten','50 Minutes'=>'50 Minuten','6 Hours'=>'6 Stunden','60 Minutes'=>'60 Minuten','75 Minutes'=>'75 Minuten','90 Minutes'=>'90 Minuten','A confirmation has been sent to your email address along with meeting location details.'=>'Eine Bestätigung wurde an Ihre E-Mail-Adresse geschickt, zusammen mit Angaben zum Veranstaltungsort.','A new appointment has been created on FluentBooking. %1$sView Booking Details%2$s'=>'Es wurde ein neuer Termin in FluentBooking erstellt. %1$sBuchungsdetails anzeigen%2$s','A particular user can have one calendar with multiple events. Please select a user who does not have a calendar yet'=>'Ein bestimmter Benutzer kann einen Kalender mit mehreren Ereignissen haben. Bitte wählen Sie einen Benutzer, der noch keinen Kalender hat','About'=>'Über','about this feature'=>'Über diese Funktion','Access Permissions for this user'=>'Zugriffsberechtigungen für diesen Benutzer','Action'=>'Aktion','Active'=>'Aktiv','Add'=>'Hinzufügen','Add a date override'=>'Einen Sondertag hinzufügen','Add another'=>'Einen weiteren hinzufügen','Add Another Conditional Group'=>'Eine weitere bedingte Gruppe hinzufügen','Add another location option'=>'Weitere Standortwahl hinzufügen','Add Calendar to Gutenberg Block'=>'Kalender zu Gutenberg-Block hinzufügen','Add date overrides'=>'Sondertag(e) hinzufügen','Add dates when your availability changes from your weekly hours'=>'Fügen Sie Daten hinzu, wenn sich Ihre Verfügbarkeit gegenüber Ihren wöchentlichen Arbeitszeiten ändert','Add guests'=>'Gäste hinzufügen','Add Host'=>'Gastgeber hinzufügen','Add Location'=>'Standort hinzufügen','Add More'=>'Mehr hinzufügen','Add more item'=>'Weitere Artikel hinzufügen','Add New'=>'Neu hinzufügen','Add New Availability Schedule'=>'Neuen Verfügbarkeitsplan hinzufügen','Add New Booking'=>'Neue Buchung hinzufügen','Add New Calendar Host'=>'Neuen Kalender-Organisator hinzufügen','Add New Host'=>'Neuen Organisator hinzufügen','Add New Integration'=>'Neue Integration hinzufügen','Add new option'=>'+Neue Option hinzufügen','Add New Schedule'=>'Neuen Zeitplan hinzufügen','Add New Team'=>'Neues Team hinzufügen','Add New Webhook'=>'Neuen Webhook hinzufügen','Add New Zoom User Account'=>'Neues Zoom-Benutzerkonto hinzufügen','Add One-off Event'=>'Einmal-Veranstaltung hinzufügen','Add Parameters'=>'Parameter hinzufügen','Add Question'=>'Frage hinzufügen','Add Shortcodes'=>'Shortcodes hinzufügen','Add Single Event'=>'Einzelnes Ereignis hinzufügen','Add Team'=>'Team hinzufügen','Add Team Member'=>'Team-Mitglied hinzufügen','Add to Block'=>'Zu Block hinzufügen','Add to calendar'=>'Zu Kalender hinzufügen','Additional Guests'=>'Zusätzliche Gäste','Additional Note'=>'Zusätzlicher Hinweis','Additional Recipients'=>'Zusätzliche Empfänger','Additional Settings'=>'Weitere Einstellungen','Address'=>'Adresse','Admin Email'=>'Admin-E-Mail','Administrator'=>'Administrator','Advanced Operators'=>'Fortgeschrittene Operatoren','Advanced Settings'=>'Erweiterte Einstellungen','After Event'=>'Nach dem Termin','All'=>'Alle','All Active Booking Forms'=>'Alle aktiven Buchungsformulare','All connected zoom accounts by you and your team members. You can review who connected their zoom account from Host Settings and manage from here for all of your team members.'=>'Alle verbundenen Zoom-Konten von Ihnen und Ihren Teammitgliedern. Sie können überprüfen, wer sein Zoom-Konto über die Host-Einstellungen verbunden hat und von hier aus alle Ihre Teammitglieder verwalten.','All Data'=>'Alle Daten','All dates are shown in'=>'Alle Daten werden angezeigt in','All Event Types'=>'Alle Veranstaltungsarten','All Events'=>'Alle Termine','All Meetings'=>'Alle Termine','All Schedules'=>'Alle Zeitpläne','Allow Multiple Booking'=>'Erlaube mehrfache Buchungen','Already assigned'=>'Bereits zugewiesen','Always'=>'Immer','Amber'=>'Bernstein','Amount'=>'Menge','API Error:'=>'API-Fehler:','Apple Calendar'=>'Apple Calendar','Apply'=>'Anwenden','Appointment could not be created'=>'Termin konnte nicht erstellt werden','Appointment could not be created because email is not given or invalid'=>'Termin konnte nicht erstellt werden, weil E-Mail nicht angegeben oder ungültig ist','Appointment Date & Time is required'=>'Datum und Uhrzeit des Termins sind erforderlich','Apr'=>'Apr.','April'=>'April','Are you sure to delete this Feed?'=>'Sind Sie sicher, dass Sie diesen Feed löschen wollen?','Are you sure to delete this webhook?'=>'Sind Sie sicher, dass Sie diesen Webhook löschen wollen?','Are you sure to delete this?'=>'Sind Sie sicher, dass Sie das löschen wollen?','Are you sure to disconnect this account?'=>'Sind Sie sicher, dass Sie die Verbindung zu diesem Konto trennen wollen?','Are you sure you want to delete this availability?'=>'Sind Sie sicher, dass Sie diese Verfügbarkeit löschen wollen?','Are you sure you want to delete this booking type? All the associate bookings and data will be deleted'=>'Sind Sie sicher, dass Sie diese Buchungsart löschen möchten? Alle zugehörigen Buchungen und Daten werden gelöscht','Are you sure you want to delete this booking?'=>'Sind Sie sicher, dass Sie diese Buchung löschen möchten?','Are you sure you want to delete this calendar? All the associate bookings and data will be deleted'=>'Sind Sie sicher, dass Sie diesen Kalender löschen möchten? Alle zugehörigen Buchungen und Daten werden gelöscht','Are you sure you want to disconnect this calendar? This action can't be undone.'=>'Sind Sie sicher, dass Sie die Verbindung zu diesem Kalender trennen möchten? Diese Aktion kann nicht rückgängig gemacht werden.','Are you sure you want to disconnect this integration?'=>'Sind Sie sicher, dass Sie diese Integration trennen wollen?','as group booking type'=>'als Buchungsart für Gruppen','Assign Member'=>'Mitglied zuweisen','Assignment'=>'Zuweisung','Associate your FluentCRM merge tags to the appropriate Fluent Form fields by selecting the appropriate form field from the list.'=>'Verknüpfen Sie Ihre FluentCRM-Seriennummern mit den entsprechenden Fluent Form-Feldern, indem Sie das entsprechende Formularfeld aus der Liste auswählen.','Attendee address'=>'Adresse des Teilnehmers','Attendee Cannot Cancel'=>'Teilnehmer kann nicht stornieren','Attendee Cannot Reschedule'=>'Teilnehmer kann nicht verschieben','Attendee Data'=>'Teilnehmerdaten','Attendee Phone Number'=>'Telefonnummer des Teilnehmers','Attendee phone number (with country code)'=>'Telefonnummer des Teilnehmers inkl. Ländercode','Attendee's Email'=>'E-Mail des teilnehmers','Attendee's Name'=>'Name des Teilnehmers','Attendee's Timezone'=>'Zeitzone des Teilnehmers','Aug'=>'Aug.','August'=>'August','Availability'=>'Verfügbarkeit','Available Durations'=>'Verfügbare Zeitspannen','Available Times'=>'Verfügbare Zeiten','Back'=>'Back','Back to dashboard'=>'Zurück zum Dashboard','Back to home'=>'Zurück zur Übersicht','Back to team'=>'Zurück zum Team','Before Event'=>'Vor dem Termin','beta'=>'beta','Book a meeting with me for %d minutes'=>'Buchen Sie einen Termin mit mir für %d Minuten','Book Now'=>'Jetzt buchen','Booked'=>'Gebucht','booked a new meeting at'=>'hat einen neuen Termin gebucht am','Booked At'=>'Gebucht am','Booked From'=>'Gebucht vom','Booking'=>'Buchung','Booking Calendar'=>'Buchungskalender','Booking Canceled'=>'Buchung abgesagt','Booking Cancellation URL'=>'URL für Buchungsstornierung','Booking Cancelled'=>'Termin abgesagt','Booking Cancelled by Attendee (email to Organizer)'=>'Termin abgesagt durch Teilnehmer (E-Mail an Organisator)','Booking Cancelled by Organizer (email to Attendee)'=>'Termin abgesagt durch Organisator (E-Mail an Teilnehmer)','Booking Completed'=>'Buchung abgeschlossen','Booking Confirmation Email to Attendee'=>'Terminbestätigungs-E-Mail an Teilnehmer','Booking Confirmation Email to Organizer (You)'=>'Terminbestätigungs-E-Mail an Organisator (Sie)','Booking Confirmed'=>'Buchung bestätigt','Booking Data'=>'Buchungsdaten','Booking Date'=>'Buchungsdatum','Booking Deleted Successfully!'=>'Buchung erfolgreich gelöscht!','Booking Details Admin URL'=>'Buchungsdaten Admin-URL','Booking Fee'=>'Buchungsgebühr','Booking Field'=>'Buchungsfeld','Booking form spot selectionNext'=>'Weiter','Booking has been confirmed'=>'Die Buchung wurde bestätigt','Booking has been confirmed by '=>'Die Buchung wurde bestätigt durch ','Booking has been created'=>'Die Buchung wurde erstellt','Booking has been created on FluentBooking'=>'Die Buchung wurde in FluentBooking erstellt','Booking has been rescheduled'=>'Die Buchung wurde verschoben','Booking hash is missing!'=>'Die Buchungsraute fehlt!','Booking ID'=>'Buchungs-ID','Booking Payment Items'=>'Zahlungsposten buchen','Booking Questions'=>'Buchungsfragen','Booking Rejected'=>'Die Buchung wurde abgelehnt','Booking request has been rejected by %s'=>'Die Buchung wurde von %s abgelehnt','Booking Reschedule URL'=>'URL für Buchungsverschiebung','Booking Rescheduled'=>'Die Buchung wurde verschoben','Booking Rescheduled by Attendee (email to Organizer)'=>'Vom Teilnehmer verschobener Termin (E-Mail an den Organisator)','Booking Rescheduled by Organizer (email to Attendee)'=>'Vom Organisator verschobener Termin (E-Mail an den Teilnehmer)','Booking Status'=>'Buchungsstatus','Booking Title'=>'Buchungs-Titel','Booking Trends'=>'Buchungs-Trends','Booking Type'=>'Buchungsart','Booking Types'=>'Buchungsarten','Booking URL'=>'Buchungs-URL','Bookings'=>'Buchungen','Burundian Franc'=>'Burundischer Franc','Caching Time'=>'Caching-Zeit','Calendar could not be found. Please try again'=>'Der Kalender konnte nicht gefunden werden. Bitte versuchen Sie es erneut','calendar day fullFriday'=>'Freitag','calendar day fullMonday'=>'Montag','calendar day fullSaturday'=>'Samstag','calendar day fullSunday'=>'Sonntag','calendar day fullThursday'=>'Donnerstag','calendar day fullTuesday'=>'Dienstag','calendar day fullWednesday'=>'Mittwoch','calendar day shortFri'=>'Fr','calendar day shortMon'=>'Mo','calendar day shortSat'=>'Sa','calendar day shortSun'=>'So','calendar day shortThu'=>'Do','calendar day shortTue'=>'Di','calendar day shortWed'=>'Mi','Calendar Deleted Successfully!'=>'Kalender erfolgreich gelöscht!','Calendar Description'=>'Beschreibung des Kalenders','Calendar Event has been deleted'=>'Kalenderereignis wurde gelöscht','Calendar Event not found'=>'Kalenderereignis nicht gefunden','calendar events are using this schedule'=>'Kalenderereignisse werden nach diesem Zeitplan durchgeführt','Calendar has been updated successfully'=>'Der Kalender wurde erfolgreich aktualisiert','Calendar ID'=>'Kalender-ID','Calendar imported successfully'=>'Kalender erfolgreich importiert','calendar month name fullApril'=>'April','calendar month name fullAugust'=>'August','calendar month name fullDecember'=>'Dezember','calendar month name fullFebruary'=>'Februar','calendar month name fullJanuary'=>'Januar','calendar month name fullJuly'=>'Juli','calendar month name fullJune'=>'Juni','calendar month name fullMarch'=>'März','calendar month name fullMay'=>'Mai','calendar month name fullNovember'=>'November','calendar month name fullOctober'=>'Oktober','calendar month name fullSeptember'=>'September','calendar month name shortApr'=>'Apr.','calendar month name shortAug'=>'Aug.','calendar month name shortDec'=>'Dez.','calendar month name shortFeb'=>'Feb.','calendar month name shortJan'=>'Jan.','calendar month name shortJul'=>'Jul.','calendar month name shortJun'=>'Jun.','calendar month name shortMar'=>'Mär.','calendar month name shortMay'=>'Mai','calendar month name shortNov'=>'Nov.','calendar month name shortOct'=>'Okt.','calendar month name shortSep'=>'Sep.','Calendar not found'=>'Kalender nicht gefunden','Calendar Settings'=>'Kalender-Einstellungen','Calendar start from'=>'Der Kalender beginnt am','Calendar Title'=>'Kalender-Titel','Calendar Type'=>'Kalender-Typ','Calendars'=>'Kalender','Can't delete: %s events depend on this schedule'=>'Kann nicht gelöscht werden: %s Ereignisse hängen von diesem Zeitplan ab','Cancel'=>'Abbrechen','Cancel Booking'=>'Termin absagen','Cancel Meeting'=>'Termin absagen','Cancellation'=>'Absage','Cancellation Reason'=>'Absagegrund','Cancelled'=>'Abgesagt','cancelled'=>'abgesagt','Cancelled Bookings'=>'Stornierte Buchungen','Card Last 4'=>'Karte Letzte 4','Central African Cfa Franc'=>'Zentralafrikanischer Cfa-Franc','Cfp Franc'=>'Cfp-Franc','Checkbox'=>'Checkbox','Checkbox Group'=>'Checkbox-Gruppe','Chilean Peso'=>'Chilenischer Peso','Click here'=>'Hier klicken','click here'=>'hier klicken','Click Here to Renew your License'=>'Klicken Sie hier, um Ihre Lizenz zu erneuern','click to upload'=>'Zum Uploaden klicken','Client ID'=>'Client-ID','Clone'=>'Klonen','Clone Calendar Event'=>'Klone Kalenderereignis','Clone Event'=>'Klone Ereignis','Clone from'=>'Klone von','Close'=>'Schließen','Comorian Franc'=>'Komorenfranke','Completed'=>'Abgeschlossen','completed'=>'abgeschlossen','Completed Bookings'=>'Abgeschlossene Buchungen','Conditional Logics is a Pro Feature'=>'Bedingte Logik ist ein Profi-Feature','Conferencing'=>'Konferenzen','Configuration required!'=>'Konfiguration erforderlich!','Configure Google Calendar/Meet to sync your events'=>'Konfigurieren Sie Google Calendar/Meet für die Synchronisierung Ihrer Termine','Configure Meeting Reminder to Attendee'=>'Terminerinnerung an Teilnehmer konfigurieren','Configure Meeting Reminder to Organizer (You)'=>'Terminerinnerung an Organisator (Sie) konfigurieren','Configure stripe to accept payments on your booking events and monetize your time slots'=>'Konfigurieren Sie Stripe, um Zahlungen für Ihre Buchungsereignisse zu akzeptieren und Ihre Zeitfenster zu monetarisieren','Configure times when you are available for bookings.'=>'Legen Sie die Zeiten fest, zu denen Sie für Buchungen verfügbar sind.','Configure your email settings for booking related emails'=>'Konfigurieren Sie Ihre E-Mail-Einstellungen für buchungsbezogene E-Mails','Confirm'=>'Bestätigen','Confirm Disconnect'=>'Trennen der Verbindung bestätigen','Confirm Payment'=>'Zahlung bestätigen','Confirm Reschedule'=>'Terminverschiebung bestätigen','Confirm, Disconnect'=>'Bestätigen, Verbindung trennen','Confirmation: '=>'Bestätigung','Congratulations!'=>'Herzlichen Glückwunsch!','Connect FluentCRM with Fluent Booking and subscribe a contact when a booking is created.'=>'Verbinden Sie FluentCRM mit Fluent Booking und abonnieren Sie einen Kontakt, wenn eine Buchung erstellt wird.','Connect with stripe'=>'Verbinden mit Stripe','Connect your favourite tools with your booking scheduled, completed or cancelled actions'=>'Verbinden Sie Ihre bevorzugten Tools mit Ihren geplanten, abgeschlossenen oder abgebrochenen Buchungen','Connect Your Zoom Account'=>'Verbinden Sie Ihr Zoom-Konto','Connect your Zoom account to create dynamic meeting in zoom for your bookings.'=>'Verbinden Sie Ihr Zoom-Konto, um dynamische Meetings in Zoom für Ihre Buchungen zu erstellen.','Connect your Zoom account to create meeting when a event is booked.'=>'Verbinden Sie Ihr Zoom-Konto, um ein Meeting zu erstellen, wenn eine Veranstaltung gebucht wird.','Connected Zoom Account Email:'=>'E-Mail des verbundenen Zoom-Kontos:','Connected Zoom Accounts'=>'Verknüpfte Zoom-Konten','Contact creation has been skipped because the contact already exists in the database'=>'Die Erstellung eines Kontakts wurde übersprungen, da der Kontakt bereits in der Datenbank vorhanden ist','Contact has been created in FluentCRM. Contact ID: '=>'Der Kontakt wurde in FluentCRM erstellt. Kontakt-ID: ','Contact has been updated in FluentCRM. Contact ID: '=>'Der Kontakt wurde in FluentCRM aktualisiert. Kontakt-ID: ','Contact Tags'=>'Kontakt-Tags','Contains'=>'Enthält','contains'=>'enthält','Continue'=>'Weiter','Continue to Payments'=>'Weiter zu Zahlungen','Copied to clipboard'=>'In die Zwischenablage kopiert','Copy'=>'Kopieren','Copy and use the shortcode Page/Post of your website'=>'Kopieren und verwenden Sie den Shortcode Page/Post Ihrer Website','Copy link'=>'Link kopieremn','Country'=>'Land','Create Booking'=>'Erzeuge Buchung','Create Booking Manually'=>'Erzeuge manuelle Buchung','Create events on'=>'Termine erstellen in Kalender','Create New Event Type'=>'Neuen Termin-Typ erstellen','create one!'=>'einen erstellen!','Create Your Availability'=>'Ihre Verfügbarkeit erstellen','Create Your First Booking Event'=>'Erstellen Sie Ihren ersten Buchungstermin','Currency'=>'Währung','Current DateTime:'=>'Aktuelle(s) Datum/Uhrzeit:','Custom'=>'Benutzerdefiniert','Custom Number'=>'Benutzerdefinierte Nummer','Customer Details'=>'Kunden-Details','Cyan'=>'Cyan','Daily'=>'Täglich','Dark'=>'Dunkel','Dashboard'=>'Dashboard','Data has been updated'=>'Die Daten wurden aktualisiert','Date'=>'Datum','Date & Time'=>'Datum & Uhrzeit','Date Overrides'=>'Sondertage','date time format switch12h'=>'12 Std.','date time format switch24h'=>'24 Std.','Date:'=>'Datum:','Day'=>'Tag','Days'=>'Tage','Days Before'=>'Tage vorher','Days into the future'=>'Tage in die Zukunft','Dec'=>'Dez.','December'=>'Dezember','Deep Lilac'=>'Tiefes Flieder','Default'=>'Standard','Default Country for Phone Field'=>'Standard-Land für die Telefonnummer','Default Duration'=>'Standard-Dauer ','Default Name that will be used to send email)'=>'Standardname, der für den Versand von E-Mails verwendet wird)','Default Reply to Email (Optional)'=>'Standardantwort an E-Mail (optional)','Default Reply to Name (Optional)'=>'Standardantwort an Name (optional)','Default schedule'=>'Standard-Zeitplan','Default Schedule cannot be deleted'=>'Standardzeitplan kann nicht gelöscht werden','Default Time Format'=>'Standard-Zeitformat','Delete'=>'Löschen','Delete Availability'=>'Verfügbarkeit löschen','Delete Booking Type'=>'Buchungsart löschen','Delete Calendar'=>'Kalender löschen','Delete Meeting'=>'Termin löschen','Delete this group'=>'Diese Gruppe löschen','Deleted User'=>'Gelöschter Benutzer','Deleted user'=>'Gelöschter Benutzer','Description'=>'Beschreibung','Disable'=>'Deaktivieren','Disable Landing Page Feature'=>'Landing Page-Funktion deaktivieren','Disabled'=>'Deaktiviert','Discard'=>'Verwerfen','Disconnect'=>'Trennen','Disconnect Calendar'=>'Kalender trennen','Disconnect Integration'=>'Integration trennen','Display Description on booking page'=>'Beschreibung auf der Buchungsseite anzeigen','Display Link on booking page'=>'Link auf der Buchungsseite anzeigen','Display Phone number on booking page'=>'Telefonnummer auf der Buchungsseite anzeigen','Display remaining spots on booking page'=>'Verbleibende Plätze auf der Buchungsseite anzeigen','Djiboutian Franc'=>'Dschibutischer Franc','do not contains'=>'enthält nicht','Don't have a license key?'=>'Sie haben keinen Lizenzschlüssel?','Duplicate'=>'Duplizieren','Edit'=>'Bearbeiten','Edit Availability'=>'Verfügbarkeit bearbeiten','Edit Location'=>'Standort bearbeiten','Edit Notification'=>'Benachrichtigung bearbeiten','Edit Team Member'=>'Team-Mitglied bearbeiten','Edit the schedule below so that you can apply to your event/booking types'=>'Bearbeiten Sie den Zeitplan unten, damit Sie ihn auf Ihre Veranstaltung/Buchungstypen anwenden können','Edit:'=>'Bearbeiten:','eg: 4'=>'z.B.: 4','Email'=>'E-Mail','Email Address'=>'E-Mail-Adresse','email as per your domain/SMTP settings'=>'E-Mail gemäß Ihren Domänen-/SMTP-Einstellungen','Email Body'=>'E-Mail-Text','Email Footer for Booking related emails (Optional)'=>'E-Mail-Fußzeile für buchungsbezogene E-Mails (optional)','Email Frequency?'=>'E-Mail Frequenz?','Email is required'=>'E-Mail ist erforderlich','Email is required for this appointment. Looks like this field does not have email field selected.'=>'E-Mail ist für diesen Termin erforderlich. Es sieht so aus, als ob für dieses Feld kein E-Mail-Feld ausgewählt wurde.','Email is required for this appointment. Please provide a valid email'=>'Für diesen Termin ist eine E-Mail erforderlich. Bitte geben Sie eine gültige E-Mail an','Email Notification'=>'E-Mail Benachrichtigung','Email Notification Settings'=>'Einstellungen für E-Mail-Benachrichtigungen','Email Notifications'=>'E-Mail-Benachrichtungen','Email Summary of Your Bookings (Last %d Day)'=>'E-Mail-Übersicht über Ihre Buchungen (letzte %d Tage)' . "