feat(mobile): in-app locale switching

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-19 05:00:11 +08:00
parent 955f9b13c1
commit 8f3966d7b5
8 changed files with 548 additions and 17 deletions
+23 -1
View File
@@ -43,9 +43,30 @@ class _PhotoLiveAppState extends ConsumerState<PhotoLiveApp> {
};
}
/// 语言解析(P3 Task 10):
/// - 显式选择(locale 非 null)优先,按 languageCode 匹配;
/// - system 档位下用系统 locale 匹配(zh_* → zh、en_* → en);
/// - 均不匹配(如 fr)回退模板语言 zh——不依赖生成代码 supportedLocales
/// 的排序(gen-l10n 按字母序 en 在前,默认解析会回退 en,与模板不符)。
static Locale _resolveLocale(
Locale? deviceLocale,
Iterable<Locale> supportedLocales,
) {
Locale? requested;
for (final supported in supportedLocales) {
if (supported.languageCode == deviceLocale?.languageCode) {
requested = supported;
break;
}
}
// 语言码不匹配 → 模板语言(l10n.yaml template-arb-file=app_zh.arb)。
return requested ?? const Locale('zh');
}
@override
Widget build(BuildContext context) {
final locale = ref.watch(localeSettingsProvider);
// select 只取 Locale?:未引起 locale 变化的状态更新不重建 MaterialApp。
final locale = ref.watch(localeSettingsProvider.select((c) => c.locale));
// 引擎生命周期绑定(常驻 watch;账号在场 start / 离场 stop)。
ref.watch(uploadEngineScopeProvider);
return MaterialApp(
@@ -54,6 +75,7 @@ class _PhotoLiveAppState extends ConsumerState<PhotoLiveApp> {
theme: AppTheme.light,
darkTheme: AppTheme.dark,
locale: locale,
localeResolutionCallback: _resolveLocale,
supportedLocales: AppLocalizations.supportedLocales,
localizationsDelegates: AppLocalizations.localizationsDelegates,
routes: {