diff --git a/assets/language/ar.json b/assets/language/ar.json new file mode 100644 index 0000000..e8fdcc4 --- /dev/null +++ b/assets/language/ar.json @@ -0,0 +1,250 @@ +{ + "splashVersionText": "التطبيق: v.", + "splashCopyrightText": "© 2024 Tanami", + "welcomeTitle1Text": "تانامي تقدم", + "welcomeTitle2Text": "استثمر مع", + "welcomeTitle3Text": "ابدأ الاستثمار اليوم", + "welcomeDescription1Text": "الوصول إلى استثمارات خاصة عالمية حصرية من الدرجة الأولى", + "welcomeDescription2Text": "خبراء استثمار ذوو خبرة مع سجل حافل طويل الأمد", + "welcomeDescription3Text": "بمبلغ 1000 ريال سعودي فقط", + "loginText": "تسجيل الدخول", + "signUpText": "اشتراك", + "welcomeText": "مرحبا بعودتك!", + "pleaseEnterLoginDetails": "يرجى إدخال تفاصيل تسجيل الدخول الخاصة بك للبدء", + "toGetYourAccountPleaseSetYourInfo": "للحصول على حسابك، يرجى تحديد معلوماتك", + "countryOfResidence": "بلد الإقامة", + "chooseCountry": "اختر الدولة", + "phoneNumber": "رقم الهاتف", + "password": "كلمة المرور", + "enterPassword": "أدخل كلمة المرور", + "invalidPhoneNo": "رقم الهاتف غير صالح", + "enterPhoneNo": "أدخل رقم الهاتف", + "invalidPassword": "كلمة المرور غير صالحة", + "forgotPassword": "نسيت كلمة المرور", + "getStartedToday": "ابدأ اليوم", + "setupYourTanamiAccountToBegin": "قم بإعداد حساب تانامي الخاص بك لبدء الاستثمار في بضع خطوات بسيطة", + "step1": "الخطوة 1", + "step2": "الخطوة 2", + "step3": "الخطوة 3", + "enterYourCountryOfResidence": "أدخل بلد إقامتك ورقم هاتفك المحمول", + "enterNameEmailPassword": "أدخل اسمك، بريدك الإلكتروني وكلمة المرور", + "enterNameEmailUniquePassword": "أدخل اسمك وبريدك الإلكتروني واختر كلمة مرور فريدة", + "enableBiometricAuthentication": "قم بتمكين المصادقة البيومترية واختر رمز PIN فريد للوصول بسهولة", + "getStarted": "ابدأ", + "welcome": "أهلا بك!", + "selectYourCountryOfResidence": "حدد بلد إقامتك وأدخل رقم هاتفك المحمول", + "nextText": "التالي", + "backText": "رجوع", + "firstNameText": "الاسم الأول", + "lastNameText": "اسم العائلة", + "emailText": "البريد الإلكتروني", + "repeatPasswordText": "أعد إدخال كلمة المرور", + "min8CharactersSpecialCharctersText": "الحد الأدنى 8 أحرف، تتطلب أحرف خاصة", + "enterFirstName": "أدخل الاسم الأول", + "enterLastName": "أدخل اسم العائلة", + "enterEmail": "أدخل البريد الإلكتروني", + "cantBeEmptyText": "لا يمكن أن يكون فارغا", + "passwordMismatch": "عدم تطابق كلمة المرور", + "iAgreeToThe": "أوافق على", + "termsAndCondition": "الشروط والأحكام", + "andThe": " و", + "privacyPolicy": "سياسة الخصوصية", + "bahrainCountryText": "البحرين", + "kuwaitCountryText": "الكويت", + "omanCountryText": "عمان", + "qatarCountryText": "قطر", + "saudiArabiaCountryText": "المملكة العربية السعودية", + "uaeCountryText": "الإمارات العربية المتحدة", + "confirmSelectionText": "تأكيد الاختيار", + "portfolioText": "قيمة المحفظة", + "portfolio": "قيمة المحفظة: ", + "investmentamount": "مبلغ الاستثمار", + "currentval": "التقييم الحالي", + "totalreturn": "إجمالي العائد", + "disttodate": "التوزيعات حتى الآن", + "includeddocs": "وثائق الاستثمار", + "videosTitle": "فيديوهات", + "academyText": "الأكاديمية", + "exitText": "خروج", + "cancelText": "إلغاء", + "areYouSureYouWantToExitText": "هل أنت متأكد أنك تريد الخروج؟", + "faqTitle": "الأسئلة الشائعة:", + "unlockText": "افتح", + "tanamiAppIsLocked": "تطبيق تانامي مقفل", + "securityMssgText": "لأمانك، يمكنك استخدام تطبيق تانامي فقط عندما يكون مفتوحًا", + "faceIdText": "معرف الوجه", + "appAskPermissionText": "يطلب تطبيق تانامي الإذن لاستخدام معرف الوجه (أو بصمة الإصبع)", + "checkYourMessages": "تحقق من رسائلك", + "referToSameOtpMessage": "أدخل الكود المكون من 6 أرقام المرسل إلى هاتفك المحمول", + "resendSms": "إعادة إرسال الرسائل القصيرة", + "otpVerifiedSucessfully": "تم التحقق من OTP بنجاح!", + "otpVerifiedFailed": "فشل التحقق من OTP:", + "pinCode": "رمز PIN", + "createPinCode": "إنشاء رمز PIN", + "changePinCode": "تغيير رمز PIN", + "confirmPinCode": "تأكيد رمز PIN", + "incorrectPinCode": "رمز PIN غير صحيح. حاول مرة اخرى.", + "welcomeBackText": "مرحبا بعودتك", + "userYourAppPinToLoginEnterTanami": "استخدم رمز PIN لتسجيل الدخول إلى تانامي", + "forgotPinCode": "نسيت رمز PIN", + "notificationText": "إشعار", + "allowNotificationText": "السماح بالإشعار", + "toRestorePinYouWillBeLoggedOut": "لاستعادة رمز PIN ستتم تسجيل خروجك", + "allowText": "السماح", + "declineText": "رفض", + "almostHere": "تقريبًا هنا...", + "completeAcc": "أكمل ملف الحساب في 3 دقائق لبدء الاستثمار", + "restorePasswordText": "استعادة كلمة المرور", + "toRestorePasswordPleaseEnterPhoneNumber": "لاستعادة كلمة المرور، يرجى إدخال رقم الهاتف", + "createNewPasswordText": "إنشاء كلمة مرور جديدة", + "submitText": "إرسال", + "walletTitle": "رصيد المحفظة", + "walletText": "محفظة", + "day": "اليوم", + "filterTitle": "مرشحات", + "onHold": "قيد الانتظار", + "deposit": "إيداع", + "withdraw": "سحب", + "withdrawal": "انسحاب", + "yield": "عائد", + "refund": "استرداد", + "investment": "استثمار", + "walletDetailsTitle": "تفاصيل", + "withdrawalScreenTitle": "أدخل تفاصيل البنك", + "depositScreenTitle": "إخطار الإيداع", + "status": "الحالة", + "paymentMethod": "طريقة الدفع", + "accountName": "اسم الحساب", + "accountHolderName": "اسم صاحب الحساب/المستفيد", + "iban": "رقم الحساب الدولي IBAN", + "beneficiaryAddress": "عنوان المستفيد", + "bankName": "اسم البنك", + "branchAddress": "عنوان الفرع", + "SWIFTcode": "رمز SWIFT/BIC", + "refid": "معرف المرجع", + "previewTitle": "تأكيد السحب", + "info": "تم استلام طلب السحب الخاص بك وهو قيد المعالجة حاليًا.", + "info1": "يرجى تأكيد مبلغ السحب والتحقق من دقة تفاصيل البنك الخاصة بك.", + "workingDays": "تختلف أوقات المعالجة من 3-7 أيام عمل", + "balance": "رصيد المحفظة", + "withdrawTitle": "انسحاب", + "depositTitle": "إيداع", + "withdrawDetails": "تفاصيل السحب", + "depositDetails": "تفاصيل الإيداع", + "required": "الحقول بعلامة * مطلوبة", + "withdrawAmt": "إجمالي مبلغ السحب:", + "depositAmt": "إجمالي مبلغ الإيداع:", + "info2": "يمكن أن يشمل الدفع رسوم التحويل من البنك الخاص بك", + "info3": "لإتمام الدفع، يرجى استخدام تفاصيل الدفع ومعرف المرجع في بنكك", + "next": "التالي", + "depositNoti": "إنشاء إشعار إيداع", + "payWithAppleText": "الدفع بواسطة Apple Pay", + "submit": "إرسال الطلب", + "Submit": "إرسال", + "submitDeposit": "إرسال الإيداع", + "cont": "استمر", + "later": "لاحقا", + "back": "العودة للتغيير", + "clear": "مسح الكل", + "bankTransfer": "التحويل المصرفي", + "amtTrans": "مبلغ المعاملة", + "date1": "الأحدث أولا", + "date2": "الأقدم أولا", + "all": "الكل", + "byDate": "حسب التاريخ", + "byAction": "حسب نوع الإجراء", + "byStatus": "حسب الحالة", + "settingsText": "الإعدادات", + "experiencedInvestorText": "مستثمر متمرس؟", + "removeInvestmentText": "إزالة حدود الاستثمار", + "upgradeText": "قم بترقية حالة المستثمر الخاصة بك اليوم في بضع خطوات بسيطة للسماح بالاستثمارات التي تزيد عن 200,000 ريال سعودي", + "generalText": "عام", + "notificationsText": "الإخطارات", + "languageText": "اللغة", + "englishText": "الإنجليزية", + "privacySettingsText": "إعدادات الخصوصية", + "biometricText": "معرف بيومتري", + "resetPasswordText": "إعادة تعيين كلمة المرور", + "resetPinCodeText": "إعادة تعيين رمز PIN", + "supportText": "الدعم", + "contactAdminText": "الاتصال بالمشرف", + "privacyPolicyText": "سياسة الخصوصية", + "termsAndConditionText": "الشروط والأحكام", + "faqText": "الأسئلة الشائعة", + "logoutText": "تسجيل خروج", + "deleteAccountText": "حذف الحساب", + "areYouSureWantToLogoutText": "هل أنت متأكد أنك تريد تسجيل الخروج؟", + "noText": "لا", + "yesText": "نعم", + "pinUpdatedSucess": "تم تحديث رمز PIN بنجاح!", + "pinVerifiedSucess": "تم التحقق من رمز PIN بنجاح!", + "passwordUpdatedSucess": "تم تحديث كلمة المرور بنجاح!", + "changePasswordText": "تغيير كلمة المرور", + "newPasswordText": "كلمة المرور الجديدة", + "currentPsswordText": "كلمة المرور الحالية", + "byPhoneText": "عبر الهاتف", + "byEmailText": "بواسطة البريد الإلكتروني", + "weAreHereToHelp": "نحن هنا للمساعدة!", + "arabicText": "اللغة العربية", + "chooseTheLanguageText": "اختر اللغة", + "changingTheLanguageWillReloadApp": "سيؤدي تغيير اللغة إلى إعادة تحميل التطبيق", + "weAreSadToSeeYouGo": "نحن حزينون لرؤيتك تذهب :(", + "enterAdescription": "أدخل وصفا...", + "toHelpUsImprovePleaseLetusKnowWhyYouWantToDeleteAccount": "لمساعدتنا على التحسين، يرجى إخبارنا لماذا تريد حذف حسابك", + "charactersLeft": "الأحرف المتبقية", + "iUnderstandAndAgreeThatmyDataWillBeDeleted": "أنا أفهم وأوافق على حذف بياناتي", + "noIWantToStay": "لا، أريد البقاء", + "pleaseEnteraDescription": "يرجى إدخال وصف", + "pleaseCheckThisField": "يرجى التحقق من هذا الحقل", + "weHaveReceivedYourRequestToDeleteAccount": "لقد تلقينا طلبك لحذف حسابك", + "theRequestWillBeProcessed": "سيتم معالجة الطلب في غضون 72 ساعة", + "closeText": "أغلق", + "investText": "استثمر", + "availableText": "متاح", + "closedText": "مغلق", + "completeYourVerification": "أكمل التحقق الخاص بك", + "verifyYourAccountInUnderMinutesToStartInvestingToday": "تحقق من حسابك في أقل من 10 دقائق لبدء الاستثمار اليوم!", + "closingDateText": "تاريخ الإغلاق", + "closedDateText": "تاريخ الإغلاق", + "fundedText": "ممول", + "sponsorNameText": "اسم الراعي", + "estimatedReturnText": "العائد المقدر", + "originalEstimatedReturnText": "العائد المقدر الأصلي", + "actualEstimatedReturnText": "العائد الفعلي", + "actualReturnToDate": "العائد الفعلي حتى الآن", + "holdingPeriodText": "فترة الحيازة", + "payoutDateText": "تاريخ الدفع", + "expectedExitDate": "تاريخ الخروج المتوقع", + "minimumInvestmentText": "الحد الأدنى للاستثمار", + "keyMeritsOfInvestmentText": "المزايا الرئيسية", + "investmentDetailsText": "تفاصيل الاستثمار", + "enterInvestmentAmountText": "أدخل مبلغ الاستثمار", + "thisIsUsdInvestmentOpportunityText": "هذه فرصة استثمارية بالدولار الأمريكي. سيتم تحويل الأموال إلى الدولار الأمريكي بسعر x عند التأكيد", + "choosePaymentMethodText": "اختر طريقة الدفع", + "balanceText": "الرصيد", + "applePayText": "Apple Pay", + "gPayText": "Gpay Pay", + "bankTransferText": "حول الأموال مباشرة من حسابك المصرفي إلى محفظة تانامي الخاصة بك.", + "instantTransferFundsApplePayText": "تحويل فوري للأموال باستخدام Apple Pay!", + "instantTransferFundsGpayPayText": "تحويل فوري للأموال باستخدام Gpay Pay!", + "retailInvestirCanInvestMaxText": "يمكن للمستثمرين التجزئة استثمار حد أقصى قدره 200,000 ريال سعودي في هذه الفرصة.", + "upgradeYourInvestorStatusToIncreaseText": "قم بترقية حالة المستثمر الخاصة بك لزيادة حد الاستثمار الخاص بك.", + "currentExchangeText": "سعر الصرف الحالي", + "feeText": "الرسوم", + "processingFees": "رسوم المعالجة", + "debitedAmountText": "المبلغ المخصوم", + "totalInvestmentAmountText": "إجمالي مبلغ الاستثمار", + "confirmInvestmentText": "تأكيد الاستثمار", + "paymentMethodText": "طريقة الدفع", + "totalDebitedAmountText": "إجمالي المبلغ المخصوم", + "unableToProcessTransactionText": "غير قادر على معالجة المعاملة", + "investmentOpportunityHasReachedMaxcapText": "وصلت فرصة الاستثمار إلى الحد الأقصى", + "backToInvestmentText": "العودة إلى الاستثمار", + "otpCheckIsFailedText": "فشل التحقق من OTP...", + "pleaseTryAgainText": "الرجاء المحاولة مرة أخرى", + "tryAgainText": "حاول مرة اخرى", + "investmentConfirmationText": "تأكيد الاستثمار", + "enterAmountText": "أدخل المبلغ", + "pleaseEnterAmountText": "الرجاء إدخال المبلغ" + } + \ No newline at end of file diff --git a/assets/language/en.json b/assets/language/en.json new file mode 100644 index 0000000..1630cae --- /dev/null +++ b/assets/language/en.json @@ -0,0 +1,250 @@ +{ + "splashVersionText": "APP: v.", + "splashCopyrightText": "© 2024 Tanami", + "welcomeTitle1Text": "Tanami offers", + "welcomeTitle2Text": "Invest alongside", + "welcomeTitle3Text": "Start investing today", + "welcomeDescription1Text": "access to best-in-class, exclusive, global private investments", + "welcomeDescription2Text": "experienced investment experts with a long-standing track record", + "welcomeDescription3Text": "with only SAR 1,000", + "loginText": "Log In", + "signUpText": "Sign Up", + "welcomeText": "Welcome back!", + "pleaseEnterLoginDetails": "Please enter your login details to get started", + "toGetYourAccountPleaseSetYourInfo": "To get your account please set your info", + "countryOfResidence": "Country of residence", + "chooseCountry": "Choose country", + "phoneNumber": "Phone number", + "password": "Password", + "enterPassword": "Enter Password", + "invalidPhoneNo": "Invalid phone number", + "enterPhoneNo": "Enter phone number", + "invalidPassword": "Invalid password", + "forgotPassword": "Forgot password", + "getStartedToday": "Get started today", + "setupYourTanamiAccountToBegin": "Setup your Tanami account to begin investing in a few simple steps", + "step1": "Step 1", + "step2": "Step 2", + "step3": "Step 3", + "enterYourCountryOfResidence": "Enter your country of residence and mobile number", + "enterNameEmailPassword": "Enter your name, email and password", + "enterNameEmailUniquePassword": "Enter your name and email and choose a unique password", + "enableBiometricAuthentication": "Enable biometric authentication and select a unique pin code for easy access", + "getStarted": "Get started", + "welcome": "Welcome!", + "selectYourCountryOfResidence": "Select your country of residence and enter your mobile number", + "nextText": "Next", + "backText": "Back", + "firstNameText": "First Name", + "lastNameText": "Last Name", + "emailText": "Email", + "repeatPasswordText": "Repeat Password", + "min8CharactersSpecialCharctersText": "Min 8 characters, special characters required", + "enterFirstName": "Enter first name", + "enterLastName": "Enter last name", + "enterEmail": "Enter email", + "cantBeEmptyText": "Can't be empty", + "passwordMismatch": "Password mismatch", + "iAgreeToThe": "I agree to the", + "termsAndCondition": "Terms & Conditions", + "andThe": " and the", + "privacyPolicy": "Privacy Policy", + "bahrainCountryText": "Bahrain", + "kuwaitCountryText": "Kuwait", + "omanCountryText": "Oman", + "qatarCountryText": "Qatar", + "saudiArabiaCountryText": "Saudi Arabia", + "uaeCountryText": "United Arab Emirates", + "confirmSelectionText": "Confirm selection", + "portfolioText": "Portfolio Value", + "portfolio": "Portfolio Value: ", + "investmentamount": "Investment Amount", + "currentval": "Current valuation", + "totalreturn": "Total return", + "disttodate": "Distributions to date", + "includeddocs": "Investment Documents", + "videosTitle": "Videos", + "academyText": "Academy", + "exitText": "Exit", + "cancelText": "Cancel", + "areYouSureYouWantToExitText": "Are you sure you want to Exit?", + "faqTitle": "Frequently Asked Questions:", + "unlockText": "Unlock", + "tanamiAppIsLocked": "Tanami Capital is locked", + "securityMssgText": "For your security, you can only use Tanami Capital when it's unlocked", + "faceIdText": "Face Id", + "appAskPermissionText": "Tanami App ask permission to use Face ID (or Fingerprint)", + "checkYourMessages": "Check your messages", + "referToSameOtpMessage": "Enter the 6-digit code sent to your mobile", + "resendSms": "Resend SMS", + "otpVerifiedSucessfully": "OTP Verified Successfully!", + "otpVerifiedFailed": "OTP Verification Failed:", + "pinCode": "Pin Code", + "createPinCode": "Create Pin Code", + "changePinCode": "Change Pin Code", + "confirmPinCode": "Confirm Pin Code", + "incorrectPinCode": "Incorrect PIN. Please try again.", + "welcomeBackText": "Welcome back", + "userYourAppPinToLoginEnterTanami": "Use your app PIN to login to enter Tanami", + "forgotPinCode": "Forgot Pin Code", + "notificationText": "Notification", + "allowNotificationText": "Allow notification", + "toRestorePinYouWillBeLoggedOut": "To restore PIN you will be Logged out", + "allowText": "Allow", + "declineText": "Decline", + "almostHere": "Almost here...", + "completeAcc": "Complete account profile in 3 minutes to start investing", + "restorePasswordText": "Restore password", + "toRestorePasswordPleaseEnterPhoneNumber": "To restore password please enter phone number", + "createNewPasswordText": "Create new password", + "submitText": "Submit", + "walletTitle": "Wallet balance", + "walletText": "Wallet", + "day": "Today", + "filterTitle": "Filters", + "onHold": "On Hold", + "deposit": "Deposit", + "withdraw": "Withdraw", + "withdrawal": "Withdrawal", + "yield": "Yield", + "refund": "Refund", + "investment": "Investment", + "walletDetailsTitle": "Details", + "withdrawalScreenTitle": "Enter bank details", + "depositScreenTitle": "Deposit notification", + "status": "Status", + "paymentMethod": "Payment Method", + "accountName": "Account Name", + "accountHolderName": "Account Holder Name/Beneficiary Name", + "iban": "IBAN", + "beneficiaryAddress": "Beneficiary Address", + "bankName": "Bank Name", + "branchAddress": "Branch Address", + "SWIFTcode": "SWIFT/BIC code", + "refid": "Reference ID", + "previewTitle": "Withdrawal confirmation", + "info": "Your withdrawal request has been received and is currently being processed.", + "info1": "Please confirm the withdrawal amount and verify the accuracy of your bank details.", + "workingDays": "Processing times vary from 3-7 working days", + "balance": "Wallet Balance", + "withdrawTitle": "Withdrawal", + "depositTitle": "Deposit", + "withdrawDetails": "Withdrawal details", + "depositDetails": "Deposit details", + "required": "Fields with * are required", + "withdrawAmt": "Total Withdrawal amount:", + "depositAmt": "Total Deposit amount:", + "info2": "Payment can include transfer fee from your bank", + "info3": "To accomplish payment please use payment details and Reference ID in tour Bank", + "next": "Next", + "depositNoti": "Create deposit notification", + "payWithAppleText": "Pay with Apple Pay", + "submit": "Submit request", + "Submit": "Submit", + "submitDeposit": "Submit deposit", + "cont": "Continue", + "later": "Later", + "back": "Back to change", + "clear": "Clear All", + "bankTransfer": "Bank Transfer", + "amtTrans": "Amount of transaction", + "date1": "Newest first", + "date2": "Oldest first", + "all": "All", + "byDate": "By date", + "byAction": "By type of action", + "byStatus": "By status", + "settingsText": "Settings", + "experiencedInvestorText": "Experienced investor?", + "removeInvestmentText": "Remove investment thresholds", + "upgradeText": "Upgrade your investor status today in a few simple steps to allows investments higher than SAR 200,000", + "generalText": "General", + "notificationsText": "Notifications", + "languageText": "Language", + "englishText": "English", + "privacySettingsText": "Privacy Settings", + "biometricText": "Biometric ID", + "resetPasswordText": "Reset Password", + "resetPinCodeText": "Reset PIN-code", + "supportText": "Support", + "contactAdminText": "Contact Admin", + "privacyPolicyText": "Privacy Policy", + "termsAndConditionText": "Terms & Conditions", + "faqText": "FAQ", + "logoutText": "Log Out", + "deleteAccountText": "Delete account", + "areYouSureWantToLogoutText": "Are you sure you want to Logout?", + "noText": "No", + "yesText": "Yes", + "pinUpdatedSucess": "Pin updated Sucessfully !", + "pinVerifiedSucess": "Pin verified Sucessfully !", + "passwordUpdatedSucess": "Password updated Sucessfully !", + "changePasswordText": "Change Password", + "newPasswordText": "New Password", + "currentPsswordText": "Current Password", + "byPhoneText": "By phone", + "byEmailText": "By-mail", + "weAreHereToHelp": "We are here to help!", + "arabicText": "اللغة العربية", + "chooseTheLanguageText": "Choose the language", + "changingTheLanguageWillReloadApp": "Changing the language will reload the application", + "weAreSadToSeeYouGo": "We're sad to see you go :(", + "enterAdescription": "Enter a description...", + "toHelpUsImprovePleaseLetusKnowWhyYouWantToDeleteAccount": "To help us improve, please let us know why you want to delete your account", + "charactersLeft": "characters left", + "iUnderstandAndAgreeThatmyDataWillBeDeleted": "I understand and agree that my data will be deleted", + "noIWantToStay": "No, i want to stay", + "pleaseEnteraDescription": "Please enter a description", + "pleaseCheckThisField": "Please check this field", + "weHaveReceivedYourRequestToDeleteAccount": "We have received your request to delete your account", + "theRequestWillBeProcessed": "The request will be processed within 72 hours", + "closeText": "Close", + "investText": "Invest", + "availableText": "Available", + "closedText": "Closed", + "completeYourVerification": "Complete your verification", + "verifyYourAccountInUnderMinutesToStartInvestingToday": "Verify your account in under 10 minutes to start investing today!", + "closingDateText": "Closing Date", + "closedDateText": "Closed Date", + "fundedText": "funded", + "sponsorNameText": "Sponsor name", + "estimatedReturnText": "Estimated return", + "originalEstimatedReturnText": "Original estimated return", + "actualEstimatedReturnText": "Actual return", + "actualReturnToDate": "Actual return to date", + "holdingPeriodText": "Holding period", + "payoutDateText": "Payout Date", + "expectedExitDate": "Expected Exit Date", + "minimumInvestmentText": "Minimum investment", + "keyMeritsOfInvestmentText": "Key Merits", + "investmentDetailsText": "Investment details", + "enterInvestmentAmountText": "Enter investment amount", + "thisIsUsdInvestmentOpportunityText": "This is a USD investment opportunity. Funds will be converted into USD at a rate of x upon confirmation", + "choosePaymentMethodText": "Choose payment method", + "balanceText": "Balance", + "applePayText": "Apple Pay", + "gPayText": "Gpay Pay", + "bankTransferText": "Directly transfer funds from your bank account into your Tanami wallet.", + "instantTransferFundsApplePayText": "Instant transfer of funds using Apple Pay!", + "instantTransferFundsGpayPayText": "Instant transfer of funds using Gpay Pay!", + "retailInvestirCanInvestMaxText": "Retail investors can invest a maximum of SAR 200,000 in this opportunity.", + "upgradeYourInvestorStatusToIncreaseText": "Upgrade your investor status to increase your investment limit.", + "currentExchangeText": "Current Exchange", + "feeText": "Fee", + "processingFees": "Processing fee", + "debitedAmountText": "Debited amount", + "totalInvestmentAmountText": "Total Investment amount", + "confirmInvestmentText": "Confirm investment", + "paymentMethodText": "Payment method", + "totalDebitedAmountText": "Total debited amount", + "unableToProcessTransactionText": "Unable to process transaction", + "investmentOpportunityHasReachedMaxcapText": "Investment opportunity has reached maximum capacity", + "backToInvestmentText": "Back to Investment", + "otpCheckIsFailedText": "OTP Check is failed...", + "pleaseTryAgainText": "Please try again", + "tryAgainText": "Try again", + "investmentConfirmationText": "Investment confirmation", + "enterAmountText": "Enter Amount", + "pleaseEnterAmountText": "Please Enter Amount" + } + \ No newline at end of file diff --git a/lib/core/utils/connectivity/network_connectivity.dart b/lib/core/utils/connectivity/network_connectivity.dart index af1d160..ebce714 100644 --- a/lib/core/utils/connectivity/network_connectivity.dart +++ b/lib/core/utils/connectivity/network_connectivity.dart @@ -1,5 +1,3 @@ -// network_connectivity.dart - import 'dart:async'; import 'package:connectivity_plus/connectivity_plus.dart'; @@ -22,13 +20,17 @@ class NetworkConnectivity { void initialize() { _subscription = _connectivity.onConnectivityChanged .listen((List result) { - String status = result.toString(); - onStatusChange(status); + if (result.isNotEmpty) { + String status = result.toString(); + onStatusChange(status); - if (result[0] == ConnectivityResult.wifi || - result[0] == ConnectivityResult.mobile) { - if (goRouter.canPop()) { - goRouter.pop(true); + if (result[0] == ConnectivityResult.wifi || + result[0] == ConnectivityResult.mobile) { + if (goRouter.canPop()) { + goRouter.pop(true); + } + } else { + goRouter.pushNamed(RouteName.noInternetScreen); } } else { goRouter.pushNamed(RouteName.noInternetScreen); @@ -42,7 +44,8 @@ class NetworkConnectivity { Future checkInternet() async { final connectivityResult = await _connectivity.checkConnectivity(); - if (connectivityResult[0] != ConnectivityResult.none) { + if (connectivityResult.isNotEmpty && + connectivityResult[0] != ConnectivityResult.none) { onStatusChange(connectivityResult.toString()); } else { onStatusChange(connectivityResult.toString()); diff --git a/lib/core/utils/language/localizations_delegate.dart b/lib/core/utils/language/localizations_delegate.dart new file mode 100644 index 0000000..ad2017d --- /dev/null +++ b/lib/core/utils/language/localizations_delegate.dart @@ -0,0 +1,55 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class AppLocalizations { + final Locale locale; + + AppLocalizations(this.locale); + + static AppLocalizations of(BuildContext context) { + return Localizations.of(context, AppLocalizations)!; + } + + static const LocalizationsDelegate delegate = + _AppLocalizationsDelegate(); + + late Map _localizedStrings; + + Future load() async { + String jsonString = await rootBundle + .loadString('assets/language/${locale.languageCode}.json'); + Map jsonMap = json.decode(jsonString); + + _localizedStrings = jsonMap.map((key, value) { + return MapEntry(key, value.toString()); + }); + + return true; + } + + String translate(String key) { + return _localizedStrings[key] ?? key; + } +} + +class _AppLocalizationsDelegate + extends LocalizationsDelegate { + const _AppLocalizationsDelegate(); + + @override + bool isSupported(Locale locale) { + return ['en', 'ar'].contains(locale.languageCode); + } + + @override + Future load(Locale locale) async { + AppLocalizations localizations = AppLocalizations(locale); + await localizations.load(); + return localizations; + } + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} diff --git a/lib/features/biometric/presentation/bloc/biometric_bloc.dart b/lib/features/biometric/presentation/bloc/biometric_bloc.dart index b2070ae..ac8deef 100644 --- a/lib/features/biometric/presentation/bloc/biometric_bloc.dart +++ b/lib/features/biometric/presentation/bloc/biometric_bloc.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:local_auth/local_auth.dart'; @@ -23,13 +25,26 @@ class BiometricBloc extends Bloc { AuthenticateBiometricEvent event, Emitter emit) async { emit(BiometricAuthenticating()); try { - bool authenticated = await localAuthentication.authenticate( - localizedReason: 'Please authenticate to access the app', - options: const AuthenticationOptions( - useErrorDialogs: true, - stickyAuth: true, - ), - ); + bool authenticated = false; + if (Platform.isIOS) { + authenticated = await localAuthentication.authenticate( + localizedReason: 'Please authenticate to access the app', + options: const AuthenticationOptions( + useErrorDialogs: true, + stickyAuth: true, + biometricOnly: true, + ), + ); + } else if (Platform.isAndroid) { + authenticated = await localAuthentication.authenticate( + localizedReason: 'Please authenticate to access the app', + options: const AuthenticationOptions( + useErrorDialogs: true, + stickyAuth: true, + ), + ); + } + if (authenticated) { emit(BiometricAuthenticated()); } else { diff --git a/lib/features/biometric/presentation/pages/biometric_layout.dart b/lib/features/biometric/presentation/pages/biometric_layout.dart index 93a067b..d254555 100644 --- a/lib/features/biometric/presentation/pages/biometric_layout.dart +++ b/lib/features/biometric/presentation/pages/biometric_layout.dart @@ -8,10 +8,10 @@ import 'package:flutter_svg/flutter_svg.dart'; import '../../../../core/routes/route_name.dart'; import '../../../../core/routes/routes.dart'; import '../../../../core/styles/app_images.dart'; +import '../../../../shared/components/device_locked_dialog.dart'; import '../bloc/biometric_bloc.dart'; import '../bloc/biometric_event.dart'; import '../bloc/biometric_state.dart'; -import '../../../../shared/components/device_locked_dialog.dart'; class BiometricLayout extends StatelessWidget { const BiometricLayout({super.key}); diff --git a/lib/features/splash/presentation/pages/splash_screen.dart b/lib/features/splash/presentation/pages/splash_screen.dart index 5de81ee..21bf83c 100644 --- a/lib/features/splash/presentation/pages/splash_screen.dart +++ b/lib/features/splash/presentation/pages/splash_screen.dart @@ -44,14 +44,14 @@ class SplashScreen extends StatelessWidget { // Navigate to the WelcomeScreen using the goRouter goRouter.goNamed(RouteName.welcomeScreen); } else { - // if (await secureStorageService.read('biometric') != null && - // await secureStorageService.read('biometric') == 'on') { - // goRouter.goNamed(RouteName.biometricScreen); - // } else { - goRouter.goNamed(RouteName.pinScreen, pathParameters: { - "fromScreen": "LoginedInUser", - }); - // } + if (await secureStorageService.read('biometric') != null && + await secureStorageService.read('biometric') == 'on') { + goRouter.goNamed(RouteName.biometricScreen); + } else { + goRouter.goNamed(RouteName.pinScreen, pathParameters: { + "fromScreen": "LoginedInUser", + }); + } } } } diff --git a/lib/main.dart b/lib/main.dart index 18fe082..12a357c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,15 +1,19 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:local_auth/local_auth.dart'; import 'core/routes/routes.dart'; import 'core/utils/connectivity/network_connectivity.dart'; +import 'core/utils/language/localizations_delegate.dart'; import 'features/biometric/presentation/bloc/biometric_bloc.dart'; import 'features/biometric/presentation/bloc/biometric_event.dart'; import 'features/countrySelection/presentation/bloc/choose_country_bloc.dart'; import 'shared/components/bloc/bottom_nav_bar/bottom_navigation_bloc.dart'; +import 'shared/components/bloc/language/lng_bloc.dart'; +import 'shared/components/bloc/language/lng_state.dart'; /* CREATED BY - JAYESH JAIN DATE - 24-05-2024 @@ -81,17 +85,43 @@ class _MyAppState extends State with WidgetsBindingObserver { BlocProvider( create: (_) => BiometricBloc(LocalAuthentication())..add(CheckBiometricEvent()), - ) + ), + BlocProvider( + create: (_) => LocalizationBloc(), + ), ], child: ScreenUtilInit( - builder: (BuildContext context, Widget? child) => MaterialApp.router( - title: 'Tanami Capital', - theme: ThemeData( - useMaterial3: true, - ), - debugShowCheckedModeBanner: false, - routerConfig: goRouter, - ), + builder: (BuildContext context, Widget? child) => + BlocBuilder( + builder: (context, state) { + return MaterialApp.router( + title: 'Tanami Capital', + locale: state.locale, + supportedLocales: const [ + Locale('en', ''), + Locale('ar', ''), + ], + localizationsDelegates: const [ + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + localeResolutionCallback: (locale, supportedLocales) { + for (var supportedLocale in supportedLocales) { + if (supportedLocale.languageCode == locale?.languageCode) { + return supportedLocale; + } + } + return supportedLocales.first; + }, + theme: ThemeData( + useMaterial3: true, + ), + debugShowCheckedModeBanner: false, + routerConfig: goRouter, + ); + }), designSize: const Size(390, 844), ), ); diff --git a/lib/shared/components/bloc/language/lng_bloc.dart b/lib/shared/components/bloc/language/lng_bloc.dart new file mode 100644 index 0000000..0180ca4 --- /dev/null +++ b/lib/shared/components/bloc/language/lng_bloc.dart @@ -0,0 +1,13 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter/material.dart'; + +import 'lng_event.dart'; +import 'lng_state.dart'; + +class LocalizationBloc extends Bloc { + LocalizationBloc() : super(const LocalizationState(Locale('en'))) { + on((event, emit) { + emit(LocalizationState(event.locale)); + }); + } +} diff --git a/lib/shared/components/bloc/language/lng_event.dart b/lib/shared/components/bloc/language/lng_event.dart new file mode 100644 index 0000000..5a8b70f --- /dev/null +++ b/lib/shared/components/bloc/language/lng_event.dart @@ -0,0 +1,18 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; + +abstract class LocalizationEvent extends Equatable { + const LocalizationEvent(); + + @override + List get props => []; +} + +class ChangeLanguage extends LocalizationEvent { + final Locale locale; + + const ChangeLanguage(this.locale); + + @override + List get props => [locale]; +} diff --git a/lib/shared/components/bloc/language/lng_state.dart b/lib/shared/components/bloc/language/lng_state.dart new file mode 100644 index 0000000..9795dc9 --- /dev/null +++ b/lib/shared/components/bloc/language/lng_state.dart @@ -0,0 +1,11 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; + +class LocalizationState extends Equatable { + final Locale locale; + + const LocalizationState(this.locale); + + @override + List get props => [locale]; +} diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 38dd0bc..219dd2c 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,10 +6,14 @@ #include "generated_plugin_registrant.h" +#include #include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) flutter_localization_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterLocalizationPlugin"); + flutter_localization_plugin_register_with_registrar(flutter_localization_registrar); g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 65240e9..bb4b661 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + flutter_localization flutter_secure_storage_linux url_launcher_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index c32a9a7..07d7d5a 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,6 +8,7 @@ import Foundation import connectivity_plus import device_info_plus import firebase_core +import flutter_localization import flutter_secure_storage_macos import package_info_plus import path_provider_foundation @@ -19,6 +20,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FlutterLocalizationPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalizationPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 03da704..7137592 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -406,6 +406,19 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + flutter_localization: + dependency: "direct main" + description: + name: flutter_localization + sha256: faaeb1eba307473032e2c2af737f36ced61fc98735608410d0a6d9c231b50912 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c2b73c8..c81ea28 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -93,6 +93,9 @@ dependencies: #Performance statsfl: ^2.3.0 + #Localization + flutter_localization: ^0.2.0 + dev_dependencies: flutter_test: sdk: flutter @@ -134,3 +137,5 @@ flutter: - assets/images/invest_screen/svg/ - assets/images/no_internet/ - assets/images/no_internet/png/ + - assets/language/en.json + - assets/language/ar.json diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 9b7c08c..c7d278d 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -19,6 +20,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); FirebaseCorePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlutterLocalizationPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterLocalizationPluginCApi")); FlutterSecureStorageWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); LocalAuthPluginRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index a915a1e..f78c9b9 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -5,6 +5,7 @@ list(APPEND FLUTTER_PLUGIN_LIST connectivity_plus firebase_core + flutter_localization flutter_secure_storage_windows local_auth_windows permission_handler_windows