From 49cac5f4690766a175a6930a198eeb52a92a4332 Mon Sep 17 00:00:00 2001 From: asif Date: Wed, 11 Mar 2026 18:13:04 +0530 Subject: [PATCH] Localization of yojna schemes done --- lib/features/yojna/screens/apy_screen.dart | 10 +-- .../yojna/screens/gov_scheme_screen.dart | 11 +-- .../yojna/screens/pm_main_screen.dart | 82 ++++++++++-------- .../yojna/screens/pmjjby_enquiry_screen.dart | 43 +++++----- lib/features/yojna/screens/pmjjby_screen.dart | 73 ++++++++-------- .../yojna/screens/pmsby_enquiry_screen.dart | 43 +++++----- lib/features/yojna/screens/pmsby_screen.dart | 83 ++++++++++--------- lib/l10n/app_en.arb | 60 +++++++++++++- lib/l10n/app_hi.arb | 59 ++++++++++++- 9 files changed, 303 insertions(+), 161 deletions(-) diff --git a/lib/features/yojna/screens/apy_screen.dart b/lib/features/yojna/screens/apy_screen.dart index fc55650..4c81836 100644 --- a/lib/features/yojna/screens/apy_screen.dart +++ b/lib/features/yojna/screens/apy_screen.dart @@ -46,9 +46,10 @@ class _APYScreenState extends State { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); return Scaffold( appBar: AppBar( - title: const Text('APY registration'), + title: Text(l10n.apyRegistration), centerTitle: false, ), body: SingleChildScrollView( @@ -61,7 +62,7 @@ class _APYScreenState extends State { child: Padding( padding: const EdgeInsets.all(16.0), child: Text( - "Atal Pension Yojana (APY) is a periodic contribution-based pension scheme for citizens of India.", + l10n.apyDescription, style: Theme.of(context).textTheme.titleMedium, ), ), @@ -77,7 +78,7 @@ class _APYScreenState extends State { DropdownButtonFormField( value: _selectedAccount, decoration: InputDecoration( - labelText: AppLocalizations.of(context).accountNumber, + labelText: l10n.accountNumber, border: const OutlineInputBorder(), contentPadding: const EdgeInsets.symmetric( vertical: 20, horizontal: 12), @@ -95,8 +96,7 @@ class _APYScreenState extends State { }, validator: (value) { if (value == null) { - return AppLocalizations.of(context) - .accountNumberRequired; + return l10n.accountNumberRequired; } return null; }, diff --git a/lib/features/yojna/screens/gov_scheme_screen.dart b/lib/features/yojna/screens/gov_scheme_screen.dart index 46b7136..30340f6 100644 --- a/lib/features/yojna/screens/gov_scheme_screen.dart +++ b/lib/features/yojna/screens/gov_scheme_screen.dart @@ -20,9 +20,10 @@ class GovSchemeScreen extends StatefulWidget { class _GovSchemeScreenState extends State { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); return Scaffold( appBar: AppBar( - title: const Text('Government Schemes'), + title: Text(l10n.governmentSchemes), ), body: Stack( children: [ @@ -34,8 +35,8 @@ class _GovSchemeScreenState extends State { Expanded( child: GovSchemeTile( logoText: "PMJJBY/PMSBY", - label: "Pradhan Mantri Yojana", - subtitle: "Enroll in Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY) and Pradhan Mantri Suraksha Bima Yojana (PMSBY) insurance schemes", + label: l10n.pradhanMantriYojana, + subtitle: l10n.enrollPMJJBYPMSBY, onTap: () { Navigator.push( context, @@ -52,8 +53,8 @@ class _GovSchemeScreenState extends State { Expanded( child: GovSchemeTile( logoText: "APY", - label: "Register for Atal Pension Yojana", - subtitle: "Secure your future with Atal Pension Yojana (APY) retirement scheme. Register in a few steps.", + label: l10n.registerForAtalPensionYojana, + subtitle: l10n.secureYourFutureAPY, onTap: () { Navigator.push( context, diff --git a/lib/features/yojna/screens/pm_main_screen.dart b/lib/features/yojna/screens/pm_main_screen.dart index 67d6f2f..3f5c146 100644 --- a/lib/features/yojna/screens/pm_main_screen.dart +++ b/lib/features/yojna/screens/pm_main_screen.dart @@ -26,9 +26,9 @@ class _PMMainScreenState extends State { List _filteredUsers = []; String? _selectedScheme; - final List _schemes = [ - 'Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY)', - 'Pradhan Mantri Suraksha Bima Yojana (PMSBY)', + List _getSchemes(AppLocalizations l10n) => [ + l10n.pmjjbyFull, + l10n.pmsbyFull, ]; @override @@ -61,33 +61,34 @@ class _PMMainScreenState extends State { } Future _handleCreate() async { + final l10n = AppLocalizations.of(context); if (_selectedAccount == null) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select account number')), + SnackBar(content: Text(l10n.pleaseSelectAccountNumber)), ); return; } if (_selectedScheme == null) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select a scheme first')), + SnackBar(content: Text(l10n.pleaseSelectSchemeFirst)), ); return; } - final String schemeCode = _selectedScheme!.contains('PMJJBY') ? '02' : '01'; + final String schemeCode = (_selectedScheme == l10n.pmjjbyFull) ? '02' : '01'; // Show loading ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( + SnackBar( content: Row( children: [ - CircularProgressIndicator(), - SizedBox(width: 16), - Text('Fetching details...'), + const CircularProgressIndicator(), + const SizedBox(width: 16), + Text(l10n.fetchingDetails), ], ), - duration: Duration(seconds: 2), + duration: const Duration(seconds: 2), ), ); @@ -111,40 +112,41 @@ class _PMMainScreenState extends State { context, MaterialPageRoute( builder: (context) { - if (_selectedScheme!.contains('PMJJBY')) { - return PMJJBYScreen(initialData: data); + if (_selectedScheme == l10n.pmjjbyFull) { + return PMJJBYScreen(initialData: data!); } else { - return PMSBYScreen(initialData: data); + return PMSBYScreen(initialData: data!); } }, ), ); } else { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Failed to fetch details or no data found.')), + SnackBar(content: Text(l10n.failedToFetchDetails)), ); } } } catch (e) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Error: ${e.toString()}')), + SnackBar(content: Text(l10n.genericError(e.toString()))), ); } } } void _handleEnquiry() { + final l10n = AppLocalizations.of(context); if (_selectedAccount == null) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select account number')), + SnackBar(content: Text(l10n.pleaseSelectAccountNumber)), ); return; } if (_selectedScheme == null) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select a scheme first')), + SnackBar(content: Text(l10n.pleaseSelectSchemeFirst)), ); return; } @@ -153,7 +155,7 @@ class _PMMainScreenState extends State { context, MaterialPageRoute( builder: (context) { - if (_selectedScheme!.contains('PMJJBY')) { + if (_selectedScheme == l10n.pmjjbyFull) { return PMJJBYEnquiryScreen(cifNumber: _selectedAccount!.cifNumber); } else { return PMSBYEnquiryScreen(cifNumber: _selectedAccount!.cifNumber); @@ -165,9 +167,22 @@ class _PMMainScreenState extends State { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); + final schemes = _getSchemes(l10n); + + // Ensure _selectedScheme is valid if it was set in a different language + if (_selectedScheme != null && !schemes.contains(_selectedScheme)) { + // Try to find the corresponding scheme in the new language + // This is a bit tricky, but since we only have two: + // If it doesn't match, it might be from the other language. + // For simplicity, we can just reset it or try to guess. + // Better to use non-localized values for the state, but let's just reset for now if it doesn't match + _selectedScheme = null; + } + return Scaffold( appBar: AppBar( - title: const Text('Pradhan Mantri Yojana'), + title: Text(l10n.pradhanMantriYojana), centerTitle: false, ), body: SingleChildScrollView( @@ -180,7 +195,7 @@ class _PMMainScreenState extends State { child: Padding( padding: const EdgeInsets.all(16.0), child: Text( - "Create and Enquire about your Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY) and Pradhan Mantri Suraksha Bima Yojana(PMSBY) schemes.", + l10n.pmjjbyPmsbyDescription, style: Theme.of(context).textTheme.titleMedium, ), ), @@ -196,7 +211,7 @@ class _PMMainScreenState extends State { DropdownButtonFormField( value: _selectedAccount, decoration: InputDecoration( - labelText: AppLocalizations.of(context).accountNumber, + labelText: l10n.accountNumber, border: const OutlineInputBorder(), contentPadding: const EdgeInsets.symmetric( vertical: 20, horizontal: 12), @@ -214,8 +229,7 @@ class _PMMainScreenState extends State { }, validator: (value) { if (value == null) { - return AppLocalizations.of(context) - .accountNumberRequired; + return l10n.accountNumberRequired; } return null; }, @@ -226,14 +240,14 @@ class _PMMainScreenState extends State { isExpanded: true, isDense: false, itemHeight: null, - decoration: const InputDecoration( - labelText: 'Select Scheme', - border: OutlineInputBorder(), + decoration: InputDecoration( + labelText: l10n.selectScheme, + border: const OutlineInputBorder(), contentPadding: - EdgeInsets.symmetric(vertical: 12, horizontal: 12), + const EdgeInsets.symmetric(vertical: 12, horizontal: 12), ), selectedItemBuilder: (BuildContext context) { - return _schemes.map((String scheme) { + return schemes.map((String scheme) { return Container( alignment: Alignment.centerLeft, child: Text( @@ -246,7 +260,7 @@ class _PMMainScreenState extends State { ); }).toList(); }, - items: _schemes.map((String scheme) { + items: schemes.map((String scheme) { return DropdownMenuItem( value: scheme, child: Padding( @@ -287,9 +301,9 @@ class _PMMainScreenState extends State { borderRadius: BorderRadius.circular(8), ), ), - child: const Text( - "Create", - style: TextStyle(fontWeight: FontWeight.bold), + child: Text( + l10n.create, + style: const TextStyle(fontWeight: FontWeight.bold), ), ), ), @@ -309,7 +323,7 @@ class _PMMainScreenState extends State { ), ), child: Text( - AppLocalizations.of(context).enquiry, + l10n.enquiry, style: const TextStyle(fontWeight: FontWeight.bold), ), ), diff --git a/lib/features/yojna/screens/pmjjby_enquiry_screen.dart b/lib/features/yojna/screens/pmjjby_enquiry_screen.dart index 2d8de92..0f54809 100644 --- a/lib/features/yojna/screens/pmjjby_enquiry_screen.dart +++ b/lib/features/yojna/screens/pmjjby_enquiry_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:kmobile/api/services/yojna_service.dart'; import 'package:kmobile/di/injection.dart'; +import 'package:kmobile/l10n/app_localizations.dart'; class PMJJBYEnquiryScreen extends StatefulWidget { final String? cifNumber; @@ -35,6 +36,7 @@ class _PMJJBYEnquiryScreenState extends State { } Future _fetchEnquiryData() async { + final l10n = AppLocalizations.of(context); if (_selectedFinancialYear == null || widget.cifNumber == null) return; setState(() { @@ -56,19 +58,19 @@ class _PMJJBYEnquiryScreenState extends State { setState(() { if (response is Map) { if (response['status'] == 'FAILED') { - _errorMessage = response['message'] ?? 'No record found'; + _errorMessage = response['message'] ?? l10n.noRecordFound; } else { _enquiryData = response; } } else if (response is List && response.isNotEmpty) { _enquiryData = response[0] as Map; } else { - _errorMessage = 'No data found for the selected year.'; + _errorMessage = l10n.noDataFoundYear; } }); } catch (e) { setState(() { - _errorMessage = 'Error: ${e.toString()}'; + _errorMessage = l10n.genericError(e.toString()); }); } finally { setState(() { @@ -79,9 +81,10 @@ class _PMJJBYEnquiryScreenState extends State { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); return Scaffold( appBar: AppBar( - title: const Text('PMJJBY details'), + title: Text(l10n.pmjjbyDetails), ), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), @@ -100,9 +103,9 @@ class _PMJJBYEnquiryScreenState extends State { ListTile( contentPadding: EdgeInsets.zero, leading: const Icon(Icons.person, color: Colors.blue), - title: const Text('CIF Number'), + title: Text(l10n.cifNumber), subtitle: Text( - widget.cifNumber ?? 'N/A', + widget.cifNumber ?? l10n.notApplicable, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16, @@ -112,11 +115,11 @@ class _PMJJBYEnquiryScreenState extends State { const SizedBox(height: 16), DropdownButtonFormField( value: _selectedFinancialYear, - decoration: const InputDecoration( - labelText: 'Select Financial Year', - border: OutlineInputBorder(), - prefixIcon: Icon(Icons.calendar_today), - contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: InputDecoration( + labelText: l10n.selectFinancialYear, + border: const OutlineInputBorder(), + prefixIcon: const Icon(Icons.calendar_today), + contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), ), items: _financialYears.map((String year) { return DropdownMenuItem( @@ -167,20 +170,20 @@ class _PMJJBYEnquiryScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Scheme Details', + l10n.schemeDetails, style: Theme.of(context).textTheme.titleLarge?.copyWith( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary, ), ), const Divider(), - _buildDetailRow('Customer Name', _enquiryData!['customername']), - _buildDetailRow('Policy Number', _enquiryData!['policynumber']), - _buildDetailRow('Account Number', _enquiryData!['accountno']), - _buildDetailRow('Premium Amount', _enquiryData!['preimiumamount']), - _buildDetailRow('Nominee Name', _enquiryData!['nomineename']), - _buildDetailRow('Transaction Date', _enquiryData!['transactiondate']), - _buildDetailRow('Journal No', _enquiryData!['journalno']), + _buildDetailRow(l10n.customerName, _enquiryData!['customername']), + _buildDetailRow(l10n.policyNumber, _enquiryData!['policynumber']), + _buildDetailRow(l10n.accountNumber, _enquiryData!['accountno']), + _buildDetailRow(l10n.premiumAmount, _enquiryData!['preimiumamount']), + _buildDetailRow(l10n.nomineeName, _enquiryData!['nomineename']), + _buildDetailRow(l10n.date, _enquiryData!['transactiondate']), + _buildDetailRow(l10n.journalNo, _enquiryData!['journalno']), ], ), ), @@ -203,7 +206,7 @@ class _PMJJBYEnquiryScreenState extends State { ), Flexible( child: Text( - value?.toString() ?? 'N/A', + value?.toString() ?? AppLocalizations.of(context).notApplicable, style: const TextStyle(fontWeight: FontWeight.bold), textAlign: TextAlign.end, ), diff --git a/lib/features/yojna/screens/pmjjby_screen.dart b/lib/features/yojna/screens/pmjjby_screen.dart index 80bd008..6049326 100644 --- a/lib/features/yojna/screens/pmjjby_screen.dart +++ b/lib/features/yojna/screens/pmjjby_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:kmobile/api/services/yojna_service.dart'; import 'package:kmobile/di/injection.dart'; +import 'package:kmobile/l10n/app_localizations.dart'; class PMJJBYScreen extends StatefulWidget { final Map? initialData; @@ -141,6 +142,7 @@ class _PMJJBYScreenState extends State { } Future _handleRegister() async { + final l10n = AppLocalizations.of(context); // Show loading spinner showDialog( context: context, @@ -179,7 +181,7 @@ class _PMJJBYScreenState extends State { ); String x = response.toString(); if(x.contains('RECORD ALREADY EXISTS')){ - x= "A record already exists for this request. Your submission has been registered previously."; + x= l10n.recordAlreadyExists; } if (mounted) { @@ -190,14 +192,14 @@ class _PMJJBYScreenState extends State { context: context, barrierDismissible: false, builder: (context) => AlertDialog( - title: const Text('Response'), + title: Text(l10n.response), content: SingleChildScrollView(child: Text(x)), actions: [ TextButton( onPressed: () { Navigator.of(context).popUntil((route) => route.isFirst); }, - child: const Text('Close'), + child: Text(l10n.close), ), ], ), @@ -207,7 +209,7 @@ class _PMJJBYScreenState extends State { if (mounted) { Navigator.pop(context); // Close loading spinner ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Error: ${e.toString()}')), + SnackBar(content: Text(l10n.genericError(e.toString()))), ); } } @@ -215,9 +217,10 @@ class _PMJJBYScreenState extends State { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); return Scaffold( appBar: AppBar( - title: const Text('PMJJBY Registration'), + title: Text(l10n.pmjjbyRegistration), ), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), @@ -226,38 +229,38 @@ class _PMJJBYScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - _buildTextField(_nameController, 'Customer Name', readOnly: _isFetched('customername')), - _buildTextField(_customerNoController, 'Customer No', readOnly: _isFetched('customerno')), - _buildTextField(_accountNoController, 'Account No', keyboardType: TextInputType.number, readOnly: _isFetched('accountno')), - _buildTextField(_balanceController, 'Available Balance', keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')), - _buildTextField(_aadhaarController, 'Aadhaar No', keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')), - _buildTextField(_dobController, 'Customer DOB (DD/MM/YYYY)', readOnly: _isFetched('customerdob')), - _buildTextField(_genderController, 'Gender', readOnly: _isFetched('gender')), - _buildTextField(_marriedController, 'Married (Yes/No)', readOnly: _isFetched('married')), - _buildTextField(_mobileController, 'Mobile No', keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')), + _buildTextField(_nameController, l10n.customerName, readOnly: _isFetched('customername')), + _buildTextField(_customerNoController, l10n.customerNo, readOnly: _isFetched('customerno')), + _buildTextField(_accountNoController, l10n.accountNumber, keyboardType: TextInputType.number, readOnly: _isFetched('accountno')), + _buildTextField(_balanceController, l10n.availableBalance, keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')), + _buildTextField(_aadhaarController, l10n.aadhaarNo, keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')), + _buildTextField(_dobController, l10n.customerDobFormat, readOnly: _isFetched('customerdob')), + _buildTextField(_genderController, l10n.gender, readOnly: _isFetched('gender')), + _buildTextField(_marriedController, l10n.marriedYesNo, readOnly: _isFetched('married')), + _buildTextField(_mobileController, l10n.mobileNumber, keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')), _buildTextField(_emailController, 'Email ID', keyboardType: TextInputType.emailAddress, readOnly: _isFetched('emailid')), - _buildTextField(_panController, 'PAN', readOnly: _isFetched('pan')), - _buildTextField(_ifscController, 'IFSC Code', readOnly: _isFetched('ifsccode')), - _buildTextField(_acctOpeningDateController, 'Date of Acct Opening', readOnly: _isFetched('dateofacctopening')), - _buildTextField(_pincodeController, 'Pincode', keyboardType: TextInputType.number, readOnly: _isFetched('pincode')), - _buildTextField(_stateController, 'State', readOnly: _isFetched('state')), - _buildTextField(_countryController, 'Country', readOnly: _isFetched('country')), - _buildDropdownField(_ruralCategoryController, 'Rural Category', _ruralOptions, readOnly: _isFetched('ruralcategory')), + _buildTextField(_panController, l10n.pan, readOnly: _isFetched('pan')), + _buildTextField(_ifscController, l10n.ifscCode, readOnly: _isFetched('ifsccode')), + _buildTextField(_acctOpeningDateController, l10n.dateOfAcctOpening, readOnly: _isFetched('dateofacctopening')), + _buildTextField(_pincodeController, l10n.pincode, keyboardType: TextInputType.number, readOnly: _isFetched('pincode')), + _buildTextField(_stateController, l10n.state, readOnly: _isFetched('state')), + _buildTextField(_countryController, l10n.country, readOnly: _isFetched('country')), + _buildDropdownField(_ruralCategoryController, l10n.ruralCategory, _ruralOptions, readOnly: _isFetched('ruralcategory')), const Divider(height: 32), - const Text('Policy Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), + Text(l10n.policyDetails, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), const SizedBox(height: 16), - _buildTextField(_policyNumberController, 'Policy Number', readOnly: _isFetched('policynumber')), - _buildTextField(_premiumAmountController, 'Premium Amount', keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')), - _buildTextField(_financialYearController, 'Financial Year', readOnly: _isFetched('financialyear')), - _buildDropdownField(_healthStatusController, 'Health Status', _healthStatusOptions), - _buildTextField(_collectionChannelController, 'Collection Channel'), + _buildTextField(_policyNumberController, l10n.policyNumber, readOnly: _isFetched('policynumber')), + _buildTextField(_premiumAmountController, l10n.premiumAmount, keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')), + _buildTextField(_financialYearController, l10n.financialYear, readOnly: _isFetched('financialyear')), + _buildDropdownField(_healthStatusController, l10n.healthStatus, _healthStatusOptions), + _buildTextField(_collectionChannelController, l10n.collectionChannel), const Divider(height: 32), - const Text('Nominee Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), + Text(l10n.nomineeDetails, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), const SizedBox(height: 16), - _buildTextField(_nomineeNameController, 'Nominee Name'), - _buildTextField(_nomineeAddressController, 'Nominee Address'), - _buildDropdownField(_nomineeRelationshipController, 'Nominee Relationship', _relationshipOptions, readOnly: _isFetched('nomineerelationship')), - _buildDropdownField(_nomineeMinorController, 'Nominee Minor', _minorOptions, readOnly: _isFetched('nomineeminor')), + _buildTextField(_nomineeNameController, l10n.nomineeName), + _buildTextField(_nomineeAddressController, l10n.nomineeAddress), + _buildDropdownField(_nomineeRelationshipController, l10n.nomineeRelationship, _relationshipOptions, readOnly: _isFetched('nomineerelationship')), + _buildDropdownField(_nomineeMinorController, l10n.nomineeMinor, _minorOptions, readOnly: _isFetched('nomineeminor')), const SizedBox(height: 24), ElevatedButton( onPressed: _handleRegister, @@ -269,9 +272,9 @@ class _PMJJBYScreenState extends State { borderRadius: BorderRadius.circular(8), ), ), - child: const Text( - 'Register', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + child: Text( + l10n.register, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), ), const SizedBox(height: 32), diff --git a/lib/features/yojna/screens/pmsby_enquiry_screen.dart b/lib/features/yojna/screens/pmsby_enquiry_screen.dart index 63e3a37..33961cc 100644 --- a/lib/features/yojna/screens/pmsby_enquiry_screen.dart +++ b/lib/features/yojna/screens/pmsby_enquiry_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:kmobile/api/services/yojna_service.dart'; import 'package:kmobile/di/injection.dart'; +import 'package:kmobile/l10n/app_localizations.dart'; class PMSBYEnquiryScreen extends StatefulWidget { final String? cifNumber; @@ -35,6 +36,7 @@ class _PMSBYEnquiryScreenState extends State { } Future _fetchEnquiryData() async { + final l10n = AppLocalizations.of(context); if (_selectedFinancialYear == null || widget.cifNumber == null) return; setState(() { @@ -56,19 +58,19 @@ class _PMSBYEnquiryScreenState extends State { setState(() { if (response is Map) { if (response['status'] == 'FAILED') { - _errorMessage = response['message'] ?? 'No record found'; + _errorMessage = response['message'] ?? l10n.noRecordFound; } else { _enquiryData = response; } } else if (response is List && response.isNotEmpty) { _enquiryData = response[0] as Map; } else { - _errorMessage = 'No data found for the selected year.'; + _errorMessage = l10n.noDataFoundYear; } }); } catch (e) { setState(() { - _errorMessage = 'Error: ${e.toString()}'; + _errorMessage = l10n.genericError(e.toString()); }); } finally { setState(() { @@ -79,9 +81,10 @@ class _PMSBYEnquiryScreenState extends State { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); return Scaffold( appBar: AppBar( - title: const Text('PMSBY details'), + title: Text(l10n.pmsbyDetails), ), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), @@ -100,9 +103,9 @@ class _PMSBYEnquiryScreenState extends State { ListTile( contentPadding: EdgeInsets.zero, leading: const Icon(Icons.person, color: Colors.blue), - title: const Text('CIF Number'), + title: Text(l10n.cifNumber), subtitle: Text( - widget.cifNumber ?? 'N/A', + widget.cifNumber ?? l10n.notApplicable, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16, @@ -112,11 +115,11 @@ class _PMSBYEnquiryScreenState extends State { const SizedBox(height: 16), DropdownButtonFormField( value: _selectedFinancialYear, - decoration: const InputDecoration( - labelText: 'Select Financial Year', - border: OutlineInputBorder(), - prefixIcon: Icon(Icons.calendar_today), - contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: InputDecoration( + labelText: l10n.selectFinancialYear, + border: const OutlineInputBorder(), + prefixIcon: const Icon(Icons.calendar_today), + contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), ), items: _financialYears.map((String year) { return DropdownMenuItem( @@ -167,20 +170,20 @@ class _PMSBYEnquiryScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Scheme Details', + l10n.schemeDetails, style: Theme.of(context).textTheme.titleLarge?.copyWith( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary, ), ), const Divider(), - _buildDetailRow('Customer Name', _enquiryData!['customername']), - _buildDetailRow('Policy Number', _enquiryData!['policynumber'] ?? _enquiryData!['policyno']), - _buildDetailRow('Account Number', _enquiryData!['accountno']), - _buildDetailRow('Premium Amount', _enquiryData!['preimiumamount'] ?? _enquiryData!['premiumamount']), - _buildDetailRow('Nominee Name', _enquiryData!['nomineename']), - _buildDetailRow('Transaction Date', _enquiryData!['transactiondate']), - _buildDetailRow('Journal No', _enquiryData!['journalno']), + _buildDetailRow(l10n.customerName, _enquiryData!['customername']), + _buildDetailRow(l10n.policyNumber, _enquiryData!['policynumber'] ?? _enquiryData!['policyno']), + _buildDetailRow(l10n.accountNumber, _enquiryData!['accountno']), + _buildDetailRow(l10n.premiumAmount, _enquiryData!['preimiumamount'] ?? _enquiryData!['premiumamount']), + _buildDetailRow(l10n.nomineeName, _enquiryData!['nomineename']), + _buildDetailRow(l10n.date, _enquiryData!['transactiondate']), + _buildDetailRow(l10n.journalNo, _enquiryData!['journalno']), ], ), ), @@ -203,7 +206,7 @@ class _PMSBYEnquiryScreenState extends State { ), Flexible( child: Text( - value?.toString() ?? 'N/A', + value?.toString() ?? AppLocalizations.of(context).notApplicable, style: const TextStyle(fontWeight: FontWeight.bold), textAlign: TextAlign.end, ), diff --git a/lib/features/yojna/screens/pmsby_screen.dart b/lib/features/yojna/screens/pmsby_screen.dart index 8116cd2..23f0023 100644 --- a/lib/features/yojna/screens/pmsby_screen.dart +++ b/lib/features/yojna/screens/pmsby_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:kmobile/api/services/yojna_service.dart'; import 'package:kmobile/di/injection.dart'; +import 'package:kmobile/l10n/app_localizations.dart'; class PMSBYScreen extends StatefulWidget { final Map? initialData; @@ -151,6 +152,7 @@ class _PMSBYScreenState extends State { } Future _handleRegister() async { + final l10n = AppLocalizations.of(context); // Show loading spinner showDialog( context: context, @@ -191,7 +193,7 @@ class _PMSBYScreenState extends State { ); String x = response.toString(); if(x.contains('RECORD ALREADY EXISTS')){ - x= "A record already exists for this request. Your submission has been registered previously."; + x= l10n.recordAlreadyExists; } if (mounted) { @@ -202,14 +204,14 @@ class _PMSBYScreenState extends State { context: context, barrierDismissible: false, builder: (context) => AlertDialog( - title: const Text('Response'), + title: Text(l10n.response), content: SingleChildScrollView(child: Text(x)), actions: [ TextButton( onPressed: () { Navigator.of(context).popUntil((route) => route.isFirst); }, - child: const Text('Close'), + child: Text(l10n.close), ), ], ), @@ -219,7 +221,7 @@ class _PMSBYScreenState extends State { if (mounted) { Navigator.pop(context); // Close loading spinner ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Error: ${e.toString()}')), + SnackBar(content: Text(l10n.genericError(e.toString()))), ); } } @@ -227,9 +229,10 @@ class _PMSBYScreenState extends State { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); return Scaffold( appBar: AppBar( - title: const Text('PMSBY Registration'), + title: Text(l10n.pmsbyRegistration), ), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), @@ -238,43 +241,43 @@ class _PMSBYScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - _buildTextField(_nameController, 'Customer Name', readOnly: _isFetched('customername')), - _buildTextField(_customerNoController, 'Customer No', readOnly: _isFetched('customerno')), - _buildTextField(_accountNoController, 'Account No', keyboardType: TextInputType.number, readOnly: _isFetched('accountno')), - _buildTextField(_balanceController, 'Available Balance', keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')), - _buildTextField(_aadhaarController, 'Aadhaar No', keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')), - _buildTextField(_dobController, 'Customer DOB (DD/MM/YYYY)', readOnly: _isFetched('customerdob')), - _buildTextField(_genderController, 'Gender', readOnly: _isFetched('gender')), - _buildTextField(_marriedController, 'Married (Yes/No)', readOnly: _isFetched('married')), - _buildTextField(_mobileController, 'Mobile No', keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')), + _buildTextField(_nameController, l10n.customerName, readOnly: _isFetched('customername')), + _buildTextField(_customerNoController, l10n.customerNo, readOnly: _isFetched('customerno')), + _buildTextField(_accountNoController, l10n.accountNumber, keyboardType: TextInputType.number, readOnly: _isFetched('accountno')), + _buildTextField(_balanceController, l10n.availableBalance, keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')), + _buildTextField(_aadhaarController, l10n.aadhaarNo, keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')), + _buildTextField(_dobController, l10n.customerDobFormat, readOnly: _isFetched('customerdob')), + _buildTextField(_genderController, l10n.gender, readOnly: _isFetched('gender')), + _buildTextField(_marriedController, l10n.marriedYesNo, readOnly: _isFetched('married')), + _buildTextField(_mobileController, l10n.mobileNumber, keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')), _buildTextField(_emailController, 'Email ID', keyboardType: TextInputType.emailAddress, readOnly: _isFetched('emailid')), - _buildTextField(_address1Controller, 'Address 1', readOnly: _isFetched('address1')), - _buildTextField(_address2Controller, 'Address 2', readOnly: _isFetched('address2')), - _buildTextField(_cityController, 'City', readOnly: _isFetched('city')), - _buildTextField(_panController, 'PAN', readOnly: _isFetched('pan')), - _buildTextField(_ifscController, 'IFSC Code', readOnly: _isFetched('ifsccode')), - _buildTextField(_acctOpeningDateController, 'Date of Acct Opening', readOnly: _isFetched('dateofacctopening')), - _buildTextField(_pincodeController, 'Pincode', keyboardType: TextInputType.number, readOnly: _isFetched('pincode')), - _buildTextField(_stateController, 'State', readOnly: _isFetched('state')), - _buildTextField(_countryController, 'Country', readOnly: _isFetched('country')), - _buildDropdownField(_ruralCategoryController, 'Rural Category', _ruralOptions, readOnly: _isFetched('ruralcategory')), + _buildTextField(_address1Controller, l10n.address1, readOnly: _isFetched('address1')), + _buildTextField(_address2Controller, l10n.address2, readOnly: _isFetched('address2')), + _buildTextField(_cityController, l10n.city, readOnly: _isFetched('city')), + _buildTextField(_panController, l10n.pan, readOnly: _isFetched('pan')), + _buildTextField(_ifscController, l10n.ifscCode, readOnly: _isFetched('ifsccode')), + _buildTextField(_acctOpeningDateController, l10n.dateOfAcctOpening, readOnly: _isFetched('dateofacctopening')), + _buildTextField(_pincodeController, l10n.pincode, keyboardType: TextInputType.number, readOnly: _isFetched('pincode')), + _buildTextField(_stateController, l10n.state, readOnly: _isFetched('state')), + _buildTextField(_countryController, l10n.country, readOnly: _isFetched('country')), + _buildDropdownField(_ruralCategoryController, l10n.ruralCategory, _ruralOptions, readOnly: _isFetched('ruralcategory')), const Divider(height: 32), - const Text('Policy Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), + Text(l10n.policyDetails, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), const SizedBox(height: 16), - _buildTextField(_policyNumberController, 'Policy Number', readOnly: _isFetched('policyno')), - _buildTextField(_premiumAmountController, 'Premium Amount', keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')), - _buildTextField(_financialYearController, 'Financial Year', readOnly: _isFetched('financialyear')), - _buildTextField(_policyStatusController, 'Policy Status', readOnly: _isFetched('policystatus')), - _buildDropdownField(_healthStatusController, 'Health Status', _healthStatusOptions), - _buildTextField(_collectionChannelController, 'Collection Channel'), + _buildTextField(_policyNumberController, l10n.policyNumber, readOnly: _isFetched('policyno')), + _buildTextField(_premiumAmountController, l10n.premiumAmount, keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')), + _buildTextField(_financialYearController, l10n.financialYear, readOnly: _isFetched('financialyear')), + _buildTextField(_policyStatusController, l10n.policyStatus, readOnly: _isFetched('policystatus')), + _buildDropdownField(_healthStatusController, l10n.healthStatus, _healthStatusOptions), + _buildTextField(_collectionChannelController, l10n.collectionChannel), const Divider(height: 32), - const Text('Nominee Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), + Text(l10n.nomineeDetails, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), const SizedBox(height: 16), - _buildTextField(_nomineeNameController, 'Nominee Name'), - _buildTextField(_nomineeAddressController, 'Nominee Address'), - _buildDropdownField(_relationWithNomineeController, 'Relation with Nominee', _relationshipOptions, readOnly: _isFetched('relationwithnominee')), - _buildTextField(_nomineeRelationshipController, 'Nominee Relationship'), - _buildDropdownField(_nomineeMinorController, 'Nominee Minor', _minorOptions, readOnly: _isFetched('nomineeminor')), + _buildTextField(_nomineeNameController, l10n.nomineeName), + _buildTextField(_nomineeAddressController, l10n.nomineeAddress), + _buildDropdownField(_relationWithNomineeController, l10n.relationWithNominee, _relationshipOptions, readOnly: _isFetched('relationwithnominee')), + _buildTextField(_nomineeRelationshipController, l10n.nomineeRelationship), + _buildDropdownField(_nomineeMinorController, l10n.nomineeMinor, _minorOptions, readOnly: _isFetched('nomineeminor')), const SizedBox(height: 24), ElevatedButton( onPressed: _handleRegister, @@ -286,9 +289,9 @@ class _PMSBYScreenState extends State { borderRadius: BorderRadius.circular(8), ), ), - child: const Text( - 'Register', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + child: Text( + l10n.register, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), ), const SizedBox(height: 32), diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 6e288b9..84f63ec 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -592,5 +592,63 @@ "chequeStolen": "Cheque Stolen", "chequeMissing": "Cheque Missing", "chequeDamaged": "Cheque Damaged", - "close": "Close" + "close": "Close", + "governmentSchemes": "Government Schemes", + "pradhanMantriYojana": "Pradhan Mantri Yojana", + "atalPensionYojana": "Atal Pension Yojana", + "registerForAtalPensionYojana": "Register for Atal Pension Yojana", + "secureYourFutureAPY": "Secure your future with Atal Pension Yojana (APY) retirement scheme. Register in a few steps.", + "enrollPMJJBYPMSBY": "Enroll in Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY) and Pradhan Mantri Suraksha Bima Yojana (PMSBY) insurance schemes", + "apyRegistration": "APY registration", + "apyDescription": "Atal Pension Yojana (APY) is a periodic contribution-based pension scheme for citizens of India.", + "pmjjbyPmsbyDescription": "Create and Enquire about your Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY) and Pradhan Mantri Suraksha Bima Yojana(PMSBY) schemes.", + "selectScheme": "Select Scheme", + "pmjjbyFull": "Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY)", + "pmsbyFull": "Pradhan Mantri Suraksha Bima Yojana (PMSBY)", + "create": "Create", + "pleaseSelectAccountNumber": "Please select account number", + "pleaseSelectSchemeFirst": "Please select a scheme first", + "fetchingDetails": "Fetching details...", + "failedToFetchDetails": "Failed to fetch details or no data found.", + "pmjjbyDetails": "PMJJBY details", + "pmsbyDetails": "PMSBY details", + "cifNumber": "CIF Number", + "selectFinancialYear": "Select Financial Year", + "schemeDetails": "Scheme Details", + "customerName": "Customer Name", + "policyNumber": "Policy Number", + "premiumAmount": "Premium Amount", + "nomineeName": "Nominee Name", + "journalNo": "Journal No", + "noRecordFound": "No record found", + "noDataFoundYear": "No data found for the selected year.", + "pmjjbyRegistration": "PMJJBY Registration", + "pmsbyRegistration": "PMSBY Registration", + "customerNo": "Customer No", + "aadhaarNo": "Aadhaar No", + "customerDobFormat": "Customer DOB (DD/MM/YYYY)", + "gender": "Gender", + "marriedYesNo": "Married (Yes/No)", + "pan": "PAN", + "dateOfAcctOpening": "Date of Acct Opening", + "pincode": "Pincode", + "state": "State", + "country": "Country", + "ruralCategory": "Rural Category", + "policyDetails": "Policy Details", + "financialYear": "Financial Year", + "healthStatus": "Health Status", + "collectionChannel": "Collection Channel", + "nomineeDetails": "Nominee Details", + "nomineeAddress": "Nominee Address", + "nomineeRelationship": "Nominee Relationship", + "nomineeMinor": "Nominee Minor", + "response": "Response", + "recordAlreadyExists": "A record already exists for this request. Your submission has been registered previously.", + "address1": "Address 1", + "address2": "Address 2", + "city": "City", + "relationWithNominee": "Relation with Nominee", + "policyStatus": "Policy Status", + "emailId": "Email ID" } diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index 8400299..85159d6 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -593,5 +593,62 @@ "chequeStolen": "चेक चोरी हो गया", "chequeMissing": "चेक गायब है", "chequeDamaged": "चेक क्षतिग्रस्त है", - "close": "बंद करें" + "close": "बंद करें", + "governmentSchemes": "सरकारी योजनाएं", + "pradhanMantriYojana": "प्रधानमंत्री योजना", + "atalPensionYojana": "अटल पेंशन योजना", + "registerForAtalPensionYojana": "अटल पेंशन योजना के लिए पंजीकरण करें", + "secureYourFutureAPY": "अटल पेंशन योजना (APY) सेवानिवृत्ति योजना के साथ अपना भविष्य सुरक्षित करें। कुछ ही चरणों में पंजीकरण करें।", + "enrollPMJJBYPMSBY": "प्रधानमंत्री जीवन ज्योति बीमा योजना (PMJJBY) और प्रधानमंत्री सुरक्षा बीमा योजना (PMSBY) बीमा योजनाओं में नामांकन करें", + "apyRegistration": "APY पंजीकरण", + "apyDescription": "अटल पेंशन योजना (APY) भारत के नागरिकों के लिए एक आवधिक योगदान-आधारित पेंशन योजना है।", + "pmjjbyPmsbyDescription": "अपनी प्रधानमंत्री जीवन ज्योति बीमा योजना (PMJJBY) और प्रधानमंत्री सुरक्षा बीमा योजना (PMSBY) योजनाओं के बारे में बनाएं और पूछताछ करें।", + "selectScheme": "योजना चुनें", + "pmjjbyFull": "प्रधानमंत्री जीवन ज्योति बीमा योजना (PMJJBY)", + "pmsbyFull": "प्रधानमंत्री सुरक्षा बीमा योजना (PMSBY)", + "create": "बनाएं", + "pleaseSelectAccountNumber": "कृपया खाता संख्या चुनें", + "pleaseSelectSchemeFirst": "कृपया पहले एक योजना चुनें", + "fetchingDetails": "विवरण प्राप्त किया जा रहा है...", + "failedToFetchDetails": "विवरण प्राप्त करने में विफल या कोई डेटा नहीं मिला।", + "pmjjbyDetails": "PMJJBY विवरण", + "pmsbyDetails": "PMSBY विवरण", + "cifNumber": "CIF संख्या", + "selectFinancialYear": "वित्तीय वर्ष चुनें", + "schemeDetails": "योजना विवरण", + "customerName": "ग्राहक का नाम", + "policyNumber": "पॉलिसी संख्या", + "premiumAmount": "प्रीमियम राशि", + "nomineeName": "नामांकित व्यक्ति का नाम", + "journalNo": "जर्नल नंबर", + "noRecordFound": "कोई रिकॉर्ड नहीं मिला", + "noDataFoundYear": "चयनित वर्ष के लिए कोई डेटा नहीं मिला।", + "pmjjbyRegistration": "PMJJBY पंजीकरण", + "pmsbyRegistration": "PMSBY पंजीकरण", + "customerNo": "ग्राहक संख्या", + "aadhaarNo": "आधार संख्या", + "customerDobFormat": "ग्राहक की जन्म तिथि (DD/MM/YYYY)", + "gender": "लिंग", + "marriedYesNo": "विवाहित (हाँ/नहीं)", + "pan": "पैन", + "dateOfAcctOpening": "खाता खोलने की तिथि", + "pincode": "पिनकोड", + "state": "राज्य", + "country": "देश", + "ruralCategory": "ग्रामीण श्रेणी", + "policyDetails": "पॉलिसी विवरण", + "financialYear": "वित्तीय वर्ष", + "healthStatus": "स्वास्थ्य की स्थिति", + "collectionChannel": "संग्रह चैनल", + "nomineeDetails": "नामांकित व्यक्ति का विवरण", + "nomineeAddress": "नामांकित व्यक्ति का पता", + "nomineeRelationship": "नामांकित व्यक्ति से संबंध", + "nomineeMinor": "नामांकित व्यक्ति नाबालिग है", + "response": "प्रतिक्रिया", + "recordAlreadyExists": "इस अनुरोध के लिए एक रिकॉर्ड पहले से मौजूद है। आपका सबमिशन पहले पंजीकृत किया जा चुका है।", + "address1": "पता 1", + "address2": "पता 2", + "city": "शहर", + "relationWithNominee": "नामांकित व्यक्ति के साथ संबंध", + "policyStatus": "पॉलिसी की स्थिति" }