[call-me] - fix translate

This commit is contained in:
Miroslav Pejic
2026-02-10 01:55:44 +01:00
parent 159c263049
commit 8063e51312
15 changed files with 248 additions and 51 deletions
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "غادر __username__ المكالمة",
"users": "المستخدمون",
"chat": "الدردشة",
"searchUsers": "ابحث عن مستخدمين..."
"searchUsers": "البحث عن المستخدمين...",
"closeSidebar": "إغلاق الشريط الجانبي"
},
"controls": {
"microphone": "الميكروفون",
@@ -26,7 +27,15 @@
"screenShare": "مشاركة الشاشة",
"endCall": "إنهاء المكالمة",
"settings": "الإعدادات",
"fullscreen": "ملء الشاشة"
"fullscreen": "ملء الشاشة",
"shareRoom": "مشاركة الغرفة",
"toggleHideMe": "إظهار/إخفاء نفسي",
"toggleAudio": "تبديل الصوت",
"toggleVideo": "تبديل الفيديو",
"swapCamera": "تبديل الكاميرا",
"toggleScreen": "تبديل الشاشة",
"toggleUsers": "تبديل المستخدمين",
"leave": "مغادرة"
},
"messages": {
"microphoneEnabled": "تم تفعيل الميكروفون",
@@ -51,9 +60,14 @@
"settings": {
"language": "اللغة",
"selectLanguage": "اختر اللغة",
"mediaDevicesTitle": "أجهزة الوسائط",
"chatSettingsTitle": "إعدادات الدردشة",
"audioInput": "الميكروفون",
"videoInput": "الكاميرا",
"audioOutput": "مكبر الصوت",
"loadingCameras": "جارٍ تحميل الكاميرات...",
"loadingMicrophones": "جارٍ تحميل الميكروفونات...",
"loadingSpeakers": "جارٍ تحميل مكبرات الصوت...",
"resolution": "دقة الفيديو",
"save": "حفظ",
"cancel": "إلغاء",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ hat den Anruf verlassen",
"users": "Benutzer",
"chat": "Chat",
"searchUsers": "Benutzer suchen..."
"searchUsers": "Benutzer suchen...",
"closeSidebar": "Seitenleiste schließen"
},
"controls": {
"microphone": "Mikrofon",
@@ -26,7 +27,15 @@
"screenShare": "Bildschirm Teilen",
"endCall": "Anruf Beenden",
"settings": "Einstellungen",
"fullscreen": "Vollbild"
"fullscreen": "Vollbild",
"shareRoom": "Raum teilen",
"toggleHideMe": "Mich ein-/ausblenden",
"toggleAudio": "Audio umschalten",
"toggleVideo": "Video umschalten",
"swapCamera": "Kamera wechseln",
"toggleScreen": "Bildschirm umschalten",
"toggleUsers": "Benutzer umschalten",
"leave": "Verlassen"
},
"messages": {
"microphoneEnabled": "Mikrofon aktiviert",
@@ -51,9 +60,14 @@
"settings": {
"language": "Sprache",
"selectLanguage": "Sprache Auswählen",
"mediaDevicesTitle": "Mediengeräte",
"chatSettingsTitle": "Chat-Einstellungen",
"audioInput": "Mikrofon",
"videoInput": "Kamera",
"audioOutput": "Lautsprecher",
"loadingCameras": "Kameras werden geladen...",
"loadingMicrophones": "Mikrofone werden geladen...",
"loadingSpeakers": "Lautsprecher werden geladen...",
"resolution": "Videoauflösung",
"save": "Speichern",
"cancel": "Abbrechen",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ left the call",
"users": "Users",
"chat": "Chat",
"searchUsers": "Search users..."
"searchUsers": "Search users...",
"closeSidebar": "Close sidebar"
},
"controls": {
"microphone": "Microphone",
@@ -26,7 +27,15 @@
"screenShare": "Share Screen",
"endCall": "End Call",
"settings": "Settings",
"fullscreen": "Fullscreen"
"fullscreen": "Fullscreen",
"shareRoom": "Share room",
"toggleHideMe": "Toggle hide me",
"toggleAudio": "Toggle audio",
"toggleVideo": "Toggle video",
"swapCamera": "Swap camera",
"toggleScreen": "Toggle screen",
"toggleUsers": "Toggle users",
"leave": "Leave"
},
"messages": {
"microphoneEnabled": "Microphone enabled",
@@ -51,9 +60,14 @@
"settings": {
"language": "Language",
"selectLanguage": "Select Language",
"mediaDevicesTitle": "Media Devices",
"chatSettingsTitle": "Chat Settings",
"audioInput": "Microphone",
"videoInput": "Camera",
"audioOutput": "Speaker",
"loadingCameras": "Loading cameras...",
"loadingMicrophones": "Loading microphones...",
"loadingSpeakers": "Loading speakers...",
"resolution": "Video Resolution",
"save": "Save",
"cancel": "Cancel",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ salió de la llamada",
"users": "Usuarios",
"chat": "Chat",
"searchUsers": "Buscar usuarios..."
"searchUsers": "Buscar usuarios...",
"closeSidebar": "Cerrar barra lateral"
},
"controls": {
"microphone": "Micrófono",
@@ -26,7 +27,15 @@
"screenShare": "Compartir Pantalla",
"endCall": "Finalizar Llamada",
"settings": "Configuración",
"fullscreen": "Pantalla Completa"
"fullscreen": "Pantalla Completa",
"shareRoom": "Compartir sala",
"toggleHideMe": "Ocultarme/mostrarme",
"toggleAudio": "Alternar audio",
"toggleVideo": "Alternar video",
"swapCamera": "Cambiar cámara",
"toggleScreen": "Alternar pantalla",
"toggleUsers": "Alternar usuarios",
"leave": "Salir"
},
"messages": {
"microphoneEnabled": "Micrófono activado",
@@ -51,9 +60,14 @@
"settings": {
"language": "Idioma",
"selectLanguage": "Seleccionar Idioma",
"mediaDevicesTitle": "Dispositivos multimedia",
"chatSettingsTitle": "Configuración del chat",
"audioInput": "Micrófono",
"videoInput": "Cámara",
"audioOutput": "Altavoz",
"loadingCameras": "Cargando cámaras...",
"loadingMicrophones": "Cargando micrófonos...",
"loadingSpeakers": "Cargando altavoces...",
"resolution": "Resolución de Video",
"save": "Guardar",
"cancel": "Cancelar",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ a quitté l'appel",
"users": "Utilisateurs",
"chat": "Chat",
"searchUsers": "Rechercher des utilisateurs..."
"searchUsers": "Rechercher des utilisateurs...",
"closeSidebar": "Fermer la barre latérale"
},
"controls": {
"microphone": "Microphone",
@@ -26,7 +27,15 @@
"screenShare": "Partager l'Écran",
"endCall": "Terminer l'Appel",
"settings": "Paramètres",
"fullscreen": "Plein Écran"
"fullscreen": "Plein Écran",
"shareRoom": "Partager la salle",
"toggleHideMe": "Masquer/Afficher moi",
"toggleAudio": "Activer/Désactiver l'audio",
"toggleVideo": "Activer/Désactiver la vidéo",
"swapCamera": "Changer de caméra",
"toggleScreen": "Activer/Désactiver l'écran",
"toggleUsers": "Afficher/Masquer les utilisateurs",
"leave": "Quitter"
},
"messages": {
"microphoneEnabled": "Microphone activé",
@@ -51,9 +60,14 @@
"settings": {
"language": "Langue",
"selectLanguage": "Sélectionner la Langue",
"mediaDevicesTitle": "Périphériques multimédias",
"chatSettingsTitle": "Paramètres du chat",
"audioInput": "Microphone",
"videoInput": "Caméra",
"audioOutput": "Haut-parleur",
"loadingCameras": "Chargement des caméras...",
"loadingMicrophones": "Chargement des microphones...",
"loadingSpeakers": "Chargement des haut-parleurs...",
"resolution": "Résolution Vidéo",
"save": "Enregistrer",
"cancel": "Annuler",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ कॉल से निकल गया",
"users": "उपयोगकर्ता",
"chat": "चैट",
"searchUsers": "उपयोगकर्ता खोजें..."
"searchUsers": "उपयोगकर्ता खोजें...",
"closeSidebar": "साइडबार बंद करें"
},
"controls": {
"microphone": "माइक्रोफ़ोन",
@@ -26,7 +27,15 @@
"screenShare": "स्क्रीन साझा करें",
"endCall": "कॉल समाप्त करें",
"settings": "सेटिंग्स",
"fullscreen": "फुलस्क्रीन"
"fullscreen": "फुलस्क्रीन",
"shareRoom": "कमरा साझा करें",
"toggleHideMe": "मुझे छुपाएँ/दिखाएँ",
"toggleAudio": "ऑडियो टॉगल करें",
"toggleVideo": "वीडियो टॉगल करें",
"swapCamera": "कैमरा बदलें",
"toggleScreen": "स्क्रीन टॉगल करें",
"toggleUsers": "उपयोगकर्ता टॉगल करें",
"leave": "छोड़ें"
},
"messages": {
"microphoneEnabled": "माइक्रोफ़ोन चालू",
@@ -51,9 +60,14 @@
"settings": {
"language": "भाषा",
"selectLanguage": "भाषा चुनें",
"mediaDevicesTitle": "मीडिया डिवाइस",
"chatSettingsTitle": "चैट सेटिंग्स",
"audioInput": "माइक्रोफ़ोन",
"videoInput": "कैमरा",
"audioOutput": "स्पीकर",
"loadingCameras": "कैमरे लोड हो रहे हैं...",
"loadingMicrophones": "माइक्रोफ़ोन लोड हो रहे हैं...",
"loadingSpeakers": "स्पीकर लोड हो रहे हैं...",
"resolution": "वीडियो रिज़ॉल्यूशन",
"save": "सहेजें",
"cancel": "रद्द करें",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ ha lasciato la chiamata",
"users": "Utenti",
"chat": "Chat",
"searchUsers": "Cerca utenti..."
"searchUsers": "Cerca utenti...",
"closeSidebar": "Chiudi barra laterale"
},
"controls": {
"microphone": "Microfono",
@@ -26,7 +27,15 @@
"screenShare": "Condividi Schermo",
"endCall": "Termina Chiamata",
"settings": "Impostazioni",
"fullscreen": "Schermo Intero"
"fullscreen": "Schermo Intero",
"shareRoom": "Condividi stanza",
"toggleHideMe": "Mostra/Nascondi me",
"toggleAudio": "Attiva/Disattiva audio",
"toggleVideo": "Attiva/Disattiva video",
"swapCamera": "Cambia fotocamera",
"toggleScreen": "Attiva/Disattiva schermo",
"toggleUsers": "Mostra/Nascondi utenti",
"leave": "Esci"
},
"messages": {
"microphoneEnabled": "Microfono attivato",
@@ -51,9 +60,14 @@
"settings": {
"language": "Lingua",
"selectLanguage": "Seleziona Lingua",
"mediaDevicesTitle": "Dispositivi multimediali",
"chatSettingsTitle": "Impostazioni chat",
"audioInput": "Microfono",
"videoInput": "Fotocamera",
"audioOutput": "Altoparlante",
"loadingCameras": "Caricamento fotocamere...",
"loadingMicrophones": "Caricamento microfoni...",
"loadingSpeakers": "Caricamento altoparlanti...",
"resolution": "Risoluzione Video",
"save": "Salva",
"cancel": "Annulla",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ が通話から退出しました",
"users": "ユーザー",
"chat": "チャット",
"searchUsers": "ユーザーを検索..."
"searchUsers": "ユーザーを検索...",
"closeSidebar": "サイドバーを閉じる"
},
"controls": {
"microphone": "マイク",
@@ -26,7 +27,15 @@
"screenShare": "画面共有",
"endCall": "通話終了",
"settings": "設定",
"fullscreen": "全画面"
"fullscreen": "全画面",
"shareRoom": "ルームを共有",
"toggleHideMe": "自分を表示/非表示",
"toggleAudio": "音声を切り替え",
"toggleVideo": "映像を切り替え",
"swapCamera": "カメラを切り替え",
"toggleScreen": "画面を切り替え",
"toggleUsers": "ユーザーを切り替え",
"leave": "退室"
},
"messages": {
"microphoneEnabled": "マイクを有効にしました",
@@ -51,9 +60,14 @@
"settings": {
"language": "言語",
"selectLanguage": "言語を選択",
"mediaDevicesTitle": "メディアデバイス",
"chatSettingsTitle": "チャット設定",
"audioInput": "マイク",
"videoInput": "カメラ",
"audioOutput": "スピーカー",
"loadingCameras": "カメラを読み込み中...",
"loadingMicrophones": "マイクを読み込み中...",
"loadingSpeakers": "スピーカーを読み込み中...",
"resolution": "ビデオ解像度",
"save": "保存",
"cancel": "キャンセル",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ saiu da chamada",
"users": "Usuários",
"chat": "Chat",
"searchUsers": "Pesquisar usuários..."
"searchUsers": "Pesquisar usuários...",
"closeSidebar": "Fechar barra lateral"
},
"controls": {
"microphone": "Microfone",
@@ -26,7 +27,15 @@
"screenShare": "Compartilhar tela",
"endCall": "Encerrar chamada",
"settings": "Configurações",
"fullscreen": "Tela cheia"
"fullscreen": "Tela Cheia",
"shareRoom": "Compartilhar sala",
"toggleHideMe": "Ocultar/mostrar-me",
"toggleAudio": "Alternar áudio",
"toggleVideo": "Alternar vídeo",
"swapCamera": "Trocar câmera",
"toggleScreen": "Alternar tela",
"toggleUsers": "Alternar usuários",
"leave": "Sair"
},
"messages": {
"microphoneEnabled": "Microfone ativado",
@@ -51,9 +60,14 @@
"settings": {
"language": "Idioma",
"selectLanguage": "Selecionar idioma",
"mediaDevicesTitle": "Dispositivos de mídia",
"chatSettingsTitle": "Configurações do chat",
"audioInput": "Microfone",
"videoInput": "Câmera",
"audioOutput": "Alto-falante",
"loadingCameras": "Carregando câmeras...",
"loadingMicrophones": "Carregando microfones...",
"loadingSpeakers": "Carregando alto-falantes...",
"resolution": "Resolução de vídeo",
"save": "Salvar",
"cancel": "Cancelar",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ покинул звонок",
"users": "Пользователи",
"chat": "Чат",
"searchUsers": "Поиск пользователей..."
"searchUsers": "Поиск пользователей...",
"closeSidebar": "Закрыть боковую панель"
},
"controls": {
"microphone": "Микрофон",
@@ -26,7 +27,15 @@
"screenShare": "Демонстрация экрана",
"endCall": "Завершить звонок",
"settings": "Настройки",
"fullscreen": "Полный экран"
"fullscreen": "Полный экран",
"shareRoom": "Поделиться комнатой",
"toggleHideMe": "Скрыть/показать меня",
"toggleAudio": "Вкл/выкл звук",
"toggleVideo": "Вкл/выкл видео",
"swapCamera": "Сменить камеру",
"toggleScreen": "Вкл/выкл экран",
"toggleUsers": "Показать/скрыть пользователей",
"leave": "Выйти"
},
"messages": {
"microphoneEnabled": "Микрофон включён",
@@ -51,9 +60,14 @@
"settings": {
"language": "Язык",
"selectLanguage": "Выберите язык",
"mediaDevicesTitle": "Медиаустройства",
"chatSettingsTitle": "Настройки чата",
"audioInput": "Микрофон",
"videoInput": "Камера",
"audioOutput": "Динамик",
"loadingCameras": "Загрузка камер...",
"loadingMicrophones": "Загрузка микрофонов...",
"loadingSpeakers": "Загрузка динамиков...",
"resolution": "Разрешение видео",
"save": "Сохранить",
"cancel": "Отмена",
+16 -2
View File
@@ -18,7 +18,8 @@
"userLeft": "__username__ 离开了通话",
"users": "用户",
"chat": "聊天",
"searchUsers": "搜索用户..."
"searchUsers": "搜索用户...",
"closeSidebar": "关闭侧边栏"
},
"controls": {
"microphone": "麦克风",
@@ -26,7 +27,15 @@
"screenShare": "共享屏幕",
"endCall": "结束通话",
"settings": "设置",
"fullscreen": "全屏"
"fullscreen": "全屏",
"shareRoom": "分享房间",
"toggleHideMe": "隐藏/显示我",
"toggleAudio": "切换音频",
"toggleVideo": "切换视频",
"swapCamera": "切换摄像头",
"toggleScreen": "切换屏幕",
"toggleUsers": "切换用户",
"leave": "离开"
},
"messages": {
"microphoneEnabled": "麦克风已开启",
@@ -51,9 +60,14 @@
"settings": {
"language": "语言",
"selectLanguage": "选择语言",
"mediaDevicesTitle": "媒体设备",
"chatSettingsTitle": "聊天设置",
"audioInput": "麦克风",
"videoInput": "摄像头",
"audioOutput": "扬声器",
"loadingCameras": "正在加载摄像头...",
"loadingMicrophones": "正在加载麦克风...",
"loadingSpeakers": "正在加载扬声器...",
"resolution": "视频分辨率",
"save": "保存",
"cancel": "取消",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "call-me",
"version": "1.2.91",
"version": "1.2.92",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "call-me",
"version": "1.2.91",
"version": "1.2.92",
"license": "AGPLv3",
"dependencies": {
"@ngrok/ngrok": "1.7.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "call-me",
"version": "1.2.91",
"version": "1.2.92",
"description": "Your Go-To for Instant Video Calls",
"author": "Miroslav Pejic - miroslav.pejic.85@gmail.com",
"license": "AGPLv3",
+35 -15
View File
@@ -205,7 +205,8 @@ function translatePage() {
// Translate elements with data-i18n-title attribute (for tooltips)
document.querySelectorAll('[data-i18n-title]').forEach((element) => {
const key = element.getAttribute('data-i18n-title');
element.title = t(key);
const translatedTitle = t(key);
setElementTitle(element, translatedTitle);
});
// Update document title
@@ -215,6 +216,37 @@ function translatePage() {
updateCustomTranslations();
}
/**
* Set element title in a way that works with Bootstrap tooltips.
* Bootstrap may cache the initial title into the Tooltip instance config.
* @param {Element} element
* @param {string} translatedTitle
*/
function setElementTitle(element, translatedTitle) {
if (!element || typeof translatedTitle !== 'string') return;
// Keep regular title attribute in sync
element.setAttribute('title', translatedTitle);
// Bootstrap 5 stores original title here and may remove the title attribute
element.setAttribute('data-bs-original-title', translatedTitle);
// If a Bootstrap Tooltip instance already exists, update its cached config/content
try {
if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip) {
const instance = bootstrap.Tooltip.getInstance ? bootstrap.Tooltip.getInstance(element) : null;
if (instance) {
if (instance._config) instance._config.title = translatedTitle;
if (typeof instance.setContent === 'function') {
instance.setContent({ '.tooltip-inner': translatedTitle });
}
}
}
} catch (err) {
// No-op: translation should still work without tooltip refresh
}
}
/**
* Update custom translations for specific elements
*/
@@ -226,18 +258,6 @@ function updateCustomTranslations() {
// Update app name
const appName = document.getElementById('appName');
if (appName) appName.textContent = t('appName');
// Update settings title for language
const settingsTitles = document.querySelectorAll('.settings-title');
if (settingsTitles.length > 0) {
settingsTitles[0].innerHTML = '<i class="fas fa-globe"></i> ' + t('settings.language');
}
if (settingsTitles.length > 1) {
settingsTitles[1].innerHTML = '<i class="fas fa-video"></i> Media Devices';
}
if (settingsTitles.length > 2) {
settingsTitles[2].innerHTML = '<i class="fas fa-comments"></i> Chat Settings';
}
}
/**
@@ -320,7 +340,7 @@ function translateElement(element) {
// Translate data-i18n-title
if (element.hasAttribute && element.hasAttribute('data-i18n-title')) {
const key = element.getAttribute('data-i18n-title');
element.title = t(key);
setElementTitle(element, t(key));
}
// Recursively translate children
@@ -347,7 +367,7 @@ function translateElement(element) {
element.querySelectorAll('[data-i18n-title]').forEach((child) => {
const key = child.getAttribute('data-i18n-title');
child.title = t(key);
setElementTitle(child, t(key));
});
}
}
+34 -11
View File
@@ -115,6 +115,7 @@
data-toggle="tooltip"
data-placement="top"
title="Share room"
data-i18n-title="controls.shareRoom"
>
<i class="fas fa-share-nodes"></i>
</button>
@@ -125,6 +126,7 @@
data-toggle="tooltip"
data-placement="top"
title="Toggle hide me"
data-i18n-title="controls.toggleHideMe"
>
<i class="fas fa-eye-slash"></i>
</button>
@@ -135,6 +137,7 @@
data-toggle="tooltip"
data-placement="top"
title="Toggle audio"
data-i18n-title="controls.toggleAudio"
>
<i class="fas fa-microphone"></i>
</button>
@@ -145,6 +148,7 @@
data-toggle="tooltip"
data-placement="top"
title="Toggle video"
data-i18n-title="controls.toggleVideo"
>
<i class="fas fa-video"></i>
</button>
@@ -155,6 +159,7 @@
data-toggle="tooltip"
data-placement="top"
title="Swap camera"
data-i18n-title="controls.swapCamera"
>
<i class="fas fa-camera-rotate"></i>
</button>
@@ -165,6 +170,7 @@
data-toggle="tooltip"
data-placement="top"
title="Toggle screen"
data-i18n-title="controls.toggleScreen"
>
<i class="fas fa-desktop"></i>
</button>
@@ -175,6 +181,7 @@
data-toggle="tooltip"
data-placement="top"
title="Toggle users"
data-i18n-title="controls.toggleUsers"
>
<i class="fas fa-users"></i>
</button>
@@ -185,6 +192,7 @@
data-toggle="tooltip"
data-placement="top"
title="Leave"
data-i18n-title="controls.leave"
>
<i class="fas fa-phone-slash red"></i>
</button>
@@ -207,7 +215,12 @@
</button>
</div>
<button id="exitSidebarBtn" class="btn btn-exit-sidebar" title="Close sidebar">
<button
id="exitSidebarBtn"
class="btn btn-exit-sidebar"
title="Close sidebar"
data-i18n-title="room.closeSidebar"
>
<i class="fas fa-times"></i>
</button>
</div>
@@ -256,39 +269,46 @@
<!-- Settings Tab Content -->
<div id="settingsContent" class="tab-content">
<div class="settings-section">
<h3 class="settings-title"><i class="fas fa-globe"></i> Language</h3>
<h3 class="settings-title">
<i class="fas fa-globe"></i> <span data-i18n="settings.language">Language</span>
</h3>
<div class="setting-group">
<label for="languageSelect" class="setting-label">
<i class="fas fa-language"></i> Select Language
<i class="fas fa-language"></i>
<span data-i18n="settings.selectLanguage">Select Language</span>
</label>
<select id="languageSelect" class="setting-select"></select>
</div>
<h3 class="settings-title"><i class="fas fa-video"></i> Media Devices</h3>
<h3 class="settings-title">
<i class="fas fa-video"></i> <span data-i18n="settings.mediaDevicesTitle">Media Devices</span>
</h3>
<div class="setting-group">
<label for="videoSelect" class="setting-label"> <i class="fas fa-camera"></i> Camera </label>
<label for="videoSelect" class="setting-label">
<i class="fas fa-camera"></i> <span data-i18n="settings.videoInput">Camera</span>
</label>
<select id="videoSelect" class="setting-select">
<option value="">Loading cameras...</option>
<option value="" data-i18n="settings.loadingCameras">Loading cameras...</option>
</select>
</div>
<div class="setting-group">
<label for="audioSelect" class="setting-label">
<i class="fas fa-microphone"></i> Microphone
<i class="fas fa-microphone"></i> <span data-i18n="settings.audioInput">Microphone</span>
</label>
<select id="audioSelect" class="setting-select">
<option value="">Loading microphones...</option>
<option value="" data-i18n="settings.loadingMicrophones">Loading microphones...</option>
</select>
</div>
<div class="setting-group">
<label for="audioOutputSelect" class="setting-label">
<i class="fas fa-volume-up"></i> Speaker
<i class="fas fa-volume-up"></i> <span data-i18n="settings.audioOutput">Speaker</span>
</label>
<select id="audioOutputSelect" class="setting-select">
<option value="">Loading speakers...</option>
<option value="" data-i18n="settings.loadingSpeakers">Loading speakers...</option>
</select>
</div>
@@ -301,7 +321,10 @@
</button>
</div>
<h3 class="settings-title"><i class="fas fa-comments"></i> Chat Settings</h3>
<h3 class="settings-title">
<i class="fas fa-comments"></i>
<span data-i18n="settings.chatSettingsTitle">Chat Settings</span>
</h3>
<div class="settings-actions">
<button id="saveChatBtn" class="btn btn-success btn-save-chat">
<i class="fas fa-download"></i> <span data-i18n="settings.saveMessages">Save Messages</span>