refactor(settings): 重构设置页面,支持语言和地区设置

This commit is contained in:
qzl
2026-04-07 18:44:14 +08:00
parent 6e82053ea7
commit 6217844865
4 changed files with 101 additions and 52 deletions
@@ -13,10 +13,8 @@ class LanguageSettingsScreen extends StatelessWidget {
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final colors = Theme.of(context).colorScheme;
final options = <({String tag, String label})>[
(tag: 'zh-CN', label: l10n.chinese),
(tag: 'en-US', label: l10n.english),
];
final options = _buildLanguageOptions(l10n);
return Scaffold(
backgroundColor: colors.surfaceContainerLow,
@@ -40,12 +38,10 @@ class LanguageSettingsScreen extends StatelessWidget {
tint: colors.primary,
background: colors.surfaceContainerHighest,
showDivider: i != options.length - 1,
showChevron: false,
trailing: selectedLanguageTag == options[i].tag
? Icon(Icons.check_rounded, color: colors.primary)
: Icon(
Icons.chevron_right_rounded,
color: colors.outline,
),
: null,
onTap: () => Navigator.of(context).pop(options[i].tag),
),
],
@@ -54,4 +50,41 @@ class LanguageSettingsScreen extends StatelessWidget {
),
);
}
List<({String tag, String label})> _buildLanguageOptions(
AppLocalizations l10n,
) {
final supportedLocales = AppLocalizations.supportedLocales;
return supportedLocales.map((locale) {
final tag = _localeToTag(locale);
final label = _getLocaleLabel(locale, l10n);
return (tag: tag, label: label);
}).toList();
}
String _localeToTag(Locale locale) {
final lang = locale.languageCode;
final script = locale.scriptCode;
final country = locale.countryCode;
if (script != null && country != null) {
return '$lang-$script-$country';
} else if (country != null) {
return '$lang-$country';
}
return _mapToBackendTag(lang);
}
String _mapToBackendTag(String flutterTag) {
const mapping = {'zh': 'zh-CN', 'en': 'en-US'};
return mapping[flutterTag] ?? flutterTag;
}
String _getLocaleLabel(Locale locale, AppLocalizations l10n) {
if (locale.languageCode == 'zh') {
return l10n.chinese;
} else if (locale.languageCode == 'en') {
return l10n.english;
}
return locale.languageCode;
}
}