From de8ea49ee7d2066999cd2b65019a3c78bb16d159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tollk=C3=BChn?= Date: Wed, 30 Sep 2026 14:49:46 +0200 Subject: [PATCH] transliterate special chars better --- launch.html | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/launch.html b/launch.html index 0595dd8..3dff4c0 100644 --- a/launch.html +++ b/launch.html @@ -1373,6 +1373,52 @@ }, CONFIG.launchTimeout); } + /* ============================================================ + * ROOM NAME + * ============================================================ + */ + + /* + * Sonderzeichen in das nächstliegende ASCII-Zeichen + * umwandeln. + * + * Beispiel: + * + * "Grundstück" ergibt "Grundstueck" + * "François" ergibt "Francois" + */ + function transliterate(text) { + const extras = { + "ß": "ss", + "ẞ": "ss", + "æ": "ae", + "Æ": "ae", + "œ": "oe", + "Œ": "oe", + "ø": "o", + "Ø": "o" + }; + + return text + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[ßẞæÆœŒøØ]/g, (char) => extras[char]); + } + + /* + * Aus dem Meeting-Namen einen gültigen Room-Namen ableiten. + * + * Beispiel: + * + * "Grund Stück Planung" ergibt "grund-stuck-planung" + */ + function createRoomName(meetingName) { + return transliterate(meetingName) + .toLowerCase() + .replace(/\s+/g, "-") + .replace(/[^a-z0-9-]/g, ""); + } + /* ============================================================ * ICS FILE GENERATION * ============================================================ @@ -1380,7 +1426,7 @@ function generateICS(meetingName, description, startTime, endTime, organizer) { /* Generate a unique room name from the meeting name */ - const roomName = meetingName.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, ''); + const roomName = createRoomName(meetingName); const meetingUrl = `https://${CONFIG.jitsiLauncher}/launch.html?room=${encodeURIComponent(roomName)}`; /* Format dates for ICS */ @@ -1525,7 +1571,7 @@ END:VCALENDAR`; return; } - if (!ROOM_PATTERN.test(meetingName)) { + if (!ROOM_PATTERN.test(createRoomName(meetingName))) { alert(getTranslation('creator.meetingNameInvalid') || 'Meeting name may only contain letters, numbers and hyphens'); return; }