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);
if (!defaultCurrency.equals(selectedItem)) {
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(() -> {
paymentAccount.setSingleTradeCurrency(selectedItem);
autoFillNameTextField();

View file

@ -407,7 +407,7 @@ public class CashDepositForm extends PaymentMethodForm {
FiatCurrency defaultCurrency = CurrencyUtil.getCurrencyByCountryCode(countryComboBox.getSelectionModel().getSelectedItem().code);
if (!defaultCurrency.equals(selectedItem)) {
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(() -> {
paymentAccount.setSingleTradeCurrency(selectedItem);
autoFillNameTextField();

View file

@ -29,6 +29,7 @@ import io.bitsquare.gui.util.FormBuilder;
import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.LanguageUtil;
import io.bitsquare.locale.Res;
import javafx.beans.value.ChangeListener;
import javafx.collections.ListChangeListener;
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(),
(errorMessage) -> new Popup().error("Could not remove arbitrator.\nError message: " + errorMessage).show());
} else {
new Popup().information("You need to wait until you are fully connected to the network.\n" +
"That might take up to about 2 minutes at startup.").show();
new Popup().information(Res.get("popup.warning.notFullyConnected")).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(),
(errorMessage) -> new Popup().error("Could not register arbitrator.\nError message: " + errorMessage).show());
} else {
new Popup().information("You need to wait until you are fully connected to the network.\n" +
"That might take up to about 2 minutes at startup.").show();
new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
}
}
}

View file

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

View file

@ -163,7 +163,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
private void onDeleteAccount(PaymentAccount paymentAccount) {
new Popup().warning("Do you really want to delete the selected account?")
.actionButtonText("Yes")
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> {
boolean isPaymentAccountUsed = model.onDeleteAccount(paymentAccount);
if (!isPaymentAccountUsed)
@ -174,7 +174,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
"open offer or in a trade.").show();
}, 100, TimeUnit.MILLISECONDS);
})
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.show();
}
@ -262,7 +262,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
if (paymentMethodForm != null) {
paymentMethodForm.addFormForAddAccount();
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.setOnAction(event -> onSaveNewAccount(paymentMethodForm.getPaymentAccount()));
saveNewAccountButton.disableProperty().bind(paymentMethodForm.allInputsValidProperty().not());
@ -282,7 +282,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
if (paymentMethodForm != null) {
paymentMethodForm.addFormForDisplayAccount();
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;
deleteAccountButton.setOnAction(event -> onDeleteAccount(paymentMethodForm.getPaymentAccount()));
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.windows.WalletPasswordWindow;
import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import io.bitsquare.user.Preferences;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
@ -168,7 +169,7 @@ public class SeedWordsView extends ActivatableView<GridPane, Void> {
initSeedWords(keyChainSeed);
showSeedScreen();
})
.closeButtonText("No")
.closeButtonText(Res.get("shared.no"))
.show();
} else {
initSeedWords(keyChainSeed);
@ -239,8 +240,8 @@ public class SeedWordsView extends ActivatableView<GridPane, Void> {
.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" +
"Do you want to proceed?")
.closeButtonText("No")
.actionButtonText("Yes")
.closeButtonText(Res.get("shared.no"))
.actionButtonText(Res.get("shared.yes"))
.onAction(this::doRestore)
.show();
} 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.overlays.popups.Popup;
import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.locale.Res;
import io.bitsquare.p2p.NodeAddress;
import io.bitsquare.p2p.P2PService;
import javafx.scene.control.Button;
@ -165,7 +166,7 @@ public class CreateCompensationRequestView extends ActivatableView<GridPane, Voi
" Satoshis/byte)\n" +
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" +
"Are you sure you want to send the transaction?")
.actionButtonText("Yes")
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> {
try {
bsqWalletService.commitTx(txWithBtcFee);
@ -194,7 +195,7 @@ public class CreateCompensationRequestView extends ActivatableView<GridPane, Voi
new Popup<>().warning(e.toString());
}
})
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.show();
} catch (InsufficientFundsException | IOException |
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.BsqFormatter;
import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener;
@ -224,7 +225,7 @@ public class VoteView extends ActivatableView<GridPane, Void> {
" Satoshis/byte)\n" +
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" +
"Are you sure you want to send the transaction?")
.actionButtonText("Yes")
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> {
try {
bsqWalletService.commitTx(txWithBtcFee);
@ -253,7 +254,7 @@ public class VoteView extends ActivatableView<GridPane, Void> {
new Popup<>().warning(e.toString());
}
})
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.show();
} catch (InsufficientMoneyException | WalletException | TransactionVerificationException |
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.BsqFormatter;
import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
@ -122,7 +123,7 @@ public class BsqSendView extends ActivatableView<GridPane, Void> {
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" +
/*"The recipient will receive: " + bsqFormatter.formatCoinWithCode(receiverAmount) + "\n\n" +*/
"Are you sure you want to withdraw that amount?")
.actionButtonText("Yes")
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> {
try {
bsqWalletService.commitTx(txWithBtcFee);
@ -149,7 +150,7 @@ public class BsqSendView extends ActivatableView<GridPane, Void> {
new Popup<>().warning(e.toString());
}
})
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.show();
} catch (AddressFormatException | InsufficientFundsException |
TransactionVerificationException | WalletException | InsufficientMoneyException e) {

View file

@ -628,8 +628,7 @@ public class TraderDisputeView extends ActivatableView<VBox, Void> {
if (!text.isEmpty())
onSendMessage(text, selectedDispute);
} else {
new Popup().information("You need to wait until you are fully connected to the network.\n" +
"That might take up to about 2 minutes at startup.").show();
new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
}
});
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());
if (tradeOptional.isPresent()) {
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()));
} else {
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(),
AwesomeIcon.INFO_SIGN);
field.setOnAction(event -> openDetailPopup(item));
field.setTooltip(new Tooltip("Open popup for details"));
field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field);
} else if (item.getAddressEntry().getContext() == AddressEntry.Context.ARBITRATOR) {
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(),
AwesomeIcon.INFO_SIGN);
field.setOnAction(event -> openDetailPopup(item));
field.setTooltip(new Tooltip("Open popup for details"));
field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field);
} else if (item.getAddressEntry().getContext() == AddressEntry.Context.ARBITRATOR) {
setGraphic(new Label("Arbitrator's fee"));

View file

@ -382,7 +382,7 @@ public class TransactionsView extends ActivatableView<VBox, Void> {
if (item.getDetailsAvailable()) {
field = new HyperlinkWithIcon(item.getDetails(), AwesomeIcon.INFO_SIGN);
field.setOnAction(event -> openDetailPopup(item));
field.setTooltip(new Tooltip("Open popup for details"));
field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field);
} else {
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" +
"The recipient will receive: " + formatter.formatCoinWithCode(receiverAmount) + "\n\n" +
"Are you sure you want to withdraw that amount?")
.actionButtonText("Yes")
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> doWithdraw(amount, fee, callback))
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.show();
}
} else {

View file

@ -756,8 +756,8 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
int numPastTrades = model.getNumPastTrades(newItem.getOffer());
boolean hasTraded = numPastTrades > 0;
String tooltipText = hasTraded ?
Res.get("peerInfoIcon.tooltip.traded", hostName, numPastTrades) :
Res.get("peerInfoIcon.tooltip.notTraded", hostName);
Res.get("peerInfoIcon.tooltip.offer.traded", hostName, numPastTrades) :
Res.get("peerInfoIcon.tooltip.offer.notTraded", hostName);
Node peerInfoIcon = new PeerInfoIcon(hostName, tooltipText, numPastTrades, privateNotificationManager, newItem.getOffer());
setPadding(new Insets(-2, 0, -2, 0));
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, "Trading fee transaction ID:", contract.takeOfferFeeTxID);
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)
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.Layout;
import io.bitsquare.gui.util.Transitions;
import io.bitsquare.locale.Res;
import io.bitsquare.trade.Contract;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding;
@ -565,7 +566,7 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
}
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;
closeTicketButton.disableProperty().bind(Bindings.createBooleanBinding(
() -> 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.util.BSFormatter;
import io.bitsquare.gui.util.Transitions;
import io.bitsquare.locale.Res;
import io.bitsquare.trade.offer.OpenOfferManager;
import javafx.geometry.Insets;
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 -> {
hide();
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());
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)
addLabelTxIdTextField(gridPane, ++rowIndex, "Payout transaction ID:", trade.getPayoutTx().getHashAsString());
if (showDisputedTx)

View file

@ -223,7 +223,7 @@ public class WalletPasswordWindow extends Overlay<WalletPasswordWindow> {
showRestoreScreen();
});
Button cancelButton = new Button("Cancel");
Button cancelButton = new Button(Res.get("shared.cancel"));
cancelButton.setOnAction(event -> {
hide();
closeHandlerOptional.ifPresent(Runnable::run);
@ -355,8 +355,8 @@ public class WalletPasswordWindow extends Overlay<WalletPasswordWindow> {
.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" +
"Do you want to proceed?")
.closeButtonText("No")
.actionButtonText("Yes")
.closeButtonText(Res.get("shared.no"))
.actionButtonText(Res.get("shared.yes"))
.onAction(this::doRestore)
.show();
} else {

View file

@ -41,7 +41,7 @@ public class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable>
@FXML
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 Navigation.Listener navigationListener;
private ChangeListener<Tab> tabChangeListener;

View file

@ -212,7 +212,7 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
else if (tradable instanceof OpenOffer)
offerDetailsWindow.show(tradable.getOffer());
});
field.setTooltip(new Tooltip("Open popup for details"));
field.setTooltip(new Tooltip(Res.get("tooltip.openPopupForDetails")));
setGraphic(field);
} else {
setGraphic(null);
@ -306,10 +306,10 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
int numPastTrades = model.getNumPastTrades(newItem.getTradable());
Trade trade = (Trade) newItem.getTradable();
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));
if (identIcon != null)
setGraphic(identIcon);
if (peerInfoIcon != null)
setGraphic(peerInfoIcon);
} else {
setGraphic(null);
}

View file

@ -127,7 +127,7 @@ public class FailedTradesView extends ActivatableViewAndModel<VBox, FailedTrades
if (item != null && !empty) {
field = new HyperlinkWithIcon(model.getTradeId(item), true);
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);
} else {
setGraphic(null);

View file

@ -82,7 +82,7 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
setRemoveColumnCellFactory();
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()));
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()) {
String key = "RemoveOfferWarning";
if (preferences.showAgain(key))
new Popup().warning("Are you sure you want to remove that offer?\n" +
"The offer fee of " + model.formatter.formatCoinWithCode(openOffer.getOffer().getCreateOfferFee()) + " will be lost if you remove that offer.")
.actionButtonText("Remove offer")
new Popup().warning(Res.get("popup.warning.removeOffer", model.formatter.formatCoinWithCode(openOffer.getOffer().getCreateOfferFee())))
.actionButtonText(Res.get("shared.removeOffer"))
.onAction(() -> doRemoveOpenOffer(openOffer))
.closeButtonText("Don't remove the offer")
.closeButtonText(Res.get("shared.dontRemoveOffer"))
.dontShowAgainId(key, preferences)
.show();
else
doRemoveOpenOffer(openOffer);
} else {
new Popup().information("You need to wait until you are fully connected to the network.\n" +
"That might take up to about 2 minutes at startup.").show();
new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
}
}
@ -141,15 +139,15 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
log.debug("Remove offer was successful");
String key = "WithdrawFundsAfterRemoveOfferInfo";
if (preferences.showAgain(key))
new Popup().instruction("You can withdraw the funds you paid in from the \"Fund/Available for withdrawal\" screen.")
.actionButtonText("Go to \"Funds/Available for withdrawal\"")
new Popup().instruction(Res.get("offerbook.withdrawFundsHint", Res.get("navigation.funds.availableForWithdrawal")))
.actionButtonTextWithGoTo("navigation.funds.availableForWithdrawal")
.onAction(() -> navigation.navigateTo(MainView.class, FundsView.class, WithdrawalView.class))
.dontShowAgainId(key, preferences)
.show();
},
(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) {
field = new HyperlinkWithIcon(model.getTradeId(item), true);
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);
} else {
setGraphic(null);
@ -316,7 +314,7 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
{
iconView.setId("image-remove");
button.setText("Remove");
button.setText(Res.get("shared.remove"));
button.setGraphic(iconView);
button.setMinWidth(70);
}

View file

@ -20,6 +20,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades;
import io.bitsquare.app.Log;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeWizardItem;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.buyer.*;
import io.bitsquare.locale.Res;
import org.fxmisc.easybind.EasyBind;
public class BuyerSubView extends TradeSubView {
@ -47,11 +48,11 @@ public class BuyerSubView extends TradeSubView {
@Override
protected void addWizards() {
step1 = new TradeWizardItem(BuyerStep1View.class, "Wait for blockchain confirmation");
step2 = new TradeWizardItem(BuyerStep2View.class, "Start payment");
step3 = new TradeWizardItem(BuyerStep3View.class, "Wait until payment arrived");
step4 = new TradeWizardItem(BuyerStep4View.class, "Wait for payout unlock");
step5 = new TradeWizardItem(BuyerStep5View.class, "Completed");
step1 = new TradeWizardItem(BuyerStep1View.class, Res.get("portfolio.pending.step1.waitForConf"));
step2 = new TradeWizardItem(BuyerStep2View.class, Res.get("portfolio.pending.step2_buyer.startPayment"));
step3 = new TradeWizardItem(BuyerStep3View.class, Res.get("portfolio.pending.step3_buyer.waitPaymentArrived"));
step4 = new TradeWizardItem(BuyerStep4View.class, Res.get("portfolio.pending.step4.waitPaymentUnlocked"));
step5 = new TradeWizardItem(BuyerStep5View.class, Res.get("portfolio.pending.step5.completed"));
if (model.getLockTime() > 0) {
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.windows.SelectDepositTxWindow;
import io.bitsquare.gui.main.overlays.windows.WalletPasswordWindow;
import io.bitsquare.locale.Res;
import io.bitsquare.p2p.P2PService;
import io.bitsquare.payment.PaymentAccountContractData;
import io.bitsquare.trade.BuyerTrade;
@ -174,7 +175,7 @@ public class PendingTradesDataModel extends ActivatableDataModel {
faultHandler.handleFault(errorMessage, throwable);
});
} 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)
new SelectDepositTxWindow().transactions(candidates)
.onSelect(transaction -> doOpenDispute(isSupportTicket, transaction))
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.show();
else
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()) {
sendOpenNewDisputeMessage(dispute, false);
} else {
new Popup().information("You need to wait until you are fully connected to the network.\n" +
"That might take up to about 2 minutes at startup.").show();
new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
}
} else {
log.warn("trade is null at doOpenDispute");
@ -414,13 +414,11 @@ public class PendingTradesDataModel extends ActivatableDataModel {
() -> navigation.navigateTo(MainView.class, DisputesView.class),
(errorMessage, throwable) -> {
if ((throwable instanceof DisputeAlreadyOpenException)) {
errorMessage += "\n\n" +
"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.";
errorMessage += "\n\n" + Res.get("portfolio.pending.openAgainDispute.msg");
new Popup().warning(errorMessage)
.actionButtonText("Open dispute again")
.actionButtonText(Res.get("portfolio.pending.openAgainDispute.button"))
.onAction(() -> sendOpenNewDisputeMessage(dispute, true))
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.show();
} else {
new Popup().warning(errorMessage).show();

View file

@ -91,7 +91,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
tradeIdColumn.setText(Res.get("shared.tradeId"));
paymentMethodColumn.setText(Res.get("shared.paymentMethod"));
avatarColumn.setText(Res.get(""));
setTradeIdColumnCellFactory();
setDateColumnCellFactory();
setAmountColumnCellFactory();
@ -103,7 +103,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
setAvatarColumnCellFactory();
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);
tradeIdColumn.setComparator((o1, o2) -> o1.getTrade().getId().compareTo(o2.getTrade().getId()));
@ -139,15 +139,12 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
keyEventEventHandler = 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.headLine("Open support ticket")
.message("Please use that only in emergency case if you don't get displayed a \"Open support\" or \"Open dispute\" button.\n\n" +
"When you open a support ticket the trade will be interrupted and handled by the arbitrator\n\n" +
"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")
popup.headLine(Res.get("portfolio.pending.openSupportTicket.headline"))
.message(Res.get("portfolio.pending.openSupportTicket.msg"))
.actionButtonText(Res.get("portfolio.pending.openSupportTicket.headline"))
.onAction(model.dataModel::onOpenSupportTicket)
.closeButtonText("Cancel")
.onClose(() -> popup.hide())
.closeButtonText(Res.get("shared.cancel"))
.onClose(popup::hide)
.show();
}
};
@ -278,7 +275,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
if (item != null && !empty) {
field = new HyperlinkWithIcon(item.getTrade().getShortId(), true);
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);
} else {
setGraphic(null);
@ -468,12 +465,13 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
String hostName = newItem.getTrade().getTradingPeerNodeAddress().hostName;
int numPastTrades = model.getNumPastTrades(newItem.getTrade());
boolean hasTraded = numPastTrades > 0;
String tooltipText = hasTraded ? "Trading peers onion address: " + hostName + "\n" +
"You have already traded " + numPastTrades + " times with that peer." : "Trading peers onion address: " + hostName;
Node identIcon = new PeerInfoIcon(hostName, tooltipText, numPastTrades, privateNotificationManager, newItem.getTrade().getOffer());
String tooltipText = hasTraded ?
Res.get("peerInfoIcon.tooltip.trade.traded", hostName, numPastTrades) :
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));
if (identIcon != null)
setGraphic(identIcon);
setGraphic(peerInfoIcon);
} else {
setGraphic(null);
}

View file

@ -20,6 +20,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades;
import io.bitsquare.app.Log;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.TradeWizardItem;
import io.bitsquare.gui.main.portfolio.pendingtrades.steps.seller.*;
import io.bitsquare.locale.Res;
import org.fxmisc.easybind.EasyBind;
public class SellerSubView extends TradeSubView {
@ -46,11 +47,12 @@ public class SellerSubView extends TradeSubView {
@Override
protected void addWizards() {
step1 = new TradeWizardItem(SellerStep1View.class, "Wait for blockchain confirmation");
step2 = new TradeWizardItem(SellerStep2View.class, "Wait until payment has started");
step3 = new TradeWizardItem(SellerStep3View.class, "Confirm payment received");
step4 = new TradeWizardItem(SellerStep4View.class, "Wait for payout unlock");
step5 = new TradeWizardItem(SellerStep5View.class, "Completed");
step1 = new TradeWizardItem(SellerStep1View.class, Res.get("portfolio.pending.step1.waitForConf"));
step2 = new TradeWizardItem(SellerStep2View.class, Res.get("portfolio.pending.step2_seller.waitPaymentStarted"));
step3 = new TradeWizardItem(SellerStep3View.class, Res.get("portfolio.pending.step3_seller.confirmPaymentReceived"));
step4 = new TradeWizardItem(SellerStep4View.class, Res.get("portfolio.pending.step4.waitPaymentUnlocked"));
step5 = new TradeWizardItem(SellerStep5View.class, Res.get("portfolio.pending.step5.completed"));
if (model.getLockTime() > 0) {
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.TradeWizardItem;
import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
@ -86,13 +87,13 @@ public abstract class TradeSubView extends HBox {
leftVBox.getChildren().add(leftGridPane);
leftGridPaneRowIndex = 0;
tradeProcessTitledGroupBg = addTitledGroupBg(leftGridPane, leftGridPaneRowIndex, 1, "Trade process");
tradeProcessTitledGroupBg = addTitledGroupBg(leftGridPane, leftGridPaneRowIndex, 1, Res.get("portfolio.pending.tradeProcess"));
addWizards();
TitledGroupBg noticeTitledGroupBg = addTitledGroupBg(leftGridPane, leftGridPaneRowIndex, 1, "", Layout.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);
openDisputeButton.setId("open-dispute-button");

View file

@ -166,8 +166,8 @@ public abstract class TradeStepView extends AnchorPane {
}
protected void addTradeInfoBlock() {
tradeInfoTitledGroupBg = addTitledGroupBg(gridPane, gridRow, 4, "Trade information");
txIdTextField = addLabelTxIdTextField(gridPane, gridRow, "Deposit transaction ID:", Layout.FIRST_ROW_DISTANCE).second;
tradeInfoTitledGroupBg = addTitledGroupBg(gridPane, gridRow, 4, Res.get("portfolio.pending.tradeInformation"));
txIdTextField = addLabelTxIdTextField(gridPane, gridRow, Res.getWithCol("shared.depositTransactionId"), Layout.FIRST_ROW_DISTANCE).second;
String id = model.dataModel.txId.get();
if (!id.isEmpty())
txIdTextField.setup(id);
@ -177,7 +177,7 @@ public abstract class TradeStepView extends AnchorPane {
PaymentMethodForm.addAllowedPeriod(gridPane, ++gridRow, model.dataModel.getSellersPaymentAccountContractData(),
model.getDateForOpenDispute());
timeLeftTextField = addLabelTextField(gridPane, ++gridRow, "Remaining time:").second;
timeLeftTextField = addLabelTextField(gridPane, ++gridRow, Res.getWithCol("portfolio.pending.remainingTime")).second;
timeLeftProgressBar = new ProgressBar(0);
timeLeftProgressBar.setOpacity(0.7);
@ -258,31 +258,31 @@ public abstract class TradeStepView extends AnchorPane {
protected void setInformationHeadline() {
if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Notification");
notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.notification"));
}
}
protected void setOpenDisputeHeadline() {
if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Open a dispute");
notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.openDispute"));
}
}
protected void setDisputeOpenedHeadline() {
if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Dispute opened");
notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.disputeOpened"));
}
}
protected void setRequestSupportHeadline() {
if (notificationGroup != null) {
notificationGroup.titledGroupBg.setText("Open support ticket");
notificationGroup.titledGroupBg.setText(Res.get("portfolio.pending.openSupport"));
}
}
protected void setSupportOpenedHeadline() {
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() {
if (notificationGroup != null) {
notificationGroup.button.setText("Request support");
notificationGroup.button.setText(Res.get("portfolio.pending.requestSupport"));
notificationGroup.button.setId("open-support-button");
notificationGroup.button.setOnAction(e -> model.dataModel.onOpenSupportTicket());
}
new Popup().warning(trade.errorMessageProperty().getValue()
+ "\n\nPlease report the problem to your arbitrator.\n\n" +
"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.")
+ "\n\n" + Res.get("portfolio.pending.error.requestSupport"))
.show();
}
@ -373,12 +370,10 @@ public abstract class TradeStepView extends AnchorPane {
String msg;
if (dispute.isSupportTicket()) {
setSupportOpenedHeadline();
msg = "You opened already a support ticket.\n" +
"Please communicate in the \"Support\" screen with the arbitrator.";
msg = Res.get("portfolio.pending.supportTicketOpenedMyUser", Res.get("portfolio.pending.communicateWithArbitrator"));
} else {
setDisputeOpenedHeadline();
msg = "You opened already a dispute.\n" +
"Please communicate in the \"Support\" screen with the arbitrator.";
msg = Res.get("portfolio.pending.disputeOpenedMyUser", Res.get("portfolio.pending.communicateWithArbitrator"));
}
if (notificationGroup != null)
notificationGroup.label.setText(msg);
@ -392,12 +387,10 @@ public abstract class TradeStepView extends AnchorPane {
String msg;
if (dispute.isSupportTicket()) {
setSupportOpenedHeadline();
msg = "Your trading peer opened a support ticket due technical problems.\n" +
"Please communicate in the \"Support\" screen with the arbitrator.";
msg = Res.get("portfolio.pending.supportTicketOpenedByPeer", Res.get("portfolio.pending.communicateWithArbitrator"));
} else {
setDisputeOpenedHeadline();
msg = "Your trading peer opened a dispute.\n" +
"Please communicate in the \"Support\" screen with the arbitrator.";
msg = Res.get("portfolio.pending.disputeOpenedByPeer", Res.get("portfolio.pending.communicateWithArbitrator"));
}
if (notificationGroup != null)
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.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class BuyerStep1View extends TradeStepView {
@ -37,13 +38,12 @@ public class BuyerStep1View extends TradeStepView {
@Override
protected String getInfoBlockTitle() {
return "Wait for blockchain confirmation";
return Res.get("portfolio.pending.step1.waitForConf");
}
@Override
protected String getInfoText() {
return "Deposit transaction has been published.\n" +
"You need to wait for at least one blockchain confirmation.";
return Res.get("portfolio.pending.step1.info", Res.get("shared.You"));
}
///////////////////////////////////////////////////////////////////////////////////////////
@ -53,8 +53,7 @@ public class BuyerStep1View extends TradeStepView {
@Override
protected String getWarningText() {
setWarningHeadline();
return "The deposit transaction still did not get confirmed.\n" +
"That might happen in rare cases when the funding fee of one trader from the external wallet was too low.";
return Res.get("portfolio.pending.step1.warn");
}
@ -64,10 +63,7 @@ public class BuyerStep1View extends TradeStepView {
@Override
protected String getOpenForDisputeText() {
return "The deposit transaction still did not get confirmed.\n" +
"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.";
return Res.get("portfolio.pending.step1.openForDispute");
}
}

View file

@ -17,6 +17,7 @@
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.common.util.Tuple3;
import io.bitsquare.gui.components.BusyAnimation;
@ -62,66 +63,62 @@ public class BuyerStep2View extends TradeStepView {
if (tradeStatePropertySubscription == null) {
tradeStatePropertySubscription = EasyBind.subscribe(trade.stateProperty(), state -> {
if (state == Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN) {
PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData();
String key = "startPayment" + trade.getId();
String message = "";
if (paymentAccountContractData instanceof CryptoCurrencyAccountContractData)
message = "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" +
"Please transfer from your external " +
CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()) + " wallet\n" +
model.formatter.formatVolumeWithCode(trade.getTradeVolume()) + " to the BTC seller.\n\n" +
"Here are the trading account details of the bitcoin seller:\n" +
"" + paymentAccountContractData.getPaymentDetailsForTradePopup() + ".\n\n" +
"(You can copy & paste the values from the main screen after closing that popup.)";
else if (paymentAccountContractData != null)
if (paymentAccountContractData instanceof CashDepositAccountContractData)
message = "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" +
"Please go to a bank and pay " +
model.formatter.formatVolumeWithCode(trade.getTradeVolume()) + " to the BTC seller.\n\n" +
"Here are the trading account details of the BTC seller:\n" +
"" + paymentAccountContractData.getPaymentDetailsForTradePopup() + ".\n" +
"(You can copy & paste the values from the main screen after closing that popup.)\n\n" +
"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)
message = "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" +
"Please send " +
model.formatter.formatVolumeWithCode(trade.getTradeVolume()) + " by \"US Postal Money Order\" to the BTC seller.\n\n" +
"Here are the trading account details of the BTC seller:\n" +
"" + paymentAccountContractData.getPaymentDetailsForTradePopup() + ".\n" +
"(You can copy & paste the values from the main screen after closing that popup.)\n\n" +
"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
message = "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" +
"Please go to your online banking web page and pay " +
model.formatter.formatVolumeWithCode(trade.getTradeVolume()) + " to the BTC seller.\n\n" +
"Here are the trading account details of the BTC seller:\n" +
"" + paymentAccountContractData.getPaymentDetailsForTradePopup() + ".\n" +
"(You can copy & paste the values from the main screen after closing that popup.)\n\n" +
"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.";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
preferences.dontShowAgain(key, true);
new Popup().headLine("Attention required for trade with ID " + trade.getShortId())
.attention(message)
.show();
PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData();
if (paymentAccountContractData != null) {
String paymentDetailsForTradePopup = paymentAccountContractData.getPaymentDetailsForTradePopup();
String key = "startPayment" + trade.getId();
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)
message += Res.get("portfolio.pending.step2_buyer.altcoin",
CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()),
amount) +
accountDetails +
paymentDetailsForTradePopup + ".\n\n" +
copyPaste;
else if (paymentAccountContractData instanceof CashDepositAccountContractData)
message += Res.get("portfolio.pending.step2_buyer.cash",
amount) +
accountDetails +
paymentDetailsForTradePopup + ".\n" +
copyPaste + "\n\n" +
tradeId + id +
assign +
refTextWarn + "\n\n" +
fees + "\n\n" +
Res.get("portfolio.pending.step2_buyer.cash.extra");
else if (paymentAccountContractData instanceof USPostalMoneyOrderAccountContractData)
message += Res.get("portfolio.pending.step2_buyer.postal", amount) +
accountDetails +
paymentDetailsForTradePopup + ".\n" +
copyPaste + "\n\n" +
tradeId + id +
assign +
refTextWarn;
else
message += Res.get("portfolio.pending.step2_buyer.bank", amount) +
accountDetails +
paymentDetailsForTradePopup + ".\n" +
copyPaste + "\n\n" +
tradeId + id +
assign +
refTextWarn + "\n\n" +
fees;
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
preferences.dontShowAgain(key, true);
new Popup().headLine(Res.get("popup.attention.forTradeWithId", id))
.attention(message)
.show();
}
}
} else if (state == Trade.State.BUYER_CONFIRMED_FIAT_PAYMENT_INITIATED && confirmButton.isDisabled()) {
showStatusInfo();
@ -155,9 +152,9 @@ public class BuyerStep2View extends TradeStepView {
PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData();
String paymentMethodName = paymentAccountContractData != null ? paymentAccountContractData.getPaymentMethodName() : "";
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);
TextFieldWithCopyIcon field = addLabelTextFieldWithCopyIcon(gridPane, gridRow, "Amount to transfer:",
TextFieldWithCopyIcon field = addLabelTextFieldWithCopyIcon(gridPane, gridRow, Res.get("portfolio.pending.step2_buyer.amountToTransfer"),
model.getFiatVolume(),
Layout.FIRST_ROW_AND_GROUP_DISTANCE).second;
field.setCopyWithoutCurrencyPostFix(true);
@ -206,7 +203,7 @@ public class BuyerStep2View extends TradeStepView {
gridRow = CashDepositForm.addFormForBuyer(gridPane, gridRow, paymentAccountContractData);
break;
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);
break;
default:
@ -214,11 +211,11 @@ public class BuyerStep2View extends TradeStepView {
}
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);
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.setOnAction(e -> onPaymentStarted());
busyAnimation = tuple3.second;
@ -235,10 +232,7 @@ public class BuyerStep2View extends TradeStepView {
@Override
protected String getWarningText() {
setWarningHeadline();
return "You still have not done your " + model.dataModel.getCurrencyCode() + " payment!\n" +
"Please note that the trade has to be completed until " +
model.getDateForOpenDispute() +
" otherwise the trade will be investigated by the arbitrator.";
return Res.get("portfolio.pending.step2_buyer.warn", model.dataModel.getCurrencyCode(), model.getDateForOpenDispute());
}
@ -248,9 +242,7 @@ public class BuyerStep2View extends TradeStepView {
@Override
protected String getOpenForDisputeText() {
return "You have not completed your payment!\n" +
"The max. period for the trade has elapsed.\n" +
"\nPlease contact the arbitrator for opening a dispute.";
return Res.get("portfolio.pending.step2_buyer.openForDispute");
}
@Override
@ -269,13 +261,10 @@ public class BuyerStep2View extends TradeStepView {
String key = "confirmPaperReceiptSent";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
Popup popup = new Popup();
popup.headLine("Did you sent the paper receipt to the BTC seller?")
.feedback("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.")
.actionButtonText("Yes, I have sent the paper receipt")
popup.headLine(Res.get("portfolio.pending.step2_buyer.paperReceipt.headline"))
.feedback(Res.get("portfolio.pending.step2_buyer.paperReceipt.msg"))
.onAction(this::showConfirmPaymentStartedPopup)
.closeButtonText("No")
.closeButtonText(Res.get("shared.no"))
.onClose(popup::hide)
.dontShowAgainId(key, preferences)
.show();
@ -286,8 +275,7 @@ public class BuyerStep2View extends TradeStepView {
showConfirmPaymentStartedPopup();
}
} else {
new Popup().information("You need to wait until you are fully connected to the network.\n" +
"That might take up to about 2 minutes at startup.").show();
new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
}
}
@ -295,13 +283,12 @@ public class BuyerStep2View extends TradeStepView {
String key = "confirmPaymentStarted";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
Popup popup = new Popup();
popup.headLine("Confirm that you have started the payment")
.confirmation("Did you initiate the " + CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode()) +
" payment to your trading partner?")
popup.headLine(Res.get("portfolio.pending.step2_buyer.confirmStart.headline"))
.confirmation(Res.get("portfolio.pending.step2_buyer.confirmStart.msg", CurrencyUtil.getNameByCode(trade.getOffer().getCurrencyCode())))
.width(700)
.actionButtonText("Yes, I have started the payment")
.actionButtonText(RegularEscapeUtil.basicEscape("portfolio.pending.step2_buyer.confirmStart.yes"))
.onAction(this::confirmPaymentStarted)
.closeButtonText("No")
.closeButtonText(Res.get("shared.no"))
.onClose(popup::hide)
.dontShowAgainId(key, preferences)
.show();
@ -322,14 +309,13 @@ public class BuyerStep2View extends TradeStepView {
}, errorMessage -> {
confirmButton.setDisable(false);
hideStatusInfo();
new Popup().warning("Sending message to your trading partner failed.\n" +
"Please try again and if it continue to fail report a bug.").show();
new Popup().warning(Res.get("popup.warning.sendMsgFailed")).show();
});
}
private void showStatusInfo() {
busyAnimation.play();
statusLabel.setText("Sending confirmation...");
statusLabel.setText(Res.get("shared.sendingConfirmation"));
}
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.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class BuyerStep3View extends TradeStepView {
@ -37,13 +38,12 @@ public class BuyerStep3View extends TradeStepView {
@Override
protected String getInfoBlockTitle() {
return "Wait for BTC seller's payment confirmation";
return Res.get("portfolio.pending.step3_buyer.wait.headline");
}
@Override
protected String getInfoText() {
return "Waiting for the BTC seller's confirmation " +
"for the receipt of the " + model.dataModel.getCurrencyCode() + " payment.";
return Res.get("portfolio.pending.step3_buyer.wait.info", model.dataModel.getCurrencyCode());
}
@ -55,13 +55,9 @@ public class BuyerStep3View extends TradeStepView {
protected String getWarningText() {
setInformationHeadline();
String substitute = model.isBlockChainMethod() ?
"on the " + model.dataModel.getCurrencyCode() + "blockchain" :
"at your payment provider (e.g. bank)";
return "The BTC seller still has not confirmed your payment!\n" +
"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.";
Res.get("portfolio.pending.step3_buyer.warn.part1a", model.dataModel.getCurrencyCode()) :
Res.get("portfolio.pending.step3_buyer.warn.part1b");
return Res.get("portfolio.pending.step3_buyer.warn.part2", substitute, model.getDateForOpenDispute());
}
@ -71,9 +67,7 @@ public class BuyerStep3View extends TradeStepView {
@Override
protected String getOpenForDisputeText() {
return "The BTC seller has not confirmed your payment!\n" +
"The max. period for the trade has elapsed.\n" +
"Please contact the arbitrator for opening a dispute.";
return Res.get("portfolio.pending.step3_buyer.openForDispute");
}
@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.steps.TradeStepView;
import io.bitsquare.locale.Res;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import org.bitcoinj.core.*;
@ -94,8 +95,8 @@ public class BuyerStep4View extends TradeStepView {
protected void addContent() {
addTradeInfoBlock();
if (model.getLockTime() > 0) {
blockTextField = addLabelTextField(gridPane, gridRow, "Block(s) to wait until lock time elapsed:", "").second;
timeTextField = addLabelTextField(gridPane, ++gridRow, "Approx. date when payout gets unlocked:").second;
blockTextField = addLabelTextField(gridPane, gridRow, Res.get("portfolio.pending.step4_buyer.blocks"), "").second;
timeTextField = addLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step4_buyer.date")).second;
GridPane.setRowSpan(tradeInfoTitledGroupBg, 5);
} else {
GridPane.setRowSpan(tradeInfoTitledGroupBg, 3); //TODO should never reach
@ -112,20 +113,17 @@ public class BuyerStep4View extends TradeStepView {
@Override
protected String getInfoBlockTitle() {
if (model.getLockTime() > 0)
return "Wait until payout lock time is over";
return Res.get("portfolio.pending.step4_buyer.wait");
else
return "Sending payout transaction to peer";
return Res.get("portfolio.pending.step4_buyer.send");
}
@Override
protected String getInfoText() {
if (model.getLockTime() > 0)
return "The payout transaction is signed and finalized by both parties.\n" +
"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.";
return Res.get("portfolio.pending.step4_buyer.info");
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
protected String getWarningText() {
setInformationHeadline();
return "The payout transaction is still blocked by the lock time!\n" +
"If the trade has not been completed on " +
model.getDateForOpenDispute() +
" the arbitrator will investigate.";
return Res.get("portfolio.pending.step4_buyer.warn", model.getDateForOpenDispute());
}
///////////////////////////////////////////////////////////////////////////////////////////

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.util.BSFormatter;
import io.bitsquare.gui.util.Layout;
import io.bitsquare.locale.Res;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
@ -115,28 +116,25 @@ public class BuyerStep5View extends TradeStepView {
@Override
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);
btcTradeAmountLabel = btcTradeAmountPair.first;
Tuple2<Label, TextField> fiatTradeAmountPair = addLabelTextField(gridPane, ++gridRow, getFiatTradeAmountLabel(), model.getFiatVolume());
fiatTradeAmountLabel = fiatTradeAmountPair.first;
addLabelTextField(gridPane, ++gridRow, "Total fees paid:", model.getTotalFees());
addLabelTextField(gridPane, ++gridRow, "Refunded security deposit:", model.getSecurityDeposit());
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;
addLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.totalPaid"), 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, 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;
HBox hBox = new HBox();
hBox.setSpacing(10);
useSavingsWalletButton = new Button("Move funds to Bitsquare wallet");
useSavingsWalletButton = new Button(Res.get("portfolio.pending.step5_buyer.moveToBitsquareWallet"));
useSavingsWalletButton.setDefaultButton(false);
Label label = new Label("OR");
Label label = new Label(Res.get("shared.OR"));
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);
hBox.getChildren().addAll(useSavingsWalletButton, label, withdrawToExternalWalletButton);
GridPane.setRowIndex(hBox, ++gridRow);
@ -158,8 +156,8 @@ public class BuyerStep5View extends TradeStepView {
String key = "tradeCompleted" + trade.getId();
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
preferences.dontShowAgain(key, true);
new Notification().headLine("Trade completed")
.notification("You can withdraw your funds now to your external Bitcoin wallet or transfer it to the Bitsquare wallet.")
new Notification().headLine(Res.get("notification.tradeCompleted.headline"))
.notification(Res.get("notification.tradeCompleted.msg"))
.autoClose()
.show();
}
@ -182,7 +180,7 @@ public class BuyerStep5View extends TradeStepView {
Coin fee = feeEstimationTransaction.getFee();
Coin receiverAmount = amount.subtract(fee);
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);
} else {
if (toAddresses.isEmpty()) {
@ -195,17 +193,21 @@ public class BuyerStep5View extends TradeStepView {
String key = "reviewWithdrawalAtTradeComplete";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
int txSize = feeEstimationTransaction.bitcoinSerialize().length;
new Popup().headLine("Confirm withdrawal request")
.confirmation("Sending: " + formatter.formatCoinWithCode(amount) + "\n" +
"From address: " + fromAddresses + "\n" +
"To receiving address: " + toAddresses + ".\n" +
"Required transaction fee is: " + formatter.formatCoinWithCode(fee) + " (" + MathUtils.roundDouble(((double) fee.value / (double) txSize), 2) + " Satoshis/byte)\n" +
"Transaction size: " + (txSize / 1000d) + " Kb\n\n" +
"The recipient will receive: " + formatter.formatCoinWithCode(receiverAmount) + "\n\n" +
"Are you sure you want to withdraw that amount?")
.actionButtonText("Yes")
double feePerByte = MathUtils.roundDouble(((double) fee.value / (double) txSize), 2);
double kb = txSize / 1000d;
String recAmount = formatter.formatCoinWithCode(receiverAmount);
new Popup().headLine(Res.get("portfolio.pending.step5_buyer.confirmWithdrawal"))
.confirmation(Res.get("portfolio.pending.step5_buyer.sendInfo",
formatter.formatCoinWithCode(amount),
fromAddresses,
toAddresses,
formatter.formatCoinWithCode(fee),
feePerByte,
kb,
recAmount))
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> doWithdrawal(amount, fee))
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.onClose(() -> {
useSavingsWalletButton.setDisable(false);
withdrawToExternalWalletButton.setDisable(false);
@ -218,9 +220,7 @@ public class BuyerStep5View extends TradeStepView {
}
} else {
new Popup()
.warning("The amount to transfer is lower than the transaction fee and the min. possible tx value (dust).")
.show();
new Popup().warning(Res.get("portfolio.pending.step5_buyer.amountTooLow")).show();
}
}
} catch (AddressFormatException e) {
@ -267,10 +267,9 @@ public class BuyerStep5View extends TradeStepView {
private void handleTradeCompleted() {
if (!DevFlags.DEV_MODE) {
String key = "tradeCompleteWithdrawCompletedInfo";
new Popup().headLine("Withdrawal completed")
.feedback("Your completed trades are stored under \"Portfolio/History\".\n" +
"You can review all your bitcoin transactions under \"Funds/Transactions\"")
.actionButtonText("Go to \"Transactions\"")
new Popup().headLine(Res.get("portfolio.pending.step5_buyer.withdrawalCompleted.headline"))
.feedback(Res.get("portfolio.pending.step5_buyer.withdrawalCompleted.msg"))
.actionButtonTextWithGoTo("navigation.funds.transactions")
.onAction(() -> model.dataModel.navigation.navigateTo(MainView.class, FundsView.class, TransactionsView.class))
.dontShowAgainId(key, preferences)
.show();
@ -286,10 +285,10 @@ public class BuyerStep5View extends TradeStepView {
}
protected String getBtcTradeAmountLabel() {
return "You have bought:";
return Res.get("portfolio.pending.step5_buyer.bought");
}
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.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class SellerStep1View extends TradeStepView {
@ -37,14 +38,12 @@ public class SellerStep1View extends TradeStepView {
@Override
protected String getInfoBlockTitle() {
return "Wait for blockchain confirmation";
return Res.get("portfolio.pending.step1.waitForConf");
}
@Override
protected String getInfoText() {
return "Deposit transaction has been published.\n" +
"The BTC buyer needs to wait for at least one blockchain confirmation before " +
"starting the payment.";
return Res.get("portfolio.pending.step1.info", Res.get("shared.TheBTCBuyer"));
}
///////////////////////////////////////////////////////////////////////////////////////////
@ -54,8 +53,7 @@ public class SellerStep1View extends TradeStepView {
@Override
protected String getWarningText() {
setWarningHeadline();
return "The deposit transaction still did not get confirmed.\n" +
"That might happen in rare cases when the funding fee of one trader from the external wallet was too low.";
return Res.get("portfolio.pending.step1.warn");
}
@ -65,10 +63,7 @@ public class SellerStep1View extends TradeStepView {
@Override
protected String getOpenForDisputeText() {
return "The deposit transaction still did not get confirmed.\n" +
"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.";
return Res.get("portfolio.pending.step1.openForDispute");
}
}

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.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class SellerStep2View extends TradeStepView {
@ -37,13 +38,12 @@ public class SellerStep2View extends TradeStepView {
@Override
protected String getInfoBlockTitle() {
return "Wait for payment";
return Res.get("portfolio.pending.step2_seller.waitPayment.headline");
}
@Override
protected String getInfoText() {
return "The deposit transaction has at least one blockchain confirmation.\n" +
"You need to wait until the BTC buyer starts the " + model.dataModel.getCurrencyCode() + " payment.";
return Res.get("portfolio.pending.step2_seller.waitPayment.msg", model.dataModel.getCurrencyCode());
}
@ -54,11 +54,9 @@ public class SellerStep2View extends TradeStepView {
@Override
protected String getWarningText() {
setInformationHeadline();
return "The BTC buyer still has not done the " + model.dataModel.getCurrencyCode() + " payment.\n" +
"You need to wait until he starts the payment.\n" +
"If the trade has not been completed on " +
model.getDateForOpenDispute() +
" the arbitrator will investigate.";
return Res.get("portfolio.pending.step2_seller.warn",
model.dataModel.getCurrencyCode(),
model.getDateForOpenDispute());
}
///////////////////////////////////////////////////////////////////////////////////////////
@ -67,9 +65,7 @@ public class SellerStep2View extends TradeStepView {
@Override
protected String getOpenForDisputeText() {
return "The BTC buyer has not started his payment!\n" +
"The max. allowed period for the trade has elapsed.\n" +
"Please contact the arbitrator for opening a dispute.";
return Res.get("portfolio.pending.step2_seller.openForDispute");
}
@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.util.Layout;
import io.bitsquare.locale.CurrencyUtil;
import io.bitsquare.locale.Res;
import io.bitsquare.payment.*;
import io.bitsquare.trade.Contract;
import io.bitsquare.trade.Trade;
@ -69,49 +70,29 @@ public class SellerStep3View extends TradeStepView {
String message;
String tradeVolumeWithCode = model.formatter.formatVolumeWithCode(trade.getTradeVolume());
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) {
String address = ((CryptoCurrencyAccountContractData) paymentAccountContractData).getAddress();
message = "Your trading partner has confirmed that he initiated the " + currencyName + " payment.\n\n" +
"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.";
message = Res.get("portfolio.pending.step3_seller.altcoin", part1, currencyName, address, tradeVolumeWithCode, currencyName);
} else {
if (paymentAccountContractData instanceof USPostalMoneyOrderAccountContractData)
message = "Your trading partner has confirmed that he initiated the " + currencyName + " payment.\n\n" +
"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() + "\"";
message = Res.get("portfolio.pending.step3_seller.postal", part1, tradeVolumeWithCode, id);
else
message = "Your trading partner has confirmed that he initiated the " + currencyName + " payment.\n\n" +
"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() + "\"";
message = Res.get("portfolio.pending.step3_seller.bank", currencyName, tradeVolumeWithCode, id);
String part = Res.get("portfolio.pending.step3_seller.openDispute");
if (paymentAccountContractData instanceof CashDepositAccountContractData)
message += "\n\nBecause the payment is done via Cash/ATM 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\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\".";
message = message + Res.get("portfolio.pending.step3_seller.cash", part);
Optional<String> optionalHolderName = getOptionalHolderName();
if (optionalHolderName.isPresent()) {
message = message + "\n\n" +
"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\".";
message = message + Res.get("portfolio.pending.step3_seller.bankCheck" + optionalHolderName.get(), part);
}
}
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
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)
.show();
}
@ -145,9 +126,9 @@ public class SellerStep3View extends TradeStepView {
protected void addContent() {
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;
field.setCopyWithoutCurrencyPostFix(true);
@ -164,14 +145,14 @@ public class SellerStep3View extends TradeStepView {
if (myPaymentAccountContractData instanceof CryptoCurrencyAccountContractData) {
myPaymentDetails = ((CryptoCurrencyAccountContractData) myPaymentAccountContractData).getAddress();
peersPaymentDetails = ((CryptoCurrencyAccountContractData) peersPaymentAccountContractData).getAddress();
myTitle = "Your " + nameByCode + " address:";
peersTitle = "Buyers " + nameByCode + " address:";
myTitle = Res.get("portfolio.pending.step3_seller.yourAddress");
peersTitle = Res.get("portfolio.pending.step3_seller.buyersAddress", nameByCode);
isBlockChain = true;
} else {
myPaymentDetails = myPaymentAccountContractData.getPaymentDetails();
peersPaymentDetails = peersPaymentAccountContractData.getPaymentDetails();
myTitle = "Your trading account:";
peersTitle = "Buyers trading account:";
myTitle = Res.get("portfolio.pending.step3_seller.yourAccount");
peersTitle = Res.get("portfolio.pending.step3_seller.buyersAccount");
}
}
@ -184,11 +165,11 @@ public class SellerStep3View extends TradeStepView {
peersPaymentDetailsTextField.setTooltip(new Tooltip(peersPaymentDetails));
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);
}
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.setOnAction(e -> onPaymentReceived());
busyAnimation = tuple.second;
@ -205,14 +186,11 @@ public class SellerStep3View extends TradeStepView {
@Override
protected String getInfoText() {
String currencyCode = model.dataModel.getCurrencyCode();
if (model.isBlockChainMethod()) {
return "The BTC buyer has started the " + model.dataModel.getCurrencyCode() + " payment.\n" +
"Check for blockchain confirmations at your altcoin wallet or block explorer and " +
"confirm the payment when you have sufficient blockchain confirmations.";
return Res.get("portfolio.pending.step3_seller.buyerStartedPayment", Res.get("portfolio.pending.step3_seller.buyerStartedPayment.altcoin", currencyCode));
} else {
return "The BTC buyer has started the " + model.dataModel.getCurrencyCode() + " payment.\n" +
"Check at your trading account (e.g. bank account) and confirm when you have " +
"received the payment.";
return Res.get("portfolio.pending.step3_seller.buyerStartedPayment", Res.get("portfolio.pending.step3_seller.buyerStartedPayment.fiat", currencyCode));
}
}
@ -225,13 +203,11 @@ public class SellerStep3View extends TradeStepView {
protected String getWarningText() {
setWarningHeadline();
String substitute = model.isBlockChainMethod() ?
"on the " + model.dataModel.getCurrencyCode() + "blockchain" :
"at your payment provider (e.g. bank)";
return "You still have not confirmed the receipt of the payment!\n" +
"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.";
Res.get("portfolio.pending.step3_seller.warn.part1a", model.dataModel.getCurrencyCode()) :
Res.get("portfolio.pending.step3_seller.warn.part1b");
return Res.get("portfolio.pending.step3_seller.warn.part2", substitute, model.getDateForOpenDispute());
}
@ -241,9 +217,7 @@ public class SellerStep3View extends TradeStepView {
@Override
protected String getOpenForDisputeText() {
return "You have not confirmed the receipt of the payment!\n" +
"The max. period for the trade has elapsed.\n" +
"Please contact the arbitrator for opening a dispute.";
return Res.get("portfolio.pending.step3_seller.openForDispute");
}
@Override
@ -263,35 +237,29 @@ public class SellerStep3View extends TradeStepView {
String key = "confirmPaymentReceived";
if (!DevFlags.DEV_MODE && preferences.showAgain(key)) {
PaymentAccountContractData paymentAccountContractData = model.dataModel.getSellersPaymentAccountContractData();
String message = "Have you received the " + CurrencyUtil.getNameByCode(model.dataModel.getCurrencyCode()) +
" payment from your trading partner?\n\n";
String message = Res.get("portfolio.pending.step3_seller.onPaymentReceived.part1", CurrencyUtil.getNameByCode(model.dataModel.getCurrencyCode()));
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();
if (optionalHolderName.isPresent()) {
message += "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\".\n\n";
message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.name", optionalHolderName.get());
}
}
message += "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.";
message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.note");
new Popup()
.headLine("Confirm that you have received the payment")
.headLine(Res.get("portfolio.pending.step3_seller.onPaymentReceived.confirm.headline"))
.confirmation(message)
.width(700)
.actionButtonText("Yes, I have received the payment")
.actionButtonText(Res.get("portfolio.pending.step3_seller.onPaymentReceived.confirm.yes"))
.onAction(this::confirmPaymentReceived)
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.show();
} else {
confirmPaymentReceived();
}
} else {
new Popup().information("You need to wait until you are fully connected to the network.\n" +
"That might take up to about 2 minutes at startup.").show();
new Popup().information(Res.get("popup.warning.notFullyConnected")).show();
}
}
@ -308,14 +276,13 @@ public class SellerStep3View extends TradeStepView {
}, errorMessage -> {
confirmButton.setDisable(false);
hideStatusInfo();
new Popup().warning("Sending message to your trading partner failed.\n" +
"Please try again and if it continue to fail report a bug.").show();
new Popup().warning(Res.get("popup.warning.sendMsgFailed")).show();
});
}
private void showStatusInfo() {
busyAnimation.play();
statusLabel.setText("Sending confirmation...");
statusLabel.setText(Res.get("shared.sendingConfirmation"));
}
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.steps.TradeStepView;
import io.bitsquare.locale.Res;
public class SellerStep3bView extends TradeStepView {
@ -38,14 +39,12 @@ public class SellerStep3bView extends TradeStepView {
@Override
protected String getInfoBlockTitle() {
return "Wait until peer finalizes the payout transaction";
return Res.get("portfolio.pending.step3b_seller.waitFinalize");
}
@Override
protected String getInfoText() {
return "We requested from the trading peer to sign and finalize the payout transaction.\n" +
"It might be that the other peer is offline, so we need to wait until he finalizes the " +
"transaction when he goes online again.";
return Res.get("portfolio.pending.step3b_seller.info");
}
///////////////////////////////////////////////////////////////////////////////////////////
@ -55,11 +54,7 @@ public class SellerStep3bView extends TradeStepView {
@Override
protected String getWarningText() {
setInformationHeadline();
return "The trading peer has not finalized the payout transaction!\n" +
"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.";
return Res.get("portfolio.pending.step3b_seller.warn", model.getDateForOpenDispute());
}
@ -69,9 +64,7 @@ public class SellerStep3bView extends TradeStepView {
@Override
protected String getOpenForDisputeText() {
return "The trading peer has not finalized the payout transaction!\n" +
"The max. period for the trade has elapsed.\n" +
"Please contact the arbitrator for opening a dispute.";
return Res.get("portfolio.pending.step3b_seller.openForDispute");
}
@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.steps.buyer.BuyerStep5View;
import io.bitsquare.locale.Res;
public class SellerStep5View extends BuyerStep5View {
@ -32,11 +33,11 @@ public class SellerStep5View extends BuyerStep5View {
@Override
protected String getBtcTradeAmountLabel() {
return "You have sold:";
return Res.get("portfolio.pending.step5_seller.sold");
}
@Override
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);
UserThread.runAfter(BitsquareApp.shutDownHandler::run, 500, TimeUnit.MILLISECONDS);
})
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.onClose(() -> useTorForBtcJCheckBox.setSelected(!selected))
.show();
}
@ -185,7 +185,7 @@ public class NetworkSettingsView extends ActivatableViewAndModel<GridPane, Activ
}
UserThread.runAfter(BitsquareApp.shutDownHandler::run, 500, TimeUnit.MILLISECONDS);
})
.closeButtonText("Cancel")
.closeButtonText(Res.get("shared.cancel"))
.onClose(() -> btcNodes.setText(btcNodesPreFocusText))
.show();
}

View file

@ -5,6 +5,95 @@
# 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
####################################################################
@ -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.pendingTrades=Open trades
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.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
@ -310,90 +531,72 @@ daoView.tab.compensation=Compensation
daoView.tab.voting=Voting
####################################################################
# Shared
# Notifications
####################################################################
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
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}
notification.tradeCompleted.headline=Trade completed
notification.tradeCompleted.msg=You can withdraw your funds now to your external Bitcoin wallet or transfer it to the Bitsquare wallet.
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.trades=trades
####################################################################
# Popups
####################################################################
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...
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.warning.sendMsgFailed=Sending message to your trading partner failed.\nPlease try again and if it continue to fail report a bug.
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.
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.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.notTraded=Offerer's onion address: {0}
peerInfoIcon.tooltip.offer.traded=Offerer's onion address: {0}\nYou have already traded {1} times with that offerer.
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.funds.depositFunds=\"Funds/Deposit funds\"
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.
####################################################################
# 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.