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;
}