Files
flutterApp/lib/core/localization/locale_cubit.dart

49 lines
1.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:shared_preferences/shared_preferences.dart';
class LocaleCubit extends Cubit<Locale> {
static const String _localeKey = 'app_locale';
static const String _chosenKey = 'app_locale_chosen';
/// 用户是否已明确选择过语言(决定登录页是否弹强制语言选择框)
bool hasChosenLanguage = false;
LocaleCubit() : super(const Locale('en', 'US')) {
_loadSavedLocale();
}
Future<void> _loadSavedLocale() async {
try {
final prefs = await SharedPreferences.getInstance();
hasChosenLanguage = prefs.getBool(_chosenKey) ?? false;
if (hasChosenLanguage) {
final languageCode = prefs.getString('${_localeKey}_lang') ?? 'en';
final countryCode = prefs.getString('${_localeKey}_country') ?? 'US';
emit(Locale(languageCode, countryCode));
} else {
// 未选择过:默认英文(登录页仍会弹出强制选择框)
emit(const Locale('en', 'US'));
}
} catch (e) {
emit(const Locale('en', 'US'));
}
}
Future<void> setLocale(Locale locale) async {
try {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('${_localeKey}_lang', locale.languageCode);
await prefs.setString('${_localeKey}_country', locale.countryCode ?? '');
await prefs.setBool(_chosenKey, true);
hasChosenLanguage = true;
emit(locale);
} catch (e) {
debugPrint('❌ [LocaleCubit] 保存语言设置失败: $e');
}
}
bool get isChinese => state.languageCode == 'zh';
bool get isEnglish => state.languageCode == 'en';
}