Merge pull request #7984 from gabrielbazan7/feat/tstranslations

[V4] FEAT: ts translations
This commit is contained in:
Gustavo Maximiliano Cortez 2018-02-06 11:54:51 -03:00 committed by GitHub
commit 3a2bc48b5d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 2503 additions and 1708 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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);
});
}

View File

@ -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;
});
}

View File

@ -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<any> = 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;
}
}

View File

@ -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;
});
}

View File

@ -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 = "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 = "We're always looking for ways to improve " + this.appName + ". How could we improve your experience?";
this.comment = "We're always looking for ways to improve" + " " + this.appName + ". How could we improve your experience?"; // TODO: translate
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);
}

View File

@ -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);
});
}
}

View File

@ -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';
@ -87,6 +88,7 @@ export class HomePage {
private homeIntegrationsProvider: HomeIntegrationsProvider,
private persistenceProvider: PersistenceProvider,
private feedbackProvider: FeedbackProvider,
private translate: TranslateService
) {
this.cachedBalanceUpdateOn = '';
this.isNW = this.platformProvider.isNW;
@ -332,7 +334,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);
});
}
}
@ -367,10 +371,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);
}

View File

@ -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;
}
}

View File

@ -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 = "Purchase Amount is limited to " + limitPerDay + " " + this.currency + " per day"; // TODO: translate
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<any> {
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<any> {
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.amountUnitStr + " for Amazon.com Gift Card"; // TODO: translate
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;
});
});

View File

@ -103,7 +103,7 @@ export class SellCoinbasePage {
private publishAndSign(wallet: any, txp: any): Promise<any> {
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);
}

View File

@ -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(() => {

View File

@ -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<any> {
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<any> {
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.amountUnitStr + " for Mercado Livre Brazil Gift Car"; // TODO: translate
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;
});
});

View File

@ -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);
};

View File

@ -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 = 'Minimum amount required is ' + min; // TODO: translate
this.showErrorAndBack(null, message);
return;
}
if (amountNumber > max) {
this.showErrorAndBack(null, 'Maximum amount allowed is ' + max); // TODO: gettextCatalog
let message = 'Maximum amount allowed is ' + max; // TODO: translate
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<any> {
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 = '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) => {
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;
});
});

View File

@ -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(() => {

View File

@ -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(() => {

View File

@ -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

View File

@ -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();

View File

@ -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 = "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);
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 = "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');
};
@ -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 = '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) => {
return resolve(!ok);
});

View File

@ -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);
}

View File

@ -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) {

View File

@ -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;
});
});

View File

@ -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);
}

View File

@ -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. Were 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. Were 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);
}

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);
});
};
}

View File

@ -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,

View File

@ -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');
let okText = this.translate.instant('Open');
let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText);
}

View File

@ -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 : '';
}

View File

@ -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);
}

View File

@ -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'));
}
});
});

View File

@ -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;
});

View File

@ -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);

View File

@ -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;

View File

@ -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';
@ -31,7 +32,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.');
}
@ -71,7 +73,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);
@ -100,7 +102,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);
@ -123,7 +125,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;
@ -137,7 +141,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);

View File

@ -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 = {};
}

View File

@ -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);
});

View File

@ -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]);

View File

@ -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<any> {
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<any> {
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<any> {
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 = "Wallet already in " + this.appProvider.info.nameCase; // TODO: translate
return reject(message);
}
let skipKeyValidation: boolean = this.shouldSkipValidation(walletId);
@ -476,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 {
@ -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 {

View File

@ -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<any> {
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<any> {
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<any> {
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);