feat(locale): 实现前端多语言覆盖与生效语言逻辑

- 新增 effectiveLanguage 字段,统一界面语言解析依据
- 支持前端语言覆盖(德语/西班牙语/法语)优先显示,回退设备语言
- setUiLanguage 方法实现前端或设备语言切换逻辑与持久化
- 当设备语言发生变化时自动清除前端语言覆盖,保证同步一致
- BottomNav 组件和 ConnectionPlaceholder 组件调整使用 effectiveLanguage 获取语言包
- 多语言数据更新,新增德语、西班牙语、法语、韩语支持及语言选项扩展
This commit is contained in:
eafonyang
2026-10-21 13:38:50 +08:00
parent 2c82d8511c
commit acfcffa60d
24 changed files with 3136 additions and 79 deletions
+18 -2
View File
@@ -216,7 +216,7 @@ export default function SelectPage() {
const [location, setLocation] = useLocation();
const { updateSetting, deviceState } = useDevice();
const { updateSetting, effectiveLanguage, setUiLanguage } = useDevice();
const [state, setState] = useState<{
@@ -238,7 +238,7 @@ export default function SelectPage() {
const pageTitle = usePageTitleWithConnection(state?.title ?? "");
const dacVolumeDirectText = resolveLocalePack(deviceState?.language).dac?.dacVolumeDirect;
const dacVolumeDirectText = resolveLocalePack(effectiveLanguage).dac?.dacVolumeDirect;
@@ -316,6 +316,22 @@ export default function SelectPage() {
// 语言选择:设备语言(0/1/2)下发设备,de/es/fr(3/4/5)仅前端切换,
// 由 setUiLanguage 内部区分,避免向不支持多语言的设备下发无效值。
if (key === "language") {
setSaving(true);
try {
await setUiLanguage(idx);
} finally {
setSaving(false);
}
selectPageState = null;
setLocation(back);
return;
}
const apiField = KEY_TO_SETTING[key];
if (apiField) {