load translations from assets/i18n.json

This commit is contained in:
stefan.tollkuehn committed 2026-10-07 14:59:43 +02:00
1 parent eb794a6c61
commit 598ef1a32f
2 files changed
+353 -380

No files matched your search

+43 -380
View File
@@ -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();