From 41af578d048d33268682183e6fe96f78cfd89673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Fri, 2 Feb 2018 11:37:14 -0300 Subject: [PATCH 1/7] [V4] FEAT: ts translations --- src/pages/settings/settings.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/pages/settings/settings.ts b/src/pages/settings/settings.ts index 355c76e30..980e02fa4 100644 --- a/src/pages/settings/settings.ts +++ b/src/pages/settings/settings.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { AppProvider } from '../../providers/app/app'; @@ -53,7 +54,8 @@ export class SettingsPage { private configProvider: ConfigProvider, private logger: Logger, private homeIntegrationsProvider: HomeIntegrationsProvider, - private platformProvider: PlatformProvider + private platformProvider: PlatformProvider, + private translate: TranslateService ) { this.appName = this.app.info.nameCase; this.currentLanguageName = this.language.getName(this.language.getCurrent()); @@ -133,7 +135,7 @@ export class SettingsPage { this.navCtrl.push(FeedbackCompletePage, { score: 4, skipped: true, fromSettings: true }); } - public openIntegrationSettings(name: string): void { + public openIntegrationSettings(name: string): void { switch (name) { case 'coinbase': this.navCtrl.push(CoinbaseSettingsPage); @@ -145,12 +147,12 @@ export class SettingsPage { } public openHelpExternalLink(): void { - var url = this.appName == 'Copay' ? 'https://github.com/bitpay/copay/issues' : 'https://help.bitpay.com/bitpay-app'; - var optIn = true; - var title = null; - var message = 'Help and support information is available at the website.'; // TODO gettextCatalog - var okText = 'Open'; // TODO gettextCatalog - var cancelText = 'Go Back'; // TODO gettextCatalog + let url = this.appName == 'Copay' ? 'https://github.com/bitpay/copay/issues' : 'https://help.bitpay.com/bitpay-app'; + let optIn = true; + let title = null; + let message = this.translate.instant('Help and support information is available at the website.'); + let okText = this.translate.instant('Open'); + let cancelText = this.translate.instant('Go Back'); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); } } From 736faa3bac1b828cb6a64c37b61101cf3d3abefb Mon Sep 17 00:00:00 2001 From: Gabriel Masclef Date: Fri, 2 Feb 2018 13:00:17 -0300 Subject: [PATCH 2/7] translations implemented in some controllers and providers --- src/pages/add/copayers/copayers.ts | 16 ++-- src/pages/add/create-wallet/create-wallet.ts | 15 +++- src/pages/add/import-wallet/import-wallet.ts | 53 ++++++++---- src/pages/add/join-wallet/join-wallet.ts | 15 +++- .../feedback/send-feedback/send-feedback.ts | 34 ++++---- src/pages/home/activity/activity.ts | 8 +- src/pages/home/home.ts | 14 +-- src/providers/bwc-error/bwc-error.ts | 86 ++++++++++--------- src/providers/fee/fee.ts | 22 ++--- src/providers/incoming-data/incoming-data.ts | 14 +-- .../on-going-process/on-going-process.ts | 79 ++++++++--------- src/providers/paypro/paypro.ts | 6 +- src/providers/popup/popup.ts | 15 ++-- 13 files changed, 221 insertions(+), 156 deletions(-) diff --git a/src/pages/add/copayers/copayers.ts b/src/pages/add/copayers/copayers.ts index b20e944b1..afb013f23 100644 --- a/src/pages/add/copayers/copayers.ts +++ b/src/pages/add/copayers/copayers.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { NavController, NavParams, Events } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { WalletDetailsPage } from '../../../pages/wallet-details/wallet-details'; @@ -40,7 +41,8 @@ export class CopayersPage { private popupProvider: PopupProvider, private profileProvider: ProfileProvider, private onGoingProcessProvider: OnGoingProcessProvider, - private walletProvider: WalletProvider + private walletProvider: WalletProvider, + private translate: TranslateService ) { this.secret = null; } @@ -77,15 +79,16 @@ export class CopayersPage { }); } }).catch((err: any) => { - this.popupProvider.ionicAlert(this.bwcErrorProvider.msg(err, 'Could not update wallet')); // TODO: GetTextCatalog + let message = this.translate.instant('Could not update wallet'); + this.popupProvider.ionicAlert(this.bwcErrorProvider.msg(err, message)); return; }); } public showDeletePopup(): void { - let title = 'Confirm'; // TODO: GetTextCatalog - let msg = 'Are you sure you want to cancel and delete this wallet?'; // TODO: GetTextCatalog - this.popupProvider.ionicConfirm(title, msg, 'Ok', 'Cancel').then((res: any) => { + let title = this.translate.instant('Confirm'); + let msg = this.translate.instant('Are you sure you want to cancel and delete this wallet?'); + this.popupProvider.ionicConfirm(title, msg).then((res: any) => { if (res) this.deleteWallet(); }); } @@ -100,7 +103,8 @@ export class CopayersPage { this.navCtrl.parent.select(0); }).catch((err: any) => { this.onGoingProcessProvider.set('deletingWallet', false); - this.popupProvider.ionicAlert('Error', err.message || err); // TODO: GetTextCatalog + let errorText = this.translate.instant('Error'); + this.popupProvider.ionicAlert(errorText, err.message || err); }); } diff --git a/src/pages/add/create-wallet/create-wallet.ts b/src/pages/add/create-wallet/create-wallet.ts index 6a2af77ee..2e6a108a5 100644 --- a/src/pages/add/create-wallet/create-wallet.ts +++ b/src/pages/add/create-wallet/create-wallet.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { Validators, FormBuilder, FormGroup } from '@angular/forms'; import { Logger } from '../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { CopayersPage } from '../copayers/copayers'; @@ -61,7 +62,8 @@ export class CreateWalletPage implements OnInit { private popupProvider: PopupProvider, private onGoingProcessProvider: OnGoingProcessProvider, private logger: Logger, - private walletProvider: WalletProvider + private walletProvider: WalletProvider, + private translate: TranslateService ) { this.isShared = this.navParams.get('isShared'); @@ -167,7 +169,9 @@ export class CreateWalletPage implements OnInit { let pathData = this.derivationPathHelperProvider.parse(this.createForm.value.derivationPath); if (!pathData) { - this.popupProvider.ionicAlert('Error', 'Invalid derivation path', 'Ok'); // TODO: GetTextCatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Invalid derivation path'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -177,7 +181,9 @@ export class CreateWalletPage implements OnInit { } if (setSeed && !opts.mnemonic && !opts.extendedPrivateKey) { - this.popupProvider.ionicAlert('Error', 'Please enter the wallet recovery phrase', 'Ok'); // TODO: GetTextCatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Please enter the wallet recovery phrase'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -205,7 +211,8 @@ export class CreateWalletPage implements OnInit { }).catch((err: any) => { this.onGoingProcessProvider.set('creatingWallet', false); this.logger.warn(err); - this.popupProvider.ionicAlert('Error', err, 'Ok'); // TODO: GetTextCatalog + let title = this.translate.instant('Error'); + this.popupProvider.ionicAlert(title, err); return; }); } diff --git a/src/pages/add/import-wallet/import-wallet.ts b/src/pages/add/import-wallet/import-wallet.ts index 3121caf9f..fe09a43e9 100644 --- a/src/pages/add/import-wallet/import-wallet.ts +++ b/src/pages/add/import-wallet/import-wallet.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { Validators, FormBuilder, FormGroup } from '@angular/forms'; import { Logger } from '../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { TabsPage } from '../../tabs/tabs'; @@ -52,7 +53,8 @@ export class ImportWalletPage { private platformProvider: PlatformProvider, private logger: Logger, private onGoingProcessProvider: OnGoingProcessProvider, - private profileProvider: ProfileProvider + private profileProvider: ProfileProvider, + private translate: TranslateService ) { this.reader = new FileReader(); this.defaults = this.configProvider.getDefaults(); @@ -131,7 +133,9 @@ export class ImportWalletPage { if (parsedCode.length != 5) { /// Trying to import a malformed wallet export QR code - this.popupProvider.ionicAlert('Error', 'Incorrect code format', 'Ok'); //TODO gettextcatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Incorrect code format'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -143,8 +147,11 @@ export class ImportWalletPage { hasPassphrase: parsedCode[4] == 'true' ? true : false }; - if (info.type == '1' && info.hasPassphrase) - this.popupProvider.ionicAlert('Error', 'Password required. Make sure to enter your password in advanced options', 'Ok'); //TODO gettextcatalog + if (info.type == '1' && info.hasPassphrase) { + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Password required. Make sure to enter your password in advanced options'); + this.popupProvider.ionicAlert(title, subtitle); + } this.testnetEnabled = info.network == 'testnet' ? true : false; this.importForm.controls['derivationPath'].setValue(info.derivationPath); @@ -162,12 +169,13 @@ export class ImportWalletPage { try { str2 = this.bwcProvider.getSJCL().decrypt(this.importForm.value.filePassword, str); } catch (e) { - err = 'Could not decrypt file, check your password'; //TODO gettextcatalog + err = this.translate.instant('Could not decrypt file, check your password'); this.logger.warn(e); }; if (err) { - this.popupProvider.ionicAlert('Error', err, 'Ok'); //TODO gettextcatalog + let title = this.translate.instant('Error'); + this.popupProvider.ionicAlert(title, err); return; } @@ -181,7 +189,8 @@ export class ImportWalletPage { this.finish(wallet); }).catch((err: any) => { this.onGoingProcessProvider.set('importingWallet', false); - this.popupProvider.ionicAlert('Error', err, 'Ok'); //TODO gettextcatalog + let title = this.translate.instant('Error'); + this.popupProvider.ionicAlert(title, err); return; }); }, 100); @@ -216,7 +225,8 @@ export class ImportWalletPage { if (err instanceof this.errors.NOT_AUTHORIZED) { this.importErr = true; } else { - this.popupProvider.ionicAlert('Error', err, 'Ok'); // TODO: gettextcatalog + let title = this.translate.instant('Error'); + this.popupProvider.ionicAlert(title, err); } this.onGoingProcessProvider.set('importingWallet', false); return; @@ -234,7 +244,8 @@ export class ImportWalletPage { if (err instanceof this.errors.NOT_AUTHORIZED) { this.importErr = true; } else { - this.popupProvider.ionicAlert('Error', err, 'Ok'); // TODO: gettextcatalog + let title = this.translate.instant('Error'); + this.popupProvider.ionicAlert(title, err); } this.onGoingProcessProvider.set('importingWallet', false); return; @@ -253,7 +264,9 @@ export class ImportWalletPage { public importFromFile(): void { if (!this.importForm.valid) { - this.popupProvider.ionicAlert('Error', 'There is an error in the form', 'Ok'); // TODO: gettextcatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('There is an error in the form'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -261,7 +274,9 @@ export class ImportWalletPage { let backupText = this.importForm.value.backupText; if (!backupFile && !backupText) { - this.popupProvider.ionicAlert('Error', 'Please, select your backup file', 'Ok'); // TODO: gettextcatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Please, select your backup file'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -277,7 +292,9 @@ export class ImportWalletPage { public importFromMnemonic(): void { if (!this.importForm.valid) { - this.popupProvider.ionicAlert('Error', 'There is an error in the form', 'Ok'); // TODO: gettextcatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('There is an error in the form'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -289,7 +306,9 @@ export class ImportWalletPage { let pathData: any = this.derivationPathHelperProvider.parse(this.importForm.value.derivationPath); if (!pathData) { - this.popupProvider.ionicAlert('Error', 'Invalid derivation path', 'Ok'); // TODO: gettextcatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Invalid derivation path'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -301,7 +320,9 @@ export class ImportWalletPage { let words: string = this.importForm.value.words || null; if (!words) { - this.popupProvider.ionicAlert('Error', 'Please enter the recovery phrase', 'Ok'); + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Please enter the recovery phrase'); + this.popupProvider.ionicAlert(title, subtitle); return; } else if (words.indexOf('xprv') == 0 || words.indexOf('tprv') == 0) { return this.importExtendedPrivateKey(words, opts); @@ -309,7 +330,9 @@ export class ImportWalletPage { let wordList: Array = words.split(/[\u3000\s]+/); if ((wordList.length % 3) != 0) { - this.popupProvider.ionicAlert('Error', 'Wrong number of recovery words: ' + wordList.length, 'Ok'); + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Wrong number of recovery words:'); + this.popupProvider.ionicAlert(title, subtitle + ' ' + wordList.length); return; } } diff --git a/src/pages/add/join-wallet/join-wallet.ts b/src/pages/add/join-wallet/join-wallet.ts index f8c8b40e3..42dbcec8e 100644 --- a/src/pages/add/join-wallet/join-wallet.ts +++ b/src/pages/add/join-wallet/join-wallet.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { Validators, FormBuilder, FormGroup } from '@angular/forms'; import { Logger } from '../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { CopayersPage } from '../copayers/copayers'; @@ -38,7 +39,8 @@ export class JoinWalletPage { private popupProvider: PopupProvider, private profileProvider: ProfileProvider, private walletProvider: WalletProvider, - private logger: Logger + private logger: Logger, + private translate: TranslateService ) { this.defaults = this.configProvider.getDefaults(); @@ -120,7 +122,9 @@ export class JoinWalletPage { let pathData = this.derivationPathHelperProvider.parse(this.joinForm.value.derivationPath); if (!pathData) { - this.popupProvider.ionicAlert('Error', 'Invalid derivation path'); // TODO: GetTextCatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Invalid derivation path'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -129,7 +133,9 @@ export class JoinWalletPage { } if (setSeed && !opts.mnemonic && !opts.extendedPrivateKey) { - this.popupProvider.ionicAlert('Error', 'Please enter the wallet recovery phrase', 'Ok'); // TODO: GetTextCatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Please enter the wallet recovery phrase'); + this.popupProvider.ionicAlert(title, subtitle); return; } @@ -151,7 +157,8 @@ export class JoinWalletPage { } }).catch((err: any) => { this.onGoingProcessProvider.set('joiningWallet', false); - this.popupProvider.ionicAlert('Error', err, 'Ok'); // TODO: GetTextCatalog + let title = this.translate.instant('Error'); + this.popupProvider.ionicAlert(title, err); return; }); } diff --git a/src/pages/feedback/send-feedback/send-feedback.ts b/src/pages/feedback/send-feedback/send-feedback.ts index 350eefb14..ef1b4e0db 100644 --- a/src/pages/feedback/send-feedback/send-feedback.ts +++ b/src/pages/feedback/send-feedback/send-feedback.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { Validators, FormBuilder, FormGroup } from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; import * as _ from "lodash"; //providers @@ -38,6 +39,7 @@ export class SendFeedbackPage { private feedbackProvider: FeedbackProvider, private formBuilder: FormBuilder, private popupProvider: PopupProvider, + private translate: TranslateService ) { this.feedbackForm = this.formBuilder.group({ comment: ['', Validators.compose([Validators.minLength(1), Validators.required])] @@ -50,28 +52,28 @@ export class SendFeedbackPage { switch (this.score) { case 1: - this.reaction = "Ouch!"; - this.comment = "There's obviously something we're doing wrong. How could we improve your experience?"; //TODO gettextcatalog + this.reaction = this.translate.instant("Ouch!"); + this.comment = this.translate.instant("There's obviously something we're doing wrong. How could we improve your experience?"); break; case 2: - this.reaction = "Oh no!"; - this.comment = "There's obviously something we're doing wrong. How could we improve your experience?"; //TODO gettextcatalog + this.reaction = this.translate.instant("Oh no!"); + this.comment = this.translate.instant("There's obviously something we're doing wrong. How could we improve your experience?"); break; case 3: - this.reaction = "Hmm..."; - this.comment = "We'd love to do better. How could we improve your experience?"; //TODO gettextcatalog + this.reaction = this.translate.instant("Hmm..."); + this.comment = this.translate.instant("We'd love to do better. How could we improve your experience?"); break; case 4: - this.reaction = "Thanks!"; - this.comment = "That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?"; //TODO gettextcatalog + this.reaction = this.translate.instant("Thanks!"); + this.comment = this.translate.instant("That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?"); break; case 5: - this.reaction = "Thank you!"; - this.comment = "We're always looking for ways to improve " + this.appName + ". Is there anything we could do better?"; + this.reaction = this.translate.instant("Thank you!"); + this.comment = this.translate.instant("We're always looking for ways to improve {{appName}}. Is there anything we could do better?", { appName: this.appName }); break; default: this.justFeedback = true; - this.comment = "We're always looking for ways to improve " + this.appName + ". How could we improve your experience?"; + this.comment = this.translate.instant("We're always looking for ways to improve {{appName}}. How could we improve your experience?", { appName: this.appName }); break; } } @@ -94,9 +96,9 @@ export class SendFeedbackPage { if (goHome) return; this.onGoingProcessProvider.set('sendingFeedback', false); if (!this.score) { - let title = 'Thank you!'; //TODO gettextcatalog - let message = 'A member of the team will review your feedback as soon as possible.'; //TODO gettextcatalog - let okText = 'Finish'; //TODO gettextcatalog + let title = this.translate.instant('Thank you!'); + let message = this.translate.instant('A member of the team will review your feedback as soon as possible.'); + let okText = this.translate.instant('Finish'); this.popupProvider.ionicAlert(title, message, okText).then(() => { this.feedback = ''; this.navCtrl.pop(); @@ -108,7 +110,9 @@ export class SendFeedbackPage { }).catch((err) => { if (goHome) return; this.onGoingProcessProvider.set('sendingFeedback', false); - this.popupProvider.ionicAlert('Error', 'Feedback could not be submitted. Please try again later.'); //TODO gettextcatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Feedback could not be submitted. Please try again later.'); + this.popupProvider.ionicAlert(title, subtitle); }); if (goHome) this.navCtrl.push(HomePage); } diff --git a/src/pages/home/activity/activity.ts b/src/pages/home/activity/activity.ts index d408c0321..ce3cbd76f 100644 --- a/src/pages/home/activity/activity.ts +++ b/src/pages/home/activity/activity.ts @@ -1,6 +1,7 @@ import { Component } from "@angular/core"; import { Logger } from '../../../providers/logger/logger'; import { ModalController, NavController } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; //providers import { ProfileProvider } from '../../../providers/profile/profile'; @@ -32,7 +33,8 @@ export class ActivityPage { private modalCtrl: ModalController, private onGoingProcessProvider: OnGoingProcessProvider, private walletProvider: WalletProvider, - private popupProvider: PopupProvider + private popupProvider: PopupProvider, + private translate: TranslateService ) { this.fetchingNotifications = true; } @@ -73,7 +75,9 @@ export class ActivityPage { modal.present(); }).catch((err) => { this.logger.warn('No txp found'); - this.popupProvider.ionicAlert('Error', 'Transaction not found'); //TODO gettextcatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Transaction not found'); + this.popupProvider.ionicAlert(title, subtitle); }); } } diff --git a/src/pages/home/home.ts b/src/pages/home/home.ts index 3e5d68cd9..862354f8a 100644 --- a/src/pages/home/home.ts +++ b/src/pages/home/home.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, Events, ModalController } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { ActivityPage } from './activity/activity'; @@ -86,6 +87,7 @@ export class HomePage { private homeIntegrationsProvider: HomeIntegrationsProvider, private persistenceProvider: PersistenceProvider, private feedbackProvider: FeedbackProvider, + private translate: TranslateService ) { this.cachedBalanceUpdateOn = ''; this.isNW = this.platformProvider.isNW; @@ -331,7 +333,9 @@ export class HomePage { this.openTxpModal(_txp); }).catch((err: any) => { this.logger.warn('No txp found'); - return this.popupProvider.ionicAlert('Error', 'Transaction not found'); //TODO gettextcatalog + let title = this.translate.instant('Error'); + let subtitle = this.translate.instant('Transaction not found'); + return this.popupProvider.ionicAlert(title, subtitle); }); } } @@ -366,10 +370,10 @@ export class HomePage { public goToDownload(): void { let url = 'https://github.com/bitpay/copay/releases/latest'; let optIn = true; - let title = 'Update Available'; //TODO gettextcatalog - let message = 'An update to this app is available. For your security, please update to the latest version.'; //TODO gettextcatalog - let okText = 'View Update'; //TODO gettextcatalog - let cancelText = 'Go Back'; //TODO gettextcatalog + let title = this.translate.instant('Update Available'); + let message = this.translate.instant('An update to this app is available. For your security, please update to the latest version.'); + let okText = this.translate.instant('View Update'); + let cancelText = this.translate.instant('Go Back'); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); } diff --git a/src/providers/bwc-error/bwc-error.ts b/src/providers/bwc-error/bwc-error.ts index 7da7af4d1..e77fd9a22 100644 --- a/src/providers/bwc-error/bwc-error.ts +++ b/src/providers/bwc-error/bwc-error.ts @@ -1,9 +1,12 @@ import { Injectable } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; @Injectable() export class BwcErrorProvider { - constructor() {} + constructor( + private translate: TranslateService + ) { } public msg(err: any, prefix?: string): string { if (!err) @@ -22,128 +25,127 @@ export class BwcErrorProvider { let body = ''; prefix = prefix || ''; - // TODO: GetTextCatalog for errors if (name) { switch (name) { case 'INVALID_BACKUP': - body = 'Wallet Recovery Phrase is invalid'; + body = this.translate.instant('Wallet Recovery Phrase is invalid'); break; case 'WALLET_DOES_NOT_EXIST': - body = 'Wallet not registered at the wallet service. Recreate it from "Create Wallet" using "Advanced Options" to set your recovery phrase'; + body = this.translate.instant('Wallet not registered at the wallet service. Recreate it from "Create Wallet" using "Advanced Options" to set your recovery phrase'); break; case 'MISSING_PRIVATE_KEY': - body = 'Missing private keys to sign'; + body = this.translate.instant('Missing private keys to sign'); break; case 'ENCRYPTED_PRIVATE_KEY': - body = 'Private key is encrypted, cannot sign'; + body = this.translate.instant('Private key is encrypted, cannot sign'); break; case 'SERVER_COMPROMISED': - body = 'Server response could not be verified'; + body = this.translate.instant('Server response could not be verified'); break; case 'COULD_NOT_BUILD_TRANSACTION': - body = 'Could not build transaction'; + body = this.translate.instant('Could not build transaction'); break; case 'INSUFFICIENT_FUNDS': - body = 'Insufficient funds'; + body = this.translate.instant('Insufficient funds'); break; case 'CONNECTION_ERROR': - body = 'Network error'; + body = this.translate.instant('Network error'); break; case 'NOT_FOUND': - body = 'Wallet service not found'; + body = this.translate.instant('Wallet service not found'); break; case 'ECONNRESET_ERROR': - body = 'Connection reset by peer'; + body = this.translate.instant('Connection reset by peer'); break; case 'BAD_RESPONSE_CODE': - body = 'The request could not be understood by the server'; + body = this.translate.instant('The request could not be understood by the server'); break; case 'WALLET_ALREADY_EXISTS': - body = 'Wallet already exists'; + body = this.translate.instant('Wallet already exists'); break; case 'COPAYER_IN_WALLET': - body = 'Copayer already in this wallet'; + body = this.translate.instant('Copayer already in this wallet'); break; case 'WALLET_FULL': - body = 'Wallet is full'; + body = this.translate.instant('Wallet is full'); break; case 'WALLET_NOT_FOUND': - body = 'Wallet not found'; + body = this.translate.instant('Wallet not found'); break; case 'INSUFFICIENT_FUNDS_FOR_FEE': - body = 'Insufficient funds for fee'; + body = this.translate.instant('Insufficient funds for fee'); break; case 'LOCKED_FUNDS': - body = 'Funds are locked by pending spend proposals'; + body = this.translate.instant('Funds are locked by pending spend proposals'); break; case 'COPAYER_VOTED': - body = 'Copayer already voted on this spend proposal'; + body = this.translate.instant('Copayer already voted on this spend proposal'); break; case 'NOT_AUTHORIZED': - body = 'Not authorized'; + body = this.translate.instant('Not authorized'); break; case 'TX_ALREADY_BROADCASTED': - body = 'Transaction already broadcasted'; + body = this.translate.instant('Transaction already broadcasted'); break; case 'TX_CANNOT_CREATE': - body = 'Locktime in effect. Please wait to create a new spend proposal'; + body = this.translate.instant('Locktime in effect. Please wait to create a new spend proposal'); break; case 'TX_CANNOT_REMOVE': - body = 'Locktime in effect. Please wait to remove this spend proposal'; + body = this.translate.instant('Locktime in effect. Please wait to remove this spend proposal'); break; case 'TX_NOT_ACCEPTED': - body = 'Spend proposal is not accepted'; + body = this.translate.instant('Spend proposal is not accepted'); break; case 'TX_NOT_FOUND': - body = 'Spend proposal not found'; + body = this.translate.instant('Spend proposal not found'); break; case 'TX_NOT_PENDING': - body = 'The spend proposal is not pending'; + body = this.translate.instant('The spend proposal is not pending'); break; case 'UPGRADE_NEEDED': - body = 'Please upgrade Copay to perform this action'; + body = this.translate.instant('Please upgrade Copay to perform this action'); break; case 'BAD_SIGNATURES': - body = 'Signatures rejected by server'; + body = this.translate.instant('Signatures rejected by server'); break; case 'COPAYER_DATA_MISMATCH': - body = 'Copayer data mismatch'; + body = this.translate.instant('Copayer data mismatch'); break; case 'DUST_AMOUNT': - body = 'Amount below minimum allowed'; + body = this.translate.instant('Amount below minimum allowed'); break; case 'INCORRECT_ADDRESS_NETWORK': - body = 'Incorrect network address'; + body = this.translate.instant('Incorrect network address'); break; case 'COPAYER_REGISTERED': - body = 'Key already associated with an existing wallet'; + body = this.translate.instant('Key already associated with an existing wallet'); break; case 'INVALID_ADDRESS': - body = 'Invalid address'; + body = this.translate.instant('Invalid address'); break; case 'MAIN_ADDRESS_GAP_REACHED': - body = 'Empty addresses limit reached. New addresses cannot be generated.'; + body = this.translate.instant('Empty addresses limit reached. New addresses cannot be generated.'); break; case 'WALLET_LOCKED': - body = 'Wallet is locked'; + body = this.translate.instant('Wallet is locked'); break; case 'WALLET_NOT_COMPLETE': - body = 'Wallet is not complete'; + body = this.translate.instant('Wallet is not complete'); break; case 'WALLET_NEEDS_BACKUP': - body = 'Wallet needs backup'; + body = this.translate.instant('Wallet needs backup'); break; case 'MISSING_PARAMETER': - body = 'Missing parameter'; + body = this.translate.instant('Missing parameter'); break; case 'NO_PASSWORD_GIVEN': - body = 'Spending Password needed'; + body = this.translate.instant('Spending Password needed'); break; case 'PASSWORD_INCORRECT': - body = 'Wrong spending password'; + body = this.translate.instant('Wrong spending password'); break; case 'EXCEEDED_DAILY_LIMIT': - body = 'Exceeded daily limit of $500 per user'; + body = this.translate.instant('Exceeded daily limit of $500 per user'); break; case 'ERROR': body = (err.message || err.error); diff --git a/src/providers/fee/fee.ts b/src/providers/fee/fee.ts index b1f2877d3..3a6d64e0c 100644 --- a/src/providers/fee/fee.ts +++ b/src/providers/fee/fee.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { Logger } from '../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { ConfigProvider } from '../../providers/config/config'; @@ -13,12 +14,12 @@ export class FeeProvider { private CACHE_TIME_TS: number = 60; // Constant fee options to translate public feeOpts: any = { - urgent: 'Urgent', //TODO gettextcatalog - priority: 'Priority',//TODO gettextcatalog - normal: 'Normal',//TODO gettextcatalog - economy: 'Economy',//TODO gettextcatalog - superEconomy: 'Super Economy',//TODO gettextcatalog - custom: 'Custom'//TODO gettextcatalog + urgent: this.translate.instant('Urgent'), + priority: this.translate.instant('Priority'), + normal: this.translate.instant('Normal'), + economy: this.translate.instant('Economy'), + superEconomy: this.translate.instant('Super Economy'), + custom: this.translate.instant('Custom') }; private cache: any = { updateTs: 0, @@ -28,7 +29,8 @@ export class FeeProvider { constructor( private configProvider: ConfigProvider, private logger: Logger, - private bwcProvider: BwcProvider + private bwcProvider: BwcProvider, + private translate: TranslateService ) { this.logger.info('FeeProvider initialized.'); } @@ -54,7 +56,7 @@ export class FeeProvider { }); } if (!feeLevelRate || !feeLevelRate.feePerKb) { - let msg = "Could not get dynamic fee for level: " + feeLevel; //TODO gettextcatalog + let msg = this.translate.instant('Could not get dynamic fee for level:') + ' ' + feeLevel; return reject(msg); } @@ -89,11 +91,11 @@ export class FeeProvider { walletClient.getFeeLevels(coin, 'livenet', (errLivenet, levelsLivenet) => { if (errLivenet) { - return reject('Could not get dynamic fee'); //TODO gettextcatalog + return reject(this.translate.instant('Could not get dynamic fee')); } walletClient.getFeeLevels('btc', 'testnet', (errTestnet, levelsTestnet) => { if (errTestnet) { - return reject('Could not get dynamic fee'); //TODO gettextcatalog + return reject(this.translate.instant('Could not get dynamic fee')); } this.cache.updateTs = Date.now(); this.cache.coin = coin; diff --git a/src/providers/incoming-data/incoming-data.ts b/src/providers/incoming-data/incoming-data.ts index 08ce795d6..84bf733c1 100644 --- a/src/providers/incoming-data/incoming-data.ts +++ b/src/providers/incoming-data/incoming-data.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Events, NavController, App } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { BwcProvider } from '../bwc/bwc'; @@ -30,7 +31,8 @@ export class IncomingDataProvider { private popupProvider: PopupProvider, private logger: Logger, private appProvider: AppProvider, - private addressProvider: AddressProvider + private addressProvider: AddressProvider, + private translate: TranslateService ) { this.logger.info('IncomingDataProvider initialized.'); } @@ -70,7 +72,7 @@ export class IncomingDataProvider { this.handlePayPro(details, coin); }).catch((err: string) => { if (addr && amount) this.goSend(addr, amount, message, coin); - else this.popupProvider.ionicAlert('Error', err); //TODO gettextcatalog + else this.popupProvider.ionicAlert(this.translate.instant('Error'), err); }); } else { this.goSend(addr, amount, message, coin); @@ -99,7 +101,7 @@ export class IncomingDataProvider { if (addr && amount) this.goSend(addr, amount, message, coin); else - this.popupProvider.ionicAlert('Error', err);//TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), err); }); } else { this.goSend(addr, amount, message, coin); @@ -122,7 +124,9 @@ export class IncomingDataProvider { // Translate address this.logger.debug('address transalated to:' + addr); - this.popupProvider.ionicConfirm('Bitcoin cash Payment', 'Payment address was translated to new Bitcoin Cash address format: ' + addr, 'OK', 'Cancel').then((res: boolean) => { + let title = this.translate.instant('Bitcoin cash Payment'); + let msg = this.translate.instant('Payment address was translated to new Bitcoin Cash address format: {{addr}}', { addr: addr }); + this.popupProvider.ionicConfirm(title, msg).then((res: boolean) => { if (!res) return false; message = parsed.message; @@ -136,7 +140,7 @@ export class IncomingDataProvider { if (addr && amount) this.goSend(addr, amount, message, coin); else - this.popupProvider.ionicAlert('Error', err);//TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), err); }); } else { this.goSend(addr, amount, message, coin); diff --git a/src/providers/on-going-process/on-going-process.ts b/src/providers/on-going-process/on-going-process.ts index 574b49b5a..cf4fb102e 100644 --- a/src/providers/on-going-process/on-going-process.ts +++ b/src/providers/on-going-process/on-going-process.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { LoadingController } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; import * as _ from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; @Injectable() export class OnGoingProcessProvider { @@ -14,49 +15,49 @@ export class OnGoingProcessProvider { constructor( private loadingCtrl: LoadingController, private logger: Logger, + private translate: TranslateService ) { this.logger.info('OnGoingProcessProvider initialized.'); - // TODO gettextcatalog() // TODO GET - CLEAR - CHECK DecimalPipe for FILTER WITH TRANSLATE this.processNames = { - 'broadcastingTx': 'Broadcasting transaction...', - 'calculatingFee': 'Calculating fee...', - 'connectingCoinbase': 'Connecting to Coinbase...', - 'connectingGlidera': 'Connecting to Glidera...', - 'connectingShapeshift': 'Connecting to Shapeshift...', - 'creatingTx': 'Creating transaction...', - 'creatingWallet': 'Creating Wallet...', - 'deletingWallet': 'Deleting Wallet...', - 'extractingWalletInfo': 'Extracting Wallet information...', - 'fetchingPayPro': 'Fetching payment information', - 'generatingCSV': 'Generating .csv file...', - 'gettingFeeLevels': 'Getting fee levels...', - 'importingWallet': 'Importing Wallet...', - 'joiningWallet': 'Joining Wallet...', - 'recreating': 'Recreating Wallet...', - 'rejectTx': 'Rejecting payment proposal...', - 'removeTx': 'Deleting payment proposal...', - 'retrievingInputs': 'Retrieving inputs information', - 'scanning': 'Scanning Wallet funds...', - 'sendingTx': 'Sending transaction...', - 'signingTx': 'Signing transaction...', - 'sweepingWallet': 'Sweeping Wallet...', - 'validatingWords': 'Validating recovery phrase...', - 'loadingTxInfo': 'Loading transaction info...', - 'sendingFeedback': 'Sending feedback...', - 'generatingNewAddress': 'Generating new address...', - 'sendingByEmail': 'Preparing addresses...', - 'sending2faCode': 'Sending 2FA code...', - 'buyingBitcoin': 'Buying Bitcoin...', - 'sellingBitcoin': 'Selling Bitcoin...', - 'fetchingBitPayAccount': 'Fetching BitPay Account...', - 'updatingGiftCards': 'Updating Gift Cards...', - 'updatingGiftCard': 'Updating Gift Card...', - 'cancelingGiftCard': 'Canceling Gift Card...', - 'creatingGiftCard': 'Creating Gift Card...', - 'buyingGiftCard': 'Buying Gift Card...', - 'topup': 'Top up in progress...', - 'duplicatingWallet': 'Duplicating wallet...', + 'broadcastingTx': this.translate.instant('Broadcasting transaction...'), + 'calculatingFee': this.translate.instant('Calculating fee...'), + 'connectingCoinbase': this.translate.instant('Connecting to Coinbase...'), + 'connectingGlidera': this.translate.instant('Connecting to Glidera...'), + 'connectingShapeshift': this.translate.instant('Connecting to Shapeshift...'), + 'creatingTx': this.translate.instant('Creating transaction...'), + 'creatingWallet': this.translate.instant('Creating Wallet...'), + 'deletingWallet': this.translate.instant('Deleting Wallet...'), + 'extractingWalletInfo': this.translate.instant('Extracting Wallet information...'), + 'fetchingPayPro': this.translate.instant('Fetching payment information'), + 'generatingCSV': this.translate.instant('Generating .csv file...'), + 'gettingFeeLevels': this.translate.instant('Getting fee levels...'), + 'importingWallet': this.translate.instant('Importing Wallet...'), + 'joiningWallet': this.translate.instant('Joining Wallet...'), + 'recreating': this.translate.instant('Recreating Wallet...'), + 'rejectTx': this.translate.instant('Rejecting payment proposal...'), + 'removeTx': this.translate.instant('Deleting payment proposal...'), + 'retrievingInputs': this.translate.instant('Retrieving inputs information'), + 'scanning': this.translate.instant('Scanning Wallet funds...'), + 'sendingTx': this.translate.instant('Sending transaction...'), + 'signingTx': this.translate.instant('Signing transaction...'), + 'sweepingWallet': this.translate.instant('Sweeping Wallet...'), + 'validatingWords': this.translate.instant('Validating recovery phrase...'), + 'loadingTxInfo': this.translate.instant('Loading transaction info...'), + 'sendingFeedback': this.translate.instant('Sending feedback...'), + 'generatingNewAddress': this.translate.instant('Generating new address...'), + 'sendingByEmail': this.translate.instant('Preparing addresses...'), + 'sending2faCode': this.translate.instant('Sending 2FA code...'), + 'buyingBitcoin': this.translate.instant('Buying Bitcoin...'), + 'sellingBitcoin': this.translate.instant('Selling Bitcoin...'), + 'fetchingBitPayAccount': this.translate.instant('Fetching BitPay Account...'), + 'updatingGiftCards': this.translate.instant('Updating Gift Cards...'), + 'updatingGiftCard': this.translate.instant('Updating Gift Card...'), + 'cancelingGiftCard': this.translate.instant('Canceling Gift Card...'), + 'creatingGiftCard': this.translate.instant('Creating Gift Card...'), + 'buyingGiftCard': this.translate.instant('Buying Gift Card...'), + 'topup': this.translate.instant('Top up in progress...'), + 'duplicatingWallet': this.translate.instant('Duplicating wallet...'), }; this.ongoingProcess = {}; } diff --git a/src/providers/paypro/paypro.ts b/src/providers/paypro/paypro.ts index 17e7fdd6c..20185f158 100644 --- a/src/providers/paypro/paypro.ts +++ b/src/providers/paypro/paypro.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { Logger } from '../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { ProfileProvider } from '../profile/profile'; @@ -10,7 +11,8 @@ export class PayproProvider { constructor( private profileProvider: ProfileProvider, private logger: Logger, - private onGoingProcessProvider: OnGoingProcessProvider + private onGoingProcessProvider: OnGoingProcessProvider, + private translate: TranslateService ) { this.logger.info('PayproProvider initialized'); } @@ -35,7 +37,7 @@ export class PayproProvider { if (err) return reject(err); else if (!paypro.verified) { this.logger.warn('Failed to verify payment protocol signatures'); - return reject('Payment Protocol Invalid'); //TODO gettextcatalog + return reject(this.translate.instant('Payment Protocol Invalid')); } return resolve(paypro); }); diff --git a/src/providers/popup/popup.ts b/src/providers/popup/popup.ts index 3bf949fcb..f626eb483 100644 --- a/src/providers/popup/popup.ts +++ b/src/providers/popup/popup.ts @@ -1,13 +1,14 @@ import { Injectable } from '@angular/core'; import { AlertController } from 'ionic-angular'; - +import { TranslateService } from '@ngx-translate/core'; import { Logger } from '../../providers/logger/logger'; @Injectable() export class PopupProvider { constructor( private alertCtrl: AlertController, - private logger: Logger + private logger: Logger, + private translate: TranslateService ) { } @@ -19,7 +20,7 @@ export class PopupProvider { enableBackdropDismiss: false, buttons: [ { - text: okText ? okText : 'OK', + text: okText ? okText : this.translate.instant('Ok'), handler: () => { this.logger.info('Ok clicked'); resolve(); @@ -38,14 +39,14 @@ export class PopupProvider { message: message, buttons: [ { - text: cancelText ? cancelText : 'Cancel', + text: cancelText ? cancelText : this.translate.instant('Cancel'), handler: () => { this.logger.info('Disagree clicked'); resolve(false); } }, { - text: okText ? okText : 'OK', + text: okText ? okText : this.translate.instant('Ok'), handler: () => { this.logger.info('Agree clicked'); resolve(true); @@ -75,14 +76,14 @@ export class PopupProvider { ], buttons: [ { - text: cancelText ? cancelText : 'Cancel', + text: cancelText ? cancelText : this.translate.instant('Cancel'), handler: data => { this.logger.info('Cancel clicked'); resolve(null); } }, { - text: okText ? okText : 'OK', + text: okText ? okText : this.translate.instant('Ok'), handler: data => { this.logger.info('Saved clicked'); resolve(data[0]); From 7afe9f12325cc7989f7d08ddb7526cca4563269f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Fri, 2 Feb 2018 13:00:11 -0300 Subject: [PATCH 3/7] [V4] FEAT: ts translations 2 --- .../includes/feedback-card/feedback-card.ts | 12 ++-- .../amazon/buy-amazon/buy-amazon.ts | 46 +++++++-------- .../shapeshift-confirm/shapeshift-confirm.ts | 28 ++++++---- .../shapeshift-shift/shapeshift-shift.ts | 10 ++-- src/pages/paper-wallet/paper-wallet.ts | 16 +++--- src/pages/scan/scan.ts | 6 +- .../send/choose-fee-level/choose-fee-level.ts | 12 ++-- src/pages/send/confirm/confirm.ts | 56 ++++++++++--------- src/pages/settings/about/about.ts | 12 ++-- .../settings/about/session-log/session-log.ts | 10 ++-- src/pages/settings/addressbook/view/view.ts | 10 ++-- .../settings/bitcoin-cash/bitcoin-cash.ts | 14 +++-- src/pages/settings/language/language.ts | 12 ++-- src/pages/settings/lock/lock.ts | 10 ++-- .../wallet-addresses/wallet-addresses.ts | 12 ++-- .../wallet-delete/wallet-delete.ts | 12 ++-- .../wallet-export/wallet-export.ts | 24 ++++---- .../wallet-settings/wallet-settings.ts | 8 ++- src/pages/success/success.ts | 6 +- src/pages/tx-details/tx-details.ts | 36 ++++++------ src/pages/txp-details/txp-details.ts | 40 ++++++------- src/pages/wallet-details/wallet-details.ts | 8 ++- src/providers/profile/profile.ts | 49 ++++++++-------- src/providers/wallet/wallet.ts | 32 ++++++----- 24 files changed, 266 insertions(+), 215 deletions(-) diff --git a/src/pages/includes/feedback-card/feedback-card.ts b/src/pages/includes/feedback-card/feedback-card.ts index 648bef3d5..f119c8e44 100644 --- a/src/pages/includes/feedback-card/feedback-card.ts +++ b/src/pages/includes/feedback-card/feedback-card.ts @@ -1,6 +1,7 @@ import { Component } from "@angular/core"; import { NavController, Events } from 'ionic-angular'; import { Logger } from '../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { AppProvider } from '../../../providers/app/app'; @@ -26,6 +27,7 @@ export class FeedbackCardPage { private logger: Logger, private persistenceProvider: PersistenceProvider, private events: Events, + private translate: TranslateService ) { this.appName = this.appProvider.info.nameCase; this.score = 0; @@ -45,19 +47,19 @@ export class FeedbackCardPage { this.score = score; switch (this.score) { case 1: - this.button_title = "I think this app is terrible"; //TODO gettextcatalog + this.button_title = this.translate.instant("I think this app is terrible"); break; case 2: - this.button_title = "I don't like it"; //TODO gettextcatalog + this.button_title = this.translate.instant("I don't like it"); break; case 3: - this.button_title = "Meh - it's alright"; //TODO gettextcatalog + this.button_title = this.translate.instant("Meh - it's alright"); break; case 4: - this.button_title = "I like the app"; //TODO gettextcatalog + this.button_title = this.translate.instant("I like the app"); break; case 5: - this.button_title = "This app is fantastic!"; //TODO gettextcatalog + this.button_title = this.translate.instant("This app is fantastic!"); break; } } diff --git a/src/pages/integrations/amazon/buy-amazon/buy-amazon.ts b/src/pages/integrations/amazon/buy-amazon/buy-amazon.ts index 2beb7919a..9dc4c5f61 100644 --- a/src/pages/integrations/amazon/buy-amazon/buy-amazon.ts +++ b/src/pages/integrations/amazon/buy-amazon/buy-amazon.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams, ModalController, Events } from 'ionic-angular'; import { Logger } from '../../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; import * as _ from 'lodash'; import * as moment from 'moment'; @@ -64,7 +65,8 @@ export class BuyAmazonPage { private popupProvider: PopupProvider, private profileProvider: ProfileProvider, private txFormatProvider: TxFormatProvider, - private walletProvider: WalletProvider + private walletProvider: WalletProvider, + private translate: TranslateService ) { this.FEE_TOO_HIGH_LIMIT_PER = 15; this.coin = 'btc'; @@ -82,7 +84,7 @@ export class BuyAmazonPage { let limitPerDay = this.amazonProvider.limitPerDay; - this.limitPerDayMessage = "Purchase Amount is limited to " + limitPerDay + " " + this.currency + " per day"; // TODO: gettextCatalog + this.limitPerDayMessage = this.translate.instant("Purchase Amount is limited to {{limitPerDay}} {{currency}} per day", { limitPerDay: limitPerDay, currency: this.currency }); if (this.amount > this.amazonProvider.limitPerDay) { this.showErrorAndBack(null, this.limitPerDayMessage); @@ -97,7 +99,7 @@ export class BuyAmazonPage { coin: this.coin }); if (_.isEmpty(this.wallets)) { - this.showErrorAndBack(null, 'No wallets available'); // TODO: gettextCatalog + this.showErrorAndBack(null, this.translate.instant('No wallets available')); return; } this.onWalletSelect(this.wallets[0]); // Default first wallet @@ -122,7 +124,7 @@ export class BuyAmazonPage { } private showErrorAndBack(title: string, msg: any) { - title = title ? title : 'Error'; // TODO: gettextCatalog + title = title ? title : this.translate.instant('Error'); this.logger.error(msg); msg = (msg && msg.errors) ? msg.errors[0].message : msg; this.popupProvider.ionicAlert(title, msg).then(() => { @@ -132,7 +134,7 @@ export class BuyAmazonPage { private showError = function (title: string, msg: any): Promise { return new Promise((resolve, reject) => { - title = title || 'Error'; // TODO: gettextCatalog + title = title || this.translate.instant('Error'); this.logger.error(msg); msg = (msg && msg.errors) ? msg.errors[0].message : msg; this.popupProvider.ionicAlert(title, msg).then(() => { @@ -144,7 +146,7 @@ export class BuyAmazonPage { private publishAndSign(wallet: any, txp: any): Promise { return new Promise((resolve, reject) => { if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { - let err = 'No signing proposal: No private key'; // TODO: gettextCatalog + let err = this.translate.instant('No signing proposal: No private key'); this.logger.info(err); return reject(err); } @@ -184,15 +186,15 @@ export class BuyAmazonPage { return new Promise((resolve, reject) => { this.amazonProvider.createBitPayInvoice(data, (err: any, dataInvoice: any) => { if (err) { - let err_title = 'Error creating the invoice'; // TODO: gettextCatalog + let err_title = this.translate.instant('Error creating the invoice'); let err_msg; if (err && err.message && err.message.match(/suspended/i)) { - err_title = 'Service not available'; // TODO: gettextCatalog - err_msg = 'Amazon.com is not available at this moment. Please try back later.'; // TODO: gettextCatalog + err_title = this.translate.instant('Service not available'); + err_msg = this.translate.instant('Amazon.com is not available at this moment. Please try back later.'); } else if (err && err.message) { err_msg = err.message; } else { - err_msg = 'Could not access to Amazon.com'; // TODO: gettextCatalog + err_msg = this.translate.instant('Could not access to Amazon.com'); }; return reject({ @@ -205,14 +207,14 @@ export class BuyAmazonPage { if (!accessKey) { return reject({ - message: 'No access key defined' // TODO: gettextCatalog + message: this.translate.instant('No access key defined') }); } this.amazonProvider.getBitPayInvoice(dataInvoice.invoiceId, (err: any, invoice: any) => { if (err) { return reject({ - message: 'Could not get the invoice' // TODO: gettextCatalog + message: this.translate.instant('Could not get the invoice') }); } @@ -228,8 +230,8 @@ export class BuyAmazonPage { if (!payProUrl) { return reject({ - title: 'Error in Payment Protocol', // TODO: gettextCatalog - message: 'Invalid URL' // TODO: gettextCatalog + title: this.translate.instant('Error in Payment Protocol'), + message: this.translate.instant('Invalid URL') }); } @@ -257,7 +259,7 @@ export class BuyAmazonPage { return resolve(ctxp); }).catch((err: any) => { return reject({ - title: 'Could not create transaction', // TODO: gettextCatalog + title: this.translate.instant('Could not create transaction'), message: this.bwcErrorProvider.msg(err) }); }); @@ -288,7 +290,7 @@ export class BuyAmazonPage { }, (err: any) => { this.logger.error(err); this.onGoingProcessProvider.set('buyingGiftCard', false); - this.showError(null, 'Gift card expired'); // TODO: gettextCatalog + this.showError(null, this.translate.instant('Gift card expired')); }); return; } @@ -334,7 +336,7 @@ export class BuyAmazonPage { invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0; let invoiceFeeSat = parseInt((invoice.buyerPaidBtcMinerFee * 100000000).toFixed()); - this.message = this.amountUnitStr + " for Amazon.com Gift Card"; // TODO: gettextCatalog + this.message = this.translate.instant("{{amountUnitStr}} for Amazon.com Gift Card", { amountUnitStr: this.amountUnitStr }); this.createTx(wallet, invoice, this.message).then((ctxp: any) => { this.onGoingProcessProvider.set('loadingTxInfo', false); @@ -374,12 +376,12 @@ export class BuyAmazonPage { public buyConfirm() { if (!this.createdTx) { - this.showError(null, 'Transaction has not been created'); // TODO: gettextCatalog + this.showError(null, this.translate.instant('Transaction has not been created')); return; } - var title = 'Confirm'; // TODO: gettextCatalog - var okText = 'OK'; // TODO: gettextCatalog - var cancelText = 'Cancel'; // TODO: gettextCatalog + var title = this.translate.instant('Confirm'); + var okText = this.translate.instant('OK'); + var cancelText = this.translate.instant('Cancel'); this.popupProvider.ionicConfirm(title, this.message, okText, cancelText).then((ok) => { if (!ok) { return; @@ -390,7 +392,7 @@ export class BuyAmazonPage { this.checkTransaction(1, this.createdTx.giftData); }).catch((err: any) => { this._resetValues(); - this.showError('Could not send transaction', err); // TODO: gettextCatalog + this.showError(this.translate.instant('Could not send transaction'), err); return; }); }); diff --git a/src/pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm.ts b/src/pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm.ts index b032fa1f3..7cf08518b 100644 --- a/src/pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm.ts +++ b/src/pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm.ts @@ -3,6 +3,7 @@ import { NavController, NavParams } from 'ionic-angular'; import { Logger } from '../../../../providers/logger/logger'; import * as moment from 'moment'; import * as _ from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { ShapeshiftPage } from '../shapeshift'; @@ -73,7 +74,8 @@ export class ShapeshiftConfirmPage { private shapeshiftProvider: ShapeshiftProvider, private txFormatProvider: TxFormatProvider, private walletProvider: WalletProvider, - private modalCtrl: ModalController + private modalCtrl: ModalController, + private translate: TranslateService ) { this.configWallet = this.configProvider.get().wallet; this.currencyIsoCode = 'USD'; // Only USD @@ -93,7 +95,7 @@ export class ShapeshiftConfirmPage { this.toWallet = this.profileProvider.getWallet(this.toWalletId); if (_.isEmpty(this.fromWallet) || _.isEmpty(this.toWallet)) { - this.showErrorAndBack(null, 'No wallet found'); // TODO: gettextCatalog + this.showErrorAndBack(null, this.translate.instant('No wallet found')); return; } @@ -106,11 +108,13 @@ export class ShapeshiftConfirmPage { let amountNumber = Number(this.amount); if (amountNumber < min) { - this.showErrorAndBack(null, 'Minimum amount required is ' + min); // TODO: gettextCatalog + let message = this.translate.instant('Minimum amount required is {{min}}', { min: min }); + this.showErrorAndBack(null, message); return; } if (amountNumber > max) { - this.showErrorAndBack(null, 'Maximum amount allowed is ' + max); // TODO: gettextCatalog + let message = this.translate.instant('Maximum amount allowed is {{max}}', { max: max }); + this.showErrorAndBack(null, message); return; } this.createShift(); @@ -126,7 +130,7 @@ export class ShapeshiftConfirmPage { }; private showErrorAndBack(title: string, msg: any) { - title = title ? title : 'Error'; // TODO: gettextCatalog + title = title ? title : this.translate.instant('Error'); this.logger.error(msg); msg = (msg && msg.errors) ? msg.errors[0].message : msg; this.popupProvider.ionicAlert(title, msg).then(() => { @@ -137,7 +141,7 @@ export class ShapeshiftConfirmPage { private publishAndSign(wallet: any, txp: any): Promise { return new Promise((resolve, reject) => { if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { - let err = 'No signing proposal: No private key'; // TODO: gettextCatalog + let err = this.translate.instant('No signing proposal: No private key'); this.logger.info(err); return reject(err); } @@ -233,7 +237,7 @@ export class ShapeshiftConfirmPage { return resolve(ctxp); }).catch((err: any) => { return reject({ - title: 'Could not create transaction', // TODO: gettextCatalog + title: this.translate.instant('Could not create transaction'), message: this.bwcErrorProvider.msg(err) }); }); @@ -323,14 +327,14 @@ export class ShapeshiftConfirmPage { public confirmTx(): void { if (!this.createdTx) { - this.showErrorAndBack(null, 'Transaction has not been created'); // TODO: gettextCatalog + this.showErrorAndBack(null, this.translate.instant('Transaction has not been created')); return; } let fromCoin = this.fromWallet.coin.toUpperCase(); let toCoin = this.toWallet.coin.toUpperCase(); - let title = 'Confirm to shift ' + fromCoin + ' to ' + toCoin; // TODO: gettextCatalog - let okText = 'OK'; // TODO: gettextCatalog - let cancelText = 'Cancel'; // TODO: gettextCatalog + let title = this.translate.instant('Confirm to shift {{fromCoin}} to {{toCoin}}', { fromCoin: fromCoin, toCoin: toCoin }); + let okText = this.translate.instant('OK'); + let cancelText = this.translate.instant('Cancel'); this.popupProvider.ionicConfirm(title, '', okText, cancelText).then((ok: any) => { if (!ok) { return; @@ -342,7 +346,7 @@ export class ShapeshiftConfirmPage { this.txSent = txSent; this.saveShapeshiftData(); }).catch((err: any) => { - this.showErrorAndBack(null, 'Could not send transaction'), err; // TODO: gettextCatalog + this.showErrorAndBack(null, this.translate.instant('Could not send transaction')), err; return; }); }); diff --git a/src/pages/integrations/shapeshift/shapeshift-shift/shapeshift-shift.ts b/src/pages/integrations/shapeshift/shapeshift-shift/shapeshift-shift.ts index 8b09ae16e..5b6b692ef 100644 --- a/src/pages/integrations/shapeshift/shapeshift-shift/shapeshift-shift.ts +++ b/src/pages/integrations/shapeshift/shapeshift-shift/shapeshift-shift.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { NavController, Events } from 'ionic-angular'; import { Logger } from '../../../../providers/logger/logger'; import * as _ from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { AmountPage } from './../../../send/amount/amount'; @@ -39,7 +40,8 @@ export class ShapeshiftShiftPage { private navCtrl: NavController, private popupProvider: PopupProvider, private profileProvider: ProfileProvider, - private shapeshiftProvider: ShapeshiftProvider + private shapeshiftProvider: ShapeshiftProvider, + private translate: TranslateService ) { this.walletsBtc = []; this.walletsBch = []; @@ -63,7 +65,7 @@ export class ShapeshiftShiftPage { }); if (_.isEmpty(this.walletsBtc) || _.isEmpty(this.walletsBch)) { - this.showErrorAndBack(null, 'No wallets available to use ShapeShift'); // TODO: gettextCatalog + this.showErrorAndBack(null, this.translate.instant('No wallets available to use ShapeShift')); return; } @@ -74,7 +76,7 @@ export class ShapeshiftShiftPage { }); if (_.isEmpty(this.fromWallets)) { - this.showErrorAndBack(null, 'No wallets with funds'); // TODO: gettextCatalog + this.showErrorAndBack(null, this.translate.instant('No wallets with funds')); return; } @@ -95,7 +97,7 @@ export class ShapeshiftShiftPage { } private showErrorAndBack(title: string, msg: any): void { - title = title ? title : 'Error'; // TODO: gettextCatalog + title = title ? title : this.translate.instant('Error'); this.logger.error(msg); msg = (msg && msg.errors) ? msg.errors[0].message : msg; this.popupProvider.ionicAlert(title, msg).then(() => { diff --git a/src/pages/paper-wallet/paper-wallet.ts b/src/pages/paper-wallet/paper-wallet.ts index 4c4098afc..a931d5ac4 100644 --- a/src/pages/paper-wallet/paper-wallet.ts +++ b/src/pages/paper-wallet/paper-wallet.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams, Events, ModalController } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; import * as _ from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; //providers import { BwcProvider } from '../../providers/bwc/bwc'; @@ -47,7 +48,8 @@ export class PaperWalletPage { private feeProvider: FeeProvider, private profileProvider: ProfileProvider, private events: Events, - private modalCtrl: ModalController + private modalCtrl: ModalController, + private translate: TranslateService ) { this.bitcore = this.bwcProvider.getBitcore(); } @@ -71,7 +73,7 @@ export class PaperWalletPage { if (!this.wallet) return; if (!this.isPkEncrypted) this.scanFunds(); else { - let message = 'Private key encrypted. Enter password'; //TODO gettextcatalog + let message = this.translate.instant('Private key encrypted. Enter password'); this.popupProvider.ionicPrompt(null, message, null).then((res) => { this.passphrase = res; this.scanFunds(); @@ -118,13 +120,13 @@ export class PaperWalletPage { this.privateKey = data.privateKey; this.balanceSat = data.balance; if (this.balanceSat <= 0) { - this.popupProvider.ionicAlert('Error', 'Not funds found'); //TODO gettextcatalog + this.popupProvider.ionicAlert('Error', this.translate.instant('Not funds found')); this.navCtrl.pop(); } }).catch((err: any) => { this.onGoingProcessProvider.set('scanning', false); this.logger.error(err); - this.popupProvider.ionicAlert('Error scanning funds:', err || err.toString());//TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error scanning funds:'), err || err.toString()); this.navCtrl.pop(); }); } @@ -164,7 +166,7 @@ export class PaperWalletPage { this.openSuccessModal(); }).catch((err: any) => { this.logger.error(err); - this.popupProvider.ionicAlert('Error sweeping wallet:', err || err.toString());//TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error sweeping wallet:'), err || err.toString()); }); } @@ -182,8 +184,8 @@ export class PaperWalletPage { } public openSuccessModal(): void { - let successComment = "Check the transaction on your wallet details"; //TODO gettextcatalog - let successText = 'Sweep Completed'; //TODO gettextcatalog + let successComment = this.translate.instant("Check the transaction on your wallet details"); + let successText = this.translate.instant('Sweep Completed'); let modal = this.modalCtrl.create(SuccessModalPage, { successText: successText, successComment: successComment }, { showBackdrop: true, enableBackdropDismiss: false }); modal.present(); modal.onDidDismiss(() => { diff --git a/src/pages/scan/scan.ts b/src/pages/scan/scan.ts index 12b02d651..dd1af9d30 100644 --- a/src/pages/scan/scan.ts +++ b/src/pages/scan/scan.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, Events, ModalController } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { PlatformProvider } from '../../providers/platform/platform'; @@ -45,7 +46,8 @@ export class ScanPage { private events: Events, private modalCtrl: ModalController, private externalLinkProvider: ExternalLinkProvider, - private logger: Logger + private logger: Logger, + private translate: TranslateService ) { this.lightActive = false; this.canEnableLight = true; @@ -78,7 +80,7 @@ export class ScanPage { ionViewDidEnter() { //TODO support for browser if (!this.platform.isCordova) { - this.notSupportedMessage = "Scanner not supported"; //TODO gettextcatalog + this.notSupportedMessage = this.translate.instant("Scanner not supported"); return; } // try initializing and refreshing status any time the view is entered diff --git a/src/pages/send/choose-fee-level/choose-fee-level.ts b/src/pages/send/choose-fee-level/choose-fee-level.ts index f78292913..49b841d0d 100644 --- a/src/pages/send/choose-fee-level/choose-fee-level.ts +++ b/src/pages/send/choose-fee-level/choose-fee-level.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { ViewController } from 'ionic-angular'; import { Logger } from '../../../providers/logger/logger'; import * as _ from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; // Providers import { FeeProvider } from '../../../providers/fee/fee'; @@ -37,13 +38,12 @@ export class ChooseFeeLevelPage { public showMaxWarning: boolean; public showMinWarning: boolean; - - constructor( private viewCtrl: ViewController, private logger: Logger, private popupProvider: PopupProvider, - private feeProvider: FeeProvider + private feeProvider: FeeProvider, + private translate: TranslateService ) { // From parent controller this.network = this.viewCtrl.data.network; @@ -53,7 +53,7 @@ export class ChooseFeeLevelPage { this.customFeePerKB = this.viewCtrl.data.customFeePerKB ? this.viewCtrl.data.customFeePerKB : null; this.feePerSatByte = this.viewCtrl.data.feePerSatByte ? this.viewCtrl.data.feePerSatByte : null; - if (_.isEmpty(this.feeLevel)) this.showErrorAndClose(null, 'Fee level is not defined'); // TODO: GetTextCatalog + if (_.isEmpty(this.feeLevel)) this.showErrorAndClose(null, this.translate.instant('Fee level is not defined')); this.selectedFee = this.feeLevel; this.feeOpts = Object.keys(this.feeProvider.feeOpts); @@ -61,7 +61,7 @@ export class ChooseFeeLevelPage { this.feeProvider.getFeeLevels(this.coin).then((levels: any) => { this.loadingFee = false; if (_.isEmpty(levels)) { - this.showErrorAndClose(null, 'Could not get fee levels'); // TODO: GetTextCatalog + this.showErrorAndClose(null, this.translate.instant('Could not get fee levels')); return; } this.feeLevels = levels; @@ -78,7 +78,7 @@ export class ChooseFeeLevelPage { } private showErrorAndClose(title: string, msg: string): void { - title = title ? title : 'Error'; // TODO: GetTextCatalog + title = title ? title : this.translate.instant('Error'); this.logger.error(msg); this.popupProvider.ionicAlert(title, msg).then(() => { this.viewCtrl.dismiss(); diff --git a/src/pages/send/confirm/confirm.ts b/src/pages/send/confirm/confirm.ts index d947bc0d5..8a9c13642 100644 --- a/src/pages/send/confirm/confirm.ts +++ b/src/pages/send/confirm/confirm.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams, ModalController, Events } from 'ionic-angular'; import { Logger } from '../../../providers/logger/logger'; import * as _ from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { PayProPage } from '../../paypro/paypro'; @@ -72,7 +73,8 @@ export class ConfirmPage { private txConfirmNotificationProvider: TxConfirmNotificationProvider, private modalCtrl: ModalController, private txFormatProvider: TxFormatProvider, - private events: Events + private events: Events, + private translate: TranslateService ) { this.bitcoreCash = this.bwcProvider.getBitcoreCash(); this.CONFIRM_LIMIT_USD = 20; @@ -110,7 +112,7 @@ export class ConfirmPage { this.tx.feeLevelName = this.feeProvider.feeOpts[this.tx.feeLevel]; this.showAddress = false; - this.walletSelectorTitle = 'Send from'; // TODO gettextCatalog + this.walletSelectorTitle = this.translate.instant('Send from'); } ionViewDidLoad() { @@ -143,7 +145,7 @@ export class ConfirmPage { }); if (!this.wallets || !this.wallets.length) { - this.setNoWallet('No wallets available', true); // TODO gettextCatalog + this.setNoWallet(this.translate.instant('No wallets available'), true); return resolve(); } @@ -165,7 +167,7 @@ export class ConfirmPage { return reject('Could not update any wallet'); if (_.isEmpty(filteredWallets)) { - this.setNoWallet('Insufficient funds', true); // TODO gettextCatalog + this.setNoWallet(this.translate.instant('Insufficient funds'), true); return reject('Insufficient funds'); } this.wallets = _.clone(filteredWallets); @@ -178,7 +180,7 @@ export class ConfirmPage { return reject('Could not update any wallet'); if (_.isEmpty(filteredWallets)) { - this.setNoWallet('Insufficient funds', true); // TODO gettextCatalog + this.setNoWallet(this.translate.instant('Insufficient funds'), true); return reject('Insufficient funds for fee'); } this.wallets = _.clone(filteredWallets); @@ -198,7 +200,7 @@ export class ConfirmPage { private exitWithError(err: any) { this.logger.info('Error setting wallet selector:' + err); - this.popupProvider.ionicAlert("", this.bwcErrorProvider.msg(err)).then(() => { // TODO gettextCatalog + this.popupProvider.ionicAlert("", this.bwcErrorProvider.msg(err)).then(() => { this.navCtrl.popToRoot(); }); }; @@ -226,21 +228,21 @@ export class ConfirmPage { private setButtonText(isMultisig: boolean, isPayPro: boolean): void { if (isPayPro) { if (this.isCordova && !this.isWindowsPhoneApp) { - this.buttonText = 'Slide to pay'; // TODO gettextCatalog + this.buttonText = this.translate.instant('Slide to pay'); } else { - this.buttonText = 'Click to pay'; // TODO gettextCatalog + this.buttonText = this.translate.instant('Click to pay'); } } else if (isMultisig) { if (this.isCordova && !this.isWindowsPhoneApp) { - this.buttonText = 'Slide to accept'; // TODO gettextCatalog + this.buttonText = this.translate.instant('Slide to accept'); } else { - this.buttonText = 'Click to accept'; // TODO gettextCatalog + this.buttonText = this.translate.instant('Click to accept'); } } else { if (this.isCordova && !this.isWindowsPhoneApp) { - this.buttonText = 'Slide to send'; // TODO gettextCatalog + this.buttonText = this.translate.instant('Slide to send'); } else { - this.buttonText = 'Click to send'; // TODO gettextCatalog + this.buttonText = this.translate.instant('Click to send'); } } } @@ -259,7 +261,7 @@ export class ConfirmPage { if (now > expirationTime) { this.paymentExpired = true; - this.remainingTimeStr = 'Expired'; // TODO gettextCatalog + this.remainingTimeStr = this.translate.instant('Expired'); if (countDown) { /* later */ clearInterval(countDown); @@ -325,10 +327,10 @@ export class ConfirmPage { this.logger.debug('Send max info', sendMaxInfo); if (sendMaxInfo.amount == 0) { - this.setNoWallet('Insufficient funds for fee', false); // TODO gettextCatalog + this.setNoWallet(this.translate.instant('Insufficient funds for fee'), false); this.popupProvider.ionicAlert('Error', 'Not enough funds for fee').then(() => { return resolve('no_funds'); - }); // TODO gettextCatalog + }); } tx.sendMaxInfo = sendMaxInfo; @@ -350,7 +352,7 @@ export class ConfirmPage { }); }).catch((err: any) => { - let msg = 'Error getting SendMax information'; // TODO gettextCatalog + let msg = this.translate.instant('Error getting SendMax information'); return reject(msg); }); }); @@ -414,12 +416,14 @@ export class ConfirmPage { let warningMsg = []; if (sendMaxInfo.utxosBelowFee > 0) { let amountBelowFeeStr = (sendMaxInfo.amountBelowFee / 1e8); - warningMsg.push("A total of " + amountBelowFeeStr + " " + this.tx.coin.toUpperCase() + " were excluded. These funds come from UTXOs smaller than the network fee provided.");// TODO gettextCatalog + let message = this.translate.instant("A total of {{amountBelowFeeStr}} {{coin}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { amountBelowFeeStr: amountBelowFeeStr, coin: this.tx.coin.toUpperCase() }); + warningMsg.push(message); } if (sendMaxInfo.utxosAboveMaxSize > 0) { let amountAboveMaxSizeStr = (sendMaxInfo.amountAboveMaxSize / 1e8); - warningMsg.push("A total of " + amountAboveMaxSizeStr + " " + this.tx.coin.toUpperCase() + " were excluded. The maximum size allowed for a transaction was exceeded.");// TODO gettextCatalog + let message = this.translate.instant("A total of {{amountAboveMaxSizeStr}} {{coin}} were excluded. The maximum size allowed for a transaction was exceeded.", { amountBelowFeeStr: amountAboveMaxSizeStr, coin: this.tx.coin.toUpperCase() }); + warningMsg.push(message); } return warningMsg.join('\n'); }; @@ -429,14 +433,14 @@ export class ConfirmPage { // ToDo: use a credential's (or fc's) function for this if (tx.description && !wallet.credentials.sharedEncryptingKey) { - let msg = 'Could not add message to imported wallet without shared encrypting key'; // TODO gettextCatalog + let msg = this.translate.instant('Could not add message to imported wallet without shared encrypting key'); this.logger.warn(msg); this.setSendError(msg); return reject(msg); } if (tx.amount > Number.MAX_SAFE_INTEGER) { - let msg = 'Amount too big'; // TODO gettextCatalog + let msg = this.translate.instant('Amount too big'); this.logger.warn(msg); this.setSendError(msg); return reject(msg); @@ -477,7 +481,7 @@ export class ConfirmPage { } private setSendError(msg: string) { - this.popupProvider.ionicAlert('Error at confirm', this.bwcErrorProvider.msg(msg)); // TODO gettextCatalog + this.popupProvider.ionicAlert(this.translate.instant('Error at confirm'), this.bwcErrorProvider.msg(msg)); } public toggleAddress(): void { @@ -489,7 +493,7 @@ export class ConfirmPage { } public showDescriptionPopup(tx) { - let message = 'Add description'; // TODO gettextCatalog + let message = this.translate.instant('Add description'); let opts = { defaultText: tx.description }; @@ -504,7 +508,7 @@ export class ConfirmPage { if (!tx || !wallet) return; if (this.paymentExpired) { - this.popupProvider.ionicAlert(null, 'This bitcoin payment request has expired.'); // TODO gettextCatalog + this.popupProvider.ionicAlert(null, this.translate.instant('This bitcoin payment request has expired.')); return; } @@ -526,9 +530,9 @@ export class ConfirmPage { let amount = (this.tx.amount / 1e8).toFixed(8); let unit = this.config.wallet.settings.unitName; let name = wallet.name; - let message = 'Sending ' + amount + ' ' + unit + ' from your ' + name + ' wallet'; // TODO gettextCatalog - let okText = 'Confirm'; // TODO gettextCatalog - let cancelText = 'Cancel'; // TODO gettextCatalog + let message = this.translate.instant('Sending {{amount}} {{unit}} from your {{name}} wallet', { amount: amount, unit: unit, name: name }); + let okText = this.translate.instant('Confirm'); + let cancelText = this.translate.instant('Cancel'); this.popupProvider.ionicConfirm(null, message, okText, cancelText).then((ok: boolean) => { return resolve(!ok); }); diff --git a/src/pages/settings/about/about.ts b/src/pages/settings/about/about.ts index 024f9f2f3..551ceda4c 100644 --- a/src/pages/settings/about/about.ts +++ b/src/pages/settings/about/about.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController } from 'ionic-angular'; import { Logger } from '../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //pages import { TermsOfUsePage } from './terms-of-use/terms-of-use'; @@ -23,7 +24,8 @@ export class AboutPage { private navCtrl: NavController, private app: AppProvider, private logger: Logger, - private externalLinkProvider: ExternalLinkProvider + private externalLinkProvider: ExternalLinkProvider, + private translate: TranslateService ) { } ionViewDidLoad() { @@ -40,10 +42,10 @@ export class AboutPage { public openExternalLink(): void { let url = 'https://github.com/bitpay/' + this.app.info.gitHubRepoName + '/tree/' + this.app.info.commitHash + ''; let optIn = true; - let title = 'Open GitHub Project'; //TODO gettextcatalog - let message = 'You can see the latest developments and contribute to this open source app by visiting our project on GitHub.'; //TODO gettextcatalog - let okText = 'Open GitHub'; //TODO gettextcatalog - let cancelText = 'Go Back'; //TODO gettextcatalog + let title = this.translate.instant('Open GitHub Project'); + let message = this.translate.instant('You can see the latest developments and contribute to this open source app by visiting our project on GitHub.'); + let okText = this.translate.instant('Open GitHub'); + let cancelText = this.translate.instant('Go Back'); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); } diff --git a/src/pages/settings/about/session-log/session-log.ts b/src/pages/settings/about/session-log/session-log.ts index a115806de..675c661ee 100644 --- a/src/pages/settings/about/session-log/session-log.ts +++ b/src/pages/settings/about/session-log/session-log.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { DOCUMENT } from "@angular/platform-browser"; import { Inject } from '@angular/core'; import { ActionSheetController, ToastController } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; //native import { SocialSharing } from '@ionic-native/social-sharing'; @@ -34,7 +35,8 @@ export class SessionLogPage { private socialSharing: SocialSharing, private actionSheetCtrl: ActionSheetController, private toastCtrl: ToastController, - private platformProvider: PlatformProvider + private platformProvider: PlatformProvider, + private translate: TranslateService ) { this.dom = dom; this.config = this.configProvider.get(); @@ -84,7 +86,7 @@ export class SessionLogPage { textarea.value = this.prepareLogs(); textarea.select(); this.dom.execCommand('copy'); - let message = 'Copied to clipboard' //TODO gettextcatalog + let message = this.translate.instant('Copied to clipboard'); let showSuccess = this.toastCtrl.create({ message: message, duration: 1000, @@ -107,8 +109,8 @@ export class SessionLogPage { public showOptionsMenu(): void { - let copyText = 'Copy to clipboard' //TODO gettextcatalog - let emailText = 'Send by email' //TODO gettextcatalog + let copyText = this.translate.instant('Copy to clipboard'); + let emailText = this.translate.instant('Send by email'); let button = []; if (this.isCordova) { diff --git a/src/pages/settings/addressbook/view/view.ts b/src/pages/settings/addressbook/view/view.ts index 0b25f4fc9..3b581399f 100644 --- a/src/pages/settings/addressbook/view/view.ts +++ b/src/pages/settings/addressbook/view/view.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; // Pages import { AmountPage } from '../../../../pages/send/amount/amount'; @@ -31,7 +32,8 @@ export class AddressbookViewPage { private bwcProvider: BwcProvider, private navCtrl: NavController, private navParams: NavParams, - private popupProvider: PopupProvider + private popupProvider: PopupProvider, + private translate: TranslateService ) { this.bitcoreCash = this.bwcProvider.getBitcoreCash(); this.address = this.navParams.data.contact.address; @@ -61,14 +63,14 @@ export class AddressbookViewPage { } public remove(addr: string): void { - var title = 'Warning!'; // Todo: gettextCatalog - var message = 'Are you sure you want to delete this contact?'; // Todo: gettextCatalog + var title = this.translate.instant('Warning!'); + var message = this.translate.instant('Are you sure you want to delete this contact?'); this.popupProvider.ionicConfirm(title, message, null, null).then((res: any) => { if (!res) return; this.addressBookProvider.remove(addr).then((ab) => { this.navCtrl.pop(); }).catch((err: any) => { - this.popupProvider.ionicAlert('Error', err); // Todo: gettextCatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), err); return; }); }); diff --git a/src/pages/settings/bitcoin-cash/bitcoin-cash.ts b/src/pages/settings/bitcoin-cash/bitcoin-cash.ts index d52b6f70b..787d7e12c 100644 --- a/src/pages/settings/bitcoin-cash/bitcoin-cash.ts +++ b/src/pages/settings/bitcoin-cash/bitcoin-cash.ts @@ -2,6 +2,7 @@ import { Component } from "@angular/core"; import { NavController } from 'ionic-angular'; import { Logger } from "../../../providers/logger/logger"; import * as lodash from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; // Providers import { WalletProvider } from "../../../providers/wallet/wallet"; @@ -39,6 +40,7 @@ export class BitcoinCashPage { private bwcErrorProvider: BwcErrorProvider, private bwcProvider: BwcProvider, private logger: Logger, + private translate: TranslateService ) { this.walletsBTC = this.profileProvider.getWallets({ coin: 'btc', @@ -66,13 +68,13 @@ export class BitcoinCashPage { lodash.each(this.walletsBTC, (w) => { if (w.credentials.derivationStrategy != 'BIP44') { - w.excludeReason = 'Non BIP44 wallet'; // TODO gettextcatalog + w.excludeReason = this.translate.instant('Non BIP44 wallet'); this.nonEligibleWallets.push(w); } else if (!w.canSign()) { - w.excludeReason = 'Read only wallet'; // TODO gettextcatalog + w.excludeReason = this.translate.instant('Read only wallet'); this.nonEligibleWallets.push(w); } else if (w.needsBackup) { - w.excludeReason = 'Backup needed'; // TODO gettextcatalog + w.excludeReason = this.translate.instant('Backup needed'); this.nonEligibleWallets.push(w); } else { this.availableWallets.push(w); @@ -94,9 +96,9 @@ export class BitcoinCashPage { openRecoveryToolLink(): void { let url = 'https://bitpay.github.io/copay-recovery/'; let optIn = true; - let title = 'Open the recovery tool'; //TODO gettextcatalog - let okText = 'Open'; //TODO gettextcatalog - let cancelText = 'Go Back'; //TODO gettextcatalog + let title = this.translate.instant('Open the recovery tool'); + let okText = this.translate.instant('Open'); + let cancelText = this.translate.instant('Go Back'); this.externalLinkProvider.open(url, optIn, title, null, okText, cancelText); } diff --git a/src/pages/settings/language/language.ts b/src/pages/settings/language/language.ts index f84b876c2..12120af43 100644 --- a/src/pages/settings/language/language.ts +++ b/src/pages/settings/language/language.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { NavController } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; //providers import { LanguageProvider } from '../../../providers/language/language'; @@ -17,7 +18,8 @@ export class LanguagePage { constructor( private navCtrl: NavController, private languageProvider: LanguageProvider, - private externalLinkProvider: ExternalLinkProvider + private externalLinkProvider: ExternalLinkProvider, + private translate: TranslateService ) { this.currentLanguage = this.languageProvider.getCurrent(); this.languages = this.languageProvider.getAvailables(); @@ -26,10 +28,10 @@ export class LanguagePage { public openExternalLink(): void { let url = 'https://crowdin.com/project/copay'; let optIn = true; - let title = 'Open Translation Community'; //TODO gettextcatalog - let message = 'You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!'; //TODO gettextcatalog - let okText = 'Open Crowdin'; //TODO gettextcatalog - let cancelText = 'Go Back'; //TODO gettextcatalog + let title = this.translate.instant('Open Translation Community'); + let message = this.translate.instant('You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!'); + let okText = this.translate.instant('Open Crowdin'); + let cancelText = this.translate.instant('Go Back'); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); } diff --git a/src/pages/settings/lock/lock.ts b/src/pages/settings/lock/lock.ts index 779f3fb6a..c3aacbf70 100644 --- a/src/pages/settings/lock/lock.ts +++ b/src/pages/settings/lock/lock.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { ModalController } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; //pages import { PinModalPage } from '../../pin/pin'; @@ -25,7 +26,8 @@ export class LockPage { private modalCtrl: ModalController, private configProvider: ConfigProvider, private touchIdProvider: TouchIdProvider, - private profileProvider: ProfileProvider + private profileProvider: ProfileProvider, + private translate: TranslateService ) { this.checkLockOptions(); } @@ -82,7 +84,7 @@ export class LockPage { let lock = { method: 'Disabled', value: null, bannedUntil: null }; this.configProvider.set({ lock }); this.checkLockOptions(); - }).catch(()=>{ + }).catch(() => { this.checkLockOptions(); }); } @@ -101,10 +103,10 @@ export class LockPage { }); if (singleLivenetWallet) { - this.needsBackupMsg = 'Backup your wallet before using this function'; //TODO gettextCatalog + this.needsBackupMsg = this.translate.instant('Backup your wallet before using this function'); return true; } else if (atLeastOneLivenetWallet) { - this.needsBackupMsg = 'Backup all your wallets before using this function'; //TODO gettextCatalog + this.needsBackupMsg = this.translate.instant('Backup all your wallets before using this function'); return true; } else { this.needsBackupMsg = null; diff --git a/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-addresses/wallet-addresses.ts b/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-addresses/wallet-addresses.ts index b0fc383d2..36204fc00 100644 --- a/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-addresses/wallet-addresses.ts +++ b/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-addresses/wallet-addresses.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams, ModalController } from 'ionic-angular'; import { Logger } from '../../../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { ProfileProvider } from '../../../../../providers/profile/profile'; @@ -50,7 +51,8 @@ export class WalletAddressesPage { private popupProvider: PopupProvider, private onGoingProcessProvider: OnGoingProcessProvider, private modalCtrl: ModalController, - private txFormatProvider: TxFormatProvider + private txFormatProvider: TxFormatProvider, + private translate: TranslateService ) { this.UNUSED_ADDRESS_LIMIT = 5; this.BALANCE_ADDRESS_LIMIT = 5; @@ -81,12 +83,12 @@ export class WalletAddressesPage { }).catch((err: any) => { this.logger.error(err); this.loading = false; - this.popupProvider.ionicAlert(this.bwcErrorProvider.msg(err, 'Could not update wallet')); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.bwcErrorProvider.msg(err, this.translate.instant('Could not update wallet'))); }); }).catch((err: any) => { this.logger.error(err); this.loading = false; - this.popupProvider.ionicAlert(this.bwcErrorProvider.msg(err, 'Could not update wallet')); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.bwcErrorProvider.msg(err, this.translate.instant('Could not update wallet'))); }); this.walletProvider.getLowUtxos(this.wallet).then((resp) => { @@ -124,7 +126,7 @@ export class WalletAddressesPage { this.walletProvider.getMainAddresses(this.wallet, { limit: 1 }).then((_addr: any) => { this.onGoingProcessProvider.set('generatingNewAddress', false); if (addr != _addr[0].address) { - this.popupProvider.ionicAlert('Error', 'New address could not be generated. Please try again.'); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), this.translate.instant('New address could not be generated. Please try again.')); return; } this.noBalance = [_addr[0]].concat(this.noBalance); @@ -133,7 +135,7 @@ export class WalletAddressesPage { }).catch((err) => { this.logger.error(err); this.onGoingProcessProvider.set('generatingNewAddress', false); - this.popupProvider.ionicAlert('Error', err); //TODO getextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), err); }); }).catch((err) => { this.logger.error(err); diff --git a/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete.ts b/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete.ts index 19e2e8f8b..23d6aaecc 100644 --- a/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete.ts +++ b/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { Logger } from '../../../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { ProfileProvider } from '../../../../../providers/profile/profile'; @@ -24,7 +25,8 @@ export class WalletDeletePage { private popupProvider: PopupProvider, private onGoingProcessProvider: OnGoingProcessProvider, private pushNotificationsProvider: PushNotificationsProvider, - private logger: Logger + private logger: Logger, + private translate: TranslateService ) { } @@ -39,14 +41,14 @@ export class WalletDeletePage { } public showDeletePopup(): void { - var title = 'Warning!'; //TODO gettextcatalog - var message = 'Are you sure you want to delete this wallet?'; //TODO gettextcatalog + let title = this.translate.instant('Warning!'); + let message = this.translate.instant('Are you sure you want to delete this wallet?'); this.popupProvider.ionicConfirm(title, message, null, null).then((res) => { if (res) this.deleteWallet(); }); }; - public deleteWallet() { + public deleteWallet(): void { this.onGoingProcessProvider.set('deletingWallet', true); this.profileProvider.deleteWalletClient(this.wallet).then(() => { this.onGoingProcessProvider.set('deletingWallet', false); @@ -54,7 +56,7 @@ export class WalletDeletePage { this.navCtrl.popToRoot(); this.navCtrl.parent.select(0); }).catch((err) => { - this.popupProvider.ionicAlert('Error', err.message || err);//TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), err.message || err); }); }; } \ No newline at end of file diff --git a/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-export/wallet-export.ts b/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-export/wallet-export.ts index 38c0bda16..054f1c79c 100644 --- a/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-export/wallet-export.ts +++ b/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-export/wallet-export.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams, ToastController } from 'ionic-angular'; import { Logger } from '../../../../../providers/logger/logger'; import { Validators, FormBuilder, FormGroup } from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; //native import { SocialSharing } from '@ionic-native/social-sharing'; @@ -52,7 +53,8 @@ export class WalletExportPage { private socialSharing: SocialSharing, private appProvider: AppProvider, private clipboard: Clipboard, - public toastCtrl: ToastController + public toastCtrl: ToastController, + private translate: TranslateService ) { this.exportWalletForm = this.formBuilder.group({ password: ['', Validators.required], @@ -121,10 +123,10 @@ export class WalletExportPage { this.segments = 'qrCode'; }).catch((err: string) => { - this.popupProvider.ionicAlert('Error', err); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), err); }); }).catch((err: string) => { - this.popupProvider.ionicAlert('Error', err); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), err); }); }; @@ -158,13 +160,13 @@ export class WalletExportPage { this.navCtrl.popToRoot(); this.navCtrl.parent.select(0); }).catch((err: string) => { - this.popupProvider.ionicAlert('Error', 'Failed to export'); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), this.translate.instant('Failed to export')); }); }).catch(() => { - this.popupProvider.ionicAlert('Error', 'Failed to export'); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), this.translate.instant('Failed to export')); }); }).catch((err: string) => { - this.popupProvider.ionicAlert('Error', err); + this.popupProvider.ionicAlert(this.translate.instant('Error'), err); }); } @@ -197,15 +199,15 @@ export class WalletExportPage { var ew = this.backupProvider.walletExport(this.exportWalletForm.value.password, opts, this.navParams.data.walletId); if (!ew) { - this.popupProvider.ionicAlert('Error', 'Failed to export'); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), this.translate.instant('Failed to export')); } return resolve(ew); }).catch((err: string) => { - this.popupProvider.ionicAlert('Error', 'Failed to export'); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), this.translate.instant('Failed to export')); return resolve(); }); }).catch((err: string) => { - this.popupProvider.ionicAlert('Error', err); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), err); return resolve(); });; }); @@ -224,7 +226,7 @@ export class WalletExportPage { var ew = backup; if (!ew) return; this.clipboard.copy(ew); - let copyMessage = 'Copied to clipboard' //TODO gettextcatalog + let copyMessage = this.translate.instant('Copied to clipboard'); let showSuccess = this.toastCtrl.create({ message: copyMessage, duration: 1000, @@ -234,7 +236,7 @@ export class WalletExportPage { }; public sendWalletBackup(): void { - let preparingMessage = 'Preparing backup...' //TODO gettextcatalog + let preparingMessage = this.translate.instant('Preparing backup...'); let showSuccess = this.toastCtrl.create({ message: preparingMessage, duration: 1000, diff --git a/src/pages/settings/wallet-settings/wallet-settings.ts b/src/pages/settings/wallet-settings/wallet-settings.ts index 402dd14c5..1ef7c6974 100644 --- a/src/pages/settings/wallet-settings/wallet-settings.ts +++ b/src/pages/settings/wallet-settings/wallet-settings.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { Logger } from '../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { ProfileProvider } from '../../../providers/profile/profile'; @@ -42,6 +43,7 @@ export class WalletSettingsPage { private navCtrl: NavController, private navParams: NavParams, private touchIdProvider: TouchIdProvider, + private translate: TranslateService ) { } @@ -98,9 +100,9 @@ export class WalletSettingsPage { let url = 'https://github.com/bitpay/copay/wiki/COPAY---FAQ#what-the-spending-password-does'; let optIn = true; let title = null; - let message = 'Read more in our Wiki'; //TODO gettextcatalog - let okText = 'Open';//TODO gettextcatalog - let cancelText = 'Go Back';//TODO gettextcatalog + let message = this.translate.instant('Read more in our Wiki'); //TODO gettextcatalog + let okText = this.translate.instant('Open');//TODO gettextcatalog + let cancelText = this.translate.instant('Go Back');//TODO gettextcatalog this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); } diff --git a/src/pages/success/success.ts b/src/pages/success/success.ts index 195cee07c..4e78ed39d 100644 --- a/src/pages/success/success.ts +++ b/src/pages/success/success.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { ViewController, NavParams } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'page-success', @@ -12,9 +13,10 @@ export class SuccessModalPage { constructor( private viewCtrl: ViewController, - private navParams: NavParams + private navParams: NavParams, + private translate: TranslateService ) { - this.successText = this.navParams.data.successText ? this.navParams.data.successText : 'Payment Sent'; + this.successText = this.navParams.data.successText ? this.navParams.data.successText : this.translate.instant('Payment Sent'); this.successComment = this.navParams.data.successComment ? this.navParams.data.successComment : ''; } diff --git a/src/pages/tx-details/tx-details.ts b/src/pages/tx-details/tx-details.ts index f349c6cbf..1b66332d9 100644 --- a/src/pages/tx-details/tx-details.ts +++ b/src/pages/tx-details/tx-details.ts @@ -2,6 +2,7 @@ import { Component } from "@angular/core"; import { NavController, NavParams, Events } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; import * as _ from "lodash"; +import { TranslateService } from '@ngx-translate/core'; // Providers import { AddressBookProvider } from '../../providers/address-book/address-book'; @@ -50,12 +51,13 @@ export class TxDetailsPage { private profileProvider: ProfileProvider, private txConfirmNotificationProvider: TxConfirmNotificationProvider, private txFormatProvider: TxFormatProvider, - private walletProvider: WalletProvider + private walletProvider: WalletProvider, + private translate: TranslateService ) { this.config = this.configProvider.get(); this.txId = this.navParams.data.txid; - this.title = 'Transaction'; // Todo: gettextCatalog + this.title = this.translate.instant('Transaction'); this.wallet = this.profileProvider.getWallet(this.navParams.data.walletId); this.color = this.wallet.color; this.copayerId = this.wallet.credentials.copayerId; @@ -95,9 +97,9 @@ export class TxDetailsPage { let url = 'https://github.com/bitpay/copay/wiki/COPAY---FAQ#amount-too-low-to-spend'; let optIn = true; let title = null; - let message = 'Read more in our Wiki'; // Todo: gettextCatalog - let okText = 'Open'; // Todo: gettextCatalog - let cancelText = 'Go Back'; // Todo: gettextCatalog + let message = this.translate.instant('Read more in our Wiki'); + let okText = this.translate.instant('Open'); + let cancelText = this.translate.instant('Go Back'); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); } @@ -116,10 +118,10 @@ export class TxDetailsPage { if (this.btx.action != 'sent' && this.btx.action != 'moved' || !this.isShared) return; let actionDescriptions = { - created: 'Proposal Created', // Todo: gettextCatalog - accept: 'Accepted', // Todo: gettextCatalog - reject: 'Rejected', // Todo: gettextCatalog - broadcasted: 'Broadcasted' // Todo: gettextCatalog + created: this.translate.instant('Proposal Created'), + accept: this.translate.instant('Accepted'), + reject: this.translate.instant('Rejected'), + broadcasted: this.translate.instant('Broadcasted') }; this.actionList.push({ @@ -163,9 +165,9 @@ export class TxDetailsPage { this.btx.feeRateStr = (this.btx.fees / (this.btx.amount + this.btx.fees) * 100).toFixed(2) + '%'; if (this.btx.action != 'invalid') { - if (this.btx.action == 'sent') this.title = 'Sent Funds'; // Todo: gettextCatalog - if (this.btx.action == 'received') this.title = 'Received Funds'; // Todo: gettextCatalog - if (this.btx.action == 'moved') this.title = 'Moved Funds'; // Todo: gettextCatalog + if (this.btx.action == 'sent') this.title = this.translate.instant('Sent Funds'); + if (this.btx.action == 'received') this.title = this.translate.instant('Received Funds'); + if (this.btx.action == 'moved') this.title = this.translate.instant('Moved Funds'); } this.updateMemo(); @@ -183,7 +185,7 @@ export class TxDetailsPage { if (!opts.hideLoading) this.onGoingProcess.set('loadingTxInfo', false); this.logger.warn('Error getting transaction: ' + err); this.navCtrl.pop(); - return this.popupProvider.ionicAlert('Error', 'Transaction not available at this time'); // Todo: gettextCatalog + return this.popupProvider.ionicAlert('Error', this.translate.instant('Transaction not available at this time')); }); } @@ -194,7 +196,7 @@ export class TxDetailsPage { } if (this.btx.note && this.btx.note.body) opts.defaultText = this.btx.note.body; - this.popupProvider.ionicPrompt(this.wallet.name, 'Memo', opts).then((text: string) => { // Todo: gettextCatalog + this.popupProvider.ionicPrompt(this.wallet.name, this.translate.instant('Memo'), opts).then((text: string) => { if (typeof text == "undefined") return; this.btx.note = { @@ -220,9 +222,9 @@ export class TxDetailsPage { let url = 'https://' + (this.getShortNetworkName() == 'test' ? 'test-' : '') + this.blockexplorerUrl + '/tx/' + btx.txid; let optIn = true; let title = null; - let message = 'View Transaction on Insight'; // Todo: gettextCatalog - let okText = 'Open Insight'; // Todo: gettextCatalog - let cancelText = 'Go Back'; // Todo: gettextCatalog + let message = this.translate.instant('View Transaction on Insight'); + let okText = this.translate.instant('Open Insight'); + let cancelText = this.translate.instant('Go Back'); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); } diff --git a/src/pages/txp-details/txp-details.ts b/src/pages/txp-details/txp-details.ts index ec67067ae..e0c1a825c 100644 --- a/src/pages/txp-details/txp-details.ts +++ b/src/pages/txp-details/txp-details.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { NavParams, Events, ViewController } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; //providers import { PlatformProvider } from '../../providers/platform/platform'; @@ -52,7 +53,8 @@ export class TxpDetailsPage { private viewCtrl: ViewController, private configProvider: ConfigProvider, private profileProvider: ProfileProvider, - private txFormatProvider: TxFormatProvider + private txFormatProvider: TxFormatProvider, + private translate: TranslateService ) { let config = this.configProvider.get().wallet; this.tx = this.navParams.data.tx; @@ -118,18 +120,18 @@ export class TxpDetailsPage { if (lastSigner) { if (this.isCordova && !this.isWindowsPhoneApp) { - this.buttonText = 'Slide to send'; //TODO gettextcatalog + this.buttonText = this.translate.instant('Slide to send'); } else { - this.buttonText = 'Click to send';//TODO gettextcatalog + this.buttonText = this.translate.instant('Click to send'); } - this.successText = 'Payment Sent';//TODO gettextcatalog + this.successText = this.translate.instant('Payment Sent'); } else { if (this.isCordova && !this.isWindowsPhoneApp) { - this.buttonText = 'Slide to accept';//TODO gettextcatalog + this.buttonText = this.translate.instant('Slide to accept'); } else { - this.buttonText = 'Click to accept';//TODO gettextcatalog + this.buttonText = this.translate.instant('Click to accept'); } - this.successText = 'Payment Accepted';//TODO gettextcatalog + this.successText = this.translate.instant('Payment Accepted'); } } @@ -139,10 +141,10 @@ export class TxpDetailsPage { if (!this.isShared) return; var actionDescriptions = { - created: 'Proposal Created', //TODO gettextcatalog - accept: 'Accepted', //TODO gettextcatalog - reject: 'Rejected', //TODO gettextcatalog - broadcasted: 'Broadcasted', //TODO gettextcatalog + created: this.translate.instant('Proposal Created'), + accept: this.translate.instant('Accepted'), + reject: this.translate.instant('Rejected'), + broadcasted: this.translate.instant('Broadcasted'), }; this.actionList.push({ @@ -203,7 +205,7 @@ export class TxpDetailsPage { private setError(err: any, prefix: string): void { this.loading = false; - this.popupProvider.ionicAlert('Error', this.bwcError.msg(err, prefix)); //TODO gettextcatalog + this.popupProvider.ionicAlert(this.translate.instant('Error'), this.bwcError.msg(err, prefix)); } public sign(): void { @@ -212,27 +214,27 @@ export class TxpDetailsPage { this.events.publish('UpdateTx'); //this.success(); TODO }).catch((err: any) => { - this.setError(err, 'Could not send payment'); //TODO gettextcatalog + this.setError(err, ('Could not send payment')); }); } public reject(txp: any): void { - let title = 'Warning!'; //TODO gettextcatalog - let msg = 'Are you sure you want to reject this transaction?'; //TODO gettextcatalog + let title = this.translate.instant('Warning!'); + let msg = this.translate.instant('Are you sure you want to reject this transaction?'); this.popupProvider.ionicConfirm(title, msg, null, null).then((res: boolean) => { if (!res) return this.loading = true; this.walletProvider.reject(this.wallet, this.tx).then((txpr) => { this.close(); }).catch((err: any) => { - this.setError(err, 'Could not reject payment'); //TODO gettextcatalog + this.setError(err, this.translate.instant('Could not reject payment')); }); }); } public remove(): void { - let title = 'Warning!'; //TODO gettextcatalog - let msg = 'Are you sure you want to remove this transaction?'; //TODO gettextcatalog + let title = this.translate.instant('Warning!'); + let msg = this.translate.instant('Are you sure you want to remove this transaction?'); this.popupProvider.ionicConfirm(title, msg, null, null).then((res: boolean) => { if (!res) return; this.onGoingProcessProvider.set('removeTx', true); @@ -242,7 +244,7 @@ export class TxpDetailsPage { }).catch((err: any) => { if (err && !(err.message && err.message.match(/Unexpected/))) { this.events.publish('UpdateTx'); - this.setError(err, 'Could not delete payment proposal'); //TODO gettextcatalog + this.setError(err, this.translate.instant('Could not delete payment proposal')); } }); }); diff --git a/src/pages/wallet-details/wallet-details.ts b/src/pages/wallet-details/wallet-details.ts index 4a625e379..83db926de 100644 --- a/src/pages/wallet-details/wallet-details.ts +++ b/src/pages/wallet-details/wallet-details.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams, Events } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; //providers import { WalletProvider } from '../../providers/wallet/wallet'; @@ -49,7 +50,8 @@ export class WalletDetailsPage { private bwcError: BwcErrorProvider, private events: Events, private logger: Logger, - private timeProvider: TimeProvider + private timeProvider: TimeProvider, + private translate: TranslateService ) { let clearCache = this.navParams.data.clearCache; this.wallet = this.profileProvider.getWallet(this.navParams.data.walletId); @@ -133,7 +135,7 @@ export class WalletDetailsPage { this.updateTxHistoryError = false; this.updatingTxHistoryProgress = 0; - let progressFn = (function(txs, newTxs) { + let progressFn = (function (txs, newTxs) { if (newTxs > 5) this.thistory = null; this.updatingTxHistoryProgress = newTxs; }).bind(this); @@ -192,7 +194,7 @@ export class WalletDetailsPage { if (err === 'WALLET_NOT_REGISTERED') { this.walletNotRegistered = true; } else { - this.updateStatusError = this.bwcError.msg(err, 'Could not update wallet'); // TODO: translate + this.updateStatusError = this.bwcError.msg(err, this.translate.instant('Could not update wallet')); } this.wallet.status = null; }); diff --git a/src/providers/profile/profile.ts b/src/providers/profile/profile.ts index 7a28cf554..9895e2f3b 100644 --- a/src/providers/profile/profile.ts +++ b/src/providers/profile/profile.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Events } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; import * as _ from 'lodash'; //providers @@ -38,7 +39,8 @@ export class ProfileProvider { private languageProvider: LanguageProvider, private events: Events, private popupProvider: PopupProvider, - private onGoingProcessProvider: OnGoingProcessProvider + private onGoingProcessProvider: OnGoingProcessProvider, + private translate: TranslateService ) { this.throttledBwsEvent = _.throttle((n, wallet) => { this.newBwsEvent(n, wallet); @@ -311,7 +313,7 @@ export class ProfileProvider { password: opts.password }); } catch (err) { - return reject('Could not import. Check input file and spending password'); // TODO getTextCatalog + return reject(this.translate.instant('Could not import. Check input file and spending password')); } let strParsed: any = JSON.parse(str); @@ -351,10 +353,10 @@ export class ProfileProvider { private showWarningNoEncrypt(): Promise { return new Promise((resolve, reject) => { - let title = 'Are you sure?'; //TODO gettextcatalog - let msg = 'Your wallet keys will be stored in plan text in this device, if an other app access the store it will be able to access your Bitcoin'; //TODO gettextcatalog - let okText = 'Yes'; //TODO gettextcatalog - let cancelText = 'No'; //TODO gettextcatalog + let title = this.translate.instant('Are you sure?'); + let msg = this.translate.instant('Your wallet keys will be stored in plan text in this device, if an other app access the store it will be able to access your Bitcoin'); + let okText = this.translate.instant('Yes'); + let cancelText = this.translate.instant('No'); this.popupProvider.ionicConfirm(title, msg, okText, cancelText).then((res: any) => { return resolve(res); }); @@ -363,19 +365,19 @@ export class ProfileProvider { private encrypt(wallet: any): Promise { return new Promise((resolve, reject) => { - let title = 'Please enter a password to encrypt your wallet keys on this device storage'; //TODO gettextcatalog - let warnMsg = 'Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down.'; //TODO gettextcatalog + let title = this.translate.instant('Please enter a password to encrypt your wallet keys on this device storage'); + let warnMsg = this.translate.instant('Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down.'); this.askPassword(warnMsg, title).then((password: string) => { if (!password) { this.showWarningNoEncrypt().then((res: any) => { - if (res) return resolve(); //TODO gettextcatalog + if (res) return resolve(); this.encrypt(wallet).then(() => { return resolve(); }); }); } else { - title = 'Confirm your new spending password'; //TODO gettextcatalog + title = this.translate.instant('Confirm your new spending password'); this.askPassword(warnMsg, title).then((password2: string) => { if (!password2 || password != password2) { this.encrypt(wallet).then(() => { @@ -395,7 +397,7 @@ export class ProfileProvider { private addAndBindWalletClient(wallet: any, opts: any): Promise { return new Promise((resolve, reject) => { if (!wallet || !wallet.credentials) { - return reject('Could not access wallet'); // TODO gettextCatalog + return reject(this.translate.instant('Could not access wallet')); } // Encrypt wallet @@ -406,7 +408,8 @@ export class ProfileProvider { let walletId: string = wallet.credentials.walletId if (!this.profile.addWallet(JSON.parse(wallet.export()))) { - return reject("Wallet already in " + this.appProvider.info.nameCase); // TODO gettextCatalog + let message = this.translate.instant("Wallet already in {{nameCase}}", { nameCase: this.appProvider.info.nameCase }); + return reject(message); } let skipKeyValidation: boolean = this.shouldSkipValidation(walletId); @@ -521,7 +524,7 @@ export class ProfileProvider { return reject(err); } - this.bwcErrorProvider.cb(err, 'Could not import').then((msg: string) => { //TODO getTextCatalog + this.bwcErrorProvider.cb(err, this.translate.instant('Could not import')).then((msg: string) => { return reject(msg); }); @@ -555,7 +558,7 @@ export class ProfileProvider { if (err instanceof this.errors.NOT_AUTHORIZED) err.name = 'WALLET_DOES_NOT_EXIST'; - this.bwcErrorProvider.cb(err, 'Could not import').then((msg: string) => { //TODO getTextCatalog + this.bwcErrorProvider.cb(err, this.translate.instant('Could not import')).then((msg: string) => { return reject(msg); }); @@ -708,7 +711,7 @@ export class ProfileProvider { } catch (ex) { this.logger.info(ex); - return reject('Could not create: Invalid wallet recovery phrase'); // TODO getTextCatalog + return reject(this.translate.instant('Could not create: Invalid wallet recovery phrase')); } } else if (opts.extendedPrivateKey) { try { @@ -720,7 +723,7 @@ export class ProfileProvider { }); } catch (ex) { this.logger.warn(ex); - return reject('Could not create using the specified extended private key'); // TODO GetTextCatalog + return reject(this.translate.instant('Could not create using the specified extended private key')); } } else if (opts.extendedPublicKey) { try { @@ -732,7 +735,7 @@ export class ProfileProvider { walletClient.credentials.hwInfo = opts.hwInfo; } catch (ex) { this.logger.warn("Creating wallet from Extended Public Key Arg:", ex, opts); - return reject('Could not create using the specified extended public key'); // TODO GetTextCatalog + return reject(this.translate.instant('Could not create using the specified extended public key')); } } else { let lang = this.languageProvider.getCurrent(); @@ -775,8 +778,8 @@ export class ProfileProvider { setTimeout(() => { this.seedWallet(opts).then((walletClient: any) => { - let name = opts.name || 'Personal Wallet'; // TODO GetTextCatalog - let myName = opts.myName || 'me'; // TODO GetTextCatalog + let name = opts.name || this.translate.instant('Personal Wallet'); + let myName = opts.myName || this.translate.instant('me'); walletClient.createWallet(name, myName, opts.m, opts.n, { network: opts.networkName, @@ -785,7 +788,7 @@ export class ProfileProvider { coin: opts.coin }, (err: any, secret: any) => { if (err) { - this.bwcErrorProvider.cb(err, 'Error creating wallet').then((msg: string) => { //TODO getTextCatalog + this.bwcErrorProvider.cb(err, this.translate.instant('Error creating wallet')).then((msg: string) => { return reject(msg); }); } else { @@ -826,11 +829,11 @@ export class ProfileProvider { if (_.find(this.profile.credentials, { 'walletId': walletData.walletId })) { - return reject('Cannot join the same wallet more that once'); // TODO getTextCatalog + return reject(this.translate.instant('Cannot join the same wallet more that once')); } } catch (ex) { this.logger.debug(ex); - return reject('Bad wallet invitation'); // TODO getTextCatalog + return reject(this.translate.instant('Bad wallet invitation')); } opts.networkName = walletData.network; this.logger.debug('Joining Wallet:', opts); @@ -840,7 +843,7 @@ export class ProfileProvider { coin: opts.coin }, (err: any) => { if (err) { - this.bwcErrorProvider.cb(err, 'Could not join wallet').then((msg: string) => { //TODO getTextCatalog + this.bwcErrorProvider.cb(err, this.translate.instant('Could not join wallet')).then((msg: string) => { return reject(msg); }); } else { diff --git a/src/providers/wallet/wallet.ts b/src/providers/wallet/wallet.ts index a7fb37b2d..55bbe02fb 100644 --- a/src/providers/wallet/wallet.ts +++ b/src/providers/wallet/wallet.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { Events } from 'ionic-angular'; import { Logger } from '../../providers/logger/logger'; import * as lodash from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; // Providers import { ConfigProvider } from '../config/config'; @@ -51,7 +52,8 @@ export class WalletProvider { private ongoingProcess: OnGoingProcessProvider, private touchidProvider: TouchIdProvider, private events: Events, - private feeProvider: FeeProvider + private feeProvider: FeeProvider, + private translate: TranslateService ) { this.logger.info('WalletService initialized.'); } @@ -368,7 +370,7 @@ export class WalletProvider { wallet.createAddress({}, (err, addr) => { if (err) { - let prefix = 'Could not create address'; //TODO Gettextcatalog + let prefix = this.translate.instant('Could not create address'); if (err instanceof this.errors.CONNECTION_ERROR || (err.message && err.message.match(/5../))) { this.logger.warn(err); return setTimeout(() => { @@ -935,7 +937,7 @@ export class WalletProvider { wallet.savePreferences(prefs, (err: any) => { if (err) { - this.popupProvider.ionicAlert(this.bwcErrorProvider.msg(err, 'Could not save preferences on the server')); //TODO Gettextcatalog + this.popupProvider.ionicAlert(this.bwcErrorProvider.msg(err, this.translate.instant('Could not save preferences on the server'))); return reject(err); } @@ -1091,13 +1093,13 @@ export class WalletProvider { public encrypt(wallet: any): Promise { return new Promise((resolve, reject) => { - var title = 'Enter new spending password'; //TODO gettextcatalog - var warnMsg = 'Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down.'; //TODO gettextcatalog + var title = this.translate.instant('Enter new spending password'); + var warnMsg = this.translate.instant('Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down.'); this.askPassword(warnMsg, title).then((password: string) => { - if (!password) return reject('no password'); //TODO gettextcatalog - title = 'Confirm your new spending password'; //TODO gettextcatalog + if (!password) return reject(this.translate.instant('no password')); + title = this.translate.instant('Confirm your new spending password'); this.askPassword(warnMsg, title).then((password2: string) => { - if (!password2 || password != password2) return reject('password mismatch'); + if (!password2 || password != password2) return reject(this.translate.instant('password mismatch')); wallet.encryptPrivateKey(password); return resolve(); }).catch((err) => { @@ -1112,8 +1114,8 @@ export class WalletProvider { public decrypt(wallet: any): Promise { return new Promise((resolve, reject) => { this.logger.debug('Disabling private key encryption for' + wallet.name); - this.askPassword(null, 'Enter Spending Password').then((password: string) => { //TODO gettextcatalog - if (!password) return reject('no password'); + this.askPassword(null, this.translate.instant('Enter Spending Password')).then((password: string) => { + if (!password) return reject(this.translate.instant('no password')); try { wallet.decryptPrivateKey(password); } catch (e) { @@ -1127,9 +1129,9 @@ export class WalletProvider { public handleEncryptedWallet(wallet: any): Promise { return new Promise((resolve, reject) => { if (!this.isEncrypted(wallet)) return resolve(); - this.askPassword(wallet.name, 'Enter Spending Password').then((password: string) => { //TODO gettextcatalog - if (!password) return reject('No password'); - if (!wallet.checkPassword(password)) return reject('Wrong password'); + this.askPassword(wallet.name, this.translate.instant('Enter Spending Password')).then((password: string) => { + if (!password) return reject(this.translate.instant('No password')); + if (!wallet.checkPassword(password)) return reject(this.translate.instant('Wrong password')); return resolve(password); }); }); @@ -1199,7 +1201,7 @@ export class WalletProvider { }; }).catch((err) => { this.logger.warn('sign error:' + err); - let msg = err && err.message ? err.message : 'The payment was created but could not be completed. Please try again from home screen'; //TODO gettextcatalog + let msg = err && err.message ? err.message : this.translate.instant('The payment was created but could not be completed. Please try again from home screen'); this.events.publish('Local/TxAction', wallet.id); return reject(msg); }); @@ -1252,7 +1254,7 @@ export class WalletProvider { // not supported yet if (wallet.credentials.derivationStrategy != 'BIP44' || !wallet.canSign()) - return reject('Exporting via QR not supported for this wallet'); //TODO gettextcatalog + return reject(this.translate.instant('Exporting via QR not supported for this wallet')); var keys = this.getKeysWithPassword(wallet, password); From c6552aaba0c684f8e6385c011f18328e7bf45ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Fri, 2 Feb 2018 13:08:57 -0300 Subject: [PATCH 4/7] fixes --- .../coinbase/sell-coinbase/sell-coinbase.ts | 2 +- .../glidera-settings/glidera-settings.ts | 2 +- .../buy-mercado-libre/buy-mercado-libre.ts | 44 +++++++++---------- .../mercado-libre-card-details.ts | 6 +-- .../wallet-settings/wallet-settings.ts | 6 +-- src/providers/profile/profile.ts | 2 +- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/pages/integrations/coinbase/sell-coinbase/sell-coinbase.ts b/src/pages/integrations/coinbase/sell-coinbase/sell-coinbase.ts index 1f1e68be8..35a9e7d59 100644 --- a/src/pages/integrations/coinbase/sell-coinbase/sell-coinbase.ts +++ b/src/pages/integrations/coinbase/sell-coinbase/sell-coinbase.ts @@ -103,7 +103,7 @@ export class SellCoinbasePage { private publishAndSign(wallet: any, txp: any): Promise { return new Promise((resolve, reject) => { if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { - let err = 'No signing proposal: No private key'; // TODO: gettextCatalog + let err = 'No signing proposal: No private key'; this.logger.info(err); return reject(err); } diff --git a/src/pages/integrations/glidera/glidera-settings/glidera-settings.ts b/src/pages/integrations/glidera/glidera-settings/glidera-settings.ts index 526731fb7..82eeb26fc 100644 --- a/src/pages/integrations/glidera/glidera-settings/glidera-settings.ts +++ b/src/pages/integrations/glidera/glidera-settings/glidera-settings.ts @@ -36,7 +36,7 @@ export class GlideraSettingsPage { } private showErrorAndBack(title: string, msg: any) { - title = title ? title : 'Error'; // TODO: gettextCatalog + title = title ? title : 'Error'; this.logger.error(msg); msg = (msg && msg.errors) ? msg.errors[0].message : msg; this.popupProvider.ionicAlert(title, msg).then(() => { diff --git a/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts b/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts index 0b880ba18..2189cc8b1 100644 --- a/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts +++ b/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams, ModalController, Events } from 'ionic-angular'; import { Logger } from '../../../../providers/logger/logger'; +import { TranslateService } from '@ngx-translate/core'; import * as _ from 'lodash'; import * as moment from 'moment'; @@ -64,7 +65,8 @@ export class BuyMercadoLibrePage { private popupProvider: PopupProvider, private profileProvider: ProfileProvider, private txFormatProvider: TxFormatProvider, - private walletProvider: WalletProvider + private walletProvider: WalletProvider, + private translate: TranslateService ) { this.FEE_TOO_HIGH_LIMIT_PER = 15; this.coin = 'btc'; @@ -81,7 +83,7 @@ export class BuyMercadoLibrePage { this.currency = this.navParams.data.currency.toUpperCase(); if (this.amount > 2000 || this.amount < 50) { - this.showErrorAndBack(null, 'Purchase amount must be a value between 50 and 2000'); // TODO: gettextCatalog + this.showErrorAndBack(null, this.translate.instant('Purchase amount must be a value between 50 and 2000')); return; } @@ -92,7 +94,7 @@ export class BuyMercadoLibrePage { coin: this.coin }); if (_.isEmpty(this.wallets)) { - this.showErrorAndBack(null, 'No wallets available'); // TODO: gettextCatalog + this.showErrorAndBack(null, this.translate.instant('No wallets available')); return; } this.onWalletSelect(this.wallets[0]); // Default first wallet @@ -117,7 +119,7 @@ export class BuyMercadoLibrePage { } private showErrorAndBack(title: string, msg: any) { - title = title ? title : 'Error'; // TODO: gettextCatalog + title = title ? title : this.translate.instant('Error'); this.logger.error(msg); msg = (msg && msg.errors) ? msg.errors[0].message : msg; this.popupProvider.ionicAlert(title, msg).then(() => { @@ -127,7 +129,7 @@ export class BuyMercadoLibrePage { private showError = function (title: string, msg: any): Promise { return new Promise((resolve, reject) => { - title = title || 'Error'; // TODO: gettextCatalog + title = title || this.translate.instant('Error'); this.logger.error(msg); msg = (msg && msg.errors) ? msg.errors[0].message : msg; this.popupProvider.ionicAlert(title, msg).then(() => { @@ -139,7 +141,7 @@ export class BuyMercadoLibrePage { private publishAndSign(wallet: any, txp: any): Promise { return new Promise((resolve, reject) => { if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { - let err = 'No signing proposal: No private key'; // TODO: gettextCatalog + let err = this.translate.instant('No signing proposal: No private key'); this.logger.info(err); return reject(err); } @@ -179,15 +181,15 @@ export class BuyMercadoLibrePage { return new Promise((resolve, reject) => { this.mercadoLibreProvider.createBitPayInvoice(data, (err: any, dataInvoice: any) => { if (err) { - let err_title = 'Error creating the invoice'; // TODO: gettextCatalog + let err_title = this.translate.instant('Error creating the invoice'); let err_msg; if (err && err.message && err.message.match(/suspended/i)) { - err_title = 'Service not available'; // TODO: gettextCatalog - err_msg = 'Mercadolibre Gift Card Service is not available at this moment. Please try back later.'; // TODO: gettextCatalog + err_title = this.translate.instant('Service not available'); + err_msg = this.translate.instant('Mercadolibre Gift Card Service is not available at this moment. Please try back later.'); } else if (err && err.message) { err_msg = err.message; } else { - err_msg = 'Could not access Gift Card Service'; // TODO: gettextCatalog + err_msg = this.translate.instant('Could not access Gift Card Service'); }; return reject({ @@ -200,14 +202,14 @@ export class BuyMercadoLibrePage { if (!accessKey) { return reject({ - message: 'No access key defined' // TODO: gettextCatalog + message: this.translate.instant('No access key defined') }); } this.mercadoLibreProvider.getBitPayInvoice(dataInvoice.invoiceId, (err: any, invoice: any) => { if (err) { return reject({ - message: 'Could not get the invoice' // TODO: gettextCatalog + message: this.translate.instant('Could not get the invoice') }); } @@ -223,8 +225,8 @@ export class BuyMercadoLibrePage { if (!payProUrl) { return reject({ - title: 'Error in Payment Protocol', // TODO: gettextCatalog - message: 'Invalid URL' // TODO: gettextCatalog + title: this.translate.instant('Error in Payment Protocol'), + message: this.translate.instant('Invalid URL') }); } @@ -252,7 +254,7 @@ export class BuyMercadoLibrePage { return resolve(ctxp); }).catch((err: any) => { return reject({ - title: 'Could not create transaction', // TODO: gettextCatalog + title: this.translate.instant('Could not create transaction'), message: this.bwcErrorProvider.msg(err) }); }); @@ -323,7 +325,7 @@ export class BuyMercadoLibrePage { invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0; let invoiceFeeSat = parseInt((invoice.buyerPaidBtcMinerFee * 100000000).toFixed()); - this.message = this.amountUnitStr + " for Mercado Livre Brazil Gift Car"; // TODO: gettextCatalog + this.message = this.translate.instant(this.amountUnitStr + " for Mercado Livre Brazil Gift Car"); this.createTx(wallet, invoice, this.message).then((ctxp: any) => { this.onGoingProcessProvider.set('loadingTxInfo', false); @@ -363,13 +365,11 @@ export class BuyMercadoLibrePage { public buyConfirm() { if (!this.createdTx) { - this.showError(null, 'Transaction has not been created'); // TODO: gettextCatalog + this.showError(null, this.translate.instant('Transaction has not been created')); return; } - var title = 'Confirm'; // TODO: gettextCatalog - var okText = 'OK'; // TODO: gettextCatalog - var cancelText = 'Cancel'; // TODO: gettextCatalog - this.popupProvider.ionicConfirm(title, this.message, okText, cancelText).then((ok) => { + var title = this.translate.instant('Confirm'); + this.popupProvider.ionicConfirm(title, this.message).then((ok) => { if (!ok) { return; } @@ -379,7 +379,7 @@ export class BuyMercadoLibrePage { this.checkTransaction(1, this.createdTx.giftData); }).catch((err: any) => { this._resetValues(); - this.showError('Could not send transaction', err); // TODO: gettextCatalog + this.showError(this.translate.instant('Could not send transaction'), err); return; }); }); diff --git a/src/pages/integrations/mercado-libre/mercado-libre-card-details/mercado-libre-card-details.ts b/src/pages/integrations/mercado-libre/mercado-libre-card-details/mercado-libre-card-details.ts index 480c1cded..1092889bc 100644 --- a/src/pages/integrations/mercado-libre/mercado-libre-card-details/mercado-libre-card-details.ts +++ b/src/pages/integrations/mercado-libre/mercado-libre-card-details/mercado-libre-card-details.ts @@ -56,9 +56,9 @@ export class MercadoLibreCardDetailsPage { let url = 'https://help.bitpay.com/requestHelp'; let optIn = true; let title = null; - let message = 'Help and support information is available at the website.'; //TODO: getTextCatalog - let okText = 'Open'; //TODO: getTextCatalog - let cancelText = 'Go Back'; //TODO: getTextCatalog + let message = 'A informação de ajuda e suporte está disponível no site.'; + let okText = 'Abrir'; + let cancelText = 'Volte'; this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); }; diff --git a/src/pages/settings/wallet-settings/wallet-settings.ts b/src/pages/settings/wallet-settings/wallet-settings.ts index 1ef7c6974..1abf9f9e8 100644 --- a/src/pages/settings/wallet-settings/wallet-settings.ts +++ b/src/pages/settings/wallet-settings/wallet-settings.ts @@ -100,9 +100,9 @@ export class WalletSettingsPage { let url = 'https://github.com/bitpay/copay/wiki/COPAY---FAQ#what-the-spending-password-does'; let optIn = true; let title = null; - let message = this.translate.instant('Read more in our Wiki'); //TODO gettextcatalog - let okText = this.translate.instant('Open');//TODO gettextcatalog - let cancelText = this.translate.instant('Go Back');//TODO gettextcatalog + let message = this.translate.instant('Read more in our Wiki'); + let okText = this.translate.instant('Open'); + let cancelText = this.translate.instant('Go Back'); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); } diff --git a/src/providers/profile/profile.ts b/src/providers/profile/profile.ts index 9895e2f3b..7b9411146 100644 --- a/src/providers/profile/profile.ts +++ b/src/providers/profile/profile.ts @@ -479,7 +479,7 @@ export class ProfileProvider { walletClient.importFromExtendedPrivateKey(xPrivKey, opts, (err: any) => { if (err) { if (err instanceof this.errors.NOT_AUTHORIZED) return reject(err); - this.bwcErrorProvider.cb(err, 'Could not import').then((msg: string) => { //TODO getTextCatalog + this.bwcErrorProvider.cb(err, this.translate.instant('Could not import')).then((msg: string) => { return reject(msg); }); } else { From fa778f3d59b139a97ae63ddc1be50f0b1ec4edc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Fri, 2 Feb 2018 13:43:04 -0300 Subject: [PATCH 5/7] Update app pot file --- src/assets/i18n/app.pot | 3320 ++++++++++++++++++++++++--------------- 1 file changed, 2019 insertions(+), 1301 deletions(-) diff --git a/src/assets/i18n/app.pot b/src/assets/i18n/app.pot index 3ba61f509..f2844de19 100644 --- a/src/assets/i18n/app.pot +++ b/src/assets/i18n/app.pot @@ -1,1302 +1,2020 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" - -msgid "(possible double spend)" -msgstr "" - -msgid "" -"* A payment proposal can be deleted if 1) you are the creator, and no other " -"copayer has signed, or 2) 24 hours have passed\n" -" since the proposal was created." -msgstr "" - -msgid "." -msgstr "" - -msgid "" -"5-star ratings help us get {{appName}} into more hands, and more users " -"means more resources can be committed to the app!" -msgstr "" - -msgid "A member of the team will review your feedback as soon as possible." -msgstr "" - -msgid "About" -msgstr "" - -msgid "Account" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "Add Contact" -msgstr "" - -msgid "Add Memo" -msgstr "" - -msgid "Add Wallet" -msgstr "" - -msgid "Add as a contact" -msgstr "" - -msgid "Address" -msgstr "" - -msgid "Address Book" -msgstr "" - -msgid "Address Type" -msgstr "" - -msgid "Address book" -msgstr "" - -msgid "Addresses with balance" -msgstr "" - -msgid "Advanced" -msgstr "" - -msgid "All addresses" -msgstr "" - -msgid "" -"All signing devices must be added to this multisig wallet before bitcoin " -"addresses can be created." -msgstr "" - -msgid "Allow Camera Access" -msgstr "" - -msgid "Almost done! Let's review." -msgstr "" - -msgid "Alternative currency" -msgstr "" - -msgid "Amount" -msgstr "" - -msgid "Anyone with your backup phrase can access or spend your bitcoin." -msgstr "" - -msgid "" -"Approximate Bitcoin network fee to transfer wallet's balance (with normal " -"priority)" -msgstr "" - -msgid "Are you being watched?" -msgstr "" - -msgid "Average confirmation time" -msgstr "" - -msgid "BTC wallets" -msgstr "" - -msgid "Backup" -msgstr "" - -msgid "Backup needed" -msgstr "" - -msgid "Backup wallet" -msgstr "" - -msgid "Balance Hidden" -msgstr "" - -msgid "" -"Bitcoin (BTC) miner fees are high due to record demand for limited space on " -"the\n" -" Bitcoin network. BitPay does not receive and does not control bitcoin " -"miner fees." -msgstr "" - -msgid "Bitcoin Address" -msgstr "" - -msgid "Bitcoin Cash Wallets" -msgstr "" - -msgid "Bitcoin Network Fee Policy" -msgstr "" - -msgid "Bitcoin Wallets" -msgstr "" - -msgid "Bitcoin is a currency." -msgstr "" - -msgid "" -"Bitcoin is different – it cannot be safely held with a bank or web " -"service." -msgstr "" - -msgid "Bitcoin is secure," -msgstr "" - -msgid "Bitcoin miner fees unusually high" -msgstr "" - -msgid "Bitcoin network fee policy" -msgstr "" - -msgid "Bitcoin transactions include a fee collected by miners on the network." -msgstr "" - -msgid "Broadcast Payment" -msgstr "" - -msgid "Buy" -msgstr "" - -msgid "Buy & Sell Bitcoin" -msgstr "" - -msgid "Buy Gift Card" -msgstr "" - -msgid "Buy a Gift Card" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Cancel invitation" -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Clear cache" -msgstr "" - -msgid "Click to send" -msgstr "" - -msgid "Click to shift" -msgstr "" - -msgid "Close" -msgstr "" - -msgid "Coin" -msgstr "" - -msgid "Color" -msgstr "" - -msgid "Commit hash" -msgstr "" - -msgid "Complete the backup process to use this option" -msgstr "" - -msgid "Confirm" -msgstr "" - -msgid "Confirm & Finish" -msgstr "" - -msgid "Confirm purchase" -msgstr "" - -msgid "Confirmations" -msgstr "" - -msgid "Continue →" -msgstr "" - -msgid "Contribute Translations" -msgstr "" - -msgid "Copayer joined" -msgstr "" - -msgid "Copayer {{$index}}" -msgstr "" - -msgid "Copy this text as it is to a safe place (notepad or email)" -msgstr "" - -msgid "Copy to clipboard" -msgstr "" - -msgid "Could not access the wallet at the server. Please check:" -msgstr "" - -msgid "Could not update transaction history" -msgstr "" - -msgid "Create a new wallet" -msgstr "" - -msgid "Create bitcoin wallet" -msgstr "" - -msgid "Create shared wallet" -msgstr "" - -msgid "Created by" -msgstr "" - -msgid "Current fee rate for this policy" -msgstr "" - -msgid "Custom Amount" -msgstr "" - -msgid "Date" -msgstr "" - -msgid "Delete" -msgstr "" - -msgid "Delete Payment Proposal" -msgstr "" - -msgid "Delete Wallet" -msgstr "" - -msgid "Delete it and create a new one" -msgstr "" - -msgid "Derivation Strategy" -msgstr "" - -msgid "Derivation path" -msgstr "" - -msgid "Do it later" -msgstr "" - -msgid "" -"Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love " -"to support your language." -msgstr "" - -msgid "Done" -msgstr "" - -msgid "Download" -msgstr "" - -msgid "Duplicate" -msgstr "" - -msgid "" -"Each bitcoin wallet can generate billions of addresses from your 12-word " -"backup. A new address is automatically generated\n" -" and shown each time you receive a payment." -msgstr "" - -msgid "Edit" -msgstr "" - -msgid "Email" -msgstr "" - -msgid "Email Address" -msgstr "" - -msgid "Enable camera access in your device settings to get started." -msgstr "" - -msgid "Enable email notifications" -msgstr "" - -msgid "Enable push notifications" -msgstr "" - -msgid "Enable the camera to get started." -msgstr "" - -msgid "Enter custom fee" -msgstr "" - -msgid "Enter your password" -msgstr "" - -msgid "Error" -msgstr "" - -msgid "Expired" -msgstr "" - -msgid "Expires" -msgstr "" - -msgid "Export Wallet" -msgstr "" - -msgid "Export to file" -msgstr "" - -msgid "Export wallet" -msgstr "" - -msgid "Extended Private Key" -msgstr "" - -msgid "Extended Public Keys" -msgstr "" - -msgid "Fee" -msgstr "" - -msgid "Fee:" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Finish" -msgstr "" - -msgid "From" -msgstr "" - -msgid "" -"From the destination device, go to Add wallet > Import wallet and scan this " -"QR code" -msgstr "" - -msgid "Funds found:" -msgstr "" - -msgid "Funds will be transferred to" -msgstr "" - -msgid "Generate new address" -msgstr "" - -msgid "Get news and updates from BitPay" -msgstr "" - -msgid "Get started" -msgstr "" - -msgid "Get started by adding your first one." -msgstr "" - -msgid "Gift Card" -msgstr "" - -msgid "Gift Card is not available to use anymore" -msgstr "" - -msgid "Got it" -msgstr "" - -msgid "Help & Support" -msgstr "" - -msgid "Help & support" -msgstr "" - -msgid "Hide" -msgstr "" - -msgid "Hide Balance" -msgstr "" - -msgid "Hide advanced options" -msgstr "" - -msgid "Home" -msgstr "" - -msgid "How do you like {{appName}}?" -msgstr "" - -msgid "I agree to the" -msgstr "" - -msgid "I have read, understood, and agree to the" -msgstr "" - -msgid "I understand" -msgstr "" - -msgid "I've written it down" -msgstr "" - -msgid "" -"If enabled, Bitcoin Cash addresses will be shown using Copay style address, " -"and not the new cashaddr format." -msgstr "" - -msgid "" -"If enabled, all sensitive information (private key and recovery phrase) and " -"actions (spending and exporting) associated with\n" -" this wallet will be protected." -msgstr "" - -msgid "If enabled, the \"Next Steps Card\" will appear in the Home tab." -msgstr "" - -msgid "" -"If enabled, the Recent Transactions card - a list of transactions occuring " -"across all wallets - will appear in the\n" -" Home tab." -msgstr "" - -msgid "" -"If enabled, wallets will also try to spend unconfirmed funds. This option " -"may cause transaction delays." -msgstr "" - -msgid "" -"If you have additional feedback, please let us know by tapping the \"Send " -"feedback\" option in the Settings tab." -msgstr "" - -msgid "Import wallet" -msgstr "" - -msgid "In order to verify your wallet backup, please type your password." -msgstr "" - -msgid "Inactive" -msgstr "" - -msgid "Incomplete" -msgstr "" - -msgid "Incomplete wallet" -msgstr "" - -msgid "Incorrect PIN, try again." -msgstr "" - -msgid "Invoice expired" -msgstr "" - -msgid "Is this correct?" -msgstr "" - -msgid "Is this email address correct?" -msgstr "" - -msgid "" -"It's a good idea to avoid reusing addresses - this both protects your " -"privacy and keeps your bitcoins secure against\n" -" hypothetical attacks by quantum computers." -msgstr "" - -msgid "Join shared wallet" -msgstr "" - -msgid "Join wallet" -msgstr "" - -msgid "Just scan the code to pay." -msgstr "" - -msgid "Language" -msgstr "" - -msgid "Learn more" -msgstr "" - -msgid "Let's verify your backup phrase." -msgstr "" - -msgid "Loading addresses..." -msgstr "" - -msgid "Loading..." -msgstr "" - -msgid "Lock" -msgstr "" - -msgid "Low amount inputs" -msgstr "" - -msgid "Makes sense" -msgstr "" - -msgid "Me" -msgstr "" - -msgid "Memo" -msgstr "" - -msgid "Mercado Livre Brazil Gift Cards" -msgstr "" - -msgid "Merchant Message" -msgstr "" - -msgid "Miner Fee" -msgstr "" - -msgid "More Options" -msgstr "" - -msgid "Moved" -msgstr "" - -msgid "Multiple recipients" -msgstr "" - -msgid "" -"NOTE: To import a wallet from a 3rd party software, please go to Add Wallet " -"> Create Wallet, and specify the Recovery\n" -" Phrase there." -msgstr "" - -msgid "Name" -msgstr "" - -msgid "Network Cost" -msgstr "" - -msgid "New Proposal" -msgstr "" - -msgid "New personal wallet" -msgstr "" - -msgid "Next steps" -msgstr "" - -msgid "No backup, no bitcoin." -msgstr "" - -msgid "No contacts yet" -msgstr "" - -msgid "No entries for this log level" -msgstr "" - -msgid "No pending proposals" -msgstr "" - -msgid "No private key" -msgstr "" - -msgid "No transactions yet" -msgstr "" - -msgid "No wallet" -msgstr "" - -msgid "No wallets available to receive funds" -msgstr "" - -msgid "No wallets eligible for Bitcoin Cash support" -msgstr "" - -msgid "Non eligible BTC wallets" -msgstr "" - -msgid "Not even BitPay can access it." -msgstr "" - -msgid "Not now" -msgstr "" - -msgid "Note" -msgstr "" - -msgid "" -"Note: if this BCH wallet was duplicated from a BTC wallet, they share the " -"same recovery phrase." -msgstr "" - -msgid "Notification" -msgstr "" - -msgid "Notifications" -msgstr "" - -msgid "Notifications by email" -msgstr "" - -msgid "Notify me if confirmed" -msgstr "" - -msgid "Notify me when transactions are confirmed" -msgstr "" - -msgid "" -"Now is a perfect time to assess your surroundings. Nearby windows? Hidden " -"cameras? Shoulder-spies?" -msgstr "" - -msgid "OAuth Code" -msgstr "" - -msgid "On this screen you can see all your wallets, accounts, and assets." -msgstr "" - -msgid "Open Settings" -msgstr "" - -msgid "Open wallet" -msgstr "" - -msgid "Open website" -msgstr "" - -msgid "Password" -msgstr "" - -msgid "Passwords do not match" -msgstr "" - -msgid "Payment Expires:" -msgstr "" - -msgid "Payment Proposal" -msgstr "" - -msgid "Payment Proposals" -msgstr "" - -msgid "Payment Received" -msgstr "" - -msgid "Payment Rejected" -msgstr "" - -msgid "Payment Sent" -msgstr "" - -msgid "Payment accepted, but not yet broadcasted" -msgstr "" - -msgid "" -"Payment accepted. It will be broadcasted by Glidera. In case there is a " -"problem, it can be deleted 6 hours after\n" -" it was created." -msgstr "" - -msgid "Payment details" -msgstr "" - -msgid "Pending" -msgstr "" - -msgid "Pending Proposals" -msgstr "" - -msgid "Permanently delete this wallet." -msgstr "" - -msgid "Please carefully write down this phrase." -msgstr "" - -msgid "Please connect a camera to get started." -msgstr "" - -msgid "Please tap each word in the correct order." -msgstr "" - -msgid "Preferences" -msgstr "" - -msgid "Private Key" -msgstr "" - -msgid "Proposal Accepted" -msgstr "" - -msgid "Proposal Deleted" -msgstr "" - -msgid "Proposal Rejected" -msgstr "" - -msgid "Proposals" -msgstr "" - -msgid "" -"Push notifications for {{appName}} are currently disabled. Enable them in " -"the Settings app." -msgstr "" - -msgid "Quick review!" -msgstr "" - -msgid "Rate on the app store" -msgstr "" - -msgid "Read less" -msgstr "" - -msgid "Read more" -msgstr "" - -msgid "Receive" -msgstr "" - -msgid "Receive in" -msgstr "" - -msgid "Received" -msgstr "" - -msgid "Receiving" -msgstr "" - -msgid "Recent" -msgstr "" - -msgid "Recent Transaction Card" -msgstr "" - -msgid "Recent Transactions" -msgstr "" - -msgid "Recipient" -msgstr "" - -msgid "Recipients" -msgstr "" - -msgid "Redeem Now" -msgstr "" - -msgid "Reject" -msgstr "" - -msgid "Release information" -msgstr "" - -msgid "Remove" -msgstr "" - -msgid "Repeat password" -msgstr "" - -msgid "Repeat the password" -msgstr "" - -msgid "Request Fingerprint" -msgstr "" - -msgid "Request Specific amount" -msgstr "" - -msgid "Request Spending Password" -msgstr "" - -msgid "Restore from backup" -msgstr "" - -msgid "Retry Camera" -msgstr "" - -msgid "Save" -msgstr "" - -msgid "Scan" -msgstr "" - -msgid "Scan QR Codes" -msgstr "" - -msgid "Scan addresses for funds" -msgstr "" - -msgid "Scan again" -msgstr "" - -msgid "Scanning funds" -msgstr "" - -msgid "Scanning funds..." -msgstr "" - -msgid "Security" -msgstr "" - -msgid "See invoice" -msgstr "" - -msgid "Select a wallet" -msgstr "" - -msgid "Send" -msgstr "" - -msgid "Send Feedback" -msgstr "" - -msgid "Send Money" -msgstr "" - -msgid "Send addresses by email" -msgstr "" - -msgid "Send payment to this address" -msgstr "" - -msgid "Send us feedback instead" -msgstr "" - -msgid "Sending" -msgstr "" - -msgid "Sending maximum amount" -msgstr "" - -msgid "Sent" -msgstr "" - -msgid "Services" -msgstr "" - -msgid "Session Log" -msgstr "" - -msgid "Session log" -msgstr "" - -msgid "Set up a password" -msgstr "" - -msgid "Settings" -msgstr "" - -msgid "Share the love by inviting your friends." -msgstr "" - -msgid "Share this invitation with your copayers" -msgstr "" - -msgid "Shift" -msgstr "" - -msgid "Show Next Steps Card" -msgstr "" - -msgid "Show advanced options" -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "" -"Since only you control your money, you’ll need to save your backup phrase " -"in case this app is deleted." -msgstr "" - -msgid "Skip" -msgstr "" - -msgid "" -"Some of your wallets are not eligible for Bitcoin Cash support. You can try " -"to access BCH funds from these wallets\n" -" using the" -msgstr "" - -msgid "Spendable" -msgstr "" - -msgid "Spending this balance will need significant Bitcoin network fees" -msgstr "" - -msgid "Still pending" -msgstr "" - -msgid "Sweep" -msgstr "" - -msgid "Sweep paper wallet" -msgstr "" - -msgid "THIS ACTION CANNOT BE REVERSED" -msgstr "" - -msgid "Take control of your money," -msgstr "" - -msgid "Tap and hold to show" -msgstr "" - -msgid "Terms of Use" -msgstr "" - -msgid "Terms of use" -msgstr "" - -msgid "Text" -msgstr "" - -msgid "Thank you!" -msgstr "" - -msgid "The derivation path" -msgstr "" - -msgid "The exchange rate changes with the market." -msgstr "" - -msgid "" -"The higher the fee, the greater the incentive a miner has to include that " -"transaction in a block. Current fees are determined based on network load " -"and the selected policy." -msgstr "" - -msgid "" -"The maximum number of consecutive unused addresses (20) has been reached. " -"When one of your unused addresses receives\n" -" a payment, a new address will be generated and shown in your " -"Receive tab." -msgstr "" - -msgid "The password of the recovery phrase (if set)" -msgstr "" - -msgid "The payment was removed by creator" -msgstr "" - -msgid "" -"The restore process will stop when 20 addresses are generated in a row " -"which contain no funds. To safely generate\n" -" more addresses, make a payment to one of the unused addresses " -"which has already been generated." -msgstr "" - -msgid "The wallet service URL" -msgstr "" - -msgid "This app stores your bitcoin with cutting-edge security." -msgstr "" - -msgid "" -"This recovery phrase was created with a password. To recover this wallet " -"both the recovery phrase and password are needed." -msgstr "" - -msgid "" -"This transaction amount is too small compared to current Bitcoin network " -"fees. Spending these funds will need a Bitcoin network\n" -" fee cost comparable to the funds itself." -msgstr "" - -msgid "" -"This transaction could take a long time to confirm or could be dropped due " -"to the low fees set by the sender" -msgstr "" - -msgid "" -"This wallet is not registered at the given Bitcore Wallet Service (BWS). " -"You can recreate it\n" -" from the local information." -msgstr "" - -msgid "Timeline" -msgstr "" - -msgid "To" -msgstr "" - -msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "" - -msgid "Total" -msgstr "" - -msgid "Total Locked Balance" -msgstr "" - -msgid "Total wallet inputs" -msgstr "" - -msgid "Transaction History" -msgstr "" - -msgid "Transactions without fee are not supported." -msgstr "" - -msgid "Transfer to Bitcoin Cash Wallet" -msgstr "" - -msgid "Transfer to Bitcoin Wallet" -msgstr "" - -msgid "Transfer to Contact" -msgstr "" - -msgid "Try again in {{expires}}" -msgstr "" - -msgid "Unconfirmed" -msgstr "" - -msgid "Unsent transactions" -msgstr "" - -msgid "Unused addresses" -msgstr "" - -msgid "Unused addresses limit" -msgstr "" - -msgid "Updating pending proposals. Please stand by" -msgstr "" - -msgid "Updating transaction history. Please stand by." -msgstr "" - -msgid "Updating... Please stand by" -msgstr "" - -msgid "Use Bitcoin Cash Copay Style Addresses" -msgstr "" - -msgid "Use Unconfirmed Funds" -msgstr "" - -msgid "Use default url" -msgstr "" - -msgid "Version" -msgstr "" - -msgid "View all addresses" -msgstr "" - -msgid "View on blockchain" -msgstr "" - -msgid "Visit mercadolivre.com.br →" -msgstr "" - -msgid "" -"WARNING: Key derivation is not working on this device/wallet. Actions " -"cannot be performed on this wallet." -msgstr "" - -msgid "" -"WARNING: Not including the private key allows to check the wallet balance, " -"transaction history, and create spend proposals\n" -" from the export. However, does not allow to approve (sign) " -"proposals, so" -msgstr "" - -msgid "" -"WARNING: The private key of this wallet is not available. The export allows " -"to check the wallet balance, transaction history,\n" -" and create spend proposals from the export. However, does " -"not allow to approve (sign) proposals, so" -msgstr "" - -msgid "Waiting for copayers" -msgstr "" - -msgid "Waiting..." -msgstr "" - -msgid "Wallet Addresses" -msgstr "" - -msgid "Wallet Color" -msgstr "" - -msgid "Wallet Configuration (m-n)" -msgstr "" - -msgid "Wallet Created" -msgstr "" - -msgid "Wallet Id" -msgstr "" - -msgid "Wallet Information" -msgstr "" - -msgid "Wallet Inputs" -msgstr "" - -msgid "Wallet Name" -msgstr "" - -msgid "Wallet Name (at creation)" -msgstr "" - -msgid "Wallet Network" -msgstr "" - -msgid "Wallet Service URL" -msgstr "" - -msgid "Wallet Settings" -msgstr "" - -msgid "Wallet created" -msgstr "" - -msgid "Wallet incomplete and broken" -msgstr "" - -msgid "Wallet information" -msgstr "" - -msgid "Wallet invitation" -msgstr "" - -msgid "Wallet key" -msgstr "" - -msgid "Wallet not backed up" -msgstr "" - -msgid "Wallet recovery phrase" -msgstr "" - -msgid "Wallet recovery phrase not available" -msgstr "" - -msgid "Wallet service URL" -msgstr "" - -msgid "Warning!" -msgstr "" - -msgid "Warning: this transaction has unconfirmed inputs" -msgstr "" - -msgid "We'll confirm on the next screen." -msgstr "" - -msgid "Website" -msgstr "" - -msgid "" -"We’re always looking for translation contributions! You can make " -"corrections or help to make this app available in your native\n" -" language by joining our community on Crowdin." -msgstr "" - -msgid "What do you call this wallet?" -msgstr "" - -msgid "" -"When this wallet was created, it was called “{{walletName}}”. " -"You can change the name displayed on this device\n" -" below." -msgstr "" - -msgid "Where would you like to receive email notifications about payments?" -msgstr "" - -msgid "Why?" -msgstr "" - -msgid "Words" -msgstr "" - -msgid "Would you be willing to rate {{appName}} in the app store?" -msgstr "" - -msgid "You can scan bitcoin addresses, payment requests, paper wallets, and more." -msgstr "" - -msgid "You can spend bitcoin at millions of websites and stores worldwide." -msgstr "" - -msgid "You can still export it from Advanced > Export." -msgstr "" - -msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." -msgstr "" - -msgid "You control your bitcoin." -msgstr "" - -msgid "You should not set a fee higher than {{maxFeeRecommended}} satoshis/byte." -msgstr "" - -msgid "" -"You'll receive email notifications about payments sent and received from " -"your wallets." -msgstr "" - -msgid "Your Gift Cards" -msgstr "" - -msgid "" -"Your extended private keys are all that is needed to access your bitcoin " -"funds. Be sure to protect your private\n" -" keys and store them only on secure devices. BitPay does not have " -"access to your private keys, so you alone are responsible\n" -" for your keys. If you share key access with external services, you " -"take responsibility for the risk of theft or breach.\n" -" Only advanced users should handle extended private keys directly." -msgstr "" - -msgid "Your fee is lower than recommended." -msgstr "" - -msgid "Your ideas, feedback, or comments" -msgstr "" - -msgid "Your name" -msgstr "" - -msgid "Your password" -msgstr "" - -msgid "Your wallet is never saved to cloud storage or standard device backups." -msgstr "" - -msgid "Your wallets are ready!" -msgstr "" - -msgid "[Balance Hidden]" -msgstr "" - -msgid "[Scanning Funds]" -msgstr "" - -msgid "" -"and certify that I am the beneficial owner of the input assets and the " -"destination address." -msgstr "" - -msgid "digital money." -msgstr "" - -msgid "get started with bitcoin." -msgstr "" - -msgid "preparing..." -msgstr "" - -msgid "recovery tool." -msgstr "" - -msgid "redeemable on Mercado Livre (Brazil)" -msgstr "" - -msgid "" -"{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain " -"information, networking and Copayer synchronization.\n" -" The default configuration points to https://bws.bitpay.com " -"(BitPay's public BWS instance)." -msgstr "" - -msgid "{{option.value.label}}" -msgstr "" - -msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the transaction" -msgstr "" - -msgid "{{updatingTxHistoryProgress}} transactions downloaded" -msgstr "" - -msgid "{{wallet.m}}-of-{{wallet.n}}" +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "(possible double spend)" +msgstr "" + +msgid "" +"* A payment proposal can be deleted if 1) you are the creator, and no other " +"copayer has signed, or 2) 24 hours have passed\n" +" since the proposal was created." +msgstr "" + +msgid "." +msgstr "" + +msgid "" +"5-star ratings help us get {{appName}} into more hands, and more users " +"means more resources can be committed to the app!" +msgstr "" + +msgid "A member of the team will review your feedback as soon as possible." +msgstr "" + +msgid "" +"A total of {{amountAboveMaxSizeStr}} {{coin}} were excluded. The maximum " +"size allowed for a transaction was exceeded." +msgstr "" + +msgid "" +"A total of {{amountBelowFeeStr}} {{coin}} were excluded. These funds come " +"from UTXOs smaller than the network fee provided." +msgstr "" + +msgid "About" +msgstr "" + +msgid "Accepted" +msgstr "" + +msgid "Account" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Add Contact" +msgstr "" + +msgid "Add Memo" +msgstr "" + +msgid "Add Wallet" +msgstr "" + +msgid "Add as a contact" +msgstr "" + +msgid "Add description" +msgstr "" + +msgid "Address" +msgstr "" + +msgid "Address Book" +msgstr "" + +msgid "Address Type" +msgstr "" + +msgid "Address book" +msgstr "" + +msgid "Addresses with balance" +msgstr "" + +msgid "Advanced" +msgstr "" + +msgid "All addresses" +msgstr "" + +msgid "" +"All signing devices must be added to this multisig wallet before bitcoin " +"addresses can be created." +msgstr "" + +msgid "Almost done! Let's review." +msgstr "" + +msgid "Alternative currency" +msgstr "" + +msgid "Amazon.com is not available at this moment. Please try back later." +msgstr "" + +msgid "Amount" +msgstr "" + +msgid "Amount below minimum allowed" +msgstr "" + +msgid "Amount too big" +msgstr "" + +msgid "" +"An update to this app is available. For your security, please update to the " +"latest version." +msgstr "" + +msgid "Anyone with your backup phrase can access or spend your bitcoin." +msgstr "" + +msgid "" +"Approximate Bitcoin network fee to transfer wallet's balance (with normal " +"priority)" +msgstr "" + +msgid "Are you being watched?" +msgstr "" + +msgid "Are you sure you want to cancel and delete this wallet?" +msgstr "" + +msgid "Are you sure you want to delete this contact?" +msgstr "" + +msgid "Are you sure you want to delete this wallet?" +msgstr "" + +msgid "Are you sure you want to reject this transaction?" +msgstr "" + +msgid "Are you sure you want to remove this transaction?" +msgstr "" + +msgid "Are you sure?" +msgstr "" + +msgid "Average confirmation time" +msgstr "" + +msgid "BTC wallets" +msgstr "" + +msgid "Backup" +msgstr "" + +msgid "Backup all your wallets before using this function" +msgstr "" + +msgid "Backup needed" +msgstr "" + +msgid "Backup wallet" +msgstr "" + +msgid "Backup your wallet before using this function" +msgstr "" + +msgid "Bad wallet invitation" +msgstr "" + +msgid "Balance Hidden" +msgstr "" + +msgid "" +"Bitcoin (BTC) miner fees are high due to record demand for limited space on " +"the\n" +" Bitcoin network. BitPay does not receive and does not control bitcoin " +"miner fees." +msgstr "" + +msgid "Bitcoin Address" +msgstr "" + +msgid "Bitcoin Cash Wallets" +msgstr "" + +msgid "Bitcoin Network Fee Policy" +msgstr "" + +msgid "Bitcoin Wallets" +msgstr "" + +msgid "Bitcoin cash Payment" +msgstr "" + +msgid "Bitcoin is a currency." +msgstr "" + +msgid "" +"Bitcoin is different – it cannot be safely held with a bank or web " +"service." +msgstr "" + +msgid "Bitcoin is secure," +msgstr "" + +msgid "Bitcoin miner fee" +msgstr "" + +msgid "Bitcoin miner fees unusually high" +msgstr "" + +msgid "Bitcoin network fee policy" +msgstr "" + +msgid "Bitcoin transactions include a fee collected by miners on the network." +msgstr "" + +msgid "Broadcast Payment" +msgstr "" + +msgid "Broadcasted" +msgstr "" + +msgid "Broadcasting transaction..." +msgstr "" + +msgid "Buy" +msgstr "" + +msgid "Buy Gift Card" +msgstr "" + +msgid "Buy a Gift Card" +msgstr "" + +msgid "Buying Bitcoin..." +msgstr "" + +msgid "Buying Gift Card..." +msgstr "" + +msgid "Calculating fee..." +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "Cancel invitation" +msgstr "" + +msgid "Canceling Gift Card..." +msgstr "" + +msgid "Cannot join the same wallet more that once" +msgstr "" + +msgid "Check the transaction on your wallet details" +msgstr "" + +msgid "Clear" +msgstr "" + +msgid "Clear cache" +msgstr "" + +msgid "Click to accept" +msgstr "" + +msgid "Click to pay" +msgstr "" + +msgid "Click to send" +msgstr "" + +msgid "Click to shift" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "Coin" +msgstr "" + +msgid "Color" +msgstr "" + +msgid "Commit hash" +msgstr "" + +msgid "Complete the backup process to use this option" +msgstr "" + +msgid "Confirm" +msgstr "" + +msgid "Confirm & Finish" +msgstr "" + +msgid "Confirm purchase" +msgstr "" + +msgid "Confirm to shift {{fromCoin}} to {{toCoin}}" +msgstr "" + +msgid "Confirm your new spending password" +msgstr "" + +msgid "Confirmations" +msgstr "" + +msgid "Connecting to Coinbase..." +msgstr "" + +msgid "Connecting to Glidera..." +msgstr "" + +msgid "Connecting to Shapeshift..." +msgstr "" + +msgid "Connection reset by peer" +msgstr "" + +msgid "Continue →" +msgstr "" + +msgid "Contribute Translations" +msgstr "" + +msgid "Copayer already in this wallet" +msgstr "" + +msgid "Copayer already voted on this spend proposal" +msgstr "" + +msgid "Copayer data mismatch" +msgstr "" + +msgid "Copayer joined" +msgstr "" + +msgid "Copayer {{$index}}" +msgstr "" + +msgid "Copied to clipboard" +msgstr "" + +msgid "Copy this text as it is to a safe place (notepad or email)" +msgstr "" + +msgid "Copy to clipboard" +msgstr "" + +msgid "Could not access Gift Card Service" +msgstr "" + +msgid "Could not access the wallet at the server. Please check:" +msgstr "" + +msgid "Could not access to Amazon.com" +msgstr "" + +msgid "Could not access wallet" +msgstr "" + +msgid "Could not add message to imported wallet without shared encrypting key" +msgstr "" + +msgid "Could not build transaction" +msgstr "" + +msgid "Could not create address" +msgstr "" + +msgid "Could not create transaction" +msgstr "" + +msgid "Could not create using the specified extended private key" +msgstr "" + +msgid "Could not create using the specified extended public key" +msgstr "" + +msgid "Could not create: Invalid wallet recovery phrase" +msgstr "" + +msgid "Could not decrypt file, check your password" +msgstr "" + +msgid "Could not delete payment proposal" +msgstr "" + +msgid "Could not get dynamic fee" +msgstr "" + +msgid "Could not get dynamic fee for level:" +msgstr "" + +msgid "Could not get fee levels" +msgstr "" + +msgid "Could not get the invoice" +msgstr "" + +msgid "Could not import" +msgstr "" + +msgid "Could not import. Check input file and spending password" +msgstr "" + +msgid "Could not join wallet" +msgstr "" + +msgid "Could not reject payment" +msgstr "" + +msgid "Could not save preferences on the server" +msgstr "" + +msgid "Could not send transaction" +msgstr "" + +msgid "Could not update transaction history" +msgstr "" + +msgid "Could not update wallet" +msgstr "" + +msgid "Create a new wallet" +msgstr "" + +msgid "Create bitcoin wallet" +msgstr "" + +msgid "Create shared wallet" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Created {{card.date | amTimeAgo}}" +msgstr "" + +msgid "Creating Gift Card..." +msgstr "" + +msgid "Creating Wallet..." +msgstr "" + +msgid "Creating transaction..." +msgstr "" + +msgid "Current fee rate for this policy" +msgstr "" + +msgid "Custom" +msgstr "" + +msgid "Custom Amount" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Delete" +msgstr "" + +msgid "Delete Payment Proposal" +msgstr "" + +msgid "Delete Wallet" +msgstr "" + +msgid "Delete it and create a new one" +msgstr "" + +msgid "Deleting Wallet..." +msgstr "" + +msgid "Deleting payment proposal..." +msgstr "" + +msgid "Derivation Strategy" +msgstr "" + +msgid "Derivation path" +msgstr "" + +msgid "Do it later" +msgstr "" + +msgid "" +"Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love " +"to support your language." +msgstr "" + +msgid "Done" +msgstr "" + +msgid "Download" +msgstr "" + +msgid "Duplicate" +msgstr "" + +msgid "Duplicating wallet..." +msgstr "" + +msgid "" +"Each bitcoin wallet can generate billions of addresses from your 12-word " +"backup. A new address is automatically generated\n" +" and shown each time you receive a payment." +msgstr "" + +msgid "Economy" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Email Address" +msgstr "" + +msgid "Empty addresses limit reached. New addresses cannot be generated." +msgstr "" + +msgid "Enable email notifications" +msgstr "" + +msgid "Enable push notifications" +msgstr "" + +msgid "Enter Spending Password" +msgstr "" + +msgid "Enter custom fee" +msgstr "" + +msgid "Enter new spending password" +msgstr "" + +msgid "Enter your password" +msgstr "" + +msgid "Error" +msgstr "" + +msgid "Error at confirm" +msgstr "" + +msgid "Error creating the invoice" +msgstr "" + +msgid "Error creating wallet" +msgstr "" + +msgid "Error getting SendMax information" +msgstr "" + +msgid "Error in Payment Protocol" +msgstr "" + +msgid "Error scanning funds:" +msgstr "" + +msgid "Error sweeping wallet:" +msgstr "" + +msgid "Exceeded daily limit of $500 per user" +msgstr "" + +msgid "Expired" +msgstr "" + +msgid "Expires" +msgstr "" + +msgid "Export Wallet" +msgstr "" + +msgid "Export to file" +msgstr "" + +msgid "Export wallet" +msgstr "" + +msgid "Exporting via QR not supported for this wallet" +msgstr "" + +msgid "Extended Private Key" +msgstr "" + +msgid "Extended Public Keys" +msgstr "" + +msgid "Extracting Wallet information..." +msgstr "" + +msgid "Failed to export" +msgstr "" + +msgid "Fee" +msgstr "" + +msgid "Fee level is not defined" +msgstr "" + +msgid "Feedback could not be submitted. Please try again later." +msgstr "" + +msgid "Fetching BitPay Account..." +msgstr "" + +msgid "Fetching payment information" +msgstr "" + +msgid "File" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "From" +msgstr "" + +msgid "" +"From the destination device, go to Add wallet > Import wallet and scan this " +"QR code" +msgstr "" + +msgid "Funds are locked by pending spend proposals" +msgstr "" + +msgid "Funds found:" +msgstr "" + +msgid "Funds will be transferred to" +msgstr "" + +msgid "Generate new address" +msgstr "" + +msgid "Generating .csv file..." +msgstr "" + +msgid "Generating new address..." +msgstr "" + +msgid "Get news and updates from BitPay" +msgstr "" + +msgid "Get started" +msgstr "" + +msgid "Get started by adding your first one." +msgstr "" + +msgid "Getting fee levels..." +msgstr "" + +msgid "Gift Card" +msgstr "" + +msgid "Gift Card Amount:" +msgstr "" + +msgid "Gift Card is not available to use anymore" +msgstr "" + +msgid "Gift card expired" +msgstr "" + +msgid "Go Back" +msgstr "" + +msgid "Got it" +msgstr "" + +msgid "Help & Support" +msgstr "" + +msgid "Help & support" +msgstr "" + +msgid "Help and support information is available at the website." +msgstr "" + +msgid "Hide" +msgstr "" + +msgid "Hide Balance" +msgstr "" + +msgid "Hide advanced options" +msgstr "" + +msgid "Hmm..." +msgstr "" + +msgid "Home" +msgstr "" + +msgid "How do you like {{appName}}?" +msgstr "" + +msgid "I agree to the" +msgstr "" + +msgid "I don't like it" +msgstr "" + +msgid "I have read, understood, and agree to the" +msgstr "" + +msgid "I like the app" +msgstr "" + +msgid "I think this app is terrible" +msgstr "" + +msgid "I understand" +msgstr "" + +msgid "I've written it down" +msgstr "" + +msgid "" +"If enabled, Bitcoin Cash addresses will be shown using Copay style address, " +"and not the new cashaddr format." +msgstr "" + +msgid "" +"If enabled, all sensitive information (private key and recovery phrase) and " +"actions (spending and exporting) associated with\n" +" this wallet will be protected." +msgstr "" + +msgid "If enabled, the \"Services Card\" will appear in the Home tab." +msgstr "" + +msgid "" +"If enabled, the Recent Transactions card - a list of transactions occuring " +"across all wallets - will appear in the\n" +" Home tab." +msgstr "" + +msgid "" +"If enabled, wallets will also try to spend unconfirmed funds. This option " +"may cause transaction delays." +msgstr "" + +msgid "" +"If you have additional feedback, please let us know by tapping the \"Send " +"feedback\" option in the Settings tab." +msgstr "" + +msgid "Import wallet" +msgstr "" + +msgid "Importing Wallet..." +msgstr "" + +msgid "In order to verify your wallet backup, please type your password." +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "Incomplete" +msgstr "" + +msgid "Incomplete wallet" +msgstr "" + +msgid "Incorrect PIN, try again." +msgstr "" + +msgid "Incorrect code format" +msgstr "" + +msgid "Incorrect network address" +msgstr "" + +msgid "Insufficient funds" +msgstr "" + +msgid "Insufficient funds for fee" +msgstr "" + +msgid "Integrations" +msgstr "" + +msgid "Invalid URL" +msgstr "" + +msgid "Invalid address" +msgstr "" + +msgid "Invalid derivation path" +msgstr "" + +msgid "Invoice expired" +msgstr "" + +msgid "Is this correct?" +msgstr "" + +msgid "Is this email address correct?" +msgstr "" + +msgid "" +"It's a good idea to avoid reusing addresses - this both protects your " +"privacy and keeps your bitcoins secure against\n" +" hypothetical attacks by quantum computers." +msgstr "" + +msgid "Join shared wallet" +msgstr "" + +msgid "Join wallet" +msgstr "" + +msgid "Joining Wallet..." +msgstr "" + +msgid "Just scan the code to pay." +msgstr "" + +msgid "Key already associated with an existing wallet" +msgstr "" + +msgid "Language" +msgstr "" + +msgid "Learn more" +msgstr "" + +msgid "Let's verify your backup phrase." +msgstr "" + +msgid "Loading addresses..." +msgstr "" + +msgid "Loading transaction info..." +msgstr "" + +msgid "Loading..." +msgstr "" + +msgid "Lock" +msgstr "" + +msgid "Locktime in effect. Please wait to create a new spend proposal" +msgstr "" + +msgid "Locktime in effect. Please wait to remove this spend proposal" +msgstr "" + +msgid "Low amount inputs" +msgstr "" + +msgid "Makes sense" +msgstr "" + +msgid "Maximum amount allowed is {{max}}" +msgstr "" + +msgid "Me" +msgstr "" + +msgid "Meh - it's alright" +msgstr "" + +msgid "Memo" +msgstr "" + +msgid "Mercado Livre Brazil Gift Cards" +msgstr "" + +msgid "" +"Mercadolibre Gift Card Service is not available at this moment. Please try " +"back later." +msgstr "" + +msgid "Merchant Message" +msgstr "" + +msgid "Miner Fee" +msgstr "" + +msgid "Minimum amount required is {{min}}" +msgstr "" + +msgid "Missing parameter" +msgstr "" + +msgid "Missing private keys to sign" +msgstr "" + +msgid "More Options" +msgstr "" + +msgid "Moved" +msgstr "" + +msgid "Moved Funds" +msgstr "" + +msgid "Multiple recipients" +msgstr "" + +msgid "" +"NOTE: To import a wallet from a 3rd party software, please go to Add Wallet " +"> Create Wallet, and specify the Recovery\n" +" Phrase there." +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Network Cost" +msgstr "" + +msgid "Network error" +msgstr "" + +msgid "New Proposal" +msgstr "" + +msgid "New address could not be generated. Please try again." +msgstr "" + +msgid "New personal wallet" +msgstr "" + +msgid "No" +msgstr "" + +msgid "No access key defined" +msgstr "" + +msgid "No backup, no bitcoin." +msgstr "" + +msgid "No contacts yet" +msgstr "" + +msgid "No entries for this log level" +msgstr "" + +msgid "No password" +msgstr "" + +msgid "No pending proposals" +msgstr "" + +msgid "No private key" +msgstr "" + +msgid "No signing proposal: No private key" +msgstr "" + +msgid "No transactions yet" +msgstr "" + +msgid "No wallet" +msgstr "" + +msgid "No wallet found" +msgstr "" + +msgid "No wallets available" +msgstr "" + +msgid "No wallets available to receive funds" +msgstr "" + +msgid "No wallets available to use ShapeShift" +msgstr "" + +msgid "No wallets eligible for Bitcoin Cash support" +msgstr "" + +msgid "No wallets with funds" +msgstr "" + +msgid "Non BIP44 wallet" +msgstr "" + +msgid "Non eligible BTC wallets" +msgstr "" + +msgid "Normal" +msgstr "" + +msgid "Not authorized" +msgstr "" + +msgid "Not even BitPay can access it." +msgstr "" + +msgid "Not funds found" +msgstr "" + +msgid "Not now" +msgstr "" + +msgid "Note" +msgstr "" + +msgid "" +"Note: if this BCH wallet was duplicated from a BTC wallet, they share the " +"same recovery phrase." +msgstr "" + +msgid "Notification" +msgstr "" + +msgid "Notifications" +msgstr "" + +msgid "Notifications by email" +msgstr "" + +msgid "Notify me if confirmed" +msgstr "" + +msgid "Notify me when transactions are confirmed" +msgstr "" + +msgid "" +"Now is a perfect time to assess your surroundings. Nearby windows? Hidden " +"cameras? Shoulder-spies?" +msgstr "" + +msgid "OK" +msgstr "" + +msgid "Oh no!" +msgstr "" + +msgid "Ok" +msgstr "" + +msgid "On this screen you can see all your wallets, accounts, and assets." +msgstr "" + +msgid "Open" +msgstr "" + +msgid "Open Crowdin" +msgstr "" + +msgid "Open GitHub" +msgstr "" + +msgid "Open GitHub Project" +msgstr "" + +msgid "Open Insight" +msgstr "" + +msgid "Open Translation Community" +msgstr "" + +msgid "Open the recovery tool" +msgstr "" + +msgid "Open wallet" +msgstr "" + +msgid "Open website" +msgstr "" + +msgid "Ouch!" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Password required. Make sure to enter your password in advanced options" +msgstr "" + +msgid "Passwords do not match" +msgstr "" + +msgid "Payment Accepted" +msgstr "" + +msgid "Payment Expires:" +msgstr "" + +msgid "Payment Proposal" +msgstr "" + +msgid "Payment Proposals" +msgstr "" + +msgid "Payment Protocol Invalid" +msgstr "" + +msgid "Payment Received" +msgstr "" + +msgid "Payment Rejected" +msgstr "" + +msgid "Payment Sent" +msgstr "" + +msgid "Payment accepted, but not yet broadcasted" +msgstr "" + +msgid "" +"Payment accepted. It will be broadcasted by Glidera. In case there is a " +"problem, it can be deleted 6 hours after\n" +" it was created." +msgstr "" + +msgid "Payment address was translated to new Bitcoin Cash address format: {{addr}}" +msgstr "" + +msgid "Payment details" +msgstr "" + +msgid "Pending" +msgstr "" + +msgid "Pending Proposals" +msgstr "" + +msgid "Permanently delete this wallet." +msgstr "" + +msgid "Personal Wallet" +msgstr "" + +msgid "Please carefully write down this phrase." +msgstr "" + +msgid "Please enter a password to encrypt your wallet keys on this device storage" +msgstr "" + +msgid "Please enter the recovery phrase" +msgstr "" + +msgid "Please enter the wallet recovery phrase" +msgstr "" + +msgid "Please tap each word in the correct order." +msgstr "" + +msgid "Please upgrade Copay to perform this action" +msgstr "" + +msgid "Please, select your backup file" +msgstr "" + +msgid "Preferences" +msgstr "" + +msgid "Preparing addresses..." +msgstr "" + +msgid "Preparing backup..." +msgstr "" + +msgid "Priority" +msgstr "" + +msgid "Private Key" +msgstr "" + +msgid "Private key encrypted. Enter password" +msgstr "" + +msgid "Private key is encrypted, cannot sign" +msgstr "" + +msgid "Proposal Accepted" +msgstr "" + +msgid "Proposal Created" +msgstr "" + +msgid "Proposal Deleted" +msgstr "" + +msgid "Proposal Rejected" +msgstr "" + +msgid "Proposals" +msgstr "" + +msgid "Purchase Amount is limited to {{limitPerDay}} {{currency}} per day" +msgstr "" + +msgid "Purchase amount must be a value between 50 and 2000" +msgstr "" + +msgid "" +"Push notifications for {{appName}} are currently disabled. Enable them in " +"the Settings app." +msgstr "" + +msgid "Quick review!" +msgstr "" + +msgid "Rate on the app store" +msgstr "" + +msgid "Read less" +msgstr "" + +msgid "Read more" +msgstr "" + +msgid "Read more in our Wiki" +msgstr "" + +msgid "Read only wallet" +msgstr "" + +msgid "Receive" +msgstr "" + +msgid "Receive in" +msgstr "" + +msgid "Received" +msgstr "" + +msgid "Received Funds" +msgstr "" + +msgid "Receiving" +msgstr "" + +msgid "Recent" +msgstr "" + +msgid "Recent Transaction Card" +msgstr "" + +msgid "Recent Transactions" +msgstr "" + +msgid "Recipient" +msgstr "" + +msgid "Recipients" +msgstr "" + +msgid "Recreating Wallet..." +msgstr "" + +msgid "Redeem Now" +msgstr "" + +msgid "Reject" +msgstr "" + +msgid "Rejected" +msgstr "" + +msgid "Rejecting payment proposal..." +msgstr "" + +msgid "Release information" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "Repeat password" +msgstr "" + +msgid "Repeat the password" +msgstr "" + +msgid "Request Fingerprint" +msgstr "" + +msgid "Request Specific amount" +msgstr "" + +msgid "Request Spending Password" +msgstr "" + +msgid "Restore from backup" +msgstr "" + +msgid "Retrieving inputs information" +msgstr "" + +msgid "Save" +msgstr "" + +msgid "Scan" +msgstr "" + +msgid "Scan addresses for funds" +msgstr "" + +msgid "Scan again" +msgstr "" + +msgid "Scanner not supported" +msgstr "" + +msgid "Scanning Wallet funds..." +msgstr "" + +msgid "Scanning funds" +msgstr "" + +msgid "Scanning funds..." +msgstr "" + +msgid "Security" +msgstr "" + +msgid "See invoice →" +msgstr "" + +msgid "Select a wallet" +msgstr "" + +msgid "Selling Bitcoin..." +msgstr "" + +msgid "Send" +msgstr "" + +msgid "Send Feedback" +msgstr "" + +msgid "Send Money" +msgstr "" + +msgid "Send addresses by email" +msgstr "" + +msgid "Send by email" +msgstr "" + +msgid "Send from" +msgstr "" + +msgid "Send payment to this address" +msgstr "" + +msgid "Send us feedback instead" +msgstr "" + +msgid "Sending" +msgstr "" + +msgid "Sending 2FA code..." +msgstr "" + +msgid "Sending feedback..." +msgstr "" + +msgid "Sending maximum amount" +msgstr "" + +msgid "Sending transaction..." +msgstr "" + +msgid "Sending {{amount}} {{unit}} from your {{name}} wallet" +msgstr "" + +msgid "Sent" +msgstr "" + +msgid "Sent Funds" +msgstr "" + +msgid "Server response could not be verified" +msgstr "" + +msgid "Service not available" +msgstr "" + +msgid "Services" +msgstr "" + +msgid "Session Log" +msgstr "" + +msgid "Session log" +msgstr "" + +msgid "Set up a password" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Share the love by inviting your friends." +msgstr "" + +msgid "Share this invitation with your copayers" +msgstr "" + +msgid "Shift" +msgstr "" + +msgid "Show Services Card" +msgstr "" + +msgid "Show advanced options" +msgstr "" + +msgid "Show all" +msgstr "" + +msgid "Signatures rejected by server" +msgstr "" + +msgid "Signing transaction..." +msgstr "" + +msgid "" +"Since only you control your money, you’ll need to save your backup phrase " +"in case this app is deleted." +msgstr "" + +msgid "Skip" +msgstr "" + +msgid "Slide to accept" +msgstr "" + +msgid "Slide to pay" +msgstr "" + +msgid "Slide to send" +msgstr "" + +msgid "" +"Some of your wallets are not eligible for Bitcoin Cash support. You can try " +"to access BCH funds from these wallets\n" +" using the" +msgstr "" + +msgid "Spend proposal is not accepted" +msgstr "" + +msgid "Spend proposal not found" +msgstr "" + +msgid "Spendable" +msgstr "" + +msgid "Spending Password needed" +msgstr "" + +msgid "Spending this balance will need significant Bitcoin network fees" +msgstr "" + +msgid "Still pending" +msgstr "" + +msgid "Super Economy" +msgstr "" + +msgid "Sweep" +msgstr "" + +msgid "Sweep Completed" +msgstr "" + +msgid "Sweep paper wallet" +msgstr "" + +msgid "Sweeping Wallet..." +msgstr "" + +msgid "THIS ACTION CANNOT BE REVERSED" +msgstr "" + +msgid "Take control of your money," +msgstr "" + +msgid "Tap and hold to show" +msgstr "" + +msgid "Terms of Use" +msgstr "" + +msgid "Terms of use" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "Thank you!" +msgstr "" + +msgid "Thanks!" +msgstr "" + +msgid "" +"That's exciting to hear. We'd love to earn that fifth star from you – how " +"could we improve your experience?" +msgstr "" + +msgid "The derivation path" +msgstr "" + +msgid "The exchange rate changes with the market." +msgstr "" + +msgid "" +"The higher the fee, the greater the incentive a miner has to include that " +"transaction in a block. Current fees are determined based on network load " +"and the selected policy." +msgstr "" + +msgid "" +"The maximum number of consecutive unused addresses (20) has been reached. " +"When one of your unused addresses receives\n" +" a payment, a new address will be generated and shown in your " +"Receive tab." +msgstr "" + +msgid "The password of the recovery phrase (if set)" +msgstr "" + +msgid "" +"The payment was created but could not be completed. Please try again from " +"home screen" +msgstr "" + +msgid "The payment was removed by creator" +msgstr "" + +msgid "The request could not be understood by the server" +msgstr "" + +msgid "" +"The restore process will stop when 20 addresses are generated in a row " +"which contain no funds. To safely generate\n" +" more addresses, make a payment to one of the unused addresses " +"which has already been generated." +msgstr "" + +msgid "The spend proposal is not pending" +msgstr "" + +msgid "The wallet service URL" +msgstr "" + +msgid "There is an error in the form" +msgstr "" + +msgid "" +"There's obviously something we're doing wrong. How could we improve your " +"experience?" +msgstr "" + +msgid "This app is fantastic!" +msgstr "" + +msgid "This app stores your bitcoin with cutting-edge security." +msgstr "" + +msgid "This bitcoin payment request has expired." +msgstr "" + +msgid "" +"This recovery phrase was created with a password. To recover this wallet " +"both the recovery phrase and password are needed." +msgstr "" + +msgid "" +"This transaction amount is too small compared to current Bitcoin network " +"fees. Spending these funds will need a Bitcoin network\n" +" fee cost comparable to the funds itself." +msgstr "" + +msgid "" +"This transaction could take a long time to confirm or could be dropped due " +"to the low fees set by the sender" +msgstr "" + +msgid "" +"This wallet is not registered at the given Bitcore Wallet Service (BWS). " +"You can recreate it\n" +" from the local information." +msgstr "" + +msgid "Timeline" +msgstr "" + +msgid "To" +msgstr "" + +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "" + +msgid "Top up in progress..." +msgstr "" + +msgid "Total" +msgstr "" + +msgid "Total Locked Balance" +msgstr "" + +msgid "Total wallet inputs" +msgstr "" + +msgid "Transaction" +msgstr "" + +msgid "Transaction History" +msgstr "" + +msgid "Transaction already broadcasted" +msgstr "" + +msgid "Transaction has not been created" +msgstr "" + +msgid "Transaction not available at this time" +msgstr "" + +msgid "Transaction not found" +msgstr "" + +msgid "Transactions without fee are not supported." +msgstr "" + +msgid "Transfer to Bitcoin Cash Wallet" +msgstr "" + +msgid "Transfer to Bitcoin Wallet" +msgstr "" + +msgid "Transfer to Contact" +msgstr "" + +msgid "Try again in {{expires}}" +msgstr "" + +msgid "Unconfirmed" +msgstr "" + +msgid "Unsent transactions" +msgstr "" + +msgid "Unused addresses" +msgstr "" + +msgid "Unused addresses limit" +msgstr "" + +msgid "Update Available" +msgstr "" + +msgid "Updating Gift Card..." +msgstr "" + +msgid "Updating Gift Cards..." +msgstr "" + +msgid "Updating pending proposals. Please stand by" +msgstr "" + +msgid "Updating transaction history. Please stand by." +msgstr "" + +msgid "Updating... Please stand by" +msgstr "" + +msgid "Urgent" +msgstr "" + +msgid "Use Bitcoin Cash Copay Style Addresses" +msgstr "" + +msgid "Use Unconfirmed Funds" +msgstr "" + +msgid "Use default url" +msgstr "" + +msgid "Validating recovery phrase..." +msgstr "" + +msgid "Version" +msgstr "" + +msgid "View Transaction on Insight" +msgstr "" + +msgid "View Update" +msgstr "" + +msgid "View all addresses" +msgstr "" + +msgid "View on blockchain" +msgstr "" + +msgid "Visit mercadolivre.com.br →" +msgstr "" + +msgid "" +"WARNING: Key derivation is not working on this device/wallet. Actions " +"cannot be performed on this wallet." +msgstr "" + +msgid "" +"WARNING: Not including the private key allows to check the wallet balance, " +"transaction history, and create spend proposals\n" +" from the export. However, does not allow to approve (sign) " +"proposals, so" +msgstr "" + +msgid "" +"WARNING: The private key of this wallet is not available. The export allows " +"to check the wallet balance, transaction history,\n" +" and create spend proposals from the export. However, does " +"not allow to approve (sign) proposals, so" +msgstr "" + +msgid "Waiting for copayers" +msgstr "" + +msgid "Waiting..." +msgstr "" + +msgid "Wallet Addresses" +msgstr "" + +msgid "Wallet Color" +msgstr "" + +msgid "Wallet Configuration (m-n)" +msgstr "" + +msgid "Wallet Created" +msgstr "" + +msgid "Wallet Id" +msgstr "" + +msgid "Wallet Information" +msgstr "" + +msgid "Wallet Inputs" +msgstr "" + +msgid "Wallet Name" +msgstr "" + +msgid "Wallet Name (at creation)" +msgstr "" + +msgid "Wallet Network" +msgstr "" + +msgid "Wallet Recovery Phrase is invalid" +msgstr "" + +msgid "Wallet Service URL" +msgstr "" + +msgid "Wallet Settings" +msgstr "" + +msgid "Wallet already exists" +msgstr "" + +msgid "Wallet already in {{nameCase}}" +msgstr "" + +msgid "Wallet created" +msgstr "" + +msgid "Wallet incomplete and broken" +msgstr "" + +msgid "Wallet information" +msgstr "" + +msgid "Wallet invitation" +msgstr "" + +msgid "Wallet is full" +msgstr "" + +msgid "Wallet is locked" +msgstr "" + +msgid "Wallet is not complete" +msgstr "" + +msgid "Wallet key" +msgstr "" + +msgid "Wallet needs backup" +msgstr "" + +msgid "Wallet not backed up" +msgstr "" + +msgid "Wallet not found" +msgstr "" + +msgid "" +"Wallet not registered at the wallet service. Recreate it from \"Create " +"Wallet\" using \"Advanced Options\" to set your recovery phrase" +msgstr "" + +msgid "Wallet recovery phrase" +msgstr "" + +msgid "Wallet recovery phrase not available" +msgstr "" + +msgid "Wallet service URL" +msgstr "" + +msgid "Wallet service not found" +msgstr "" + +msgid "Warning!" +msgstr "" + +msgid "Warning: this transaction has unconfirmed inputs" +msgstr "" + +msgid "We'd love to do better. How could we improve your experience?" +msgstr "" + +msgid "We'll confirm on the next screen." +msgstr "" + +msgid "" +"We're always looking for ways to improve {{appName}}. How could we improve " +"your experience?" +msgstr "" + +msgid "" +"We're always looking for ways to improve {{appName}}. Is there anything we " +"could do better?" +msgstr "" + +msgid "Website" +msgstr "" + +msgid "" +"We’re always looking for translation contributions! You can make " +"corrections or help to make this app available in your native\n" +" language by joining our community on Crowdin." +msgstr "" + +msgid "What do you call this wallet?" +msgstr "" + +msgid "" +"When this wallet was created, it was called “{{walletName}}”. " +"You can change the name displayed on this device\n" +" below." +msgstr "" + +msgid "Where would you like to receive email notifications about payments?" +msgstr "" + +msgid "Why?" +msgstr "" + +msgid "Words" +msgstr "" + +msgid "Would you be willing to rate {{appName}} in the app store?" +msgstr "" + +msgid "Wrong number of recovery words:" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Wrong spending password" +msgstr "" + +msgid "Yes" +msgstr "" + +msgid "" +"You can make contributions by signing up on our Crowdin community " +"translation website. We’re looking forward to hearing from you!" +msgstr "" + +msgid "" +"You can see the latest developments and contribute to this open source app " +"by visiting our project on GitHub." +msgstr "" + +msgid "You can spend bitcoin at millions of websites and stores worldwide." +msgstr "" + +msgid "You can still export it from Advanced > Export." +msgstr "" + +msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." +msgstr "" + +msgid "You control your bitcoin." +msgstr "" + +msgid "You should not set a fee higher than {{maxFeeRecommended}} satoshis/byte." +msgstr "" + +msgid "" +"You'll receive email notifications about payments sent and received from " +"your wallets." +msgstr "" + +msgid "Your Gift Cards" +msgstr "" + +msgid "Your bitcoin wallet is ready!" +msgstr "" + +msgid "" +"Your extended private keys are all that is needed to access your bitcoin " +"funds. Be sure to protect your private\n" +" keys and store them only on secure devices. BitPay does not have " +"access to your private keys, so you alone are responsible\n" +" for your keys. If you share key access with external services, you " +"take responsibility for the risk of theft or breach.\n" +" Only advanced users should handle extended private keys directly." +msgstr "" + +msgid "Your fee is lower than recommended." +msgstr "" + +msgid "Your ideas, feedback, or comments" +msgstr "" + +msgid "Your name" +msgstr "" + +msgid "Your password" +msgstr "" + +msgid "Your wallet is never saved to cloud storage or standard device backups." +msgstr "" + +msgid "" +"Your wallet key will be encrypted. The Spending Password cannot be " +"recovered. Be sure to write it down." +msgstr "" + +msgid "" +"Your wallet keys will be stored in plan text in this device, if an other " +"app access the store it will be able to access your Bitcoin" +msgstr "" + +msgid "[Balance Hidden]" +msgstr "" + +msgid "[Scanning Funds]" +msgstr "" + +msgid "" +"and certify that I am the beneficial owner of the input assets and the " +"destination address." +msgstr "" + +msgid "digital money." +msgstr "" + +msgid "get started with bitcoin." +msgstr "" + +msgid "me" +msgstr "" + +msgid "no password" +msgstr "" + +msgid "password mismatch" +msgstr "" + +msgid "preparing..." +msgstr "" + +msgid "recovery tool." +msgstr "" + +msgid "redeemable on Mercado Livre (Brazil)" +msgstr "" + +msgid "{{amountUnitStr}} for Amazon.com Gift Card" +msgstr "" + +msgid "" +"{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain " +"information, networking and Copayer synchronization.\n" +" The default configuration points to https://bws.bitpay.com " +"(BitPay's public BWS instance)." +msgstr "" + +msgid "{{option.value.label}}" +msgstr "" + +msgid "{{tx.txp[wallet.id].feeRatePerStr}} of sending amount" +msgstr "" + +msgid "{{updatingTxHistoryProgress}} transactions downloaded" +msgstr "" + +msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "" \ No newline at end of file From f5a77fb44a6910c6b8923c6cd09ef8a1e762b9fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Mon, 5 Feb 2018 14:36:37 -0300 Subject: [PATCH 6/7] fix string --- src/assets/i18n/app.pot | 3 +++ .../mercado-libre/buy-mercado-libre/buy-mercado-libre.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/assets/i18n/app.pot b/src/assets/i18n/app.pot index f2844de19..e5d71f732 100644 --- a/src/assets/i18n/app.pot +++ b/src/assets/i18n/app.pot @@ -2000,6 +2000,9 @@ msgstr "" msgid "{{amountUnitStr}} for Amazon.com Gift Card" msgstr "" +msgid "{{amountUnitStr}} for Mercado Livre Brazil Gift Car" +msgstr "" + msgid "" "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain " "information, networking and Copayer synchronization.\n" diff --git a/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts b/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts index 2189cc8b1..da65d79e9 100644 --- a/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts +++ b/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts @@ -325,7 +325,7 @@ export class BuyMercadoLibrePage { invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0; let invoiceFeeSat = parseInt((invoice.buyerPaidBtcMinerFee * 100000000).toFixed()); - this.message = this.translate.instant(this.amountUnitStr + " for Mercado Livre Brazil Gift Car"); + this.message = this.translate.instant("{{amountUnitStr}} for Mercado Livre Brazil Gift Car", { amountUnitStr: this.amountUnitStr }); this.createTx(wallet, invoice, this.message).then((ctxp: any) => { this.onGoingProcessProvider.set('loadingTxInfo', false); From b918758e6aca1a4c547cab4289b33352dc7121ab Mon Sep 17 00:00:00 2001 From: Gabriel Masclef Date: Tue, 6 Feb 2018 11:10:33 -0300 Subject: [PATCH 7/7] Todo translations with params --- src/assets/i18n/app.pot | 44 ------------------- .../feedback/send-feedback/send-feedback.ts | 4 +- .../amazon/buy-amazon/buy-amazon.ts | 4 +- .../buy-mercado-libre/buy-mercado-libre.ts | 2 +- .../shapeshift-confirm/shapeshift-confirm.ts | 6 +-- src/pages/send/confirm/confirm.ts | 6 +-- src/providers/profile/profile.ts | 2 +- 7 files changed, 12 insertions(+), 56 deletions(-) diff --git a/src/assets/i18n/app.pot b/src/assets/i18n/app.pot index e5d71f732..d3003bfc6 100644 --- a/src/assets/i18n/app.pot +++ b/src/assets/i18n/app.pot @@ -24,16 +24,6 @@ msgstr "" msgid "A member of the team will review your feedback as soon as possible." msgstr "" -msgid "" -"A total of {{amountAboveMaxSizeStr}} {{coin}} were excluded. The maximum " -"size allowed for a transaction was exceeded." -msgstr "" - -msgid "" -"A total of {{amountBelowFeeStr}} {{coin}} were excluded. These funds come " -"from UTXOs smaller than the network fee provided." -msgstr "" - msgid "About" msgstr "" @@ -295,9 +285,6 @@ msgstr "" msgid "Confirm purchase" msgstr "" -msgid "Confirm to shift {{fromCoin}} to {{toCoin}}" -msgstr "" - msgid "Confirm your new spending password" msgstr "" @@ -860,9 +847,6 @@ msgstr "" msgid "Makes sense" msgstr "" -msgid "Maximum amount allowed is {{max}}" -msgstr "" - msgid "Me" msgstr "" @@ -886,9 +870,6 @@ msgstr "" msgid "Miner Fee" msgstr "" -msgid "Minimum amount required is {{min}}" -msgstr "" - msgid "Missing parameter" msgstr "" @@ -1190,9 +1171,6 @@ msgstr "" msgid "Proposals" msgstr "" -msgid "Purchase Amount is limited to {{limitPerDay}} {{currency}} per day" -msgstr "" - msgid "Purchase amount must be a value between 50 and 2000" msgstr "" @@ -1366,9 +1344,6 @@ msgstr "" msgid "Sending transaction..." msgstr "" -msgid "Sending {{amount}} {{unit}} from your {{name}} wallet" -msgstr "" - msgid "Sent" msgstr "" @@ -1774,9 +1749,6 @@ msgstr "" msgid "Wallet already exists" msgstr "" -msgid "Wallet already in {{nameCase}}" -msgstr "" - msgid "Wallet created" msgstr "" @@ -1839,16 +1811,6 @@ msgstr "" msgid "We'll confirm on the next screen." msgstr "" -msgid "" -"We're always looking for ways to improve {{appName}}. How could we improve " -"your experience?" -msgstr "" - -msgid "" -"We're always looking for ways to improve {{appName}}. Is there anything we " -"could do better?" -msgstr "" - msgid "Website" msgstr "" @@ -1997,12 +1959,6 @@ msgstr "" msgid "redeemable on Mercado Livre (Brazil)" msgstr "" -msgid "{{amountUnitStr}} for Amazon.com Gift Card" -msgstr "" - -msgid "{{amountUnitStr}} for Mercado Livre Brazil Gift Car" -msgstr "" - msgid "" "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain " "information, networking and Copayer synchronization.\n" diff --git a/src/pages/feedback/send-feedback/send-feedback.ts b/src/pages/feedback/send-feedback/send-feedback.ts index ef1b4e0db..baf2262d5 100644 --- a/src/pages/feedback/send-feedback/send-feedback.ts +++ b/src/pages/feedback/send-feedback/send-feedback.ts @@ -69,11 +69,11 @@ export class SendFeedbackPage { break; case 5: this.reaction = this.translate.instant("Thank you!"); - this.comment = this.translate.instant("We're always looking for ways to improve {{appName}}. Is there anything we could do better?", { appName: this.appName }); + this.comment = "We're always looking for ways to improve" + " " + this.appName + ". Is there anything we could do better?"; // TODO: translate break; default: this.justFeedback = true; - this.comment = this.translate.instant("We're always looking for ways to improve {{appName}}. How could we improve your experience?", { appName: this.appName }); + this.comment = "We're always looking for ways to improve" + " " + this.appName + ". How could we improve your experience?"; // TODO: translate break; } } diff --git a/src/pages/integrations/amazon/buy-amazon/buy-amazon.ts b/src/pages/integrations/amazon/buy-amazon/buy-amazon.ts index 9dc4c5f61..07f7a7bdb 100644 --- a/src/pages/integrations/amazon/buy-amazon/buy-amazon.ts +++ b/src/pages/integrations/amazon/buy-amazon/buy-amazon.ts @@ -84,7 +84,7 @@ export class BuyAmazonPage { let limitPerDay = this.amazonProvider.limitPerDay; - this.limitPerDayMessage = this.translate.instant("Purchase Amount is limited to {{limitPerDay}} {{currency}} per day", { limitPerDay: limitPerDay, currency: this.currency }); + this.limitPerDayMessage = "Purchase Amount is limited to " + limitPerDay + " " + this.currency + " per day"; // TODO: translate if (this.amount > this.amazonProvider.limitPerDay) { this.showErrorAndBack(null, this.limitPerDayMessage); @@ -336,7 +336,7 @@ export class BuyAmazonPage { invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0; let invoiceFeeSat = parseInt((invoice.buyerPaidBtcMinerFee * 100000000).toFixed()); - this.message = this.translate.instant("{{amountUnitStr}} for Amazon.com Gift Card", { amountUnitStr: this.amountUnitStr }); + this.message = this.amountUnitStr + " for Amazon.com Gift Card"; // TODO: translate this.createTx(wallet, invoice, this.message).then((ctxp: any) => { this.onGoingProcessProvider.set('loadingTxInfo', false); diff --git a/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts b/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts index da65d79e9..73fc94ad1 100644 --- a/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts +++ b/src/pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre.ts @@ -325,7 +325,7 @@ export class BuyMercadoLibrePage { invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0; let invoiceFeeSat = parseInt((invoice.buyerPaidBtcMinerFee * 100000000).toFixed()); - this.message = this.translate.instant("{{amountUnitStr}} for Mercado Livre Brazil Gift Car", { amountUnitStr: this.amountUnitStr }); + this.message = this.amountUnitStr + " for Mercado Livre Brazil Gift Car"; // TODO: translate this.createTx(wallet, invoice, this.message).then((ctxp: any) => { this.onGoingProcessProvider.set('loadingTxInfo', false); diff --git a/src/pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm.ts b/src/pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm.ts index 7cf08518b..98333fd5e 100644 --- a/src/pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm.ts +++ b/src/pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm.ts @@ -108,12 +108,12 @@ export class ShapeshiftConfirmPage { let amountNumber = Number(this.amount); if (amountNumber < min) { - let message = this.translate.instant('Minimum amount required is {{min}}', { min: min }); + let message = 'Minimum amount required is ' + min; // TODO: translate this.showErrorAndBack(null, message); return; } if (amountNumber > max) { - let message = this.translate.instant('Maximum amount allowed is {{max}}', { max: max }); + let message = 'Maximum amount allowed is ' + max; // TODO: translate this.showErrorAndBack(null, message); return; } @@ -332,7 +332,7 @@ export class ShapeshiftConfirmPage { } let fromCoin = this.fromWallet.coin.toUpperCase(); let toCoin = this.toWallet.coin.toUpperCase(); - let title = this.translate.instant('Confirm to shift {{fromCoin}} to {{toCoin}}', { fromCoin: fromCoin, toCoin: toCoin }); + let title = 'Confirm to shift ' + fromCoin + ' to ' + toCoin; // TODO: translate let okText = this.translate.instant('OK'); let cancelText = this.translate.instant('Cancel'); this.popupProvider.ionicConfirm(title, '', okText, cancelText).then((ok: any) => { diff --git a/src/pages/send/confirm/confirm.ts b/src/pages/send/confirm/confirm.ts index 8a9c13642..73fe8c3df 100644 --- a/src/pages/send/confirm/confirm.ts +++ b/src/pages/send/confirm/confirm.ts @@ -416,13 +416,13 @@ export class ConfirmPage { let warningMsg = []; if (sendMaxInfo.utxosBelowFee > 0) { let amountBelowFeeStr = (sendMaxInfo.amountBelowFee / 1e8); - let message = this.translate.instant("A total of {{amountBelowFeeStr}} {{coin}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { amountBelowFeeStr: amountBelowFeeStr, coin: this.tx.coin.toUpperCase() }); + let message = "A total of " + amountBelowFeeStr + " " + this.tx.coin.toUpperCase() + " were excluded. These funds come from UTXOs smaller than the network fee provided."; // TODO: translate warningMsg.push(message); } if (sendMaxInfo.utxosAboveMaxSize > 0) { let amountAboveMaxSizeStr = (sendMaxInfo.amountAboveMaxSize / 1e8); - let message = this.translate.instant("A total of {{amountAboveMaxSizeStr}} {{coin}} were excluded. The maximum size allowed for a transaction was exceeded.", { amountBelowFeeStr: amountAboveMaxSizeStr, coin: this.tx.coin.toUpperCase() }); + let message = "A total of " + amountAboveMaxSizeStr + " " + this.tx.coin.toUpperCase() + " were excluded. The maximum size allowed for a transaction was exceeded."; // TODO: translate warningMsg.push(message); } return warningMsg.join('\n'); @@ -530,7 +530,7 @@ export class ConfirmPage { let amount = (this.tx.amount / 1e8).toFixed(8); let unit = this.config.wallet.settings.unitName; let name = wallet.name; - let message = this.translate.instant('Sending {{amount}} {{unit}} from your {{name}} wallet', { amount: amount, unit: unit, name: name }); + let message = 'Sending ' + amount + ' ' + unit + ' from your ' + name + ' wallet'; // TODO: translate let okText = this.translate.instant('Confirm'); let cancelText = this.translate.instant('Cancel'); this.popupProvider.ionicConfirm(null, message, okText, cancelText).then((ok: boolean) => { diff --git a/src/providers/profile/profile.ts b/src/providers/profile/profile.ts index 7b9411146..99fdfc0aa 100644 --- a/src/providers/profile/profile.ts +++ b/src/providers/profile/profile.ts @@ -408,7 +408,7 @@ export class ProfileProvider { let walletId: string = wallet.credentials.walletId if (!this.profile.addWallet(JSON.parse(wallet.export()))) { - let message = this.translate.instant("Wallet already in {{nameCase}}", { nameCase: this.appProvider.info.nameCase }); + let message = "Wallet already in " + this.appProvider.info.nameCase; // TODO: translate return reject(message); }