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 createState() => _LanguagePageState(); } class _LanguageOption { const _LanguageOption({required this.code, required this.label}); final String code; final String label; } class _LanguagePageState extends State { 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'), ]; 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().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().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(), ); }), ), ], ), ); } }