49 lines
1.7 KiB
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';
|
|
}
|