From fe3c8fa7c59a5031286b68b88966079745374f8c Mon Sep 17 00:00:00 2001
From: M_Viper
Date: Sun, 8 Nov 2026 20:09:19 +0000
Subject: [PATCH] Upload via GUI (30 Dateien)
---
wordpress-plugin/README.md | 2 +-
.../deskhub-tickets/assets/form.css | 2 +
.../deskhub-tickets/assets/form.js | 6 +
.../deskhub-tickets/deskhub-tickets.php | 4 +-
.../deskhub-tickets/includes/class-client.php | 6 +-
.../deskhub-tickets/includes/class-form.php | 138 +-
.../includes/class-settings.php | 8 +
.../deskhub-tickets/includes/functions.php | 1 +
.../languages/deskhub-tickets-en_AU.mo | Bin 14113 -> 15743 bytes
.../languages/deskhub-tickets-en_AU.po | 57 +-
.../languages/deskhub-tickets-en_CA.mo | Bin 14113 -> 15743 bytes
.../languages/deskhub-tickets-en_CA.po | 57 +-
.../languages/deskhub-tickets-en_GB.mo | Bin 14113 -> 15743 bytes
.../languages/deskhub-tickets-en_GB.po | 57 +-
.../languages/deskhub-tickets-en_NZ.mo | Bin 14113 -> 15743 bytes
.../languages/deskhub-tickets-en_NZ.po | 57 +-
.../languages/deskhub-tickets-en_US.mo | Bin 14113 -> 15743 bytes
.../languages/deskhub-tickets-en_US.po | 57 +-
.../languages/deskhub-tickets-en_ZA.mo | Bin 14113 -> 15743 bytes
.../languages/deskhub-tickets-en_ZA.po | 57 +-
wordpress-plugin/deskhub-tickets/readme.txt | 139 +-
wordpress-plugin/tests/run.php | 1115 +++++++++--------
wordpress-plugin/tests/wp-stub.php | 3 +
wordpress-plugin/tools/en.json | 21 +-
24 files changed, 1137 insertions(+), 650 deletions(-)
diff --git a/wordpress-plugin/README.md b/wordpress-plugin/README.md
index 05d7d032..11ebcfd0 100644
--- a/wordpress-plugin/README.md
+++ b/wordpress-plugin/README.md
@@ -62,7 +62,7 @@ Unter *Einstellungen → DeskHub Tickets* gibt es **„Speichern und Verbindung
## Grenzen
-- **Keine Dateianhänge:** Die öffentliche API von DeskHub nimmt nur Text. Der Anhang-Upload des Kundenformulars fehlt deshalb im WordPress-Formular.
+- **Dateianhänge (ab Plugin 1.3.0 und DeskHub 1.0.67):** Besucher können bis zu 5 Dateien anhängen (zusammen höchstens 10 MB). Erlaubte Typen und die Größe je Datei bestimmt DeskHub (Einstellungen → Uploads); im Plugin lässt sich die Funktion ausschalten, ein eigenes Formular in DeskHub kann Anhänge ebenfalls abschalten. Mit älterem DeskHub bleibt das Feld unsichtbar.
- **Ältere DeskHub-Version:** Ohne die Formular-Schnittstelle (vor 1.0.64) zeigt das Plugin das einfache Formular ohne eigene Felder; Administratoren sehen einen Hinweis.
- **IP-Adresse im Ticket:** DeskHub sieht die IP-Adresse Ihres WordPress-Servers, nicht die des Besuchers.
- **Mengenbegrenzung der API:** DeskHub nimmt über die API höchstens 60 Tickets pro Minute an (für alle Aufrufer zusammen).
diff --git a/wordpress-plugin/deskhub-tickets/assets/form.css b/wordpress-plugin/deskhub-tickets/assets/form.css
index 65f98b47..18646e9a 100644
--- a/wordpress-plugin/deskhub-tickets/assets/form.css
+++ b/wordpress-plugin/deskhub-tickets/assets/form.css
@@ -107,6 +107,8 @@
.dht-wrap .dht-group { font-size: 1.1em !important; line-height: 1.3 !important; font-weight: 600 !important; letter-spacing: normal !important; text-transform: none !important; }
.dht-radios.dht-inline { display: flex; flex-wrap: wrap; gap: 0 1.4em; }
.dht-radios.dht-inline legend { flex: 1 1 100%; }
+.dht-attach input[type="file"] { width: 100%; padding: .5em 0; font: inherit; color: inherit; }
+.dht-attach .dht-help { display: block; }
.dht-help { margin: .3em 0 0; font-size: .88em; color: var(--dht-muted); }
.dht-req { color: #b91c1c; }
.dht-group { margin: 1.2em 0 .6em; }
diff --git a/wordpress-plugin/deskhub-tickets/assets/form.js b/wordpress-plugin/deskhub-tickets/assets/form.js
index aed5a481..6fcdc0c9 100644
--- a/wordpress-plugin/deskhub-tickets/assets/form.js
+++ b/wordpress-plugin/deskhub-tickets/assets/form.js
@@ -43,6 +43,12 @@
var mi = message.querySelector('textarea');
if (mi) { mi.disabled = !f.messageShow; mi.required = !!f.messageShow; mi.placeholder = f.messageHint || ''; }
}
+ var attach = form.querySelector('.dht-attach');
+ if (attach) {
+ attach.hidden = !f.attachments;
+ var fi = attach.querySelector('input[type=file]');
+ if (fi) { fi.disabled = !f.attachments; if (!f.attachments) { fi.value = ''; } }
+ }
var submit = form.querySelector('.dht-submit');
if (submit && f.submitLabel) { submit.textContent = f.submitLabel; }
}
diff --git a/wordpress-plugin/deskhub-tickets/deskhub-tickets.php b/wordpress-plugin/deskhub-tickets/deskhub-tickets.php
index f409cecc..d7c6ef9c 100644
--- a/wordpress-plugin/deskhub-tickets/deskhub-tickets.php
+++ b/wordpress-plugin/deskhub-tickets/deskhub-tickets.php
@@ -3,7 +3,7 @@
* Plugin Name: DeskHub Tickets
* Plugin URI: https://git.viper.ipv64.net/M_Viper/deskhub
* Description: Support-Tickets aus WordPress heraus in DeskHub anlegen und den Status abfragen. Formular und Statusabfrage per Shortcode, Spamschutz, Einwilligung und optional Cloudflare Turnstile.
- * Version: 1.2.2
+ * Version: 1.3.0
* Requires at least: 5.8
* Requires PHP: 7.4
* Author: DeskHub
@@ -17,7 +17,7 @@ if (!defined('ABSPATH')) {
exit;
}
-define('DESKHUB_TICKETS_VERSION', '1.2.2');
+define('DESKHUB_TICKETS_VERSION', '1.3.0');
define('DESKHUB_TICKETS_FILE', __FILE__);
define('DESKHUB_TICKETS_DIR', plugin_dir_path(__FILE__));
define('DESKHUB_TICKETS_ASSETS', plugin_dir_url(__FILE__));
diff --git a/wordpress-plugin/deskhub-tickets/includes/class-client.php b/wordpress-plugin/deskhub-tickets/includes/class-client.php
index 4115d035..8039e31c 100644
--- a/wordpress-plugin/deskhub-tickets/includes/class-client.php
+++ b/wordpress-plugin/deskhub-tickets/includes/class-client.php
@@ -71,13 +71,17 @@ class Deskhub_Tickets_Client
public function create_ticket(array $data)
{
$fields = $data['fields'] ?? null;
- unset($data['fields']);
+ $attachments = $data['attachments'] ?? null;
+ unset($data['fields'], $data['attachments']);
$payload = array_filter($data, static function ($v) {
return $v !== null && $v !== '' && $v !== 0;
});
if (is_array($fields)) {
$payload['fields'] = (object) $fields; // auch leer senden: Damit prüft DeskHub die Angaben gegen das Kundenformular
}
+ if (is_array($attachments) && $attachments) {
+ $payload['attachments'] = array_values($attachments);
+ }
$res = $this->request('POST', [], $payload);
if (is_wp_error($res)) {
return $res;
diff --git a/wordpress-plugin/deskhub-tickets/includes/class-form.php b/wordpress-plugin/deskhub-tickets/includes/class-form.php
index a7fdf902..0dba0af8 100644
--- a/wordpress-plugin/deskhub-tickets/includes/class-form.php
+++ b/wordpress-plugin/deskhub-tickets/includes/class-form.php
@@ -157,7 +157,7 @@ class Deskhub_Tickets_Form
$texts = [];
foreach ($forms as $tid => $fm) {
$texts[$tid] = ['title' => $fm['title'], 'intro' => $fm['intro'], 'subjectShow' => $fm['subject']['show'], 'subjectLabel' => $fm['subject']['label'],
- 'messageShow' => $fm['message']['show'], 'messageLabel' => $fm['message']['label'], 'messageHint' => $fm['message']['hint'], 'submitLabel' => $fm['submitLabel']];
+ 'messageShow' => $fm['message']['show'], 'messageLabel' => $fm['message']['label'], 'messageHint' => $fm['message']['hint'], 'submitLabel' => $fm['submitLabel'], 'attachments' => $fm['attachments']['enabled']];
}
if ($unsupported && current_user_can('manage_options')) {
echo '
' . esc_html__('Der DeskHub-Server kennt die Formular-Schnittstelle noch nicht (bitte DeskHub aktualisieren). Bis dahin wird das einfache Formular ohne eigene Felder gezeigt. (Diese Meldung sehen nur Administratoren.)', 'deskhub-tickets') . '
@@ -247,6 +272,104 @@ class Deskhub_Tickets_Form
];
}
+ /**
+ * Angebot für Dateianhänge aus dem Formular von DeskHub. Ohne Angabe (ältere DeskHub-Version) oder wenn die Option des Plugins
+ * ausgeschaltet ist, gibt es keine Anhänge.
+ *
+ * @param mixed $a
+ * @return array{enabled:bool,maxFiles:int,maxFileBytes:int,maxTotalBytes:int,allowed:string[]}
+ */
+ public static function normalize_attachments($a): array
+ {
+ $off = ['enabled' => false, 'maxFiles' => 0, 'maxFileBytes' => 0, 'maxTotalBytes' => 0, 'allowed' => []];
+ $opts = deskhub_tickets_options();
+ if (!is_array($a) || empty($a['enabled']) || empty($opts['attachments'])) {
+ return $off;
+ }
+ $allowed = [];
+ foreach ((array) ($a['allowedExtensions'] ?? []) as $e) {
+ $e = strtolower(ltrim(trim((string) $e), '.'));
+ if ($e !== '' && preg_match('/^[a-z0-9]{1,8}$/', $e)) {
+ $allowed[] = $e;
+ }
+ }
+ $files = max(0, min(10, (int) ($a['maxFiles'] ?? 0)));
+ $perFile = max(0, (int) ($a['maxFileBytes'] ?? 0));
+ $total = max(0, (int) ($a['maxTotalBytes'] ?? 0));
+ if ($files < 1 || $perFile < 1 || $total < 1 || !$allowed) {
+ return $off;
+ }
+ return ['enabled' => true, 'maxFiles' => $files, 'maxFileBytes' => $perFile, 'maxTotalBytes' => $total, 'allowed' => $allowed];
+ }
+
+ /** Menschenlesbare Größe ("5 MB"). */
+ private static function format_bytes(int $b): string
+ {
+ return $b >= 1048576 ? rtrim(rtrim(number_format($b / 1048576, 1, ',', ''), '0'), ',') . ' MB' : max(1, (int) round($b / 1024)) . ' KB';
+ }
+
+ /**
+ * Prüft die hochgeladenen Dateien gegen das Angebot und gibt sie fertig für die Schnittstelle zurück.
+ *
+ * @param array $files $_FILES['dht_files']
+ * @return array{0:string[],1:array} [Fehler, Anhänge]
+ */
+ public static function collect_attachments(array $files, array $policy): array
+ {
+ $names = isset($files['name']) ? (array) $files['name'] : [];
+ $errors = [];
+ $out = [];
+ $total = 0;
+ $dangerous = ['php', 'php3', 'php4', 'php5', 'php7', 'php8', 'phtml', 'phar', 'exe', 'bat', 'cmd', 'sh', 'js', 'html', 'htm', 'svg'];
+ foreach ($names as $i => $rawName) {
+ $err = (int) ($files['error'][$i] ?? UPLOAD_ERR_NO_FILE);
+ if ($err === UPLOAD_ERR_NO_FILE) {
+ continue; // nichts ausgewählt
+ }
+ $name = sanitize_file_name(wp_unslash((string) $rawName));
+ if (!$policy['enabled']) {
+ return [[__('Bei diesem Formular können keine Dateien angehängt werden.', 'deskhub-tickets')], []];
+ }
+ if (count($out) >= $policy['maxFiles']) {
+ $errors[] = sprintf(__('Bitte hängen Sie höchstens %d Dateien an.', 'deskhub-tickets'), $policy['maxFiles']);
+ break;
+ }
+ if ($err !== UPLOAD_ERR_OK) {
+ $errors[] = ($err === UPLOAD_ERR_INI_SIZE || $err === UPLOAD_ERR_FORM_SIZE)
+ ? sprintf(__('Die Datei „%s“ ist zu groß (höchstens %s).', 'deskhub-tickets'), $name, self::format_bytes($policy['maxFileBytes']))
+ : sprintf(__('Die Datei „%s“ konnte nicht hochgeladen werden.', 'deskhub-tickets'), $name);
+ continue;
+ }
+ $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
+ if ($name === '' || $ext === '' || in_array($ext, $dangerous, true) || !in_array($ext, $policy['allowed'], true)) {
+ $errors[] = sprintf(__('Der Dateityp von „%1$s“ ist nicht erlaubt. Erlaubt: %2$s', 'deskhub-tickets'), $name, implode(', ', $policy['allowed']));
+ continue;
+ }
+ $size = (int) ($files['size'][$i] ?? 0);
+ $tmp = (string) ($files['tmp_name'][$i] ?? '');
+ if ($size < 1 || $tmp === '' || !(is_uploaded_file($tmp) || (defined('DESKHUB_TICKETS_TESTS') && is_file($tmp)))) {
+ $errors[] = sprintf(__('Die Datei „%s“ konnte nicht gelesen werden.', 'deskhub-tickets'), $name);
+ continue;
+ }
+ if ($size > $policy['maxFileBytes']) {
+ $errors[] = sprintf(__('Die Datei „%1$s“ ist zu groß (höchstens %2$s).', 'deskhub-tickets'), $name, self::format_bytes($policy['maxFileBytes']));
+ continue;
+ }
+ $total += $size;
+ if ($total > $policy['maxTotalBytes']) {
+ $errors[] = sprintf(__('Die Dateien sind zusammen zu groß (höchstens %s).', 'deskhub-tickets'), self::format_bytes($policy['maxTotalBytes']));
+ break;
+ }
+ $content = file_get_contents($tmp);
+ if ($content === false || $content === '') {
+ $errors[] = sprintf(__('Die Datei „%s“ konnte nicht gelesen werden.', 'deskhub-tickets'), $name);
+ continue;
+ }
+ $out[] = ['name' => $name, 'data' => base64_encode($content)];
+ }
+ return [$errors, $out];
+ }
+
/** Bringt ein Formular von DeskHub (oder null) in eine feste Form mit Standardwerten, Feldern nach Plätzen sortiert. */
public static function normalize_form(?array $f): array
{
@@ -268,6 +391,7 @@ class Deskhub_Tickets_Form
],
'submitLabel' => $own ? $str($f['submitLabel'] ?? '', __('Ticket absenden', 'deskhub-tickets')) : __('Ticket absenden', 'deskhub-tickets'),
'fields' => [],
+ 'attachments' => self::normalize_attachments($f['attachments'] ?? null),
];
$allowed = ['text', 'textarea', 'select', 'radio', 'checkbox', 'number', 'date'];
foreach ((array) ($f['fields'] ?? []) as $fd) {
@@ -528,6 +652,13 @@ class Deskhub_Tickets_Form
[$fieldErrors, $fieldValues] = self::validate_fields($form['fields'], $postedFields);
$errors = array_merge($errors, $fieldErrors);
}
+ // Dateianhänge (nur wenn das Formular sie anbietet)
+ $attachments = [];
+ if (!empty($_FILES['dht_files']) && is_array($_FILES['dht_files'])) {
+ $policy = $form !== null ? $form['attachments'] : self::normalize_attachments(null);
+ [$attErrors, $attachments] = self::collect_attachments($_FILES['dht_files'], $policy);
+ $errors = array_merge($errors, $attErrors);
+ }
if (trim((string) $opts['consent_text']) !== '' && empty($_POST['dht_consent'])) {
$errors[] = __('Bitte stimmen Sie der Verarbeitung Ihrer Angaben zu.', 'deskhub-tickets');
}
@@ -563,6 +694,9 @@ class Deskhub_Tickets_Form
if ($form !== null) {
$payload['fields'] = $fieldValues;
}
+ if ($attachments) {
+ $payload['attachments'] = $attachments;
+ }
$payload = apply_filters('deskhub_tickets_payload', $payload, $values);
$result = $client->create_ticket($payload);
if (is_wp_error($result)) {
diff --git a/wordpress-plugin/deskhub-tickets/includes/class-settings.php b/wordpress-plugin/deskhub-tickets/includes/class-settings.php
index 04342719..302fc8d6 100644
--- a/wordpress-plugin/deskhub-tickets/includes/class-settings.php
+++ b/wordpress-plugin/deskhub-tickets/includes/class-settings.php
@@ -86,6 +86,7 @@ class Deskhub_Tickets_Settings
'strong' => [],
'em' => [],
]);
+ $out['attachments'] = !empty($input['attachments']) ? 1 : 0;
$accent = sanitize_hex_color((string) ($input['accent_color'] ?? ''));
$out['accent_color'] = empty($input['accent_auto']) && $accent ? $accent : '';
$out['success_text'] = mb_substr(sanitize_text_field((string) ($input['success_text'] ?? '')), 0, 500);
@@ -207,6 +208,13 @@ class Deskhub_Tickets_Settings
+
+
+
+
+
+
+
diff --git a/wordpress-plugin/deskhub-tickets/includes/functions.php b/wordpress-plugin/deskhub-tickets/includes/functions.php
index 65b437c6..42e73cdd 100644
--- a/wordpress-plugin/deskhub-tickets/includes/functions.php
+++ b/wordpress-plugin/deskhub-tickets/includes/functions.php
@@ -18,6 +18,7 @@ function deskhub_tickets_defaults(): array
'priority_id' => 0,
'consent_text' => '',
'accent_color' => '',
+ 'attachments' => 1,
'success_text' => '',
'status_page_url' => '',
'min_seconds' => 3,
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_AU.mo b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_AU.mo
index 0aa126453241823293e7dcf92f6bedf585352b59..26abfcc12fc63b76e0fa492f24bf16cf084ce370 100644
GIT binary patch
delta 3688
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
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_AU.po b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_AU.po
index fa89a0c3..809f30f7 100644
--- a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_AU.po
+++ b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_AU.po
@@ -17,18 +17,33 @@ msgstr "Department"
msgid "Adresse des DeskHub-Servers"
msgstr "DeskHub server address"
+msgid "Akzentfarbe"
+msgstr "Accent color"
+
msgid "Anfrage ohne weitere Angaben"
msgstr "Request without further details"
+msgid "Automatisch vom Theme übernehmen"
+msgstr "Take automatically from the theme"
+
msgid "Beantwortet"
msgstr "Answered"
+msgid "Bei diesem Formular können keine Dateien angehängt werden."
+msgstr "Files cannot be attached to this form."
+
+msgid "Besucher dürfen Dateien anhängen"
+msgstr "Visitors may attach files"
+
msgid "Besucher wählen ein Thema aus (Bezeichnung:Nummer des Hilfethemas)"
msgstr "visitors choose a topic (label:number of the help topic)"
msgid "Betreff"
msgstr "Subject"
+msgid "Bis zu %1$d Dateien, je höchstens %2$s, zusammen höchstens %3$s. Erlaubt: %4$s"
+msgstr "Up to %1$d files, %2$s each at most, %3$s in total. Allowed: %4$s"
+
msgid "Bitte Server-Adresse und API-Schlüssel eintragen."
msgstr "Please enter the server address and API key."
@@ -68,6 +83,9 @@ msgstr "Please enter a subject (at most 255 characters)."
msgid "Bitte geben Sie einen Betreff an."
msgstr "Please enter a subject."
+msgid "Bitte hängen Sie höchstens %d Dateien an."
+msgstr "Please attach no more than %d files."
+
msgid "Bitte prüfen Sie Ihre Angaben."
msgstr "Please check your details."
@@ -95,9 +113,18 @@ msgstr "The form has expired. Please reload the page and try again."
msgid "Das ging etwas zu schnell. Bitte prüfen Sie Ihre Angaben und senden Sie noch einmal ab."
msgstr "That was a bit too fast. Please check your details and submit again."
+msgid "Dateianhänge"
+msgstr "File attachments"
+
+msgid "Dateien anhängen (optional)"
+msgstr "Attach files (optional)"
+
msgid "Dazu kommt ein unsichtbares Feld, das nur Roboter ausfüllen. Das Formular funktioniert auch mit Seiten-Cache."
msgstr "In addition there is an invisible field that only robots fill in. The form also works with page caching."
+msgid "Der Dateityp von „%1$s“ ist nicht erlaubt. Erlaubt: %2$s"
+msgstr "The file type of “%1$s” is not allowed. Allowed: %2$s"
+
msgid "Der DeskHub-Server ist nicht erreichbar."
msgstr "The DeskHub server cannot be reached."
@@ -143,6 +170,21 @@ msgstr "DeskHub decides"
msgid "Die Adresse, unter der Ihr DeskHub erreichbar ist. Nur https (http nur für lokale Tests)."
msgstr "The address where your DeskHub can be reached. https only (http only for local tests)."
+msgid "Die Datei „%1$s“ ist zu groß (höchstens %2$s)."
+msgstr "The file “%1$s” is too large (%2$s at most)."
+
+msgid "Die Datei „%s“ ist zu groß (höchstens %s)."
+msgstr "The file “%s” is too large (%s at most)."
+
+msgid "Die Datei „%s“ konnte nicht gelesen werden."
+msgstr "The file “%s” could not be read."
+
+msgid "Die Datei „%s“ konnte nicht hochgeladen werden."
+msgstr "The file “%s” could not be uploaded."
+
+msgid "Die Dateien sind zusammen zu groß (höchstens %s)."
+msgstr "The files together are too large (%s at most)."
+
msgid "Die Formulare werden beim nächsten Aufruf neu aus DeskHub geladen."
msgstr "The forms will be reloaded from DeskHub on the next request."
@@ -182,6 +224,9 @@ msgstr "Settings"
msgid "Einwilligung (Datenschutz)"
msgstr "Consent (data protection)"
+msgid "Erlaubte Dateitypen und Größen bestimmt DeskHub (Einstellungen → Uploads): höchstens 5 Dateien, zusammen 10 MB. Braucht DeskHub 1.0.67 oder neuer, sonst bleibt das Feld unsichtbar."
+msgstr "DeskHub decides the allowed file types and sizes (Settings → Uploads): at most 5 files, 10 MB in total. Needs DeskHub 1.0.67 or newer, otherwise the field stays hidden."
+
msgid "Formular"
msgstr "Form"
@@ -263,6 +308,9 @@ msgstr "Priority"
msgid "Schlüssel entfernen"
msgstr "Remove key"
+msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
+msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
+
msgid "Seite mit der Statusabfrage"
msgstr "Page with the status lookup"
@@ -365,12 +413,3 @@ msgstr "saved, enter a new key to change it"
msgid "mit festen Voreinstellungen für dieses Formular"
msgstr "with fixed defaults for this form"
-msgid "Akzentfarbe"
-msgstr "Accent color"
-
-msgid "Automatisch vom Theme übernehmen"
-msgstr "Take automatically from the theme"
-
-msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
-msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
-
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_CA.mo b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_CA.mo
index 0f58da2d4b6d94c65ed06f6285775fd406067b3d..98acb5f943e52be4407da02c209104899ae4df9d 100644
GIT binary patch
delta 3688
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
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_CA.po b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_CA.po
index 18970dc8..97c29aaa 100644
--- a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_CA.po
+++ b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_CA.po
@@ -17,18 +17,33 @@ msgstr "Department"
msgid "Adresse des DeskHub-Servers"
msgstr "DeskHub server address"
+msgid "Akzentfarbe"
+msgstr "Accent color"
+
msgid "Anfrage ohne weitere Angaben"
msgstr "Request without further details"
+msgid "Automatisch vom Theme übernehmen"
+msgstr "Take automatically from the theme"
+
msgid "Beantwortet"
msgstr "Answered"
+msgid "Bei diesem Formular können keine Dateien angehängt werden."
+msgstr "Files cannot be attached to this form."
+
+msgid "Besucher dürfen Dateien anhängen"
+msgstr "Visitors may attach files"
+
msgid "Besucher wählen ein Thema aus (Bezeichnung:Nummer des Hilfethemas)"
msgstr "visitors choose a topic (label:number of the help topic)"
msgid "Betreff"
msgstr "Subject"
+msgid "Bis zu %1$d Dateien, je höchstens %2$s, zusammen höchstens %3$s. Erlaubt: %4$s"
+msgstr "Up to %1$d files, %2$s each at most, %3$s in total. Allowed: %4$s"
+
msgid "Bitte Server-Adresse und API-Schlüssel eintragen."
msgstr "Please enter the server address and API key."
@@ -68,6 +83,9 @@ msgstr "Please enter a subject (at most 255 characters)."
msgid "Bitte geben Sie einen Betreff an."
msgstr "Please enter a subject."
+msgid "Bitte hängen Sie höchstens %d Dateien an."
+msgstr "Please attach no more than %d files."
+
msgid "Bitte prüfen Sie Ihre Angaben."
msgstr "Please check your details."
@@ -95,9 +113,18 @@ msgstr "The form has expired. Please reload the page and try again."
msgid "Das ging etwas zu schnell. Bitte prüfen Sie Ihre Angaben und senden Sie noch einmal ab."
msgstr "That was a bit too fast. Please check your details and submit again."
+msgid "Dateianhänge"
+msgstr "File attachments"
+
+msgid "Dateien anhängen (optional)"
+msgstr "Attach files (optional)"
+
msgid "Dazu kommt ein unsichtbares Feld, das nur Roboter ausfüllen. Das Formular funktioniert auch mit Seiten-Cache."
msgstr "In addition there is an invisible field that only robots fill in. The form also works with page caching."
+msgid "Der Dateityp von „%1$s“ ist nicht erlaubt. Erlaubt: %2$s"
+msgstr "The file type of “%1$s” is not allowed. Allowed: %2$s"
+
msgid "Der DeskHub-Server ist nicht erreichbar."
msgstr "The DeskHub server cannot be reached."
@@ -143,6 +170,21 @@ msgstr "DeskHub decides"
msgid "Die Adresse, unter der Ihr DeskHub erreichbar ist. Nur https (http nur für lokale Tests)."
msgstr "The address where your DeskHub can be reached. https only (http only for local tests)."
+msgid "Die Datei „%1$s“ ist zu groß (höchstens %2$s)."
+msgstr "The file “%1$s” is too large (%2$s at most)."
+
+msgid "Die Datei „%s“ ist zu groß (höchstens %s)."
+msgstr "The file “%s” is too large (%s at most)."
+
+msgid "Die Datei „%s“ konnte nicht gelesen werden."
+msgstr "The file “%s” could not be read."
+
+msgid "Die Datei „%s“ konnte nicht hochgeladen werden."
+msgstr "The file “%s” could not be uploaded."
+
+msgid "Die Dateien sind zusammen zu groß (höchstens %s)."
+msgstr "The files together are too large (%s at most)."
+
msgid "Die Formulare werden beim nächsten Aufruf neu aus DeskHub geladen."
msgstr "The forms will be reloaded from DeskHub on the next request."
@@ -182,6 +224,9 @@ msgstr "Settings"
msgid "Einwilligung (Datenschutz)"
msgstr "Consent (data protection)"
+msgid "Erlaubte Dateitypen und Größen bestimmt DeskHub (Einstellungen → Uploads): höchstens 5 Dateien, zusammen 10 MB. Braucht DeskHub 1.0.67 oder neuer, sonst bleibt das Feld unsichtbar."
+msgstr "DeskHub decides the allowed file types and sizes (Settings → Uploads): at most 5 files, 10 MB in total. Needs DeskHub 1.0.67 or newer, otherwise the field stays hidden."
+
msgid "Formular"
msgstr "Form"
@@ -263,6 +308,9 @@ msgstr "Priority"
msgid "Schlüssel entfernen"
msgstr "Remove key"
+msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
+msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
+
msgid "Seite mit der Statusabfrage"
msgstr "Page with the status lookup"
@@ -365,12 +413,3 @@ msgstr "saved, enter a new key to change it"
msgid "mit festen Voreinstellungen für dieses Formular"
msgstr "with fixed defaults for this form"
-msgid "Akzentfarbe"
-msgstr "Accent color"
-
-msgid "Automatisch vom Theme übernehmen"
-msgstr "Take automatically from the theme"
-
-msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
-msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
-
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_GB.mo b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_GB.mo
index c6dcb65d991097046e96d843eafe497d6129ba25..8f3e4368c774d696202998974694783c560fbaf7 100644
GIT binary patch
delta 3688
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
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_GB.po b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_GB.po
index d0e138d1..3cef9602 100644
--- a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_GB.po
+++ b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_GB.po
@@ -17,18 +17,33 @@ msgstr "Department"
msgid "Adresse des DeskHub-Servers"
msgstr "DeskHub server address"
+msgid "Akzentfarbe"
+msgstr "Accent color"
+
msgid "Anfrage ohne weitere Angaben"
msgstr "Request without further details"
+msgid "Automatisch vom Theme übernehmen"
+msgstr "Take automatically from the theme"
+
msgid "Beantwortet"
msgstr "Answered"
+msgid "Bei diesem Formular können keine Dateien angehängt werden."
+msgstr "Files cannot be attached to this form."
+
+msgid "Besucher dürfen Dateien anhängen"
+msgstr "Visitors may attach files"
+
msgid "Besucher wählen ein Thema aus (Bezeichnung:Nummer des Hilfethemas)"
msgstr "visitors choose a topic (label:number of the help topic)"
msgid "Betreff"
msgstr "Subject"
+msgid "Bis zu %1$d Dateien, je höchstens %2$s, zusammen höchstens %3$s. Erlaubt: %4$s"
+msgstr "Up to %1$d files, %2$s each at most, %3$s in total. Allowed: %4$s"
+
msgid "Bitte Server-Adresse und API-Schlüssel eintragen."
msgstr "Please enter the server address and API key."
@@ -68,6 +83,9 @@ msgstr "Please enter a subject (at most 255 characters)."
msgid "Bitte geben Sie einen Betreff an."
msgstr "Please enter a subject."
+msgid "Bitte hängen Sie höchstens %d Dateien an."
+msgstr "Please attach no more than %d files."
+
msgid "Bitte prüfen Sie Ihre Angaben."
msgstr "Please check your details."
@@ -95,9 +113,18 @@ msgstr "The form has expired. Please reload the page and try again."
msgid "Das ging etwas zu schnell. Bitte prüfen Sie Ihre Angaben und senden Sie noch einmal ab."
msgstr "That was a bit too fast. Please check your details and submit again."
+msgid "Dateianhänge"
+msgstr "File attachments"
+
+msgid "Dateien anhängen (optional)"
+msgstr "Attach files (optional)"
+
msgid "Dazu kommt ein unsichtbares Feld, das nur Roboter ausfüllen. Das Formular funktioniert auch mit Seiten-Cache."
msgstr "In addition there is an invisible field that only robots fill in. The form also works with page caching."
+msgid "Der Dateityp von „%1$s“ ist nicht erlaubt. Erlaubt: %2$s"
+msgstr "The file type of “%1$s” is not allowed. Allowed: %2$s"
+
msgid "Der DeskHub-Server ist nicht erreichbar."
msgstr "The DeskHub server cannot be reached."
@@ -143,6 +170,21 @@ msgstr "DeskHub decides"
msgid "Die Adresse, unter der Ihr DeskHub erreichbar ist. Nur https (http nur für lokale Tests)."
msgstr "The address where your DeskHub can be reached. https only (http only for local tests)."
+msgid "Die Datei „%1$s“ ist zu groß (höchstens %2$s)."
+msgstr "The file “%1$s” is too large (%2$s at most)."
+
+msgid "Die Datei „%s“ ist zu groß (höchstens %s)."
+msgstr "The file “%s” is too large (%s at most)."
+
+msgid "Die Datei „%s“ konnte nicht gelesen werden."
+msgstr "The file “%s” could not be read."
+
+msgid "Die Datei „%s“ konnte nicht hochgeladen werden."
+msgstr "The file “%s” could not be uploaded."
+
+msgid "Die Dateien sind zusammen zu groß (höchstens %s)."
+msgstr "The files together are too large (%s at most)."
+
msgid "Die Formulare werden beim nächsten Aufruf neu aus DeskHub geladen."
msgstr "The forms will be reloaded from DeskHub on the next request."
@@ -182,6 +224,9 @@ msgstr "Settings"
msgid "Einwilligung (Datenschutz)"
msgstr "Consent (data protection)"
+msgid "Erlaubte Dateitypen und Größen bestimmt DeskHub (Einstellungen → Uploads): höchstens 5 Dateien, zusammen 10 MB. Braucht DeskHub 1.0.67 oder neuer, sonst bleibt das Feld unsichtbar."
+msgstr "DeskHub decides the allowed file types and sizes (Settings → Uploads): at most 5 files, 10 MB in total. Needs DeskHub 1.0.67 or newer, otherwise the field stays hidden."
+
msgid "Formular"
msgstr "Form"
@@ -263,6 +308,9 @@ msgstr "Priority"
msgid "Schlüssel entfernen"
msgstr "Remove key"
+msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
+msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
+
msgid "Seite mit der Statusabfrage"
msgstr "Page with the status lookup"
@@ -365,12 +413,3 @@ msgstr "saved, enter a new key to change it"
msgid "mit festen Voreinstellungen für dieses Formular"
msgstr "with fixed defaults for this form"
-msgid "Akzentfarbe"
-msgstr "Accent color"
-
-msgid "Automatisch vom Theme übernehmen"
-msgstr "Take automatically from the theme"
-
-msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
-msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
-
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_NZ.mo b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_NZ.mo
index d299c8236240951aa29ed876b39b81b523932b44..d130c5485e4304b10d293c243d5f72195f8771a9 100644
GIT binary patch
delta 3688
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
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_NZ.po b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_NZ.po
index 304181f0..4e169f65 100644
--- a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_NZ.po
+++ b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_NZ.po
@@ -17,18 +17,33 @@ msgstr "Department"
msgid "Adresse des DeskHub-Servers"
msgstr "DeskHub server address"
+msgid "Akzentfarbe"
+msgstr "Accent color"
+
msgid "Anfrage ohne weitere Angaben"
msgstr "Request without further details"
+msgid "Automatisch vom Theme übernehmen"
+msgstr "Take automatically from the theme"
+
msgid "Beantwortet"
msgstr "Answered"
+msgid "Bei diesem Formular können keine Dateien angehängt werden."
+msgstr "Files cannot be attached to this form."
+
+msgid "Besucher dürfen Dateien anhängen"
+msgstr "Visitors may attach files"
+
msgid "Besucher wählen ein Thema aus (Bezeichnung:Nummer des Hilfethemas)"
msgstr "visitors choose a topic (label:number of the help topic)"
msgid "Betreff"
msgstr "Subject"
+msgid "Bis zu %1$d Dateien, je höchstens %2$s, zusammen höchstens %3$s. Erlaubt: %4$s"
+msgstr "Up to %1$d files, %2$s each at most, %3$s in total. Allowed: %4$s"
+
msgid "Bitte Server-Adresse und API-Schlüssel eintragen."
msgstr "Please enter the server address and API key."
@@ -68,6 +83,9 @@ msgstr "Please enter a subject (at most 255 characters)."
msgid "Bitte geben Sie einen Betreff an."
msgstr "Please enter a subject."
+msgid "Bitte hängen Sie höchstens %d Dateien an."
+msgstr "Please attach no more than %d files."
+
msgid "Bitte prüfen Sie Ihre Angaben."
msgstr "Please check your details."
@@ -95,9 +113,18 @@ msgstr "The form has expired. Please reload the page and try again."
msgid "Das ging etwas zu schnell. Bitte prüfen Sie Ihre Angaben und senden Sie noch einmal ab."
msgstr "That was a bit too fast. Please check your details and submit again."
+msgid "Dateianhänge"
+msgstr "File attachments"
+
+msgid "Dateien anhängen (optional)"
+msgstr "Attach files (optional)"
+
msgid "Dazu kommt ein unsichtbares Feld, das nur Roboter ausfüllen. Das Formular funktioniert auch mit Seiten-Cache."
msgstr "In addition there is an invisible field that only robots fill in. The form also works with page caching."
+msgid "Der Dateityp von „%1$s“ ist nicht erlaubt. Erlaubt: %2$s"
+msgstr "The file type of “%1$s” is not allowed. Allowed: %2$s"
+
msgid "Der DeskHub-Server ist nicht erreichbar."
msgstr "The DeskHub server cannot be reached."
@@ -143,6 +170,21 @@ msgstr "DeskHub decides"
msgid "Die Adresse, unter der Ihr DeskHub erreichbar ist. Nur https (http nur für lokale Tests)."
msgstr "The address where your DeskHub can be reached. https only (http only for local tests)."
+msgid "Die Datei „%1$s“ ist zu groß (höchstens %2$s)."
+msgstr "The file “%1$s” is too large (%2$s at most)."
+
+msgid "Die Datei „%s“ ist zu groß (höchstens %s)."
+msgstr "The file “%s” is too large (%s at most)."
+
+msgid "Die Datei „%s“ konnte nicht gelesen werden."
+msgstr "The file “%s” could not be read."
+
+msgid "Die Datei „%s“ konnte nicht hochgeladen werden."
+msgstr "The file “%s” could not be uploaded."
+
+msgid "Die Dateien sind zusammen zu groß (höchstens %s)."
+msgstr "The files together are too large (%s at most)."
+
msgid "Die Formulare werden beim nächsten Aufruf neu aus DeskHub geladen."
msgstr "The forms will be reloaded from DeskHub on the next request."
@@ -182,6 +224,9 @@ msgstr "Settings"
msgid "Einwilligung (Datenschutz)"
msgstr "Consent (data protection)"
+msgid "Erlaubte Dateitypen und Größen bestimmt DeskHub (Einstellungen → Uploads): höchstens 5 Dateien, zusammen 10 MB. Braucht DeskHub 1.0.67 oder neuer, sonst bleibt das Feld unsichtbar."
+msgstr "DeskHub decides the allowed file types and sizes (Settings → Uploads): at most 5 files, 10 MB in total. Needs DeskHub 1.0.67 or newer, otherwise the field stays hidden."
+
msgid "Formular"
msgstr "Form"
@@ -263,6 +308,9 @@ msgstr "Priority"
msgid "Schlüssel entfernen"
msgstr "Remove key"
+msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
+msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
+
msgid "Seite mit der Statusabfrage"
msgstr "Page with the status lookup"
@@ -365,12 +413,3 @@ msgstr "saved, enter a new key to change it"
msgid "mit festen Voreinstellungen für dieses Formular"
msgstr "with fixed defaults for this form"
-msgid "Akzentfarbe"
-msgstr "Accent color"
-
-msgid "Automatisch vom Theme übernehmen"
-msgstr "Take automatically from the theme"
-
-msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
-msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
-
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_US.mo b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_US.mo
index 1e3a504d4bd612e9dcc5f60421a7f7a83f3a3716..7fbaf97a77e47f97ee7d83353d1e9cabc395c788 100644
GIT binary patch
delta 3688
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
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_US.po b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_US.po
index e60a4e48..400455d7 100644
--- a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_US.po
+++ b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_US.po
@@ -17,18 +17,33 @@ msgstr "Department"
msgid "Adresse des DeskHub-Servers"
msgstr "DeskHub server address"
+msgid "Akzentfarbe"
+msgstr "Accent color"
+
msgid "Anfrage ohne weitere Angaben"
msgstr "Request without further details"
+msgid "Automatisch vom Theme übernehmen"
+msgstr "Take automatically from the theme"
+
msgid "Beantwortet"
msgstr "Answered"
+msgid "Bei diesem Formular können keine Dateien angehängt werden."
+msgstr "Files cannot be attached to this form."
+
+msgid "Besucher dürfen Dateien anhängen"
+msgstr "Visitors may attach files"
+
msgid "Besucher wählen ein Thema aus (Bezeichnung:Nummer des Hilfethemas)"
msgstr "visitors choose a topic (label:number of the help topic)"
msgid "Betreff"
msgstr "Subject"
+msgid "Bis zu %1$d Dateien, je höchstens %2$s, zusammen höchstens %3$s. Erlaubt: %4$s"
+msgstr "Up to %1$d files, %2$s each at most, %3$s in total. Allowed: %4$s"
+
msgid "Bitte Server-Adresse und API-Schlüssel eintragen."
msgstr "Please enter the server address and API key."
@@ -68,6 +83,9 @@ msgstr "Please enter a subject (at most 255 characters)."
msgid "Bitte geben Sie einen Betreff an."
msgstr "Please enter a subject."
+msgid "Bitte hängen Sie höchstens %d Dateien an."
+msgstr "Please attach no more than %d files."
+
msgid "Bitte prüfen Sie Ihre Angaben."
msgstr "Please check your details."
@@ -95,9 +113,18 @@ msgstr "The form has expired. Please reload the page and try again."
msgid "Das ging etwas zu schnell. Bitte prüfen Sie Ihre Angaben und senden Sie noch einmal ab."
msgstr "That was a bit too fast. Please check your details and submit again."
+msgid "Dateianhänge"
+msgstr "File attachments"
+
+msgid "Dateien anhängen (optional)"
+msgstr "Attach files (optional)"
+
msgid "Dazu kommt ein unsichtbares Feld, das nur Roboter ausfüllen. Das Formular funktioniert auch mit Seiten-Cache."
msgstr "In addition there is an invisible field that only robots fill in. The form also works with page caching."
+msgid "Der Dateityp von „%1$s“ ist nicht erlaubt. Erlaubt: %2$s"
+msgstr "The file type of “%1$s” is not allowed. Allowed: %2$s"
+
msgid "Der DeskHub-Server ist nicht erreichbar."
msgstr "The DeskHub server cannot be reached."
@@ -143,6 +170,21 @@ msgstr "DeskHub decides"
msgid "Die Adresse, unter der Ihr DeskHub erreichbar ist. Nur https (http nur für lokale Tests)."
msgstr "The address where your DeskHub can be reached. https only (http only for local tests)."
+msgid "Die Datei „%1$s“ ist zu groß (höchstens %2$s)."
+msgstr "The file “%1$s” is too large (%2$s at most)."
+
+msgid "Die Datei „%s“ ist zu groß (höchstens %s)."
+msgstr "The file “%s” is too large (%s at most)."
+
+msgid "Die Datei „%s“ konnte nicht gelesen werden."
+msgstr "The file “%s” could not be read."
+
+msgid "Die Datei „%s“ konnte nicht hochgeladen werden."
+msgstr "The file “%s” could not be uploaded."
+
+msgid "Die Dateien sind zusammen zu groß (höchstens %s)."
+msgstr "The files together are too large (%s at most)."
+
msgid "Die Formulare werden beim nächsten Aufruf neu aus DeskHub geladen."
msgstr "The forms will be reloaded from DeskHub on the next request."
@@ -182,6 +224,9 @@ msgstr "Settings"
msgid "Einwilligung (Datenschutz)"
msgstr "Consent (data protection)"
+msgid "Erlaubte Dateitypen und Größen bestimmt DeskHub (Einstellungen → Uploads): höchstens 5 Dateien, zusammen 10 MB. Braucht DeskHub 1.0.67 oder neuer, sonst bleibt das Feld unsichtbar."
+msgstr "DeskHub decides the allowed file types and sizes (Settings → Uploads): at most 5 files, 10 MB in total. Needs DeskHub 1.0.67 or newer, otherwise the field stays hidden."
+
msgid "Formular"
msgstr "Form"
@@ -263,6 +308,9 @@ msgstr "Priority"
msgid "Schlüssel entfernen"
msgstr "Remove key"
+msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
+msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
+
msgid "Seite mit der Statusabfrage"
msgstr "Page with the status lookup"
@@ -365,12 +413,3 @@ msgstr "saved, enter a new key to change it"
msgid "mit festen Voreinstellungen für dieses Formular"
msgstr "with fixed defaults for this form"
-msgid "Akzentfarbe"
-msgstr "Accent color"
-
-msgid "Automatisch vom Theme übernehmen"
-msgstr "Take automatically from the theme"
-
-msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
-msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
-
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_ZA.mo b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_ZA.mo
index 96b3bc8e54a36d87fbe83cbb4dcd24019e340e84..8882861fab0a9999afbabb84f99b4ea002f97886 100644
GIT binary patch
delta 3688
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
diff --git a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_ZA.po b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_ZA.po
index 756222fc..fc35773d 100644
--- a/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_ZA.po
+++ b/wordpress-plugin/deskhub-tickets/languages/deskhub-tickets-en_ZA.po
@@ -17,18 +17,33 @@ msgstr "Department"
msgid "Adresse des DeskHub-Servers"
msgstr "DeskHub server address"
+msgid "Akzentfarbe"
+msgstr "Accent color"
+
msgid "Anfrage ohne weitere Angaben"
msgstr "Request without further details"
+msgid "Automatisch vom Theme übernehmen"
+msgstr "Take automatically from the theme"
+
msgid "Beantwortet"
msgstr "Answered"
+msgid "Bei diesem Formular können keine Dateien angehängt werden."
+msgstr "Files cannot be attached to this form."
+
+msgid "Besucher dürfen Dateien anhängen"
+msgstr "Visitors may attach files"
+
msgid "Besucher wählen ein Thema aus (Bezeichnung:Nummer des Hilfethemas)"
msgstr "visitors choose a topic (label:number of the help topic)"
msgid "Betreff"
msgstr "Subject"
+msgid "Bis zu %1$d Dateien, je höchstens %2$s, zusammen höchstens %3$s. Erlaubt: %4$s"
+msgstr "Up to %1$d files, %2$s each at most, %3$s in total. Allowed: %4$s"
+
msgid "Bitte Server-Adresse und API-Schlüssel eintragen."
msgstr "Please enter the server address and API key."
@@ -68,6 +83,9 @@ msgstr "Please enter a subject (at most 255 characters)."
msgid "Bitte geben Sie einen Betreff an."
msgstr "Please enter a subject."
+msgid "Bitte hängen Sie höchstens %d Dateien an."
+msgstr "Please attach no more than %d files."
+
msgid "Bitte prüfen Sie Ihre Angaben."
msgstr "Please check your details."
@@ -95,9 +113,18 @@ msgstr "The form has expired. Please reload the page and try again."
msgid "Das ging etwas zu schnell. Bitte prüfen Sie Ihre Angaben und senden Sie noch einmal ab."
msgstr "That was a bit too fast. Please check your details and submit again."
+msgid "Dateianhänge"
+msgstr "File attachments"
+
+msgid "Dateien anhängen (optional)"
+msgstr "Attach files (optional)"
+
msgid "Dazu kommt ein unsichtbares Feld, das nur Roboter ausfüllen. Das Formular funktioniert auch mit Seiten-Cache."
msgstr "In addition there is an invisible field that only robots fill in. The form also works with page caching."
+msgid "Der Dateityp von „%1$s“ ist nicht erlaubt. Erlaubt: %2$s"
+msgstr "The file type of “%1$s” is not allowed. Allowed: %2$s"
+
msgid "Der DeskHub-Server ist nicht erreichbar."
msgstr "The DeskHub server cannot be reached."
@@ -143,6 +170,21 @@ msgstr "DeskHub decides"
msgid "Die Adresse, unter der Ihr DeskHub erreichbar ist. Nur https (http nur für lokale Tests)."
msgstr "The address where your DeskHub can be reached. https only (http only for local tests)."
+msgid "Die Datei „%1$s“ ist zu groß (höchstens %2$s)."
+msgstr "The file “%1$s” is too large (%2$s at most)."
+
+msgid "Die Datei „%s“ ist zu groß (höchstens %s)."
+msgstr "The file “%s” is too large (%s at most)."
+
+msgid "Die Datei „%s“ konnte nicht gelesen werden."
+msgstr "The file “%s” could not be read."
+
+msgid "Die Datei „%s“ konnte nicht hochgeladen werden."
+msgstr "The file “%s” could not be uploaded."
+
+msgid "Die Dateien sind zusammen zu groß (höchstens %s)."
+msgstr "The files together are too large (%s at most)."
+
msgid "Die Formulare werden beim nächsten Aufruf neu aus DeskHub geladen."
msgstr "The forms will be reloaded from DeskHub on the next request."
@@ -182,6 +224,9 @@ msgstr "Settings"
msgid "Einwilligung (Datenschutz)"
msgstr "Consent (data protection)"
+msgid "Erlaubte Dateitypen und Größen bestimmt DeskHub (Einstellungen → Uploads): höchstens 5 Dateien, zusammen 10 MB. Braucht DeskHub 1.0.67 oder neuer, sonst bleibt das Feld unsichtbar."
+msgstr "DeskHub decides the allowed file types and sizes (Settings → Uploads): at most 5 files, 10 MB in total. Needs DeskHub 1.0.67 or newer, otherwise the field stays hidden."
+
msgid "Formular"
msgstr "Form"
@@ -263,6 +308,9 @@ msgstr "Priority"
msgid "Schlüssel entfernen"
msgstr "Remove key"
+msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
+msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
+
msgid "Seite mit der Statusabfrage"
msgstr "Page with the status lookup"
@@ -365,12 +413,3 @@ msgstr "saved, enter a new key to change it"
msgid "mit festen Voreinstellungen für dieses Formular"
msgstr "with fixed defaults for this form"
-msgid "Akzentfarbe"
-msgstr "Accent color"
-
-msgid "Automatisch vom Theme übernehmen"
-msgstr "Take automatically from the theme"
-
-msgid "Schrift, Hintergrund und Rahmen übernimmt das Formular immer vom Theme. Die Akzentfarbe (Knopf, Hervorhebung) wird automatisch aus Knöpfen und Links der Seite gelesen; hier lässt sie sich fest vorgeben."
-msgstr "The form always takes font, background and border from the theme. The accent color (button, highlights) is read automatically from buttons and links of the page; you can set it here."
-
diff --git a/wordpress-plugin/deskhub-tickets/readme.txt b/wordpress-plugin/deskhub-tickets/readme.txt
index b2427d14..d6fd6021 100644
--- a/wordpress-plugin/deskhub-tickets/readme.txt
+++ b/wordpress-plugin/deskhub-tickets/readme.txt
@@ -1,68 +1,71 @@
-=== DeskHub Tickets ===
-Contributors: deskhub
-Tags: helpdesk, tickets, support, contact form
-Requires at least: 5.8
-Tested up to: 6.6
-Requires PHP: 7.4
-Stable tag: 1.2.2
-License: GPLv2 or later
-License URI: https://www.gnu.org/licenses/gpl-2.0.html
-
-Create support tickets in your DeskHub helpdesk from WordPress and let visitors check the status of their ticket.
-
-== Description ==
-
-DeskHub Tickets connects WordPress to a self-hosted DeskHub helpdesk through its public API.
-
-* `[deskhub_ticket]` shows a form that creates a ticket in DeskHub.
-* `[deskhub_status]` lets a visitor look up the status and public history of a ticket with the ticket number and email address.
-* The API key stays on the server and is never sent to the visitor's browser.
-* Spam protection: hidden trap field, minimum time, limit per visitor and hour, optional Cloudflare Turnstile. Works with page caches.
-* Optional consent checkbox for data protection.
-
-German is the source language of the plugin. An English translation is included.
-
-== Installation ==
-
-1. Upload the plugin and activate it.
-2. In DeskHub create an API key (Manage -> API keys) with the right "Create tickets" (and "Read tickets" for the status page).
-3. In WordPress open Settings -> DeskHub Tickets, enter the server address and the key, save and click "Test connection".
-4. Add `[deskhub_ticket]` to a page.
-
-== Frequently Asked Questions ==
-
-= Can visitors attach files? =
-
-Not in this version: the DeskHub public API accepts text only.
-
-= Where is the API key stored? =
-
-In the WordPress options table. For more safety define `DESKHUB_TICKETS_API_KEY` in wp-config.php; the field in the settings is then locked.
-
-== Changelog ==
-
-= 1.2.2 =
-* Fix: only the button takes the accent color; fields and borders are mixed from the page background and text color and are no longer tinted by theme or accent colors. Real theme buttons are preferred when detecting the accent.
-
-= 1.2.1 =
-* Accent color detection looks at all buttons and links, the theme.json button color and the color variables of common themes and page builders.
-
-= 1.2.0 =
-* The form takes its colors from the theme (text, borders, field background, dark themes); the accent color is read from the buttons and links of the page or set in the settings.
-
-= 1.1.3 =
-* Fix: fields in one row start at the same height, also when only some labels have a required-star.
-
-= 1.1.2 =
-* Fix: labels, text fields and drop-downs have the same font, size and height, even if the theme styles them differently.
-
-= 1.1.1 =
-* Fix: headings of radio fields and sections are no longer enlarged by themes.
-* "Save and test connection" tests the values just entered; clearer messages (IP address, connection errors).
-
-= 1.1.0 =
-* The form of the help topic is taken from DeskHub: custom fields, texts, required fields and the department form. Needs DeskHub 1.0.64 or newer for custom fields.
-* Help topic can be chosen in the settings; "Reload forms" button.
-
-= 1.0.0 =
-* First version.
+=== DeskHub Tickets ===
+Contributors: deskhub
+Tags: helpdesk, tickets, support, contact form
+Requires at least: 5.8
+Tested up to: 6.6
+Requires PHP: 7.4
+Stable tag: 1.3.0
+License: GPLv2 or later
+License URI: https://www.gnu.org/licenses/gpl-2.0.html
+
+Create support tickets in your DeskHub helpdesk from WordPress and let visitors check the status of their ticket.
+
+== Description ==
+
+DeskHub Tickets connects WordPress to a self-hosted DeskHub helpdesk through its public API.
+
+* `[deskhub_ticket]` shows a form that creates a ticket in DeskHub.
+* `[deskhub_status]` lets a visitor look up the status and public history of a ticket with the ticket number and email address.
+* The API key stays on the server and is never sent to the visitor's browser.
+* Spam protection: hidden trap field, minimum time, limit per visitor and hour, optional Cloudflare Turnstile. Works with page caches.
+* Optional consent checkbox for data protection.
+
+German is the source language of the plugin. An English translation is included.
+
+== Installation ==
+
+1. Upload the plugin and activate it.
+2. In DeskHub create an API key (Manage -> API keys) with the right "Create tickets" (and "Read tickets" for the status page).
+3. In WordPress open Settings -> DeskHub Tickets, enter the server address and the key, save and click "Test connection".
+4. Add `[deskhub_ticket]` to a page.
+
+== Frequently Asked Questions ==
+
+= Can visitors attach files? =
+
+Yes, since version 1.3.0: up to 5 files, 10 MB in total; allowed types and sizes come from DeskHub (needs DeskHub 1.0.67 or newer).
+
+= Where is the API key stored? =
+
+In the WordPress options table. For more safety define `DESKHUB_TICKETS_API_KEY` in wp-config.php; the field in the settings is then locked.
+
+== Changelog ==
+
+= 1.3.0 =
+* Visitors can attach files (up to 5, 10 MB in total). DeskHub decides the allowed types and sizes; can be switched off in the settings. Needs DeskHub 1.0.67 or newer.
+
+= 1.2.2 =
+* Fix: only the button takes the accent color; fields and borders are mixed from the page background and text color and are no longer tinted by theme or accent colors. Real theme buttons are preferred when detecting the accent.
+
+= 1.2.1 =
+* Accent color detection looks at all buttons and links, the theme.json button color and the color variables of common themes and page builders.
+
+= 1.2.0 =
+* The form takes its colors from the theme (text, borders, field background, dark themes); the accent color is read from the buttons and links of the page or set in the settings.
+
+= 1.1.3 =
+* Fix: fields in one row start at the same height, also when only some labels have a required-star.
+
+= 1.1.2 =
+* Fix: labels, text fields and drop-downs have the same font, size and height, even if the theme styles them differently.
+
+= 1.1.1 =
+* Fix: headings of radio fields and sections are no longer enlarged by themes.
+* "Save and test connection" tests the values just entered; clearer messages (IP address, connection errors).
+
+= 1.1.0 =
+* The form of the help topic is taken from DeskHub: custom fields, texts, required fields and the department form. Needs DeskHub 1.0.64 or newer for custom fields.
+* Help topic can be chosen in the settings; "Reload forms" button.
+
+= 1.0.0 =
+* First version.
diff --git a/wordpress-plugin/tests/run.php b/wordpress-plugin/tests/run.php
index 489da26d..f2168f97 100644
--- a/wordpress-plugin/tests/run.php
+++ b/wordpress-plugin/tests/run.php
@@ -1,518 +1,597 @@
- 'd.m.Y', 'time_format' => 'H:i'];
- $GLOBALS['wp_transients'] = [];
- $GLOBALS['wp_http_log'] = [];
- $GLOBALS['wp_http_handler'] = null;
- $GLOBALS['wp_user'] = ['id' => 0, 'caps' => [], 'name' => '', 'email' => ''];
- $GLOBALS['wp_settings_errors'] = [];
- $GLOBALS['wp_enqueued'] = [];
- $_POST = []; $_GET = []; $_SERVER['REQUEST_METHOD'] = 'GET'; $_SERVER['REMOTE_ADDR'] = '203.0.113.5';
- if ($opts !== null) {
- $GLOBALS['wp_options']['deskhub_tickets_options'] = array_merge([
- 'server_url' => 'https://support.example.de', 'api_key' => 'dh_geheimer_schluessel_123', 'min_seconds' => 0, 'rate_limit_per_hour' => 5,
- ], $opts);
- }
-}
-function run_form_post(array $post): ?string
-{
- $_POST = $post;
- $_SERVER['REQUEST_METHOD'] = 'POST';
- try { Deskhub_Tickets_Form::handle_submit(); } catch (WpRedirect $r) { return $r->location; }
- return null;
-}
-/** Holt den Zustand (Fehler/Erfolg), den handle_submit hinterlassen hat, aus der Weiterleitungsadresse. */
-function state_from(?string $location): ?array
-{
- if (!$location || !preg_match('/[?&]dht=([a-f0-9]{16})/', $location, $m)) return null;
- return $GLOBALS['wp_transients']['dht_state_' . $m[1]][0] ?? null;
-}
-function render_form(array $atts = [], ?string $location = null): string
-{
- $_GET = [];
- if ($location && preg_match('/[?&]dht=([a-f0-9]{16})/', $location, $m)) $_GET['dht'] = $m[1];
- return Deskhub_Tickets_Form::render_ticket_form($atts);
-}
-/** Ein gültig aussehendes Formular wie vom Plugin erzeugt: unterschriebene Angaben und Zeitstempel aus der Ausgabe lesen. */
-function valid_post(string $html, array $over = []): array
-{
- preg_match('/name="dht_cfg" value="([^"]*)"/', $html, $c);
- preg_match('/name="dht_sig" value="([^"]*)"/', $html, $s);
- preg_match('/name="dht_ts" value="([^"]*)"/', $html, $t);
- preg_match('/name="dht_back" value="([^"]*)"/', $html, $b);
- return array_merge([
- 'action' => 'deskhub_ticket_submit', 'dht_cfg' => html_entity_decode($c[1] ?? ''), 'dht_sig' => $s[1] ?? '', 'dht_ts' => $t[1] ?? '', 'dht_back' => html_entity_decode($b[1] ?? ''),
- 'dht_website' => '', 'dht_name' => 'Erika Muster', 'dht_email' => 'erika@kunde.example', 'dht_subject' => 'Rechnung fehlt', 'dht_message' => "Hallo,\nbitte schicken Sie mir die Rechnung.",
- ], $over);
-}
-function ok_handler(array &$seen = null): callable
-{
- return function (string $url, array $args) use (&$seen) {
- if (str_contains($url, 'form=1') || str_contains($url, 'topics=1')) return wp_stub_response(422, ['error' => ['code' => 'MISSING_PARAMS', 'message' => 'x']]); // wie ein älterer Server
- $seen[] = ['url' => $url, 'args' => $args];
- if (($args['method'] ?? 'GET') === 'POST') return wp_stub_response(201, ['number' => '261101-0001', 'status' => 'open']);
- return wp_stub_response(200, ['ticket' => ['number' => '261101-0001', 'subject' => 'Rechnung', 'status' => 'answered', 'createdAt' => '2026-11-01 10:00:00', 'updatedAt' => '2026-11-01 11:00:00',
- 'messages' => [['author' => 'customer', 'message' => 'Hallo ', 'createdAt' => '2026-11-01 10:00:00'], ['author' => 'staff', 'message' => "Erledigt.\nViele Grüße", 'createdAt' => '2026-11-01 11:00:00']]]]);
- };
-}
-
-// ── Server-Adresse ─────────────────────────────────────────────────────────
-reset_wp();
-foreach ([
- ['support.example.de', 'https://support.example.de'],
- [' https://support.example.de/ ', 'https://support.example.de'],
- ['https://example.de/helpdesk/', 'https://example.de/helpdesk'],
- ['http://127.0.0.1:8080', 'http://127.0.0.1:8080'],
- ['http://localhost', 'http://localhost'],
-] as [$in, $want]) {
- $check(Deskhub_Tickets_Client::normalize_url($in) === $want, "Adresse '$in' wird zu '$want'");
-}
-foreach (['', 'http://support.example.de', 'https://user:pw@example.de', 'https://example.de/?x=1', 'https://example.de/#a', 'ftp://example.de', 'http://localhost.evil.de'] as $bad) {
- $check(is_wp_error(Deskhub_Tickets_Client::normalize_url($bad)), "Adresse '$bad' wird abgelehnt");
-}
-
-// ── Nicht eingerichtet ──────────────────────────────────────────────────────
-reset_wp(['server_url' => '', 'api_key' => '']);
-$check(Deskhub_Tickets_Form::render_ticket_form() === '', 'Ohne Einrichtung sieht ein Besucher nichts');
-$GLOBALS['wp_user']['caps'] = ['manage_options'];
-$check(str_contains(Deskhub_Tickets_Form::render_ticket_form(), 'noch nicht eingerichtet'), 'Ein Administrator sieht den Einrichtungshinweis');
-
-// ── Formular wird angezeigt ─────────────────────────────────────────────────
-reset_wp(['consent_text' => 'Ich habe die Datenschutzerklärung gelesen.']);
-$html = render_form();
-foreach (['name="dht_name"', 'name="dht_email"', 'name="dht_subject"', 'name="dht_message"', 'name="dht_website"', 'name="dht_consent"', 'name="dht_ts"', 'name="dht_sig"'] as $f) {
- $check(str_contains($html, $f), "Formular enthält $f");
-}
-$check(!str_contains($html, 'dh_geheimer_schluessel_123') && !str_contains($html, 'support.example.de'), 'Weder API-Schlüssel noch Server-Adresse stehen im Formular');
-$check(str_contains($html, 'href="/datenschutz"') && !str_contains($html, 'onclick') && !str_contains($html, '', 'dht_consent' => '1'])));
-$sent = json_decode((string) ($seen[0]['args']['body'] ?? ''), true);
-$check(!str_contains((string) ($sent['message'] ?? ''), '<'), 'HTML in der Nachricht wird entfernt');
-$check($st && !empty($st['ok']), 'Mit Einwilligung klappt es');
-
-reset_wp(['consent_text' => '']);
-$seen = []; $GLOBALS['wp_http_handler'] = ok_handler($seen);
-$html = render_form(['topics' => 'Rechnung:3,Technik:4', 'department' => '5']);
-$check(str_contains($html, '