159 lines
5.2 KiB
Dart
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(),
|
|
);
|
|
}),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|