From 598ef1a32f07dfc98e9889e89f8a493ab1657554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tollk=C3=BChn?= Date: Wed, 7 Oct 2026 14:59:43 +0200 Subject: [PATCH] load translations from assets/i18n.json --- assets/i18n.json | 310 ++++++++++++++++++++++++++++++++++ assets/launch.js | 423 +++++------------------------------------------ 2 files changed, 353 insertions(+), 380 deletions(-) create mode 100644 assets/i18n.json diff --git a/assets/i18n.json b/assets/i18n.json new file mode 100644 index 0000000..13dc2aa --- /dev/null +++ b/assets/i18n.json @@ -0,0 +1,310 @@ +{ + "en": { + "pageTitle": "Jitsi Meeting", + "impressum": "Legal Notice", + "source": "Source", + "launcher": { + "title": "Jitsi Meeting", + "meetingPrefix": "The meeting", + "meetingSuffix": "will be joined.", + "openButton": "Join meeting" + }, + "starting": { + "title": "Starting Jitsi Meet …", + "status": "The Jitsi Meet desktop client is being opened." + }, + "fallback": { + "title": "Jitsi Meet could not be opened", + "description": "The Jitsi Meet desktop client may not have been started.", + "retryButton": "Try again" + }, + "downloads": { + "windows": { + "title": "Jitsi Meet for Windows", + "description": "Install the Jitsi Meet desktop client and then try opening the meeting again.", + "button": "Download Jitsi for Windows" + }, + "macos": { + "title": "Jitsi Meet for macOS", + "description": "Install the Jitsi Meet desktop client and then try opening the meeting again.", + "button": "Download Jitsi for macOS" + }, + "linux": { + "title": "Jitsi Meet for Linux", + "description": "Install the Jitsi Meet desktop client and then try opening the meeting again.", + "button": "Download Jitsi for Linux" + }, + "other": { + "title": "Jitsi Meet Desktop", + "description": "No desktop download is configured for your operating system." + } + }, + "browser": { + "title": "Join in browser", + "description": "You can also join the meeting directly in your browser.", + "button": "Join in browser" + }, + "error": { + "title": "No meeting specified", + "description": "Please specify a meeting using the", + "descriptionSuffix": "parameter.", + "invalidTitle": "Invalid meeting name", + "invalidDescription": "Only letters, numbers and hyphens are allowed:" + }, + "creator": { + "title": "Create New Meeting", + "meetingNameLabel": "Meeting Name", + "meetingDescriptionLabel": "Description", + "meetingStartLabel": "Start Date & Time", + "meetingEndLabel": "End Date & Time", + "meetingOrganizerLabel": "Organizer Email", + "createButton": "Create Meeting", + "cancelButton": "Cancel", + "successMessage": "Meeting created! Download your calendar file and open it to import the meeting into your personal calendar.", + "downloadButton": "Download ICS File", + "createNewButton": "Create New Meeting", + "adhocButton": "Create Adhoc Link", + "adhocLinkLabel": "Your adhoc meeting link:", + "copyLinkButton": "Copy Link", + "copiedLabel": "Copied!", + "meetingNameRequired": "Please enter a meeting name", + "meetingNameInvalid": "Meeting name may only contain letters, numbers and hyphens", + "startTimeRequired": "Please select a start time", + "endTimeRequired": "Please select an end time", + "endAfterStart": "End time must be after start time", + "organizerRequired": "Please enter an organizer email", + "organizerInvalid": "Please enter a valid organizer email address" + } + }, + "de": { + "pageTitle": "Jitsi Meeting öffnen", + "impressum": "Impressum", + "source": "Quellcode", + "launcher": { + "title": "Jitsi Meeting", + "meetingPrefix": "Das Meeting", + "meetingSuffix": "wird geöffnet.", + "openButton": "An Meeting teilnehmen" + }, + "starting": { + "title": "Jitsi Meet wird gestartet …", + "status": "Der Jitsi Meet Desktop-Client wird geöffnet." + }, + "fallback": { + "title": "Jitsi Meet konnte nicht geöffnet werden", + "description": "Der Jitsi Meet Desktop-Client wurde möglicherweise nicht gestartet.", + "retryButton": "Erneut versuchen" + }, + "downloads": { + "windows": { + "title": "Jitsi Meet für Windows", + "description": "Installieren Sie den Jitsi Meet Desktop-Client und versuchen Sie anschließend erneut, das Meeting zu öffnen.", + "button": "Jitsi für Windows herunterladen" + }, + "macos": { + "title": "Jitsi Meet für macOS", + "description": "Installieren Sie den Jitsi Meet Desktop-Client und versuchen Sie anschließend erneut, das Meeting zu öffnen.", + "button": "Jitsi für macOS herunterladen" + }, + "linux": { + "title": "Jitsi Meet für Linux", + "description": "Installieren Sie den Jitsi Meet Desktop-Client und versuchen Sie anschließend erneut, das Meeting zu öffnen.", + "button": "Jitsi für Linux herunterladen" + }, + "other": { + "title": "Jitsi Meet Desktop", + "description": "Für Ihr Betriebssystem ist kein Desktop-Download hinterlegt." + } + }, + "browser": { + "title": "Im Browser teilnehmen", + "description": "Sie können dem Meeting auch direkt über Ihren Browser beitreten.", + "button": "Im Browser beitreten" + }, + "error": { + "title": "Kein Meeting angegeben", + "description": "Bitte geben Sie ein Meeting über den Parameter", + "descriptionSuffix": "an.", + "invalidTitle": "Ungültiger Meeting-Name", + "invalidDescription": "Erlaubt sind nur Buchstaben, Zahlen und Bindestriche:" + }, + "creator": { + "title": "Neues Meeting erstellen", + "meetingNameLabel": "Meeting-Name", + "meetingDescriptionLabel": "Beschreibung", + "meetingStartLabel": "Start Datum & Uhrzeit", + "meetingEndLabel": "Ende Datum & Uhrzeit", + "meetingOrganizerLabel": "Organisator E-Mail", + "createButton": "Meeting erstellen", + "cancelButton": "Abbrechen", + "successMessage": "Meeting erstellt! Laden Sie Ihre Kalenderdatei herunter und öffnen Sie diese, um das Meeting in Ihren persönlichen Kalender zu importieren.", + "downloadButton": "ICS-Datei herunterladen", + "createNewButton": "Neues Meeting erstellen", + "adhocButton": "Adhoc-Link erstellen", + "adhocLinkLabel": "Ihr Adhoc-Meeting-Link:", + "copyLinkButton": "Link kopieren", + "copiedLabel": "Kopiert!", + "meetingNameRequired": "Bitte geben Sie einen Meeting-Namen ein", + "meetingNameInvalid": "Der Meeting-Name darf nur Buchstaben, Zahlen und Bindestriche enthalten", + "startTimeRequired": "Bitte wählen Sie eine Startzeit", + "endTimeRequired": "Bitte wählen Sie eine Endzeit", + "endAfterStart": "Die Endzeit muss nach der Startzeit liegen", + "organizerRequired": "Bitte geben Sie eine Organisator-E-Mail ein", + "organizerInvalid": "Bitte geben Sie eine gültige Organisator-E-Mail-Adresse ein" + } + }, + "fr": { + "pageTitle": "Réunion Jitsi", + "impressum": "Mentions légales", + "source": "Code source", + "launcher": { + "title": "Réunion Jitsi", + "meetingPrefix": "La réunion", + "meetingSuffix": "va être ouverte.", + "openButton": "Rejoindre la réunion" + }, + "starting": { + "title": "Démarrage de Jitsi Meet…", + "status": "Le client bureau Jitsi Meet est en cours d'ouverture." + }, + "fallback": { + "title": "Jitsi Meet n'a pas pu être ouvert", + "description": "Le client bureau Jitsi Meet n'a peut-être pas été démarré.", + "retryButton": "Réessayer" + }, + "downloads": { + "windows": { + "title": "Jitsi Meet pour Windows", + "description": "Installez le client bureau Jitsi Meet, puis essayez de rouvrir la réunion.", + "button": "Télécharger Jitsi pour Windows" + }, + "macos": { + "title": "Jitsi Meet pour macOS", + "description": "Installez le client bureau Jitsi Meet, puis essayez de rouvrir la réunion.", + "button": "Télécharger Jitsi pour macOS" + }, + "linux": { + "title": "Jitsi Meet pour Linux", + "description": "Installez le client bureau Jitsi Meet, puis essayez de rouvrir la réunion.", + "button": "Télécharger Jitsi pour Linux" + }, + "other": { + "title": "Jitsi Meet Desktop", + "description": "Aucun téléchargement bureau n'est configuré pour votre système d'exploitation." + } + }, + "browser": { + "title": "Rejoindre dans le navigateur", + "description": "Vous pouvez également rejoindre la réunion directement dans votre navigateur.", + "button": "Rejoindre dans le navigateur" + }, + "error": { + "title": "Aucune réunion spécifiée", + "description": "Veuillez spécifier une réunion à l'aide du paramètre", + "descriptionSuffix": ".", + "invalidTitle": "Nom de réunion invalide", + "invalidDescription": "Seuls les lettres, les chiffres et les tirets sont autorisés :" + }, + "creator": { + "title": "Créer une nouvelle réunion", + "meetingNameLabel": "Nom de la réunion", + "meetingDescriptionLabel": "Description", + "meetingStartLabel": "Date et heure de début", + "meetingEndLabel": "Date et heure de fin", + "meetingOrganizerLabel": "Email de l'organisateur", + "createButton": "Créer la réunion", + "cancelButton": "Annuler", + "successMessage": "Réunion créée ! Téléchargez votre fichier calendrier et ouvrez-le pour importer la réunion dans votre calendrier personnel.", + "downloadButton": "Télécharger le fichier ICS", + "createNewButton": "Créer une nouvelle réunion", + "adhocButton": "Créer un lien adhoc", + "adhocLinkLabel": "Votre lien de réunion adhoc :", + "copyLinkButton": "Copier le lien", + "copiedLabel": "Copié !", + "meetingNameRequired": "Veuillez entrer un nom de réunion", + "meetingNameInvalid": "Le nom de la réunion ne peut contenir que des lettres, des chiffres et des tirets", + "startTimeRequired": "Veuillez sélectionner une heure de début", + "endTimeRequired": "Veuillez sélectionner une heure de fin", + "endAfterStart": "L'heure de fin doit être après l'heure de début", + "organizerRequired": "Veuillez entrer un email d'organisateur", + "organizerInvalid": "Veuillez entrer une adresse email d'organisateur valide" + } + }, + "zh": { + "pageTitle": "Jitsi 会议", + "impressum": "法律声明", + "source": "源代码", + "launcher": { + "title": "Jitsi 会议", + "meetingPrefix": "会议", + "meetingSuffix": "即将打开。", + "openButton": "加入会议" + }, + "starting": { + "title": "正在启动 Jitsi Meet …", + "status": "正在打开 Jitsi Meet 桌面客户端。" + }, + "fallback": { + "title": "无法打开 Jitsi Meet", + "description": "Jitsi Meet 桌面客户端可能尚未启动。", + "retryButton": "重试" + }, + "downloads": { + "windows": { + "title": "适用于 Windows 的 Jitsi Meet", + "description": "请安装 Jitsi Meet 桌面客户端,然后再次尝试打开会议。", + "button": "下载 Windows 版 Jitsi" + }, + "macos": { + "title": "适用于 macOS 的 Jitsi Meet", + "description": "请安装 Jitsi Meet 桌面客户端,然后再次尝试打开会议。", + "button": "下载 macOS 版 Jitsi" + }, + "linux": { + "title": "适用于 Linux 的 Jitsi Meet", + "description": "请安装 Jitsi Meet 桌面客户端,然后再次尝试打开会议。", + "button": "下载 Linux 版 Jitsi" + }, + "other": { + "title": "Jitsi Meet 桌面版", + "description": "没有为您的操作系统配置桌面版下载。" + } + }, + "browser": { + "title": "在浏览器中加入", + "description": "您也可以直接通过浏览器加入会议。", + "button": "在浏览器中加入" + }, + "error": { + "title": "未指定会议", + "description": "请使用参数指定会议", + "descriptionSuffix": "。", + "invalidTitle": "会议名称无效", + "invalidDescription": "仅允许使用字母、数字和连字符:" + }, + "creator": { + "title": "创建新会议", + "meetingNameLabel": "会议名称", + "meetingDescriptionLabel": "描述", + "meetingStartLabel": "开始日期和时间", + "meetingEndLabel": "结束日期和时间", + "meetingOrganizerLabel": "组织者邮箱", + "createButton": "创建会议", + "cancelButton": "取消", + "successMessage": "会议已创建!请下载您的日历文件并打开它,将会议导入您的个人日历。", + "downloadButton": "下载 ICS 文件", + "createNewButton": "创建新会议", + "adhocButton": "创建临时链接", + "adhocLinkLabel": "您的临时会议链接:", + "copyLinkButton": "复制链接", + "copiedLabel": "已复制!", + "meetingNameRequired": "请输入会议名称", + "meetingNameInvalid": "会议名称只能包含字母、数字和连字符", + "startTimeRequired": "请选择开始时间", + "endTimeRequired": "请选择结束时间", + "endAfterStart": "结束时间必须晚于开始时间", + "organizerRequired": "请输入组织者邮箱", + "organizerInvalid": "请输入有效的组织者邮箱地址" + } + } +} diff --git a/assets/launch.js b/assets/launch.js index 5ecf16b..36033fe 100644 --- a/assets/launch.js +++ b/assets/launch.js @@ -41,377 +41,12 @@ const CONFIG = { * ============================================================ */ -const TRANSLATIONS = { - en: { - pageTitle: "Jitsi Meeting", - impressum: "Legal Notice", - source: "Source", - - launcher: { - title: "Jitsi Meeting", - meetingPrefix: "The meeting", - meetingSuffix: "will be joined.", - openButton: "Join meeting" - }, - - starting: { - title: "Starting Jitsi Meet …", - status: "The Jitsi Meet desktop client is being opened." - }, - - fallback: { - title: "Jitsi Meet could not be opened", - description: "The Jitsi Meet desktop client may not have been started.", - retryButton: "Try again" - }, - - downloads: { - windows: { - title: "Jitsi Meet for Windows", - description: - "Install the Jitsi Meet desktop client and then try opening the meeting again.", - button: "Download Jitsi for Windows" - }, - - macos: { - title: "Jitsi Meet for macOS", - description: - "Install the Jitsi Meet desktop client and then try opening the meeting again.", - button: "Download Jitsi for macOS" - }, - - linux: { - title: "Jitsi Meet for Linux", - description: - "Install the Jitsi Meet desktop client and then try opening the meeting again.", - button: "Download Jitsi for Linux" - }, - - other: { - title: "Jitsi Meet Desktop", - description: - "No desktop download is configured for your operating system." - } - }, - - browser: { - title: "Join in browser", - description: - "You can also join the meeting directly in your browser.", - button: "Join in browser" - }, - - error: { - title: "No meeting specified", - description: "Please specify a meeting using the", - descriptionSuffix: "parameter.", - invalidTitle: "Invalid meeting name", - invalidDescription: "Only letters, numbers and hyphens are allowed:" - }, - - creator: { - title: "Create New Meeting", - meetingNameLabel: "Meeting Name", - meetingDescriptionLabel: "Description", - meetingStartLabel: "Start Date & Time", - meetingEndLabel: "End Date & Time", - meetingOrganizerLabel: "Organizer Email", - createButton: "Create Meeting", - cancelButton: "Cancel", - successMessage: "Meeting created! Download your calendar file and open it to import the meeting into your personal calendar.", - downloadButton: "Download ICS File", - createNewButton: "Create New Meeting", - adhocButton: "Create Adhoc Link", - adhocLinkLabel: "Your adhoc meeting link:", - copyLinkButton: "Copy Link", - copiedLabel: "Copied!", - meetingNameRequired: "Please enter a meeting name", - meetingNameInvalid: "Meeting name may only contain letters, numbers and hyphens", - startTimeRequired: "Please select a start time", - endTimeRequired: "Please select an end time", - endAfterStart: "End time must be after start time", - organizerRequired: "Please enter an organizer email", - organizerInvalid: "Please enter a valid organizer email address" - } - }, - - de: { - pageTitle: "Jitsi Meeting öffnen", - impressum: "Impressum", - source: "Quellcode", - - launcher: { - title: "Jitsi Meeting", - meetingPrefix: "Das Meeting", - meetingSuffix: "wird geöffnet.", - openButton: "An Meeting teilnehmen" - }, - - starting: { - title: "Jitsi Meet wird gestartet …", - status: "Der Jitsi Meet Desktop-Client wird geöffnet." - }, - - fallback: { - title: "Jitsi Meet konnte nicht geöffnet werden", - description: - "Der Jitsi Meet Desktop-Client wurde möglicherweise nicht gestartet.", - retryButton: "Erneut versuchen" - }, - - downloads: { - windows: { - title: "Jitsi Meet für Windows", - description: - "Installieren Sie den Jitsi Meet Desktop-Client und versuchen Sie anschließend erneut, das Meeting zu öffnen.", - button: "Jitsi für Windows herunterladen" - }, - - macos: { - title: "Jitsi Meet für macOS", - description: - "Installieren Sie den Jitsi Meet Desktop-Client und versuchen Sie anschließend erneut, das Meeting zu öffnen.", - button: "Jitsi für macOS herunterladen" - }, - - linux: { - title: "Jitsi Meet für Linux", - description: - "Installieren Sie den Jitsi Meet Desktop-Client und versuchen Sie anschließend erneut, das Meeting zu öffnen.", - button: "Jitsi für Linux herunterladen" - }, - - other: { - title: "Jitsi Meet Desktop", - description: - "Für Ihr Betriebssystem ist kein Desktop-Download hinterlegt." - } - }, - - browser: { - title: "Im Browser teilnehmen", - description: - "Sie können dem Meeting auch direkt über Ihren Browser beitreten.", - button: "Im Browser beitreten" - }, - - error: { - title: "Kein Meeting angegeben", - description: - "Bitte geben Sie ein Meeting über den Parameter", - descriptionSuffix: "an.", - invalidTitle: "Ungültiger Meeting-Name", - invalidDescription: "Erlaubt sind nur Buchstaben, Zahlen und Bindestriche:" - }, - - creator: { - title: "Neues Meeting erstellen", - meetingNameLabel: "Meeting-Name", - meetingDescriptionLabel: "Beschreibung", - meetingStartLabel: "Start Datum & Uhrzeit", - meetingEndLabel: "Ende Datum & Uhrzeit", - meetingOrganizerLabel: "Organisator E-Mail", - createButton: "Meeting erstellen", - cancelButton: "Abbrechen", - successMessage: "Meeting erstellt! Laden Sie Ihre Kalenderdatei herunter und öffnen Sie diese, um das Meeting in Ihren persönlichen Kalender zu importieren.", - downloadButton: "ICS-Datei herunterladen", - createNewButton: "Neues Meeting erstellen", - adhocButton: "Adhoc-Link erstellen", - adhocLinkLabel: "Ihr Adhoc-Meeting-Link:", - copyLinkButton: "Link kopieren", - copiedLabel: "Kopiert!", - meetingNameRequired: "Bitte geben Sie einen Meeting-Namen ein", - meetingNameInvalid: "Der Meeting-Name darf nur Buchstaben, Zahlen und Bindestriche enthalten", - startTimeRequired: "Bitte wählen Sie eine Startzeit", - endTimeRequired: "Bitte wählen Sie eine Endzeit", - endAfterStart: "Die Endzeit muss nach der Startzeit liegen", - organizerRequired: "Bitte geben Sie eine Organisator-E-Mail ein", - organizerInvalid: "Bitte geben Sie eine gültige Organisator-E-Mail-Adresse ein" - } - }, - - fr: { - pageTitle: "Réunion Jitsi", - impressum: "Mentions légales", - source: "Code source", - - launcher: { - title: "Réunion Jitsi", - meetingPrefix: "La réunion", - meetingSuffix: "va être ouverte.", - openButton: "Rejoindre la réunion" - }, - - starting: { - title: "Démarrage de Jitsi Meet…", - status: "Le client bureau Jitsi Meet est en cours d'ouverture." - }, - - fallback: { - title: "Jitsi Meet n'a pas pu être ouvert", - description: - "Le client bureau Jitsi Meet n'a peut-être pas été démarré.", - retryButton: "Réessayer" - }, - - downloads: { - windows: { - title: "Jitsi Meet pour Windows", - description: - "Installez le client bureau Jitsi Meet, puis essayez de rouvrir la réunion.", - button: "Télécharger Jitsi pour Windows" - }, - - macos: { - title: "Jitsi Meet pour macOS", - description: - "Installez le client bureau Jitsi Meet, puis essayez de rouvrir la réunion.", - button: "Télécharger Jitsi pour macOS" - }, - - linux: { - title: "Jitsi Meet pour Linux", - description: - "Installez le client bureau Jitsi Meet, puis essayez de rouvrir la réunion.", - button: "Télécharger Jitsi pour Linux" - }, - - other: { - title: "Jitsi Meet Desktop", - description: - "Aucun téléchargement bureau n'est configuré pour votre système d'exploitation." - } - }, - - browser: { - title: "Rejoindre dans le navigateur", - description: - "Vous pouvez également rejoindre la réunion directement dans votre navigateur.", - button: "Rejoindre dans le navigateur" - }, - - error: { - title: "Aucune réunion spécifiée", - description: "Veuillez spécifier une réunion à l'aide du paramètre", - descriptionSuffix: ".", - invalidTitle: "Nom de réunion invalide", - invalidDescription: "Seuls les lettres, les chiffres et les tirets sont autorisés :" - }, - - creator: { - title: "Créer une nouvelle réunion", - meetingNameLabel: "Nom de la réunion", - meetingDescriptionLabel: "Description", - meetingStartLabel: "Date et heure de début", - meetingEndLabel: "Date et heure de fin", - meetingOrganizerLabel: "Email de l'organisateur", - createButton: "Créer la réunion", - cancelButton: "Annuler", - successMessage: "Réunion créée ! Téléchargez votre fichier calendrier et ouvrez-le pour importer la réunion dans votre calendrier personnel.", - downloadButton: "Télécharger le fichier ICS", - createNewButton: "Créer une nouvelle réunion", - adhocButton: "Créer un lien adhoc", - adhocLinkLabel: "Votre lien de réunion adhoc :", - copyLinkButton: "Copier le lien", - copiedLabel: "Copié !", - meetingNameRequired: "Veuillez entrer un nom de réunion", - meetingNameInvalid: "Le nom de la réunion ne peut contenir que des lettres, des chiffres et des tirets", - startTimeRequired: "Veuillez sélectionner une heure de début", - endTimeRequired: "Veuillez sélectionner une heure de fin", - endAfterStart: "L'heure de fin doit être après l'heure de début", - organizerRequired: "Veuillez entrer un email d'organisateur", - organizerInvalid: "Veuillez entrer une adresse email d'organisateur valide" - } - }, - - zh: { - pageTitle: "Jitsi 会议", - impressum: "法律声明", - source: "源代码", - - launcher: { - title: "Jitsi 会议", - meetingPrefix: "会议", - meetingSuffix: "即将打开。", - openButton: "加入会议" - }, - - starting: { - title: "正在启动 Jitsi Meet …", - status: "正在打开 Jitsi Meet 桌面客户端。" - }, - - fallback: { - title: "无法打开 Jitsi Meet", - description: "Jitsi Meet 桌面客户端可能尚未启动。", - retryButton: "重试" - }, - - downloads: { - windows: { - title: "适用于 Windows 的 Jitsi Meet", - description: "请安装 Jitsi Meet 桌面客户端,然后再次尝试打开会议。", - button: "下载 Windows 版 Jitsi" - }, - - macos: { - title: "适用于 macOS 的 Jitsi Meet", - description: "请安装 Jitsi Meet 桌面客户端,然后再次尝试打开会议。", - button: "下载 macOS 版 Jitsi" - }, - - linux: { - title: "适用于 Linux 的 Jitsi Meet", - description: "请安装 Jitsi Meet 桌面客户端,然后再次尝试打开会议。", - button: "下载 Linux 版 Jitsi" - }, - - other: { - title: "Jitsi Meet 桌面版", - description: "没有为您的操作系统配置桌面版下载。" - } - }, - - browser: { - title: "在浏览器中加入", - description: "您也可以直接通过浏览器加入会议。", - button: "在浏览器中加入" - }, - - error: { - title: "未指定会议", - description: "请使用参数指定会议", - descriptionSuffix: "。", - invalidTitle: "会议名称无效", - invalidDescription: "仅允许使用字母、数字和连字符:" - }, - - creator: { - title: "创建新会议", - meetingNameLabel: "会议名称", - meetingDescriptionLabel: "描述", - meetingStartLabel: "开始日期和时间", - meetingEndLabel: "结束日期和时间", - meetingOrganizerLabel: "组织者邮箱", - createButton: "创建会议", - cancelButton: "取消", - successMessage: "会议已创建!请下载您的日历文件并打开它,将会议导入您的个人日历。", - downloadButton: "下载 ICS 文件", - createNewButton: "创建新会议", - adhocButton: "创建临时链接", - adhocLinkLabel: "您的临时会议链接:", - copyLinkButton: "复制链接", - copiedLabel: "已复制!", - meetingNameRequired: "请输入会议名称", - meetingNameInvalid: "会议名称只能包含字母、数字和连字符", - startTimeRequired: "请选择开始时间", - endTimeRequired: "请选择结束时间", - endAfterStart: "结束时间必须晚于开始时间", - organizerRequired: "请输入组织者邮箱", - organizerInvalid: "请输入有效的组织者邮箱地址" - } - } -}; +/* + * Sprachen liegen in assets/i18n.json und werden beim + * Start asynchron geladen (siehe START). + */ +let TRANSLATIONS = {}; +const I18N_URL = "assets/i18n.json"; /* ============================================================ * Detect language @@ -456,8 +91,8 @@ function detectLanguage() { return "en"; } -let currentLanguage = detectLanguage(); -let translation = TRANSLATIONS[currentLanguage]; +let currentLanguage = "en"; +let translation = {}; /* ============================================================ * Apply translations to webpage @@ -466,7 +101,9 @@ let translation = TRANSLATIONS[currentLanguage]; function applyTranslations() { document.documentElement.lang = currentLanguage; - document.title = translation.pageTitle; + if (translation.pageTitle) { + document.title = translation.pageTitle; + } document .querySelectorAll("[data-i18n]") @@ -1665,9 +1302,35 @@ window * ============================================================ */ -applyTranslations(); -applyTheme(); -applyBackgroundImage(); -applyLogo(); -updateLanguageMenu(); -initialize(); +async function loadTranslations() { + try { + const response = await fetch(I18N_URL); + TRANSLATIONS = await response.json(); + } catch (error) { + /* + * Ohne Datei bleibt der englische Text aus dem HTML stehen. + */ + console.error("Error loading translations:", error); + } + + currentLanguage = detectLanguage(); + translation = TRANSLATIONS[currentLanguage] || {}; +} + +/* + * Theme/Logo sofort anwenden, damit nichts aufblinkt – + * Text erst nach dem Laden der Übersetzungen. + */ +async function start() { + applyTheme(); + applyBackgroundImage(); + applyLogo(); + + await loadTranslations(); + + applyTranslations(); + updateLanguageMenu(); + initialize(); +} + +start();