Apply displaystring for portfolio/pending

This commit is contained in:
Manfred Karrer 2017-03-08 18:32:18 -05:00
parent c6b5cbda02
commit 7692691fe8
42 changed files with 585 additions and 524 deletions

View file

@ -390,7 +390,7 @@ abstract class BankForm extends PaymentMethodForm {
FiatCurrency defaultCurrency = CurrencyUtil.getCurrencyByCountryCode(countryComboBox.getSelectionModel().getSelectedItem().code); FiatCurrency defaultCurrency = CurrencyUtil.getCurrencyByCountryCode(countryComboBox.getSelectionModel().getSelectedItem().code);
if (!defaultCurrency.equals(selectedItem)) { if (!defaultCurrency.equals(selectedItem)) {
new Popup<>().warning("Are you sure you want to choose a currency other than the country's default currency?") new Popup<>().warning("Are you sure you want to choose a currency other than the country's default currency?")
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(() -> { .onAction(() -> {
paymentAccount.setSingleTradeCurrency(selectedItem); paymentAccount.setSingleTradeCurrency(selectedItem);
autoFillNameTextField(); autoFillNameTextField();

View file

@ -407,7 +407,7 @@ public class CashDepositForm extends PaymentMethodForm {
FiatCurrency defaultCurrency = CurrencyUtil.getCurrencyByCountryCode(countryComboBox.getSelectionModel().getSelectedItem().code); FiatCurrency defaultCurrency = CurrencyUtil.getCurrencyByCountryCode(countryComboBox.getSelectionModel().getSelectedItem().code);
if (!defaultCurrency.equals(selectedItem)) { if (!defaultCurrency.equals(selectedItem)) {
new Popup<>().warning("Are you sure you want to choose a currency other than the country's default currency?") new Popup<>().warning("Are you sure you want to choose a currency other than the country's default currency?")
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(() -> { .onAction(() -> {
paymentAccount.setSingleTradeCurrency(selectedItem); paymentAccount.setSingleTradeCurrency(selectedItem);
autoFillNameTextField(); autoFillNameTextField();

View file

@ -29,6 +29,7 @@ import io.bitsquare.gui.util.FormBuilder;
import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.LanguageUtil; import io.bitsquare.locale.LanguageUtil;
import io.bitsquare.locale.Res;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.collections.ListChangeListener; import javafx.collections.ListChangeListener;
import javafx.geometry.HPos; import javafx.geometry.HPos;
@ -224,8 +225,7 @@ public class ArbitratorRegistrationView extends ActivatableViewAndModel<VBox, Ar
() -> new Popup().feedback("You have successfully removed your arbitrator from the P2P network.").show(), () -> new Popup().feedback("You have successfully removed your arbitrator from the P2P network.").show(),
(errorMessage) -> new Popup().error("Could not remove arbitrator.\nError message: " + errorMessage).show()); (errorMessage) -> new Popup().error("Could not remove arbitrator.\nError message: " + errorMessage).show());
} else { } else {
new Popup().information("You need to wait until you are fully connected to the network.\n" + new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
"That might take up to about 2 minutes at startup.").show();
} }
} }
@ -235,8 +235,7 @@ public class ArbitratorRegistrationView extends ActivatableViewAndModel<VBox, Ar
() -> new Popup().feedback("You have successfully registered your arbitrator to the P2P network.").show(), () -> new Popup().feedback("You have successfully registered your arbitrator to the P2P network.").show(),
(errorMessage) -> new Popup().error("Could not register arbitrator.\nError message: " + errorMessage).show()); (errorMessage) -> new Popup().error("Could not register arbitrator.\nError message: " + errorMessage).show());
} else { } else {
new Popup().information("You need to wait until you are fully connected to the network.\n" + new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
"That might take up to about 2 minutes at startup.").show();
} }
} }
} }

View file

@ -32,6 +32,7 @@ import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.gui.util.validation.*; import io.bitsquare.gui.util.validation.*;
import io.bitsquare.locale.CryptoCurrency; import io.bitsquare.locale.CryptoCurrency;
import io.bitsquare.locale.Res;
import io.bitsquare.locale.TradeCurrency; import io.bitsquare.locale.TradeCurrency;
import io.bitsquare.payment.PaymentAccount; import io.bitsquare.payment.PaymentAccount;
import io.bitsquare.payment.PaymentAccountFactory; import io.bitsquare.payment.PaymentAccountFactory;
@ -196,7 +197,7 @@ public class AltCoinAccountsView extends ActivatableViewAndModel<GridPane, AltCo
private void onDeleteAccount(PaymentAccount paymentAccount) { private void onDeleteAccount(PaymentAccount paymentAccount) {
new Popup().warning("Do you really want to delete the selected account?") new Popup().warning("Do you really want to delete the selected account?")
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(() -> { .onAction(() -> {
boolean isPaymentAccountUsed = model.onDeleteAccount(paymentAccount); boolean isPaymentAccountUsed = model.onDeleteAccount(paymentAccount);
if (!isPaymentAccountUsed) if (!isPaymentAccountUsed)
@ -207,7 +208,7 @@ public class AltCoinAccountsView extends ActivatableViewAndModel<GridPane, AltCo
"open offer or in a trade.").show(); "open offer or in a trade.").show();
}, 100, TimeUnit.MILLISECONDS); }, 100, TimeUnit.MILLISECONDS);
}) })
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
} }
@ -275,7 +276,7 @@ public class AltCoinAccountsView extends ActivatableViewAndModel<GridPane, AltCo
if (paymentMethodForm != null) { if (paymentMethodForm != null) {
paymentMethodForm.addFormForAddAccount(); paymentMethodForm.addFormForAddAccount();
gridRow = paymentMethodForm.getGridRow(); gridRow = paymentMethodForm.getGridRow();
Tuple2<Button, Button> tuple2 = add2ButtonsAfterGroup(root, ++gridRow, "Save new account", "Cancel"); Tuple2<Button, Button> tuple2 = add2ButtonsAfterGroup(root, ++gridRow, "Save new account", Res.get("shared.cancel"));
saveNewAccountButton = tuple2.first; saveNewAccountButton = tuple2.first;
saveNewAccountButton.setOnAction(event -> onSaveNewAccount(paymentMethodForm.getPaymentAccount())); saveNewAccountButton.setOnAction(event -> onSaveNewAccount(paymentMethodForm.getPaymentAccount()));
saveNewAccountButton.disableProperty().bind(paymentMethodForm.allInputsValidProperty().not()); saveNewAccountButton.disableProperty().bind(paymentMethodForm.allInputsValidProperty().not());
@ -294,7 +295,7 @@ public class AltCoinAccountsView extends ActivatableViewAndModel<GridPane, AltCo
if (paymentMethodForm != null) { if (paymentMethodForm != null) {
paymentMethodForm.addFormForDisplayAccount(); paymentMethodForm.addFormForDisplayAccount();
gridRow = paymentMethodForm.getGridRow(); gridRow = paymentMethodForm.getGridRow();
Tuple2<Button, Button> tuple = add2ButtonsAfterGroup(root, ++gridRow, "Delete account", "Cancel"); Tuple2<Button, Button> tuple = add2ButtonsAfterGroup(root, ++gridRow, "Delete account", Res.get("shared.cancel"));
Button deleteAccountButton = tuple.first; Button deleteAccountButton = tuple.first;
deleteAccountButton.setOnAction(event -> onDeleteAccount(paymentMethodForm.getPaymentAccount())); deleteAccountButton.setOnAction(event -> onDeleteAccount(paymentMethodForm.getPaymentAccount()));
Button cancelButton = tuple.second; Button cancelButton = tuple.second;

View file

@ -163,7 +163,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
private void onDeleteAccount(PaymentAccount paymentAccount) { private void onDeleteAccount(PaymentAccount paymentAccount) {
new Popup().warning("Do you really want to delete the selected account?") new Popup().warning("Do you really want to delete the selected account?")
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(() -> { .onAction(() -> {
boolean isPaymentAccountUsed = model.onDeleteAccount(paymentAccount); boolean isPaymentAccountUsed = model.onDeleteAccount(paymentAccount);
if (!isPaymentAccountUsed) if (!isPaymentAccountUsed)
@ -174,7 +174,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
"open offer or in a trade.").show(); "open offer or in a trade.").show();
}, 100, TimeUnit.MILLISECONDS); }, 100, TimeUnit.MILLISECONDS);
}) })
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
} }
@ -262,7 +262,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
if (paymentMethodForm != null) { if (paymentMethodForm != null) {
paymentMethodForm.addFormForAddAccount(); paymentMethodForm.addFormForAddAccount();
gridRow = paymentMethodForm.getGridRow(); gridRow = paymentMethodForm.getGridRow();
Tuple2<Button, Button> tuple2 = add2ButtonsAfterGroup(root, ++gridRow, "Save new account", "Cancel"); Tuple2<Button, Button> tuple2 = add2ButtonsAfterGroup(root, ++gridRow, "Save new account", Res.get("shared.cancel"));
saveNewAccountButton = tuple2.first; saveNewAccountButton = tuple2.first;
saveNewAccountButton.setOnAction(event -> onSaveNewAccount(paymentMethodForm.getPaymentAccount())); saveNewAccountButton.setOnAction(event -> onSaveNewAccount(paymentMethodForm.getPaymentAccount()));
saveNewAccountButton.disableProperty().bind(paymentMethodForm.allInputsValidProperty().not()); saveNewAccountButton.disableProperty().bind(paymentMethodForm.allInputsValidProperty().not());
@ -282,7 +282,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
if (paymentMethodForm != null) { if (paymentMethodForm != null) {
paymentMethodForm.addFormForDisplayAccount(); paymentMethodForm.addFormForDisplayAccount();
gridRow = paymentMethodForm.getGridRow(); gridRow = paymentMethodForm.getGridRow();
Tuple2<Button, Button> tuple = add2ButtonsAfterGroup(root, ++gridRow, "Delete account", "Cancel"); Tuple2<Button, Button> tuple = add2ButtonsAfterGroup(root, ++gridRow, "Delete account", Res.get("shared.cancel"));
Button deleteAccountButton = tuple.first; Button deleteAccountButton = tuple.first;
deleteAccountButton.setOnAction(event -> onDeleteAccount(paymentMethodForm.getPaymentAccount())); deleteAccountButton.setOnAction(event -> onDeleteAccount(paymentMethodForm.getPaymentAccount()));
Button cancelButton = tuple.second; Button cancelButton = tuple.second;

View file

@ -27,6 +27,7 @@ import io.bitsquare.gui.common.view.FxmlView;
import io.bitsquare.gui.main.overlays.popups.Popup; import io.bitsquare.gui.main.overlays.popups.Popup;
import io.bitsquare.gui.main.overlays.windows.WalletPasswordWindow; import io.bitsquare.gui.main.overlays.windows.WalletPasswordWindow;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import io.bitsquare.user.Preferences; import io.bitsquare.user.Preferences;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleBooleanProperty;
@ -168,7 +169,7 @@ public class SeedWordsView extends ActivatableView<GridPane, Void> {
initSeedWords(keyChainSeed); initSeedWords(keyChainSeed);
showSeedScreen(); showSeedScreen();
}) })
.closeButtonText("No") .closeButtonText(Res.get("shared.no"))
.show(); .show();
} else { } else {
initSeedWords(keyChainSeed); initSeedWords(keyChainSeed);
@ -239,8 +240,8 @@ public class SeedWordsView extends ActivatableView<GridPane, Void> {
.information("Your wallets are encrypted.\n\n" + .information("Your wallets are encrypted.\n\n" +
"After restore, the wallets will no longer be encrypted and you must set a new password.\n\n" + "After restore, the wallets will no longer be encrypted and you must set a new password.\n\n" +
"Do you want to proceed?") "Do you want to proceed?")
.closeButtonText("No") .closeButtonText(Res.get("shared.no"))
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(this::doRestore) .onAction(this::doRestore)
.show(); .show();
} else { } else {

View file

@ -36,6 +36,7 @@ import io.bitsquare.gui.common.view.FxmlView;
import io.bitsquare.gui.main.dao.compensation.CompensationRequestDisplay; import io.bitsquare.gui.main.dao.compensation.CompensationRequestDisplay;
import io.bitsquare.gui.main.overlays.popups.Popup; import io.bitsquare.gui.main.overlays.popups.Popup;
import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.locale.Res;
import io.bitsquare.p2p.NodeAddress; import io.bitsquare.p2p.NodeAddress;
import io.bitsquare.p2p.P2PService; import io.bitsquare.p2p.P2PService;
import javafx.scene.control.Button; import javafx.scene.control.Button;
@ -165,7 +166,7 @@ public class CreateCompensationRequestView extends ActivatableView<GridPane, Voi
" Satoshis/byte)\n" + " Satoshis/byte)\n" +
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" + "Transaction size: " + (txSize / 1000d) + " Kb\n\n" +
"Are you sure you want to send the transaction?") "Are you sure you want to send the transaction?")
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(() -> { .onAction(() -> {
try { try {
bsqWalletService.commitTx(txWithBtcFee); bsqWalletService.commitTx(txWithBtcFee);
@ -194,7 +195,7 @@ public class CreateCompensationRequestView extends ActivatableView<GridPane, Voi
new Popup<>().warning(e.toString()); new Popup<>().warning(e.toString());
} }
}) })
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
} catch (InsufficientFundsException | IOException | } catch (InsufficientFundsException | IOException |
TransactionVerificationException | WalletException | InsufficientMoneyException | ChangeBelowDustException e) { TransactionVerificationException | WalletException | InsufficientMoneyException | ChangeBelowDustException e) {

View file

@ -37,6 +37,7 @@ import io.bitsquare.gui.main.overlays.popups.Popup;
import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.BsqFormatter; import io.bitsquare.gui.util.BsqFormatter;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import javafx.beans.property.DoubleProperty; import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
@ -224,7 +225,7 @@ public class VoteView extends ActivatableView<GridPane, Void> {
" Satoshis/byte)\n" + " Satoshis/byte)\n" +
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" + "Transaction size: " + (txSize / 1000d) + " Kb\n\n" +
"Are you sure you want to send the transaction?") "Are you sure you want to send the transaction?")
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(() -> { .onAction(() -> {
try { try {
bsqWalletService.commitTx(txWithBtcFee); bsqWalletService.commitTx(txWithBtcFee);
@ -253,7 +254,7 @@ public class VoteView extends ActivatableView<GridPane, Void> {
new Popup<>().warning(e.toString()); new Popup<>().warning(e.toString());
} }
}) })
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
} catch (InsufficientMoneyException | WalletException | TransactionVerificationException | } catch (InsufficientMoneyException | WalletException | TransactionVerificationException |
ChangeBelowDustException | InsufficientFundsException e) { ChangeBelowDustException | InsufficientFundsException e) {

View file

@ -34,6 +34,7 @@ import io.bitsquare.gui.main.overlays.popups.Popup;
import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.BsqFormatter; import io.bitsquare.gui.util.BsqFormatter;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
@ -122,7 +123,7 @@ public class BsqSendView extends ActivatableView<GridPane, Void> {
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" + "Transaction size: " + (txSize / 1000d) + " Kb\n\n" +
/*"The recipient will receive: " + bsqFormatter.formatCoinWithCode(receiverAmount) + "\n\n" +*/ /*"The recipient will receive: " + bsqFormatter.formatCoinWithCode(receiverAmount) + "\n\n" +*/
"Are you sure you want to withdraw that amount?") "Are you sure you want to withdraw that amount?")
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(() -> { .onAction(() -> {
try { try {
bsqWalletService.commitTx(txWithBtcFee); bsqWalletService.commitTx(txWithBtcFee);
@ -149,7 +150,7 @@ public class BsqSendView extends ActivatableView<GridPane, Void> {
new Popup<>().warning(e.toString()); new Popup<>().warning(e.toString());
} }
}) })
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
} catch (AddressFormatException | InsufficientFundsException | } catch (AddressFormatException | InsufficientFundsException |
TransactionVerificationException | WalletException | InsufficientMoneyException e) { TransactionVerificationException | WalletException | InsufficientMoneyException e) {

View file

@ -628,8 +628,7 @@ public class TraderDisputeView extends ActivatableView<VBox, Void> {
if (!text.isEmpty()) if (!text.isEmpty())
onSendMessage(text, selectedDispute); onSendMessage(text, selectedDispute);
} else { } else {
new Popup().information("You need to wait until you are fully connected to the network.\n" + new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
"That might take up to about 2 minutes at startup.").show();
} }
}); });
inputTextAreaTextSubscription = EasyBind.subscribe(inputTextArea.textProperty(), t -> sendButton.setDisable(t.isEmpty())); inputTextAreaTextSubscription = EasyBind.subscribe(inputTextArea.textProperty(), t -> sendButton.setDisable(t.isEmpty()));
@ -1039,7 +1038,7 @@ public class TraderDisputeView extends ActivatableView<VBox, Void> {
Optional<Trade> tradeOptional = tradeManager.getTradeById(item.getTradeId()); Optional<Trade> tradeOptional = tradeManager.getTradeById(item.getTradeId());
if (tradeOptional.isPresent()) { if (tradeOptional.isPresent()) {
field.setMouseTransparent(false); field.setMouseTransparent(false);
field.setTooltip(new Tooltip("Open popup for details")); field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
field.setOnAction(event -> tradeDetailsWindow.show(tradeOptional.get())); field.setOnAction(event -> tradeDetailsWindow.show(tradeOptional.get()));
} else { } else {
field.setMouseTransparent(true); field.setMouseTransparent(true);

View file

@ -249,7 +249,7 @@ public class LockedView extends ActivatableView<VBox, Void> {
field = new HyperlinkWithIcon("Locked in MultiSig for trade with ID: " + item.getAddressEntry().getShortOfferId(), field = new HyperlinkWithIcon("Locked in MultiSig for trade with ID: " + item.getAddressEntry().getShortOfferId(),
AwesomeIcon.INFO_SIGN); AwesomeIcon.INFO_SIGN);
field.setOnAction(event -> openDetailPopup(item)); field.setOnAction(event -> openDetailPopup(item));
field.setTooltip(new Tooltip("Open popup for details")); field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field); setGraphic(field);
} else if (item.getAddressEntry().getContext() == AddressEntry.Context.ARBITRATOR) { } else if (item.getAddressEntry().getContext() == AddressEntry.Context.ARBITRATOR) {
setGraphic(new Label("Arbitrator's fee")); setGraphic(new Label("Arbitrator's fee"));

View file

@ -249,7 +249,7 @@ public class ReservedView extends ActivatableView<VBox, Void> {
field = new HyperlinkWithIcon("Reserved in local wallet for offer with ID: " + item.getAddressEntry().getShortOfferId(), field = new HyperlinkWithIcon("Reserved in local wallet for offer with ID: " + item.getAddressEntry().getShortOfferId(),
AwesomeIcon.INFO_SIGN); AwesomeIcon.INFO_SIGN);
field.setOnAction(event -> openDetailPopup(item)); field.setOnAction(event -> openDetailPopup(item));
field.setTooltip(new Tooltip("Open popup for details")); field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field); setGraphic(field);
} else if (item.getAddressEntry().getContext() == AddressEntry.Context.ARBITRATOR) { } else if (item.getAddressEntry().getContext() == AddressEntry.Context.ARBITRATOR) {
setGraphic(new Label("Arbitrator's fee")); setGraphic(new Label("Arbitrator's fee"));

View file

@ -382,7 +382,7 @@ public class TransactionsView extends ActivatableView<VBox, Void> {
if (item.getDetailsAvailable()) { if (item.getDetailsAvailable()) {
field = new HyperlinkWithIcon(item.getDetails(), AwesomeIcon.INFO_SIGN); field = new HyperlinkWithIcon(item.getDetails(), AwesomeIcon.INFO_SIGN);
field.setOnAction(event -> openDetailPopup(item)); field.setOnAction(event -> openDetailPopup(item));
field.setTooltip(new Tooltip("Open popup for details")); field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field); setGraphic(field);
} else { } else {
setGraphic(new Label(item.getDetails())); setGraphic(new Label(item.getDetails()));

View file

@ -256,9 +256,9 @@ public class WithdrawalView extends ActivatableView<VBox, Void> {
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" + "Transaction size: " + (txSize / 1000d) + " Kb\n\n" +
"The recipient will receive: " + formatter.formatCoinWithCode(receiverAmount) + "\n\n" + "The recipient will receive: " + formatter.formatCoinWithCode(receiverAmount) + "\n\n" +
"Are you sure you want to withdraw that amount?") "Are you sure you want to withdraw that amount?")
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(() -> doWithdraw(amount, fee, callback)) .onAction(() -> doWithdraw(amount, fee, callback))
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
} }
} else { } else {

View file

@ -756,8 +756,8 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
int numPastTrades = model.getNumPastTrades(newItem.getOffer()); int numPastTrades = model.getNumPastTrades(newItem.getOffer());
boolean hasTraded = numPastTrades > 0; boolean hasTraded = numPastTrades > 0;
String tooltipText = hasTraded ? String tooltipText = hasTraded ?
Res.get("peerInfoIcon.tooltip.traded", hostName, numPastTrades) : Res.get("peerInfoIcon.tooltip.offer.traded", hostName, numPastTrades) :
Res.get("peerInfoIcon.tooltip.notTraded", hostName); Res.get("peerInfoIcon.tooltip.offer.notTraded", hostName);
Node peerInfoIcon = new PeerInfoIcon(hostName, tooltipText, numPastTrades, privateNotificationManager, newItem.getOffer()); Node peerInfoIcon = new PeerInfoIcon(hostName, tooltipText, numPastTrades, privateNotificationManager, newItem.getOffer());
setPadding(new Insets(-2, 0, -2, 0)); setPadding(new Insets(-2, 0, -2, 0));
setGraphic(peerInfoIcon); setGraphic(peerInfoIcon);

View file

@ -165,7 +165,7 @@ public class ContractWindow extends Overlay<ContractWindow> {
addLabelTxIdTextField(gridPane, ++rowIndex, "Offer fee transaction ID:", offer.getOfferFeePaymentTxID()); addLabelTxIdTextField(gridPane, ++rowIndex, "Offer fee transaction ID:", offer.getOfferFeePaymentTxID());
addLabelTxIdTextField(gridPane, ++rowIndex, "Trading fee transaction ID:", contract.takeOfferFeeTxID); addLabelTxIdTextField(gridPane, ++rowIndex, "Trading fee transaction ID:", contract.takeOfferFeeTxID);
if (dispute.getDepositTxSerialized() != null) if (dispute.getDepositTxSerialized() != null)
addLabelTxIdTextField(gridPane, ++rowIndex, "Deposit transaction ID:", dispute.getDepositTxId()); addLabelTxIdTextField(gridPane, ++rowIndex, Res.getWithCol("shared.depositTransactionId"), dispute.getDepositTxId());
if (dispute.getPayoutTxSerialized() != null) if (dispute.getPayoutTxSerialized() != null)
addLabelTxIdTextField(gridPane, ++rowIndex, "Payout transaction ID:", dispute.getPayoutTxId()); addLabelTxIdTextField(gridPane, ++rowIndex, "Payout transaction ID:", dispute.getPayoutTxId());

View file

@ -32,6 +32,7 @@ import io.bitsquare.gui.main.overlays.popups.Popup;
import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.gui.util.Transitions; import io.bitsquare.gui.util.Transitions;
import io.bitsquare.locale.Res;
import io.bitsquare.trade.Contract; import io.bitsquare.trade.Contract;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding; import javafx.beans.binding.ObjectBinding;
@ -565,7 +566,7 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
} }
private void addButtons(Contract contract) { private void addButtons(Contract contract) {
Tuple2<Button, Button> tuple = add2ButtonsAfterGroup(gridPane, ++rowIndex, "Close ticket", "Cancel"); Tuple2<Button, Button> tuple = add2ButtonsAfterGroup(gridPane, ++rowIndex, "Close ticket", Res.get("shared.cancel"));
Button closeTicketButton = tuple.first; Button closeTicketButton = tuple.first;
closeTicketButton.disableProperty().bind(Bindings.createBooleanBinding( closeTicketButton.disableProperty().bind(Bindings.createBooleanBinding(
() -> tradeAmountToggleGroup.getSelectedToggle() == null () -> tradeAmountToggleGroup.getSelectedToggle() == null

View file

@ -27,6 +27,7 @@ import io.bitsquare.gui.main.overlays.Overlay;
import io.bitsquare.gui.main.overlays.popups.Popup; import io.bitsquare.gui.main.overlays.popups.Popup;
import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.Transitions; import io.bitsquare.gui.util.Transitions;
import io.bitsquare.locale.Res;
import io.bitsquare.trade.offer.OpenOfferManager; import io.bitsquare.trade.offer.OpenOfferManager;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.Scene; import javafx.scene.Scene;
@ -138,7 +139,7 @@ public class EmptyWalletWindow extends Overlay<EmptyWalletWindow> {
} }
}); });
closeButton = new Button("Cancel"); closeButton = new Button(Res.get("shared.cancel"));
closeButton.setOnAction(e -> { closeButton.setOnAction(e -> {
hide(); hide();
closeHandlerOptional.ifPresent(Runnable::run); closeHandlerOptional.ifPresent(Runnable::run);

View file

@ -196,7 +196,7 @@ public class TradeDetailsWindow extends Overlay<TradeDetailsWindow> {
addLabelTxIdTextField(gridPane, ++rowIndex, "Taker fee transaction ID:", trade.getTakeOfferFeeTxId()); addLabelTxIdTextField(gridPane, ++rowIndex, "Taker fee transaction ID:", trade.getTakeOfferFeeTxId());
if (trade.getDepositTx() != null) if (trade.getDepositTx() != null)
addLabelTxIdTextField(gridPane, ++rowIndex, "Deposit transaction ID:", trade.getDepositTx().getHashAsString()); addLabelTxIdTextField(gridPane, ++rowIndex, Res.getWithCol("shared.depositTransactionId"), trade.getDepositTx().getHashAsString());
if (trade.getPayoutTx() != null) if (trade.getPayoutTx() != null)
addLabelTxIdTextField(gridPane, ++rowIndex, "Payout transaction ID:", trade.getPayoutTx().getHashAsString()); addLabelTxIdTextField(gridPane, ++rowIndex, "Payout transaction ID:", trade.getPayoutTx().getHashAsString());
if (showDisputedTx) if (showDisputedTx)

View file

@ -223,7 +223,7 @@ public class WalletPasswordWindow extends Overlay<WalletPasswordWindow> {
showRestoreScreen(); showRestoreScreen();
}); });
Button cancelButton = new Button("Cancel"); Button cancelButton = new Button(Res.get("shared.cancel"));
cancelButton.setOnAction(event -> { cancelButton.setOnAction(event -> {
hide(); hide();
closeHandlerOptional.ifPresent(Runnable::run); closeHandlerOptional.ifPresent(Runnable::run);
@ -355,8 +355,8 @@ public class WalletPasswordWindow extends Overlay<WalletPasswordWindow> {
.information("Your bitcoin wallet is encrypted.\n\n" + .information("Your bitcoin wallet is encrypted.\n\n" +
"After restore, the wallet will no longer be encrypted and you must set a new password.\n\n" + "After restore, the wallet will no longer be encrypted and you must set a new password.\n\n" +
"Do you want to proceed?") "Do you want to proceed?")
.closeButtonText("No") .closeButtonText(Res.get("shared.no"))
.actionButtonText("Yes") .actionButtonText(Res.get("shared.yes"))
.onAction(this::doRestore) .onAction(this::doRestore)
.show(); .show();
} else { } else {

View file

@ -41,7 +41,7 @@ public class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable>
@FXML @FXML
Tab openOffersTab, pendingTradesTab, closedTradesTab; Tab openOffersTab, pendingTradesTab, closedTradesTab;
private final Tab failedTradesTab = new Tab("Failed"); private final Tab failedTradesTab = new Tab(Res.get("portfolio.tab.failed"));
private Tab currentTab; private Tab currentTab;
private Navigation.Listener navigationListener; private Navigation.Listener navigationListener;
private ChangeListener<Tab> tabChangeListener; private ChangeListener<Tab> tabChangeListener;

View file

@ -212,7 +212,7 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
else if (tradable instanceof OpenOffer) else if (tradable instanceof OpenOffer)
offerDetailsWindow.show(tradable.getOffer()); offerDetailsWindow.show(tradable.getOffer());
}); });
field.setTooltip(new Tooltip("Open popup for details")); field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field); setGraphic(field);
} else { } else {
setGraphic(null); setGraphic(null);
@ -306,10 +306,10 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
int numPastTrades = model.getNumPastTrades(newItem.getTradable()); int numPastTrades = model.getNumPastTrades(newItem.getTradable());
Trade trade = (Trade) newItem.getTradable(); Trade trade = (Trade) newItem.getTradable();
String hostName = trade.getTradingPeerNodeAddress() != null ? trade.getTradingPeerNodeAddress().hostName : ""; String hostName = trade.getTradingPeerNodeAddress() != null ? trade.getTradingPeerNodeAddress().hostName : "";
Node identIcon = new PeerInfoIcon(hostName, "Trading peers onion address: " + hostName, numPastTrades, privateNotificationManager, newItem.getTradable().getOffer()); Node peerInfoIcon = new PeerInfoIcon(hostName, "Trading peers onion address: " + hostName, numPastTrades, privateNotificationManager, newItem.getTradable().getOffer());
setPadding(new Insets(-2, 0, -2, 0)); setPadding(new Insets(-2, 0, -2, 0));
if (identIcon != null) if (peerInfoIcon != null)
setGraphic(identIcon); setGraphic(peerInfoIcon);
} else { } else {
setGraphic(null); setGraphic(null);
} }

View file

@ -127,7 +127,7 @@ public class FailedTradesView extends ActivatableViewAndModel<VBox, FailedTrades
if (item != null && !empty) { if (item != null && !empty) {
field = new HyperlinkWithIcon(model.getTradeId(item), true); field = new HyperlinkWithIcon(model.getTradeId(item), true);
field.setOnAction(event -> tradeDetailsWindow.show(item.getTrade())); field.setOnAction(event -> tradeDetailsWindow.show(item.getTrade()));
field.setTooltip(new Tooltip("Open popup for details")); field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field); setGraphic(field);
} else { } else {
setGraphic(null); setGraphic(null);

View file

@ -82,7 +82,7 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
setRemoveColumnCellFactory(); setRemoveColumnCellFactory();
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
tableView.setPlaceholder(new Label("No open offers available")); tableView.setPlaceholder(new Label(Res.get("table.placeholder.noItems", Res.get("shared.openOffers"))));
offerIdColumn.setComparator((o1, o2) -> o1.getOffer().getId().compareTo(o2.getOffer().getId())); offerIdColumn.setComparator((o1, o2) -> o1.getOffer().getId().compareTo(o2.getOffer().getId()));
directionColumn.setComparator((o1, o2) -> o1.getOffer().getDirection().compareTo(o2.getOffer().getDirection())); directionColumn.setComparator((o1, o2) -> o1.getOffer().getDirection().compareTo(o2.getOffer().getDirection()));
@ -120,18 +120,16 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
if (model.isBootstrapped()) { if (model.isBootstrapped()) {
String key = "RemoveOfferWarning"; String key = "RemoveOfferWarning";
if (preferences.showAgain(key)) if (preferences.showAgain(key))
new Popup().warning("Are you sure you want to remove that offer?\n" + new Popup().warning(Res.get("popup.warning.removeOffer", model.formatter.formatCoinWithCode(openOffer.getOffer().getCreateOfferFee())))
"The offer fee of " + model.formatter.formatCoinWithCode(openOffer.getOffer().getCreateOfferFee()) + " will be lost if you remove that offer.") .actionButtonText(Res.get("shared.removeOffer"))
.actionButtonText("Remove offer")
.onAction(() -> doRemoveOpenOffer(openOffer)) .onAction(() -> doRemoveOpenOffer(openOffer))
.closeButtonText("Don't remove the offer") .closeButtonText(Res.get("shared.dontRemoveOffer"))
.dontShowAgainId(key, preferences) .dontShowAgainId(key, preferences)
.show(); .show();
else else
doRemoveOpenOffer(openOffer); doRemoveOpenOffer(openOffer);
} else { } else {
new Popup().information("You need to wait until you are fully connected to the network.\n" + new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
"That might take up to about 2 minutes at startup.").show();
} }
} }
@ -141,15 +139,15 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
log.debug("Remove offer was successful"); log.debug("Remove offer was successful");
String key = "WithdrawFundsAfterRemoveOfferInfo"; String key = "WithdrawFundsAfterRemoveOfferInfo";
if (preferences.showAgain(key)) if (preferences.showAgain(key))
new Popup().instruction("You can withdraw the funds you paid in from the \"Fund/Available for withdrawal\" screen.") new Popup().instruction(Res.get("offerbook.withdrawFundsHint", Res.get("navigation.funds.availableForWithdrawal")))
.actionButtonText("Go to \"Funds/Available for withdrawal\"") .actionButtonTextWithGoTo("navigation.funds.availableForWithdrawal")
.onAction(() -> navigation.navigateTo(MainView.class, FundsView.class, WithdrawalView.class)) .onAction(() -> navigation.navigateTo(MainView.class, FundsView.class, WithdrawalView.class))
.dontShowAgainId(key, preferences) .dontShowAgainId(key, preferences)
.show(); .show();
}, },
(message) -> { (message) -> {
log.error(message); log.error(message);
new Popup().warning("Remove offer failed:\n" + message).show(); new Popup().warning(Res.get("offerbook.removeOffer.failed", message)).show();
}); });
} }
@ -171,7 +169,7 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
if (item != null && !empty) { if (item != null && !empty) {
field = new HyperlinkWithIcon(model.getTradeId(item), true); field = new HyperlinkWithIcon(model.getTradeId(item), true);
field.setOnAction(event -> offerDetailsWindow.show(item.getOffer())); field.setOnAction(event -> offerDetailsWindow.show(item.getOffer()));
field.setTooltip(new Tooltip("Open popup for details")); field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field); setGraphic(field);
} else { } else {
setGraphic(null); setGraphic(null);
@ -316,7 +314,7 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
{ {
iconView.setId("image-remove"); iconView.setId("image-remove");
button.setText("Remove"); button.setText(Res.get("shared.remove"));
button.setGraphic(iconView); button.setGraphic(iconView);
button.setMinWidth(70); button.setMinWidth(70);
} }

View file

@ -20,6 +20,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades;
import io.bitsquare.app.Log; import io.bitsquare.app.Log;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeWizardItem; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeWizardItem;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer.*; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer.*;
import io.bitsquare.locale.Res;
import org.fxmisc.easybind.EasyBind; import org.fxmisc.easybind.EasyBind;
public class BuyerSubView extends TradeSubView { public class BuyerSubView extends TradeSubView {
@ -47,11 +48,11 @@ public class BuyerSubView extends TradeSubView {
@Override @Override
protected void addWizards() { protected void addWizards() {
step1 = new TradeWizardItem(BuyerStep1View.class, "Wait for blockchain confirmation"); step1 = new TradeWizardItem(BuyerStep1View.class, Res.get("portfolio.pending.step1.waitForConf"));
step2 = new TradeWizardItem(BuyerStep2View.class, "Start payment"); step2 = new TradeWizardItem(BuyerStep2View.class, Res.get("portfolio.pending.step2_buyer.startPayment"));
step3 = new TradeWizardItem(BuyerStep3View.class, "Wait until payment arrived"); step3 = new TradeWizardItem(BuyerStep3View.class, Res.get("portfolio.pending.step3_buyer.waitPaymentArrived"));
step4 = new TradeWizardItem(BuyerStep4View.class, "Wait for payout unlock"); step4 = new TradeWizardItem(BuyerStep4View.class, Res.get("portfolio.pending.step4.waitPaymentUnlocked"));
step5 = new TradeWizardItem(BuyerStep5View.class, "Completed"); step5 = new TradeWizardItem(BuyerStep5View.class, Res.get("portfolio.pending.step5.completed"));
if (model.getLockTime() > 0) { if (model.getLockTime() > 0) {
addWizardsToGridPane(step1); addWizardsToGridPane(step1);

View file

@ -38,6 +38,7 @@ import io.bitsquare.gui.main.overlays.notifications.NotificationCenter;
import io.bitsquare.gui.main.overlays.popups.Popup; import io.bitsquare.gui.main.overlays.popups.Popup;
import io.bitsquare.gui.main.overlays.windows.SelectDepositTxWindow; import io.bitsquare.gui.main.overlays.windows.SelectDepositTxWindow;
import io.bitsquare.gui.main.overlays.windows.WalletPasswordWindow; import io.bitsquare.gui.main.overlays.windows.WalletPasswordWindow;
import io.bitsquare.locale.Res;
import io.bitsquare.p2p.P2PService; import io.bitsquare.p2p.P2PService;
import io.bitsquare.payment.PaymentAccountContractData; import io.bitsquare.payment.PaymentAccountContractData;
import io.bitsquare.trade.BuyerTrade; import io.bitsquare.trade.BuyerTrade;
@ -174,7 +175,7 @@ public class PendingTradesDataModel extends ActivatableDataModel {
faultHandler.handleFault(errorMessage, throwable); faultHandler.handleFault(errorMessage, throwable);
}); });
} else { } else {
faultHandler.handleFault("No receiver address defined", null); faultHandler.handleFault(Res.get("portfolio.pending.noReceiverAddressDefined"), null);
} }
} }
@ -342,7 +343,7 @@ public class PendingTradesDataModel extends ActivatableDataModel {
else if (candidates.size() > 1) else if (candidates.size() > 1)
new SelectDepositTxWindow().transactions(candidates) new SelectDepositTxWindow().transactions(candidates)
.onSelect(transaction -> doOpenDispute(isSupportTicket, transaction)) .onSelect(transaction -> doOpenDispute(isSupportTicket, transaction))
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
else else
log.error("Trade.depositTx is null and we did not find any MultiSig transaction."); log.error("Trade.depositTx is null and we did not find any MultiSig transaction.");
@ -400,8 +401,7 @@ public class PendingTradesDataModel extends ActivatableDataModel {
if (p2PService.isBootstrapped()) { if (p2PService.isBootstrapped()) {
sendOpenNewDisputeMessage(dispute, false); sendOpenNewDisputeMessage(dispute, false);
} else { } else {
new Popup().information("You need to wait until you are fully connected to the network.\n" + new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
"That might take up to about 2 minutes at startup.").show();
} }
} else { } else {
log.warn("trade is null at doOpenDispute"); log.warn("trade is null at doOpenDispute");
@ -414,13 +414,11 @@ public class PendingTradesDataModel extends ActivatableDataModel {
() -> navigation.navigateTo(MainView.class, DisputesView.class), () -> navigation.navigateTo(MainView.class, DisputesView.class),
(errorMessage, throwable) -> { (errorMessage, throwable) -> {
if ((throwable instanceof DisputeAlreadyOpenException)) { if ((throwable instanceof DisputeAlreadyOpenException)) {
errorMessage += "\n\n" + errorMessage += "\n\n" + Res.get("portfolio.pending.openAgainDispute.msg");
"If you are not sure that the message to the arbitrator arrived (e.g. if you did not got " +
"a response after 1 day) feel free to open a dispute again.";
new Popup().warning(errorMessage) new Popup().warning(errorMessage)
.actionButtonText("Open dispute again") .actionButtonText(Res.get("portfolio.pending.openAgainDispute.button"))
.onAction(() -> sendOpenNewDisputeMessage(dispute, true)) .onAction(() -> sendOpenNewDisputeMessage(dispute, true))
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
} else { } else {
new Popup().warning(errorMessage).show(); new Popup().warning(errorMessage).show();

View file

@ -103,7 +103,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
setAvatarColumnCellFactory(); setAvatarColumnCellFactory();
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
tableView.setPlaceholder(new Label("No pending trades available")); tableView.setPlaceholder(new Label(Res.get("table.placeholder.noItems", Res.get("shared.openTrades"))));
tableView.setMinHeight(100); tableView.setMinHeight(100);
tradeIdColumn.setComparator((o1, o2) -> o1.getTrade().getId().compareTo(o2.getTrade().getId())); tradeIdColumn.setComparator((o1, o2) -> o1.getTrade().getId().compareTo(o2.getTrade().getId()));
@ -139,15 +139,12 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
keyEventEventHandler = event -> { keyEventEventHandler = event -> {
if (new KeyCodeCombination(KeyCode.O, KeyCombination.SHORTCUT_DOWN).match(event) || new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN).match(event)) { if (new KeyCodeCombination(KeyCode.O, KeyCombination.SHORTCUT_DOWN).match(event) || new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN).match(event)) {
Popup popup = new Popup(); Popup popup = new Popup();
popup.headLine("Open support ticket") popup.headLine(Res.get("portfolio.pending.openSupportTicket.headline"))
.message("Please use that only in emergency case if you don't get displayed a \"Open support\" or \"Open dispute\" button.\n\n" + .message(Res.get("portfolio.pending.openSupportTicket.msg"))
"When you open a support ticket the trade will be interrupted and handled by the arbitrator\n\n" + .actionButtonText(Res.get("portfolio.pending.openSupportTicket.headline"))
"Unjustified support tickets (e.g. caused by usability problems or questions) will " +
"cause a loss of the security deposit by the trader who opened the ticket.")
.actionButtonText("Open support ticket")
.onAction(model.dataModel::onOpenSupportTicket) .onAction(model.dataModel::onOpenSupportTicket)
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.onClose(() -> popup.hide()) .onClose(popup::hide)
.show(); .show();
} }
}; };
@ -278,7 +275,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
if (item != null && !empty) { if (item != null && !empty) {
field = new HyperlinkWithIcon(item.getTrade().getShortId(), true); field = new HyperlinkWithIcon(item.getTrade().getShortId(), true);
field.setOnAction(event -> tradeDetailsWindow.show(item.getTrade())); field.setOnAction(event -> tradeDetailsWindow.show(item.getTrade()));
field.setTooltip(new Tooltip("Open popup for details")); field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field); setGraphic(field);
} else { } else {
setGraphic(null); setGraphic(null);
@ -468,12 +465,13 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
String hostName = newItem.getTrade().getTradingPeerNodeAddress().hostName; String hostName = newItem.getTrade().getTradingPeerNodeAddress().hostName;
int numPastTrades = model.getNumPastTrades(newItem.getTrade()); int numPastTrades = model.getNumPastTrades(newItem.getTrade());
boolean hasTraded = numPastTrades > 0; boolean hasTraded = numPastTrades > 0;
String tooltipText = hasTraded ? "Trading peers onion address: " + hostName + "\n" + String tooltipText = hasTraded ?
"You have already traded " + numPastTrades + " times with that peer." : "Trading peers onion address: " + hostName; Res.get("peerInfoIcon.tooltip.trade.traded", hostName, numPastTrades) :
Node identIcon = new PeerInfoIcon(hostName, tooltipText, numPastTrades, privateNotificationManager, newItem.getTrade().getOffer()); Res.get("peerInfoIcon.tooltip.trade.notTraded", hostName);
Node peerInfoIcon = new PeerInfoIcon(hostName, tooltipText, numPastTrades,
privateNotificationManager, newItem.getTrade().getOffer());
setPadding(new Insets(-2, 0, -2, 0)); setPadding(new Insets(-2, 0, -2, 0));
if (identIcon != null) setGraphic(peerInfoIcon);
setGraphic(identIcon);
} else { } else {
setGraphic(null); setGraphic(null);
} }

View file

@ -20,6 +20,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades;
import io.bitsquare.app.Log; import io.bitsquare.app.Log;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeWizardItem; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeWizardItem;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller.*; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller.*;
import io.bitsquare.locale.Res;
import org.fxmisc.easybind.EasyBind; import org.fxmisc.easybind.EasyBind;
public class SellerSubView extends TradeSubView { public class SellerSubView extends TradeSubView {
@ -46,11 +47,12 @@ public class SellerSubView extends TradeSubView {
@Override @Override
protected void addWizards() { protected void addWizards() {
step1 = new TradeWizardItem(SellerStep1View.class, "Wait for blockchain confirmation"); step1 = new TradeWizardItem(SellerStep1View.class, Res.get("portfolio.pending.step1.waitForConf"));
step2 = new TradeWizardItem(SellerStep2View.class, "Wait until payment has started"); step2 = new TradeWizardItem(SellerStep2View.class, Res.get("portfolio.pending.step2_seller.waitPaymentStarted"));
step3 = new TradeWizardItem(SellerStep3View.class, "Confirm payment received"); step3 = new TradeWizardItem(SellerStep3View.class, Res.get("portfolio.pending.step3_seller.confirmPaymentReceived"));
step4 = new TradeWizardItem(SellerStep4View.class, "Wait for payout unlock"); step4 = new TradeWizardItem(SellerStep4View.class, Res.get("portfolio.pending.step4.waitPaymentUnlocked"));
step5 = new TradeWizardItem(SellerStep5View.class, "Completed"); step5 = new TradeWizardItem(SellerStep5View.class, Res.get("portfolio.pending.step5.completed"));
if (model.getLockTime() > 0) { if (model.getLockTime() > 0) {
addWizardsToGridPane(step1); addWizardsToGridPane(step1);

View file

@ -21,6 +21,7 @@ import io.bitsquare.gui.components.TitledGroupBg;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeWizardItem; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeWizardItem;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
@ -86,13 +87,13 @@ public abstract class TradeSubView extends HBox {
leftVBox.getChildren().add(leftGridPane); leftVBox.getChildren().add(leftGridPane);
leftGridPaneRowIndex = 0; leftGridPaneRowIndex = 0;
tradeProcessTitledGroupBg = addTitledGroupBg(leftGridPane, leftGridPaneRowIndex, 1, "Trade process"); tradeProcessTitledGroupBg = addTitledGroupBg(leftGridPane, leftGridPaneRowIndex, 1, Res.get("portfolio.pending.tradeProcess"));
addWizards(); addWizards();
TitledGroupBg noticeTitledGroupBg = addTitledGroupBg(leftGridPane, leftGridPaneRowIndex, 1, "", Layout.GROUP_DISTANCE); TitledGroupBg noticeTitledGroupBg = addTitledGroupBg(leftGridPane, leftGridPaneRowIndex, 1, "", Layout.GROUP_DISTANCE);
Label label = addMultilineLabel(leftGridPane, leftGridPaneRowIndex, "", Layout.FIRST_ROW_AND_GROUP_DISTANCE); Label label = addMultilineLabel(leftGridPane, leftGridPaneRowIndex, "", Layout.FIRST_ROW_AND_GROUP_DISTANCE);
openDisputeButton = addButtonAfterGroup(leftGridPane, ++leftGridPaneRowIndex, "Open Dispute"); openDisputeButton = addButtonAfterGroup(leftGridPane, ++leftGridPaneRowIndex, Res.get("portfolio.pending.openDispute"));
GridPane.setColumnIndex(openDisputeButton, 0); GridPane.setColumnIndex(openDisputeButton, 0);
openDisputeButton.setId("open-dispute-button"); openDisputeButton.setId("open-dispute-button");

View file

@ -166,8 +166,8 @@ public abstract class TradeStepView extends AnchorPane {
} }
protected void addTradeInfoBlock() { protected void addTradeInfoBlock() {
tradeInfoTitledGroupBg = addTitledGroupBg(gridPane, gridRow, 4, "Trade information"); tradeInfoTitledGroupBg = addTitledGroupBg(gridPane, gridRow, 4, Res.get("portfolio.pending.tradeInformation"));
txIdTextField = addLabelTxIdTextField(gridPane, gridRow, "Deposit transaction ID:", Layout.FIRST_ROW_DISTANCE).second; txIdTextField = addLabelTxIdTextField(gridPane, gridRow, Res.getWithCol("shared.depositTransactionId"), Layout.FIRST_ROW_DISTANCE).second;
String id = model.dataModel.txId.get(); String id = model.dataModel.txId.get();
if (!id.isEmpty()) if (!id.isEmpty())
txIdTextField.setup(id); txIdTextField.setup(id);
@ -177,7 +177,7 @@ public abstract class TradeStepView extends AnchorPane {
PaymentMethodForm.addAllowedPeriod(gridPane, ++gridRow, model.dataModel.getSellersPaymentAccountContractData(), PaymentMethodForm.addAllowedPeriod(gridPane, ++gridRow, model.dataModel.getSellersPaymentAccountContractData(),
model.getDateForOpenDispute()); model.getDateForOpenDispute());
timeLeftTextField = addLabelTextField(gridPane, ++gridRow, "Remaining time:").second; timeLeftTextField = addLabelTextField(gridPane, ++gridRow, Res.getWithCol("portfolio.pending.remainingTime")).second;
timeLeftProgressBar = new ProgressBar(0); timeLeftProgressBar = new ProgressBar(0);
timeLeftProgressBar.setOpacity(0.7); timeLeftProgressBar.setOpacity(0.7);
@ -258,31 +258,31 @@ public abstract class TradeStepView extends AnchorPane {
protected void setInformationHeadline() { protected void setInformationHeadline() {
if (notificationGroup != null) { if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Notification"); notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.notification"));
} }
} }
protected void setOpenDisputeHeadline() { protected void setOpenDisputeHeadline() {
if (notificationGroup != null) { if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Open a dispute"); notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.openDispute"));
} }
} }
protected void setDisputeOpenedHeadline() { protected void setDisputeOpenedHeadline() {
if (notificationGroup != null) { if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Dispute opened"); notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.disputeOpened"));
} }
} }
protected void setRequestSupportHeadline() { protected void setRequestSupportHeadline() {
if (notificationGroup != null) { if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Open support ticket"); notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.openSupport"));
} }
} }
protected void setSupportOpenedHeadline() { protected void setSupportOpenedHeadline() {
if (notificationGroup != null) { if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Support ticket opened"); notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.supportTicketOpened"));
} }
} }
@ -292,15 +292,12 @@ public abstract class TradeStepView extends AnchorPane {
private void showSupportFields() { private void showSupportFields() {
if (notificationGroup != null) { if (notificationGroup != null) {
notificationGroup.button.setText("Request support"); notificationGroup.button.setText(Res.get("portfolio.pending.requestSupport"));
notificationGroup.button.setId("open-support-button"); notificationGroup.button.setId("open-support-button");
notificationGroup.button.setOnAction(e -> model.dataModel.onOpenSupportTicket()); notificationGroup.button.setOnAction(e -> model.dataModel.onOpenSupportTicket());
} }
new Popup().warning(trade.errorMessageProperty().getValue() new Popup().warning(trade.errorMessageProperty().getValue()
+ "\n\nPlease report the problem to your arbitrator.\n\n" + + "\n\n" + Res.get("portfolio.pending.error.requestSupport"))
"He will forward the information to the developers to investigate the problem.\n" +
"After the problem has be analyzed you will get back all the funds if funds was locked.\n" +
"There will be no arbitration fee charged in case of a software bug.")
.show(); .show();
} }
@ -373,12 +370,10 @@ public abstract class TradeStepView extends AnchorPane {
String msg; String msg;
if (dispute.isSupportTicket()) { if (dispute.isSupportTicket()) {
setSupportOpenedHeadline(); setSupportOpenedHeadline();
msg = "You opened already a support ticket.\n" + msg = Res.get("portfolio.pending.supportTicketOpenedMyUser", Res.get("portfolio.pending.communicateWithArbitrator"));
"Please communicate in the \"Support\" screen with the arbitrator.";
} else { } else {
setDisputeOpenedHeadline(); setDisputeOpenedHeadline();
msg = "You opened already a dispute.\n" + msg = Res.get("portfolio.pending.disputeOpenedMyUser", Res.get("portfolio.pending.communicateWithArbitrator"));
"Please communicate in the \"Support\" screen with the arbitrator.";
} }
if (notificationGroup != null) if (notificationGroup != null)
notificationGroup.label.setText(msg); notificationGroup.label.setText(msg);
@ -392,12 +387,10 @@ public abstract class TradeStepView extends AnchorPane {
String msg; String msg;
if (dispute.isSupportTicket()) { if (dispute.isSupportTicket()) {
setSupportOpenedHeadline(); setSupportOpenedHeadline();
msg = "Your trading peer opened a support ticket due technical problems.\n" + msg = Res.get("portfolio.pending.supportTicketOpenedByPeer", Res.get("portfolio.pending.communicateWithArbitrator"));
"Please communicate in the \"Support\" screen with the arbitrator.";
} else { } else {
setDisputeOpenedHeadline(); setDisputeOpenedHeadline();
msg = "Your trading peer opened a dispute.\n" + msg = Res.get("portfolio.pending.disputeOpenedByPeer", Res.get("portfolio.pending.communicateWithArbitrator"));
"Please communicate in the \"Support\" screen with the arbitrator.";
} }
if (notificationGroup != null) if (notificationGroup != null)
notificationGroup.label.setText(msg); notificationGroup.label.setText(msg);

View file

@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer;
import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class BuyerStep1View extends TradeStepView { public class BuyerStep1View extends TradeStepView {
@ -37,13 +38,12 @@ public class BuyerStep1View extends TradeStepView {
@Override @Override
protected String getInfoBlockTitle() { protected String getInfoBlockTitle() {
return "Wait for blockchain confirmation"; return Res.get("portfolio.pending.step1.waitForConf");
} }
@Override @Override
protected String getInfoText() { protected String getInfoText() {
return "Deposit transaction has been published.\n" + return Res.get("portfolio.pending.step1.info", Res.get("shared.You"));
"You need to wait for at least one blockchain confirmation.";
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -53,8 +53,7 @@ public class BuyerStep1View extends TradeStepView {
@Override @Override
protected String getWarningText() { protected String getWarningText() {
setWarningHeadline(); setWarningHeadline();
return "The deposit transaction still did not get confirmed.\n" + return Res.get("portfolio.pending.step1.warn");
"That might happen in rare cases when the funding fee of one trader from the external wallet was too low.";
} }
@ -64,10 +63,7 @@ public class BuyerStep1View extends TradeStepView {
@Override @Override
protected String getOpenForDisputeText() { protected String getOpenForDisputeText() {
return "The deposit transaction still did not get confirmed.\n" + return Res.get("portfolio.pending.step1.openForDispute");
"That might happen in rare cases when the funding fee of one trader from the external wallet was too low.\n" +
"The max. period for the trade has elapsed.\n" +
"\nPlease contact the arbitrator for opening a dispute.";
} }
} }

View file

@ -17,6 +17,7 @@
package io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer; package io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer;
import ch.qos.logback.core.pattern.util.RegularEscapeUtil;
import io.bitsquare.app.DevFlags; import io.bitsquare.app.DevFlags;
import io.bitsquare.common.util.Tuple3; import io.bitsquare.common.util.Tuple3;
import io.bitsquare.gui.components.BusyAnimation; import io.bitsquare.gui.components.BusyAnimation;
@ -62,67 +63,63 @@ public class BuyerStep2View extends TradeStepView {
if (tradeStatePropertySubscription == null) { if (tradeStatePropertySubscription == null) {
tradeStatePropertySubscription = EasyBind.subscribe(trade.stateProperty(), state -> { tradeStatePropertySubscription = EasyBind.subscribe(trade.stateProperty(), state -> {
if (state == Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN) { if (state == Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN) {
PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData(); PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData();
if (paymentAccountContractData != null) {
String paymentDetailsForTradePopup = paymentAccountContractData.getPaymentDetailsForTradePopup();
String key = "startPayment" + trade.getId(); String key = "startPayment" + trade.getId();
String message = ""; String message = Res.get("portfolio.pending.step2.confReached");
String copyPaste = Res.get("portfolio.pending.step2_buyer.copyPaste");
String refTextWarn = Res.get("portfolio.pending.step2_buyer.refTextWarn");
String accountDetails = Res.get("portfolio.pending.step2_buyer.accountDetails");
String tradeId = Res.get("portfolio.pending.step2_buyer.tradeId");
String assign = Res.get("portfolio.pending.step2_buyer.assign");
String fees = Res.get("portfolio.pending.step2_buyer.fees");
String id = trade.getShortId();
String amount = model.formatter.formatVolumeWithCode(trade.getTradeVolume());
if (paymentAccountContractData instanceof CryptoCurrencyAccountContractData) if (paymentAccountContractData instanceof CryptoCurrencyAccountContractData)
message = "Your trade has reached at least one blockchain confirmation.\n" + message += Res.get("portfolio.pending.step2_buyer.altcoin",
"(You can wait for more confirmations if you want - 6 confirmations are considered as very secure.)\n\n" + CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()),
"Please transfer from your external " + amount) +
CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()) + " wallet\n" + accountDetails +
model.formatter.formatVolumeWithCode(trade.getTradeVolume()) + " to the BTC seller.\n\n" + paymentDetailsForTradePopup + ".\n\n" +
"Here are the trading account details of the bitcoin seller:\n" + copyPaste;
"" + paymentAccountContractData.getPaymentDetailsForTradePopup() + ".\n\n" + else if (paymentAccountContractData instanceof CashDepositAccountContractData)
"(You can copy & paste the values from the main screen after closing that popup.)"; message += Res.get("portfolio.pending.step2_buyer.cash",
else if (paymentAccountContractData != null) amount) +
if (paymentAccountContractData instanceof CashDepositAccountContractData) accountDetails +
message = "Your trade has reached at least one blockchain confirmation.\n" + paymentDetailsForTradePopup + ".\n" +
"(You can wait for more confirmations if you want - 6 confirmations are considered as very secure.)\n\n" + copyPaste + "\n\n" +
"Please go to a bank and pay " + tradeId + id +
model.formatter.formatVolumeWithCode(trade.getTradeVolume()) + " to the BTC seller.\n\n" + assign +
"Here are the trading account details of the BTC seller:\n" + refTextWarn + "\n\n" +
"" + paymentAccountContractData.getPaymentDetailsForTradePopup() + ".\n" + fees + "\n\n" +
"(You can copy & paste the values from the main screen after closing that popup.)\n\n" + Res.get("portfolio.pending.step2_buyer.cash.extra");
"Please don't forget to add the trade ID \"" + trade.getShortId() +
"\" as \"reason for payment\" so the receiver can assign your payment to this trade.\n\n" +
"DO NOT use any additional notice in the \"reason for payment\" text like " +
"Bitcoin, Btc or Bitsquare.\n\n" +
"If your bank charges fees you have to cover those fees.\n\n" +
"IMPORTANT REQUIREMENT:\n" +
"After you have done the payment write on the paper receipt: NO REFUNDS.\n" +
"Then tear it in 2 parts, make a photo and send it to the BTC seller's email address.";
else if (paymentAccountContractData instanceof USPostalMoneyOrderAccountContractData) else if (paymentAccountContractData instanceof USPostalMoneyOrderAccountContractData)
message = "Your trade has reached at least one blockchain confirmation.\n" + message += Res.get("portfolio.pending.step2_buyer.postal", amount) +
"(You can wait for more confirmations if you want - 6 confirmations are considered as very secure.)\n\n" + accountDetails +
"Please send " + paymentDetailsForTradePopup + ".\n" +
model.formatter.formatVolumeWithCode(trade.getTradeVolume()) + " by \"US Postal Money Order\" to the BTC seller.\n\n" + copyPaste + "\n\n" +
"Here are the trading account details of the BTC seller:\n" + tradeId + id +
"" + paymentAccountContractData.getPaymentDetailsForTradePopup() + ".\n" + assign +
"(You can copy & paste the values from the main screen after closing that popup.)\n\n" + refTextWarn;
"Please don't forget to add the trade ID \"" + trade.getShortId() +
"\" as \"reason for payment\" so the receiver can assign your payment to this trade.\n\n" +
"DO NOT use any additional notice in the \"reason for payment\" text like " +
"Bitcoin, Btc or Bitsquare.";
else else
message = "Your trade has reached at least one blockchain confirmation.\n" + message += Res.get("portfolio.pending.step2_buyer.bank", amount) +
"(You can wait for more confirmations if you want - 6 confirmations are considered as very secure.)\n\n" + accountDetails +
"Please go to your online banking web page and pay " + paymentDetailsForTradePopup + ".\n" +
model.formatter.formatVolumeWithCode(trade.getTradeVolume()) + " to the BTC seller.\n\n" + copyPaste + "\n\n" +
"Here are the trading account details of the BTC seller:\n" + tradeId + id +
"" + paymentAccountContractData.getPaymentDetailsForTradePopup() + ".\n" + assign +
"(You can copy & paste the values from the main screen after closing that popup.)\n\n" + refTextWarn + "\n\n" +
"Please don't forget to add the trade ID \"" + trade.getShortId() + fees;
"\" as \"reason for payment\" so the receiver can assign your payment to this trade.\n\n" +
"DO NOT use any additional notice in the \"reason for payment\" text like " +
"Bitcoin, Btc or Bitsquare.\n\n" +
"If your bank charges fees you have to cover those fees.";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) { if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
preferences.dontShowAgain(key, true); preferences.dontShowAgain(key, true);
new Popup().headLine("Attention required for trade with ID " + trade.getShortId()) new Popup().headLine(Res.get("popup.attention.forTradeWithId", id))
.attention(message) .attention(message)
.show(); .show();
} }
}
} else if (state == Trade.State.BUYER_CONFIRMED_FIAT_PAYMENT_INITIATED && confirmButton.isDisabled()) { } else if (state == Trade.State.BUYER_CONFIRMED_FIAT_PAYMENT_INITIATED && confirmButton.isDisabled()) {
showStatusInfo(); showStatusInfo();
} else if (state == Trade.State.BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG) { } else if (state == Trade.State.BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG) {
@ -155,9 +152,9 @@ public class BuyerStep2View extends TradeStepView {
PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData(); PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData();
String paymentMethodName = paymentAccountContractData != null ? paymentAccountContractData.getPaymentMethodName() : ""; String paymentMethodName = paymentAccountContractData != null ? paymentAccountContractData.getPaymentMethodName() : "";
TitledGroupBg accountTitledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 1, TitledGroupBg accountTitledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 1,
"Start payment using " + Res.get(paymentMethodName), Res.get("portfolio.pending.step2_buyer.startPaymentUsing", Res.get(paymentMethodName)),
Layout.GROUP_DISTANCE); Layout.GROUP_DISTANCE);
TextFieldWithCopyIcon field = addLabelTextFieldWithCopyIcon(gridPane, gridRow, "Amount to transfer:", TextFieldWithCopyIcon field = addLabelTextFieldWithCopyIcon(gridPane, gridRow, Res.get("portfolio.pending.step2_buyer.amountToTransfer"),
model.getFiatVolume(), model.getFiatVolume(),
Layout.FIRST_ROW_AND_GROUP_DISTANCE).second; Layout.FIRST_ROW_AND_GROUP_DISTANCE).second;
field.setCopyWithoutCurrencyPostFix(true); field.setCopyWithoutCurrencyPostFix(true);
@ -206,7 +203,7 @@ public class BuyerStep2View extends TradeStepView {
gridRow = CashDepositForm.addFormForBuyer(gridPane, gridRow, paymentAccountContractData); gridRow = CashDepositForm.addFormForBuyer(gridPane, gridRow, paymentAccountContractData);
break; break;
case PaymentMethod.BLOCK_CHAINS_ID: case PaymentMethod.BLOCK_CHAINS_ID:
String labelTitle = "Sellers " + CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()) + " address:"; String labelTitle = Res.get("portfolio.pending.step2_buyer.sellersAddress", CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()));
gridRow = CryptoCurrencyForm.addFormForBuyer(gridPane, gridRow, paymentAccountContractData, labelTitle); gridRow = CryptoCurrencyForm.addFormForBuyer(gridPane, gridRow, paymentAccountContractData, labelTitle);
break; break;
default: default:
@ -214,11 +211,11 @@ public class BuyerStep2View extends TradeStepView {
} }
if (!(paymentAccountContractData instanceof CryptoCurrencyAccountContractData)) if (!(paymentAccountContractData instanceof CryptoCurrencyAccountContractData))
addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Reason for payment:", model.dataModel.getReference()); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.getWithCol("shared.reasonForPayment"), model.dataModel.getReference());
GridPane.setRowSpan(accountTitledGroupBg, gridRow - 3); GridPane.setRowSpan(accountTitledGroupBg, gridRow - 3);
Tuple3<Button, BusyAnimation, Label> tuple3 = addButtonBusyAnimationLabelAfterGroup(gridPane, ++gridRow, "Payment started"); Tuple3<Button, BusyAnimation, Label> tuple3 = addButtonBusyAnimationLabelAfterGroup(gridPane, ++gridRow, Res.get("portfolio.pending.step2_buyer.paymentStarted"));
confirmButton = tuple3.first; confirmButton = tuple3.first;
confirmButton.setOnAction(e -> onPaymentStarted()); confirmButton.setOnAction(e -> onPaymentStarted());
busyAnimation = tuple3.second; busyAnimation = tuple3.second;
@ -235,10 +232,7 @@ public class BuyerStep2View extends TradeStepView {
@Override @Override
protected String getWarningText() { protected String getWarningText() {
setWarningHeadline(); setWarningHeadline();
return "You still have not done your " + model.dataModel.getCurrencyCode() + " payment!\n" + return Res.get("portfolio.pending.step2_buyer.warn", model.dataModel.getCurrencyCode(), model.getDateForOpenDispute());
"Please note that the trade has to be completed until " +
model.getDateForOpenDispute() +
" otherwise the trade will be investigated by the arbitrator.";
} }
@ -248,9 +242,7 @@ public class BuyerStep2View extends TradeStepView {
@Override @Override
protected String getOpenForDisputeText() { protected String getOpenForDisputeText() {
return "You have not completed your payment!\n" + return Res.get("portfolio.pending.step2_buyer.openForDispute");
"The max. period for the trade has elapsed.\n" +
"\nPlease contact the arbitrator for opening a dispute.";
} }
@Override @Override
@ -269,13 +261,10 @@ public class BuyerStep2View extends TradeStepView {
String key = "confirmPaperReceiptSent"; String key = "confirmPaperReceiptSent";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) { if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
Popup popup = new Popup(); Popup popup = new Popup();
popup.headLine("Did you sent the paper receipt to the BTC seller?") popup.headLine(Res.get("portfolio.pending.step2_buyer.paperReceipt.headline"))
.feedback("Remember:\n" + .feedback(Res.get("portfolio.pending.step2_buyer.paperReceipt.msg"))
"You need to write on the paper receipt: NO REFUNDS.\n" +
"Then tear it in 2 parts, make a photo and send it to the BTC seller's email address.")
.actionButtonText("Yes, I have sent the paper receipt")
.onAction(this::showConfirmPaymentStartedPopup) .onAction(this::showConfirmPaymentStartedPopup)
.closeButtonText("No") .closeButtonText(Res.get("shared.no"))
.onClose(popup::hide) .onClose(popup::hide)
.dontShowAgainId(key, preferences) .dontShowAgainId(key, preferences)
.show(); .show();
@ -286,8 +275,7 @@ public class BuyerStep2View extends TradeStepView {
showConfirmPaymentStartedPopup(); showConfirmPaymentStartedPopup();
} }
} else { } else {
new Popup().information("You need to wait until you are fully connected to the network.\n" + new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
"That might take up to about 2 minutes at startup.").show();
} }
} }
@ -295,13 +283,12 @@ public class BuyerStep2View extends TradeStepView {
String key = "confirmPaymentStarted"; String key = "confirmPaymentStarted";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) { if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
Popup popup = new Popup(); Popup popup = new Popup();
popup.headLine("Confirm that you have started the payment") popup.headLine(Res.get("portfolio.pending.step2_buyer.confirmStart.headline"))
.confirmation("Did you initiate the " + CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()) + .confirmation(Res.get("portfolio.pending.step2_buyer.confirmStart.msg", CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode())))
" payment to your trading partner?")
.width(700) .width(700)
.actionButtonText("Yes, I have started the payment") .actionButtonText(RegularEscapeUtil.basicEscape("portfolio.pending.step2_buyer.confirmStart.yes"))
.onAction(this::confirmPaymentStarted) .onAction(this::confirmPaymentStarted)
.closeButtonText("No") .closeButtonText(Res.get("shared.no"))
.onClose(popup::hide) .onClose(popup::hide)
.dontShowAgainId(key, preferences) .dontShowAgainId(key, preferences)
.show(); .show();
@ -322,14 +309,13 @@ public class BuyerStep2View extends TradeStepView {
}, errorMessage -> { }, errorMessage -> {
confirmButton.setDisable(false); confirmButton.setDisable(false);
hideStatusInfo(); hideStatusInfo();
new Popup().warning("Sending message to your trading partner failed.\n" + new Popup().warning(Res.get("popup.warning.sendMsgFailed")).show();
"Please try again and if it continue to fail report a bug.").show();
}); });
} }
private void showStatusInfo() { private void showStatusInfo() {
busyAnimation.play(); busyAnimation.play();
statusLabel.setText("Sending confirmation..."); statusLabel.setText(Res.get("shared.sendingConfirmation"));
} }
private void hideStatusInfo() { private void hideStatusInfo() {

View file

@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer;
import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class BuyerStep3View extends TradeStepView { public class BuyerStep3View extends TradeStepView {
@ -37,13 +38,12 @@ public class BuyerStep3View extends TradeStepView {
@Override @Override
protected String getInfoBlockTitle() { protected String getInfoBlockTitle() {
return "Wait for BTC seller's payment confirmation"; return Res.get("portfolio.pending.step3_buyer.wait.headline");
} }
@Override @Override
protected String getInfoText() { protected String getInfoText() {
return "Waiting for the BTC seller's confirmation " + return Res.get("portfolio.pending.step3_buyer.wait.info", model.dataModel.getCurrencyCode());
"for the receipt of the " + model.dataModel.getCurrencyCode() + " payment.";
} }
@ -55,13 +55,9 @@ public class BuyerStep3View extends TradeStepView {
protected String getWarningText() { protected String getWarningText() {
setInformationHeadline(); setInformationHeadline();
String substitute = model.isBlockChainMethod() ? String substitute = model.isBlockChainMethod() ?
"on the " + model.dataModel.getCurrencyCode() + "blockchain" : Res.get("portfolio.pending.step3_buyer.warn.part1a", model.dataModel.getCurrencyCode()) :
"at your payment provider (e.g. bank)"; Res.get("portfolio.pending.step3_buyer.warn.part1b");
return "The BTC seller still has not confirmed your payment!\n" + return Res.get("portfolio.pending.step3_buyer.warn.part2", substitute, model.getDateForOpenDispute());
"Please check " + substitute + " if the payment sending was successful.\n" +
"If the BTC seller does not confirm the receipt of your payment until " +
model.getDateForOpenDispute() +
" the trade will be investigated by the arbitrator.";
} }
@ -71,9 +67,7 @@ public class BuyerStep3View extends TradeStepView {
@Override @Override
protected String getOpenForDisputeText() { protected String getOpenForDisputeText() {
return "The BTC seller has not confirmed your payment!\n" + return Res.get("portfolio.pending.step3_buyer.openForDispute");
"The max. period for the trade has elapsed.\n" +
"Please contact the arbitrator for opening a dispute.";
} }
@Override @Override

View file

@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer;
import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.locale.Res;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import org.bitcoinj.core.*; import org.bitcoinj.core.*;
@ -94,8 +95,8 @@ public class BuyerStep4View extends TradeStepView {
protected void addContent() { protected void addContent() {
addTradeInfoBlock(); addTradeInfoBlock();
if (model.getLockTime() > 0) { if (model.getLockTime() > 0) {
blockTextField = addLabelTextField(gridPane, gridRow, "Block(s) to wait until lock time elapsed:", "").second; blockTextField = addLabelTextField(gridPane, gridRow, Res.get("portfolio.pending.step4_buyer.blocks"), "").second;
timeTextField = addLabelTextField(gridPane, ++gridRow, "Approx. date when payout gets unlocked:").second; timeTextField = addLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step4_buyer.date")).second;
GridPane.setRowSpan(tradeInfoTitledGroupBg, 5); GridPane.setRowSpan(tradeInfoTitledGroupBg, 5);
} else { } else {
GridPane.setRowSpan(tradeInfoTitledGroupBg, 3); //TODO should never reach GridPane.setRowSpan(tradeInfoTitledGroupBg, 3); //TODO should never reach
@ -112,20 +113,17 @@ public class BuyerStep4View extends TradeStepView {
@Override @Override
protected String getInfoBlockTitle() { protected String getInfoBlockTitle() {
if (model.getLockTime() > 0) if (model.getLockTime() > 0)
return "Wait until payout lock time is over"; return Res.get("portfolio.pending.step4_buyer.wait");
else else
return "Sending payout transaction to peer"; return Res.get("portfolio.pending.step4_buyer.send");
} }
@Override @Override
protected String getInfoText() { protected String getInfoText() {
if (model.getLockTime() > 0) if (model.getLockTime() > 0)
return "The payout transaction is signed and finalized by both parties.\n" + return Res.get("portfolio.pending.step4_buyer.info");
"For reducing bank chargeback risks the payout transaction is blocked by a lock time.\n" +
"After that lock time is over the payout transaction gets published and you receive " +
"your bitcoin.";
else else
return "We are sending the payout transaction to the other peer."; return Res.get("portfolio.pending.step4_buyer.sending");
} }
@ -136,10 +134,7 @@ public class BuyerStep4View extends TradeStepView {
@Override @Override
protected String getWarningText() { protected String getWarningText() {
setInformationHeadline(); setInformationHeadline();
return "The payout transaction is still blocked by the lock time!\n" + return Res.get("portfolio.pending.step4_buyer.warn", model.getDateForOpenDispute());
"If the trade has not been completed on " +
model.getDateForOpenDispute() +
" the arbitrator will investigate.";
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -39,6 +39,7 @@ import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.control.Button; import javafx.scene.control.Button;
@ -115,28 +116,25 @@ public class BuyerStep5View extends TradeStepView {
@Override @Override
protected void addContent() { protected void addContent() {
addTitledGroupBg(gridPane, gridRow, 4, "Summary of completed trade ", 0); addTitledGroupBg(gridPane, gridRow, 4, Res.get("portfolio.pending.step5_buyer.groupTitle"), 0);
Tuple2<Label, TextField> btcTradeAmountPair = addLabelTextField(gridPane, gridRow, getBtcTradeAmountLabel(), model.getTradeVolume(), Layout.FIRST_ROW_DISTANCE); Tuple2<Label, TextField> btcTradeAmountPair = addLabelTextField(gridPane, gridRow, getBtcTradeAmountLabel(), model.getTradeVolume(), Layout.FIRST_ROW_DISTANCE);
btcTradeAmountLabel = btcTradeAmountPair.first; btcTradeAmountLabel = btcTradeAmountPair.first;
Tuple2<Label, TextField> fiatTradeAmountPair = addLabelTextField(gridPane, ++gridRow, getFiatTradeAmountLabel(), model.getFiatVolume()); Tuple2<Label, TextField> fiatTradeAmountPair = addLabelTextField(gridPane, ++gridRow, getFiatTradeAmountLabel(), model.getFiatVolume());
fiatTradeAmountLabel = fiatTradeAmountPair.first; fiatTradeAmountLabel = fiatTradeAmountPair.first;
addLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.totalPaid"), model.getTotalFees());
addLabelTextField(gridPane, ++gridRow, "Total fees paid:", model.getTotalFees()); addLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.refunded"), model.getSecurityDeposit());
addTitledGroupBg(gridPane, ++gridRow, 2, Res.get("portfolio.pending.step5_buyer.withdrawBTC"), Layout.GROUP_DISTANCE);
addLabelTextField(gridPane, ++gridRow, "Refunded security deposit:", model.getSecurityDeposit()); addLabelTextField(gridPane, gridRow, Res.get("portfolio.pending.step5_buyer.amount"), model.getPayoutAmount(), Layout.FIRST_ROW_AND_GROUP_DISTANCE);
withdrawAddressTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.withdrawToAddress")).second;
addTitledGroupBg(gridPane, ++gridRow, 2, "Withdraw your bitcoins", Layout.GROUP_DISTANCE);
addLabelTextField(gridPane, gridRow, "Amount to withdraw:", model.getPayoutAmount(), Layout.FIRST_ROW_AND_GROUP_DISTANCE);
withdrawAddressTextField = addLabelInputTextField(gridPane, ++gridRow, "Withdraw to address:").second;
HBox hBox = new HBox(); HBox hBox = new HBox();
hBox.setSpacing(10); hBox.setSpacing(10);
useSavingsWalletButton = new Button("Move funds to Bitsquare wallet"); useSavingsWalletButton = new Button(Res.get("portfolio.pending.step5_buyer.moveToBitsquareWallet"));
useSavingsWalletButton.setDefaultButton(false); useSavingsWalletButton.setDefaultButton(false);
Label label = new Label("OR"); Label label = new Label(Res.get("shared.OR"));
label.setPadding(new Insets(5, 0, 0, 0)); label.setPadding(new Insets(5, 0, 0, 0));
withdrawToExternalWalletButton = new Button("Withdraw to external wallet"); withdrawToExternalWalletButton = new Button(Res.get("portfolio.pending.step5_buyer.withdrawExternal"));
withdrawToExternalWalletButton.setDefaultButton(false); withdrawToExternalWalletButton.setDefaultButton(false);
hBox.getChildren().addAll(useSavingsWalletButton, label, withdrawToExternalWalletButton); hBox.getChildren().addAll(useSavingsWalletButton, label, withdrawToExternalWalletButton);
GridPane.setRowIndex(hBox, ++gridRow); GridPane.setRowIndex(hBox, ++gridRow);
@ -158,8 +156,8 @@ public class BuyerStep5View extends TradeStepView {
String key = "tradeCompleted" + trade.getId(); String key = "tradeCompleted" + trade.getId();
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) { if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
preferences.dontShowAgain(key, true); preferences.dontShowAgain(key, true);
new Notification().headLine("Trade completed") new Notification().headLine(Res.get("notification.tradeCompleted.headline"))
.notification("You can withdraw your funds now to your external Bitcoin wallet or transfer it to the Bitsquare wallet.") .notification(Res.get("notification.tradeCompleted.msg"))
.autoClose() .autoClose()
.show(); .show();
} }
@ -182,7 +180,7 @@ public class BuyerStep5View extends TradeStepView {
Coin fee = feeEstimationTransaction.getFee(); Coin fee = feeEstimationTransaction.getFee();
Coin receiverAmount = amount.subtract(fee); Coin receiverAmount = amount.subtract(fee);
if (balance.isZero()) { if (balance.isZero()) {
new Popup().warning("Your funds have already been withdrawn.\nPlease check the transaction history.").show(); new Popup().warning(Res.get("portfolio.pending.step5_buyer.alreadyWithdrawn")).show();
model.dataModel.tradeManager.addTradeToClosedTrades(trade); model.dataModel.tradeManager.addTradeToClosedTrades(trade);
} else { } else {
if (toAddresses.isEmpty()) { if (toAddresses.isEmpty()) {
@ -195,17 +193,21 @@ public class BuyerStep5View extends TradeStepView {
String key = "reviewWithdrawalAtTradeComplete"; String key = "reviewWithdrawalAtTradeComplete";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) { if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
int txSize = feeEstimationTransaction.bitcoinSerialize().length; int txSize = feeEstimationTransaction.bitcoinSerialize().length;
new Popup().headLine("Confirm withdrawal request") double feePerByte = MathUtils.roundDouble(((double) fee.value / (double) txSize), 2);
.confirmation("Sending: " + formatter.formatCoinWithCode(amount) + "\n" + double kb = txSize / 1000d;
"From address: " + fromAddresses + "\n" + String recAmount = formatter.formatCoinWithCode(receiverAmount);
"To receiving address: " + toAddresses + ".\n" + new Popup().headLine(Res.get("portfolio.pending.step5_buyer.confirmWithdrawal"))
"Required transaction fee is: " + formatter.formatCoinWithCode(fee) + " (" + MathUtils.roundDouble(((double) fee.value / (double) txSize), 2) + " Satoshis/byte)\n" + .confirmation(Res.get("portfolio.pending.step5_buyer.sendInfo",
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" + formatter.formatCoinWithCode(amount),
"The recipient will receive: " + formatter.formatCoinWithCode(receiverAmount) + "\n\n" + fromAddresses,
"Are you sure you want to withdraw that amount?") toAddresses,
.actionButtonText("Yes") formatter.formatCoinWithCode(fee),
feePerByte,
kb,
recAmount))
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> doWithdrawal(amount, fee)) .onAction(() -> doWithdrawal(amount, fee))
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.onClose(() -> { .onClose(() -> {
useSavingsWalletButton.setDisable(false); useSavingsWalletButton.setDisable(false);
withdrawToExternalWalletButton.setDisable(false); withdrawToExternalWalletButton.setDisable(false);
@ -218,9 +220,7 @@ public class BuyerStep5View extends TradeStepView {
} }
} else { } else {
new Popup() new Popup().warning(Res.get("portfolio.pending.step5_buyer.amountTooLow")).show();
.warning("The amount to transfer is lower than the transaction fee and the min. possible tx value (dust).")
.show();
} }
} }
} catch (AddressFormatException e) { } catch (AddressFormatException e) {
@ -267,10 +267,9 @@ public class BuyerStep5View extends TradeStepView {
private void handleTradeCompleted() { private void handleTradeCompleted() {
if (!DevFlags.DEV_MODE) { if (!DevFlags.DEV_MODE) {
String key = "tradeCompleteWithdrawCompletedInfo"; String key = "tradeCompleteWithdrawCompletedInfo";
new Popup().headLine("Withdrawal completed") new Popup().headLine(Res.get("portfolio.pending.step5_buyer.withdrawalCompleted.headline"))
.feedback("Your completed trades are stored under \"Portfolio/History\".\n" + .feedback(Res.get("portfolio.pending.step5_buyer.withdrawalCompleted.msg"))
"You can review all your bitcoin transactions under \"Funds/Transactions\"") .actionButtonTextWithGoTo("navigation.funds.transactions")
.actionButtonText("Go to \"Transactions\"")
.onAction(() -> model.dataModel.navigation.navigateTo(MainView.class, FundsView.class, TransactionsView.class)) .onAction(() -> model.dataModel.navigation.navigateTo(MainView.class, FundsView.class, TransactionsView.class))
.dontShowAgainId(key, preferences) .dontShowAgainId(key, preferences)
.show(); .show();
@ -286,10 +285,10 @@ public class BuyerStep5View extends TradeStepView {
} }
protected String getBtcTradeAmountLabel() { protected String getBtcTradeAmountLabel() {
return "You have bought:"; return Res.get("portfolio.pending.step5_buyer.bought");
} }
protected String getFiatTradeAmountLabel() { protected String getFiatTradeAmountLabel() {
return "You have paid:"; return Res.get("portfolio.pending.step5_buyer.paid");
} }
} }

View file

@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller;
import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class SellerStep1View extends TradeStepView { public class SellerStep1View extends TradeStepView {
@ -37,14 +38,12 @@ public class SellerStep1View extends TradeStepView {
@Override @Override
protected String getInfoBlockTitle() { protected String getInfoBlockTitle() {
return "Wait for blockchain confirmation"; return Res.get("portfolio.pending.step1.waitForConf");
} }
@Override @Override
protected String getInfoText() { protected String getInfoText() {
return "Deposit transaction has been published.\n" + return Res.get("portfolio.pending.step1.info", Res.get("shared.TheBTCBuyer"));
"The BTC buyer needs to wait for at least one blockchain confirmation before " +
"starting the payment.";
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -54,8 +53,7 @@ public class SellerStep1View extends TradeStepView {
@Override @Override
protected String getWarningText() { protected String getWarningText() {
setWarningHeadline(); setWarningHeadline();
return "The deposit transaction still did not get confirmed.\n" + return Res.get("portfolio.pending.step1.warn");
"That might happen in rare cases when the funding fee of one trader from the external wallet was too low.";
} }
@ -65,10 +63,7 @@ public class SellerStep1View extends TradeStepView {
@Override @Override
protected String getOpenForDisputeText() { protected String getOpenForDisputeText() {
return "The deposit transaction still did not get confirmed.\n" + return Res.get("portfolio.pending.step1.openForDispute");
"That might happen in rare cases when the funding fee of one trader from the external wallet was too low.\n" +
"The max. period for the trade has elapsed.\n" +
"\nPlease contact the arbitrator for opening a dispute.";
} }
} }

View file

@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller;
import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class SellerStep2View extends TradeStepView { public class SellerStep2View extends TradeStepView {
@ -37,13 +38,12 @@ public class SellerStep2View extends TradeStepView {
@Override @Override
protected String getInfoBlockTitle() { protected String getInfoBlockTitle() {
return "Wait for payment"; return Res.get("portfolio.pending.step2_seller.waitPayment.headline");
} }
@Override @Override
protected String getInfoText() { protected String getInfoText() {
return "The deposit transaction has at least one blockchain confirmation.\n" + return Res.get("portfolio.pending.step2_seller.waitPayment.msg", model.dataModel.getCurrencyCode());
"You need to wait until the BTC buyer starts the " + model.dataModel.getCurrencyCode() + " payment.";
} }
@ -54,11 +54,9 @@ public class SellerStep2View extends TradeStepView {
@Override @Override
protected String getWarningText() { protected String getWarningText() {
setInformationHeadline(); setInformationHeadline();
return "The BTC buyer still has not done the " + model.dataModel.getCurrencyCode() + " payment.\n" + return Res.get("portfolio.pending.step2_seller.warn",
"You need to wait until he starts the payment.\n" + model.dataModel.getCurrencyCode(),
"If the trade has not been completed on " + model.getDateForOpenDispute());
model.getDateForOpenDispute() +
" the arbitrator will investigate.";
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -67,9 +65,7 @@ public class SellerStep2View extends TradeStepView {
@Override @Override
protected String getOpenForDisputeText() { protected String getOpenForDisputeText() {
return "The BTC buyer has not started his payment!\n" + return Res.get("portfolio.pending.step2_seller.openForDispute");
"The max. allowed period for the trade has elapsed.\n" +
"Please contact the arbitrator for opening a dispute.";
} }
@Override @Override

View file

@ -27,6 +27,7 @@ import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.CurrencyUtil; import io.bitsquare.locale.CurrencyUtil;
import io.bitsquare.locale.Res;
import io.bitsquare.payment.*; import io.bitsquare.payment.*;
import io.bitsquare.trade.Contract; import io.bitsquare.trade.Contract;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
@ -69,49 +70,29 @@ public class SellerStep3View extends TradeStepView {
String message; String message;
String tradeVolumeWithCode = model.formatter.formatVolumeWithCode(trade.getTradeVolume()); String tradeVolumeWithCode = model.formatter.formatVolumeWithCode(trade.getTradeVolume());
String currencyName = CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()); String currencyName = CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode());
String part1 = Res.get("portfolio.pending.step3_seller.part", currencyName);
String id = trade.getShortId();
if (paymentAccountContractData instanceof CryptoCurrencyAccountContractData) { if (paymentAccountContractData instanceof CryptoCurrencyAccountContractData) {
String address = ((CryptoCurrencyAccountContractData) paymentAccountContractData).getAddress(); String address = ((CryptoCurrencyAccountContractData) paymentAccountContractData).getAddress();
message = "Your trading partner has confirmed that he initiated the " + currencyName + " payment.\n\n" + message = Res.get("portfolio.pending.step3_seller.altcoin", part1, currencyName, address, tradeVolumeWithCode, currencyName);
"Please check on your favorite " + currencyName +
" blockchain explorer if the transaction to your receiving address\n" +
"" + address + "\n" +
"has already sufficient blockchain confirmations.\n" +
"The payment amount has to be " + tradeVolumeWithCode + "\n\n" +
"You can copy & paste your " + currencyName + " address from the main screen after " +
"closing that popup.";
} else { } else {
if (paymentAccountContractData instanceof USPostalMoneyOrderAccountContractData) if (paymentAccountContractData instanceof USPostalMoneyOrderAccountContractData)
message = "Your trading partner has confirmed that he initiated the " + currencyName + " payment.\n\n" + message = Res.get("portfolio.pending.step3_seller.postal", part1, tradeVolumeWithCode, id);
"Please check if you have received " +
tradeVolumeWithCode + " with \"US Postal Money Order\" from the BTC buyer.\n\n" +
"The trade ID (\"reason for payment\" text) of the transaction is: \"" + trade.getShortId() + "\"";
else else
message = "Your trading partner has confirmed that he initiated the " + currencyName + " payment.\n\n" + message = Res.get("portfolio.pending.step3_seller.bank", currencyName, tradeVolumeWithCode, id);
"Please go to your online banking web page and check if you have received " +
tradeVolumeWithCode + " from the BTC buyer.\n\n" +
"The trade ID (\"reason for payment\" text) of the transaction is: \"" + trade.getShortId() + "\"";
String part = Res.get("portfolio.pending.step3_seller.openDispute");
if (paymentAccountContractData instanceof CashDepositAccountContractData) if (paymentAccountContractData instanceof CashDepositAccountContractData)
message += "\n\nBecause the payment is done via Cash/ATM Deposit the BTC buyer has to write \"NO REFUND\" " + message = message + Res.get("portfolio.pending.step3_seller.cash", part);
"on the paper receipt, tear it in 2 parts and send you a photo by email.\n\n" +
"To avoid chargeback risk, only confirm if you received the email and if you are " +
"sure the paper receipt is valid.\n" +
"If you are not sure, please don't confirm but open a dispute " +
"by entering \"cmd + o\" or \"ctrl + o\".";
Optional<String> optionalHolderName = getOptionalHolderName(); Optional<String> optionalHolderName = getOptionalHolderName();
if (optionalHolderName.isPresent()) { if (optionalHolderName.isPresent()) {
message = message + "\n\n" + message = message + Res.get("portfolio.pending.step3_seller.bankCheck" + optionalHolderName.get(), part);
"Please also verify that the senders name in your bank statement matches that one from the " +
"trade contract:\n" +
"Senders name: " + optionalHolderName.get() + "\n\n" +
"If the name is not the same as the one displayed here, please don't confirm but open a dispute " +
"by entering \"cmd + o\" or \"ctrl + o\".";
} }
} }
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) { if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
preferences.dontShowAgain(key, true); preferences.dontShowAgain(key, true);
new Popup().headLine("Attention required for trade with ID " + trade.getShortId()) new Popup().headLine(Res.get("popup.attention.forTradeWithId", id))
.attention(message) .attention(message)
.show(); .show();
} }
@ -145,9 +126,9 @@ public class SellerStep3View extends TradeStepView {
protected void addContent() { protected void addContent() {
addTradeInfoBlock(); addTradeInfoBlock();
TitledGroupBg titledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 3, "Confirm payment receipt", Layout.GROUP_DISTANCE); TitledGroupBg titledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 3, Res.get("portfolio.pending.step3_seller.confirmPaymentReceipt"), Layout.GROUP_DISTANCE);
TextFieldWithCopyIcon field = addLabelTextFieldWithCopyIcon(gridPane, gridRow, "Amount to receive:", TextFieldWithCopyIcon field = addLabelTextFieldWithCopyIcon(gridPane, gridRow, Res.get("portfolio.pending.step3_seller.amountToReceive"),
model.getFiatVolume(), Layout.FIRST_ROW_AND_GROUP_DISTANCE).second; model.getFiatVolume(), Layout.FIRST_ROW_AND_GROUP_DISTANCE).second;
field.setCopyWithoutCurrencyPostFix(true); field.setCopyWithoutCurrencyPostFix(true);
@ -164,14 +145,14 @@ public class SellerStep3View extends TradeStepView {
if (myPaymentAccountContractData instanceof CryptoCurrencyAccountContractData) { if (myPaymentAccountContractData instanceof CryptoCurrencyAccountContractData) {
myPaymentDetails = ((CryptoCurrencyAccountContractData) myPaymentAccountContractData).getAddress(); myPaymentDetails = ((CryptoCurrencyAccountContractData) myPaymentAccountContractData).getAddress();
peersPaymentDetails = ((CryptoCurrencyAccountContractData) peersPaymentAccountContractData).getAddress(); peersPaymentDetails = ((CryptoCurrencyAccountContractData) peersPaymentAccountContractData).getAddress();
myTitle = "Your " + nameByCode + " address:"; myTitle = Res.get("portfolio.pending.step3_seller.yourAddress");
peersTitle = "Buyers " + nameByCode + " address:"; peersTitle = Res.get("portfolio.pending.step3_seller.buyersAddress", nameByCode);
isBlockChain = true; isBlockChain = true;
} else { } else {
myPaymentDetails = myPaymentAccountContractData.getPaymentDetails(); myPaymentDetails = myPaymentAccountContractData.getPaymentDetails();
peersPaymentDetails = peersPaymentAccountContractData.getPaymentDetails(); peersPaymentDetails = peersPaymentAccountContractData.getPaymentDetails();
myTitle = "Your trading account:"; myTitle = Res.get("portfolio.pending.step3_seller.yourAccount");
peersTitle = "Buyers trading account:"; peersTitle = Res.get("portfolio.pending.step3_seller.buyersAccount");
} }
} }
@ -184,11 +165,11 @@ public class SellerStep3View extends TradeStepView {
peersPaymentDetailsTextField.setTooltip(new Tooltip(peersPaymentDetails)); peersPaymentDetailsTextField.setTooltip(new Tooltip(peersPaymentDetails));
if (!isBlockChain) { if (!isBlockChain) {
addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Reason for payment:", model.dataModel.getReference()); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.getWithCol("shared.reasonForPayment"), model.dataModel.getReference());
GridPane.setRowSpan(titledGroupBg, 4); GridPane.setRowSpan(titledGroupBg, 4);
} }
Tuple3<Button, BusyAnimation, Label> tuple = addButtonBusyAnimationLabelAfterGroup(gridPane, ++gridRow, "Confirm payment receipt"); Tuple3<Button, BusyAnimation, Label> tuple = addButtonBusyAnimationLabelAfterGroup(gridPane, ++gridRow, Res.get("portfolio.pending.step3_seller.confirmReceipt"));
confirmButton = tuple.first; confirmButton = tuple.first;
confirmButton.setOnAction(e -> onPaymentReceived()); confirmButton.setOnAction(e -> onPaymentReceived());
busyAnimation = tuple.second; busyAnimation = tuple.second;
@ -205,14 +186,11 @@ public class SellerStep3View extends TradeStepView {
@Override @Override
protected String getInfoText() { protected String getInfoText() {
String currencyCode = model.dataModel.getCurrencyCode();
if (model.isBlockChainMethod()) { if (model.isBlockChainMethod()) {
return "The BTC buyer has started the " + model.dataModel.getCurrencyCode() + " payment.\n" + return Res.get("portfolio.pending.step3_seller.buyerStartedPayment", Res.get("portfolio.pending.step3_seller.buyerStartedPayment.altcoin", currencyCode));
"Check for blockchain confirmations at your altcoin wallet or block explorer and " +
"confirm the payment when you have sufficient blockchain confirmations.";
} else { } else {
return "The BTC buyer has started the " + model.dataModel.getCurrencyCode() + " payment.\n" + return Res.get("portfolio.pending.step3_seller.buyerStartedPayment", Res.get("portfolio.pending.step3_seller.buyerStartedPayment.fiat", currencyCode));
"Check at your trading account (e.g. bank account) and confirm when you have " +
"received the payment.";
} }
} }
@ -225,13 +203,11 @@ public class SellerStep3View extends TradeStepView {
protected String getWarningText() { protected String getWarningText() {
setWarningHeadline(); setWarningHeadline();
String substitute = model.isBlockChainMethod() ? String substitute = model.isBlockChainMethod() ?
"on the " + model.dataModel.getCurrencyCode() + "blockchain" : Res.get("portfolio.pending.step3_seller.warn.part1a", model.dataModel.getCurrencyCode()) :
"at your payment provider (e.g. bank)"; Res.get("portfolio.pending.step3_seller.warn.part1b");
return "You still have not confirmed the receipt of the payment!\n" + return Res.get("portfolio.pending.step3_seller.warn.part2", substitute, model.getDateForOpenDispute());
"Please check " + substitute + " if you have received the payment.\n" +
"If you do not confirm receipt until " +
model.getDateForOpenDispute() +
" the trade will be investigated by the arbitrator.";
} }
@ -241,9 +217,7 @@ public class SellerStep3View extends TradeStepView {
@Override @Override
protected String getOpenForDisputeText() { protected String getOpenForDisputeText() {
return "You have not confirmed the receipt of the payment!\n" + return Res.get("portfolio.pending.step3_seller.openForDispute");
"The max. period for the trade has elapsed.\n" +
"Please contact the arbitrator for opening a dispute.";
} }
@Override @Override
@ -263,35 +237,29 @@ public class SellerStep3View extends TradeStepView {
String key = "confirmPaymentReceived"; String key = "confirmPaymentReceived";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) { if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData(); PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData();
String message = "Have you received the " + CurrencyUtil.getNameByCode(model.dataModel.getCurrencyCode()) + String message = Res.get("portfolio.pending.step3_seller.onPaymentReceived.part1", CurrencyUtil.getNameByCode(model.dataModel.getCurrencyCode()));
" payment from your trading partner?\n\n";
if (!(paymentAccountContractData instanceof CryptoCurrencyAccountContractData)) { if (!(paymentAccountContractData instanceof CryptoCurrencyAccountContractData)) {
message += "The trade ID (\"reason for payment\" text) of the transaction is: \"" + trade.getShortId() + "\"\n\n"; message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.fiat", trade.getShortId());
Optional<String> optionalHolderName = getOptionalHolderName(); Optional<String> optionalHolderName = getOptionalHolderName();
if (optionalHolderName.isPresent()) { if (optionalHolderName.isPresent()) {
message += "Please also verify that the senders name in your bank statement matches that one from the trade contract:\n" + message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.name", optionalHolderName.get());
"Senders name: " + optionalHolderName.get() + "\n\n" +
"If the name is not the same as the one displayed here, please don't confirm but open a " +
"dispute by entering \"cmd + o\" or \"ctrl + o\".\n\n";
} }
} }
message += "Please note, that as soon you have confirmed the receipt, the locked trade amount will be released " + message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.note");
"to the BTC buyer and the security deposit will be refunded.";
new Popup() new Popup()
.headLine("Confirm that you have received the payment") .headLine(Res.get("portfolio.pending.step3_seller.onPaymentReceived.confirm.headline"))
.confirmation(message) .confirmation(message)
.width(700) .width(700)
.actionButtonText("Yes, I have received the payment") .actionButtonText(Res.get("portfolio.pending.step3_seller.onPaymentReceived.confirm.yes"))
.onAction(this::confirmPaymentReceived) .onAction(this::confirmPaymentReceived)
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.show(); .show();
} else { } else {
confirmPaymentReceived(); confirmPaymentReceived();
} }
} else { } else {
new Popup().information("You need to wait until you are fully connected to the network.\n" + new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
"That might take up to about 2 minutes at startup.").show();
} }
} }
@ -308,14 +276,13 @@ public class SellerStep3View extends TradeStepView {
}, errorMessage -> { }, errorMessage -> {
confirmButton.setDisable(false); confirmButton.setDisable(false);
hideStatusInfo(); hideStatusInfo();
new Popup().warning("Sending message to your trading partner failed.\n" + new Popup().warning(Res.get("popup.warning.sendMsgFailed")).show();
"Please try again and if it continue to fail report a bug.").show();
}); });
} }
private void showStatusInfo() { private void showStatusInfo() {
busyAnimation.play(); busyAnimation.play();
statusLabel.setText("Sending confirmation..."); statusLabel.setText(Res.get("shared.sendingConfirmation"));
} }
private void hideStatusInfo() { private void hideStatusInfo() {

View file

@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller;
import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class SellerStep3bView extends TradeStepView { public class SellerStep3bView extends TradeStepView {
@ -38,14 +39,12 @@ public class SellerStep3bView extends TradeStepView {
@Override @Override
protected String getInfoBlockTitle() { protected String getInfoBlockTitle() {
return "Wait until peer finalizes the payout transaction"; return Res.get("portfolio.pending.step3b_seller.waitFinalize");
} }
@Override @Override
protected String getInfoText() { protected String getInfoText() {
return "We requested from the trading peer to sign and finalize the payout transaction.\n" + return Res.get("portfolio.pending.step3b_seller.info");
"It might be that the other peer is offline, so we need to wait until he finalizes the " +
"transaction when he goes online again.";
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -55,11 +54,7 @@ public class SellerStep3bView extends TradeStepView {
@Override @Override
protected String getWarningText() { protected String getWarningText() {
setInformationHeadline(); setInformationHeadline();
return "The trading peer has not finalized the payout transaction!\n" + return Res.get("portfolio.pending.step3b_seller.warn", model.getDateForOpenDispute());
"He might be offline. You need to wait until he finalizes the payout transaction.\n" +
"If the trade has not been completed on " +
model.getDateForOpenDispute() +
" the arbitrator will investigate.";
} }
@ -69,9 +64,7 @@ public class SellerStep3bView extends TradeStepView {
@Override @Override
protected String getOpenForDisputeText() { protected String getOpenForDisputeText() {
return "The trading peer has not finalized the payout transaction!\n" + return Res.get("portfolio.pending.step3b_seller.openForDispute");
"The max. period for the trade has elapsed.\n" +
"Please contact the arbitrator for opening a dispute.";
} }
@Override @Override

View file

@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller;
import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel; import io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer.BuyerStep5View; import io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer.BuyerStep5View;
import io.bitsquare.locale.Res;
public class SellerStep5View extends BuyerStep5View { public class SellerStep5View extends BuyerStep5View {
@ -32,11 +33,11 @@ public class SellerStep5View extends BuyerStep5View {
@Override @Override
protected String getBtcTradeAmountLabel() { protected String getBtcTradeAmountLabel() {
return "You have sold:"; return Res.get("portfolio.pending.step5_seller.sold");
} }
@Override @Override
protected String getFiatTradeAmountLabel() { protected String getFiatTradeAmountLabel() {
return "You have received:"; return Res.get("portfolio.pending.step5_seller.received");
} }
} }

View file

@ -150,7 +150,7 @@ public class NetworkSettingsView extends ActivatableViewAndModel<GridPane, Activ
preferences.setUseTorForBitcoinJ(selected); preferences.setUseTorForBitcoinJ(selected);
UserThread.runAfter(BitsquareApp.shutDownHandler::run, 500, TimeUnit.MILLISECONDS); UserThread.runAfter(BitsquareApp.shutDownHandler::run, 500, TimeUnit.MILLISECONDS);
}) })
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.onClose(() -> useTorForBtcJCheckBox.setSelected(!selected)) .onClose(() -> useTorForBtcJCheckBox.setSelected(!selected))
.show(); .show();
} }
@ -185,7 +185,7 @@ public class NetworkSettingsView extends ActivatableViewAndModel<GridPane, Activ
} }
UserThread.runAfter(BitsquareApp.shutDownHandler::run, 500, TimeUnit.MILLISECONDS); UserThread.runAfter(BitsquareApp.shutDownHandler::run, 500, TimeUnit.MILLISECONDS);
}) })
.closeButtonText("Cancel") .closeButtonText(Res.get("shared.cancel"))
.onClose(() -> btcNodes.setText(btcNodesPreFocusText)) .onClose(() -> btcNodes.setText(btcNodesPreFocusText))
.show(); .show();
} }

View file

@ -5,6 +5,95 @@
# In some cases we use enum values or constants to map to display strings # In some cases we use enum values or constants to map to display strings
####################################################################
# Shared
####################################################################
shared.readMore=Read more
shared.openHelp=Open Help
shared.warning=Warning
shared.error=Error
shared.close=Close
shared.cancel=Cancel
shared.ok=OK
shared.yes=Yes
shared.no=No
shared.iUnderstand=I understand
shared.na=N/A
shared.shutDown=Shut down
shared.reportBug=Report bug at Github issues
shared.openSettings=Open settings for editing
shared.buyBitcoin=Buy bitcoin
shared.sellBitcoin=Sell bitcoin
shared.buyCurrency=Buy {0}
shared.sellCurrency=Sell {0}
shared.buyingBTCWith=buying BTC with {0}
shared.sellingBTCFor=selling BTC for {0}
shared.buyingCurrency=buying {0} (selling BTC)
shared.sellingCurrency=selling {0} (buying BTC)
shared.buy=buy
shared.sell=sell
shared.spend=spend
shared.bitcoin=bitcoin
shared.P2P=P2P
shared.offers=offers
shared.openOffers=open offers
shared.trades=trades
shared.openTrades=open trades
shared.dateTime=Date/Time
shared.price=Price
shared.priceWithCur=Price in {0}
shared.priceInCurForCur=Price in {0} for 1 {1}
shared.amount=Amount
shared.amountWithCur=Amount in {0}
shared.volumeWithCur=Volume in {0}
shared.sumWithCur=Sum in {0}
shared.currency=Currency
shared.market=Market
shared.paymentMethod=Payment method
shared.tradeCurrency=Trade currency
shared.tradeType=Trade type
shared.details=Details
shared.address=Address
shared.balanceWithCur=Balance in {0}
shared.txId=Transaction ID
shared.confirmations=Confirmations
shared.revert=Revert Tx
shared.select=Select
shared.usage=Usage
shared.state=Status
shared.tradeId=Trade ID
shared.offerId=Offer ID
shared.direction=Direction
shared.bankName=Bank name
shared.acceptedBanks=Accepted banks
shared.amountMinMax=Amount (min - max)
shared.remove=Remove
shared.goTo=Go to {0}
shared.BTCMinMax=BTC (min - max)
shared.removeOffer=Remove offer
shared.dontRemoveOffer=Don't remove offer
shared.openLargeQRWindow=Open large QR-Code window
shared.tradingAccount=Trading account
shared.faq=Visit FAQ web page
shared.yesCancel=Yes, cancel
shared.nextStep=Next step
shared.selectTradingAccount=Select trading account
shared.fundFromSavingsWalletButton=Transfer funds from Bitsquare wallet
shared.fundFromExternalWalletButton=Open your external wallet for funding
shared.openDefaultWalletFailed=Opening a default bitcoin wallet application has failed. Perhaps you don't have one installed?
shared.distanceInPercent=Distance in % from market price
shared.enterPercentageValue=Enter % value
shared.OR=OR
shared.notEnoughFunds=You don't have enough funds in your Bitsquare wallet.\nYou need {0} but you have only {1} in your Bitsquare wallet.\n\nPlease fund that trade from an external Bitcoin wallet or fund your Bitsquare wallet at \"Funds/Deposit funds\".
shared.waitingForFunds=Waiting for funds...
shared.depositTransactionId=Deposit transaction ID
shared.TheBTCBuyer=The BTC buyer
shared.You=You
shared.reasonForPayment=Reason for payment
shared.sendingConfirmation=Sending confirmation...
#################################################################### ####################################################################
# UI views # UI views
#################################################################### ####################################################################
@ -244,9 +333,141 @@ takeOffer.error.disputed=\n\nThe trade is handled already by an arbitrator.\nPle
portfolio.tab.openOffers=My open offers portfolio.tab.openOffers=My open offers
portfolio.tab.pendingTrades=Open trades portfolio.tab.pendingTrades=Open trades
portfolio.tab.history=History portfolio.tab.history=History
portfolio.tab.failed=Failed
portfolio.pending.step1.waitForConf=Wait for blockchain confirmation
portfolio.pending.step2_buyer.startPayment=Start payment
portfolio.pending.step2_seller.waitPaymentStarted=Wait until payment has started
portfolio.pending.step3_buyer.waitPaymentArrived=Wait until payment arrived
portfolio.pending.step3_seller.confirmPaymentReceived=Confirm payment received
portfolio.pending.step4.waitPaymentUnlocked=Wait for payout unlock
portfolio.pending.step5.completed=Completed
portfolio.pending.step1.info=Deposit transaction has been published.\n{0} needs to wait for at least one blockchain confirmation before starting the payment.
portfolio.pending.step1.warn=The deposit transaction still did not get confirmed.\nThat might happen in rare cases when the funding fee of one trader from the external wallet was too low.
portfolio.pending.step1.openForDispute=The deposit transaction still did not get confirmed.\nThat might happen in rare cases when the funding fee of one trader from the external wallet was too low.\nThe max. period for the trade has elapsed.\n\nPlease contact the arbitrator for opening a dispute.
portfolio.pending.step2.confReached=Your trade has reached at least one blockchain confirmation.\n(You can wait for more confirmations if you want - 6 confirmations are considered as very secure.)\n\n
portfolio.pending.step2_buyer.copyPaste=(You can copy & paste the values from the main screen after closing that popup.)
portfolio.pending.step2_buyer.refTextWarn=DO NOT use any additional notice in the \"reason for payment\" text like Bitcoin, Btc or Bitsquare.
portfolio.pending.step2_buyer.accountDetails=Here are the trading account details of the BTC seller:\n
portfolio.pending.step2_buyer.tradeId=Please don't forget to add the trade ID \"
portfolio.pending.step2_buyer.assign= as \"reason for payment\" so the receiver can assign your payment to this trade.\n\n
portfolio.pending.step2_buyer.fees=If your bank charges fees you have to cover those fees.
portfolio.pending.step2_buyer.altcoin=Please transfer from your external {0} wallet\n{1} to the BTC seller.\n\n
portfolio.pending.step2_buyer.cash=Please go to a bank and pay {0} to the BTC seller.\n\n
portfolio.pending.step2_buyer.cash.extra=IMPORTANT REQUIREMENT:\nAfter you have done the payment write on the paper receipt: NO REFUNDS.\nThen tear it in 2 parts, make a photo and send it to the BTC seller's email address.
portfolio.pending.step2_buyer.postal=Please send {0} by \"US Postal Money Order\" to the BTC seller." + "\n\n"
portfolio.pending.step2_buyer.bank=Please go to your online banking web page and pay {0} to the BTC seller.\n\n
portfolio.pending.step2_buyer.startPaymentUsing=Start payment using {0}
portfolio.pending.step2_buyer.amountToTransfer=Amount to transfer:
portfolio.pending.step2_buyer.sellersAddress=Sellers {0} address:
portfolio.pending.step2_buyer.paymentStarted=Payment started
portfolio.pending.step2_buyer.warn=You still have not done your {0} payment!\nPlease note that the trade has to be completed until {1} otherwise the trade will be investigated by the arbitrator.
portfolio.pending.step2_buyer.openForDispute=You have not completed your payment!\nThe max. period for the trade has elapsed.\n\nPlease contact the arbitrator for opening a dispute.
portfolio.pending.step2_buyer.paperReceipt.headline=Did you sent the paper receipt to the BTC seller?
portfolio.pending.step2_buyer.paperReceipt.msg=Remember:\n\
You need to write on the paper receipt: NO REFUNDS.\n\
Then tear it in 2 parts, make a photo and send it to the BTC seller's email address.
portfolio.pending.step2_buyer.confirmStart.headline=Confirm that you have started the payment
portfolio.pending.step2_buyer.confirmStart.msg=Did you initiate the {0} payment to your trading partner?
portfolio.pending.step2_buyer.confirmStart.yes=Yes, I have started the payment
portfolio.pending.step2_seller.waitPayment.headline=Wait for payment
portfolio.pending.step2_seller.waitPayment.msg=The deposit transaction has at least one blockchain confirmation.\nYou need to wait until the BTC buyer starts the {0} payment.
portfolio.pending.step2_seller.warn=The BTC buyer still has not done the {0} payment.\nYou need to wait until he starts the payment.\nIf the trade has not been completed on {1} the arbitrator will investigate.
portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started his payment!\nThe max. allowed period for the trade has elapsed.\nPlease contact the arbitrator for opening a dispute.
portfolio.pending.step3_buyer.wait.headline=Wait for BTC seller's payment confirmation
portfolio.pending.step3_buyer.wait.info=Waiting for the BTC seller's confirmation for the receipt of the {0} payment.
portfolio.pending.step3_buyer.warn.part1a=on the {0} blockchain
portfolio.pending.step3_buyer.warn.part1b=at your payment provider (e.g. bank)
portfolio.pending.step3_buyer.warn.part2=The BTC seller still has not confirmed your payment!\nPlease check {0} if the payment sending was successful.\nIf the BTC seller does not confirm the receipt of your payment until {1} the trade will be investigated by the arbitrator.
portfolio.pending.step3_buyer.openForDispute=The BTC seller has not confirmed your payment!\nThe max. period for the trade has elapsed.\nPlease contact the arbitrator for opening a dispute.
portfolio.pending.step3_seller.part=Your trading partner has confirmed that he initiated the {0} payment.\n\n
portfolio.pending.step3_seller.altcoin={0}Please check on your favorite {1} blockchain explorer if the transaction to your receiving address\n{2}\nhas already sufficient blockchain confirmations.\nThe payment amount has to be {3}\n\nYou can copy & paste your {4} address from the main screen after "closing that popup.
portfolio.pending.step3_seller.postal={0}Please check if you have received {1} with \"US Postal Money Order\" from the BTC buyer.\n\nThe trade ID (\"reason for payment\" text) of the transaction is: \"{2}\"
portfolio.pending.step3_seller.bank=Your trading partner has confirmed that he initiated the {0} payment.\n\nPlease go to your online banking web page and check if you have received {1} from the BTC buyer.\n\nThe trade ID (\"reason for payment\" text) of the transaction is: \"{2}\"
portfolio.pending.step3_seller.cash=\n\nBecause the payment is done via Cash Deposit the BTC buyer has to write \"NO REFUND\" on the paper receipt, tear it in 2 parts and send you a photo by email.\n\nTo avoid chargeback risk, only confirm if you received the email and if you are sure the paper receipt is valid.\nIf you are not sure, {0}
portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the senders name in your bank statement matches that one from the trade contract:\nSenders name: {0}\n\nIf the name is not the same as the one displayed here, {1}
portfolio.pending.step3_seller.openDispute=please don't confirm but open a dispute by entering \"cmd + o\" or \"ctrl + o\".
portfolio.pending.step3_seller.confirmPaymentReceipt=Confirm payment receipt
portfolio.pending.step3_seller.amountToReceive=Amount to receive:
portfolio.pending.step3_seller.yourAddress=Your {0} address:
portfolio.pending.step3_seller.buyersAddress=Buyers {0} address:
portfolio.pending.step3_seller.yourAccount=Your trading account:
portfolio.pending.step3_seller.buyersAccount=Buyers trading account:
portfolio.pending.step3_seller.confirmReceipt=Confirm payment receipt
portfolio.pending.step3_seller.buyerStartedPayment=The BTC buyer has started the {0} payment.\n{0}
portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Check for blockchain confirmations at your altcoin wallet or block explorer and confirm the payment when you have sufficient blockchain confirmations.
portfolio.pending.step3_seller.buyerStartedPayment.fiat=Check at your trading account (e.g. bank account) and confirm when you have received the payment.
portfolio.pending.step3_seller.warn.part1a=on the {0} blockchain
portfolio.pending.step3_seller.warn.part1b=at your payment provider (e.g. bank)
portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment!\nPlease check {0} if you have received the payment.\nIf you do not confirm receipt until {1} the trade will be investigated by the arbitrator.
portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease contact the arbitrator for opening a dispute.
portfolio.pending.step3_seller.onPaymentReceived.part1=Have you received the {0} payment from your trading partner?\n\n
portfolio.pending.step3_seller.onPaymentReceived.fiat=The trade ID (\"reason for payment\" text) of the transaction is: \"{0}\"\n\n"
portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the senders name in your bank statement matches that one from the trade contract:\nSenders name: {0}\n\nIf the name is not the same as the one displayed here, please don't confirm but open a dispute by entering \"cmd + o\" or \"ctrl + o\".\n\n
portfolio.pending.step3_seller.onPaymentReceived.note=Please note, that as soon you have confirmed the receipt, the locked trade amount will be released to the BTC buyer and the security deposit will be refunded.
portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirm that you have received the payment
portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Yes, I have received the payment
portfolio.pending.step3b_seller.waitFinalize=Wait until peer finalizes the payout transaction
portfolio.pending.step3b_seller.info=We requested from the trading peer to sign and finalize the payout transaction.\nIt might be that the other peer is offline, so we need to wait until he finalizes the transaction when he goes online again.
portfolio.pending.step3b_seller.warn=The trading peer has not finalized the payout transaction!\nHe might be offline. You need to wait until he finalizes the payout transaction.\nIf the trade has not been completed on {0} the arbitrator will investigate.
portfolio.pending.step3b_seller.openForDispute=The trading peer has not finalized the payout transaction!\nThe max. period for the trade has elapsed.\nPlease contact the arbitrator for opening a dispute.
portfolio.pending.step4_buyer.blocks=Block(s) to wait until lock time elapsed:
portfolio.pending.step4_buyer.date=Approx. date when payout gets unlocked:
portfolio.pending.step4_buyer.wait=Wait until payout lock time is over
portfolio.pending.step4_buyer.send=Sending payout transaction to peer
portfolio.pending.step4_buyer.info=The payout transaction is signed and finalized by both parties.\nFor reducing bank chargeback risks the payout transaction is blocked by a lock time.\nAfter that lock time is over the payout transaction gets published and you receive your bitcoin.
portfolio.pending.step4_buyer.sending=We are sending the payout transaction to the other peer.
portfolio.pending.step4_buyer.warn=The payout transaction is still blocked by the lock time!\nIf the trade has not been completed on {0} the arbitrator will investigate.
portfolio.pending.step5_buyer.groupTitle=Summary of completed trade
portfolio.pending.step5_buyer.totalPaid=Total fees paid:
portfolio.pending.step5_buyer.refunded=Refunded security deposit:
portfolio.pending.step5_buyer.withdrawBTC=Withdraw your bitcoins
portfolio.pending.step5_buyer.amount=Amount to withdraw:
portfolio.pending.step5_buyer.withdrawToAddress=Withdraw to address:
portfolio.pending.step5_buyer.moveToBitsquareWallet=Move funds to Bitsquare wallet
portfolio.pending.step5_buyer.withdrawExternal=Withdraw to external wallet
portfolio.pending.step5_buyer.alreadyWithdrawn=Your funds have already been withdrawn.\nPlease check the transaction history.
portfolio.pending.step5_buyer.confirmWithdrawal=Confirm withdrawal request
portfolio.pending.step5_buyer.sendInfo="Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired transaction fee is: {3} ({4} Satoshis/byte)\nTransaction size: {5} Kb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw that amount?"
portfolio.pending.step5_buyer.amountTooLow=The amount to transfer is lower than the transaction fee and the min. possible tx value (dust).
portfolio.pending.step5_buyer.withdrawalCompleted.headline=Withdrawal completed
portfolio.pending.step5_buyer.withdrawalCompleted.msg="Your completed trades are stored under \"Portfolio/History\".\nYou can review all your bitcoin transactions under \"Funds/Transactions\""
portfolio.pending.step5_buyer.bought=You have bought:
portfolio.pending.step5_buyer.paid=You have paid:
portfolio.pending.step5_seller.sold=You have sold:
portfolio.pending.step5_seller.received=You have received:
portfolio.pending.role=My role portfolio.pending.role=My role
portfolio.pending.tradeInformation=Trade information
portfolio.pending.remainingTime=Remaining time
portfolio.pending.tradeProcess=Trade process
portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the arbitrator arrived (e.g. if you did not got a response after 1 day) feel free to open a dispute again.
portfolio.pending.openAgainDispute.button=Open dispute again
portfolio.pending.openSupportTicket.headline=Open support ticket
portfolio.pending.openSupportTicket.msg=Please use that only in emergency case if you don't get displayed a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by the arbitrator
portfolio.pending.notification=Notification
portfolio.pending.openDispute=Open a dispute
portfolio.pending.disputeOpened=Dispute opened
portfolio.pending.openSupport ticket=Open support ticket
portfolio.pending.supportTicketOpened=Support ticket opened
portfolio.pending.requestSupport=Request support
portfolio.pending.error.requestSupport=Please report the problem to your arbitrator.\n\nHe will forward the information to the developers to investigate the problem.\nAfter the problem has be analyzed you will get back all the funds if funds was locked.
portfolio.pending.communicateWithArbitrator=Please communicate in the \"Support\" screen with the arbitrator.
portfolio.pending.supportTicketOpenedMyUser=You opened already a support ticket.\n{0}
portfolio.pending.disputeOpenedMyUser=You opened already a dispute.\n{0}
portfolio.pending.disputeOpenedByPeer=Your trading peer opened a dispute\n{0}
portfolio.pending.supportTicketOpenedByPeer=Your trading peer opened a support ticket.\n{0}
portfolio.pending.noReceiverAddressDefined=No receiver address defined
#################################################################### ####################################################################
# Funds # Funds
@ -310,90 +531,72 @@ daoView.tab.compensation=Compensation
daoView.tab.voting=Voting daoView.tab.voting=Voting
#################################################################### ####################################################################
# Shared # Notifications
#################################################################### ####################################################################
shared.readMore=Read more notification.walletUpdate.headline=Trading wallet update
shared.openHelp=Open Help notification.walletUpdate.msg=Your trading wallet is sufficiently funded.\nAmount: {0}
shared.warning=Warning notification.takeOffer.walletUpdate.msg=Your trading wallet was already sufficiently funded from an earlier take offer attempt.\nAmount: {0}
shared.error=Error notification.tradeCompleted.headline=Trade completed
shared.close=Close notification.tradeCompleted.msg=You can withdraw your funds now to your external Bitcoin wallet or transfer it to the Bitsquare wallet.
shared.cancel=Cancel
shared.ok=OK
shared.yes=Yes
shared.no=No
shared.iUnderstand=I understand
shared.na=N/A
shared.shutDown=Shut down
shared.reportBug=Report bug at Github issues
shared.openSettings=Open settings for editing
shared.buyBitcoin=Buy bitcoin
shared.sellBitcoin=Sell bitcoin
shared.buyCurrency=Buy {0}
shared.sellCurrency=Sell {0}
shared.buyingBTCWith=buying BTC with {0}
shared.sellingBTCFor=selling BTC for {0}
shared.buyingCurrency=buying {0} (selling BTC)
shared.sellingCurrency=selling {0} (buying BTC)
shared.buy=buy
shared.sell=sell
shared.spend=spend
shared.bitcoin=bitcoin ####################################################################
shared.P2P=P2P # Popups
shared.offers=offers ####################################################################
shared.trades=trades
shared.dateTime=Date/Time popup.headline.notification=Notification
shared.price=Price popup.headline.instruction=Please note:
shared.priceWithCur=Price in {0} popup.headline.attention=Attention
shared.priceInCurForCur=Price in {0} for 1 {1} popup.headline.backgroundInfo=Background information
shared.amount=Amount popup.headline.feedback=Completed
shared.amountWithCur=Amount in {0} popup.headline.confirmation=Confirmation
shared.volumeWithCur=Volume in {0} popup.headline.information=Information
shared.sumWithCur=Sum in {0} popup.headline.warning=Warning
shared.currency=Currency popup.headline.error=Error
shared.market=Market
shared.paymentMethod=Payment method popup.error.fatalStartupException=A fatal exception occurred at startup.
shared.tradeCurrency=Trade currency popup.error.walletException=Cannot open wallet because of an exception:\n{0}
shared.tradeType=Trade type popup.error.tryRestart=Please try to restart you application and check your network connection to see if you can resolve the issue.
shared.details=Details
shared.address=Address popup.warning.walletNotInitialized=The wallet is not initialized yet
shared.balanceWithCur=Balance in {0} popup.warning.wrongVersion=You probably have the wrong Bitsquare version for this computer.\nYour computer's architecture is: {0}.\nThe Bitsquare binary you installed is: {1}.\nPlease shut down and re-install the correct version ({2}).
shared.txId=Transaction ID popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a newdatabase version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bitsquare installed.\nYou can download it at:\nhttps://bitsquare.io/downloads\n\nPlease restart the application.
shared.confirmations=Confirmations popup.warning.cannotConnectAtStartup=You still did not get connected to the {0} network.\nIf you use Tor for Bitcoin it might be that you got an unstable Tor circuit.\nYou can wait longer or try to restart.
shared.revert=Revert Tx popup.warning.unknownProblemAtStartup=There is an unknown problem at startup.\nPlease restart and if the problem continues file a bug report.
shared.select=Select popup.warning.startupFailed.timeout=The application could not startup after 4 minutes.\n\n{0}
shared.usage=Usage popup.warning.startupFailed.twoInstances=Bitsquare is already running. You cannot run two instances of Bitsquare.
shared.state=Status popup.warning.cryptoTestFailed=Seems that you use a self compiled binary and have not following the build instructions in https://github.com/bitsquare/bitsquare/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nIf that is not the case and you use the official Bitsquare binary, please file a bug report to the Github page.\nError={0}
shared.tradeId=Trade ID popup.warning.noBountyCastle=There is a problem with the crypto libraries. BountyCastle is not available.
shared.offerId=Offer ID popup.warning.oldOffers.msg=You have open offers which have been created with an older version of Bitsquare.\nPlease remove those offers as they are not valid anymore.\n\nOffers (ID): {0}
shared.direction=Direction popup.warning.oldOffers.buttonText=Remove outdated offer(s)
shared.bankName=Bank name popup.warning.tradePeriod.halfReached=Your trade with ID {0} has reached the half of the max. allowed trading period and is still not completed.\n\nThe trade period ends on {1}\n\nPlease check your trade state at \"Portfolio/Open trades\" for further information.
shared.acceptedBanks=Accepted banks popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.
shared.amountMinMax=Amount (min - max) popup.warning.noTradingAccountSetup.headline=You have not setup a trading account
shared.remove=Remove popup.warning.noTradingAccountSetup.msg=You need to setup a national currency or altcoin account before you can create an offer.\nDo you want to setup an account?
shared.goTo=Go to {0} popup.warning.noArbitratorSelected.headline=You don't have an arbitrator selected.
shared.BTCMinMax=BTC (min - max) popup.warning.noArbitratorSelected.msg=You need to setup at least one arbitrator to be able to trade.\nDo you want to do this now?
shared.removeOffer=Remove offer popup.warning.notFullyConnected=You need to wait until you are fully connected to the network.\nThat might take up to about 2 minutes at startup.
shared.dontRemoveOffer=Don't remove offer popup.warning.removeOffer=Are you sure you want to remove that offer?\nThe offer fee of {0} will be lost if you remove that offer.
shared.openLargeQRWindow=Open large QR-Code window popup.warning.tooLargePercentageValue=You cannot set a percentage of 100% or larger.
shared.tradingAccount=Trading account popup.warning.examplePercentageValue=Please enter a percentage number like \"5.4\" for 5.4%
shared.faq=Visit FAQ web page popup.warning.noPriceFeedAvailable=There is no price feed available for that currency. You cannot use a percent based price.\nPlease select the fixed price.
shared.yesCancel=Yes, cancel popup.warning.sendMsgFailed=Sending message to your trading partner failed.\nPlease try again and if it continue to fail report a bug.
shared.nextStep=Next step
shared.selectTradingAccount=Select trading account popup.info.securityDepositInfo=To ensure that both traders follow the trade protocol they need to pay a security deposit.\n\nThe deposit will stay in your local trading wallet until the offer gets accepted by another trader.\nIt will be refunded to you after the trade has successfully completed.\n\nPlease note that you need to keep you application running if you have an open offer.\nWhen another trader wants to take your offer it requires that your application is online and able to react.\nBe sure that you have standby mode deactivated as that would disconnect your client from the network (standby of the monitor is not a problem).
shared.fundFromSavingsWalletButton=Transfer funds from Bitsquare wallet
shared.fundFromExternalWalletButton=Open your external wallet for funding popup.privateNotification.headline=Important private notification!
shared.openDefaultWalletFailed=Opening a default bitcoin wallet application has failed. Perhaps you don't have one installed?
shared.distanceInPercent=Distance in % from market price popup.securityRecommendation.headline=Important security recommendation
shared.enterPercentageValue=Enter % value popup.securityRecommendation.msg=We would like to remind you to consider using password protection for your wallet if you have not already enabled that.\n\nIt is also highly recommended to write down the wallet seed words. Those seed words are like a master password for recovering your Bitcoin wallet.\nAt the \"Wallet Seed\" section you find more information.\n\nAdditionally you should backup the complete application data folder at the \"Backup\" section.
shared.OR=OR
shared.notEnoughFunds=You don't have enough funds in your Bitsquare wallet.\nYou need {0} but you have only {1} in your Bitsquare wallet.\n\nPlease fund that trade from an external Bitcoin wallet or fund your Bitsquare wallet at \"Funds/Deposit funds\". popup.shutDownInProgress.headline=Shut down in progress
shared.waitingForFunds=Waiting for funds... popup.shutDownInProgress.msg=Shutting down application can take a few seconds.\nPlease don't interrupt this process.
popup.attention.forTradeWithId=Attention required for trade with ID {0}
#################################################################### ####################################################################
@ -411,8 +614,13 @@ table.placeholder.noData=Currently there is no data available
button.buy=I want to buy bitcoin button.buy=I want to buy bitcoin
button.sell=I want to sell bitcoin button.sell=I want to sell bitcoin
peerInfoIcon.tooltip.traded=Offerer's onion address: {0}\nYou have already traded {1} times with that offerer. peerInfoIcon.tooltip.offer.traded=Offerer's onion address: {0}\nYou have already traded {1} times with that offerer.
peerInfoIcon.tooltip.notTraded=Offerer's onion address: {0} peerInfoIcon.tooltip.offer.notTraded=Offerer's onion address: {0}
peerInfoIcon.tooltip.trade.traded=Trading peer's onion address: {0}\nYou have already traded {1} times with that peer.
peerInfoIcon.tooltip.trade.notTraded=Trading peer's onion address: {0}
tooltip.openPopupForDetails=Open popup for details
#################################################################### ####################################################################
@ -426,8 +634,7 @@ navigation.portfolio.myOpenOffers=\"Portfolio/My open offers\"
navigation.portfolio.pending=\"Portfolio/Open trades\" navigation.portfolio.pending=\"Portfolio/Open trades\"
navigation.funds.depositFunds=\"Funds/Deposit funds\" navigation.funds.depositFunds=\"Funds/Deposit funds\"
navigation.settings.preferences=\"Settings/Preferences\" navigation.settings.preferences=\"Settings/Preferences\"
navigation.funds.transactions=\"Funds/Transactions\"
#################################################################### ####################################################################
@ -559,68 +766,4 @@ validation.accountNr=Account number must consist of {0} numbers.
validation.accountNrChars=Account number must consist of {0} characters. validation.accountNrChars=Account number must consist of {0} characters.
####################################################################
# Notifications
####################################################################
notification.walletUpdate.headline=Trading wallet update
notification.walletUpdate.msg=Your trading wallet is sufficiently funded.\nAmount: {0}
notification.takeOffer.walletUpdate.msg=Your trading wallet was already sufficiently funded from an earlier take offer attempt.\nAmount: {0}
####################################################################
# Popups
####################################################################
popup.headline.notification=Notification
popup.headline.instruction=Please note:
popup.headline.attention=Attention
popup.headline.backgroundInfo=Background information
popup.headline.feedback=Completed
popup.headline.confirmation=Confirmation
popup.headline.information=Information
popup.headline.warning=Warning
popup.headline.error=Error
popup.error.fatalStartupException=A fatal exception occurred at startup.
popup.error.walletException=Cannot open wallet because of an exception:\n{0}
popup.error.tryRestart=Please try to restart you application and check your network connection to see if you can resolve the issue.
popup.warning.walletNotInitialized=The wallet is not initialized yet
popup.warning.wrongVersion=You probably have the wrong Bitsquare version for this computer.\nYour computer's architecture is: {0}.\nThe Bitsquare binary you installed is: {1}.\nPlease shut down and re-install the correct version ({2}).
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a newdatabase version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bitsquare installed.\nYou can download it at:\nhttps://bitsquare.io/downloads\n\nPlease restart the application.
popup.warning.cannotConnectAtStartup=You still did not get connected to the {0} network.\nIf you use Tor for Bitcoin it might be that you got an unstable Tor circuit.\nYou can wait longer or try to restart.
popup.warning.unknownProblemAtStartup=There is an unknown problem at startup.\nPlease restart and if the problem continues file a bug report.
popup.warning.startupFailed.timeout=The application could not startup after 4 minutes.\n\n{0}
popup.warning.startupFailed.twoInstances=Bitsquare is already running. You cannot run two instances of Bitsquare.
popup.warning.cryptoTestFailed=Seems that you use a self compiled binary and have not following the build instructions in https://github.com/bitsquare/bitsquare/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nIf that is not the case and you use the official Bitsquare binary, please file a bug report to the Github page.\nError={0}
popup.warning.noBountyCastle=There is a problem with the crypto libraries. BountyCastle is not available.
popup.warning.oldOffers.msg=You have open offers which have been created with an older version of Bitsquare.\nPlease remove those offers as they are not valid anymore.\n\nOffers (ID): {0}
popup.warning.oldOffers.buttonText=Remove outdated offer(s)
popup.warning.tradePeriod.halfReached=Your trade with ID {0} has reached the half of the max. allowed trading period and is still not completed.\n\nThe trade period ends on {1}\n\nPlease check your trade state at \"Portfolio/Open trades\" for further information.
popup.warning.tradePeriod.ended=Your trade with ID {0} has reached the max. allowed trading period and is not completed.\n\nThe trade period ended on {1}\n\nPlease check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.
popup.warning.noTradingAccountSetup.headline=You have not setup a trading account
popup.warning.noTradingAccountSetup.msg=You need to setup a national currency or altcoin account before you can create an offer.\nDo you want to setup an account?
popup.warning.noArbitratorSelected.headline=You don't have an arbitrator selected.
popup.warning.noArbitratorSelected.msg=You need to setup at least one arbitrator to be able to trade.\nDo you want to do this now?
popup.warning.notFullyConnected=You need to wait until you are fully connected to the network.\nThat might take up to about 2 minutes at startup.
popup.warning.removeOffer=Are you sure you want to remove that offer?\nThe offer fee of {0} will be lost if you remove that offer.
popup.warning.tooLargePercentageValue=You cannot set a percentage of 100% or larger.
popup.warning.examplePercentageValue=Please enter a percentage number like \"5.4\" for 5.4%
popup.warning.noPriceFeedAvailable=There is no price feed available for that currency. You cannot use a percent based price.\nPlease select the fixed price.
popup.info.securityDepositInfo=To ensure that both traders follow the trade protocol they need to pay a security deposit.\n\nThe deposit will stay in your local trading wallet until the offer gets accepted by another trader.\nIt will be refunded to you after the trade has successfully completed.\n\nPlease note that you need to keep you application running if you have an open offer.\nWhen another trader wants to take your offer it requires that your application is online and able to react.\nBe sure that you have standby mode deactivated as that would disconnect your client from the network (standby of the monitor is not a problem).
popup.privateNotification.headline=Important private notification!
popup.securityRecommendation.headline=Important security recommendation
popup.securityRecommendation.msg=We would like to remind you to consider using password protection for your wallet if you have not already enabled that.\n\nIt is also highly recommended to write down the wallet seed words. Those seed words are like a master password for recovering your Bitcoin wallet.\nAt the \"Wallet Seed\" section you find more information.\n\nAdditionally you should backup the complete application data folder at the \"Backup\" section.
popup.shutDownInProgress.headline=Shut down in progress
popup.shutDownInProgress.msg=Shutting down application can take a few seconds.\nPlease don't interrupt this process.