Files
citypulse/lib/l10n/locale_provider.dart
Zahar ee9a9200b6 feat(i18n): add capture prompt translations and locale init
- integrate flutter_localizations and delegates in MaterialApp
- use language-only supportedLocales; add resolution callback
- initialize I18n on app start and when switching language
- localize capture screen prompt via I18n.t
- schedule map centering via postFrame to avoid race conditions
- add flutter_localizations to pubspec
2025-09-26 10:45:29 +08:00

104 lines
2.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'i18n.dart';
/// Provider for managing app locale and language switching
class LocaleProvider extends ChangeNotifier {
static const String _languageKey = 'lang';
static const String _defaultLanguage = 'en';
Locale _locale = const Locale('en');
late SharedPreferences _prefs;
/// Get the current locale
Locale get locale => _locale;
/// Get the current language code
String get languageCode => _locale.languageCode;
/// Initialize the locale provider
Future<void> init() async {
_prefs = await SharedPreferences.getInstance();
final savedLanguage = _prefs.getString(_languageKey) ?? _defaultLanguage;
_locale = Locale(savedLanguage);
await I18n.init(_locale);
notifyListeners();
}
/// Set the locale and persist the change
Future<void> setLocale(Locale locale) async {
if (_locale == locale) return;
_locale = locale;
await _prefs.setString(_languageKey, locale.languageCode);
await I18n.init(locale);
notifyListeners();
}
/// Toggle between English and Bahasa Malaysia
Future<void> toggleLanguage() async {
final newLanguage = _locale.languageCode == 'en' ? 'ms' : 'en';
await setLocale(Locale(newLanguage));
}
/// Set language to English
Future<void> setEnglish() async {
await setLocale(const Locale('en'));
}
/// Set language to Bahasa Malaysia
Future<void> setMalay() async {
await setLocale(const Locale('ms'));
}
/// Check if current language is English
bool get isEnglish => _locale.languageCode == 'en';
/// Check if current language is Bahasa Malaysia
bool get isMalay => _locale.languageCode == 'ms';
/// Get the display name for the current language
String get currentLanguageDisplayName {
switch (_locale.languageCode) {
case 'en':
return 'English';
case 'ms':
return 'Bahasa Malaysia';
default:
return 'English';
}
}
/// Get the native display name for the current language
String get currentLanguageNativeName {
switch (_locale.languageCode) {
case 'en':
return 'English';
case 'ms':
return 'Bahasa Malaysia';
default:
return 'English';
}
}
/// Get available locales
List<Locale> get availableLocales => const [
Locale('en'),
Locale('ms'),
];
/// Get available language codes
List<String> get availableLanguageCodes => ['en', 'ms'];
/// Clear saved language preference
Future<void> clearSavedLanguage() async {
await _prefs.remove(_languageKey);
_locale = const Locale(_defaultLanguage);
notifyListeners();
}
/// Reset to default language
Future<void> resetToDefault() async {
await setLocale(const Locale(_defaultLanguage));
}
}