diff --git a/assets/onBoarding/forgot_password_en.png b/assets/onBoarding/forgot_password_en.png new file mode 100644 index 0000000..1fb7dfb Binary files /dev/null and b/assets/onBoarding/forgot_password_en.png differ diff --git a/assets/onBoarding/mot-de-passe-oublie.png b/assets/onBoarding/forgot_password_fr.png similarity index 100% rename from assets/onBoarding/mot-de-passe-oublie.png rename to assets/onBoarding/forgot_password_fr.png diff --git a/assets/onBoarding/gecko-oublie-aussi.png b/assets/onBoarding/gecko_also_can_forget_en.png similarity index 100% rename from assets/onBoarding/gecko-oublie-aussi.png rename to assets/onBoarding/gecko_also_can_forget_en.png diff --git a/assets/translations/en.json b/assets/translations/en.json new file mode 100644 index 0000000..478705a --- /dev/null +++ b/assets/translations/en.json @@ -0,0 +1,172 @@ +{ + "searchWallet": "Search\nwallet", + "manageWallets": "Manage\nwallets", + "scanQRCode": "Scan a\nQR code", + "wellConnectedToNode": "You are well connected to node\n{}", + "networkLost": "Network has been lost...", + "noDuniterEndointAvailable": "No server available...", + "connectionPending": "Connection pending...", + "noLizard": "no lounge lizard ;-)", + "loading": "Loading...", + "forgot_password.png": "forgot_password_en.png", + "warningForgotPassword": "In a blockchain, there is no email recovery procedure. Only your recovery phrase can allow you to recover your Ğ1 at any time.", + "fastAppDescription": "The {} app payment\nfaster than a reptile of Vietnam", + "createWallet": "Create a wallet", + "restoreWallet": "Restore my wallets", + "parameters": "Parameters", + "chooseAnotherMnemonic": "Choose an other\nmnemonic sentence", + "iNotedMyMnemonic": "I wrote down my sentence", + "printMyMnemonic": "Print my mnemonic sentence", + "manageChest": "Configure this chest", + "changeChest": "Change chest", + "geckoChest": "Ğecko chest", + "toUnlockEnterPassword": "To unlock your safe, enter your secret code, away from prying lizards:", + "rememberPassword": "Keep this code in memory for 15 minutes", + "myRootWallet": "My root wallet", + "currentWallet": "My current chest", + "wallet": "Wallet", + "displayMnemonic": "Display my mnemonic sentence", + "changePassword": "Change my password", + "createDerivation": "Create a new derivation", + "createCustomDerivation": "Create a new custom derivation", + "deleteChest": "Delete this chest", + "openThisChest": "Open this chest", + "createChest": "Create a new chest", + "importChest": "Import a chest", + "selectMyChest": "Select my chest", + "accessMyChest": "Access my chest", + "manageMembership": "Manage my membership", + "chooseThisWallet": "Choose this wallet", + "thisWalletIsDefault": "This wallet is the default one", + "defineWalletAsDefault": "Define this as the default one", + "displayActivity": "Display activity", + "displayNActivity": "Display\nactivity", + "memberValidated": "Validated member!", + "copyAddress": "Copy\naddress", + "copy": "Copy", + "thisAddressHasBeenCopiedToClipboard": "This address has been copied to clipboard", + "chooseWalletName": "Choose a new name\nfor your wallet:", + "choosePassword": "Choose a random password:", + "chooseDerivation": "Choose a derivation:", + "validate": "Validate", + "confirm": "Confirm", + "confirmPayment": "Confirm payment", + "clickHereToConfirmIdentity": "Click here to confirm\nyour new identity", + "geckoGenerateYourWalletFromMnemonic": "Ğecko builds your wallet from a **restoration sentence**. It is a bit like the blueprint that builds your wallet.", + "keepThisMnemonicSecure": "Keep this sentence carefully, because without it Ğecko will not be able to rebuild your wallets the day you change your phone.", + "geckoGeneratedYourMnemonicKeepItSecret": "Ğecko generated your mnemonic successfully! Keep it secret, because anyone who knows it can access all your wallets.", + "newWallet": "New Wallet", + "itsTimeToUseAPenAndPaper": "It's time to take a **pen and paper** in order to write down your mnemonic.", + "yourMnemonic": "Your mnemonic", + "gecko_also_can_forget.png": "gecko_also_can_forget_en.png", + "didYouNoteMnemonicToBeSureTypeWord": "Did you write down your menmonic?\n\n To be sure, please type the **{}th word** of your restoration phrase in the field below:", + "geckoWillGenerateAPassword": "Gecko will now generate for you a short password that will allow you to quickly access your wallets, without having to type your recovery sentence every time.", + "myPassword": "My password", + "thisPasswordProtectsYourWalletsInASecureChest": "This secret code protects your wallets in a safe **which only you have the code for**, so that your wallets cannot be used by others.", + "hereIsThePasswordKeepIt": "And here is your password!\n\nMemorize it or write it down, because you will be asked **every time** you want to make a payment on this device.", + "chooseAnotherPassword": "Choose an other password", + "iNotedMyPassword": "I noted my password", + "geckoWillCheckPassword": "Gecko will check with you if you have remembered your secret code.\n\n Type your secret code in the field below to check that you have written it down correctly.", + "yourChestAndWalletWereCreatedSuccessfully": "Super!\n\nYour chest and your first portfolio have been created with great success.\n\nCongratulations!", + "allGood": "That's all good!", + "areYouSureToDeleteWallet": "Are you sure you want to delete the chest \"{}\"?", + "areYouSureForgetAllChests": "Are you sure you want to forget all your chests?", + "areYouSureToForgetWallet": "Are you sure you wan to forget the wallet \"{}\"?", + "areYouSureYouWantToCertify": "Are you sure you want to certify the address:\n\n{}", + "yes": "Yes", + "no": "No", + "keepYourMnemonicSecret": "Try to keep this phrase a secret, as it allows anyone who knows it to access all your wallets.", + "iGeneratedYourMnemonicKeepItSecret": "I've generated your restoration phrase!\n Try to keep it a secret, as it allows anyone who knows it to access all your portfolios.", + "myMnemonic": "My mnemonic", + "close": "Close", + "toRestoreEnterMnemonic": "To restore your Gecko wallets, enter in the fields below the 12 words that constitute your restoration phrase:", + "pasteFromClipboard": "Paste from\nclipboard", + "restoreAChest": "Restore a chest", + "restoreThisChest": "Restore this chest", + "continue": "Continue", + "itsTheGoodWord": "It's the good word!", + "nthMnemonicWord": "word of your mnemonic", + "1th": "First", + "2th": "Second", + "3th": "Third", + "4th": "Fourth", + "5th": "Fifth", + "6th": "Sixth", + "7th": "Seventh", + "8th": "Eighth", + "9th": "Ninth", + "10th": "Tenth", + "11th": "Eleventh", + "12th": "Twelfth", + "yourPasswordLengthIsX": "Your password length is {}", + "noIdentity": "No identity", + "identityCreated": "Identity created", + "identityConfirmed": "Identity confirmed", + "identityExpired": "Identity expired", + "confirmYourIdentity": "Confirm your identity", + "noDuniterNodeAvailableTryLater": "No Duniter node available, please try again later", + "youAreConnectedToNode": "You are connected to node", + "accountActivity": "Account activity", + "noNetworkNoHistory": "Network state does not allow\nto display account history", + "noDataToDisplay": "No data to be displayed.", + "noTranscationToDisplay": "No transaction to display", + "month1": "January", + "month2": "February", + "month3": "March", + "month4": "April", + "month5": "May", + "month6": "June", + "month7": "July", + "month8": "August", + "month9": "September", + "month10": "October", + "month11": "November", + "month12": "December", + "today": "Today", + "yesterday": "Yesterday", + "thisWeek": "This week", + "chestNotCompatibleMustReinstallGecko": "The version of your safes is no longer compatible with this version of Ğecko.\nAll your safes will be forgotten, you must import them again.", + "notConnectedToInternet": "You are note connected to internet", + "researchResults": "Results of your research", + "resultsFor": "Results for ", + "forgetAllMyChests": "Forget all my chests", + "transaction": "Transaction", + "certification": "Certification", + "identityConfirm": "Identity confirmation", + "revokeAdhesion": "Adhesion revocation", + "strangeTransaction": "Strange transaction", + "sending": "Sending...", + "propagating": "Propagating...", + "validating": "Validating...", + "anErrorOccured": "An error occured", + "24hbetweenCerts": "You have to wait 24h between certs", + "canNotCertifySelf": "You can not certify yourself", + "nameAlreadyExist": "This name is already taken", + "2GDtoKeepAlive": "You have to keep at least 2ĞD to keep your account alive", + "youHaveToFeedThisAccountBeforeUsing": "You have to feed this account\nbefore using it.", + "execTimeoutOver": "Execution timeout is over", + "seeAWallet": "See a wallet", + "mustWaitXBeforeCertify": "You have to wait\n{} before\ncertifying again", + "canRenewCertInX": "You can renew\nthis certification\nin {}", + "executeATransfer": "Execute a transfer", + "executeTheTransfer": "Execute the transfer", + "doATransfer" : "Execute a\ntransfer", + "seconds": "{} seconds", + "minutes": "{} minutes", + "hours": "{} hours {}", + "days": "{} days", + "months": "{} months", + "certify": "Certify", + "from": "From:", + "amount": "Amount:", + "choiceOfSourceWallet": "Choose a source wallet", + "extrinsicInProgress": "{} in progress", + "extrinsicValidated": "{} validated !", + "fromMinus": "from", + "toMinus": "to", + "deleteThisWallet": "Delete this wallet", + "cancel": "Cancel", + "inBlockchainResult": "In {} blockchain", + "search": "Search", + "currencyNode": "{} node :" +} \ No newline at end of file diff --git a/assets/translations/es.json b/assets/translations/es.json new file mode 100644 index 0000000..340944d --- /dev/null +++ b/assets/translations/es.json @@ -0,0 +1,172 @@ +{ + "searchWallet": "Search\nwallet", + "manageWallets": "Manage\nwallets", + "scanQRCode": "Escanear un\ncódigo QR", + "wellConnectedToNode": "Estas bien conectada al nodo\n{}", + "networkLost": "Se ha perdido la red...", + "noDuniterEndointAvailable": "No hay servidor disponible...", + "connectionPending": "Conexión pendiente...", + "noLizard": "no hay lagarto ;-)", + "loading": "Cargando...", + "forgot_password.png": "forgot_password_en.png", + "warningForgotPassword": "In a blockchain, there is no email recovery procedure. Only your recovery phrase can allow you to recover your Ğ1 at any time.", + "fastAppDescription": "La aplicación de pago {}\nmás rápida que un reptil de Vietnam", + "createWallet": "Crear una billetera", + "restoreWallet": "Restaurar mis billeteras", + "parameters": "Parameters", + "chooseAnotherMnemonic": "Choose an other\nmnemonic sentence", + "iNotedMyMnemonic": "I wrote down my sentence", + "printMyMnemonic": "Print my mnemonic sentence", + "manageChest": "Configure this chest", + "changeChest": "Change chest", + "geckoChest": "Ğecko chest", + "toUnlockEnterPassword": "To unlock your safe, enter your secret code, away from prying lizards:", + "rememberPassword": "Keep this code in memory for 15 minutes", + "myRootWallet": "My root wallet", + "currentWallet": "My current chest", + "wallet": "Wallet", + "displayMnemonic": "Display my mnemonic sentence", + "changePassword": "Change my password", + "createDerivation": "Create a new derivation", + "createCustomDerivation": "Create a new custom derivation", + "deleteChest": "Delete this chest", + "openThisChest": "Open this chest", + "createChest": "Create a new chest", + "importChest": "Import a chest", + "selectMyChest": "Select my chest", + "accessMyChest": "Access my chest", + "manageMembership": "Manage my membership", + "chooseThisWallet": "Choose this wallet", + "thisWalletIsDefault": "This wallet is the default one", + "defineWalletAsDefault": "Define this as the default one", + "displayActivity": "Display activity", + "displayNActivity": "Display\nactivity", + "memberValidated": "Validated member!", + "copyAddress": "Copy\naddress", + "copy": "Copy", + "thisAddressHasBeenCopiedToClipboard": "This address has been copied to clipboard", + "chooseWalletName": "Choose a new name\nfor your wallet:", + "choosePassword": "Choose a random password:", + "chooseDerivation": "Choose a derivation:", + "validate": "Validate", + "confirm": "Confirm", + "confirmPayment": "Confirm payment", + "clickHereToConfirmIdentity": "Click here to confirm\nyour new identity", + "geckoGenerateYourWalletFromMnemonic": "Ğecko builds your wallet from a **restoration sentence**. It is a bit like the blueprint that builds your wallet.", + "keepThisMnemonicSecure": "Keep this sentence carefully, because without it Ğecko will not be able to rebuild your wallets the day you change your phone.", + "geckoGeneratedYourMnemonicKeepItSecret": "Ğecko generated your mnemonic successfully! Keep it secret, because anyone who knows it can access all your wallets.", + "newWallet": "New Wallet", + "itsTimeToUseAPenAndPaper": "It's time to take a **pen and paper** in order to write down your mnemonic.", + "yourMnemonic": "Your mnemonic", + "gecko_also_can_forget.png": "gecko_also_can_forget_en.png", + "didYouNoteMnemonicToBeSureTypeWord": "Did you write down your menmonic?\n\n To be sure, please type the **{}th word** of your restoration phrase in the field below:", + "geckoWillGenerateAPassword": "Gecko will now generate for you a short password that will allow you to quickly access your wallets, without having to type your recovery sentence every time.", + "myPassword": "My password", + "thisPasswordProtectsYourWalletsInASecureChest": "This secret code protects your wallets in a safe **which only you have the code for**, so that your wallets cannot be used by others.", + "hereIsThePasswordKeepIt": "And here is your password!\n\nMemorize it or write it down, because you will be asked **every time** you want to make a payment on this device.", + "chooseAnotherPassword": "Choose an other password", + "iNotedMyPassword": "I noted my password", + "geckoWillCheckPassword": "Gecko will check with you if you have remembered your secret code.\n\n Type your secret code in the field below to check that you have written it down correctly.", + "yourChestAndWalletWereCreatedSuccessfully": "Super!\n\nYour chest and your first portfolio have been created with great success.\n\nCongratulations!", + "allGood": "That's all good!", + "areYouSureToDeleteWallet": "Are you sure you want to delete the chest \"{}\"?", + "areYouSureForgetAllChests": "Are you sure you want to forget all your chests?", + "areYouSureToForgetWallet": "Are you sure you wan to forget the wallet \"{}\"?", + "areYouSureYouWantToCertify": "Are you sure you want to certify the address:\n\n{}", + "yes": "Yes", + "no": "No", + "keepYourMnemonicSecret": "Try to keep this phrase a secret, as it allows anyone who knows it to access all your wallets.", + "iGeneratedYourMnemonicKeepItSecret": "I've generated your restoration phrase!\n Try to keep it a secret, as it allows anyone who knows it to access all your portfolios.", + "myMnemonic": "My mnemonic", + "close": "Close", + "toRestoreEnterMnemonic": "To restore your Gecko wallets, enter in the fields below the 12 words that constitute your restoration phrase:", + "pasteFromClipboard": "Paste from\nclipboard", + "restoreAChest": "Restore a chest", + "restoreThisChest": "Restore this chest", + "continue": "Continue", + "itsTheGoodWord": "It's the good word!", + "nthMnemonicWord": "word of your mnemonic", + "1th": "First", + "2th": "Second", + "3th": "Third", + "4th": "Fourth", + "5th": "Fifth", + "6th": "Sixth", + "7th": "Seventh", + "8th": "Eighth", + "9th": "Ninth", + "10th": "Tenth", + "11th": "Eleventh", + "12th": "Twelfth", + "yourPasswordLengthIsX": "Your password length is {}", + "noIdentity": "No identity", + "identityCreated": "Identity created", + "identityConfirmed": "Identity confirmed", + "identityExpired": "Identity expired", + "confirmYourIdentity": "Confirm your identity", + "noDuniterNodeAvailableTryLater": "No Duniter node available, please try again later", + "youAreConnectedToNode": "You are connected to node", + "accountActivity": "Account activity", + "noNetworkNoHistory": "Network state does not allow\nto display account history", + "noDataToDisplay": "No data to be displayed.", + "noTranscationToDisplay": "No transaction to display", + "month1": "January", + "month2": "February", + "month3": "March", + "month4": "April", + "month5": "May", + "month6": "June", + "month7": "July", + "month8": "August", + "month9": "September", + "month10": "October", + "month11": "November", + "month12": "December", + "today": "Today", + "yesterday": "Yesterday", + "thisWeek": "This week", + "chestNotCompatibleMustReinstallGecko": "The version of your safes is no longer compatible with this version of Ğecko.\nAll your safes will be forgotten, you must import them again.", + "notConnectedToInternet": "You are note connected to internet", + "researchResults": "Results of your research", + "resultsFor": "Results for ", + "forgetAllMyChests": "Forget all my chests", + "transaction": "Transaction", + "certification": "Certification", + "identityConfirm": "Identity confirmation", + "revokeAdhesion": "Adhesion revocation", + "strangeTransaction": "Strange transaction", + "sending": "Sending...", + "propagating": "Propagating...", + "validating": "Validating...", + "anErrorOccured": "An error occured", + "24hbetweenCerts": "You have to wait 24h between certs", + "canNotCertifySelf": "You can not certify yourself", + "nameAlreadyExist": "This name is already taken", + "2GDtoKeepAlive": "You have to keep at least 2ĞD to keep your account alive", + "youHaveToFeedThisAccountBeforeUsing": "You have to feed this account\nbefore using it.", + "execTimeoutOver": "Execution timeout is over", + "seeAWallet": "See a wallet", + "mustWaitXBeforeCertify": "You have to wait\n{} before\ncertifying again", + "canRenewCertInX": "You can renew\nthis certification\nin {}", + "executeATransfer": "Execute a transfer", + "executeTheTransfer": "Execute the transfer", + "doATransfer" : "Execute a\ntransfer", + "seconds": "{} seconds", + "minutes": "{} minutes", + "hours": "{} hours {}", + "days": "{} days", + "months": "{} months", + "certify": "Certify", + "from": "From:", + "amount": "Amount:", + "choiceOfSourceWallet": "Choose a source wallet", + "extrinsicInProgress": "{} in progress", + "extrinsicValidated": "{} validated !", + "fromMinus": "from", + "toMinus": "to", + "deleteThisWallet": "Delete this wallet", + "cancel": "Cancel", + "inBlockchainResult": "In {} blockchain", + "search": "Search", + "currencyNode": "{} node :" +} \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json new file mode 100644 index 0000000..98b185b --- /dev/null +++ b/assets/translations/fr.json @@ -0,0 +1,173 @@ +{ + "searchWallet": "Rechercher un\nportefeuille", + "manageWallets": "Gérer mes\nportefeuilles", + "scanQRCode": "Scanner un\nQR code", + "wellConnectedToNode": "Vous êtes bien connecté aux noeud\n{}", + "networkLost": "Le réseau a été perdu...", + "noDuniterEndointAvailable": "Aucun serveur disponible...", + "connectionPending": "Connexion en cours...", + "noLizard": "y'a pas de lézard ;-)", + "loading": "Chargement en cours...", + "forgot_password.png": "forgot_password_fr.png", + "warningForgotPassword": "Dans une blockchain, pas de procédure de récupération par mail. Seule votre phrase de restauration peut vous permettre de récupérer vos Ğ1 à tout moment.", + "fastAppDescription": "L’application de paiement {}\nplus rapide qu’un reptile du Vietnam", + "createWallet": "Créer un portefeuille", + "restoreWallet": "Restaurer mes portefeuilles", + "parameters": "Paramètres", + "chooseAnotherMnemonic": "Choisir une autre phrase", + "iNotedMyMnemonic": "J'ai noté ma phrase", + "printMyMnemonic": "Imprimer ma phrase de restauration", + "manageChest": "Paramétrer ce coffre", + "changeChest": "Changer de coffre", + "geckoChest": "Coffre à Ğecko", + "toUnlockEnterPassword": "Pour déverrouiller votre coffre, composez votre code secret à l’abri des lézards indiscrets :", + "rememberPassword": "Garder ce code en mémoire 15 minutes", + "myRootWallet": "Mon portefeuille racine", + "currentWallet": "Mon portefeuille courant", + "wallet": "Portefeuille", + "displayMnemonic": "Afficher ma phrase de restauration", + "changePassword": "Changer mon code secret", + "createDerivation": "Créer une autre dérivation", + "createCustomDerivation": "Créer une dérivation personnalisé", + "deleteChest": "Supprimer ce coffre", + "openThisChest": "Ouvrir ce coffre", + "createChest": "Créer un nouveau coffre", + "importChest": "Importer un coffre", + "selectMyChest": "Sélectionner mon coffre", + "accessMyChest": "Accéder à mon coffre", + "manageMembership": "Gérer mon adhésion", + "chooseThisWallet": "Choisir ce portefeuille", + "thisWalletIsDefault": "Ce portefeuille est celui par defaut", + "defineWalletAsDefault": "Définir comme portefeuille par défaut", + "displayActivity": "Voir l'activité", + "displayNActivity": "Voir\nl'activité", + "memberValidated": "Membre validé !", + "copyAddress": "Copier\nl'adresse", + "copy": "Copier", + "thisAddressHasBeenCopiedToClipboard": "Cette adresse a été copié dans votre presse-papier.", + "chooseWalletName": "Choisissez un nouveau nom\npour votre portefeuille :", + "choosePassword": "Choisissez un code secret autogénéré :", + "chooseDerivation": "Choisissez une dérivation:", + "validate": "Valider", + "confirm": "Confirmer", + "confirmPayment": "Confirmer le paiement", + "clickHereToConfirmIdentity": "Cliquez ici pour confirmer\nvotre nouvelle identité", + "geckoGenerateYourWalletFromMnemonic": "Ğecko fabrique votre portefeuille à partir d’une **phrase de restauration**. Elle est un peu comme le plan qui permet de construire votre portefeuille.", + "keepThisMnemonicSecure": "Conservez cette phrase précieusement, car sans elle Ğecko ne pourra pas reconstruire vos portefeuilles le jour où vous changez de téléphone.", + "geckoGeneratedYourMnemonicKeepItSecret": "Gecko a généré votre phrase de restauration ! Tâchez de la garder bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles.", + "newWallet": "Nouveau portefeuille", + "itsTimeToUseAPenAndPaper": "Il est temps de vous munir d’**un papier et d’un crayon** afin de pouvoir noter votre phrase de restauration.", + "yourMnemonic": "Votre phrase de restauration", + "gecko_also_can_forget.png": "gecko_also_can_forget_fr.png", + "didYouNoteMnemonicToBeSureTypeWord": "Avez-vous bien noté votre phrase de restauration ?\n\nPour en être sûr, veuillez taper dans le champ ci-dessous le **{}ème mot** de votre phrase de restauration :", + "geckoWillGenerateAPassword": "Gecko va maintenant générer pour vous un code secret court qui vous permettra d’accéder rapidement à vos portefeuilles, sans avoir à taper votre phrase de restauration à chaque fois.", + "myPassword": "Mon code secret", + "thisPasswordProtectsYourWalletsInASecureChest": "Ce code secret protège vos portefeuilles dans un coffre-fort **dont vous seul possédez le code**, de sorte que vos portefeuilles seront inutilisables par d’autres.", + "hereIsThePasswordKeepIt": "Et voilà votre code secret !\n\nMémorisez-le ou notez-le, car il vous sera demandé **à chaque fois** que vous voudrez effectuer un paiement sur cet appareil.", + "chooseAnotherPassword": "Choisir un autre code secret", + "iNotedMyPassword": "J'ai noté mon code secret", + "geckoWillCheckPassword": "Gecko va vérifier avec vous si vous avez bien mémorisé votre code secret.\n\nTapez votre code secret dans le champ ci-dessous pour vérifier que vous l’avez bien noté.", + "yourChestAndWalletWereCreatedSuccessfully": "Top !\n\nVotre coffre votre premier portefeuille ont été créés avec un immense succès.\n\nFélicitations !", + "allGood": "C’est tout bon !", + "areYouSureToDeleteWallet": "Êtes-vous sûr de vouloir supprimer le coffre \"{}\" ?", + "areYouSureForgetAllChests": "Êtes-vous sûr de vouloir oublier tous vos coffres ?", + "areYouSureToForgetWallet": "Êtes-vous sûr de vouloir oublier le portefeuille \"{}\" ?", + "areYouSureYouWantToCertify": "Êtes-vous certain de vouloir certifier l'adresse:\n\n{}", + "yes": "Oui", + "no": "Non", + "keepYourMnemonicSecret": "Tâchez de garder cette phrase bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles.", + "iGeneratedYourMnemonicKeepItSecret": "J’ai généré votre phrase de restauration !\nTâchez de la garder bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles.", + "myMnemonic": "Ma phrase de restauration", + "close": "Fermer", + "toRestoreEnterMnemonic": "Pour restaurer vos portefeuilles Gecko, rentrez dans les champs ci-dessous les 12 mots qui constituent votre phrase de restauration :", + "pasteFromClipboard": "Coller depuis le\npresse-papier", + "restoreAChest": "Restaurer un coffre", + "restoreThisChest": "Restaurer ce coffre", + "continue": "Continuer", + "itsTheGoodWord": "C'est le bon mot !", + "nthMnemonicWord": "mot de votre phrase de restauration", + "1th": "Premier", + "2th": "Deuxième", + "3th": "Troisième", + "4th": "Quatrième", + "5th": "Cinquième", + "6th": "Sixième", + "7th": "Septième", + "8th": "Huitième", + "9th": "Neuvième", + "10th": "Dixième", + "11th": "Onzième", + "12th": "Douzième", + "yourPasswordLengthIsX": "Votre code PIN fait {} caractères", + "noIdentity": "Aucune identité", + "identityCreated": "Identité créée", + "identityConfirmed": "Identité confirmée", + "identityExpired": "Identité expirée", + "confirmYourIdentity": "Confirmez votre identité", + "noResult": "Aucun résultat", + "noDuniterNodeAvailableTryLater": "Aucun noeud Duniter disponible, veuillez réessayer ultérieurement", + "youAreConnectedToNode": "Vous êtes connecté au noeud", + "accountActivity": "Activité du compte", + "noNetworkNoHistory": "L'état du réseau ne permet pas\nd'afficher l'historique du compte", + "noDataToDisplay": "Aucune donnée à afficher.", + "noTranscationToDisplay": "Aucune transaction à afficher", + "month1": "Janvier", + "month2": "Février", + "month3": "Mars", + "month4": "Avril", + "month5": "Mai", + "month6": "Juin", + "month7": "Juillet", + "month8": "Aout", + "month9": "Septembre", + "month10": "Octobre", + "month11": "Novembre", + "month12": "Décembre", + "today": "Aujourd'hui", + "yesterday": "Hier", + "thisWeek": "Cette semaine", + "chestNotCompatibleMustReinstallGecko": "La version de vos coffres n'est plus comptabile avec cette version de Ğecko.\nTous vos coffres vont être oubliés, vous devez les importer de nouveau.", + "notConnectedToInternet": "Vous n'êtes pas connecté à internet", + "researchResults": "Résultats de votre recherche", + "resultsFor": "Résultats pour ", + "forgetAllMyChests": "Oublier tous mes coffres", + "transaction": "Transaction", + "certification": "Certification", + "identityConfirm": "Confirmation d'identité", + "revokeAdhesion": "Révocation d'adhésion", + "strangeTransaction": "Transaction étrange", + "sending": "Envoi en cours...", + "propagating": "En cours de propagation...", + "validating": "En cours de validation...", + "anErrorOccured": "Une erreur s'est produite", + "24hbetweenCerts": "Vous devez attendre 24h entre chaque certification", + "canNotCertifySelf": "Vous ne pouvez pas vous certifier\nvous même ...", + "nameAlreadyExist": "Ce nom est déjà pris", + "2GDtoKeepAlive": "Vous devez garder au moins 2ĞD sur votre compte pour le garder actif", + "youHaveToFeedThisAccountBeforeUsing": "Vous devez alimenter ce compte avant\nde pouvoir l'utiliser", + "execTimeoutOver": "Le délais d'éxecution est dépassé", + "seeAWallet": "Voir un portefeuille", + "mustWaitXBeforeCertify": "Vous devez attendre\n{} avant\nde pouvoir certifier", + "canRenewCertInX": "Vous pourrez renouveller\ncette certification\ndans {}", + "executeATransfer": "Effectuer un virement", + "executeTheTransfer": "Effectuer le virement", + "doATransfer": "Faire un\nvirement", + "seconds": "{} secondes", + "minutes": "{} minutes", + "hours": "{} heures {}", + "days": "{} jours", + "months": "{} mois", + "certify": "Certifier", + "from": "Depuis:", + "amount": "Montant:", + "choiceOfSourceWallet": "Choix du portefeuille source", + "extrinsicInProgress": "{} en cours", + "extrinsicValidated": "{} validé !", + "fromMinus": "de", + "toMinus": "vers", + "deleteThisWallet": "Supprimer ce portefeuille", + "cancel": "Annuler", + "inBlockchainResult": "Dans la blockchain {}", + "search": "Rechercher", + "currencyNode": "Noeud {} :" +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 01d339c..9c20360 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -45,11 +45,13 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:window_size/window_size.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:easy_localization/easy_localization.dart'; const bool enableSentry = true; Future main() async { WidgetsFlutterBinding.ensureInitialized(); + await EasyLocalization.ensureInitialized(); if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { setWindowTitle('Ğecko'); setWindowMinSize(const Size(400, 700)); @@ -97,27 +99,31 @@ Future main() async { // // ]); // Catcher(rootWidget: Gecko(endPointGVA, _store), debugConfig: debugOptions); - await SentryFlutter.init((options) { - options.dsn = - 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110'; - }, appRunner: () => runApp(Gecko(indexerEndpoint))); - - // runZoned>( - // () async { - // runApp(Gecko(endPointGVA, _store)); - // }, - // onError: (dynamic error, StackTrace stackTrace) { - // print("=================== CAUGHT DART ERROR"); - // // Sentry.captureException( - // // error, - // // stackTrace: stackTrace, - // // ); - // }, - // )); + await SentryFlutter.init( + (options) { + options.dsn = + 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110'; + }, + appRunner: () => runApp( + EasyLocalization( + supportedLocales: const [Locale('en'), Locale('fr')], + path: 'assets/translations', + fallbackLocale: const Locale('en'), + child: Gecko(indexerEndpoint), + ), + ), + ); } else { print('Debug mode enabled: No sentry alerte'); - runApp(Gecko(indexerEndpoint)); + runApp( + EasyLocalization( + supportedLocales: const [Locale('en'), Locale('fr'), Locale('es')], + path: 'assets/translations', + fallbackLocale: const Locale('fr'), + child: Gecko(indexerEndpoint), + ), + ); } } @@ -145,6 +151,9 @@ class Gecko extends StatelessWidget { ChangeNotifierProvider(create: (_) => DuniterIndexer()) ], child: MaterialApp( + localizationsDelegates: context.localizationDelegates, + supportedLocales: context.supportedLocales, + locale: context.locale, builder: (context, widget) => ResponsiveWrapper.builder( BouncingScrollWrapper.builder(context, widget!), maxWidth: 1200, diff --git a/lib/providers/chest_provider.dart b/lib/providers/chest_provider.dart index cccc2ec..3a11b88 100644 --- a/lib/providers/chest_provider.dart +++ b/lib/providers/chest_provider.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; @@ -55,17 +56,16 @@ class ChestProvider with ChangeNotifier { barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( - title: Text( - 'Êtes-vous sûr de vouloir supprimer le coffre "$_walletName" ?'), + title: Text('areYouSureToDeleteWallet'.tr(args: [_walletName!])), actions: [ TextButton( - child: const Text("Non", key: Key('cancelDeleting')), + child: Text("no".tr(), key: const Key('cancelDeleting')), onPressed: () { Navigator.pop(context, false); }, ), TextButton( - child: const Text("Oui", key: Key('confirmDeleting')), + child: Text("yes".tr(), key: const Key('confirmDeleting')), onPressed: () { Navigator.pop(context, true); }, diff --git a/lib/providers/duniter_indexer.dart b/lib/providers/duniter_indexer.dart index 4a5a501..c2d5620 100644 --- a/lib/providers/duniter_indexer.dart +++ b/lib/providers/duniter_indexer.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; @@ -229,13 +230,13 @@ class DuniterIndexer with ChangeNotifier { } if (result.isLoading) { - return const Text('Loading'); + return Text('loading'.tr()); } final List identities = result.data?['search_identity'] ?? []; if (identities.isEmpty) { - return const Text('Aucun résultat'); + return Text('noResult'.tr()); } int keyID = 0; diff --git a/lib/providers/generate_wallets.dart b/lib/providers/generate_wallets.dart index 0d90ec5..5fec56d 100644 --- a/lib/providers/generate_wallets.dart +++ b/lib/providers/generate_wallets.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:durt/durt.dart' as durt; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; @@ -62,9 +63,9 @@ class GenerateWalletsProvider with ChangeNotifier { String chestName; if (chestNumber == 0) { - chestName = 'Coffre à Ğecko'; + chestName = 'geckoChest'.tr(); } else { - chestName = 'Coffre à Ğecko ${chestNumber + 1}'; + chestName = 'geckoChest'.tr() + '${chestNumber + 1}'; } await configBox.put('currentChest', chestNumber); @@ -119,18 +120,18 @@ class GenerateWalletsProvider with ChangeNotifier { String? intToString(int _nbr) { Map nbrToString = {}; - nbrToString[1] = 'Premier'; - nbrToString[2] = 'Deuxième'; - nbrToString[3] = 'Troisième'; - nbrToString[4] = 'Quatrième'; - nbrToString[5] = 'Cinquième'; - nbrToString[6] = 'Sixième'; - nbrToString[7] = 'Septième'; - nbrToString[8] = 'Huitième'; - nbrToString[9] = 'Neuvième'; - nbrToString[10] = 'Dixième'; - nbrToString[11] = 'Onzième'; - nbrToString[12] = 'Douzième'; + nbrToString[1] = '1th'.tr(); + nbrToString[2] = '2th'.tr(); + nbrToString[3] = '3th'.tr(); + nbrToString[4] = '4th'.tr(); + nbrToString[5] = '5th'.tr(); + nbrToString[6] = '6th'.tr(); + nbrToString[7] = '7th'.tr(); + nbrToString[8] = '8th'.tr(); + nbrToString[9] = '9th'.tr(); + nbrToString[10] = '10th'.tr(); + nbrToString[11] = '11th'.tr(); + nbrToString[12] = '12th'.tr(); nbrWordAlpha = nbrToString[_nbr]; @@ -400,8 +401,8 @@ class GenerateWalletsProvider with ChangeNotifier { if (balance != 0) { isAlive = true; String walletName = scanedWalletNumber == 0 - ? 'Mon portefeuille courant' - : 'Portefeuille ${scanedWalletNumber + 1}'; + ? 'currentWallet'.tr() + : 'wallet'.tr() + ' ${scanedWalletNumber + 1}'; await _sub.importAccount( mnemonic: '', fromMnemonic: true, @@ -437,7 +438,7 @@ class GenerateWalletsProvider with ChangeNotifier { log.d(balance); if (balance != 0) { - String walletName = 'Mon portefeuille racine'; + String walletName = 'myRootWallet'.tr(); await _sub.importAccount( mnemonic: '', fromMnemonic: true, password: pin.text); diff --git a/lib/providers/home.dart b/lib/providers/home.dart index c389b1b..f55af59 100644 --- a/lib/providers/home.dart +++ b/lib/providers/home.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'dart:math'; // import 'package:audioplayers/audio_cache.dart'; // import 'package:audioplayers/audioplayers.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:async'; @@ -25,10 +26,8 @@ class HomeProvider with ChangeNotifier { Icon searchIcon = const Icon(Icons.search); final TextEditingController searchQuery = TextEditingController(); Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850])); - Widget appBarExplorer = - Text('Explorateur', style: TextStyle(color: Colors.grey[850])); - String homeMessage = "Chargement en cours ..."; - String defaultMessage = "y'a pas de lézard ;-)"; + String homeMessage = "loading".tr(); + String defaultMessage = "noLizard".tr(); Future initHive() async { late Directory hivePath; @@ -211,20 +210,6 @@ class HomeProvider with ChangeNotifier { ); } - void handleSearchEnd() { - searchIcon = Icon( - Icons.search, - color: Colors.grey[850], - ); - appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850])); - appBarExplorer = - Text('Explorateur', style: TextStyle(color: Colors.grey[850])); - isSearching = false; - searchQuery.clear(); - - notifyListeners(); - } - void rebuildWidget() { notifyListeners(); } diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 361f210..8b142fb 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'dart:async'; import 'package:gecko/globals.dart'; @@ -90,7 +91,7 @@ class MyWalletsProvider with ChangeNotifier { log.w('DELETE ALL WALLETS ?'); final bool? _answer = await (confirmPopup( - context, 'Êtes-vous sûr de vouloir oublier tous vos coffres ?')); + context, 'areYouSureForgetAllChests'.tr())); if (_answer!) { await walletBox.clear(); await chestBox.clear(); diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 27cebf8..e64b45a 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -1,5 +1,6 @@ // ignore_for_file: avoid_print +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; @@ -56,7 +57,7 @@ class SubstrateSdk with ChangeNotifier { // _homeProvider.changeMessage("Vous n'êtes pas connecté à internet", 0); // return; // } - _homeProvider.changeMessage("Connexion en cours...", 0); + _homeProvider.changeMessage("connectionPending".tr(), 0); for (String _endpoint in configBox.get('endpoint')) { final n = NetworkParams(); @@ -109,7 +110,7 @@ class SubstrateSdk with ChangeNotifier { // log.d(sdk.api.connectedNode?.endpoint); if (sdk.api.connectedNode?.endpoint == null) { nodeConnected = false; - _homeProvider.changeMessage("Le réseau a été perdu...", 0); + _homeProvider.changeMessage("networkLost".tr(), 0); } else { nodeConnected = true; } @@ -119,14 +120,15 @@ class SubstrateSdk with ChangeNotifier { // currencyName = await getCurencyName(); notifyListeners(); _homeProvider.changeMessage( - 'Vous êtes bien connecté aux noeud\n${getConnectedEndpoint()!.split('/')[2]}', + "wellConnectedToNode" + .tr(args: [getConnectedEndpoint()!.split('/')[2]]), 5); // snackNode(ctx, true); } else { nodeConnected = false; debugConnection = res.toString(); notifyListeners(); - _homeProvider.changeMessage("Aucun server disponible...", 0); + _homeProvider.changeMessage("noDuniterEndointAvailable".tr(), 0); // snackNode(ctx, false); } @@ -756,13 +758,13 @@ class AddressInfo { void snackNode(BuildContext context, bool isConnected) { String _message; if (!isConnected) { - _message = - "Aucun noeud Duniter disponible, veuillez réessayer ultérieurement:\n${configBox.get('endpoint').first}"; + _message = "noDuniterNodeAvailableTryLater".tr() + + ":\n${configBox.get('endpoint').first}"; } else { SubstrateSdk _sub = Provider.of(context, listen: false); - _message = - "Vous êtes connecté au noeud\n${_sub.getConnectedEndpoint()!.split('//')[1]}"; + _message = "youAreConnectedToNode".tr() + + "\n${_sub.getConnectedEndpoint()!.split('//')[1]}"; } final snackBar = SnackBar( padding: const EdgeInsets.all(20), diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index a123809..55143bb 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'dart:async'; import 'package:gecko/globals.dart'; @@ -46,8 +47,8 @@ class WalletOptionsProvider with ChangeNotifier { Future deleteWallet(context, WalletData wallet) async { SubstrateSdk _sub = Provider.of(context, listen: false); - final bool? _answer = await (confirmPopup(context, - 'Êtes-vous sûr de vouloir oublier le portefeuille "${wallet.name}" ?')); + final bool? _answer = await (confirmPopup( + context, 'areYouSureToForgetWallet'.tr(args: [wallet.name!]))); if (_answer ?? false) { //Check if balance is null @@ -156,26 +157,24 @@ class WalletOptionsProvider with ChangeNotifier { switch (snapshot.data.toString()) { case 'noid': { - return _showText('Aucune identité'); + return _showText('noIdentity'.tr()); } case 'Created': { return isOwner ? InkWell( child: _showText( - 'Cliquez ici pour confirmer\nvotre nouvelle identité', - 18, - true), + 'clickHereToConfirmIdentity'.tr(), 18, true), onTap: () async { await validateIdentity(context); }, ) - : _showText('Identité créé'); + : _showText('identityCreated'.tr()); } case 'ConfirmedByOwner': { return isOwner - ? _showText('Identité confirmé') + ? _showText('identityConfirmed'.tr()) : _duniterIndexer.getNameByAddress( context, address, @@ -190,7 +189,7 @@ class WalletOptionsProvider with ChangeNotifier { case 'Validated': { return isOwner - ? _showText('Membre validé !', 18, true) + ? _showText('memberValidated'.tr(), 18, true) : _duniterIndexer.getNameByAddress( context, address, @@ -204,7 +203,7 @@ class WalletOptionsProvider with ChangeNotifier { case 'expired': { - return _showText('Identité expiré'); + return _showText('identityExpired'.tr()); } } return SizedBox( @@ -232,10 +231,10 @@ class WalletOptionsProvider with ChangeNotifier { barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( - title: const Text( - 'Confirmez votre identité', + title: Text( + 'confirmYourIdentity'.tr(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), ), content: SizedBox( height: 100, @@ -263,7 +262,7 @@ class WalletOptionsProvider with ChangeNotifier { return TextButton( key: const Key('infoPopup'), child: Text( - "Valider", + "validate".tr(), style: TextStyle( fontSize: 21, color: idtyName.text.length >= 2 @@ -325,10 +324,10 @@ class WalletOptionsProvider with ChangeNotifier { barrierDismissible: true, builder: (BuildContext context) { return AlertDialog( - title: const Text( - 'Choisissez un nouveau nom\n pour votre portefeuille :', + title: Text( + 'chooseWalletName'.tr(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), ), content: SizedBox( height: 100, @@ -352,7 +351,7 @@ class WalletOptionsProvider with ChangeNotifier { return TextButton( key: const Key('infoPopup'), child: Text( - "Valider", + "validate".tr(), style: TextStyle( fontSize: 21, color: canValidateNameBool @@ -379,7 +378,7 @@ class WalletOptionsProvider with ChangeNotifier { TextButton( key: const Key('cancel'), child: Text( - "Annuler", + "cancel".tr(), style: TextStyle( fontSize: 18, color: Colors.grey[800], diff --git a/lib/providers/wallets_profiles.dart b/lib/providers/wallets_profiles.dart index a12817e..49b412c 100644 --- a/lib/providers/wallets_profiles.dart +++ b/lib/providers/wallets_profiles.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; @@ -126,14 +127,13 @@ class WalletsProfilesProvider with ChangeNotifier { return _balance; } - -Widget headerProfileView( + Widget headerProfileView( BuildContext context, String _address, String? username) { const double _avatarSize = 140; WalletOptionsProvider _walletOptions = Provider.of(context, listen: false); - CesiumPlusProvider _cesiumPlusProvider = + CesiumPlusProvider _cesiumPlusProvider = Provider.of(context, listen: false); // SubstrateSdk _sub = Provider.of(context, listen: false); @@ -181,13 +181,11 @@ Widget headerProfileView( ), ]), const SizedBox(height: 25), - balance(context, _address, 22), const SizedBox(height: 10), _walletOptions.idtyStatus(context, _address, isOwner: false, color: Colors.black), getCerts(context, _address, 14), - if (username == null && g1WalletsBox.get(_address)?.username != null) SizedBox( @@ -215,10 +213,9 @@ Widget headerProfileView( ]), const Spacer(), Column(children: [ - ClipOval( - child: _cesiumPlusProvider.defaultAvatar(_avatarSize), - ), - + ClipOval( + child: _cesiumPlusProvider.defaultAvatar(_avatarSize), + ), const SizedBox(height: 25), ]), ]), @@ -227,18 +224,16 @@ Widget headerProfileView( ]); } - - void reload() { notifyListeners(); } } snackCopyKey(context) { - const snackBar = SnackBar( - padding: EdgeInsets.all(20), - content: Text("Cette adresse a été copié dans votre presse-papier.", - style: TextStyle(fontSize: 16)), - duration: Duration(seconds: 2)); + final snackBar = SnackBar( + padding: const EdgeInsets.all(20), + content: Text("thisAddressHasBeenCopiedToClipboard".tr(), + style: const TextStyle(fontSize: 16)), + duration: const Duration(seconds: 2)); ScaffoldMessenger.of(context).showSnackBar(snackBar); } diff --git a/lib/screens/activity.dart b/lib/screens/activity.dart index 18017cf..ff682f9 100644 --- a/lib/screens/activity.dart +++ b/lib/screens/activity.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/queries_indexer.dart'; @@ -9,7 +10,6 @@ import 'package:gecko/providers/wallets_profiles.dart'; import 'package:flutter/material.dart'; import 'package:gecko/screens/wallet_view.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; // ignore: must_be_immutable @@ -40,9 +40,9 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { appBar: AppBar( elevation: 0, toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Activité du compte'), + child: Text('accountActivity'.tr()), ), ), bottomNavigationBar: _homeProvider.bottomAppBar(context), @@ -57,12 +57,12 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { Provider.of(context, listen: false); if (indexerEndpoint == '') { - Column(children: const [ - SizedBox(height: 50), + Column(children: [ + const SizedBox(height: 50), Text( - "L'état du réseau ne permet pas\nd'afficher l'historique du compte", + "noNetworkNoHistory".tr(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 18), + style: const TextStyle(fontSize: 18), ) ]); } @@ -103,20 +103,20 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { if (result.hasException) { log.e('Error Indexer: ' + result.exception.toString()); - return Column(children: const [ - SizedBox(height: 50), + return Column(children: [ + const SizedBox(height: 50), Text( - "L'état du réseau ne permet pas\nd'afficher l'historique du compte", + "noNetworkNoHistory".tr(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 18), + style: const TextStyle(fontSize: 18), ) ]); } else if (result.data == null) { - return Column(children: const [ - SizedBox(height: 50), + return Column(children: [ + const SizedBox(height: 50), Text( - "Aucune donnée à afficher.", - style: TextStyle(fontSize: 18), + "noDataToDisplay".tr(), + style: const TextStyle(fontSize: 18), ) ]); } @@ -159,11 +159,11 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { Provider.of(context, listen: false); return _duniterIndexer.transBC == null - ? Column(children: const [ - SizedBox(height: 50), + ? Column(children: [ + const SizedBox(height: 50), Text( - "Aucune transaction à afficher.", - style: TextStyle(fontSize: 18), + "noTransactionToDisplay".tr(), + style: const TextStyle(fontSize: 18), ) ]) : Column(children: [ @@ -202,19 +202,19 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { bool isYesterday = false; bool isThisWeek = false; - const Map monthsInYear = { - 1: "Janvier", - 2: "Février", - 3: "Mars", - 4: "Avril", - 5: "Mai", - 6: "Juin", - 7: "Juillet", - 8: "Aout", - 9: "Septembre", - 10: "Octobre", - 11: "Novembre", - 12: "Décembre" + final Map monthsInYear = { + 1: "month1".tr(), + 2: "month2".tr(), + 3: "month3".tr(), + 4: "month4".tr(), + 5: "month5".tr(), + 6: "month6".tr(), + 7: "month7".tr(), + 8: "month8".tr(), + 9: "month9".tr(), + 10: "month10".tr(), + 11: "month11".tr(), + 12: "month12".tr() }; return Column( @@ -243,18 +243,18 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { final yesterdayDate = DateTime(now.year, now.month, now.day - 1); if (transactionDate == todayDate && !isTody) { - dateDelimiter = lastDateDelimiter = "Aujourd'hui"; + dateDelimiter = lastDateDelimiter = "today".tr(); isTody = true; } else if (transactionDate == yesterdayDate && !isYesterday) { - dateDelimiter = lastDateDelimiter = "Hier"; + dateDelimiter = lastDateDelimiter = "yesterday".tr(); isYesterday = true; } else if (weekNumber(date) == weekNumber(now) && date.year == now.year && - lastDateDelimiter != "Cette semaine" && + lastDateDelimiter != "thisWeek".tr() && transactionDate != yesterdayDate && transactionDate != todayDate && !isThisWeek) { - dateDelimiter = lastDateDelimiter = "Cette semaine"; + dateDelimiter = lastDateDelimiter = "thisWeek".tr(); isThisWeek = true; } else if (lastDateDelimiter != monthsInYear[date.month] && lastDateDelimiter != "${monthsInYear[date.month]} ${date.year}" && diff --git a/lib/screens/common_elements.dart b/lib/screens/common_elements.dart index ca12fa7..eb94a3a 100644 --- a/lib/screens/common_elements.dart +++ b/lib/screens/common_elements.dart @@ -1,5 +1,7 @@ import 'package:dots_indicator/dots_indicator.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:provider/provider.dart'; @@ -29,22 +31,28 @@ class CommonElements { child: Image.asset('assets/onBoarding/$assetName', width: imageWidth)); } - Widget buildText(List text, [double size = 20]) { + Widget buildText(String text, [double size = 20, bool isMd = false]) { + final mdStyle = MarkdownStyleSheet( + p: TextStyle( + fontSize: isTall ? size : size * 0.9, + color: Colors.black, + letterSpacing: 0.3), + textAlign: WrapAlignment.spaceBetween, + ); + return Container( padding: const EdgeInsets.all(12), width: 440, decoration: BoxDecoration( color: Colors.white, border: Border.all(color: Colors.grey[900]!)), - child: RichText( - textAlign: TextAlign.justify, - text: TextSpan( - style: TextStyle( - fontSize: isTall ? size : size * 0.9, - color: Colors.black, - letterSpacing: 0.3), - children: text, - ), - ), + child: isMd + ? MarkdownBody(data: text, styleSheet: mdStyle) + : Text(text, + textAlign: TextAlign.justify, + style: TextStyle( + fontSize: isTall ? size : size * 0.9, + color: Colors.black, + letterSpacing: 0.3)), ); } @@ -85,11 +93,12 @@ class CommonElements { Widget infoIntro( BuildContext context, - List text, + String text, String assetName, String buttonText, nextScreen, double pagePosition, { + bool isMd = false, bool isFast = false, double boxHeight = 440, double imageWidth = 350, @@ -100,7 +109,8 @@ class CommonElements { buildProgressBar(pagePosition), SizedBox(height: isTall ? 40 : 20), - buildText(text, textSize), + buildText(text, textSize, isMd), + buildImage(assetName, boxHeight, imageWidth), Expanded( child: Align( @@ -239,9 +249,9 @@ Future confirmPopup(BuildContext context, String title) async { children: [ TextButton( key: const Key('confirmPopop'), - child: const Text( - "Oui", - style: TextStyle( + child: Text( + "yes".tr(), + style: const TextStyle( fontSize: 21, color: Color(0xffD80000), ), @@ -252,9 +262,9 @@ Future confirmPopup(BuildContext context, String title) async { ), const SizedBox(width: 20), TextButton( - child: const Text( - "Non", - style: TextStyle(fontSize: 21), + child: Text( + "no".tr(), + style: const TextStyle(fontSize: 21), ), onPressed: () { Navigator.pop(context, false); diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 899c14a..58468b3 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,5 +1,6 @@ import 'package:bubble/bubble.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/stateful_wrapper.dart'; import 'package:gecko/providers/chest_provider.dart'; @@ -62,7 +63,7 @@ class HomeScreen extends StatelessWidget { ), ListTile( key: const Key('parameters'), - title: const Text('Paramètres'), + title: Text('parameters'.tr()), onTap: () { Navigator.pop(context); Navigator.push( @@ -111,8 +112,8 @@ class HomeScreen extends StatelessWidget { // Check if versionData non compatible, drop everything if (walletBox.isNotEmpty && walletBox.getAt(0)!.version! < dataVersion) { - await infoPopup(context, - "La version de vos coffres n'est plus comptabile avec cette version de Ğecko.\nTous vos coffres vont être oubliés, vous devez les importer de nouveau."); + await infoPopup( + context, "chestNotCompatibleMustReinstallGecko".tr()); await walletBox.clear(); await chestBox.clear(); await configBox.delete('defaultWallet'); @@ -127,7 +128,7 @@ class HomeScreen extends StatelessWidget { if (connectivityResult != ConnectivityResult.mobile && connectivityResult != ConnectivityResult.wifi) { _homeProvider.changeMessage( - "Vous n'êtes pas connecté à internet", 0); + "notConnectedToInternet".tr(), 0); _sub.nodeConnected = false; } @@ -139,7 +140,7 @@ class HomeScreen extends StatelessWidget { _sub.nodeConnected = false; await _sub.sdk.api.setting.unsubscribeBestNumber(); _homeProvider.changeMessage( - "Vous n'êtes pas connecté à internet", 0); + "notConnectedToInternet".tr(), 0); _sub.reload(); } else { await _sub.connectNode(ctx); @@ -302,7 +303,7 @@ Widget geckHome(context) { ), const SizedBox(height: 12), Text( - "Rechercher un\nportefeuille", + "searchWallet".tr(), textAlign: TextAlign.center, style: TextStyle( color: Colors.white, @@ -368,7 +369,7 @@ Widget geckHome(context) { ), const SizedBox(height: 12), Text( - "Gérer mes\nportefeuilles", + "manageWallets".tr(), textAlign: TextAlign.center, style: TextStyle( color: Colors.white, @@ -412,7 +413,7 @@ Widget geckHome(context) { ), const SizedBox(height: 12), Text( - "Scanner un\nQR code", + "scanQRCode".tr(), textAlign: TextAlign.center, style: TextStyle( color: Colors.white, @@ -468,7 +469,7 @@ Widget welcomeHome(context) { child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - "L’application de paiement $currencyName\nplus rapide qu’un reptile du Vietnam", + "fastAppDescription".tr(args: [currencyName]), textAlign: TextAlign.center, style: const TextStyle( color: Colors.white, @@ -520,7 +521,7 @@ Widget welcomeHome(context) { ), Positioned( left: 180, - child: bubbleSpeak("y'a pas de lézard !"), + child: bubbleSpeak("noLizard".tr()), ), const Positioned( left: 200, @@ -551,10 +552,10 @@ Widget welcomeHome(context) { ), ); }, - child: const Text( - 'Créer un portefeuille', - style: - TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + child: Text( + 'createWallet'.tr(), + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.w600), ), ), ), @@ -576,7 +577,7 @@ Widget welcomeHome(context) { ); }, child: Text( - "Restaurer mes portefeuilles", + "restoreWallet".tr(), style: TextStyle( fontSize: 24, color: orangeC, diff --git a/lib/screens/myWallets/change_pin.dart b/lib/screens/myWallets/change_pin.dart index 09170ad..3a867a3 100644 --- a/lib/screens/myWallets/change_pin.dart +++ b/lib/screens/myWallets/change_pin.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:durt/durt.dart'; import 'package:flutter/services.dart'; @@ -63,7 +64,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { ), const SizedBox(height: 80), Text( - 'Choisissez un code secret autogénéré :', + 'choosePassword'.tr(), textAlign: TextAlign.center, style: TextStyle( fontSize: 17.0, @@ -126,9 +127,9 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { Navigator.pop(context); } }, - child: const Text( - 'Confirmer', - style: TextStyle(fontSize: 28), + child: Text( + 'confirm'.tr(), + style: const TextStyle(fontSize: 28), ), ), ) diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart index 54e6891..e5c64f9 100644 --- a/lib/screens/myWallets/chest_options.dart +++ b/lib/screens/myWallets/chest_options.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; @@ -93,7 +94,7 @@ class ChestOptions extends StatelessWidget { ), const SizedBox(width: 15), Text( - 'Afficher ma phrase de restauration', + 'displayMnemonic'.tr(), style: TextStyle( fontSize: 20, color: orangeC, @@ -136,7 +137,7 @@ class ChestOptions extends StatelessWidget { ), const SizedBox(width: 18), Text( - 'Changer mon code secret', + 'changePassword'.tr(), style: TextStyle( fontSize: 20, color: _sub.nodeConnected @@ -172,7 +173,7 @@ class ChestOptions extends StatelessWidget { ), const SizedBox(width: 25), Text( - 'Créer une autre dérivation', + 'createDerivation'.tr(), style: TextStyle( fontSize: 20, color: _sub.nodeConnected @@ -198,9 +199,9 @@ class ChestOptions extends StatelessWidget { height: 45, ), const SizedBox(width: 20), - const Text( - 'Supprimer ce coffre', - style: TextStyle( + Text( + 'deleteChest'.tr(), + style: const TextStyle( fontSize: 20, color: Color(0xffD80000), ), diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart index de15755..c1c4fa5 100644 --- a/lib/screens/myWallets/choose_chest.dart +++ b/lib/screens/myWallets/choose_chest.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/providers/my_wallets.dart'; @@ -35,9 +36,9 @@ class _ChooseChestState extends State { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Sélectionner mon coffre'), + child: Text('selectMyChest'.tr()), )), body: SafeArea( child: Column(children: [ @@ -140,7 +141,7 @@ class _ChooseChestState extends State { } }, child: Text( - 'Ouvrir ce coffre', + 'openThisChest'.tr(), style: TextStyle( fontSize: 22, color: backgroundColor, @@ -166,7 +167,7 @@ class _ChooseChestState extends State { width: 400, height: 50, child: Center( - child: Text('Créer un nouveau coffre', + child: Text('createChest'.tr(), style: TextStyle( fontSize: 22, color: orangeC, @@ -189,7 +190,7 @@ class _ChooseChestState extends State { width: 400, height: 50, child: Center( - child: Text('Importer un coffre', + child: Text('importChest'.tr(), style: TextStyle( fontSize: 22, color: orangeC, diff --git a/lib/screens/myWallets/choose_wallet.dart b/lib/screens/myWallets/choose_wallet.dart index 917f38f..f54d6d8 100644 --- a/lib/screens/myWallets/choose_wallet.dart +++ b/lib/screens/myWallets/choose_wallet.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -28,9 +29,9 @@ class ChooseWalletScreen extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Choix du portefeuille source'), + child: Text('choiceOfSourceWallet'.tr()), )), body: SafeArea( child: Stack(children: [ @@ -58,10 +59,10 @@ class ChooseWalletScreen extends StatelessWidget { Navigator.pop(context); Navigator.pop(context); }, - child: const Text( - 'Choisir ce portefeuille', - style: - TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + child: Text( + 'chooseThisWallet'.tr(), + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/myWallets/custom_derivations.dart b/lib/screens/myWallets/custom_derivations.dart index 4ddcd76..a4d1623 100644 --- a/lib/screens/myWallets/custom_derivations.dart +++ b/lib/screens/myWallets/custom_derivations.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -50,16 +51,16 @@ class _CustomDerivationState extends State { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Créer une dérivation personnalisé'), + child: Text('createCustomDerivation'.tr()), )), body: Center( child: SafeArea( child: Column(children: [ const Spacer(), - const Text( - 'Choisissez une dérivation:', + Text( + 'chooseDerivation'.tr(), ), const SizedBox(height: 20), SizedBox( @@ -124,8 +125,8 @@ class _CustomDerivationState extends State { } if (_pin != null || _myWalletProvider.pinCode != '') { - String _newDerivationName = - 'Portefeuille ${_myWalletProvider.listWallets.last.number! + 2}'; + String _newDerivationName = 'wallet'.tr() + + ' ${_myWalletProvider.listWallets.last.number! + 2}'; if (dropdownValue == 'root') { await _myWalletProvider.generateRootWallet( context, 'Portefeuille racine'); @@ -146,9 +147,10 @@ class _CustomDerivationState extends State { // ); } }, - child: const Text( - 'Valider', - style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + child: Text( + 'validate'.tr(), + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart index 3520a0e..5f4759f 100644 --- a/lib/screens/myWallets/manage_membership.dart +++ b/lib/screens/myWallets/manage_membership.dart @@ -24,7 +24,7 @@ class ManageMembership extends StatelessWidget { toolbarHeight: 60 * ratio, title: const SizedBox( height: 22, - child: Text('Gérer mon adhésion'), + child: Text('manageMembership'), )), body: SafeArea( child: Column(children: [ diff --git a/lib/screens/myWallets/restore_chest.dart b/lib/screens/myWallets/restore_chest.dart index 08d0c93..52ff118 100644 --- a/lib/screens/myWallets/restore_chest.dart +++ b/lib/screens/myWallets/restore_chest.dart @@ -1,4 +1,5 @@ import 'package:bubble/bubble.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -43,15 +44,14 @@ class RestoreChest extends StatelessWidget { genW.resetImportView(); Navigator.of(context).pop(); }), - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Restaurer un coffre'), + child: Text('restoreAChest'.tr()), )), body: SafeArea( child: Column(children: [ SizedBox(height: isTall ? 30 : 15), - bubbleSpeak( - 'Pour restaurer vos portefeuilles Gecko, rentrez dans les champs ci-dessous les 12 mots qui constituent votre phrase de restauration :'), + bubbleSpeak('toRestoreEnterMnemonic'.tr()), SizedBox(height: isTall ? 30 : 15), Column(children: [ Row( @@ -112,10 +112,10 @@ class RestoreChest extends StatelessWidget { await badMnemonicPopup(context); } }, - child: const Text( - 'Restaurer ce coffre', - style: - TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + child: Text( + 'restoreThisChest'.tr(), + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.w600), ), ), ), @@ -137,16 +137,16 @@ class RestoreChest extends StatelessWidget { genW.pasteMnemonic(context); }, child: Row( - children: const [ - Icon( + children: [ + const Icon( Icons.content_paste_go, size: 25, ), - SizedBox(width: 10), + const SizedBox(width: 10), Text( - 'Coller depuis le\npresse-papier', + 'pasteFromClipboard'.tr(), textAlign: TextAlign.center, - style: TextStyle( + style: const TextStyle( fontSize: 17, fontWeight: FontWeight.w400), ), ], diff --git a/lib/screens/myWallets/show_seed.dart b/lib/screens/myWallets/show_seed.dart index 276caa4..7c82552 100644 --- a/lib/screens/myWallets/show_seed.dart +++ b/lib/screens/myWallets/show_seed.dart @@ -1,4 +1,5 @@ import 'dart:typed_data'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -35,9 +36,9 @@ class ShowSeed extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Ma phrase de restauration'), + child: Text('myMnemonic'.tr()), )), body: SafeArea( child: Column(children: [ @@ -64,13 +65,7 @@ class ShowSeed extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Column(children: [ - common.buildText( - [ - const TextSpan( - text: - 'Tâchez de garder cette phrase bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles.'), - ], - ), + common.buildText('keepYourMnemonicSecret'.tr()), SizedBox(height: 35 * ratio), sentanceArray(context, _seed.data!.split(' ')), const SizedBox(height: 20), @@ -97,7 +92,7 @@ class ShowSeed extends StatelessWidget { ), const SizedBox(width: 7), Text( - 'Copier', + 'copy'.tr(), style: TextStyle( fontSize: 15, color: Colors.grey[50]), ) @@ -136,7 +131,7 @@ class ShowSeed extends StatelessWidget { Navigator.pop(context); }, child: Text( - 'Fermer', + 'close'.tr(), style: TextStyle( fontSize: 23 * ratio, fontWeight: FontWeight.w600), ), @@ -237,11 +232,11 @@ class PrintWallet extends StatelessWidget { backgroundColor: yellowC, foregroundColor: Colors.black, toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Imprimer ma phrase de restauration', - style: TextStyle(fontWeight: FontWeight.w600), + 'printMyMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/myWallets/transaction_comment.dart b/lib/screens/myWallets/transaction_comment.dart index 7356e1e..3632f65 100644 --- a/lib/screens/myWallets/transaction_comment.dart +++ b/lib/screens/myWallets/transaction_comment.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -17,9 +18,9 @@ class TransactionCommentScreen extends StatelessWidget { return Scaffold( appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Confirmer le paiement'), + child: Text('confirmPayment'.tr()), ), ), body: SafeArea( diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index f7ff92e..364f8aa 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -1,6 +1,7 @@ // ignore_for_file: avoid_print import 'dart:async'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/models/chest_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; @@ -90,11 +91,11 @@ class UnlockingWallet extends StatelessWidget { )), ]), SizedBox(height: 30 * ratio), - const SizedBox( + SizedBox( width: 400, child: Text( - 'Pour déverrouiller votre coffre, composez votre code secret à l’abri des lézards indiscrets :', - style: TextStyle( + 'toUnlockEnterPassword'.tr(), + style: const TextStyle( fontSize: 19, color: Colors.black, fontWeight: FontWeight.w400), @@ -118,7 +119,7 @@ class UnlockingWallet extends StatelessWidget { ), const SizedBox(width: 8), Text( - 'Garder ce code en mémoire 15 minutes', + 'rememberPassword'.tr(), style: TextStyle( fontSize: 16, color: Colors.grey[700]), ), @@ -142,7 +143,7 @@ class UnlockingWallet extends StatelessWidget { height: 50, child: Center( child: Text( - 'Changer de coffre', + 'changeChest'.tr(), style: TextStyle( fontSize: 22, color: orangeC, @@ -200,7 +201,8 @@ class UnlockingWallet extends StatelessWidget { animationType: AnimationType.fade, validator: (v) { if (v!.length < _pinLenght) { - return "Votre code PIN fait $_pinLenght caractères"; + return "yourPasswordLengthIsX" + .tr(args: [_pinLenght.toString()]); } else { return null; } diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 0f41e31..15551af 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/providers/duniter_indexer.dart'; @@ -306,7 +307,7 @@ class WalletOptions extends StatelessWidget { ), const SizedBox(width: 7), Text( - 'Copier', + 'copy'.tr(), style: TextStyle(fontSize: 15, color: Colors.grey[50]), ) ]), @@ -351,8 +352,9 @@ class WalletOptions extends StatelessWidget { height: 45, ), const SizedBox(width: 22), - const Text('Activité', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500)), + Text("displayActivity".tr(), + style: + const TextStyle(fontSize: 20, fontWeight: FontWeight.w500)), ]), ), ); @@ -382,7 +384,7 @@ class WalletOptions extends StatelessWidget { height: 45, ), const SizedBox(width: 22), - const Text('Gérer mon adhésion', style: TextStyle(fontSize: 20)), + Text('manageMembership'.tr(), style: const TextStyle(fontSize: 20)), ]), ), ); @@ -420,8 +422,8 @@ class WalletOptions extends StatelessWidget { const SizedBox(width: 22), Text( walletProvider.isDefaultWallet - ? 'Ce portefeuille est celui par defaut' - : 'Définir comme portefeuille par défaut', + ? 'thisWalletIsDefault'.tr() + : 'defineWalletAsDefault'.tr(), style: TextStyle( fontSize: 20, color: walletProvider.isDefaultWallet @@ -488,9 +490,9 @@ class WalletOptions extends StatelessWidget { height: 45, ), const SizedBox(width: 19), - const Text('Supprimer ce portefeuille', - style: - TextStyle(fontSize: 20, color: Color(0xffD80000))), + Text('deleteThisWallet'.tr(), + style: const TextStyle( + fontSize: 20, color: Color(0xffD80000))), ]) : const SizedBox(width: 30), ); diff --git a/lib/screens/myWallets/wallets_home.dart b/lib/screens/myWallets/wallets_home.dart index e1b2a79..fa264d8 100644 --- a/lib/screens/myWallets/wallets_home.dart +++ b/lib/screens/myWallets/wallets_home.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; @@ -97,9 +98,9 @@ class WalletsHome extends StatelessWidget { return ChestOptions(walletProvider: _myWalletProvider); }), ), - label: const Text( - " Paramétrer ce coffre", - style: TextStyle( + label: Text( + " " + "manageChest".tr(), + style: const TextStyle( fontSize: 22, fontWeight: FontWeight.w700, color: Color(0xff8a3c0f), @@ -108,7 +109,7 @@ class WalletsHome extends StatelessWidget { )), const SizedBox(height: 30), InkWell( - key: const Key('createNewChest'), + key: const Key('changeChest'), onTap: () { Navigator.push( context, @@ -121,7 +122,7 @@ class WalletsHome extends StatelessWidget { width: 400, height: 50, child: Center( - child: Text('Changer de coffre', + child: Text('changeChest'.tr(), style: TextStyle( fontSize: 22, color: orangeC, @@ -360,7 +361,7 @@ class WalletsHome extends StatelessWidget { Provider.of(context); String _newDerivationName = - 'Portefeuille ${_myWalletProvider.listWallets.last.number! + 2}'; + 'wallet'.tr() + ' ${_myWalletProvider.listWallets.last.number! + 2}'; return Padding( padding: const EdgeInsets.all(16), child: ClipRRect( diff --git a/lib/screens/onBoarding/1.dart b/lib/screens/onBoarding/1.dart index 9d84922..2550f47 100644 --- a/lib/screens/onBoarding/1.dart +++ b/lib/screens/onBoarding/1.dart @@ -1,4 +1,5 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -16,32 +17,25 @@ class OnboardingStepOne extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Nouveau portefeuille', - style: TextStyle(fontWeight: FontWeight.w600), + 'newWallet'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), extendBodyBehindAppBar: true, body: SafeArea( child: common.infoIntro( - context, - [ - const TextSpan( - text: 'Gecko fabrique votre portefeuille à partir d’une '), - const TextSpan( - text: 'phrase de restauration', - style: TextStyle(fontWeight: FontWeight.bold)), - const TextSpan( - text: - '. Elle est un peu comme le plan qui permet de construire votre portefeuille.'), - ], - 'fabrication-de-portefeuille.png', - '>', - const OnboardingStepTwo(), - 0), + context, + 'geckoGenerateYourWalletFromMnemonic'.tr(), + 'fabrication-de-portefeuille.png', + '>', + const OnboardingStepTwo(), + 0, + isMd: true, + ), ), ); } diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index b06ba94..c8ba191 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -1,6 +1,7 @@ // ignore_for_file: file_names import 'dart:async'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -38,11 +39,11 @@ class OnboardingStepTen extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Mon code secret', - style: TextStyle(fontWeight: FontWeight.w600), + 'myPassword'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -52,12 +53,7 @@ class OnboardingStepTen extends StatelessWidget { SizedBox(height: isTall ? 40 : 20), common.buildProgressBar(9), SizedBox(height: isTall ? 40 : 20), - common.buildText([ - TextSpan( - text: - "Gecko va vérifier avec vous si vous avez bien mémorisé votre code secret.\n\nTapez votre code secret dans le champ ci-dessous pour vérifier que vous l’avez bien noté.", - style: TextStyle(fontSize: 16 * ratio)) - ]), + common.buildText("geckoWillCheckPassword".tr()), SizedBox(height: isTall ? 80 : 20), Visibility( visible: _generateWalletProvider.scanedWalletNumber != -1, @@ -107,7 +103,7 @@ class OnboardingStepTen extends StatelessWidget { ), const SizedBox(width: 8), Text( - 'Garder ce code en mémoire 15 minutes', + 'rememberPassword'.tr(), style: TextStyle(fontSize: 16, color: Colors.grey[700]), ), @@ -153,7 +149,7 @@ class OnboardingStepTen extends StatelessWidget { animationType: AnimationType.fade, validator: (v) { if (v!.length < _pinLenght) { - return "Votre code PIN fait $_pinLenght caractères"; + return "yourPasswordLengthIsX".tr(args: [_pinLenght.toString()]); } else { return null; } @@ -206,7 +202,7 @@ class OnboardingStepTen extends StatelessWidget { chest: configBox.get('currentChest'), address: address, number: 0, - name: 'Mon portefeuille courant', + name: 'currentWallet'.tr(), derivation: 2, imageDefaultPath: '0.png'); await walletBox.add(myWallet); diff --git a/lib/screens/onBoarding/11_congratulations.dart b/lib/screens/onBoarding/11_congratulations.dart index 4c88d39..c461a3b 100644 --- a/lib/screens/onBoarding/11_congratulations.dart +++ b/lib/screens/onBoarding/11_congratulations.dart @@ -1,5 +1,6 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -19,11 +20,11 @@ class OnboardingStepEleven extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'C’est tout bon !', - style: TextStyle(fontWeight: FontWeight.w600), + 'allGood'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -31,12 +32,7 @@ class OnboardingStepEleven extends StatelessWidget { body: SafeArea( child: Column(children: [ const SizedBox(height: 40), - common.buildText([ - const TextSpan( - text: - "Top !\n\nVotre coffre votre premier portefeuille ont été créés avec un immense succès.\n\nFélicitations !", - ) - ]), + common.buildText("yourChestAndWalletWereCreatedSuccessfully".tr()), SizedBox(height: isTall ? 20 : 10), Image.asset( 'assets/onBoarding/gecko-clin.gif', @@ -73,7 +69,7 @@ Widget finishButton(BuildContext context) { ModalRoute.withName('/'), ); }, - child: Text("Accéder à mon coffre", + child: Text("accessMyChest".tr(), style: TextStyle(fontSize: 22 * ratio, fontWeight: FontWeight.w600))), ); diff --git a/lib/screens/onBoarding/2.dart b/lib/screens/onBoarding/2.dart index 03c2bf8..ee16d16 100644 --- a/lib/screens/onBoarding/2.dart +++ b/lib/screens/onBoarding/2.dart @@ -1,5 +1,6 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -18,11 +19,11 @@ class OnboardingStepTwo extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Votre phrase de restauration', - style: TextStyle(fontWeight: FontWeight.w600), + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -30,11 +31,7 @@ class OnboardingStepTwo extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - [ - const TextSpan( - text: - 'Conservez cette phrase précieusement, car sans elle Gecko ne pourra pas reconstruire vos portefeuilles le jour où vous changez de téléphone.'), - ], + 'keepThisMnemonicSecure'.tr(), 'fabrication-de-portefeuille-impossible-sans-phrase.png', '>', const OnboardingStepThree(), diff --git a/lib/screens/onBoarding/3.dart b/lib/screens/onBoarding/3.dart index 42bd197..8a261d9 100644 --- a/lib/screens/onBoarding/3.dart +++ b/lib/screens/onBoarding/3.dart @@ -1,5 +1,6 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -18,27 +19,18 @@ class OnboardingStepThree extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Votre phrase de restauration', - style: TextStyle(fontWeight: FontWeight.w600), + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), extendBodyBehindAppBar: true, body: SafeArea( - child: common.infoIntro( - context, - [ - const TextSpan( - text: - 'Dans une blockchain, pas de procédure de récupération par mail. Seule votre phrase de restauration peut vous permettre de récupérer vos Ğ1 à tout moment.'), - ], - 'mot-de-passe-oublie.png', - '>', - const OnboardingStepFor(), - 2), + child: common.infoIntro(context, 'warningForgotPassword'.tr(), + 'forgot_password.png'.tr(), '>', const OnboardingStepFor(), 2), ), ); } diff --git a/lib/screens/onBoarding/4.dart b/lib/screens/onBoarding/4.dart index 5b5d7d4..946f3db 100644 --- a/lib/screens/onBoarding/4.dart +++ b/lib/screens/onBoarding/4.dart @@ -1,5 +1,6 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -18,11 +19,11 @@ class OnboardingStepFor extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Votre phrase de restauration', - style: TextStyle(fontWeight: FontWeight.w600), + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -30,18 +31,12 @@ class OnboardingStepFor extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - [ - const TextSpan(text: 'Il est temps de vous munir d’'), - const TextSpan( - text: 'un d’un papier et d’un crayon', - style: TextStyle(fontWeight: FontWeight.bold)), - const TextSpan( - text: ' afin de pouvoir noter votre phrase de restauration.'), - ], - 'gecko-oublie-aussi.png', + 'itsTimeToUseAPenAndPaper'.tr(), + 'gecko_also_can_forget.png'.tr(), '>', const OnboardingStepFive(), - 3), + 3, + isMd: true), ), ); } diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index 596d1b2..de736fc 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -1,5 +1,6 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -37,11 +38,11 @@ class _ChooseChestState extends State { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Votre phrase de restauration', - style: TextStyle(fontWeight: FontWeight.w600), + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -51,13 +52,7 @@ class _ChooseChestState extends State { SizedBox(height: isTall ? 40 : 20), common.buildProgressBar(4), SizedBox(height: isTall ? 40 : 20), - common.buildText( - [ - const TextSpan( - text: - 'Gecko a généré votre phrase de restauration ! Tâchez de la garder bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles.'), - ], - ), + common.buildText('geckoGeneratedYourMnemonicKeepItSecret'.tr()), SizedBox(height: 35 * ratio), sentanceArray(context), SizedBox(height: 17 * ratio), @@ -93,7 +88,8 @@ class _ChooseChestState extends State { // _generateWalletProvider.reloadBuild(); setState(() {}); }, - child: Text("Choisir une autre phrase", + child: Text("chooseAnotherMnemonic".tr(), + textAlign: TextAlign.center, style: TextStyle( fontSize: 22 * ratio, fontWeight: FontWeight.w600))), @@ -101,7 +97,7 @@ class _ChooseChestState extends State { ), ), SizedBox(height: 22 * ratio), - nextButton(context, "J'ai noté ma phrase", false, widget.skipIntro), + nextButton(context, "iNotedMyMnemonic".tr(), false, widget.skipIntro), SizedBox(height: 35 * ratio), ]), ), @@ -204,7 +200,7 @@ class PrintWallet extends StatelessWidget { title: const SizedBox( height: 22, child: Text( - 'Imprimer ma phrase de restauration', + 'printMyMnemonic', style: TextStyle(fontWeight: FontWeight.w600), ), ), diff --git a/lib/screens/onBoarding/6.dart b/lib/screens/onBoarding/6.dart index 832019a..e91f524 100644 --- a/lib/screens/onBoarding/6.dart +++ b/lib/screens/onBoarding/6.dart @@ -1,5 +1,6 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -41,11 +42,11 @@ class OnboardingStepSix extends StatelessWidget { extendBodyBehindAppBar: true, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Votre phrase de restauration', - style: TextStyle(fontWeight: FontWeight.w600), + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -57,20 +58,10 @@ class OnboardingStepSix extends StatelessWidget { common.buildProgressBar(5), SizedBox(height: isTall ? 40 : 20), common.buildText( - [ - TextSpan( - text: - "Avez-vous bien noté votre phrase de restauration ?\n\nPour en être sûr, veuillez taper dans le champ ci-dessous le ", - style: TextStyle(fontSize: 16 * ratio)), - TextSpan( - text: '${_generateWalletProvider.nbrWord + 1}ème mot', - style: TextStyle( - fontWeight: FontWeight.bold, fontSize: 16 * ratio)), - TextSpan( - text: " de votre phrase de restauration :", - style: TextStyle(fontSize: 16 * ratio)), - ], - ), + "didYouNoteMnemonicToBeSureTypeWord".tr( + args: [(_generateWalletProvider.nbrWord + 1).toString()]), + 20, + true), SizedBox(height: isTall ? 70 : 20), Text('${_generateWalletProvider.nbrWord + 1}', key: const Key('askedWord'), @@ -105,8 +96,9 @@ class OnboardingStepSix extends StatelessWidget { color: Colors.grey[500], fontWeight: FontWeight.w500), labelText: _generateWalletProvider.isAskedWordValid - ? "C'est le bon mot !" - : "${_generateWalletProvider.nbrWordAlpha} mot de votre phrase de restauration", + ? "itsTheGoodWord".tr() + : "${_generateWalletProvider.nbrWordAlpha} " + + "nthMnemonicWord".tr(), fillColor: const Color(0xffeeeedd), filled: true, contentPadding: const EdgeInsets.all(12), @@ -122,7 +114,7 @@ class OnboardingStepSix extends StatelessWidget { alignment: Alignment.bottomCenter, child: nextButton( context, - 'Continuer', + 'continue'.tr(), skipIntro ? const OnboardingStepNine() : const OnboardingStepSeven(), diff --git a/lib/screens/onBoarding/7.dart b/lib/screens/onBoarding/7.dart index 71c3c99..b266009 100644 --- a/lib/screens/onBoarding/7.dart +++ b/lib/screens/onBoarding/7.dart @@ -1,4 +1,5 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -18,11 +19,11 @@ class OnboardingStepSeven extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Mon code secret', - style: TextStyle(fontWeight: FontWeight.w600), + 'myPassword'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -30,11 +31,7 @@ class OnboardingStepSeven extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - [ - const TextSpan( - text: - 'Gecko va maintenant générer pour vous un code secret court qui vous permettra d’accéder rapidement à vos portefeuilles, sans avoir à taper votre phrase de restauration à chaque fois.'), - ], + 'geckoWillGenerateAPassword'.tr(), 'coffre-fort-code-secret-dans-telephone.png', '>', OnboardingStepEight(scanDerivation: scanDerivation), diff --git a/lib/screens/onBoarding/8.dart b/lib/screens/onBoarding/8.dart index 0b6555f..2172e2d 100644 --- a/lib/screens/onBoarding/8.dart +++ b/lib/screens/onBoarding/8.dart @@ -1,4 +1,5 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -18,11 +19,11 @@ class OnboardingStepEight extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Mon code secret', - style: TextStyle(fontWeight: FontWeight.w600), + 'myPassword'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -30,21 +31,12 @@ class OnboardingStepEight extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - [ - const TextSpan( - text: - 'Ce code secret protège vos portefeuilles dans un coffre-fort '), - const TextSpan( - text: 'dont vous seul possédez le code', - style: TextStyle(fontWeight: FontWeight.bold)), - const TextSpan( - text: - ', de sorte que vos portefeuilles seront inutilisables par d’autres.'), - ], + 'thisPasswordProtectsYourWalletsInASecureChest'.tr(), 'coffre-fort-protege-les-portefeuilles.png', '>', OnboardingStepNine(scanDerivation: scanDerivation), - 7), + 7, + isMd: true), ), ); } diff --git a/lib/screens/onBoarding/9.dart b/lib/screens/onBoarding/9.dart index 16dbda0..1dec327 100644 --- a/lib/screens/onBoarding/9.dart +++ b/lib/screens/onBoarding/9.dart @@ -1,4 +1,5 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -30,11 +31,11 @@ class OnboardingStepNine extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, child: Text( - 'Mon code secret', - style: TextStyle(fontWeight: FontWeight.w600), + 'myPassword'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), ), @@ -45,18 +46,9 @@ class OnboardingStepNine extends StatelessWidget { common.buildProgressBar(8), SizedBox(height: isTall ? 40 : 20), common.buildText( - [ - const TextSpan( - text: - "Et voilà votre code secret !\n\nMémorisez-le ou notez-le, car il vous sera demandé "), - const TextSpan( - text: 'à chaque fois', - style: TextStyle(fontWeight: FontWeight.bold)), - const TextSpan( - text: - " que vous voudrez effectuer un paiement sur cet appareil."), - ], - ), + "hereIsThePasswordKeepIt".tr(), + 20, + true), const SizedBox(height: 100), Stack( alignment: Alignment.centerRight, @@ -98,13 +90,13 @@ class OnboardingStepNine extends StatelessWidget { onPressed: () { _generateWalletProvider.changePinCode(reload: true); }, - child: Text("Choisir un autre code secret", + child: Text("chooseAnotherPassword".tr(), style: TextStyle( fontSize: 22 * ratio, fontWeight: FontWeight.w600))), ))), SizedBox(height: 22 * ratio), - common.nextButton(context, "J'ai noté mon code secret", + common.nextButton(context, "iNotedMyPassword".tr(), OnboardingStepTen(scanDerivation: scanDerivation), false), SizedBox(height: 35 * ratio), ]), diff --git a/lib/screens/search.dart b/lib/screens/search.dart index 8560503..be13c68 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -31,9 +32,9 @@ class SearchScreen extends StatelessWidget { appBar: AppBar( elevation: 1, toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Rechercher'), + child: Text('search'.tr()), ), leading: IconButton( icon: const Icon(Icons.arrow_back, color: Colors.black), @@ -105,9 +106,10 @@ class SearchScreen extends StatelessWidget { ); } : null, - child: const Text( - 'Rechercher', - style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + child: Text( + 'search'.tr(), + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/search_result.dart b/lib/screens/search_result.dart index 9542946..3f4978b 100644 --- a/lib/screens/search_result.dart +++ b/lib/screens/search_result.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -38,9 +39,9 @@ class SearchResultScreen extends StatelessWidget { appBar: AppBar( elevation: 1, toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Résultats de votre recherche'), + child: Text('researchResults'.tr()), ), ), bottomNavigationBar: _homeProvider.bottomAppBar(context), @@ -59,8 +60,8 @@ class SearchResultScreen extends StatelessWidget { color: Colors.grey[700], ), children: [ - const TextSpan( - text: "Résultats pour ", + TextSpan( + text: "resultsFor".tr(), ), TextSpan( text: '"${_searchProvider.searchController.text}"', @@ -71,7 +72,7 @@ class SearchResultScreen extends StatelessWidget { ), const SizedBox(height: 40), Text( - 'Dans la blockchain $currencyName', + 'inBlockchainResult'.tr(args: [currencyName]), style: const TextStyle(fontSize: 20), ), const SizedBox(height: 20), diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index bccf4d4..bc0b488 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:durt/durt.dart'; import 'package:flutter/services.dart'; @@ -39,9 +40,9 @@ class SettingsScreen extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( toolbarHeight: 60 * ratio, - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Paramètres'), + child: Text('parameters'.tr()), )), body: Column( // crossAxisAlignment: CrossAxisAlignment.start, @@ -52,7 +53,8 @@ class SettingsScreen extends StatelessWidget { log.d(_sub.sdk.api.connectedNode?.endpoint); return Expanded( child: Row(children: [ - Text(' Noeud $currencyName :'), + const SizedBox(width: 10), + Text('currencyNode'.tr(args: [currencyName])), const Spacer(), Icon(_sub.nodeConnected && !_sub.isLoadingEndpoint ? Icons.check @@ -97,9 +99,9 @@ class SettingsScreen extends StatelessWidget { log.i('Oublier tous mes coffres'); await _myWallets.deleteAllWallet(context); }, - child: const Text( - 'Oublier tous mes coffres', - style: TextStyle( + child: Text( + 'forgetAllMyChests'.tr(), + style: const TextStyle( fontSize: fontSize + 4, color: Color(0xffD80000), fontWeight: FontWeight.w600, diff --git a/lib/screens/substrate_sandbox.dart b/lib/screens/substrate_sandbox.dart index a62fdfc..0c3ed95 100644 --- a/lib/screens/substrate_sandbox.dart +++ b/lib/screens/substrate_sandbox.dart @@ -21,7 +21,7 @@ class SubstrateSandBox extends StatelessWidget { toolbarHeight: 60 * ratio, title: const SizedBox( height: 22, - child: Text('Substrate Sandbox'), + child: Text('⏳ Substrate Sandbox'), ), ), body: SafeArea( @@ -36,12 +36,12 @@ class SubstrateSandBox extends StatelessWidget { await _sub.connectNode(context); }, child: Text( - 'Noeud connecté ?: ${_sub.nodeConnected} (${_sub.sdk.api.connectedNode?.endpoint})')), + '🌐 Noeud connecté ?: ${_sub.nodeConnected} (${_sub.sdk.api.connectedNode?.endpoint})')), if (_sub.nodeConnected) - Text('Noeud "$currencyName", bloc N°${_sub.blocNumber}'), + Text('🏆 Noeud "$currencyName", bloc N°${_sub.blocNumber}'), const SizedBox(height: 20), Row(children: [ - const Text('Liste des coffres:'), + const Text('💳 Liste des coffres:'), const Spacer(), InkWell( child: Image.asset( @@ -93,13 +93,13 @@ class SubstrateSandBox extends StatelessWidget { addressInfo.address!, 2, _sub.keystorePassword.text), - child: const Text("Dériver"), + child: const Text("🏂 Dériver"), ) ]) ]); }), const SizedBox(height: 20), - const Text('Mot de passe du coffre:'), + const Text('🔒 Mot de passe du coffre:'), TextField( controller: _sub.keystorePassword, obscureText: true, @@ -130,7 +130,7 @@ class SubstrateSandBox extends StatelessWidget { } : null, child: const Text( - 'Importer depuis le presse-papier', + '📎 Importer depuis le presse-papier', style: TextStyle(fontSize: 20), ), ), @@ -149,7 +149,7 @@ class SubstrateSandBox extends StatelessWidget { snack(context, 'Le mnemonic a été copié'); }, child: const Text( - "Générer un mnemonic et le copier", + "🏦 Générer un mnemonic et le copier", style: TextStyle(fontSize: 20), ), ), @@ -161,7 +161,7 @@ class SubstrateSandBox extends StatelessWidget { textAlign: TextAlign.center, ), ), - const Text('--------'), + const Text('-〰️---〰️---〰️-'), const SizedBox(height: 10), Text(_sub.debugConnection) ]) diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index 858b3be..732595b 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -39,44 +40,44 @@ class TransactionInProgress extends StatelessWidget { switch (transType) { case 'pay': { - _actionName = 'Transaction'; + _actionName = 'transaction'.tr(); } break; case 'cert': { - _actionName = 'Certification'; + _actionName = 'certification'.tr(); } break; case 'comfirmIdty': { - _actionName = "Confirmation d'identité"; + _actionName = "identityConfirm".tr(); } break; case 'revokeIdty': { - _actionName = "Révocation d'adhésion"; + _actionName = "revokeAdhesion".tr(); } break; default: { - _actionName = 'Transaction étrange'; + _actionName = 'strangeTransaction'.tr(); } } switch (_result) { case '': { - _resultText = 'Envoi en cours ...'; + _resultText = 'sending'.tr(); } break; case 'Ready': { - _resultText = 'En cours de propagation...'; + _resultText = 'propagating'.tr(); } break; case 'Broadcast': { - _resultText = 'En cours de validation ...'; + _resultText = 'validating'.tr(); } break; default: @@ -86,10 +87,10 @@ class TransactionInProgress extends StatelessWidget { log.d(_result); if (_result.contains('blockHash: ')) { isValid = true; - _resultText = '$_actionName validé !'; + _resultText = 'extrinsicValidated'.tr(args: [_actionName]); } else { isValid = false; - _resultText = "Une erreur s'est produite:\n"; + _resultText = "anErrorOccured".tr() + ":\n"; final List _exceptionSplit = _result.split('Exception: '); String _exception; if (_exceptionSplit.length > 1) { @@ -102,37 +103,33 @@ class TransactionInProgress extends StatelessWidget { case 'cert.NotRespectCertPeriod': case 'identity.CreatorNotAllowedToCreateIdty': { - _resultText = - "Vous devez attendre 24h entre chaque certification"; + _resultText = "24hbetweenCerts".tr(); } break; case 'cert.CannotCertifySelf': { - _resultText = - "Vous ne pouvez pas vous certifier\nvous même ..."; + _resultText = "canNotCertifySelf".tr(); } break; case 'identity.IdtyNameAlreadyExist': { - _resultText = "Ce nom est déjà pris"; + _resultText = "nameAlreadyExist".tr(); } break; case 'balances.KeepAlive': { - _resultText = - "Vous devez garder au moins 2ĞD sur votre compte pour le garder actif"; + _resultText = "2GDtoKeepAlive".tr(); } break; case '1010: Invalid Transaction: Inability to pay some fees , e.g. account balance too low': { - _resultText = - "Vous devez alimenter ce compte avant\nde pouvoir l'utiliser"; + _resultText = "youHaveToFeedThisAccountBeforeUsing".tr(); } break; case 'timeout': { - _resultText += "Le délais d'éxecution est dépassé"; + _resultText += "execTimeoutOver".tr(); } break; default: @@ -162,7 +159,9 @@ class TransactionInProgress extends StatelessWidget { height: 22, child: Row( mainAxisAlignment: MainAxisAlignment.center, - children: [Text('$_actionName en cours')]), + children: [ + Text('extrinsicInProgress'.tr(args: [_actionName])) + ]), )), body: SafeArea( child: Align( @@ -189,10 +188,10 @@ class TransactionInProgress extends StatelessWidget { fontSize: 18, fontWeight: FontWeight.w600), ), if (transType == 'pay') const SizedBox(height: 10), - const Text( - 'de', + Text( + 'fromMinus'.tr(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 18), + style: const TextStyle(fontSize: 18), ), Text( from, @@ -201,10 +200,10 @@ class TransactionInProgress extends StatelessWidget { fontSize: 18, fontWeight: FontWeight.w600), ), const SizedBox(height: 10), - const Text( - 'vers', + Text( + 'toMinus'.tr(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 18), + style: const TextStyle(fontSize: 18), ), Text( to, @@ -263,7 +262,7 @@ class TransactionInProgress extends StatelessWidget { if (transType == 'pay') Navigator.pop(context); }, child: Text( - 'Fermer', + 'close'.tr(), style: TextStyle( fontSize: 23 * ratio, fontWeight: FontWeight.w600), diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index f69cbd3..9cb9108 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -69,9 +70,9 @@ class WalletViewScreen extends StatelessWidget { ), ), ], - title: const SizedBox( + title: SizedBox( height: 22, - child: Text('Voir un portefeuille'), + child: Text('seeAWallet'.tr()), ), ), bottomNavigationBar: _homeProvider.bottomAppBar(context), @@ -112,7 +113,7 @@ class WalletViewScreen extends StatelessWidget { ), const SizedBox(height: 9), Text( - "Voir\nl'activité", + "displayNActivity".tr(), textAlign: TextAlign.center, style: TextStyle( fontSize: buttonFontSize, fontWeight: FontWeight.w500), @@ -136,33 +137,36 @@ class WalletViewScreen extends StatelessWidget { final int _seconds = _durationSeconds.inSeconds; final int _minutes = _durationSeconds.inMinutes; + // TODO translate timing if (_seconds <= 0) { - _duration = '0 secondes'; + _duration = 'seconds'.tr(args: ['0']); } else if (_seconds <= 60) { - _duration = '$_seconds secondes'; + _duration = 'seconds'.tr(args: [_seconds.toString()]); } else if (_seconds <= 3600) { - _duration = '$_minutes minutes'; + _duration = 'minutes'.tr(args: [_minutes.toString()]); } else if (_seconds <= 86400) { final int _hours = _durationSeconds.inHours; final int _minutesLeft = _minutes - _hours * 60; String _showMinutes = ''; if (_minutesLeft < 60) {} - _showMinutes = ' $_minutesLeft minutes'; - _duration = '$_hours heures$_showMinutes'; + _showMinutes = + 'minutes'.tr(args: [_minutesLeft.toString()]); + _duration = + 'hours'.tr(args: [_hours.toString(), _showMinutes]); } else if (_seconds <= 2592000) { final int _days = _durationSeconds.inDays; - _duration = '$_days jours'; + _duration = 'days'.tr(args: [_days.toString()]); } else { final int _months = (_durationSeconds.inDays / 30).round(); - _duration = '$_months mois'; + _duration = 'months'.tr(args: [_months.toString()]); } } return Visibility( visible: (snapshot.data != {}), child: Column(children: [ if (snapshot.data!['canCert'] != null || - _duration == '0 secondes') + _duration == 'seconds'.tr(args: ['0'])) Column(children: [ SizedBox( height: buttonSize, @@ -180,9 +184,13 @@ class WalletViewScreen extends StatelessWidget { 'assets/gecko_certify.png')), ), onTap: () async { - final bool? _result = await confirmPopup( - context, - "Êtes-vous certain de vouloir certifier l'adresse:\n\n${getShortPubkey(pubkey!)}"); + final bool? _result = + await confirmPopup( + context, + "areYouSureYouWantToCertify".tr( + args: [ + getShortPubkey(pubkey!) + ])); if (_result ?? false) { String? _pin; @@ -227,7 +235,7 @@ class WalletViewScreen extends StatelessWidget { ), const SizedBox(height: 9), Text( - "Certifier", + "certify".tr(), textAlign: TextAlign.center, style: TextStyle( fontSize: buttonFontSize, @@ -255,7 +263,8 @@ class WalletViewScreen extends StatelessWidget { ), ), Text( - "Vous devez attendre\n$_duration avant\nde pouvoir certifier", + "mustWaitXBeforeCertify" + .tr(args: [_duration.toString()]), textAlign: TextAlign.center, style: TextStyle( fontSize: buttonFontSize - 4, @@ -264,7 +273,7 @@ class WalletViewScreen extends StatelessWidget { ), ]), if (snapshot.data!['certRenewable'] != null && - _duration != '0 secondes') + _duration != 'seconds'.tr(args: ['0'])) Column(children: [ SizedBox( height: buttonSize, @@ -285,7 +294,8 @@ class WalletViewScreen extends StatelessWidget { ), ), Text( - "Vous pourrez renouveller\ncette certification\ndans $_duration", + "canRenewCertInX" + .tr(args: [_duration.toString()]), textAlign: TextAlign.center, style: TextStyle( fontSize: buttonFontSize - 4, @@ -321,36 +331,13 @@ class WalletViewScreen extends StatelessWidget { ), const SizedBox(height: 9), Text( - "Copier\nla clef", + "copyAddress".tr(), textAlign: TextAlign.center, style: TextStyle( fontSize: buttonFontSize, fontWeight: FontWeight.w500), ), ]), ]), - // FutureBuilder( - // future: _walletOptions.generateQRcode(_historyProvider.pubkey), - // builder: (context, snapshot) { - // return snapshot.data != null - // ? GestureDetector( - // key: const Key('openQrcode'), - // onTap: () { - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) { - // return AvatarFullscreen( - // Image.memory(snapshot.data), - // title: 'QrCode du profil', - // color: Colors.white, - // ); - // }), - // ); - // }, - // child: Image.memory(snapshot.data, height: 60 * ratio), - // ) - // : const Text('-', style: TextStyle(fontSize: 20)); - // }, - // ), const Spacer(), Consumer(builder: (context, _sub, _) { return Opacity( @@ -389,7 +376,7 @@ class WalletViewScreen extends StatelessWidget { const SizedBox(height: 9), Consumer(builder: (context, _sub, _) { return Text( - "Faire un\nvirement", + 'doATransfer'.tr(), textAlign: TextAlign.center, style: TextStyle( color: _sub.nodeConnected ? Colors.black : Colors.grey[500], @@ -466,9 +453,9 @@ class WalletViewScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const Text( - 'Effectuer un virement', - style: TextStyle( + Text( + 'executeATransfer'.tr(), + style: const TextStyle( fontSize: 26, fontWeight: FontWeight.w700), ), IconButton( @@ -481,7 +468,7 @@ class WalletViewScreen extends StatelessWidget { ]), const SizedBox(height: 20), Text( - 'Depuis:', + 'from'.tr(), style: TextStyle( fontSize: 19, fontWeight: FontWeight.w500, @@ -571,7 +558,7 @@ class WalletViewScreen extends StatelessWidget { // const SizedBox(height: 10), Text( - 'Montant:', + 'amount'.tr(), style: TextStyle( fontSize: 19, fontWeight: FontWeight.w500, @@ -676,9 +663,9 @@ class WalletViewScreen extends StatelessWidget { } } : null, - child: const Text( - 'Effectuer le virement', - style: TextStyle( + child: Text( + 'executeTheTransfer'.tr(), + style: const TextStyle( fontSize: 20, fontWeight: FontWeight.w600), ), ), diff --git a/pubspec.lock b/pubspec.lock index 60bf6e8..e88a7fb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -316,6 +316,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.6" + easy_localization: + dependency: "direct main" + description: + name: easy_localization + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + easy_logger: + dependency: transitive + description: + name: easy_logger + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.2" fake_async: dependency: transitive description: @@ -389,6 +403,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_logs: dependency: "direct main" description: @@ -396,6 +415,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.6" + flutter_markdown: + dependency: "direct main" + description: + name: flutter_markdown + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.10+2" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -738,6 +764,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + markdown: + dependency: transitive + description: + name: markdown + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.0" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 3ca445c..05b92cd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: Pay with G1. # pub.dev using `pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.9+11 +version: 0.0.9+12 environment: sdk: '>=2.12.0 <3.0.0' @@ -72,6 +72,8 @@ dependencies: web_socket_channel: ^2.2.0 connectivity_plus: ^2.3.3 image_cropper: ^2.0.3 + easy_localization: ^3.0.1 + flutter_markdown: ^0.6.10+2 dev_dependencies: # flutter_launcher_icons: ^0.9.2 @@ -99,6 +101,7 @@ flutter: assets: - config/ - assets/ + - assets/translations/ - assets/home/ - assets/avatars/ - assets/chests/ diff --git a/test_driver/app_test.dart b/test_driver/app_test.dart index 40ba8d5..3a3243d 100644 --- a/test_driver/app_test.dart +++ b/test_driver/app_test.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_driver/flutter_driver.dart'; import 'package:test/test.dart'; // import 'package:flutter/services.dart'; @@ -160,7 +161,7 @@ void main() { await driver!.getText(find.byValueKey( 'step6', )), - "J’ai généré votre phrase de restauration !\nTâchez de la garder bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles."); + "iGeneratedYourMnemonicKeepItSecret".tr()); }); test('OnBoarding - Generate sentance and confirme it', ( @@ -255,7 +256,7 @@ void main() { {timeout = const Duration(seconds: 2)}) async { await tapOn('goWalletHome'); - expect(await getText('myWallets'), "Coffre à Ğecko"); + expect(await getText('myWallets'), "geckoChest".tr()); await sleep(300); // Go to first derivation and rename it