From 3fbeb606a841ee66f5f01de130c0c32595e107f1 Mon Sep 17 00:00:00 2001 From: Azmat-7860 Date: Sat, 3 Oct 2026 11:22:48 +0530 Subject: [PATCH] adding i18n to all other pages --- lib/l10n/app_en.arb | 325 +++++++- lib/l10n/app_hi.arb | 132 ++- lib/l10n/app_localizations.dart | 774 ++++++++++++++++++ lib/l10n/app_localizations_en.dart | 435 ++++++++++ lib/l10n/app_localizations_hi.dart | 435 ++++++++++ .../Attendance/attendance_service.dart | 14 +- lib/screens/Attendance/punch_screen.dart | 54 +- .../Barcode/Barcode_create_entity_screen.dart | 15 +- .../Qr_BarCode_create_entity_screen.dart | 35 +- .../Qrcode/Qrcode_create_entity_screen.dart | 15 +- .../tabbed_layout_component.dart | 9 +- .../profileManagement/Profilesettings.dart | 98 ++- lib/screens/profileManagement/about.dart | 8 +- .../profileManagement/changepassword.dart | 46 +- lib/screens/sign_up_screen/CreateAccount.dart | 78 +- lib/screens/sign_up_screen/CreateUser.dart | 84 +- .../sign_up_screen/RegistrationDetails.dart | 55 +- .../StepGetEmailVerification.dart | 6 +- .../sign_up_screen/StepGetRegistration.dart | 23 +- .../sign_up_screen/sign_up_step_1.dart | 62 +- lib/screens/sign_up_screen/sign_up_steps.dart | 35 +- .../sign_up_screen/step_createAccount.dart | 37 +- 22 files changed, 2526 insertions(+), 249 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index c931063..fff6704 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -82,5 +82,328 @@ "alreadyHaveAccount": "Already have an account? Sign in", "@alreadyHaveAccount": { "description": "Sign in link on signup" }, "language": "Language", - "@language": { "description": "Language section label" } + "@language": { "description": "Language section label" }, + "loginSuccessful": "Login Successful", + "@loginSuccessful": { "description": "Login success snackbar" }, + "createAccount": "Create Account", + "@createAccount": { "description": "Create account title" }, + "companyName": "Company Name", + "@companyName": { "description": "Company name label" }, + "mobileNumber": "Mobile Number", + "@mobileNumber": { "description": "Mobile number label" }, + "workspace": "Workspace", + "@workspace": { "description": "Workspace label" }, + "gstNumber": "Gst Number", + "@gstNumber": { "description": "GST number label" }, + "pancard": "pancard", + "@pancard": { "description": "Pancard label" }, + "workingField": "Working", + "@workingField": { "description": "Working label" }, + "pleaseEnterThis": "Please enter {label}", + "@pleaseEnterThis": { + "description": "Generic required-field validation", + "placeholders": { "label": { "type": "String" } } + }, + "enterThis": "Enter {label}", + "@enterThis": { + "description": "Generic input hint", + "placeholders": { "label": { "type": "String" } } + }, + "validEmailShort": "Please enter a valid email", + "@validEmailShort": { "description": "Short email validation" }, + "submitCaps": "SUBMIT", + "@submitCaps": { "description": "Submit button uppercase" }, + "accountCreationFailed": "Account Creation Failed: {error}", + "@accountCreationFailed": { + "description": "Account creation failure", + "placeholders": { "error": { "type": "String" } } + }, + "mobileNo": "Mobile No", + "@mobileNo": { "description": "Mobile number short label" }, + "step1CreateAccount": "Step 1: Create Account", + "@step1CreateAccount": { "description": "Signup step 1 header" }, + "previous": "Previous", + "@previous": { "description": "Previous button" }, + "next": "Next", + "@next": { "description": "Next button" }, + "signUpStep": "Sign Up - Step {step}", + "@signUpStep": { + "description": "Signup wizard title", + "placeholders": { "step": { "type": "String" } } + }, + "selectedAccountId": "Selected Account ID: {accountId}", + "@selectedAccountId": { + "description": "Selected account display", + "placeholders": { "accountId": { "type": "String" } } + }, + "step2EmailVerification": "Step 2: Get Email Verification", + "@step2EmailVerification": { "description": "Signup step 2 header" }, + "step3GetRegistration": "Step 3: Get Registration", + "@step3GetRegistration": { "description": "Signup step 3 header" }, + "accountCreatedSuccess": "Account created successfully!", + "@accountCreatedSuccess": { "description": "Account created message" }, + "registration": "Registration", + "@registration": { "description": "Registration title" }, + "firstName": "First Name", + "@firstName": { "description": "First name label" }, + "lastName": "Last Name", + "@lastName": { "description": "Last name label" }, + "newPassword": "New Password", + "@newPassword": { "description": "New password label" }, + "confirmPassword": "Confirm Password", + "@confirmPassword": { "description": "Confirm password label" }, + "addAccount": "Add Account", + "@addAccount": { "description": "Add account row" }, + "validPasswordShort": "Please enter a valid password", + "@validPasswordShort": { "description": "Short password validation" }, + "termsAgreePrefix": "By signing up you are agreeing to the ", + "@termsAgreePrefix": { "description": "Terms agreement prefix" }, + "termsConditions": "Terms & Conditions", + "@termsConditions": { "description": "Terms link" }, + "termsAndOur": " and our ", + "@termsAndOur": { "description": "Terms conjunction" }, + "eula": "End User License Agreement", + "@eula": { "description": "EULA link" }, + "processingPlain": "Processing", + "@processingPlain": { "description": "Processing without dots" }, + "createUser": "Create User", + "@createUser": { "description": "Create user title" }, + "enterYourEmail": "Enter Your Email", + "@enterYourEmail": { "description": "Your email hint" }, + "sendOtp": "Send OTP", + "@sendOtp": { "description": "Send OTP button" }, + "failedToSendOtp": "Failed to send OTP: {error}", + "@failedToSendOtp": { + "description": "Send OTP failure", + "placeholders": { "error": { "type": "String" } } + }, + "emailVerification": "Email Verification", + "@emailVerification": { "description": "Email verification header" }, + "otpSentToEmail": "A mail with a 6-digit verification code was just sent to {email}", + "@otpSentToEmail": { + "description": "OTP sent message", + "placeholders": { "email": { "type": "String" } } + }, + "emailVerifiedSuccess": "Email verified successfully", + "@emailVerifiedSuccess": { "description": "Email verified message" }, + "failedToVerifyOtp": "Failed to verify OTP: {error}", + "@failedToVerifyOtp": { + "description": "OTP verification failure", + "placeholders": { "error": { "type": "String" } } + }, + "otpResent": "OTP Resent", + "@otpResent": { "description": "OTP resent message" }, + "failedToResendOtp": "Failed to resend OTP: {error}", + "@failedToResendOtp": { + "description": "OTP resend failure", + "placeholders": { "error": { "type": "String" } } + }, + "forgotPasswordLink": "Forgot Password?", + "@forgotPasswordLink": { "description": "Forgot password link" }, + "didntGetCode": "Didn’t get the code?", + "@didntGetCode": { "description": "Resend prompt" }, + "resend": "Resend", + "@resend": { "description": "Resend button" }, + "goToRegistrationDetails": "Go to Registration Details", + "@goToRegistrationDetails": { "description": "Go to registration button" }, + "aboutUs": "About Us", + "@aboutUs": { "description": "About us title" }, + "aboutDescription": "Create a new project if you have access, if you don't have access, then contact the admin.", + "@aboutDescription": { "description": "About us body" }, + "resetPassword": "Reset Password", + "@resetPassword": { "description": "Reset password title" }, + "signedInAs": "You're signed in as {email}", + "@signedInAs": { + "description": "Signed in as message", + "placeholders": { "email": { "type": "String" } } + }, + "wrongAccount": "Wrong account? Log in instead.", + "@wrongAccount": { "description": "Wrong account link" }, + "enterOldPassword": "Enter Old Password", + "@enterOldPassword": { "description": "Old password label" }, + "oldPasswordError": "Please enter your old password", + "@oldPasswordError": { "description": "Old password validation" }, + "enterNewPassword": "Enter New Password", + "@enterNewPassword": { "description": "New password label" }, + "newPasswordError": "Please enter your new password", + "@newPasswordError": { "description": "New password validation" }, + "reEnterNewPassword": "Re-Enter New Password", + "@reEnterNewPassword": { "description": "Re-enter password label" }, + "reEnterPasswordError": "Please re-enter your new password", + "@reEnterPasswordError": { "description": "Re-enter validation" }, + "passwordsDontMatch": "Passwords do not match", + "@passwordsDontMatch": { "description": "Password mismatch" }, + "continueBtn": "Continue", + "@continueBtn": { "description": "Continue button" }, + "passwordChangedSuccess": "Password Changed Successfully", + "@passwordChangedSuccess": { "description": "Password changed message" }, + "incorrectPassword": "Incorrect Password", + "@incorrectPassword": { "description": "Incorrect password message" }, + "selectImage": "Please select an image.", + "@selectImage": { "description": "Select image prompt" }, + "profileImageUpdated": "Profile image updated", + "@profileImageUpdated": { "description": "Image updated message" }, + "failedUploadImage": "Failed to upload image: {error}", + "@failedUploadImage": { + "description": "Image upload failure", + "placeholders": { "error": { "type": "String" } } + }, + "userIdMissing": "User id missing, please re-login", + "@userIdMissing": { "description": "Missing user id message" }, + "profileUpdated": "Profile updated", + "@profileUpdated": { "description": "Profile updated message" }, + "failedUpdateProfile": "Failed to update profile: {code}", + "@failedUpdateProfile": { + "description": "Profile update failure", + "placeholders": { "code": { "type": "String" } } + }, + "failedUpdate": "Failed to update: {error}", + "@failedUpdate": { + "description": "Update failure", + "placeholders": { "error": { "type": "String" } } + }, + "myProfileSettings": "My Profile Settings", + "@myProfileSettings": { "description": "Profile settings title" }, + "pickProfilePhoto": "Pick a Profile Photo", + "@pickProfilePhoto": { "description": "Pick photo button" }, + "yourProfileInfo": "Your Profile Information", + "@yourProfileInfo": { "description": "Profile info header" }, + "yourFullName": "Your Full Name", + "@yourFullName": { "description": "Full name label" }, + "enterFullName": "Enter Full Name", + "@enterFullName": { "description": "Full name hint" }, + "enterFullNameError": "Please enter your full name", + "@enterFullNameError": { "description": "Full name validation" }, + "pronouns": "Pronouns", + "@pronouns": { "description": "Pronouns label" }, + "enterPronouns": "Enter Pronouns", + "@enterPronouns": { "description": "Pronouns hint" }, + "role": "Role", + "@role": { "description": "Role label" }, + "enterRole": "Enter Role", + "@enterRole": { "description": "Role hint" }, + "departmentOrTeam": "Department or Team", + "@departmentOrTeam": { "description": "Department label" }, + "enterDepartmentOrTeam": "Enter Department or Team", + "@enterDepartmentOrTeam": { "description": "Department hint" }, + "validEmailError": "Please enter a valid email address", + "@validEmailError": { "description": "Email validation" }, + "aboutMe": "About Me", + "@aboutMe": { "description": "About me label" }, + "updateProfile": "Update Profile", + "@updateProfile": { "description": "Update profile button" }, + "profilePasswordRow": "Password:Change Password for your account Change password", + "@profilePasswordRow": { "description": "Profile password row" }, + "profileSecurityRow": "Security:Logout of all sessions except this current browser Logout other sessions", + "@profileSecurityRow": { "description": "Profile security row" }, + "profileDeactivationRow": "Deactivation:Remove access to all organizations and workspace in cloudnsure Deactivate account", + "@profileDeactivationRow": { "description": "Profile deactivation row" }, + "loading": "Loading...", + "@loading": { "description": "Loading indicator" }, + "navHome": "Home", + "@navHome": { "description": "Home tab" }, + "navContacts": "Contacts", + "@navContacts": { "description": "Contacts tab" }, + "navWallet": "Wallet", + "@navWallet": { "description": "Wallet tab" }, + "dutySummary": "Duty summary", + "@dutySummary": { "description": "Duty summary dialog title" }, + "dutySummaryBody": "Points recorded: {points}\\nDistance (straight line): {km} km\\nRoad distance: coming in step 4 (free API).", + "@dutySummaryBody": { + "description": "Duty summary dialog body", + "placeholders": { "points": { "type": "String" }, "km": { "type": "String" } } + }, + "dutyPunch": "Duty Punch", + "@dutyPunch": { "description": "Duty punch title" }, + "pleaseWait": "Please wait...", + "@pleaseWait": { "description": "Busy button label" }, + "punchOut": "Punch Out", + "@punchOut": { "description": "Punch out button" }, + "punchIn": "Punch In", + "@punchIn": { "description": "Punch in button" }, + "punchedInTracking": "Punched in - tracking every 5 min", + "@punchedInTracking": { "description": "Punched in confirmation" }, + "punchInFailed": "Punch in failed: {error}", + "@punchInFailed": { + "description": "Punch in failure", + "placeholders": { "error": { "type": "String" } } + }, + "punchOutFailed": "Punch out failed: {error}", + "@punchOutFailed": { + "description": "Punch out failure", + "placeholders": { "error": { "type": "String" } } + }, + "batteryNote": "Keeps recording one location every 5 min, even with the app minimized. For Xiaomi/Oppo/Vivo/Samsung allow Unrestricted battery use or tracking may pause.", + "@batteryNote": { "description": "Background tracking note" }, + "recentDuties": "Recent duties", + "@recentDuties": { "description": "Recent duties header" }, + "punchedIn": "Punched IN", + "@punchedIn": { "description": "Punched in status" }, + "punchedOut": "Punched OUT", + "@punchedOut": { "description": "Punched out status" }, + "sessionRow": "Session: {session}", + "@sessionRow": { + "description": "Session row", + "placeholders": { "session": { "type": "String" } } + }, + "sinceRow": "Since: {time}", + "@sinceRow": { + "description": "Since row", + "placeholders": { "time": { "type": "String" } } + }, + "pointsRow": "Points: {points}", + "@pointsRow": { + "description": "Points row", + "placeholders": { "points": { "type": "String" } } + }, + "distanceRow": "Distance: {km} km", + "@distanceRow": { + "description": "Distance row", + "placeholders": { "km": { "type": "String" } } + }, + "historyOutRow": "Out: {out} • {km} km", + "@historyOutRow": { + "description": "History out row", + "placeholders": { "out": { "type": "String" }, "km": { "type": "String" } } + }, + "keepTracking": "Keep tracking running", + "@keepTracking": { "description": "Battery dialog title" }, + "batteryExemptBody": "Xiaomi, Oppo, Vivo and Samsung phones stop background tracking to save battery. Allow \"Unrestricted\" battery use for this app so duty tracking keeps working when the screen is off?", + "@batteryExemptBody": { "description": "Battery exemption body" }, + "laterBtn": "Later", + "@laterBtn": { "description": "Later button" }, + "openSettings": "Open settings", + "@openSettings": { "description": "Open settings button" }, + "scanBarcode": "Scan Barcode", + "@scanBarcode": { "description": "Scan barcode title" }, + "barCode": "BAR CODE", + "@barCode": { "description": "Bar code title" }, + "scannedBarcode": "Scanned Barcode:", + "@scannedBarcode": { "description": "Scanned barcode label" }, + "scanQR": "Scan QR", + "@scanQR": { "description": "Scan QR title" }, + "qrCode": "QR Code", + "@qrCode": { "description": "QR code title" }, + "scannedQRCode": "Scanned QRcode:", + "@scannedQRCode": { "description": "Scanned QR label" }, + "scanQRCode": "Scan QRcode", + "@scanQRCode": { "description": "Scan QR button" }, + "generatedQrCode": "Generated QR Code", + "@generatedQrCode": { "description": "Generated QR title" }, + "generatedBarCode": "Generated Bar Code", + "@generatedBarCode": { "description": "Generated barcode title" }, + "qrAndBarCode": "QR AND BAR CODE", + "@qrAndBarCode": { "description": "QR and barcode title" }, + "generateQr": "Generate Qr", + "@generateQr": { "description": "Generate QR button" }, + "generateBarCode": "Generate Bar code", + "@generateBarCode": { "description": "Generate barcode button" }, + "qrCodeScanner": "QR Code Scanner", + "@qrCodeScanner": { "description": "QR scanner button" }, + "barCodeScanner": "Bar Code Scanner", + "@barCodeScanner": { "description": "Barcode scanner button" }, + "qrCodeData": "qr_code_data", + "@qrCodeData": { "description": "QR data field label" }, + "barCodeData": "Bar Code Data", + "@barCodeData": { "description": "Barcode data field label" } } diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index b6237dc..15580f4 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -39,5 +39,135 @@ "signInLinkedin": "LinkedIn से साइन इन करें", "loginHelp": "लॉगिन सहायता", "alreadyHaveAccount": "पहले से खाता है? साइन इन करें", - "language": "भाषा" + "language": "भाषा", + "loginSuccessful": "लॉगिन सफल", + "createAccount": "खाता बनाएं", + "companyName": "कंपनी का नाम", + "mobileNumber": "मोबाइल नंबर", + "workspace": "कार्यक्षेत्र", + "gstNumber": "जीएसटी नंबर", + "pancard": "पैन कार्ड", + "workingField": "कार्य", + "pleaseEnterThis": "कृपया {label} दर्ज करें", + "enterThis": "{label} दर्ज करें", + "validEmailShort": "कृपया सही ईमेल दर्ज करें", + "submitCaps": "जमा करें", + "accountCreationFailed": "खाता निर्माण विफल: {error}", + "mobileNo": "मोबाइल नंबर", + "step1CreateAccount": "चरण 1: खाता बनाएं", + "previous": "पिछला", + "next": "आगे", + "signUpStep": "साइन अप - चरण {step}", + "selectedAccountId": "चयनित खाता आईडी: {accountId}", + "step2EmailVerification": "चरण 2: ईमेल सत्यापन प्राप्त करें", + "step3GetRegistration": "चरण 3: पंजीकरण प्राप्त करें", + "accountCreatedSuccess": "खाता सफलतापूर्वक बनाया गया!", + "registration": "पंजीकरण", + "firstName": "पहला नाम", + "lastName": "उपनाम", + "newPassword": "नया पासवर्ड", + "confirmPassword": "पासवर्ड की पुष्टि करें", + "addAccount": "खाता जोड़ें", + "validPasswordShort": "कृपया सही पासवर्ड दर्ज करें", + "termsAgreePrefix": "साइन अप करके आप इससे सहमत हैं ", + "termsConditions": "नियम व शर्तें", + "termsAndOur": " और हमारे ", + "eula": "अंतिम उपयोगकर्ता लाइसेंस समझौता", + "processingPlain": "प्रसंस्करण हो रहा है", + "createUser": "उपयोगकर्ता बनाएं", + "enterYourEmail": "अपना ईमेल दर्ज करें", + "sendOtp": "ओटीपी भेजें", + "failedToSendOtp": "ओटीपी भेजने में विफल: {error}", + "emailVerification": "ईमेल सत्यापन", + "otpSentToEmail": "{email} पर 6 अंकों का सत्यापन कोड वाला मेल भेजा गया है", + "emailVerifiedSuccess": "ईमेल सफलतापूर्वक सत्यापित", + "failedToVerifyOtp": "ओटीपी सत्यापन विफल: {error}", + "otpResent": "ओटीपी पुनः भेजा गया", + "failedToResendOtp": "ओटीपी पुनः भेजने में विफल: {error}", + "forgotPasswordLink": "पासवर्ड भूल गए?", + "didntGetCode": "कोड नहीं मिला?", + "resend": "पुनः भेजें", + "goToRegistrationDetails": "पंजीकरण विवरण पर जाएं", + "aboutUs": "हमारे बारे में", + "aboutDescription": "यदि आपके पास पहुंच है तो नया प्रोजेक्ट बनाएं, यदि पहुंच नहीं है तो व्यवस्थापक से संपर्क करें।", + "resetPassword": "पासवर्ड रीसेट करें", + "signedInAs": "आप {email} के रूप में साइन इन हैं", + "wrongAccount": "गलत खाता? इसके बजाय लॉग इन करें।", + "enterOldPassword": "पुराना पासवर्ड दर्ज करें", + "oldPasswordError": "कृपया अपना पुराना पासवर्ड दर्ज करें", + "enterNewPassword": "नया पासवर्ड दर्ज करें", + "newPasswordError": "कृपया अपना नया पासवर्ड दर्ज करें", + "reEnterNewPassword": "नया पासवर्ड पुनः दर्ज करें", + "reEnterPasswordError": "कृपया अपना नया पासवर्ड पुनः दर्ज करें", + "passwordsDontMatch": "पासवर्ड मेल नहीं खाते", + "continueBtn": "जारी रखें", + "passwordChangedSuccess": "पासवर्ड सफलतापूर्वक बदला गया", + "incorrectPassword": "गलत पासवर्ड", + "selectImage": "कृपया एक छवि चुनें।", + "profileImageUpdated": "प्रोफ़ाइल छवि अपडेट की गई", + "failedUploadImage": "छवि अपलोड विफल: {error}", + "userIdMissing": "उपयोगकर्ता आईडी गुम है, कृपया पुनः लॉगिन करें", + "profileUpdated": "प्रोफ़ाइल अपडेट की गई", + "failedUpdateProfile": "प्रोफ़ाइल अपडेट विफल: {code}", + "failedUpdate": "अपडेट विफल: {error}", + "myProfileSettings": "मेरी प्रोफ़ाइल सेटिंग्स", + "pickProfilePhoto": "प्रोफ़ाइल फ़ोटो चुनें", + "yourProfileInfo": "आपकी प्रोफ़ाइल जानकारी", + "yourFullName": "आपका पूरा नाम", + "enterFullName": "पूरा नाम दर्ज करें", + "enterFullNameError": "कृपया अपना पूरा नाम दर्ज करें", + "pronouns": "सर्वनाम", + "enterPronouns": "सर्वनाम दर्ज करें", + "role": "भूमिका", + "enterRole": "भूमिका दर्ज करें", + "departmentOrTeam": "विभाग या टीम", + "enterDepartmentOrTeam": "विभाग या टीम दर्ज करें", + "validEmailError": "कृपया सही ईमेल पता दर्ज करें", + "aboutMe": "मेरे बारे में", + "updateProfile": "प्रोफ़ाइल अपडेट करें", + "profilePasswordRow": "पासवर्ड:अपने खाते का पासवर्ड बदलें पासवर्ड बदलें", + "profileSecurityRow": "सुरक्षा:इस वर्तमान ब्राउज़र को छोड़कर सभी सत्रों से लॉगआउट करें अन्य सत्र लॉगआउट करें", + "profileDeactivationRow": "निष्क्रियण:क्लाउडनश्योर में सभी संगठनों और कार्यक्षेत्रों की पहुंच हटाएं खाता निष्क्रिय करें", + "loading": "लोड हो रहा है...", + "navHome": "होम", + "navContacts": "संपर्क", + "navWallet": "वॉलेट", + "dutySummary": "ड्यूटी सारांश", + "dutySummaryBody": "दर्ज पॉइंट: {points}\\nसीधी दूरी: {km} किमी\\nसड़क दूरी: चरण 4 में आ रही है (मुफ्त API)।", + "dutyPunch": "ड्यूटी पंच", + "pleaseWait": "कृपया प्रतीक्षा करें...", + "punchOut": "पंच आउट", + "punchIn": "पंच इन", + "punchedInTracking": "पंच इन हुआ - हर 5 मिनट में ट्रैकिंग", + "punchInFailed": "पंच इन विफल: {error}", + "punchOutFailed": "पंच आउट विफल: {error}", + "batteryNote": "ऐप छोटा करने पर भी हर 5 मिनट में एक लोकेशन रिकॉर्ड होती है। Xiaomi/Oppo/Vivo/Samsung में बैटरी उपयोग अनियंत्रित रखें, नहीं तो ट्रैकिंग रुक सकती है।", + "recentDuties": "हाल की ड्यूटियां", + "punchedIn": "पंच इन", + "punchedOut": "पंच आउट", + "sessionRow": "सत्र: {session}", + "sinceRow": "से: {time}", + "pointsRow": "पॉइंट: {points}", + "distanceRow": "दूरी: {km} किमी", + "historyOutRow": "आउट: {out} • {km} किमी", + "keepTracking": "ट्रैकिंग चालू रखें", + "batteryExemptBody": "Xiaomi, Oppo, Vivo और Samsung फोन बैटरी बचाने के लिए बैकग्राउंड ट्रैकिंग बंद कर देते हैं। स्क्रीन बंद होने पर भी ड्यूटी ट्रैकिंग चालू रखने के लिए इस ऐप के लिए अनियंत्रित बैटरी उपयोग की अनुमति दें?", + "laterBtn": "बाद में", + "openSettings": "सेटिंग्स खोलें", + "scanBarcode": "बारकोड स्कैन करें", + "barCode": "बार कोड", + "scannedBarcode": "स्कैन किया गया बारकोड:", + "scanQR": "क्यूआर स्कैन करें", + "qrCode": "क्यूआर कोड", + "scannedQRCode": "स्कैन किया गया क्यूआर कोड:", + "scanQRCode": "क्यूआर कोड स्कैन करें", + "generatedQrCode": "जनरेट किया गया क्यूआर कोड", + "generatedBarCode": "जनरेट किया गया बार कोड", + "qrAndBarCode": "क्यूआर और बार कोड", + "generateQr": "क्यूआर बनाएं", + "generateBarCode": "बार कोड बनाएं", + "qrCodeScanner": "क्यूआर कोड स्कैनर", + "barCodeScanner": "बार कोड स्कैनर", + "qrCodeData": "क्यूआर कोड डेटा", + "barCodeData": "बार कोड डेटा" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index d865b55..d79d20c 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -337,6 +337,780 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Language'** String get language; + + /// Create account title + /// + /// In en, this message translates to: + /// **'Create Account'** + String get createAccount; + + /// Company name label + /// + /// In en, this message translates to: + /// **'Company Name'** + String get companyName; + + /// Mobile number label + /// + /// In en, this message translates to: + /// **'Mobile Number'** + String get mobileNumber; + + /// Workspace label + /// + /// In en, this message translates to: + /// **'Workspace'** + String get workspace; + + /// GST number label + /// + /// In en, this message translates to: + /// **'Gst Number'** + String get gstNumber; + + /// Pancard label + /// + /// In en, this message translates to: + /// **'pancard'** + String get pancard; + + /// Working label + /// + /// In en, this message translates to: + /// **'Working'** + String get workingField; + + /// Generic required-field validation + /// + /// In en, this message translates to: + /// **'Please enter {label}'** + String pleaseEnterThis(String label); + + /// Generic input hint + /// + /// In en, this message translates to: + /// **'Enter {label}'** + String enterThis(String label); + + /// Short email validation + /// + /// In en, this message translates to: + /// **'Please enter a valid email'** + String get validEmailShort; + + /// Submit button uppercase + /// + /// In en, this message translates to: + /// **'SUBMIT'** + String get submitCaps; + + /// Account creation failure + /// + /// In en, this message translates to: + /// **'Account Creation Failed: {error}'** + String accountCreationFailed(String error); + + /// Mobile number short label + /// + /// In en, this message translates to: + /// **'Mobile No'** + String get mobileNo; + + /// Signup step 1 header + /// + /// In en, this message translates to: + /// **'Step 1: Create Account'** + String get step1CreateAccount; + + /// Previous button + /// + /// In en, this message translates to: + /// **'Previous'** + String get previous; + + /// Next button + /// + /// In en, this message translates to: + /// **'Next'** + String get next; + + /// Signup wizard title + /// + /// In en, this message translates to: + /// **'Sign Up - Step {step}'** + String signUpStep(String step); + + /// Selected account display + /// + /// In en, this message translates to: + /// **'Selected Account ID: {accountId}'** + String selectedAccountId(String accountId); + + /// Signup step 2 header + /// + /// In en, this message translates to: + /// **'Step 2: Get Email Verification'** + String get step2EmailVerification; + + /// Signup step 3 header + /// + /// In en, this message translates to: + /// **'Step 3: Get Registration'** + String get step3GetRegistration; + + /// Account created message + /// + /// In en, this message translates to: + /// **'Account created successfully!'** + String get accountCreatedSuccess; + + /// Registration title + /// + /// In en, this message translates to: + /// **'Registration'** + String get registration; + + /// First name label + /// + /// In en, this message translates to: + /// **'First Name'** + String get firstName; + + /// Last name label + /// + /// In en, this message translates to: + /// **'Last Name'** + String get lastName; + + /// New password label + /// + /// In en, this message translates to: + /// **'New Password'** + String get newPassword; + + /// Confirm password label + /// + /// In en, this message translates to: + /// **'Confirm Password'** + String get confirmPassword; + + /// Add account row + /// + /// In en, this message translates to: + /// **'Add Account'** + String get addAccount; + + /// Short password validation + /// + /// In en, this message translates to: + /// **'Please enter a valid password'** + String get validPasswordShort; + + /// Terms agreement prefix + /// + /// In en, this message translates to: + /// **'By signing up you are agreeing to the '** + String get termsAgreePrefix; + + /// Terms link + /// + /// In en, this message translates to: + /// **'Terms & Conditions'** + String get termsConditions; + + /// Terms conjunction + /// + /// In en, this message translates to: + /// **' and our '** + String get termsAndOur; + + /// EULA link + /// + /// In en, this message translates to: + /// **'End User License Agreement'** + String get eula; + + /// Processing without dots + /// + /// In en, this message translates to: + /// **'Processing'** + String get processingPlain; + + /// Create user title + /// + /// In en, this message translates to: + /// **'Create User'** + String get createUser; + + /// Your email hint + /// + /// In en, this message translates to: + /// **'Enter Your Email'** + String get enterYourEmail; + + /// Send OTP button + /// + /// In en, this message translates to: + /// **'Send OTP'** + String get sendOtp; + + /// Send OTP failure + /// + /// In en, this message translates to: + /// **'Failed to send OTP: {error}'** + String failedToSendOtp(String error); + + /// Email verification header + /// + /// In en, this message translates to: + /// **'Email Verification'** + String get emailVerification; + + /// OTP sent message + /// + /// In en, this message translates to: + /// **'A mail with a 6-digit verification code was just sent to {email}'** + String otpSentToEmail(String email); + + /// Email verified message + /// + /// In en, this message translates to: + /// **'Email verified successfully'** + String get emailVerifiedSuccess; + + /// OTP verification failure + /// + /// In en, this message translates to: + /// **'Failed to verify OTP: {error}'** + String failedToVerifyOtp(String error); + + /// OTP resent message + /// + /// In en, this message translates to: + /// **'OTP Resent'** + String get otpResent; + + /// OTP resend failure + /// + /// In en, this message translates to: + /// **'Failed to resend OTP: {error}'** + String failedToResendOtp(String error); + + /// Forgot password link + /// + /// In en, this message translates to: + /// **'Forgot Password?'** + String get forgotPasswordLink; + + /// Resend prompt + /// + /// In en, this message translates to: + /// **'Didn’t get the code?'** + String get didntGetCode; + + /// Resend button + /// + /// In en, this message translates to: + /// **'Resend'** + String get resend; + + /// Go to registration button + /// + /// In en, this message translates to: + /// **'Go to Registration Details'** + String get goToRegistrationDetails; + + /// About us title + /// + /// In en, this message translates to: + /// **'About Us'** + String get aboutUs; + + /// About us body + /// + /// In en, this message translates to: + /// **'Create a new project if you have access, if you don\'t have access, then contact the admin.'** + String get aboutDescription; + + /// Reset password title + /// + /// In en, this message translates to: + /// **'Reset Password'** + String get resetPassword; + + /// Signed in as message + /// + /// In en, this message translates to: + /// **'You\'re signed in as {email}'** + String signedInAs(String email); + + /// Wrong account link + /// + /// In en, this message translates to: + /// **'Wrong account? Log in instead.'** + String get wrongAccount; + + /// Old password label + /// + /// In en, this message translates to: + /// **'Enter Old Password'** + String get enterOldPassword; + + /// Old password validation + /// + /// In en, this message translates to: + /// **'Please enter your old password'** + String get oldPasswordError; + + /// New password label + /// + /// In en, this message translates to: + /// **'Enter New Password'** + String get enterNewPassword; + + /// New password validation + /// + /// In en, this message translates to: + /// **'Please enter your new password'** + String get newPasswordError; + + /// Re-enter password label + /// + /// In en, this message translates to: + /// **'Re-Enter New Password'** + String get reEnterNewPassword; + + /// Re-enter validation + /// + /// In en, this message translates to: + /// **'Please re-enter your new password'** + String get reEnterPasswordError; + + /// Password mismatch + /// + /// In en, this message translates to: + /// **'Passwords do not match'** + String get passwordsDontMatch; + + /// Continue button + /// + /// In en, this message translates to: + /// **'Continue'** + String get continueBtn; + + /// Password changed message + /// + /// In en, this message translates to: + /// **'Password Changed Successfully'** + String get passwordChangedSuccess; + + /// Incorrect password message + /// + /// In en, this message translates to: + /// **'Incorrect Password'** + String get incorrectPassword; + + /// Select image prompt + /// + /// In en, this message translates to: + /// **'Please select an image.'** + String get selectImage; + + /// Image updated message + /// + /// In en, this message translates to: + /// **'Profile image updated'** + String get profileImageUpdated; + + /// Image upload failure + /// + /// In en, this message translates to: + /// **'Failed to upload image: {error}'** + String failedUploadImage(String error); + + /// Missing user id message + /// + /// In en, this message translates to: + /// **'User id missing, please re-login'** + String get userIdMissing; + + /// Profile updated message + /// + /// In en, this message translates to: + /// **'Profile updated'** + String get profileUpdated; + + /// Profile update failure + /// + /// In en, this message translates to: + /// **'Failed to update profile: {code}'** + String failedUpdateProfile(String code); + + /// Update failure + /// + /// In en, this message translates to: + /// **'Failed to update: {error}'** + String failedUpdate(String error); + + /// Profile settings title + /// + /// In en, this message translates to: + /// **'My Profile Settings'** + String get myProfileSettings; + + /// Pick photo button + /// + /// In en, this message translates to: + /// **'Pick a Profile Photo'** + String get pickProfilePhoto; + + /// Profile info header + /// + /// In en, this message translates to: + /// **'Your Profile Information'** + String get yourProfileInfo; + + /// Full name label + /// + /// In en, this message translates to: + /// **'Your Full Name'** + String get yourFullName; + + /// Full name hint + /// + /// In en, this message translates to: + /// **'Enter Full Name'** + String get enterFullName; + + /// Full name validation + /// + /// In en, this message translates to: + /// **'Please enter your full name'** + String get enterFullNameError; + + /// Pronouns label + /// + /// In en, this message translates to: + /// **'Pronouns'** + String get pronouns; + + /// Pronouns hint + /// + /// In en, this message translates to: + /// **'Enter Pronouns'** + String get enterPronouns; + + /// Role label + /// + /// In en, this message translates to: + /// **'Role'** + String get role; + + /// Role hint + /// + /// In en, this message translates to: + /// **'Enter Role'** + String get enterRole; + + /// Department label + /// + /// In en, this message translates to: + /// **'Department or Team'** + String get departmentOrTeam; + + /// Department hint + /// + /// In en, this message translates to: + /// **'Enter Department or Team'** + String get enterDepartmentOrTeam; + + /// Email validation + /// + /// In en, this message translates to: + /// **'Please enter a valid email address'** + String get validEmailError; + + /// About me label + /// + /// In en, this message translates to: + /// **'About Me'** + String get aboutMe; + + /// Update profile button + /// + /// In en, this message translates to: + /// **'Update Profile'** + String get updateProfile; + + /// Profile password row + /// + /// In en, this message translates to: + /// **'Password:Change Password for your account Change password'** + String get profilePasswordRow; + + /// Profile security row + /// + /// In en, this message translates to: + /// **'Security:Logout of all sessions except this current browser Logout other sessions'** + String get profileSecurityRow; + + /// Profile deactivation row + /// + /// In en, this message translates to: + /// **'Deactivation:Remove access to all organizations and workspace in cloudnsure Deactivate account'** + String get profileDeactivationRow; + + /// Loading indicator + /// + /// In en, this message translates to: + /// **'Loading...'** + String get loading; + + /// Home tab + /// + /// In en, this message translates to: + /// **'Home'** + String get navHome; + + /// Contacts tab + /// + /// In en, this message translates to: + /// **'Contacts'** + String get navContacts; + + /// Wallet tab + /// + /// In en, this message translates to: + /// **'Wallet'** + String get navWallet; + + /// Duty summary dialog title + /// + /// In en, this message translates to: + /// **'Duty summary'** + String get dutySummary; + + /// Duty summary dialog body + /// + /// In en, this message translates to: + /// **'Points recorded: {points}\\nDistance (straight line): {km} km\\nRoad distance: coming in step 4 (free API).'** + String dutySummaryBody(String points, String km); + + /// Duty punch title + /// + /// In en, this message translates to: + /// **'Duty Punch'** + String get dutyPunch; + + /// Busy button label + /// + /// In en, this message translates to: + /// **'Please wait...'** + String get pleaseWait; + + /// Punch out button + /// + /// In en, this message translates to: + /// **'Punch Out'** + String get punchOut; + + /// Punch in button + /// + /// In en, this message translates to: + /// **'Punch In'** + String get punchIn; + + /// Punched in confirmation + /// + /// In en, this message translates to: + /// **'Punched in - tracking every 5 min'** + String get punchedInTracking; + + /// Punch in failure + /// + /// In en, this message translates to: + /// **'Punch in failed: {error}'** + String punchInFailed(String error); + + /// Punch out failure + /// + /// In en, this message translates to: + /// **'Punch out failed: {error}'** + String punchOutFailed(String error); + + /// Background tracking note + /// + /// In en, this message translates to: + /// **'Keeps recording one location every 5 min, even with the app minimized. For Xiaomi/Oppo/Vivo/Samsung allow Unrestricted battery use or tracking may pause.'** + String get batteryNote; + + /// Recent duties header + /// + /// In en, this message translates to: + /// **'Recent duties'** + String get recentDuties; + + /// Punched in status + /// + /// In en, this message translates to: + /// **'Punched IN'** + String get punchedIn; + + /// Punched out status + /// + /// In en, this message translates to: + /// **'Punched OUT'** + String get punchedOut; + + /// Session row + /// + /// In en, this message translates to: + /// **'Session: {session}'** + String sessionRow(String session); + + /// Since row + /// + /// In en, this message translates to: + /// **'Since: {time}'** + String sinceRow(String time); + + /// Points row + /// + /// In en, this message translates to: + /// **'Points: {points}'** + String pointsRow(String points); + + /// Distance row + /// + /// In en, this message translates to: + /// **'Distance: {km} km'** + String distanceRow(String km); + + /// History out row + /// + /// In en, this message translates to: + /// **'Out: {out} • {km} km'** + String historyOutRow(String out, String km); + + /// Battery dialog title + /// + /// In en, this message translates to: + /// **'Keep tracking running'** + String get keepTracking; + + /// Battery exemption body + /// + /// In en, this message translates to: + /// **'Xiaomi, Oppo, Vivo and Samsung phones stop background tracking to save battery. Allow \"Unrestricted\" battery use for this app so duty tracking keeps working when the screen is off?'** + String get batteryExemptBody; + + /// Later button + /// + /// In en, this message translates to: + /// **'Later'** + String get laterBtn; + + /// Open settings button + /// + /// In en, this message translates to: + /// **'Open settings'** + String get openSettings; + + /// Scan barcode title + /// + /// In en, this message translates to: + /// **'Scan Barcode'** + String get scanBarcode; + + /// Bar code title + /// + /// In en, this message translates to: + /// **'BAR CODE'** + String get barCode; + + /// Scanned barcode label + /// + /// In en, this message translates to: + /// **'Scanned Barcode:'** + String get scannedBarcode; + + /// Scan QR title + /// + /// In en, this message translates to: + /// **'Scan QR'** + String get scanQR; + + /// QR code title + /// + /// In en, this message translates to: + /// **'QR Code'** + String get qrCode; + + /// Scanned QR label + /// + /// In en, this message translates to: + /// **'Scanned QRcode:'** + String get scannedQRCode; + + /// Scan QR button + /// + /// In en, this message translates to: + /// **'Scan QRcode'** + String get scanQRCode; + + /// Generated QR title + /// + /// In en, this message translates to: + /// **'Generated QR Code'** + String get generatedQrCode; + + /// Generated barcode title + /// + /// In en, this message translates to: + /// **'Generated Bar Code'** + String get generatedBarCode; + + /// QR and barcode title + /// + /// In en, this message translates to: + /// **'QR AND BAR CODE'** + String get qrAndBarCode; + + /// Generate QR button + /// + /// In en, this message translates to: + /// **'Generate Qr'** + String get generateQr; + + /// Generate barcode button + /// + /// In en, this message translates to: + /// **'Generate Bar code'** + String get generateBarCode; + + /// QR scanner button + /// + /// In en, this message translates to: + /// **'QR Code Scanner'** + String get qrCodeScanner; + + /// Barcode scanner button + /// + /// In en, this message translates to: + /// **'Bar Code Scanner'** + String get barCodeScanner; + + /// QR data field label + /// + /// In en, this message translates to: + /// **'qr_code_data'** + String get qrCodeData; + + /// Barcode data field label + /// + /// In en, this message translates to: + /// **'Bar Code Data'** + String get barCodeData; } class _AppLocalizationsDelegate diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 0bf2993..d569ab1 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -130,4 +130,439 @@ class AppLocalizationsEn extends AppLocalizations { @override String get language => 'Language'; + + @override + String get createAccount => 'Create Account'; + + @override + String get companyName => 'Company Name'; + + @override + String get mobileNumber => 'Mobile Number'; + + @override + String get workspace => 'Workspace'; + + @override + String get gstNumber => 'Gst Number'; + + @override + String get pancard => 'pancard'; + + @override + String get workingField => 'Working'; + + @override + String pleaseEnterThis(String label) { + return 'Please enter $label'; + } + + @override + String enterThis(String label) { + return 'Enter $label'; + } + + @override + String get validEmailShort => 'Please enter a valid email'; + + @override + String get submitCaps => 'SUBMIT'; + + @override + String accountCreationFailed(String error) { + return 'Account Creation Failed: $error'; + } + + @override + String get mobileNo => 'Mobile No'; + + @override + String get step1CreateAccount => 'Step 1: Create Account'; + + @override + String get previous => 'Previous'; + + @override + String get next => 'Next'; + + @override + String signUpStep(String step) { + return 'Sign Up - Step $step'; + } + + @override + String selectedAccountId(String accountId) { + return 'Selected Account ID: $accountId'; + } + + @override + String get step2EmailVerification => 'Step 2: Get Email Verification'; + + @override + String get step3GetRegistration => 'Step 3: Get Registration'; + + @override + String get accountCreatedSuccess => 'Account created successfully!'; + + @override + String get registration => 'Registration'; + + @override + String get firstName => 'First Name'; + + @override + String get lastName => 'Last Name'; + + @override + String get newPassword => 'New Password'; + + @override + String get confirmPassword => 'Confirm Password'; + + @override + String get addAccount => 'Add Account'; + + @override + String get validPasswordShort => 'Please enter a valid password'; + + @override + String get termsAgreePrefix => 'By signing up you are agreeing to the '; + + @override + String get termsConditions => 'Terms & Conditions'; + + @override + String get termsAndOur => ' and our '; + + @override + String get eula => 'End User License Agreement'; + + @override + String get processingPlain => 'Processing'; + + @override + String get createUser => 'Create User'; + + @override + String get enterYourEmail => 'Enter Your Email'; + + @override + String get sendOtp => 'Send OTP'; + + @override + String failedToSendOtp(String error) { + return 'Failed to send OTP: $error'; + } + + @override + String get emailVerification => 'Email Verification'; + + @override + String otpSentToEmail(String email) { + return 'A mail with a 6-digit verification code was just sent to $email'; + } + + @override + String get emailVerifiedSuccess => 'Email verified successfully'; + + @override + String failedToVerifyOtp(String error) { + return 'Failed to verify OTP: $error'; + } + + @override + String get otpResent => 'OTP Resent'; + + @override + String failedToResendOtp(String error) { + return 'Failed to resend OTP: $error'; + } + + @override + String get forgotPasswordLink => 'Forgot Password?'; + + @override + String get didntGetCode => 'Didn’t get the code?'; + + @override + String get resend => 'Resend'; + + @override + String get goToRegistrationDetails => 'Go to Registration Details'; + + @override + String get aboutUs => 'About Us'; + + @override + String get aboutDescription => + 'Create a new project if you have access, if you don\'t have access, then contact the admin.'; + + @override + String get resetPassword => 'Reset Password'; + + @override + String signedInAs(String email) { + return 'You\'re signed in as $email'; + } + + @override + String get wrongAccount => 'Wrong account? Log in instead.'; + + @override + String get enterOldPassword => 'Enter Old Password'; + + @override + String get oldPasswordError => 'Please enter your old password'; + + @override + String get enterNewPassword => 'Enter New Password'; + + @override + String get newPasswordError => 'Please enter your new password'; + + @override + String get reEnterNewPassword => 'Re-Enter New Password'; + + @override + String get reEnterPasswordError => 'Please re-enter your new password'; + + @override + String get passwordsDontMatch => 'Passwords do not match'; + + @override + String get continueBtn => 'Continue'; + + @override + String get passwordChangedSuccess => 'Password Changed Successfully'; + + @override + String get incorrectPassword => 'Incorrect Password'; + + @override + String get selectImage => 'Please select an image.'; + + @override + String get profileImageUpdated => 'Profile image updated'; + + @override + String failedUploadImage(String error) { + return 'Failed to upload image: $error'; + } + + @override + String get userIdMissing => 'User id missing, please re-login'; + + @override + String get profileUpdated => 'Profile updated'; + + @override + String failedUpdateProfile(String code) { + return 'Failed to update profile: $code'; + } + + @override + String failedUpdate(String error) { + return 'Failed to update: $error'; + } + + @override + String get myProfileSettings => 'My Profile Settings'; + + @override + String get pickProfilePhoto => 'Pick a Profile Photo'; + + @override + String get yourProfileInfo => 'Your Profile Information'; + + @override + String get yourFullName => 'Your Full Name'; + + @override + String get enterFullName => 'Enter Full Name'; + + @override + String get enterFullNameError => 'Please enter your full name'; + + @override + String get pronouns => 'Pronouns'; + + @override + String get enterPronouns => 'Enter Pronouns'; + + @override + String get role => 'Role'; + + @override + String get enterRole => 'Enter Role'; + + @override + String get departmentOrTeam => 'Department or Team'; + + @override + String get enterDepartmentOrTeam => 'Enter Department or Team'; + + @override + String get validEmailError => 'Please enter a valid email address'; + + @override + String get aboutMe => 'About Me'; + + @override + String get updateProfile => 'Update Profile'; + + @override + String get profilePasswordRow => + 'Password:Change Password for your account Change password'; + + @override + String get profileSecurityRow => + 'Security:Logout of all sessions except this current browser Logout other sessions'; + + @override + String get profileDeactivationRow => + 'Deactivation:Remove access to all organizations and workspace in cloudnsure Deactivate account'; + + @override + String get loading => 'Loading...'; + + @override + String get navHome => 'Home'; + + @override + String get navContacts => 'Contacts'; + + @override + String get navWallet => 'Wallet'; + + @override + String get dutySummary => 'Duty summary'; + + @override + String dutySummaryBody(String points, String km) { + return 'Points recorded: $points\\nDistance (straight line): $km km\\nRoad distance: coming in step 4 (free API).'; + } + + @override + String get dutyPunch => 'Duty Punch'; + + @override + String get pleaseWait => 'Please wait...'; + + @override + String get punchOut => 'Punch Out'; + + @override + String get punchIn => 'Punch In'; + + @override + String get punchedInTracking => 'Punched in - tracking every 5 min'; + + @override + String punchInFailed(String error) { + return 'Punch in failed: $error'; + } + + @override + String punchOutFailed(String error) { + return 'Punch out failed: $error'; + } + + @override + String get batteryNote => + 'Keeps recording one location every 5 min, even with the app minimized. For Xiaomi/Oppo/Vivo/Samsung allow Unrestricted battery use or tracking may pause.'; + + @override + String get recentDuties => 'Recent duties'; + + @override + String get punchedIn => 'Punched IN'; + + @override + String get punchedOut => 'Punched OUT'; + + @override + String sessionRow(String session) { + return 'Session: $session'; + } + + @override + String sinceRow(String time) { + return 'Since: $time'; + } + + @override + String pointsRow(String points) { + return 'Points: $points'; + } + + @override + String distanceRow(String km) { + return 'Distance: $km km'; + } + + @override + String historyOutRow(String out, String km) { + return 'Out: $out • $km km'; + } + + @override + String get keepTracking => 'Keep tracking running'; + + @override + String get batteryExemptBody => + 'Xiaomi, Oppo, Vivo and Samsung phones stop background tracking to save battery. Allow \"Unrestricted\" battery use for this app so duty tracking keeps working when the screen is off?'; + + @override + String get laterBtn => 'Later'; + + @override + String get openSettings => 'Open settings'; + + @override + String get scanBarcode => 'Scan Barcode'; + + @override + String get barCode => 'BAR CODE'; + + @override + String get scannedBarcode => 'Scanned Barcode:'; + + @override + String get scanQR => 'Scan QR'; + + @override + String get qrCode => 'QR Code'; + + @override + String get scannedQRCode => 'Scanned QRcode:'; + + @override + String get scanQRCode => 'Scan QRcode'; + + @override + String get generatedQrCode => 'Generated QR Code'; + + @override + String get generatedBarCode => 'Generated Bar Code'; + + @override + String get qrAndBarCode => 'QR AND BAR CODE'; + + @override + String get generateQr => 'Generate Qr'; + + @override + String get generateBarCode => 'Generate Bar code'; + + @override + String get qrCodeScanner => 'QR Code Scanner'; + + @override + String get barCodeScanner => 'Bar Code Scanner'; + + @override + String get qrCodeData => 'qr_code_data'; + + @override + String get barCodeData => 'Bar Code Data'; } diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 4c91b8a..62779fd 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -130,4 +130,439 @@ class AppLocalizationsHi extends AppLocalizations { @override String get language => 'भाषा'; + + @override + String get createAccount => 'खाता बनाएं'; + + @override + String get companyName => 'कंपनी का नाम'; + + @override + String get mobileNumber => 'मोबाइल नंबर'; + + @override + String get workspace => 'कार्यक्षेत्र'; + + @override + String get gstNumber => 'जीएसटी नंबर'; + + @override + String get pancard => 'पैन कार्ड'; + + @override + String get workingField => 'कार्य'; + + @override + String pleaseEnterThis(String label) { + return 'कृपया $label दर्ज करें'; + } + + @override + String enterThis(String label) { + return '$label दर्ज करें'; + } + + @override + String get validEmailShort => 'कृपया सही ईमेल दर्ज करें'; + + @override + String get submitCaps => 'जमा करें'; + + @override + String accountCreationFailed(String error) { + return 'खाता निर्माण विफल: $error'; + } + + @override + String get mobileNo => 'मोबाइल नंबर'; + + @override + String get step1CreateAccount => 'चरण 1: खाता बनाएं'; + + @override + String get previous => 'पिछला'; + + @override + String get next => 'आगे'; + + @override + String signUpStep(String step) { + return 'साइन अप - चरण $step'; + } + + @override + String selectedAccountId(String accountId) { + return 'चयनित खाता आईडी: $accountId'; + } + + @override + String get step2EmailVerification => 'चरण 2: ईमेल सत्यापन प्राप्त करें'; + + @override + String get step3GetRegistration => 'चरण 3: पंजीकरण प्राप्त करें'; + + @override + String get accountCreatedSuccess => 'खाता सफलतापूर्वक बनाया गया!'; + + @override + String get registration => 'पंजीकरण'; + + @override + String get firstName => 'पहला नाम'; + + @override + String get lastName => 'उपनाम'; + + @override + String get newPassword => 'नया पासवर्ड'; + + @override + String get confirmPassword => 'पासवर्ड की पुष्टि करें'; + + @override + String get addAccount => 'खाता जोड़ें'; + + @override + String get validPasswordShort => 'कृपया सही पासवर्ड दर्ज करें'; + + @override + String get termsAgreePrefix => 'साइन अप करके आप इससे सहमत हैं '; + + @override + String get termsConditions => 'नियम व शर्तें'; + + @override + String get termsAndOur => ' और हमारे '; + + @override + String get eula => 'अंतिम उपयोगकर्ता लाइसेंस समझौता'; + + @override + String get processingPlain => 'प्रसंस्करण हो रहा है'; + + @override + String get createUser => 'उपयोगकर्ता बनाएं'; + + @override + String get enterYourEmail => 'अपना ईमेल दर्ज करें'; + + @override + String get sendOtp => 'ओटीपी भेजें'; + + @override + String failedToSendOtp(String error) { + return 'ओटीपी भेजने में विफल: $error'; + } + + @override + String get emailVerification => 'ईमेल सत्यापन'; + + @override + String otpSentToEmail(String email) { + return '$email पर 6 अंकों का सत्यापन कोड वाला मेल भेजा गया है'; + } + + @override + String get emailVerifiedSuccess => 'ईमेल सफलतापूर्वक सत्यापित'; + + @override + String failedToVerifyOtp(String error) { + return 'ओटीपी सत्यापन विफल: $error'; + } + + @override + String get otpResent => 'ओटीपी पुनः भेजा गया'; + + @override + String failedToResendOtp(String error) { + return 'ओटीपी पुनः भेजने में विफल: $error'; + } + + @override + String get forgotPasswordLink => 'पासवर्ड भूल गए?'; + + @override + String get didntGetCode => 'कोड नहीं मिला?'; + + @override + String get resend => 'पुनः भेजें'; + + @override + String get goToRegistrationDetails => 'पंजीकरण विवरण पर जाएं'; + + @override + String get aboutUs => 'हमारे बारे में'; + + @override + String get aboutDescription => + 'यदि आपके पास पहुंच है तो नया प्रोजेक्ट बनाएं, यदि पहुंच नहीं है तो व्यवस्थापक से संपर्क करें।'; + + @override + String get resetPassword => 'पासवर्ड रीसेट करें'; + + @override + String signedInAs(String email) { + return 'आप $email के रूप में साइन इन हैं'; + } + + @override + String get wrongAccount => 'गलत खाता? इसके बजाय लॉग इन करें।'; + + @override + String get enterOldPassword => 'पुराना पासवर्ड दर्ज करें'; + + @override + String get oldPasswordError => 'कृपया अपना पुराना पासवर्ड दर्ज करें'; + + @override + String get enterNewPassword => 'नया पासवर्ड दर्ज करें'; + + @override + String get newPasswordError => 'कृपया अपना नया पासवर्ड दर्ज करें'; + + @override + String get reEnterNewPassword => 'नया पासवर्ड पुनः दर्ज करें'; + + @override + String get reEnterPasswordError => 'कृपया अपना नया पासवर्ड पुनः दर्ज करें'; + + @override + String get passwordsDontMatch => 'पासवर्ड मेल नहीं खाते'; + + @override + String get continueBtn => 'जारी रखें'; + + @override + String get passwordChangedSuccess => 'पासवर्ड सफलतापूर्वक बदला गया'; + + @override + String get incorrectPassword => 'गलत पासवर्ड'; + + @override + String get selectImage => 'कृपया एक छवि चुनें।'; + + @override + String get profileImageUpdated => 'प्रोफ़ाइल छवि अपडेट की गई'; + + @override + String failedUploadImage(String error) { + return 'छवि अपलोड विफल: $error'; + } + + @override + String get userIdMissing => 'उपयोगकर्ता आईडी गुम है, कृपया पुनः लॉगिन करें'; + + @override + String get profileUpdated => 'प्रोफ़ाइल अपडेट की गई'; + + @override + String failedUpdateProfile(String code) { + return 'प्रोफ़ाइल अपडेट विफल: $code'; + } + + @override + String failedUpdate(String error) { + return 'अपडेट विफल: $error'; + } + + @override + String get myProfileSettings => 'मेरी प्रोफ़ाइल सेटिंग्स'; + + @override + String get pickProfilePhoto => 'प्रोफ़ाइल फ़ोटो चुनें'; + + @override + String get yourProfileInfo => 'आपकी प्रोफ़ाइल जानकारी'; + + @override + String get yourFullName => 'आपका पूरा नाम'; + + @override + String get enterFullName => 'पूरा नाम दर्ज करें'; + + @override + String get enterFullNameError => 'कृपया अपना पूरा नाम दर्ज करें'; + + @override + String get pronouns => 'सर्वनाम'; + + @override + String get enterPronouns => 'सर्वनाम दर्ज करें'; + + @override + String get role => 'भूमिका'; + + @override + String get enterRole => 'भूमिका दर्ज करें'; + + @override + String get departmentOrTeam => 'विभाग या टीम'; + + @override + String get enterDepartmentOrTeam => 'विभाग या टीम दर्ज करें'; + + @override + String get validEmailError => 'कृपया सही ईमेल पता दर्ज करें'; + + @override + String get aboutMe => 'मेरे बारे में'; + + @override + String get updateProfile => 'प्रोफ़ाइल अपडेट करें'; + + @override + String get profilePasswordRow => + 'पासवर्ड:अपने खाते का पासवर्ड बदलें पासवर्ड बदलें'; + + @override + String get profileSecurityRow => + 'सुरक्षा:इस वर्तमान ब्राउज़र को छोड़कर सभी सत्रों से लॉगआउट करें अन्य सत्र लॉगआउट करें'; + + @override + String get profileDeactivationRow => + 'निष्क्रियण:क्लाउडनश्योर में सभी संगठनों और कार्यक्षेत्रों की पहुंच हटाएं खाता निष्क्रिय करें'; + + @override + String get loading => 'लोड हो रहा है...'; + + @override + String get navHome => 'होम'; + + @override + String get navContacts => 'संपर्क'; + + @override + String get navWallet => 'वॉलेट'; + + @override + String get dutySummary => 'ड्यूटी सारांश'; + + @override + String dutySummaryBody(String points, String km) { + return 'दर्ज पॉइंट: $points\\nसीधी दूरी: $km किमी\\nसड़क दूरी: चरण 4 में आ रही है (मुफ्त API)।'; + } + + @override + String get dutyPunch => 'ड्यूटी पंच'; + + @override + String get pleaseWait => 'कृपया प्रतीक्षा करें...'; + + @override + String get punchOut => 'पंच आउट'; + + @override + String get punchIn => 'पंच इन'; + + @override + String get punchedInTracking => 'पंच इन हुआ - हर 5 मिनट में ट्रैकिंग'; + + @override + String punchInFailed(String error) { + return 'पंच इन विफल: $error'; + } + + @override + String punchOutFailed(String error) { + return 'पंच आउट विफल: $error'; + } + + @override + String get batteryNote => + 'ऐप छोटा करने पर भी हर 5 मिनट में एक लोकेशन रिकॉर्ड होती है। Xiaomi/Oppo/Vivo/Samsung में बैटरी उपयोग अनियंत्रित रखें, नहीं तो ट्रैकिंग रुक सकती है।'; + + @override + String get recentDuties => 'हाल की ड्यूटियां'; + + @override + String get punchedIn => 'पंच इन'; + + @override + String get punchedOut => 'पंच आउट'; + + @override + String sessionRow(String session) { + return 'सत्र: $session'; + } + + @override + String sinceRow(String time) { + return 'से: $time'; + } + + @override + String pointsRow(String points) { + return 'पॉइंट: $points'; + } + + @override + String distanceRow(String km) { + return 'दूरी: $km किमी'; + } + + @override + String historyOutRow(String out, String km) { + return 'आउट: $out • $km किमी'; + } + + @override + String get keepTracking => 'ट्रैकिंग चालू रखें'; + + @override + String get batteryExemptBody => + 'Xiaomi, Oppo, Vivo और Samsung फोन बैटरी बचाने के लिए बैकग्राउंड ट्रैकिंग बंद कर देते हैं। स्क्रीन बंद होने पर भी ड्यूटी ट्रैकिंग चालू रखने के लिए इस ऐप के लिए अनियंत्रित बैटरी उपयोग की अनुमति दें?'; + + @override + String get laterBtn => 'बाद में'; + + @override + String get openSettings => 'सेटिंग्स खोलें'; + + @override + String get scanBarcode => 'बारकोड स्कैन करें'; + + @override + String get barCode => 'बार कोड'; + + @override + String get scannedBarcode => 'स्कैन किया गया बारकोड:'; + + @override + String get scanQR => 'क्यूआर स्कैन करें'; + + @override + String get qrCode => 'क्यूआर कोड'; + + @override + String get scannedQRCode => 'स्कैन किया गया क्यूआर कोड:'; + + @override + String get scanQRCode => 'क्यूआर कोड स्कैन करें'; + + @override + String get generatedQrCode => 'जनरेट किया गया क्यूआर कोड'; + + @override + String get generatedBarCode => 'जनरेट किया गया बार कोड'; + + @override + String get qrAndBarCode => 'क्यूआर और बार कोड'; + + @override + String get generateQr => 'क्यूआर बनाएं'; + + @override + String get generateBarCode => 'बार कोड बनाएं'; + + @override + String get qrCodeScanner => 'क्यूआर कोड स्कैनर'; + + @override + String get barCodeScanner => 'बार कोड स्कैनर'; + + @override + String get qrCodeData => 'क्यूआर कोड डेटा'; + + @override + String get barCodeData => 'बार कोड डेटा'; } diff --git a/lib/screens/Attendance/attendance_service.dart b/lib/screens/Attendance/attendance_service.dart index a87f4a1..4e77a9d 100644 --- a/lib/screens/Attendance/attendance_service.dart +++ b/lib/screens/Attendance/attendance_service.dart @@ -5,6 +5,7 @@ import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:geolocator/geolocator.dart'; import 'package:permission_handler/permission_handler.dart' as ph; +import '../../l10n/app_localizations.dart'; import 'attendance_math.dart'; import 'attendance_storage.dart'; @@ -261,18 +262,17 @@ class AttendanceService { final bool? go = await showDialog( context: context, builder: (c) => AlertDialog( - title: const Text('Keep tracking running'), - content: const Text( - 'Xiaomi, Oppo, Vivo and Samsung phones stop background tracking ' - 'to save battery. Allow "Unrestricted" battery use for this app ' - 'so duty tracking keeps working when the screen is off?'), + title: Text(AppLocalizations.of(context)!.keepTracking), + content: Text( + AppLocalizations.of(context)!.batteryExemptBody), actions: [ TextButton( onPressed: () => Navigator.of(c).pop(false), - child: const Text('Later')), + child: Text(AppLocalizations.of(context)!.laterBtn)), TextButton( onPressed: () => Navigator.of(c).pop(true), - child: const Text('Open settings')), + child: Text( + AppLocalizations.of(context)!.openSettings)), ], ), ); diff --git a/lib/screens/Attendance/punch_screen.dart b/lib/screens/Attendance/punch_screen.dart index 578d59e..f8afc69 100644 --- a/lib/screens/Attendance/punch_screen.dart +++ b/lib/screens/Attendance/punch_screen.dart @@ -5,6 +5,7 @@ import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import '../../Utils/image_constant.dart'; import '../../Utils/size_utils.dart'; +import '../../l10n/app_localizations.dart'; import '../../theme/app_style.dart'; import '../../widgets/app_bar/appbar_image.dart'; import '../../widgets/app_bar/appbar_title.dart'; @@ -116,9 +117,9 @@ class _PunchScreenState extends State { await AttendanceService.maybeAskBatteryExemption(context); } await _refresh(); - _msg('Punched in - tracking every 5 min', false); + _msg(AppLocalizations.of(context)!.punchedInTracking, false); } catch (e) { - _msg('Punch in failed: $e', true); + _msg(AppLocalizations.of(context)!.punchInFailed(e.toString()), true); } finally { if (mounted) setState(() => _busy = false); } @@ -135,22 +136,21 @@ class _PunchScreenState extends State { showDialog( context: context, builder: (c) => AlertDialog( - title: const Text('Duty summary'), + title: Text(AppLocalizations.of(context)!.dutySummary), content: Text( - 'Points recorded: $pts\n' - 'Distance (straight line): ${km.toStringAsFixed(2)} km\n' - 'Road distance: coming in step 4 (free API).', + AppLocalizations.of(context)!.dutySummaryBody( + pts.toString(), km.toStringAsFixed(2)), ), actions: [ TextButton( onPressed: () => Navigator.of(c).pop(), - child: const Text('OK'), + child: Text(AppLocalizations.of(context)!.ok), ), ], ), ); } catch (e) { - _msg('Punch out failed: $e', true); + _msg(AppLocalizations.of(context)!.punchOutFailed(e.toString()), true); } finally { if (mounted) setState(() => _busy = false); } @@ -180,7 +180,8 @@ class _PunchScreenState extends State { onTap: () => Navigator.pop(context), ), centerTitle: true, - title: AppbarTitle(text: 'Duty Punch'), + title: AppbarTitle( + text: AppLocalizations.of(context)!.dutyPunch), ), body: SingleChildScrollView( padding: const EdgeInsets.all(16), @@ -192,22 +193,22 @@ class _PunchScreenState extends State { CustomButton( height: getVerticalSize(50), text: _busy - ? 'Please wait...' - : (_punchedIn ? 'Punch Out' : 'Punch In'), + ? AppLocalizations.of(context)!.pleaseWait + : (_punchedIn + ? AppLocalizations.of(context)!.punchOut + : AppLocalizations.of(context)!.punchIn), margin: getMargin(top: 8, bottom: 5), onTap: _busy ? () {} : (_punchedIn ? _onPunchOut : _onPunchIn), ), const SizedBox(height: 8), Text( - 'Keeps recording one location every 5 min, even with the app ' - 'minimized. For Xiaomi/Oppo/Vivo/Samsung allow Unrestricted ' - 'battery use or tracking may pause.', + AppLocalizations.of(context)!.batteryNote, style: AppStyle.txtGilroyMedium16Bluegray900.copyWith( fontSize: 12, ), ), const SizedBox(height: 20), - Text('Recent duties', + Text(AppLocalizations.of(context)!.recentDuties, style: AppStyle.txtGilroyMedium16Bluegray900.copyWith( fontWeight: FontWeight.bold, )), @@ -238,20 +239,29 @@ class _PunchScreenState extends State { ), const SizedBox(width: 8), Text( - _punchedIn ? 'Punched IN' : 'Punched OUT', + _punchedIn + ? AppLocalizations.of(context)!.punchedIn + : AppLocalizations.of(context)!.punchedOut, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold), ), ], ), const SizedBox(height: 12), - Text('Session: ${_sessionId ?? '-'}'), - if (_punchInTime != null) Text('Since: $_punchInTime'), + Text(AppLocalizations.of(context)! + .sessionRow(_sessionId ?? '-')), + if (_punchInTime != null) + Text(AppLocalizations.of(context)! + .sinceRow(_punchInTime!)), const SizedBox(height: 8), - Text('Points: $_points', + Text( + AppLocalizations.of(context)! + .pointsRow(_points.toString()), style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600)), - Text('Distance: ${_km.toStringAsFixed(2)} km', + Text( + AppLocalizations.of(context)! + .distanceRow(_km.toStringAsFixed(2)), style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600)), ], @@ -268,7 +278,9 @@ class _PunchScreenState extends State { title: Text('${s['punch_in']}', style: const TextStyle(fontSize: 12)), subtitle: Text( - 'Out: ${s['punch_out'] ?? '-'} • ${km.toStringAsFixed(2)} km', + AppLocalizations.of(context)!.historyOutRow( + (s['punch_out'] ?? '-').toString(), + km.toStringAsFixed(2)), style: const TextStyle(fontSize: 11)), trailing: Text(status, style: TextStyle( diff --git a/lib/screens/QrBarCode/Barcode/Barcode_create_entity_screen.dart b/lib/screens/QrBarCode/Barcode/Barcode_create_entity_screen.dart index 9856028..8d60818 100644 --- a/lib/screens/QrBarCode/Barcode/Barcode_create_entity_screen.dart +++ b/lib/screens/QrBarCode/Barcode/Barcode_create_entity_screen.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; // OLD: import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; // removed no namespace AGP8 - by Azmat import 'package:mobile_scanner/mobile_scanner.dart'; // migrated for AGP8 Java17 - by Azmat +import '../../../l10n/app_localizations.dart'; + class BarcodeScreen extends StatefulWidget { const BarcodeScreen({super.key}); @@ -22,7 +24,8 @@ class _BarcodeScreenState extends State { context, MaterialPageRoute( builder: (context) => Scaffold( - appBar: AppBar(title: const Text('Scan Barcode')), + appBar: AppBar( + title: Text(AppLocalizations.of(context)!.scanBarcode)), body: MobileScanner( controller: barCodeController, onDetect: (capture) => Navigator.pop( @@ -47,7 +50,8 @@ class _BarcodeScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('BAR CODE')), + appBar: AppBar( + title: Text(AppLocalizations.of(context)!.barCode)), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16), @@ -56,8 +60,8 @@ class _BarcodeScreenState extends State { child: Center( child: Column( children: [ - const Text( - 'Scanned Barcode:', + Text( + AppLocalizations.of(context)!.scannedBarcode, style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), const SizedBox(height: 10), @@ -71,7 +75,8 @@ class _BarcodeScreenState extends State { scanBarcode(); // Trigger barcode scanning }, icon: const Icon(Icons.camera_alt), // Camera icon - label: const Text('Scan Barcode'), + label: Text( + AppLocalizations.of(context)!.scanBarcode), ), const SizedBox(height: 16), ], diff --git a/lib/screens/QrBarCode/Qr_BarCode/Qr_BarCode_create_entity_screen.dart b/lib/screens/QrBarCode/Qr_BarCode/Qr_BarCode_create_entity_screen.dart index 29d8a08..e6f57dd 100644 --- a/lib/screens/QrBarCode/Qr_BarCode/Qr_BarCode_create_entity_screen.dart +++ b/lib/screens/QrBarCode/Qr_BarCode/Qr_BarCode_create_entity_screen.dart @@ -7,6 +7,7 @@ import 'package:barcode_widget/barcode_widget.dart'; import '../Barcode/Barcode_create_entity_screen.dart'; import '../Qrcode/Qrcode_create_entity_screen.dart'; +import '../../../l10n/app_localizations.dart'; class QrBarCodeScreen extends StatefulWidget { const QrBarCodeScreen({super.key}); @@ -26,7 +27,7 @@ class _QrBarCodeScreenState extends State { context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text('Generated QR Code'), + title: Text(AppLocalizations.of(context)!.generatedQrCode), content: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -45,7 +46,7 @@ class _QrBarCodeScreenState extends State { onPressed: () { Navigator.of(context).pop(); // Close the dialog }, - child: const Text('Close'), + child: Text(AppLocalizations.of(context)!.close), ), ], ), @@ -62,7 +63,8 @@ class _QrBarCodeScreenState extends State { context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text('Generated Bar Code'), + title: Text( + AppLocalizations.of(context)!.generatedBarCode), content: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -87,7 +89,7 @@ class _QrBarCodeScreenState extends State { onPressed: () { Navigator.of(context).pop(); // Close the dialog }, - child: const Text('Close'), + child: Text(AppLocalizations.of(context)!.close), ), ], ), @@ -104,7 +106,9 @@ class _QrBarCodeScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('QR AND BAR CODE')), + appBar: AppBar( + title: + Text(AppLocalizations.of(context)!.qrAndBarCode)), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16), @@ -115,27 +119,34 @@ class _QrBarCodeScreenState extends State { // GENERATE QR CODE TextFormField( controller: qr_code_dataController, - decoration: const InputDecoration(labelText: 'qr_code_data'), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)! + .qrCodeData), ), const SizedBox(height: 16), ElevatedButton( onPressed: () { _showqr_code_dataDialog(); }, - child: const Text('Generate Qr')), + child: Text(AppLocalizations.of(context)! + .generateQr)), // GENERATE BAR CODE TextFormField( controller: bar_code_dataController, - decoration: const InputDecoration(labelText: 'Bar Code Data'), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)! + .barCodeData), ), const SizedBox(height: 16), ElevatedButton( onPressed: () { _show_bar_code_dataDialog(bar_code_dataController.text); }, - child: const Text('Generate Bar code'), + child: Text(AppLocalizations.of(context)! + .generateBarCode), ), + // QR CODE SCANNER const SizedBox(height: 16), @@ -146,7 +157,8 @@ class _QrBarCodeScreenState extends State { MaterialPageRoute( builder: (context) => const qrcodeScreen())); }, - child: const Text('QR Code Scanner'), + child: Text(AppLocalizations.of(context)! + .qrCodeScanner), ), // BAR CODE SCANNER @@ -158,7 +170,8 @@ class _QrBarCodeScreenState extends State { MaterialPageRoute( builder: (context) => const BarcodeScreen())); }, - child: const Text('Bar Code Scanner'), + child: Text(AppLocalizations.of(context)! + .barCodeScanner), ), ], ), diff --git a/lib/screens/QrBarCode/Qrcode/Qrcode_create_entity_screen.dart b/lib/screens/QrBarCode/Qrcode/Qrcode_create_entity_screen.dart index 8e9af4c..4fd12e2 100644 --- a/lib/screens/QrBarCode/Qrcode/Qrcode_create_entity_screen.dart +++ b/lib/screens/QrBarCode/Qrcode/Qrcode_create_entity_screen.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; // OLD: import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; // removed no namespace AGP8 - by Azmat import 'package:mobile_scanner/mobile_scanner.dart'; // migrated for AGP8 Java17 - by Azmat +import '../../../l10n/app_localizations.dart'; + class qrcodeScreen extends StatefulWidget { const qrcodeScreen({super.key}); @@ -22,7 +24,8 @@ class _qrcodeScreenState extends State { context, MaterialPageRoute( builder: (context) => Scaffold( - appBar: AppBar(title: const Text('Scan QR')), + appBar: AppBar( + title: Text(AppLocalizations.of(context)!.scanQR)), body: MobileScanner( controller: qrCodeController, onDetect: (capture) => Navigator.pop( @@ -47,7 +50,8 @@ class _qrcodeScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('QR Code')), + appBar: AppBar( + title: Text(AppLocalizations.of(context)!.qrCode)), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16), @@ -56,8 +60,8 @@ class _qrcodeScreenState extends State { child: Center( child: Column( children: [ - const Text( - 'Scanned QRcode:', + Text( + AppLocalizations.of(context)!.scannedQRCode, style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), const SizedBox(height: 10), @@ -71,7 +75,8 @@ class _qrcodeScreenState extends State { scanQRcode(); // Trigger barcode scanning }, icon: const Icon(Icons.camera_alt), // Camera icon - label: const Text('Scan QRcode'), + label: Text( + AppLocalizations.of(context)!.scanQRCode), ), const SizedBox(height: 16), ], diff --git a/lib/screens/main_app_screen/tabbed_layout_component.dart b/lib/screens/main_app_screen/tabbed_layout_component.dart index 50aecf5..8b3d702 100644 --- a/lib/screens/main_app_screen/tabbed_layout_component.dart +++ b/lib/screens/main_app_screen/tabbed_layout_component.dart @@ -20,6 +20,7 @@ import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import '../../Utils/color_constants.dart'; import '../../Utils/size_utils.dart'; +import '../../l10n/app_localizations.dart'; import '../../providers/tab_navigation_provider.dart'; import '../../providers/token_manager.dart'; import '../../resources/api_constants.dart'; @@ -400,7 +401,7 @@ class _TabbedLayoutComponentState extends State { extendBodyBehindAppBar: true, //bottomNavigationBar: AppFooter(), body: screens.isEmpty - ? const Text("Loading...") + ? Text(AppLocalizations.of(context)!.loading) : ListView.builder( itemCount: screens.length, scrollDirection: Axis.vertical, @@ -453,7 +454,7 @@ class _TabbedLayoutComponentState extends State { GButton( icon: FluentIcons.home_32_regular, iconSize: 36, - text: 'Home', + text: AppLocalizations.of(context)!.navHome, onPressed: () { print('home'); }, @@ -461,7 +462,7 @@ class _TabbedLayoutComponentState extends State { GButton( icon: FluentIcons.people_32_regular, iconSize: 36, - text: 'Contacts', + text: AppLocalizations.of(context)!.navContacts, onPressed: () { print('contacts'); // Navigator.push( @@ -476,7 +477,7 @@ class _TabbedLayoutComponentState extends State { ), GButton( icon: Icons.wallet, - text: 'Wallet', + text: AppLocalizations.of(context)!.navWallet, iconSize: 34, onPressed: () { print('wallet'); diff --git a/lib/screens/profileManagement/Profilesettings.dart b/lib/screens/profileManagement/Profilesettings.dart index 8b0657d..4ca04b2 100644 --- a/lib/screens/profileManagement/Profilesettings.dart +++ b/lib/screens/profileManagement/Profilesettings.dart @@ -152,11 +152,12 @@ class _ProfileSettingsScreenState extends State { context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text('Error'), - content: Text('Please select an image.'), + title: Text(AppLocalizations.of(context)!.error), + content: Text( + AppLocalizations.of(context)!.selectImage), actions: [ TextButton( - child: const Text('OK'), + child: Text(AppLocalizations.of(context)!.ok), onPressed: () { Navigator.of(context).pop(); }, @@ -180,7 +181,9 @@ class _ProfileSettingsScreenState extends State { await fetchProfileImageData(); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Profile image updated')), + SnackBar( + content: Text(AppLocalizations.of(context)! + .profileImageUpdated)), ); } } catch (e) { @@ -188,11 +191,12 @@ class _ProfileSettingsScreenState extends State { context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text('Error'), - content: Text('Failed to upload image: $e'), + title: Text(AppLocalizations.of(context)!.error), + content: Text(AppLocalizations.of(context)! + .failedUploadImage(e.toString())), actions: [ TextButton( - child: const Text('OK'), + child: Text(AppLocalizations.of(context)!.ok), onPressed: () { Navigator.of(context).pop(); }, @@ -212,7 +216,9 @@ class _ProfileSettingsScreenState extends State { if (rawUserId == null) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('User id missing, please re-login')), + SnackBar( + content: Text( + AppLocalizations.of(context)!.userIdMissing)), ); } return; @@ -241,7 +247,9 @@ class _ProfileSettingsScreenState extends State { print("success"); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Profile updated')), + SnackBar( + content: Text( + AppLocalizations.of(context)!.profileUpdated)), ); Navigator.of(context).pop(); } @@ -251,15 +259,18 @@ class _ProfileSettingsScreenState extends State { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text( - 'Failed to update profile: ${response.statusCode}')), + content: Text(AppLocalizations.of(context)! + .failedUpdateProfile( + response.statusCode.toString()))), ); } } } catch (e) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Failed to update: $e')), + SnackBar( + content: Text(AppLocalizations.of(context)! + .failedUpdate(e.toString()))), ); } } @@ -301,7 +312,9 @@ class _ProfileSettingsScreenState extends State { Navigator.pop(context); }), centerTitle: true, - title: AppbarTitle(text: "My Profile Settings")), + title: AppbarTitle( + text: + AppLocalizations.of(context)!.myProfileSettings)), body: SingleChildScrollView( padding: EdgeInsets.all(16), child: Column( @@ -323,7 +336,8 @@ class _ProfileSettingsScreenState extends State { SizedBox(height: 10), CustomButton( height: getVerticalSize(50), - text: "Pick a Profile Photo", + text: AppLocalizations.of(context)! + .pickProfilePhoto, margin: getMargin(top: 24, bottom: 5), onTap: () async { // Pick + auto-upload, same as authsec_flutter_new @@ -345,7 +359,7 @@ class _ProfileSettingsScreenState extends State { SizedBox(height: 20), // Section: Profile Form Text( - 'Your Profile Information', + AppLocalizations.of(context)!.yourProfileInfo, style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), SizedBox(height: 10), @@ -359,17 +373,21 @@ class _ProfileSettingsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text("Your Full Name", + Text( + AppLocalizations.of(context)! + .yourFullName, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900), CustomTextFormField( focusNode: FocusNode(), controller: fullNameController, - hintText: "Enter Full Name", + hintText: AppLocalizations.of(context)! + .enterFullName, validator: (value) { if (value!.isEmpty) { - return 'Please enter your full name'; + return AppLocalizations.of(context)! + .enterFullNameError; } return null; }, @@ -381,13 +399,14 @@ class _ProfileSettingsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text("Pronouns", + Text(AppLocalizations.of(context)!.pronouns, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900), CustomTextFormField( focusNode: FocusNode(), - hintText: "Enter Pronouns", + hintText: AppLocalizations.of(context)! + .enterPronouns, controller: pronounsController, margin: getMargin(top: 6)) ])), @@ -397,13 +416,14 @@ class _ProfileSettingsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text("Role", + Text(AppLocalizations.of(context)!.role, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900), CustomTextFormField( focusNode: FocusNode(), - hintText: "Enter Role", + hintText: AppLocalizations.of(context)! + .enterRole, controller: roleController, margin: getMargin(top: 6)) ])), @@ -413,13 +433,16 @@ class _ProfileSettingsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text("Department or Team", + Text( + AppLocalizations.of(context)! + .departmentOrTeam, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900), CustomTextFormField( focusNode: FocusNode(), - hintText: "Enter Department or Team", + hintText: AppLocalizations.of(context)! + .enterDepartmentOrTeam, controller: departmentController, margin: getMargin(top: 6)) ])), @@ -429,17 +452,19 @@ class _ProfileSettingsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text("Email", + Text(AppLocalizations.of(context)!.email, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900), CustomTextFormField( focusNode: FocusNode(), - hintText: "Enter Email", + hintText: AppLocalizations.of(context)! + .enterEmail, controller: emailController, validator: (value) { if (value!.isEmpty || !value!.contains('@')) { - return 'Please enter a valid email address'; + return AppLocalizations.of(context)! + .validEmailError; } return null; }, @@ -451,20 +476,21 @@ class _ProfileSettingsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text("About Me", + Text(AppLocalizations.of(context)!.aboutMe, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900), CustomTextFormField( focusNode: FocusNode(), - hintText: "About Me", + hintText: AppLocalizations.of(context)! + .aboutMe, controller: aboutMeController, maxLines: 3, margin: getMargin(top: 6)) ])), CustomButton( height: getVerticalSize(50), - text: "Update Profile", + text: AppLocalizations.of(context)!.updateProfile, margin: getMargin(top: 24, bottom: 5), onTap: _updateProfile, ), @@ -489,8 +515,8 @@ class _ProfileSettingsScreenState extends State { text: TextSpan( children: [ TextSpan( - text: - "Password:Change Password for your account Change password", + text: AppLocalizations.of(context)! + .profilePasswordRow, style: TextStyle( fontWeight: FontWeight.normal, color: Colors.blue, @@ -509,8 +535,8 @@ class _ProfileSettingsScreenState extends State { text: TextSpan( children: [ TextSpan( - text: - 'Security:Logout of all sessions except this current browser Logout other sessions', + text: AppLocalizations.of(context)! + .profileSecurityRow, style: TextStyle( fontWeight: FontWeight.normal, color: Colors.blue, @@ -529,8 +555,8 @@ class _ProfileSettingsScreenState extends State { text: TextSpan( children: [ TextSpan( - text: - 'Deactivation:Remove access to all organizations and workspace in cloudnsure Deactivate account', + text: AppLocalizations.of(context)! + .profileDeactivationRow, style: TextStyle( fontWeight: FontWeight.normal, color: Colors.blue, diff --git a/lib/screens/profileManagement/about.dart b/lib/screens/profileManagement/about.dart index 9475f06..08e6ff1 100644 --- a/lib/screens/profileManagement/about.dart +++ b/lib/screens/profileManagement/about.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import '../../Utils/image_constant.dart'; import '../../Utils/size_utils.dart'; +import '../../l10n/app_localizations.dart'; import '../../theme/app_style.dart'; import '../../widgets/app_bar/appbar_image.dart'; import '../../widgets/app_bar/appbar_title.dart'; @@ -23,18 +24,19 @@ class AboutScreen extends StatelessWidget { Navigator.pop(context); }), centerTitle: true, - title: AppbarTitle(text: "About Us")), + title: AppbarTitle( + text: AppLocalizations.of(context)!.aboutUs)), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'About Us', + AppLocalizations.of(context)!.aboutUs, style: AppStyle.txtGilroyBold18Bluegray900, ), const SizedBox(height: 20), Text( - 'Create a new project if you have access, if you don\'t have access, then contact the admin.', + AppLocalizations.of(context)!.aboutDescription, textAlign: TextAlign.center, style: AppStyle.txtGilroyBold16BlueA700, ), diff --git a/lib/screens/profileManagement/changepassword.dart b/lib/screens/profileManagement/changepassword.dart index 0d46099..a990fdf 100644 --- a/lib/screens/profileManagement/changepassword.dart +++ b/lib/screens/profileManagement/changepassword.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import '../../Utils/image_constant.dart'; import '../../Utils/size_utils.dart'; +import '../../l10n/app_localizations.dart'; import '../../providers/token_manager.dart'; import '../../resources/api_constants.dart'; import 'package:http/http.dart' as http; @@ -40,14 +41,15 @@ class ResetPasswordScreen extends StatelessWidget { Navigator.pop(context); }), centerTitle: true, - title: AppbarTitle(text: "Reset Password")), + title: AppbarTitle( + text: AppLocalizations.of(context)!.resetPassword)), body: SingleChildScrollView( padding: EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( - "You're signed in as $userEmail", + AppLocalizations.of(context)!.signedInAs(userEmail), style: AppStyle.txtGilroyMedium16Bluegray800 ), const SizedBox(height: 20), @@ -62,7 +64,7 @@ class ResetPasswordScreen extends StatelessWidget { ); }, child: Text( - 'Wrong account? Log in instead.', + AppLocalizations.of(context)!.wrongAccount, style: AppStyle.txtGreenSemiBold16, ), ), @@ -132,7 +134,7 @@ class _ResetPasswordFormState extends State { Padding( padding: getPadding(top: 19), - child: Text("Enter Old Password", + child: Text(AppLocalizations.of(context)!.enterOldPassword, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -140,16 +142,17 @@ class _ResetPasswordFormState extends State { CustomTextFormField( focusNode: FocusNode(), controller: oldPasswordController, - hintText: "Enter Old Password", + hintText: + AppLocalizations.of(context)!.enterOldPassword, margin: getMargin(top: 6), errorText: - _isPasswordValid1 ? null : 'Please enter your old password', + _isPasswordValid1 ? null : AppLocalizations.of(context)!.oldPasswordError, padding: TextFormFieldPadding.PaddingT12, textInputAction: TextInputAction.done, onChanged: _validatePassword1, validator: (value) { if (value!.isEmpty) { - return 'Please enter your old password'; + return AppLocalizations.of(context)!.oldPasswordError; } return null; // Return null to indicate no error }, @@ -170,7 +173,7 @@ class _ResetPasswordFormState extends State { Padding( padding: getPadding(top: 19), - child: Text("Enter New Password", + child: Text(AppLocalizations.of(context)!.enterNewPassword, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -178,7 +181,8 @@ class _ResetPasswordFormState extends State { CustomTextFormField( focusNode: FocusNode(), controller: newPasswordController, - hintText: "Enter New Password", + hintText: + AppLocalizations.of(context)!.enterNewPassword, margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputAction: TextInputAction.done, @@ -193,11 +197,11 @@ class _ResetPasswordFormState extends State { }, ), errorText: - _isPasswordValid2 ? null : 'Please enter your new password', + _isPasswordValid2 ? null : AppLocalizations.of(context)!.newPasswordError, onChanged: _validatePassword2, validator: (value) { if (value!.isEmpty) { - return 'Please enter your new password'; + return AppLocalizations.of(context)!.newPasswordError; } return null; }, @@ -207,7 +211,8 @@ class _ResetPasswordFormState extends State { Padding( padding: getPadding(top: 19), - child: Text("Re-Enter New Password", + child: Text( + AppLocalizations.of(context)!.reEnterNewPassword, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -215,16 +220,17 @@ class _ResetPasswordFormState extends State { CustomTextFormField( focusNode: FocusNode(), controller: reEnterNewPasswordController, - hintText: "Re-Enter New Password", + hintText: + AppLocalizations.of(context)!.reEnterNewPassword, margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, onChanged: _validatePassword3, validator: (value) { if (value!.isEmpty) { - return 'Please re-enter your new password'; + return AppLocalizations.of(context)!.reEnterPasswordError; } if (value != newPasswordController.text) { - return 'Passwords do not match'; + return AppLocalizations.of(context)!.passwordsDontMatch; } return null; }, @@ -241,7 +247,7 @@ class _ResetPasswordFormState extends State { }, ), errorText: - _isPasswordValid3 ? null : 'Please re-enter your new password', + _isPasswordValid3 ? null : AppLocalizations.of(context)!.reEnterPasswordError, textInputAction: TextInputAction.done, suffixConstraints: BoxConstraints( maxHeight: getVerticalSize(44)), @@ -249,7 +255,7 @@ class _ResetPasswordFormState extends State { CustomButton( height: getVerticalSize(50), - text: "Continue", + text: AppLocalizations.of(context)!.continueBtn, margin: getMargin(top: 24, bottom: 5), onTap: () async { if (oldPasswordController.text.isEmpty || @@ -283,7 +289,8 @@ class _ResetPasswordFormState extends State { setState(() { isVisible=true; issuccess=true; - responseMessage = "Password Changes Successfully"; + responseMessage = AppLocalizations.of(context)! + .passwordChangedSuccess; }); print("success"); Navigator.pushAndRemoveUntil( @@ -294,7 +301,8 @@ class _ResetPasswordFormState extends State { } else { setState(() { isVisible=true; - responseMessage = "Incorrect Password"; + responseMessage = AppLocalizations.of(context)! + .incorrectPassword; }); print(response.statusCode); } diff --git a/lib/screens/sign_up_screen/CreateAccount.dart b/lib/screens/sign_up_screen/CreateAccount.dart index 20face0..1e7e472 100644 --- a/lib/screens/sign_up_screen/CreateAccount.dart +++ b/lib/screens/sign_up_screen/CreateAccount.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../../Utils/size_utils.dart'; +import '../../l10n/app_localizations.dart'; import '../../theme/app_style.dart'; import '../../widgets/custom_button.dart'; import '../../widgets/custom_text_form_field.dart'; @@ -42,7 +43,8 @@ class _CreateAccountScreenState extends State { _context = context; // Store the context return Scaffold( - appBar: AppBar(title: const Text('Create Account')), + appBar: AppBar( + title: Text(AppLocalizations.of(context)!.createAccount)), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16), @@ -52,7 +54,8 @@ class _CreateAccountScreenState extends State { children: [ Padding( padding: getPadding(top: 19), - child: Text("Company Name", + child: Text( + AppLocalizations.of(context)!.companyName, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -62,18 +65,20 @@ class _CreateAccountScreenState extends State { onsaved: (value) => formData['companyName'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Company Name'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.companyName); } return null; }, - hintText: "enter Company Name", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.companyName), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputType: TextInputType.text ), Padding( padding: getPadding(top: 19), - child: Text("Email", + child: Text(AppLocalizations.of(context)!.email, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -84,20 +89,23 @@ class _CreateAccountScreenState extends State { onChanged: _validateEmail, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Email'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.email); }else if(!_isEmailValid){ - return 'Please enter a valid email'; + return AppLocalizations.of(context)!.validEmailShort; } return null; }, - hintText: "enter Email", + hintText: AppLocalizations.of(context)! + .enterThis(AppLocalizations.of(context)!.email), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputType: TextInputType.text ), Padding( padding: getPadding(top: 19), - child: Text("Mobile Number", + child: Text( + AppLocalizations.of(context)!.mobileNumber, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -111,17 +119,19 @@ class _CreateAccountScreenState extends State { onsaved: (value) => formData['mobile'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Mob No'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.mobileNumber); } return null; }, - hintText: "enter Mobile Number", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.mobileNumber), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, ), Padding( padding: getPadding(top: 19), - child: Text("Workspace", + child: Text(AppLocalizations.of(context)!.workspace, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -131,18 +141,20 @@ class _CreateAccountScreenState extends State { onsaved: (value) => formData['workspace'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Workspace'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.workspace); } return null; }, - hintText: "enter Workspace", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.workspace), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputType: TextInputType.text ), Padding( padding: getPadding(top: 19), - child: Text("Gst Number", + child: Text(AppLocalizations.of(context)!.gstNumber, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -152,18 +164,20 @@ class _CreateAccountScreenState extends State { onsaved: (value) => formData['gstNumber'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Gst Number'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.gstNumber); } return null; }, - hintText: "enter Gst Number", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.gstNumber), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputType: TextInputType.text ), Padding( padding: getPadding(top: 19), - child: Text("pancard", + child: Text(AppLocalizations.of(context)!.pancard, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -173,18 +187,21 @@ class _CreateAccountScreenState extends State { onsaved: (value) => formData['pancard'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Pancard'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.pancard); } return null; }, - hintText: "enter pancard", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.pancard), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputType: TextInputType.text ), Padding( padding: getPadding(top: 19), - child: Text("Working", + child: Text( + AppLocalizations.of(context)!.workingField, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -194,11 +211,13 @@ class _CreateAccountScreenState extends State { onsaved: (value) => formData['working'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Working'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.workingField); } return null; }, - hintText: "enter Working", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.workingField), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputType: TextInputType.text @@ -208,7 +227,7 @@ class _CreateAccountScreenState extends State { child: CustomButton( height: getVerticalSize(50), width: getHorizontalSize(396), - text: "SUBMIT", + text: AppLocalizations.of(context)!.submitCaps, margin: getMargin(top: 25), onTap: () async { if (_formKey.currentState!.validate()) { @@ -234,11 +253,16 @@ class _CreateAccountScreenState extends State { context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text('Error'), - content: Text('Account Creation Failed: $e'), + title: Text(AppLocalizations.of(context)! + .error), + content: Text( + AppLocalizations.of(context)! + .accountCreationFailed( + e.toString())), actions: [ TextButton( - child: const Text('OK'), + child: Text( + AppLocalizations.of(context)!.ok), onPressed: () { Navigator.of(context).pop(); }, diff --git a/lib/screens/sign_up_screen/CreateUser.dart b/lib/screens/sign_up_screen/CreateUser.dart index df15acd..bb0b156 100644 --- a/lib/screens/sign_up_screen/CreateUser.dart +++ b/lib/screens/sign_up_screen/CreateUser.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import '../../l10n/app_localizations.dart'; import 'SignUpService.dart'; class CreateUserScreen extends StatefulWidget { @@ -26,7 +27,8 @@ class _CreateUserScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('Sign Up - Step ${_currentStep + 1}'), + title: Text(AppLocalizations.of(context)! + .signUpStep((_currentStep + 1).toString())), ), body: Column( children: [ @@ -46,14 +48,14 @@ class _CreateUserScreenState extends State { _currentStep--; }); }, - child: const Text('Previous'), + child: Text(AppLocalizations.of(context)!.previous), ), if (_currentStep < 2) ElevatedButton( onPressed: () { _proceedToNextStep(); }, - child: const Text('Next'), + child: Text(AppLocalizations.of(context)!.next), ), ], ), @@ -125,79 +127,95 @@ class StepCreateAccountState extends State { alignment: Alignment.center, child: Column( children: [ - const Text('Step 1: Create Account'), + Text(AppLocalizations.of(context)!.step1CreateAccount), TextFormField( - decoration: const InputDecoration(labelText: 'Company Name'), + decoration: InputDecoration( + labelText: + AppLocalizations.of(context)!.companyName), onSaved: (value) => formData['companyName'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Company Name'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.companyName); } return null; }, ), const SizedBox(height: 16), TextFormField( - decoration: const InputDecoration(labelText: 'Email'), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.email), onSaved: (value) => formData['email'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Email'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.email); } return null; }, ), const SizedBox(height: 16), TextFormField( - decoration: const InputDecoration(labelText: 'Mobile No'), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.mobileNo), onSaved: (value) => formData['mobile'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Mob No'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.mobileNo); } return null; }, ), const SizedBox(height: 16), TextFormField( - decoration: const InputDecoration(labelText: 'Workspace'), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.workspace), onSaved: (value) => formData['workspace'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Workspace'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.workspace); } return null; }, ), const SizedBox(height: 16), TextFormField( - decoration: const InputDecoration(labelText: 'Gst Number'), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.gstNumber), onSaved: (value) => formData['gstNumber'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Gst Number'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.gstNumber); } return null; }, ), const SizedBox(height: 16), TextFormField( - decoration: const InputDecoration(labelText: 'pancard'), + decoration: InputDecoration( + labelText: AppLocalizations.of(context)!.pancard), onSaved: (value) => formData['pancard'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Pancard'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.pancard); } return null; }, ), const SizedBox(height: 16), TextFormField( - decoration: const InputDecoration(labelText: 'Working'), + decoration: InputDecoration( + labelText: + AppLocalizations.of(context)!.workingField), onSaved: (value) => formData['working'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Working'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.workingField); } return null; }, @@ -228,12 +246,15 @@ class StepCreateAccountState extends State { showDialog( context: context, builder: (BuildContext context) { - return AlertDialog( - title: const Text('Error'), - content: Text('Account Creation Failed: $e'), + return AlertDialog( + title: Text( + AppLocalizations.of(context)!.error), + content: Text(AppLocalizations.of(context)! + .accountCreationFailed(e.toString())), actions: [ TextButton( - child: const Text('OK'), + child: Text( + AppLocalizations.of(context)!.ok), onPressed: () { Navigator.of(context).pop(); }, @@ -246,12 +267,12 @@ class StepCreateAccountState extends State { } } }, - child: const SizedBox( + child: SizedBox( width: double.infinity, height: 50, child: Center( child: Text( - 'SUBMIT', + AppLocalizations.of(context)!.submitCaps, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w600, @@ -261,7 +282,9 @@ class StepCreateAccountState extends State { ), ), ), - if (accountId != null) Text('Selected Account ID: $accountId'), + if (accountId != null) + Text(AppLocalizations.of(context)! + .selectedAccountId(accountId!)), ], ), ); @@ -284,7 +307,7 @@ class StepGetEmailVerificationState extends State { Widget build(BuildContext context) { return Container( alignment: Alignment.center, - child: Text('Step 2: Get Email Verification'), + child: Text(AppLocalizations.of(context)!.step2EmailVerification), ); } } @@ -303,7 +326,7 @@ class StepGetRegistrationState extends State { Widget build(BuildContext context) { return Container( alignment: Alignment.center, - child: Text('Step 3: Get Registration'), + child: Text(AppLocalizations.of(context)!.step3GetRegistration), ); } } @@ -313,14 +336,15 @@ class CreateAccountDialog extends StatelessWidget { @override Widget build(BuildContext context) { return AlertDialog( - title: Text('Create Account'), - content: Text('Account created successfully!'), + title: Text(AppLocalizations.of(context)!.createAccount), + content: + Text(AppLocalizations.of(context)!.accountCreatedSuccess), actions: [ ElevatedButton( onPressed: () { Navigator.of(context).pop('12345'); // Pass the created account ID }, - child: Text('OK'), + child: Text(AppLocalizations.of(context)!.ok), ), ], ); diff --git a/lib/screens/sign_up_screen/RegistrationDetails.dart b/lib/screens/sign_up_screen/RegistrationDetails.dart index 0eb59aa..6d9363f 100644 --- a/lib/screens/sign_up_screen/RegistrationDetails.dart +++ b/lib/screens/sign_up_screen/RegistrationDetails.dart @@ -4,6 +4,7 @@ import 'package:flutter/services.dart'; import '../../Utils/image_constant.dart'; import '../../Utils/size_utils.dart'; +import '../../l10n/app_localizations.dart'; import '../../theme/app_style.dart'; import '../../widgets/app_bar/appbar_image.dart'; import '../../widgets/app_bar/appbar_title.dart'; @@ -126,7 +127,8 @@ class _RegistrationDetailsScreenState extends State { Navigator.pop(context); }), centerTitle: true, - title: AppbarTitle(text: "Registration")), + title: AppbarTitle( + text: AppLocalizations.of(context)!.registration)), //AppBar(title: const Text('Registration')), body: SingleChildScrollView( child: Padding( @@ -138,7 +140,8 @@ class _RegistrationDetailsScreenState extends State { children: [ Padding( padding: getPadding(top: 19), - child: Text("First Name", + child: Text( + AppLocalizations.of(context)!.firstName, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -148,18 +151,20 @@ class _RegistrationDetailsScreenState extends State { onsaved: (value) => formData['first_name'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter First Name'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.firstName); } return null; }, - hintText: "enter First Name", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.firstName), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputType: TextInputType.text ), Padding( padding: getPadding(top: 19), - child: Text("Last Name", + child: Text(AppLocalizations.of(context)!.lastName, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -169,11 +174,13 @@ class _RegistrationDetailsScreenState extends State { onsaved: (value) => formData['last_name'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Last Name'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.lastName); } return null; }, - hintText: "enter Last Name", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.lastName), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputType: TextInputType.text @@ -181,7 +188,8 @@ class _RegistrationDetailsScreenState extends State { Padding( padding: getPadding(top: 19), - child: Text("Mobile Number", + child: Text( + AppLocalizations.of(context)!.mobileNumber, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: @@ -195,33 +203,38 @@ class _RegistrationDetailsScreenState extends State { onsaved: (value) => formData['mob_no'] = value, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Mobile Number'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.mobileNumber); } return null; }, - hintText: "enter Mobile Number", + hintText: AppLocalizations.of(context)!.enterThis( + AppLocalizations.of(context)!.mobileNumber), margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, ), Padding( padding: getPadding(top: 19), - child: Text("New Password", + child: Text(AppLocalizations.of(context)!.newPassword, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900)), CustomTextFormField( focusNode: _newPasswordNode, - hintText: "New Password", + hintText: + AppLocalizations.of(context)!.newPassword, margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputAction: TextInputAction.done, textInputType:TextInputType.visiblePassword, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Password'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.password); }else if(!_isPasswordValid){ - return 'Please enter a valid password'; + return AppLocalizations.of(context)! + .validPasswordShort; } return null; }, @@ -248,21 +261,24 @@ class _RegistrationDetailsScreenState extends State { Padding( padding: getPadding(top: 19), - child: Text("Confirm Password", + child: Text( + AppLocalizations.of(context)!.confirmPassword, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900)), CustomTextFormField( focusNode: _confirmPasswordNode, - hintText: "Confirm Password", + hintText: AppLocalizations.of(context)! + .confirmPassword, margin: getMargin(top: 6), padding: TextFormFieldPadding.PaddingT12, textInputAction: TextInputAction.done, textInputType:TextInputType.visiblePassword, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Password'; + return AppLocalizations.of(context)!.pleaseEnterThis( + AppLocalizations.of(context)!.password); } return _validatePasswordMatch(value); }, @@ -289,8 +305,9 @@ class _RegistrationDetailsScreenState extends State { Row( children: [ - const Expanded( - child: Text('Add Account'), + Expanded( + child: Text( + AppLocalizations.of(context)!.addAccount), ), IconButton( onPressed: () async { diff --git a/lib/screens/sign_up_screen/StepGetEmailVerification.dart b/lib/screens/sign_up_screen/StepGetEmailVerification.dart index 50f684e..9a7db5d 100644 --- a/lib/screens/sign_up_screen/StepGetEmailVerification.dart +++ b/lib/screens/sign_up_screen/StepGetEmailVerification.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import '../../l10n/app_localizations.dart'; + class StepGetEmailVerification extends StatefulWidget { final LabeledGlobalKey emailPasswordFormKey; // final Function updateSignUpDetails; @@ -67,7 +69,7 @@ class _StepGetEmailVerificationState extends State { // validator: _validateNewPassword, autofocus: mounted, autocorrect: false, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -76,7 +78,7 @@ class _StepGetEmailVerificationState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - hintText: "email", + hintText: AppLocalizations.of(context)!.email, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), style: const TextStyle(fontSize: 16, color: Color(0xFF929BAB)), diff --git a/lib/screens/sign_up_screen/StepGetRegistration.dart b/lib/screens/sign_up_screen/StepGetRegistration.dart index 7bb99ce..66b3e25 100644 --- a/lib/screens/sign_up_screen/StepGetRegistration.dart +++ b/lib/screens/sign_up_screen/StepGetRegistration.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import '../../l10n/app_localizations.dart'; + class StepGetRegistration extends StatefulWidget { final LabeledGlobalKey bankAccountFormKey; // final Function updateSignUpDetails; @@ -94,7 +96,7 @@ class _StepGetRegistrationState extends State { widget.finalStepProccessing(); } }, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -103,7 +105,7 @@ class _StepGetRegistrationState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - hintText: "first name", + hintText: AppLocalizations.of(context)!.firstName, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), style: const TextStyle(fontSize: 16, color: Color(0xFF929BAB)), @@ -153,7 +155,7 @@ class _StepGetRegistrationState extends State { widget.finalStepProccessing(); } }, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -162,7 +164,7 @@ class _StepGetRegistrationState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - hintText: "last name", + hintText: AppLocalizations.of(context)!.lastName, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), style: const TextStyle(fontSize: 16, color: Color(0xFF929BAB)), @@ -212,7 +214,7 @@ class _StepGetRegistrationState extends State { widget.finalStepProccessing(); } }, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -221,7 +223,7 @@ class _StepGetRegistrationState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - hintText: "mob no", + hintText: AppLocalizations.of(context)!.mobileNumber, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), style: const TextStyle(fontSize: 16, color: Color(0xFF929BAB)), @@ -270,7 +272,7 @@ class _StepGetRegistrationState extends State { widget.finalStepProccessing(); } }, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -279,7 +281,7 @@ class _StepGetRegistrationState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - hintText: "password", + hintText: AppLocalizations.of(context)!.password, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), style: const TextStyle(fontSize: 16, color: Color(0xFF929BAB)), @@ -329,7 +331,7 @@ class _StepGetRegistrationState extends State { widget.finalStepProccessing(); } }, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -338,7 +340,8 @@ class _StepGetRegistrationState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - hintText: "confirmPassword", + hintText: + AppLocalizations.of(context)!.confirmPassword, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), style: const TextStyle(fontSize: 16, color: Color(0xFF929BAB)), diff --git a/lib/screens/sign_up_screen/sign_up_step_1.dart b/lib/screens/sign_up_screen/sign_up_step_1.dart index 6319391..b96cbab 100644 --- a/lib/screens/sign_up_screen/sign_up_step_1.dart +++ b/lib/screens/sign_up_screen/sign_up_step_1.dart @@ -6,6 +6,7 @@ import 'package:pinput/pinput.dart'; import '../../Utils/color_constants.dart'; import '../../Utils/image_constant.dart'; import '../../Utils/size_utils.dart'; +import '../../l10n/app_localizations.dart'; import '../../theme/app_style.dart'; import '../../widgets/app_bar/appbar_image.dart'; import '../../widgets/app_bar/appbar_title.dart'; @@ -101,7 +102,8 @@ class _SignUpUserScreenState extends State { Navigator.pop(context); }), centerTitle: true, - title: AppbarTitle(text: "Create User")), + title: AppbarTitle( + text: AppLocalizations.of(context)!.createUser)), body: Builder( builder: (BuildContext context) { return SingleChildScrollView( @@ -120,7 +122,7 @@ class _SignUpUserScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text("Email", + Text(AppLocalizations.of(context)!.email, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16Bluegray900), @@ -129,17 +131,21 @@ class _SignUpUserScreenState extends State { controller: emailcontroller, validator: (value) { if (value == null || value.isEmpty) { - return 'Please enter Email'; + return AppLocalizations.of(context)! + .pleaseEnterThis( + AppLocalizations.of(context)! + .email); } return null; }, - hintText: "Enter Your Email", + hintText: AppLocalizations.of(context)! + .enterYourEmail, margin: getMargin(top: 7), textInputType: TextInputType.emailAddress), CustomButton( height: getVerticalSize(50), width: getHorizontalSize(396), - text: "Send OTP", + text: AppLocalizations.of(context)!.sendOtp, margin: getMargin(top: 25), onTap: () async { @@ -158,8 +164,9 @@ class _SignUpUserScreenState extends State { moveToNextStep(); } catch (e) { - showErrorMessage( - 'Failed to send OTP: $e'); + showErrorMessage(AppLocalizations.of( + context)! + .failedToSendOtp(e.toString())); } } @@ -226,7 +233,8 @@ class _SignUpUserScreenState extends State { top: 29, ), child: Text( - "Email Verification", + AppLocalizations.of(context)! + .emailVerification, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroySemiBold24, @@ -242,7 +250,8 @@ class _SignUpUserScreenState extends State { right: 46, ), child: Text( - "A mail with a 6-digit verification code was just sent to ${emailcontroller.text}", + AppLocalizations.of(context)!.otpSentToEmail( + emailcontroller.text), maxLines: null, textAlign: TextAlign.center, style: AppStyle.txtGilroyMedium16, @@ -276,7 +285,7 @@ class _SignUpUserScreenState extends State { height: getVerticalSize( 50, ), - text: "Next", + text: AppLocalizations.of(context)!.next, margin: getMargin( top: 40, ), @@ -287,9 +296,12 @@ class _SignUpUserScreenState extends State { moveToNextStep(); showSuccessMessage( - 'Email verified successfully'); + AppLocalizations.of(context)! + .emailVerifiedSuccess); } catch (e) { - showErrorMessage('Failed to verify OTP: $e'); + showErrorMessage(AppLocalizations.of( + context)! + .failedToVerifyOtp(e.toString())); } }, ), @@ -300,19 +312,24 @@ class _SignUpUserScreenState extends State { await Future.delayed( const Duration(seconds: 5)); - showSuccessMessage('OTP RESEND'); + showSuccessMessage(AppLocalizations.of( + context)! + .otpResent); } catch (e) { - showErrorMessage( - 'Failed to resend OTP: $e'); + showErrorMessage(AppLocalizations.of( + context)! + .failedToResendOtp(e.toString())); } }, child: Padding( padding: getPadding(top: 3), - child: Text("Forgot Password?", + child: Text( + AppLocalizations.of(context)! + .forgotPasswordLink, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, - style: - AppStyle.txtGilroyMedium14BlueA700)), + style: AppStyle + .txtGilroyMedium14BlueA700)), ), @@ -330,7 +347,8 @@ class _SignUpUserScreenState extends State { top: 2, ), child: Text( - "Didn’t get the code?", + AppLocalizations.of(context)! + .didntGetCode, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroyMedium16, @@ -342,7 +360,8 @@ class _SignUpUserScreenState extends State { bottom: 1, ), child: Text( - "Resend", + AppLocalizations.of(context)! + .resend, overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: AppStyle.txtGilroySemiBold16BlueA700, @@ -364,7 +383,8 @@ class _SignUpUserScreenState extends State { height: getVerticalSize( 50, ), - text: "Go to Registration Details", + text: AppLocalizations.of(context)! + .goToRegistrationDetails, margin: getMargin( top: 40, ), diff --git a/lib/screens/sign_up_screen/sign_up_steps.dart b/lib/screens/sign_up_screen/sign_up_steps.dart index b9aa8db..81494b7 100644 --- a/lib/screens/sign_up_screen/sign_up_steps.dart +++ b/lib/screens/sign_up_screen/sign_up_steps.dart @@ -3,6 +3,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import '../../hadwin_components.dart'; +import '../../l10n/app_localizations.dart'; import '../../utilities/slide_right_route.dart'; import '../Login Screen/login_screen.dart'; import 'StepGetEmailVerification.dart'; @@ -151,12 +152,13 @@ class _SignUpStepsState extends State { const EdgeInsets.symmetric(vertical: 3.6, horizontal: 10), child: RichText( text: TextSpan( - text: 'By signing up you are agreeing to the ', + text: AppLocalizations.of(context)!.termsAgreePrefix, style: const TextStyle( fontSize: 14, color: Color(0xFF929BAB)), children: [ TextSpan( - text: 'Terms & Conditions', + text: AppLocalizations.of(context)! + .termsConditions, style: const TextStyle( fontSize: 14, color: Colors.blue), recognizer: TapGestureRecognizer() @@ -167,19 +169,23 @@ class _SignUpStepsState extends State { () => Navigator.push( context, SlideRightRoute( - page: const HadWinMarkdownViewer( - screenName: "Terms & Conditons", + page: HadWinMarkdownViewer( + screenName: + AppLocalizations.of(context)! + .termsConditions, urlRequested: 'https://raw.githubusercontent.com/brownboycodes/HADWIN/master/docs/TERMS_AND_CONDITIONS.md', )))); }), - const TextSpan( - text: ' and our ', + TextSpan( + text: + AppLocalizations.of(context)!.termsAndOur, style: TextStyle(fontSize: 14, color: Color(0xFF929BAB)), ), TextSpan( - text: 'End User License Agreement', + text: + AppLocalizations.of(context)!.eula, style: const TextStyle( fontSize: 14, color: Colors.blue), recognizer: TapGestureRecognizer() @@ -190,9 +196,10 @@ class _SignUpStepsState extends State { () => Navigator.push( context, SlideRightRoute( - page: const HadWinMarkdownViewer( + page: HadWinMarkdownViewer( screenName: - "End User License Agreement", + AppLocalizations.of(context)! + .eula, urlRequested: 'https://raw.githubusercontent.com/brownboycodes/HADWIN/master/docs/END_USER_LICENSE_AGREEMENT.md', )))); @@ -311,8 +318,9 @@ class _SignUpStepsState extends State { if (stepHasError[_currentStep] == false && mounted) { ScaffoldMessenger.of(context) .showSnackBar( - const SnackBar( - content: Text('Processing'), + SnackBar( + content: + Text(AppLocalizations.of(context)!.processingPlain), backgroundColor: Colors.blue, // onVisible: _tryRegistering, ), @@ -487,8 +495,9 @@ class _SignUpStepsState extends State { print('Account succesfully created'); ScaffoldMessenger.of(context) - .showSnackBar(const SnackBar( - content: Text("Account Created Successfully"), + .showSnackBar(SnackBar( + content: Text(AppLocalizations.of(context)! + .accountCreatedSuccess), backgroundColor: Colors.green)) .closed .then((value) => Navigator.of(context).pushAndRemoveUntil( diff --git a/lib/screens/sign_up_screen/step_createAccount.dart b/lib/screens/sign_up_screen/step_createAccount.dart index f5e6beb..51dee17 100644 --- a/lib/screens/sign_up_screen/step_createAccount.dart +++ b/lib/screens/sign_up_screen/step_createAccount.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import '../../l10n/app_localizations.dart'; + class StepCreateAccount extends StatefulWidget { final LabeledGlobalKey nameAddressFormKey; // final Function updateSignUpDetails; @@ -99,7 +101,7 @@ class _StepCreateAccountState extends State { validator: _validatecompanyName, autofocus: mounted, autocorrect: false, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -108,7 +110,8 @@ class _StepCreateAccountState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only( left: 15, bottom: 11, top: 11, right: 15), - hintText: "Company_Name", + hintText: + AppLocalizations.of(context)!.companyName, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), @@ -155,7 +158,7 @@ class _StepCreateAccountState extends State { // validator: _validatelastName, autofocus: mounted, autocorrect: false, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -164,7 +167,8 @@ class _StepCreateAccountState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only( left: 15, bottom: 11, top: 11, right: 15), - hintText: "email", + hintText: + AppLocalizations.of(context)!.email, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), @@ -213,7 +217,7 @@ class _StepCreateAccountState extends State { // validator: _validatemobno, autofocus: mounted, autocorrect: false, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -222,7 +226,8 @@ class _StepCreateAccountState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only( left: 15, bottom: 11, top: 11, right: 15), - hintText: "mob_no", + hintText: AppLocalizations.of(context)! + .mobileNumber, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), @@ -271,7 +276,7 @@ class _StepCreateAccountState extends State { // validator: _validatelastName, autofocus: mounted, autocorrect: false, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -280,7 +285,8 @@ class _StepCreateAccountState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only( left: 15, bottom: 11, top: 11, right: 15), - hintText: "workspace", + hintText: + AppLocalizations.of(context)!.workspace, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), @@ -327,7 +333,7 @@ class _StepCreateAccountState extends State { // validator: _validatelastName, autofocus: mounted, autocorrect: false, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -336,7 +342,8 @@ class _StepCreateAccountState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only( left: 15, bottom: 11, top: 11, right: 15), - hintText: "gst number", + hintText: + AppLocalizations.of(context)!.gstNumber, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), @@ -383,7 +390,7 @@ class _StepCreateAccountState extends State { // validator: _validatelastName, autofocus: mounted, autocorrect: false, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -392,7 +399,8 @@ class _StepCreateAccountState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only( left: 15, bottom: 11, top: 11, right: 15), - hintText: "pancard", + hintText: + AppLocalizations.of(context)!.pancard, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ), @@ -439,7 +447,7 @@ class _StepCreateAccountState extends State { // validator: _validatelastName, autofocus: mounted, autocorrect: false, - decoration: const InputDecoration( + decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, focusedBorder: InputBorder.none, @@ -448,7 +456,8 @@ class _StepCreateAccountState extends State { disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only( left: 15, bottom: 11, top: 11, right: 15), - hintText: "working", + hintText: AppLocalizations.of(context)! + .workingField, hintStyle: TextStyle(fontSize: 16, color: Color(0xFF929BAB)), ),