2026-06-02 19:57:41 +08:00

159 lines
5.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:provider/provider.dart';
import 'package:yumi/app/constants/sc_global_config.dart';
import 'package:yumi/app_localizations.dart';
import 'package:yumi/services/localization/localization_manager.dart';
import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart';
import 'package:yumi/ui_kit/components/appbar/socialchat_appbar.dart';
import 'package:yumi/ui_kit/components/text/sc_text.dart';
/// 语言选择
class LanguagePage extends StatefulWidget {
const LanguagePage({super.key});
@override
State<LanguagePage> createState() => _LanguagePageState();
}
class _LanguageOption {
const _LanguageOption({required this.code, required this.label});
final String code;
final String label;
}
class _LanguagePageState extends State<LanguagePage> {
static const List<_LanguageOption> _languageOptions = [
_LanguageOption(code: 'en', label: 'English'),
_LanguageOption(code: 'ar', label: 'العربية'),
_LanguageOption(code: 'tr', label: 'Türkçe'),
_LanguageOption(code: 'bn', label: 'বাংলা'),
_LanguageOption(code: 'it', label: 'Italiano'),
_LanguageOption(code: 'pt', label: 'Português'),
_LanguageOption(code: 'fr', label: 'Français'),
_LanguageOption(code: 'id', label: 'Bahasa Indonesia'),
_LanguageOption(code: 'es', label: 'Español'),
];
String _selectedLanguageCode = 'en';
bool _didResolveInitialLanguage = false;
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (!_didResolveInitialLanguage) {
_selectedLanguageCode = _resolveCurrentLanguageCode();
_didResolveInitialLanguage = true;
}
}
String _resolveCurrentLanguageCode() {
final persistedLanguageCode = DataPersistence.getLang();
if (SCAppLocalizations.isSupportedLanguageCode(persistedLanguageCode)) {
return SCAppLocalizations.resolveSupportedLanguageCode(
persistedLanguageCode,
);
}
final currentLanguageCode =
context.read<LocalizationManager>().locale?.languageCode ?? 'en';
return SCAppLocalizations.resolveSupportedLanguageCode(currentLanguageCode);
}
void _selectLanguage(String languageCode) {
final resolvedLanguageCode =
SCAppLocalizations.resolveSupportedLanguageCode(languageCode);
if (_selectedLanguageCode == resolvedLanguageCode) {
return;
}
setState(() {
_selectedLanguageCode = resolvedLanguageCode;
});
context.read<LocalizationManager>().changeAppLanguage(
Locale(resolvedLanguageCode, ''),
);
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Image.asset(
SCGlobalConfig.businessLogicStrategy.getLanguagePageBackgroundImage(),
width: ScreenUtil().screenWidth,
height: ScreenUtil().screenHeight,
fit: BoxFit.fill,
),
Scaffold(
backgroundColor:
SCGlobalConfig.businessLogicStrategy
.getLanguagePageScaffoldBackgroundColor(),
resizeToAvoidBottomInset: false,
appBar: SocialChatStandardAppBar(
title: SCAppLocalizations.of(context)!.language,
actions: [],
),
body: ListView.builder(
padding: EdgeInsets.only(top: 4.w),
itemCount: _languageOptions.length,
itemBuilder: (context, index) {
return _buildLanguageRow(_languageOptions[index]);
},
),
),
],
);
}
Widget _buildLanguageRow(_LanguageOption option) {
final selected = _selectedLanguageCode == option.code;
return InkWell(
onTap: () => _selectLanguage(option.code),
child: Row(
children: [
SizedBox(width: 15.w),
Expanded(
child: text(
option.label,
textColor:
SCGlobalConfig.businessLogicStrategy
.getLanguagePagePrimaryTextColor(),
fontSize: 15.sp,
),
),
Checkbox(
value: selected,
checkColor:
SCGlobalConfig.businessLogicStrategy
.getLanguagePageCheckColor(),
activeColor:
SCGlobalConfig.businessLogicStrategy
.getLanguagePageCheckboxActiveColor(),
onChanged: (checked) {
if (checked == true) {
_selectLanguage(option.code);
}
},
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
SCGlobalConfig.businessLogicStrategy
.getLanguagePageCheckboxBorderRadius(),
),
),
side: WidgetStateBorderSide.resolveWith((states) {
return BorderSide(
color:
SCGlobalConfig.businessLogicStrategy
.getLanguagePageCheckboxBorderColor(),
width:
SCGlobalConfig.businessLogicStrategy
.getLanguagePageCheckboxBorderWidth(),
);
}),
),
],
),
);
}
}