diff --git a/lib/app.dart b/lib/app.dart index 4089e0f..511b9c0 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -16,6 +16,7 @@ import 'features/service/screens/service_screen.dart'; import 'features/dashboard/screens/dashboard_screen.dart'; import 'features/auth/screens/mpin_screen.dart'; import 'package:local_auth/local_auth.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class KMobile extends StatefulWidget { const KMobile({super.key}); @@ -24,18 +25,19 @@ class KMobile extends StatefulWidget { State createState() => _KMobileState(); static void setLocale(BuildContext context, Locale newLocale) { - final _KMobileState? state = context - .findAncestorStateOfType<_KMobileState>(); + final _KMobileState? state = context.findAncestorStateOfType<_KMobileState>(); state?.setLocale(newLocale); } } class _KMobileState extends State { bool _showSplash = false; + Locale? _locale; @override void initState() { super.initState(); + _loadLocale(); // Simulate a splash screen delay Future.delayed(const Duration(seconds: 2), () { setState(() { @@ -44,8 +46,17 @@ class _KMobileState extends State { }); } - Locale? _locale; + Future _loadLocale() async{ + final prefs = await SharedPreferences.getInstance(); + final String? langCode = prefs.getString('locale'); + if (langCode != null) { + setState(() { + _locale = Locale(langCode); + }); + } + } + void setLocale(Locale locale) { setState(() { _locale = locale; @@ -101,38 +112,43 @@ class _KMobileState extends State { } */ - @override - Widget build(BuildContext context) { - // Set status bar color - SystemChrome.setSystemUIOverlayStyle( - const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarIconBrightness: Brightness.dark, - ), - ); +@override +Widget build(BuildContext context) { + // Set status bar color + SystemChrome.setSystemUIOverlayStyle( + const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: Brightness.dark, + ), + ); - return MultiBlocProvider( - providers: [BlocProvider(create: (_) => getIt())], - child: MaterialApp( - debugShowCheckedModeBanner: false, - locale: _locale, // Use your existing locale variable - supportedLocales: const [Locale('en'), Locale('hi')], - localizationsDelegates: const [ - AppLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], - title: 'kMobile', - theme: AppThemes.lightTheme, - // darkTheme: AppThemes.darkTheme, - themeMode: ThemeMode.system, // Use system theme by default - onGenerateRoute: AppRoutes.generateRoute, - initialRoute: AppRoutes.splash, - home: _showSplash ? const SplashScreen() : const AuthGate(), - ), - ); - } + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => getIt()), + ], + child: MaterialApp( + debugShowCheckedModeBanner: false, + locale: _locale, // Dynamic locale + supportedLocales: const [ + Locale('en'), + Locale('hi'), + ], + localizationsDelegates: const [ + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + title: 'kMobile', + theme: AppThemes.lightTheme, + // darkTheme: AppThemes.darkTheme, + themeMode: ThemeMode.system, + onGenerateRoute: AppRoutes.generateRoute, + initialRoute: AppRoutes.splash, + home: _showSplash ? const SplashScreen() : const AuthGate(), + ), + ); +} } class AuthGate extends StatefulWidget { diff --git a/lib/config/themes.dart b/lib/config/themes.dart index e37a93f..6230e60 100644 --- a/lib/config/themes.dart +++ b/lib/config/themes.dart @@ -116,7 +116,7 @@ class AppThemes { foregroundColor: Color(0xFF212121), centerTitle: true, ), - cardTheme: CardThemeData( + cardTheme: CardTheme( //Earlier CardThemeData elevation: 2, shape: RoundedRectangleBorder( @@ -200,7 +200,7 @@ class AppThemes { foregroundColor: Colors.white, centerTitle: true, ), - cardTheme: CardThemeData( + cardTheme: CardTheme( //Earlier was CardThemeData elevation: 2, shape: RoundedRectangleBorder( diff --git a/lib/features/profile/preferences/language_dialog.dart b/lib/features/profile/preferences/language_dialog.dart index 4ee88e6..9d81a72 100644 --- a/lib/features/profile/preferences/language_dialog.dart +++ b/lib/features/profile/preferences/language_dialog.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; import '../../../l10n/app_localizations.dart'; import 'package:kmobile/app.dart'; +import 'package:shared_preferences/shared_preferences.dart'; -class LanguageDialog extends StatelessWidget { +/*class LanguageDialog extends StatelessWidget { const LanguageDialog({super.key}); String getLocaleName(AppLocalizations localizations, String code) { @@ -47,3 +48,37 @@ class LanguageDialog extends StatelessWidget { ); } } +*/ + +class LanguageDialog extends StatelessWidget { + const LanguageDialog({Key? key}) : super(key: key); + + Future _setLocale(BuildContext context, String langCode) async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('locale', langCode); // Save selected language + KMobile.setLocale(context, Locale(langCode)); // Update locale in app + Navigator.of(context).pop(); // Close the dialog + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(AppLocalizations.of(context).selectLanguage), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: const Icon(Icons.language), + title: const Text('English'), + onTap: () => _setLocale(context, 'en'), + ), + ListTile( + leading: const Icon(Icons.language), + title: const Text('हिन्दी'), + onTap: () => _setLocale(context, 'hi'), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index 759a777..f30f66e 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -218,6 +218,6 @@ "enterMPIN": "अपना mPIN दर्ज करें", "setMPIN": "अपना mPIN सेट करें", "confirmMPIN": "अपना mPIN की पुष्टि करें", - "kconnect": "केकनेक्ट", + "kconnect": "के-कनेक्ट", "kccBankFull": "कांगड़ा सेंट्रल को-ऑपरेटिव बैंक" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index c317519..3d9990c 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -62,8 +62,7 @@ import 'app_localizations_hi.dart'; /// be consistent with the languages listed in the AppLocalizations.supportedLocales /// property. abstract class AppLocalizations { - AppLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; @@ -71,8 +70,7 @@ abstract class AppLocalizations { return Localizations.of(context, AppLocalizations)!; } - static const LocalizationsDelegate delegate = - _AppLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -84,8 +82,7 @@ abstract class AppLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -1347,8 +1344,7 @@ abstract class AppLocalizations { String get kccBankFull; } -class _AppLocalizationsDelegate - extends LocalizationsDelegate { +class _AppLocalizationsDelegate extends LocalizationsDelegate { const _AppLocalizationsDelegate(); @override @@ -1357,25 +1353,25 @@ class _AppLocalizationsDelegate } @override - bool isSupported(Locale locale) => - ['en', 'hi'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'hi'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; } AppLocalizations lookupAppLocalizations(Locale locale) { + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return AppLocalizationsEn(); - case 'hi': - return AppLocalizationsHi(); + case 'en': return AppLocalizationsEn(); + case 'hi': return AppLocalizationsHi(); } throw FlutterError( - 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index df7b4c9..5c2ae94 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -1,5 +1,3 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -488,8 +486,7 @@ class AppLocalizationsEn extends AppLocalizations { String get otpVerification => 'OTP Verification'; @override - String get otpSentMessage => - 'Enter the 4-digit OTP sent to your mobile number'; + String get otpSentMessage => 'Enter the 4-digit OTP sent to your mobile number'; @override String get verifyOtp => 'Verify OTP'; @@ -507,15 +504,13 @@ class AppLocalizationsEn extends AppLocalizations { String get tpinRequired => 'TPIN Required'; @override - String get tpinRequiredMessage => - 'You need to set your TPIN to continue with secure transactions'; + String get tpinRequiredMessage => 'You need to set your TPIN to continue with secure transactions'; @override String get setTpinTitle => 'Set TPIN'; @override - String get tpinInfo => - 'Your TPIN is a 6-digit code used to authorize transactions. Keep it safe and do not share it with anyone.'; + String get tpinInfo => 'Your TPIN is a 6-digit code used to authorize transactions. Keep it safe and do not share it with anyone.'; @override String get tpinFailed => 'Failed to set TPIN. Please try again.'; @@ -569,8 +564,7 @@ class AppLocalizationsEn extends AppLocalizations { String get enableFingerprintLogin => 'Enable Fingerprint Login?'; @override - String get enableFingerprintMessage => - 'Would you like to enable fingerprint authentication for faster login?'; + String get enableFingerprintMessage => 'Would you like to enable fingerprint authentication for faster login?'; @override String get no => 'No'; @@ -591,8 +585,7 @@ class AppLocalizationsEn extends AppLocalizations { String get loading => 'Loading......'; @override - String get enableFingerprintQuick => - 'Enable fingerprint authentication for quick login?'; + String get enableFingerprintQuick => 'Enable fingerprint authentication for quick login?'; @override String get kccb => 'KCCB'; diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 401d7c9..3b963ec 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -1,5 +1,3 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -54,8 +52,7 @@ class AppLocalizationsHi extends AppLocalizations { String get enableBiometric => 'बायोमेट्रिक प्रमाणीकरण सक्षम करें'; @override - String get useBiometricPrompt => - 'तेज़ लॉगिन के लिए फिंगरप्रिंट/फेस आईडी का उपयोग करें?'; + String get useBiometricPrompt => 'तेज़ लॉगिन के लिए फिंगरप्रिंट/फेस आईडी का उपयोग करें?'; @override String get later => 'बाद में'; @@ -489,8 +486,7 @@ class AppLocalizationsHi extends AppLocalizations { String get otpVerification => 'ओटीपी सत्यापन'; @override - String get otpSentMessage => - 'अपने मोबाइल नंबर पर भेजा गया 4-अंकों का ओटीपी दर्ज करें'; + String get otpSentMessage => 'अपने मोबाइल नंबर पर भेजा गया 4-अंकों का ओटीपी दर्ज करें'; @override String get verifyOtp => 'ओटीपी सत्यापित करें'; @@ -508,15 +504,13 @@ class AppLocalizationsHi extends AppLocalizations { String get tpinRequired => 'टी-पिन आवश्यक है'; @override - String get tpinRequiredMessage => - 'सुरक्षित लेनदेन के लिए टी-पिन सेट करना आवश्यक है'; + String get tpinRequiredMessage => 'सुरक्षित लेनदेन के लिए टी-पिन सेट करना आवश्यक है'; @override String get setTpinTitle => 'टी-पिन सेट करें'; @override - String get tpinInfo => - 'आपका टी-पिन 6 अंकों का कोड है जिसका उपयोग लेन-देन को प्रमाणित करने के लिए किया जाता है। इसे सुरक्षित रखें और किसी से साझा न करें।'; + String get tpinInfo => 'आपका टी-पिन 6 अंकों का कोड है जिसका उपयोग लेन-देन को प्रमाणित करने के लिए किया जाता है। इसे सुरक्षित रखें और किसी से साझा न करें।'; @override String get tpinFailed => 'टी-पिन सेट करने में विफल। कृपया पुनः प्रयास करें।'; @@ -570,8 +564,7 @@ class AppLocalizationsHi extends AppLocalizations { String get enableFingerprintLogin => 'फिंगरप्रिंट लॉगिन सक्षम करें?'; @override - String get enableFingerprintMessage => - 'क्या आप तेज लॉगिन के लिए फिंगरप्रिंट प्रमाणीकरण सक्षम करना चाहेंगे?'; + String get enableFingerprintMessage => 'क्या आप तेज लॉगिन के लिए फिंगरप्रिंट प्रमाणीकरण सक्षम करना चाहेंगे?'; @override String get no => 'नहीं'; @@ -580,8 +573,7 @@ class AppLocalizationsHi extends AppLocalizations { String get yes => 'हाँ'; @override - String get authenticateToEnable => - 'फिंगरप्रिंट लॉगिन सक्षम करने के लिए प्रमाणीकरण करें'; + String get authenticateToEnable => 'फिंगरप्रिंट लॉगिन सक्षम करने के लिए प्रमाणीकरण करें'; @override String get exitApp => 'ऐप बंद करें'; @@ -593,8 +585,7 @@ class AppLocalizationsHi extends AppLocalizations { String get loading => 'लोड हो रहा है......'; @override - String get enableFingerprintQuick => - 'तेज़ लॉगिन के लिए फिंगरप्रिंट प्रमाणीकरण सक्षम करें?'; + String get enableFingerprintQuick => 'तेज़ लॉगिन के लिए फिंगरप्रिंट प्रमाणीकरण सक्षम करें?'; @override String get kccb => 'केसीसीबी'; @@ -636,7 +627,7 @@ class AppLocalizationsHi extends AppLocalizations { String get confirmMPIN => 'अपना mPIN की पुष्टि करें'; @override - String get kconnect => 'केकनेक्ट'; + String get kconnect => 'के-कनेक्ट'; @override String get kccBankFull => 'कांगड़ा सेंट्रल को-ऑपरेटिव बैंक'; diff --git a/pubspec.lock b/pubspec.lock index c49ada3..65e3c80 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.11.0" bloc: dependency: "direct main" description: @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" chalkdart: dependency: transitive description: @@ -53,10 +53,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.3.0" checked_yaml: dependency: transitive description: @@ -77,18 +77,18 @@ packages: dependency: transitive description: name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.1" collection: dependency: transitive description: name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.1" + version: "1.18.0" cross_file: dependency: transitive description: @@ -141,10 +141,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.1" ffi: dependency: transitive description: @@ -337,10 +337,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.20.2" + version: "0.19.0" js: dependency: transitive description: @@ -361,18 +361,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -441,10 +441,10 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: @@ -465,10 +465,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.15.0" mime: dependency: transitive description: @@ -489,10 +489,10 @@ packages: dependency: transitive description: name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -673,15 +673,15 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_span: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.0" sprintf: dependency: transitive description: @@ -694,42 +694,42 @@ packages: dependency: transitive description: name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.1" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.2" string_scanner: dependency: transitive description: name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.2" typed_data: dependency: transitive description: @@ -846,10 +846,10 @@ packages: dependency: transitive description: name: vm_service - sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "15.0.0" + version: "14.2.5" web: dependency: transitive description: @@ -891,5 +891,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.7.0-0 <4.0.0" + dart: ">=3.5.0 <4.0.0" flutter: ">=3.24.0"