feat(mobile): in-app locale switching
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user