feat(语言切换): 添加语言切换功能面板及实现逻辑

- 在工具栏添加语言切换按钮
- 新增语言选择浮动面板及样式
- 实现语言列表加载和切换功能
- 添加相关事件监听和处理逻辑
This commit is contained in:
2026-05-07 08:36:50 +08:00
parent c87ea397e7
commit 7c01dc5f2e
3 changed files with 107 additions and 2 deletions

View File

@@ -33,7 +33,8 @@ const ConfigKey = {
ENABLE_DEVICE_SETTING: 'enableDeviceSetting',
ENABLE_NETWORK_CHECK: 'enableNetworkCheck',
AUTO_PLAY_REMOTE_VIDEO: 'autoPlayRemoteVideo',
DEFAULT_MUTE_REMOTE_AUDIO: 'defaultMuteRemoteAudio'
DEFAULT_MUTE_REMOTE_AUDIO: 'defaultMuteRemoteAudio',
ENABLE_LOCAL_WAKEUP: 'enableLocalWakeup'
};
const state = {
@@ -57,8 +58,10 @@ const elements = {
fullscreenBtn: document.getElementById('fullscreenBtn'),
toggleConfigBtn: document.getElementById('toggleConfigBtn'),
toggleCaptionBtn: document.getElementById('toggleCaptionBtn'),
toggleLanguageBtn: document.getElementById('toggleLanguageBtn'),
toggleLogBtn: document.getElementById('toggleLogBtn'),
applyCaptionStyleBtn: document.getElementById('applyCaptionStyleBtn'),
languageSelect: document.getElementById('languageSelect'),
containerBgColor: document.getElementById('containerBgColor'),
containerBgOpacity: document.getElementById('containerBgOpacity'),
@@ -189,6 +192,7 @@ const eventListeners = {
[ICSEventKey.LANGUAGE_INFO_CHANGE]: (langInfo) => {
logger.info('语言信息变更', langInfo);
updateLanguageSelect(langInfo);
},
[ICSEventKey.JOB_END_MENTION]: (data) => {
@@ -246,6 +250,7 @@ function togglePanel(panelId) {
const btnMap = {
configPanel: 'toggleConfigBtn',
captionPanel: 'toggleCaptionBtn',
languagePanel: 'toggleLanguageBtn',
logPanel: 'toggleLogBtn'
};
@@ -256,6 +261,70 @@ function togglePanel(panelId) {
}
}
async function loadLanguageOptions() {
if (!state.isInitialized) {
elements.languageSelect.innerHTML = '<option value="">SDK 未初始化</option>';
return;
}
try {
const langInfo = await HwICSUiSdk.getLanguageInfo();
logger.info('获取语言信息成功', langInfo);
if (langInfo.languageList && langInfo.languageList.length > 0) {
elements.languageSelect.innerHTML = '';
langInfo.languageList.forEach(item => {
const option = document.createElement('option');
option.value = item.language;
option.textContent = item.language_desc;
elements.languageSelect.appendChild(option);
});
if (langInfo.currentLanguage) {
elements.languageSelect.value = langInfo.currentLanguage;
}
} else {
elements.languageSelect.innerHTML = '<option value="">无可用语言</option>';
}
} catch (error) {
logger.error('获取语言信息失败', error);
elements.languageSelect.innerHTML = '<option value="">加载失败</option>';
}
}
function updateLanguageSelect(langInfo) {
if (!langInfo) return;
if (langInfo.languageList && langInfo.languageList.length > 0) {
elements.languageSelect.innerHTML = '';
langInfo.languageList.forEach(item => {
const option = document.createElement('option');
option.value = item.language;
option.textContent = item.language_desc;
elements.languageSelect.appendChild(option);
});
}
if (langInfo.currentLanguage) {
elements.languageSelect.value = langInfo.currentLanguage;
}
}
async function changeLanguage(langCode) {
if (!state.isInitialized) {
logger.error('SDK 未初始化,无法切换语言');
return;
}
try {
logger.info('正在切换语言...', langCode);
await HwICSUiSdk.changeLanguage({ langCode });
logger.info('语言切换成功', langCode);
} catch (error) {
logger.error('语言切换失败', error);
}
}
async function initializeSDK() {
try {
const serverAddress = elements.serverAddress.value.trim();
@@ -305,7 +374,8 @@ async function initializeSDK() {
[ConfigKey.ENABLE_DEVICE_SETTING]: false,
[ConfigKey.ENABLE_NETWORK_CHECK]: false,
[ConfigKey.AUTO_PLAY_REMOTE_VIDEO]: true,
[ConfigKey.DEFAULT_MUTE_REMOTE_AUDIO]: false
[ConfigKey.DEFAULT_MUTE_REMOTE_AUDIO]: false,
[ConfigKey.ENABLE_LOCAL_WAKEUP]: true
},
logLevel
};
@@ -1140,6 +1210,13 @@ function bindEvents() {
}
});
elements.toggleLogBtn.addEventListener('click', () => togglePanel('logPanel'));
elements.toggleLanguageBtn.addEventListener('click', () => {
togglePanel('languagePanel');
loadLanguageOptions();
});
elements.languageSelect.addEventListener('change', (e) => {
changeLanguage(e.target.value);
});
elements.fullscreenBtn.addEventListener('click', toggleFullscreen);
document.querySelectorAll('.panel-close').forEach(btn => {