From b89de85e909aeaa8d5b310bbdf6a1aa08b21d171 Mon Sep 17 00:00:00 2001 From: poka Date: Thu, 16 Jun 2022 22:29:42 +0200 Subject: [PATCH 01/13] hello multilang ! --- assets/translations/en.json | 3 ++ assets/translations/fr.json | 3 ++ lib/main.dart | 35 +++++++++++++++++++---- lib/screens/home.dart | 2 ++ lib/screens/myWallets/wallet_options.dart | 2 +- pubspec.lock | 19 ++++++++++++ pubspec.yaml | 2 ++ 7 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 assets/translations/en.json create mode 100644 assets/translations/fr.json diff --git a/assets/translations/en.json b/assets/translations/en.json new file mode 100644 index 0000000..15afb25 --- /dev/null +++ b/assets/translations/en.json @@ -0,0 +1,3 @@ +{ + "msg": "hello {} there !" +} \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json new file mode 100644 index 0000000..475a3fa --- /dev/null +++ b/assets/translations/fr.json @@ -0,0 +1,3 @@ +{ + "msg": "Salut ici !" +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 01d339c..b484616 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -45,11 +45,14 @@ 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:flutter_localizations/flutter_localizations.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,10 +100,21 @@ 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))); + 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', // <-- change the path of the translation files + fallbackLocale: const Locale('fr'), + child: Gecko(indexerEndpoint), + ), + ), + ); // runZoned>( // () async { @@ -117,7 +131,15 @@ Future main() async { } else { print('Debug mode enabled: No sentry alerte'); - runApp(Gecko(indexerEndpoint)); + runApp( + EasyLocalization( + supportedLocales: const [Locale('en'), Locale('fr')], + path: + 'assets/translations', // <-- change the path of the translation files + fallbackLocale: const Locale('fr'), + child: Gecko(indexerEndpoint), + ), + ); } } @@ -145,6 +167,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/screens/home.dart b/lib/screens/home.dart index 899c14a..c9899be 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'; @@ -301,6 +302,7 @@ Widget geckHome(context) { ), ), const SizedBox(height: 12), + const Text('msg').tr(args: [currencyName]), Text( "Rechercher un\nportefeuille", textAlign: TextAlign.center, diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 0f41e31..8e0465e 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -351,7 +351,7 @@ class WalletOptions extends StatelessWidget { height: 45, ), const SizedBox(width: 22), - const Text('Activité', + const Text("Voir l'activité", style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500)), ]), ), diff --git a/pubspec.lock b/pubspec.lock index 60bf6e8..85ce7e4 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: diff --git a/pubspec.yaml b/pubspec.yaml index 3ca445c..b6077d7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -72,6 +72,7 @@ dependencies: web_socket_channel: ^2.2.0 connectivity_plus: ^2.3.3 image_cropper: ^2.0.3 + easy_localization: ^3.0.1 dev_dependencies: # flutter_launcher_icons: ^0.9.2 @@ -99,6 +100,7 @@ flutter: assets: - config/ - assets/ + - assets/translations/ - assets/home/ - assets/avatars/ - assets/chests/ From 8555c579bd9d3962114c9bc82cb62328f7012fc0 Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux Date: Fri, 17 Jun 2022 01:13:14 +0200 Subject: [PATCH 02/13] welcome multilang! --- assets/onBoarding/forgot_password_en.png | Bin 0 -> 243397 bytes ...asse-oublie.png => forgot_password_fr.png} | Bin assets/translations/en.json | 54 +++++++++++++++++- assets/translations/fr.json | 54 +++++++++++++++++- lib/main.dart | 3 +- lib/providers/generate_wallets.dart | 11 ++-- lib/providers/home.dart | 21 +------ lib/providers/substrate_sdk.dart | 9 +-- lib/providers/wallet_options.dart | 15 ++--- lib/providers/wallets_profiles.dart | 11 ++-- lib/screens/home.dart | 21 ++++--- lib/screens/myWallets/change_pin.dart | 9 +-- lib/screens/myWallets/chest_options.dart | 13 +++-- lib/screens/myWallets/choose_chest.dart | 11 ++-- lib/screens/myWallets/choose_wallet.dart | 7 ++- lib/screens/myWallets/custom_derivations.dart | 17 +++--- lib/screens/myWallets/manage_membership.dart | 2 +- lib/screens/myWallets/show_seed.dart | 3 +- .../myWallets/transaction_comment.dart | 5 +- lib/screens/myWallets/unlocking_wallet.dart | 11 ++-- lib/screens/myWallets/wallet_options.dart | 13 +++-- lib/screens/myWallets/wallets_home.dart | 13 +++-- lib/screens/onBoarding/10.dart | 3 +- .../onBoarding/11_congratulations.dart | 3 +- lib/screens/onBoarding/3.dart | 7 ++- lib/screens/onBoarding/5.dart | 8 ++- lib/screens/settings.dart | 5 +- lib/screens/wallet_view.dart | 3 +- pubspec.lock | 28 +++++++++ pubspec.yaml | 1 + test_driver/app_test.dart | 3 +- 31 files changed, 251 insertions(+), 113 deletions(-) create mode 100644 assets/onBoarding/forgot_password_en.png rename assets/onBoarding/{mot-de-passe-oublie.png => forgot_password_fr.png} (100%) diff --git a/assets/onBoarding/forgot_password_en.png b/assets/onBoarding/forgot_password_en.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb7dfb4d0bb8488df044142ad538bd1b242e146 GIT binary patch literal 243397 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Ô~?h#llT@gD5wYbxMKzGn>J@y=G%!EfnM=lZP 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 bi*x)RsP7?i(AaZP00000NkvXXu0mjfeq}4? literal 0 HcmV?d00001 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/translations/en.json b/assets/translations/en.json index 15afb25..b77c5c0 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -1,3 +1,55 @@ { - "msg": "hello {} there !" + "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", + "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", + "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" + + } \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 475a3fa..4841f12 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -1,3 +1,55 @@ { - "msg": "Salut ici !" + "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é", + "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é" + } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index b484616..26f6a8b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -45,7 +45,6 @@ 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:flutter_localizations/flutter_localizations.dart'; import 'package:easy_localization/easy_localization.dart'; const bool enableSentry = true; @@ -110,7 +109,7 @@ Future main() async { supportedLocales: const [Locale('en'), Locale('fr')], path: 'assets/translations', // <-- change the path of the translation files - fallbackLocale: const Locale('fr'), + fallbackLocale: const Locale('en'), child: Gecko(indexerEndpoint), ), ), diff --git a/lib/providers/generate_wallets.dart b/lib/providers/generate_wallets.dart index 0d90ec5..cc386b5 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); @@ -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/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 27cebf8..93b5cdc 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,14 @@ 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); } diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index a123809..5a958e7 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'; @@ -163,7 +164,7 @@ class WalletOptionsProvider with ChangeNotifier { return isOwner ? InkWell( child: _showText( - 'Cliquez ici pour confirmer\nvotre nouvelle identité', + 'clickHereToConfirmIdentity'.tr(), 18, true), onTap: () async { @@ -190,7 +191,7 @@ class WalletOptionsProvider with ChangeNotifier { case 'Validated': { return isOwner - ? _showText('Membre validé !', 18, true) + ? _showText('memberValidated'.tr(), 18, true) : _duniterIndexer.getNameByAddress( context, address, @@ -263,7 +264,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 +326,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 +353,7 @@ class WalletOptionsProvider with ChangeNotifier { return TextButton( key: const Key('infoPopup'), child: Text( - "Valider", + "validate".tr(), style: TextStyle( fontSize: 21, color: canValidateNameBool diff --git a/lib/providers/wallets_profiles.dart b/lib/providers/wallets_profiles.dart index a12817e..1cde68c 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'; @@ -235,10 +236,10 @@ Widget headerProfileView( } 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/home.dart b/lib/screens/home.dart index c9899be..4749b07 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -63,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( @@ -302,9 +302,8 @@ Widget geckHome(context) { ), ), const SizedBox(height: 12), - const Text('msg').tr(args: [currencyName]), Text( - "Rechercher un\nportefeuille", + "searchWallet".tr(), textAlign: TextAlign.center, style: TextStyle( color: Colors.white, @@ -370,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, @@ -414,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, @@ -470,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, @@ -522,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, @@ -553,10 +552,10 @@ Widget welcomeHome(context) { ), ); }, - child: const Text( - 'Créer un portefeuille', + child: Text( + 'createWallet'.tr(), style: - TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + const TextStyle(fontSize: 24, fontWeight: FontWeight.w600), ), ), ), @@ -578,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..47d3e84 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'; @@ -58,10 +59,10 @@ class ChooseWalletScreen extends StatelessWidget { Navigator.pop(context); Navigator.pop(context); }, - child: const Text( - 'Choisir ce portefeuille', + child: Text( + 'chooseThisWallet'.tr(), style: - TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + 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..bacd1da 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( @@ -125,7 +126,7 @@ class _CustomDerivationState extends State { if (_pin != null || _myWalletProvider.pinCode != '') { String _newDerivationName = - 'Portefeuille ${_myWalletProvider.listWallets.last.number! + 2}'; + 'wallet'.tr() + ' ${_myWalletProvider.listWallets.last.number! + 2}'; if (dropdownValue == 'root') { await _myWalletProvider.generateRootWallet( context, 'Portefeuille racine'); @@ -146,9 +147,9 @@ 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/show_seed.dart b/lib/screens/myWallets/show_seed.dart index 276caa4..5bd355a 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'; @@ -97,7 +98,7 @@ class ShowSeed extends StatelessWidget { ), const SizedBox(width: 7), Text( - 'Copier', + 'copy'.tr(), style: TextStyle( fontSize: 15, color: Colors.grey[50]), ) 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..346316d 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, diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 8e0465e..69cfe1d 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,8 @@ class WalletOptions extends StatelessWidget { height: 45, ), const SizedBox(width: 22), - const Text("Voir l'activité", - style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500)), + Text("displayActivity".tr(), + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500)), ]), ), ); @@ -382,7 +383,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 +421,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 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/10.dart b/lib/screens/onBoarding/10.dart index b06ba94..7b321c6 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'; @@ -206,7 +207,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..cd92ba5 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'; @@ -73,7 +74,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/3.dart b/lib/screens/onBoarding/3.dart index 42bd197..48cf981 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'; @@ -31,11 +32,11 @@ class OnboardingStepThree extends StatelessWidget { child: common.infoIntro( context, [ - const TextSpan( + 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.'), + 'warningForgotPassword'.tr()), ], - 'mot-de-passe-oublie.png', + 'forgot_password.png'.tr(), '>', const OnboardingStepFor(), 2), diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index 596d1b2..266234b 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'; @@ -93,7 +94,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 +103,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 +206,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/settings.dart b/lib/screens/settings.dart index bccf4d4..4fb67cb 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, diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index f69cbd3..0044bc6 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'; @@ -321,7 +322,7 @@ class WalletViewScreen extends StatelessWidget { ), const SizedBox(height: 9), Text( - "Copier\nla clef", + "copyAddress".tr(), textAlign: TextAlign.center, style: TextStyle( fontSize: buttonFontSize, fontWeight: FontWeight.w500), diff --git a/pubspec.lock b/pubspec.lock index 85ce7e4..113d714 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -274,6 +274,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.2" dart_style: dependency: transitive description: @@ -389,6 +396,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.18.4" + flutter_html: + dependency: "direct main" + description: + name: flutter_html + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0-alpha.5" flutter_inappwebview: dependency: transitive description: @@ -570,6 +584,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.3" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.0" http: dependency: "direct main" description: @@ -827,6 +848,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.0+1" + numerus: + dependency: transitive + description: + name: numerus + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" package_config: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b6077d7..ab75df1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -73,6 +73,7 @@ dependencies: connectivity_plus: ^2.3.3 image_cropper: ^2.0.3 easy_localization: ^3.0.1 + flutter_html: ^3.0.0-alpha.5 dev_dependencies: # flutter_launcher_icons: ^0.9.2 diff --git a/test_driver/app_test.dart b/test_driver/app_test.dart index 40ba8d5..43b6910 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'; @@ -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 From ad1a517553e1cf77cbeb98e11ce7dba882480078 Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 17 Jun 2022 20:18:54 +0200 Subject: [PATCH 03/13] fix flutter format --- lib/main.dart | 3 +-- lib/providers/substrate_sdk.dart | 3 ++- lib/providers/wallet_options.dart | 4 +--- lib/providers/wallets_profiles.dart | 18 ++++++------------ lib/screens/home.dart | 4 ++-- lib/screens/myWallets/choose_wallet.dart | 4 ++-- lib/screens/myWallets/custom_derivations.dart | 7 ++++--- lib/screens/myWallets/wallet_options.dart | 3 ++- lib/screens/onBoarding/3.dart | 4 +--- 9 files changed, 21 insertions(+), 29 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 26f6a8b..db919e0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -107,8 +107,7 @@ Future main() async { appRunner: () => runApp( EasyLocalization( supportedLocales: const [Locale('en'), Locale('fr')], - path: - 'assets/translations', // <-- change the path of the translation files + path: 'assets/translations', fallbackLocale: const Locale('en'), child: Gecko(indexerEndpoint), ), diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 93b5cdc..fbe3347 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -120,7 +120,8 @@ class SubstrateSdk with ChangeNotifier { // currencyName = await getCurencyName(); notifyListeners(); _homeProvider.changeMessage( - "wellConnectedToNode".tr(args: [getConnectedEndpoint()!.split('/')[2]]), + "wellConnectedToNode" + .tr(args: [getConnectedEndpoint()!.split('/')[2]]), 5); // snackNode(ctx, true); } else { diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 5a958e7..d13ef53 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -164,9 +164,7 @@ class WalletOptionsProvider with ChangeNotifier { return isOwner ? InkWell( child: _showText( - 'clickHereToConfirmIdentity'.tr(), - 18, - true), + 'clickHereToConfirmIdentity'.tr(), 18, true), onTap: () async { await validateIdentity(context); }, diff --git a/lib/providers/wallets_profiles.dart b/lib/providers/wallets_profiles.dart index 1cde68c..49b412c 100644 --- a/lib/providers/wallets_profiles.dart +++ b/lib/providers/wallets_profiles.dart @@ -127,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); @@ -182,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( @@ -216,10 +213,9 @@ Widget headerProfileView( ]), const Spacer(), Column(children: [ - ClipOval( - child: _cesiumPlusProvider.defaultAvatar(_avatarSize), - ), - + ClipOval( + child: _cesiumPlusProvider.defaultAvatar(_avatarSize), + ), const SizedBox(height: 25), ]), ]), @@ -228,8 +224,6 @@ Widget headerProfileView( ]); } - - void reload() { notifyListeners(); } @@ -240,6 +234,6 @@ snackCopyKey(context) { padding: const EdgeInsets.all(20), content: Text("thisAddressHasBeenCopiedToClipboard".tr(), style: const TextStyle(fontSize: 16)), - duration: const Duration(seconds: 2)); + duration: const Duration(seconds: 2)); ScaffoldMessenger.of(context).showSnackBar(snackBar); } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 4749b07..7a7ad59 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -554,8 +554,8 @@ Widget welcomeHome(context) { }, child: Text( 'createWallet'.tr(), - style: - const TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/myWallets/choose_wallet.dart b/lib/screens/myWallets/choose_wallet.dart index 47d3e84..b1f054b 100644 --- a/lib/screens/myWallets/choose_wallet.dart +++ b/lib/screens/myWallets/choose_wallet.dart @@ -61,8 +61,8 @@ class ChooseWalletScreen extends StatelessWidget { }, child: Text( 'chooseThisWallet'.tr(), - style: - const TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + 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 bacd1da..a4d1623 100644 --- a/lib/screens/myWallets/custom_derivations.dart +++ b/lib/screens/myWallets/custom_derivations.dart @@ -125,8 +125,8 @@ class _CustomDerivationState extends State { } if (_pin != null || _myWalletProvider.pinCode != '') { - String _newDerivationName = - 'wallet'.tr() + ' ${_myWalletProvider.listWallets.last.number! + 2}'; + String _newDerivationName = 'wallet'.tr() + + ' ${_myWalletProvider.listWallets.last.number! + 2}'; if (dropdownValue == 'root') { await _myWalletProvider.generateRootWallet( context, 'Portefeuille racine'); @@ -149,7 +149,8 @@ class _CustomDerivationState extends State { }, child: Text( 'validate'.tr(), - style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w600), + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 69cfe1d..75509f2 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -353,7 +353,8 @@ class WalletOptions extends StatelessWidget { ), const SizedBox(width: 22), Text("displayActivity".tr(), - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500)), + style: + const TextStyle(fontSize: 20, fontWeight: FontWeight.w500)), ]), ), ); diff --git a/lib/screens/onBoarding/3.dart b/lib/screens/onBoarding/3.dart index 48cf981..663f1ee 100644 --- a/lib/screens/onBoarding/3.dart +++ b/lib/screens/onBoarding/3.dart @@ -32,9 +32,7 @@ class OnboardingStepThree extends StatelessWidget { child: common.infoIntro( context, [ - TextSpan( - text: - 'warningForgotPassword'.tr()), + TextSpan(text: 'warningForgotPassword'.tr()), ], 'forgot_password.png'.tr(), '>', From 65f6f0a237c86862e5472b66f477c93204bb008f Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 17 Jun 2022 21:34:47 +0200 Subject: [PATCH 04/13] replace Multiple TextSpan for bold words by Markdown widget in onboarding --- assets/translations/en.json | 4 +- assets/translations/fr.json | 5 +- lib/screens/common_elements.dart | 51 +++++++++++++++---- lib/screens/home.dart | 1 + lib/screens/myWallets/show_seed.dart | 7 +-- lib/screens/onBoarding/1.dart | 25 ++++----- lib/screens/onBoarding/10.dart | 8 +-- .../onBoarding/11_congratulations.dart | 8 +-- lib/screens/onBoarding/2.dart | 7 +-- lib/screens/onBoarding/3.dart | 11 +--- lib/screens/onBoarding/4.dart | 18 ++----- lib/screens/onBoarding/5.dart | 7 +-- lib/screens/onBoarding/6.dart | 16 +----- lib/screens/onBoarding/7.dart | 6 +-- lib/screens/onBoarding/8.dart | 16 ++---- lib/screens/onBoarding/9.dart | 15 +----- pubspec.lock | 42 +++++---------- pubspec.yaml | 2 +- 18 files changed, 96 insertions(+), 153 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index b77c5c0..3b26486 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -49,7 +49,9 @@ "validate": "Validate", "confirm": "Confirm", "confirmPayment": "Confirm payment", - "clickHereToConfirmIdentity": "Click here to confirm\nyour new identity" + "clickHereToConfirmIdentity": "Click here to confirm\nyour new identity", + "geckoGenerateYourWalletFromMnemonic": "Gecko 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 Gecko will not be able to rebuild your wallets the day you change your phone." } \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 4841f12..ab71c0e 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -50,6 +50,7 @@ "validate": "Valider", "confirm": "Confirmer", "confirmPayment": "Confirmer le paiement", - "clickHereToConfirmIdentity": "Cliquez ici pour confirmer\nvotre nouvelle identité" - + "clickHereToConfirmIdentity": "Cliquez ici pour confirmer\nvotre nouvelle identité", + "geckoGenerateYourWalletFromMnemonic": "Gecko 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 Gecko ne pourra pas reconstruire vos portefeuilles le jour où vous changez de téléphone." } \ No newline at end of file diff --git a/lib/screens/common_elements.dart b/lib/screens/common_elements.dart index ca12fa7..cfd738e 100644 --- a/lib/screens/common_elements.dart +++ b/lib/screens/common_elements.dart @@ -1,5 +1,6 @@ import 'package:dots_indicator/dots_indicator.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,25 +30,50 @@ class CommonElements { child: Image.asset('assets/onBoarding/$assetName', width: imageWidth)); } - Widget buildText(List text, [double size = 20]) { + Widget buildText(String text, [double size = 20]) { 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( + child: Text(text, + textAlign: TextAlign.justify, style: TextStyle( fontSize: isTall ? size : size * 0.9, color: Colors.black, - letterSpacing: 0.3), - children: text, - ), - ), + letterSpacing: 0.3)), ); } + Widget buildTextMd(String text, [double size = 20]) { + final style = 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: MarkdownBody(data: text, styleSheet: style)); + + // RichText( + // textAlign: TextAlign.justify, + // text: TextSpan( + // style: TextStyle( + // fontSize: isTall ? size : size * 0.9, + // color: Colors.black, + // letterSpacing: 0.3), + // children: text, + // ), + // ), + // ); + } + Widget nextButton( BuildContext context, String text, nextScreen, bool isFast) { return SizedBox( @@ -85,11 +111,12 @@ class CommonElements { Widget infoIntro( BuildContext context, - List text, + String text, String assetName, String buttonText, nextScreen, double pagePosition, { + String? textMd, bool isFast = false, double boxHeight = 440, double imageWidth = 350, @@ -100,7 +127,11 @@ class CommonElements { buildProgressBar(pagePosition), SizedBox(height: isTall ? 40 : 20), - buildText(text, textSize), + if (textMd == null) + buildText(text, textSize) + else + buildTextMd(textMd, textSize), + buildImage(assetName, boxHeight, imageWidth), Expanded( child: Align( diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 7a7ad59..d2d2210 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,6 +1,7 @@ import 'package:bubble/bubble.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/stateful_wrapper.dart'; import 'package:gecko/providers/chest_provider.dart'; diff --git a/lib/screens/myWallets/show_seed.dart b/lib/screens/myWallets/show_seed.dart index 5bd355a..56e8a89 100644 --- a/lib/screens/myWallets/show_seed.dart +++ b/lib/screens/myWallets/show_seed.dart @@ -66,12 +66,7 @@ class ShowSeed extends StatelessWidget { 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.'), - ], - ), + 'Tâchez de garder cette phrase bien secrète, car elle permet à quiconque la connaît d’accéder à tous vos portefeuilles.'), SizedBox(height: 35 * ratio), sentanceArray(context, _seed.data!.split(' ')), const SizedBox(height: 20), diff --git a/lib/screens/onBoarding/1.dart b/lib/screens/onBoarding/1.dart index 9d84922..d725e9e 100644 --- a/lib/screens/onBoarding/1.dart +++ b/lib/screens/onBoarding/1.dart @@ -1,6 +1,8 @@ // ignore_for_file: file_names +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/onBoarding/2.dart'; @@ -27,21 +29,14 @@ class OnboardingStepOne extends StatelessWidget { 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, + '', + 'fabrication-de-portefeuille.png', + '>', + const OnboardingStepTwo(), + 0, + textMd: 'geckoGenerateYourWalletFromMnemonic'.tr(), + ), ), ); } diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 7b321c6..ce08c80 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -53,12 +53,8 @@ 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( + "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é."), SizedBox(height: isTall ? 80 : 20), Visibility( visible: _generateWalletProvider.scanedWalletNumber != -1, diff --git a/lib/screens/onBoarding/11_congratulations.dart b/lib/screens/onBoarding/11_congratulations.dart index cd92ba5..64dc12e 100644 --- a/lib/screens/onBoarding/11_congratulations.dart +++ b/lib/screens/onBoarding/11_congratulations.dart @@ -32,12 +32,8 @@ 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( + "Top !\n\nVotre coffre votre premier portefeuille ont été créés avec un immense succès.\n\nFélicitations !"), SizedBox(height: isTall ? 20 : 10), Image.asset( 'assets/onBoarding/gecko-clin.gif', diff --git a/lib/screens/onBoarding/2.dart b/lib/screens/onBoarding/2.dart index 03c2bf8..dd1cc79 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'; @@ -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 663f1ee..1f581a4 100644 --- a/lib/screens/onBoarding/3.dart +++ b/lib/screens/onBoarding/3.dart @@ -29,15 +29,8 @@ class OnboardingStepThree extends StatelessWidget { ), extendBodyBehindAppBar: true, body: SafeArea( - child: common.infoIntro( - context, - [ - TextSpan(text: 'warningForgotPassword'.tr()), - ], - 'forgot_password.png'.tr(), - '>', - 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..e1fb0b4 100644 --- a/lib/screens/onBoarding/4.dart +++ b/lib/screens/onBoarding/4.dart @@ -28,20 +28,10 @@ class OnboardingStepFor extends StatelessWidget { ), extendBodyBehindAppBar: true, 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', - '>', - const OnboardingStepFive(), - 3), + child: common.infoIntro(context, '', 'gecko-oublie-aussi.png', '>', + const OnboardingStepFive(), 3, + textMd: + 'Il est temps de vous munir d’**un papier et d’un crayon** afin de pouvoir noter votre phrase de restauration.'), ), ); } diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index 266234b..e0381f9 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -53,12 +53,7 @@ class _ChooseChestState extends State { 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.'), - ], - ), + '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.'), SizedBox(height: 35 * ratio), sentanceArray(context), SizedBox(height: 17 * ratio), diff --git a/lib/screens/onBoarding/6.dart b/lib/screens/onBoarding/6.dart index 832019a..f2009ed 100644 --- a/lib/screens/onBoarding/6.dart +++ b/lib/screens/onBoarding/6.dart @@ -56,20 +56,8 @@ class OnboardingStepSix extends StatelessWidget { SizedBox(height: isTall ? 40 : 20), 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)), - ], + common.buildTextMd( + "Avez-vous bien noté votre phrase de restauration ?\n\nPour en être sûr, veuillez taper dans le champ ci-dessous le **${_generateWalletProvider.nbrWord + 1}ème mot** de votre phrase de restauration :", ), SizedBox(height: isTall ? 70 : 20), Text('${_generateWalletProvider.nbrWord + 1}', diff --git a/lib/screens/onBoarding/7.dart b/lib/screens/onBoarding/7.dart index 71c3c99..1c7b6ee 100644 --- a/lib/screens/onBoarding/7.dart +++ b/lib/screens/onBoarding/7.dart @@ -30,11 +30,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.'), - ], + '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.', '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..e85c6e7 100644 --- a/lib/screens/onBoarding/8.dart +++ b/lib/screens/onBoarding/8.dart @@ -30,21 +30,13 @@ 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.'), - ], + '', 'coffre-fort-protege-les-portefeuilles.png', '>', OnboardingStepNine(scanDerivation: scanDerivation), - 7), + 7, + textMd: + '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.'), ), ); } diff --git a/lib/screens/onBoarding/9.dart b/lib/screens/onBoarding/9.dart index 16dbda0..ea06ac4 100644 --- a/lib/screens/onBoarding/9.dart +++ b/lib/screens/onBoarding/9.dart @@ -44,19 +44,8 @@ class OnboardingStepNine extends StatelessWidget { SizedBox(height: isTall ? 40 : 20), 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."), - ], - ), + common.buildTextMd( + "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."), const SizedBox(height: 100), Stack( alignment: Alignment.centerRight, diff --git a/pubspec.lock b/pubspec.lock index 113d714..e88a7fb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -274,13 +274,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" - csslib: - dependency: transitive - description: - name: csslib - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.2" dart_style: dependency: transitive description: @@ -396,13 +389,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.18.4" - flutter_html: - dependency: "direct main" - description: - name: flutter_html - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-alpha.5" flutter_inappwebview: dependency: transitive description: @@ -429,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: @@ -584,13 +577,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.3" - html: - dependency: transitive - description: - name: html - url: "https://pub.dartlang.org" - source: hosted - version: "0.15.0" http: dependency: "direct main" description: @@ -778,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: @@ -848,13 +841,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.0+1" - numerus: - dependency: transitive - description: - name: numerus - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.1" package_config: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ab75df1..2a5fc61 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -73,7 +73,7 @@ dependencies: connectivity_plus: ^2.3.3 image_cropper: ^2.0.3 easy_localization: ^3.0.1 - flutter_html: ^3.0.0-alpha.5 + flutter_markdown: ^0.6.10+2 dev_dependencies: # flutter_launcher_icons: ^0.9.2 From 6f7dd4e413248f80df471f1425b0784ee3dbba72 Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 17 Jun 2022 21:40:08 +0200 Subject: [PATCH 05/13] cosmetic --- assets/translations/en.json | 4 ++-- assets/translations/fr.json | 4 ++-- lib/screens/common_elements.dart | 12 ------------ lib/screens/home.dart | 1 - lib/screens/onBoarding/1.dart | 1 - 5 files changed, 4 insertions(+), 18 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 3b26486..1b2a5d1 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -50,8 +50,8 @@ "confirm": "Confirm", "confirmPayment": "Confirm payment", "clickHereToConfirmIdentity": "Click here to confirm\nyour new identity", - "geckoGenerateYourWalletFromMnemonic": "Gecko 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 Gecko will not be able to rebuild your wallets the day you change your phone." + "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." } \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index ab71c0e..a305096 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -51,6 +51,6 @@ "confirm": "Confirmer", "confirmPayment": "Confirmer le paiement", "clickHereToConfirmIdentity": "Cliquez ici pour confirmer\nvotre nouvelle identité", - "geckoGenerateYourWalletFromMnemonic": "Gecko 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 Gecko ne pourra pas reconstruire vos portefeuilles le jour où vous changez de téléphone." + "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." } \ No newline at end of file diff --git a/lib/screens/common_elements.dart b/lib/screens/common_elements.dart index cfd738e..d5f0951 100644 --- a/lib/screens/common_elements.dart +++ b/lib/screens/common_elements.dart @@ -60,18 +60,6 @@ class CommonElements { decoration: BoxDecoration( color: Colors.white, border: Border.all(color: Colors.grey[900]!)), child: MarkdownBody(data: text, styleSheet: style)); - - // RichText( - // textAlign: TextAlign.justify, - // text: TextSpan( - // style: TextStyle( - // fontSize: isTall ? size : size * 0.9, - // color: Colors.black, - // letterSpacing: 0.3), - // children: text, - // ), - // ), - // ); } Widget nextButton( diff --git a/lib/screens/home.dart b/lib/screens/home.dart index d2d2210..7a7ad59 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,7 +1,6 @@ import 'package:bubble/bubble.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/stateful_wrapper.dart'; import 'package:gecko/providers/chest_provider.dart'; diff --git a/lib/screens/onBoarding/1.dart b/lib/screens/onBoarding/1.dart index d725e9e..9162f8f 100644 --- a/lib/screens/onBoarding/1.dart +++ b/lib/screens/onBoarding/1.dart @@ -2,7 +2,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/onBoarding/2.dart'; From a4d72d036fdf5c808128be3064b917f4ae94ee12 Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 17 Jun 2022 21:50:18 +0200 Subject: [PATCH 06/13] factorize isMd text --- lib/screens/common_elements.dart | 44 ++++++++++++-------------------- lib/screens/onBoarding/1.dart | 4 +-- lib/screens/onBoarding/4.dart | 12 ++++++--- lib/screens/onBoarding/6.dart | 7 ++--- lib/screens/onBoarding/8.dart | 5 ++-- lib/screens/onBoarding/9.dart | 6 +++-- 6 files changed, 37 insertions(+), 41 deletions(-) diff --git a/lib/screens/common_elements.dart b/lib/screens/common_elements.dart index d5f0951..4763d6c 100644 --- a/lib/screens/common_elements.dart +++ b/lib/screens/common_elements.dart @@ -30,23 +30,8 @@ class CommonElements { child: Image.asset('assets/onBoarding/$assetName', width: imageWidth)); } - Widget buildText(String text, [double size = 20]) { - return Container( - padding: const EdgeInsets.all(12), - width: 440, - decoration: BoxDecoration( - color: Colors.white, border: Border.all(color: Colors.grey[900]!)), - child: Text(text, - textAlign: TextAlign.justify, - style: TextStyle( - fontSize: isTall ? size : size * 0.9, - color: Colors.black, - letterSpacing: 0.3)), - ); - } - - Widget buildTextMd(String text, [double size = 20]) { - final style = MarkdownStyleSheet( + Widget buildText(String text, [double size = 20, bool isMd = false]) { + final mdStyle = MarkdownStyleSheet( p: TextStyle( fontSize: isTall ? size : size * 0.9, color: Colors.black, @@ -55,11 +40,19 @@ class CommonElements { ); return Container( - padding: const EdgeInsets.all(12), - width: 440, - decoration: BoxDecoration( - color: Colors.white, border: Border.all(color: Colors.grey[900]!)), - child: MarkdownBody(data: text, styleSheet: style)); + padding: const EdgeInsets.all(12), + width: 440, + decoration: BoxDecoration( + color: Colors.white, border: Border.all(color: Colors.grey[900]!)), + 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)), + ); } Widget nextButton( @@ -104,7 +97,7 @@ class CommonElements { String buttonText, nextScreen, double pagePosition, { - String? textMd, + bool isMd = false, bool isFast = false, double boxHeight = 440, double imageWidth = 350, @@ -115,10 +108,7 @@ class CommonElements { buildProgressBar(pagePosition), SizedBox(height: isTall ? 40 : 20), - if (textMd == null) - buildText(text, textSize) - else - buildTextMd(textMd, textSize), + buildText(text, textSize, isMd), buildImage(assetName, boxHeight, imageWidth), Expanded( diff --git a/lib/screens/onBoarding/1.dart b/lib/screens/onBoarding/1.dart index 9162f8f..338c7a1 100644 --- a/lib/screens/onBoarding/1.dart +++ b/lib/screens/onBoarding/1.dart @@ -29,12 +29,12 @@ class OnboardingStepOne extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - '', + 'geckoGenerateYourWalletFromMnemonic'.tr(), 'fabrication-de-portefeuille.png', '>', const OnboardingStepTwo(), 0, - textMd: 'geckoGenerateYourWalletFromMnemonic'.tr(), + isMd: true, ), ), ); diff --git a/lib/screens/onBoarding/4.dart b/lib/screens/onBoarding/4.dart index e1fb0b4..c8a6c01 100644 --- a/lib/screens/onBoarding/4.dart +++ b/lib/screens/onBoarding/4.dart @@ -28,10 +28,14 @@ class OnboardingStepFor extends StatelessWidget { ), extendBodyBehindAppBar: true, body: SafeArea( - child: common.infoIntro(context, '', 'gecko-oublie-aussi.png', '>', - const OnboardingStepFive(), 3, - textMd: - 'Il est temps de vous munir d’**un papier et d’un crayon** afin de pouvoir noter votre phrase de restauration.'), + child: common.infoIntro( + context, + 'Il est temps de vous munir d’**un papier et d’un crayon** afin de pouvoir noter votre phrase de restauration.', + 'gecko-oublie-aussi.png', + '>', + const OnboardingStepFive(), + 3, + isMd: true), ), ); } diff --git a/lib/screens/onBoarding/6.dart b/lib/screens/onBoarding/6.dart index f2009ed..a4fa2aa 100644 --- a/lib/screens/onBoarding/6.dart +++ b/lib/screens/onBoarding/6.dart @@ -56,9 +56,10 @@ class OnboardingStepSix extends StatelessWidget { SizedBox(height: isTall ? 40 : 20), common.buildProgressBar(5), SizedBox(height: isTall ? 40 : 20), - common.buildTextMd( - "Avez-vous bien noté votre phrase de restauration ?\n\nPour en être sûr, veuillez taper dans le champ ci-dessous le **${_generateWalletProvider.nbrWord + 1}ème mot** de votre phrase de restauration :", - ), + common.buildText( + "Avez-vous bien noté votre phrase de restauration ?\n\nPour en être sûr, veuillez taper dans le champ ci-dessous le **${_generateWalletProvider.nbrWord + 1}ème mot** de votre phrase de restauration :", + 20, + true), SizedBox(height: isTall ? 70 : 20), Text('${_generateWalletProvider.nbrWord + 1}', key: const Key('askedWord'), diff --git a/lib/screens/onBoarding/8.dart b/lib/screens/onBoarding/8.dart index e85c6e7..ff7a401 100644 --- a/lib/screens/onBoarding/8.dart +++ b/lib/screens/onBoarding/8.dart @@ -30,13 +30,12 @@ class OnboardingStepEight extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - '', + '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.', 'coffre-fort-protege-les-portefeuilles.png', '>', OnboardingStepNine(scanDerivation: scanDerivation), 7, - textMd: - '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.'), + isMd: true), ), ); } diff --git a/lib/screens/onBoarding/9.dart b/lib/screens/onBoarding/9.dart index ea06ac4..8f26873 100644 --- a/lib/screens/onBoarding/9.dart +++ b/lib/screens/onBoarding/9.dart @@ -44,8 +44,10 @@ class OnboardingStepNine extends StatelessWidget { SizedBox(height: isTall ? 40 : 20), common.buildProgressBar(8), SizedBox(height: isTall ? 40 : 20), - common.buildTextMd( - "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."), + common.buildText( + "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.", + 20, + true), const SizedBox(height: 100), Stack( alignment: Alignment.centerRight, From f688bc39c714e2d69b8c8fe559cb823af6a5deb9 Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux Date: Fri, 17 Jun 2022 22:19:14 +0200 Subject: [PATCH 07/13] onboarding translation --- assets/translations/en.json | 6 +++++- assets/translations/fr.json | 9 ++++++++- lib/screens/onBoarding/1.dart | 6 +++--- lib/screens/onBoarding/4.dart | 3 ++- lib/screens/onBoarding/5.dart | 2 +- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 1b2a5d1..3bdc2a6 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -51,7 +51,11 @@ "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." + "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": "Il est temps de vous munir d’**un papier et d’un crayon** afin de pouvoir noter votre phrase de restauration." + } \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index a305096..1140dc8 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -52,5 +52,12 @@ "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." + "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." + + + + } \ No newline at end of file diff --git a/lib/screens/onBoarding/1.dart b/lib/screens/onBoarding/1.dart index 338c7a1..2550f47 100644 --- a/lib/screens/onBoarding/1.dart +++ b/lib/screens/onBoarding/1.dart @@ -17,11 +17,11 @@ 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), ), ), ), diff --git a/lib/screens/onBoarding/4.dart b/lib/screens/onBoarding/4.dart index c8a6c01..837de46 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'; @@ -30,7 +31,7 @@ class OnboardingStepFor extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - 'Il est temps de vous munir d’**un papier et d’un crayon** afin de pouvoir noter votre phrase de restauration.', + 'itsTimeToUseAPenAndPaper'.tr(), 'gecko-oublie-aussi.png', '>', const OnboardingStepFive(), diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index e0381f9..8961136 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -53,7 +53,7 @@ class _ChooseChestState extends State { common.buildProgressBar(4), SizedBox(height: isTall ? 40 : 20), common.buildText( - '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.'), + 'geckoGeneratedYourMnemonicKeepItSecret'.tr()), SizedBox(height: 35 * ratio), sentanceArray(context), SizedBox(height: 17 * ratio), From c62c63f06481a2be00bcce30602c50a77d68559f Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux Date: Fri, 17 Jun 2022 23:10:01 +0200 Subject: [PATCH 08/13] onboarding translation 2 --- ...ublie-aussi.png => gecko_also_can_forget_en.png} | Bin assets/translations/en.json | 8 ++++++-- assets/translations/fr.json | 10 ++++++---- lib/screens/onBoarding/10.dart | 6 +++--- lib/screens/onBoarding/2.dart | 6 +++--- lib/screens/onBoarding/3.dart | 6 +++--- lib/screens/onBoarding/4.dart | 8 ++++---- lib/screens/onBoarding/5.dart | 9 ++++----- lib/screens/onBoarding/6.dart | 10 ++++++---- lib/screens/onBoarding/7.dart | 9 +++++---- lib/screens/onBoarding/8.dart | 7 ++++--- lib/screens/onBoarding/9.dart | 7 ++++--- 12 files changed, 48 insertions(+), 38 deletions(-) rename assets/onBoarding/{gecko-oublie-aussi.png => gecko_also_can_forget_en.png} (100%) 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 index 3bdc2a6..28c9745 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -54,8 +54,12 @@ "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": "Il est temps de vous munir d’**un papier et d’un crayon** afin de pouvoir noter votre phrase de restauration." + "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" - } \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 1140dc8..5036212 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -55,9 +55,11 @@ "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." - - - + "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" } \ No newline at end of file diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index ce08c80..6185f24 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -39,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), ), ), ), diff --git a/lib/screens/onBoarding/2.dart b/lib/screens/onBoarding/2.dart index dd1cc79..ee16d16 100644 --- a/lib/screens/onBoarding/2.dart +++ b/lib/screens/onBoarding/2.dart @@ -19,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), ), ), ), diff --git a/lib/screens/onBoarding/3.dart b/lib/screens/onBoarding/3.dart index 1f581a4..8a261d9 100644 --- a/lib/screens/onBoarding/3.dart +++ b/lib/screens/onBoarding/3.dart @@ -19,11 +19,11 @@ 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), ), ), ), diff --git a/lib/screens/onBoarding/4.dart b/lib/screens/onBoarding/4.dart index 837de46..946f3db 100644 --- a/lib/screens/onBoarding/4.dart +++ b/lib/screens/onBoarding/4.dart @@ -19,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), ), ), ), @@ -32,7 +32,7 @@ class OnboardingStepFor extends StatelessWidget { child: common.infoIntro( context, 'itsTimeToUseAPenAndPaper'.tr(), - 'gecko-oublie-aussi.png', + 'gecko_also_can_forget.png'.tr(), '>', const OnboardingStepFive(), 3, diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index 8961136..de736fc 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -38,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), ), ), ), @@ -52,8 +52,7 @@ class _ChooseChestState extends State { SizedBox(height: isTall ? 40 : 20), common.buildProgressBar(4), SizedBox(height: isTall ? 40 : 20), - common.buildText( - 'geckoGeneratedYourMnemonicKeepItSecret'.tr()), + common.buildText('geckoGeneratedYourMnemonicKeepItSecret'.tr()), SizedBox(height: 35 * ratio), sentanceArray(context), SizedBox(height: 17 * ratio), diff --git a/lib/screens/onBoarding/6.dart b/lib/screens/onBoarding/6.dart index a4fa2aa..a86b909 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,7 +58,8 @@ class OnboardingStepSix extends StatelessWidget { common.buildProgressBar(5), SizedBox(height: isTall ? 40 : 20), common.buildText( - "Avez-vous bien noté votre phrase de restauration ?\n\nPour en être sûr, veuillez taper dans le champ ci-dessous le **${_generateWalletProvider.nbrWord + 1}ème mot** de votre phrase de restauration :", + "didYouNoteMnemonicToBeSureTypeWord".tr( + args: [(_generateWalletProvider.nbrWord + 1).toString()]), 20, true), SizedBox(height: isTall ? 70 : 20), diff --git a/lib/screens/onBoarding/7.dart b/lib/screens/onBoarding/7.dart index 1c7b6ee..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,7 +31,7 @@ class OnboardingStepSeven extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - '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 ff7a401..f9234e3 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), ), ), ), diff --git a/lib/screens/onBoarding/9.dart b/lib/screens/onBoarding/9.dart index 8f26873..647d834 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), ), ), ), From c04416ae0ea01b5055427539dbfa817ed6a18fe1 Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux Date: Sat, 18 Jun 2022 00:48:07 +0200 Subject: [PATCH 09/13] onboarding translation 3 --- assets/translations/en.json | 47 ++++++++++++++++++- assets/translations/fr.json | 45 +++++++++++++++++- lib/providers/chest_provider.dart | 8 ++-- lib/providers/generate_wallets.dart | 24 +++++----- lib/providers/my_wallets.dart | 3 +- lib/providers/wallet_options.dart | 18 +++---- lib/screens/common_elements.dart | 13 ++--- lib/screens/myWallets/restore_chest.dart | 26 +++++----- lib/screens/myWallets/show_seed.dart | 15 +++--- lib/screens/myWallets/unlocking_wallet.dart | 3 +- lib/screens/onBoarding/10.dart | 7 ++- .../onBoarding/11_congratulations.dart | 9 ++-- lib/screens/onBoarding/6.dart | 7 +-- lib/screens/onBoarding/8.dart | 2 +- lib/screens/onBoarding/9.dart | 6 +-- lib/screens/transaction_in_progress.dart | 3 +- lib/screens/wallet_view.dart | 10 ++-- test_driver/app_test.dart | 2 +- 18 files changed, 170 insertions(+), 78 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 28c9745..c99bfa2 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -33,6 +33,7 @@ "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", @@ -59,7 +60,51 @@ "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" + "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" + + } \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 5036212..e415823 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -60,6 +60,47 @@ "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" - + "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é" } \ No newline at end of file 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/generate_wallets.dart b/lib/providers/generate_wallets.dart index cc386b5..5fec56d 100644 --- a/lib/providers/generate_wallets.dart +++ b/lib/providers/generate_wallets.dart @@ -120,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]; 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/wallet_options.dart b/lib/providers/wallet_options.dart index d13ef53..e9c923a 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -47,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 @@ -157,7 +157,7 @@ class WalletOptionsProvider with ChangeNotifier { switch (snapshot.data.toString()) { case 'noid': { - return _showText('Aucune identité'); + return _showText('noIdentity'.tr()); } case 'Created': { @@ -169,12 +169,12 @@ class WalletOptionsProvider with ChangeNotifier { await validateIdentity(context); }, ) - : _showText('Identité créé'); + : _showText('identityCreated'.tr()); } case 'ConfirmedByOwner': { return isOwner - ? _showText('Identité confirmé') + ? _showText('identityConfirmed'.tr()) : _duniterIndexer.getNameByAddress( context, address, @@ -203,7 +203,7 @@ class WalletOptionsProvider with ChangeNotifier { case 'expired': { - return _showText('Identité expiré'); + return _showText('identityExpired'.tr()); } } return SizedBox( @@ -231,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, diff --git a/lib/screens/common_elements.dart b/lib/screens/common_elements.dart index 4763d6c..eb94a3a 100644 --- a/lib/screens/common_elements.dart +++ b/lib/screens/common_elements.dart @@ -1,4 +1,5 @@ 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'; @@ -248,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), ), @@ -261,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/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 56e8a89..7c82552 100644 --- a/lib/screens/myWallets/show_seed.dart +++ b/lib/screens/myWallets/show_seed.dart @@ -36,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: [ @@ -65,8 +65,7 @@ class ShowSeed extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Column(children: [ - common.buildText( - '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), @@ -132,7 +131,7 @@ class ShowSeed extends StatelessWidget { Navigator.pop(context); }, child: Text( - 'Fermer', + 'close'.tr(), style: TextStyle( fontSize: 23 * ratio, fontWeight: FontWeight.w600), ), @@ -233,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/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 346316d..364f8aa 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -201,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/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 6185f24..c8ba191 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -53,8 +53,7 @@ class OnboardingStepTen extends StatelessWidget { SizedBox(height: isTall ? 40 : 20), common.buildProgressBar(9), SizedBox(height: isTall ? 40 : 20), - common.buildText( - "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é."), + common.buildText("geckoWillCheckPassword".tr()), SizedBox(height: isTall ? 80 : 20), Visibility( visible: _generateWalletProvider.scanedWalletNumber != -1, @@ -104,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]), ), @@ -150,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; } diff --git a/lib/screens/onBoarding/11_congratulations.dart b/lib/screens/onBoarding/11_congratulations.dart index 64dc12e..c461a3b 100644 --- a/lib/screens/onBoarding/11_congratulations.dart +++ b/lib/screens/onBoarding/11_congratulations.dart @@ -20,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), ), ), ), @@ -32,8 +32,7 @@ class OnboardingStepEleven extends StatelessWidget { body: SafeArea( child: Column(children: [ const SizedBox(height: 40), - common.buildText( - "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', diff --git a/lib/screens/onBoarding/6.dart b/lib/screens/onBoarding/6.dart index a86b909..e91f524 100644 --- a/lib/screens/onBoarding/6.dart +++ b/lib/screens/onBoarding/6.dart @@ -96,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), @@ -113,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/8.dart b/lib/screens/onBoarding/8.dart index f9234e3..2172e2d 100644 --- a/lib/screens/onBoarding/8.dart +++ b/lib/screens/onBoarding/8.dart @@ -31,7 +31,7 @@ class OnboardingStepEight extends StatelessWidget { body: SafeArea( child: common.infoIntro( context, - '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.', + 'thisPasswordProtectsYourWalletsInASecureChest'.tr(), 'coffre-fort-protege-les-portefeuilles.png', '>', OnboardingStepNine(scanDerivation: scanDerivation), diff --git a/lib/screens/onBoarding/9.dart b/lib/screens/onBoarding/9.dart index 647d834..1dec327 100644 --- a/lib/screens/onBoarding/9.dart +++ b/lib/screens/onBoarding/9.dart @@ -46,7 +46,7 @@ class OnboardingStepNine extends StatelessWidget { common.buildProgressBar(8), SizedBox(height: isTall ? 40 : 20), common.buildText( - "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.", + "hereIsThePasswordKeepIt".tr(), 20, true), const SizedBox(height: 100), @@ -90,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/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index 858b3be..b6c1e48 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'; @@ -263,7 +264,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 0044bc6..2c9cfe0 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -181,9 +181,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; diff --git a/test_driver/app_test.dart b/test_driver/app_test.dart index 43b6910..3a3243d 100644 --- a/test_driver/app_test.dart +++ b/test_driver/app_test.dart @@ -161,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', ( From 87a6f444b31b1462b0eaededd38c933a292564a8 Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux Date: Sat, 18 Jun 2022 01:50:06 +0200 Subject: [PATCH 10/13] translation 4 --- assets/translations/en.json | 52 +++++++++++++++-- assets/translations/fr.json | 49 +++++++++++++++- lib/providers/duniter_indexer.dart | 5 +- lib/providers/substrate_sdk.dart | 8 +-- lib/screens/activity.dart | 72 ++++++++++++------------ lib/screens/home.dart | 8 +-- lib/screens/search_result.dart | 9 +-- lib/screens/settings.dart | 6 +- lib/screens/substrate_sandbox.dart | 18 +++--- lib/screens/transaction_in_progress.dart | 34 +++++------ lib/screens/wallet_view.dart | 23 ++++---- 11 files changed, 187 insertions(+), 97 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index c99bfa2..8b53278 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -102,9 +102,51 @@ "identityCreated": "Identity created", "identityConfirmed": "Identity confirmed", "identityExpired": "Identity expired", - "confirmYourIdentity": "Confirm your identity" - - - - + "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" } \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index e415823..a7055ea 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -102,5 +102,52 @@ "identityCreated": "Identité créée", "identityConfirmed": "Identité confirmée", "identityExpired": "Identité expirée", - "confirmYourIdentity": "Confirmez votre identité" + "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" } \ No newline at end of file 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/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index fbe3347..e64b45a 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -758,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/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/home.dart b/lib/screens/home.dart index 7a7ad59..58468b3 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -112,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'); @@ -128,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; } @@ -140,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); diff --git a/lib/screens/search_result.dart b/lib/screens/search_result.dart index 9542946..3f206e1 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}"', diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 4fb67cb..0873692 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -98,9 +98,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 b6c1e48..1e89c60 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -40,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: @@ -90,7 +90,7 @@ class TransactionInProgress extends StatelessWidget { _resultText = '$_actionName validé !'; } 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) { @@ -103,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: diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 2c9cfe0..c3eec23 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -70,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), @@ -137,6 +137,7 @@ class WalletViewScreen extends StatelessWidget { final int _seconds = _durationSeconds.inSeconds; final int _minutes = _durationSeconds.inMinutes; + // TODO translate timing if (_seconds <= 0) { _duration = '0 secondes'; } else if (_seconds <= 60) { @@ -260,7 +261,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, @@ -290,7 +292,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, @@ -471,9 +474,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( @@ -681,9 +684,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), ), ), From e71e00c995700e60addd95b04c5f42b1b0e70cd9 Mon Sep 17 00:00:00 2001 From: poka Date: Sat, 18 Jun 2022 03:01:22 +0200 Subject: [PATCH 11/13] App is fully translate en/fr ! --- assets/translations/en.json | 22 +++++++++- assets/translations/fr.json | 22 +++++++++- lib/providers/wallet_options.dart | 2 +- lib/screens/myWallets/choose_wallet.dart | 4 +- lib/screens/myWallets/wallet_options.dart | 6 +-- lib/screens/search.dart | 12 ++--- lib/screens/search_result.dart | 2 +- lib/screens/settings.dart | 3 +- lib/screens/transaction_in_progress.dart | 18 ++++---- lib/screens/wallet_view.dart | 53 +++++++---------------- 10 files changed, 84 insertions(+), 60 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 8b53278..478705a 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -40,6 +40,7 @@ "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", @@ -148,5 +149,24 @@ "mustWaitXBeforeCertify": "You have to wait\n{} before\ncertifying again", "canRenewCertInX": "You can renew\nthis certification\nin {}", "executeATransfer": "Execute a transfer", - "executeTheTransfer": "Execute the 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 index a7055ea..98b185b 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -40,6 +40,7 @@ "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", @@ -149,5 +150,24 @@ "mustWaitXBeforeCertify": "Vous devez attendre\n{} avant\nde pouvoir certifier", "canRenewCertInX": "Vous pourrez renouveller\ncette certification\ndans {}", "executeATransfer": "Effectuer un virement", - "executeTheTransfer": "Effectuer le 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/providers/wallet_options.dart b/lib/providers/wallet_options.dart index e9c923a..55143bb 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -378,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/screens/myWallets/choose_wallet.dart b/lib/screens/myWallets/choose_wallet.dart index b1f054b..f54d6d8 100644 --- a/lib/screens/myWallets/choose_wallet.dart +++ b/lib/screens/myWallets/choose_wallet.dart @@ -29,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: [ diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 75509f2..15551af 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -490,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/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 3f206e1..3f4978b 100644 --- a/lib/screens/search_result.dart +++ b/lib/screens/search_result.dart @@ -72,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 0873692..bc0b488 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -53,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 diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index 1e89c60..732595b 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -87,7 +87,7 @@ 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 = "anErrorOccured".tr() + ":\n"; @@ -159,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( @@ -186,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, @@ -198,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, diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index c3eec23..9cb9108 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -113,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), @@ -139,32 +139,34 @@ class WalletViewScreen extends StatelessWidget { // 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, @@ -233,7 +235,7 @@ class WalletViewScreen extends StatelessWidget { ), const SizedBox(height: 9), Text( - "Certifier", + "certify".tr(), textAlign: TextAlign.center, style: TextStyle( fontSize: buttonFontSize, @@ -271,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, @@ -336,29 +338,6 @@ class WalletViewScreen extends StatelessWidget { ), ]), ]), - // 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( @@ -397,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], @@ -489,7 +468,7 @@ class WalletViewScreen extends StatelessWidget { ]), const SizedBox(height: 20), Text( - 'Depuis:', + 'from'.tr(), style: TextStyle( fontSize: 19, fontWeight: FontWeight.w500, @@ -579,7 +558,7 @@ class WalletViewScreen extends StatelessWidget { // const SizedBox(height: 10), Text( - 'Montant:', + 'amount'.tr(), style: TextStyle( fontSize: 19, fontWeight: FontWeight.w500, From a64a3c69488da7cdd1320bd45136935c390b89b7 Mon Sep 17 00:00:00 2001 From: poka Date: Sat, 18 Jun 2022 03:13:12 +0200 Subject: [PATCH 12/13] Add Spanish template with a few translated sentences --- android/app/build.gradle | 2 +- assets/translations/es.json | 172 ++++++++++++++++++++++++++++++++++++ lib/main.dart | 18 +--- 3 files changed, 175 insertions(+), 17 deletions(-) create mode 100644 assets/translations/es.json diff --git a/android/app/build.gradle b/android/app/build.gradle index 76c91a5..ecf1475 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -65,7 +65,7 @@ android { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.release //poka: comment this to build unsigned release, or set to signingConfigs.debug to sign with debug keys + signingConfig signingConfigs.debug //poka: comment this to build unsigned release, or set to signingConfigs.debug to sign with debug keys useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 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/lib/main.dart b/lib/main.dart index db919e0..9c20360 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -113,27 +113,13 @@ Future main() async { ), ), ); - - // runZoned>( - // () async { - // runApp(Gecko(endPointGVA, _store)); - // }, - // onError: (dynamic error, StackTrace stackTrace) { - // print("=================== CAUGHT DART ERROR"); - // // Sentry.captureException( - // // error, - // // stackTrace: stackTrace, - // // ); - // }, - // )); } else { print('Debug mode enabled: No sentry alerte'); runApp( EasyLocalization( - supportedLocales: const [Locale('en'), Locale('fr')], - path: - 'assets/translations', // <-- change the path of the translation files + supportedLocales: const [Locale('en'), Locale('fr'), Locale('es')], + path: 'assets/translations', fallbackLocale: const Locale('fr'), child: Gecko(indexerEndpoint), ), From b7b01bc45fc22ce9a93b4c1d48e61d8cc2d535ad Mon Sep 17 00:00:00 2001 From: poka Date: Sat, 18 Jun 2022 03:18:21 +0200 Subject: [PATCH 13/13] bump version --- android/app/build.gradle | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index ecf1475..76c91a5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -65,7 +65,7 @@ android { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug //poka: comment this to build unsigned release, or set to signingConfigs.debug to sign with debug keys + signingConfig signingConfigs.release //poka: comment this to build unsigned release, or set to signingConfigs.debug to sign with debug keys useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' diff --git a/pubspec.yaml b/pubspec.yaml index 2a5fc61..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'