69 lines
2.6 KiB
Dart
69 lines
2.6 KiB
Dart
import 'package:citycards_customer/localPreference/local_preference.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
|
// ─── Events ────────────────────────────────────────────────────────────────
|
|
abstract class LanguageEvent {}
|
|
|
|
/// Dispatched on app start to restore the last saved locale.
|
|
class LoadSavedLanguage extends LanguageEvent {}
|
|
|
|
/// Dispatched when the user picks a new language in the bottom sheet.
|
|
class UpdateLanguage extends LanguageEvent {
|
|
/// Display label shown in the bottom sheet (e.g. "Spanish / Español").
|
|
final String label;
|
|
|
|
/// BCP-47 locale code (e.g. "es").
|
|
final String code;
|
|
|
|
UpdateLanguage({required this.label, required this.code});
|
|
}
|
|
|
|
// ─── State ─────────────────────────────────────────────────────────────────
|
|
class LanguageState {
|
|
/// BCP-47 locale code (e.g. "en", "nl", "es").
|
|
final String code;
|
|
|
|
/// Display label shown in the UI (e.g. "English / English").
|
|
final String label;
|
|
|
|
/// The [Locale] that MaterialApp should use.
|
|
Locale get locale => Locale(code);
|
|
|
|
const LanguageState({required this.code, required this.label});
|
|
|
|
static const initial = LanguageState(
|
|
code: 'en',
|
|
label: 'English / English',
|
|
);
|
|
}
|
|
|
|
// ─── BLoC ──────────────────────────────────────────────────────────────────
|
|
class LanguageBloc extends Bloc<LanguageEvent, LanguageState> {
|
|
LanguageBloc() : super(LanguageState.initial) {
|
|
on<LoadSavedLanguage>(_onLoadSaved);
|
|
on<UpdateLanguage>(_onUpdate);
|
|
}
|
|
|
|
/// Map of BCP-47 code → display label (must match language_selection_bottomsheet).
|
|
static const Map<String, String> _codeToLabel = {
|
|
'en': 'English / English',
|
|
'nl': 'Dutch / Nederlands',
|
|
'es': 'Spanish / Español',
|
|
'fr': 'French / Français',
|
|
'ja': 'Japanese / 日本語',
|
|
};
|
|
|
|
Future<void> _onLoadSaved(
|
|
LoadSavedLanguage event,
|
|
Emitter<LanguageState> emit,
|
|
) async {
|
|
final code = await LocalPreference.getLanguage();
|
|
final label = _codeToLabel[code] ?? 'English / English';
|
|
emit(LanguageState(code: code, label: label));
|
|
}
|
|
|
|
void _onUpdate(UpdateLanguage event, Emitter<LanguageState> emit) {
|
|
emit(LanguageState(code: event.code, label: event.label));
|
|
}
|
|
} |