+ {/* Adresse (nur https) */}
+
+
+
setUrlDraft(e.target.value)}
+ onBlur={commitUrl}
+ onKeyDown={onEnter(commitUrl)}
+ aria-invalid={urlError || undefined}
+ aria-describedby="xframe-url-hint"
+ className={FIELD_CLASS}
+ />
+
+ {t('xframe.embedHint')}
+
+ {urlError && (
+
+ {t('xframe.urlInvalid')}
+
+ )}
+
+
+ {/* Titel (optional, Kopfleiste der Kachel) */}
+
+
+ setTitleDraft(e.target.value)}
+ onBlur={commitTitle}
+ onKeyDown={onEnter(commitTitle)}
+ className={FIELD_CLASS}
+ />
+
+
+ {/* Neuladen-Intervall */}
+
+
+
+
+
+ );
+}
diff --git a/apps/web/src/messages/de.json b/apps/web/src/messages/de.json
index e485422..0adfe09 100644
--- a/apps/web/src/messages/de.json
+++ b/apps/web/src/messages/de.json
@@ -363,6 +363,23 @@
"moveDownButton": "Nach unten",
"limitReached": "Die Höchstzahl von 30 Bildern ist erreicht.",
"uploadFailed": "Das Bild konnte nicht hochgeladen werden."
+ },
+ "xframe": {
+ "name": "XFrame",
+ "description": "Webseite einbetten",
+ "empty": "Keine Adresse eingestellt — über die Einstellungen festlegen",
+ "openInNewTab": "In neuem Tab öffnen",
+ "urlLabel": "Adresse (https)",
+ "urlPlaceholder": "https://…",
+ "urlInvalid": "Bitte geben Sie eine vollständige https-Adresse ein.",
+ "titleLabel": "Titel",
+ "titlePlaceholder": "Titel (optional)",
+ "reloadLabel": "Automatisch neu laden",
+ "reloadOff": "Nie",
+ "reloadMinute": "Jede Minute",
+ "reloadMinutes": "Alle {n} Minuten",
+ "reloadHour": "Jede Stunde",
+ "embedHint": "Manche Webseiten lassen sich nicht einbetten — dann bleibt der Rahmen leer. Über „In neuem Tab öffnen“ erreichen Sie die Seite trotzdem."
}
},
"admin": {
diff --git a/apps/web/src/messages/en.json b/apps/web/src/messages/en.json
index 4e47256..6624fc0 100644
--- a/apps/web/src/messages/en.json
+++ b/apps/web/src/messages/en.json
@@ -363,6 +363,23 @@
"moveDownButton": "Move down",
"limitReached": "The maximum of 30 images has been reached.",
"uploadFailed": "The image could not be uploaded."
+ },
+ "xframe": {
+ "name": "XFrame",
+ "description": "Embed a web page",
+ "empty": "No address set — configure it in the settings",
+ "openInNewTab": "Open in a new tab",
+ "urlLabel": "Address (https)",
+ "urlPlaceholder": "https://…",
+ "urlInvalid": "Please enter a complete https address.",
+ "titleLabel": "Title",
+ "titlePlaceholder": "Title (optional)",
+ "reloadLabel": "Reload automatically",
+ "reloadOff": "Never",
+ "reloadMinute": "Every minute",
+ "reloadMinutes": "Every {n} minutes",
+ "reloadHour": "Every hour",
+ "embedHint": "Some web pages refuse to be embedded — the frame then stays empty. “Open in a new tab” still takes you to the page."
}
},
"admin": {
diff --git a/apps/web/src/messages/umlaut-dictionary.ts b/apps/web/src/messages/umlaut-dictionary.ts
index 7c157c1..570d791 100644
--- a/apps/web/src/messages/umlaut-dictionary.ts
+++ b/apps/web/src/messages/umlaut-dictionary.ts
@@ -134,6 +134,8 @@ export const UMLAUT_ALLOWLIST: readonly string[] = [
// Bilderrahmen-Widget (quick-260921-pi9): korrektes Deutsch mit „ss“
'Webadresse',
'Bildausschnitt',
+ // XFrame-Widget (quick-260921-qd3): „In neuem Tab öffnen“, korrektes Deutsch wie neuen
+ 'neuem',
'Absenderadresse',
'muss',
'musste',