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 { Component } from '@angular/core';
import { NavController, NavParams, Events } from 'ionic-angular'; import { NavController, NavParams, Events } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { WalletDetailsPage } from '../../../pages/wallet-details/wallet-details'; import { WalletDetailsPage } from '../../../pages/wallet-details/wallet-details';
@ -40,7 +41,8 @@ export class CopayersPage {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private walletProvider: WalletProvider private walletProvider: WalletProvider,
private translate: TranslateService
) { ) {
this.secret = null; this.secret = null;
} }
@ -77,15 +79,16 @@ export class CopayersPage {
}); });
} }
}).catch((err: any) => { }).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; return;
}); });
} }
public showDeletePopup(): void { public showDeletePopup(): void {
let title = 'Confirm'; // TODO: GetTextCatalog let title = this.translate.instant('Confirm');
let msg = 'Are you sure you want to cancel and delete this wallet?'; // TODO: GetTextCatalog let msg = this.translate.instant('Are you sure you want to cancel and delete this wallet?');
this.popupProvider.ionicConfirm(title, msg, 'Ok', 'Cancel').then((res: any) => { this.popupProvider.ionicConfirm(title, msg).then((res: any) => {
if (res) this.deleteWallet(); if (res) this.deleteWallet();
}); });
} }
@ -100,7 +103,8 @@ export class CopayersPage {
this.navCtrl.parent.select(0); this.navCtrl.parent.select(0);
}).catch((err: any) => { }).catch((err: any) => {
this.onGoingProcessProvider.set('deletingWallet', false); 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 { NavController, NavParams } from 'ionic-angular';
import { Validators, FormBuilder, FormGroup } from '@angular/forms'; import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { CopayersPage } from '../copayers/copayers'; import { CopayersPage } from '../copayers/copayers';
@ -61,7 +62,8 @@ export class CreateWalletPage implements OnInit {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private logger: Logger, private logger: Logger,
private walletProvider: WalletProvider private walletProvider: WalletProvider,
private translate: TranslateService
) { ) {
this.isShared = this.navParams.get('isShared'); this.isShared = this.navParams.get('isShared');
@ -167,7 +169,9 @@ export class CreateWalletPage implements OnInit {
let pathData = this.derivationPathHelperProvider.parse(this.createForm.value.derivationPath); let pathData = this.derivationPathHelperProvider.parse(this.createForm.value.derivationPath);
if (!pathData) { 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; return;
} }
@ -177,7 +181,9 @@ export class CreateWalletPage implements OnInit {
} }
if (setSeed && !opts.mnemonic && !opts.extendedPrivateKey) { 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; return;
} }
@ -205,7 +211,8 @@ export class CreateWalletPage implements OnInit {
}).catch((err: any) => { }).catch((err: any) => {
this.onGoingProcessProvider.set('creatingWallet', false); this.onGoingProcessProvider.set('creatingWallet', false);
this.logger.warn(err); this.logger.warn(err);
this.popupProvider.ionicAlert('Error', err, 'Ok'); // TODO: GetTextCatalog let title = this.translate.instant('Error');
this.popupProvider.ionicAlert(title, err);
return; return;
}); });
} }

View File

@ -2,6 +2,7 @@ import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { NavController, NavParams } from 'ionic-angular';
import { Validators, FormBuilder, FormGroup } from '@angular/forms'; import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { TabsPage } from '../../tabs/tabs'; import { TabsPage } from '../../tabs/tabs';
@ -52,7 +53,8 @@ export class ImportWalletPage {
private platformProvider: PlatformProvider, private platformProvider: PlatformProvider,
private logger: Logger, private logger: Logger,
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private profileProvider: ProfileProvider private profileProvider: ProfileProvider,
private translate: TranslateService
) { ) {
this.reader = new FileReader(); this.reader = new FileReader();
this.defaults = this.configProvider.getDefaults(); this.defaults = this.configProvider.getDefaults();
@ -131,7 +133,9 @@ export class ImportWalletPage {
if (parsedCode.length != 5) { if (parsedCode.length != 5) {
/// Trying to import a malformed wallet export QR code /// 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; return;
} }
@ -143,8 +147,11 @@ export class ImportWalletPage {
hasPassphrase: parsedCode[4] == 'true' ? true : false hasPassphrase: parsedCode[4] == 'true' ? true : false
}; };
if (info.type == '1' && info.hasPassphrase) if (info.type == '1' && info.hasPassphrase) {
this.popupProvider.ionicAlert('Error', 'Password required. Make sure to enter your password in advanced options', 'Ok'); //TODO gettextcatalog 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.testnetEnabled = info.network == 'testnet' ? true : false;
this.importForm.controls['derivationPath'].setValue(info.derivationPath); this.importForm.controls['derivationPath'].setValue(info.derivationPath);
@ -162,12 +169,13 @@ export class ImportWalletPage {
try { try {
str2 = this.bwcProvider.getSJCL().decrypt(this.importForm.value.filePassword, str); str2 = this.bwcProvider.getSJCL().decrypt(this.importForm.value.filePassword, str);
} catch (e) { } 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); this.logger.warn(e);
}; };
if (err) { if (err) {
this.popupProvider.ionicAlert('Error', err, 'Ok'); //TODO gettextcatalog let title = this.translate.instant('Error');
this.popupProvider.ionicAlert(title, err);
return; return;
} }
@ -181,7 +189,8 @@ export class ImportWalletPage {
this.finish(wallet); this.finish(wallet);
}).catch((err: any) => { }).catch((err: any) => {
this.onGoingProcessProvider.set('importingWallet', false); 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; return;
}); });
}, 100); }, 100);
@ -216,7 +225,8 @@ export class ImportWalletPage {
if (err instanceof this.errors.NOT_AUTHORIZED) { if (err instanceof this.errors.NOT_AUTHORIZED) {
this.importErr = true; this.importErr = true;
} else { } 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); this.onGoingProcessProvider.set('importingWallet', false);
return; return;
@ -234,7 +244,8 @@ export class ImportWalletPage {
if (err instanceof this.errors.NOT_AUTHORIZED) { if (err instanceof this.errors.NOT_AUTHORIZED) {
this.importErr = true; this.importErr = true;
} else { } 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); this.onGoingProcessProvider.set('importingWallet', false);
return; return;
@ -253,7 +264,9 @@ export class ImportWalletPage {
public importFromFile(): void { public importFromFile(): void {
if (!this.importForm.valid) { 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; return;
} }
@ -261,7 +274,9 @@ export class ImportWalletPage {
let backupText = this.importForm.value.backupText; let backupText = this.importForm.value.backupText;
if (!backupFile && !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; return;
} }
@ -277,7 +292,9 @@ export class ImportWalletPage {
public importFromMnemonic(): void { public importFromMnemonic(): void {
if (!this.importForm.valid) { 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; return;
} }
@ -289,7 +306,9 @@ export class ImportWalletPage {
let pathData: any = this.derivationPathHelperProvider.parse(this.importForm.value.derivationPath); let pathData: any = this.derivationPathHelperProvider.parse(this.importForm.value.derivationPath);
if (!pathData) { 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; return;
} }
@ -301,7 +320,9 @@ export class ImportWalletPage {
let words: string = this.importForm.value.words || null; let words: string = this.importForm.value.words || null;
if (!words) { 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; return;
} else if (words.indexOf('xprv') == 0 || words.indexOf('tprv') == 0) { } else if (words.indexOf('xprv') == 0 || words.indexOf('tprv') == 0) {
return this.importExtendedPrivateKey(words, opts); return this.importExtendedPrivateKey(words, opts);
@ -309,7 +330,9 @@ export class ImportWalletPage {
let wordList: Array<any> = words.split(/[\u3000\s]+/); let wordList: Array<any> = words.split(/[\u3000\s]+/);
if ((wordList.length % 3) != 0) { 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; return;
} }
} }

View File

@ -2,6 +2,7 @@ import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { NavController, NavParams } from 'ionic-angular';
import { Validators, FormBuilder, FormGroup } from '@angular/forms'; import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { CopayersPage } from '../copayers/copayers'; import { CopayersPage } from '../copayers/copayers';
@ -38,7 +39,8 @@ export class JoinWalletPage {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private walletProvider: WalletProvider, private walletProvider: WalletProvider,
private logger: Logger private logger: Logger,
private translate: TranslateService
) { ) {
this.defaults = this.configProvider.getDefaults(); this.defaults = this.configProvider.getDefaults();
@ -120,7 +122,9 @@ export class JoinWalletPage {
let pathData = this.derivationPathHelperProvider.parse(this.joinForm.value.derivationPath); let pathData = this.derivationPathHelperProvider.parse(this.joinForm.value.derivationPath);
if (!pathData) { 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; return;
} }
@ -129,7 +133,9 @@ export class JoinWalletPage {
} }
if (setSeed && !opts.mnemonic && !opts.extendedPrivateKey) { 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; return;
} }
@ -151,7 +157,8 @@ export class JoinWalletPage {
} }
}).catch((err: any) => { }).catch((err: any) => {
this.onGoingProcessProvider.set('joiningWallet', false); 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; return;
}); });
} }

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { NavController, NavParams } from 'ionic-angular';
import { Validators, FormBuilder, FormGroup } from '@angular/forms'; import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core';
import * as _ from "lodash"; import * as _ from "lodash";
//providers //providers
@ -38,6 +39,7 @@ export class SendFeedbackPage {
private feedbackProvider: FeedbackProvider, private feedbackProvider: FeedbackProvider,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private translate: TranslateService
) { ) {
this.feedbackForm = this.formBuilder.group({ this.feedbackForm = this.formBuilder.group({
comment: ['', Validators.compose([Validators.minLength(1), Validators.required])] comment: ['', Validators.compose([Validators.minLength(1), Validators.required])]
@ -50,28 +52,28 @@ export class SendFeedbackPage {
switch (this.score) { switch (this.score) {
case 1: case 1:
this.reaction = "Ouch!"; this.reaction = this.translate.instant("Ouch!");
this.comment = "There's obviously something we're doing wrong. How could we improve your experience?"; //TODO gettextcatalog this.comment = this.translate.instant("There's obviously something we're doing wrong. How could we improve your experience?");
break; break;
case 2: case 2:
this.reaction = "Oh no!"; this.reaction = this.translate.instant("Oh no!");
this.comment = "There's obviously something we're doing wrong. How could we improve your experience?"; //TODO gettextcatalog this.comment = this.translate.instant("There's obviously something we're doing wrong. How could we improve your experience?");
break; break;
case 3: case 3:
this.reaction = "Hmm..."; this.reaction = this.translate.instant("Hmm...");
this.comment = "We'd love to do better. How could we improve your experience?"; //TODO gettextcatalog this.comment = this.translate.instant("We'd love to do better. How could we improve your experience?");
break; break;
case 4: case 4:
this.reaction = "Thanks!"; this.reaction = this.translate.instant("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.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; break;
case 5: case 5:
this.reaction = "Thank you!"; 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?"; this.comment = "We're always looking for ways to improve" + " " + this.appName + ". Is there anything we could do better?"; // TODO: translate
break; break;
default: default:
this.justFeedback = true; 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; break;
} }
} }
@ -94,9 +96,9 @@ export class SendFeedbackPage {
if (goHome) return; if (goHome) return;
this.onGoingProcessProvider.set('sendingFeedback', false); this.onGoingProcessProvider.set('sendingFeedback', false);
if (!this.score) { if (!this.score) {
let title = 'Thank you!'; //TODO gettextcatalog let title = this.translate.instant('Thank you!');
let message = 'A member of the team will review your feedback as soon as possible.'; //TODO gettextcatalog let message = this.translate.instant('A member of the team will review your feedback as soon as possible.');
let okText = 'Finish'; //TODO gettextcatalog let okText = this.translate.instant('Finish');
this.popupProvider.ionicAlert(title, message, okText).then(() => { this.popupProvider.ionicAlert(title, message, okText).then(() => {
this.feedback = ''; this.feedback = '';
this.navCtrl.pop(); this.navCtrl.pop();
@ -108,7 +110,9 @@ export class SendFeedbackPage {
}).catch((err) => { }).catch((err) => {
if (goHome) return; if (goHome) return;
this.onGoingProcessProvider.set('sendingFeedback', false); 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); if (goHome) this.navCtrl.push(HomePage);
} }

View File

@ -1,6 +1,7 @@
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import { ModalController, NavController } from 'ionic-angular'; import { ModalController, NavController } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { ProfileProvider } from '../../../providers/profile/profile'; import { ProfileProvider } from '../../../providers/profile/profile';
@ -32,7 +33,8 @@ export class ActivityPage {
private modalCtrl: ModalController, private modalCtrl: ModalController,
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private walletProvider: WalletProvider, private walletProvider: WalletProvider,
private popupProvider: PopupProvider private popupProvider: PopupProvider,
private translate: TranslateService
) { ) {
this.fetchingNotifications = true; this.fetchingNotifications = true;
} }
@ -73,7 +75,9 @@ export class ActivityPage {
modal.present(); modal.present();
}).catch((err) => { }).catch((err) => {
this.logger.warn('No txp found'); 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 { Component } from '@angular/core';
import { NavController, Events, ModalController } from 'ionic-angular'; import { NavController, Events, ModalController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { ActivityPage } from './activity/activity'; import { ActivityPage } from './activity/activity';
@ -87,6 +88,7 @@ export class HomePage {
private homeIntegrationsProvider: HomeIntegrationsProvider, private homeIntegrationsProvider: HomeIntegrationsProvider,
private persistenceProvider: PersistenceProvider, private persistenceProvider: PersistenceProvider,
private feedbackProvider: FeedbackProvider, private feedbackProvider: FeedbackProvider,
private translate: TranslateService
) { ) {
this.cachedBalanceUpdateOn = ''; this.cachedBalanceUpdateOn = '';
this.isNW = this.platformProvider.isNW; this.isNW = this.platformProvider.isNW;
@ -332,7 +334,9 @@ export class HomePage {
this.openTxpModal(_txp); this.openTxpModal(_txp);
}).catch((err: any) => { }).catch((err: any) => {
this.logger.warn('No txp found'); 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 { public goToDownload(): void {
let url = 'https://github.com/bitpay/copay/releases/latest'; let url = 'https://github.com/bitpay/copay/releases/latest';
let optIn = true; let optIn = true;
let title = 'Update Available'; //TODO gettextcatalog let title = this.translate.instant('Update Available');
let message = 'An update to this app is available. For your security, please update to the latest version.'; //TODO gettextcatalog let message = this.translate.instant('An update to this app is available. For your security, please update to the latest version.');
let okText = 'View Update'; //TODO gettextcatalog let okText = this.translate.instant('View Update');
let cancelText = 'Go Back'; //TODO gettextcatalog let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText);
} }

View File

@ -1,6 +1,7 @@
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { NavController, Events } from 'ionic-angular'; import { NavController, Events } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { AppProvider } from '../../../providers/app/app'; import { AppProvider } from '../../../providers/app/app';
@ -26,6 +27,7 @@ export class FeedbackCardPage {
private logger: Logger, private logger: Logger,
private persistenceProvider: PersistenceProvider, private persistenceProvider: PersistenceProvider,
private events: Events, private events: Events,
private translate: TranslateService
) { ) {
this.appName = this.appProvider.info.nameCase; this.appName = this.appProvider.info.nameCase;
this.score = 0; this.score = 0;
@ -45,19 +47,19 @@ export class FeedbackCardPage {
this.score = score; this.score = score;
switch (this.score) { switch (this.score) {
case 1: 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; break;
case 2: case 2:
this.button_title = "I don't like it"; //TODO gettextcatalog this.button_title = this.translate.instant("I don't like it");
break; break;
case 3: case 3:
this.button_title = "Meh - it's alright"; //TODO gettextcatalog this.button_title = this.translate.instant("Meh - it's alright");
break; break;
case 4: case 4:
this.button_title = "I like the app"; //TODO gettextcatalog this.button_title = this.translate.instant("I like the app");
break; break;
case 5: case 5:
this.button_title = "This app is fantastic!"; //TODO gettextcatalog this.button_title = this.translate.instant("This app is fantastic!");
break; break;
} }
} }

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams, ModalController, Events } from 'ionic-angular'; import { NavController, NavParams, ModalController, Events } from 'ionic-angular';
import { Logger } from '../../../../providers/logger/logger'; import { Logger } from '../../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as moment from 'moment'; import * as moment from 'moment';
@ -64,7 +65,8 @@ export class BuyAmazonPage {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private txFormatProvider: TxFormatProvider, private txFormatProvider: TxFormatProvider,
private walletProvider: WalletProvider private walletProvider: WalletProvider,
private translate: TranslateService
) { ) {
this.FEE_TOO_HIGH_LIMIT_PER = 15; this.FEE_TOO_HIGH_LIMIT_PER = 15;
this.coin = 'btc'; this.coin = 'btc';
@ -82,7 +84,7 @@ export class BuyAmazonPage {
let limitPerDay = this.amazonProvider.limitPerDay; 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) { if (this.amount > this.amazonProvider.limitPerDay) {
this.showErrorAndBack(null, this.limitPerDayMessage); this.showErrorAndBack(null, this.limitPerDayMessage);
@ -97,7 +99,7 @@ export class BuyAmazonPage {
coin: this.coin coin: this.coin
}); });
if (_.isEmpty(this.wallets)) { if (_.isEmpty(this.wallets)) {
this.showErrorAndBack(null, 'No wallets available'); // TODO: gettextCatalog this.showErrorAndBack(null, this.translate.instant('No wallets available'));
return; return;
} }
this.onWalletSelect(this.wallets[0]); // Default first wallet this.onWalletSelect(this.wallets[0]); // Default first wallet
@ -122,7 +124,7 @@ export class BuyAmazonPage {
} }
private showErrorAndBack(title: string, msg: any) { private showErrorAndBack(title: string, msg: any) {
title = title ? title : 'Error'; // TODO: gettextCatalog title = title ? title : this.translate.instant('Error');
this.logger.error(msg); this.logger.error(msg);
msg = (msg && msg.errors) ? msg.errors[0].message : msg; msg = (msg && msg.errors) ? msg.errors[0].message : msg;
this.popupProvider.ionicAlert(title, msg).then(() => { this.popupProvider.ionicAlert(title, msg).then(() => {
@ -132,7 +134,7 @@ export class BuyAmazonPage {
private showError = function (title: string, msg: any): Promise<any> { private showError = function (title: string, msg: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
title = title || 'Error'; // TODO: gettextCatalog title = title || this.translate.instant('Error');
this.logger.error(msg); this.logger.error(msg);
msg = (msg && msg.errors) ? msg.errors[0].message : msg; msg = (msg && msg.errors) ? msg.errors[0].message : msg;
this.popupProvider.ionicAlert(title, msg).then(() => { this.popupProvider.ionicAlert(title, msg).then(() => {
@ -144,7 +146,7 @@ export class BuyAmazonPage {
private publishAndSign(wallet: any, txp: any): Promise<any> { private publishAndSign(wallet: any, txp: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { 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); this.logger.info(err);
return reject(err); return reject(err);
} }
@ -184,15 +186,15 @@ export class BuyAmazonPage {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.amazonProvider.createBitPayInvoice(data, (err: any, dataInvoice: any) => { this.amazonProvider.createBitPayInvoice(data, (err: any, dataInvoice: any) => {
if (err) { if (err) {
let err_title = 'Error creating the invoice'; // TODO: gettextCatalog let err_title = this.translate.instant('Error creating the invoice');
let err_msg; let err_msg;
if (err && err.message && err.message.match(/suspended/i)) { if (err && err.message && err.message.match(/suspended/i)) {
err_title = 'Service not available'; // TODO: gettextCatalog err_title = this.translate.instant('Service not available');
err_msg = 'Amazon.com is not available at this moment. Please try back later.'; // TODO: gettextCatalog err_msg = this.translate.instant('Amazon.com is not available at this moment. Please try back later.');
} else if (err && err.message) { } else if (err && err.message) {
err_msg = err.message; err_msg = err.message;
} else { } else {
err_msg = 'Could not access to Amazon.com'; // TODO: gettextCatalog err_msg = this.translate.instant('Could not access to Amazon.com');
}; };
return reject({ return reject({
@ -205,14 +207,14 @@ export class BuyAmazonPage {
if (!accessKey) { if (!accessKey) {
return reject({ 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) => { this.amazonProvider.getBitPayInvoice(dataInvoice.invoiceId, (err: any, invoice: any) => {
if (err) { if (err) {
return reject({ 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) { if (!payProUrl) {
return reject({ return reject({
title: 'Error in Payment Protocol', // TODO: gettextCatalog title: this.translate.instant('Error in Payment Protocol'),
message: 'Invalid URL' // TODO: gettextCatalog message: this.translate.instant('Invalid URL')
}); });
} }
@ -257,7 +259,7 @@ export class BuyAmazonPage {
return resolve(ctxp); return resolve(ctxp);
}).catch((err: any) => { }).catch((err: any) => {
return reject({ return reject({
title: 'Could not create transaction', // TODO: gettextCatalog title: this.translate.instant('Could not create transaction'),
message: this.bwcErrorProvider.msg(err) message: this.bwcErrorProvider.msg(err)
}); });
}); });
@ -288,7 +290,7 @@ export class BuyAmazonPage {
}, (err: any) => { }, (err: any) => {
this.logger.error(err); this.logger.error(err);
this.onGoingProcessProvider.set('buyingGiftCard', false); this.onGoingProcessProvider.set('buyingGiftCard', false);
this.showError(null, 'Gift card expired'); // TODO: gettextCatalog this.showError(null, this.translate.instant('Gift card expired'));
}); });
return; return;
} }
@ -334,7 +336,7 @@ export class BuyAmazonPage {
invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0; invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0;
let invoiceFeeSat = parseInt((invoice.buyerPaidBtcMinerFee * 100000000).toFixed()); 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.createTx(wallet, invoice, this.message).then((ctxp: any) => {
this.onGoingProcessProvider.set('loadingTxInfo', false); this.onGoingProcessProvider.set('loadingTxInfo', false);
@ -374,12 +376,12 @@ export class BuyAmazonPage {
public buyConfirm() { public buyConfirm() {
if (!this.createdTx) { 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; return;
} }
var title = 'Confirm'; // TODO: gettextCatalog var title = this.translate.instant('Confirm');
var okText = 'OK'; // TODO: gettextCatalog var okText = this.translate.instant('OK');
var cancelText = 'Cancel'; // TODO: gettextCatalog var cancelText = this.translate.instant('Cancel');
this.popupProvider.ionicConfirm(title, this.message, okText, cancelText).then((ok) => { this.popupProvider.ionicConfirm(title, this.message, okText, cancelText).then((ok) => {
if (!ok) { if (!ok) {
return; return;
@ -390,7 +392,7 @@ export class BuyAmazonPage {
this.checkTransaction(1, this.createdTx.giftData); this.checkTransaction(1, this.createdTx.giftData);
}).catch((err: any) => { }).catch((err: any) => {
this._resetValues(); this._resetValues();
this.showError('Could not send transaction', err); // TODO: gettextCatalog this.showError(this.translate.instant('Could not send transaction'), err);
return; return;
}); });
}); });

View File

@ -103,7 +103,7 @@ export class SellCoinbasePage {
private publishAndSign(wallet: any, txp: any): Promise<any> { private publishAndSign(wallet: any, txp: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { 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); this.logger.info(err);
return reject(err); return reject(err);
} }

View File

@ -36,7 +36,7 @@ export class GlideraSettingsPage {
} }
private showErrorAndBack(title: string, msg: any) { private showErrorAndBack(title: string, msg: any) {
title = title ? title : 'Error'; // TODO: gettextCatalog title = title ? title : 'Error';
this.logger.error(msg); this.logger.error(msg);
msg = (msg && msg.errors) ? msg.errors[0].message : msg; msg = (msg && msg.errors) ? msg.errors[0].message : msg;
this.popupProvider.ionicAlert(title, msg).then(() => { this.popupProvider.ionicAlert(title, msg).then(() => {

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams, ModalController, Events } from 'ionic-angular'; import { NavController, NavParams, ModalController, Events } from 'ionic-angular';
import { Logger } from '../../../../providers/logger/logger'; import { Logger } from '../../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as moment from 'moment'; import * as moment from 'moment';
@ -64,7 +65,8 @@ export class BuyMercadoLibrePage {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private txFormatProvider: TxFormatProvider, private txFormatProvider: TxFormatProvider,
private walletProvider: WalletProvider private walletProvider: WalletProvider,
private translate: TranslateService
) { ) {
this.FEE_TOO_HIGH_LIMIT_PER = 15; this.FEE_TOO_HIGH_LIMIT_PER = 15;
this.coin = 'btc'; this.coin = 'btc';
@ -81,7 +83,7 @@ export class BuyMercadoLibrePage {
this.currency = this.navParams.data.currency.toUpperCase(); this.currency = this.navParams.data.currency.toUpperCase();
if (this.amount > 2000 || this.amount < 50) { 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; return;
} }
@ -92,7 +94,7 @@ export class BuyMercadoLibrePage {
coin: this.coin coin: this.coin
}); });
if (_.isEmpty(this.wallets)) { if (_.isEmpty(this.wallets)) {
this.showErrorAndBack(null, 'No wallets available'); // TODO: gettextCatalog this.showErrorAndBack(null, this.translate.instant('No wallets available'));
return; return;
} }
this.onWalletSelect(this.wallets[0]); // Default first wallet this.onWalletSelect(this.wallets[0]); // Default first wallet
@ -117,7 +119,7 @@ export class BuyMercadoLibrePage {
} }
private showErrorAndBack(title: string, msg: any) { private showErrorAndBack(title: string, msg: any) {
title = title ? title : 'Error'; // TODO: gettextCatalog title = title ? title : this.translate.instant('Error');
this.logger.error(msg); this.logger.error(msg);
msg = (msg && msg.errors) ? msg.errors[0].message : msg; msg = (msg && msg.errors) ? msg.errors[0].message : msg;
this.popupProvider.ionicAlert(title, msg).then(() => { this.popupProvider.ionicAlert(title, msg).then(() => {
@ -127,7 +129,7 @@ export class BuyMercadoLibrePage {
private showError = function (title: string, msg: any): Promise<any> { private showError = function (title: string, msg: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
title = title || 'Error'; // TODO: gettextCatalog title = title || this.translate.instant('Error');
this.logger.error(msg); this.logger.error(msg);
msg = (msg && msg.errors) ? msg.errors[0].message : msg; msg = (msg && msg.errors) ? msg.errors[0].message : msg;
this.popupProvider.ionicAlert(title, msg).then(() => { this.popupProvider.ionicAlert(title, msg).then(() => {
@ -139,7 +141,7 @@ export class BuyMercadoLibrePage {
private publishAndSign(wallet: any, txp: any): Promise<any> { private publishAndSign(wallet: any, txp: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { 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); this.logger.info(err);
return reject(err); return reject(err);
} }
@ -179,15 +181,15 @@ export class BuyMercadoLibrePage {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.mercadoLibreProvider.createBitPayInvoice(data, (err: any, dataInvoice: any) => { this.mercadoLibreProvider.createBitPayInvoice(data, (err: any, dataInvoice: any) => {
if (err) { if (err) {
let err_title = 'Error creating the invoice'; // TODO: gettextCatalog let err_title = this.translate.instant('Error creating the invoice');
let err_msg; let err_msg;
if (err && err.message && err.message.match(/suspended/i)) { if (err && err.message && err.message.match(/suspended/i)) {
err_title = 'Service not available'; // TODO: gettextCatalog err_title = this.translate.instant('Service not available');
err_msg = 'Mercadolibre Gift Card Service is not available at this moment. Please try back later.'; // TODO: gettextCatalog err_msg = this.translate.instant('Mercadolibre Gift Card Service is not available at this moment. Please try back later.');
} else if (err && err.message) { } else if (err && err.message) {
err_msg = err.message; err_msg = err.message;
} else { } else {
err_msg = 'Could not access Gift Card Service'; // TODO: gettextCatalog err_msg = this.translate.instant('Could not access Gift Card Service');
}; };
return reject({ return reject({
@ -200,14 +202,14 @@ export class BuyMercadoLibrePage {
if (!accessKey) { if (!accessKey) {
return reject({ 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) => { this.mercadoLibreProvider.getBitPayInvoice(dataInvoice.invoiceId, (err: any, invoice: any) => {
if (err) { if (err) {
return reject({ 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) { if (!payProUrl) {
return reject({ return reject({
title: 'Error in Payment Protocol', // TODO: gettextCatalog title: this.translate.instant('Error in Payment Protocol'),
message: 'Invalid URL' // TODO: gettextCatalog message: this.translate.instant('Invalid URL')
}); });
} }
@ -252,7 +254,7 @@ export class BuyMercadoLibrePage {
return resolve(ctxp); return resolve(ctxp);
}).catch((err: any) => { }).catch((err: any) => {
return reject({ return reject({
title: 'Could not create transaction', // TODO: gettextCatalog title: this.translate.instant('Could not create transaction'),
message: this.bwcErrorProvider.msg(err) message: this.bwcErrorProvider.msg(err)
}); });
}); });
@ -323,7 +325,7 @@ export class BuyMercadoLibrePage {
invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0; invoice['buyerPaidBtcMinerFee'] = invoice.buyerPaidBtcMinerFee || 0;
let invoiceFeeSat = parseInt((invoice.buyerPaidBtcMinerFee * 100000000).toFixed()); 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.createTx(wallet, invoice, this.message).then((ctxp: any) => {
this.onGoingProcessProvider.set('loadingTxInfo', false); this.onGoingProcessProvider.set('loadingTxInfo', false);
@ -363,13 +365,11 @@ export class BuyMercadoLibrePage {
public buyConfirm() { public buyConfirm() {
if (!this.createdTx) { 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; return;
} }
var title = 'Confirm'; // TODO: gettextCatalog var title = this.translate.instant('Confirm');
var okText = 'OK'; // TODO: gettextCatalog this.popupProvider.ionicConfirm(title, this.message).then((ok) => {
var cancelText = 'Cancel'; // TODO: gettextCatalog
this.popupProvider.ionicConfirm(title, this.message, okText, cancelText).then((ok) => {
if (!ok) { if (!ok) {
return; return;
} }
@ -379,7 +379,7 @@ export class BuyMercadoLibrePage {
this.checkTransaction(1, this.createdTx.giftData); this.checkTransaction(1, this.createdTx.giftData);
}).catch((err: any) => { }).catch((err: any) => {
this._resetValues(); this._resetValues();
this.showError('Could not send transaction', err); // TODO: gettextCatalog this.showError(this.translate.instant('Could not send transaction'), err);
return; return;
}); });
}); });

View File

@ -56,9 +56,9 @@ export class MercadoLibreCardDetailsPage {
let url = 'https://help.bitpay.com/requestHelp'; let url = 'https://help.bitpay.com/requestHelp';
let optIn = true; let optIn = true;
let title = null; let title = null;
let message = 'Help and support information is available at the website.'; //TODO: getTextCatalog let message = 'A informação de ajuda e suporte está disponível no site.';
let okText = 'Open'; //TODO: getTextCatalog let okText = 'Abrir';
let cancelText = 'Go Back'; //TODO: getTextCatalog let cancelText = 'Volte';
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); 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 { Logger } from '../../../../providers/logger/logger';
import * as moment from 'moment'; import * as moment from 'moment';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { ShapeshiftPage } from '../shapeshift'; import { ShapeshiftPage } from '../shapeshift';
@ -73,7 +74,8 @@ export class ShapeshiftConfirmPage {
private shapeshiftProvider: ShapeshiftProvider, private shapeshiftProvider: ShapeshiftProvider,
private txFormatProvider: TxFormatProvider, private txFormatProvider: TxFormatProvider,
private walletProvider: WalletProvider, private walletProvider: WalletProvider,
private modalCtrl: ModalController private modalCtrl: ModalController,
private translate: TranslateService
) { ) {
this.configWallet = this.configProvider.get().wallet; this.configWallet = this.configProvider.get().wallet;
this.currencyIsoCode = 'USD'; // Only USD this.currencyIsoCode = 'USD'; // Only USD
@ -93,7 +95,7 @@ export class ShapeshiftConfirmPage {
this.toWallet = this.profileProvider.getWallet(this.toWalletId); this.toWallet = this.profileProvider.getWallet(this.toWalletId);
if (_.isEmpty(this.fromWallet) || _.isEmpty(this.toWallet)) { 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; return;
} }
@ -106,11 +108,13 @@ export class ShapeshiftConfirmPage {
let amountNumber = Number(this.amount); let amountNumber = Number(this.amount);
if (amountNumber < min) { 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; return;
} }
if (amountNumber > max) { 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; return;
} }
this.createShift(); this.createShift();
@ -126,7 +130,7 @@ export class ShapeshiftConfirmPage {
}; };
private showErrorAndBack(title: string, msg: any) { private showErrorAndBack(title: string, msg: any) {
title = title ? title : 'Error'; // TODO: gettextCatalog title = title ? title : this.translate.instant('Error');
this.logger.error(msg); this.logger.error(msg);
msg = (msg && msg.errors) ? msg.errors[0].message : msg; msg = (msg && msg.errors) ? msg.errors[0].message : msg;
this.popupProvider.ionicAlert(title, msg).then(() => { this.popupProvider.ionicAlert(title, msg).then(() => {
@ -137,7 +141,7 @@ export class ShapeshiftConfirmPage {
private publishAndSign(wallet: any, txp: any): Promise<any> { private publishAndSign(wallet: any, txp: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { 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); this.logger.info(err);
return reject(err); return reject(err);
} }
@ -233,7 +237,7 @@ export class ShapeshiftConfirmPage {
return resolve(ctxp); return resolve(ctxp);
}).catch((err: any) => { }).catch((err: any) => {
return reject({ return reject({
title: 'Could not create transaction', // TODO: gettextCatalog title: this.translate.instant('Could not create transaction'),
message: this.bwcErrorProvider.msg(err) message: this.bwcErrorProvider.msg(err)
}); });
}); });
@ -323,14 +327,14 @@ export class ShapeshiftConfirmPage {
public confirmTx(): void { public confirmTx(): void {
if (!this.createdTx) { 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; return;
} }
let fromCoin = this.fromWallet.coin.toUpperCase(); let fromCoin = this.fromWallet.coin.toUpperCase();
let toCoin = this.toWallet.coin.toUpperCase(); let toCoin = this.toWallet.coin.toUpperCase();
let title = 'Confirm to shift ' + fromCoin + ' to ' + toCoin; // TODO: gettextCatalog let title = 'Confirm to shift ' + fromCoin + ' to ' + toCoin; // TODO: translate
let okText = 'OK'; // TODO: gettextCatalog let okText = this.translate.instant('OK');
let cancelText = 'Cancel'; // TODO: gettextCatalog let cancelText = this.translate.instant('Cancel');
this.popupProvider.ionicConfirm(title, '', okText, cancelText).then((ok: any) => { this.popupProvider.ionicConfirm(title, '', okText, cancelText).then((ok: any) => {
if (!ok) { if (!ok) {
return; return;
@ -342,7 +346,7 @@ export class ShapeshiftConfirmPage {
this.txSent = txSent; this.txSent = txSent;
this.saveShapeshiftData(); this.saveShapeshiftData();
}).catch((err: any) => { }).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; return;
}); });
}); });

View File

@ -2,6 +2,7 @@ import { Component } from '@angular/core';
import { NavController, Events } from 'ionic-angular'; import { NavController, Events } from 'ionic-angular';
import { Logger } from '../../../../providers/logger/logger'; import { Logger } from '../../../../providers/logger/logger';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { AmountPage } from './../../../send/amount/amount'; import { AmountPage } from './../../../send/amount/amount';
@ -39,7 +40,8 @@ export class ShapeshiftShiftPage {
private navCtrl: NavController, private navCtrl: NavController,
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private shapeshiftProvider: ShapeshiftProvider private shapeshiftProvider: ShapeshiftProvider,
private translate: TranslateService
) { ) {
this.walletsBtc = []; this.walletsBtc = [];
this.walletsBch = []; this.walletsBch = [];
@ -63,7 +65,7 @@ export class ShapeshiftShiftPage {
}); });
if (_.isEmpty(this.walletsBtc) || _.isEmpty(this.walletsBch)) { 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; return;
} }
@ -74,7 +76,7 @@ export class ShapeshiftShiftPage {
}); });
if (_.isEmpty(this.fromWallets)) { if (_.isEmpty(this.fromWallets)) {
this.showErrorAndBack(null, 'No wallets with funds'); // TODO: gettextCatalog this.showErrorAndBack(null, this.translate.instant('No wallets with funds'));
return; return;
} }
@ -95,7 +97,7 @@ export class ShapeshiftShiftPage {
} }
private showErrorAndBack(title: string, msg: any): void { private showErrorAndBack(title: string, msg: any): void {
title = title ? title : 'Error'; // TODO: gettextCatalog title = title ? title : this.translate.instant('Error');
this.logger.error(msg); this.logger.error(msg);
msg = (msg && msg.errors) ? msg.errors[0].message : msg; msg = (msg && msg.errors) ? msg.errors[0].message : msg;
this.popupProvider.ionicAlert(title, msg).then(() => { 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 { NavController, NavParams, Events, ModalController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { BwcProvider } from '../../providers/bwc/bwc'; import { BwcProvider } from '../../providers/bwc/bwc';
@ -47,7 +48,8 @@ export class PaperWalletPage {
private feeProvider: FeeProvider, private feeProvider: FeeProvider,
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private events: Events, private events: Events,
private modalCtrl: ModalController private modalCtrl: ModalController,
private translate: TranslateService
) { ) {
this.bitcore = this.bwcProvider.getBitcore(); this.bitcore = this.bwcProvider.getBitcore();
} }
@ -71,7 +73,7 @@ export class PaperWalletPage {
if (!this.wallet) return; if (!this.wallet) return;
if (!this.isPkEncrypted) this.scanFunds(); if (!this.isPkEncrypted) this.scanFunds();
else { 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.popupProvider.ionicPrompt(null, message, null).then((res) => {
this.passphrase = res; this.passphrase = res;
this.scanFunds(); this.scanFunds();
@ -118,13 +120,13 @@ export class PaperWalletPage {
this.privateKey = data.privateKey; this.privateKey = data.privateKey;
this.balanceSat = data.balance; this.balanceSat = data.balance;
if (this.balanceSat <= 0) { 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(); this.navCtrl.pop();
} }
}).catch((err: any) => { }).catch((err: any) => {
this.onGoingProcessProvider.set('scanning', false); this.onGoingProcessProvider.set('scanning', false);
this.logger.error(err); 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(); this.navCtrl.pop();
}); });
} }
@ -164,7 +166,7 @@ export class PaperWalletPage {
this.openSuccessModal(); this.openSuccessModal();
}).catch((err: any) => { }).catch((err: any) => {
this.logger.error(err); 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 { public openSuccessModal(): void {
let successComment = "Check the transaction on your wallet details"; //TODO gettextcatalog let successComment = this.translate.instant("Check the transaction on your wallet details");
let successText = 'Sweep Completed'; //TODO gettextcatalog let successText = this.translate.instant('Sweep Completed');
let modal = this.modalCtrl.create(SuccessModalPage, { successText: successText, successComment: successComment }, { showBackdrop: true, enableBackdropDismiss: false }); let modal = this.modalCtrl.create(SuccessModalPage, { successText: successText, successComment: successComment }, { showBackdrop: true, enableBackdropDismiss: false });
modal.present(); modal.present();
modal.onDidDismiss(() => { modal.onDidDismiss(() => {

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, Events, ModalController } from 'ionic-angular'; import { NavController, Events, ModalController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { PlatformProvider } from '../../providers/platform/platform'; import { PlatformProvider } from '../../providers/platform/platform';
@ -45,7 +46,8 @@ export class ScanPage {
private events: Events, private events: Events,
private modalCtrl: ModalController, private modalCtrl: ModalController,
private externalLinkProvider: ExternalLinkProvider, private externalLinkProvider: ExternalLinkProvider,
private logger: Logger private logger: Logger,
private translate: TranslateService
) { ) {
this.lightActive = false; this.lightActive = false;
this.canEnableLight = true; this.canEnableLight = true;
@ -78,7 +80,7 @@ export class ScanPage {
ionViewDidEnter() { ionViewDidEnter() {
//TODO support for browser //TODO support for browser
if (!this.platform.isCordova) { if (!this.platform.isCordova) {
this.notSupportedMessage = "Scanner not supported"; //TODO gettextcatalog this.notSupportedMessage = this.translate.instant("Scanner not supported");
return; return;
} }
// try initializing and refreshing status any time the view is entered // 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 { ViewController } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { TranslateService } from '@ngx-translate/core';
// Providers // Providers
import { FeeProvider } from '../../../providers/fee/fee'; import { FeeProvider } from '../../../providers/fee/fee';
@ -37,13 +38,12 @@ export class ChooseFeeLevelPage {
public showMaxWarning: boolean; public showMaxWarning: boolean;
public showMinWarning: boolean; public showMinWarning: boolean;
constructor( constructor(
private viewCtrl: ViewController, private viewCtrl: ViewController,
private logger: Logger, private logger: Logger,
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private feeProvider: FeeProvider private feeProvider: FeeProvider,
private translate: TranslateService
) { ) {
// From parent controller // From parent controller
this.network = this.viewCtrl.data.network; 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.customFeePerKB = this.viewCtrl.data.customFeePerKB ? this.viewCtrl.data.customFeePerKB : null;
this.feePerSatByte = this.viewCtrl.data.feePerSatByte ? this.viewCtrl.data.feePerSatByte : 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.selectedFee = this.feeLevel;
this.feeOpts = Object.keys(this.feeProvider.feeOpts); this.feeOpts = Object.keys(this.feeProvider.feeOpts);
@ -61,7 +61,7 @@ export class ChooseFeeLevelPage {
this.feeProvider.getFeeLevels(this.coin).then((levels: any) => { this.feeProvider.getFeeLevels(this.coin).then((levels: any) => {
this.loadingFee = false; this.loadingFee = false;
if (_.isEmpty(levels)) { 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; return;
} }
this.feeLevels = levels; this.feeLevels = levels;
@ -78,7 +78,7 @@ export class ChooseFeeLevelPage {
} }
private showErrorAndClose(title: string, msg: string): void { 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.logger.error(msg);
this.popupProvider.ionicAlert(title, msg).then(() => { this.popupProvider.ionicAlert(title, msg).then(() => {
this.viewCtrl.dismiss(); this.viewCtrl.dismiss();

View File

@ -2,6 +2,7 @@ import { Component } from '@angular/core';
import { NavController, NavParams, ModalController, Events } from 'ionic-angular'; import { NavController, NavParams, ModalController, Events } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { PayProPage } from '../../paypro/paypro'; import { PayProPage } from '../../paypro/paypro';
@ -72,7 +73,8 @@ export class ConfirmPage {
private txConfirmNotificationProvider: TxConfirmNotificationProvider, private txConfirmNotificationProvider: TxConfirmNotificationProvider,
private modalCtrl: ModalController, private modalCtrl: ModalController,
private txFormatProvider: TxFormatProvider, private txFormatProvider: TxFormatProvider,
private events: Events private events: Events,
private translate: TranslateService
) { ) {
this.bitcoreCash = this.bwcProvider.getBitcoreCash(); this.bitcoreCash = this.bwcProvider.getBitcoreCash();
this.CONFIRM_LIMIT_USD = 20; this.CONFIRM_LIMIT_USD = 20;
@ -110,7 +112,7 @@ export class ConfirmPage {
this.tx.feeLevelName = this.feeProvider.feeOpts[this.tx.feeLevel]; this.tx.feeLevelName = this.feeProvider.feeOpts[this.tx.feeLevel];
this.showAddress = false; this.showAddress = false;
this.walletSelectorTitle = 'Send from'; // TODO gettextCatalog this.walletSelectorTitle = this.translate.instant('Send from');
} }
ionViewDidLoad() { ionViewDidLoad() {
@ -143,7 +145,7 @@ export class ConfirmPage {
}); });
if (!this.wallets || !this.wallets.length) { 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(); return resolve();
} }
@ -165,7 +167,7 @@ export class ConfirmPage {
return reject('Could not update any wallet'); return reject('Could not update any wallet');
if (_.isEmpty(filteredWallets)) { if (_.isEmpty(filteredWallets)) {
this.setNoWallet('Insufficient funds', true); // TODO gettextCatalog this.setNoWallet(this.translate.instant('Insufficient funds'), true);
return reject('Insufficient funds'); return reject('Insufficient funds');
} }
this.wallets = _.clone(filteredWallets); this.wallets = _.clone(filteredWallets);
@ -178,7 +180,7 @@ export class ConfirmPage {
return reject('Could not update any wallet'); return reject('Could not update any wallet');
if (_.isEmpty(filteredWallets)) { if (_.isEmpty(filteredWallets)) {
this.setNoWallet('Insufficient funds', true); // TODO gettextCatalog this.setNoWallet(this.translate.instant('Insufficient funds'), true);
return reject('Insufficient funds for fee'); return reject('Insufficient funds for fee');
} }
this.wallets = _.clone(filteredWallets); this.wallets = _.clone(filteredWallets);
@ -198,7 +200,7 @@ export class ConfirmPage {
private exitWithError(err: any) { private exitWithError(err: any) {
this.logger.info('Error setting wallet selector:' + err); 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(); this.navCtrl.popToRoot();
}); });
}; };
@ -226,21 +228,21 @@ export class ConfirmPage {
private setButtonText(isMultisig: boolean, isPayPro: boolean): void { private setButtonText(isMultisig: boolean, isPayPro: boolean): void {
if (isPayPro) { if (isPayPro) {
if (this.isCordova && !this.isWindowsPhoneApp) { if (this.isCordova && !this.isWindowsPhoneApp) {
this.buttonText = 'Slide to pay'; // TODO gettextCatalog this.buttonText = this.translate.instant('Slide to pay');
} else { } else {
this.buttonText = 'Click to pay'; // TODO gettextCatalog this.buttonText = this.translate.instant('Click to pay');
} }
} else if (isMultisig) { } else if (isMultisig) {
if (this.isCordova && !this.isWindowsPhoneApp) { if (this.isCordova && !this.isWindowsPhoneApp) {
this.buttonText = 'Slide to accept'; // TODO gettextCatalog this.buttonText = this.translate.instant('Slide to accept');
} else { } else {
this.buttonText = 'Click to accept'; // TODO gettextCatalog this.buttonText = this.translate.instant('Click to accept');
} }
} else { } else {
if (this.isCordova && !this.isWindowsPhoneApp) { if (this.isCordova && !this.isWindowsPhoneApp) {
this.buttonText = 'Slide to send'; // TODO gettextCatalog this.buttonText = this.translate.instant('Slide to send');
} else { } 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) { if (now > expirationTime) {
this.paymentExpired = true; this.paymentExpired = true;
this.remainingTimeStr = 'Expired'; // TODO gettextCatalog this.remainingTimeStr = this.translate.instant('Expired');
if (countDown) { if (countDown) {
/* later */ /* later */
clearInterval(countDown); clearInterval(countDown);
@ -325,10 +327,10 @@ export class ConfirmPage {
this.logger.debug('Send max info', sendMaxInfo); this.logger.debug('Send max info', sendMaxInfo);
if (sendMaxInfo.amount == 0) { 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(() => { this.popupProvider.ionicAlert('Error', 'Not enough funds for fee').then(() => {
return resolve('no_funds'); return resolve('no_funds');
}); // TODO gettextCatalog });
} }
tx.sendMaxInfo = sendMaxInfo; tx.sendMaxInfo = sendMaxInfo;
@ -350,7 +352,7 @@ export class ConfirmPage {
}); });
}).catch((err: any) => { }).catch((err: any) => {
let msg = 'Error getting SendMax information'; // TODO gettextCatalog let msg = this.translate.instant('Error getting SendMax information');
return reject(msg); return reject(msg);
}); });
}); });
@ -414,12 +416,14 @@ export class ConfirmPage {
let warningMsg = []; let warningMsg = [];
if (sendMaxInfo.utxosBelowFee > 0) { if (sendMaxInfo.utxosBelowFee > 0) {
let amountBelowFeeStr = (sendMaxInfo.amountBelowFee / 1e8); 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) { if (sendMaxInfo.utxosAboveMaxSize > 0) {
let amountAboveMaxSizeStr = (sendMaxInfo.amountAboveMaxSize / 1e8); 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'); return warningMsg.join('\n');
}; };
@ -429,14 +433,14 @@ export class ConfirmPage {
// ToDo: use a credential's (or fc's) function for this // ToDo: use a credential's (or fc's) function for this
if (tx.description && !wallet.credentials.sharedEncryptingKey) { 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.logger.warn(msg);
this.setSendError(msg); this.setSendError(msg);
return reject(msg); return reject(msg);
} }
if (tx.amount > Number.MAX_SAFE_INTEGER) { 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.logger.warn(msg);
this.setSendError(msg); this.setSendError(msg);
return reject(msg); return reject(msg);
@ -477,7 +481,7 @@ export class ConfirmPage {
} }
private setSendError(msg: string) { 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 { public toggleAddress(): void {
@ -489,7 +493,7 @@ export class ConfirmPage {
} }
public showDescriptionPopup(tx) { public showDescriptionPopup(tx) {
let message = 'Add description'; // TODO gettextCatalog let message = this.translate.instant('Add description');
let opts = { let opts = {
defaultText: tx.description defaultText: tx.description
}; };
@ -504,7 +508,7 @@ export class ConfirmPage {
if (!tx || !wallet) return; if (!tx || !wallet) return;
if (this.paymentExpired) { 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; return;
} }
@ -526,9 +530,9 @@ export class ConfirmPage {
let amount = (this.tx.amount / 1e8).toFixed(8); let amount = (this.tx.amount / 1e8).toFixed(8);
let unit = this.config.wallet.settings.unitName; let unit = this.config.wallet.settings.unitName;
let name = wallet.name; let name = wallet.name;
let message = 'Sending ' + amount + ' ' + unit + ' from your ' + name + ' wallet'; // TODO gettextCatalog let message = 'Sending ' + amount + ' ' + unit + ' from your ' + name + ' wallet'; // TODO: translate
let okText = 'Confirm'; // TODO gettextCatalog let okText = this.translate.instant('Confirm');
let cancelText = 'Cancel'; // TODO gettextCatalog let cancelText = this.translate.instant('Cancel');
this.popupProvider.ionicConfirm(null, message, okText, cancelText).then((ok: boolean) => { this.popupProvider.ionicConfirm(null, message, okText, cancelText).then((ok: boolean) => {
return resolve(!ok); return resolve(!ok);
}); });

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController } from 'ionic-angular'; import { NavController } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//pages //pages
import { TermsOfUsePage } from './terms-of-use/terms-of-use'; import { TermsOfUsePage } from './terms-of-use/terms-of-use';
@ -23,7 +24,8 @@ export class AboutPage {
private navCtrl: NavController, private navCtrl: NavController,
private app: AppProvider, private app: AppProvider,
private logger: Logger, private logger: Logger,
private externalLinkProvider: ExternalLinkProvider private externalLinkProvider: ExternalLinkProvider,
private translate: TranslateService
) { } ) { }
ionViewDidLoad() { ionViewDidLoad() {
@ -40,10 +42,10 @@ export class AboutPage {
public openExternalLink(): void { public openExternalLink(): void {
let url = 'https://github.com/bitpay/' + this.app.info.gitHubRepoName + '/tree/' + this.app.info.commitHash + ''; let url = 'https://github.com/bitpay/' + this.app.info.gitHubRepoName + '/tree/' + this.app.info.commitHash + '';
let optIn = true; let optIn = true;
let title = 'Open GitHub Project'; //TODO gettextcatalog let title = this.translate.instant('Open GitHub Project');
let message = 'You can see the latest developments and contribute to this open source app by visiting our project on GitHub.'; //TODO gettextcatalog 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 = 'Open GitHub'; //TODO gettextcatalog let okText = this.translate.instant('Open GitHub');
let cancelText = 'Go Back'; //TODO gettextcatalog let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); 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 { DOCUMENT } from "@angular/platform-browser";
import { Inject } from '@angular/core'; import { Inject } from '@angular/core';
import { ActionSheetController, ToastController } from 'ionic-angular'; import { ActionSheetController, ToastController } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
//native //native
import { SocialSharing } from '@ionic-native/social-sharing'; import { SocialSharing } from '@ionic-native/social-sharing';
@ -34,7 +35,8 @@ export class SessionLogPage {
private socialSharing: SocialSharing, private socialSharing: SocialSharing,
private actionSheetCtrl: ActionSheetController, private actionSheetCtrl: ActionSheetController,
private toastCtrl: ToastController, private toastCtrl: ToastController,
private platformProvider: PlatformProvider private platformProvider: PlatformProvider,
private translate: TranslateService
) { ) {
this.dom = dom; this.dom = dom;
this.config = this.configProvider.get(); this.config = this.configProvider.get();
@ -84,7 +86,7 @@ export class SessionLogPage {
textarea.value = this.prepareLogs(); textarea.value = this.prepareLogs();
textarea.select(); textarea.select();
this.dom.execCommand('copy'); this.dom.execCommand('copy');
let message = 'Copied to clipboard' //TODO gettextcatalog let message = this.translate.instant('Copied to clipboard');
let showSuccess = this.toastCtrl.create({ let showSuccess = this.toastCtrl.create({
message: message, message: message,
duration: 1000, duration: 1000,
@ -107,8 +109,8 @@ export class SessionLogPage {
public showOptionsMenu(): void { public showOptionsMenu(): void {
let copyText = 'Copy to clipboard' //TODO gettextcatalog let copyText = this.translate.instant('Copy to clipboard');
let emailText = 'Send by email' //TODO gettextcatalog let emailText = this.translate.instant('Send by email');
let button = []; let button = [];
if (this.isCordova) { if (this.isCordova) {

View File

@ -1,5 +1,6 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { NavController, NavParams } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
// Pages // Pages
import { AmountPage } from '../../../../pages/send/amount/amount'; import { AmountPage } from '../../../../pages/send/amount/amount';
@ -31,7 +32,8 @@ export class AddressbookViewPage {
private bwcProvider: BwcProvider, private bwcProvider: BwcProvider,
private navCtrl: NavController, private navCtrl: NavController,
private navParams: NavParams, private navParams: NavParams,
private popupProvider: PopupProvider private popupProvider: PopupProvider,
private translate: TranslateService
) { ) {
this.bitcoreCash = this.bwcProvider.getBitcoreCash(); this.bitcoreCash = this.bwcProvider.getBitcoreCash();
this.address = this.navParams.data.contact.address; this.address = this.navParams.data.contact.address;
@ -61,14 +63,14 @@ export class AddressbookViewPage {
} }
public remove(addr: string): void { public remove(addr: string): void {
var title = 'Warning!'; // Todo: gettextCatalog var title = this.translate.instant('Warning!');
var message = 'Are you sure you want to delete this contact?'; // Todo: gettextCatalog var message = this.translate.instant('Are you sure you want to delete this contact?');
this.popupProvider.ionicConfirm(title, message, null, null).then((res: any) => { this.popupProvider.ionicConfirm(title, message, null, null).then((res: any) => {
if (!res) return; if (!res) return;
this.addressBookProvider.remove(addr).then((ab) => { this.addressBookProvider.remove(addr).then((ab) => {
this.navCtrl.pop(); this.navCtrl.pop();
}).catch((err: any) => { }).catch((err: any) => {
this.popupProvider.ionicAlert('Error', err); // Todo: gettextCatalog this.popupProvider.ionicAlert(this.translate.instant('Error'), err);
return; return;
}); });
}); });

View File

@ -2,6 +2,7 @@ import { Component } from "@angular/core";
import { NavController } from 'ionic-angular'; import { NavController } from 'ionic-angular';
import { Logger } from "../../../providers/logger/logger"; import { Logger } from "../../../providers/logger/logger";
import * as lodash from 'lodash'; import * as lodash from 'lodash';
import { TranslateService } from '@ngx-translate/core';
// Providers // Providers
import { WalletProvider } from "../../../providers/wallet/wallet"; import { WalletProvider } from "../../../providers/wallet/wallet";
@ -39,6 +40,7 @@ export class BitcoinCashPage {
private bwcErrorProvider: BwcErrorProvider, private bwcErrorProvider: BwcErrorProvider,
private bwcProvider: BwcProvider, private bwcProvider: BwcProvider,
private logger: Logger, private logger: Logger,
private translate: TranslateService
) { ) {
this.walletsBTC = this.profileProvider.getWallets({ this.walletsBTC = this.profileProvider.getWallets({
coin: 'btc', coin: 'btc',
@ -66,13 +68,13 @@ export class BitcoinCashPage {
lodash.each(this.walletsBTC, (w) => { lodash.each(this.walletsBTC, (w) => {
if (w.credentials.derivationStrategy != 'BIP44') { if (w.credentials.derivationStrategy != 'BIP44') {
w.excludeReason = 'Non BIP44 wallet'; // TODO gettextcatalog w.excludeReason = this.translate.instant('Non BIP44 wallet');
this.nonEligibleWallets.push(w); this.nonEligibleWallets.push(w);
} else if (!w.canSign()) { } else if (!w.canSign()) {
w.excludeReason = 'Read only wallet'; // TODO gettextcatalog w.excludeReason = this.translate.instant('Read only wallet');
this.nonEligibleWallets.push(w); this.nonEligibleWallets.push(w);
} else if (w.needsBackup) { } else if (w.needsBackup) {
w.excludeReason = 'Backup needed'; // TODO gettextcatalog w.excludeReason = this.translate.instant('Backup needed');
this.nonEligibleWallets.push(w); this.nonEligibleWallets.push(w);
} else { } else {
this.availableWallets.push(w); this.availableWallets.push(w);
@ -94,9 +96,9 @@ export class BitcoinCashPage {
openRecoveryToolLink(): void { openRecoveryToolLink(): void {
let url = 'https://bitpay.github.io/copay-recovery/'; let url = 'https://bitpay.github.io/copay-recovery/';
let optIn = true; let optIn = true;
let title = 'Open the recovery tool'; //TODO gettextcatalog let title = this.translate.instant('Open the recovery tool');
let okText = 'Open'; //TODO gettextcatalog let okText = this.translate.instant('Open');
let cancelText = 'Go Back'; //TODO gettextcatalog let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, null, okText, cancelText); this.externalLinkProvider.open(url, optIn, title, null, okText, cancelText);
} }

View File

@ -1,5 +1,6 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController } from 'ionic-angular'; import { NavController } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { LanguageProvider } from '../../../providers/language/language'; import { LanguageProvider } from '../../../providers/language/language';
@ -17,7 +18,8 @@ export class LanguagePage {
constructor( constructor(
private navCtrl: NavController, private navCtrl: NavController,
private languageProvider: LanguageProvider, private languageProvider: LanguageProvider,
private externalLinkProvider: ExternalLinkProvider private externalLinkProvider: ExternalLinkProvider,
private translate: TranslateService
) { ) {
this.currentLanguage = this.languageProvider.getCurrent(); this.currentLanguage = this.languageProvider.getCurrent();
this.languages = this.languageProvider.getAvailables(); this.languages = this.languageProvider.getAvailables();
@ -26,10 +28,10 @@ export class LanguagePage {
public openExternalLink(): void { public openExternalLink(): void {
let url = 'https://crowdin.com/project/copay'; let url = 'https://crowdin.com/project/copay';
let optIn = true; let optIn = true;
let title = 'Open Translation Community'; //TODO gettextcatalog let title = this.translate.instant('Open Translation Community');
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 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 = 'Open Crowdin'; //TODO gettextcatalog let okText = this.translate.instant('Open Crowdin');
let cancelText = 'Go Back'; //TODO gettextcatalog let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText);
} }

View File

@ -1,5 +1,6 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { ModalController } from 'ionic-angular'; import { ModalController } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
//pages //pages
import { PinModalPage } from '../../pin/pin'; import { PinModalPage } from '../../pin/pin';
@ -25,7 +26,8 @@ export class LockPage {
private modalCtrl: ModalController, private modalCtrl: ModalController,
private configProvider: ConfigProvider, private configProvider: ConfigProvider,
private touchIdProvider: TouchIdProvider, private touchIdProvider: TouchIdProvider,
private profileProvider: ProfileProvider private profileProvider: ProfileProvider,
private translate: TranslateService
) { ) {
this.checkLockOptions(); this.checkLockOptions();
} }
@ -82,7 +84,7 @@ export class LockPage {
let lock = { method: 'Disabled', value: null, bannedUntil: null }; let lock = { method: 'Disabled', value: null, bannedUntil: null };
this.configProvider.set({ lock }); this.configProvider.set({ lock });
this.checkLockOptions(); this.checkLockOptions();
}).catch(()=>{ }).catch(() => {
this.checkLockOptions(); this.checkLockOptions();
}); });
} }
@ -101,10 +103,10 @@ export class LockPage {
}); });
if (singleLivenetWallet) { 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; return true;
} else if (atLeastOneLivenetWallet) { } 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; return true;
} else { } else {
this.needsBackupMsg = null; this.needsBackupMsg = null;

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController } from 'ionic-angular'; import { NavController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { AppProvider } from '../../providers/app/app'; import { AppProvider } from '../../providers/app/app';
@ -53,7 +54,8 @@ export class SettingsPage {
private configProvider: ConfigProvider, private configProvider: ConfigProvider,
private logger: Logger, private logger: Logger,
private homeIntegrationsProvider: HomeIntegrationsProvider, private homeIntegrationsProvider: HomeIntegrationsProvider,
private platformProvider: PlatformProvider private platformProvider: PlatformProvider,
private translate: TranslateService
) { ) {
this.appName = this.app.info.nameCase; this.appName = this.app.info.nameCase;
this.currentLanguageName = this.language.getName(this.language.getCurrent()); 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 }); this.navCtrl.push(FeedbackCompletePage, { score: 4, skipped: true, fromSettings: true });
} }
public openIntegrationSettings(name: string): void { public openIntegrationSettings(name: string): void {
switch (name) { switch (name) {
case 'coinbase': case 'coinbase':
this.navCtrl.push(CoinbaseSettingsPage); this.navCtrl.push(CoinbaseSettingsPage);
@ -145,12 +147,12 @@ export class SettingsPage {
} }
public openHelpExternalLink(): void { public openHelpExternalLink(): void {
var url = this.appName == 'Copay' ? 'https://github.com/bitpay/copay/issues' : 'https://help.bitpay.com/bitpay-app'; let url = this.appName == 'Copay' ? 'https://github.com/bitpay/copay/issues' : 'https://help.bitpay.com/bitpay-app';
var optIn = true; let optIn = true;
var title = null; let title = null;
var message = 'Help and support information is available at the website.'; // TODO gettextCatalog let message = this.translate.instant('Help and support information is available at the website.');
var okText = 'Open'; // TODO gettextCatalog let okText = this.translate.instant('Open');
var cancelText = 'Go Back'; // TODO gettextCatalog let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText);
} }
} }

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams, ModalController } from 'ionic-angular'; import { NavController, NavParams, ModalController } from 'ionic-angular';
import { Logger } from '../../../../../providers/logger/logger'; import { Logger } from '../../../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { ProfileProvider } from '../../../../../providers/profile/profile'; import { ProfileProvider } from '../../../../../providers/profile/profile';
@ -50,7 +51,8 @@ export class WalletAddressesPage {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private modalCtrl: ModalController, private modalCtrl: ModalController,
private txFormatProvider: TxFormatProvider private txFormatProvider: TxFormatProvider,
private translate: TranslateService
) { ) {
this.UNUSED_ADDRESS_LIMIT = 5; this.UNUSED_ADDRESS_LIMIT = 5;
this.BALANCE_ADDRESS_LIMIT = 5; this.BALANCE_ADDRESS_LIMIT = 5;
@ -81,12 +83,12 @@ export class WalletAddressesPage {
}).catch((err: any) => { }).catch((err: any) => {
this.logger.error(err); this.logger.error(err);
this.loading = false; 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) => { }).catch((err: any) => {
this.logger.error(err); this.logger.error(err);
this.loading = false; 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) => { 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.walletProvider.getMainAddresses(this.wallet, { limit: 1 }).then((_addr: any) => {
this.onGoingProcessProvider.set('generatingNewAddress', false); this.onGoingProcessProvider.set('generatingNewAddress', false);
if (addr != _addr[0].address) { 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; return;
} }
this.noBalance = [_addr[0]].concat(this.noBalance); this.noBalance = [_addr[0]].concat(this.noBalance);
@ -133,7 +135,7 @@ export class WalletAddressesPage {
}).catch((err) => { }).catch((err) => {
this.logger.error(err); this.logger.error(err);
this.onGoingProcessProvider.set('generatingNewAddress', false); this.onGoingProcessProvider.set('generatingNewAddress', false);
this.popupProvider.ionicAlert('Error', err); //TODO getextcatalog this.popupProvider.ionicAlert(this.translate.instant('Error'), err);
}); });
}).catch((err) => { }).catch((err) => {
this.logger.error(err); this.logger.error(err);

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { NavController, NavParams } from 'ionic-angular';
import { Logger } from '../../../../../providers/logger/logger'; import { Logger } from '../../../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { ProfileProvider } from '../../../../../providers/profile/profile'; import { ProfileProvider } from '../../../../../providers/profile/profile';
@ -24,7 +25,8 @@ export class WalletDeletePage {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private pushNotificationsProvider: PushNotificationsProvider, private pushNotificationsProvider: PushNotificationsProvider,
private logger: Logger private logger: Logger,
private translate: TranslateService
) { ) {
} }
@ -39,14 +41,14 @@ export class WalletDeletePage {
} }
public showDeletePopup(): void { public showDeletePopup(): void {
var title = 'Warning!'; //TODO gettextcatalog let title = this.translate.instant('Warning!');
var message = 'Are you sure you want to delete this wallet?'; //TODO gettextcatalog let message = this.translate.instant('Are you sure you want to delete this wallet?');
this.popupProvider.ionicConfirm(title, message, null, null).then((res) => { this.popupProvider.ionicConfirm(title, message, null, null).then((res) => {
if (res) this.deleteWallet(); if (res) this.deleteWallet();
}); });
}; };
public deleteWallet() { public deleteWallet(): void {
this.onGoingProcessProvider.set('deletingWallet', true); this.onGoingProcessProvider.set('deletingWallet', true);
this.profileProvider.deleteWalletClient(this.wallet).then(() => { this.profileProvider.deleteWalletClient(this.wallet).then(() => {
this.onGoingProcessProvider.set('deletingWallet', false); this.onGoingProcessProvider.set('deletingWallet', false);
@ -54,7 +56,7 @@ export class WalletDeletePage {
this.navCtrl.popToRoot(); this.navCtrl.popToRoot();
this.navCtrl.parent.select(0); this.navCtrl.parent.select(0);
}).catch((err) => { }).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 { NavController, NavParams, ToastController } from 'ionic-angular';
import { Logger } from '../../../../../providers/logger/logger'; import { Logger } from '../../../../../providers/logger/logger';
import { Validators, FormBuilder, FormGroup } from '@angular/forms'; import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core';
//native //native
import { SocialSharing } from '@ionic-native/social-sharing'; import { SocialSharing } from '@ionic-native/social-sharing';
@ -52,7 +53,8 @@ export class WalletExportPage {
private socialSharing: SocialSharing, private socialSharing: SocialSharing,
private appProvider: AppProvider, private appProvider: AppProvider,
private clipboard: Clipboard, private clipboard: Clipboard,
public toastCtrl: ToastController public toastCtrl: ToastController,
private translate: TranslateService
) { ) {
this.exportWalletForm = this.formBuilder.group({ this.exportWalletForm = this.formBuilder.group({
password: ['', Validators.required], password: ['', Validators.required],
@ -121,10 +123,10 @@ export class WalletExportPage {
this.segments = 'qrCode'; this.segments = 'qrCode';
}).catch((err: string) => { }).catch((err: string) => {
this.popupProvider.ionicAlert('Error', err); //TODO gettextcatalog this.popupProvider.ionicAlert(this.translate.instant('Error'), err);
}); });
}).catch((err: string) => { }).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.popToRoot();
this.navCtrl.parent.select(0); this.navCtrl.parent.select(0);
}).catch((err: string) => { }).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(() => { }).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) => { }).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); var ew = this.backupProvider.walletExport(this.exportWalletForm.value.password, opts, this.navParams.data.walletId);
if (!ew) { 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); return resolve(ew);
}).catch((err: string) => { }).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(); return resolve();
}); });
}).catch((err: string) => { }).catch((err: string) => {
this.popupProvider.ionicAlert('Error', err); //TODO gettextcatalog this.popupProvider.ionicAlert(this.translate.instant('Error'), err);
return resolve(); return resolve();
});; });;
}); });
@ -224,7 +226,7 @@ export class WalletExportPage {
var ew = backup; var ew = backup;
if (!ew) return; if (!ew) return;
this.clipboard.copy(ew); this.clipboard.copy(ew);
let copyMessage = 'Copied to clipboard' //TODO gettextcatalog let copyMessage = this.translate.instant('Copied to clipboard');
let showSuccess = this.toastCtrl.create({ let showSuccess = this.toastCtrl.create({
message: copyMessage, message: copyMessage,
duration: 1000, duration: 1000,
@ -234,7 +236,7 @@ export class WalletExportPage {
}; };
public sendWalletBackup(): void { public sendWalletBackup(): void {
let preparingMessage = 'Preparing backup...' //TODO gettextcatalog let preparingMessage = this.translate.instant('Preparing backup...');
let showSuccess = this.toastCtrl.create({ let showSuccess = this.toastCtrl.create({
message: preparingMessage, message: preparingMessage,
duration: 1000, duration: 1000,

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { NavController, NavParams } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { ProfileProvider } from '../../../providers/profile/profile'; import { ProfileProvider } from '../../../providers/profile/profile';
@ -42,6 +43,7 @@ export class WalletSettingsPage {
private navCtrl: NavController, private navCtrl: NavController,
private navParams: NavParams, private navParams: NavParams,
private touchIdProvider: TouchIdProvider, 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 url = 'https://github.com/bitpay/copay/wiki/COPAY---FAQ#what-the-spending-password-does';
let optIn = true; let optIn = true;
let title = null; let title = null;
let message = 'Read more in our Wiki'; //TODO gettextcatalog let message = this.translate.instant('Read more in our Wiki');
let okText = 'Open';//TODO gettextcatalog let okText = this.translate.instant('Open');
let cancelText = 'Go Back';//TODO gettextcatalog let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText);
} }

View File

@ -1,5 +1,6 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { ViewController, NavParams } from 'ionic-angular'; import { ViewController, NavParams } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
@Component({ @Component({
selector: 'page-success', selector: 'page-success',
@ -12,9 +13,10 @@ export class SuccessModalPage {
constructor( constructor(
private viewCtrl: ViewController, 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 : ''; 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 { NavController, NavParams, Events } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import * as _ from "lodash"; import * as _ from "lodash";
import { TranslateService } from '@ngx-translate/core';
// Providers // Providers
import { AddressBookProvider } from '../../providers/address-book/address-book'; import { AddressBookProvider } from '../../providers/address-book/address-book';
@ -50,12 +51,13 @@ export class TxDetailsPage {
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private txConfirmNotificationProvider: TxConfirmNotificationProvider, private txConfirmNotificationProvider: TxConfirmNotificationProvider,
private txFormatProvider: TxFormatProvider, private txFormatProvider: TxFormatProvider,
private walletProvider: WalletProvider private walletProvider: WalletProvider,
private translate: TranslateService
) { ) {
this.config = this.configProvider.get(); this.config = this.configProvider.get();
this.txId = this.navParams.data.txid; 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.wallet = this.profileProvider.getWallet(this.navParams.data.walletId);
this.color = this.wallet.color; this.color = this.wallet.color;
this.copayerId = this.wallet.credentials.copayerId; 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 url = 'https://github.com/bitpay/copay/wiki/COPAY---FAQ#amount-too-low-to-spend';
let optIn = true; let optIn = true;
let title = null; let title = null;
let message = 'Read more in our Wiki'; // Todo: gettextCatalog let message = this.translate.instant('Read more in our Wiki');
let okText = 'Open'; // Todo: gettextCatalog let okText = this.translate.instant('Open');
let cancelText = 'Go Back'; // Todo: gettextCatalog let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); 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; if (this.btx.action != 'sent' && this.btx.action != 'moved' || !this.isShared) return;
let actionDescriptions = { let actionDescriptions = {
created: 'Proposal Created', // Todo: gettextCatalog created: this.translate.instant('Proposal Created'),
accept: 'Accepted', // Todo: gettextCatalog accept: this.translate.instant('Accepted'),
reject: 'Rejected', // Todo: gettextCatalog reject: this.translate.instant('Rejected'),
broadcasted: 'Broadcasted' // Todo: gettextCatalog broadcasted: this.translate.instant('Broadcasted')
}; };
this.actionList.push({ 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) + '%'; this.btx.feeRateStr = (this.btx.fees / (this.btx.amount + this.btx.fees) * 100).toFixed(2) + '%';
if (this.btx.action != 'invalid') { if (this.btx.action != 'invalid') {
if (this.btx.action == 'sent') this.title = 'Sent Funds'; // Todo: gettextCatalog if (this.btx.action == 'sent') this.title = this.translate.instant('Sent Funds');
if (this.btx.action == 'received') this.title = 'Received Funds'; // Todo: gettextCatalog if (this.btx.action == 'received') this.title = this.translate.instant('Received Funds');
if (this.btx.action == 'moved') this.title = 'Moved Funds'; // Todo: gettextCatalog if (this.btx.action == 'moved') this.title = this.translate.instant('Moved Funds');
} }
this.updateMemo(); this.updateMemo();
@ -183,7 +185,7 @@ export class TxDetailsPage {
if (!opts.hideLoading) this.onGoingProcess.set('loadingTxInfo', false); if (!opts.hideLoading) this.onGoingProcess.set('loadingTxInfo', false);
this.logger.warn('Error getting transaction: ' + err); this.logger.warn('Error getting transaction: ' + err);
this.navCtrl.pop(); 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; 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; if (typeof text == "undefined") return;
this.btx.note = { this.btx.note = {
@ -220,9 +222,9 @@ export class TxDetailsPage {
let url = 'https://' + (this.getShortNetworkName() == 'test' ? 'test-' : '') + this.blockexplorerUrl + '/tx/' + btx.txid; let url = 'https://' + (this.getShortNetworkName() == 'test' ? 'test-' : '') + this.blockexplorerUrl + '/tx/' + btx.txid;
let optIn = true; let optIn = true;
let title = null; let title = null;
let message = 'View Transaction on Insight'; // Todo: gettextCatalog let message = this.translate.instant('View Transaction on Insight');
let okText = 'Open Insight'; // Todo: gettextCatalog let okText = this.translate.instant('Open Insight');
let cancelText = 'Go Back'; // Todo: gettextCatalog let cancelText = this.translate.instant('Go Back');
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText); this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText);
} }

View File

@ -1,5 +1,6 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavParams, Events, ViewController } from 'ionic-angular'; import { NavParams, Events, ViewController } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { PlatformProvider } from '../../providers/platform/platform'; import { PlatformProvider } from '../../providers/platform/platform';
@ -52,7 +53,8 @@ export class TxpDetailsPage {
private viewCtrl: ViewController, private viewCtrl: ViewController,
private configProvider: ConfigProvider, private configProvider: ConfigProvider,
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private txFormatProvider: TxFormatProvider private txFormatProvider: TxFormatProvider,
private translate: TranslateService
) { ) {
let config = this.configProvider.get().wallet; let config = this.configProvider.get().wallet;
this.tx = this.navParams.data.tx; this.tx = this.navParams.data.tx;
@ -118,18 +120,18 @@ export class TxpDetailsPage {
if (lastSigner) { if (lastSigner) {
if (this.isCordova && !this.isWindowsPhoneApp) { if (this.isCordova && !this.isWindowsPhoneApp) {
this.buttonText = 'Slide to send'; //TODO gettextcatalog this.buttonText = this.translate.instant('Slide to send');
} else { } 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 { } else {
if (this.isCordova && !this.isWindowsPhoneApp) { if (this.isCordova && !this.isWindowsPhoneApp) {
this.buttonText = 'Slide to accept';//TODO gettextcatalog this.buttonText = this.translate.instant('Slide to accept');
} else { } 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; if (!this.isShared) return;
var actionDescriptions = { var actionDescriptions = {
created: 'Proposal Created', //TODO gettextcatalog created: this.translate.instant('Proposal Created'),
accept: 'Accepted', //TODO gettextcatalog accept: this.translate.instant('Accepted'),
reject: 'Rejected', //TODO gettextcatalog reject: this.translate.instant('Rejected'),
broadcasted: 'Broadcasted', //TODO gettextcatalog broadcasted: this.translate.instant('Broadcasted'),
}; };
this.actionList.push({ this.actionList.push({
@ -203,7 +205,7 @@ export class TxpDetailsPage {
private setError(err: any, prefix: string): void { private setError(err: any, prefix: string): void {
this.loading = false; 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 { public sign(): void {
@ -212,27 +214,27 @@ export class TxpDetailsPage {
this.events.publish('UpdateTx'); this.events.publish('UpdateTx');
//this.success(); TODO //this.success(); TODO
}).catch((err: any) => { }).catch((err: any) => {
this.setError(err, 'Could not send payment'); //TODO gettextcatalog this.setError(err, ('Could not send payment'));
}); });
} }
public reject(txp: any): void { public reject(txp: any): void {
let title = 'Warning!'; //TODO gettextcatalog let title = this.translate.instant('Warning!');
let msg = 'Are you sure you want to reject this transaction?'; //TODO gettextcatalog let msg = this.translate.instant('Are you sure you want to reject this transaction?');
this.popupProvider.ionicConfirm(title, msg, null, null).then((res: boolean) => { this.popupProvider.ionicConfirm(title, msg, null, null).then((res: boolean) => {
if (!res) return if (!res) return
this.loading = true; this.loading = true;
this.walletProvider.reject(this.wallet, this.tx).then((txpr) => { this.walletProvider.reject(this.wallet, this.tx).then((txpr) => {
this.close(); this.close();
}).catch((err: any) => { }).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 { public remove(): void {
let title = 'Warning!'; //TODO gettextcatalog let title = this.translate.instant('Warning!');
let msg = 'Are you sure you want to remove this transaction?'; //TODO gettextcatalog let msg = this.translate.instant('Are you sure you want to remove this transaction?');
this.popupProvider.ionicConfirm(title, msg, null, null).then((res: boolean) => { this.popupProvider.ionicConfirm(title, msg, null, null).then((res: boolean) => {
if (!res) return; if (!res) return;
this.onGoingProcessProvider.set('removeTx', true); this.onGoingProcessProvider.set('removeTx', true);
@ -242,7 +244,7 @@ export class TxpDetailsPage {
}).catch((err: any) => { }).catch((err: any) => {
if (err && !(err.message && err.message.match(/Unexpected/))) { if (err && !(err.message && err.message.match(/Unexpected/))) {
this.events.publish('UpdateTx'); 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 { Component } from '@angular/core';
import { NavController, NavParams, Events } from 'ionic-angular'; import { NavController, NavParams, Events } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { WalletProvider } from '../../providers/wallet/wallet'; import { WalletProvider } from '../../providers/wallet/wallet';
@ -49,7 +50,8 @@ export class WalletDetailsPage {
private bwcError: BwcErrorProvider, private bwcError: BwcErrorProvider,
private events: Events, private events: Events,
private logger: Logger, private logger: Logger,
private timeProvider: TimeProvider private timeProvider: TimeProvider,
private translate: TranslateService
) { ) {
let clearCache = this.navParams.data.clearCache; let clearCache = this.navParams.data.clearCache;
this.wallet = this.profileProvider.getWallet(this.navParams.data.walletId); this.wallet = this.profileProvider.getWallet(this.navParams.data.walletId);
@ -133,7 +135,7 @@ export class WalletDetailsPage {
this.updateTxHistoryError = false; this.updateTxHistoryError = false;
this.updatingTxHistoryProgress = 0; this.updatingTxHistoryProgress = 0;
let progressFn = (function(txs, newTxs) { let progressFn = (function (txs, newTxs) {
if (newTxs > 5) this.thistory = null; if (newTxs > 5) this.thistory = null;
this.updatingTxHistoryProgress = newTxs; this.updatingTxHistoryProgress = newTxs;
}).bind(this); }).bind(this);
@ -192,7 +194,7 @@ export class WalletDetailsPage {
if (err === 'WALLET_NOT_REGISTERED') { if (err === 'WALLET_NOT_REGISTERED') {
this.walletNotRegistered = true; this.walletNotRegistered = true;
} else { } 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; this.wallet.status = null;
}); });

View File

@ -1,9 +1,12 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Injectable() @Injectable()
export class BwcErrorProvider { export class BwcErrorProvider {
constructor() {} constructor(
private translate: TranslateService
) { }
public msg(err: any, prefix?: string): string { public msg(err: any, prefix?: string): string {
if (!err) if (!err)
@ -22,128 +25,127 @@ export class BwcErrorProvider {
let body = ''; let body = '';
prefix = prefix || ''; prefix = prefix || '';
// TODO: GetTextCatalog for errors
if (name) { if (name) {
switch (name) { switch (name) {
case 'INVALID_BACKUP': case 'INVALID_BACKUP':
body = 'Wallet Recovery Phrase is invalid'; body = this.translate.instant('Wallet Recovery Phrase is invalid');
break; break;
case 'WALLET_DOES_NOT_EXIST': 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; break;
case 'MISSING_PRIVATE_KEY': case 'MISSING_PRIVATE_KEY':
body = 'Missing private keys to sign'; body = this.translate.instant('Missing private keys to sign');
break; break;
case 'ENCRYPTED_PRIVATE_KEY': case 'ENCRYPTED_PRIVATE_KEY':
body = 'Private key is encrypted, cannot sign'; body = this.translate.instant('Private key is encrypted, cannot sign');
break; break;
case 'SERVER_COMPROMISED': case 'SERVER_COMPROMISED':
body = 'Server response could not be verified'; body = this.translate.instant('Server response could not be verified');
break; break;
case 'COULD_NOT_BUILD_TRANSACTION': case 'COULD_NOT_BUILD_TRANSACTION':
body = 'Could not build transaction'; body = this.translate.instant('Could not build transaction');
break; break;
case 'INSUFFICIENT_FUNDS': case 'INSUFFICIENT_FUNDS':
body = 'Insufficient funds'; body = this.translate.instant('Insufficient funds');
break; break;
case 'CONNECTION_ERROR': case 'CONNECTION_ERROR':
body = 'Network error'; body = this.translate.instant('Network error');
break; break;
case 'NOT_FOUND': case 'NOT_FOUND':
body = 'Wallet service not found'; body = this.translate.instant('Wallet service not found');
break; break;
case 'ECONNRESET_ERROR': case 'ECONNRESET_ERROR':
body = 'Connection reset by peer'; body = this.translate.instant('Connection reset by peer');
break; break;
case 'BAD_RESPONSE_CODE': 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; break;
case 'WALLET_ALREADY_EXISTS': case 'WALLET_ALREADY_EXISTS':
body = 'Wallet already exists'; body = this.translate.instant('Wallet already exists');
break; break;
case 'COPAYER_IN_WALLET': case 'COPAYER_IN_WALLET':
body = 'Copayer already in this wallet'; body = this.translate.instant('Copayer already in this wallet');
break; break;
case 'WALLET_FULL': case 'WALLET_FULL':
body = 'Wallet is full'; body = this.translate.instant('Wallet is full');
break; break;
case 'WALLET_NOT_FOUND': case 'WALLET_NOT_FOUND':
body = 'Wallet not found'; body = this.translate.instant('Wallet not found');
break; break;
case 'INSUFFICIENT_FUNDS_FOR_FEE': case 'INSUFFICIENT_FUNDS_FOR_FEE':
body = 'Insufficient funds for fee'; body = this.translate.instant('Insufficient funds for fee');
break; break;
case 'LOCKED_FUNDS': case 'LOCKED_FUNDS':
body = 'Funds are locked by pending spend proposals'; body = this.translate.instant('Funds are locked by pending spend proposals');
break; break;
case 'COPAYER_VOTED': case 'COPAYER_VOTED':
body = 'Copayer already voted on this spend proposal'; body = this.translate.instant('Copayer already voted on this spend proposal');
break; break;
case 'NOT_AUTHORIZED': case 'NOT_AUTHORIZED':
body = 'Not authorized'; body = this.translate.instant('Not authorized');
break; break;
case 'TX_ALREADY_BROADCASTED': case 'TX_ALREADY_BROADCASTED':
body = 'Transaction already broadcasted'; body = this.translate.instant('Transaction already broadcasted');
break; break;
case 'TX_CANNOT_CREATE': 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; break;
case 'TX_CANNOT_REMOVE': 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; break;
case 'TX_NOT_ACCEPTED': case 'TX_NOT_ACCEPTED':
body = 'Spend proposal is not accepted'; body = this.translate.instant('Spend proposal is not accepted');
break; break;
case 'TX_NOT_FOUND': case 'TX_NOT_FOUND':
body = 'Spend proposal not found'; body = this.translate.instant('Spend proposal not found');
break; break;
case 'TX_NOT_PENDING': case 'TX_NOT_PENDING':
body = 'The spend proposal is not pending'; body = this.translate.instant('The spend proposal is not pending');
break; break;
case 'UPGRADE_NEEDED': case 'UPGRADE_NEEDED':
body = 'Please upgrade Copay to perform this action'; body = this.translate.instant('Please upgrade Copay to perform this action');
break; break;
case 'BAD_SIGNATURES': case 'BAD_SIGNATURES':
body = 'Signatures rejected by server'; body = this.translate.instant('Signatures rejected by server');
break; break;
case 'COPAYER_DATA_MISMATCH': case 'COPAYER_DATA_MISMATCH':
body = 'Copayer data mismatch'; body = this.translate.instant('Copayer data mismatch');
break; break;
case 'DUST_AMOUNT': case 'DUST_AMOUNT':
body = 'Amount below minimum allowed'; body = this.translate.instant('Amount below minimum allowed');
break; break;
case 'INCORRECT_ADDRESS_NETWORK': case 'INCORRECT_ADDRESS_NETWORK':
body = 'Incorrect network address'; body = this.translate.instant('Incorrect network address');
break; break;
case 'COPAYER_REGISTERED': case 'COPAYER_REGISTERED':
body = 'Key already associated with an existing wallet'; body = this.translate.instant('Key already associated with an existing wallet');
break; break;
case 'INVALID_ADDRESS': case 'INVALID_ADDRESS':
body = 'Invalid address'; body = this.translate.instant('Invalid address');
break; break;
case 'MAIN_ADDRESS_GAP_REACHED': 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; break;
case 'WALLET_LOCKED': case 'WALLET_LOCKED':
body = 'Wallet is locked'; body = this.translate.instant('Wallet is locked');
break; break;
case 'WALLET_NOT_COMPLETE': case 'WALLET_NOT_COMPLETE':
body = 'Wallet is not complete'; body = this.translate.instant('Wallet is not complete');
break; break;
case 'WALLET_NEEDS_BACKUP': case 'WALLET_NEEDS_BACKUP':
body = 'Wallet needs backup'; body = this.translate.instant('Wallet needs backup');
break; break;
case 'MISSING_PARAMETER': case 'MISSING_PARAMETER':
body = 'Missing parameter'; body = this.translate.instant('Missing parameter');
break; break;
case 'NO_PASSWORD_GIVEN': case 'NO_PASSWORD_GIVEN':
body = 'Spending Password needed'; body = this.translate.instant('Spending Password needed');
break; break;
case 'PASSWORD_INCORRECT': case 'PASSWORD_INCORRECT':
body = 'Wrong spending password'; body = this.translate.instant('Wrong spending password');
break; break;
case 'EXCEEDED_DAILY_LIMIT': case 'EXCEEDED_DAILY_LIMIT':
body = 'Exceeded daily limit of $500 per user'; body = this.translate.instant('Exceeded daily limit of $500 per user');
break; break;
case 'ERROR': case 'ERROR':
body = (err.message || err.error); body = (err.message || err.error);

View File

@ -1,5 +1,6 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { ConfigProvider } from '../../providers/config/config'; import { ConfigProvider } from '../../providers/config/config';
@ -13,12 +14,12 @@ export class FeeProvider {
private CACHE_TIME_TS: number = 60; private CACHE_TIME_TS: number = 60;
// Constant fee options to translate // Constant fee options to translate
public feeOpts: any = { public feeOpts: any = {
urgent: 'Urgent', //TODO gettextcatalog urgent: this.translate.instant('Urgent'),
priority: 'Priority',//TODO gettextcatalog priority: this.translate.instant('Priority'),
normal: 'Normal',//TODO gettextcatalog normal: this.translate.instant('Normal'),
economy: 'Economy',//TODO gettextcatalog economy: this.translate.instant('Economy'),
superEconomy: 'Super Economy',//TODO gettextcatalog superEconomy: this.translate.instant('Super Economy'),
custom: 'Custom'//TODO gettextcatalog custom: this.translate.instant('Custom')
}; };
private cache: any = { private cache: any = {
updateTs: 0, updateTs: 0,
@ -28,7 +29,8 @@ export class FeeProvider {
constructor( constructor(
private configProvider: ConfigProvider, private configProvider: ConfigProvider,
private logger: Logger, private logger: Logger,
private bwcProvider: BwcProvider private bwcProvider: BwcProvider,
private translate: TranslateService
) { ) {
this.logger.info('FeeProvider initialized.'); this.logger.info('FeeProvider initialized.');
} }
@ -54,7 +56,7 @@ export class FeeProvider {
}); });
} }
if (!feeLevelRate || !feeLevelRate.feePerKb) { 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); return reject(msg);
} }
@ -89,11 +91,11 @@ export class FeeProvider {
walletClient.getFeeLevels(coin, 'livenet', (errLivenet, levelsLivenet) => { walletClient.getFeeLevels(coin, 'livenet', (errLivenet, levelsLivenet) => {
if (errLivenet) { 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) => { walletClient.getFeeLevels('btc', 'testnet', (errTestnet, levelsTestnet) => {
if (errTestnet) { 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.updateTs = Date.now();
this.cache.coin = coin; this.cache.coin = coin;

View File

@ -1,6 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Events, NavController, App } from 'ionic-angular'; import { Events, NavController, App } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { BwcProvider } from '../bwc/bwc'; import { BwcProvider } from '../bwc/bwc';
@ -31,7 +32,8 @@ export class IncomingDataProvider {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private logger: Logger, private logger: Logger,
private appProvider: AppProvider, private appProvider: AppProvider,
private addressProvider: AddressProvider private addressProvider: AddressProvider,
private translate: TranslateService
) { ) {
this.logger.info('IncomingDataProvider initialized.'); this.logger.info('IncomingDataProvider initialized.');
} }
@ -71,7 +73,7 @@ export class IncomingDataProvider {
this.handlePayPro(details, coin); this.handlePayPro(details, coin);
}).catch((err: string) => { }).catch((err: string) => {
if (addr && amount) this.goSend(addr, amount, message, coin); 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 { } else {
this.goSend(addr, amount, message, coin); this.goSend(addr, amount, message, coin);
@ -100,7 +102,7 @@ export class IncomingDataProvider {
if (addr && amount) if (addr && amount)
this.goSend(addr, amount, message, coin); this.goSend(addr, amount, message, coin);
else else
this.popupProvider.ionicAlert('Error', err);//TODO gettextcatalog this.popupProvider.ionicAlert(this.translate.instant('Error'), err);
}); });
} else { } else {
this.goSend(addr, amount, message, coin); this.goSend(addr, amount, message, coin);
@ -123,7 +125,9 @@ export class IncomingDataProvider {
// Translate address // Translate address
this.logger.debug('address transalated to:' + addr); 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; if (!res) return false;
message = parsed.message; message = parsed.message;
@ -137,7 +141,7 @@ export class IncomingDataProvider {
if (addr && amount) if (addr && amount)
this.goSend(addr, amount, message, coin); this.goSend(addr, amount, message, coin);
else else
this.popupProvider.ionicAlert('Error', err);//TODO gettextcatalog this.popupProvider.ionicAlert(this.translate.instant('Error'), err);
}); });
} else { } else {
this.goSend(addr, amount, message, coin); this.goSend(addr, amount, message, coin);

View File

@ -2,6 +2,7 @@ import { Injectable } from '@angular/core';
import { LoadingController } from 'ionic-angular'; import { LoadingController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { TranslateService } from '@ngx-translate/core';
@Injectable() @Injectable()
export class OnGoingProcessProvider { export class OnGoingProcessProvider {
@ -14,49 +15,49 @@ export class OnGoingProcessProvider {
constructor( constructor(
private loadingCtrl: LoadingController, private loadingCtrl: LoadingController,
private logger: Logger, private logger: Logger,
private translate: TranslateService
) { ) {
this.logger.info('OnGoingProcessProvider initialized.'); this.logger.info('OnGoingProcessProvider initialized.');
// TODO gettextcatalog()
// TODO GET - CLEAR - CHECK DecimalPipe for FILTER WITH TRANSLATE // TODO GET - CLEAR - CHECK DecimalPipe for FILTER WITH TRANSLATE
this.processNames = { this.processNames = {
'broadcastingTx': 'Broadcasting transaction...', 'broadcastingTx': this.translate.instant('Broadcasting transaction...'),
'calculatingFee': 'Calculating fee...', 'calculatingFee': this.translate.instant('Calculating fee...'),
'connectingCoinbase': 'Connecting to Coinbase...', 'connectingCoinbase': this.translate.instant('Connecting to Coinbase...'),
'connectingGlidera': 'Connecting to Glidera...', 'connectingGlidera': this.translate.instant('Connecting to Glidera...'),
'connectingShapeshift': 'Connecting to Shapeshift...', 'connectingShapeshift': this.translate.instant('Connecting to Shapeshift...'),
'creatingTx': 'Creating transaction...', 'creatingTx': this.translate.instant('Creating transaction...'),
'creatingWallet': 'Creating Wallet...', 'creatingWallet': this.translate.instant('Creating Wallet...'),
'deletingWallet': 'Deleting Wallet...', 'deletingWallet': this.translate.instant('Deleting Wallet...'),
'extractingWalletInfo': 'Extracting Wallet information...', 'extractingWalletInfo': this.translate.instant('Extracting Wallet information...'),
'fetchingPayPro': 'Fetching payment information', 'fetchingPayPro': this.translate.instant('Fetching payment information'),
'generatingCSV': 'Generating .csv file...', 'generatingCSV': this.translate.instant('Generating .csv file...'),
'gettingFeeLevels': 'Getting fee levels...', 'gettingFeeLevels': this.translate.instant('Getting fee levels...'),
'importingWallet': 'Importing Wallet...', 'importingWallet': this.translate.instant('Importing Wallet...'),
'joiningWallet': 'Joining Wallet...', 'joiningWallet': this.translate.instant('Joining Wallet...'),
'recreating': 'Recreating Wallet...', 'recreating': this.translate.instant('Recreating Wallet...'),
'rejectTx': 'Rejecting payment proposal...', 'rejectTx': this.translate.instant('Rejecting payment proposal...'),
'removeTx': 'Deleting payment proposal...', 'removeTx': this.translate.instant('Deleting payment proposal...'),
'retrievingInputs': 'Retrieving inputs information', 'retrievingInputs': this.translate.instant('Retrieving inputs information'),
'scanning': 'Scanning Wallet funds...', 'scanning': this.translate.instant('Scanning Wallet funds...'),
'sendingTx': 'Sending transaction...', 'sendingTx': this.translate.instant('Sending transaction...'),
'signingTx': 'Signing transaction...', 'signingTx': this.translate.instant('Signing transaction...'),
'sweepingWallet': 'Sweeping Wallet...', 'sweepingWallet': this.translate.instant('Sweeping Wallet...'),
'validatingWords': 'Validating recovery phrase...', 'validatingWords': this.translate.instant('Validating recovery phrase...'),
'loadingTxInfo': 'Loading transaction info...', 'loadingTxInfo': this.translate.instant('Loading transaction info...'),
'sendingFeedback': 'Sending feedback...', 'sendingFeedback': this.translate.instant('Sending feedback...'),
'generatingNewAddress': 'Generating new address...', 'generatingNewAddress': this.translate.instant('Generating new address...'),
'sendingByEmail': 'Preparing addresses...', 'sendingByEmail': this.translate.instant('Preparing addresses...'),
'sending2faCode': 'Sending 2FA code...', 'sending2faCode': this.translate.instant('Sending 2FA code...'),
'buyingBitcoin': 'Buying Bitcoin...', 'buyingBitcoin': this.translate.instant('Buying Bitcoin...'),
'sellingBitcoin': 'Selling Bitcoin...', 'sellingBitcoin': this.translate.instant('Selling Bitcoin...'),
'fetchingBitPayAccount': 'Fetching BitPay Account...', 'fetchingBitPayAccount': this.translate.instant('Fetching BitPay Account...'),
'updatingGiftCards': 'Updating Gift Cards...', 'updatingGiftCards': this.translate.instant('Updating Gift Cards...'),
'updatingGiftCard': 'Updating Gift Card...', 'updatingGiftCard': this.translate.instant('Updating Gift Card...'),
'cancelingGiftCard': 'Canceling Gift Card...', 'cancelingGiftCard': this.translate.instant('Canceling Gift Card...'),
'creatingGiftCard': 'Creating Gift Card...', 'creatingGiftCard': this.translate.instant('Creating Gift Card...'),
'buyingGiftCard': 'Buying Gift Card...', 'buyingGiftCard': this.translate.instant('Buying Gift Card...'),
'topup': 'Top up in progress...', 'topup': this.translate.instant('Top up in progress...'),
'duplicatingWallet': 'Duplicating wallet...', 'duplicatingWallet': this.translate.instant('Duplicating wallet...'),
}; };
this.ongoingProcess = {}; this.ongoingProcess = {};
} }

View File

@ -1,5 +1,6 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
//providers //providers
import { ProfileProvider } from '../profile/profile'; import { ProfileProvider } from '../profile/profile';
@ -10,7 +11,8 @@ export class PayproProvider {
constructor( constructor(
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private logger: Logger, private logger: Logger,
private onGoingProcessProvider: OnGoingProcessProvider private onGoingProcessProvider: OnGoingProcessProvider,
private translate: TranslateService
) { ) {
this.logger.info('PayproProvider initialized'); this.logger.info('PayproProvider initialized');
} }
@ -35,7 +37,7 @@ export class PayproProvider {
if (err) return reject(err); if (err) return reject(err);
else if (!paypro.verified) { else if (!paypro.verified) {
this.logger.warn('Failed to verify payment protocol signatures'); 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); return resolve(paypro);
}); });

View File

@ -1,13 +1,14 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { AlertController } from 'ionic-angular'; import { AlertController } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
@Injectable() @Injectable()
export class PopupProvider { export class PopupProvider {
constructor( constructor(
private alertCtrl: AlertController, private alertCtrl: AlertController,
private logger: Logger private logger: Logger,
private translate: TranslateService
) { ) {
} }
@ -19,7 +20,7 @@ export class PopupProvider {
enableBackdropDismiss: false, enableBackdropDismiss: false,
buttons: [ buttons: [
{ {
text: okText ? okText : 'OK', text: okText ? okText : this.translate.instant('Ok'),
handler: () => { handler: () => {
this.logger.info('Ok clicked'); this.logger.info('Ok clicked');
resolve(); resolve();
@ -38,14 +39,14 @@ export class PopupProvider {
message: message, message: message,
buttons: [ buttons: [
{ {
text: cancelText ? cancelText : 'Cancel', text: cancelText ? cancelText : this.translate.instant('Cancel'),
handler: () => { handler: () => {
this.logger.info('Disagree clicked'); this.logger.info('Disagree clicked');
resolve(false); resolve(false);
} }
}, },
{ {
text: okText ? okText : 'OK', text: okText ? okText : this.translate.instant('Ok'),
handler: () => { handler: () => {
this.logger.info('Agree clicked'); this.logger.info('Agree clicked');
resolve(true); resolve(true);
@ -75,14 +76,14 @@ export class PopupProvider {
], ],
buttons: [ buttons: [
{ {
text: cancelText ? cancelText : 'Cancel', text: cancelText ? cancelText : this.translate.instant('Cancel'),
handler: data => { handler: data => {
this.logger.info('Cancel clicked'); this.logger.info('Cancel clicked');
resolve(null); resolve(null);
} }
}, },
{ {
text: okText ? okText : 'OK', text: okText ? okText : this.translate.instant('Ok'),
handler: data => { handler: data => {
this.logger.info('Saved clicked'); this.logger.info('Saved clicked');
resolve(data[0]); resolve(data[0]);

View File

@ -1,6 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Events } from 'ionic-angular'; import { Events } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core';
import * as _ from 'lodash'; import * as _ from 'lodash';
//providers //providers
@ -38,7 +39,8 @@ export class ProfileProvider {
private languageProvider: LanguageProvider, private languageProvider: LanguageProvider,
private events: Events, private events: Events,
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private onGoingProcessProvider: OnGoingProcessProvider private onGoingProcessProvider: OnGoingProcessProvider,
private translate: TranslateService
) { ) {
this.throttledBwsEvent = _.throttle((n, wallet) => { this.throttledBwsEvent = _.throttle((n, wallet) => {
this.newBwsEvent(n, wallet); this.newBwsEvent(n, wallet);
@ -311,7 +313,7 @@ export class ProfileProvider {
password: opts.password password: opts.password
}); });
} catch (err) { } 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); let strParsed: any = JSON.parse(str);
@ -351,10 +353,10 @@ export class ProfileProvider {
private showWarningNoEncrypt(): Promise<any> { private showWarningNoEncrypt(): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let title = 'Are you sure?'; //TODO gettextcatalog let title = this.translate.instant('Are you sure?');
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 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 = 'Yes'; //TODO gettextcatalog let okText = this.translate.instant('Yes');
let cancelText = 'No'; //TODO gettextcatalog let cancelText = this.translate.instant('No');
this.popupProvider.ionicConfirm(title, msg, okText, cancelText).then((res: any) => { this.popupProvider.ionicConfirm(title, msg, okText, cancelText).then((res: any) => {
return resolve(res); return resolve(res);
}); });
@ -363,19 +365,19 @@ export class ProfileProvider {
private encrypt(wallet: any): Promise<any> { private encrypt(wallet: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let title = 'Please enter a password to encrypt your wallet keys on this device storage'; //TODO gettextcatalog let title = this.translate.instant('Please enter a password to encrypt your wallet keys on this device storage');
let warnMsg = 'Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down.'; //TODO gettextcatalog 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) => { this.askPassword(warnMsg, title).then((password: string) => {
if (!password) { if (!password) {
this.showWarningNoEncrypt().then((res: any) => { this.showWarningNoEncrypt().then((res: any) => {
if (res) return resolve(); //TODO gettextcatalog if (res) return resolve();
this.encrypt(wallet).then(() => { this.encrypt(wallet).then(() => {
return resolve(); return resolve();
}); });
}); });
} }
else { 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) => { this.askPassword(warnMsg, title).then((password2: string) => {
if (!password2 || password != password2) { if (!password2 || password != password2) {
this.encrypt(wallet).then(() => { this.encrypt(wallet).then(() => {
@ -395,7 +397,7 @@ export class ProfileProvider {
private addAndBindWalletClient(wallet: any, opts: any): Promise<any> { private addAndBindWalletClient(wallet: any, opts: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!wallet || !wallet.credentials) { if (!wallet || !wallet.credentials) {
return reject('Could not access wallet'); // TODO gettextCatalog return reject(this.translate.instant('Could not access wallet'));
} }
// Encrypt wallet // Encrypt wallet
@ -406,7 +408,8 @@ export class ProfileProvider {
let walletId: string = wallet.credentials.walletId let walletId: string = wallet.credentials.walletId
if (!this.profile.addWallet(JSON.parse(wallet.export()))) { 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); let skipKeyValidation: boolean = this.shouldSkipValidation(walletId);
@ -476,7 +479,7 @@ export class ProfileProvider {
walletClient.importFromExtendedPrivateKey(xPrivKey, opts, (err: any) => { walletClient.importFromExtendedPrivateKey(xPrivKey, opts, (err: any) => {
if (err) { if (err) {
if (err instanceof this.errors.NOT_AUTHORIZED) return reject(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); return reject(msg);
}); });
} else { } else {
@ -521,7 +524,7 @@ export class ProfileProvider {
return reject(err); 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); return reject(msg);
}); });
@ -555,7 +558,7 @@ export class ProfileProvider {
if (err instanceof this.errors.NOT_AUTHORIZED) if (err instanceof this.errors.NOT_AUTHORIZED)
err.name = 'WALLET_DOES_NOT_EXIST'; 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); return reject(msg);
}); });
@ -708,7 +711,7 @@ export class ProfileProvider {
} catch (ex) { } catch (ex) {
this.logger.info(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) { } else if (opts.extendedPrivateKey) {
try { try {
@ -720,7 +723,7 @@ export class ProfileProvider {
}); });
} catch (ex) { } catch (ex) {
this.logger.warn(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) { } else if (opts.extendedPublicKey) {
try { try {
@ -732,7 +735,7 @@ export class ProfileProvider {
walletClient.credentials.hwInfo = opts.hwInfo; walletClient.credentials.hwInfo = opts.hwInfo;
} catch (ex) { } catch (ex) {
this.logger.warn("Creating wallet from Extended Public Key Arg:", ex, opts); 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 { } else {
let lang = this.languageProvider.getCurrent(); let lang = this.languageProvider.getCurrent();
@ -775,8 +778,8 @@ export class ProfileProvider {
setTimeout(() => { setTimeout(() => {
this.seedWallet(opts).then((walletClient: any) => { this.seedWallet(opts).then((walletClient: any) => {
let name = opts.name || 'Personal Wallet'; // TODO GetTextCatalog let name = opts.name || this.translate.instant('Personal Wallet');
let myName = opts.myName || 'me'; // TODO GetTextCatalog let myName = opts.myName || this.translate.instant('me');
walletClient.createWallet(name, myName, opts.m, opts.n, { walletClient.createWallet(name, myName, opts.m, opts.n, {
network: opts.networkName, network: opts.networkName,
@ -785,7 +788,7 @@ export class ProfileProvider {
coin: opts.coin coin: opts.coin
}, (err: any, secret: any) => { }, (err: any, secret: any) => {
if (err) { 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); return reject(msg);
}); });
} else { } else {
@ -826,11 +829,11 @@ export class ProfileProvider {
if (_.find(this.profile.credentials, { if (_.find(this.profile.credentials, {
'walletId': walletData.walletId '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) { } catch (ex) {
this.logger.debug(ex); this.logger.debug(ex);
return reject('Bad wallet invitation'); // TODO getTextCatalog return reject(this.translate.instant('Bad wallet invitation'));
} }
opts.networkName = walletData.network; opts.networkName = walletData.network;
this.logger.debug('Joining Wallet:', opts); this.logger.debug('Joining Wallet:', opts);
@ -840,7 +843,7 @@ export class ProfileProvider {
coin: opts.coin coin: opts.coin
}, (err: any) => { }, (err: any) => {
if (err) { 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); return reject(msg);
}); });
} else { } else {

View File

@ -2,6 +2,7 @@ import { Injectable } from '@angular/core';
import { Events } from 'ionic-angular'; import { Events } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import * as lodash from 'lodash'; import * as lodash from 'lodash';
import { TranslateService } from '@ngx-translate/core';
// Providers // Providers
import { ConfigProvider } from '../config/config'; import { ConfigProvider } from '../config/config';
@ -51,7 +52,8 @@ export class WalletProvider {
private ongoingProcess: OnGoingProcessProvider, private ongoingProcess: OnGoingProcessProvider,
private touchidProvider: TouchIdProvider, private touchidProvider: TouchIdProvider,
private events: Events, private events: Events,
private feeProvider: FeeProvider private feeProvider: FeeProvider,
private translate: TranslateService
) { ) {
this.logger.info('WalletService initialized.'); this.logger.info('WalletService initialized.');
} }
@ -368,7 +370,7 @@ export class WalletProvider {
wallet.createAddress({}, (err, addr) => { wallet.createAddress({}, (err, addr) => {
if (err) { 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../))) { if (err instanceof this.errors.CONNECTION_ERROR || (err.message && err.message.match(/5../))) {
this.logger.warn(err); this.logger.warn(err);
return setTimeout(() => { return setTimeout(() => {
@ -935,7 +937,7 @@ export class WalletProvider {
wallet.savePreferences(prefs, (err: any) => { wallet.savePreferences(prefs, (err: any) => {
if (err) { 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); return reject(err);
} }
@ -1091,13 +1093,13 @@ export class WalletProvider {
public encrypt(wallet: any): Promise<any> { public encrypt(wallet: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var title = 'Enter new spending password'; //TODO gettextcatalog var title = this.translate.instant('Enter new spending password');
var warnMsg = 'Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down.'; //TODO gettextcatalog 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) => { this.askPassword(warnMsg, title).then((password: string) => {
if (!password) return reject('no password'); //TODO gettextcatalog if (!password) return reject(this.translate.instant('no password'));
title = 'Confirm your new spending password'; //TODO gettextcatalog title = this.translate.instant('Confirm your new spending password');
this.askPassword(warnMsg, title).then((password2: string) => { 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); wallet.encryptPrivateKey(password);
return resolve(); return resolve();
}).catch((err) => { }).catch((err) => {
@ -1112,8 +1114,8 @@ export class WalletProvider {
public decrypt(wallet: any): Promise<any> { public decrypt(wallet: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.logger.debug('Disabling private key encryption for' + wallet.name); this.logger.debug('Disabling private key encryption for' + wallet.name);
this.askPassword(null, 'Enter Spending Password').then((password: string) => { //TODO gettextcatalog this.askPassword(null, this.translate.instant('Enter Spending Password')).then((password: string) => {
if (!password) return reject('no password'); if (!password) return reject(this.translate.instant('no password'));
try { try {
wallet.decryptPrivateKey(password); wallet.decryptPrivateKey(password);
} catch (e) { } catch (e) {
@ -1127,9 +1129,9 @@ export class WalletProvider {
public handleEncryptedWallet(wallet: any): Promise<any> { public handleEncryptedWallet(wallet: any): Promise<any> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!this.isEncrypted(wallet)) return resolve(); if (!this.isEncrypted(wallet)) return resolve();
this.askPassword(wallet.name, 'Enter Spending Password').then((password: string) => { //TODO gettextcatalog this.askPassword(wallet.name, this.translate.instant('Enter Spending Password')).then((password: string) => {
if (!password) return reject('No password'); if (!password) return reject(this.translate.instant('No password'));
if (!wallet.checkPassword(password)) return reject('Wrong password'); if (!wallet.checkPassword(password)) return reject(this.translate.instant('Wrong password'));
return resolve(password); return resolve(password);
}); });
}); });
@ -1199,7 +1201,7 @@ export class WalletProvider {
}; };
}).catch((err) => { }).catch((err) => {
this.logger.warn('sign error:' + 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); this.events.publish('Local/TxAction', wallet.id);
return reject(msg); return reject(msg);
}); });
@ -1252,7 +1254,7 @@ export class WalletProvider {
// not supported yet // not supported yet
if (wallet.credentials.derivationStrategy != 'BIP44' || !wallet.canSign()) 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); var keys = this.getKeysWithPassword(wallet, password);