diff --git a/components/ts_webui/web/index.html b/components/ts_webui/web/index.html
index 75457b2..9b85a1d 100644
--- a/components/ts_webui/web/index.html
+++ b/components/ts_webui/web/index.html
@@ -282,8 +282,12 @@
电压保护设置
function init() {
try {
var saved = localStorage.getItem('ts_language');
- if (saved && languages[saved]) currentLang = saved;
- else currentLang = (navigator.language || '').indexOf('zh') === 0 ? 'zh-CN' : 'en-US';
+ /* 使用 supportedLanguages 校验(languages 在 init 时尚未加载语言包) */
+ if (saved && supportedLanguages[saved]) {
+ currentLang = saved;
+ } else {
+ currentLang = (navigator.language || '').indexOf('zh') === 0 ? 'zh-CN' : 'en-US';
+ }
} catch(e) {}
document.documentElement.lang = currentLang;
}
diff --git a/components/ts_webui/web/js/app.js b/components/ts_webui/web/js/app.js
index 0be8c44..b012d56 100644
--- a/components/ts_webui/web/js/app.js
+++ b/components/ts_webui/web/js/app.js
@@ -129,9 +129,11 @@ document.addEventListener('DOMContentLoaded', () => {
// 初始化认证 UI
updateAuthUI();
- // 根据设备 system.language 同步 WebUI 语言(与设备终端 help i18n 一致)
+ // 仅当 localStorage 无有效语言偏好时,才从设备 system.language 同步(不覆盖用户已有选择)
(async function syncLanguageFromDevice() {
try {
+ const saved = localStorage.getItem('ts_language');
+ if (saved) return; /* 用户已有选择,优先尊重 */
const r = await api.configGet('system.language');
if (r && r.code === 0 && r.data && r.data.value !== undefined) {
const webLang = r.data.value === 1 ? 'zh-CN' : 'en-US';