diff --git a/apitest/scripts/mainnet-test.sh b/apitest/scripts/mainnet-test.sh index 5ade2b55f4..72b29cdfbf 100755 --- a/apitest/scripts/mainnet-test.sh +++ b/apitest/scripts/mainnet-test.sh @@ -14,7 +14,7 @@ # # This script must be run from the root of the project, e.g.: # -# ./cli/test.sh +# bats apitest/scripts/mainnet-test.sh @test "test unsupported method error" { run ./bisq-cli --password=xyz bogus diff --git a/apitest/src/main/java/bisq/apitest/linux/AbstractLinuxProcess.java b/apitest/src/main/java/bisq/apitest/linux/AbstractLinuxProcess.java index 4687477e95..770df37ede 100644 --- a/apitest/src/main/java/bisq/apitest/linux/AbstractLinuxProcess.java +++ b/apitest/src/main/java/bisq/apitest/linux/AbstractLinuxProcess.java @@ -70,10 +70,8 @@ abstract class AbstractLinuxProcess implements LinuxProcess { @Override public void logExceptions(List exceptions, org.slf4j.Logger log) { - StringBuilder errorBuilder = new StringBuilder(); for (Throwable t : exceptions) { log.error("", t); - errorBuilder.append(t.getMessage()).append("\n"); } } diff --git a/apitest/src/test/java/bisq/apitest/ApiTestCase.java b/apitest/src/test/java/bisq/apitest/ApiTestCase.java index 144df9d3e9..7f84772f54 100644 --- a/apitest/src/test/java/bisq/apitest/ApiTestCase.java +++ b/apitest/src/test/java/bisq/apitest/ApiTestCase.java @@ -26,6 +26,8 @@ import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; +import org.junit.jupiter.api.TestInfo; + import static java.util.Arrays.stream; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -105,11 +107,22 @@ public class ApiTestCase { } } - protected void sleep(long ms) { + protected static void genBtcBlocksThenWait(int numBlocks, long wait) { + bitcoinCli.generateBlocks(numBlocks); + sleep(wait); + } + + protected static void sleep(long ms) { try { MILLISECONDS.sleep(ms); } catch (InterruptedException ignored) { // empty } } + + protected final String testName(TestInfo testInfo) { + return testInfo.getTestMethod().isPresent() + ? testInfo.getTestMethod().get().getName() + : "unknown test name"; + } } diff --git a/apitest/src/test/java/bisq/apitest/method/CreatePaymentAccountTest.java b/apitest/src/test/java/bisq/apitest/method/CreatePaymentAccountTest.java index 661205c74d..9e8b0af878 100644 --- a/apitest/src/test/java/bisq/apitest/method/CreatePaymentAccountTest.java +++ b/apitest/src/test/java/bisq/apitest/method/CreatePaymentAccountTest.java @@ -29,6 +29,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @@ -40,7 +41,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.MethodOrderer.OrderAnnotation; - +@Disabled @Slf4j @TestMethodOrder(OrderAnnotation.class) public class CreatePaymentAccountTest extends MethodTest { diff --git a/apitest/src/test/java/bisq/apitest/method/GetBalanceTest.java b/apitest/src/test/java/bisq/apitest/method/GetBalanceTest.java index abce9a78a6..1d44590837 100644 --- a/apitest/src/test/java/bisq/apitest/method/GetBalanceTest.java +++ b/apitest/src/test/java/bisq/apitest/method/GetBalanceTest.java @@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @@ -35,7 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.MethodOrderer.OrderAnnotation; - +@Disabled @Slf4j @TestMethodOrder(OrderAnnotation.class) public class GetBalanceTest extends MethodTest { diff --git a/apitest/src/test/java/bisq/apitest/method/GetVersionTest.java b/apitest/src/test/java/bisq/apitest/method/GetVersionTest.java index 82780340ee..212eb5ca43 100644 --- a/apitest/src/test/java/bisq/apitest/method/GetVersionTest.java +++ b/apitest/src/test/java/bisq/apitest/method/GetVersionTest.java @@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @@ -33,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.MethodOrderer.OrderAnnotation; - +@Disabled @Slf4j @TestMethodOrder(OrderAnnotation.class) public class GetVersionTest extends MethodTest { diff --git a/apitest/src/test/java/bisq/apitest/method/MethodTest.java b/apitest/src/test/java/bisq/apitest/method/MethodTest.java index b03f00da35..43073ba995 100644 --- a/apitest/src/test/java/bisq/apitest/method/MethodTest.java +++ b/apitest/src/test/java/bisq/apitest/method/MethodTest.java @@ -17,32 +17,46 @@ package bisq.apitest.method; +import bisq.proto.grpc.CancelOfferRequest; +import bisq.proto.grpc.ConfirmPaymentReceivedRequest; +import bisq.proto.grpc.ConfirmPaymentStartedRequest; import bisq.proto.grpc.CreatePaymentAccountRequest; import bisq.proto.grpc.GetBalanceRequest; import bisq.proto.grpc.GetFundingAddressesRequest; import bisq.proto.grpc.GetOfferRequest; import bisq.proto.grpc.GetPaymentAccountsRequest; +import bisq.proto.grpc.GetTradeRequest; +import bisq.proto.grpc.KeepFundsRequest; import bisq.proto.grpc.LockWalletRequest; import bisq.proto.grpc.MarketPriceRequest; import bisq.proto.grpc.OfferInfo; import bisq.proto.grpc.RegisterDisputeAgentRequest; import bisq.proto.grpc.RemoveWalletPasswordRequest; import bisq.proto.grpc.SetWalletPasswordRequest; +import bisq.proto.grpc.TakeOfferRequest; +import bisq.proto.grpc.TradeInfo; import bisq.proto.grpc.UnlockWalletRequest; +import bisq.proto.grpc.WithdrawFundsRequest; import protobuf.PaymentAccount; import java.util.stream.Collectors; +import static bisq.apitest.config.BisqAppConfig.alicedaemon; +import static bisq.apitest.config.BisqAppConfig.arbdaemon; +import static bisq.apitest.config.BisqAppConfig.bobdaemon; import static bisq.common.app.DevEnv.DEV_PRIVILEGE_PRIV_KEY; import static bisq.core.payment.payload.PaymentMethod.PERFECT_MONEY; +import static java.util.Arrays.stream; import static java.util.Comparator.comparing; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import bisq.apitest.ApiTestCase; import bisq.apitest.config.BisqAppConfig; +import bisq.cli.GrpcStubs; public class MethodTest extends ApiTestCase { @@ -50,6 +64,43 @@ public class MethodTest extends ApiTestCase { protected static final String MEDIATOR = "mediator"; protected static final String REFUND_AGENT = "refundagent"; + protected static GrpcStubs aliceStubs; + protected static GrpcStubs bobStubs; + + protected static PaymentAccount alicesDummyAcct; + protected static PaymentAccount bobsDummyAcct; + + public static void startSupportingApps(boolean registerDisputeAgents, + boolean generateBtcBlock, + Enum... supportingApps) { + try { + // To run Bisq apps in debug mode, use the other setUpScaffold method: + // setUpScaffold(new String[]{"--supportingApps", "bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon", + // "--enableBisqDebugging", "true"}); + setUpScaffold(supportingApps); + if (registerDisputeAgents) { + registerDisputeAgents(arbdaemon); + } + + if (stream(supportingApps).map(Enum::name).anyMatch(name -> name.equals(alicedaemon.name()))) { + aliceStubs = grpcStubs(alicedaemon); + alicesDummyAcct = getDefaultPerfectDummyPaymentAccount(alicedaemon); + } + + if (stream(supportingApps).map(Enum::name).anyMatch(name -> name.equals(bobdaemon.name()))) { + bobStubs = grpcStubs(bobdaemon); + bobsDummyAcct = getDefaultPerfectDummyPaymentAccount(bobdaemon); + } + + // Generate 1 regtest block for alice's and/or bob's wallet to + // show 10 BTC balance, and allow time for daemons parse the new block. + if (generateBtcBlock) + genBtcBlocksThenWait(1, 1500); + } catch (Exception ex) { + fail(ex); + } + } + // Convenience methods for building gRPC request objects protected final GetBalanceRequest createBalanceRequest() { @@ -88,6 +139,39 @@ public class MethodTest extends ApiTestCase { return GetOfferRequest.newBuilder().setId(offerId).build(); } + protected final CancelOfferRequest createCancelOfferRequest(String offerId) { + return CancelOfferRequest.newBuilder().setId(offerId).build(); + } + + protected final TakeOfferRequest createTakeOfferRequest(String offerId, String paymentAccountId) { + return TakeOfferRequest.newBuilder().setOfferId(offerId).setPaymentAccountId(paymentAccountId).build(); + } + + protected final GetTradeRequest createGetTradeRequest(String tradeId) { + return GetTradeRequest.newBuilder().setTradeId(tradeId).build(); + } + + protected final ConfirmPaymentStartedRequest createConfirmPaymentStartedRequest(String tradeId) { + return ConfirmPaymentStartedRequest.newBuilder().setTradeId(tradeId).build(); + } + + protected final ConfirmPaymentReceivedRequest createConfirmPaymentReceivedRequest(String tradeId) { + return ConfirmPaymentReceivedRequest.newBuilder().setTradeId(tradeId).build(); + } + + protected final KeepFundsRequest createKeepFundsRequest(String tradeId) { + return KeepFundsRequest.newBuilder() + .setTradeId(tradeId) + .build(); + } + + protected final WithdrawFundsRequest createWithdrawFundsRequest(String tradeId, String address) { + return WithdrawFundsRequest.newBuilder() + .setTradeId(tradeId) + .setAddress(address) + .build(); + } + // Convenience methods for calling frequently used & thoroughly tested gRPC services. protected final long getBalance(BisqAppConfig bisqAppConfig) { @@ -127,7 +211,7 @@ public class MethodTest extends ApiTestCase { .build(); } - protected final PaymentAccount getDefaultPerfectDummyPaymentAccount(BisqAppConfig bisqAppConfig) { + protected static PaymentAccount getDefaultPerfectDummyPaymentAccount(BisqAppConfig bisqAppConfig) { var req = GetPaymentAccountsRequest.newBuilder().build(); var paymentAccountsService = grpcStubs(bisqAppConfig).paymentAccountsService; PaymentAccount paymentAccount = paymentAccountsService.getPaymentAccounts(req) @@ -149,6 +233,40 @@ public class MethodTest extends ApiTestCase { return grpcStubs(bisqAppConfig).offersService.getOffer(req).getOffer(); } + @SuppressWarnings("ResultOfMethodCallIgnored") + protected final void cancelOffer(BisqAppConfig bisqAppConfig, String offerId) { + var req = createCancelOfferRequest(offerId); + grpcStubs(bisqAppConfig).offersService.cancelOffer(req); + } + + protected final TradeInfo getTrade(BisqAppConfig bisqAppConfig, String tradeId) { + var req = createGetTradeRequest(tradeId); + return grpcStubs(bisqAppConfig).tradesService.getTrade(req).getTrade(); + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + protected final void confirmPaymentStarted(BisqAppConfig bisqAppConfig, String tradeId) { + var req = createConfirmPaymentStartedRequest(tradeId); + grpcStubs(bisqAppConfig).tradesService.confirmPaymentStarted(req); + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + protected final void confirmPaymentReceived(BisqAppConfig bisqAppConfig, String tradeId) { + var req = createConfirmPaymentReceivedRequest(tradeId); + grpcStubs(bisqAppConfig).tradesService.confirmPaymentReceived(req); + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + protected final void keepFunds(BisqAppConfig bisqAppConfig, String tradeId) { + var req = createKeepFundsRequest(tradeId); + grpcStubs(bisqAppConfig).tradesService.keepFunds(req); + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + protected final void withdrawFunds(BisqAppConfig bisqAppConfig, String tradeId, String address) { + var req = createWithdrawFundsRequest(tradeId, address); + grpcStubs(bisqAppConfig).tradesService.withdrawFunds(req); + } // Static conveniences for test methods and test case fixture setups. protected static RegisterDisputeAgentRequest createRegisterDisputeAgentRequest(String disputeAgentType) { diff --git a/apitest/src/test/java/bisq/apitest/method/RegisterDisputeAgentsTest.java b/apitest/src/test/java/bisq/apitest/method/RegisterDisputeAgentsTest.java index 9c87501208..746c851b4d 100644 --- a/apitest/src/test/java/bisq/apitest/method/RegisterDisputeAgentsTest.java +++ b/apitest/src/test/java/bisq/apitest/method/RegisterDisputeAgentsTest.java @@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @@ -40,6 +41,7 @@ import static org.junit.jupiter.api.MethodOrderer.OrderAnnotation; @SuppressWarnings("ResultOfMethodCallIgnored") +@Disabled @Slf4j @TestMethodOrder(OrderAnnotation.class) public class RegisterDisputeAgentsTest extends MethodTest { @@ -56,8 +58,7 @@ public class RegisterDisputeAgentsTest extends MethodTest { @Test @Order(1) public void testRegisterArbitratorShouldThrowException() { - var req = - createRegisterDisputeAgentRequest(ARBITRATOR); + var req = createRegisterDisputeAgentRequest(ARBITRATOR); Throwable exception = assertThrows(StatusRuntimeException.class, () -> grpcStubs(arbdaemon).disputeAgentsService.registerDisputeAgent(req)); assertEquals("INVALID_ARGUMENT: arbitrators must be registered in a Bisq UI", @@ -67,8 +68,7 @@ public class RegisterDisputeAgentsTest extends MethodTest { @Test @Order(2) public void testInvalidDisputeAgentTypeArgShouldThrowException() { - var req = - createRegisterDisputeAgentRequest("badagent"); + var req = createRegisterDisputeAgentRequest("badagent"); Throwable exception = assertThrows(StatusRuntimeException.class, () -> grpcStubs(arbdaemon).disputeAgentsService.registerDisputeAgent(req)); assertEquals("INVALID_ARGUMENT: unknown dispute agent type 'badagent'", @@ -90,16 +90,14 @@ public class RegisterDisputeAgentsTest extends MethodTest { @Test @Order(4) public void testRegisterMediator() { - var req = - createRegisterDisputeAgentRequest(MEDIATOR); + var req = createRegisterDisputeAgentRequest(MEDIATOR); grpcStubs(arbdaemon).disputeAgentsService.registerDisputeAgent(req); } @Test @Order(5) public void testRegisterRefundAgent() { - var req = - createRegisterDisputeAgentRequest(REFUND_AGENT); + var req = createRegisterDisputeAgentRequest(REFUND_AGENT); grpcStubs(arbdaemon).disputeAgentsService.registerDisputeAgent(req); } diff --git a/apitest/src/test/java/bisq/apitest/method/WalletProtectionTest.java b/apitest/src/test/java/bisq/apitest/method/WalletProtectionTest.java index 61f3c27e4a..08547e9ebb 100644 --- a/apitest/src/test/java/bisq/apitest/method/WalletProtectionTest.java +++ b/apitest/src/test/java/bisq/apitest/method/WalletProtectionTest.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @@ -18,6 +19,7 @@ import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.MethodOrderer.OrderAnnotation; @SuppressWarnings("ResultOfMethodCallIgnored") +@Disabled @Slf4j @TestMethodOrder(OrderAnnotation.class) public class WalletProtectionTest extends MethodTest { diff --git a/apitest/src/test/java/bisq/apitest/method/offer/AbstractCreateOfferTest.java b/apitest/src/test/java/bisq/apitest/method/offer/AbstractOfferTest.java similarity index 51% rename from apitest/src/test/java/bisq/apitest/method/offer/AbstractCreateOfferTest.java rename to apitest/src/test/java/bisq/apitest/method/offer/AbstractOfferTest.java index 9c494a7a74..fe9a98aaaa 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/AbstractCreateOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/AbstractOfferTest.java @@ -19,9 +19,12 @@ package bisq.apitest.method.offer; import bisq.core.monetary.Altcoin; +import bisq.proto.grpc.CreateOfferRequest; import bisq.proto.grpc.GetOffersRequest; import bisq.proto.grpc.OfferInfo; +import protobuf.PaymentAccount; + import org.bitcoinj.utils.Fiat; import java.math.BigDecimal; @@ -36,14 +39,16 @@ import org.junit.jupiter.api.BeforeAll; import static bisq.apitest.Scaffold.BitcoinCoreApp.bitcoind; import static bisq.apitest.config.BisqAppConfig.alicedaemon; +import static bisq.apitest.config.BisqAppConfig.arbdaemon; +import static bisq.apitest.config.BisqAppConfig.bobdaemon; import static bisq.apitest.config.BisqAppConfig.seednode; import static bisq.common.util.MathUtils.roundDouble; import static bisq.common.util.MathUtils.scaleDownByPowerOf10; +import static bisq.core.btc.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent; import static bisq.core.locale.CurrencyUtil.isCryptoCurrency; import static java.lang.String.format; import static java.math.RoundingMode.HALF_UP; import static java.util.Comparator.comparing; -import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.junit.jupiter.api.Assertions.fail; @@ -51,49 +56,79 @@ import static org.junit.jupiter.api.Assertions.fail; import bisq.apitest.method.MethodTest; import bisq.cli.GrpcStubs; - @Slf4j -abstract class AbstractCreateOfferTest extends MethodTest { - - protected static GrpcStubs aliceStubs; +public abstract class AbstractOfferTest extends MethodTest { @BeforeAll public static void setUp() { - startSupportingApps(); + startSupportingApps(true, + true, + bitcoind, + seednode, + arbdaemon, + alicedaemon, + bobdaemon); } - static void startSupportingApps() { - try { - // setUpScaffold(new String[]{"--supportingApps", "bitcoind,seednode,alicedaemon", "--enableBisqDebugging", "true"}); - setUpScaffold(bitcoind, seednode, alicedaemon); - aliceStubs = grpcStubs(alicedaemon); + protected final OfferInfo createAliceOffer(PaymentAccount paymentAccount, + String direction, + String currencyCode, + long amount) { + return createMarketBasedPricedOffer(aliceStubs, paymentAccount, direction, currencyCode, amount); + } - // Generate 1 regtest block for alice's wallet to show 10 BTC balance, - // and give alicedaemon time to parse the new block. - bitcoinCli.generateBlocks(1); - MILLISECONDS.sleep(1500); - } catch (Exception ex) { - fail(ex); - } + protected final OfferInfo createBobOffer(PaymentAccount paymentAccount, + String direction, + String currencyCode, + long amount) { + return createMarketBasedPricedOffer(bobStubs, paymentAccount, direction, currencyCode, amount); + } + + protected final OfferInfo createMarketBasedPricedOffer(GrpcStubs grpcStubs, + PaymentAccount paymentAccount, + String direction, + String currencyCode, + long amount) { + var req = CreateOfferRequest.newBuilder() + .setPaymentAccountId(paymentAccount.getId()) + .setDirection(direction) + .setCurrencyCode(currencyCode) + .setAmount(amount) + .setMinAmount(amount) + .setUseMarketBasedPrice(true) + .setMarketPriceMargin(0.00) + .setPrice("0") + .setBuyerSecurityDeposit(getDefaultBuyerSecurityDepositAsPercent()) + .build(); + return grpcStubs.offersService.createOffer(req).getOffer(); } protected final OfferInfo getOffer(String offerId) { return aliceStubs.offersService.getOffer(createGetOfferRequest(offerId)).getOffer(); } - protected final OfferInfo getMostRecentOffer(String direction, String currencyCode) { - List offerInfoList = getOffersSortedByDate(direction, currencyCode); + @SuppressWarnings("ResultOfMethodCallIgnored") + protected final void cancelOffer(GrpcStubs grpcStubs, String offerId) { + grpcStubs.offersService.cancelOffer(createCancelOfferRequest(offerId)); + } + + protected final OfferInfo getMostRecentOffer(GrpcStubs grpcStubs, String direction, String currencyCode) { + List offerInfoList = getOffersSortedByDate(grpcStubs, direction, currencyCode); if (offerInfoList.isEmpty()) fail(format("No %s offers found for currency %s", direction, currencyCode)); return offerInfoList.get(offerInfoList.size() - 1); } - protected final List getOffersSortedByDate(String direction, String currencyCode) { + protected final int getOpenOffersCount(GrpcStubs grpcStubs, String direction, String currencyCode) { + return getOffersSortedByDate(grpcStubs, direction, currencyCode).size(); + } + + protected final List getOffersSortedByDate(GrpcStubs grpcStubs, String direction, String currencyCode) { var req = GetOffersRequest.newBuilder() .setDirection(direction) .setCurrencyCode(currencyCode).build(); - var reply = aliceStubs.offersService.getOffers(req); + var reply = grpcStubs.offersService.getOffers(req); return sortOffersByDate(reply.getOffersList()); } diff --git a/apitest/src/test/java/bisq/apitest/method/offer/CancelOfferTest.java b/apitest/src/test/java/bisq/apitest/method/offer/CancelOfferTest.java new file mode 100644 index 0000000000..334fb022bb --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/method/offer/CancelOfferTest.java @@ -0,0 +1,82 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.apitest.method.offer; + +import bisq.core.btc.wallet.Restrictions; + +import bisq.proto.grpc.CreateOfferRequest; +import bisq.proto.grpc.OfferInfo; + +import java.util.List; + +import lombok.extern.slf4j.Slf4j; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Disabled +@Slf4j +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class CancelOfferTest extends AbstractOfferTest { + + private static final int MAX_OFFERS = 3; + + @Test + @Order(1) + public void testCancelOffer() { + var req = CreateOfferRequest.newBuilder() + .setPaymentAccountId(alicesDummyAcct.getId()) + .setDirection("buy") + .setCurrencyCode("cad") + .setAmount(10000000) + .setMinAmount(10000000) + .setUseMarketBasedPrice(true) + .setMarketPriceMargin(0.00) + .setPrice("0") + .setBuyerSecurityDeposit(Restrictions.getDefaultBuyerSecurityDepositAsPercent()) + .build(); + + // Create some offers. + for (int i = 1; i <= MAX_OFFERS; i++) { + //noinspection ResultOfMethodCallIgnored + aliceStubs.offersService.createOffer(req); + // Wait for Alice's AddToOfferBook task. + // Wait times vary; my logs show >= 2 second delay. + sleep(2500); + } + + List offers = getOffersSortedByDate(aliceStubs, "buy", "cad"); + assertEquals(MAX_OFFERS, offers.size()); + + // Cancel the offers, checking the open offer count after each offer removal. + for (int i = 1; i <= MAX_OFFERS; i++) { + cancelOffer(aliceStubs, offers.remove(0).getId()); + assertEquals(MAX_OFFERS - i, getOpenOffersCount(aliceStubs, "buy", "cad")); + } + + sleep(1000); // wait for offer removal + + offers = getOffersSortedByDate(aliceStubs, "buy", "cad"); + assertEquals(0, offers.size()); + } +} diff --git a/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingFixedPriceTest.java b/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingFixedPriceTest.java index 3960653655..72ff91f311 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingFixedPriceTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingFixedPriceTest.java @@ -23,26 +23,26 @@ import bisq.proto.grpc.CreateOfferRequest; import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; -import static bisq.apitest.config.BisqAppConfig.alicedaemon; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; +@Disabled @Slf4j @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { +public class CreateOfferUsingFixedPriceTest extends AbstractOfferTest { @Test @Order(1) public void testCreateAUDBTCBuyOfferUsingFixedPrice16000() { - var paymentAccount = getDefaultPerfectDummyPaymentAccount(alicedaemon); var req = CreateOfferRequest.newBuilder() - .setPaymentAccountId(paymentAccount.getId()) + .setPaymentAccountId(alicesDummyAcct.getId()) .setDirection("buy") .setCurrencyCode("aud") .setAmount(10000000) @@ -61,7 +61,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("AUD", newOffer.getCounterCurrencyCode()); @@ -73,7 +73,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("AUD", newOffer.getCounterCurrencyCode()); } @@ -81,9 +81,8 @@ public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { @Test @Order(2) public void testCreateUSDBTCBuyOfferUsingFixedPrice100001234() { - var paymentAccount = getDefaultPerfectDummyPaymentAccount(alicedaemon); var req = CreateOfferRequest.newBuilder() - .setPaymentAccountId(paymentAccount.getId()) + .setPaymentAccountId(alicesDummyAcct.getId()) .setDirection("buy") .setCurrencyCode("usd") .setAmount(10000000) @@ -102,7 +101,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("USD", newOffer.getCounterCurrencyCode()); @@ -114,7 +113,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("USD", newOffer.getCounterCurrencyCode()); } @@ -122,9 +121,8 @@ public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { @Test @Order(3) public void testCreateEURBTCSellOfferUsingFixedPrice95001234() { - var paymentAccount = getDefaultPerfectDummyPaymentAccount(alicedaemon); var req = CreateOfferRequest.newBuilder() - .setPaymentAccountId(paymentAccount.getId()) + .setPaymentAccountId(alicesDummyAcct.getId()) .setDirection("sell") .setCurrencyCode("eur") .setAmount(10000000) @@ -143,7 +141,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("EUR", newOffer.getCounterCurrencyCode()); @@ -155,7 +153,7 @@ public class CreateOfferUsingFixedPriceTest extends AbstractCreateOfferTest { assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("EUR", newOffer.getCounterCurrencyCode()); } diff --git a/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java b/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java index 331ddbab73..345bd130d7 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java @@ -26,12 +26,12 @@ import java.text.DecimalFormat; import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; -import static bisq.apitest.config.BisqAppConfig.alicedaemon; import static bisq.common.util.MathUtils.scaleDownByPowerOf10; import static bisq.common.util.MathUtils.scaleUpByPowerOf10; import static java.lang.Math.abs; @@ -41,9 +41,10 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static protobuf.OfferPayload.Direction.BUY; +@Disabled @Slf4j @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTest { +public class CreateOfferUsingMarketPriceMarginTest extends AbstractOfferTest { private static final DecimalFormat PCT_FORMAT = new DecimalFormat("##0.00"); private static final double MKT_PRICE_MARGIN_ERROR_TOLERANCE = 0.0050; // 0.50% @@ -52,10 +53,9 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe @Test @Order(1) public void testCreateUSDBTCBuyOffer5PctPriceMargin() { - var paymentAccount = getDefaultPerfectDummyPaymentAccount(alicedaemon); double priceMarginPctInput = 5.00; var req = CreateOfferRequest.newBuilder() - .setPaymentAccountId(paymentAccount.getId()) + .setPaymentAccountId(alicesDummyAcct.getId()) .setDirection("buy") .setCurrencyCode("usd") .setAmount(10000000) @@ -73,7 +73,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("USD", newOffer.getCounterCurrencyCode()); @@ -84,7 +84,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("USD", newOffer.getCounterCurrencyCode()); @@ -94,10 +94,9 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe @Test @Order(2) public void testCreateNZDBTCBuyOfferMinus2PctPriceMargin() { - var paymentAccount = getDefaultPerfectDummyPaymentAccount(alicedaemon); double priceMarginPctInput = -2.00; var req = CreateOfferRequest.newBuilder() - .setPaymentAccountId(paymentAccount.getId()) + .setPaymentAccountId(alicesDummyAcct.getId()) .setDirection("buy") .setCurrencyCode("nzd") .setAmount(10000000) @@ -115,7 +114,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("NZD", newOffer.getCounterCurrencyCode()); @@ -126,7 +125,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("NZD", newOffer.getCounterCurrencyCode()); @@ -136,10 +135,9 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe @Test @Order(3) public void testCreateGBPBTCSellOfferMinus1Point5PctPriceMargin() { - var paymentAccount = getDefaultPerfectDummyPaymentAccount(alicedaemon); double priceMarginPctInput = -1.5; var req = CreateOfferRequest.newBuilder() - .setPaymentAccountId(paymentAccount.getId()) + .setPaymentAccountId(alicesDummyAcct.getId()) .setDirection("sell") .setCurrencyCode("gbp") .setAmount(10000000) @@ -158,7 +156,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("GBP", newOffer.getCounterCurrencyCode()); @@ -169,7 +167,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("GBP", newOffer.getCounterCurrencyCode()); @@ -179,10 +177,9 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe @Test @Order(4) public void testCreateBRLBTCSellOffer6Point55PctPriceMargin() { - var paymentAccount = getDefaultPerfectDummyPaymentAccount(alicedaemon); double priceMarginPctInput = 6.55; var req = CreateOfferRequest.newBuilder() - .setPaymentAccountId(paymentAccount.getId()) + .setPaymentAccountId(alicesDummyAcct.getId()) .setDirection("sell") .setCurrencyCode("brl") .setAmount(10000000) @@ -201,7 +198,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("BRL", newOffer.getCounterCurrencyCode()); @@ -212,7 +209,7 @@ public class CreateOfferUsingMarketPriceMarginTest extends AbstractCreateOfferTe assertEquals(10000000, newOffer.getAmount()); assertEquals(10000000, newOffer.getMinAmount()); assertEquals(1500000, newOffer.getBuyerSecurityDeposit()); - assertEquals(paymentAccount.getId(), newOffer.getPaymentAccountId()); + assertEquals(alicesDummyAcct.getId(), newOffer.getPaymentAccountId()); assertEquals("BTC", newOffer.getBaseCurrencyCode()); assertEquals("BRL", newOffer.getCounterCurrencyCode()); diff --git a/apitest/src/test/java/bisq/apitest/method/offer/ValidateCreateOfferTest.java b/apitest/src/test/java/bisq/apitest/method/offer/ValidateCreateOfferTest.java index c51b64a6a0..3ddd8cb303 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/ValidateCreateOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/ValidateCreateOfferTest.java @@ -25,25 +25,25 @@ import io.grpc.StatusRuntimeException; import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; -import static bisq.apitest.config.BisqAppConfig.alicedaemon; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +@Disabled @Slf4j @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class ValidateCreateOfferTest extends AbstractCreateOfferTest { +public class ValidateCreateOfferTest extends AbstractOfferTest { @Test @Order(1) public void testAmtTooLargeShouldThrowException() { - var paymentAccount = getDefaultPerfectDummyPaymentAccount(alicedaemon); var req = CreateOfferRequest.newBuilder() - .setPaymentAccountId(paymentAccount.getId()) + .setPaymentAccountId(alicesDummyAcct.getId()) .setDirection("buy") .setCurrencyCode("usd") .setAmount(100000000000L) diff --git a/apitest/src/test/java/bisq/apitest/method/trade/AbstractTradeTest.java b/apitest/src/test/java/bisq/apitest/method/trade/AbstractTradeTest.java new file mode 100644 index 0000000000..e8537206db --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/method/trade/AbstractTradeTest.java @@ -0,0 +1,60 @@ +package bisq.apitest.method.trade; + +import bisq.proto.grpc.TradeInfo; + +import org.slf4j.Logger; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.TestInfo; + +import static bisq.cli.TradeFormat.format; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + + + +import bisq.apitest.method.offer.AbstractOfferTest; + +public class AbstractTradeTest extends AbstractOfferTest { + + public static final ExpectedProtocolStatus EXPECTED_PROTOCOL_STATUS = new ExpectedProtocolStatus(); + + // A Trade ID cache for use in @Test sequences. + protected static String tradeId; + + @BeforeAll + public static void initStaticFixtures() { + EXPECTED_PROTOCOL_STATUS.init(); + } + + protected final TradeInfo takeAlicesOffer(String offerId, String paymentAccountId) { + return bobStubs.tradesService.takeOffer(createTakeOfferRequest(offerId, paymentAccountId)).getTrade(); + } + + @SuppressWarnings("unused") + protected final TradeInfo takeBobsOffer(String offerId, String paymentAccountId) { + return aliceStubs.tradesService.takeOffer(createTakeOfferRequest(offerId, paymentAccountId)).getTrade(); + } + + protected final void verifyExpectedProtocolStatus(TradeInfo trade) { + assertNotNull(trade); + assertEquals(EXPECTED_PROTOCOL_STATUS.state.name(), trade.getState()); + assertEquals(EXPECTED_PROTOCOL_STATUS.phase.name(), trade.getPhase()); + assertEquals(EXPECTED_PROTOCOL_STATUS.isDepositPublished, trade.getIsDepositPublished()); + assertEquals(EXPECTED_PROTOCOL_STATUS.isDepositConfirmed, trade.getIsDepositConfirmed()); + assertEquals(EXPECTED_PROTOCOL_STATUS.isFiatSent, trade.getIsFiatSent()); + assertEquals(EXPECTED_PROTOCOL_STATUS.isFiatReceived, trade.getIsFiatReceived()); + assertEquals(EXPECTED_PROTOCOL_STATUS.isPayoutPublished, trade.getIsPayoutPublished()); + assertEquals(EXPECTED_PROTOCOL_STATUS.isWithdrawn, trade.getIsWithdrawn()); + } + + protected final void logTrade(Logger log, + TestInfo testInfo, + String description, + TradeInfo trade) { + log.info(String.format("%s %s%n%s", + testName(testInfo), + description.toUpperCase(), + format(trade))); + } +} diff --git a/apitest/src/test/java/bisq/apitest/method/trade/ExpectedProtocolStatus.java b/apitest/src/test/java/bisq/apitest/method/trade/ExpectedProtocolStatus.java new file mode 100644 index 0000000000..6365558594 --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/method/trade/ExpectedProtocolStatus.java @@ -0,0 +1,69 @@ +package bisq.apitest.method.trade; + +import bisq.core.trade.Trade; + +/** + * A test fixture encapsulating expected trade protocol status. + * Status flags should be cleared via init() before starting a new trade protocol. + */ +public class ExpectedProtocolStatus { + Trade.State state; + Trade.Phase phase; + boolean isDepositPublished; + boolean isDepositConfirmed; + boolean isFiatSent; + boolean isFiatReceived; + boolean isPayoutPublished; + boolean isWithdrawn; + + public ExpectedProtocolStatus setState(Trade.State state) { + this.state = state; + return this; + } + + public ExpectedProtocolStatus setPhase(Trade.Phase phase) { + this.phase = phase; + return this; + } + + public ExpectedProtocolStatus setDepositPublished(boolean depositPublished) { + isDepositPublished = depositPublished; + return this; + } + + public ExpectedProtocolStatus setDepositConfirmed(boolean depositConfirmed) { + isDepositConfirmed = depositConfirmed; + return this; + } + + public ExpectedProtocolStatus setFiatSent(boolean fiatSent) { + isFiatSent = fiatSent; + return this; + } + + public ExpectedProtocolStatus setFiatReceived(boolean fiatReceived) { + isFiatReceived = fiatReceived; + return this; + } + + public ExpectedProtocolStatus setPayoutPublished(boolean payoutPublished) { + isPayoutPublished = payoutPublished; + return this; + } + + public ExpectedProtocolStatus setWithdrawn(boolean withdrawn) { + isWithdrawn = withdrawn; + return this; + } + + public void init() { + state = null; + phase = null; + isDepositPublished = false; + isDepositConfirmed = false; + isFiatSent = false; + isFiatReceived = false; + isPayoutPublished = false; + isWithdrawn = false; + } +} diff --git a/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferTest.java b/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferTest.java new file mode 100644 index 0000000000..3561787c45 --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferTest.java @@ -0,0 +1,154 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.apitest.method.trade; + +import io.grpc.StatusRuntimeException; + +import lombok.extern.slf4j.Slf4j; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.TestMethodOrder; + +import static bisq.apitest.config.BisqAppConfig.alicedaemon; +import static bisq.apitest.config.BisqAppConfig.bobdaemon; +import static bisq.cli.CurrencyFormat.formatSatoshis; +import static bisq.core.trade.Trade.Phase.DEPOSIT_CONFIRMED; +import static bisq.core.trade.Trade.Phase.DEPOSIT_PUBLISHED; +import static bisq.core.trade.Trade.Phase.FIAT_SENT; +import static bisq.core.trade.Trade.Phase.PAYOUT_PUBLISHED; +import static bisq.core.trade.Trade.State.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; +import static protobuf.Offer.State.OFFER_FEE_PAID; +import static protobuf.OpenOffer.State.AVAILABLE; + +@Disabled +@Slf4j +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class TakeBuyBTCOfferTest extends AbstractTradeTest { + + // Alice is buyer, Bob is seller. + + @Test + @Order(1) + public void testTakeAlicesBuyOffer(final TestInfo testInfo) { + try { + var alicesOffer = createAliceOffer(alicesDummyAcct, + "buy", + "usd", + 12500000); + var offerId = alicesOffer.getId(); + + // Wait for Alice's AddToOfferBook task. + // Wait times vary; my logs show >= 2 second delay. + sleep(3000); + assertEquals(1, getOpenOffersCount(aliceStubs, "buy", "usd")); + + var trade = takeAlicesOffer(offerId, bobsDummyAcct.getId()); + assertNotNull(trade); + assertEquals(offerId, trade.getTradeId()); + // Cache the trade id for the other tests. + tradeId = trade.getTradeId(); + + genBtcBlocksThenWait(1, 2250); + assertEquals(0, getOpenOffersCount(aliceStubs, "buy", "usd")); + + trade = getTrade(bobdaemon, trade.getTradeId()); + EXPECTED_PROTOCOL_STATUS.setState(SELLER_PUBLISHED_DEPOSIT_TX) + .setPhase(DEPOSIT_PUBLISHED) + .setDepositPublished(true); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Bob's view after taking offer and sending deposit", trade); + + genBtcBlocksThenWait(1, 2250); + trade = getTrade(bobdaemon, trade.getTradeId()); + EXPECTED_PROTOCOL_STATUS.setState(DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN) + .setPhase(DEPOSIT_CONFIRMED) + .setDepositConfirmed(true); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Bob's view after deposit is confirmed", trade); + } catch (StatusRuntimeException e) { + fail(e); + } + } + + @Test + @Order(2) + public void testAlicesConfirmPaymentStarted(final TestInfo testInfo) { + try { + var trade = getTrade(alicedaemon, tradeId); + confirmPaymentStarted(alicedaemon, trade.getTradeId()); + sleep(3000); + + trade = getTrade(alicedaemon, tradeId); + assertEquals(OFFER_FEE_PAID.name(), trade.getOffer().getState()); + EXPECTED_PROTOCOL_STATUS.setState(BUYER_SAW_ARRIVED_FIAT_PAYMENT_INITIATED_MSG) + .setPhase(FIAT_SENT) + .setFiatSent(true); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Alice's view after confirming fiat payment sent", trade); + } catch (StatusRuntimeException e) { + fail(e); + } + } + + @Test + @Order(3) + public void testBobsConfirmPaymentReceived(final TestInfo testInfo) { + var trade = getTrade(bobdaemon, tradeId); + confirmPaymentReceived(bobdaemon, trade.getTradeId()); + sleep(3000); + + trade = getTrade(bobdaemon, tradeId); + // Note: offer.state == available + assertEquals(AVAILABLE.name(), trade.getOffer().getState()); + EXPECTED_PROTOCOL_STATUS.setState(SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG) + .setPhase(PAYOUT_PUBLISHED) + .setPayoutPublished(true) + .setFiatReceived(true); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Bob's view after confirming fiat payment received", trade); + } + + @Test + @Order(4) + public void testAlicesKeepFunds(final TestInfo testInfo) { + genBtcBlocksThenWait(1, 2250); + + var trade = getTrade(alicedaemon, tradeId); + logTrade(log, testInfo, "Alice's view before keeping funds", trade); + + keepFunds(alicedaemon, tradeId); + + genBtcBlocksThenWait(1, 2250); + + trade = getTrade(alicedaemon, tradeId); + EXPECTED_PROTOCOL_STATUS.setState(BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG) + .setPhase(PAYOUT_PUBLISHED); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Alice's view after keeping funds", trade); + log.info("{} Alice's current available balance: {} BTC", + testName(testInfo), + formatSatoshis(getBalance(alicedaemon))); + } +} diff --git a/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBTCOfferTest.java b/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBTCOfferTest.java new file mode 100644 index 0000000000..35e13c002f --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBTCOfferTest.java @@ -0,0 +1,155 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.apitest.method.trade; + +import io.grpc.StatusRuntimeException; + +import lombok.extern.slf4j.Slf4j; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.TestMethodOrder; + +import static bisq.apitest.config.BisqAppConfig.alicedaemon; +import static bisq.apitest.config.BisqAppConfig.bobdaemon; +import static bisq.cli.CurrencyFormat.formatSatoshis; +import static bisq.core.trade.Trade.Phase.*; +import static bisq.core.trade.Trade.State.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; +import static protobuf.Offer.State.OFFER_FEE_PAID; +import static protobuf.OpenOffer.State.AVAILABLE; + +@Disabled +@Slf4j +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class TakeSellBTCOfferTest extends AbstractTradeTest { + + // Alice is seller, Bob is buyer. + + @Test + @Order(1) + public void testTakeAlicesSellOffer(final TestInfo testInfo) { + try { + var alicesOffer = createAliceOffer(alicesDummyAcct, + "sell", + "usd", + 12500000); + var offerId = alicesOffer.getId(); + + // Wait for Alice's AddToOfferBook task. + // Wait times vary; my logs show >= 2 second delay, but taking sell offers + // seems to require more time to prepare. + sleep(3000); + assertEquals(1, getOpenOffersCount(bobStubs, "sell", "usd")); + + var trade = takeAlicesOffer(offerId, bobsDummyAcct.getId()); + assertNotNull(trade); + assertEquals(offerId, trade.getTradeId()); + // Cache the trade id for the other tests. + tradeId = trade.getTradeId(); + + genBtcBlocksThenWait(1, 4000); + assertEquals(0, getOpenOffersCount(bobStubs, "sell", "usd")); + + trade = getTrade(bobdaemon, trade.getTradeId()); + EXPECTED_PROTOCOL_STATUS.setState(BUYER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG) + .setPhase(DEPOSIT_PUBLISHED) + .setDepositPublished(true); + verifyExpectedProtocolStatus(trade); + + logTrade(log, testInfo, "Bob's view after taking offer and sending deposit", trade); + + genBtcBlocksThenWait(1, 2250); + trade = getTrade(bobdaemon, trade.getTradeId()); + EXPECTED_PROTOCOL_STATUS.setState(DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN) + .setPhase(DEPOSIT_CONFIRMED) + .setDepositConfirmed(true); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Bob's view after deposit is confirmed", trade); + } catch (StatusRuntimeException e) { + fail(e); + } + } + + @Test + @Order(2) + public void testBobsConfirmPaymentStarted(final TestInfo testInfo) { + try { + var trade = getTrade(bobdaemon, tradeId); + confirmPaymentStarted(bobdaemon, trade.getTradeId()); + sleep(3000); + + trade = getTrade(bobdaemon, tradeId); + // Note: offer.state == available + assertEquals(AVAILABLE.name(), trade.getOffer().getState()); + EXPECTED_PROTOCOL_STATUS.setState(BUYER_SAW_ARRIVED_FIAT_PAYMENT_INITIATED_MSG) + .setPhase(FIAT_SENT) + .setFiatSent(true); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Bob's view after confirming fiat payment sent", trade); + } catch (StatusRuntimeException e) { + fail(e); + } + } + + @Test + @Order(3) + public void testAlicesConfirmPaymentReceived(final TestInfo testInfo) { + var trade = getTrade(alicedaemon, tradeId); + confirmPaymentReceived(alicedaemon, trade.getTradeId()); + sleep(3000); + + trade = getTrade(alicedaemon, tradeId); + assertEquals(OFFER_FEE_PAID.name(), trade.getOffer().getState()); + EXPECTED_PROTOCOL_STATUS.setState(SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG) + .setPhase(PAYOUT_PUBLISHED) + .setPayoutPublished(true) + .setFiatReceived(true); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Alice's view after confirming fiat payment received", trade); + } + + @Test + @Order(4) + public void testBobsBtcWithdrawalToExternalAddress(final TestInfo testInfo) { + genBtcBlocksThenWait(1, 2250); + + var trade = getTrade(bobdaemon, tradeId); + logTrade(log, testInfo, "Bob's view before withdrawing funds to external wallet", trade); + + String toAddress = bitcoinCli.getNewBtcAddress(); + withdrawFunds(bobdaemon, tradeId, toAddress); + + genBtcBlocksThenWait(1, 2250); + + trade = getTrade(bobdaemon, tradeId); + EXPECTED_PROTOCOL_STATUS.setState(WITHDRAW_COMPLETED) + .setPhase(WITHDRAWN) + .setWithdrawn(true); + verifyExpectedProtocolStatus(trade); + logTrade(log, testInfo, "Bob's view after withdrawing funds to external wallet", trade); + log.info("{} Bob's current available balance: {} BTC", + testName(testInfo), + formatSatoshis(getBalance(bobdaemon))); + } +} diff --git a/apitest/src/test/java/bisq/apitest/scenario/FundWalletScenarioTest.java b/apitest/src/test/java/bisq/apitest/scenario/FundWalletScenarioTest.java index 75977949c3..4b7d40f516 100644 --- a/apitest/src/test/java/bisq/apitest/scenario/FundWalletScenarioTest.java +++ b/apitest/src/test/java/bisq/apitest/scenario/FundWalletScenarioTest.java @@ -33,9 +33,13 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; + + +import bisq.apitest.method.MethodTest; + @Slf4j @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class FundWalletScenarioTest extends ScenarioTest { +public class FundWalletScenarioTest extends MethodTest { @BeforeAll public static void setUp() { diff --git a/apitest/src/test/java/bisq/apitest/scenario/OfferTest.java b/apitest/src/test/java/bisq/apitest/scenario/OfferTest.java new file mode 100644 index 0000000000..b01a9486ea --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/scenario/OfferTest.java @@ -0,0 +1,72 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.apitest.scenario; + + +import lombok.extern.slf4j.Slf4j; + +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + + + +import bisq.apitest.method.offer.AbstractOfferTest; +import bisq.apitest.method.offer.CancelOfferTest; +import bisq.apitest.method.offer.CreateOfferUsingFixedPriceTest; +import bisq.apitest.method.offer.CreateOfferUsingMarketPriceMarginTest; +import bisq.apitest.method.offer.ValidateCreateOfferTest; + +@Slf4j +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class OfferTest extends AbstractOfferTest { + + @Test + @Order(1) + public void testAmtTooLargeShouldThrowException() { + ValidateCreateOfferTest test = new ValidateCreateOfferTest(); + test.testAmtTooLargeShouldThrowException(); + } + + @Test + @Order(2) + public void testCancelOffer() { + CancelOfferTest test = new CancelOfferTest(); + test.testCancelOffer(); + } + + @Test + @Order(3) + public void testCreateOfferUsingFixedPrice() { + CreateOfferUsingFixedPriceTest test = new CreateOfferUsingFixedPriceTest(); + test.testCreateAUDBTCBuyOfferUsingFixedPrice16000(); + test.testCreateUSDBTCBuyOfferUsingFixedPrice100001234(); + test.testCreateEURBTCSellOfferUsingFixedPrice95001234(); + } + + @Test + @Order(4) + public void testCreateOfferUsingMarketPriceMargin() { + CreateOfferUsingMarketPriceMarginTest test = new CreateOfferUsingMarketPriceMarginTest(); + test.testCreateUSDBTCBuyOffer5PctPriceMargin(); + test.testCreateNZDBTCBuyOfferMinus2PctPriceMargin(); + test.testCreateGBPBTCSellOfferMinus1Point5PctPriceMargin(); + test.testCreateBRLBTCSellOffer6Point55PctPriceMargin(); + } +} diff --git a/apitest/src/test/java/bisq/apitest/scenario/StartupTest.java b/apitest/src/test/java/bisq/apitest/scenario/StartupTest.java new file mode 100644 index 0000000000..fa81ddff6b --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/scenario/StartupTest.java @@ -0,0 +1,85 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.apitest.scenario; + +import lombok.extern.slf4j.Slf4j; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static bisq.apitest.Scaffold.BitcoinCoreApp.bitcoind; +import static bisq.apitest.config.BisqAppConfig.alicedaemon; +import static bisq.apitest.config.BisqAppConfig.arbdaemon; +import static bisq.apitest.config.BisqAppConfig.seednode; +import static org.junit.jupiter.api.Assertions.fail; + + + +import bisq.apitest.method.CreatePaymentAccountTest; +import bisq.apitest.method.GetVersionTest; +import bisq.apitest.method.MethodTest; +import bisq.apitest.method.RegisterDisputeAgentsTest; + + +@Slf4j +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class StartupTest extends MethodTest { + + @BeforeAll + public static void setUp() { + try { + setUpScaffold(bitcoind, seednode, arbdaemon, alicedaemon); + } catch (Exception ex) { + fail(ex); + } + } + + @Test + @Order(1) + public void testGetVersion() { + GetVersionTest test = new GetVersionTest(); + test.testGetVersion(); + } + + @Test + @Order(2) + public void testRegisterDisputeAgents() { + RegisterDisputeAgentsTest test = new RegisterDisputeAgentsTest(); + test.testRegisterArbitratorShouldThrowException(); + test.testInvalidDisputeAgentTypeArgShouldThrowException(); + test.testInvalidRegistrationKeyArgShouldThrowException(); + test.testRegisterMediator(); + test.testRegisterRefundAgent(); + } + + @Test + @Order(3) + public void testCreatePaymentAccount() { + CreatePaymentAccountTest test = new CreatePaymentAccountTest(); + test.testCreatePerfectMoneyUSDPaymentAccount(); + } + + @AfterAll + public static void tearDown() { + tearDownScaffold(); + } +} diff --git a/apitest/src/test/java/bisq/apitest/scenario/TradeTest.java b/apitest/src/test/java/bisq/apitest/scenario/TradeTest.java new file mode 100644 index 0000000000..4c07452abc --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/scenario/TradeTest.java @@ -0,0 +1,64 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.apitest.scenario; + +import lombok.extern.slf4j.Slf4j; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.TestMethodOrder; + + + +import bisq.apitest.method.trade.AbstractTradeTest; +import bisq.apitest.method.trade.TakeBuyBTCOfferTest; +import bisq.apitest.method.trade.TakeSellBTCOfferTest; + + +@Slf4j +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class TradeTest extends AbstractTradeTest { + + @BeforeEach + public void init() { + EXPECTED_PROTOCOL_STATUS.init(); + } + + @Test + @Order(1) + public void testTakeBuyBTCOffer(final TestInfo testInfo) { + TakeBuyBTCOfferTest test = new TakeBuyBTCOfferTest(); + test.testTakeAlicesBuyOffer(testInfo); + test.testAlicesConfirmPaymentStarted(testInfo); + test.testBobsConfirmPaymentReceived(testInfo); + test.testAlicesKeepFunds(testInfo); + } + + @Test + @Order(2) + public void testTakeSellBTCOffer(final TestInfo testInfo) { + TakeSellBTCOfferTest test = new TakeSellBTCOfferTest(); + test.testTakeAlicesSellOffer(testInfo); + test.testBobsConfirmPaymentStarted(testInfo); + test.testAlicesConfirmPaymentReceived(testInfo); + test.testBobsBtcWithdrawalToExternalAddress(testInfo); + } +} diff --git a/apitest/src/test/java/bisq/apitest/scenario/WalletTest.java b/apitest/src/test/java/bisq/apitest/scenario/WalletTest.java new file mode 100644 index 0000000000..ecd38dc229 --- /dev/null +++ b/apitest/src/test/java/bisq/apitest/scenario/WalletTest.java @@ -0,0 +1,99 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.apitest.scenario; + +import lombok.extern.slf4j.Slf4j; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import static bisq.apitest.Scaffold.BitcoinCoreApp.bitcoind; +import static bisq.apitest.config.BisqAppConfig.alicedaemon; +import static bisq.apitest.config.BisqAppConfig.seednode; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + + + +import bisq.apitest.method.MethodTest; +import bisq.apitest.method.WalletProtectionTest; + +@Slf4j +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class WalletTest extends MethodTest { + + // All tests depend on the DAO / regtest environment, and Alice's wallet is + // initialized with 10 BTC during the scaffolding setup. + + @BeforeAll + public static void setUp() { + try { + setUpScaffold(bitcoind, seednode, alicedaemon); + genBtcBlocksThenWait(1, 1500); + } catch (Exception ex) { + fail(ex); + } + } + + @Test + @Order(1) + public void testFundWallet() { + // The regtest Bisq wallet was initialized with 10 BTC. + long balance = getBalance(alicedaemon); + assertEquals(1000000000, balance); + + String unusedAddress = getUnusedBtcAddress(alicedaemon); + bitcoinCli.sendToAddress(unusedAddress, "2.5"); + + bitcoinCli.generateBlocks(1); + sleep(1500); + + balance = getBalance(alicedaemon); + assertEquals(1250000000L, balance); // new balance is 12.5 btc + } + + @Test + @Order(2) + public void testWalletProtection() { + // Batching all wallet tests in this test case reduces scaffold setup + // time. Here, we create a method WalletProtectionTest instance and run each + // test in declared order. + + WalletProtectionTest walletProtectionTest = new WalletProtectionTest(); + + walletProtectionTest.testSetWalletPassword(); + walletProtectionTest.testGetBalanceOnEncryptedWalletShouldThrowException(); + walletProtectionTest.testUnlockWalletFor4Seconds(); + walletProtectionTest.testGetBalanceAfterUnlockTimeExpiryShouldThrowException(); + walletProtectionTest.testLockWalletBeforeUnlockTimeoutExpiry(); + walletProtectionTest.testLockWalletWhenWalletAlreadyLockedShouldThrowException(); + walletProtectionTest.testUnlockWalletTimeoutOverride(); + walletProtectionTest.testSetNewWalletPassword(); + walletProtectionTest.testSetNewWalletPasswordWithIncorrectNewPasswordShouldThrowException(); + walletProtectionTest.testRemoveNewWalletPassword(); + } + + @AfterAll + public static void tearDown() { + tearDownScaffold(); + } +} diff --git a/build.gradle b/build.gradle index 5591e96069..b93353c507 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ configure(subprojects) { ext { // in alphabetical order bcVersion = '1.63' - bitcoinjVersion = 'a733034' + bitcoinjVersion = '7752cb7' btcdCli4jVersion = '27b94333' codecVersion = '1.13' easybindVersion = '1.0.3' @@ -60,7 +60,7 @@ configure(subprojects) { joptVersion = '5.0.4' jsonsimpleVersion = '1.1.1' junitVersion = '4.12' - jupiterVersion = '5.3.2' + jupiterVersion = '5.7.0' kotlinVersion = '1.3.41' knowmXchangeVersion = '4.4.2' langVersion = '3.11' @@ -104,6 +104,7 @@ configure([project(':cli'), project(':seednode'), project(':statsnode'), project(':pricenode'), + project(':inventory'), project(':apitest')]) { apply plugin: 'application' @@ -276,10 +277,10 @@ configure(project(':common')) { configure(project(':p2p')) { dependencies { compile project(':common') - compile("com.github.cd2357.netlayer:tor.native:$netlayerVersion") { + compile("com.github.bisq-network.netlayer:tor.native:$netlayerVersion") { exclude(module: 'slf4j-api') } - compile("com.github.cd2357.netlayer:tor.external:$netlayerVersion") { + compile("com.github.bisq-network.netlayer:tor.external:$netlayerVersion") { exclude(module: 'slf4j-api') } implementation("org.apache.httpcomponents:httpclient:$httpclientVersion") { @@ -391,7 +392,7 @@ configure(project(':desktop')) { apply from: '../gradle/witness/gradle-witness.gradle' apply from: 'package/package.gradle' - version = '1.4.2-SNAPSHOT' + version = '1.5.0-SNAPSHOT' jar.manifest.attributes( "Implementation-Title": project.name, @@ -604,6 +605,21 @@ configure(project(':daemon')) { } } +configure(project(':inventory')) { + apply plugin: 'com.github.johnrengelman.shadow' + + mainClassName = 'bisq.inventory.InventoryMonitorMain' + + dependencies { + compile project(':core') + compile "com.google.guava:guava:$guavaVersion" + compile "com.sparkjava:spark-core:$sparkVersion" + + compileOnly "org.projectlombok:lombok:$lombokVersion" + annotationProcessor "org.projectlombok:lombok:$lombokVersion" + } +} + configure(project(':apitest')) { mainClassName = 'bisq.apitest.ApiTestMain' @@ -637,8 +653,31 @@ configure(project(':apitest')) { test { useJUnitPlatform() + outputs.upToDateWhen { false } // Don't use previously cached test outputs. testLogging { - events "passed", "skipped", "failed" + showStackTraces = true // Show full stack traces in the console. + exceptionFormat = "full" + // Show passed & failed tests, and anything printed to stderr by the tests in the console. + // Do not show skipped tests in the console; they are shown in the html report. + events "passed", "failed", "standardError" + } + + afterSuite { desc, result -> + if (!desc.parent) { + println("${result.resultType} " + + "[${result.testCount} tests, " + + "${result.successfulTestCount} passed, " + + "${result.failedTestCount} failed, " + + "${result.skippedTestCount} skipped] html report contains skipped test info") + + // Show report link if all tests passed in case you want to see more detail, stdout, skipped, etc. + if(result.resultType == TestResult.ResultType.SUCCESS) { + DirectoryReport htmlReport = getReports().getHtml() + String reportUrl = new org.gradle.internal.logging.ConsoleRenderer() + .asClickableFileUrl(htmlReport.getEntryPoint()) + println("REPORT " + reportUrl) + } + } } } @@ -668,12 +707,12 @@ configure(project(':apitest')) { compileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" - testCompile "org.junit.jupiter:junit-jupiter-api:5.6.2" - testCompile "org.junit.jupiter:junit-jupiter-params:5.6.2" + testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" + testImplementation "org.junit.jupiter:junit-jupiter-params:$jupiterVersion" + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$jupiterVersion") testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testRuntime "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" - testRuntime("org.junit.jupiter:junit-jupiter-engine:5.6.2") } } diff --git a/cli/src/main/java/bisq/cli/CliMain.java b/cli/src/main/java/bisq/cli/CliMain.java index 9b73e56028..ec0e5e71bb 100644 --- a/cli/src/main/java/bisq/cli/CliMain.java +++ b/cli/src/main/java/bisq/cli/CliMain.java @@ -17,6 +17,9 @@ package bisq.cli; +import bisq.proto.grpc.CancelOfferRequest; +import bisq.proto.grpc.ConfirmPaymentReceivedRequest; +import bisq.proto.grpc.ConfirmPaymentStartedRequest; import bisq.proto.grpc.CreateOfferRequest; import bisq.proto.grpc.CreatePaymentAccountRequest; import bisq.proto.grpc.GetAddressBalanceRequest; @@ -25,12 +28,16 @@ import bisq.proto.grpc.GetFundingAddressesRequest; import bisq.proto.grpc.GetOfferRequest; import bisq.proto.grpc.GetOffersRequest; import bisq.proto.grpc.GetPaymentAccountsRequest; +import bisq.proto.grpc.GetTradeRequest; import bisq.proto.grpc.GetVersionRequest; +import bisq.proto.grpc.KeepFundsRequest; import bisq.proto.grpc.LockWalletRequest; import bisq.proto.grpc.RegisterDisputeAgentRequest; import bisq.proto.grpc.RemoveWalletPasswordRequest; import bisq.proto.grpc.SetWalletPasswordRequest; +import bisq.proto.grpc.TakeOfferRequest; import bisq.proto.grpc.UnlockWalletRequest; +import bisq.proto.grpc.WithdrawFundsRequest; import io.grpc.StatusRuntimeException; @@ -68,8 +75,15 @@ public class CliMain { private enum Method { createoffer, + canceloffer, getoffer, getoffers, + takeoffer, + gettrade, + confirmpaymentstarted, + confirmpaymentreceived, + keepfunds, + withdrawfunds, createpaymentacct, getpaymentaccts, getversion, @@ -154,9 +168,10 @@ public class CliMain { GrpcStubs grpcStubs = new GrpcStubs(host, port, password); var disputeAgentsService = grpcStubs.disputeAgentsService; - var versionService = grpcStubs.versionService; var offersService = grpcStubs.offersService; var paymentAccountsService = grpcStubs.paymentAccountsService; + var tradesService = grpcStubs.tradesService; + var versionService = grpcStubs.versionService; var walletsService = grpcStubs.walletsService; try { @@ -225,6 +240,18 @@ public class CliMain { out.println(formatOfferTable(singletonList(reply.getOffer()), currencyCode)); return; } + case canceloffer: { + if (nonOptionArgs.size() < 2) + throw new IllegalArgumentException("incorrect parameter count, expecting offer id"); + + var offerId = nonOptionArgs.get(1); + var request = CancelOfferRequest.newBuilder() + .setId(offerId) + .build(); + offersService.cancelOffer(request); + out.println("offer canceled and removed from offer book"); + return; + } case getoffer: { if (nonOptionArgs.size() < 2) throw new IllegalArgumentException("incorrect parameter count, expecting offer id"); @@ -254,6 +281,89 @@ public class CliMain { out.println(formatOfferTable(reply.getOffersList(), currencyCode)); return; } + case takeoffer: { + if (nonOptionArgs.size() < 3) + throw new IllegalArgumentException("incorrect parameter count, expecting offer id, payment acct id"); + + var offerId = nonOptionArgs.get(1); + var paymentAccountId = nonOptionArgs.get(2); + var request = TakeOfferRequest.newBuilder() + .setOfferId(offerId) + .setPaymentAccountId(paymentAccountId) + .build(); + var reply = tradesService.takeOffer(request); + out.printf("trade '%s' successfully taken", reply.getTrade().getShortId()); + return; + } + case gettrade: { + if (nonOptionArgs.size() < 2) + throw new IllegalArgumentException("incorrect parameter count, expecting trade id, [,showcontract = true|false]"); + + var tradeId = nonOptionArgs.get(1); + var showContract = false; + if (nonOptionArgs.size() == 3) + showContract = Boolean.getBoolean(nonOptionArgs.get(2)); + + var request = GetTradeRequest.newBuilder() + .setTradeId(tradeId) + .build(); + var reply = tradesService.getTrade(request); + if (showContract) + out.println(reply.getTrade().getContractAsJson()); + else + out.println(TradeFormat.format(reply.getTrade())); + return; + } + case confirmpaymentstarted: { + if (nonOptionArgs.size() < 2) + throw new IllegalArgumentException("incorrect parameter count, expecting trade id"); + + var tradeId = nonOptionArgs.get(1); + var request = ConfirmPaymentStartedRequest.newBuilder() + .setTradeId(tradeId) + .build(); + tradesService.confirmPaymentStarted(request); + out.printf("trade '%s' payment started message sent", tradeId); + return; + } + case confirmpaymentreceived: { + if (nonOptionArgs.size() < 2) + throw new IllegalArgumentException("incorrect parameter count, expecting trade id"); + + var tradeId = nonOptionArgs.get(1); + var request = ConfirmPaymentReceivedRequest.newBuilder() + .setTradeId(tradeId) + .build(); + tradesService.confirmPaymentReceived(request); + out.printf("trade '%s' payment received message sent", tradeId); + return; + } + case keepfunds: { + if (nonOptionArgs.size() < 2) + throw new IllegalArgumentException("incorrect parameter count, expecting trade id"); + + var tradeId = nonOptionArgs.get(1); + var request = KeepFundsRequest.newBuilder() + .setTradeId(tradeId) + .build(); + tradesService.keepFunds(request); + out.printf("funds from trade '%s' saved in bisq wallet", tradeId); + return; + } + case withdrawfunds: { + if (nonOptionArgs.size() < 3) + throw new IllegalArgumentException("incorrect parameter count, expecting trade id, bitcoin wallet address"); + + var tradeId = nonOptionArgs.get(1); + var address = nonOptionArgs.get(2); + var request = WithdrawFundsRequest.newBuilder() + .setTradeId(tradeId) + .setAddress(address) + .build(); + tradesService.withdrawFunds(request); + out.printf("funds from trade '%s' sent to btc address '%s'", tradeId, address); + return; + } case createpaymentacct: { if (nonOptionArgs.size() < 5) throw new IllegalArgumentException( @@ -379,8 +489,15 @@ public class CliMain { stream.format(rowFormat, "", "amount (btc), min amount, use mkt based price, \\", ""); stream.format(rowFormat, "", "fixed price (btc) | mkt price margin (%), \\", ""); stream.format(rowFormat, "", "security deposit (%)", ""); + stream.format(rowFormat, "canceloffer", "offer id", "Cancel offer with id"); stream.format(rowFormat, "getoffer", "offer id", "Get current offer with id"); stream.format(rowFormat, "getoffers", "buy | sell, currency code", "Get current offers"); + stream.format(rowFormat, "takeoffer", "offer id", "Take offer with id"); + stream.format(rowFormat, "gettrade", "trade id [,showcontract]", "Get trade summary or full contract"); + stream.format(rowFormat, "confirmpaymentstarted", "trade id", "Confirm payment started"); + stream.format(rowFormat, "confirmpaymentreceived", "trade id", "Confirm payment received"); + stream.format(rowFormat, "keepfunds", "trade id", "Keep received funds in Bisq wallet"); + stream.format(rowFormat, "withdrawfunds", "trade id, bitcoin wallet address", "Withdraw received funds to external wallet address"); stream.format(rowFormat, "createpaymentacct", "account name, account number, currency code", "Create PerfectMoney dummy account"); stream.format(rowFormat, "getpaymentaccts", "", "Get user payment accounts"); stream.format(rowFormat, "lockwallet", "", "Remove wallet password from memory, locking the wallet"); diff --git a/cli/src/main/java/bisq/cli/ColumnHeaderConstants.java b/cli/src/main/java/bisq/cli/ColumnHeaderConstants.java new file mode 100644 index 0000000000..03500e4f47 --- /dev/null +++ b/cli/src/main/java/bisq/cli/ColumnHeaderConstants.java @@ -0,0 +1,55 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.cli; + +import static com.google.common.base.Strings.padEnd; +import static com.google.common.base.Strings.padStart; + +class ColumnHeaderConstants { + + // For inserting 2 spaces between column headers. + static final String COL_HEADER_DELIMITER = " "; + + // Table column header format specs, right padded with two spaces. In some cases + // such as COL_HEADER_CREATION_DATE, COL_HEADER_VOLUME and COL_HEADER_UUID, the + // expected max data string length is accounted for. In others, the column header length + // are expected to be greater than any column value length. + static final String COL_HEADER_ADDRESS = padEnd("Address", 34, ' '); + static final String COL_HEADER_AMOUNT = padEnd("BTC(min - max)", 24, ' '); + static final String COL_HEADER_BALANCE = padStart("Balance", 12, ' '); + static final String COL_HEADER_CONFIRMATIONS = "Confirmations"; + static final String COL_HEADER_CREATION_DATE = padEnd("Creation Date (UTC)", 20, ' '); + static final String COL_HEADER_CURRENCY = "Currency"; + static final String COL_HEADER_DIRECTION = "Buy/Sell"; + static final String COL_HEADER_NAME = "Name"; + static final String COL_HEADER_PAYMENT_METHOD = "Payment Method"; + static final String COL_HEADER_PRICE = "Price in %-3s for 1 BTC"; + static final String COL_HEADER_TRADE_AMOUNT = padStart("Amount(%-3s)", 12, ' '); + static final String COL_HEADER_TRADE_DEPOSIT_CONFIRMED = "Deposit Confirmed"; + static final String COL_HEADER_TRADE_DEPOSIT_PUBLISHED = "Deposit Published"; + static final String COL_HEADER_TRADE_FIAT_SENT = "Fiat Sent"; + static final String COL_HEADER_TRADE_FIAT_RECEIVED = "Fiat Received"; + static final String COL_HEADER_TRADE_PAYOUT_PUBLISHED = "Payout Published"; + static final String COL_HEADER_TRADE_WITHDRAWN = "Withdrawn"; + static final String COL_HEADER_TRADE_ROLE = "My Role"; + static final String COL_HEADER_TRADE_SHORT_ID = "ID"; + static final String COL_HEADER_TRADE_TX_FEE = "Tx Fee(%-3s)"; + static final String COL_HEADER_TRADE_TAKER_FEE = "Taker Fee(%-3s)"; + static final String COL_HEADER_VOLUME = padEnd("%-3s(min - max)", 15, ' '); + static final String COL_HEADER_UUID = padEnd("ID", 52, ' '); +} diff --git a/cli/src/main/java/bisq/cli/CurrencyFormat.java b/cli/src/main/java/bisq/cli/CurrencyFormat.java index 798af169d4..e4d8f89c6c 100644 --- a/cli/src/main/java/bisq/cli/CurrencyFormat.java +++ b/cli/src/main/java/bisq/cli/CurrencyFormat.java @@ -17,6 +17,8 @@ package bisq.cli; +import com.google.common.annotations.VisibleForTesting; + import java.text.DecimalFormat; import java.text.NumberFormat; @@ -27,15 +29,17 @@ import java.util.Locale; import static java.lang.String.format; -class CurrencyFormat { +@VisibleForTesting +public class CurrencyFormat { private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(Locale.US); static final BigDecimal SATOSHI_DIVISOR = new BigDecimal(100000000); static final DecimalFormat BTC_FORMAT = new DecimalFormat("###,##0.00000000"); + @VisibleForTesting @SuppressWarnings("BigDecimalMethodWithoutRoundingCalled") - static String formatSatoshis(long sats) { + public static String formatSatoshis(long sats) { return BTC_FORMAT.format(BigDecimal.valueOf(sats).divide(SATOSHI_DIVISOR)); } diff --git a/cli/src/main/java/bisq/cli/GrpcStubs.java b/cli/src/main/java/bisq/cli/GrpcStubs.java index 0e5835a278..2db33fcbaa 100644 --- a/cli/src/main/java/bisq/cli/GrpcStubs.java +++ b/cli/src/main/java/bisq/cli/GrpcStubs.java @@ -22,6 +22,7 @@ import bisq.proto.grpc.GetVersionGrpc; import bisq.proto.grpc.OffersGrpc; import bisq.proto.grpc.PaymentAccountsGrpc; import bisq.proto.grpc.PriceGrpc; +import bisq.proto.grpc.TradesGrpc; import bisq.proto.grpc.WalletsGrpc; import io.grpc.CallCredentials; @@ -36,6 +37,7 @@ public class GrpcStubs { public final OffersGrpc.OffersBlockingStub offersService; public final PaymentAccountsGrpc.PaymentAccountsBlockingStub paymentAccountsService; public final PriceGrpc.PriceBlockingStub priceService; + public final TradesGrpc.TradesBlockingStub tradesService; public final WalletsGrpc.WalletsBlockingStub walletsService; public GrpcStubs(String apiHost, int apiPort, String apiPassword) { @@ -55,6 +57,7 @@ public class GrpcStubs { this.offersService = OffersGrpc.newBlockingStub(channel).withCallCredentials(credentials); this.paymentAccountsService = PaymentAccountsGrpc.newBlockingStub(channel).withCallCredentials(credentials); this.priceService = PriceGrpc.newBlockingStub(channel).withCallCredentials(credentials); + this.tradesService = TradesGrpc.newBlockingStub(channel).withCallCredentials(credentials); this.walletsService = WalletsGrpc.newBlockingStub(channel).withCallCredentials(credentials); } } diff --git a/cli/src/main/java/bisq/cli/TableFormat.java b/cli/src/main/java/bisq/cli/TableFormat.java index 7d02af562f..8336fff9ba 100644 --- a/cli/src/main/java/bisq/cli/TableFormat.java +++ b/cli/src/main/java/bisq/cli/TableFormat.java @@ -29,12 +29,12 @@ import java.util.List; import java.util.TimeZone; import java.util.stream.Collectors; +import static bisq.cli.ColumnHeaderConstants.*; import static bisq.cli.CurrencyFormat.formatAmountRange; import static bisq.cli.CurrencyFormat.formatOfferPrice; import static bisq.cli.CurrencyFormat.formatSatoshis; import static bisq.cli.CurrencyFormat.formatVolumeRange; import static com.google.common.base.Strings.padEnd; -import static com.google.common.base.Strings.padStart; import static java.lang.String.format; import static java.util.Collections.max; import static java.util.Comparator.comparing; @@ -42,28 +42,8 @@ import static java.util.TimeZone.getTimeZone; class TableFormat { - private static final TimeZone TZ_UTC = getTimeZone("UTC"); - private static final SimpleDateFormat DATE_FORMAT_ISO_8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - - // For inserting 2 spaces between column headers. - private static final String COL_HEADER_DELIMITER = " "; - - // Table column header format specs, right padded with two spaces. In some cases - // such as COL_HEADER_CREATION_DATE, COL_HEADER_VOLUME and COL_HEADER_UUID, the - // expected max data string length is accounted for. In others, the column header length - // are expected to be greater than any column value length. - private static final String COL_HEADER_ADDRESS = padEnd("Address", 34, ' '); - private static final String COL_HEADER_AMOUNT = padEnd("BTC(min - max)", 24, ' '); - private static final String COL_HEADER_BALANCE = padStart("Balance", 12, ' '); - private static final String COL_HEADER_CONFIRMATIONS = "Confirmations"; - private static final String COL_HEADER_CREATION_DATE = padEnd("Creation Date (UTC)", 20, ' '); - private static final String COL_HEADER_CURRENCY = "Currency"; - private static final String COL_HEADER_DIRECTION = "Buy/Sell"; // TODO "Take Offer to - private static final String COL_HEADER_NAME = "Name"; - private static final String COL_HEADER_PAYMENT_METHOD = "Payment Method"; - private static final String COL_HEADER_PRICE = "Price in %-3s for 1 BTC"; - private static final String COL_HEADER_VOLUME = padEnd("%-3s(min - max)", 15, ' '); - private static final String COL_HEADER_UUID = padEnd("ID", 52, ' '); + static final TimeZone TZ_UTC = getTimeZone("UTC"); + static final SimpleDateFormat DATE_FORMAT_ISO_8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); static String formatAddressBalanceTbl(List addressBalanceInfo) { String headerLine = (COL_HEADER_ADDRESS + COL_HEADER_DELIMITER @@ -83,7 +63,7 @@ class TableFormat { static String formatOfferTable(List offerInfo, String fiatCurrency) { - // Some column values might be longer than header, so we need to calculated them. + // Some column values might be longer than header, so we need to calculate them. int paymentMethodColWidth = getLengthOfLongestColumn( COL_HEADER_PAYMENT_METHOD.length(), offerInfo.stream() @@ -120,7 +100,7 @@ class TableFormat { } static String formatPaymentAcctTbl(List paymentAccounts) { - // Some column values might be longer than header, so we need to calculated them. + // Some column values might be longer than header, so we need to calculate them. int nameColWidth = getLengthOfLongestColumn( COL_HEADER_NAME.length(), paymentAccounts.stream().map(PaymentAccount::getAccountName) diff --git a/cli/src/main/java/bisq/cli/TradeFormat.java b/cli/src/main/java/bisq/cli/TradeFormat.java new file mode 100644 index 0000000000..2a28c1dccc --- /dev/null +++ b/cli/src/main/java/bisq/cli/TradeFormat.java @@ -0,0 +1,118 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.cli; + +import bisq.proto.grpc.TradeInfo; + +import com.google.common.annotations.VisibleForTesting; + +import java.util.function.Supplier; + +import static bisq.cli.ColumnHeaderConstants.*; +import static bisq.cli.CurrencyFormat.formatOfferPrice; +import static bisq.cli.CurrencyFormat.formatSatoshis; +import static com.google.common.base.Strings.padEnd; + +@VisibleForTesting +public class TradeFormat { + + @VisibleForTesting + public static String format(TradeInfo tradeInfo) { + // Some column values might be longer than header, so we need to calculate them. + int shortIdColWidth = Math.max(COL_HEADER_TRADE_SHORT_ID.length(), tradeInfo.getShortId().length()); + int roleColWidth = Math.max(COL_HEADER_TRADE_ROLE.length(), tradeInfo.getRole().length()); + + // We only show taker fee under its header when user is the taker. + boolean isTaker = tradeInfo.getRole().toLowerCase().contains("taker"); + Supplier takerFeeHeaderFormat = () -> isTaker ? + padEnd(COL_HEADER_TRADE_TAKER_FEE, 12, ' ') + COL_HEADER_DELIMITER + : ""; + Supplier takerFeeHeader = () -> isTaker ? + "%" + (COL_HEADER_TRADE_TAKER_FEE.length() + 1) + "s" + : ""; + + String headersFormat = padEnd(COL_HEADER_TRADE_SHORT_ID, shortIdColWidth, ' ') + COL_HEADER_DELIMITER + + padEnd(COL_HEADER_TRADE_ROLE, roleColWidth, ' ') + COL_HEADER_DELIMITER + + COL_HEADER_PRICE + COL_HEADER_DELIMITER // includes %s -> currencyCode + + padEnd(COL_HEADER_TRADE_AMOUNT, 12, ' ') + COL_HEADER_DELIMITER + + padEnd(COL_HEADER_TRADE_TX_FEE, 12, ' ') + COL_HEADER_DELIMITER + + takerFeeHeaderFormat.get() + + COL_HEADER_TRADE_DEPOSIT_PUBLISHED + COL_HEADER_DELIMITER + + COL_HEADER_TRADE_DEPOSIT_CONFIRMED + COL_HEADER_DELIMITER + + COL_HEADER_TRADE_FIAT_SENT + COL_HEADER_DELIMITER + + COL_HEADER_TRADE_FIAT_RECEIVED + COL_HEADER_DELIMITER + + COL_HEADER_TRADE_PAYOUT_PUBLISHED + COL_HEADER_DELIMITER + + COL_HEADER_TRADE_WITHDRAWN + COL_HEADER_DELIMITER + + "%n"; + + String counterCurrencyCode = tradeInfo.getOffer().getCounterCurrencyCode(); + String baseCurrencyCode = tradeInfo.getOffer().getBaseCurrencyCode(); + String headerLine = isTaker + ? String.format(headersFormat, counterCurrencyCode, baseCurrencyCode, baseCurrencyCode, baseCurrencyCode) + : String.format(headersFormat, counterCurrencyCode, baseCurrencyCode, baseCurrencyCode); + + String colDataFormat = "%-" + shortIdColWidth + "s" // left justify + + " %-" + (roleColWidth + COL_HEADER_DELIMITER.length()) + "s" // left justify + + "%" + (COL_HEADER_PRICE.length() - 1) + "s" // right justify + + "%" + (COL_HEADER_TRADE_AMOUNT.length() + 1) + "s" // right justify + + "%" + (COL_HEADER_TRADE_TX_FEE.length() + 1) + "s" // right justify + + takerFeeHeader.get() // right justify + + " %-" + COL_HEADER_TRADE_DEPOSIT_PUBLISHED.length() + "s" // left justify + + " %-" + COL_HEADER_TRADE_DEPOSIT_CONFIRMED.length() + "s" // left justify + + " %-" + COL_HEADER_TRADE_FIAT_SENT.length() + "s" // left justify + + " %-" + COL_HEADER_TRADE_FIAT_RECEIVED.length() + "s" // left justify + + " %-" + COL_HEADER_TRADE_PAYOUT_PUBLISHED.length() + "s" // left justify + + " %-" + COL_HEADER_TRADE_WITHDRAWN.length() + "s"; // left justify + + return headerLine + + (isTaker + ? formatTradeForTaker(colDataFormat, tradeInfo) + : formatTradeForMaker(colDataFormat, tradeInfo)); + } + + private static String formatTradeForMaker(String format, TradeInfo tradeInfo) { + return String.format(format, + tradeInfo.getShortId(), + tradeInfo.getRole(), + formatOfferPrice(tradeInfo.getTradePrice()), + formatSatoshis(tradeInfo.getTradeAmountAsLong()), + formatSatoshis(tradeInfo.getTxFeeAsLong()), + tradeInfo.getIsDepositPublished() ? "YES" : "NO", + tradeInfo.getIsDepositConfirmed() ? "YES" : "NO", + tradeInfo.getIsFiatSent() ? "YES" : "NO", + tradeInfo.getIsFiatReceived() ? "YES" : "NO", + tradeInfo.getIsPayoutPublished() ? "YES" : "NO", + tradeInfo.getIsWithdrawn() ? "YES" : "NO"); + } + + private static String formatTradeForTaker(String format, TradeInfo tradeInfo) { + return String.format(format, + tradeInfo.getShortId(), + tradeInfo.getRole(), + formatOfferPrice(tradeInfo.getTradePrice()), + formatSatoshis(tradeInfo.getTradeAmountAsLong()), + formatSatoshis(tradeInfo.getTxFeeAsLong()), + formatSatoshis(tradeInfo.getTakerFeeAsLong()), + tradeInfo.getIsDepositPublished() ? "YES" : "NO", + tradeInfo.getIsDepositConfirmed() ? "YES" : "NO", + tradeInfo.getIsFiatSent() ? "YES" : "NO", + tradeInfo.getIsFiatReceived() ? "YES" : "NO", + tradeInfo.getIsPayoutPublished() ? "YES" : "NO", + tradeInfo.getIsWithdrawn() ? "YES" : "NO"); + } +} diff --git a/common/src/main/java/bisq/common/app/Version.java b/common/src/main/java/bisq/common/app/Version.java index 932fc6c1bc..470d026356 100644 --- a/common/src/main/java/bisq/common/app/Version.java +++ b/common/src/main/java/bisq/common/app/Version.java @@ -30,14 +30,14 @@ public class Version { // VERSION = 0.5.0 introduces proto buffer for the P2P network and local DB and is a not backward compatible update // Therefore all sub versions start again with 1 // We use semantic versioning with major, minor and patch - public static final String VERSION = "1.4.2"; + public static final String VERSION = "1.5.0"; /** * Holds a list of the tagged resource files for optimizing the getData requests. * This must not contain each version but only those where we add new version-tagged resource files for * historical data stores. */ - public static final List HISTORICAL_RESOURCE_FILE_VERSION_TAGS = Arrays.asList("1.4.0"); + public static final List HISTORICAL_RESOURCE_FILE_VERSION_TAGS = Arrays.asList("1.4.0", "1.5.0"); public static int getMajorVersion(String version) { return getSubVersion(version, 0); @@ -92,10 +92,13 @@ public class Version { // The version no. of the current protocol. The offer holds that version. // A taker will check the version of the offers to see if his version is compatible. - // Offers created with the old version will become invalid and have to be canceled. + // For the switch to version 2, offers created with the old version will become invalid and have to be canceled. + // For the switch to version 3, offers created with the old version can be migrated to version 3 just by opening + // the Bisq app. // VERSION = 0.5.0 -> TRADE_PROTOCOL_VERSION = 1 // Version 1.2.2 -> TRADE_PROTOCOL_VERSION = 2 - public static final int TRADE_PROTOCOL_VERSION = 2; + // Version 1.5.0 -> TRADE_PROTOCOL_VERSION = 3 + public static final int TRADE_PROTOCOL_VERSION = 3; private static int p2pMessageVersion; public static final String BSQ_TX_VERSION = "1"; diff --git a/common/src/main/java/bisq/common/config/BaseCurrencyNetwork.java b/common/src/main/java/bisq/common/config/BaseCurrencyNetwork.java index c7989e8c88..419cbc0990 100644 --- a/common/src/main/java/bisq/common/config/BaseCurrencyNetwork.java +++ b/common/src/main/java/bisq/common/config/BaseCurrencyNetwork.java @@ -72,7 +72,7 @@ public enum BaseCurrencyNetwork { return "BTC_REGTEST".equals(name()); } - public long getDefaultMinFeePerByte() { + public long getDefaultMinFeePerVbyte() { return 2; } } diff --git a/common/src/main/java/bisq/common/persistence/PersistenceManager.java b/common/src/main/java/bisq/common/persistence/PersistenceManager.java index 6cdf98c966..214b6b8768 100644 --- a/common/src/main/java/bisq/common/persistence/PersistenceManager.java +++ b/common/src/main/java/bisq/common/persistence/PersistenceManager.java @@ -44,7 +44,9 @@ import java.util.HashSet; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -79,43 +81,59 @@ public class PersistenceManager { /////////////////////////////////////////////////////////////////////////////////////////// public static final Map> ALL_PERSISTENCE_MANAGERS = new HashMap<>(); + public static boolean FLUSH_ALL_DATA_TO_DISK_CALLED = false; - // We don't know from which thread we are called so we map back to user thread + + // We require being called only once from the global shutdown routine. As the shutdown routine has a timeout + // and error condition where we call the method as well beside the standard path and it could be that those + // alternative code paths call our method after it was called already, so it is a valid but rare case. + // We add a guard to prevent repeated calls. public static void flushAllDataToDisk(ResultHandler completeHandler) { - log.info("Start flushAllDataToDisk at shutdown"); - AtomicInteger openInstances = new AtomicInteger(ALL_PERSISTENCE_MANAGERS.size()); + // We don't know from which thread we are called so we map to user thread + UserThread.execute(() -> { + if (FLUSH_ALL_DATA_TO_DISK_CALLED) { + log.warn("We got flushAllDataToDisk called again. This can happen in some rare cases. We ignore the repeated call."); + return; + } - if (openInstances.get() == 0) { - log.info("flushAllDataToDisk completed"); - UserThread.execute(completeHandler::handleResult); - } + FLUSH_ALL_DATA_TO_DISK_CALLED = true; - new HashSet<>(ALL_PERSISTENCE_MANAGERS.values()).forEach(persistenceManager -> { - // For Priority.HIGH data we want to write to disk in any case to be on the safe side if we might have missed - // a requestPersistence call after an important state update. Those are usually rather small data stores. - // Otherwise we only persist if requestPersistence was called since the last persist call. - if (persistenceManager.source.flushAtShutDown || persistenceManager.persistenceRequested) { - // We don't know from which thread we are called so we map back to user thread when calling persistNow - UserThread.execute(() -> { + log.info("Start flushAllDataToDisk at shutdown"); + AtomicInteger openInstances = new AtomicInteger(ALL_PERSISTENCE_MANAGERS.size()); + + if (openInstances.get() == 0) { + log.info("No PersistenceManager instances have been created yet."); + completeHandler.handleResult(); + } + + new HashSet<>(ALL_PERSISTENCE_MANAGERS.values()).forEach(persistenceManager -> { + // For Priority.HIGH data we want to write to disk in any case to be on the safe side if we might have missed + // a requestPersistence call after an important state update. Those are usually rather small data stores. + // Otherwise we only persist if requestPersistence was called since the last persist call. + if (persistenceManager.source.flushAtShutDown || persistenceManager.persistenceRequested) { // We always get our completeHandler called even if exceptions happen. In case a file write fails // we still call our shutdown and count down routine as the completeHandler is triggered in any case. + + // We get our result handler called from the write thread so we map back to user thread. persistenceManager.persistNow(() -> - onWriteCompleted(completeHandler, openInstances, persistenceManager)); - }); - } else { - onWriteCompleted(completeHandler, openInstances, persistenceManager); - } + UserThread.execute(() -> onWriteCompleted(completeHandler, openInstances, persistenceManager))); + } else { + onWriteCompleted(completeHandler, openInstances, persistenceManager); + } + }); }); } + // We get called always from user thread here. private static void onWriteCompleted(ResultHandler completeHandler, AtomicInteger openInstances, PersistenceManager persistenceManager) { persistenceManager.shutdown(); if (openInstances.decrementAndGet() == 0) { log.info("flushAllDataToDisk completed"); - UserThread.execute(completeHandler::handleResult); + completeHandler.handleResult(); } + } @@ -125,25 +143,25 @@ public class PersistenceManager { public enum Source { // For data stores we received from the network and which could be rebuilt. We store only for avoiding too much network traffic. - NETWORK(1, TimeUnit.HOURS.toSeconds(1), false), + NETWORK(1, TimeUnit.MINUTES.toMillis(5), false), // For data stores which are created from private local data. This data could only be rebuilt from backup files. - PRIVATE(10, TimeUnit.SECONDS.toSeconds(30), true), + PRIVATE(10, 200, true), - // For data stores which are created from private local data. Loss of that data would not have any critical consequences. - PRIVATE_LOW_PRIO(4, TimeUnit.HOURS.toSeconds(2), false); + // For data stores which are created from private local data. Loss of that data would not have critical consequences. + PRIVATE_LOW_PRIO(4, TimeUnit.MINUTES.toMillis(1), false); @Getter private final int numMaxBackupFiles; @Getter - private final long delayInSec; + private final long delay; @Getter private final boolean flushAtShutDown; - Source(int numMaxBackupFiles, long delayInSec, boolean flushAtShutDown) { + Source(int numMaxBackupFiles, long delay, boolean flushAtShutDown) { this.numMaxBackupFiles = numMaxBackupFiles; - this.delayInSec = delayInSec; + this.delay = delay; this.flushAtShutDown = flushAtShutDown; } } @@ -165,6 +183,7 @@ public class PersistenceManager { @Nullable private Timer timer; private ExecutorService writeToDiskExecutor; + public final AtomicBoolean initCalled = new AtomicBoolean(false); /////////////////////////////////////////////////////////////////////////////////////////// @@ -189,6 +208,29 @@ public class PersistenceManager { } public void initialize(T persistable, String fileName, Source source) { + if (FLUSH_ALL_DATA_TO_DISK_CALLED) { + log.warn("We have started the shut down routine already. We ignore that initialize call."); + return; + } + + if (ALL_PERSISTENCE_MANAGERS.containsKey(fileName)) { + RuntimeException runtimeException = new RuntimeException("We must not create multiple " + + "PersistenceManager instances for file " + fileName + "."); + // We want to get logged from where we have been called so lets print the stack trace. + runtimeException.printStackTrace(); + throw runtimeException; + } + + if (initCalled.get()) { + RuntimeException runtimeException = new RuntimeException("We must not call initialize multiple times. " + + "PersistenceManager for file: " + fileName + "."); + // We want to get logged from where we have been called so lets print the stack trace. + runtimeException.printStackTrace(); + throw runtimeException; + } + + initCalled.set(true); + this.persistable = persistable; this.fileName = fileName; this.source = source; @@ -213,16 +255,54 @@ public class PersistenceManager { // Reading file /////////////////////////////////////////////////////////////////////////////////////////// + /** + * Read persisted file in a thread. + * + * @param resultHandler Consumer of persisted data once it was read from disk. + * @param orElse Called if no file exists or reading of file failed. + */ + public void readPersisted(Consumer resultHandler, Runnable orElse) { + readPersisted(checkNotNull(fileName), resultHandler, orElse); + } + + /** + * Read persisted file in a thread. + * We map result handler calls to UserThread, so clients don't need to worry about threading + * + * @param fileName File name of our persisted data. + * @param resultHandler Consumer of persisted data once it was read from disk. + * @param orElse Called if no file exists or reading of file failed. + */ + public void readPersisted(String fileName, Consumer resultHandler, Runnable orElse) { + if (FLUSH_ALL_DATA_TO_DISK_CALLED) { + log.warn("We have started the shut down routine already. We ignore that readPersisted call."); + return; + } + + new Thread(() -> { + T persisted = getPersisted(fileName); + if (persisted != null) { + UserThread.execute(() -> resultHandler.accept(persisted)); + } else { + UserThread.execute(orElse); + } + }, "PersistenceManager-read-" + fileName).start(); + } + + // API for synchronous reading of data. Not recommended to be used in application code. + // Currently used by tests and monitor. Should be converted to the threaded API as well. @Nullable public T getPersisted() { return getPersisted(checkNotNull(fileName)); } - //TODO use threading here instead in the clients - // We get called at startup either by readAllPersisted or readFromResources. Both are wrapped in a thread so we - // are not on the user thread. @Nullable public T getPersisted(String fileName) { + if (FLUSH_ALL_DATA_TO_DISK_CALLED) { + log.warn("We have started the shut down routine already. We ignore that getPersisted call."); + return null; + } + File storageFile = new File(dir, fileName); if (!storageFile.exists()) { return null; @@ -259,6 +339,11 @@ public class PersistenceManager { /////////////////////////////////////////////////////////////////////////////////////////// public void requestPersistence() { + if (FLUSH_ALL_DATA_TO_DISK_CALLED) { + log.warn("We have started the shut down routine already. We ignore that requestPersistence call."); + return; + } + persistenceRequested = true; // We write to disk with a delay to avoid frequent write operations. Depending on the priority those delays @@ -267,7 +352,7 @@ public class PersistenceManager { timer = UserThread.runAfter(() -> { persistNow(null); UserThread.execute(() -> timer = null); - }, source.delayInSec, TimeUnit.SECONDS); + }, source.delay, TimeUnit.MILLISECONDS); } } @@ -369,7 +454,7 @@ public class PersistenceManager { ",\n dir=" + dir + ",\n storageFile=" + storageFile + ",\n persistable=" + persistable + - ",\n priority=" + source + + ",\n source=" + source + ",\n usedTempFilePath=" + usedTempFilePath + ",\n persistenceRequested=" + persistenceRequested + "\n}"; diff --git a/common/src/main/java/bisq/common/proto/persistable/PersistedDataHost.java b/common/src/main/java/bisq/common/proto/persistable/PersistedDataHost.java index f2e53cf19f..0aca05732d 100644 --- a/common/src/main/java/bisq/common/proto/persistable/PersistedDataHost.java +++ b/common/src/main/java/bisq/common/proto/persistable/PersistedDataHost.java @@ -17,12 +17,6 @@ package bisq.common.proto.persistable; -import java.util.List; - public interface PersistedDataHost { - void readPersisted(); - - static void apply(List persistedDataHosts) { - persistedDataHosts.forEach(PersistedDataHost::readPersisted); - } + void readPersisted(Runnable completeHandler); } diff --git a/common/src/main/java/bisq/common/setup/CommonSetup.java b/common/src/main/java/bisq/common/setup/CommonSetup.java index df3280aae7..b56613bd56 100644 --- a/common/src/main/java/bisq/common/setup/CommonSetup.java +++ b/common/src/main/java/bisq/common/setup/CommonSetup.java @@ -48,8 +48,8 @@ import sun.misc.Signal; public class CommonSetup { public static void setup(Config config, GracefulShutDownHandler gracefulShutDownHandler) { - AsciiLogo.showAsciiLogo(); setupLog(config); + AsciiLogo.showAsciiLogo(); Version.setBaseCryptoNetworkId(config.baseCurrencyNetwork.ordinal()); Version.printVersion(); maybePrintPathOfCodeSource(); @@ -102,13 +102,15 @@ public class CommonSetup { protected static void setupSigIntHandlers(GracefulShutDownHandler gracefulShutDownHandler) { Signal.handle(new Signal("INT"), signal -> { - gracefulShutDownHandler.gracefulShutDown(() -> { - }); + log.info("Received {}", signal); + UserThread.execute(() -> gracefulShutDownHandler.gracefulShutDown(() -> { + })); }); Signal.handle(new Signal("TERM"), signal -> { - gracefulShutDownHandler.gracefulShutDown(() -> { - }); + log.info("Received {}", signal); + UserThread.execute(() -> gracefulShutDownHandler.gracefulShutDown(() -> { + })); }); } diff --git a/common/src/main/java/bisq/common/util/Profiler.java b/common/src/main/java/bisq/common/util/Profiler.java index 8a60402df8..28150ae9ec 100644 --- a/common/src/main/java/bisq/common/util/Profiler.java +++ b/common/src/main/java/bisq/common/util/Profiler.java @@ -32,9 +32,13 @@ public class Profiler { } public static long getUsedMemoryInMB() { + return getUsedMemoryInBytes() / 1024 / 1024; + } + + public static long getUsedMemoryInBytes() { Runtime runtime = Runtime.getRuntime(); - long free = runtime.freeMemory() / 1024 / 1024; - long total = runtime.totalMemory() / 1024 / 1024; + long free = runtime.freeMemory(); + long total = runtime.totalMemory(); return total - free; } diff --git a/common/src/main/java/bisq/common/util/Utilities.java b/common/src/main/java/bisq/common/util/Utilities.java index 426dcb162b..a2b90f816e 100644 --- a/common/src/main/java/bisq/common/util/Utilities.java +++ b/common/src/main/java/bisq/common/util/Utilities.java @@ -40,6 +40,8 @@ import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyCombination; import javafx.scene.input.KeyEvent; +import java.text.DecimalFormat; + import java.net.URI; import java.net.URISyntaxException; @@ -523,4 +525,11 @@ public class Utilities { return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; } + public static String readableFileSize(long size) { + if (size <= 0) return "0"; + String[] units = new String[]{"B", "kB", "MB", "GB", "TB"}; + int digitGroups = (int) (Math.log10(size) / Math.log10(1024)); + return new DecimalFormat("#,##0.###").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups]; + } + } diff --git a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java index 1aeed55150..659cd0d0f0 100644 --- a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java +++ b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java @@ -85,7 +85,6 @@ import static com.google.common.base.Preconditions.checkNotNull; @Slf4j public class AccountAgeWitnessService { private static final Date RELEASE = Utilities.getUTCDate(2017, GregorianCalendar.NOVEMBER, 11); - public static final Date FULL_ACTIVATION = Utilities.getUTCDate(2018, GregorianCalendar.FEBRUARY, 15); private static final long SAFE_ACCOUNT_AGE_DATE = Utilities.getUTCDate(2019, GregorianCalendar.MARCH, 1).getTime(); public enum AccountAge { @@ -105,6 +104,7 @@ public class AccountAgeWitnessService { private String presentation; private String hash = ""; + private long daysUntilLimitLifted = 0; SignState(String presentation) { this.presentation = presentation; @@ -115,11 +115,16 @@ public class AccountAgeWitnessService { return this; } + public SignState setDaysUntilLimitLifted(long days) { + this.daysUntilLimitLifted = days; + return this; + } + public String getPresentation() { if (!hash.isEmpty()) { // Only showing in DEBUG mode return presentation + " " + hash; } - return presentation; + return String.format(presentation, daysUntilLimitLifted); } } @@ -208,10 +213,11 @@ public class AccountAgeWitnessService { user.getPaymentAccounts().stream() .filter(e -> !(e instanceof AssetAccount)) .forEach(e -> { - // We delay with a random interval of 20-60 sec to ensure to be better connected and don't stress the - // P2P network with publishing all at once at startup time. + // We delay with a random interval of 20-60 sec to ensure to be better connected and don't + // stress the P2P network with publishing all at once at startup time. final int delayInSec = 20 + new Random().nextInt(40); - UserThread.runAfter(() -> p2PService.addPersistableNetworkPayload(getMyWitness(e.getPaymentAccountPayload()), true), delayInSec); + UserThread.runAfter(() -> p2PService.addPersistableNetworkPayload(getMyWitness( + e.getPaymentAccountPayload()), true), delayInSec); }); } @@ -238,7 +244,8 @@ public class AccountAgeWitnessService { } byte[] getAccountInputDataWithSalt(PaymentAccountPayload paymentAccountPayload) { - return Utilities.concatenateByteArrays(paymentAccountPayload.getAgeWitnessInputData(), paymentAccountPayload.getSalt()); + return Utilities.concatenateByteArrays(paymentAccountPayload.getAgeWitnessInputData(), + paymentAccountPayload.getSalt()); } @VisibleForTesting @@ -281,7 +288,8 @@ public class AccountAgeWitnessService { if (!containsKey) log.debug("hash not found in accountAgeWitnessMap"); - return accountAgeWitnessMap.containsKey(hashAsByteArray) ? Optional.of(accountAgeWitnessMap.get(hashAsByteArray)) : Optional.empty(); + return accountAgeWitnessMap.containsKey(hashAsByteArray) ? + Optional.of(accountAgeWitnessMap.get(hashAsByteArray)) : Optional.empty(); } private Optional getWitnessByHashAsHex(String hashAsHex) { @@ -359,65 +367,52 @@ public class AccountAgeWitnessService { } } - // Checks trade limit based on time since signing of AccountAgeWitness + // Get trade limit based on a time schedule + // Buying of BTC with a payment method that has chargeback risk will use a low trade limit schedule + // All selling and all other fiat payment methods use the normal trade limit schedule + // Non fiat always has max limit + // Account types that can get signed will use time since signing, other methods use time since account age creation + // when measuring account age private long getTradeLimit(Coin maxTradeLimit, String currencyCode, AccountAgeWitness accountAgeWitness, AccountAge accountAgeCategory, OfferPayload.Direction direction, PaymentMethod paymentMethod) { - if (CurrencyUtil.isFiatCurrency(currencyCode)) { - double factor; - boolean isRisky = PaymentMethod.hasChargebackRisk(paymentMethod, currencyCode); - if (!isRisky || direction == OfferPayload.Direction.SELL) { - // Get age of witness rather than time since signing for non risky payment methods and for selling - accountAgeCategory = getAccountAgeCategory(getAccountAge(accountAgeWitness, new Date())); - } - long limit = OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value; - if (direction == OfferPayload.Direction.BUY && isRisky) { - // Used only for bying of BTC with risky payment methods - switch (accountAgeCategory) { - case TWO_MONTHS_OR_MORE: - factor = 1; - break; - case ONE_TO_TWO_MONTHS: - factor = 0.5; - break; - case LESS_ONE_MONTH: - case UNVERIFIED: - default: - factor = 0; - } - } else { - // Used by non risky payment methods and for selling BTC with risky methods - switch (accountAgeCategory) { - case TWO_MONTHS_OR_MORE: - factor = 1; - break; - case ONE_TO_TWO_MONTHS: - factor = 0.5; - break; - case LESS_ONE_MONTH: - case UNVERIFIED: - factor = 0.25; - break; - default: - factor = 0; - } - } - if (factor > 0) { - limit = MathUtils.roundDoubleToLong((double) maxTradeLimit.value * factor); - } - - log.debug("accountAgeCategory={}, limit={}, factor={}, accountAgeWitnessHash={}", - accountAgeCategory, - Coin.valueOf(limit).toFriendlyString(), - factor, - Utilities.bytesAsHexString(accountAgeWitness.getHash())); - return limit; - } else { + if (CurrencyUtil.isCryptoCurrency(currencyCode) || + !PaymentMethod.hasChargebackRisk(paymentMethod, currencyCode) || + direction == OfferPayload.Direction.SELL) { return maxTradeLimit.value; } + + long limit = OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value; + var factor = signedBuyFactor(accountAgeCategory); + if (factor > 0) { + limit = MathUtils.roundDoubleToLong((double) maxTradeLimit.value * factor); + } + + log.debug("limit={}, factor={}, accountAgeWitnessHash={}", + Coin.valueOf(limit).toFriendlyString(), + factor, + Utilities.bytesAsHexString(accountAgeWitness.getHash())); + return limit; + } + + private double signedBuyFactor(AccountAge accountAgeCategory) { + switch (accountAgeCategory) { + case TWO_MONTHS_OR_MORE: + return 1; + case ONE_TO_TWO_MONTHS: + return 0.5; + case LESS_ONE_MONTH: + case UNVERIFIED: + default: + return 0; + } + } + + private double normalFactor() { + return 1; } /////////////////////////////////////////////////////////////////////////////////////////// @@ -444,7 +439,8 @@ public class AccountAgeWitnessService { /////////////////////////////////////////////////////////////////////////////////////////// public AccountAgeWitness getMyWitness(PaymentAccountPayload paymentAccountPayload) { - final Optional accountAgeWitnessOptional = findWitness(paymentAccountPayload, keyRing.getPubKeyRing()); + final Optional accountAgeWitnessOptional = + findWitness(paymentAccountPayload, keyRing.getPubKeyRing()); return accountAgeWitnessOptional.orElseGet(() -> getNewWitness(paymentAccountPayload, keyRing.getPubKeyRing())); } @@ -460,8 +456,7 @@ public class AccountAgeWitnessService { return getAccountAge(getMyWitness(paymentAccountPayload), new Date()); } - public long getMyTradeLimit(PaymentAccount paymentAccount, String currencyCode, OfferPayload.Direction - direction) { + public long getMyTradeLimit(PaymentAccount paymentAccount, String currencyCode, OfferPayload.Direction direction) { if (paymentAccount == null) return 0; @@ -492,7 +487,8 @@ public class AccountAgeWitnessService { byte[] nonce, byte[] signature, ErrorMessageHandler errorMessageHandler) { - final Optional accountAgeWitnessOptional = findWitness(peersPaymentAccountPayload, peersPubKeyRing); + final Optional accountAgeWitnessOptional = + findWitness(peersPaymentAccountPayload, peersPubKeyRing); // If we don't find a stored witness data we create a new dummy object which makes is easier to reuse the // below validation methods. This peersWitness object is not used beside for validation. Some of the // validation calls are pointless in the case we create a new Witness ourselves but the verifyPeersTradeLimit @@ -513,8 +509,10 @@ public class AccountAgeWitnessService { if (!verifyPeersCurrentDate(peersCurrentDate, errorMessageHandler)) return false; - final byte[] peersAccountInputDataWithSalt = Utilities.concatenateByteArrays(peersPaymentAccountPayload.getAgeWitnessInputData(), peersPaymentAccountPayload.getSalt()); - byte[] hash = Hash.getSha256Ripemd160hash(Utilities.concatenateByteArrays(peersAccountInputDataWithSalt, peersPubKeyRing.getSignaturePubKeyBytes())); + final byte[] peersAccountInputDataWithSalt = Utilities.concatenateByteArrays( + peersPaymentAccountPayload.getAgeWitnessInputData(), peersPaymentAccountPayload.getSalt()); + byte[] hash = Hash.getSha256Ripemd160hash(Utilities.concatenateByteArrays(peersAccountInputDataWithSalt, + peersPubKeyRing.getSignaturePubKeyBytes())); // Check if the hash in the witness data matches the hash derived from the data provided by the peer final byte[] peersWitnessHash = peersWitness.getHash(); @@ -591,7 +589,8 @@ public class AccountAgeWitnessService { ErrorMessageHandler errorMessageHandler) { checkNotNull(offer); final String currencyCode = offer.getCurrencyCode(); - final Coin defaultMaxTradeLimit = PaymentMethod.getPaymentMethodById(offer.getOfferPayload().getPaymentMethodId()).getMaxTradeLimitAsCoin(currencyCode); + final Coin defaultMaxTradeLimit = PaymentMethod.getPaymentMethodById( + offer.getOfferPayload().getPaymentMethodId()).getMaxTradeLimitAsCoin(currencyCode); long peersCurrentTradeLimit = defaultMaxTradeLimit.value; if (!hasTradeLimitException(peersWitness)) { final long accountSignAge = getWitnessSignAge(peersWitness, peersCurrentDate); @@ -654,8 +653,8 @@ public class AccountAgeWitnessService { .findAny() .orElse(null); checkNotNull(signedWitness); - return signedWitnessService.signAndPublishAccountAgeWitness(accountAgeWitness, key, signedWitness.getWitnessOwnerPubKey(), - time); + return signedWitnessService.signAndPublishAccountAgeWitness(accountAgeWitness, key, + signedWitness.getWitnessOwnerPubKey(), time); } public String arbitratorSignOrphanPubKey(ECKey key, @@ -676,7 +675,8 @@ public class AccountAgeWitnessService { Coin tradeAmount = trade.getTradeAmount(); checkNotNull(trade.getProcessModel().getTradingPeer().getPubKeyRing(), "Peer must have a keyring"); PublicKey peersPubKey = trade.getProcessModel().getTradingPeer().getPubKeyRing().getSignaturePubKey(); - checkNotNull(peersWitness, "Not able to find peers witness, unable to sign for trade {}", trade.toString()); + checkNotNull(peersWitness, "Not able to find peers witness, unable to sign for trade {}", + trade.toString()); checkNotNull(tradeAmount, "Trade amount must not be null"); checkNotNull(peersPubKey, "Peers pub key must not be null"); @@ -717,7 +717,8 @@ public class AccountAgeWitnessService { filterManager.isPaymentMethodBanned( PaymentMethod.getPaymentMethodById(dispute.getContract().getPaymentMethodId())) || filterManager.arePeersPaymentAccountDataBanned(dispute.getContract().getBuyerPaymentAccountPayload()) || - filterManager.arePeersPaymentAccountDataBanned(dispute.getContract().getSellerPaymentAccountPayload()) || + filterManager.arePeersPaymentAccountDataBanned( + dispute.getContract().getSellerPaymentAccountPayload()) || filterManager.isWitnessSignerPubKeyBanned( Utils.HEX.encode(dispute.getContract().getBuyerPubKeyRing().getSignaturePubKeyBytes())) || filterManager.isWitnessSignerPubKeyBanned( @@ -811,7 +812,8 @@ public class AccountAgeWitnessService { case ONE_TO_TWO_MONTHS: return SignState.PEER_SIGNER.addHash(hash); case LESS_ONE_MONTH: - return SignState.PEER_INITIAL.addHash(hash); + return SignState.PEER_INITIAL.addHash(hash) + .setDaysUntilLimitLifted(30 - TimeUnit.MILLISECONDS.toDays(accountSignAge)); case UNVERIFIED: default: return SignState.UNSIGNED.addHash(hash); diff --git a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessStore.java b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessStore.java index 28661102de..349d18e80d 100644 --- a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessStore.java +++ b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessStore.java @@ -35,7 +35,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class AccountAgeWitnessStore extends PersistableNetworkPayloadStore { - AccountAgeWitnessStore() { + public AccountAgeWitnessStore() { } diff --git a/core/src/main/java/bisq/core/alert/PrivateNotificationManager.java b/core/src/main/java/bisq/core/alert/PrivateNotificationManager.java index 467605757d..b009e59eb9 100644 --- a/core/src/main/java/bisq/core/alert/PrivateNotificationManager.java +++ b/core/src/main/java/bisq/core/alert/PrivateNotificationManager.java @@ -133,7 +133,7 @@ public class PrivateNotificationManager { } public void removePrivateNotification() { - p2PService.removeEntryFromMailbox(decryptedMessageWithPubKey); + p2PService.removeMailboxMsg(decryptedMessageWithPubKey); } private boolean isKeyValid(String privKeyString) { diff --git a/core/src/main/java/bisq/core/api/CoreApi.java b/core/src/main/java/bisq/core/api/CoreApi.java index 08cc67c49d..7cfcc5ce15 100644 --- a/core/src/main/java/bisq/core/api/CoreApi.java +++ b/core/src/main/java/bisq/core/api/CoreApi.java @@ -22,6 +22,7 @@ import bisq.core.monetary.Price; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; import bisq.core.payment.PaymentAccount; +import bisq.core.trade.Trade; import bisq.core.trade.statistics.TradeStatistics3; import bisq.core.trade.statistics.TradeStatisticsManager; @@ -51,6 +52,7 @@ public class CoreApi { private final CoreOffersService coreOffersService; private final CorePaymentAccountsService paymentAccountsService; private final CorePriceService corePriceService; + private final CoreTradesService coreTradesService; private final CoreWalletsService walletsService; private final TradeStatisticsManager tradeStatisticsManager; @@ -59,12 +61,14 @@ public class CoreApi { CoreOffersService coreOffersService, CorePaymentAccountsService paymentAccountsService, CorePriceService corePriceService, + CoreTradesService coreTradesService, CoreWalletsService walletsService, TradeStatisticsManager tradeStatisticsManager) { this.coreDisputeAgentsService = coreDisputeAgentsService; this.coreOffersService = coreOffersService; - this.corePriceService = corePriceService; this.paymentAccountsService = paymentAccountsService; + this.coreTradesService = coreTradesService; + this.corePriceService = corePriceService; this.walletsService = walletsService; this.tradeStatisticsManager = tradeStatisticsManager; } @@ -138,6 +142,10 @@ public class CoreApi { paymentAccount); } + public void cancelOffer(String id) { + coreOffersService.cancelOffer(id); + } + /////////////////////////////////////////////////////////////////////////////////////////// // PaymentAccounts /////////////////////////////////////////////////////////////////////////////////////////// @@ -164,6 +172,43 @@ public class CoreApi { return corePriceService.getMarketPrice(currencyCode); } + /////////////////////////////////////////////////////////////////////////////////////////// + // Trades + /////////////////////////////////////////////////////////////////////////////////////////// + + public void takeOffer(String offerId, + String paymentAccountId, + Consumer resultHandler) { + Offer offer = coreOffersService.getOffer(offerId); + coreTradesService.takeOffer(offer, + paymentAccountId, + resultHandler); + } + + public void confirmPaymentStarted(String tradeId) { + coreTradesService.confirmPaymentStarted(tradeId); + } + + public void confirmPaymentReceived(String tradeId) { + coreTradesService.confirmPaymentReceived(tradeId); + } + + public void keepFunds(String tradeId) { + coreTradesService.keepFunds(tradeId); + } + + public void withdrawFunds(String tradeId, String address) { + coreTradesService.withdrawFunds(tradeId, address); + } + + public Trade getTrade(String tradeId) { + return coreTradesService.getTrade(tradeId); + } + + public String getTradeRole(String tradeId) { + return coreTradesService.getTradeRole(tradeId); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Wallets /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/api/CoreOffersService.java b/core/src/main/java/bisq/core/api/CoreOffersService.java index da07677f1b..6d8641c057 100644 --- a/core/src/main/java/bisq/core/api/CoreOffersService.java +++ b/core/src/main/java/bisq/core/api/CoreOffersService.java @@ -160,6 +160,16 @@ class CoreOffersService { paymentAccount); } + void cancelOffer(String id) { + Offer offer = getOffer(id); + openOfferManager.removeOffer(offer, + () -> { + }, + errorMessage -> { + throw new IllegalStateException(errorMessage); + }); + } + private void placeOffer(Offer offer, double buyerSecurityDeposit, boolean useSavingsWallet, diff --git a/core/src/main/java/bisq/core/api/CoreTradesService.java b/core/src/main/java/bisq/core/api/CoreTradesService.java new file mode 100644 index 0000000000..dbc6927f45 --- /dev/null +++ b/core/src/main/java/bisq/core/api/CoreTradesService.java @@ -0,0 +1,247 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.api; + +import bisq.core.btc.model.AddressEntry; +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.offer.Offer; +import bisq.core.offer.takeoffer.TakeOfferModel; +import bisq.core.trade.Tradable; +import bisq.core.trade.Trade; +import bisq.core.trade.TradeManager; +import bisq.core.trade.TradeUtil; +import bisq.core.trade.closed.ClosedTradableManager; +import bisq.core.trade.protocol.BuyerProtocol; +import bisq.core.trade.protocol.SellerProtocol; +import bisq.core.user.User; +import bisq.core.util.validation.BtcAddressValidator; + +import org.bitcoinj.core.Coin; + +import javax.inject.Inject; + +import java.util.Optional; +import java.util.function.Consumer; + +import lombok.extern.slf4j.Slf4j; + +import static bisq.core.btc.model.AddressEntry.Context.TRADE_PAYOUT; +import static java.lang.String.format; + +@Slf4j +class CoreTradesService { + + // Dependencies on core api services in this package must be kept to an absolute + // minimum, but some trading functions require an unlocked wallet's key, so an + // exception is made in this case. + private final CoreWalletsService coreWalletsService; + + private final BtcWalletService btcWalletService; + private final ClosedTradableManager closedTradableManager; + private final TakeOfferModel takeOfferModel; + private final TradeManager tradeManager; + private final TradeUtil tradeUtil; + private final User user; + + @Inject + public CoreTradesService(CoreWalletsService coreWalletsService, + BtcWalletService btcWalletService, + ClosedTradableManager closedTradableManager, + TakeOfferModel takeOfferModel, + TradeManager tradeManager, + TradeUtil tradeUtil, + User user) { + this.coreWalletsService = coreWalletsService; + this.btcWalletService = btcWalletService; + this.closedTradableManager = closedTradableManager; + this.takeOfferModel = takeOfferModel; + this.tradeManager = tradeManager; + this.tradeUtil = tradeUtil; + this.user = user; + } + + void takeOffer(Offer offer, + String paymentAccountId, + Consumer resultHandler) { + var paymentAccount = user.getPaymentAccount(paymentAccountId); + if (paymentAccount == null) + throw new IllegalArgumentException(format("payment account with id '%s' not found", paymentAccountId)); + + var useSavingsWallet = true; + //noinspection ConstantConditions + takeOfferModel.initModel(offer, paymentAccount, useSavingsWallet); + log.info("Initiating take {} offer, {}", + offer.isBuyOffer() ? "buy" : "sell", + takeOfferModel); + //noinspection ConstantConditions + tradeManager.onTakeOffer(offer.getAmount(), + takeOfferModel.getTxFeeFromFeeService(), + takeOfferModel.getTakerFee(), + takeOfferModel.isCurrencyForTakerFeeBtc(), + offer.getPrice().getValue(), + takeOfferModel.getFundsNeededForTrade(), + offer, + paymentAccountId, + useSavingsWallet, + resultHandler::accept, + errorMessage -> { + log.error(errorMessage); + throw new IllegalStateException(errorMessage); + } + ); + } + + void confirmPaymentStarted(String tradeId) { + var trade = getTrade(tradeId); + if (isFollowingBuyerProtocol(trade)) { + var tradeProtocol = tradeManager.getTradeProtocol(trade); + ((BuyerProtocol) tradeProtocol).onPaymentStarted( + () -> { + }, + errorMessage -> { + throw new IllegalStateException(errorMessage); + } + ); + } else { + throw new IllegalStateException("you are the seller and not sending payment"); + } + } + + void confirmPaymentReceived(String tradeId) { + var trade = getTrade(tradeId); + if (isFollowingBuyerProtocol(trade)) { + throw new IllegalStateException("you are the buyer, and not receiving payment"); + } else { + var tradeProtocol = tradeManager.getTradeProtocol(trade); + ((SellerProtocol) tradeProtocol).onPaymentReceived( + () -> { + }, + errorMessage -> { + throw new IllegalStateException(errorMessage); + } + ); + } + } + + void keepFunds(String tradeId) { + verifyTradeIsNotClosed(tradeId); + var trade = getOpenTrade(tradeId).orElseThrow(() -> + new IllegalArgumentException(format("trade with id '%s' not found", tradeId))); + log.info("Keeping funds received from trade {}", tradeId); + tradeManager.onTradeCompleted(trade); + } + + void withdrawFunds(String tradeId, String toAddress) { + // An encrypted wallet must be unlocked for this operation. + verifyTradeIsNotClosed(tradeId); + var trade = getOpenTrade(tradeId).orElseThrow(() -> + new IllegalArgumentException(format("trade with id '%s' not found", tradeId))); + + verifyIsValidBTCAddress(toAddress); + + var fromAddressEntry = btcWalletService.getOrCreateAddressEntry(trade.getId(), TRADE_PAYOUT); + verifyFundsNotWithdrawn(fromAddressEntry); + + var amount = trade.getPayoutAmount(); + var fee = getEstimatedTxFee(fromAddressEntry.getAddressString(), toAddress, amount); + var receiverAmount = amount.subtract(fee); + + log.info(format("Withdrawing funds received from trade %s:" + + "%n From %s%n To %s%n Amt %s%n Tx Fee %s%n Receiver Amt %s", + tradeId, + fromAddressEntry.getAddressString(), + toAddress, + amount.toFriendlyString(), + fee.toFriendlyString(), + receiverAmount.toFriendlyString())); + + tradeManager.onWithdrawRequest( + toAddress, + amount, + fee, + coreWalletsService.getKey(), + trade, + () -> { + }, + (errorMessage, throwable) -> { + log.error(errorMessage, throwable); + throw new IllegalStateException(errorMessage, throwable); + }); + } + + String getTradeRole(String tradeId) { + return tradeUtil.getRole(getTrade(tradeId)); + } + + Trade getTrade(String tradeId) { + return getOpenTrade(tradeId).orElseGet(() -> + getClosedTrade(tradeId).orElseThrow(() -> + new IllegalArgumentException(format("trade with id '%s' not found", tradeId)) + )); + } + + private Optional getOpenTrade(String tradeId) { + return tradeManager.getTradeById(tradeId); + } + + private Optional getClosedTrade(String tradeId) { + Optional tradable = closedTradableManager.getTradableById(tradeId); + return tradable.filter((t) -> t instanceof Trade).map(value -> (Trade) value); + } + + private boolean isFollowingBuyerProtocol(Trade trade) { + return tradeManager.getTradeProtocol(trade) instanceof BuyerProtocol; + } + + private Coin getEstimatedTxFee(String fromAddress, String toAddress, Coin amount) { + // TODO This and identical logic should be refactored into TradeUtil. + try { + return btcWalletService.getFeeEstimationTransaction(fromAddress, + toAddress, + amount, + TRADE_PAYOUT).getFee(); + } catch (Exception ex) { + log.error("", ex); + throw new IllegalStateException(format("could not estimate tx fee: %s", ex.getMessage())); + } + } + + // Throws a RuntimeException trade is already closed. + private void verifyTradeIsNotClosed(String tradeId) { + if (getClosedTrade(tradeId).isPresent()) + throw new IllegalArgumentException(format("trade '%s' is already closed", tradeId)); + } + + // Throws a RuntimeException if address is not valid. + private void verifyIsValidBTCAddress(String address) { + try { + new BtcAddressValidator().validate(address); + } catch (Throwable t) { + log.error("", t); + throw new IllegalArgumentException(format("'%s' is not a valid btc address", address)); + } + } + + // Throws a RuntimeException if address has a zero balance. + private void verifyFundsNotWithdrawn(AddressEntry fromAddressEntry) { + Coin fromAddressBalance = btcWalletService.getBalanceForAddress(fromAddressEntry.getAddress()); + if (fromAddressBalance.isZero()) + throw new IllegalStateException(format("funds already withdrawn from address '%s'", + fromAddressEntry.getAddressString())); + } +} diff --git a/core/src/main/java/bisq/core/api/CoreWalletsService.java b/core/src/main/java/bisq/core/api/CoreWalletsService.java index 0f1e1db084..fc15ec5062 100644 --- a/core/src/main/java/bisq/core/api/CoreWalletsService.java +++ b/core/src/main/java/bisq/core/api/CoreWalletsService.java @@ -23,6 +23,9 @@ import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletsManager; +import bisq.common.Timer; +import bisq.common.UserThread; + import org.bitcoinj.core.Address; import org.bitcoinj.core.TransactionConfidence; import org.bitcoinj.crypto.KeyCrypterScrypt; @@ -37,8 +40,6 @@ import org.bouncycastle.crypto.params.KeyParameter; import java.util.List; import java.util.Optional; -import java.util.Timer; -import java.util.TimerTask; import java.util.function.Function; import java.util.stream.Collectors; @@ -57,7 +58,7 @@ class CoreWalletsService { private final BtcWalletService btcWalletService; @Nullable - private TimerTask lockTask; + private Timer lockTimer; @Nullable private KeyParameter tempAesKey; @@ -71,6 +72,12 @@ class CoreWalletsService { this.btcWalletService = btcWalletService; } + @Nullable + KeyParameter getKey() { + verifyEncryptedWalletIsUnlocked(); + return tempAesKey; + } + long getAvailableBalance() { verifyWalletsAreAvailable(); verifyEncryptedWalletIsUnlocked(); @@ -184,29 +191,22 @@ class CoreWalletsService { if (!walletsManager.checkAESKey(tempAesKey)) throw new IllegalStateException("incorrect password"); - if (lockTask != null) { - // The user is overriding a prior unlock timeout. Cancel the existing - // lock TimerTask to prevent it from calling lockWallet() before or after the - // new timer task does. - lockTask.cancel(); - // Avoid the synchronized(lock) overhead of an unnecessary lockTask.cancel() - // call the next time 'unlockwallet' is called. - lockTask = null; + if (lockTimer != null) { + // The user has called unlockwallet again, before the prior unlockwallet + // timeout has expired. He's overriding it with a new timeout value. + // Remove the existing lock timer to prevent it from calling lockwallet + // before or after the new one does. + lockTimer.stop(); + lockTimer = null; } - lockTask = new TimerTask() { - @Override - public void run() { - if (tempAesKey != null) { - // Do not try to lock wallet after timeout if the user has already - // done so via 'lockwallet' - log.info("Locking wallet after {} second timeout expired.", timeout); - tempAesKey = null; - } + lockTimer = UserThread.runAfter(() -> { + if (tempAesKey != null) { + // The unlockwallet timeout has expired; re-lock the wallet. + log.info("Locking wallet after {} second timeout expired.", timeout); + tempAesKey = null; } - }; - Timer timer = new Timer("Lock Wallet Timer"); - timer.schedule(lockTask, SECONDS.toMillis(timeout)); + }, timeout, SECONDS); } // Provided for automated wallet protection method testing, despite the diff --git a/core/src/main/java/bisq/core/api/StatusCheck.java b/core/src/main/java/bisq/core/api/StatusCheck.java deleted file mode 100644 index 43d624fd6a..0000000000 --- a/core/src/main/java/bisq/core/api/StatusCheck.java +++ /dev/null @@ -1,60 +0,0 @@ -package bisq.core.api; - -import bisq.core.btc.Balances; -import bisq.core.btc.setup.WalletsSetup; -import bisq.core.btc.wallet.WalletsManager; -import bisq.core.dao.state.DaoStateService; - -import bisq.network.p2p.P2PService; - -import bisq.common.config.Config; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import lombok.extern.slf4j.Slf4j; - -@Singleton -@Slf4j -class StatusCheck { - - private final Config config; - private final P2PService p2PService; - private final DaoStateService daoStateService; - private final WalletsSetup walletsSetup; - private final WalletsManager walletsManager; - private final Balances balances; - - @Inject - public StatusCheck(Config config, - P2PService p2PService, - DaoStateService daoStateService, - WalletsSetup walletsSetup, - WalletsManager walletsManager, - Balances balances) { - this.config = config; - this.p2PService = p2PService; - this.daoStateService = daoStateService; - this.walletsSetup = walletsSetup; - this.walletsManager = walletsManager; - this.balances = balances; - } - - public void verifyCanTrade() { - if (!p2PService.isBootstrapped()) - throw new IllegalStateException("p2p service is not yet bootstrapped"); - - if (!daoStateService.isParseBlockChainComplete()) - throw new IllegalStateException("dao block chain sync is not yet complete"); - - if (config.baseCurrencyNetwork.isMainnet() - && p2PService.getNumConnectedPeers().get() < walletsSetup.getMinBroadcastConnections()) - throw new IllegalStateException("not enough connected peers"); - - if (!walletsManager.areWalletsAvailable()) - throw new IllegalStateException("wallet is not yet available"); - - if (balances.getAvailableBalance().get() == null) - throw new IllegalStateException("balance is not yet available"); - } -} diff --git a/core/src/main/java/bisq/core/api/model/OfferInfo.java b/core/src/main/java/bisq/core/api/model/OfferInfo.java index fa6f0c95ea..219045b276 100644 --- a/core/src/main/java/bisq/core/api/model/OfferInfo.java +++ b/core/src/main/java/bisq/core/api/model/OfferInfo.java @@ -17,8 +17,12 @@ package bisq.core.api.model; +import bisq.core.offer.Offer; + import bisq.common.Payload; +import java.util.Objects; + import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; @@ -28,6 +32,10 @@ import lombok.ToString; @Getter public class OfferInfo implements Payload { + // The client cannot see bisq.core.Offer or its fromProto method. We use the lighter + // weight OfferInfo proto wrapper instead, containing just enough fields to view, + // create and take offers. + private final String id; private final String direction; private final long price; @@ -46,6 +54,7 @@ public class OfferInfo implements Payload { private final String baseCurrencyCode; private final String counterCurrencyCode; private final long date; + private final String state; public OfferInfo(OfferInfoBuilder builder) { this.id = builder.id; @@ -64,6 +73,29 @@ public class OfferInfo implements Payload { this.baseCurrencyCode = builder.baseCurrencyCode; this.counterCurrencyCode = builder.counterCurrencyCode; this.date = builder.date; + this.state = builder.state; + } + + public static OfferInfo toOfferInfo(Offer offer) { + return new OfferInfo.OfferInfoBuilder() + .withId(offer.getId()) + .withDirection(offer.getDirection().name()) + .withPrice(Objects.requireNonNull(offer.getPrice()).getValue()) + .withUseMarketBasedPrice(offer.isUseMarketBasedPrice()) + .withMarketPriceMargin(offer.getMarketPriceMargin()) + .withAmount(offer.getAmount().value) + .withMinAmount(offer.getMinAmount().value) + .withVolume(Objects.requireNonNull(offer.getVolume()).getValue()) + .withMinVolume(Objects.requireNonNull(offer.getMinVolume()).getValue()) + .withBuyerSecurityDeposit(offer.getBuyerSecurityDeposit().value) + .withPaymentAccountId(offer.getMakerPaymentAccountId()) + .withPaymentMethodId(offer.getPaymentMethod().getId()) + .withPaymentMethodShortName(offer.getPaymentMethod().getShortName()) + .withBaseCurrencyCode(offer.getOfferPayload().getBaseCurrencyCode()) + .withCounterCurrencyCode(offer.getOfferPayload().getCounterCurrencyCode()) + .withDate(offer.getDate().getTime()) + .withState(offer.getState().name()) + .build(); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -89,16 +121,13 @@ public class OfferInfo implements Payload { .setBaseCurrencyCode(baseCurrencyCode) .setCounterCurrencyCode(counterCurrencyCode) .setDate(date) + .setState(state) .build(); } + @SuppressWarnings({"unused", "SameReturnValue"}) public static OfferInfo fromProto(bisq.proto.grpc.OfferInfo proto) { - /* - TODO (will be needed by the createoffer method) - return new OfferInfo(proto.getOfferPayload().getId(), - proto.getOfferPayload().getDate()); - */ - return null; + return null; // TODO } /* @@ -124,9 +153,7 @@ public class OfferInfo implements Payload { private String baseCurrencyCode; private String counterCurrencyCode; private long date; - - public OfferInfoBuilder() { - } + private String state; public OfferInfoBuilder withId(String id) { this.id = id; @@ -208,6 +235,11 @@ public class OfferInfo implements Payload { return this; } + public OfferInfoBuilder withState(String state) { + this.state = state; + return this; + } + public OfferInfo build() { return new OfferInfo(this); } diff --git a/core/src/main/java/bisq/core/api/model/TradeInfo.java b/core/src/main/java/bisq/core/api/model/TradeInfo.java new file mode 100644 index 0000000000..1a717a7672 --- /dev/null +++ b/core/src/main/java/bisq/core/api/model/TradeInfo.java @@ -0,0 +1,351 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.api.model; + +import bisq.core.trade.Trade; + +import bisq.common.Payload; + +import java.util.Objects; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +import static bisq.core.api.model.OfferInfo.toOfferInfo; + +@EqualsAndHashCode +@Getter +public class TradeInfo implements Payload { + + // The client cannot see bisq.core.trade.Trade or its fromProto method. We use the + // lighter weight TradeInfo proto wrapper instead, containing just enough fields to + // view and interact with trades. + + private final OfferInfo offer; + private final String tradeId; + private final String shortId; + private final long date; + private final String role; + private final boolean isCurrencyForTakerFeeBtc; + private final long txFeeAsLong; + private final long takerFeeAsLong; + private final String takerFeeTxId; + private final String depositTxId; + private final String payoutTxId; + private final long tradeAmountAsLong; + private final long tradePrice; + private final String tradingPeerNodeAddress; + private final String state; + private final String phase; + private final String tradePeriodState; + private final boolean isDepositPublished; + private final boolean isDepositConfirmed; + private final boolean isFiatSent; + private final boolean isFiatReceived; + private final boolean isPayoutPublished; + private final boolean isWithdrawn; + private final String contractAsJson; + + public TradeInfo(TradeInfoBuilder builder) { + this.offer = builder.offer; + this.tradeId = builder.tradeId; + this.shortId = builder.shortId; + this.date = builder.date; + this.role = builder.role; + this.isCurrencyForTakerFeeBtc = builder.isCurrencyForTakerFeeBtc; + this.txFeeAsLong = builder.txFeeAsLong; + this.takerFeeAsLong = builder.takerFeeAsLong; + this.takerFeeTxId = builder.takerFeeTxId; + this.depositTxId = builder.depositTxId; + this.payoutTxId = builder.payoutTxId; + this.tradeAmountAsLong = builder.tradeAmountAsLong; + this.tradePrice = builder.tradePrice; + this.tradingPeerNodeAddress = builder.tradingPeerNodeAddress; + this.state = builder.state; + this.phase = builder.phase; + this.tradePeriodState = builder.tradePeriodState; + this.isDepositPublished = builder.isDepositPublished; + this.isDepositConfirmed = builder.isDepositConfirmed; + this.isFiatSent = builder.isFiatSent; + this.isFiatReceived = builder.isFiatReceived; + this.isPayoutPublished = builder.isPayoutPublished; + this.isWithdrawn = builder.isWithdrawn; + this.contractAsJson = builder.contractAsJson; + } + + public static TradeInfo toTradeInfo(Trade trade) { + return toTradeInfo(trade, null); + } + + public static TradeInfo toTradeInfo(Trade trade, String role) { + return new TradeInfo.TradeInfoBuilder() + .withOffer(toOfferInfo(trade.getOffer())) + .withTradeId(trade.getId()) + .withShortId(trade.getShortId()) + .withDate(trade.getDate().getTime()) + .withRole(role == null ? "" : role) + .withIsCurrencyForTakerFeeBtc(trade.isCurrencyForTakerFeeBtc()) + .withTxFeeAsLong(trade.getTxFeeAsLong()) + .withTakerFeeAsLong(trade.getTakerFeeAsLong()) + .withTakerFeeAsLong(trade.getTakerFeeAsLong()) + .withTakerFeeTxId(trade.getTakerFeeTxId()) + .withDepositTxId(trade.getDepositTxId()) + .withPayoutTxId(trade.getPayoutTxId()) + .withTradeAmountAsLong(trade.getTradeAmountAsLong()) + .withTradePrice(trade.getTradePrice().getValue()) + .withTradingPeerNodeAddress(Objects.requireNonNull( + trade.getTradingPeerNodeAddress()).getHostNameWithoutPostFix()) + .withState(trade.getState().name()) + .withPhase(trade.getPhase().name()) + .withTradePeriodState(trade.getTradePeriodState().name()) + .withIsDepositPublished(trade.isDepositPublished()) + .withIsDepositConfirmed(trade.isDepositConfirmed()) + .withIsFiatSent(trade.isFiatSent()) + .withIsFiatReceived(trade.isFiatReceived()) + .withIsPayoutPublished(trade.isPayoutPublished()) + .withIsWithdrawn(trade.isWithdrawn()) + .withContractAsJson(trade.getContractAsJson()) + .build(); + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public bisq.proto.grpc.TradeInfo toProtoMessage() { + return bisq.proto.grpc.TradeInfo.newBuilder() + .setOffer(offer.toProtoMessage()) + .setTradeId(tradeId) + .setShortId(shortId) + .setDate(date) + .setRole(role) + .setIsCurrencyForTakerFeeBtc(isCurrencyForTakerFeeBtc) + .setTxFeeAsLong(txFeeAsLong) + .setTakerFeeAsLong(takerFeeAsLong) + .setTakerFeeTxId(takerFeeTxId == null ? "" : takerFeeTxId) + .setDepositTxId(depositTxId == null ? "" : depositTxId) + .setPayoutTxId(payoutTxId == null ? "" : payoutTxId) + .setTradeAmountAsLong(tradeAmountAsLong) + .setTradePrice(tradePrice) + .setTradingPeerNodeAddress(tradingPeerNodeAddress) + .setState(state) + .setPhase(phase) + .setTradePeriodState(tradePeriodState) + .setIsDepositPublished(isDepositPublished) + .setIsDepositConfirmed(isDepositConfirmed) + .setIsFiatSent(isFiatSent) + .setIsFiatReceived(isFiatReceived) + .setIsPayoutPublished(isPayoutPublished) + .setIsWithdrawn(isWithdrawn) + .setContractAsJson(contractAsJson == null ? "" : contractAsJson) + .build(); + } + + @SuppressWarnings({"unused", "SameReturnValue"}) + public static TradeInfo fromProto(bisq.proto.grpc.TradeInfo proto) { + return null; // TODO + } + + /* + * TradeInfoBuilder helps avoid bungling use of a large TradeInfo constructor + * argument list. If consecutive argument values of the same type are not + * ordered correctly, the compiler won't complain but the resulting bugs could + * be hard to find and fix. + */ + public static class TradeInfoBuilder { + private OfferInfo offer; + private String tradeId; + private String shortId; + private long date; + private String role; + private boolean isCurrencyForTakerFeeBtc; + private long txFeeAsLong; + private long takerFeeAsLong; + private String takerFeeTxId; + private String depositTxId; + private String payoutTxId; + private long tradeAmountAsLong; + private long tradePrice; + private String tradingPeerNodeAddress; + private String state; + private String phase; + private String tradePeriodState; + private boolean isDepositPublished; + private boolean isDepositConfirmed; + private boolean isFiatSent; + private boolean isFiatReceived; + private boolean isPayoutPublished; + private boolean isWithdrawn; + private String contractAsJson; + + public TradeInfoBuilder withOffer(OfferInfo offer) { + this.offer = offer; + return this; + } + + public TradeInfoBuilder withTradeId(String tradeId) { + this.tradeId = tradeId; + return this; + } + + public TradeInfoBuilder withShortId(String shortId) { + this.shortId = shortId; + return this; + } + + public TradeInfoBuilder withDate(long date) { + this.date = date; + return this; + } + + public TradeInfoBuilder withRole(String role) { + this.role = role; + return this; + } + + public TradeInfoBuilder withIsCurrencyForTakerFeeBtc(boolean isCurrencyForTakerFeeBtc) { + this.isCurrencyForTakerFeeBtc = isCurrencyForTakerFeeBtc; + return this; + } + + public TradeInfoBuilder withTxFeeAsLong(long txFeeAsLong) { + this.txFeeAsLong = txFeeAsLong; + return this; + } + + public TradeInfoBuilder withTakerFeeAsLong(long takerFeeAsLong) { + this.takerFeeAsLong = takerFeeAsLong; + return this; + } + + public TradeInfoBuilder withTakerFeeTxId(String takerFeeTxId) { + this.takerFeeTxId = takerFeeTxId; + return this; + } + + public TradeInfoBuilder withDepositTxId(String depositTxId) { + this.depositTxId = depositTxId; + return this; + } + + public TradeInfoBuilder withPayoutTxId(String payoutTxId) { + this.payoutTxId = payoutTxId; + return this; + } + + public TradeInfoBuilder withTradeAmountAsLong(long tradeAmountAsLong) { + this.tradeAmountAsLong = tradeAmountAsLong; + return this; + } + + public TradeInfoBuilder withTradePrice(long tradePrice) { + this.tradePrice = tradePrice; + return this; + } + + public TradeInfoBuilder withTradePeriodState(String tradePeriodState) { + this.tradePeriodState = tradePeriodState; + return this; + } + + public TradeInfoBuilder withState(String state) { + this.state = state; + return this; + } + + public TradeInfoBuilder withPhase(String phase) { + this.phase = phase; + return this; + } + + public TradeInfoBuilder withTradingPeerNodeAddress(String tradingPeerNodeAddress) { + this.tradingPeerNodeAddress = tradingPeerNodeAddress; + return this; + } + + public TradeInfoBuilder withIsDepositPublished(boolean isDepositPublished) { + this.isDepositPublished = isDepositPublished; + return this; + } + + public TradeInfoBuilder withIsDepositConfirmed(boolean isDepositConfirmed) { + this.isDepositConfirmed = isDepositConfirmed; + return this; + } + + public TradeInfoBuilder withIsFiatSent(boolean isFiatSent) { + this.isFiatSent = isFiatSent; + return this; + } + + public TradeInfoBuilder withIsFiatReceived(boolean isFiatReceived) { + this.isFiatReceived = isFiatReceived; + return this; + } + + public TradeInfoBuilder withIsPayoutPublished(boolean isPayoutPublished) { + this.isPayoutPublished = isPayoutPublished; + return this; + } + + public TradeInfoBuilder withIsWithdrawn(boolean isWithdrawn) { + this.isWithdrawn = isWithdrawn; + return this; + } + + public TradeInfoBuilder withContractAsJson(String contractAsJson) { + this.contractAsJson = contractAsJson; + return this; + } + + public TradeInfo build() { + return new TradeInfo(this); + } + } + + @Override + public String toString() { + return "TradeInfo{" + + " tradeId='" + tradeId + '\'' + "\n" + + ", shortId='" + shortId + '\'' + "\n" + + ", date='" + date + '\'' + "\n" + + ", role='" + role + '\'' + "\n" + + ", isCurrencyForTakerFeeBtc='" + isCurrencyForTakerFeeBtc + '\'' + "\n" + + ", txFeeAsLong='" + txFeeAsLong + '\'' + "\n" + + ", takerFeeAsLong='" + takerFeeAsLong + '\'' + "\n" + + ", takerFeeTxId='" + takerFeeTxId + '\'' + "\n" + + ", depositTxId='" + depositTxId + '\'' + "\n" + + ", payoutTxId='" + payoutTxId + '\'' + "\n" + + ", tradeAmountAsLong='" + tradeAmountAsLong + '\'' + "\n" + + ", tradePrice='" + tradePrice + '\'' + "\n" + + ", tradingPeerNodeAddress='" + tradingPeerNodeAddress + '\'' + "\n" + + ", state='" + state + '\'' + "\n" + + ", phase='" + phase + '\'' + "\n" + + ", tradePeriodState='" + tradePeriodState + '\'' + "\n" + + ", isDepositPublished=" + isDepositPublished + "\n" + + ", isDepositConfirmed=" + isDepositConfirmed + "\n" + + ", isFiatSent=" + isFiatSent + "\n" + + ", isFiatReceived=" + isFiatReceived + "\n" + + ", isPayoutPublished=" + isPayoutPublished + "\n" + + ", isWithdrawn=" + isWithdrawn + "\n" + + ", offer=" + offer + "\n" + + ", contractAsJson=" + contractAsJson + "\n" + + '}'; + } +} diff --git a/core/src/main/java/bisq/core/app/BisqExecutable.java b/core/src/main/java/bisq/core/app/BisqExecutable.java index 66c03dede4..67270b5c6d 100644 --- a/core/src/main/java/bisq/core/app/BisqExecutable.java +++ b/core/src/main/java/bisq/core/app/BisqExecutable.java @@ -68,6 +68,7 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet protected AppModule module; protected Config config; private boolean isShutdownInProgress; + private boolean hasDowngraded; public BisqExecutable(String fullName, String scriptName, String appName, String version) { this.fullName = fullName; @@ -133,9 +134,17 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet CommonSetup.setupUncaughtExceptionHandler(this); setupGuice(); setupAvoidStandbyMode(); - readAllPersisted(this::startApplication); - } + hasDowngraded = BisqSetup.hasDowngraded(); + if (hasDowngraded) { + // If user tried to downgrade we do not read the persisted data to avoid data corruption + // We call startApplication to enable UI to show popup. We prevent in BisqSetup to go further + // in the process and require a shut down. + startApplication(); + } else { + readAllPersisted(this::startApplication); + } + } /////////////////////////////////////////////////////////////////////////////////////////// // We continue with a series of synchronous execution tasks @@ -168,15 +177,12 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet } AtomicInteger remaining = new AtomicInteger(hosts.size()); - hosts.forEach(e -> { - new Thread(() -> { - e.readPersisted(); - remaining.decrementAndGet(); - if (remaining.get() == 0) { + hosts.forEach(host -> { + host.readPersisted(() -> { + if (remaining.decrementAndGet() == 0) { UserThread.execute(completeHandler); } - - }, "BisqExecutable-read-" + e.getClass().getSimpleName()).start(); + }); }); } @@ -239,11 +245,16 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet injector.getInstance(P2PService.class).shutDown(() -> { log.info("P2PService shutdown completed"); module.close(injector); - PersistenceManager.flushAllDataToDisk(() -> { - log.info("Graceful shutdown completed. Exiting now."); - resultHandler.handleResult(); - System.exit(EXIT_SUCCESS); - }); + if (!hasDowngraded) { + // If user tried to downgrade we do not write the persistable data to avoid data corruption + PersistenceManager.flushAllDataToDisk(() -> { + log.info("Graceful shutdown completed. Exiting now."); + resultHandler.handleResult(); + UserThread.runAfter(() -> System.exit(EXIT_SUCCESS), 1); + }); + } else { + UserThread.runAfter(() -> System.exit(EXIT_SUCCESS), 1); + } }); }); walletsSetup.shutDown(); @@ -253,20 +264,31 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet // Wait max 20 sec. UserThread.runAfter(() -> { log.warn("Timeout triggered resultHandler"); - PersistenceManager.flushAllDataToDisk(() -> { - log.info("Graceful shutdown resulted in a timeout. Exiting now."); - resultHandler.handleResult(); - System.exit(EXIT_SUCCESS); - }); + if (!hasDowngraded) { + // If user tried to downgrade we do not write the persistable data to avoid data corruption + PersistenceManager.flushAllDataToDisk(() -> { + log.info("Graceful shutdown resulted in a timeout. Exiting now."); + resultHandler.handleResult(); + UserThread.runAfter(() -> System.exit(EXIT_SUCCESS), 1); + }); + } else { + UserThread.runAfter(() -> System.exit(EXIT_SUCCESS), 1); + } + }, 20); } catch (Throwable t) { log.error("App shutdown failed with exception {}", t.toString()); t.printStackTrace(); - PersistenceManager.flushAllDataToDisk(() -> { - log.info("Graceful shutdown resulted in an error. Exiting now."); - resultHandler.handleResult(); - System.exit(EXIT_FAILURE); - }); + if (!hasDowngraded) { + // If user tried to downgrade we do not write the persistable data to avoid data corruption + PersistenceManager.flushAllDataToDisk(() -> { + log.info("Graceful shutdown resulted in an error. Exiting now."); + resultHandler.handleResult(); + UserThread.runAfter(() -> System.exit(EXIT_FAILURE), 1); + }); + } else { + UserThread.runAfter(() -> System.exit(EXIT_FAILURE), 1); + } } } diff --git a/core/src/main/java/bisq/core/app/BisqHeadlessApp.java b/core/src/main/java/bisq/core/app/BisqHeadlessApp.java index 71a6ab4e39..38c9f47852 100644 --- a/core/src/main/java/bisq/core/app/BisqHeadlessApp.java +++ b/core/src/main/java/bisq/core/app/BisqHeadlessApp.java @@ -20,6 +20,7 @@ package bisq.core.app; import bisq.core.trade.TradeManager; import bisq.common.UserThread; +import bisq.common.app.Version; import bisq.common.file.CorruptedStorageFileHandler; import bisq.common.setup.GracefulShutDownHandler; @@ -94,6 +95,8 @@ public class BisqHeadlessApp implements HeadlessApp { bisqSetup.setRevolutAccountsUpdateHandler(revolutAccountList -> log.info("setRevolutAccountsUpdateHandler: revolutAccountList={}", revolutAccountList)); bisqSetup.setOsxKeyLoggerWarningHandler(() -> log.info("setOsxKeyLoggerWarningHandler")); bisqSetup.setQubesOSInfoHandler(() -> log.info("setQubesOSInfoHandler")); + bisqSetup.setDownGradePreventionHandler(lastVersion -> log.info("Downgrade from version {} to version {} is not supported", + lastVersion, Version.VERSION)); corruptedStorageFileHandler.getFiles().ifPresent(files -> log.warn("getCorruptedDatabaseFiles. files={}", files)); tradeManager.setTakeOfferRequestErrorMessageHandler(errorMessage -> log.error("onTakeOfferRequestErrorMessageHandler")); diff --git a/core/src/main/java/bisq/core/app/BisqSetup.java b/core/src/main/java/bisq/core/app/BisqSetup.java index 3660544f60..925b5e793a 100644 --- a/core/src/main/java/bisq/core/app/BisqSetup.java +++ b/core/src/main/java/bisq/core/app/BisqSetup.java @@ -48,6 +48,7 @@ import bisq.common.Timer; import bisq.common.UserThread; import bisq.common.app.DevEnv; import bisq.common.app.Log; +import bisq.common.app.Version; import bisq.common.config.Config; import bisq.common.util.InvalidVersionException; import bisq.common.util.Utilities; @@ -71,11 +72,15 @@ import javafx.collections.SetChangeListener; import org.bouncycastle.crypto.params.KeyParameter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Scanner; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; @@ -92,6 +97,7 @@ import javax.annotation.Nullable; @Slf4j @Singleton public class BisqSetup { + private static final String VERSION_FILE_NAME = "version"; public interface BisqSetupListener { default void onInitP2pNetwork() { @@ -172,6 +178,9 @@ public class BisqSetup { @Setter @Nullable private Runnable qubesOSInfoHandler; + @Setter + @Nullable + private Consumer downGradePreventionHandler; @Getter final BooleanProperty newVersionAvailableProperty = new SimpleBooleanProperty(false); @@ -255,12 +264,17 @@ public class BisqSetup { } public void start() { + // If user tried to downgrade we require a shutdown + if (hasDowngraded(downGradePreventionHandler)) { + return; + } + + persistBisqVersion(); maybeReSyncSPVChain(); maybeShowTac(this::step2); } private void step2() { - torSetup.cleanupTorFiles(); readMapsFromResources(this::step3); checkForCorrectOSArchitecture(); checkOSXVersion(); @@ -317,11 +331,9 @@ public class BisqSetup { } } - private void readMapsFromResources(Runnable nextStep) { - SetupUtils.readFromResources(p2PService.getP2PDataStorage(), config).addListener((observable, oldValue, newValue) -> { - if (newValue) - nextStep.run(); - }); + private void readMapsFromResources(Runnable completeHandler) { + String postFix = "_" + config.baseCurrencyNetwork.name(); + p2PService.getP2PDataStorage().readFromResources(postFix, completeHandler); } private void startP2pNetworkAndWallet(Runnable nextStep) { @@ -390,7 +402,7 @@ public class BisqSetup { requestWalletPasswordHandler.accept(aesKey -> { walletsManager.setAesKey(aesKey); walletsSetup.getWalletConfig().maybeAddSegwitKeychain(walletsSetup.getWalletConfig().btcWallet(), - aesKey); + aesKey); if (preferences.isResyncSpvRequested()) { if (showFirstPopupIfResyncSPVRequestedHandler != null) showFirstPopupIfResyncSPVRequestedHandler.run(); @@ -490,6 +502,68 @@ public class BisqSetup { }); } + @Nullable + public static String getLastBisqVersion() { + File versionFile = getVersionFile(); + if (!versionFile.exists()) { + return null; + } + try (Scanner scanner = new Scanner(versionFile)) { + // We only expect 1 line + if (scanner.hasNextLine()) { + return scanner.nextLine(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + return null; + } + + private static File getVersionFile() { + return new File(Config.appDataDir(), VERSION_FILE_NAME); + } + + public static boolean hasDowngraded() { + return hasDowngraded(getLastBisqVersion()); + } + + public static boolean hasDowngraded(String lastVersion) { + return lastVersion != null && Version.isNewVersion(lastVersion, Version.VERSION); + } + + public static boolean hasDowngraded(@Nullable Consumer downGradePreventionHandler) { + String lastVersion = getLastBisqVersion(); + boolean hasDowngraded = hasDowngraded(lastVersion); + if (hasDowngraded) { + log.error("Downgrade from version {} to version {} is not supported", lastVersion, Version.VERSION); + if (downGradePreventionHandler != null) { + downGradePreventionHandler.accept(lastVersion); + } + } + return hasDowngraded; + } + + public static void persistBisqVersion() { + File versionFile = getVersionFile(); + if (!versionFile.exists()) { + try { + if (!versionFile.createNewFile()) { + log.error("Version file could not be created"); + } + } catch (IOException e) { + e.printStackTrace(); + log.error("Version file could not be created. {}", e.toString()); + } + } + + try (FileWriter fileWriter = new FileWriter(versionFile, false)) { + fileWriter.write(Version.VERSION); + } catch (IOException e) { + e.printStackTrace(); + log.error("Writing Version failed. {}", e.toString()); + } + } + private void checkForCorrectOSArchitecture() { if (!Utilities.isCorrectOSArchitecture() && wrongOSArchitectureHandler != null) { String osArchitecture = Utilities.getOSArchitecture(); diff --git a/core/src/main/java/bisq/core/app/DomainInitialisation.java b/core/src/main/java/bisq/core/app/DomainInitialisation.java index 614ba083c7..dcbd849102 100644 --- a/core/src/main/java/bisq/core/app/DomainInitialisation.java +++ b/core/src/main/java/bisq/core/app/DomainInitialisation.java @@ -45,6 +45,8 @@ import bisq.core.support.dispute.refund.RefundManager; import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; import bisq.core.support.traderchat.TraderChatManager; import bisq.core.trade.TradeManager; +import bisq.core.trade.closed.ClosedTradableManager; +import bisq.core.trade.failed.FailedTradesManager; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.trade.txproof.xmr.XmrTxProofService; import bisq.core.user.User; @@ -76,6 +78,8 @@ public class DomainInitialisation { private final RefundManager refundManager; private final TraderChatManager traderChatManager; private final TradeManager tradeManager; + private final ClosedTradableManager closedTradableManager; + private final FailedTradesManager failedTradesManager; private final XmrTxProofService xmrTxProofService; private final OpenOfferManager openOfferManager; private final Balances balances; @@ -109,6 +113,8 @@ public class DomainInitialisation { RefundManager refundManager, TraderChatManager traderChatManager, TradeManager tradeManager, + ClosedTradableManager closedTradableManager, + FailedTradesManager failedTradesManager, XmrTxProofService xmrTxProofService, OpenOfferManager openOfferManager, Balances balances, @@ -140,6 +146,8 @@ public class DomainInitialisation { this.refundManager = refundManager; this.traderChatManager = traderChatManager; this.tradeManager = tradeManager; + this.closedTradableManager = closedTradableManager; + this.failedTradesManager = failedTradesManager; this.xmrTxProofService = xmrTxProofService; this.openOfferManager = openOfferManager; this.balances = balances; @@ -183,6 +191,8 @@ public class DomainInitialisation { traderChatManager.onAllServicesInitialized(); tradeManager.onAllServicesInitialized(); + closedTradableManager.onAllServicesInitialized(); + failedTradesManager.onAllServicesInitialized(); xmrTxProofService.onAllServicesInitialized(); openOfferManager.onAllServicesInitialized(); diff --git a/core/src/main/java/bisq/core/app/P2PNetworkSetup.java b/core/src/main/java/bisq/core/app/P2PNetworkSetup.java index 76527919dc..0516863c91 100644 --- a/core/src/main/java/bisq/core/app/P2PNetworkSetup.java +++ b/core/src/main/java/bisq/core/app/P2PNetworkSetup.java @@ -17,6 +17,7 @@ package bisq.core.app; +import bisq.core.btc.setup.WalletsSetup; import bisq.core.locale.Res; import bisq.core.provider.price.PriceFeedService; import bisq.core.user.Preferences; @@ -50,6 +51,7 @@ import javax.annotation.Nullable; public class P2PNetworkSetup { private final PriceFeedService priceFeedService; private final P2PService p2PService; + private final WalletsSetup walletsSetup; private final Preferences preferences; @SuppressWarnings("FieldCanBeLocal") @@ -73,10 +75,12 @@ public class P2PNetworkSetup { @Inject public P2PNetworkSetup(PriceFeedService priceFeedService, P2PService p2PService, + WalletsSetup walletsSetup, Preferences preferences) { this.priceFeedService = priceFeedService; this.p2PService = p2PService; + this.walletsSetup = walletsSetup; this.preferences = preferences; } @@ -86,18 +90,19 @@ public class P2PNetworkSetup { BooleanProperty hiddenServicePublished = new SimpleBooleanProperty(); BooleanProperty initialP2PNetworkDataReceived = new SimpleBooleanProperty(); - p2PNetworkInfoBinding = EasyBind.combine(bootstrapState, bootstrapWarning, p2PService.getNumConnectedPeers(), hiddenServicePublished, initialP2PNetworkDataReceived, - (state, warning, numPeers, hiddenService, dataReceived) -> { + p2PNetworkInfoBinding = EasyBind.combine(bootstrapState, bootstrapWarning, p2PService.getNumConnectedPeers(), + walletsSetup.numPeersProperty(), hiddenServicePublished, initialP2PNetworkDataReceived, + (state, warning, numP2pPeers, numBtcPeers, hiddenService, dataReceived) -> { String result; String daoFullNode = preferences.isDaoFullNode() ? Res.get("mainView.footer.daoFullNode") + " / " : ""; - int peers = (int) numPeers; - if (warning != null && peers == 0) { + int p2pPeers = (int) numP2pPeers; + if (warning != null && p2pPeers == 0) { result = warning; } else { - String p2pInfo = Res.get("mainView.footer.p2pInfo", numPeers); + String p2pInfo = Res.get("mainView.footer.p2pInfo", numBtcPeers, numP2pPeers); if (dataReceived && hiddenService) { result = p2pInfo; - } else if (peers == 0) + } else if (p2pPeers == 0) result = state; else result = state + " / " + p2pInfo; diff --git a/core/src/main/java/bisq/core/app/SetupUtils.java b/core/src/main/java/bisq/core/app/SetupUtils.java deleted file mode 100644 index eb210da5fe..0000000000 --- a/core/src/main/java/bisq/core/app/SetupUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.app; - -import bisq.network.p2p.storage.P2PDataStorage; - -import bisq.common.UserThread; -import bisq.common.config.BaseCurrencyNetwork; -import bisq.common.config.Config; - -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.SimpleBooleanProperty; - -import java.util.Date; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class SetupUtils { - - public static BooleanProperty readFromResources(P2PDataStorage p2PDataStorage, Config config) { - BooleanProperty result = new SimpleBooleanProperty(); - new Thread(() -> { - // Used to load different files per base currency (EntryMap_BTC_MAINNET, EntryMap_LTC,...) - final BaseCurrencyNetwork baseCurrencyNetwork = config.baseCurrencyNetwork; - final String postFix = "_" + baseCurrencyNetwork.name(); - long ts = new Date().getTime(); - p2PDataStorage.readFromResources(postFix); - log.info("readFromResources took {} ms", (new Date().getTime() - ts)); - UserThread.execute(() -> result.set(true)); - }, "BisqSetup-readFromResources").start(); - return result; - } -} diff --git a/core/src/main/java/bisq/core/app/TorSetup.java b/core/src/main/java/bisq/core/app/TorSetup.java index b2ff5378b7..b855e51462 100644 --- a/core/src/main/java/bisq/core/app/TorSetup.java +++ b/core/src/main/java/bisq/core/app/TorSetup.java @@ -46,15 +46,7 @@ public class TorSetup { this.torDir = checkDir(torDir); } - public void cleanupTorFiles() { - cleanupTorFiles(null, null); - } - - // We get sometimes Tor startup problems which is related to some tor files in the tor directory. It happens - // more often if the application got killed (not graceful shutdown). - // Creating all tor files newly takes about 3-4 sec. longer and it does not benefit from cache files. - // TODO: We should fix those startup problems in the netlayer library, once fixed there we can remove that call at the - // Bisq startup again. + // Should only be called if needed. Slows down Tor startup from about 5 sec. to 30 sec. if it gets deleted. public void cleanupTorFiles(@Nullable Runnable resultHandler, @Nullable ErrorMessageHandler errorMessageHandler) { File hiddenservice = new File(Paths.get(torDir.getAbsolutePath(), "hiddenservice").toString()); try { diff --git a/core/src/main/java/bisq/core/app/WalletAppSetup.java b/core/src/main/java/bisq/core/app/WalletAppSetup.java index c9b276b294..8d844561b3 100644 --- a/core/src/main/java/bisq/core/app/WalletAppSetup.java +++ b/core/src/main/java/bisq/core/app/WalletAppSetup.java @@ -23,6 +23,7 @@ import bisq.core.btc.setup.WalletsSetup; import bisq.core.btc.wallet.WalletsManager; import bisq.core.locale.Res; import bisq.core.offer.OpenOfferManager; +import bisq.core.provider.fee.FeeService; import bisq.core.trade.TradeManager; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; @@ -64,6 +65,7 @@ public class WalletAppSetup { private final WalletsManager walletsManager; private final WalletsSetup walletsSetup; + private final FeeService feeService; private final Config config; private final Preferences preferences; @@ -81,17 +83,17 @@ public class WalletAppSetup { @Getter private final ObjectProperty rejectedTxException = new SimpleObjectProperty<>(); @Getter - private int numBtcPeers = 0; - @Getter private final BooleanProperty useTorForBTC = new SimpleBooleanProperty(); @Inject public WalletAppSetup(WalletsManager walletsManager, WalletsSetup walletsSetup, + FeeService feeService, Config config, Preferences preferences) { this.walletsManager = walletsManager; this.walletsSetup = walletsSetup; + this.feeService = feeService; this.config = config; this.preferences = preferences; this.useTorForBTC.set(preferences.getUseTorForBitcoinJ()); @@ -105,40 +107,36 @@ public class WalletAppSetup { Runnable downloadCompleteHandler, Runnable walletInitializedHandler) { log.info("Initialize WalletAppSetup with BitcoinJ version {} and hash of BitcoinJ commit {}", - VersionMessage.BITCOINJ_VERSION, "a733034"); + VersionMessage.BITCOINJ_VERSION, "7752cb7"); ObjectProperty walletServiceException = new SimpleObjectProperty<>(); btcInfoBinding = EasyBind.combine(walletsSetup.downloadPercentageProperty(), - walletsSetup.numPeersProperty(), + feeService.feeUpdateCounterProperty(), walletServiceException, - (downloadPercentage, numPeers, exception) -> { + (downloadPercentage, feeUpdate, exception) -> { String result; if (exception == null) { double percentage = (double) downloadPercentage; - int peers = (int) numPeers; btcSyncProgress.set(percentage); if (percentage == 1) { result = Res.get("mainView.footer.btcInfo", - peers, Res.get("mainView.footer.btcInfo.synchronizedWith"), - getBtcNetworkAsString()); + getBtcNetworkAsString(), + feeService.getFeeTextForDisplay()); getBtcSplashSyncIconId().set("image-connection-synced"); downloadCompleteHandler.run(); } else if (percentage > 0.0) { result = Res.get("mainView.footer.btcInfo", - peers, Res.get("mainView.footer.btcInfo.synchronizingWith"), - getBtcNetworkAsString() + ": " + FormattingUtils.formatToPercentWithSymbol(percentage)); + getBtcNetworkAsString() + ": " + FormattingUtils.formatToPercentWithSymbol(percentage), ""); } else { result = Res.get("mainView.footer.btcInfo", - peers, Res.get("mainView.footer.btcInfo.connectingTo"), - getBtcNetworkAsString()); + getBtcNetworkAsString(), ""); } } else { result = Res.get("mainView.footer.btcInfo", - getNumBtcPeers(), Res.get("mainView.footer.btcInfo.connectionFailed"), getBtcNetworkAsString()); log.error(exception.toString()); @@ -164,8 +162,6 @@ public class WalletAppSetup { walletsSetup.initialize(null, () -> { - numBtcPeers = walletsSetup.numPeersProperty().get(); - // We only check one wallet as we apply encryption to all or none if (walletsManager.areWalletsEncrypted()) { walletPasswordHandler.run(); @@ -251,6 +247,7 @@ public class WalletAppSetup { String finalDetails = details; UserThread.runAfter(() -> { trade.setErrorMessage(newValue.getMessage()); + tradeManager.requestPersistence(); if (rejectedTxErrorMessageHandler != null) { rejectedTxErrorMessageHandler.accept(Res.get("popup.warning.trade.txRejected", finalDetails, trade.getShortId(), txId)); diff --git a/core/src/main/java/bisq/core/app/misc/AppSetupWithP2P.java b/core/src/main/java/bisq/core/app/misc/AppSetupWithP2P.java index 8b2dc545d6..952d63e3b8 100644 --- a/core/src/main/java/bisq/core/app/misc/AppSetupWithP2P.java +++ b/core/src/main/java/bisq/core/app/misc/AppSetupWithP2P.java @@ -19,8 +19,6 @@ package bisq.core.app.misc; import bisq.core.account.sign.SignedWitnessService; import bisq.core.account.witness.AccountAgeWitnessService; -import bisq.core.app.SetupUtils; -import bisq.core.app.TorSetup; import bisq.core.filter.FilterManager; import bisq.core.trade.statistics.TradeStatisticsManager; @@ -29,6 +27,8 @@ import bisq.network.p2p.P2PServiceListener; import bisq.network.p2p.network.CloseConnectionReason; import bisq.network.p2p.network.Connection; import bisq.network.p2p.network.ConnectionListener; +import bisq.network.p2p.peers.PeerManager; +import bisq.network.p2p.storage.P2PDataStorage; import bisq.common.config.Config; import bisq.common.proto.persistable.PersistedDataHost; @@ -48,38 +48,42 @@ public class AppSetupWithP2P extends AppSetup { protected final AccountAgeWitnessService accountAgeWitnessService; private final SignedWitnessService signedWitnessService; protected final FilterManager filterManager; - private final TorSetup torSetup; - protected BooleanProperty p2pNetWorkReady; + private final P2PDataStorage p2PDataStorage; + private final PeerManager peerManager; protected final TradeStatisticsManager tradeStatisticsManager; protected ArrayList persistedDataHosts; + protected BooleanProperty p2pNetWorkReady; @Inject public AppSetupWithP2P(P2PService p2PService, + P2PDataStorage p2PDataStorage, + PeerManager peerManager, TradeStatisticsManager tradeStatisticsManager, AccountAgeWitnessService accountAgeWitnessService, SignedWitnessService signedWitnessService, FilterManager filterManager, - TorSetup torSetup, Config config) { super(config); this.p2PService = p2PService; + this.p2PDataStorage = p2PDataStorage; + this.peerManager = peerManager; this.tradeStatisticsManager = tradeStatisticsManager; this.accountAgeWitnessService = accountAgeWitnessService; this.signedWitnessService = signedWitnessService; this.filterManager = filterManager; - this.torSetup = torSetup; this.persistedDataHosts = new ArrayList<>(); } @Override public void initPersistedDataHosts() { - torSetup.cleanupTorFiles(); - persistedDataHosts.add(p2PService); + persistedDataHosts.add(p2PDataStorage); + persistedDataHosts.add(peerManager); // we apply at startup the reading of persisted data but don't want to get it triggered in the constructor persistedDataHosts.forEach(e -> { try { - e.readPersisted(); + e.readPersisted(() -> { + }); } catch (Throwable e1) { log.error("readPersisted error", e1); } @@ -88,10 +92,8 @@ public class AppSetupWithP2P extends AppSetup { @Override protected void initBasicServices() { - SetupUtils.readFromResources(p2PService.getP2PDataStorage(), config).addListener((observable, oldValue, newValue) -> { - if (newValue) - startInitP2PNetwork(); - }); + String postFix = "_" + config.baseCurrencyNetwork.name(); + p2PDataStorage.readFromResources(postFix, this::startInitP2PNetwork); } private void startInitP2PNetwork() { diff --git a/core/src/main/java/bisq/core/app/misc/AppSetupWithP2PAndDAO.java b/core/src/main/java/bisq/core/app/misc/AppSetupWithP2PAndDAO.java index 3331906c8d..95751832c9 100644 --- a/core/src/main/java/bisq/core/app/misc/AppSetupWithP2PAndDAO.java +++ b/core/src/main/java/bisq/core/app/misc/AppSetupWithP2PAndDAO.java @@ -19,7 +19,6 @@ package bisq.core.app.misc; import bisq.core.account.sign.SignedWitnessService; import bisq.core.account.witness.AccountAgeWitnessService; -import bisq.core.app.TorSetup; import bisq.core.dao.DaoSetup; import bisq.core.dao.governance.ballot.BallotListService; import bisq.core.dao.governance.blindvote.MyBlindVoteListService; @@ -31,6 +30,8 @@ import bisq.core.filter.FilterManager; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.network.p2p.P2PService; +import bisq.network.p2p.peers.PeerManager; +import bisq.network.p2p.storage.P2PDataStorage; import bisq.common.config.Config; @@ -44,6 +45,8 @@ public class AppSetupWithP2PAndDAO extends AppSetupWithP2P { @Inject public AppSetupWithP2PAndDAO(P2PService p2PService, + P2PDataStorage p2PDataStorage, + PeerManager peerManager, TradeStatisticsManager tradeStatisticsManager, AccountAgeWitnessService accountAgeWitnessService, SignedWitnessService signedWitnessService, @@ -55,14 +58,14 @@ public class AppSetupWithP2PAndDAO extends AppSetupWithP2P { MyProposalListService myProposalListService, MyReputationListService myReputationListService, MyProofOfBurnListService myProofOfBurnListService, - TorSetup torSetup, Config config) { super(p2PService, + p2PDataStorage, + peerManager, tradeStatisticsManager, accountAgeWitnessService, signedWitnessService, filterManager, - torSetup, config); this.daoSetup = daoSetup; diff --git a/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java b/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java index ef2c7dffaf..9ab2eeb738 100644 --- a/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java +++ b/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java @@ -95,7 +95,7 @@ public abstract class ExecutableForAppWithP2p extends BisqExecutable { PersistenceManager.flushAllDataToDisk(() -> { resultHandler.handleResult(); log.info("Graceful shutdown completed. Exiting now."); - System.exit(BisqExecutable.EXIT_SUCCESS); + UserThread.runAfter(() -> System.exit(BisqExecutable.EXIT_SUCCESS), 1); }); }); injector.getInstance(WalletsSetup.class).shutDown(); @@ -107,7 +107,7 @@ public abstract class ExecutableForAppWithP2p extends BisqExecutable { PersistenceManager.flushAllDataToDisk(() -> { resultHandler.handleResult(); log.info("Graceful shutdown caused a timeout. Exiting now."); - System.exit(BisqExecutable.EXIT_SUCCESS); + UserThread.runAfter(() -> System.exit(BisqExecutable.EXIT_SUCCESS), 1); }); }, 5); } else { @@ -122,7 +122,7 @@ public abstract class ExecutableForAppWithP2p extends BisqExecutable { PersistenceManager.flushAllDataToDisk(() -> { resultHandler.handleResult(); log.info("Graceful shutdown resulted in an error. Exiting now."); - System.exit(BisqExecutable.EXIT_FAILURE); + UserThread.runAfter(() -> System.exit(BisqExecutable.EXIT_FAILURE), 1); }); } diff --git a/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java b/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java index c0fbfb5b68..7a98de5d83 100644 --- a/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java +++ b/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java @@ -41,9 +41,23 @@ import static com.google.common.base.Preconditions.checkArgument; */ @Slf4j public class TxFeeEstimationService { - public static int TYPICAL_TX_WITH_1_INPUT_SIZE = 260; - private static int DEPOSIT_TX_SIZE = 320; - private static int PAYOUT_TX_SIZE = 380; + +// Size/vsize of typical trade txs +// Real txs size/vsize may vary in 1 or 2 bytes from the estimated values. +// Values calculated with https://gist.github.com/oscarguindzberg/3d1349cb65d9fd9af9de0feaa3fd27ac +// legacy fee tx with 1 input, maker/taker fee paid in btc size/vsize = 258 +// legacy deposit tx without change size/vsize = 381 +// legacy deposit tx with change size/vsize = 414 +// legacy payout tx size/vsize = 337 +// legacy delayed payout tx size/vsize = 302 +// segwit fee tx with 1 input, maker/taker fee paid in btc vsize = 173 +// segwit deposit tx without change vsize = 232 +// segwit deposit tx with change vsize = 263 +// segwit payout tx vsize = 169 +// segwit delayed payout tx vsize = 139 + public static int TYPICAL_TX_WITH_1_INPUT_VSIZE = 175; + private static int DEPOSIT_TX_VSIZE = 233; + private static int BSQ_INPUT_INCREASE = 150; private static int MAX_ITERATIONS = 10; @@ -61,8 +75,8 @@ public class TxFeeEstimationService { this.preferences = preferences; } - public Tuple2 getEstimatedFeeAndTxSizeForTaker(Coin fundsNeededForTrade, Coin tradeFee) { - return getEstimatedFeeAndTxSize(true, + public Tuple2 getEstimatedFeeAndTxVsizeForTaker(Coin fundsNeededForTrade, Coin tradeFee) { + return getEstimatedFeeAndTxVsize(true, fundsNeededForTrade, tradeFee, feeService, @@ -70,9 +84,9 @@ public class TxFeeEstimationService { preferences); } - public Tuple2 getEstimatedFeeAndTxSizeForMaker(Coin reservedFundsForOffer, - Coin tradeFee) { - return getEstimatedFeeAndTxSize(false, + public Tuple2 getEstimatedFeeAndTxVsizeForMaker(Coin reservedFundsForOffer, + Coin tradeFee) { + return getEstimatedFeeAndTxVsize(false, reservedFundsForOffer, tradeFee, feeService, @@ -80,120 +94,120 @@ public class TxFeeEstimationService { preferences); } - private Tuple2 getEstimatedFeeAndTxSize(boolean isTaker, - Coin amount, - Coin tradeFee, - FeeService feeService, - BtcWalletService btcWalletService, - Preferences preferences) { - Coin txFeePerByte = feeService.getTxFeePerByte(); - // We start with min taker fee size of 260 - int estimatedTxSize = TYPICAL_TX_WITH_1_INPUT_SIZE; + private Tuple2 getEstimatedFeeAndTxVsize(boolean isTaker, + Coin amount, + Coin tradeFee, + FeeService feeService, + BtcWalletService btcWalletService, + Preferences preferences) { + Coin txFeePerVbyte = feeService.getTxFeePerVbyte(); + // We start with min taker fee vsize of 175 + int estimatedTxVsize = TYPICAL_TX_WITH_1_INPUT_VSIZE; try { - estimatedTxSize = getEstimatedTxSize(List.of(tradeFee, amount), estimatedTxSize, txFeePerByte, btcWalletService); + estimatedTxVsize = getEstimatedTxVsize(List.of(tradeFee, amount), estimatedTxVsize, txFeePerVbyte, btcWalletService); } catch (InsufficientMoneyException e) { if (isTaker) { - // if we cannot do the estimation we use the payout tx size - estimatedTxSize = PAYOUT_TX_SIZE; + // If we cannot do the estimation, we use the vsize o the largest of our txs which is the deposit tx. + estimatedTxVsize = DEPOSIT_TX_VSIZE; } log.info("We cannot do the fee estimation because there are not enough funds in the wallet. This is expected " + - "if the user pays from an external wallet. In that case we use an estimated tx size of {} bytes.", estimatedTxSize); + "if the user pays from an external wallet. In that case we use an estimated tx vsize of {} vbytes.", estimatedTxVsize); } if (!preferences.isPayFeeInBtc()) { // If we pay the fee in BSQ we have one input more which adds about 150 bytes // TODO: Clarify if there is always just one additional input or if there can be more. - estimatedTxSize += BSQ_INPUT_INCREASE; + estimatedTxVsize += BSQ_INPUT_INCREASE; } Coin txFee; - int size; + int vsize; if (isTaker) { - int averageSize = (estimatedTxSize + DEPOSIT_TX_SIZE) / 2; // deposit tx has about 320 bytes - // We use at least the size of the payout tx to not underpay at payout. - size = Math.max(PAYOUT_TX_SIZE, averageSize); - txFee = txFeePerByte.multiply(size); - log.info("Fee estimation resulted in a tx size of {} bytes.\n" + - "We use an average between the taker fee tx and the deposit tx (320 bytes) which results in {} bytes.\n" + - "The payout tx has 380 bytes, we use that as our min value. Size for fee calculation is {} bytes.\n" + - "The tx fee of {} Sat", estimatedTxSize, averageSize, size, txFee.value); + int averageVsize = (estimatedTxVsize + DEPOSIT_TX_VSIZE) / 2; // deposit tx has about 233 vbytes + // We use at least the vsize of the deposit tx to not underpay it. + vsize = Math.max(DEPOSIT_TX_VSIZE, averageVsize); + txFee = txFeePerVbyte.multiply(vsize); + log.info("Fee estimation resulted in a tx vsize of {} vbytes.\n" + + "We use an average between the taker fee tx and the deposit tx (233 vbytes) which results in {} vbytes.\n" + + "The deposit tx has 233 vbytes, we use that as our min value. Vsize for fee calculation is {} vbytes.\n" + + "The tx fee of {} Sat", estimatedTxVsize, averageVsize, vsize, txFee.value); } else { - size = estimatedTxSize; - txFee = txFeePerByte.multiply(size); - log.info("Fee estimation resulted in a tx size of {} bytes and a tx fee of {} Sat.", size, txFee.value); + vsize = estimatedTxVsize; + txFee = txFeePerVbyte.multiply(vsize); + log.info("Fee estimation resulted in a tx vsize of {} vbytes and a tx fee of {} Sat.", vsize, txFee.value); } - return new Tuple2<>(txFee, size); + return new Tuple2<>(txFee, vsize); } - public Tuple2 getEstimatedFeeAndTxSize(Coin amount, - FeeService feeService, - BtcWalletService btcWalletService) { - Coin txFeePerByte = feeService.getTxFeePerByte(); - // We start with min taker fee size of 260 - int estimatedTxSize = TYPICAL_TX_WITH_1_INPUT_SIZE; + public Tuple2 getEstimatedFeeAndTxVsize(Coin amount, + FeeService feeService, + BtcWalletService btcWalletService) { + Coin txFeePerVbyte = feeService.getTxFeePerVbyte(); + // We start with min taker fee vsize of 175 + int estimatedTxVsize = TYPICAL_TX_WITH_1_INPUT_VSIZE; try { - estimatedTxSize = getEstimatedTxSize(List.of(amount), estimatedTxSize, txFeePerByte, btcWalletService); + estimatedTxVsize = getEstimatedTxVsize(List.of(amount), estimatedTxVsize, txFeePerVbyte, btcWalletService); } catch (InsufficientMoneyException e) { log.info("We cannot do the fee estimation because there are not enough funds in the wallet. This is expected " + - "if the user pays from an external wallet. In that case we use an estimated tx size of {} bytes.", estimatedTxSize); + "if the user pays from an external wallet. In that case we use an estimated tx vsize of {} vbytes.", estimatedTxVsize); } - Coin txFee = txFeePerByte.multiply(estimatedTxSize); - log.info("Fee estimation resulted in a tx size of {} bytes and a tx fee of {} Sat.", estimatedTxSize, txFee.value); + Coin txFee = txFeePerVbyte.multiply(estimatedTxVsize); + log.info("Fee estimation resulted in a tx vsize of {} vbytes and a tx fee of {} Sat.", estimatedTxVsize, txFee.value); - return new Tuple2<>(txFee, estimatedTxSize); + return new Tuple2<>(txFee, estimatedTxVsize); } - // We start with the initialEstimatedTxSize for a tx with 1 input (260) bytes and get from BitcoinJ a tx back which + // We start with the initialEstimatedTxVsize for a tx with 1 input (175) vbytes and get from BitcoinJ a tx back which // contains the required inputs to fund that tx (outputs + miner fee). The miner fee in that case is based on - // the assumption that we only need 1 input. Once we receive back the real tx size from the tx BitcoinJ has created - // with the required inputs we compare if the size is not more then 20% different to our assumed tx size. If we are inside - // that tolerance we use that tx size for our fee estimation, if not (if there has been more then 1 inputs) we - // apply the new fee based on the reported tx size and request again from BitcoinJ to fill that tx with the inputs + // the assumption that we only need 1 input. Once we receive back the real tx vsize from the tx BitcoinJ has created + // with the required inputs we compare if the vsize is not more then 20% different to our assumed tx vsize. If we are inside + // that tolerance we use that tx vsize for our fee estimation, if not (if there has been more then 1 inputs) we + // apply the new fee based on the reported tx vsize and request again from BitcoinJ to fill that tx with the inputs // to be sufficiently funded. The algorithm how BitcoinJ selects utxos is complex and contains several aspects // (minimize fee, don't create too many tiny utxos,...). We treat that algorithm as an unknown and it is not // guaranteed that there are more inputs required if we increase the fee (it could be that there is a better - // selection of inputs chosen if we have increased the fee and therefore less inputs and smaller tx size). As the increased fee might + // selection of inputs chosen if we have increased the fee and therefore less inputs and smaller tx vsize). As the increased fee might // change the number of inputs we need to repeat that process until we are inside of a certain tolerance. To avoid // potential endless loops we add a counter (we use 10, usually it takes just very few iterations). - // Worst case would be that the last size we got reported is > 20% off to - // the real tx size but as fee estimation is anyway a educated guess in the best case we don't worry too much. + // Worst case would be that the last vsize we got reported is > 20% off to + // the real tx vsize but as fee estimation is anyway a educated guess in the best case we don't worry too much. // If we have underpaid the tx might take longer to get confirmed. @VisibleForTesting - static int getEstimatedTxSize(List outputValues, - int initialEstimatedTxSize, - Coin txFeePerByte, - BtcWalletService btcWalletService) + static int getEstimatedTxVsize(List outputValues, + int initialEstimatedTxVsize, + Coin txFeePerVbyte, + BtcWalletService btcWalletService) throws InsufficientMoneyException { boolean isInTolerance; - int estimatedTxSize = initialEstimatedTxSize; - int realTxSize; + int estimatedTxVsize = initialEstimatedTxVsize; + int realTxVsize; int counter = 0; do { - Coin txFee = txFeePerByte.multiply(estimatedTxSize); - realTxSize = btcWalletService.getEstimatedFeeTxSize(outputValues, txFee); - isInTolerance = isInTolerance(estimatedTxSize, realTxSize, 0.2); + Coin txFee = txFeePerVbyte.multiply(estimatedTxVsize); + realTxVsize = btcWalletService.getEstimatedFeeTxVsize(outputValues, txFee); + isInTolerance = isInTolerance(estimatedTxVsize, realTxVsize, 0.2); if (!isInTolerance) { - estimatedTxSize = realTxSize; + estimatedTxVsize = realTxVsize; } counter++; } while (!isInTolerance && counter < MAX_ITERATIONS); if (!isInTolerance) { log.warn("We could not find a tx which satisfies our tolerance requirement of 20%. " + - "realTxSize={}, estimatedTxSize={}", - realTxSize, estimatedTxSize); + "realTxVsize={}, estimatedTxVsize={}", + realTxVsize, estimatedTxVsize); } - return estimatedTxSize; + return estimatedTxVsize; } @VisibleForTesting - static boolean isInTolerance(int estimatedSize, int txSize, double tolerance) { - checkArgument(estimatedSize > 0, "estimatedSize must be positive"); - checkArgument(txSize > 0, "txSize must be positive"); + static boolean isInTolerance(int estimatedVsize, int txVsize, double tolerance) { + checkArgument(estimatedVsize > 0, "estimatedVsize must be positive"); + checkArgument(txVsize > 0, "txVsize must be positive"); checkArgument(tolerance > 0, "tolerance must be positive"); - double deviation = Math.abs(1 - ((double) estimatedSize / (double) txSize)); + double deviation = Math.abs(1 - ((double) estimatedVsize / (double) txVsize)); return deviation <= tolerance; } } diff --git a/core/src/main/java/bisq/core/btc/model/AddressEntry.java b/core/src/main/java/bisq/core/btc/model/AddressEntry.java index a3a0387be2..5348950b39 100644 --- a/core/src/main/java/bisq/core/btc/model/AddressEntry.java +++ b/core/src/main/java/bisq/core/btc/model/AddressEntry.java @@ -97,10 +97,6 @@ public final class AddressEntry implements PersistablePayload { Context context, @Nullable String offerId, boolean segwit) { - if (segwit && (!Context.AVAILABLE.equals(context) || offerId != null)) { - throw new IllegalArgumentException("Segwit addresses are only allowed for " + - "AVAILABLE entries without an offerId"); - } this.keyPair = keyPair; this.context = context; this.offerId = offerId; diff --git a/core/src/main/java/bisq/core/btc/model/AddressEntryList.java b/core/src/main/java/bisq/core/btc/model/AddressEntryList.java index c88ebc40fb..ea25be3775 100644 --- a/core/src/main/java/bisq/core/btc/model/AddressEntryList.java +++ b/core/src/main/java/bisq/core/btc/model/AddressEntryList.java @@ -63,12 +63,13 @@ public final class AddressEntryList implements PersistableEnvelope, PersistedDat } @Override - public void readPersisted() { - AddressEntryList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - entrySet.clear(); - entrySet.addAll(persisted.entrySet); - } + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + entrySet.clear(); + entrySet.addAll(persisted.entrySet); + completeHandler.run(); + }, + completeHandler); } @@ -110,12 +111,12 @@ public final class AddressEntryList implements PersistableEnvelope, PersistedDat Set toBeRemoved = new HashSet<>(); entrySet.forEach(addressEntry -> { Script.ScriptType scriptType = addressEntry.isSegwit() ? Script.ScriptType.P2WPKH - : Script.ScriptType.P2PKH; + : Script.ScriptType.P2PKH; DeterministicKey keyFromPubHash = (DeterministicKey) wallet.findKeyFromPubKeyHash( - addressEntry.getPubKeyHash(), scriptType); + addressEntry.getPubKeyHash(), scriptType); if (keyFromPubHash != null) { Address addressFromKey = Address.fromKey(Config.baseCurrencyNetworkParameters(), keyFromPubHash, - scriptType); + scriptType); // We want to ensure key and address matches in case we have address in entry available already if (addressEntry.getAddress() == null || addressFromKey.equals(addressEntry.getAddress())) { addressEntry.setDeterministicKey(keyFromPubHash); @@ -197,8 +198,8 @@ public final class AddressEntryList implements PersistableEnvelope, PersistedDat public void swapToAvailable(AddressEntry addressEntry) { boolean setChangedByRemove = entrySet.remove(addressEntry); boolean setChangedByAdd = entrySet.add(new AddressEntry(addressEntry.getKeyPair(), - AddressEntry.Context.AVAILABLE, - addressEntry.isSegwit())); + AddressEntry.Context.AVAILABLE, + addressEntry.isSegwit())); if (setChangedByRemove || setChangedByAdd) { requestPersistence(); } @@ -234,7 +235,7 @@ public final class AddressEntryList implements PersistableEnvelope, PersistedDat .map(address -> Pair.of(address, (DeterministicKey) wallet.findKeyFromAddress(address))) .filter(pair -> pair.getRight() != null) .map(pair -> new AddressEntry(pair.getRight(), AddressEntry.Context.AVAILABLE, - pair.getLeft() instanceof SegwitAddress)) + pair.getLeft() instanceof SegwitAddress)) .forEach(this::addAddressEntry); } diff --git a/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java b/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java index 9b1ce93418..46e43c1bca 100644 --- a/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java +++ b/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java @@ -242,6 +242,7 @@ public class WalletsSetup { return message; }); + chainHeight.set(chain.getBestChainHeight()); chain.addNewBestBlockListener(block -> { connectedPeers.set(peerGroup.getConnectedPeers()); chainHeight.set(block.getHeight()); @@ -522,6 +523,16 @@ public class WalletsSetup { return downloadPercentageProperty().get() == 1d; } + public boolean isChainHeightSyncedWithinTolerance() { + int peersChainHeight = PeerGroup.getMostCommonChainHeight(connectedPeers.get()); + int bestChainHeight = walletConfig.chain().getBestChainHeight(); + if (peersChainHeight - bestChainHeight <= 3) { + return true; + } + log.warn("Our chain height: {} is out of sync with peer nodes chain height: {}", chainHeight.get(), peersChainHeight); + return false; + } + public Set
getAddressesByContext(@SuppressWarnings("SameParameterValue") AddressEntry.Context context) { return addressEntryList.getAddressEntriesAsListImmutable().stream() .filter(addressEntry -> addressEntry.getContext() == context) diff --git a/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java b/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java index 5a88b67baf..1c13e4c310 100644 --- a/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java @@ -774,12 +774,12 @@ public class BsqWalletService extends WalletService implements DaoStateListener // Addresses /////////////////////////////////////////////////////////////////////////////////////////// - private Address getChangeAddress() { + private LegacyAddress getChangeAddress() { return getUnusedAddress(); } - public Address getUnusedAddress() { - return wallet.getIssuedReceiveAddresses().stream() + public LegacyAddress getUnusedAddress() { + return (LegacyAddress) wallet.getIssuedReceiveAddresses().stream() .filter(this::isAddressUnused) .findAny() .orElse(wallet.freshReceiveAddress()); diff --git a/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java b/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java index 27bb49a5b6..3d45c49187 100644 --- a/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java @@ -28,13 +28,14 @@ import bisq.core.provider.fee.FeeService; import bisq.core.user.Preferences; import bisq.common.handlers.ErrorMessageHandler; +import bisq.common.util.Tuple2; import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.Coin; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.InsufficientMoneyException; -import org.bitcoinj.core.LegacyAddress; +import org.bitcoinj.core.SegwitAddress; import org.bitcoinj.core.Transaction; import org.bitcoinj.core.TransactionConfidence; import org.bitcoinj.core.TransactionInput; @@ -44,6 +45,7 @@ import org.bitcoinj.crypto.DeterministicKey; import org.bitcoinj.crypto.KeyCrypterScrypt; import org.bitcoinj.script.Script; import org.bitcoinj.script.ScriptBuilder; +import org.bitcoinj.script.ScriptPattern; import org.bitcoinj.wallet.SendRequest; import org.bitcoinj.wallet.Wallet; @@ -218,8 +220,8 @@ public class BtcWalletService extends WalletService { // estimated size of input sig int sigSizePerInput = 106; // typical size for a tx with 3 inputs - int txSizeWithUnsignedInputs = 300; - Coin txFeePerByte = feeService.getTxFeePerByte(); + int txVsizeWithUnsignedInputs = 300; + Coin txFeePerVbyte = feeService.getTxFeePerVbyte(); Address changeAddress = getFreshAddressEntry().getAddress(); checkNotNull(changeAddress, "changeAddress must not be null"); @@ -228,7 +230,9 @@ public class BtcWalletService extends WalletService { preferences.getIgnoreDustThreshold()); List preparedBsqTxInputs = preparedTx.getInputs(); List preparedBsqTxOutputs = preparedTx.getOutputs(); - int numInputs = preparedBsqTxInputs.size(); + Tuple2 numInputs = getNumInputs(preparedTx); + int numLegacyInputs = numInputs.first; + int numSegwitInputs = numInputs.second; Transaction resultTx = null; boolean isFeeOutsideTolerance; do { @@ -249,7 +253,10 @@ public class BtcWalletService extends WalletService { // signInputs needs to be false as it would try to sign all inputs (BSQ inputs are not in this wallet) sendRequest.signInputs = false; - sendRequest.fee = txFeePerByte.multiply(txSizeWithUnsignedInputs + sigSizePerInput * numInputs); + sendRequest.fee = txFeePerVbyte.multiply(txVsizeWithUnsignedInputs + + sigSizePerInput * numLegacyInputs + + sigSizePerInput * numSegwitInputs / 4); + sendRequest.feePerKb = Coin.ZERO; sendRequest.ensureMinRequiredFee = false; @@ -262,9 +269,14 @@ public class BtcWalletService extends WalletService { // add OP_RETURN output resultTx.addOutput(new TransactionOutput(params, resultTx, Coin.ZERO, ScriptBuilder.createOpReturnScript(opReturnData).getProgram())); - numInputs = resultTx.getInputs().size(); - txSizeWithUnsignedInputs = resultTx.bitcoinSerialize().length; - long estimatedFeeAsLong = txFeePerByte.multiply(txSizeWithUnsignedInputs + sigSizePerInput * numInputs).value; + numInputs = getNumInputs(resultTx); + numLegacyInputs = numInputs.first; + numSegwitInputs = numInputs.second; + txVsizeWithUnsignedInputs = resultTx.getVsize(); + long estimatedFeeAsLong = txFeePerVbyte.multiply(txVsizeWithUnsignedInputs + + sigSizePerInput * numLegacyInputs + + sigSizePerInput * numSegwitInputs / 4).value; + // calculated fee must be inside of a tolerance range with tx fee isFeeOutsideTolerance = Math.abs(resultTx.getFee().value - estimatedFeeAsLong) > 1000; } @@ -328,8 +340,8 @@ public class BtcWalletService extends WalletService { // estimated size of input sig int sigSizePerInput = 106; // typical size for a tx with 3 inputs - int txSizeWithUnsignedInputs = 300; - Coin txFeePerByte = feeService.getTxFeePerByte(); + int txVsizeWithUnsignedInputs = 300; + Coin txFeePerVbyte = feeService.getTxFeePerVbyte(); Address changeAddress = getFreshAddressEntry().getAddress(); checkNotNull(changeAddress, "changeAddress must not be null"); @@ -338,7 +350,9 @@ public class BtcWalletService extends WalletService { preferences.getIgnoreDustThreshold()); List preparedBsqTxInputs = preparedTx.getInputs(); List preparedBsqTxOutputs = preparedTx.getOutputs(); - int numInputs = preparedBsqTxInputs.size(); + Tuple2 numInputs = getNumInputs(preparedTx); + int numLegacyInputs = numInputs.first; + int numSegwitInputs = numInputs.second; Transaction resultTx = null; boolean isFeeOutsideTolerance; do { @@ -359,7 +373,9 @@ public class BtcWalletService extends WalletService { // signInputs needs to be false as it would try to sign all inputs (BSQ inputs are not in this wallet) sendRequest.signInputs = false; - sendRequest.fee = txFeePerByte.multiply(txSizeWithUnsignedInputs + sigSizePerInput * numInputs); + sendRequest.fee = txFeePerVbyte.multiply(txVsizeWithUnsignedInputs + + sigSizePerInput * numLegacyInputs + + sigSizePerInput * numSegwitInputs / 4); sendRequest.feePerKb = Coin.ZERO; sendRequest.ensureMinRequiredFee = false; @@ -372,9 +388,13 @@ public class BtcWalletService extends WalletService { // add OP_RETURN output resultTx.addOutput(new TransactionOutput(params, resultTx, Coin.ZERO, ScriptBuilder.createOpReturnScript(opReturnData).getProgram())); - numInputs = resultTx.getInputs().size(); - txSizeWithUnsignedInputs = resultTx.bitcoinSerialize().length; - final long estimatedFeeAsLong = txFeePerByte.multiply(txSizeWithUnsignedInputs + sigSizePerInput * numInputs).value; + numInputs = getNumInputs(resultTx); + numLegacyInputs = numInputs.first; + numSegwitInputs = numInputs.second; + txVsizeWithUnsignedInputs = resultTx.getVsize(); + final long estimatedFeeAsLong = txFeePerVbyte.multiply(txVsizeWithUnsignedInputs + + sigSizePerInput * numLegacyInputs + + sigSizePerInput * numSegwitInputs / 4).value; // calculated fee must be inside of a tolerance range with tx fee isFeeOutsideTolerance = Math.abs(resultTx.getFee().value - estimatedFeeAsLong) > 1000; } @@ -466,9 +486,9 @@ public class BtcWalletService extends WalletService { // estimated size of input sig int sigSizePerInput = 106; // typical size for a tx with 2 inputs - int txSizeWithUnsignedInputs = 203; + int txVsizeWithUnsignedInputs = 203; // If useCustomTxFee we allow overriding the estimated fee from preferences - Coin txFeePerByte = useCustomTxFee ? getTxFeeForWithdrawalPerByte() : feeService.getTxFeePerByte(); + Coin txFeePerVbyte = useCustomTxFee ? getTxFeeForWithdrawalPerVbyte() : feeService.getTxFeePerVbyte(); // In case there are no change outputs we force a change by adding min dust to the BTC input Coin forcedChangeValue = Coin.ZERO; @@ -479,7 +499,10 @@ public class BtcWalletService extends WalletService { preferences.getIgnoreDustThreshold()); List preparedBsqTxInputs = preparedBsqTx.getInputs(); List preparedBsqTxOutputs = preparedBsqTx.getOutputs(); - int numInputs = preparedBsqTxInputs.size() + 1; // We add 1 for the BTC fee input + // We don't know at this point what type the btc input would be (segwit/legacy). + // We use legacy to be on the safe side. + int numLegacyInputs = preparedBsqTxInputs.size() + 1; // We add 1 for the BTC fee input + int numSegwitInputs = 0; Transaction resultTx = null; boolean isFeeOutsideTolerance; boolean opReturnIsOnlyOutput; @@ -508,7 +531,9 @@ public class BtcWalletService extends WalletService { // signInputs needs to be false as it would try to sign all inputs (BSQ inputs are not in this wallet) sendRequest.signInputs = false; - sendRequest.fee = txFeePerByte.multiply(txSizeWithUnsignedInputs + sigSizePerInput * numInputs); + sendRequest.fee = txFeePerVbyte.multiply(txVsizeWithUnsignedInputs + + sigSizePerInput * numLegacyInputs + + sigSizePerInput * numSegwitInputs / 4); sendRequest.feePerKb = Coin.ZERO; sendRequest.ensureMinRequiredFee = false; @@ -528,15 +553,19 @@ public class BtcWalletService extends WalletService { if (opReturnData != null) resultTx.addOutput(new TransactionOutput(params, resultTx, Coin.ZERO, ScriptBuilder.createOpReturnScript(opReturnData).getProgram())); - numInputs = resultTx.getInputs().size(); - txSizeWithUnsignedInputs = resultTx.bitcoinSerialize().length; - final long estimatedFeeAsLong = txFeePerByte.multiply(txSizeWithUnsignedInputs + sigSizePerInput * numInputs).value; + Tuple2 numInputs = getNumInputs(resultTx); + numLegacyInputs = numInputs.first; + numSegwitInputs = numInputs.second; + txVsizeWithUnsignedInputs = resultTx.getVsize(); + final long estimatedFeeAsLong = txFeePerVbyte.multiply(txVsizeWithUnsignedInputs + + sigSizePerInput * numLegacyInputs + + sigSizePerInput * numSegwitInputs / 4).value; // calculated fee must be inside of a tolerance range with tx fee isFeeOutsideTolerance = Math.abs(resultTx.getFee().value - estimatedFeeAsLong) > 1000; } while (opReturnIsOnlyOutput || isFeeOutsideTolerance || - resultTx.getFee().value < txFeePerByte.multiply(resultTx.bitcoinSerialize().length).value); + resultTx.getFee().value < txFeePerVbyte.multiply(resultTx.getVsize()).value); // Sign all BTC inputs signAllBtcInputs(preparedBsqTxInputs.size(), resultTx); @@ -548,6 +577,25 @@ public class BtcWalletService extends WalletService { return resultTx; } + private Tuple2 getNumInputs(Transaction tx) { + int numLegacyInputs = 0; + int numSegwitInputs = 0; + for (TransactionInput input : tx.getInputs()) { + TransactionOutput connectedOutput = input.getConnectedOutput(); + if (connectedOutput == null || ScriptPattern.isP2PKH(connectedOutput.getScriptPubKey()) || + ScriptPattern.isP2PK(connectedOutput.getScriptPubKey())) { + // If connectedOutput is null, we don't know here the input type. To avoid underpaying fees, + // we treat it as a legacy input which will result in a higher fee estimation. + numLegacyInputs++; + } else if (ScriptPattern.isP2WPKH(connectedOutput.getScriptPubKey())) { + numSegwitInputs++; + } else { + throw new IllegalArgumentException("Inputs should spend a P2PKH, P2PK or P2WPKH ouput"); + } + } + return new Tuple2(numLegacyInputs, numSegwitInputs); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Commit tx @@ -579,18 +627,17 @@ public class BtcWalletService extends WalletService { if (addressEntry.isPresent()) { return addressEntry.get(); } else { - // We still use non-segwit addresses for the trade protocol. // We try to use available and not yet used entries Optional emptyAvailableAddressEntry = getAddressEntryListAsImmutableList().stream() .filter(e -> AddressEntry.Context.AVAILABLE == e.getContext()) .filter(e -> isAddressUnused(e.getAddress())) - .filter(e -> Script.ScriptType.P2PKH.equals(e.getAddress().getOutputScriptType())) + .filter(e -> Script.ScriptType.P2WPKH.equals(e.getAddress().getOutputScriptType())) .findAny(); if (emptyAvailableAddressEntry.isPresent()) { return addressEntryList.swapAvailableToAddressEntryWithOfferId(emptyAvailableAddressEntry.get(), context, offerId); } else { - DeterministicKey key = (DeterministicKey) wallet.findKeyFromAddress(wallet.freshReceiveAddress(Script.ScriptType.P2PKH)); - AddressEntry entry = new AddressEntry(key, context, offerId, false); + DeterministicKey key = (DeterministicKey) wallet.findKeyFromAddress(wallet.freshReceiveAddress(Script.ScriptType.P2WPKH)); + AddressEntry entry = new AddressEntry(key, context, offerId, true); addressEntryList.addAddressEntry(entry); return entry; } @@ -810,7 +857,7 @@ public class BtcWalletService extends WalletService { ); log.info("newTransaction no. of inputs " + newTransaction.getInputs().size()); - log.info("newTransaction size in kB " + newTransaction.bitcoinSerialize().length / 1024); + log.info("newTransaction vsize in vkB " + newTransaction.getVsize() / 1024); if (!newTransaction.getInputs().isEmpty()) { Coin amount = Coin.valueOf(newTransaction.getInputs().stream() @@ -821,13 +868,13 @@ public class BtcWalletService extends WalletService { try { Coin fee; int counter = 0; - int txSize = 0; + int txVsize = 0; Transaction tx; SendRequest sendRequest; - Coin txFeeForWithdrawalPerByte = getTxFeeForWithdrawalPerByte(); + Coin txFeeForWithdrawalPerVbyte = getTxFeeForWithdrawalPerVbyte(); do { counter++; - fee = txFeeForWithdrawalPerByte.multiply(txSize); + fee = txFeeForWithdrawalPerVbyte.multiply(txVsize); newTransaction.clearOutputs(); newTransaction.addOutput(amount.subtract(fee), toAddress); @@ -840,7 +887,7 @@ public class BtcWalletService extends WalletService { sendRequest.changeAddress = toAddress; wallet.completeTx(sendRequest); tx = sendRequest.tx; - txSize = tx.bitcoinSerialize().length; + txVsize = tx.getVsize(); printTx("FeeEstimationTransaction", tx); sendRequest.tx.getOutputs().forEach(o -> log.debug("Output value " + o.getValue().toFriendlyString())); } @@ -939,16 +986,16 @@ public class BtcWalletService extends WalletService { try { Coin fee; int counter = 0; - int txSize = 0; + int txVsize = 0; Transaction tx; - Coin txFeeForWithdrawalPerByte = getTxFeeForWithdrawalPerByte(); + Coin txFeeForWithdrawalPerVbyte = getTxFeeForWithdrawalPerVbyte(); do { counter++; - fee = txFeeForWithdrawalPerByte.multiply(txSize); + fee = txFeeForWithdrawalPerVbyte.multiply(txVsize); SendRequest sendRequest = getSendRequest(fromAddress, toAddress, amount, fee, aesKey, context); wallet.completeTx(sendRequest); tx = sendRequest.tx; - txSize = tx.bitcoinSerialize().length; + txVsize = tx.getVsize(); printTx("FeeEstimationTransaction", tx); } while (feeEstimationNotSatisfied(counter, tx)); @@ -986,18 +1033,20 @@ public class BtcWalletService extends WalletService { try { Coin fee; int counter = 0; - int txSize = 0; + int txVsize = 0; Transaction tx; - Coin txFeeForWithdrawalPerByte = getTxFeeForWithdrawalPerByte(); + Coin txFeeForWithdrawalPerVbyte = getTxFeeForWithdrawalPerVbyte(); do { counter++; - fee = txFeeForWithdrawalPerByte.multiply(txSize); + fee = txFeeForWithdrawalPerVbyte.multiply(txVsize); // We use a dummy address for the output - final String dummyReceiver = LegacyAddress.fromKey(params, new ECKey()).toBase58(); + // We don't know here whether the output is segwit or not but we don't care too much because the size of + // a segwit ouput is just 3 byte smaller than the size of a legacy ouput. + final String dummyReceiver = SegwitAddress.fromKey(params, new ECKey()).toString(); SendRequest sendRequest = getSendRequestForMultipleAddresses(fromAddresses, dummyReceiver, amount, fee, null, aesKey); wallet.completeTx(sendRequest); tx = sendRequest.tx; - txSize = tx.bitcoinSerialize().length; + txVsize = tx.getVsize(); printTx("FeeEstimationTransactionForMultipleAddresses", tx); } while (feeEstimationNotSatisfied(counter, tx)); @@ -1013,16 +1062,18 @@ public class BtcWalletService extends WalletService { } private boolean feeEstimationNotSatisfied(int counter, Transaction tx) { - long targetFee = getTxFeeForWithdrawalPerByte().multiply(tx.bitcoinSerialize().length).value; + long targetFee = getTxFeeForWithdrawalPerVbyte().multiply(tx.getVsize()).value; return counter < 10 && (tx.getFee().value < targetFee || tx.getFee().value - targetFee > 1000); } - public int getEstimatedFeeTxSize(List outputValues, Coin txFee) + public int getEstimatedFeeTxVsize(List outputValues, Coin txFee) throws InsufficientMoneyException, AddressFormatException { Transaction transaction = new Transaction(params); - Address dummyAddress = LegacyAddress.fromKey(params, new ECKey()); + // In reality txs have a mix of segwit/legacy ouputs, but we don't care too much because the size of + // a segwit ouput is just 3 byte smaller than the size of a legacy ouput. + Address dummyAddress = SegwitAddress.fromKey(params, new ECKey()); outputValues.forEach(outputValue -> transaction.addOutput(outputValue, dummyAddress)); SendRequest sendRequest = SendRequest.forTx(transaction); @@ -1035,7 +1086,7 @@ public class BtcWalletService extends WalletService { sendRequest.ensureMinRequiredFee = false; sendRequest.changeAddress = dummyAddress; wallet.completeTx(sendRequest); - return transaction.bitcoinSerialize().length; + return transaction.getVsize(); } diff --git a/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java b/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java index eb7b7485c1..2b05f47c18 100644 --- a/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java @@ -36,8 +36,8 @@ import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.Coin; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.InsufficientMoneyException; -import org.bitcoinj.core.LegacyAddress; import org.bitcoinj.core.NetworkParameters; +import org.bitcoinj.core.SegwitAddress; import org.bitcoinj.core.Sha256Hash; import org.bitcoinj.core.SignatureDecodeException; import org.bitcoinj.core.Transaction; @@ -76,6 +76,7 @@ import static com.google.common.base.Preconditions.checkNotNull; public class TradeWalletService { private static final Logger log = LoggerFactory.getLogger(TradeWalletService.class); + private static final Coin MIN_DELAYED_PAYOUT_TX_FEE = Coin.valueOf(1000); private final WalletsSetup walletsSetup; private final Preferences preferences; @@ -336,7 +337,7 @@ public class TradeWalletService { Transaction dummyTX = new Transaction(params); // The output is just used to get the right inputs and change outputs, so we use an anonymous ECKey, as it will never be used for anything. // We don't care about fee calculation differences between the real tx and that dummy tx as we use a static tx fee. - TransactionOutput dummyOutput = new TransactionOutput(params, dummyTX, dummyOutputAmount, LegacyAddress.fromKey(params, new ECKey())); + TransactionOutput dummyOutput = new TransactionOutput(params, dummyTX, dummyOutputAmount, SegwitAddress.fromKey(params, new ECKey())); dummyTX.addOutput(dummyOutput); // Find the needed inputs to pay the output, optionally add 1 change output. @@ -455,7 +456,7 @@ public class TradeWalletService { // First we construct a dummy TX to get the inputs and outputs we want to use for the real deposit tx. // Similar to the way we did in the createTakerDepositTxInputs method. Transaction dummyTx = new Transaction(params); - TransactionOutput dummyOutput = new TransactionOutput(params, dummyTx, makerInputAmount, LegacyAddress.fromKey(params, new ECKey())); + TransactionOutput dummyOutput = new TransactionOutput(params, dummyTx, makerInputAmount, SegwitAddress.fromKey(params, new ECKey())); dummyTx.addOutput(dummyOutput); addAvailableInputsAndChangeOutputs(dummyTx, makerAddress, makerChangeAddress); // Normally we have only 1 input but we support multiple inputs if the user has paid in with several transactions. @@ -502,12 +503,12 @@ public class TradeWalletService { // Add MultiSig output - Script p2SHMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey); + Script hashedMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey, false); // Tx fee for deposit tx will be paid by buyer. - TransactionOutput p2SHMultiSigOutput = new TransactionOutput(params, preparedDepositTx, msOutputAmount, - p2SHMultiSigOutputScript.getProgram()); - preparedDepositTx.addOutput(p2SHMultiSigOutput); + TransactionOutput hashedMultiSigOutput = new TransactionOutput(params, preparedDepositTx, msOutputAmount, + hashedMultiSigOutputScript.getProgram()); + preparedDepositTx.addOutput(hashedMultiSigOutput); // We add the hash ot OP_RETURN with a 0 amount output TransactionOutput contractHashOutput = new TransactionOutput(params, preparedDepositTx, Coin.ZERO, @@ -569,8 +570,9 @@ public class TradeWalletService { * @param buyerPubKey the public key of the buyer * @param sellerPubKey the public key of the seller * @throws SigningException if (one of) the taker input(s) was of an unrecognized type for signing - * @throws TransactionVerificationException if a maker input wasn't signed, their MultiSig script or contract hash - * doesn't match the taker's, or there was an unexpected problem with the final deposit tx or its signatures + * @throws TransactionVerificationException if a non-P2WH maker-as-buyer input wasn't signed, the maker's MultiSig + * script or contract hash doesn't match the taker's, or there was an unexpected problem with the final deposit tx + * or its signatures * @throws WalletException if the taker's wallet is null or structurally inconsistent */ public Transaction takerSignsDepositTx(boolean takerIsSeller, @@ -587,9 +589,9 @@ public class TradeWalletService { checkArgument(!sellerInputs.isEmpty()); // Check if maker's MultiSig script is identical to the takers - Script p2SHMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey); - if (!makersDepositTx.getOutput(0).getScriptPubKey().equals(p2SHMultiSigOutputScript)) { - throw new TransactionVerificationException("Maker's p2SHMultiSigOutputScript does not match to takers p2SHMultiSigOutputScript"); + Script hashedMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey, false); + if (!makersDepositTx.getOutput(0).getScriptPubKey().equals(hashedMultiSigOutputScript)) { + throw new TransactionVerificationException("Maker's hashedMultiSigOutputScript does not match to takers hashedMultiSigOutputScript"); } // The outpoints are not available from the serialized makersDepositTx, so we cannot use that tx directly, but we use it to construct a new @@ -601,8 +603,12 @@ public class TradeWalletService { // We grab the signature from the makersDepositTx and apply it to the new tx input for (int i = 0; i < buyerInputs.size(); i++) { TransactionInput makersInput = makersDepositTx.getInputs().get(i); - byte[] makersScriptSigProgram = getMakersScriptSigProgram(makersInput); + byte[] makersScriptSigProgram = makersInput.getScriptSig().getProgram(); TransactionInput input = getTransactionInput(depositTx, makersScriptSigProgram, buyerInputs.get(i)); + Script scriptPubKey = checkNotNull(input.getConnectedOutput()).getScriptPubKey(); + if (makersScriptSigProgram.length == 0 && !ScriptPattern.isP2WH(scriptPubKey)) { + throw new TransactionVerificationException("Non-segwit inputs from maker not signed."); + } if (!TransactionWitness.EMPTY.equals(makersInput.getWitness())) { input.setWitness(makersInput.getWitness()); } @@ -683,6 +689,21 @@ public class TradeWalletService { } + public void sellerAddsBuyerWitnessesToDepositTx(Transaction myDepositTx, + Transaction buyersDepositTxWithWitnesses) { + int numberInputs = myDepositTx.getInputs().size(); + for (int i = 0; i < numberInputs; i++) { + var txInput = myDepositTx.getInput(i); + var witnessFromBuyer = buyersDepositTxWithWitnesses.getInput(i).getWitness(); + + if (TransactionWitness.EMPTY.equals(txInput.getWitness()) && + !TransactionWitness.EMPTY.equals(witnessFromBuyer)) { + txInput.setWitness(witnessFromBuyer); + } + } + } + + /////////////////////////////////////////////////////////////////////////////////////////// // Delayed payout tx /////////////////////////////////////////////////////////////////////////////////////////// @@ -692,11 +713,11 @@ public class TradeWalletService { Coin minerFee, long lockTime) throws AddressFormatException, TransactionVerificationException { - TransactionOutput p2SHMultiSigOutput = depositTx.getOutput(0); + TransactionOutput hashedMultiSigOutput = depositTx.getOutput(0); Transaction delayedPayoutTx = new Transaction(params); - delayedPayoutTx.addInput(p2SHMultiSigOutput); + delayedPayoutTx.addInput(hashedMultiSigOutput); applyLockTime(lockTime, delayedPayoutTx); - Coin outputAmount = p2SHMultiSigOutput.getValue().subtract(minerFee); + Coin outputAmount = hashedMultiSigOutput.getValue().subtract(minerFee); delayedPayoutTx.addOutput(outputAmount, Address.fromString(params, donationAddressString)); WalletService.printTx("Unsigned delayedPayoutTx ToDonationAddress", delayedPayoutTx); WalletService.verifyTransaction(delayedPayoutTx); @@ -704,13 +725,17 @@ public class TradeWalletService { } public byte[] signDelayedPayoutTx(Transaction delayedPayoutTx, + Transaction preparedDepositTx, DeterministicKey myMultiSigKeyPair, byte[] buyerPubKey, byte[] sellerPubKey) throws AddressFormatException, TransactionVerificationException { Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); - Sha256Hash sigHash = delayedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + Sha256Hash sigHash; + Coin delayedPayoutTxInputValue = preparedDepositTx.getOutput(0).getValue(); + sigHash = delayedPayoutTx.hashForWitnessSignature(0, redeemScript, + delayedPayoutTxInputValue, Transaction.SigHash.ALL, false); checkNotNull(myMultiSigKeyPair, "myMultiSigKeyPair must not be null"); if (myMultiSigKeyPair.isEncrypted()) { checkNotNull(aesKey); @@ -722,24 +747,45 @@ public class TradeWalletService { return mySignature.encodeToDER(); } + public Transaction finalizeUnconnectedDelayedPayoutTx(Transaction delayedPayoutTx, + byte[] buyerPubKey, + byte[] sellerPubKey, + byte[] buyerSignature, + byte[] sellerSignature, + Coin inputValue) + throws AddressFormatException, TransactionVerificationException, SignatureDecodeException { + + Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); + ECKey.ECDSASignature buyerECDSASignature = ECKey.ECDSASignature.decodeFromDER(buyerSignature); + ECKey.ECDSASignature sellerECDSASignature = ECKey.ECDSASignature.decodeFromDER(sellerSignature); + TransactionSignature buyerTxSig = new TransactionSignature(buyerECDSASignature, Transaction.SigHash.ALL, false); + TransactionSignature sellerTxSig = new TransactionSignature(sellerECDSASignature, Transaction.SigHash.ALL, false); + TransactionInput input = delayedPayoutTx.getInput(0); + input.setScriptSig(ScriptBuilder.createEmpty()); + TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig); + input.setWitness(witness); + WalletService.printTx("finalizeDelayedPayoutTx", delayedPayoutTx); + WalletService.verifyTransaction(delayedPayoutTx); + + if (checkNotNull(inputValue).isLessThan(delayedPayoutTx.getOutputSum().add(MIN_DELAYED_PAYOUT_TX_FEE))) { + throw new TransactionVerificationException("Delayed payout tx is paying less than the minimum allowed tx fee"); + } + Script scriptPubKey = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey, false); + input.getScriptSig().correctlySpends(delayedPayoutTx, 0, witness, inputValue, scriptPubKey, Script.ALL_VERIFY_FLAGS); + return delayedPayoutTx; + } + public Transaction finalizeDelayedPayoutTx(Transaction delayedPayoutTx, byte[] buyerPubKey, byte[] sellerPubKey, byte[] buyerSignature, byte[] sellerSignature) throws AddressFormatException, TransactionVerificationException, WalletException, SignatureDecodeException { - Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); - ECKey.ECDSASignature buyerECDSASignature = ECKey.ECDSASignature.decodeFromDER(buyerSignature); - ECKey.ECDSASignature sellerECDSASignature = ECKey.ECDSASignature.decodeFromDER(sellerSignature); - TransactionSignature buyerTxSig = new TransactionSignature(buyerECDSASignature, Transaction.SigHash.ALL, false); - TransactionSignature sellerTxSig = new TransactionSignature(sellerECDSASignature, Transaction.SigHash.ALL, false); - Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), redeemScript); + TransactionInput input = delayedPayoutTx.getInput(0); - input.setScriptSig(inputScript); - WalletService.printTx("finalizeDelayedPayoutTx", delayedPayoutTx); - WalletService.verifyTransaction(delayedPayoutTx); + finalizeUnconnectedDelayedPayoutTx(delayedPayoutTx, buyerPubKey, sellerPubKey, buyerSignature, sellerSignature, input.getValue()); + WalletService.checkWalletConsistency(wallet); - WalletService.checkScriptSig(delayedPayoutTx, input, 0); checkNotNull(input.getConnectedOutput(), "input.getConnectedOutput() must not be null"); input.verify(input.getConnectedOutput()); return delayedPayoutTx; @@ -779,7 +825,15 @@ public class TradeWalletService { // MS redeemScript Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); // MS output from prev. tx is index 0 - Sha256Hash sigHash = preparedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + Sha256Hash sigHash; + TransactionOutput hashedMultiSigOutput = depositTx.getOutput(0); + if (ScriptPattern.isP2SH(hashedMultiSigOutput.getScriptPubKey())) { + sigHash = preparedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + } else { + Coin inputValue = hashedMultiSigOutput.getValue(); + sigHash = preparedPayoutTx.hashForWitnessSignature(0, redeemScript, + inputValue, Transaction.SigHash.ALL, false); + } checkNotNull(multiSigKeyPair, "multiSigKeyPair must not be null"); if (multiSigKeyPair.isEncrypted()) { checkNotNull(aesKey); @@ -822,7 +876,16 @@ public class TradeWalletService { // MS redeemScript Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); // MS output from prev. tx is index 0 - Sha256Hash sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + TransactionOutput hashedMultiSigOutput = depositTx.getOutput(0); + boolean hashedMultiSigOutputIsLegacy = ScriptPattern.isP2SH(hashedMultiSigOutput.getScriptPubKey()); + Sha256Hash sigHash; + if (hashedMultiSigOutputIsLegacy) { + sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + } else { + Coin inputValue = hashedMultiSigOutput.getValue(); + sigHash = payoutTx.hashForWitnessSignature(0, redeemScript, + inputValue, Transaction.SigHash.ALL, false); + } checkNotNull(multiSigKeyPair, "multiSigKeyPair must not be null"); if (multiSigKeyPair.isEncrypted()) { checkNotNull(aesKey); @@ -832,10 +895,16 @@ public class TradeWalletService { Transaction.SigHash.ALL, false); TransactionSignature sellerTxSig = new TransactionSignature(sellerSignature, Transaction.SigHash.ALL, false); // Take care of order of signatures. Need to be reversed here. See comment below at getMultiSigRedeemScript (seller, buyer) - Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), - redeemScript); TransactionInput input = payoutTx.getInput(0); - input.setScriptSig(inputScript); + if (hashedMultiSigOutputIsLegacy) { + Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), + redeemScript); + input.setScriptSig(inputScript); + } else { + input.setScriptSig(ScriptBuilder.createEmpty()); + TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig); + input.setWitness(witness); + } WalletService.printTx("payoutTx", payoutTx); WalletService.verifyTransaction(payoutTx); WalletService.checkWalletConsistency(wallet); @@ -863,7 +932,16 @@ public class TradeWalletService { // MS redeemScript Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); // MS output from prev. tx is index 0 - Sha256Hash sigHash = preparedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + TransactionOutput hashedMultiSigOutput = depositTx.getOutput(0); + boolean hashedMultiSigOutputIsLegacy = ScriptPattern.isP2SH(hashedMultiSigOutput.getScriptPubKey()); + Sha256Hash sigHash; + if (hashedMultiSigOutputIsLegacy) { + sigHash = preparedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + } else { + Coin inputValue = hashedMultiSigOutput.getValue(); + sigHash = preparedPayoutTx.hashForWitnessSignature(0, redeemScript, + inputValue, Transaction.SigHash.ALL, false); + } checkNotNull(myMultiSigKeyPair, "myMultiSigKeyPair must not be null"); if (myMultiSigKeyPair.isEncrypted()) { checkNotNull(aesKey); @@ -895,9 +973,18 @@ public class TradeWalletService { TransactionSignature sellerTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(sellerSignature), Transaction.SigHash.ALL, false); // Take care of order of signatures. Need to be reversed here. See comment below at getMultiSigRedeemScript (seller, buyer) - Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), redeemScript); + TransactionOutput hashedMultiSigOutput = depositTx.getOutput(0); + boolean hashedMultiSigOutputIsLegacy = ScriptPattern.isP2SH(hashedMultiSigOutput.getScriptPubKey()); TransactionInput input = payoutTx.getInput(0); - input.setScriptSig(inputScript); + if (hashedMultiSigOutputIsLegacy) { + Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), + redeemScript); + input.setScriptSig(inputScript); + } else { + input.setScriptSig(ScriptBuilder.createEmpty()); + TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig); + input.setWitness(witness); + } WalletService.printTx("mediated payoutTx", payoutTx); WalletService.verifyTransaction(payoutTx); WalletService.checkWalletConsistency(wallet); @@ -945,9 +1032,9 @@ public class TradeWalletService { byte[] arbitratorPubKey) throws AddressFormatException, TransactionVerificationException, WalletException, SignatureDecodeException { Transaction depositTx = new Transaction(params, depositTxSerialized); - TransactionOutput p2SHMultiSigOutput = depositTx.getOutput(0); + TransactionOutput hashedMultiSigOutput = depositTx.getOutput(0); Transaction payoutTx = new Transaction(params); - payoutTx.addInput(p2SHMultiSigOutput); + payoutTx.addInput(hashedMultiSigOutput); if (buyerPayoutAmount.isPositive()) { payoutTx.addOutput(buyerPayoutAmount, Address.fromString(params, buyerAddressString)); } @@ -957,7 +1044,15 @@ public class TradeWalletService { // take care of sorting! Script redeemScript = get2of3MultiSigRedeemScript(buyerPubKey, sellerPubKey, arbitratorPubKey); - Sha256Hash sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + Sha256Hash sigHash; + boolean hashedMultiSigOutputIsLegacy = !ScriptPattern.isP2SH(hashedMultiSigOutput.getScriptPubKey()); + if (hashedMultiSigOutputIsLegacy) { + sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + } else { + Coin inputValue = hashedMultiSigOutput.getValue(); + sigHash = payoutTx.hashForWitnessSignature(0, redeemScript, + inputValue, Transaction.SigHash.ALL, false); + } checkNotNull(tradersMultiSigKeyPair, "tradersMultiSigKeyPair must not be null"); if (tradersMultiSigKeyPair.isEncrypted()) { checkNotNull(aesKey); @@ -966,11 +1061,18 @@ public class TradeWalletService { TransactionSignature tradersTxSig = new TransactionSignature(tradersSignature, Transaction.SigHash.ALL, false); TransactionSignature arbitratorTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(arbitratorSignature), Transaction.SigHash.ALL, false); - // Take care of order of signatures. See comment below at getMultiSigRedeemScript (sort order needed here: arbitrator, seller, buyer) - Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(arbitratorTxSig, tradersTxSig), - redeemScript); TransactionInput input = payoutTx.getInput(0); - input.setScriptSig(inputScript); + // Take care of order of signatures. See comment below at getMultiSigRedeemScript (sort order needed here: arbitrator, seller, buyer) + if (hashedMultiSigOutputIsLegacy) { + Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript( + ImmutableList.of(arbitratorTxSig, tradersTxSig), + redeemScript); + input.setScriptSig(inputScript); + } else { + input.setScriptSig(ScriptBuilder.createEmpty()); + TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, arbitratorTxSig, tradersTxSig); + input.setWitness(witness); + } WalletService.printTx("disputed payoutTx", payoutTx); WalletService.verifyTransaction(payoutTx); WalletService.checkWalletConsistency(wallet); @@ -995,21 +1097,23 @@ public class TradeWalletService { String sellerPrivateKeyAsHex, String buyerPubKeyAsHex, String sellerPubKeyAsHex, + boolean hashedMultiSigOutputIsLegacy, TxBroadcaster.Callback callback) throws AddressFormatException, TransactionVerificationException, WalletException { byte[] buyerPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(buyerPubKeyAsHex)).getPubKey(); byte[] sellerPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(sellerPubKeyAsHex)).getPubKey(); - Script p2SHMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey); + Script hashedMultiSigOutputScript = get2of2MultiSigOutputScript(buyerPubKey, sellerPubKey, + hashedMultiSigOutputIsLegacy); - Coin msOutput = buyerPayoutAmount.add(sellerPayoutAmount).add(txFee); - TransactionOutput p2SHMultiSigOutput = new TransactionOutput(params, null, msOutput, p2SHMultiSigOutputScript.getProgram()); + Coin msOutputValue = buyerPayoutAmount.add(sellerPayoutAmount).add(txFee); + TransactionOutput hashedMultiSigOutput = new TransactionOutput(params, null, msOutputValue, hashedMultiSigOutputScript.getProgram()); Transaction depositTx = new Transaction(params); - depositTx.addOutput(p2SHMultiSigOutput); + depositTx.addOutput(hashedMultiSigOutput); Transaction payoutTx = new Transaction(params); Sha256Hash spendTxHash = Sha256Hash.wrap(depositTxHex); - payoutTx.addInput(new TransactionInput(params, depositTx, p2SHMultiSigOutputScript.getProgram(), new TransactionOutPoint(params, 0, spendTxHash), msOutput)); + payoutTx.addInput(new TransactionInput(params, depositTx, null, new TransactionOutPoint(params, 0, spendTxHash), msOutputValue)); if (buyerPayoutAmount.isPositive()) { payoutTx.addOutput(buyerPayoutAmount, Address.fromString(params, buyerAddressString)); @@ -1020,7 +1124,14 @@ public class TradeWalletService { // take care of sorting! Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); - Sha256Hash sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + Sha256Hash sigHash; + if (hashedMultiSigOutputIsLegacy) { + sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); + } else { + Coin inputValue = msOutputValue; + sigHash = payoutTx.hashForWitnessSignature(0, redeemScript, + inputValue, Transaction.SigHash.ALL, false); + } ECKey buyerPrivateKey = ECKey.fromPrivate(Utils.HEX.decode(buyerPrivateKeyAsHex)); checkNotNull(buyerPrivateKey, "key must not be null"); @@ -1032,10 +1143,18 @@ public class TradeWalletService { TransactionSignature buyerTxSig = new TransactionSignature(buyerECDSASignature, Transaction.SigHash.ALL, false); TransactionSignature sellerTxSig = new TransactionSignature(sellerECDSASignature, Transaction.SigHash.ALL, false); - Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), redeemScript); TransactionInput input = payoutTx.getInput(0); - input.setScriptSig(inputScript); + if (hashedMultiSigOutputIsLegacy) { + Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(sellerTxSig, buyerTxSig), + redeemScript); + input.setScriptSig(inputScript); + } else { + input.setScriptSig(ScriptBuilder.createEmpty()); + TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig); + input.setWitness(witness); + } + WalletService.printTx("payoutTx", payoutTx); WalletService.verifyTransaction(payoutTx); WalletService.checkWalletConsistency(wallet); @@ -1092,28 +1211,32 @@ public class TradeWalletService { "input.getConnectedOutput().getParentTransaction() must not be null"); checkNotNull(input.getValue(), "input.getValue() must not be null"); + // bitcoinSerialize(false) is used just in case the serialized tx is parsed by a bisq node still using + // bitcoinj 0.14. This is not supposed to happen ever since Version.TRADE_PROTOCOL_VERSION was set to 3, + // but it costs nothing to be on the safe side. + // The serialized tx is just used to obtain its hash, so the witness data is not relevant. return new RawTransactionInput(input.getOutpoint().getIndex(), input.getConnectedOutput().getParentTransaction().bitcoinSerialize(false), input.getValue().value); } - private byte[] getMakersScriptSigProgram(TransactionInput transactionInput) throws TransactionVerificationException { - byte[] scriptProgram = transactionInput.getScriptSig().getProgram(); - if (scriptProgram.length == 0) { - throw new TransactionVerificationException("Inputs from maker not signed."); - } - - return scriptProgram; - } - private TransactionInput getTransactionInput(Transaction depositTx, byte[] scriptProgram, RawTransactionInput rawTransactionInput) { - return new TransactionInput(params, depositTx, scriptProgram, new TransactionOutPoint(params, - rawTransactionInput.index, new Transaction(params, rawTransactionInput.parentTransaction)), + return new TransactionInput(params, depositTx, scriptProgram, getConnectedOutPoint(rawTransactionInput), Coin.valueOf(rawTransactionInput.value)); } + private TransactionOutPoint getConnectedOutPoint(RawTransactionInput rawTransactionInput) { + return new TransactionOutPoint(params, rawTransactionInput.index, + new Transaction(params, rawTransactionInput.parentTransaction)); + } + + public boolean isP2WH(RawTransactionInput rawTransactionInput) { + return ScriptPattern.isP2WH( + checkNotNull(getConnectedOutPoint(rawTransactionInput).getConnectedOutput()).getScriptPubKey()); + } + // TODO: Once we have removed legacy arbitrator from dispute domain we can remove that method as well. // Atm it is still used by traderSignAndFinalizeDisputedPayoutTx which is used by ArbitrationManager. @@ -1144,8 +1267,13 @@ public class TradeWalletService { return ScriptBuilder.createMultiSigOutputScript(2, keys); } - private Script get2of2MultiSigOutputScript(byte[] buyerPubKey, byte[] sellerPubKey) { - return ScriptBuilder.createP2SHOutputScript(get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey)); + private Script get2of2MultiSigOutputScript(byte[] buyerPubKey, byte[] sellerPubKey, boolean legacy) { + Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); + if (legacy) { + return ScriptBuilder.createP2SHOutputScript(redeemScript); + } else { + return ScriptBuilder.createP2WSHOutputScript(redeemScript); + } } private Transaction createPayoutTx(Transaction depositTx, @@ -1153,9 +1281,9 @@ public class TradeWalletService { Coin sellerPayoutAmount, String buyerAddressString, String sellerAddressString) throws AddressFormatException { - TransactionOutput p2SHMultiSigOutput = depositTx.getOutput(0); + TransactionOutput hashedMultiSigOutput = depositTx.getOutput(0); Transaction transaction = new Transaction(params); - transaction.addInput(p2SHMultiSigOutput); + transaction.addInput(hashedMultiSigOutput); if (buyerPayoutAmount.isPositive()) { transaction.addOutput(buyerPayoutAmount, Address.fromString(params, buyerAddressString)); } @@ -1187,13 +1315,10 @@ public class TradeWalletService { input.setScriptSig(ScriptBuilder.createInputScript(txSig, sigKey)); } } else if (ScriptPattern.isP2WPKH(scriptPubKey)) { - // TODO: Consider using this alternative way to build the scriptCode (taken from bitcoinj master) - // Script scriptCode = ScriptBuilder.createP2PKHOutputScript(sigKey) - Script scriptCode = new ScriptBuilder().data( - ScriptBuilder.createOutputScript(LegacyAddress.fromKey(transaction.getParams(), sigKey)).getProgram()) - .build(); + // scriptCode is expected to have the format of a legacy P2PKH output script + Script scriptCode = ScriptBuilder.createP2PKHOutputScript(sigKey); Coin value = input.getValue(); - TransactionSignature txSig = transaction.calculateWitnessSignature(inputIndex, sigKey, scriptCode, value, + TransactionSignature txSig = transaction.calculateWitnessSignature(inputIndex, sigKey, aesKey, scriptCode, value, Transaction.SigHash.ALL, false); input.setScriptSig(ScriptBuilder.createEmpty()); input.setWitness(TransactionWitness.redeemP2WPKH(txSig, sigKey)); diff --git a/core/src/main/java/bisq/core/btc/wallet/WalletService.java b/core/src/main/java/bisq/core/btc/wallet/WalletService.java index 251aac9717..f36b61ac47 100644 --- a/core/src/main/java/bisq/core/btc/wallet/WalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/WalletService.java @@ -37,7 +37,6 @@ import org.bitcoinj.core.Coin; import org.bitcoinj.core.Context; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.InsufficientMoneyException; -import org.bitcoinj.core.LegacyAddress; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.Sha256Hash; import org.bitcoinj.core.Transaction; @@ -325,13 +324,10 @@ public abstract class WalletService { } } else if (ScriptPattern.isP2WPKH(scriptPubKey)) { try { - // TODO: Consider using this alternative way to build the scriptCode (taken from bitcoinj master) - // Script scriptCode = ScriptBuilder.createP2PKHOutputScript(key); - Script scriptCode = new ScriptBuilder().data( - ScriptBuilder.createOutputScript(LegacyAddress.fromKey(tx.getParams(), key)).getProgram()) - .build(); + // scriptCode is expected to have the format of a legacy P2PKH output script + Script scriptCode = ScriptBuilder.createP2PKHOutputScript(key); Coin value = txIn.getValue(); - TransactionSignature txSig = tx.calculateWitnessSignature(index, key, scriptCode, value, + TransactionSignature txSig = tx.calculateWitnessSignature(index, key, aesKey, scriptCode, value, Transaction.SigHash.ALL, false); txIn.setScriptSig(ScriptBuilder.createEmpty()); txIn.setWitness(TransactionWitness.redeemP2WPKH(txSig, key)); @@ -479,10 +475,10 @@ public abstract class WalletService { return getBalanceForAddress(getAddressFromOutput(output)); } - public Coin getTxFeeForWithdrawalPerByte() { + public Coin getTxFeeForWithdrawalPerVbyte() { Coin fee = (preferences.isUseCustomWithdrawalTxFee()) ? - Coin.valueOf(preferences.getWithdrawalTxFeeInBytes()) : - feeService.getTxFeePerByte(); + Coin.valueOf(preferences.getWithdrawalTxFeeInVbytes()) : + feeService.getTxFeePerVbyte(); log.info("tx fee = " + fee.toFriendlyString()); return fee; } @@ -521,7 +517,7 @@ public abstract class WalletService { throws InsufficientMoneyException, AddressFormatException { SendRequest sendRequest = SendRequest.emptyWallet(Address.fromString(params, toAddress)); sendRequest.fee = Coin.ZERO; - sendRequest.feePerKb = getTxFeeForWithdrawalPerByte().multiply(1000); + sendRequest.feePerKb = getTxFeeForWithdrawalPerVbyte().multiply(1000); sendRequest.aesKey = aesKey; Wallet.SendResult sendResult = wallet.sendCoins(sendRequest); printTx("empty btc wallet", sendResult.tx); @@ -558,6 +554,10 @@ public abstract class WalletService { return isWalletReady() && chain != null ? chain.getBestChainHeight() : 0; } + public boolean isChainHeightSyncedWithinTolerance() { + return walletsSetup.isChainHeightSyncedWithinTolerance(); + } + public Transaction getClonedTransaction(Transaction tx) { return new Transaction(params, tx.bitcoinSerialize()); } diff --git a/core/src/main/java/bisq/core/dao/DaoFacade.java b/core/src/main/java/bisq/core/dao/DaoFacade.java index f330289ff2..b5d3462bff 100644 --- a/core/src/main/java/bisq/core/dao/DaoFacade.java +++ b/core/src/main/java/bisq/core/dao/DaoFacade.java @@ -382,9 +382,9 @@ public class DaoFacade implements DaoSetupService { return BlindVoteConsensus.getFee(daoStateService, daoStateService.getChainHeight()); } - public Tuple2 getBlindVoteMiningFeeAndTxSize(Coin stake) + public Tuple2 getBlindVoteMiningFeeAndTxVsize(Coin stake) throws WalletException, InsufficientMoneyException, TransactionVerificationException { - return myBlindVoteListService.getMiningFeeAndTxSize(stake); + return myBlindVoteListService.getMiningFeeAndTxVsize(stake); } // Publish blindVote tx and broadcast blindVote to p2p network and store to blindVoteList. @@ -532,12 +532,12 @@ public class DaoFacade implements DaoSetupService { lockupTxService.publishLockupTx(lockupAmount, lockTime, lockupReason, hash, resultHandler, exceptionHandler); } - public Tuple2 getLockupTxMiningFeeAndTxSize(Coin lockupAmount, - int lockTime, - LockupReason lockupReason, - byte[] hash) + public Tuple2 getLockupTxMiningFeeAndTxVsize(Coin lockupAmount, + int lockTime, + LockupReason lockupReason, + byte[] hash) throws InsufficientMoneyException, IOException, TransactionVerificationException, WalletException { - return lockupTxService.getMiningFeeAndTxSize(lockupAmount, lockTime, lockupReason, hash); + return lockupTxService.getMiningFeeAndTxVsize(lockupAmount, lockTime, lockupReason, hash); } public void publishUnlockTx(String lockupTxId, Consumer resultHandler, @@ -545,9 +545,9 @@ public class DaoFacade implements DaoSetupService { unlockTxService.publishUnlockTx(lockupTxId, resultHandler, exceptionHandler); } - public Tuple2 getUnlockTxMiningFeeAndTxSize(String lockupTxId) + public Tuple2 getUnlockTxMiningFeeAndTxVsize(String lockupTxId) throws InsufficientMoneyException, TransactionVerificationException, WalletException { - return unlockTxService.getMiningFeeAndTxSize(lockupTxId); + return unlockTxService.getMiningFeeAndTxVsize(lockupTxId); } public long getTotalLockupAmount() { @@ -788,6 +788,7 @@ public class DaoFacade implements DaoSetupService { // This list need to be updated once a new address gets defined. allPastParamValues.add("3EtUWqsGThPtjwUczw27YCo6EWvQdaPUyp"); // burning man 2019 allPastParamValues.add("3A8Zc1XioE2HRzYfbb5P8iemCS72M6vRJV"); // burningman2 + allPastParamValues.add("34VLFgtFKAtwTdZ5rengTT2g2zC99sWQLC"); // burningman3 (https://github.com/bisq-network/roles/issues/80#issuecomment-723577776) } return allPastParamValues; diff --git a/core/src/main/java/bisq/core/dao/governance/ballot/BallotListService.java b/core/src/main/java/bisq/core/dao/governance/ballot/BallotListService.java index cb01694fdf..9662bdd9b1 100644 --- a/core/src/main/java/bisq/core/dao/governance/ballot/BallotListService.java +++ b/core/src/main/java/bisq/core/dao/governance/ballot/BallotListService.java @@ -108,7 +108,7 @@ public class BallotListService implements PersistedDataHost, DaoSetupService { private void registerProposalAsBallot(Proposal proposal) { Ballot ballot = new Ballot(proposal); // vote is null if (log.isInfoEnabled()) { - log.info("We create a new ballot with a proposal and add it to our list. " + + log.debug("We create a new ballot with a proposal and add it to our list. " + "Vote is null at that moment. proposalTxId={}", proposal.getTxId()); } if (ballotList.contains(ballot)) { @@ -129,13 +129,16 @@ public class BallotListService implements PersistedDataHost, DaoSetupService { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { + public void readPersisted(Runnable completeHandler) { if (DevEnv.isDaoActivated()) { - BallotList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - ballotList.setAll(persisted.getList()); - listeners.forEach(l -> l.onListChanged(ballotList.getList())); - } + persistenceManager.readPersisted(persisted -> { + ballotList.setAll(persisted.getList()); + listeners.forEach(l -> l.onListChanged(ballotList.getList())); + completeHandler.run(); + }, + completeHandler); + } else { + completeHandler.run(); } } diff --git a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java index cc70c4a002..3c09fc3d86 100644 --- a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java +++ b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java @@ -162,12 +162,15 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { + public void readPersisted(Runnable completeHandler) { if (DevEnv.isDaoActivated()) { - MyBlindVoteList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - myBlindVoteList.setAll(persisted.getList()); - } + persistenceManager.readPersisted(persisted -> { + myBlindVoteList.setAll(persisted.getList()); + completeHandler.run(); + }, + completeHandler); + } else { + completeHandler.run(); } } @@ -186,14 +189,14 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen // API /////////////////////////////////////////////////////////////////////////////////////////// - public Tuple2 getMiningFeeAndTxSize(Coin stake) + public Tuple2 getMiningFeeAndTxVsize(Coin stake) throws InsufficientMoneyException, WalletException, TransactionVerificationException { // We set dummy opReturn data Coin blindVoteFee = BlindVoteConsensus.getFee(daoStateService, daoStateService.getChainHeight()); Transaction dummyTx = getBlindVoteTx(stake, blindVoteFee, new byte[22]); Coin miningFee = dummyTx.getFee(); - int txSize = dummyTx.bitcoinSerialize().length; - return new Tuple2<>(miningFee, txSize); + int txVsize = dummyTx.getVsize(); + return new Tuple2<>(miningFee, txVsize); } public void publishBlindVote(Coin stake, ResultHandler resultHandler, ExceptionHandler exceptionHandler) { diff --git a/core/src/main/java/bisq/core/dao/governance/bond/lockup/LockupTxService.java b/core/src/main/java/bisq/core/dao/governance/bond/lockup/LockupTxService.java index 4ffa4772e9..4a466811e0 100644 --- a/core/src/main/java/bisq/core/dao/governance/bond/lockup/LockupTxService.java +++ b/core/src/main/java/bisq/core/dao/governance/bond/lockup/LockupTxService.java @@ -91,12 +91,12 @@ public class LockupTxService { } } - public Tuple2 getMiningFeeAndTxSize(Coin lockupAmount, int lockTime, LockupReason lockupReason, byte[] hash) + public Tuple2 getMiningFeeAndTxVsize(Coin lockupAmount, int lockTime, LockupReason lockupReason, byte[] hash) throws InsufficientMoneyException, WalletException, TransactionVerificationException, IOException { Transaction tx = getLockupTx(lockupAmount, lockTime, lockupReason, hash); Coin miningFee = tx.getFee(); - int txSize = tx.bitcoinSerialize().length; - return new Tuple2<>(miningFee, txSize); + int txVsize = tx.getVsize(); + return new Tuple2<>(miningFee, txVsize); } private Transaction getLockupTx(Coin lockupAmount, int lockTime, LockupReason lockupReason, byte[] hash) diff --git a/core/src/main/java/bisq/core/dao/governance/bond/reputation/MyReputationListService.java b/core/src/main/java/bisq/core/dao/governance/bond/reputation/MyReputationListService.java index c417b9c61c..5995a3be35 100644 --- a/core/src/main/java/bisq/core/dao/governance/bond/reputation/MyReputationListService.java +++ b/core/src/main/java/bisq/core/dao/governance/bond/reputation/MyReputationListService.java @@ -55,12 +55,15 @@ public class MyReputationListService implements PersistedDataHost, DaoSetupServi /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { + public void readPersisted(Runnable completeHandler) { if (DevEnv.isDaoActivated()) { - MyReputationList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - myReputationList.setAll(persisted.getList()); - } + persistenceManager.readPersisted(persisted -> { + myReputationList.setAll(persisted.getList()); + completeHandler.run(); + }, + completeHandler); + } else { + completeHandler.run(); } } diff --git a/core/src/main/java/bisq/core/dao/governance/bond/unlock/UnlockTxService.java b/core/src/main/java/bisq/core/dao/governance/bond/unlock/UnlockTxService.java index 0682186d2e..0defe5e475 100644 --- a/core/src/main/java/bisq/core/dao/governance/bond/unlock/UnlockTxService.java +++ b/core/src/main/java/bisq/core/dao/governance/bond/unlock/UnlockTxService.java @@ -89,12 +89,12 @@ public class UnlockTxService { } } - public Tuple2 getMiningFeeAndTxSize(String lockupTxId) + public Tuple2 getMiningFeeAndTxVsize(String lockupTxId) throws InsufficientMoneyException, WalletException, TransactionVerificationException { Transaction tx = getUnlockTx(lockupTxId); Coin miningFee = tx.getFee(); - int txSize = tx.bitcoinSerialize().length; - return new Tuple2<>(miningFee, txSize); + int txVsize = tx.getVsize(); + return new Tuple2<>(miningFee, txVsize); } private Transaction getUnlockTx(String lockupTxId) diff --git a/core/src/main/java/bisq/core/dao/governance/myvote/MyVoteListService.java b/core/src/main/java/bisq/core/dao/governance/myvote/MyVoteListService.java index 390ee4ee60..dacf524344 100644 --- a/core/src/main/java/bisq/core/dao/governance/myvote/MyVoteListService.java +++ b/core/src/main/java/bisq/core/dao/governance/myvote/MyVoteListService.java @@ -69,12 +69,15 @@ public class MyVoteListService implements PersistedDataHost { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { + public void readPersisted(Runnable completeHandler) { if (DevEnv.isDaoActivated()) { - MyVoteList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - this.myVoteList.setAll(persisted.getList()); - } + persistenceManager.readPersisted(persisted -> { + myVoteList.setAll(persisted.getList()); + completeHandler.run(); + }, + completeHandler); + } else { + completeHandler.run(); } } @@ -93,11 +96,12 @@ public class MyVoteListService implements PersistedDataHost { public void applyRevealTxId(MyVote myVote, String voteRevealTxId) { myVote.setRevealTxId(voteRevealTxId); - log.info("Applied revealTxId to myVote.\nmyVote={}\nvoteRevealTxId={}", myVote, voteRevealTxId); + log.debug("Applied revealTxId to myVote.\nmyVote={}\nvoteRevealTxId={}", myVote, voteRevealTxId); requestPersistence(); } - public Tuple2 getMeritAndStakeForProposal(String proposalTxId, MyBlindVoteListService myBlindVoteListService) { + public Tuple2 getMeritAndStakeForProposal(String proposalTxId, + MyBlindVoteListService myBlindVoteListService) { long merit = 0; long stake = 0; List list = new ArrayList<>(myVoteList.getList()); diff --git a/core/src/main/java/bisq/core/dao/governance/proofofburn/MyProofOfBurnListService.java b/core/src/main/java/bisq/core/dao/governance/proofofburn/MyProofOfBurnListService.java index 39d8ed5a52..d61c6a93be 100644 --- a/core/src/main/java/bisq/core/dao/governance/proofofburn/MyProofOfBurnListService.java +++ b/core/src/main/java/bisq/core/dao/governance/proofofburn/MyProofOfBurnListService.java @@ -55,12 +55,15 @@ public class MyProofOfBurnListService implements PersistedDataHost, DaoSetupServ /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { + public void readPersisted(Runnable completeHandler) { if (DevEnv.isDaoActivated()) { - MyProofOfBurnList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - myProofOfBurnList.setAll(persisted.getList()); - } + persistenceManager.readPersisted(persisted -> { + myProofOfBurnList.setAll(persisted.getList()); + completeHandler.run(); + }, + completeHandler); + } else { + completeHandler.run(); } } diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java b/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java index 19284a0c04..96ab94ed66 100644 --- a/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java +++ b/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java @@ -107,13 +107,16 @@ public class MyProposalListService implements PersistedDataHost, DaoStateListene /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { + public void readPersisted(Runnable completeHandler) { if (DevEnv.isDaoActivated()) { - MyProposalList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - myProposalList.setAll(persisted.getList()); - listeners.forEach(l -> l.onListChanged(getList())); - } + persistenceManager.readPersisted(persisted -> { + myProposalList.setAll(persisted.getList()); + listeners.forEach(l -> l.onListChanged(getList())); + completeHandler.run(); + }, + completeHandler); + } else { + completeHandler.run(); } } diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/storage/temp/TempProposalStorageService.java b/core/src/main/java/bisq/core/dao/governance/proposal/storage/temp/TempProposalStorageService.java index d39b6f5470..b8af27c672 100644 --- a/core/src/main/java/bisq/core/dao/governance/proposal/storage/temp/TempProposalStorageService.java +++ b/core/src/main/java/bisq/core/dao/governance/proposal/storage/temp/TempProposalStorageService.java @@ -73,9 +73,9 @@ public class TempProposalStorageService extends MapStoreService completeHandler.run()); } diff --git a/core/src/main/java/bisq/core/dao/governance/votereveal/VoteRevealService.java b/core/src/main/java/bisq/core/dao/governance/votereveal/VoteRevealService.java index 40607ca30e..94b4f0b9a6 100644 --- a/core/src/main/java/bisq/core/dao/governance/votereveal/VoteRevealService.java +++ b/core/src/main/java/bisq/core/dao/governance/votereveal/VoteRevealService.java @@ -133,8 +133,8 @@ public class VoteRevealService implements DaoStateListener, DaoSetupService { private byte[] getHashOfBlindVoteList() { List blindVotes = BlindVoteConsensus.getSortedBlindVoteListOfCycle(blindVoteListService); byte[] hashOfBlindVoteList = VoteRevealConsensus.getHashOfBlindVoteList(blindVotes); - log.info("blindVoteList for creating hash: " + blindVotes); - log.info("Sha256Ripemd160 hash of hashOfBlindVoteList " + Utilities.bytesAsHexString(hashOfBlindVoteList)); + log.debug("blindVoteList for creating hash: {}", blindVotes); + log.info("Sha256Ripemd160 hash of hashOfBlindVoteList {}", Utilities.bytesAsHexString(hashOfBlindVoteList)); return hashOfBlindVoteList; } diff --git a/core/src/main/java/bisq/core/dao/node/BsqNode.java b/core/src/main/java/bisq/core/dao/node/BsqNode.java index fd44b87533..e06be38757 100644 --- a/core/src/main/java/bisq/core/dao/node/BsqNode.java +++ b/core/src/main/java/bisq/core/dao/node/BsqNode.java @@ -209,7 +209,7 @@ public abstract class BsqNode implements DaoSetupService { parseBlockchainComplete = true; daoStateService.onParseBlockChainComplete(); - exportJsonFilesService.onParseBlockChainComplete(); + maybeExportToJson(); } @SuppressWarnings("WeakerAccess") @@ -291,7 +291,7 @@ public abstract class BsqNode implements DaoSetupService { return Optional.empty(); } - protected void maybeExportNewBlockToJson(Block block) { - exportJsonFilesService.onNewBlock(block); + protected void maybeExportToJson() { + exportJsonFilesService.maybeExportToJson(); } } diff --git a/core/src/main/java/bisq/core/dao/node/explorer/ExportJsonFilesService.java b/core/src/main/java/bisq/core/dao/node/explorer/ExportJsonFilesService.java index 193218f63f..1c9c605f04 100644 --- a/core/src/main/java/bisq/core/dao/node/explorer/ExportJsonFilesService.java +++ b/core/src/main/java/bisq/core/dao/node/explorer/ExportJsonFilesService.java @@ -19,6 +19,7 @@ package bisq.core.dao.node.explorer; import bisq.core.dao.DaoSetupService; import bisq.core.dao.state.DaoStateService; +import bisq.core.dao.state.model.DaoState; import bisq.core.dao.state.model.blockchain.Block; import bisq.core.dao.state.model.blockchain.PubKeyScript; import bisq.core.dao.state.model.blockchain.Tx; @@ -26,6 +27,7 @@ import bisq.core.dao.state.model.blockchain.TxOutput; import bisq.core.dao.state.model.blockchain.TxType; import bisq.common.config.Config; +import bisq.common.file.FileUtil; import bisq.common.file.JsonFileManager; import bisq.common.util.Utilities; @@ -35,11 +37,18 @@ import com.google.inject.Inject; import javax.inject.Named; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; + import java.nio.file.Paths; import java.io.File; +import java.io.IOException; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -47,13 +56,17 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; + @Slf4j public class ExportJsonFilesService implements DaoSetupService { private final DaoStateService daoStateService; private final File storageDir; - private boolean dumpBlockchainData; - private JsonFileManager blockFileManager, txFileManager, txOutputFileManager, bsqStateFileManager; - private File blockDir; + private final boolean dumpBlockchainData; + + private final ListeningExecutorService executor = Utilities.getListeningExecutorService("JsonExporter", + 1, 1, 1200); + private JsonFileManager txFileManager, txOutputFileManager, bsqStateFileManager; @Inject public ExportJsonFilesService(DaoStateService daoStateService, @@ -75,135 +88,88 @@ public class ExportJsonFilesService implements DaoSetupService { @Override public void start() { - if (!dumpBlockchainData) { - return; + if (dumpBlockchainData) { + File jsonDir = new File(Paths.get(storageDir.getAbsolutePath(), "json").toString()); + File txDir = new File(Paths.get(storageDir.getAbsolutePath(), "json", "tx").toString()); + File txOutputDir = new File(Paths.get(storageDir.getAbsolutePath(), "json", "txo").toString()); + File bsqStateDir = new File(Paths.get(storageDir.getAbsolutePath(), "json", "all").toString()); + try { + if (txDir.exists()) + FileUtil.deleteDirectory(txDir); + if (txOutputDir.exists()) + FileUtil.deleteDirectory(txOutputDir); + if (bsqStateDir.exists()) + FileUtil.deleteDirectory(bsqStateDir); + if (jsonDir.exists()) + FileUtil.deleteDirectory(jsonDir); + } catch (IOException e) { + log.error(e.toString()); + e.printStackTrace(); + } + + if (!jsonDir.mkdir()) + log.warn("make jsonDir failed.\njsonDir=" + jsonDir.getAbsolutePath()); + + if (!txDir.mkdir()) + log.warn("make txDir failed.\ntxDir=" + txDir.getAbsolutePath()); + + if (!txOutputDir.mkdir()) + log.warn("make txOutputDir failed.\ntxOutputDir=" + txOutputDir.getAbsolutePath()); + + if (!bsqStateDir.mkdir()) + log.warn("make bsqStateDir failed.\nbsqStateDir=" + bsqStateDir.getAbsolutePath()); + + txFileManager = new JsonFileManager(txDir); + txOutputFileManager = new JsonFileManager(txOutputDir); + bsqStateFileManager = new JsonFileManager(bsqStateDir); } - - File jsonDir = new File(Paths.get(storageDir.getAbsolutePath(), "json").toString()); - blockDir = new File(Paths.get(storageDir.getAbsolutePath(), "json", "block").toString()); - File txDir = new File(Paths.get(storageDir.getAbsolutePath(), "json", "tx").toString()); - File txOutputDir = new File(Paths.get(storageDir.getAbsolutePath(), "json", "txo").toString()); - File bsqStateDir = new File(Paths.get(storageDir.getAbsolutePath(), "json", "all").toString()); - - if (!jsonDir.mkdir()) - log.warn("make jsonDir failed.\njsonDir=" + jsonDir.getAbsolutePath()); - - if (!blockDir.mkdir()) - log.warn("make blockDir failed.\njsonDir=" + blockDir.getAbsolutePath()); - - if (!txDir.mkdir()) - log.warn("make txDir failed.\ntxDir=" + txDir.getAbsolutePath()); - - if (!txOutputDir.mkdir()) - log.warn("make txOutputDir failed.\ntxOutputDir=" + txOutputDir.getAbsolutePath()); - - if (!bsqStateDir.mkdir()) - log.warn("make bsqStateDir failed.\nbsqStateDir=" + bsqStateDir.getAbsolutePath()); - - blockFileManager = new JsonFileManager(blockDir); - txFileManager = new JsonFileManager(txDir); - txOutputFileManager = new JsonFileManager(txOutputDir); - bsqStateFileManager = new JsonFileManager(bsqStateDir); } public void shutDown() { - if (!dumpBlockchainData) { - return; - } - - blockFileManager.shutDown(); - txFileManager.shutDown(); - txOutputFileManager.shutDown(); - bsqStateFileManager.shutDown(); - dumpBlockchainData = false; - } - - public void onNewBlock(Block block) { - if (!dumpBlockchainData) { - return; - } - - // We do write the block on the main thread as the overhead to create a thread and risk for inconsistency is not - // worth the potential performance gain. - processBlock(block, true); - } - - private void processBlock(Block block, boolean doDumpDaoState) { - int lastPersistedBlock = getLastPersistedBlock(); - if (block.getHeight() <= lastPersistedBlock) { - return; - } - - long ts = System.currentTimeMillis(); - JsonBlock jsonBlock = getJsonBlock(block); - blockFileManager.writeToDisc(Utilities.objectToJson(jsonBlock), String.valueOf(jsonBlock.getHeight())); - - jsonBlock.getTxs().forEach(jsonTx -> { - txFileManager.writeToDisc(Utilities.objectToJson(jsonTx), jsonTx.getId()); - - jsonTx.getOutputs().forEach(jsonTxOutput -> - txOutputFileManager.writeToDisc(Utilities.objectToJson(jsonTxOutput), jsonTxOutput.getId())); - }); - - log.info("Write json data for block {} took {} ms", block.getHeight(), System.currentTimeMillis() - ts); - - if (doDumpDaoState) { - dumpDaoState(); + if (dumpBlockchainData && txFileManager != null) { + txFileManager.shutDown(); + txOutputFileManager.shutDown(); + bsqStateFileManager.shutDown(); } } - public void onParseBlockChainComplete() { - if (!dumpBlockchainData) { - return; - } + public void maybeExportToJson() { + if (dumpBlockchainData && + daoStateService.isParseBlockChainComplete()) { + // We store the data we need once we write the data to disk (in the thread) locally. + // Access to daoStateService is single threaded, we must not access daoStateService from the thread. + List allJsonTxOutputs = new ArrayList<>(); - int lastPersistedBlock = getLastPersistedBlock(); - List blocks = daoStateService.getBlocksFromBlockHeight(lastPersistedBlock + 1, Integer.MAX_VALUE); + List jsonTxs = daoStateService.getUnorderedTxStream() + .map(tx -> { + JsonTx jsonTx = getJsonTx(tx); + allJsonTxOutputs.addAll(jsonTx.getOutputs()); + return jsonTx; + }).collect(Collectors.toList()); - // We use a thread here to write all past blocks to avoid that the main thread gets blocked for too long. - new Thread(() -> { - Thread.currentThread().setName("Write all blocks to json"); - blocks.forEach(e -> processBlock(e, false)); - }).start(); - - dumpDaoState(); - } - - private void dumpDaoState() { - // TODO we should get rid of that data structure and use the individual jsonBlocks instead as we cannot cache data - // here and re-write each time the full blockchain which is already > 200 MB - // Once the webapp has impl the changes we can delete that here. - long ts = System.currentTimeMillis(); - List jsonBlockList = daoStateService.getBlocks().stream() - .map(this::getJsonBlock) - .collect(Collectors.toList()); - JsonBlocks jsonBlocks = new JsonBlocks(daoStateService.getChainHeight(), jsonBlockList); - - // We use here the thread write method as the data is quite large and write can take a bit - bsqStateFileManager.writeToDiscThreaded(Utilities.objectToJson(jsonBlocks), "blocks"); - log.info("Dumping full bsqState with {} blocks took {} ms", - jsonBlocks.getBlocks().size(), System.currentTimeMillis() - ts); - } - - private int getLastPersistedBlock() { - // At start we use one block before genesis - int result = daoStateService.getGenesisBlockHeight() - 1; - String[] list = blockDir.list(); - if (list != null && list.length > 0) { - List blocks = Arrays.stream(list) - .filter(e -> !e.endsWith(".tmp")) - .map(e -> e.replace(".json", "")) - .map(Integer::valueOf) - .sorted() + DaoState daoState = daoStateService.getClone(); + List jsonBlockList = daoState.getBlocks().stream() + .map(this::getJsonBlock) .collect(Collectors.toList()); - if (!blocks.isEmpty()) { - Integer lastBlockHeight = blocks.get(blocks.size() - 1); - if (lastBlockHeight > result) { - result = lastBlockHeight; + JsonBlocks jsonBlocks = new JsonBlocks(daoState.getChainHeight(), jsonBlockList); + + ListenableFuture future = executor.submit(() -> { + bsqStateFileManager.writeToDisc(Utilities.objectToJson(jsonBlocks), "blocks"); + allJsonTxOutputs.forEach(jsonTxOutput -> txOutputFileManager.writeToDisc(Utilities.objectToJson(jsonTxOutput), jsonTxOutput.getId())); + jsonTxs.forEach(jsonTx -> txFileManager.writeToDisc(Utilities.objectToJson(jsonTx), jsonTx.getId())); + return null; + }); + + Futures.addCallback(future, new FutureCallback<>() { + public void onSuccess(Void ignore) { } - } + + public void onFailure(@NotNull Throwable throwable) { + log.error(throwable.toString()); + throwable.printStackTrace(); + } + }, MoreExecutors.directExecutor()); } - return result; } private JsonBlock getJsonBlock(Block block) { diff --git a/core/src/main/java/bisq/core/dao/node/full/FullNode.java b/core/src/main/java/bisq/core/dao/node/full/FullNode.java index f4e42dd793..91e9d41362 100644 --- a/core/src/main/java/bisq/core/dao/node/full/FullNode.java +++ b/core/src/main/java/bisq/core/dao/node/full/FullNode.java @@ -168,7 +168,7 @@ public class FullNode extends BsqNode { } private void onNewBlock(Block block) { - maybeExportNewBlockToJson(block); + maybeExportToJson(); if (p2pNetworkReady && parseBlockchainComplete) fullNodeNetworkService.publishNewBlock(block); diff --git a/core/src/main/java/bisq/core/dao/node/lite/LiteNode.java b/core/src/main/java/bisq/core/dao/node/lite/LiteNode.java index 99cb779682..a51c5a1123 100644 --- a/core/src/main/java/bisq/core/dao/node/lite/LiteNode.java +++ b/core/src/main/java/bisq/core/dao/node/lite/LiteNode.java @@ -28,7 +28,6 @@ import bisq.core.dao.node.parser.BlockParser; import bisq.core.dao.node.parser.exceptions.RequiredReorgFromSnapshotException; import bisq.core.dao.state.DaoStateService; import bisq.core.dao.state.DaoStateSnapshotService; -import bisq.core.dao.state.model.blockchain.Block; import bisq.network.p2p.P2PService; import bisq.network.p2p.network.Connection; @@ -40,7 +39,6 @@ import com.google.inject.Inject; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import lombok.extern.slf4j.Slf4j; @@ -229,18 +227,19 @@ public class LiteNode extends BsqNode { } // We received a new block - private void onNewBlockReceived(RawBlock rawBlock) { - int blockHeight = rawBlock.getHeight(); - log.debug("onNewBlockReceived: block at height {}, hash={}", blockHeight, rawBlock.getHash()); + private void onNewBlockReceived(RawBlock block) { + int blockHeight = block.getHeight(); + log.debug("onNewBlockReceived: block at height {}, hash={}", blockHeight, block.getHash()); // We only update chainTipHeight if we get a newer block if (blockHeight > chainTipHeight) chainTipHeight = blockHeight; try { - Optional optionalBlock = doParseBlock(rawBlock); - optionalBlock.ifPresent(this::maybeExportNewBlockToJson); + doParseBlock(block); } catch (RequiredReorgFromSnapshotException ignore) { } + + maybeExportToJson(); } } diff --git a/core/src/main/java/bisq/core/dao/state/model/governance/CompensationProposal.java b/core/src/main/java/bisq/core/dao/state/model/governance/CompensationProposal.java index 8a4871b0a4..d23249b6c4 100644 --- a/core/src/main/java/bisq/core/dao/state/model/governance/CompensationProposal.java +++ b/core/src/main/java/bisq/core/dao/state/model/governance/CompensationProposal.java @@ -27,7 +27,6 @@ import bisq.common.app.Version; import bisq.common.config.Config; import bisq.common.util.CollectionUtils; -import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.Coin; import org.bitcoinj.core.LegacyAddress; diff --git a/core/src/main/java/bisq/core/dao/state/model/governance/ReimbursementProposal.java b/core/src/main/java/bisq/core/dao/state/model/governance/ReimbursementProposal.java index 6501e83631..fb83ab23d5 100644 --- a/core/src/main/java/bisq/core/dao/state/model/governance/ReimbursementProposal.java +++ b/core/src/main/java/bisq/core/dao/state/model/governance/ReimbursementProposal.java @@ -27,7 +27,6 @@ import bisq.common.app.Version; import bisq.common.config.Config; import bisq.common.util.CollectionUtils; -import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.Coin; import org.bitcoinj.core.LegacyAddress; diff --git a/core/src/main/java/bisq/core/dao/state/unconfirmed/UnconfirmedBsqChangeOutputListService.java b/core/src/main/java/bisq/core/dao/state/unconfirmed/UnconfirmedBsqChangeOutputListService.java index 467800748f..4436c2bcb8 100644 --- a/core/src/main/java/bisq/core/dao/state/unconfirmed/UnconfirmedBsqChangeOutputListService.java +++ b/core/src/main/java/bisq/core/dao/state/unconfirmed/UnconfirmedBsqChangeOutputListService.java @@ -55,12 +55,15 @@ public class UnconfirmedBsqChangeOutputListService implements PersistedDataHost /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { + public void readPersisted(Runnable completeHandler) { if (DevEnv.isDaoActivated()) { - UnconfirmedBsqChangeOutputList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - unconfirmedBsqChangeOutputList.setAll(persisted.getList()); - } + persistenceManager.readPersisted(persisted -> { + unconfirmedBsqChangeOutputList.setAll(persisted.getList()); + completeHandler.run(); + }, + completeHandler); + } else { + completeHandler.run(); } } diff --git a/core/src/main/java/bisq/core/filter/Filter.java b/core/src/main/java/bisq/core/filter/Filter.java index a22ecda78a..a642c9511c 100644 --- a/core/src/main/java/bisq/core/filter/Filter.java +++ b/core/src/main/java/bisq/core/filter/Filter.java @@ -48,6 +48,7 @@ import javax.annotation.Nullable; public final class Filter implements ProtectedStoragePayload, ExpirablePayload { private final List bannedOfferIds; private final List bannedNodeAddress; + private final List bannedAutoConfExplorers; private final List bannedPaymentAccounts; private final List bannedCurrencies; private final List bannedPaymentMethods; @@ -115,7 +116,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { signatureAsBase64, filter.getSignerPubKeyAsHex(), filter.getBannedPrivilegedDevPubKeys(), - filter.isDisableAutoConf()); + filter.isDisableAutoConf(), + filter.getBannedAutoConfExplorers()); } // Used for signature verification as we created the sig without the signatureAsBase64 field we set it to null again @@ -143,7 +145,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { null, filter.getSignerPubKeyAsHex(), filter.getBannedPrivilegedDevPubKeys(), - filter.isDisableAutoConf()); + filter.isDisableAutoConf(), + filter.getBannedAutoConfExplorers()); } public Filter(List bannedOfferIds, @@ -166,7 +169,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { PublicKey ownerPubKey, String signerPubKeyAsHex, List bannedPrivilegedDevPubKeys, - boolean disableAutoConf) { + boolean disableAutoConf, + List bannedAutoConfExplorers) { this(bannedOfferIds, bannedNodeAddress, bannedPaymentAccounts, @@ -190,7 +194,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { null, signerPubKeyAsHex, bannedPrivilegedDevPubKeys, - disableAutoConf); + disableAutoConf, + bannedAutoConfExplorers); } @@ -222,7 +227,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { @Nullable String signatureAsBase64, String signerPubKeyAsHex, List bannedPrivilegedDevPubKeys, - boolean disableAutoConf) { + boolean disableAutoConf, + List bannedAutoConfExplorers) { this.bannedOfferIds = bannedOfferIds; this.bannedNodeAddress = bannedNodeAddress; this.bannedPaymentAccounts = bannedPaymentAccounts; @@ -247,6 +253,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { this.signerPubKeyAsHex = signerPubKeyAsHex; this.bannedPrivilegedDevPubKeys = bannedPrivilegedDevPubKeys; this.disableAutoConf = disableAutoConf; + this.bannedAutoConfExplorers = bannedAutoConfExplorers; // ownerPubKeyBytes can be null when called from tests if (ownerPubKeyBytes != null) { @@ -283,7 +290,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { .setSignerPubKeyAsHex(signerPubKeyAsHex) .setCreationDate(creationDate) .addAllBannedPrivilegedDevPubKeys(bannedPrivilegedDevPubKeys) - .setDisableAutoConf(disableAutoConf); + .setDisableAutoConf(disableAutoConf) + .addAllBannedAutoConfExplorers(bannedAutoConfExplorers); Optional.ofNullable(signatureAsBase64).ifPresent(builder::setSignatureAsBase64); Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData); @@ -320,7 +328,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { proto.getSignatureAsBase64(), proto.getSignerPubKeyAsHex(), ProtoUtil.protocolStringListToList(proto.getBannedPrivilegedDevPubKeysList()), - proto.getDisableAutoConf() + proto.getDisableAutoConf(), + ProtoUtil.protocolStringListToList(proto.getBannedAutoConfExplorersList()) ); } @@ -339,6 +348,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { return "Filter{" + "\n bannedOfferIds=" + bannedOfferIds + ",\n bannedNodeAddress=" + bannedNodeAddress + + ",\n bannedAutoConfExplorers=" + bannedAutoConfExplorers + ",\n bannedPaymentAccounts=" + bannedPaymentAccounts + ",\n bannedCurrencies=" + bannedCurrencies + ",\n bannedPaymentMethods=" + bannedPaymentMethods + @@ -356,10 +366,11 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { ",\n mediators=" + mediators + ",\n refundAgents=" + refundAgents + ",\n bannedAccountWitnessSignerPubKeys=" + bannedAccountWitnessSignerPubKeys + - ",\n bannedPrivilegedDevPubKeys=" + bannedPrivilegedDevPubKeys + ",\n btcFeeReceiverAddresses=" + btcFeeReceiverAddresses + ",\n creationDate=" + creationDate + + ",\n bannedPrivilegedDevPubKeys=" + bannedPrivilegedDevPubKeys + ",\n extraDataMap=" + extraDataMap + + ",\n ownerPubKey=" + ownerPubKey + ",\n disableAutoConf=" + disableAutoConf + "\n}"; } diff --git a/core/src/main/java/bisq/core/filter/FilterManager.java b/core/src/main/java/bisq/core/filter/FilterManager.java index a528903c3d..19cfded31f 100644 --- a/core/src/main/java/bisq/core/filter/FilterManager.java +++ b/core/src/main/java/bisq/core/filter/FilterManager.java @@ -216,13 +216,13 @@ public class FilterManager { addListener(filter -> { if (filter != null && filterWarningHandler != null) { if (filter.getSeedNodes() != null && !filter.getSeedNodes().isEmpty()) { - log.info(Res.get("popup.warning.nodeBanned", Res.get("popup.warning.seed"))); + log.info("One of the seed nodes got banned. {}", filter.getSeedNodes()); // Let's keep that more silent. Might be used in case a node is unstable and we don't want to confuse users. // filterWarningHandler.accept(Res.get("popup.warning.nodeBanned", Res.get("popup.warning.seed"))); } if (filter.getPriceRelayNodes() != null && !filter.getPriceRelayNodes().isEmpty()) { - log.info(Res.get("popup.warning.nodeBanned", Res.get("popup.warning.priceRelay"))); + log.info("One of the price relay nodes got banned. {}", filter.getPriceRelayNodes()); // Let's keep that more silent. Might be used in case a node is unstable and we don't want to confuse users. // filterWarningHandler.accept(Res.get("popup.warning.nodeBanned", Res.get("popup.warning.priceRelay"))); } @@ -398,6 +398,12 @@ public class FilterManager { .anyMatch(e -> e.equals(nodeAddress.getFullAddress())); } + public boolean isAutoConfExplorerBanned(String address) { + return getFilter() != null && + getFilter().getBannedAutoConfExplorers().stream() + .anyMatch(e -> e.equals(address)); + } + public boolean requireUpdateToNewVersionForTrading() { if (getFilter() == null) { return false; @@ -460,7 +466,7 @@ public class FilterManager { Filter currentFilter = getFilter(); if (!isFilterPublicKeyInList(newFilter)) { - log.warn("isFilterPublicKeyInList failed. Filter={}", newFilter); + log.warn("isFilterPublicKeyInList failed. Filter.getSignerPubKeyAsHex={}", newFilter.getSignerPubKeyAsHex()); return; } if (!isSignatureValid(newFilter)) { diff --git a/core/src/main/java/bisq/core/locale/CurrencyUtil.java b/core/src/main/java/bisq/core/locale/CurrencyUtil.java index 5f8016deea..1669749083 100644 --- a/core/src/main/java/bisq/core/locale/CurrencyUtil.java +++ b/core/src/main/java/bisq/core/locale/CurrencyUtil.java @@ -267,6 +267,76 @@ public class CurrencyUtil { return currencies; } + // https://github.com/bisq-network/proposals/issues/243 + public static List getAllTransferwiseCurrencies() { + ArrayList currencies = new ArrayList<>(Arrays.asList( + new FiatCurrency("ARS"), + new FiatCurrency("AUD"), + new FiatCurrency("XOF"), + new FiatCurrency("BGN"), + new FiatCurrency("CAD"), + new FiatCurrency("CLP"), + new FiatCurrency("HRK"), + new FiatCurrency("CZK"), + new FiatCurrency("DKK"), + new FiatCurrency("EGP"), + new FiatCurrency("EUR"), + new FiatCurrency("GEL"), + new FiatCurrency("HKD"), + new FiatCurrency("HUF"), + new FiatCurrency("IDR"), + new FiatCurrency("ILS"), + new FiatCurrency("JPY"), + new FiatCurrency("KES"), + new FiatCurrency("MYR"), + new FiatCurrency("MXN"), + new FiatCurrency("MAD"), + new FiatCurrency("NPR"), + new FiatCurrency("NZD"), + new FiatCurrency("NGN"), + new FiatCurrency("NOK"), + new FiatCurrency("PKR"), + new FiatCurrency("PEN"), + new FiatCurrency("PHP"), + new FiatCurrency("PLN"), + new FiatCurrency("RON"), + new FiatCurrency("RUB"), + new FiatCurrency("SGD"), + new FiatCurrency("ZAR"), + new FiatCurrency("KRW"), + new FiatCurrency("SEK"), + new FiatCurrency("CHF"), + new FiatCurrency("THB"), + new FiatCurrency("TRY"), + new FiatCurrency("UGX"), + new FiatCurrency("AED"), + new FiatCurrency("GBP"), + new FiatCurrency("VND"), + new FiatCurrency("ZMW") + )); + + currencies.sort(Comparator.comparing(TradeCurrency::getCode)); + return currencies; + } + + public static List getAllAmazonGiftCardCurrencies() { + List currencies = new ArrayList<>(Arrays.asList( + new FiatCurrency("AUD"), + new FiatCurrency("CAD"), + new FiatCurrency("EUR"), + new FiatCurrency("GBP"), + new FiatCurrency("INR"), + new FiatCurrency("JPY"), + new FiatCurrency("SAR"), + new FiatCurrency("SEK"), + new FiatCurrency("SGD"), + new FiatCurrency("TRY"), + new FiatCurrency("USD") + )); + currencies.sort(Comparator.comparing(TradeCurrency::getCode)); + return currencies; + } + // https://www.revolut.com/help/getting-started/exchanging-currencies/what-fiat-currencies-are-supported-for-holding-and-exchange public static List getAllRevolutCurrencies() { ArrayList currencies = new ArrayList<>(Arrays.asList( @@ -543,4 +613,8 @@ public class CurrencyUtil { else return Res.get(translationKey, currencyCode, Res.getBaseCurrencyCode()); } + + public static String getOfferVolumeCode(String currencyCode) { + return Res.get("shared.offerVolumeCode", currencyCode); + } } diff --git a/core/src/main/java/bisq/core/locale/LanguageUtil.java b/core/src/main/java/bisq/core/locale/LanguageUtil.java index 312c1f00fc..018360b30d 100644 --- a/core/src/main/java/bisq/core/locale/LanguageUtil.java +++ b/core/src/main/java/bisq/core/locale/LanguageUtil.java @@ -41,7 +41,9 @@ public class LanguageUtil { "vi", // Vietnamese "th", // Thai "ja", // Japanese - "fa" // Persian + "fa", // Persian + "it", // Italian + "cs" // Czech /* // not translated yet "el", // Greek @@ -49,7 +51,6 @@ public class LanguageUtil { "hu", // Hungarian "ro", // Romanian "tr" // Turkish - "it", // Italian "iw", // Hebrew "hi", // Hindi "ko", // Korean @@ -77,7 +78,6 @@ public class LanguageUtil { "ms", // Malay "is", // Icelandic "et", // Estonian - "cs", // Czech "ar", // Arabic "vi", // Vietnamese "th", // Thai diff --git a/core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequestHandler.java b/core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequestHandler.java new file mode 100644 index 0000000000..6bd646bc29 --- /dev/null +++ b/core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequestHandler.java @@ -0,0 +1,182 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.network.p2p.inventory; + +import bisq.core.dao.monitoring.BlindVoteStateMonitoringService; +import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.monitoring.ProposalStateMonitoringService; +import bisq.core.dao.monitoring.model.BlindVoteStateBlock; +import bisq.core.dao.monitoring.model.DaoStateBlock; +import bisq.core.dao.monitoring.model.ProposalStateBlock; +import bisq.core.dao.state.DaoStateService; +import bisq.core.filter.Filter; +import bisq.core.filter.FilterManager; +import bisq.core.network.p2p.inventory.messages.GetInventoryRequest; +import bisq.core.network.p2p.inventory.messages.GetInventoryResponse; +import bisq.core.network.p2p.inventory.model.InventoryItem; +import bisq.core.network.p2p.inventory.model.RequestInfo; + +import bisq.network.p2p.network.Connection; +import bisq.network.p2p.network.MessageListener; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.network.Statistic; +import bisq.network.p2p.peers.PeerManager; +import bisq.network.p2p.storage.P2PDataStorage; +import bisq.network.p2p.storage.payload.ProtectedStorageEntry; + +import bisq.common.app.Version; +import bisq.common.config.Config; +import bisq.common.proto.network.NetworkEnvelope; +import bisq.common.util.Profiler; +import bisq.common.util.Utilities; + +import javax.inject.Inject; +import javax.inject.Named; + +import com.google.common.base.Enums; +import com.google.common.base.Joiner; +import com.google.common.base.Optional; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; + +import java.lang.management.ManagementFactory; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class GetInventoryRequestHandler implements MessageListener { + private final NetworkNode networkNode; + private final PeerManager peerManager; + private final P2PDataStorage p2PDataStorage; + private final DaoStateService daoStateService; + private final DaoStateMonitoringService daoStateMonitoringService; + private final ProposalStateMonitoringService proposalStateMonitoringService; + private final BlindVoteStateMonitoringService blindVoteStateMonitoringService; + private final FilterManager filterManager; + private final int maxConnections; + + @Inject + public GetInventoryRequestHandler(NetworkNode networkNode, + PeerManager peerManager, + P2PDataStorage p2PDataStorage, + DaoStateService daoStateService, + DaoStateMonitoringService daoStateMonitoringService, + ProposalStateMonitoringService proposalStateMonitoringService, + BlindVoteStateMonitoringService blindVoteStateMonitoringService, + FilterManager filterManager, + @Named(Config.MAX_CONNECTIONS) int maxConnections) { + this.networkNode = networkNode; + this.peerManager = peerManager; + this.p2PDataStorage = p2PDataStorage; + this.daoStateService = daoStateService; + this.daoStateMonitoringService = daoStateMonitoringService; + this.proposalStateMonitoringService = proposalStateMonitoringService; + this.blindVoteStateMonitoringService = blindVoteStateMonitoringService; + this.filterManager = filterManager; + this.maxConnections = maxConnections; + + this.networkNode.addMessageListener(this); + } + + @Override + public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { + if (networkEnvelope instanceof GetInventoryRequest) { + // Data + GetInventoryRequest getInventoryRequest = (GetInventoryRequest) networkEnvelope; + Map dataObjects = new HashMap<>(); + p2PDataStorage.getMapForDataResponse(getInventoryRequest.getVersion()).values().stream() + .map(e -> e.getClass().getSimpleName()) + .forEach(className -> addClassNameToMap(dataObjects, className)); + p2PDataStorage.getMap().values().stream() + .map(ProtectedStorageEntry::getProtectedStoragePayload) + .map(e -> e.getClass().getSimpleName()) + .forEach(className -> addClassNameToMap(dataObjects, className)); + Map inventory = new HashMap<>(); + dataObjects.forEach((key, value) -> inventory.put(key, String.valueOf(value))); + + // DAO + int numBsqBlocks = daoStateService.getBlocks().size(); + inventory.put(InventoryItem.numBsqBlocks, String.valueOf(numBsqBlocks)); + + int daoStateChainHeight = daoStateService.getChainHeight(); + inventory.put(InventoryItem.daoStateChainHeight, String.valueOf(daoStateChainHeight)); + + LinkedList daoStateBlockChain = daoStateMonitoringService.getDaoStateBlockChain(); + if (!daoStateBlockChain.isEmpty()) { + String daoStateHash = Utilities.bytesAsHexString(daoStateBlockChain.getLast().getMyStateHash().getHash()); + inventory.put(InventoryItem.daoStateHash, daoStateHash); + } + + LinkedList proposalStateBlockChain = proposalStateMonitoringService.getProposalStateBlockChain(); + if (!proposalStateBlockChain.isEmpty()) { + String proposalHash = Utilities.bytesAsHexString(proposalStateBlockChain.getLast().getMyStateHash().getHash()); + inventory.put(InventoryItem.proposalHash, proposalHash); + } + + LinkedList blindVoteStateBlockChain = blindVoteStateMonitoringService.getBlindVoteStateBlockChain(); + if (!blindVoteStateBlockChain.isEmpty()) { + String blindVoteHash = Utilities.bytesAsHexString(blindVoteStateBlockChain.getLast().getMyStateHash().getHash()); + inventory.put(InventoryItem.blindVoteHash, blindVoteHash); + } + + // network + inventory.put(InventoryItem.maxConnections, String.valueOf(maxConnections)); + inventory.put(InventoryItem.numConnections, String.valueOf(networkNode.getAllConnections().size())); + inventory.put(InventoryItem.peakNumConnections, String.valueOf(peerManager.getPeakNumConnections())); + inventory.put(InventoryItem.numAllConnectionsLostEvents, String.valueOf(peerManager.getNumAllConnectionsLostEvents())); + peerManager.maybeResetNumAllConnectionsLostEvents(); + inventory.put(InventoryItem.sentBytes, String.valueOf(Statistic.totalSentBytesProperty().get())); + inventory.put(InventoryItem.sentBytesPerSec, String.valueOf(Statistic.totalSentBytesPerSecProperty().get())); + inventory.put(InventoryItem.receivedBytes, String.valueOf(Statistic.totalReceivedBytesProperty().get())); + inventory.put(InventoryItem.receivedBytesPerSec, String.valueOf(Statistic.totalReceivedBytesPerSecProperty().get())); + inventory.put(InventoryItem.receivedMessagesPerSec, String.valueOf(Statistic.numTotalReceivedMessagesPerSecProperty().get())); + inventory.put(InventoryItem.sentMessagesPerSec, String.valueOf(Statistic.numTotalSentMessagesPerSecProperty().get())); + + // node + inventory.put(InventoryItem.version, Version.VERSION); + inventory.put(InventoryItem.commitHash, RequestInfo.COMMIT_HASH); + inventory.put(InventoryItem.usedMemory, String.valueOf(Profiler.getUsedMemoryInBytes())); + inventory.put(InventoryItem.jvmStartTime, String.valueOf(ManagementFactory.getRuntimeMXBean().getStartTime())); + + Filter filter = filterManager.getFilter(); + if (filter != null) { + inventory.put(InventoryItem.filteredSeeds, Joiner.on("," + System.getProperty("line.separator")).join(filter.getSeedNodes())); + } + + log.info("Send inventory {} to {}", inventory, connection.getPeersNodeAddressOptional()); + GetInventoryResponse getInventoryResponse = new GetInventoryResponse(inventory); + networkNode.sendMessage(connection, getInventoryResponse); + } + } + + public void shutDown() { + networkNode.removeMessageListener(this); + } + + private void addClassNameToMap(Map dataObjects, String className) { + Optional optionalEnum = Enums.getIfPresent(InventoryItem.class, className); + if (optionalEnum.isPresent()) { + InventoryItem key = optionalEnum.get(); + dataObjects.putIfAbsent(key, 0); + int prev = dataObjects.get(key); + dataObjects.put(key, prev + 1); + } + } +} diff --git a/p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequestManager.java b/core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequestManager.java similarity index 84% rename from p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequestManager.java rename to core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequestManager.java index 755f2912c0..816bb786fe 100644 --- a/p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequestManager.java +++ b/core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequestManager.java @@ -15,7 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.network.p2p.inventory; +package bisq.core.network.p2p.inventory; + +import bisq.core.network.p2p.inventory.model.InventoryItem; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.network.NetworkNode; @@ -41,11 +43,12 @@ public class GetInventoryRequestManager { } public void request(NodeAddress nodeAddress, - Consumer> resultHandler, + Consumer> resultHandler, ErrorMessageHandler errorMessageHandler) { if (requesterMap.containsKey(nodeAddress)) { - log.warn("There is still an open request pending for {}", nodeAddress.getFullAddress()); - return; + log.warn("There was still a pending request for {}. We shut it down and make a new request", + nodeAddress.getFullAddress()); + requesterMap.get(nodeAddress).shutDown(); } GetInventoryRequester getInventoryRequester = new GetInventoryRequester(networkNode, diff --git a/p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequester.java b/core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequester.java similarity index 59% rename from p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequester.java rename to core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequester.java index b43f1d3789..3309703f7f 100644 --- a/p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequester.java +++ b/core/src/main/java/bisq/core/network/p2p/inventory/GetInventoryRequester.java @@ -15,12 +15,16 @@ * along with Bisq. If not, see . */ -package bisq.network.p2p.inventory; +package bisq.core.network.p2p.inventory; + +import bisq.core.network.p2p.inventory.messages.GetInventoryRequest; +import bisq.core.network.p2p.inventory.messages.GetInventoryResponse; +import bisq.core.network.p2p.inventory.model.InventoryItem; import bisq.network.p2p.NodeAddress; -import bisq.network.p2p.inventory.messages.GetInventoryRequest; -import bisq.network.p2p.inventory.messages.GetInventoryResponse; +import bisq.network.p2p.network.CloseConnectionReason; import bisq.network.p2p.network.Connection; +import bisq.network.p2p.network.ConnectionListener; import bisq.network.p2p.network.MessageListener; import bisq.network.p2p.network.NetworkNode; @@ -36,18 +40,18 @@ import java.util.function.Consumer; import lombok.extern.slf4j.Slf4j; @Slf4j -public class GetInventoryRequester implements MessageListener { +public class GetInventoryRequester implements MessageListener, ConnectionListener { private final static int TIMEOUT_SEC = 90; private final NetworkNode networkNode; private final NodeAddress nodeAddress; - private final Consumer> resultHandler; + private final Consumer> resultHandler; private final ErrorMessageHandler errorMessageHandler; private Timer timer; public GetInventoryRequester(NetworkNode networkNode, NodeAddress nodeAddress, - Consumer> resultHandler, + Consumer> resultHandler, ErrorMessageHandler errorMessageHandler) { this.networkNode = networkNode; this.nodeAddress = nodeAddress; @@ -57,12 +61,16 @@ public class GetInventoryRequester implements MessageListener { public void request() { networkNode.addMessageListener(this); + networkNode.addConnectionListener(this); + timer = UserThread.runAfter(this::onTimeOut, TIMEOUT_SEC); - networkNode.sendMessage(nodeAddress, new GetInventoryRequest(Version.VERSION)); + + GetInventoryRequest getInventoryRequest = new GetInventoryRequest(Version.VERSION); + networkNode.sendMessage(nodeAddress, getInventoryRequest); } private void onTimeOut() { - errorMessageHandler.handleErrorMessage("Timeout got triggered (" + TIMEOUT_SEC + " sec)"); + errorMessageHandler.handleErrorMessage("Request timeout"); shutDown(); } @@ -72,8 +80,11 @@ public class GetInventoryRequester implements MessageListener { connection.getPeersNodeAddressOptional().ifPresent(peer -> { if (peer.equals(nodeAddress)) { GetInventoryResponse getInventoryResponse = (GetInventoryResponse) networkEnvelope; - resultHandler.accept(getInventoryResponse.getNumPayloadsMap()); + resultHandler.accept(getInventoryResponse.getInventory()); shutDown(); + + // We shut down our connection after work as our node is not helpful for the network. + UserThread.runAfter(() -> connection.shutDown(CloseConnectionReason.CLOSE_REQUESTED_BY_PEER), 1); } }); } @@ -85,5 +96,27 @@ public class GetInventoryRequester implements MessageListener { timer = null; } networkNode.removeMessageListener(this); + networkNode.removeConnectionListener(this); + } + + @Override + public void onConnection(Connection connection) { + } + + @Override + public void onDisconnect(CloseConnectionReason closeConnectionReason, + Connection connection) { + connection.getPeersNodeAddressOptional().ifPresent(address -> { + if (address.equals(nodeAddress)) { + if (!closeConnectionReason.isIntended) { + errorMessageHandler.handleErrorMessage("Connected closed because of " + closeConnectionReason.name()); + } + shutDown(); + } + }); + } + + @Override + public void onError(Throwable throwable) { } } diff --git a/p2p/src/main/java/bisq/network/p2p/inventory/messages/GetInventoryRequest.java b/core/src/main/java/bisq/core/network/p2p/inventory/messages/GetInventoryRequest.java similarity index 97% rename from p2p/src/main/java/bisq/network/p2p/inventory/messages/GetInventoryRequest.java rename to core/src/main/java/bisq/core/network/p2p/inventory/messages/GetInventoryRequest.java index dc26d37774..fee7f82704 100644 --- a/p2p/src/main/java/bisq/network/p2p/inventory/messages/GetInventoryRequest.java +++ b/core/src/main/java/bisq/core/network/p2p/inventory/messages/GetInventoryRequest.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.network.p2p.inventory.messages; +package bisq.core.network.p2p.inventory.messages; import bisq.common.app.Version; diff --git a/p2p/src/main/java/bisq/network/p2p/inventory/messages/GetInventoryResponse.java b/core/src/main/java/bisq/core/network/p2p/inventory/messages/GetInventoryResponse.java similarity index 54% rename from p2p/src/main/java/bisq/network/p2p/inventory/messages/GetInventoryResponse.java rename to core/src/main/java/bisq/core/network/p2p/inventory/messages/GetInventoryResponse.java index 45b5fbf992..b9c5cf9ce3 100644 --- a/p2p/src/main/java/bisq/network/p2p/inventory/messages/GetInventoryResponse.java +++ b/core/src/main/java/bisq/core/network/p2p/inventory/messages/GetInventoryResponse.java @@ -15,42 +15,60 @@ * along with Bisq. If not, see . */ -package bisq.network.p2p.inventory.messages; +package bisq.core.network.p2p.inventory.messages; + +import bisq.core.network.p2p.inventory.model.InventoryItem; import bisq.common.app.Version; import bisq.common.proto.network.NetworkEnvelope; +import com.google.common.base.Enums; +import com.google.common.base.Optional; + +import java.util.HashMap; import java.util.Map; import lombok.Value; @Value public class GetInventoryResponse extends NetworkEnvelope { - private final Map numPayloadsMap; + private final Map inventory; - public GetInventoryResponse(Map numPayloadsMap) { - this(numPayloadsMap, Version.getP2PMessageVersion()); + public GetInventoryResponse(Map inventory) { + this(inventory, Version.getP2PMessageVersion()); } /////////////////////////////////////////////////////////////////////////////////////////// // PROTO BUFFER /////////////////////////////////////////////////////////////////////////////////////////// - private GetInventoryResponse(Map numPayloadsMap, int messageVersion) { + private GetInventoryResponse(Map inventory, int messageVersion) { super(messageVersion); - this.numPayloadsMap = numPayloadsMap; + this.inventory = inventory; } @Override public protobuf.NetworkEnvelope toProtoNetworkEnvelope() { + // For protobuf we use a map with a string key + Map map = new HashMap<>(); + inventory.forEach((key, value) -> map.put(key.getKey(), value)); return getNetworkEnvelopeBuilder() .setGetInventoryResponse(protobuf.GetInventoryResponse.newBuilder() - .putAllNumPayloadsMap(numPayloadsMap)) + .putAllInventory(map)) .build(); } public static GetInventoryResponse fromProto(protobuf.GetInventoryResponse proto, int messageVersion) { - return new GetInventoryResponse(proto.getNumPayloadsMapMap(), messageVersion); + // For protobuf we use a map with a string key + Map map = proto.getInventoryMap(); + Map inventory = new HashMap<>(); + map.forEach((key, value) -> { + Optional optional = Enums.getIfPresent(InventoryItem.class, key); + if (optional.isPresent()) { + inventory.put(optional.get(), value); + } + }); + return new GetInventoryResponse(inventory, messageVersion); } } diff --git a/core/src/main/java/bisq/core/network/p2p/inventory/model/Average.java b/core/src/main/java/bisq/core/network/p2p/inventory/model/Average.java new file mode 100644 index 0000000000..3f50d91c1c --- /dev/null +++ b/core/src/main/java/bisq/core/network/p2p/inventory/model/Average.java @@ -0,0 +1,47 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.network.p2p.inventory.model; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +public class Average { + public static Map of(Set requestInfoSet) { + Map averageValuesPerItem = new HashMap<>(); + Arrays.asList(InventoryItem.values()).forEach(inventoryItem -> { + if (inventoryItem.isNumberValue()) { + averageValuesPerItem.put(inventoryItem, getAverage(requestInfoSet, inventoryItem)); + } + }); + return averageValuesPerItem; + } + + public static double getAverage(Set requestInfoSet, InventoryItem inventoryItem) { + return requestInfoSet.stream() + .map(RequestInfo::getDataMap) + .filter(map -> map.containsKey(inventoryItem)) + .map(map -> map.get(inventoryItem).getValue()) + .filter(Objects::nonNull) + .mapToDouble(Double::parseDouble) + .average() + .orElse(0d); + } +} diff --git a/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationByIntegerDiff.java b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationByIntegerDiff.java new file mode 100644 index 0000000000..68531c4221 --- /dev/null +++ b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationByIntegerDiff.java @@ -0,0 +1,83 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.network.p2p.inventory.model; + +import bisq.common.util.Tuple2; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.jetbrains.annotations.Nullable; + +public class DeviationByIntegerDiff implements DeviationType { + private final int warnTrigger; + private final int alertTrigger; + + public DeviationByIntegerDiff(int warnTrigger, int alertTrigger) { + this.warnTrigger = warnTrigger; + this.alertTrigger = alertTrigger; + } + + public DeviationSeverity getDeviationSeverity(Collection> collection, + @Nullable String value, + InventoryItem inventoryItem) { + DeviationSeverity deviationSeverity = DeviationSeverity.OK; + if (value == null) { + return deviationSeverity; + } + + Map sameItemsByValue = new HashMap<>(); + collection.stream() + .filter(list -> !list.isEmpty()) + .map(list -> list.get(list.size() - 1)) // We use last item only + .map(RequestInfo::getDataMap) + .map(e -> e.get(inventoryItem).getValue()) + .filter(Objects::nonNull) + .forEach(e -> { + sameItemsByValue.putIfAbsent(e, 0); + int prev = sameItemsByValue.get(e); + sameItemsByValue.put(e, prev + 1); + }); + if (sameItemsByValue.size() > 1) { + List> sameItems = new ArrayList<>(); + sameItemsByValue.forEach((k, v) -> sameItems.add(new Tuple2<>(k, v))); + sameItems.sort(Comparator.comparing(o -> o.second)); + Collections.reverse(sameItems); + String majority = sameItems.get(0).first; + if (!majority.equals(value)) { + int majorityAsInt = Integer.parseInt(majority); + int valueAsInt = Integer.parseInt(value); + int diff = Math.abs(majorityAsInt - valueAsInt); + if (diff >= alertTrigger) { + deviationSeverity = DeviationSeverity.ALERT; + } else if (diff >= warnTrigger) { + deviationSeverity = DeviationSeverity.WARN; + } else { + deviationSeverity = DeviationSeverity.OK; + } + } + } + return deviationSeverity; + } +} diff --git a/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationByPercentage.java b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationByPercentage.java new file mode 100644 index 0000000000..1887aa0409 --- /dev/null +++ b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationByPercentage.java @@ -0,0 +1,52 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.network.p2p.inventory.model; + +public class DeviationByPercentage implements DeviationType { + private final double lowerAlertTrigger; + private final double upperAlertTrigger; + private final double lowerWarnTrigger; + private final double upperWarnTrigger; + + // In case want to see the % deviation but not trigger any warnings or alerts + public DeviationByPercentage() { + this(0, Double.MAX_VALUE, 0, Double.MAX_VALUE); + } + + public DeviationByPercentage(double lowerAlertTrigger, + double upperAlertTrigger, + double lowerWarnTrigger, + double upperWarnTrigger) { + this.lowerAlertTrigger = lowerAlertTrigger; + this.upperAlertTrigger = upperAlertTrigger; + this.lowerWarnTrigger = lowerWarnTrigger; + this.upperWarnTrigger = upperWarnTrigger; + } + + public DeviationSeverity getDeviationSeverity(double deviation) { + if (deviation <= lowerAlertTrigger || deviation >= upperAlertTrigger) { + return DeviationSeverity.ALERT; + } + + if (deviation <= lowerWarnTrigger || deviation >= upperWarnTrigger) { + return DeviationSeverity.WARN; + } + + return DeviationSeverity.OK; + } +} diff --git a/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationOfHashes.java b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationOfHashes.java new file mode 100644 index 0000000000..6ca4afc76f --- /dev/null +++ b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationOfHashes.java @@ -0,0 +1,75 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.network.p2p.inventory.model; + +import bisq.common.util.Tuple2; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.jetbrains.annotations.Nullable; + +public class DeviationOfHashes implements DeviationType { + public DeviationSeverity getDeviationSeverity(Collection> collection, + @Nullable String value, + InventoryItem inventoryItem, + String currentBlockHeight) { + DeviationSeverity deviationSeverity = DeviationSeverity.OK; + if (value == null) { + return deviationSeverity; + } + + Map sameHashesPerHashListByHash = new HashMap<>(); + collection.stream() + .filter(list -> !list.isEmpty()) + .map(list -> list.get(list.size() - 1)) // We use last item only + .map(RequestInfo::getDataMap) + .filter(map -> currentBlockHeight.equals(map.get(InventoryItem.daoStateChainHeight).getValue())) + .map(map -> map.get(inventoryItem).getValue()) + .filter(Objects::nonNull) + .forEach(v -> { + sameHashesPerHashListByHash.putIfAbsent(v, 0); + int prev = sameHashesPerHashListByHash.get(v); + sameHashesPerHashListByHash.put(v, prev + 1); + }); + if (sameHashesPerHashListByHash.size() > 1) { + List> sameHashesPerHashList = new ArrayList<>(); + sameHashesPerHashListByHash.forEach((k, v) -> sameHashesPerHashList.add(new Tuple2<>(k, v))); + sameHashesPerHashList.sort(Comparator.comparing(o -> o.second)); + Collections.reverse(sameHashesPerHashList); + + // It could be that first and any following list entry has same number of hashes, but we ignore that as + // it is reason enough to alert the operators in case not all hashes are the same. + if (sameHashesPerHashList.get(0).first.equals(value)) { + // We are in the majority group. + // We also set a warning to make sure the operators act quickly and to check if there are + // more severe issues. + deviationSeverity = DeviationSeverity.WARN; + } else { + deviationSeverity = DeviationSeverity.ALERT; + } + } + return deviationSeverity; + } +} diff --git a/apitest/src/test/java/bisq/apitest/scenario/ScenarioTest.java b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationSeverity.java similarity index 80% rename from apitest/src/test/java/bisq/apitest/scenario/ScenarioTest.java rename to core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationSeverity.java index 9750b2ed9d..866d89eac8 100644 --- a/apitest/src/test/java/bisq/apitest/scenario/ScenarioTest.java +++ b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationSeverity.java @@ -15,14 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.apitest.scenario; +package bisq.core.network.p2p.inventory.model; -import lombok.extern.slf4j.Slf4j; - - - -import bisq.apitest.method.MethodTest; - -@Slf4j -public class ScenarioTest extends MethodTest { +public enum DeviationSeverity { + IGNORED, + OK, + WARN, + ALERT } diff --git a/pricenode/src/test/java/bisq/price/spot/providers/HitbtcTest.java b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationType.java similarity index 67% rename from pricenode/src/test/java/bisq/price/spot/providers/HitbtcTest.java rename to core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationType.java index 0d70e42722..565292eee7 100644 --- a/pricenode/src/test/java/bisq/price/spot/providers/HitbtcTest.java +++ b/core/src/main/java/bisq/core/network/p2p/inventory/model/DeviationType.java @@ -15,20 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.price.spot.providers; - -import bisq.price.AbstractExchangeRateProviderTest; - -import lombok.extern.slf4j.Slf4j; - -import org.junit.jupiter.api.Test; - -@Slf4j -public class HitbtcTest extends AbstractExchangeRateProviderTest { - - @Test - public void doGet_successfulCall() { - doGet_successfulCall(new Hitbtc()); - } +package bisq.core.network.p2p.inventory.model; +public interface DeviationType { } diff --git a/core/src/main/java/bisq/core/network/p2p/inventory/model/InventoryItem.java b/core/src/main/java/bisq/core/network/p2p/inventory/model/InventoryItem.java new file mode 100644 index 0000000000..bcdd0d2b4f --- /dev/null +++ b/core/src/main/java/bisq/core/network/p2p/inventory/model/InventoryItem.java @@ -0,0 +1,191 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.network.p2p.inventory.model; + +import bisq.common.util.Tuple2; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import lombok.Getter; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public enum InventoryItem { + // Percentage deviation + OfferPayload("OfferPayload", + true, + new DeviationByPercentage(0.8, 1.2, 0.9, 1.1), 5), + MailboxStoragePayload("MailboxStoragePayload", + true, + new DeviationByPercentage(0.9, 1.1, 0.95, 1.05), 2), + TradeStatistics3("TradeStatistics3", + true, + new DeviationByPercentage(0.9, 1.1, 0.95, 1.05), 2), + AccountAgeWitness("AccountAgeWitness", + true, + new DeviationByPercentage(0.9, 1.1, 0.95, 1.05), 2), + SignedWitness("SignedWitness", + true, + new DeviationByPercentage(0.9, 1.1, 0.95, 1.05), 2), + + // Should be same value + Alert("Alert", + true, + new DeviationByIntegerDiff(1, 1), 2), + Filter("Filter", + true, + new DeviationByIntegerDiff(1, 1), 2), + Mediator("Mediator", + true, + new DeviationByIntegerDiff(1, 1), 2), + RefundAgent("RefundAgent", + true, + new DeviationByIntegerDiff(1, 1), 2), + + // Should be very close values + TempProposalPayload("TempProposalPayload", + true, + new DeviationByIntegerDiff(3, 5), 2), + ProposalPayload("ProposalPayload", + true, + new DeviationByIntegerDiff(1, 2), 2), + BlindVotePayload("BlindVotePayload", + true, + new DeviationByIntegerDiff(1, 2), 2), + + // Should be very close values + daoStateChainHeight("daoStateChainHeight", + true, + new DeviationByIntegerDiff(2, 4), 3), + numBsqBlocks("numBsqBlocks", + true, + new DeviationByIntegerDiff(2, 4), 3), + + // Has to be same values at same block + daoStateHash("daoStateHash", + false, + new DeviationOfHashes(), 1), + proposalHash("proposalHash", + false, + new DeviationOfHashes(), 1), + blindVoteHash("blindVoteHash", + false, + new DeviationOfHashes(), 1), + + // Percentage deviation + maxConnections("maxConnections", + true, + new DeviationByPercentage(0.33, 3, 0.4, 2.5), 2), + numConnections("numConnections", + true, + new DeviationByPercentage(0, 3, 0, 2.5), 2), + peakNumConnections("peakNumConnections", + true, + new DeviationByPercentage(0, 3, 0, 2.5), 2), + numAllConnectionsLostEvents("numAllConnectionsLostEvents", + true, + new DeviationByIntegerDiff(1, 2), 1), + sentBytesPerSec("sentBytesPerSec", + true, + new DeviationByPercentage(), 5), + receivedBytesPerSec("receivedBytesPerSec", + true, + new DeviationByPercentage(), 5), + receivedMessagesPerSec("receivedMessagesPerSec", + true, + new DeviationByPercentage(), 5), + sentMessagesPerSec("sentMessagesPerSec", + true, + new DeviationByPercentage(), 5), + + // No deviation check + sentBytes("sentBytes", true), + receivedBytes("receivedBytes", true), + + // No deviation check + version("version", false), + commitHash("commitHash", false), + usedMemory("usedMemory", true), + jvmStartTime("jvmStartTime", true), + filteredSeeds("filteredSeeds", false); + + @Getter + private final String key; + @Getter + private final boolean isNumberValue; + @Getter + @Nullable + private DeviationType deviationType; + + // The number of past requests we check to see if there have been repeated alerts or warnings. The higher the + // number the more repeated alert need to have happened to cause a notification alert. + // Smallest number is 1, as that takes only the last request data and does not look further back. + @Getter + private int deviationTolerance = 1; + + InventoryItem(String key, boolean isNumberValue) { + this.key = key; + this.isNumberValue = isNumberValue; + } + + InventoryItem(String key, boolean isNumberValue, @NotNull DeviationType deviationType, int deviationTolerance) { + this(key, isNumberValue); + this.deviationType = deviationType; + this.deviationTolerance = deviationTolerance; + } + + @Nullable + public Tuple2 getDeviationAndAverage(Map averageValues, + @Nullable String value) { + if (averageValues.containsKey(this) && value != null) { + double averageValue = averageValues.get(this); + return new Tuple2<>(getDeviation(value, averageValue), averageValue); + } + return null; + } + + @Nullable + public Double getDeviation(@Nullable String value, double average) { + if (deviationType != null && value != null && average != 0 && isNumberValue) { + return Double.parseDouble(value) / average; + } + return null; + } + + public DeviationSeverity getDeviationSeverity(Double deviation, + Collection> collection, + @Nullable String value, + String currentBlockHeight) { + if (deviationType == null || deviation == null || value == null) { + return DeviationSeverity.OK; + } + + if (deviationType instanceof DeviationByPercentage) { + return ((DeviationByPercentage) deviationType).getDeviationSeverity(deviation); + } else if (deviationType instanceof DeviationByIntegerDiff) { + return ((DeviationByIntegerDiff) deviationType).getDeviationSeverity(collection, value, this); + } else if (deviationType instanceof DeviationOfHashes) { + return ((DeviationOfHashes) deviationType).getDeviationSeverity(collection, value, this, currentBlockHeight); + } else { + return DeviationSeverity.OK; + } + } +} diff --git a/core/src/main/java/bisq/core/network/p2p/inventory/model/RequestInfo.java b/core/src/main/java/bisq/core/network/p2p/inventory/model/RequestInfo.java new file mode 100644 index 0000000000..5bccb8998f --- /dev/null +++ b/core/src/main/java/bisq/core/network/p2p/inventory/model/RequestInfo.java @@ -0,0 +1,99 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.network.p2p.inventory.model; + +import java.util.HashMap; +import java.util.Map; + +import lombok.Getter; +import lombok.Setter; +import lombok.Value; + +import org.jetbrains.annotations.Nullable; + +@Getter +public class RequestInfo { + // Carries latest commit hash of feature changes (not latest commit as that is then the commit for editing that field) + public static final String COMMIT_HASH = "7f83d1b3"; + + private final long requestStartTime; + @Setter + private long responseTime; + @Nullable + @Setter + private String errorMessage; + + private final Map dataMap = new HashMap<>(); + + public RequestInfo(long requestStartTime) { + this.requestStartTime = requestStartTime; + } + + public String getDisplayValue(InventoryItem inventoryItem) { + String value = getValue(inventoryItem); + return value != null ? value : "n/a"; + } + + @Nullable + public String getValue(InventoryItem inventoryItem) { + return dataMap.containsKey(inventoryItem) ? + dataMap.get(inventoryItem).getValue() : + null; + } + + public boolean hasError() { + return errorMessage != null && !errorMessage.isEmpty(); + } + + @Value + public static class Data { + private final String value; + @Nullable + private final Double average; + private final Double deviation; + private final DeviationSeverity deviationSeverity; + private final boolean persistentWarning; + private final boolean persistentAlert; + + public Data(String value, + @Nullable Double average, + Double deviation, + DeviationSeverity deviationSeverity, + boolean persistentWarning, + boolean persistentAlert) { + this.value = value; + this.average = average; + this.deviation = deviation; + this.deviationSeverity = deviationSeverity; + this.persistentWarning = persistentWarning; + this.persistentAlert = persistentAlert; + } + + @Override + public String toString() { + return "InventoryData{" + + "\n value='" + value + '\'' + + ",\n average=" + average + + ",\n deviation=" + deviation + + ",\n deviationSeverity=" + deviationSeverity + + ",\n persistentWarning=" + persistentWarning + + ",\n persistentAlert=" + persistentAlert + + "\n}"; + } + } +} diff --git a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java index ec4f70ef59..4c52456fb6 100644 --- a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java +++ b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java @@ -29,8 +29,11 @@ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.List; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -62,23 +65,9 @@ public class DefaultSeedNodeRepository implements SeedNodeRepository { return; } - // else, we fetch the seed nodes from our resources - InputStream fileInputStream = DefaultSeedNodeRepository.class.getClassLoader().getResourceAsStream(config.baseCurrencyNetwork.name().toLowerCase() + ENDING); - BufferedReader seedNodeFile = new BufferedReader(new InputStreamReader(fileInputStream)); - - // only clear if we have a fresh data source (otherwise, an exception would prevent us from getting here) cache.clear(); - - // refill the cache - seedNodeFile.lines().forEach(line -> { - Matcher matcher = pattern.matcher(line); - if (matcher.find()) - cache.add(new NodeAddress(matcher.group(1))); - - // Maybe better include in regex... - if (line.startsWith("localhost")) - cache.add(new NodeAddress(line)); - }); + List result = getSeedNodeAddressesFromPropertyFile(config.baseCurrencyNetwork.name().toLowerCase()); + cache.addAll(result); // filter cache.removeAll( @@ -95,6 +84,34 @@ public class DefaultSeedNodeRepository implements SeedNodeRepository { } } + public static Optional readSeedNodePropertyFile(String fileName) { + InputStream fileInputStream = DefaultSeedNodeRepository.class.getClassLoader().getResourceAsStream( + fileName + ENDING); + if (fileInputStream == null) { + return Optional.empty(); + } + return Optional.of(new BufferedReader(new InputStreamReader(fileInputStream))); + } + + public static List getSeedNodeAddressesFromPropertyFile(String fileName) { + List list = new ArrayList<>(); + readSeedNodePropertyFile(fileName).ifPresent(seedNodeFile -> { + seedNodeFile.lines().forEach(line -> { + Matcher matcher = pattern.matcher(line); + if (matcher.find()) + list.add(new NodeAddress(matcher.group(1))); + + // Maybe better include in regex... + if (line.startsWith("localhost")) { + String[] strings = line.split(" \\(@"); + String node = strings[0]; + list.add(new NodeAddress(node)); + } + }); + }); + return list; + } + public Collection getSeedNodeAddresses() { if (cache.isEmpty()) reload(); diff --git a/core/src/main/java/bisq/core/offer/CreateOfferService.java b/core/src/main/java/bisq/core/offer/CreateOfferService.java index 3c7d5ced9d..f4adaa7802 100644 --- a/core/src/main/java/bisq/core/offer/CreateOfferService.java +++ b/core/src/main/java/bisq/core/offer/CreateOfferService.java @@ -163,7 +163,7 @@ public class CreateOfferService { String bankId = PaymentAccountUtil.getBankId(paymentAccount); List acceptedBanks = PaymentAccountUtil.getAcceptedBanks(paymentAccount); double sellerSecurityDeposit = getSellerSecurityDepositAsDouble(buyerSecurityDepositAsDouble); - Coin txFeeFromFeeService = getEstimatedFeeAndTxSize(amount, direction, buyerSecurityDepositAsDouble, sellerSecurityDeposit).first; + Coin txFeeFromFeeService = getEstimatedFeeAndTxVsize(amount, direction, buyerSecurityDepositAsDouble, sellerSecurityDeposit).first; Coin txFeeToUse = txFee.isPositive() ? txFee : txFeeFromFeeService; Coin makerFeeAsCoin = offerUtil.getMakerFee(amount); boolean isCurrencyForMakerFeeBtc = offerUtil.isCurrencyForMakerFeeBtc(amount); @@ -233,15 +233,15 @@ public class CreateOfferService { return offer; } - public Tuple2 getEstimatedFeeAndTxSize(Coin amount, - OfferPayload.Direction direction, - double buyerSecurityDeposit, - double sellerSecurityDeposit) { + public Tuple2 getEstimatedFeeAndTxVsize(Coin amount, + OfferPayload.Direction direction, + double buyerSecurityDeposit, + double sellerSecurityDeposit) { Coin reservedFundsForOffer = getReservedFundsForOffer(direction, amount, buyerSecurityDeposit, sellerSecurityDeposit); - return txFeeEstimationService.getEstimatedFeeAndTxSizeForMaker(reservedFundsForOffer, + return txFeeEstimationService.getEstimatedFeeAndTxVsizeForMaker(reservedFundsForOffer, offerUtil.getMakerFee(amount)); } diff --git a/core/src/main/java/bisq/core/offer/OfferUtil.java b/core/src/main/java/bisq/core/offer/OfferUtil.java index 373df67907..e85881c211 100644 --- a/core/src/main/java/bisq/core/offer/OfferUtil.java +++ b/core/src/main/java/bisq/core/offer/OfferUtil.java @@ -177,8 +177,8 @@ public class OfferUtil { return CoinUtil.getMakerFee(isCurrencyForMakerFeeBtc, amount); } - public Coin getTxFeeBySize(Coin txFeePerByteFromFeeService, int sizeInBytes) { - return txFeePerByteFromFeeService.multiply(getAverageTakerFeeTxSize(sizeInBytes)); + public Coin getTxFeeByVsize(Coin txFeePerVbyteFromFeeService, int vsizeInVbytes) { + return txFeePerVbyteFromFeeService.multiply(getAverageTakerFeeTxVsize(vsizeInVbytes)); } // We use the sum of the size of the trade fee and the deposit tx to get an average. @@ -186,8 +186,8 @@ public class OfferUtil { // enough. With that we avoid that we overpay in case that the trade fee has many // inputs and we would apply that fee for the other 2 txs as well. We still might // overpay a bit for the payout tx. - public int getAverageTakerFeeTxSize(int txSize) { - return (txSize + 320) / 2; + public int getAverageTakerFeeTxVsize(int txVsize) { + return (txVsize + 233) / 2; } /** @@ -261,6 +261,10 @@ public class OfferUtil { return !availableBalance.subtract(takerFee).isNegative(); } + public boolean isBlockChainPaymentMethod(Offer offer) { + return offer != null && offer.getPaymentMethod().isAsset(); + } + public Optional getFeeInUserFiatCurrency(Coin makerFee, boolean isCurrencyForMakerFeeBtc, CoinFormatter bsqFormatter) { diff --git a/core/src/main/java/bisq/core/offer/OpenOfferManager.java b/core/src/main/java/bisq/core/offer/OpenOfferManager.java index 1e72532a61..7db7011456 100644 --- a/core/src/main/java/bisq/core/offer/OpenOfferManager.java +++ b/core/src/main/java/bisq/core/offer/OpenOfferManager.java @@ -166,16 +166,13 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe } @Override - public void readPersisted() { - TradableList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - openOffers.setAll(persisted.getList()); - } - - openOffers.forEach(e -> { - Offer offer = e.getOffer(); - offer.setPriceFeedService(priceFeedService); - }); + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + openOffers.setAll(persisted.getList()); + openOffers.forEach(openOffer -> openOffer.getOffer().setPriceFeedService(priceFeedService)); + completeHandler.run(); + }, + completeHandler); } public void onAllServicesInitialized() { @@ -583,6 +580,14 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe return; } + // Don't allow trade start if BitcoinJ is not fully synced (bisq issue #4764) + if (!btcWalletService.isChainHeightSyncedWithinTolerance()) { + errorMessage = "We got a handleOfferAvailabilityRequest but our chain is not synced."; + log.info(errorMessage); + sendAckMessage(request, peer, false, errorMessage); + return; + } + if (stopped) { errorMessage = "We have stopped already. We ignore that handleOfferAvailabilityRequest call."; log.debug(errorMessage); diff --git a/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java b/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java new file mode 100644 index 0000000000..8e345b8142 --- /dev/null +++ b/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java @@ -0,0 +1,316 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.offer.takeoffer; + +import bisq.core.account.witness.AccountAgeWitnessService; +import bisq.core.btc.model.AddressEntry; +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.locale.CurrencyUtil; +import bisq.core.monetary.Price; +import bisq.core.monetary.Volume; +import bisq.core.offer.Offer; +import bisq.core.offer.OfferUtil; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.payload.PaymentMethod; +import bisq.core.provider.fee.FeeService; +import bisq.core.provider.price.PriceFeedService; + +import bisq.common.taskrunner.Model; + +import org.bitcoinj.core.Coin; + +import javax.inject.Inject; + +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.NotNull; + +import static bisq.core.btc.model.AddressEntry.Context.OFFER_FUNDING; +import static bisq.core.offer.OfferPayload.Direction.SELL; +import static bisq.core.util.VolumeUtil.getAdjustedVolumeForHalCash; +import static bisq.core.util.VolumeUtil.getRoundedFiatVolume; +import static bisq.core.util.coin.CoinUtil.minCoin; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.bitcoinj.core.Coin.ZERO; +import static org.bitcoinj.core.Coin.valueOf; + +@Slf4j +public class TakeOfferModel implements Model { + // Immutable + private final AccountAgeWitnessService accountAgeWitnessService; + private final BtcWalletService btcWalletService; + private final FeeService feeService; + private final OfferUtil offerUtil; + private final PriceFeedService priceFeedService; + + // Mutable + @Getter + private AddressEntry addressEntry; + @Getter + private Coin amount; + @Getter + private boolean isCurrencyForTakerFeeBtc; + private Offer offer; + private PaymentAccount paymentAccount; + @Getter + private Coin securityDeposit; + private boolean useSavingsWallet; + + // Use an average of a typical trade fee tx with 1 input, deposit tx and payout tx. + private final int feeTxVsize = 192; // (175+233+169)/3 + private Coin txFeePerVbyteFromFeeService; + @Getter + private Coin txFeeFromFeeService; + @Getter + private Coin takerFee; + @Getter + private Coin totalToPayAsCoin; + @Getter + private Coin missingCoin = ZERO; + @Getter + private Coin totalAvailableBalance; + @Getter + private Coin balance; + @Getter + private boolean isBtcWalletFunded; + @Getter + private Volume volume; + + @Inject + public TakeOfferModel(AccountAgeWitnessService accountAgeWitnessService, + BtcWalletService btcWalletService, + FeeService feeService, + OfferUtil offerUtil, + PriceFeedService priceFeedService) { + this.accountAgeWitnessService = accountAgeWitnessService; + this.btcWalletService = btcWalletService; + this.feeService = feeService; + this.offerUtil = offerUtil; + this.priceFeedService = priceFeedService; + } + + public void initModel(Offer offer, + PaymentAccount paymentAccount, + boolean useSavingsWallet) { + this.clearModel(); + this.offer = offer; + this.paymentAccount = paymentAccount; + this.addressEntry = btcWalletService.getOrCreateAddressEntry(offer.getId(), OFFER_FUNDING); + validateModelInputs(); + + this.useSavingsWallet = useSavingsWallet; + this.amount = valueOf(Math.min(offer.getAmount().value, getMaxTradeLimit())); + this.securityDeposit = offer.getDirection() == SELL + ? offer.getBuyerSecurityDeposit() + : offer.getSellerSecurityDeposit(); + this.isCurrencyForTakerFeeBtc = offerUtil.isCurrencyForTakerFeeBtc(amount); + this.takerFee = offerUtil.getTakerFee(isCurrencyForTakerFeeBtc, amount); + + calculateTxFees(); + calculateVolume(); + calculateTotalToPay(); + offer.resetState(); + + priceFeedService.setCurrencyCode(offer.getCurrencyCode()); + } + + @Override + public void onComplete() { + // empty + } + + private void calculateTxFees() { + // Taker pays 3 times the tx fee (taker fee, deposit, payout) because the mining + // fee might be different when maker created the offer and reserved his funds. + // Taker creates at least taker fee and deposit tx at nearly the same moment. + // Just the payout will be later and still could lead to issues if the required + // fee changed a lot in the meantime. using RBF and/or multiple batch-signed + // payout tx with different fees might be an option but RBF is not supported yet + // in BitcoinJ and batched txs would add more complexity to the trade protocol. + + // A typical trade fee tx has about 175 vbytes (if one input). The trade txs has + // about 169-263 vbytes. We use 192 as a average value. + + // Fee calculations: + // Trade fee tx: 175 vbytes (1 input) + // Deposit tx: 233 vbytes (1 MS output+ OP_RETURN) - 263 vbytes + // (1 MS output + OP_RETURN + change in case of smaller trade amount) + // Payout tx: 169 vbytes + // Disputed payout tx: 139 vbytes + + txFeePerVbyteFromFeeService = getTxFeePerVbyte(); + txFeeFromFeeService = offerUtil.getTxFeeByVsize(txFeePerVbyteFromFeeService, feeTxVsize); + log.info("{} txFeePerVbyte = {}", feeService.getClass().getSimpleName(), txFeePerVbyteFromFeeService); + } + + private Coin getTxFeePerVbyte() { + try { + CompletableFuture feeRequestFuture = CompletableFuture.runAsync(feeService::requestFees); + feeRequestFuture.get(); // Block until async fee request is complete. + return feeService.getTxFeePerVbyte(); + } catch (InterruptedException | ExecutionException e) { + throw new IllegalStateException("Could not request fees from fee service.", e); + } + } + + private void calculateTotalToPay() { + // Taker pays 2 times the tx fee because the mining fee might be different when + // maker created the offer and reserved his funds, so that would not work well + // with dynamic fees. The mining fee for the takeOfferFee tx is deducted from + // the createOfferFee and not visible to the trader. + Coin feeAndSecDeposit = getTotalTxFee().add(securityDeposit); + if (isCurrencyForTakerFeeBtc) + feeAndSecDeposit = feeAndSecDeposit.add(takerFee); + + totalToPayAsCoin = offer.isBuyOffer() + ? feeAndSecDeposit.add(amount) + : feeAndSecDeposit; + + updateBalance(); + } + + private void calculateVolume() { + Price tradePrice = offer.getPrice(); + Volume volumeByAmount = Objects.requireNonNull(tradePrice).getVolumeByAmount(amount); + + if (offer.getPaymentMethod().getId().equals(PaymentMethod.HAL_CASH_ID)) + volumeByAmount = getAdjustedVolumeForHalCash(volumeByAmount); + else if (CurrencyUtil.isFiatCurrency(offer.getCurrencyCode())) + volumeByAmount = getRoundedFiatVolume(volumeByAmount); + + volume = volumeByAmount; + + updateBalance(); + } + + private void updateBalance() { + Coin tradeWalletBalance = btcWalletService.getBalanceForAddress(addressEntry.getAddress()); + if (useSavingsWallet) { + Coin savingWalletBalance = btcWalletService.getSavingWalletBalance(); + totalAvailableBalance = savingWalletBalance.add(tradeWalletBalance); + if (totalToPayAsCoin != null) + balance = minCoin(totalToPayAsCoin, totalAvailableBalance); + + } else { + balance = tradeWalletBalance; + } + missingCoin = offerUtil.getBalanceShortage(totalToPayAsCoin, balance); + isBtcWalletFunded = offerUtil.isBalanceSufficient(totalToPayAsCoin, balance); + } + + private long getMaxTradeLimit() { + return accountAgeWitnessService.getMyTradeLimit(paymentAccount, + offer.getCurrencyCode(), + offer.getMirroredDirection()); + } + + public Coin getTotalTxFee() { + Coin totalTxFees = txFeeFromFeeService.add(getTxFeeForDepositTx()).add(getTxFeeForPayoutTx()); + if (isCurrencyForTakerFeeBtc) + return totalTxFees; + else + return totalTxFees.subtract(takerFee); + } + + @NotNull + public Coin getFundsNeededForTrade() { + // If taking a buy offer, taker needs to reserve the offer.amt too. + return securityDeposit + .add(getTxFeeForDepositTx()) + .add(getTxFeeForPayoutTx()) + .add(offer.isBuyOffer() ? amount : ZERO); + } + + private Coin getTxFeeForDepositTx() { + // TODO fix with new trade protocol! + // Unfortunately we cannot change that to the correct fees as it would break + // backward compatibility. We still might find a way with offer version or app + // version checks so lets keep that commented out code as that shows how it + // should be. + return txFeeFromFeeService; + } + + private Coin getTxFeeForPayoutTx() { + // TODO fix with new trade protocol! + // Unfortunately we cannot change that to the correct fees as it would break + // backward compatibility. We still might find a way with offer version or app + // version checks so lets keep that commented out code as that shows how it + // should be. + return txFeeFromFeeService; + } + + private void validateModelInputs() { + checkNotNull(offer, "offer must not be null"); + checkNotNull(offer.getAmount(), "offer amount must not be null"); + checkArgument(offer.getAmount().value > 0, "offer amount must not be zero"); + checkNotNull(offer.getPrice(), "offer price must not be null"); + checkNotNull(paymentAccount, "payment account must not be null"); + checkNotNull(addressEntry, "address entry must not be null"); + } + + private void clearModel() { + this.addressEntry = null; + this.amount = null; + this.balance = null; + this.isBtcWalletFunded = false; + this.isCurrencyForTakerFeeBtc = false; + this.missingCoin = ZERO; + this.offer = null; + this.paymentAccount = null; + this.securityDeposit = null; + this.takerFee = null; + this.totalAvailableBalance = null; + this.totalToPayAsCoin = null; + this.txFeeFromFeeService = null; + this.txFeePerVbyteFromFeeService = null; + this.useSavingsWallet = true; + this.volume = null; + } + + @Override + public String toString() { + return "TakeOfferModel{" + + " offer.id=" + offer.getId() + "\n" + + " offer.state=" + offer.getState() + "\n" + + ", paymentAccount.id=" + paymentAccount.getId() + "\n" + + ", paymentAccount.method.id=" + paymentAccount.getPaymentMethod().getId() + "\n" + + ", useSavingsWallet=" + useSavingsWallet + "\n" + + ", addressEntry=" + addressEntry + "\n" + + ", amount=" + amount + "\n" + + ", securityDeposit=" + securityDeposit + "\n" + + ", feeTxVsize=" + feeTxVsize + "\n" + + ", txFeePerVbyteFromFeeService=" + txFeePerVbyteFromFeeService + "\n" + + ", txFeeFromFeeService=" + txFeeFromFeeService + "\n" + + ", takerFee=" + takerFee + "\n" + + ", totalToPayAsCoin=" + totalToPayAsCoin + "\n" + + ", missingCoin=" + missingCoin + "\n" + + ", totalAvailableBalance=" + totalAvailableBalance + "\n" + + ", balance=" + balance + "\n" + + ", volume=" + volume + "\n" + + ", fundsNeededForTrade=" + getFundsNeededForTrade() + "\n" + + ", isCurrencyForTakerFeeBtc=" + isCurrencyForTakerFeeBtc + "\n" + + ", isBtcWalletFunded=" + isBtcWalletFunded + "\n" + + '}'; + } +} diff --git a/core/src/main/java/bisq/core/payment/AmazonGiftCardAccount.java b/core/src/main/java/bisq/core/payment/AmazonGiftCardAccount.java new file mode 100644 index 0000000000..4f5684e25c --- /dev/null +++ b/core/src/main/java/bisq/core/payment/AmazonGiftCardAccount.java @@ -0,0 +1,46 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.payment; + +import bisq.core.payment.payload.AmazonGiftCardAccountPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.payment.payload.PaymentMethod; + +public final class AmazonGiftCardAccount extends PaymentAccount { + + public AmazonGiftCardAccount() { + super(PaymentMethod.AMAZON_GIFT_CARD); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new AmazonGiftCardAccountPayload(paymentMethod.getId(), id); + } + + public String getEmailOrMobileNr() { + return getAmazonGiftCardAccountPayload().getEmailOrMobileNr(); + } + + public void setEmailOrMobileNr(String emailOrMobileNr) { + getAmazonGiftCardAccountPayload().setEmailOrMobileNr(emailOrMobileNr); + } + + private AmazonGiftCardAccountPayload getAmazonGiftCardAccountPayload() { + return (AmazonGiftCardAccountPayload) paymentAccountPayload; + } +} diff --git a/core/src/main/java/bisq/core/payment/AustraliaPayid.java b/core/src/main/java/bisq/core/payment/AustraliaPayid.java new file mode 100644 index 0000000000..a64c62b42a --- /dev/null +++ b/core/src/main/java/bisq/core/payment/AustraliaPayid.java @@ -0,0 +1,53 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.payment; + +import bisq.core.locale.FiatCurrency; +import bisq.core.payment.payload.AustraliaPayidPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.payment.payload.PaymentMethod; + +public final class AustraliaPayid extends PaymentAccount { + public AustraliaPayid() { + super(PaymentMethod.AUSTRALIA_PAYID); + setSingleTradeCurrency(new FiatCurrency("AUD")); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new AustraliaPayidPayload(paymentMethod.getId(), id); + } + + public String getPayid() { + return ((AustraliaPayidPayload) paymentAccountPayload).getPayid(); + } + + public void setPayid(String payid) { + if (payid == null) payid = ""; + ((AustraliaPayidPayload) paymentAccountPayload).setPayid(payid); + } + + public String getBankAccountName() { + return ((AustraliaPayidPayload) paymentAccountPayload).getBankAccountName(); + } + + public void setBankAccountName(String bankAccountName) { + if (bankAccountName == null) bankAccountName = ""; + ((AustraliaPayidPayload) paymentAccountPayload).setBankAccountName(bankAccountName); + } +} diff --git a/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java b/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java index e858e01e3b..14a8017e3f 100644 --- a/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java +++ b/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java @@ -46,6 +46,8 @@ public class PaymentAccountFactory { return new SpecificBanksAccount(); case PaymentMethod.JAPAN_BANK_ID: return new JapanBankAccount(); + case PaymentMethod.AUSTRALIA_PAYID_ID: + return new AustraliaPayid(); case PaymentMethod.ALI_PAY_ID: return new AliPayAccount(); case PaymentMethod.WECHAT_PAY_ID: @@ -76,6 +78,10 @@ public class PaymentAccountFactory { return new PromptPayAccount(); case PaymentMethod.ADVANCED_CASH_ID: return new AdvancedCashAccount(); + case PaymentMethod.TRANSFERWISE_ID: + return new TransferwiseAccount(); + case PaymentMethod.AMAZON_GIFT_CARD_ID: + return new AmazonGiftCardAccount(); case PaymentMethod.BLOCK_CHAINS_INSTANT_ID: return new InstantCryptoCurrencyAccount(); diff --git a/core/src/main/java/bisq/core/payment/TransferwiseAccount.java b/core/src/main/java/bisq/core/payment/TransferwiseAccount.java new file mode 100644 index 0000000000..5d84a25901 --- /dev/null +++ b/core/src/main/java/bisq/core/payment/TransferwiseAccount.java @@ -0,0 +1,47 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.payment; + +import bisq.core.locale.CurrencyUtil; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.payment.payload.PaymentMethod; +import bisq.core.payment.payload.TransferwiseAccountPayload; + +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +public final class TransferwiseAccount extends PaymentAccount { + public TransferwiseAccount() { + super(PaymentMethod.TRANSFERWISE); + + tradeCurrencies.addAll(CurrencyUtil.getAllTransferwiseCurrencies()); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new TransferwiseAccountPayload(paymentMethod.getId(), id); + } + + public void setEmail(String accountId) { + ((TransferwiseAccountPayload) paymentAccountPayload).setEmail(accountId); + } + + public String getEmail() { + return ((TransferwiseAccountPayload) paymentAccountPayload).getEmail(); + } +} diff --git a/core/src/main/java/bisq/core/payment/payload/AmazonGiftCardAccountPayload.java b/core/src/main/java/bisq/core/payment/payload/AmazonGiftCardAccountPayload.java new file mode 100644 index 0000000000..4eab7b5a5d --- /dev/null +++ b/core/src/main/java/bisq/core/payment/payload/AmazonGiftCardAccountPayload.java @@ -0,0 +1,103 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.payment.payload; + +import bisq.core.locale.Res; + +import com.google.protobuf.Message; + +import java.nio.charset.StandardCharsets; + +import java.util.HashMap; +import java.util.Map; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public class AmazonGiftCardAccountPayload extends PaymentAccountPayload { + private String emailOrMobileNr; + + public AmazonGiftCardAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private AmazonGiftCardAccountPayload(String paymentMethodName, + String id, + String emailOrMobileNr, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethodName, + id, + maxTradePeriod, + excludeFromJsonDataMap); + this.emailOrMobileNr = emailOrMobileNr; + } + + @Override + public Message toProtoMessage() { + protobuf.AmazonGiftCardAccountPayload.Builder builder = + protobuf.AmazonGiftCardAccountPayload.newBuilder() + .setEmailOrMobileNr(emailOrMobileNr); + return getPaymentAccountPayloadBuilder() + .setAmazonGiftCardAccountPayload(builder) + .build(); + } + + public static PaymentAccountPayload fromProto(protobuf.PaymentAccountPayload proto) { + protobuf.AmazonGiftCardAccountPayload amazonGiftCardAccountPayload = proto.getAmazonGiftCardAccountPayload(); + return new AmazonGiftCardAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + amazonGiftCardAccountPayload.getEmailOrMobileNr(), + proto.getMaxTradePeriod(), + new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return Res.get(paymentMethodId) + " - " + getPaymentDetailsForTradePopup().replace("\n", ", "); + } + + @Override + public String getPaymentDetailsForTradePopup() { + return Res.getWithCol("payment.email.mobile") + " " + emailOrMobileNr; + } + + @Override + public byte[] getAgeWitnessInputData() { + String data = "AmazonGiftCard" + emailOrMobileNr; + return super.getAgeWitnessInputData(data.getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/core/src/main/java/bisq/core/payment/payload/AustraliaPayidPayload.java b/core/src/main/java/bisq/core/payment/payload/AustraliaPayidPayload.java new file mode 100644 index 0000000000..50539cd4c0 --- /dev/null +++ b/core/src/main/java/bisq/core/payment/payload/AustraliaPayidPayload.java @@ -0,0 +1,113 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.payment.payload; + +import bisq.core.locale.Res; + +import bisq.common.util.CollectionUtils; + +import com.google.protobuf.Message; + +import java.nio.charset.StandardCharsets; + +import java.util.HashMap; +import java.util.Map; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class AustraliaPayidPayload extends PaymentAccountPayload { + private String payid = ""; + private String bankAccountName = ""; + + public AustraliaPayidPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private AustraliaPayidPayload(String paymentMethod, + String id, + String payid, + String bankAccountName, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.payid = payid; + this.bankAccountName = bankAccountName; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setAustraliaPayidPayload( + protobuf.AustraliaPayidPayload.newBuilder() + .setPayid(payid) + .setBankAccountName(bankAccountName) + ).build(); + } + + public static AustraliaPayidPayload fromProto(protobuf.PaymentAccountPayload proto) { + protobuf.AustraliaPayidPayload AustraliaPayidPayload = proto.getAustraliaPayidPayload(); + return new AustraliaPayidPayload(proto.getPaymentMethodId(), + proto.getId(), + AustraliaPayidPayload.getPayid(), + AustraliaPayidPayload.getBankAccountName(), + proto.getMaxTradePeriod(), + CollectionUtils.isEmpty(proto.getExcludeFromJsonDataMap()) ? null : new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return Res.get(paymentMethodId) + " - " + getPaymentDetailsForTradePopup().replace("\n", ", "); + } + + @Override + public String getPaymentDetailsForTradePopup() { + return + Res.get("payment.australia.payid") + ": " + payid + "\n" + + Res.get("payment.account.owner") + ": " + bankAccountName; + } + + + @Override + public byte[] getAgeWitnessInputData() { + String all = this.payid + this.bankAccountName; + return super.getAgeWitnessInputData(all.getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java index eecbb0f730..6b366682df 100644 --- a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java @@ -74,6 +74,7 @@ public final class PaymentMethod implements PersistablePayload, Comparable c.getCode().equals(currencyCode))) + .noneMatch(c -> c.getCode().equals(currencyCode))) return false; + return id.equals(PaymentMethod.SEPA_ID) || id.equals(PaymentMethod.SEPA_INSTANT_ID) || id.equals(PaymentMethod.INTERAC_E_TRANSFER_ID) || diff --git a/core/src/main/java/bisq/core/payment/payload/TransferwiseAccountPayload.java b/core/src/main/java/bisq/core/payment/payload/TransferwiseAccountPayload.java new file mode 100644 index 0000000000..472f64f28b --- /dev/null +++ b/core/src/main/java/bisq/core/payment/payload/TransferwiseAccountPayload.java @@ -0,0 +1,99 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.payment.payload; + +import bisq.core.locale.Res; + +import com.google.protobuf.Message; + +import java.nio.charset.StandardCharsets; + +import java.util.HashMap; +import java.util.Map; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class TransferwiseAccountPayload extends PaymentAccountPayload { + private String email = ""; + + public TransferwiseAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private TransferwiseAccountPayload(String paymentMethod, + String id, + String email, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.email = email; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setTransferwiseAccountPayload(protobuf.TransferwiseAccountPayload.newBuilder().setEmail(email)) + .build(); + } + + public static TransferwiseAccountPayload fromProto(protobuf.PaymentAccountPayload proto) { + return new TransferwiseAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + proto.getTransferwiseAccountPayload().getEmail(), + proto.getMaxTradePeriod(), + new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return Res.get(paymentMethodId) + " - " + Res.getWithCol("payment.email") + " " + email; + } + + @Override + public String getPaymentDetailsForTradePopup() { + return getPaymentDetails(); + } + + @Override + public byte[] getAgeWitnessInputData() { + return super.getAgeWitnessInputData(email.getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/core/src/main/java/bisq/core/proto/CoreProtoResolver.java b/core/src/main/java/bisq/core/proto/CoreProtoResolver.java index 921a1fa5a4..6c0f38b398 100644 --- a/core/src/main/java/bisq/core/proto/CoreProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/CoreProtoResolver.java @@ -23,6 +23,8 @@ import bisq.core.dao.governance.blindvote.storage.BlindVotePayload; import bisq.core.dao.governance.proposal.storage.appendonly.ProposalPayload; import bisq.core.payment.payload.AdvancedCashAccountPayload; import bisq.core.payment.payload.AliPayAccountPayload; +import bisq.core.payment.payload.AmazonGiftCardAccountPayload; +import bisq.core.payment.payload.AustraliaPayidPayload; import bisq.core.payment.payload.CashAppAccountPayload; import bisq.core.payment.payload.CashDepositAccountPayload; import bisq.core.payment.payload.ChaseQuickPayAccountPayload; @@ -48,6 +50,7 @@ import bisq.core.payment.payload.SepaAccountPayload; import bisq.core.payment.payload.SepaInstantAccountPayload; import bisq.core.payment.payload.SpecificBanksAccountPayload; import bisq.core.payment.payload.SwishAccountPayload; +import bisq.core.payment.payload.TransferwiseAccountPayload; import bisq.core.payment.payload.USPostalMoneyOrderAccountPayload; import bisq.core.payment.payload.UpholdAccountPayload; import bisq.core.payment.payload.VenmoAccountPayload; @@ -123,6 +126,8 @@ public class CoreProtoResolver implements ProtoResolver { return InteracETransferAccountPayload.fromProto(proto); case JAPAN_BANK_ACCOUNT_PAYLOAD: return JapanBankAccountPayload.fromProto(proto); + case AUSTRALIA_PAYID_PAYLOAD: + return AustraliaPayidPayload.fromProto(proto); case UPHOLD_ACCOUNT_PAYLOAD: return UpholdAccountPayload.fromProto(proto); case MONEY_BEAM_ACCOUNT_PAYLOAD: @@ -145,6 +150,10 @@ public class CoreProtoResolver implements ProtoResolver { return PromptPayAccountPayload.fromProto(proto); case ADVANCED_CASH_ACCOUNT_PAYLOAD: return AdvancedCashAccountPayload.fromProto(proto); + case TRANSFERWISE_ACCOUNT_PAYLOAD: + return TransferwiseAccountPayload.fromProto(proto); + case AMAZON_GIFT_CARD_ACCOUNT_PAYLOAD: + return AmazonGiftCardAccountPayload.fromProto(proto); case INSTANT_CRYPTO_CURRENCY_ACCOUNT_PAYLOAD: return InstantCryptoCurrencyPayload.fromProto(proto); diff --git a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java index afa177c673..d30a671bc8 100644 --- a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java @@ -34,6 +34,8 @@ import bisq.core.dao.node.messages.GetBlocksRequest; import bisq.core.dao.node.messages.GetBlocksResponse; import bisq.core.dao.node.messages.NewBlockBroadcastMessage; import bisq.core.filter.Filter; +import bisq.core.network.p2p.inventory.messages.GetInventoryRequest; +import bisq.core.network.p2p.inventory.messages.GetInventoryResponse; import bisq.core.offer.OfferPayload; import bisq.core.offer.messages.OfferAvailabilityRequest; import bisq.core.offer.messages.OfferAvailabilityResponse; @@ -64,8 +66,6 @@ import bisq.network.p2p.AckMessage; import bisq.network.p2p.BundleOfEnvelopes; import bisq.network.p2p.CloseConnectionMessage; import bisq.network.p2p.PrefixedSealedAndSignedMessage; -import bisq.network.p2p.inventory.messages.GetInventoryRequest; -import bisq.network.p2p.inventory.messages.GetInventoryResponse; import bisq.network.p2p.peers.getdata.messages.GetDataResponse; import bisq.network.p2p.peers.getdata.messages.GetUpdatedDataRequest; import bisq.network.p2p.peers.getdata.messages.PreliminaryGetDataRequest; diff --git a/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java b/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java index 26addc24b0..f32bf710ad 100644 --- a/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java @@ -43,6 +43,7 @@ import bisq.core.trade.statistics.TradeStatistics3Store; import bisq.core.user.PreferencesPayload; import bisq.core.user.UserPayload; +import bisq.network.p2p.MailboxMessageList; import bisq.network.p2p.peers.peerexchange.PeerList; import bisq.network.p2p.storage.persistence.SequenceNumberMap; @@ -129,6 +130,8 @@ public class CorePersistenceProtoResolver extends CoreProtoResolver implements P return SignedWitnessStore.fromProto(proto.getSignedWitnessStore()); case TRADE_STATISTICS3_STORE: return TradeStatistics3Store.fromProto(proto.getTradeStatistics3Store()); + case MAILBOX_MESSAGE_LIST: + return MailboxMessageList.fromProto(proto.getMailboxMessageList(), networkProtoResolver); default: throw new ProtobufferRuntimeException("Unknown proto message case(PB.PersistableEnvelope). " + diff --git a/core/src/main/java/bisq/core/provider/fee/FeeService.java b/core/src/main/java/bisq/core/provider/fee/FeeService.java index b43c4491b6..78a3c640be 100644 --- a/core/src/main/java/bisq/core/provider/fee/FeeService.java +++ b/core/src/main/java/bisq/core/provider/fee/FeeService.java @@ -20,6 +20,7 @@ package bisq.core.provider.fee; import bisq.core.dao.governance.param.Param; import bisq.core.dao.governance.period.PeriodService; import bisq.core.dao.state.DaoStateService; +import bisq.core.locale.Res; import bisq.common.UserThread; import bisq.common.config.Config; @@ -59,7 +60,7 @@ public class FeeService { // Static /////////////////////////////////////////////////////////////////////////////////////////// - // Miner fees are between 1-600 sat/byte. We try to stay on the safe side. BTC_DEFAULT_TX_FEE is only used if our + // Miner fees are between 1-600 sat/vbyte. We try to stay on the safe side. BTC_DEFAULT_TX_FEE is only used if our // fee service would not deliver data. private static final long BTC_DEFAULT_TX_FEE = 50; private static final long MIN_PAUSE_BETWEEN_REQUESTS_IN_MIN = 2; @@ -93,10 +94,10 @@ public class FeeService { private final FeeProvider feeProvider; private final IntegerProperty feeUpdateCounter = new SimpleIntegerProperty(0); - private long txFeePerByte = BTC_DEFAULT_TX_FEE; + private long txFeePerVbyte = BTC_DEFAULT_TX_FEE; private Map timeStampMap; private long lastRequest; - private long minFeePerByte; + private long minFeePerVByte; private long epochInSecondAtLastRequest; @@ -117,7 +118,7 @@ public class FeeService { /////////////////////////////////////////////////////////////////////////////////////////// public void onAllServicesInitialized() { - minFeePerByte = Config.baseCurrencyNetwork().getDefaultMinFeePerByte(); + minFeePerVByte = Config.baseCurrencyNetwork().getDefaultMinFeePerVbyte(); requestFees(); @@ -149,15 +150,15 @@ public class FeeService { timeStampMap = result.first; epochInSecondAtLastRequest = timeStampMap.get("bitcoinFeesTs"); final Map map = result.second; - txFeePerByte = map.get("BTC"); + txFeePerVbyte = map.get("BTC"); - if (txFeePerByte < minFeePerByte) { - log.warn("The delivered fee per byte is smaller than the min. default fee of 5 sat/byte"); - txFeePerByte = minFeePerByte; + if (txFeePerVbyte < minFeePerVByte) { + log.warn("The delivered fee per vbyte is smaller than the min. default fee of 5 sat/vbyte"); + txFeePerVbyte = minFeePerVByte; } feeUpdateCounter.set(feeUpdateCounter.get() + 1); - log.info("BTC tx fee: txFeePerByte={}", txFeePerByte); + log.info("BTC tx fee: txFeePerVbyte={}", txFeePerVbyte); if (resultHandler != null) resultHandler.run(); }); @@ -179,15 +180,22 @@ public class FeeService { } } - public Coin getTxFee(int sizeInBytes) { - return getTxFeePerByte().multiply(sizeInBytes); + public Coin getTxFee(int vsizeInVbytes) { + return getTxFeePerVbyte().multiply(vsizeInVbytes); } - public Coin getTxFeePerByte() { - return Coin.valueOf(txFeePerByte); + public Coin getTxFeePerVbyte() { + return Coin.valueOf(txFeePerVbyte); } public ReadOnlyIntegerProperty feeUpdateCounterProperty() { return feeUpdateCounter; } + + public String getFeeTextForDisplay() { + // only show the fee rate if it has been initialized from the service (see feeUpdateCounter) + if (feeUpdateCounter.get() > 0) + return Res.get("mainView.footer.btcFeeRate", txFeePerVbyte); + return ""; + } } diff --git a/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java b/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java index 426504a407..43fc7f2fd5 100644 --- a/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java +++ b/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java @@ -36,6 +36,8 @@ import bisq.core.user.Preferences; import bisq.core.user.User; import bisq.network.p2p.P2PService; +import bisq.network.p2p.peers.PeerManager; +import bisq.network.p2p.storage.P2PDataStorage; import bisq.common.config.Config; import bisq.common.proto.persistable.PersistedDataHost; @@ -63,6 +65,8 @@ public class CorePersistedDataHost { persistedDataHosts.add(injector.getInstance(ArbitrationDisputeListService.class)); persistedDataHosts.add(injector.getInstance(MediationDisputeListService.class)); persistedDataHosts.add(injector.getInstance(RefundDisputeListService.class)); + persistedDataHosts.add(injector.getInstance(P2PDataStorage.class)); + persistedDataHosts.add(injector.getInstance(PeerManager.class)); persistedDataHosts.add(injector.getInstance(P2PService.class)); if (injector.getInstance(Config.class).daoActivated) { diff --git a/core/src/main/java/bisq/core/support/SupportManager.java b/core/src/main/java/bisq/core/support/SupportManager.java index 4017686fa8..20419714d9 100644 --- a/core/src/main/java/bisq/core/support/SupportManager.java +++ b/core/src/main/java/bisq/core/support/SupportManager.java @@ -177,7 +177,7 @@ public abstract class SupportManager { requestPersistence(); if (decryptedMessageWithPubKey != null) - p2PService.removeEntryFromMailbox(decryptedMessageWithPubKey); + p2PService.removeMailboxMsg(decryptedMessageWithPubKey); } } @@ -314,7 +314,7 @@ public abstract class SupportManager { log.debug("decryptedMessageWithPubKey.message " + networkEnvelope); if (networkEnvelope instanceof SupportMessage) { dispatchMessage((SupportMessage) networkEnvelope); - p2PService.removeEntryFromMailbox(decryptedMessageWithPubKey); + p2PService.removeMailboxMsg(decryptedMessageWithPubKey); } else if (networkEnvelope instanceof AckMessage) { onAckMessage((AckMessage) networkEnvelope, decryptedMessageWithPubKey); } diff --git a/core/src/main/java/bisq/core/support/dispute/DisputeListService.java b/core/src/main/java/bisq/core/support/dispute/DisputeListService.java index ffbec7dc98..d54b5e8b85 100644 --- a/core/src/main/java/bisq/core/support/dispute/DisputeListService.java +++ b/core/src/main/java/bisq/core/support/dispute/DisputeListService.java @@ -79,11 +79,12 @@ public abstract class DisputeListService> impleme /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { - T persisted = persistenceManager.getPersisted(getFileName()); - if (persisted != null) { - disputeList.setAll(persisted.getList()); - } + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(getFileName(), persisted -> { + disputeList.setAll(persisted.getList()); + completeHandler.run(); + }, + completeHandler); } protected String getFileName() { diff --git a/core/src/main/java/bisq/core/support/dispute/DisputeManager.java b/core/src/main/java/bisq/core/support/dispute/DisputeManager.java index 45fc43f35e..46a5c464b9 100644 --- a/core/src/main/java/bisq/core/support/dispute/DisputeManager.java +++ b/core/src/main/java/bisq/core/support/dispute/DisputeManager.java @@ -395,6 +395,7 @@ public abstract class DisputeManager> extends Sup if (!storedDisputeOptional.isPresent()) { disputeList.add(dispute); trade.setDisputeState(getDisputeStateStartedByPeer()); + tradeManager.requestPersistence(); errorMessage = null; } else { // valid case if both have opened a dispute and agent was not online. diff --git a/core/src/main/java/bisq/core/support/dispute/mediation/MediationManager.java b/core/src/main/java/bisq/core/support/dispute/mediation/MediationManager.java index e0a20e08da..526c53c62a 100644 --- a/core/src/main/java/bisq/core/support/dispute/mediation/MediationManager.java +++ b/core/src/main/java/bisq/core/support/dispute/mediation/MediationManager.java @@ -204,9 +204,10 @@ public final class MediationManager extends DisputeManager trade.getDisputeState() == Trade.DisputeState.MEDIATION_STARTED_BY_PEER) { trade.getProcessModel().setBuyerPayoutAmountFromMediation(disputeResult.getBuyerPayoutAmount().value); trade.getProcessModel().setSellerPayoutAmountFromMediation(disputeResult.getSellerPayoutAmount().value); - tradeManager.requestPersistence(); trade.setDisputeState(Trade.DisputeState.MEDIATION_CLOSED); + + tradeManager.requestPersistence(); } } else { Optional openOfferOptional = openOfferManager.getOpenOfferById(tradeId); @@ -243,6 +244,7 @@ public final class MediationManager extends DisputeManager DisputeProtocol tradeProtocol = (DisputeProtocol) tradeManager.getTradeProtocol(trade); trade.setMediationResultState(MediationResultState.MEDIATION_RESULT_ACCEPTED); + tradeManager.requestPersistence(); // If we have not got yet the peers signature we sign and send to the peer our signature. // Otherwise we sign and complete with the peers signature the payout tx. @@ -265,5 +267,6 @@ public final class MediationManager extends DisputeManager public void rejectMediationResult(Trade trade) { trade.setMediationResultState(MediationResultState.MEDIATION_RESULT_REJECTED); + tradeManager.requestPersistence(); } } diff --git a/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java b/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java index e7919346f3..1cff45dbdc 100644 --- a/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java +++ b/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java @@ -205,6 +205,7 @@ public final class RefundManager extends DisputeManager { if (trade.getDisputeState() == Trade.DisputeState.REFUND_REQUESTED || trade.getDisputeState() == Trade.DisputeState.REFUND_REQUEST_STARTED_BY_PEER) { trade.setDisputeState(Trade.DisputeState.REFUND_REQUEST_CLOSED); + tradeManager.requestPersistence(); } } else { Optional openOfferOptional = openOfferManager.getOpenOfferById(tradeId); diff --git a/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java b/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java index ef4a0157e0..bf7f353200 100644 --- a/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java +++ b/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java @@ -164,5 +164,7 @@ public class TraderChatManager extends SupportManager { trade.getDate().getTime()); chatMessage.setSystemMessage(true); trade.getChatMessages().add(chatMessage); + + requestPersistence(); } } diff --git a/core/src/main/java/bisq/core/trade/Trade.java b/core/src/main/java/bisq/core/trade/Trade.java index a6f2d56ab9..ba50362262 100644 --- a/core/src/main/java/bisq/core/trade/Trade.java +++ b/core/src/main/java/bisq/core/trade/Trade.java @@ -700,10 +700,6 @@ public abstract class Trade implements Tradable, Model { } } - public void appendErrorMessage(String msg) { - errorMessage = errorMessage == null ? msg : errorMessage + "\n" + msg; - } - public boolean mediationResultAppliedPenaltyToSeller() { // If mediated payout is same or more then normal payout we enable otherwise a penalty was applied // by mediators and we keep the confirm disabled to avoid that the seller can complete the trade @@ -1099,6 +1095,9 @@ public abstract class Trade implements Tradable, Model { private void setConfirmedState() { // we only apply the state if we are not already further in the process if (!isDepositConfirmed()) { + // As setState is called here from the trade itself we cannot trigger a requestPersistence call. + // But as we get setupConfidenceListener called at startup anyway there is no issue if it would not be + // persisted in case the shutdown routine did not persist the trade. setState(State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN); } } diff --git a/core/src/main/java/bisq/core/trade/TradeDataValidation.java b/core/src/main/java/bisq/core/trade/TradeDataValidation.java index ef4665a502..d0e8cc47c2 100644 --- a/core/src/main/java/bisq/core/trade/TradeDataValidation.java +++ b/core/src/main/java/bisq/core/trade/TradeDataValidation.java @@ -179,24 +179,30 @@ public class TradeDataValidation { checkNotNull(disputeToTestUid, "agentsUid must not be null. Trade ID: " + disputeToTestTradeId); - checkArgument(disputesPerTradeId.get(disputeToTestTradeId).size() <= 2, + Set disputesPerTradeIdItems = disputesPerTradeId.get(disputeToTestTradeId); + checkArgument(disputesPerTradeIdItems != null && disputesPerTradeIdItems.size() <= 2, "We found more then 2 disputes with the same trade ID. " + "Trade ID: " + disputeToTestTradeId); if (!disputesPerDelayedPayoutTxId.isEmpty()) { - checkArgument(disputesPerDelayedPayoutTxId.get(disputeToTestDelayedPayoutTxId).size() <= 2, + Set disputesPerDelayedPayoutTxIdItems = disputesPerDelayedPayoutTxId.get(disputeToTestDelayedPayoutTxId); + checkArgument(disputesPerDelayedPayoutTxIdItems != null && disputesPerDelayedPayoutTxIdItems.size() <= 2, "We found more then 2 disputes with the same delayedPayoutTxId. " + "Trade ID: " + disputeToTestTradeId); } if (!disputesPerDepositTxId.isEmpty()) { - checkArgument(disputesPerDepositTxId.get(disputeToTestDepositTxId).size() <= 2, + Set disputesPerDepositTxIdItems = disputesPerDepositTxId.get(disputeToTestDepositTxId); + checkArgument(disputesPerDepositTxIdItems != null && disputesPerDepositTxIdItems.size() <= 2, "We found more then 2 disputes with the same depositTxId. " + "Trade ID: " + disputeToTestTradeId); } - } catch (IllegalArgumentException e) { throw new DisputeReplayException(disputeToTest, e.getMessage()); } catch (NullPointerException e) { - throw new DisputeReplayException(disputeToTest, e.toString()); + log.error("NullPointerException at testIfDisputeTriesReplay: " + + "disputeToTest={}, disputesPerTradeId={}, disputesPerDelayedPayoutTxId={}, " + + "disputesPerDepositTxId={}", + disputeToTest, disputesPerTradeId, disputesPerDelayedPayoutTxId, disputesPerDepositTxId); + throw new DisputeReplayException(disputeToTest, e.toString() + " at dispute " + disputeToTest.toString()); } } diff --git a/core/src/main/java/bisq/core/trade/TradeManager.java b/core/src/main/java/bisq/core/trade/TradeManager.java index 0d8d02a241..5bbd88c4cd 100644 --- a/core/src/main/java/bisq/core/trade/TradeManager.java +++ b/core/src/main/java/bisq/core/trade/TradeManager.java @@ -120,6 +120,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi private final P2PService p2PService; private final PriceFeedService priceFeedService; private final TradeStatisticsManager tradeStatisticsManager; + private final TradeUtil tradeUtil; @Getter private final ArbitratorManager arbitratorManager; private final MediatorManager mediatorManager; @@ -157,6 +158,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi P2PService p2PService, PriceFeedService priceFeedService, TradeStatisticsManager tradeStatisticsManager, + TradeUtil tradeUtil, ArbitratorManager arbitratorManager, MediatorManager mediatorManager, ProcessModelServiceProvider processModelServiceProvider, @@ -175,6 +177,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi this.p2PService = p2PService; this.priceFeedService = priceFeedService; this.tradeStatisticsManager = tradeStatisticsManager; + this.tradeUtil = tradeUtil; this.arbitratorManager = arbitratorManager; this.mediatorManager = mediatorManager; this.processModelServiceProvider = processModelServiceProvider; @@ -197,19 +200,16 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { - TradableList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - tradableList.setAll(persisted.getList()); - } - - tradableList.forEach(trade -> { - Offer offer = trade.getOffer(); - if (offer != null) - offer.setPriceFeedService(priceFeedService); - }); - - dumpDelayedPayoutTx.maybeDumpDelayedPayoutTxs(tradableList, "delayed_payout_txs_pending"); + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + tradableList.setAll(persisted.getList()); + tradableList.stream() + .filter(trade -> trade.getOffer() != null) + .forEach(trade -> trade.getOffer().setPriceFeedService(priceFeedService)); + dumpDelayedPayoutTx.maybeDumpDelayedPayoutTxs(tradableList, "delayed_payout_txs_pending"); + completeHandler.run(); + }, + completeHandler); } @@ -342,11 +342,13 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi private void initPersistedTrade(Trade trade) { initTradeAndProtocol(trade, getTradeProtocol(trade)); trade.updateDepositTxFromWallet(); + requestPersistence(); } private void initTradeAndProtocol(Trade trade, TradeProtocol tradeProtocol) { tradeProtocol.initialize(processModelServiceProvider, this, trade.getOffer()); trade.initialize(processModelServiceProvider); + requestPersistence(); } public void requestPersistence() { @@ -431,6 +433,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi ((TakerProtocol) tradeProtocol).onTakeOffer(); tradeResultHandler.handleResult(trade); + requestPersistence(); } }, errorMessageHandler); @@ -544,10 +547,13 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi Date halfTradePeriodDate = trade.getHalfTradePeriodDate(); if (maxTradePeriodDate != null && halfTradePeriodDate != null) { Date now = new Date(); - if (now.after(maxTradePeriodDate)) + if (now.after(maxTradePeriodDate)) { trade.setTradePeriodState(Trade.TradePeriodState.TRADE_PERIOD_OVER); - else if (now.after(halfTradePeriodDate)) + requestPersistence(); + } else if (now.after(halfTradePeriodDate)) { trade.setTradePeriodState(Trade.TradePeriodState.SECOND_HALF); + requestPersistence(); + } } } }); @@ -634,7 +640,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi // the relevant entries are changed, otherwise it's not added and no address entries are changed private boolean recoverAddresses(Trade trade) { // Find addresses associated with this trade. - var entries = TradeUtils.getAvailableAddresses(trade, btcWalletService, keyRing); + var entries = tradeUtil.getAvailableAddresses(trade); if (entries == null) return false; diff --git a/core/src/main/java/bisq/core/trade/TradeUtil.java b/core/src/main/java/bisq/core/trade/TradeUtil.java new file mode 100644 index 0000000000..a026f6ab98 --- /dev/null +++ b/core/src/main/java/bisq/core/trade/TradeUtil.java @@ -0,0 +1,227 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.trade; + +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.locale.Res; +import bisq.core.offer.Offer; + +import bisq.common.crypto.KeyRing; +import bisq.common.util.Tuple2; +import bisq.common.util.Utilities; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import java.util.Date; +import java.util.Objects; + +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Nullable; + +import static bisq.core.locale.CurrencyUtil.getCurrencyPair; +import static bisq.core.locale.CurrencyUtil.isFiatCurrency; +import static bisq.core.util.FormattingUtils.formatDurationAsWords; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.lang.String.format; + +/** + * This class contains trade utility methods. + */ +@Slf4j +@Singleton +public class TradeUtil { + + private final BtcWalletService btcWalletService; + private final KeyRing keyRing; + + @Inject + public TradeUtil(BtcWalletService btcWalletService, KeyRing keyRing) { + this.btcWalletService = btcWalletService; + this.keyRing = keyRing; + } + + /** + * Returns if and only if both are AVAILABLE, + * otherwise null. + * @param trade the trade being queried for MULTI_SIG, TRADE_PAYOUT addresses + * @return Tuple2 tuple containing MULTI_SIG, TRADE_PAYOUT addresses for trade + */ + public Tuple2 getAvailableAddresses(Trade trade) { + var addresses = getTradeAddresses(trade); + if (addresses == null) + return null; + + if (btcWalletService.getAvailableAddressEntries().stream() + .noneMatch(e -> Objects.equals(e.getAddressString(), addresses.first))) + return null; + + if (btcWalletService.getAvailableAddressEntries().stream() + .noneMatch(e -> Objects.equals(e.getAddressString(), addresses.second))) + return null; + + return new Tuple2<>(addresses.first, addresses.second); + } + + /** + * Returns addresses as strings if they're known by the + * wallet. + * @param trade the trade being queried for MULTI_SIG, TRADE_PAYOUT addresses + * @return Tuple2 tuple containing MULTI_SIG, TRADE_PAYOUT addresses for trade + */ + public Tuple2 getTradeAddresses(Trade trade) { + var contract = trade.getContract(); + if (contract == null) + return null; + + // Get multisig address + var isMyRoleBuyer = contract.isMyRoleBuyer(keyRing.getPubKeyRing()); + var multiSigPubKey = isMyRoleBuyer + ? contract.getBuyerMultiSigPubKey() + : contract.getSellerMultiSigPubKey(); + if (multiSigPubKey == null) + return null; + + var multiSigPubKeyString = Utilities.bytesAsHexString(multiSigPubKey); + var multiSigAddress = btcWalletService.getAddressEntryListAsImmutableList().stream() + .filter(e -> e.getKeyPair().getPublicKeyAsHex().equals(multiSigPubKeyString)) + .findAny() + .orElse(null); + if (multiSigAddress == null) + return null; + + // Get payout address + var payoutAddress = isMyRoleBuyer + ? contract.getBuyerPayoutAddressString() + : contract.getSellerPayoutAddressString(); + var payoutAddressEntry = btcWalletService.getAddressEntryListAsImmutableList().stream() + .filter(e -> Objects.equals(e.getAddressString(), payoutAddress)) + .findAny() + .orElse(null); + if (payoutAddressEntry == null) + return null; + + return new Tuple2<>(multiSigAddress.getAddressString(), payoutAddress); + } + + public long getRemainingTradeDuration(Trade trade) { + return trade.getMaxTradePeriodDate() != null + ? trade.getMaxTradePeriodDate().getTime() - new Date().getTime() + : getMaxTradePeriod(trade); + } + + public long getMaxTradePeriod(Trade trade) { + return trade.getOffer() != null + ? trade.getOffer().getPaymentMethod().getMaxTradePeriod() + : 0; + } + + public double getRemainingTradeDurationAsPercentage(Trade trade) { + long maxPeriod = getMaxTradePeriod(trade); + long remaining = getRemainingTradeDuration(trade); + if (maxPeriod != 0) { + return 1 - (double) remaining / (double) maxPeriod; + } else + return 0; + } + + public String getRemainingTradeDurationAsWords(Trade trade) { + return formatDurationAsWords(Math.max(0, getRemainingTradeDuration(trade))); + } + + @Nullable + public Date getHalfTradePeriodDate(Trade trade) { + return trade != null ? trade.getHalfTradePeriodDate() : null; + } + + public Date getDateForOpenDispute(Trade trade) { + return new Date(new Date().getTime() + getRemainingTradeDuration(trade)); + } + + public String getMarketDescription(Trade trade) { + if (trade == null) + return ""; + + checkNotNull(trade.getOffer()); + checkNotNull(trade.getOffer().getCurrencyCode()); + return getCurrencyPair(trade.getOffer().getCurrencyCode()); + } + + public String getPaymentMethodNameWithCountryCode(Trade trade) { + if (trade == null) + return ""; + + Offer offer = trade.getOffer(); + checkNotNull(offer); + checkNotNull(offer.getPaymentMethod()); + return offer.getPaymentMethodNameWithCountryCode(); + } + + /** + * Returns a string describing a trader's role for a given trade. + * @param trade Trade + * @return String describing a trader's role for a given trade + */ + public String getRole(Trade trade) { + Contract contract = trade.getContract(); + if (contract == null) + throw new IllegalStateException(format("could not get role because no contract was found for trade '%s'", + trade.getShortId())); + + Offer offer = trade.getOffer(); + if (offer == null) + throw new IllegalStateException(format("could not get role because no offer was found for trade '%s'", + trade.getShortId())); + + return getRole(contract.isBuyerMakerAndSellerTaker(), + offer.isMyOffer(keyRing), + offer.getCurrencyCode()); + } + + /** + * Returns a string describing a trader's role. + * + * @param isBuyerMakerAndSellerTaker boolean + * @param isMaker boolean + * @param currencyCode String + * @return String describing a trader's role + */ + public String getRole(boolean isBuyerMakerAndSellerTaker, boolean isMaker, String currencyCode) { + if (isFiatCurrency(currencyCode)) { + String baseCurrencyCode = Res.getBaseCurrencyCode(); + if (isBuyerMakerAndSellerTaker) + return isMaker + ? Res.get("formatter.asMaker", baseCurrencyCode, Res.get("shared.buyer")) + : Res.get("formatter.asTaker", baseCurrencyCode, Res.get("shared.seller")); + else + return isMaker + ? Res.get("formatter.asMaker", baseCurrencyCode, Res.get("shared.seller")) + : Res.get("formatter.asTaker", baseCurrencyCode, Res.get("shared.buyer")); + } else { + if (isBuyerMakerAndSellerTaker) + return isMaker + ? Res.get("formatter.asMaker", currencyCode, Res.get("shared.seller")) + : Res.get("formatter.asTaker", currencyCode, Res.get("shared.buyer")); + else + return isMaker + ? Res.get("formatter.asMaker", currencyCode, Res.get("shared.buyer")) + : Res.get("formatter.asTaker", currencyCode, Res.get("shared.seller")); + } + } +} diff --git a/core/src/main/java/bisq/core/trade/TradeUtils.java b/core/src/main/java/bisq/core/trade/TradeUtils.java deleted file mode 100644 index 10a5da8fdf..0000000000 --- a/core/src/main/java/bisq/core/trade/TradeUtils.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.trade; - -import bisq.core.btc.wallet.BtcWalletService; - -import bisq.common.crypto.KeyRing; -import bisq.common.util.Tuple2; -import bisq.common.util.Utilities; - -import java.util.Objects; - -public class TradeUtils { - - // Returns if both are AVAILABLE, otherwise null - static Tuple2 getAvailableAddresses(Trade trade, BtcWalletService btcWalletService, - KeyRing keyRing) { - var addresses = getTradeAddresses(trade, btcWalletService, keyRing); - if (addresses == null) - return null; - - if (btcWalletService.getAvailableAddressEntries().stream() - .noneMatch(e -> Objects.equals(e.getAddressString(), addresses.first))) - return null; - if (btcWalletService.getAvailableAddressEntries().stream() - .noneMatch(e -> Objects.equals(e.getAddressString(), addresses.second))) - return null; - - return new Tuple2<>(addresses.first, addresses.second); - } - - // Returns addresses as strings if they're known by the wallet - public static Tuple2 getTradeAddresses(Trade trade, BtcWalletService btcWalletService, - KeyRing keyRing) { - var contract = trade.getContract(); - if (contract == null) - return null; - - // Get multisig address - var isMyRoleBuyer = contract.isMyRoleBuyer(keyRing.getPubKeyRing()); - var multiSigPubKey = isMyRoleBuyer ? contract.getBuyerMultiSigPubKey() : contract.getSellerMultiSigPubKey(); - if (multiSigPubKey == null) - return null; - var multiSigPubKeyString = Utilities.bytesAsHexString(multiSigPubKey); - var multiSigAddress = btcWalletService.getAddressEntryListAsImmutableList().stream() - .filter(e -> e.getKeyPair().getPublicKeyAsHex().equals(multiSigPubKeyString)) - .findAny() - .orElse(null); - if (multiSigAddress == null) - return null; - - // Get payout address - var payoutAddress = isMyRoleBuyer ? - contract.getBuyerPayoutAddressString() : contract.getSellerPayoutAddressString(); - var payoutAddressEntry = btcWalletService.getAddressEntryListAsImmutableList().stream() - .filter(e -> Objects.equals(e.getAddressString(), payoutAddress)) - .findAny() - .orElse(null); - if (payoutAddressEntry == null) - return null; - - return new Tuple2<>(multiSigAddress.getAddressString(), payoutAddress); - } -} diff --git a/core/src/main/java/bisq/core/trade/closed/CleanupMailboxMessages.java b/core/src/main/java/bisq/core/trade/closed/CleanupMailboxMessages.java new file mode 100644 index 0000000000..5b71684ade --- /dev/null +++ b/core/src/main/java/bisq/core/trade/closed/CleanupMailboxMessages.java @@ -0,0 +1,131 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.trade.closed; + +import bisq.core.trade.Trade; +import bisq.core.trade.messages.TradeMessage; + +import bisq.network.p2p.AckMessage; +import bisq.network.p2p.AckMessageSourceType; +import bisq.network.p2p.BootstrapListener; +import bisq.network.p2p.DecryptedMessageWithPubKey; +import bisq.network.p2p.P2PService; + +import bisq.common.crypto.PubKeyRing; +import bisq.common.proto.network.NetworkEnvelope; + +import javax.inject.Inject; + +import java.util.List; + +import lombok.extern.slf4j.Slf4j; + +//TODO with the redesign of mailbox messages that is not required anymore. We leave it for now as we want to minimize +// changes for the 1.5.0 release but we should clean up afterwards... + +/** + * Util for removing pending mailbox messages in case the trade has been closed by the seller after confirming receipt + * and a AckMessage as mailbox message will be sent by the buyer once they go online. In that case the seller's trade + * is closed already and the TradeProtocol is not executing the message processing, thus the mailbox message would not + * be removed. To ensure that in such cases (as well other potential cases in failure scenarios) the mailbox message + * gets removed from the network we use that util. + * + * This class must not be injected as a singleton! + */ +@Slf4j +public class CleanupMailboxMessages { + private final P2PService p2PService; + + @Inject + public CleanupMailboxMessages(P2PService p2PService) { + this.p2PService = p2PService; + } + + public void handleTrades(List trades) { + // We wrap in a try catch as in failed trades we cannot be sure if expected data is set, so we could get + // a NullPointer and do not want that this escalate to the user. + try { + if (p2PService.isBootstrapped()) { + cleanupMailboxMessages(trades); + } else { + p2PService.addP2PServiceListener(new BootstrapListener() { + @Override + public void onUpdatedDataReceived() { + cleanupMailboxMessages(trades); + } + }); + } + } catch (Throwable t) { + log.error("Cleanup mailbox messages failed. {}", t.toString()); + } + } + + private void cleanupMailboxMessages(List trades) { + p2PService.getMailBoxMessages() + .forEach(message -> handleDecryptedMessageWithPubKey(message, trades)); + } + + private void handleDecryptedMessageWithPubKey(DecryptedMessageWithPubKey decryptedMessageWithPubKey, + List trades) { + trades.forEach(trade -> handleDecryptedMessageWithPubKey(decryptedMessageWithPubKey, trade)); + } + + private void handleDecryptedMessageWithPubKey(DecryptedMessageWithPubKey decryptedMessageWithPubKey, + Trade trade) { + NetworkEnvelope networkEnvelope = decryptedMessageWithPubKey.getNetworkEnvelope(); + if (!isPubKeyValid(decryptedMessageWithPubKey, trade)) { + return; + } + + if (networkEnvelope instanceof TradeMessage && + isMyMessage((TradeMessage) networkEnvelope, trade)) { + removeEntryFromMailbox(decryptedMessageWithPubKey, trade); + } else if (networkEnvelope instanceof AckMessage && + isMyMessage((AckMessage) networkEnvelope, trade)) { + removeEntryFromMailbox(decryptedMessageWithPubKey, trade); + } + } + + private void removeEntryFromMailbox(DecryptedMessageWithPubKey decryptedMessageWithPubKey, Trade trade) { + log.info("We found a pending mailbox message ({}) for trade {}. As the trade is closed we remove the mailbox message.", + decryptedMessageWithPubKey.getNetworkEnvelope().getClass().getSimpleName(), trade.getId()); + p2PService.removeMailboxMsg(decryptedMessageWithPubKey); + } + + private boolean isMyMessage(TradeMessage message, Trade trade) { + return message.getTradeId().equals(trade.getId()); + } + + private boolean isMyMessage(AckMessage ackMessage, Trade trade) { + return ackMessage.getSourceType() == AckMessageSourceType.TRADE_MESSAGE && + ackMessage.getSourceId().equals(trade.getId()); + } + + private boolean isPubKeyValid(DecryptedMessageWithPubKey message, Trade trade) { + // We can only validate the peers pubKey if we have it already. If we are the taker we get it from the offer + // Otherwise it depends on the state of the trade protocol if we have received the peers pubKeyRing already. + PubKeyRing peersPubKeyRing = trade.getProcessModel().getTradingPeer().getPubKeyRing(); + boolean isValid = true; + if (peersPubKeyRing != null && + !message.getSignaturePubKey().equals(peersPubKeyRing.getSignaturePubKey())) { + isValid = false; + log.error("SignaturePubKey in message does not match the SignaturePubKey we have set for our trading peer."); + } + return isValid; + } +} diff --git a/core/src/main/java/bisq/core/trade/closed/ClosedTradableManager.java b/core/src/main/java/bisq/core/trade/closed/ClosedTradableManager.java index 69567270cb..01c36beb4d 100644 --- a/core/src/main/java/bisq/core/trade/closed/ClosedTradableManager.java +++ b/core/src/main/java/bisq/core/trade/closed/ClosedTradableManager.java @@ -39,20 +39,26 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; +import lombok.extern.slf4j.Slf4j; + +@Slf4j public class ClosedTradableManager implements PersistedDataHost { private final PersistenceManager> persistenceManager; private final TradableList closedTradables = new TradableList<>(); private final KeyRing keyRing; private final PriceFeedService priceFeedService; + private final CleanupMailboxMessages cleanupMailboxMessages; private final DumpDelayedPayoutTx dumpDelayedPayoutTx; @Inject public ClosedTradableManager(KeyRing keyRing, PriceFeedService priceFeedService, PersistenceManager> persistenceManager, + CleanupMailboxMessages cleanupMailboxMessages, DumpDelayedPayoutTx dumpDelayedPayoutTx) { this.keyRing = keyRing; this.priceFeedService = priceFeedService; + this.cleanupMailboxMessages = cleanupMailboxMessages; this.dumpDelayedPayoutTx = dumpDelayedPayoutTx; this.persistenceManager = persistenceManager; @@ -60,26 +66,31 @@ public class ClosedTradableManager implements PersistedDataHost { } @Override - public void readPersisted() { - TradableList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - closedTradables.setAll(persisted.getList()); - } + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + closedTradables.setAll(persisted.getList()); + closedTradables.stream() + .filter(tradable -> tradable.getOffer() != null) + .forEach(tradable -> tradable.getOffer().setPriceFeedService(priceFeedService)); + dumpDelayedPayoutTx.maybeDumpDelayedPayoutTxs(closedTradables, "delayed_payout_txs_closed"); + completeHandler.run(); + }, + completeHandler); + } - closedTradables.forEach(tradable -> tradable.getOffer().setPriceFeedService(priceFeedService)); - - dumpDelayedPayoutTx.maybeDumpDelayedPayoutTxs(closedTradables, "delayed_payout_txs_closed"); + public void onAllServicesInitialized() { + cleanupMailboxMessages.handleTrades(getClosedTrades()); } public void add(Tradable tradable) { if (closedTradables.add(tradable)) { - persistenceManager.requestPersistence(); + requestPersistence(); } } public void remove(Tradable tradable) { if (closedTradables.remove(tradable)) { - persistenceManager.requestPersistence(); + requestPersistence(); } } @@ -106,4 +117,8 @@ public class ClosedTradableManager implements PersistedDataHost { return getClosedTrades().stream() .filter(Trade::isFundsLockedIn); } + + private void requestPersistence() { + persistenceManager.requestPersistence(); + } } diff --git a/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java b/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java index a584f6b783..84746a2128 100644 --- a/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java +++ b/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java @@ -24,7 +24,8 @@ import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.DumpDelayedPayoutTx; import bisq.core.trade.TradableList; import bisq.core.trade.Trade; -import bisq.core.trade.TradeUtils; +import bisq.core.trade.TradeUtil; +import bisq.core.trade.closed.CleanupMailboxMessages; import bisq.common.crypto.KeyRing; import bisq.common.persistence.PersistenceManager; @@ -49,7 +50,9 @@ public class FailedTradesManager implements PersistedDataHost { private final KeyRing keyRing; private final PriceFeedService priceFeedService; private final BtcWalletService btcWalletService; + private final CleanupMailboxMessages cleanupMailboxMessages; private final PersistenceManager> persistenceManager; + private final TradeUtil tradeUtil; private final DumpDelayedPayoutTx dumpDelayedPayoutTx; @Setter private Function unFailTradeCallback; @@ -59,41 +62,46 @@ public class FailedTradesManager implements PersistedDataHost { PriceFeedService priceFeedService, BtcWalletService btcWalletService, PersistenceManager> persistenceManager, + TradeUtil tradeUtil, + CleanupMailboxMessages cleanupMailboxMessages, DumpDelayedPayoutTx dumpDelayedPayoutTx) { this.keyRing = keyRing; this.priceFeedService = priceFeedService; this.btcWalletService = btcWalletService; + this.cleanupMailboxMessages = cleanupMailboxMessages; this.dumpDelayedPayoutTx = dumpDelayedPayoutTx; this.persistenceManager = persistenceManager; + this.tradeUtil = tradeUtil; this.persistenceManager.initialize(failedTrades, "FailedTrades", PersistenceManager.Source.PRIVATE); } @Override - public void readPersisted() { - TradableList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - failedTrades.setAll(persisted.getList()); - } + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + failedTrades.setAll(persisted.getList()); + failedTrades.stream() + .filter(trade -> trade.getOffer() != null) + .forEach(trade -> trade.getOffer().setPriceFeedService(priceFeedService)); + dumpDelayedPayoutTx.maybeDumpDelayedPayoutTxs(failedTrades, "delayed_payout_txs_failed"); + completeHandler.run(); + }, + completeHandler); + } - failedTrades.forEach(trade -> { - if (trade.getOffer() != null) { - trade.getOffer().setPriceFeedService(priceFeedService); - } - }); - - dumpDelayedPayoutTx.maybeDumpDelayedPayoutTxs(failedTrades, "delayed_payout_txs_failed"); + public void onAllServicesInitialized() { + cleanupMailboxMessages.handleTrades(failedTrades.getList()); } public void add(Trade trade) { if (failedTrades.add(trade)) { - persistenceManager.requestPersistence(); + requestPersistence(); } } public void removeTrade(Trade trade) { if (failedTrades.remove(trade)) { - persistenceManager.requestPersistence(); + requestPersistence(); } } @@ -121,13 +129,13 @@ public class FailedTradesManager implements PersistedDataHost { if (unFailTradeCallback.apply(trade)) { log.info("Unfailing trade {}", trade.getId()); if (failedTrades.remove(trade)) { - persistenceManager.requestPersistence(); + requestPersistence(); } } } public String checkUnFail(Trade trade) { - var addresses = TradeUtils.getTradeAddresses(trade, btcWalletService, keyRing); + var addresses = tradeUtil.getTradeAddresses(trade); if (addresses == null) { return "Addresses not found"; } @@ -143,4 +151,8 @@ public class FailedTradesManager implements PersistedDataHost { } return blockingTrades.toString(); } + + private void requestPersistence() { + persistenceManager.requestPersistence(); + } } diff --git a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java index 0d1182001b..81afad3caf 100644 --- a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java +++ b/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java @@ -33,16 +33,19 @@ import lombok.Value; public final class DelayedPayoutTxSignatureRequest extends TradeMessage implements DirectMessage { private final NodeAddress senderNodeAddress; private final byte[] delayedPayoutTx; + private final byte[] delayedPayoutTxSellerSignature; public DelayedPayoutTxSignatureRequest(String uid, String tradeId, NodeAddress senderNodeAddress, - byte[] delayedPayoutTx) { + byte[] delayedPayoutTx, + byte[] delayedPayoutTxSellerSignature) { this(Version.getP2PMessageVersion(), uid, tradeId, senderNodeAddress, - delayedPayoutTx); + delayedPayoutTx, + delayedPayoutTxSellerSignature); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -53,10 +56,12 @@ public final class DelayedPayoutTxSignatureRequest extends TradeMessage implemen String uid, String tradeId, NodeAddress senderNodeAddress, - byte[] delayedPayoutTx) { + byte[] delayedPayoutTx, + byte[] delayedPayoutTxSellerSignature) { super(messageVersion, tradeId, uid); this.senderNodeAddress = senderNodeAddress; this.delayedPayoutTx = delayedPayoutTx; + this.delayedPayoutTxSellerSignature = delayedPayoutTxSellerSignature; } @@ -67,16 +72,19 @@ public final class DelayedPayoutTxSignatureRequest extends TradeMessage implemen .setUid(uid) .setTradeId(tradeId) .setSenderNodeAddress(senderNodeAddress.toProtoMessage()) - .setDelayedPayoutTx(ByteString.copyFrom(delayedPayoutTx))) + .setDelayedPayoutTx(ByteString.copyFrom(delayedPayoutTx)) + .setDelayedPayoutTxSellerSignature(ByteString.copyFrom(delayedPayoutTxSellerSignature))) .build(); } - public static DelayedPayoutTxSignatureRequest fromProto(protobuf.DelayedPayoutTxSignatureRequest proto, int messageVersion) { + public static DelayedPayoutTxSignatureRequest fromProto(protobuf.DelayedPayoutTxSignatureRequest proto, + int messageVersion) { return new DelayedPayoutTxSignatureRequest(messageVersion, proto.getUid(), proto.getTradeId(), NodeAddress.fromProto(proto.getSenderNodeAddress()), - proto.getDelayedPayoutTx().toByteArray()); + proto.getDelayedPayoutTx().toByteArray(), + proto.getDelayedPayoutTxSellerSignature().toByteArray()); } @Override @@ -84,6 +92,7 @@ public final class DelayedPayoutTxSignatureRequest extends TradeMessage implemen return "DelayedPayoutTxSignatureRequest{" + "\n senderNodeAddress=" + senderNodeAddress + ",\n delayedPayoutTx=" + Utilities.bytesAsHexString(delayedPayoutTx) + + ",\n delayedPayoutTxSellerSignature=" + Utilities.bytesAsHexString(delayedPayoutTxSellerSignature) + "\n} " + super.toString(); } } diff --git a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java index 639d5edb72..ad3767a3ab 100644 --- a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java +++ b/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java @@ -32,17 +32,20 @@ import lombok.Value; @Value public final class DelayedPayoutTxSignatureResponse extends TradeMessage implements DirectMessage { private final NodeAddress senderNodeAddress; - private final byte[] delayedPayoutTxSignature; + private final byte[] delayedPayoutTxBuyerSignature; + private final byte[] depositTx; public DelayedPayoutTxSignatureResponse(String uid, String tradeId, NodeAddress senderNodeAddress, - byte[] delayedPayoutTxSignature) { + byte[] delayedPayoutTxBuyerSignature, + byte[] depositTx) { this(Version.getP2PMessageVersion(), uid, tradeId, senderNodeAddress, - delayedPayoutTxSignature); + delayedPayoutTxBuyerSignature, + depositTx); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -53,10 +56,12 @@ public final class DelayedPayoutTxSignatureResponse extends TradeMessage impleme String uid, String tradeId, NodeAddress senderNodeAddress, - byte[] delayedPayoutTxSignature) { + byte[] delayedPayoutTxBuyerSignature, + byte[] depositTx) { super(messageVersion, tradeId, uid); this.senderNodeAddress = senderNodeAddress; - this.delayedPayoutTxSignature = delayedPayoutTxSignature; + this.delayedPayoutTxBuyerSignature = delayedPayoutTxBuyerSignature; + this.depositTx = depositTx; } @@ -67,24 +72,28 @@ public final class DelayedPayoutTxSignatureResponse extends TradeMessage impleme .setUid(uid) .setTradeId(tradeId) .setSenderNodeAddress(senderNodeAddress.toProtoMessage()) - .setDelayedPayoutTxSignature(ByteString.copyFrom(delayedPayoutTxSignature)) + .setDelayedPayoutTxBuyerSignature(ByteString.copyFrom(delayedPayoutTxBuyerSignature)) + .setDepositTx(ByteString.copyFrom(depositTx)) ) .build(); } - public static DelayedPayoutTxSignatureResponse fromProto(protobuf.DelayedPayoutTxSignatureResponse proto, int messageVersion) { + public static DelayedPayoutTxSignatureResponse fromProto(protobuf.DelayedPayoutTxSignatureResponse proto, + int messageVersion) { return new DelayedPayoutTxSignatureResponse(messageVersion, proto.getUid(), proto.getTradeId(), NodeAddress.fromProto(proto.getSenderNodeAddress()), - proto.getDelayedPayoutTxSignature().toByteArray()); + proto.getDelayedPayoutTxBuyerSignature().toByteArray(), + proto.getDepositTx().toByteArray()); } @Override public String toString() { return "DelayedPayoutTxSignatureResponse{" + "\n senderNodeAddress=" + senderNodeAddress + - ",\n delayedPayoutTxSignature=" + Utilities.bytesAsHexString(delayedPayoutTxSignature) + + ",\n delayedPayoutTxBuyerSignature=" + Utilities.bytesAsHexString(delayedPayoutTxBuyerSignature) + + ",\n depositTx=" + Utilities.bytesAsHexString(depositTx) + "\n} " + super.toString(); } } diff --git a/core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java b/core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java index 4350afd226..631f1a9ca2 100644 --- a/core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java +++ b/core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java @@ -34,17 +34,17 @@ import lombok.Value; @Value public final class DepositTxMessage extends TradeMessage implements DirectMessage { private final NodeAddress senderNodeAddress; - private final byte[] depositTx; + private final byte[] depositTxWithoutWitnesses; public DepositTxMessage(String uid, String tradeId, NodeAddress senderNodeAddress, - byte[] depositTx) { + byte[] depositTxWithoutWitnesses) { this(Version.getP2PMessageVersion(), uid, tradeId, senderNodeAddress, - depositTx); + depositTxWithoutWitnesses); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -55,10 +55,10 @@ public final class DepositTxMessage extends TradeMessage implements DirectMessag String uid, String tradeId, NodeAddress senderNodeAddress, - byte[] depositTx) { + byte[] depositTxWithoutWitnesses) { super(messageVersion, tradeId, uid); this.senderNodeAddress = senderNodeAddress; - this.depositTx = depositTx; + this.depositTxWithoutWitnesses = depositTxWithoutWitnesses; } @Override @@ -68,7 +68,7 @@ public final class DepositTxMessage extends TradeMessage implements DirectMessag .setUid(uid) .setTradeId(tradeId) .setSenderNodeAddress(senderNodeAddress.toProtoMessage()) - .setDepositTx(ByteString.copyFrom(depositTx))) + .setDepositTxWithoutWitnesses(ByteString.copyFrom(depositTxWithoutWitnesses))) .build(); } @@ -77,14 +77,14 @@ public final class DepositTxMessage extends TradeMessage implements DirectMessag proto.getUid(), proto.getTradeId(), NodeAddress.fromProto(proto.getSenderNodeAddress()), - proto.getDepositTx().toByteArray()); + proto.getDepositTxWithoutWitnesses().toByteArray()); } @Override public String toString() { return "DepositTxMessage{" + "\n senderNodeAddress=" + senderNodeAddress + - ",\n depositTx=" + Utilities.bytesAsHexString(depositTx) + + ",\n depositTxWithoutWitnesses=" + Utilities.bytesAsHexString(depositTxWithoutWitnesses) + "\n} " + super.toString(); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java index 5e1c7cafff..311abacc13 100644 --- a/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java @@ -26,6 +26,7 @@ import bisq.core.trade.messages.PayoutTxPublishedMessage; import bisq.core.trade.protocol.tasks.ApplyFilter; import bisq.core.trade.protocol.tasks.TradeTask; import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness; +import bisq.core.trade.protocol.tasks.buyer.BuyerFinalizesDelayedPayoutTx; import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest; import bisq.core.trade.protocol.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse; import bisq.core.trade.protocol.tasks.buyer.BuyerSetupDepositTxListener; @@ -103,6 +104,7 @@ public class BuyerAsMakerProtocol extends BuyerProtocol implements MakerProtocol MakerRemovesOpenOffer.class, BuyerVerifiesPreparedDelayedPayoutTx.class, BuyerSignsDelayedPayoutTx.class, + BuyerFinalizesDelayedPayoutTx.class, BuyerSendsDelayedPayoutTxSignatureResponse.class) .withTimeout(30)) .executeTasks(); diff --git a/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java index 41de427050..1572f238ac 100644 --- a/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java @@ -29,6 +29,7 @@ import bisq.core.trade.messages.TradeMessage; import bisq.core.trade.protocol.tasks.ApplyFilter; import bisq.core.trade.protocol.tasks.TradeTask; import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness; +import bisq.core.trade.protocol.tasks.buyer.BuyerFinalizesDelayedPayoutTx; import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest; import bisq.core.trade.protocol.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse; import bisq.core.trade.protocol.tasks.buyer.BuyerSetupDepositTxListener; @@ -83,7 +84,10 @@ public class BuyerAsTakerProtocol extends BuyerProtocol implements TakerProtocol BuyerAsTakerCreatesDepositTxInputs.class, TakerSendInputsForDepositTxRequest.class) .withTimeout(30)) - .run(() -> processModel.setTempTradingPeerNodeAddress(trade.getTradingPeerNodeAddress())) + .run(() -> { + processModel.setTempTradingPeerNodeAddress(trade.getTradingPeerNodeAddress()); + processModel.getTradeManager().requestPersistence(); + }) .executeTasks(); } @@ -116,6 +120,7 @@ public class BuyerAsTakerProtocol extends BuyerProtocol implements TakerProtocol BuyerProcessDelayedPayoutTxSignatureRequest.class, BuyerVerifiesPreparedDelayedPayoutTx.class, BuyerSignsDelayedPayoutTx.class, + BuyerFinalizesDelayedPayoutTx.class, BuyerSendsDelayedPayoutTxSignatureResponse.class) .withTimeout(30)) .executeTasks(); diff --git a/core/src/main/java/bisq/core/trade/protocol/BuyerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/BuyerProtocol.java index ffff35a79b..1fee12e22b 100644 --- a/core/src/main/java/bisq/core/trade/protocol/BuyerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/BuyerProtocol.java @@ -147,7 +147,10 @@ public abstract class BuyerProtocol extends DisputeProtocol { errorMessageHandler.handleErrorMessage(errorMessage); handleTaskRunnerFault(event, errorMessage); }))) - .run(() -> trade.setState(Trade.State.BUYER_CONFIRMED_IN_UI_FIAT_PAYMENT_INITIATED)) + .run(() -> { + trade.setState(Trade.State.BUYER_CONFIRMED_IN_UI_FIAT_PAYMENT_INITIATED); + processModel.getTradeManager().requestPersistence(); + }) .executeTasks(); } diff --git a/core/src/main/java/bisq/core/trade/protocol/FluentProtocol.java b/core/src/main/java/bisq/core/trade/protocol/FluentProtocol.java index bf054e99c4..53815bfc07 100644 --- a/core/src/main/java/bisq/core/trade/protocol/FluentProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/FluentProtocol.java @@ -99,11 +99,13 @@ public class FluentProtocol { NodeAddress peer = condition.getPeer(); if (peer != null) { tradeProtocol.processModel.setTempTradingPeerNodeAddress(peer); + tradeProtocol.processModel.getTradeManager().requestPersistence(); } TradeMessage message = condition.getMessage(); if (message != null) { tradeProtocol.processModel.setTradeMessage(message); + tradeProtocol.processModel.getTradeManager().requestPersistence(); } TradeTaskRunner taskRunner = setup.getTaskRunner(message, condition.getEvent()); diff --git a/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java b/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java index 017e640fdd..ad0e10d671 100644 --- a/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java +++ b/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java @@ -294,6 +294,9 @@ public class ProcessModel implements Model, PersistablePayload { public void setPaymentStartedMessageState(MessageState paymentStartedMessageStateProperty) { this.paymentStartedMessageStateProperty.set(paymentStartedMessageStateProperty); + if (tradeManager != null) { + tradeManager.requestPersistence(); + } } void setDepositTxSentAckMessage(AckMessage ackMessage) { @@ -305,6 +308,9 @@ public class ProcessModel implements Model, PersistablePayload { public void setDepositTxMessageState(MessageState messageState) { this.depositTxMessageStateProperty.set(messageState); + if (tradeManager != null) { + tradeManager.requestPersistence(); + } } void witnessDebugLog(Trade trade) { diff --git a/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java index c8b62f6b48..19b3dea65a 100644 --- a/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java @@ -35,6 +35,7 @@ import bisq.core.trade.protocol.tasks.maker.MakerSetsLockTime; import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerFeePayment; import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx; import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx; import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerCreatesUnsignedDepositTx; import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerFinalizesDepositTx; import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerProcessDepositTxMessage; @@ -103,6 +104,7 @@ public class SellerAsMakerProtocol extends SellerProtocol implements MakerProtoc MakerRemovesOpenOffer.class, SellerAsMakerFinalizesDepositTx.class, SellerCreatesDelayedPayoutTx.class, + SellerSignsDelayedPayoutTx.class, SellerSendDelayedPayoutTxSignatureRequest.class) .withTimeout(30)) .executeTasks(); diff --git a/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java index afcd654d82..dfcf2d5957 100644 --- a/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java @@ -30,6 +30,7 @@ import bisq.core.trade.protocol.tasks.TradeTask; import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness; import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx; import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx; import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerCreatesDepositTxInputs; import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerSignsDepositTx; import bisq.core.trade.protocol.tasks.taker.CreateTakerFeeTx; @@ -98,6 +99,7 @@ public class SellerAsTakerProtocol extends SellerProtocol implements TakerProtoc TakerPublishFeeTx.class, SellerAsTakerSignsDepositTx.class, SellerCreatesDelayedPayoutTx.class, + SellerSignsDelayedPayoutTx.class, SellerSendDelayedPayoutTxSignatureRequest.class) .withTimeout(30)) .executeTasks(); diff --git a/core/src/main/java/bisq/core/trade/protocol/SellerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/SellerProtocol.java index dd138fc0f9..54d010eb7e 100644 --- a/core/src/main/java/bisq/core/trade/protocol/SellerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/SellerProtocol.java @@ -33,7 +33,6 @@ import bisq.core.trade.protocol.tasks.seller.SellerPublishesTradeStatistics; import bisq.core.trade.protocol.tasks.seller.SellerSendPayoutTxPublishedMessage; import bisq.core.trade.protocol.tasks.seller.SellerSendsDepositTxAndDelayedPayoutTxMessage; import bisq.core.trade.protocol.tasks.seller.SellerSignAndFinalizePayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx; import bisq.network.p2p.NodeAddress; @@ -77,7 +76,6 @@ public abstract class SellerProtocol extends DisputeProtocol { .with(message) .from(peer)) .setup(tasks(SellerProcessDelayedPayoutTxSignatureResponse.class, - SellerSignsDelayedPayoutTx.class, SellerFinalizesDelayedPayoutTx.class, SellerSendsDepositTxAndDelayedPayoutTxMessage.class, SellerPublishesDepositTx.class, @@ -99,7 +97,12 @@ public abstract class SellerProtocol extends DisputeProtocol { /////////////////////////////////////////////////////////////////////////////////////////// protected void handle(CounterCurrencyTransferStartedMessage message, NodeAddress peer) { - expect(phase(Trade.Phase.DEPOSIT_CONFIRMED) + // We are more tolerant with expected phase and allow also DEPOSIT_PUBLISHED as it can be the case + // that the wallet is still syncing and so the DEPOSIT_CONFIRMED state to yet triggered when we received + // a mailbox message with CounterCurrencyTransferStartedMessage. + // TODO A better fix would be to add a listener for the wallet sync state and process + // the mailbox msg once wallet is ready and trade state set. + expect(anyPhase(Trade.Phase.DEPOSIT_CONFIRMED, Trade.Phase.DEPOSIT_PUBLISHED) .with(message) .from(peer) .preCondition(trade.getPayoutTx() == null, @@ -141,7 +144,10 @@ public abstract class SellerProtocol extends DisputeProtocol { errorMessageHandler.handleErrorMessage(errorMessage); handleTaskRunnerFault(event, errorMessage); }))) - .run(() -> trade.setState(Trade.State.SELLER_CONFIRMED_IN_UI_FIAT_PAYMENT_RECEIPT)) + .run(() -> { + trade.setState(Trade.State.SELLER_CONFIRMED_IN_UI_FIAT_PAYMENT_RECEIPT); + processModel.getTradeManager().requestPersistence(); + }) .executeTasks(); } diff --git a/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java b/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java index af259e25c7..56fa61edb0 100644 --- a/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java @@ -30,7 +30,6 @@ import bisq.network.p2p.DecryptedDirectMessageListener; import bisq.network.p2p.DecryptedMessageWithPubKey; import bisq.network.p2p.MailboxMessage; import bisq.network.p2p.NodeAddress; -import bisq.network.p2p.P2PService; import bisq.network.p2p.SendMailboxMessageListener; import bisq.network.p2p.messaging.DecryptedMailboxListener; @@ -42,6 +41,8 @@ import bisq.common.taskrunner.Task; import java.security.PublicKey; +import java.util.concurrent.TimeUnit; + import lombok.extern.slf4j.Slf4j; import javax.annotation.Nullable; @@ -77,10 +78,17 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D if (!trade.isWithdrawn()) { processModel.getP2PService().addDecryptedDirectMessageListener(this); } - processModel.getP2PService().addDecryptedMailboxListener(this); - processModel.getP2PService().getMailboxItemsByUid().values() - .stream().map(P2PService.MailboxItem::getDecryptedMessageWithPubKey) - .forEach(this::handleDecryptedMessageWithPubKey); + + // We delay a bit here as the trade gets updated from the wallet to update the trade + // state (deposit confirmed) and that happens after our method is called. + // TODO To fix that in a better way we would need to change the order of some routines + // from the TradeManager, but as we are close to a release I dont want to risk a bigger + // change and leave that for a later PR + UserThread.runAfter(() -> { + processModel.getP2PService().addDecryptedMailboxListener(this); + processModel.getP2PService().getMailBoxMessages() + .forEach(this::handleDecryptedMessageWithPubKey); + }, 100, TimeUnit.MILLISECONDS); } public void onWithdrawCompleted() { @@ -138,7 +146,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D // We only remove here if we have already completed the trade. // Otherwise removal is done after successfully applied the task runner. if (trade.isWithdrawn()) { - processModel.getP2PService().removeEntryFromMailbox(decryptedMessageWithPubKey); + processModel.getP2PService().removeMailboxMsg(decryptedMessageWithPubKey); log.info("Remove {} from the P2P network.", tradeMessage.getClass().getSimpleName()); return; } @@ -152,7 +160,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D onAckMessage((AckMessage) networkEnvelope, peer); } // In any case we remove the msg - processModel.getP2PService().removeEntryFromMailbox(decryptedMessageWithPubKey); + processModel.getP2PService().removeMailboxMsg(decryptedMessageWithPubKey); log.info("Remove {} from the P2P network.", networkEnvelope.getClass().getSimpleName()); } } @@ -165,7 +173,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D PublicKey sigPubKey = processModel.getTradingPeer().getPubKeyRing().getSignaturePubKey(); // We reconstruct the DecryptedMessageWithPubKey from the message and the peers signature pubKey DecryptedMessageWithPubKey decryptedMessageWithPubKey = new DecryptedMessageWithPubKey(tradeMessage, sigPubKey); - processModel.getP2PService().removeEntryFromMailbox(decryptedMessageWithPubKey); + processModel.getP2PService().removeMailboxMsg(decryptedMessageWithPubKey); log.info("Remove {} from the P2P network.", tradeMessage.getClass().getSimpleName()); } } @@ -299,6 +307,8 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D log.error("Timeout reached. TradeID={}, state={}, timeoutSec={}", trade.getId(), trade.stateProperty().get(), timeoutSec); trade.setErrorMessage("Timeout reached. Protocol did not complete in " + timeoutSec + " sec."); + + processModel.getTradeManager().requestPersistence(); cleanup(); }, timeoutSec); } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java index a104b433b8..aab0bb5a3b 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java @@ -52,6 +52,8 @@ public class ProcessPeerPublishedDelayedPayoutTxMessage extends TradeTask { Transaction delayedPayoutTx = checkNotNull(trade.getDelayedPayoutTx()); WalletService.maybeAddSelfTxToWallet(delayedPayoutTx, processModel.getBtcWalletService().getWallet()); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java b/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java index bc6502a4c8..3c26433553 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java @@ -91,6 +91,7 @@ public abstract class SetupPayoutTxListener extends TradeTask { if (trade.getPayoutTx() == null) { Transaction walletTx = processModel.getTradeWalletService().getWalletTx(confidence.getTransactionHash()); trade.setPayoutTx(walletTx); + processModel.getTradeManager().requestPersistence(); BtcWalletService.printTx("payoutTx received from network", walletTx); setState(); } else { diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/TradeTask.java b/core/src/main/java/bisq/core/trade/protocol/tasks/TradeTask.java index f7aeeaeaa9..332b571f74 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/TradeTask.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/TradeTask.java @@ -37,9 +37,18 @@ public abstract class TradeTask extends Task { processModel = trade.getProcessModel(); } + @Override + protected void complete() { + processModel.getTradeManager().requestPersistence(); + + super.complete(); + } + @Override protected void failed() { trade.setErrorMessage(errorMessage); + processModel.getTradeManager().requestPersistence(); + super.failed(); } @@ -47,6 +56,8 @@ public abstract class TradeTask extends Task { protected void failed(String message) { appendToErrorMessage(message); trade.setErrorMessage(errorMessage); + processModel.getTradeManager().requestPersistence(); + super.failed(); } @@ -55,6 +66,8 @@ public abstract class TradeTask extends Task { t.printStackTrace(); appendExceptionToErrorMessage(t); trade.setErrorMessage(errorMessage); + processModel.getTradeManager().requestPersistence(); + super.failed(); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java new file mode 100644 index 0000000000..30824a14d7 --- /dev/null +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java @@ -0,0 +1,61 @@ +package bisq.core.trade.protocol.tasks.buyer; + +import bisq.core.btc.model.AddressEntry; +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.trade.Trade; +import bisq.core.trade.protocol.tasks.TradeTask; + +import bisq.common.taskrunner.TaskRunner; +import bisq.common.util.Utilities; + +import org.bitcoinj.core.Transaction; + +import java.util.Arrays; + +import lombok.extern.slf4j.Slf4j; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +@Slf4j +public class BuyerFinalizesDelayedPayoutTx extends TradeTask { + public BuyerFinalizesDelayedPayoutTx(TaskRunner taskHandler, Trade trade) { + super(taskHandler, trade); + } + + @Override + protected void run() { + try { + runInterceptHook(); + + BtcWalletService btcWalletService = processModel.getBtcWalletService(); + String id = processModel.getOffer().getId(); + Transaction preparedDepositTx = btcWalletService.getTxFromSerializedTx(processModel.getPreparedDepositTx()); + Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx()); + + byte[] buyerMultiSigPubKey = processModel.getMyMultiSigPubKey(); + checkArgument(Arrays.equals(buyerMultiSigPubKey, + btcWalletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()), + "buyerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id); + byte[] sellerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey(); + + byte[] buyerSignature = processModel.getDelayedPayoutTxSignature(); + byte[] sellerSignature = processModel.getTradingPeer().getDelayedPayoutTxSignature(); + + Transaction signedDelayedPayoutTx = processModel.getTradeWalletService().finalizeUnconnectedDelayedPayoutTx( + preparedDelayedPayoutTx, + buyerMultiSigPubKey, + sellerMultiSigPubKey, + buyerSignature, + sellerSignature, + preparedDepositTx.getOutput(0).getValue()); + + trade.applyDelayedPayoutTxBytes(signedDelayedPayoutTx.bitcoinSerialize()); + log.info("DelayedPayoutTxBytes = {}", Utilities.bytesAsHexString(trade.getDelayedPayoutTxBytes())); + + complete(); + } catch (Throwable t) { + failed(t); + } + } +} diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java index 806b90b05e..19cdb957f7 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java @@ -46,6 +46,7 @@ public class BuyerProcessDelayedPayoutTxSignatureRequest extends TradeTask { byte[] delayedPayoutTxAsBytes = checkNotNull(request.getDelayedPayoutTx()); Transaction preparedDelayedPayoutTx = processModel.getBtcWalletService().getTxFromSerializedTx(delayedPayoutTxAsBytes); processModel.setPreparedDelayedPayoutTx(preparedDelayedPayoutTx); + processModel.getTradingPeer().setDelayedPayoutTxSignature(checkNotNull(request.getDelayedPayoutTxSellerSignature())); // When we receive that message the taker has published the taker fee, so we apply it to the trade. // The takerFeeTx was sent in the first message. It should be part of DelayedPayoutTxSignatureRequest @@ -54,6 +55,8 @@ public class BuyerProcessDelayedPayoutTxSignatureRequest extends TradeTask { trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress()); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java index dfecf3abde..f57a6a7892 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java @@ -26,12 +26,16 @@ import bisq.core.trade.protocol.tasks.TradeTask; import bisq.core.util.Validator; import bisq.common.taskrunner.TaskRunner; +import bisq.common.util.Utilities; import org.bitcoinj.core.Transaction; import org.bitcoinj.wallet.Wallet; +import java.util.Arrays; + import lombok.extern.slf4j.Slf4j; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; @Slf4j @@ -59,9 +63,11 @@ public class BuyerProcessDepositTxAndDelayedPayoutTxMessage extends TradeTask { // To access tx confidence we need to add that tx into our wallet. byte[] delayedPayoutTxBytes = checkNotNull(message.getDelayedPayoutTx()); + checkArgument(Arrays.equals(delayedPayoutTxBytes, trade.getDelayedPayoutTxBytes()), + "mismatch between delayedPayoutTx received from peer and our one." + + "\n Expected: " + Utilities.bytesAsHexString(trade.getDelayedPayoutTxBytes()) + + "\n Received: " + Utilities.bytesAsHexString(delayedPayoutTxBytes)); trade.applyDelayedPayoutTxBytes(delayedPayoutTxBytes); - BtcWalletService.printTx("delayedPayoutTx received from peer", - checkNotNull(trade.getDelayedPayoutTx())); trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress()); @@ -73,6 +79,8 @@ public class BuyerProcessDepositTxAndDelayedPayoutTxMessage extends TradeTask { processModel.getBtcWalletService().swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.RESERVED_FOR_TRADE); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java index 45cd777a21..71c250b7b9 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java @@ -73,6 +73,8 @@ public class BuyerProcessPayoutTxPublishedMessage extends TradeTask { processModel.getAccountAgeWitnessService().publishOwnSignedWitness(signedWitness); } + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java index 5fd3032212..54a334c6d4 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java @@ -83,11 +83,15 @@ public class BuyerSendCounterCurrencyTransferStartedMessage extends SendMailboxM @Override protected void setStateSent() { trade.setStateIfValidTransitionTo(Trade.State.BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG); + + processModel.getTradeManager().requestPersistence(); } @Override protected void setStateArrived() { trade.setStateIfValidTransitionTo(Trade.State.BUYER_SAW_ARRIVED_FIAT_PAYMENT_INITIATED_MSG); + + processModel.getTradeManager().requestPersistence(); cleanup(); // Complete is called in base class } @@ -104,6 +108,7 @@ public class BuyerSendCounterCurrencyTransferStartedMessage extends SendMailboxM if (!trade.isPayoutPublished()) { tryToSendAgainLater(); } + processModel.getTradeManager().requestPersistence(); } // We override the default behaviour for onFault and do not call appendToErrorMessage and failed @@ -118,6 +123,7 @@ public class BuyerSendCounterCurrencyTransferStartedMessage extends SendMailboxM if (!trade.isPayoutPublished()) { tryToSendAgainLater(); } + processModel.getTradeManager().requestPersistence(); } @Override @@ -173,6 +179,9 @@ public class BuyerSendCounterCurrencyTransferStartedMessage extends SendMailboxM if (newValue == MessageState.ACKNOWLEDGED) { // We treat a ACK like BUYER_SAW_ARRIVED_FIAT_PAYMENT_INITIATED_MSG trade.setStateIfValidTransitionTo(Trade.State.BUYER_SAW_ARRIVED_FIAT_PAYMENT_INITIATED_MSG); + + processModel.getTradeManager().requestPersistence(); + cleanup(); complete(); } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java index 1cf373e788..5b9702798b 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java @@ -44,10 +44,15 @@ public class BuyerSendsDelayedPayoutTxSignatureResponse extends TradeTask { runInterceptHook(); byte[] delayedPayoutTxSignature = checkNotNull(processModel.getDelayedPayoutTxSignature()); + byte[] depositTxBytes = processModel.getDepositTx() != null + ? processModel.getDepositTx().bitcoinSerialize() // set in BuyerAsTakerSignsDepositTx task + : processModel.getPreparedDepositTx(); // set in BuyerAsMakerCreatesAndSignsDepositTx task + DelayedPayoutTxSignatureResponse message = new DelayedPayoutTxSignatureResponse(UUID.randomUUID().toString(), processModel.getOfferId(), processModel.getMyNodeAddress(), - delayedPayoutTxSignature); + delayedPayoutTxSignature, + depositTxBytes); NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress(); log.info("Send {} to peer {}. tradeId={}, uid={}", diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java index 32a4506efa..f78156ef5e 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java @@ -100,6 +100,8 @@ public class BuyerSetupDepositTxListener extends TradeTask { // We don't want to trigger the tradeStateSubscription when setting the state, so we unsubscribe before unSubscribeAndRemoveListener(); trade.setState(Trade.State.BUYER_SAW_DEPOSIT_TX_IN_NETWORK); + + processModel.getTradeManager().requestPersistence(); } else { unSubscribeAndRemoveListener(); } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupPayoutTxListener.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupPayoutTxListener.java index 8f06c187ba..c58ce41ef1 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupPayoutTxListener.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupPayoutTxListener.java @@ -45,5 +45,7 @@ public class BuyerSetupPayoutTxListener extends SetupPayoutTxListener { @Override protected void setState() { trade.setStateIfValidTransitionTo(Trade.State.BUYER_SAW_PAYOUT_TX_IN_NETWORK); + + processModel.getTradeManager().requestPersistence(); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java index 728ed40550..70dd1b8074 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java @@ -81,6 +81,8 @@ public class BuyerSignPayoutTx extends TradeTask { sellerMultiSigPubKey); processModel.setPayoutTxSignature(payoutTxSignature); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java index 2008b92b40..cab7fc896b 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java @@ -24,6 +24,7 @@ import bisq.core.trade.protocol.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; +import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.Transaction; import org.bitcoinj.crypto.DeterministicKey; @@ -46,7 +47,11 @@ public class BuyerSignsDelayedPayoutTx extends TradeTask { runInterceptHook(); Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx()); + BtcWalletService btcWalletService = processModel.getBtcWalletService(); + NetworkParameters params = btcWalletService.getParams(); + Transaction preparedDepositTx = new Transaction(params, processModel.getPreparedDepositTx()); + String id = processModel.getOffer().getId(); byte[] buyerMultiSigPubKey = processModel.getMyMultiSigPubKey(); @@ -58,11 +63,14 @@ public class BuyerSignsDelayedPayoutTx extends TradeTask { byte[] sellerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey(); byte[] delayedPayoutTxSignature = processModel.getTradeWalletService().signDelayedPayoutTx( preparedDelayedPayoutTx, + preparedDepositTx, myMultiSigKeyPair, buyerMultiSigPubKey, sellerMultiSigPubKey); processModel.setDelayedPayoutTxSignature(delayedPayoutTxSignature); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java index f46f792a67..5f259b5574 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java @@ -25,6 +25,8 @@ import bisq.common.taskrunner.TaskRunner; import lombok.extern.slf4j.Slf4j; +import static com.google.common.base.Preconditions.checkNotNull; + @Slf4j public class BuyerVerifiesPreparedDelayedPayoutTx extends TradeTask { public BuyerVerifiesPreparedDelayedPayoutTx(TaskRunner taskHandler, Trade trade) { @@ -36,11 +38,22 @@ public class BuyerVerifiesPreparedDelayedPayoutTx extends TradeTask { try { runInterceptHook(); + var preparedDelayedPayoutTx = processModel.getPreparedDelayedPayoutTx(); TradeDataValidation.validateDelayedPayoutTx(trade, - processModel.getPreparedDelayedPayoutTx(), + preparedDelayedPayoutTx, processModel.getDaoFacade(), processModel.getBtcWalletService()); + // If the deposit tx is non-malleable, we already know its final ID, so should check that now + // before sending any further data to the seller, to provide extra protection for the buyer. + if (isDepositTxNonMalleable()) { + var preparedDepositTx = processModel.getBtcWalletService().getTxFromSerializedTx( + processModel.getPreparedDepositTx()); + TradeDataValidation.validatePayoutTxInput(preparedDepositTx, checkNotNull(preparedDelayedPayoutTx)); + } else { + log.info("Deposit tx is malleable, so we skip preparedDelayedPayoutTx input validation."); + } + complete(); } catch (TradeDataValidation.ValidationException e) { failed(e.getMessage()); @@ -48,4 +61,12 @@ public class BuyerVerifiesPreparedDelayedPayoutTx extends TradeTask { failed(t); } } + + private boolean isDepositTxNonMalleable() { + var buyerInputs = checkNotNull(processModel.getRawTransactionInputs()); + var sellerInputs = checkNotNull(processModel.getTradingPeer().getRawTransactionInputs()); + + return buyerInputs.stream().allMatch(processModel.getTradeWalletService()::isP2WH) && + sellerInputs.stream().allMatch(processModel.getTradeWalletService()::isP2WH); + } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java index 29459b1c95..4fc92bda03 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java @@ -72,6 +72,8 @@ public class BuyerAsMakerCreatesAndSignsDepositTx extends TradeTask { .add(tradeAmount); List takerRawTransactionInputs = checkNotNull(tradingPeer.getRawTransactionInputs()); + checkArgument(takerRawTransactionInputs.stream().allMatch(processModel.getTradeWalletService()::isP2WH), + "all takerRawTransactionInputs must be P2WH"); long takerChangeOutputValue = tradingPeer.getChangeOutputValue(); @Nullable String takerChangeAddressString = tradingPeer.getChangeOutputAddress(); Address makerAddress = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.RESERVED_FOR_TRADE).getAddress(); @@ -97,6 +99,8 @@ public class BuyerAsMakerCreatesAndSignsDepositTx extends TradeTask { processModel.setPreparedDepositTx(result.depositTransaction); processModel.setRawTransactionInputs(result.rawMakerInputs); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java index ebc60a4c65..85de45cf24 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java @@ -22,6 +22,8 @@ import bisq.core.trade.protocol.tasks.maker.MakerSendsInputsForDepositTxResponse import bisq.common.taskrunner.TaskRunner; +import org.bitcoinj.core.Transaction; + import lombok.extern.slf4j.Slf4j; @Slf4j @@ -32,6 +34,9 @@ public class BuyerAsMakerSendsInputsForDepositTxResponse extends MakerSendsInput @Override protected byte[] getPreparedDepositTx() { - return processModel.getPreparedDepositTx(); + Transaction preparedDepositTx = processModel.getBtcWalletService().getTxFromSerializedTx(processModel.getPreparedDepositTx()); + // Remove witnesses from preparedDepositTx, so that the seller can still compute the final + // tx id, but cannot publish it before providing the buyer with a signed delayed payout tx. + return preparedDepositTx.bitcoinSerialize(false); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java index 0e91151643..0277ca7b76 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java @@ -53,6 +53,8 @@ public class BuyerAsTakerCreatesDepositTxInputs extends TradeTask { processModel.setChangeOutputValue(result.changeOutputValue); processModel.setChangeOutputAddress(result.changeOutputAddress); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java index 08682bce8b..ab03ece48a 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java @@ -41,10 +41,12 @@ public class BuyerAsTakerSendsDepositTxMessage extends TradeTask { try { runInterceptHook(); if (processModel.getDepositTx() != null) { + // Remove witnesses from the sent depositTx, so that the seller can still compute the final + // tx id, but cannot publish it before providing the buyer with a signed delayed payout tx. DepositTxMessage message = new DepositTxMessage(UUID.randomUUID().toString(), processModel.getOfferId(), processModel.getMyNodeAddress(), - processModel.getDepositTx().bitcoinSerialize()); + processModel.getDepositTx().bitcoinSerialize(false)); NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress(); log.info("Send {} to peer {}. tradeId={}, uid={}", @@ -72,7 +74,7 @@ public class BuyerAsTakerSendsDepositTxMessage extends TradeTask { } ); } else { - log.error("processModel.getDepositTx() = " + processModel.getDepositTx()); + log.error("processModel.getDepositTx() = {}", processModel.getDepositTx()); failed("DepositTx is null"); } } catch (Throwable t) { diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java index 1ad8d8da53..24f988120d 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java @@ -88,6 +88,8 @@ public class BuyerAsTakerSignsDepositTx extends TradeTask { sellerMultiSigPubKey); processModel.setDepositTx(depositTx); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java index ebc2ee2d9a..4c9d05c4c3 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java @@ -95,6 +95,8 @@ public class MakerCreateAndSignContract extends TradeTask { processModel.setMyMultiSigPubKey(makerMultiSigPubKey); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java index 8831d8eab0..34380f5bcf 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java @@ -89,7 +89,7 @@ public abstract class MakerSendsInputsForDepositTxResponse extends TradeTask { trade.getLockTime()); trade.setState(Trade.State.MAKER_SENT_PUBLISH_DEPOSIT_TX_REQUEST); - + processModel.getTradeManager().requestPersistence(); NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress(); log.info("Send {} to peer {}. tradeId={}, uid={}", message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); @@ -103,6 +103,7 @@ public abstract class MakerSendsInputsForDepositTxResponse extends TradeTask { log.info("{} arrived at peer {}. tradeId={}, uid={}", message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); trade.setState(Trade.State.MAKER_SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST); + processModel.getTradeManager().requestPersistence(); complete(); } @@ -112,6 +113,7 @@ public abstract class MakerSendsInputsForDepositTxResponse extends TradeTask { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid(), errorMessage); trade.setState(Trade.State.MAKER_SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST); appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage); + processModel.getTradeManager().requestPersistence(); failed(errorMessage); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java index 3e55cee481..fde4359bec 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java @@ -47,6 +47,8 @@ public class MakerSetsLockTime extends TradeTask { log.info("lockTime={}, delay={}", lockTime, delay); trade.setLockTime(lockTime); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/BroadcastMediatedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/BroadcastMediatedPayoutTx.java index 7d67edc7d5..7ebfa20ce5 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/BroadcastMediatedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/BroadcastMediatedPayoutTx.java @@ -45,5 +45,6 @@ public class BroadcastMediatedPayoutTx extends BroadcastPayoutTx { @Override protected void setState() { trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED); + processModel.getTradeManager().requestPersistence(); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java index b9e43a8427..87a8bdf32e 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java @@ -108,6 +108,8 @@ public class FinalizeMediatedPayoutTx extends TradeTask { trade.setPayoutTx(transaction); + processModel.getTradeManager().requestPersistence(); + walletService.swapTradeEntryToAvailableEntry(tradeId, AddressEntry.Context.MULTI_SIG); complete(); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java index ea1a02a02a..ba0aad7204 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java @@ -51,6 +51,8 @@ public class ProcessMediatedPayoutSignatureMessage extends TradeTask { trade.setMediationResultState(MediationResultState.RECEIVED_SIG_MSG); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java index 226fefbb5a..8e5b08a068 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java @@ -74,6 +74,9 @@ public class ProcessMediatedPayoutTxPublishedMessage extends TradeTask { } else { log.info("We got the payout tx already set from BuyerSetupPayoutTxListener and do nothing here. trade ID={}", trade.getId()); } + + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutSignatureMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutSignatureMessage.java index e897027119..22bc9f93b1 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutSignatureMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutSignatureMessage.java @@ -60,6 +60,7 @@ public class SendMediatedPayoutSignatureMessage extends TradeTask { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); trade.setMediationResultState(MediationResultState.SIG_MSG_SENT); + processModel.getTradeManager().requestPersistence(); p2PService.sendEncryptedMailboxMessage(peersNodeAddress, peersPubKeyRing, message, @@ -70,6 +71,7 @@ public class SendMediatedPayoutSignatureMessage extends TradeTask { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); trade.setMediationResultState(MediationResultState.SIG_MSG_ARRIVED); + processModel.getTradeManager().requestPersistence(); complete(); } @@ -79,6 +81,7 @@ public class SendMediatedPayoutSignatureMessage extends TradeTask { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); trade.setMediationResultState(MediationResultState.SIG_MSG_IN_MAILBOX); + processModel.getTradeManager().requestPersistence(); complete(); } @@ -88,6 +91,7 @@ public class SendMediatedPayoutSignatureMessage extends TradeTask { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid(), errorMessage); trade.setMediationResultState(MediationResultState.SIG_MSG_SEND_FAILED); appendToErrorMessage("Sending message failed: message=" + message + "\nerrorMessage=" + errorMessage); + processModel.getTradeManager().requestPersistence(); failed(errorMessage); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java index 8cadcbeaec..c4c4287920 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java @@ -54,21 +54,25 @@ public class SendMediatedPayoutTxPublishedMessage extends SendMailboxMessageTask @Override protected void setStateSent() { trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED_MSG_SENT); + processModel.getTradeManager().requestPersistence(); } @Override protected void setStateArrived() { trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED_MSG_ARRIVED); + processModel.getTradeManager().requestPersistence(); } @Override protected void setStateStoredInMailbox() { trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED_MSG_IN_MAILBOX); + processModel.getTradeManager().requestPersistence(); } @Override protected void setStateFault() { trade.setMediationResultState(MediationResultState.PAYOUT_TX_PUBLISHED_MSG_SEND_FAILED); + processModel.getTradeManager().requestPersistence(); } @Override diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SetupMediatedPayoutTxListener.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SetupMediatedPayoutTxListener.java index 8f0ee2b106..dc0b60b314 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SetupMediatedPayoutTxListener.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SetupMediatedPayoutTxListener.java @@ -49,5 +49,6 @@ public class SetupMediatedPayoutTxListener extends SetupPayoutTxListener { if (trade.getPayoutTx() != null) { processModel.getTradeManager().closeDisputedTrade(trade.getId(), Trade.DisputeState.MEDIATION_CLOSED); } + processModel.getTradeManager().requestPersistence(); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java index 3c145b981a..6699d83200 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java @@ -99,6 +99,8 @@ public class SignMediatedPayoutTx extends TradeTask { sellerMultiSigPubKey); processModel.setMediatedPayoutTxSignature(mediatedPayoutTxSignature); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerBroadcastPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerBroadcastPayoutTx.java index 2ab775d80c..d0a0f6c20d 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerBroadcastPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerBroadcastPayoutTx.java @@ -44,5 +44,6 @@ public class SellerBroadcastPayoutTx extends BroadcastPayoutTx { @Override protected void setState() { trade.setState(Trade.State.SELLER_PUBLISHED_PAYOUT_TX); + processModel.getTradeManager().requestPersistence(); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java index aaf667c41d..a466f11264 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java @@ -20,6 +20,7 @@ package bisq.core.trade.protocol.tasks.seller; import bisq.core.btc.wallet.TradeWalletService; import bisq.core.dao.governance.param.Param; import bisq.core.trade.Trade; +import bisq.core.trade.TradeDataValidation; import bisq.core.trade.protocol.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -53,9 +54,15 @@ public class SellerCreatesDelayedPayoutTx extends TradeTask { donationAddressString, minerFee, lockTime); + TradeDataValidation.validateDelayedPayoutTx(trade, + preparedDelayedPayoutTx, + processModel.getDaoFacade(), + processModel.getBtcWalletService()); processModel.setPreparedDelayedPayoutTx(preparedDelayedPayoutTx); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java index 720c1a9f04..2683e52602 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java @@ -68,6 +68,8 @@ public class SellerFinalizesDelayedPayoutTx extends TradeTask { trade.applyDelayedPayoutTx(signedDelayedPayoutTx); log.info("DelayedPayoutTxBytes = {}", Utilities.bytesAsHexString(trade.getDelayedPayoutTxBytes())); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java index 5f8d6bc50e..9cbba9b670 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java @@ -61,6 +61,8 @@ public class SellerProcessCounterCurrencyTransferStartedMessage extends TradeTas trade.setState(Trade.State.SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java index c47fd0be06..33d60965a4 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java @@ -42,11 +42,18 @@ public class SellerProcessDelayedPayoutTxSignatureResponse extends TradeTask { checkNotNull(response); checkTradeId(processModel.getOfferId(), response); - processModel.getTradingPeer().setDelayedPayoutTxSignature(checkNotNull(response.getDelayedPayoutTxSignature())); + processModel.getTradingPeer().setDelayedPayoutTxSignature(checkNotNull(response.getDelayedPayoutTxBuyerSignature())); + + processModel.getTradeWalletService().sellerAddsBuyerWitnessesToDepositTx( + processModel.getDepositTx(), + processModel.getBtcWalletService().getTxFromSerializedTx(response.getDepositTx()) + ); // update to the latest peer address of our peer if the message is correct trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress()); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java index 1cdc2e4358..1afae6dad3 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java @@ -54,6 +54,8 @@ public class SellerPublishesDepositTx extends TradeTask { processModel.getBtcWalletService().swapTradeEntryToAvailableEntry(processModel.getOffer().getId(), AddressEntry.Context.RESERVED_FOR_TRADE); + processModel.getTradeManager().requestPersistence(); + complete(); } else { log.warn("We got the onSuccess callback called after the timeout has been triggered a complete()."); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java index b914f1b129..58cfe2da58 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java @@ -47,10 +47,13 @@ public class SellerSendDelayedPayoutTxSignatureRequest extends TradeTask { Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx(), "processModel.getPreparedDelayedPayoutTx() must not be null"); + byte[] delayedPayoutTxSignature = checkNotNull(processModel.getDelayedPayoutTxSignature(), + "processModel.getDelayedPayoutTxSignature() must not be null"); DelayedPayoutTxSignatureRequest message = new DelayedPayoutTxSignatureRequest(UUID.randomUUID().toString(), processModel.getOfferId(), processModel.getMyNodeAddress(), - preparedDelayedPayoutTx.bitcoinSerialize()); + preparedDelayedPayoutTx.bitcoinSerialize(), + delayedPayoutTxSignature); NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress(); log.info("Send {} to peer {}. tradeId={}, uid={}", diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendPayoutTxPublishedMessage.java index db73f1910a..a7da42bece 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendPayoutTxPublishedMessage.java @@ -65,6 +65,7 @@ public class SellerSendPayoutTxPublishedMessage extends SendMailboxMessageTask { trade.setState(Trade.State.SELLER_SENT_PAYOUT_TX_PUBLISHED_MSG); log.info("Sent PayoutTxPublishedMessage: tradeId={} at peer {} SignedWitness {}", trade.getId(), trade.getTradingPeerNodeAddress(), signedWitness); + processModel.getTradeManager().requestPersistence(); } @Override @@ -72,6 +73,7 @@ public class SellerSendPayoutTxPublishedMessage extends SendMailboxMessageTask { trade.setState(Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG); log.info("PayoutTxPublishedMessage arrived: tradeId={} at peer {} SignedWitness {}", trade.getId(), trade.getTradingPeerNodeAddress(), signedWitness); + processModel.getTradeManager().requestPersistence(); } @Override @@ -79,6 +81,7 @@ public class SellerSendPayoutTxPublishedMessage extends SendMailboxMessageTask { trade.setState(Trade.State.SELLER_STORED_IN_MAILBOX_PAYOUT_TX_PUBLISHED_MSG); log.info("PayoutTxPublishedMessage storedInMailbox: tradeId={} at peer {} SignedWitness {}", trade.getId(), trade.getTradingPeerNodeAddress(), signedWitness); + processModel.getTradeManager().requestPersistence(); } @Override @@ -86,6 +89,7 @@ public class SellerSendPayoutTxPublishedMessage extends SendMailboxMessageTask { trade.setState(Trade.State.SELLER_SEND_FAILED_PAYOUT_TX_PUBLISHED_MSG); log.error("PayoutTxPublishedMessage failed: tradeId={} at peer {} SignedWitness {}", trade.getId(), trade.getTradingPeerNodeAddress(), signedWitness); + processModel.getTradeManager().requestPersistence(); } @Override diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java index e46a88fcdc..18768093f7 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java @@ -76,11 +76,15 @@ public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends SendMailboxMe @Override protected void setStateSent() { trade.setStateIfValidTransitionTo(Trade.State.SELLER_SENT_DEPOSIT_TX_PUBLISHED_MSG); + + processModel.getTradeManager().requestPersistence(); } @Override protected void setStateArrived() { trade.setStateIfValidTransitionTo(Trade.State.SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG); + + processModel.getTradeManager().requestPersistence(); cleanup(); // Complete is called in base class } @@ -94,6 +98,8 @@ public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends SendMailboxMe @Override protected void setStateStoredInMailbox() { trade.setStateIfValidTransitionTo(Trade.State.SELLER_STORED_IN_MAILBOX_DEPOSIT_TX_PUBLISHED_MSG); + + processModel.getTradeManager().requestPersistence(); // The DepositTxAndDelayedPayoutTxMessage is a mailbox message as earlier we use only the deposit tx which can // be also received from the network once published. // Now we send the delayed payout tx as well and with that this message is mandatory for continuing the protocol. @@ -119,6 +125,8 @@ public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends SendMailboxMe if (!trade.isDepositConfirmed()) { tryToSendAgainLater(); } + + processModel.getTradeManager().requestPersistence(); } @Override @@ -173,6 +181,8 @@ public class SellerSendsDepositTxAndDelayedPayoutTxMessage extends SendMailboxMe if (newValue == MessageState.ACKNOWLEDGED) { // We treat a ACK like SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG trade.setStateIfValidTransitionTo(Trade.State.SELLER_SAW_ARRIVED_DEPOSIT_TX_PUBLISHED_MSG); + + processModel.getTradeManager().requestPersistence(); cleanup(); complete(); } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java index eb5bd3aa99..34f645896b 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java @@ -100,6 +100,8 @@ public class SellerSignAndFinalizePayoutTx extends TradeTask { trade.setPayoutTx(transaction); + processModel.getTradeManager().requestPersistence(); + walletService.swapTradeEntryToAvailableEntry(id, AddressEntry.Context.MULTI_SIG); complete(); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java index 0ae1a15920..adabac92eb 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java @@ -24,6 +24,7 @@ import bisq.core.trade.protocol.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; +import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.Transaction; import org.bitcoinj.crypto.DeterministicKey; @@ -47,6 +48,9 @@ public class SellerSignsDelayedPayoutTx extends TradeTask { Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx()); BtcWalletService btcWalletService = processModel.getBtcWalletService(); + NetworkParameters params = btcWalletService.getParams(); + Transaction preparedDepositTx = new Transaction(params, processModel.getPreparedDepositTx()); + String id = processModel.getOffer().getId(); byte[] sellerMultiSigPubKey = processModel.getMyMultiSigPubKey(); @@ -59,12 +63,15 @@ public class SellerSignsDelayedPayoutTx extends TradeTask { byte[] delayedPayoutTxSignature = processModel.getTradeWalletService().signDelayedPayoutTx( preparedDelayedPayoutTx, + preparedDepositTx, myMultiSigKeyPair, buyerMultiSigPubKey, sellerMultiSigPubKey); processModel.setDelayedPayoutTxSignature(delayedPayoutTxSignature); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java index 5caf031bfe..160074e991 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java @@ -78,6 +78,8 @@ public class SellerAsMakerCreatesUnsignedDepositTx extends TradeTask { .add(offer.getBuyerSecurityDeposit()); List takerRawTransactionInputs = checkNotNull(tradingPeer.getRawTransactionInputs()); + checkArgument(takerRawTransactionInputs.stream().allMatch(processModel.getTradeWalletService()::isP2WH), + "all takerRawTransactionInputs must be P2WH"); long takerChangeOutputValue = tradingPeer.getChangeOutputValue(); String takerChangeAddressString = tradingPeer.getChangeOutputAddress(); Address makerAddress = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.RESERVED_FOR_TRADE).getAddress(); @@ -103,6 +105,8 @@ public class SellerAsMakerCreatesUnsignedDepositTx extends TradeTask { processModel.setPreparedDepositTx(result.depositTransaction); processModel.setRawTransactionInputs(result.rawMakerInputs); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java index 1a580b2fc7..3902668f82 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java @@ -48,6 +48,8 @@ public class SellerAsMakerFinalizesDepositTx extends TradeTask { processModel.setDepositTx(myDepositTx); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java index ea61b2fa50..0433347f84 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java @@ -43,7 +43,7 @@ public class SellerAsMakerProcessDepositTxMessage extends TradeTask { Validator.checkTradeId(processModel.getOfferId(), message); checkNotNull(message); - processModel.getTradingPeer().setPreparedDepositTx(checkNotNull(message.getDepositTx())); + processModel.getTradingPeer().setPreparedDepositTx(checkNotNull(message.getDepositTxWithoutWitnesses())); trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress()); // When we receive that message the taker has published the taker fee, so we apply it to the trade. @@ -51,6 +51,8 @@ public class SellerAsMakerProcessDepositTxMessage extends TradeTask { // but that cannot be changed due backward compatibility issues. It is a left over from the old trade protocol. trade.setTakerFeeTxId(processModel.getTakeOfferFeeTxId()); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java index c44adea75b..e22d7b3dc5 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java @@ -41,6 +41,10 @@ public class SellerAsMakerSendsInputsForDepositTxResponse extends MakerSendsInpu // before we have received his signature for the delayed payout tx. input.setScriptSig(new Script(new byte[]{})); }); - return preparedDepositTx.bitcoinSerialize(); + + processModel.getTradeManager().requestPersistence(); + + // Make sure witnesses are removed as well before sending, to cover the segwit case. + return preparedDepositTx.bitcoinSerialize(false); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java index 9240e9f8d1..7aa4118e6e 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java @@ -57,6 +57,8 @@ public class SellerAsTakerCreatesDepositTxInputs extends TradeTask { processModel.setChangeOutputValue(result.changeOutputValue); processModel.setChangeOutputAddress(result.changeOutputAddress); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java index 16b4084eb9..887cbcf763 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java @@ -83,6 +83,8 @@ public class SellerAsTakerSignsDepositTx extends TradeTask { // We set the deposit tx to trade once we have it published processModel.setDepositTx(depositTx); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { Contract contract = trade.getContract(); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java index e2dd1ed13b..e646802008 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java @@ -100,6 +100,9 @@ public class CreateTakerFeeTx extends TradeTask { processModel.setTakeOfferFeeTx(transaction); walletService.swapTradeEntryToAvailableEntry(id, AddressEntry.Context.OFFER_FUNDING); + + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { if (t instanceof DaoDisabledException) { diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java index 1a84e311c4..11218d6fef 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java @@ -83,6 +83,8 @@ public class TakerProcessesInputsForDepositTxResponse extends TradeTask { // update to the latest peer address of our peer if the message is correct trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress()); + processModel.getTradeManager().requestPersistence(); + complete(); } catch (Throwable t) { failed(t); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerPublishFeeTx.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerPublishFeeTx.java index a1c4914a49..6324f74e00 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerPublishFeeTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerPublishFeeTx.java @@ -110,6 +110,9 @@ public class TakerPublishFeeTx extends TradeTask { if (transaction != null) { trade.setTakerFeeTxId(transaction.getTxId().toString()); trade.setState(Trade.State.TAKER_PUBLISHED_TAKER_FEE_TX); + + processModel.getTradeManager().requestPersistence(); + complete(); } } else { diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java index 1170e18074..89b201b4ad 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java @@ -129,6 +129,9 @@ public class TakerSendInputsForDepositTxRequest extends TradeTask { log.info("Send {} with offerId {} and uid {} to peer {}", request.getClass().getSimpleName(), request.getTradeId(), request.getUid(), trade.getTradingPeerNodeAddress()); + + processModel.getTradeManager().requestPersistence(); + processModel.getP2PService().sendEncryptedDirectMessage( trade.getTradingPeerNodeAddress(), processModel.getTradingPeer().getPubKeyRing(), diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java index 15fef9aa32..afe14cba20 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java @@ -114,6 +114,8 @@ public class TakerVerifyAndSignContract extends TradeTask { trade.setContractHash(contractHash); trade.setTakerContractSignature(signature); + + processModel.getTradeManager().requestPersistence(); try { checkNotNull(maker.getPubKeyRing(), "maker.getPubKeyRing() must nto be null"); Sig.verify(maker.getPubKeyRing().getSignaturePubKey(), diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2StorageService.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2StorageService.java index 2702494390..29855fefe8 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2StorageService.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2StorageService.java @@ -77,14 +77,13 @@ public class TradeStatistics2StorageService extends MapStoreService completeHandler.run()); } public Map getMapOfAllData() { diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java index 8f4cf09d15..10a5989bba 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java @@ -144,7 +144,9 @@ public final class TradeStatistics3 implements ProcessOncePersistableNetworkPayl BLOCK_CHAINS, PROMPT_PAY, ADVANCED_CASH, - BLOCK_CHAINS_INSTANT + BLOCK_CHAINS_INSTANT, + TRANSFERWISE, + AMAZON_GIFT_CARD } @Getter diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3Store.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3Store.java index 7c79778d4e..53b7e3281c 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3Store.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3Store.java @@ -35,7 +35,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class TradeStatistics3Store extends PersistableNetworkPayloadStore { - TradeStatistics3Store() { + public TradeStatistics3Store() { } diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java index 83ae72b85b..044018c018 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java @@ -40,11 +40,14 @@ import javax.inject.Singleton; import javafx.collections.FXCollections; import javafx.collections.ObservableSet; +import java.time.Instant; + import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; @@ -135,6 +138,24 @@ public class TradeStatisticsManager { .collect(Collectors.toCollection(ArrayList::new)); cryptoCurrencyList.add(0, new CurrencyTuple(Res.getBaseCurrencyCode(), Res.getBaseCurrencyName(), 8)); jsonFileManager.writeToDiscThreaded(Utilities.objectToJson(cryptoCurrencyList), "crypto_currency_list"); + + Instant yearAgo = Instant.ofEpochSecond(Instant.now().getEpochSecond() - TimeUnit.DAYS.toSeconds(365)); + Set activeCurrencies = observableTradeStatisticsSet.stream() + .filter(e -> e.getDate().toInstant().isAfter(yearAgo)) + .map(p -> p.getCurrency()) + .collect(Collectors.toSet()); + + ArrayList activeFiatCurrencyList = fiatCurrencyList.stream() + .filter(e -> activeCurrencies.contains(e.code)) + .map(e -> new CurrencyTuple(e.code, e.name, 8)) + .collect(Collectors.toCollection(ArrayList::new)); + jsonFileManager.writeToDiscThreaded(Utilities.objectToJson(activeFiatCurrencyList), "active_fiat_currency_list"); + + ArrayList activeCryptoCurrencyList = cryptoCurrencyList.stream() + .filter(e -> activeCurrencies.contains(e.code)) + .map(e -> new CurrencyTuple(e.code, e.name, 8)) + .collect(Collectors.toCollection(ArrayList::new)); + jsonFileManager.writeToDiscThreaded(Utilities.objectToJson(activeCryptoCurrencyList), "active_crypto_currency_list"); } List list = observableTradeStatisticsSet.stream() diff --git a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java index d7a1e84bc1..2d0efe887d 100644 --- a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java +++ b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java @@ -17,6 +17,7 @@ package bisq.core.trade.txproof.xmr; +import bisq.core.filter.FilterManager; import bisq.core.locale.Res; import bisq.core.support.dispute.Dispute; import bisq.core.support.dispute.mediation.MediationManager; @@ -54,6 +55,7 @@ class XmrTxProofRequestsPerTrade implements AssetTxProofRequestsPerTrade { private final Trade trade; private final AutoConfirmSettings autoConfirmSettings; private final MediationManager mediationManager; + private final FilterManager filterManager; private final RefundManager refundManager; private final Socks5ProxyProvider socks5ProxyProvider; @@ -74,11 +76,13 @@ class XmrTxProofRequestsPerTrade implements AssetTxProofRequestsPerTrade { Trade trade, AutoConfirmSettings autoConfirmSettings, MediationManager mediationManager, + FilterManager filterManager, RefundManager refundManager) { this.socks5ProxyProvider = socks5ProxyProvider; this.trade = trade; this.autoConfirmSettings = autoConfirmSettings; this.mediationManager = mediationManager; + this.filterManager = filterManager; this.refundManager = refundManager; } @@ -140,6 +144,10 @@ class XmrTxProofRequestsPerTrade implements AssetTxProofRequestsPerTrade { numRequiredSuccessResults = serviceAddresses.size(); for (String serviceAddress : serviceAddresses) { + if (filterManager.isAutoConfExplorerBanned(serviceAddress)) { + log.warn("Filtered out auto-confirmation address: {}", serviceAddress); + continue; // #4683: filter for auto-confirm explorers + } XmrTxProofModel model = new XmrTxProofModel(trade, serviceAddress, autoConfirmSettings); XmrTxProofRequest request = new XmrTxProofRequest(socks5ProxyProvider, model); diff --git a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java index 30349d3f78..9e9ca4c908 100644 --- a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java +++ b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java @@ -257,6 +257,7 @@ public class XmrTxProofService implements AssetTxProofService { trade, autoConfirmSettings, mediationManager, + filterManager, refundManager); servicesByTradeId.put(trade.getId(), service); service.requestFromAllServices( diff --git a/core/src/main/java/bisq/core/user/Preferences.java b/core/src/main/java/bisq/core/user/Preferences.java index 656f056522..5e6aee6287 100644 --- a/core/src/main/java/bisq/core/user/Preferences.java +++ b/core/src/main/java/bisq/core/user/Preferences.java @@ -117,20 +117,17 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid public static final ArrayList BSQ_MAIN_NET_EXPLORERS = new ArrayList<>(Arrays.asList( new BlockChainExplorer("mempool.space (@wiz)", "https://mempool.space/bisq/tx/", "https://mempool.space/bisq/address/"), new BlockChainExplorer("mempool.emzy.de (@emzy)", "https://mempool.emzy.de/bisq/tx/", "https://mempool.emzy.de/bisq/address/"), - new BlockChainExplorer("mempool.bisq.services (@devinbileck)", "https://mempool.bisq.services/bisq/tx/", "https://mempool.bisq.services/bisq/address/"), - new BlockChainExplorer("bsq.vante.me (@mrosseel)", "https://bsq.vante.me/tx.html?tx=", "https://bsq.vante.me/Address.html?addr="), - new BlockChainExplorer("bsq.sqrrm.net (@sqrrm)", "https://bsq.sqrrm.net/tx.html?tx=", "https://bsq.sqrrm.net/Address.html?addr="), - new BlockChainExplorer("bsq.bisq.cc (@m52go)", "https://bsq.bisq.cc/tx.html?tx=", "https://bsq.bisq.cc/Address.html?addr=") + new BlockChainExplorer("mempool.bisq.services (@devinbileck)", "https://mempool.bisq.services/bisq/tx/", "https://mempool.bisq.services/bisq/address/") )); private static final ArrayList XMR_TX_PROOF_SERVICES_CLEAR_NET = new ArrayList<>(Arrays.asList( "xmrblocks.monero.emzy.de", // @emzy - "explorer.monero.wiz.biz", // @wiz + //"explorer.monero.wiz.biz", // @wiz "xmrblocks.bisq.services" // @devinbileck )); private static final ArrayList XMR_TX_PROOF_SERVICES = new ArrayList<>(Arrays.asList( "monero3bec7m26vx6si6qo7q7imlaoz45ot5m2b5z2ppgoooo6jx2rqd.onion", // @emzy - "wizxmr4hbdxdszqm5rfyqvceyca5jq62ppvtuznasnk66wvhhvgm3uyd.onion", // @wiz + //"wizxmr4hbdxdszqm5rfyqvceyca5jq62ppvtuznasnk66wvhhvgm3uyd.onion", // @wiz "devinxmrwu4jrfq2zmq5kqjpxb44hx7i7didebkwrtvmvygj4uuop2ad.onion" // @devinbileck )); @@ -168,8 +165,6 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - - @SuppressWarnings("WeakerAccess") @Inject public Preferences(PersistenceManager persistenceManager, Config config, @@ -225,54 +220,77 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid } @Override - public void readPersisted() { - BaseCurrencyNetwork baseCurrencyNetwork = Config.baseCurrencyNetwork(); - TradeCurrency preferredTradeCurrency; + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted("PreferencesPayload", + persisted -> { + initFromPersistedPreferences(persisted); + completeHandler.run(); + }, + () -> { + initNewPreferences(); + completeHandler.run(); + }); + } - PreferencesPayload persisted = persistenceManager.getPersisted("PreferencesPayload"); - if (persisted != null) { - prefPayload = persisted; - GlobalSettings.setLocale(new Locale(prefPayload.getUserLanguage(), prefPayload.getUserCountry().code)); - GlobalSettings.setUseAnimations(prefPayload.isUseAnimations()); - preferredTradeCurrency = checkNotNull(prefPayload.getPreferredTradeCurrency(), "preferredTradeCurrency must not be null"); - setPreferredTradeCurrency(preferredTradeCurrency); - setFiatCurrencies(prefPayload.getFiatCurrencies()); - setCryptoCurrencies(prefPayload.getCryptoCurrencies()); - setBsqBlockChainExplorer(prefPayload.getBsqBlockChainExplorer()); - } else { - prefPayload = new PreferencesPayload(); - prefPayload.setUserLanguage(GlobalSettings.getLocale().getLanguage()); - prefPayload.setUserCountry(CountryUtil.getDefaultCountry()); - GlobalSettings.setLocale(new Locale(prefPayload.getUserLanguage(), prefPayload.getUserCountry().code)); - preferredTradeCurrency = checkNotNull(CurrencyUtil.getCurrencyByCountryCode(prefPayload.getUserCountry().code), - "preferredTradeCurrency must not be null"); - prefPayload.setPreferredTradeCurrency(preferredTradeCurrency); - setFiatCurrencies(CurrencyUtil.getMainFiatCurrencies()); - setCryptoCurrencies(CurrencyUtil.getMainCryptoCurrencies()); + private void initFromPersistedPreferences(PreferencesPayload persisted) { + prefPayload = persisted; + GlobalSettings.setLocale(new Locale(prefPayload.getUserLanguage(), prefPayload.getUserCountry().code)); + GlobalSettings.setUseAnimations(prefPayload.isUseAnimations()); + TradeCurrency preferredTradeCurrency = checkNotNull(prefPayload.getPreferredTradeCurrency(), "preferredTradeCurrency must not be null"); + setPreferredTradeCurrency(preferredTradeCurrency); + setFiatCurrencies(prefPayload.getFiatCurrencies()); + setCryptoCurrencies(prefPayload.getCryptoCurrencies()); + setBsqBlockChainExplorer(prefPayload.getBsqBlockChainExplorer()); + GlobalSettings.setDefaultTradeCurrency(preferredTradeCurrency); - if ("BTC".equals(baseCurrencyNetwork.getCurrencyCode())) { - setBlockChainExplorerMainNet(BTC_MAIN_NET_EXPLORERS.get(0)); - setBlockChainExplorerTestNet(BTC_TEST_NET_EXPLORERS.get(0)); - } else { - throw new RuntimeException("BaseCurrencyNetwork not defined. BaseCurrencyNetwork=" + baseCurrencyNetwork); - } - - prefPayload.setDirectoryChooserPath(Utilities.getSystemHomeDirectory()); - - prefPayload.setOfferBookChartScreenCurrencyCode(preferredTradeCurrency.getCode()); - prefPayload.setTradeChartsScreenCurrencyCode(preferredTradeCurrency.getCode()); - prefPayload.setBuyScreenCurrencyCode(preferredTradeCurrency.getCode()); - prefPayload.setSellScreenCurrencyCode(preferredTradeCurrency.getCode()); + // If a user has updated and the field was not set and get set to 0 by protobuf + // As there is no way to detect that a primitive value field was set we cannot apply + // a "marker" value like -1 to it. We also do not want to wrap the value in a new + // proto message as thats too much for that feature... So we accept that if the user + // sets the value to 0 it will be overwritten by the default at next startup. + if (prefPayload.getBsqAverageTrimThreshold() == 0) { + prefPayload.setBsqAverageTrimThreshold(0.05); } + setupPreferences(); + } + + private void initNewPreferences() { + prefPayload = new PreferencesPayload(); + prefPayload.setUserLanguage(GlobalSettings.getLocale().getLanguage()); + prefPayload.setUserCountry(CountryUtil.getDefaultCountry()); + GlobalSettings.setLocale(new Locale(prefPayload.getUserLanguage(), prefPayload.getUserCountry().code)); + TradeCurrency preferredTradeCurrency = checkNotNull(CurrencyUtil.getCurrencyByCountryCode(prefPayload.getUserCountry().code), + "preferredTradeCurrency must not be null"); + prefPayload.setPreferredTradeCurrency(preferredTradeCurrency); + setFiatCurrencies(CurrencyUtil.getMainFiatCurrencies()); + setCryptoCurrencies(CurrencyUtil.getMainCryptoCurrencies()); + + BaseCurrencyNetwork baseCurrencyNetwork = Config.baseCurrencyNetwork(); + if ("BTC".equals(baseCurrencyNetwork.getCurrencyCode())) { + setBlockChainExplorerMainNet(BTC_MAIN_NET_EXPLORERS.get(0)); + setBlockChainExplorerTestNet(BTC_TEST_NET_EXPLORERS.get(0)); + } else { + throw new RuntimeException("BaseCurrencyNetwork not defined. BaseCurrencyNetwork=" + baseCurrencyNetwork); + } + + prefPayload.setDirectoryChooserPath(Utilities.getSystemHomeDirectory()); + + prefPayload.setOfferBookChartScreenCurrencyCode(preferredTradeCurrency.getCode()); + prefPayload.setTradeChartsScreenCurrencyCode(preferredTradeCurrency.getCode()); + prefPayload.setBuyScreenCurrencyCode(preferredTradeCurrency.getCode()); + prefPayload.setSellScreenCurrencyCode(preferredTradeCurrency.getCode()); + GlobalSettings.setDefaultTradeCurrency(preferredTradeCurrency); + setupPreferences(); + } + + private void setupPreferences() { persistenceManager.initialize(prefPayload, PersistenceManager.Source.PRIVATE); // We don't want to pass Preferences to all popups where the don't show again checkbox is used, so we use // that static lookup class to avoid static access to the Preferences directly. DontShowAgainLookup.setPreferences(this); - GlobalSettings.setDefaultTradeCurrency(preferredTradeCurrency); - // set all properties useAnimationsProperty.set(prefPayload.isUseAnimations()); useStandbyModeProperty.set(prefPayload.isUseStandbyMode()); @@ -280,12 +298,12 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid // if no valid Bitcoin block explorer is set, select the 1st valid Bitcoin block explorer ArrayList btcExplorers = getBlockChainExplorers(); - if (!blockExplorerExists(btcExplorers, getBlockChainExplorer())) + if (getBlockChainExplorer() == null || getBlockChainExplorer().name.length() == 0) setBlockChainExplorer(btcExplorers.get(0)); // if no valid BSQ block explorer is set, randomly select a valid BSQ block explorer ArrayList bsqExplorers = getBsqBlockChainExplorers(); - if (!blockExplorerExists(bsqExplorers, getBsqBlockChainExplorer())) + if (getBsqBlockChainExplorer() == null || getBsqBlockChainExplorer().name.length() == 0) setBsqBlockChainExplorer(bsqExplorers.get((new Random()).nextInt(bsqExplorers.size()))); tradeCurrenciesAsObservable.addAll(prefPayload.getFiatCurrencies()); @@ -336,6 +354,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid requestPersistence(); } + /////////////////////////////////////////////////////////////////////////////////////////// // API /////////////////////////////////////////////////////////////////////////////////////////// @@ -416,6 +435,11 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid requestPersistence(); } + public void setBsqAverageTrimThreshold(double bsqAverageTrimThreshold) { + prefPayload.setBsqAverageTrimThreshold(bsqAverageTrimThreshold); + requestPersistence(); + } + public Optional findAutoConfirmSettings(String currencyCode) { return prefPayload.getAutoConfirmSettingsList().stream() .filter(e -> e.getCurrencyCode().equals(currencyCode)) @@ -562,8 +586,8 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid requestPersistence(); } - public void setWithdrawalTxFeeInBytes(long withdrawalTxFeeInBytes) { - prefPayload.setWithdrawalTxFeeInBytes(withdrawalTxFeeInBytes); + public void setWithdrawalTxFeeInVbytes(long withdrawalTxFeeInVbytes) { + prefPayload.setWithdrawalTxFeeInVbytes(withdrawalTxFeeInVbytes); requestPersistence(); } @@ -838,8 +862,8 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid return prefPayload.getBridgeAddresses(); } - public long getWithdrawalTxFeeInBytes() { - return Math.max(prefPayload.getWithdrawalTxFeeInBytes(), Config.baseCurrencyNetwork().getDefaultMinFeePerByte()); + public long getWithdrawalTxFeeInVbytes() { + return Math.max(prefPayload.getWithdrawalTxFeeInVbytes(), Config.baseCurrencyNetwork().getDefaultMinFeePerVbyte()); } public boolean isDaoFullNode() { @@ -902,15 +926,6 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid requestPersistence(); } - private boolean blockExplorerExists(ArrayList explorers, - BlockChainExplorer explorer) { - if (explorer != null && explorers != null && explorers.size() > 0) - for (int i = 0; i < explorers.size(); i++) - if (explorers.get(i).name.equals(explorer.name)) - return true; - return false; - } - private interface ExcludesDelegateMethods { void setTacAccepted(boolean tacAccepted); @@ -958,7 +973,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid void setUseCustomWithdrawalTxFee(boolean useCustomWithdrawalTxFee); - void setWithdrawalTxFeeInBytes(long withdrawalTxFeeInBytes); + void setWithdrawalTxFeeInVbytes(long withdrawalTxFeeInVbytes); void setSelectedPaymentAccountForCreateOffer(@Nullable PaymentAccount paymentAccount); @@ -1004,7 +1019,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid List getBridgeAddresses(); - long getWithdrawalTxFeeInBytes(); + long getWithdrawalTxFeeInVbytes(); void setUseStandbyMode(boolean useStandbyMode); @@ -1034,6 +1049,8 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid void setTacAcceptedV120(boolean tacAccepted); + void setBsqAverageTrimThreshold(double bsqAverageTrimThreshold); + void setAutoConfirmSettings(AutoConfirmSettings autoConfirmSettings); } } diff --git a/core/src/main/java/bisq/core/user/PreferencesPayload.java b/core/src/main/java/bisq/core/user/PreferencesPayload.java index d84862e913..0a7aede7e3 100644 --- a/core/src/main/java/bisq/core/user/PreferencesPayload.java +++ b/core/src/main/java/bisq/core/user/PreferencesPayload.java @@ -67,7 +67,7 @@ public final class PreferencesPayload implements PersistableEnvelope { private boolean showOwnOffersInOfferBook = true; @Nullable private TradeCurrency preferredTradeCurrency; - private long withdrawalTxFeeInBytes = 100; + private long withdrawalTxFeeInVbytes = 100; private boolean useCustomWithdrawalTxFee = false; private double maxPriceDistanceInPercent = 0.3; @Nullable @@ -124,6 +124,7 @@ public final class PreferencesPayload implements PersistableEnvelope { private double buyerSecurityDepositAsPercentForCrypto = getDefaultBuyerSecurityDepositAsPercent(); private int blockNotifyPort; private boolean tacAcceptedV120; + private double bsqAverageTrimThreshold = 0.05; // Added at 1.3.8 private List autoConfirmSettingsList = new ArrayList<>(); @@ -159,7 +160,7 @@ public final class PreferencesPayload implements PersistableEnvelope { .setTacAccepted(tacAccepted) .setUseTorForBitcoinJ(useTorForBitcoinJ) .setShowOwnOffersInOfferBook(showOwnOffersInOfferBook) - .setWithdrawalTxFeeInBytes(withdrawalTxFeeInBytes) + .setWithdrawalTxFeeInVbytes(withdrawalTxFeeInVbytes) .setUseCustomWithdrawalTxFee(useCustomWithdrawalTxFee) .setMaxPriceDistanceInPercent(maxPriceDistanceInPercent) .setTradeStatisticsTickUnitIndex(tradeStatisticsTickUnitIndex) @@ -188,9 +189,10 @@ public final class PreferencesPayload implements PersistableEnvelope { .setBuyerSecurityDepositAsPercentForCrypto(buyerSecurityDepositAsPercentForCrypto) .setBlockNotifyPort(blockNotifyPort) .setTacAcceptedV120(tacAcceptedV120) + .setBsqAverageTrimThreshold(bsqAverageTrimThreshold) .addAllAutoConfirmSettings(autoConfirmSettingsList.stream() - .map(autoConfirmSettings -> ((protobuf.AutoConfirmSettings) autoConfirmSettings.toProtoMessage())) - .collect(Collectors.toList())); + .map(autoConfirmSettings -> ((protobuf.AutoConfirmSettings) autoConfirmSettings.toProtoMessage())) + .collect(Collectors.toList())); Optional.ofNullable(backupDirectory).ifPresent(builder::setBackupDirectory); Optional.ofNullable(preferredTradeCurrency).ifPresent(e -> builder.setPreferredTradeCurrency((protobuf.TradeCurrency) e.toProtoMessage())); @@ -239,7 +241,7 @@ public final class PreferencesPayload implements PersistableEnvelope { proto.getUseTorForBitcoinJ(), proto.getShowOwnOffersInOfferBook(), proto.hasPreferredTradeCurrency() ? TradeCurrency.fromProto(proto.getPreferredTradeCurrency()) : null, - proto.getWithdrawalTxFeeInBytes(), + proto.getWithdrawalTxFeeInVbytes(), proto.getUseCustomWithdrawalTxFee(), proto.getMaxPriceDistanceInPercent(), ProtoUtil.stringOrNullFromProto(proto.getOfferBookChartScreenCurrencyCode()), @@ -280,6 +282,7 @@ public final class PreferencesPayload implements PersistableEnvelope { proto.getBuyerSecurityDepositAsPercentForCrypto(), proto.getBlockNotifyPort(), proto.getTacAcceptedV120(), + proto.getBsqAverageTrimThreshold(), proto.getAutoConfirmSettingsList().isEmpty() ? new ArrayList<>() : new ArrayList<>(proto.getAutoConfirmSettingsList().stream() .map(AutoConfirmSettings::fromProto) diff --git a/core/src/main/java/bisq/core/user/User.java b/core/src/main/java/bisq/core/user/User.java index f101dc5f41..2f8480e162 100644 --- a/core/src/main/java/bisq/core/user/User.java +++ b/core/src/main/java/bisq/core/user/User.java @@ -89,13 +89,21 @@ public class User implements PersistedDataHost { } @Override - public void readPersisted() { - UserPayload persisted = checkNotNull(persistenceManager).getPersisted("UserPayload"); - if (persisted != null) { - userPayload = persisted; - } + public void readPersisted(Runnable completeHandler) { + checkNotNull(persistenceManager).readPersisted("UserPayload", + persisted -> { + userPayload = persisted; + init(); + completeHandler.run(); + }, + () -> { + init(); + completeHandler.run(); + }); + } - persistenceManager.initialize(userPayload, PersistenceManager.Source.PRIVATE); + private void init() { + checkNotNull(persistenceManager).initialize(userPayload, PersistenceManager.Source.PRIVATE); checkNotNull(userPayload.getPaymentAccounts(), "userPayload.getPaymentAccounts() must not be null"); checkNotNull(userPayload.getAcceptedLanguageLocaleCodes(), "userPayload.getAcceptedLanguageLocaleCodes() must not be null"); diff --git a/core/src/main/java/bisq/core/util/coin/BsqFormatter.java b/core/src/main/java/bisq/core/util/coin/BsqFormatter.java index 65a75f2cd5..548305f800 100644 --- a/core/src/main/java/bisq/core/util/coin/BsqFormatter.java +++ b/core/src/main/java/bisq/core/util/coin/BsqFormatter.java @@ -21,7 +21,7 @@ import bisq.core.dao.governance.param.Param; import bisq.core.dao.governance.proposal.ProposalValidationException; import bisq.core.locale.GlobalSettings; import bisq.core.locale.Res; -import bisq.core.provider.price.MarketPrice; +import bisq.core.monetary.Price; import bisq.core.util.FormattingUtils; import bisq.core.util.ParsingUtils; import bisq.core.util.validation.BtcAddressValidator; @@ -31,7 +31,6 @@ import bisq.common.app.DevEnv; import bisq.common.config.Config; import bisq.common.util.MathUtils; -import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.Coin; import org.bitcoinj.core.LegacyAddress; @@ -97,7 +96,7 @@ public class BsqFormatter implements CoinFormatter { * Returns the base-58 encoded String representation of this * object, including version and checksum bytes. */ - public String getBsqAddressStringFromAddress(Address address) { + public String getBsqAddressStringFromAddress(LegacyAddress address) { final String addressString = address.toString(); if (useBsqAddressFormat) return prefix + addressString; @@ -122,10 +121,10 @@ public class BsqFormatter implements CoinFormatter { return amountFormat.format(MathUtils.scaleDownByPowerOf10(amount.value, 2)) + " BSQ"; } - public String formatMarketCap(MarketPrice bsqPriceMarketPrice, MarketPrice fiatMarketPrice, Coin issuedAmount) { - if (bsqPriceMarketPrice != null && fiatMarketPrice != null) { - double marketCap = bsqPriceMarketPrice.getPrice() * fiatMarketPrice.getPrice() * (MathUtils.scaleDownByPowerOf10(issuedAmount.value, 2)); - return marketCapFormat.format(MathUtils.doubleToLong(marketCap)) + " " + fiatMarketPrice.getCurrencyCode(); + public String formatMarketCap(Price usdBsqPrice, Coin issuedAmount) { + if (usdBsqPrice != null && issuedAmount != null) { + double marketCap = usdBsqPrice.getValue() * (MathUtils.scaleDownByPowerOf10(issuedAmount.value, 6)); + return marketCapFormat.format(MathUtils.doubleToLong(marketCap)) + " USD"; } else { return ""; } diff --git a/core/src/main/java/bisq/core/util/coin/CoinUtil.java b/core/src/main/java/bisq/core/util/coin/CoinUtil.java index 17e0195aad..3f8b16bda0 100644 --- a/core/src/main/java/bisq/core/util/coin/CoinUtil.java +++ b/core/src/main/java/bisq/core/util/coin/CoinUtil.java @@ -52,9 +52,9 @@ public class CoinUtil { return a.compareTo(b) >= 0 ? a : b; } - public static double getFeePerByte(Coin miningFee, int txSize) { + public static double getFeePerVbyte(Coin miningFee, int txVsize) { double value = miningFee != null ? miningFee.value : 0; - return MathUtils.roundDouble((value / (double) txSize), 2); + return MathUtils.roundDouble((value / (double) txVsize), 2); } /** diff --git a/core/src/main/resources/btc_regtest.seednodes b/core/src/main/resources/btc_regtest.seednodes index 148e6ecb9e..44cd4ec296 100644 --- a/core/src/main/resources/btc_regtest.seednodes +++ b/core/src/main/resources/btc_regtest.seednodes @@ -1,17 +1,3 @@ -# By default developers use either port 2002 or 3002 or both as local seed nodes. If they want to use regtest -# with Tor they have to add a program argument to pass the custom onion address of the local Tor seed node. -# E.g. --seedNodes=YOUR_ONION.onion:2002 - -# To create your local onion addresses follow those steps: -# 1. Run a seed node with prog args: --bitcoinNetwork=regtest --nodePort=2002 --appName=bisq_seed_node_localhost_YOUR_ONION -# 2. Find your local onion address in bisq_seed_node_localhost_YOUR_ONION/regtest/tor/hiddenservice/hostname -# 3. Shut down the seed node -# 4. Rename YOUR_ONION at the directory with your local onion address as well as the appName program argument to reflect -# the real onion address. -# 5. Start the seed node again -# 6. Start the Bisq app which wants to connect to that seed node with program argument `--seedNodes=YOUR_ONION.onion:2002` - - -# nodeaddress.onion:port [(@owner)] -localhost:2002 -localhost:3002 +# nodeaddress.onion:port [(@owner,@backup)] +localhost:2002 (@devtest1) +localhost:3002 (@devtest2) diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 3037fdb5be..818ef8e598 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=offer shared.multipleOffers=offers shared.Offer=Offer +shared.offerVolumeCode={0} Offer Volume shared.openOffers=open offers shared.trade=trade shared.trades=trades @@ -122,7 +123,8 @@ shared.noDateAvailable=No date available shared.noDetailsAvailable=No details available shared.notUsedYet=Not used yet shared.date=Date -shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n shared.copyToClipboard=Copy to clipboard shared.language=Language @@ -188,7 +190,6 @@ shared.tradeWalletAddress=Trade wallet address shared.tradeWalletBalance=Trade wallet balance shared.makerTxFee=Maker: {0} shared.takerTxFee=Taker: {0} -shared.securityDepositBox.description=Security deposit for BTC {0} shared.iConfirm=I confirm shared.tradingFeeInBsqInfo=equivalent to {0} used as trading fee shared.openURL=Open {0} @@ -237,8 +238,6 @@ mainView.menu.settings=Settings mainView.menu.account=Account mainView.menu.dao=DAO -mainView.marketPrice.provider=Price by -mainView.marketPrice.label=Market price mainView.marketPriceWithProvider.label=Market price by {0} mainView.marketPrice.bisqInternalPrice=Price of latest Bisq trade mainView.marketPrice.tooltip.bisqInternalPrice=There is no market price from external price feed providers available.\n\ @@ -252,14 +251,15 @@ mainView.balance.locked.short=Locked mainView.footer.usingTor=(using Tor) mainView.footer.localhostBitcoinNode=(localhost) -mainView.footer.btcInfo=Bitcoin network peers: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=Connecting to Bitcoin network mainView.footer.bsqInfo.synchronizing=/ Synchronizing DAO mainView.footer.btcInfo.synchronizingWith=Synchronizing with -mainView.footer.btcInfo.synchronizedWith=Synchronized with +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=Connecting to mainView.footer.btcInfo.connectionFailed=Connection failed to -mainView.footer.p2pInfo=Bisq network peers: {0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=DAO full node mainView.bootstrapState.connectionToTorNetwork=(1/4) Connecting to Tor network... @@ -293,7 +293,6 @@ market.tabs.spread=Details market.tabs.trades=Trades # OfferBookChartView -market.offerBook.chart.title=Offer book for {0} market.offerBook.buyAltcoin=Buy {0} (sell {1}) market.offerBook.sellAltcoin=Sell {0} (buy {1}) market.offerBook.buyWithFiat=Buy {0} @@ -338,10 +337,10 @@ offerbook.offerersAcceptedBankSeats=Accepted seat of bank countries (taker):\n { offerbook.availableOffers=Available offers offerbook.filterByCurrency=Filter by currency offerbook.filterByPaymentMethod=Filter by payment method -offerbook.timeSinceSigning=Signed since +offerbook.timeSinceSigning=Account info offerbook.timeSinceSigning.info=This account was verified and {0} offerbook.timeSinceSigning.info.arbitrator=signed by an arbitrator and can sign peer accounts -offerbook.timeSinceSigning.info.peer=signed by a peer, waiting for limits to be lifted +offerbook.timeSinceSigning.info.peer=signed by a peer, waiting %d days for limits to be lifted offerbook.timeSinceSigning.info.peerLimitLifted=signed by a peer and limits were lifted offerbook.timeSinceSigning.info.signer=signed by peer and can sign peer accounts (limits lifted) offerbook.timeSinceSigning.info.banned=account was banned @@ -352,9 +351,12 @@ offerbook.xmrAutoConf=Is auto-confirm enabled offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n\ {0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts. offerbook.timeSinceSigning.notSigned=Not signed yet +offerbook.timeSinceSigning.notSigned.ageDays={0} days offerbook.timeSinceSigning.notSigned.noNeed=N/A -shared.notSigned=This account hasn't been signed yet -shared.notSigned.noNeed=This account type doesn't use signing +shared.notSigned=This account has not been signed yet and was created {0} days ago +shared.notSigned.noNeed=This account type does not require signing +shared.notSigned.noNeedDays=This account type does not require signing and was created {0} days ago +shared.notSigned.noNeedAlts=Altcoin accounts do not feature signing or aging offerbook.nrOffers=No. of offers: {0} offerbook.volume={0} (min - max) @@ -405,10 +407,6 @@ offerbook.warning.paymentMethodBanned=The payment method used in that offer was offerbook.warning.nodeBlocked=The onion address of that trader was blocked by the Bisq developers.\nProbably there is an unhandled bug causing issues when taking offers from that trader. offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\n\ Please update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. -offerbook.warning.tradeLimitNotMatching=Your payment account has been created {0} ago. Your trade limit is based on the account age and is not sufficient for that offer.\n\n\ - Your trade limit is: {1}\n\ - The min. trade amount of the offer is: {2}.\n\n\ - You cannot take that offer at the moment. Once your account is older than 2 months this restriction gets removed. offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. \ It could be that your previous take-offer attempt resulted in a failed trade. @@ -460,7 +458,6 @@ createOffer.alreadyFunded=You had already funded that offer.\nYour funds have be createOffer.createOfferFundWalletInfo.headline=Fund your offer # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- Trade amount: {0} \n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} and {1} createOffer.createOfferFundWalletInfo.msg=You need to deposit {0} to this offer.\n\nThose funds are reserved in your local wallet and will get locked into the multisig deposit address once someone takes your offer.\n\nThe amount is the sum of:\n{1}- Your security deposit: {2}\n- Trading fee: {3}\n- Mining fee: {4}\n\nYou can choose between two options when funding your trade:\n- Use your Bisq wallet (convenient, but transactions may be linkable) OR\n- Transfer from an external wallet (potentially more private)\n\nYou will see all funding options and details after closing this popup. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -535,6 +532,7 @@ takeOffer.failed.offererOffline=You cannot take that offer because the maker is takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again. takeOffer.error.noFundsLost=\n\nNo funds have left your wallet yet.\nPlease try to restart your application and check your network connection to see if you can resolve the issue. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nThe deposit transaction is already published.\nPlease try to restart your application and check your network connection to see if you can resolve the issue.\nIf the problem still remains please contact the developers for support. takeOffer.error.payoutPublished=\n\nThe payout transaction is already published.\nPlease try to restart your application and check your network connection to see if you can resolve the issue.\nIf the problem still remains please contact the developers for support. @@ -634,6 +632,10 @@ portfolio.pending.step2_buyer.moneyGram.extra=IMPORTANT REQUIREMENT:\nAfter you portfolio.pending.step2_buyer.westernUnion=Please pay {0} to the BTC seller by using Western Union.\n\n portfolio.pending.step2_buyer.westernUnion.extra=IMPORTANT REQUIREMENT:\nAfter you have done the payment send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller.\n\ The receipt must clearly show the seller''s full name, city, country and the amount. The seller''s email is: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and \ + use the BTC seller''s email or mobile number as receiver. \ + In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=Please send {0} by \"US Postal Money Order\" to the BTC seller.\n\n @@ -684,9 +686,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=Buyer's contact information 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 they have started 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 their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance. -portfolio.pending.step2_seller.refresh=Refresh Trade State -portfolio.pending.step2_seller.refreshInfo=Sometimes P2P network messages acknowledging payment are not delivered, \ - causing trades to get stuck. Hit the button below to make your peer resend the last message. tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}'' tradeChat.openChat=Open chat window tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\n\ @@ -750,9 +749,13 @@ portfolio.pending.step3_seller.westernUnion=The buyer has to send you the MTCN ( Only confirm receipt after you have successfully picked up the money! portfolio.pending.step3_seller.halCash=The buyer has to send you the HalCash code as text message. Beside that you will receive a message from HalCash with the required information to withdraw the EUR from a HalCash supporting ATM.\n\n\ After you have picked up the money from the ATM please confirm here the receipt of the payment! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text \ + message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted \ + confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\n\ If the names are not exactly the same, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=Confirm payment receipt portfolio.pending.step3_seller.amountToReceive=Amount to receive @@ -778,6 +781,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=Have you received the {0} portfolio.pending.step3_seller.onPaymentReceived.fiat=The trade ID (\"reason for payment\" text) of the transaction is: \"{0}\"\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" 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.\n\n 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 @@ -842,20 +846,11 @@ portfolio.pending.error.depositTxNotConfirmed=The deposit transaction is not con with an unconfirmed deposit transaction. Please wait until it is confirmed or go to \"Settings/Network info\" and do a SPV resync.\n\n\ For further help please contact the Bisq support channel at the Bisq Keybase team. -portfolio.pending.notification=Notification - portfolio.pending.support.headline.getHelp=Need help? portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade \ chat or ask the Bisq community at https://bisq.community. \ If your issue still isn't resolved, you can request more help from a mediator. -portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade \ - chat or ask the Bisq community at https://bisq.community. \ - If your issue still isn't resolved, you can request more help from an arbitrator. portfolio.pending.support.button.getHelp=Open Trader Chat -portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support \ - ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\n\ - Are you sure you want to open a support ticket? -portfolio.pending.support.popup.button=Open support ticket portfolio.pending.support.headline.halfPeriodOver=Check payment portfolio.pending.support.headline.periodOver=Trade period is over @@ -863,19 +858,11 @@ portfolio.pending.mediationRequested=Mediation requested portfolio.pending.refundRequested=Refund requested portfolio.pending.openSupport=Open support ticket portfolio.pending.supportTicketOpened=Support ticket opened -portfolio.pending.requestSupport=Request support -portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the \ - information to the developers to investigate the problem.\nAfter the problem has been analyzed you will \ - get back all locked funds. portfolio.pending.communicateWithArbitrator=Please communicate in the \"Support\" screen with the arbitrator. portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator. -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 -portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually \ - close it, so that it no longer shows as an open trade? portfolio.pending.mediationResult.headline=Suggested payout from mediation portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout. @@ -1183,6 +1170,7 @@ setting.preferences.general=General preferences setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=Max. deviation from market price +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=Avoid standby mode setting.preferences.autoConfirmXMR=XMR auto-confirm setting.preferences.autoConfirmEnabled=Enabled @@ -1190,14 +1178,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Required confirmations setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) setting.preferences.deviationToLarge=Values higher than {0}% are not allowed. -setting.preferences.txFee=Withdrawal transaction fee (satoshis/byte) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=Use custom value -setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/byte -setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/byte). Transaction fee is usually in the range of 50-400 satoshis/byte. +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Ignored peers [onion address:port] -setting.preferences.refererId=Referral ID setting.preferences.ignoreDustThreshold=Min. non-dust output value -setting.preferences.refererId.prompt=Optional referral ID setting.preferences.currenciesInList=Currencies in market price feed list setting.preferences.prefCurrency=Preferred currency setting.preferences.displayFiat=Display national currencies @@ -1213,10 +1199,8 @@ setting.preferences.useAnimations=Use animations setting.preferences.useDarkMode=Use dark mode setting.preferences.sortWithNumOffers=Sort market lists with no. of offers/trades setting.preferences.resetAllFlags=Reset all \"Don't show again\" flags -setting.preferences.reset=Reset settings.preferences.languageChange=To apply the language change to all screens requires a restart. settings.preferences.supportLanguageWarning=In case of a dispute, please note that mediation is handled in {0} and arbitration in {1}. -settings.preferences.selectCurrencyNetwork=Select network setting.preferences.daoOptions=DAO options setting.preferences.dao.resyncFromGenesis.label=Rebuild DAO state from genesis tx setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources @@ -1236,6 +1220,14 @@ setting.preferences.dao.fullNodeInfo=For running Bisq as DAO full node you need After changing the mode you need to restart. setting.preferences.dao.fullNodeInfo.ok=Open docs page setting.preferences.dao.fullNodeInfo.cancel=No, I stick with lite node mode +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or \ + customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen = Chosen explorer settings +settings.preferences.editCustomExplorer.name=Name +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=Bitcoin network settings.net.p2pHeader=Bisq network @@ -1265,6 +1257,7 @@ settings.net.creationDateColumn=Established settings.net.connectionTypeColumn=In/Out settings.net.sentDataLabel=Sent data statistics settings.net.receivedDataLabel=Received data statistics +settings.net.chainHeightLabel=Latest BTC block height settings.net.roundTripTimeColumn=Roundtrip settings.net.sentBytesColumn=Sent settings.net.receivedBytesColumn=Received @@ -1279,6 +1272,7 @@ settings.net.needRestart=You need to restart the application to apply that chang settings.net.notKnownYet=Not known yet... settings.net.sentData=Sent data: {0}, {1} messages, {2} messages/sec settings.net.receivedData=Received data: {0}, {1} messages, {2} messages/sec +settings.net.chainHeight=Bisq: {0} | Peers: {1} settings.net.ips=[IP address:port | host name:port | onion address:port] (comma separated). Port can be omitted if default is used (8333). settings.net.seedNode=Seed node settings.net.directPeer=Peer (direct) @@ -1375,11 +1369,9 @@ setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature t # Account #################################################################### -account.tab.arbitratorRegistration=Arbitrator registration account.tab.mediatorRegistration=Mediator registration account.tab.refundAgentRegistration=Refund agent registration account.tab.signing=Signing -account.tab.account=Account account.info.headline=Welcome to your Bisq Account account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\n\ A new Bitcoin wallet was created the first time you started Bisq.\n\n\ @@ -1417,6 +1409,7 @@ described on the {1} web page.\nUsing wallets from centralized exchanges where ( (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is \ not a {2} specialist and cannot help in such cases. account.altcoin.popup.wallet.confirm=I understand and confirm that I know which wallet I need to use. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ For sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the \ @@ -1435,6 +1428,7 @@ arbitrator in case of a dispute.\n\n\ There is no payment ID required, just the normal public address.\n\ If you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) \ or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ For sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the \ @@ -1453,6 +1447,7 @@ mediator or arbitrator in case of a dispute.\n\n\ There is no payment ID required, just the normal public address.\n\ If you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) \ or the ArQmA forum (https://labs.arqma.com) to find more information. +# suppress inspection "UnusedProperty" account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\n\ If selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n\ - the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n\ @@ -1463,7 +1458,7 @@ Failure to provide the required transaction data will result in losing disputes. Also note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, \ but you need to enable it in Settings.\n\n\ See the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ For sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the \ @@ -1487,6 +1482,7 @@ dispute case. The MSR sender is responsible for providing verification of the MS mediator or arbitrator in case of a dispute.\n\n\ There is no payment ID required, just the normal public address.\n\ If you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ To send BLUR you must use the Blur Network CLI or GUI Wallet. \n\n\ @@ -1502,6 +1498,7 @@ transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\n\ Failure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the \ BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\n\ If you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ To send Solo you must use the Solo Network CLI Wallet. \n\n\ @@ -1514,6 +1511,7 @@ transfer using the Solo Block Explorer by searching for the transaction and then failure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the \ Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\n\ If you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ To send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\n\ @@ -1526,6 +1524,7 @@ transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\n\ Failure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the \ CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\n\ If you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ To send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\n\ @@ -1538,6 +1537,7 @@ transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\n\ Failure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the \ QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\n\ If you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ Because of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you \ @@ -1555,10 +1555,13 @@ Failure to provide the above data, or if you used an incompatible wallet, will r dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the \ mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\n\ If you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not \ the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not \ the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN requires an interactive process between the sender and receiver to create the \ transaction. Be sure to follow the instructions from the GRIN project web page to reliably send and receive GRIN \ (the receiver needs to be online or at least be online during a certain time frame). \n\n\ @@ -1569,6 +1572,7 @@ account.altcoin.popup.grin.msg=GRIN requires an interactive process between the receiving GRIN as well as how to create the proof. \n\n\ See https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only for more \ information about the Grinbox proof tool. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAM requires an interactive process between the sender and receiver to create the \ transaction. \n\n\ Be sure to follow the instructions from the BEAM project web page to reliably send and receive BEAM \ @@ -1576,6 +1580,7 @@ account.altcoin.popup.beam.msg=BEAM requires an interactive process between the The BEAM sender is required to provide proof that they sent BEAM successfully. \ Be sure to use wallet software which can produce such a proof. If the wallet cannot provide the proof a potential \ dispute will be resolved in favor of the BEAM receiver. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill \ the following requirements:\n\n\ To send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\n\ @@ -1588,6 +1593,7 @@ Failure to provide the required information to the mediator or arbitrator will r ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\n\ If you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\n\ Burnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: \ OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. \ @@ -1599,6 +1605,7 @@ As burnt blackcoins are unspendable, they can not be reselled. “Selling” bur burning ordinary blackcoins (with associated data equal to the destination address).\n\n\ In case of a dispute, the BLK seller needs to provide the transaction hash. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Trading L-BTC on Bisq requires that you understand the following:\n\n\ When receiving L-BTC for a trade on Bisq, you cannot use the mobile Blockstream Green Wallet app or a \ custodial/exchange wallet. You must only receive L-BTC into the Liquid Elements Core wallet, or another \ @@ -1618,7 +1625,6 @@ account.backup.location=Backup location account.backup.selectLocation=Select backup location account.backup.backupNow=Backup now (backup is not encrypted!) account.backup.appDir=Application data directory -account.backup.logFile=Log file account.backup.openDirectory=Open directory account.backup.openLogFile=Open Log file account.backup.success=Backup successfully saved at:\n{0} @@ -1664,14 +1670,11 @@ account.seed.restore.ok=Ok, do the restore and shut down Bisq account.notifications.setup.title=Setup account.notifications.download.label=Download mobile app -account.notifications.download.button=Download account.notifications.waitingForWebCam=Waiting for webcam... account.notifications.webCamWindow.headline=Scan QR-code from phone account.notifications.webcam.label=Use webcam account.notifications.webcam.button=Scan QR code account.notifications.noWebcam.button=I don't have a webcam -account.notifications.testMsg.label=Send test notification -account.notifications.testMsg.title=Test account.notifications.erase.label=Clear notifications on phone account.notifications.erase.title=Clear notifications account.notifications.email.label=Pairing token @@ -1710,8 +1713,6 @@ account.notifications.marketAlert.trigger.prompt=Percentage distance from market account.notifications.marketAlert.addButton=Add offer alert account.notifications.marketAlert.manageAlertsButton=Manage offer alerts account.notifications.marketAlert.manageAlerts.title=Manage offer alerts -account.notifications.marketAlert.manageAlerts.label=Offer alerts -account.notifications.marketAlert.manageAlerts.item=Offer alert for {0} offer with trigger price {1} and payment account {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=Payment account account.notifications.marketAlert.manageAlerts.header.trigger=Trigger price account.notifications.marketAlert.manageAlerts.header.offerType=Offer type @@ -1751,7 +1752,6 @@ dao.unverifiedBsqBalance=Balance of all unverified transactions (awaiting block dao.lockedForVoteBalance=Used for voting dao.lockedInBonds=Locked in bonds dao.availableNonBsqBalance=Available non-BSQ balance (BTC) -dao.totalBsqBalance=Total BSQ balance dao.reputationBalance=Merit Value (not spendable) dao.tx.published.success=Your transaction has been successfully published. @@ -1886,11 +1886,6 @@ dao.param.currentValue=Current value: {0} dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1}) dao.param.blocks={0} blocks -dao.results.cycle.duration.label=Duration of {0} -dao.results.cycle.duration.value={0} block(s) -dao.results.cycle.value.postFix.isDefaultValue=(default value) -dao.results.cycle.value.postFix.hasChanged=(has been changed in voting) - dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was \ not distributed well in the Bisq network.\n{0} @@ -1934,10 +1929,10 @@ dao.bond.reputation.hash=Hash dao.bond.reputation.lockupButton=Lockup dao.bond.reputation.lockup.headline=Confirm lockup transaction dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\n\ - Mining fee: {3} ({4} Satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to proceed? + Mining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=Confirm unlock transaction dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\n\ - Mining fee: {3} ({4} Satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to proceed? + Mining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=All bonds @@ -2082,7 +2077,6 @@ dao.proofOfBurn.sign=Sign dao.proofOfBurn.message=Message dao.proofOfBurn.sig=Signature dao.proofOfBurn.verify=Verify -dao.proofOfBurn.verify.header=Verify message with key from proof of burn transaction dao.proofOfBurn.verificationResult.ok=Verification succeeded dao.proofOfBurn.verificationResult.failed=Verification failed @@ -2179,19 +2173,18 @@ dao.proposal.display.name=Exact GitHub username dao.proposal.display.link=Link to detailed info dao.proposal.display.link.prompt=Link to proposal dao.proposal.display.requestedBsq=Requested amount in BSQ -dao.proposal.display.bsqAddress=BSQ address dao.proposal.display.txId=Proposal transaction ID dao.proposal.display.proposalFee=Proposal fee dao.proposal.display.myVote=My vote dao.proposal.display.voteResult=Vote result summary dao.proposal.display.bondedRoleComboBox.label=Bonded role type dao.proposal.display.requiredBondForRole.label=Required bond for role -dao.proposal.display.tickerSymbol.label=Ticker Symbol dao.proposal.display.option=Option dao.proposal.table.header.proposalType=Proposal type dao.proposal.table.header.link=Link dao.proposal.table.header.myVote=My vote +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=Remove dao.proposal.table.icon.tooltip.removeProposal=Remove my proposal dao.proposal.table.icon.tooltip.changeVote=Current vote: ''{0}''. Change vote to: ''{1}'' @@ -2229,30 +2222,18 @@ dao.wallet.dashboard.myBalance=My wallet balance dao.wallet.receive.fundYourWallet=Your BSQ receive address dao.wallet.receive.bsqAddress=BSQ wallet address (Fresh unused address) -dao.wallet.receive.dao.headline=The Bisq DAO -dao.wallet.receive.daoInfo=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance \ - model — and the Bisq DAO and BSQ token are the tools that make it possible. -dao.wallet.receive.daoInfo.button=Learn more about the Bisq DAO -dao.wallet.receive.daoTestnetInfo=The mainnet Bisq DAO is not launched yet but you can learn about the Bisq DAO by \ - running it on testnet. -dao.wallet.receive.daoTestnetInfo.button=How to run the Bisq DAO on our testnet -dao.wallet.receive.daoContributorInfo=If you have contributed to Bisq please use the \ - BSQ address below and make a request for taking part of the BSQ genesis distribution. -dao.wallet.receive.daoContributorInfo.button=How to be part of the BSQ genesis distribution - dao.wallet.send.sendFunds=Send funds dao.wallet.send.sendBtcFunds=Send non-BSQ funds (BTC) dao.wallet.send.amount=Amount in BSQ dao.wallet.send.btcAmount=Amount in BTC (non-BSQ funds) dao.wallet.send.setAmount=Set amount to withdraw (min. amount is {0}) -dao.wallet.send.setBtcAmount=Set amount in BTC to withdraw (min. amount is {0}) dao.wallet.send.receiverAddress=Receiver's BSQ address dao.wallet.send.receiverBtcAddress=Receiver's BTC address dao.wallet.send.setDestinationAddress=Fill in your destination address dao.wallet.send.send=Send BSQ funds dao.wallet.send.sendBtc=Send BTC funds dao.wallet.send.sendFunds.headline=Confirm withdrawal request -dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/byte)\nTransaction size: {4} Kb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired mining fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=Latest verified block: {0} dao.wallet.chainHeightSyncing=Awaiting blocks... Verified {0} blocks out of {1} dao.wallet.tx.type=Type @@ -2323,14 +2304,14 @@ dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds fo dao.feeTx.confirm=Confirm {0} transaction dao.feeTx.confirm.details={0} fee: {1}\n\ - Mining fee: {2} ({3} Satoshis/byte)\n\ - Transaction size: {4} Kb\n\n\ + Mining fee: {2} ({3} Satoshis/vbyte)\n\ + Transaction vsize: {4} vKb\n\n\ Are you sure you want to publish the {5} transaction? dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\n\ BTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\n\ - Mining fee: {4} ({5} Satoshis/byte)\n\ - Transaction size: {6} Kb\n\n\ + Mining fee: {4} ({5} Satoshis/vbyte)\n\ + Transaction vsize: {6} vKb\n\n\ If your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\n\ Are you sure you want to publish the {7} transaction? @@ -2408,13 +2389,11 @@ dao.monitor.blindVote.table.numBlindVotes=No. blind votes dao.factsAndFigures.menuItem.supply=BSQ Supply dao.factsAndFigures.menuItem.transactions=BSQ Transactions -dao.factsAndFigures.dashboard.marketPrice=Market data -dao.factsAndFigures.dashboard.price=Latest BSQ/BTC trade price (in Bisq) dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price -dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price -dao.factsAndFigures.dashboard.avgUSDPrice30=30 days volume weighted average USD/BSQ trade price -dao.factsAndFigures.dashboard.marketCap=Market capitalisation (based on trade price) +dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ price +dao.factsAndFigures.dashboard.avgUSDPrice30=30 days volume weighted average USD/BSQ price +dao.factsAndFigures.dashboard.marketCap=Market capitalisation (based on 30 days average USD/BSQ price) dao.factsAndFigures.dashboard.availableAmount=Total available BSQ dao.factsAndFigures.supply.issuedVsBurnt=BSQ issued v. BSQ burnt @@ -2488,10 +2467,8 @@ disputeSummaryWindow.openDate=Ticket opening date disputeSummaryWindow.role=Trader's role disputeSummaryWindow.payout=Trade amount payout disputeSummaryWindow.payout.getsTradeAmount=BTC {0} gets trade amount payout -disputeSummaryWindow.payout.getsAll=BTC {0} gets all +disputeSummaryWindow.payout.getsAll=Max. payout to BTC {0} disputeSummaryWindow.payout.custom=Custom payout -disputeSummaryWindow.payout.adjustAmount=Amount entered exceeds available amount of {0}.\n\ -We adjust this input field to the max possible value. disputeSummaryWindow.payoutAmount.buyer=Buyer's payout amount disputeSummaryWindow.payoutAmount.seller=Seller's payout amount disputeSummaryWindow.payoutAmount.invert=Use loser as publisher @@ -2528,6 +2505,7 @@ disputeSummaryWindow.addSummaryNotes=Add summary notes disputeSummaryWindow.close.button=Close ticket # Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.msg=Ticket closed on {0}\n\ {1} node address: {2}\n\n\ Summary:\n\ @@ -2548,12 +2526,14 @@ disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\n\ No further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions disputeSummaryWindow.close.closePeer=You need to close also the trading peers ticket! disputeSummaryWindow.close.txDetails.headline=Publish refund transaction +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n disputeSummaryWindow.close.txDetails=Spending: {0}\n\ {1}{2}\ - Transaction fee: {3} ({4} satoshis/byte)\n\ - Transaction size: {5} Kb\n\n\ + Transaction fee: {3} ({4} satoshis/vbyte)\n\ + Transaction vsize: {5} vKb\n\n\ Are you sure you want to publish this transaction? disputeSummaryWindow.close.noPayout.headline=Close without any payout @@ -2593,6 +2573,7 @@ filterWindow.btcNode=Filtered Bitcoin nodes (comma sep. addresses + port) filterWindow.preventPublicBtcNetwork=Prevent usage of public Bitcoin network filterWindow.disableDao=Disable DAO filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Min. version required for DAO filterWindow.disableTradeBelowVersion=Min. version required for trading filterWindow.add=Add filter @@ -2631,12 +2612,6 @@ Sorry for the inconvenience but that error case should happen very rarely and in to find better ways to resolve it. selectDepositTxWindow.select=Select deposit transaction -selectBaseCurrencyWindow.headline=Market selection -selectBaseCurrencyWindow.msg=The selected default market is {0}.\n\n\ -If you want to change to another base currency please select one from the drop down box.\n\ -You can also change later the base currency at the \"Settings/Network\" screen. -selectBaseCurrencyWindow.select=Select base currency - sendAlertMessageWindow.headline=Send global notification sendAlertMessageWindow.alertMsg=Alert message sendAlertMessageWindow.enterMsg=Enter message @@ -2758,7 +2733,6 @@ Please check if you have the latest version of Bisq installed.\n\ You can download it at: [HYPERLINK:https://bisq.network/downloads].\n\n\ Please restart the application. popup.warning.startupFailed.twoInstances=Bisq is already running. You cannot run two instances of Bisq. -popup.warning.cryptoTestFailed=Seems that you use a self compiled binary and have not following the build instructions in https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nIf that is not the case and you use the official Bisq binary, please file a bug report to the GitHub page.\nError={0} 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\n\ The trade period ended on {1}\n\n\ @@ -2770,6 +2744,8 @@ popup.warning.noMediatorsAvailable=There are no mediators available. 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.notSufficientConnectionsToBtcNetwork=You need to wait until you have at least {0} connections to the Bitcoin network. popup.warning.downloadNotComplete=You need to wait until the download of missing Bitcoin blocks is complete. +popup.warning.chainNotSynced=The Bisq wallet blockchain height is not synced correctly. If you recently started the application, please wait until one Bitcoin block has been published.\n\n\ + You can check the blockchain height in Settings/Network Info. If more than one block passes and this problem persists it may be stalled, in which case you should do an SPV resync. [HYPERLINK:https://bisq.wiki/Resyncing_SPV_file] popup.warning.removeOffer=Are you sure you want to remove that offer?\nThe maker 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% @@ -2799,7 +2775,9 @@ popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\n\ Trade ID: {2}.\n\n\ Please open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"." +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=price relay popup.warning.seed=seed popup.warning.mandatoryUpdate.trading=Please update to the latest Bisq version. \ @@ -2848,6 +2826,7 @@ popup.info.shutDownWithOpenOffers=Bisq is being shut down, but there are open of (i.e., make sure it doesn't go into standby mode...monitor standby is not a problem). popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\n\ Please make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. +popup.warn.downGradePrevention=Downgrade from version {0} to version {1} is not supported. Please use the latest Bisq version. popup.privateNotification.headline=Important private notification! @@ -2866,12 +2845,6 @@ popup.attention.forTradeWithId=Attention required for trade with ID {0} popup.info.multiplePaymentAccounts.headline=Multiple payment accounts available popup.info.multiplePaymentAccounts.msg=You have multiple payment accounts available for this offer. Please make sure you've picked the right one. -popup.news.launch.headline=Two Major Updates -popup.news.launch.accountSigning.headline=ACCOUNT SIGNING -popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer. -popup.news.launch.ntp.headline=NEW TRADE PROTOCOL -popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant. - popup.accountSigning.selectAccounts.headline=Select payment accounts popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign. popup.accountSigning.selectAccounts.signAll=Sign all payment methods @@ -2909,7 +2882,6 @@ popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=Signing completed popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign @@ -2949,7 +2921,7 @@ systemTray.tooltip=Bisq: A decentralized bitcoin exchange network #################################################################### guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is \ -at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=Trading accounts saved to path:\n{0} guiUtil.accountExport.noAccountSetup=You don't have trading accounts set up for exporting. @@ -3035,6 +3007,7 @@ navigation.portfolio.pending=\"Portfolio/Open trades\" navigation.portfolio.closedTrades=\"Portfolio/History\" navigation.funds.depositFunds=\"Funds/Receive funds\" navigation.settings.preferences=\"Settings/Preferences\" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"Funds/Transactions\" navigation.support=\"Support\" navigation.dao.wallet.receive=\"DAO/BSQ Wallet/Receive\" @@ -3097,12 +3070,12 @@ password.deriveKey=Derive key from password password.walletDecrypted=Wallet successfully decrypted and password protection removed. password.wrongPw=You entered the wrong password.\n\nPlease try entering your password again, carefully checking for typos or spelling errors. password.walletEncrypted=Wallet successfully encrypted and password protection enabled. -password.walletEncryptionFailed=Wallet password could not be set. You might have imported seed words which are not matching the wallet database. Please contact the developers on the Bisq Forum. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=The 2 passwords you entered don't match. password.forgotPassword=Forgot password? password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\n\ - It is highly recommended to make a backup of the application directory and write down your seed words before setting a password! -password.backupWasDone=I have already done a backup + It is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=Wallet seed words seed.enterSeedWords=Enter wallet seed words @@ -3115,7 +3088,7 @@ You must empty this wallet before attempting to restore an older one, as mixing together can lead to invalidated backups.\n\n\ Please finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\n\ In case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\n\ -To open that emergency tool press \"alt + e\" or \"option + e\" . +To open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=I want to restore anyway seed.warn.walletNotEmpty.emptyWallet=I will empty my wallets first seed.warn.notEncryptedAnymore=Your wallets are encrypted.\n\n\ @@ -3165,12 +3138,11 @@ payment.altcoin.tradeInstant.popup=For instant trading it is required that both If you have offers open and you are not available please disable \ those offers under the 'Portfolio' screen. payment.altcoin=Altcoin -payment.select.altcoin=Select or search altcoin +payment.select.altcoin=Select or search Altcoin payment.secret=Secret question payment.answer=Answer payment.wallet=Wallet ID payment.uphold.accountId=Username or email or phone no. -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=Email or phone no. payment.venmo.venmoUserName=Venmo username payment.popmoney.accountId=Email or phone no. @@ -3178,7 +3150,7 @@ payment.promptPay.promptPayId=Citizen ID/Tax ID or phone no. payment.supportedCurrencies=Supported currencies payment.limitations=Limitations payment.salt=Salt for account age verification -payment.error.noHexSalt=The salt need to be in HEX format.\n\ +payment.error.noHexSalt=The salt needs to be in HEX format.\n\ It is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. \ The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=Accept trades from these Euro countries @@ -3194,7 +3166,7 @@ shared.accountSigningState=Account signing status payment.altcoin.address.dyn={0} address payment.altcoin.receiver.address=Receiver's altcoin address payment.accountNr=Account number -payment.emailOrMobile=Email or mobile nr +payment.emailOrMobile=Email or mobile no. payment.useCustomAccountName=Use custom account name payment.maxPeriod=Max. allowed trade period payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3} @@ -3229,9 +3201,9 @@ payment.fasterPayments.newRequirements.info=Some banks have started verifying th salt values from your old account to your new account. This will ensure your existing account''s age and signing \ status are preserved. payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. \ - The receipt must clearly show the seller's full name, country, state and the amount. The buyer will get displayed the seller's email in the trade process. + The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. \ - The receipt must clearly show the seller's full name, city, country and the amount. The buyer will get displayed the seller's email in the trade process. + The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=When using HalCash the BTC buyer needs to send the BTC seller the HalCash code via a text message from their mobile phone.\n\n\ Please make sure to not exceed the maximum amount your bank allows you to send with HalCash. \ The min. amount per withdrawal is 10 EUR and the max. amount is 600 EUR. For repeated withdrawals it is \ @@ -3241,20 +3213,16 @@ payment.halCash.info=When using HalCash the BTC buyer needs to send the BTC sell UI in the create-offer and take-offer screen will adjust the BTC amount so that the EUR amount is correct. You cannot use market \ based price as the EUR amount would be changing with changing prices.\n\n\ In case of a dispute the BTC buyer needs to provide the proof that they sent the EUR. -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\ +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, \ + Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\ \n\ - To mitigate this risk, Bisq sets per-trade limits based on two factors:\n\ + For this payment method, your per-trade limit for buying and selling is {2}.\n\ \n\ - 1. The estimated level of chargeback risk for the payment method used\n\ - 2. The age of your account for that payment method\n\ + This limit only applies to the size of a single trade—you can place as many trades as you like.\n\ \n\ - The account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\ - \n\ - ● During the 1st month, your per-trade limit will be {0}\n\ - ● During the 2nd month, your per-trade limit will be {1}\n\ - ● After the 2nd month, your per-trade limit will be {2}\n\ - \n\ - Please note: limits only apply to trade size. You can place as many trades as you like. + See more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based \ on the following 2 factors:\n\n\ 1. General chargeback risk for the payment method\n\ @@ -3267,18 +3235,18 @@ payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade li ● 30 days after signing, your per-trade buy limit will be {1}\n\ ● 60 days after signing, your per-trade buy limit will be {2}\n\ \n\ - Sell limits are not affected by account signing, and increase with account age.\n\ + Sell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\ \n\ - See more: [HYPERLINK:https://bisq.wiki/Account_limits]\n\ + These limits only apply to the size of a single trade—you can place as many trades as you like. \n\ \n\ - Please note: limits only apply to trade size. You can place as many trades as you like. + See more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=Please confirm your bank allows you to send cash deposits into other peoples' accounts. \ For example, Bank of America and Wells Fargo no longer allow such deposits. payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. payment.account.revolut.addUserNameInfo={0}\n\ - Your existing Revolut account ({1}) does not has set the ''User name''.\n\ + Your existing Revolut account ({1}) does not have a ''User name''.\n\ Please enter your Revolut ''User name'' to update your account data.\n\ This will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=Update Revolut account @@ -3294,7 +3262,7 @@ In all dispute cases, the USPMO sender bears 100% of the burden of responsibilit If you do not understand these requirements, do not trade using USPMO on Bisq. payment.f2f.contact=Contact info -payment.f2f.contact.prompt=How you want to get contacted by the trading peer? (email address, phone number,...) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=City for 'Face to face' meeting payment.f2f.city.prompt=The city will be displayed with the offer payment.f2f.optionalExtra=Optional additional information @@ -3307,8 +3275,8 @@ payment.f2f.info='Face to Face' trades have different rules and come with differ ● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n\ ● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n\ ● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n\ - ● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what \ - happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to \ + ● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence \ + of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to \ an agreement.\n\n\ To be sure you fully understand the differences with 'Face to Face' trades please read the instructions and \ recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] @@ -3320,6 +3288,16 @@ payment.japan.bank=Bank payment.japan.branch=Branch payment.japan.account=Account payment.japan.recipient=Name +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your \ + bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. \ + Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and \ + use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. \ + Use the trade ID for the message field.\n\n\ + Amazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\n\ + For more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -3334,6 +3312,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=Face to face (in person) JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=National banks @@ -3353,6 +3332,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -3392,6 +3373,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -3440,6 +3425,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -3462,11 +3451,10 @@ validation.zero=Input of 0 is not allowed. validation.negative=A negative value is not allowed. validation.fiat.toSmall=Input smaller than minimum possible amount is not allowed. validation.fiat.toLarge=Input larger than maximum possible amount is not allowed. -validation.btc.fraction=Input results in a bitcoin value with a fraction of the smallest unit (satoshi). +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=Input larger than {0} is not allowed. validation.btc.toSmall=Input smaller than {0} is not allowed. -validation.securityDeposit.toSmall=Input smaller than {0} is not allowed. -validation.passwordTooShort=The password you entered is too short. It needs to have min. 8 characters. +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=The password you entered is too long. It cannot be longer than 50 characters. validation.sortCodeNumber={0} must consist of {1} numbers. validation.sortCodeChars={0} must consist of {1} characters. @@ -3484,32 +3472,37 @@ validation.nationalAccountId={0} must consist of {1} numbers. #new validation.invalidInput=Invalid input: {0} validation.accountNrFormat=Account number must be of format: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=Address validation failed because it does not match the structure of a {0} address. -validation.altcoin.ltz.zAddressesNotSupported=LTZ address need to start with L. Addresses starting with z are not supported. -validation.altcoin.zAddressesNotSupported=ZEC address need to start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=Address is not a valid {0} address! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Native segwit addresses (those starting with 'lq') are not supported. -validation.bic.invalidLength=Input length is neither 8 nor 11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=Bank and Country code must be letters validation.bic.invalidLocationCode=BIC contains invalid location code validation.bic.invalidBranchCode=BIC contains invalid branch code validation.bic.sepaRevolutBic=Revolut Sepa accounts are not supported. -validation.btc.invalidFormat=Invalid format of the Bitcoin address. -validation.bsq.invalidFormat=Invalid format of the BSQ address. +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=Invalid address validation.iban.invalidCountryCode=Country code invalid validation.iban.checkSumNotNumeric=Checksum must be numeric validation.iban.nonNumericChars=Non-alphanumeric character detected validation.iban.checkSumInvalid=IBAN checksum is invalid -validation.iban.invalidLength=Number must have length 15 to 34 chars. +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=Non-Canadian area code -validation.interacETransfer.invalidPhone=Invalid phone number format and not an email address +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=Must contain only letters, numbers, spaces and/or the symbols ' _ , . ? - validation.interacETransfer.invalidAnswer=Must be one word and contain only letters, numbers, and/or the symbol - validation.inputTooLarge=Input must not be larger than {0} validation.inputTooSmall=Input has to be larger than {0} validation.inputToBeAtLeast=Input has to be at least {0} -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=Length must be between {0} and {1} validation.pattern=Input must be of format: {0} validation.noHexString=The input is not in HEX format. @@ -3521,8 +3514,8 @@ validation.numberFormatException=Number format exception {0} validation.mustNotBeNegative=Input must not be negative validation.phone.missingCountryCode=Need two letter country code to validate phone number validation.phone.invalidCharacters=Phone number {0} contains invalid characters -validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number -validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number -validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. \ +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. \ The correct dialing code is {2}. validation.invalidAddressList=Must be comma separated list of valid addresses diff --git a/core/src/main/resources/i18n/displayStrings_cs.properties b/core/src/main/resources/i18n/displayStrings_cs.properties new file mode 100644 index 0000000000..a59af6365d --- /dev/null +++ b/core/src/main/resources/i18n/displayStrings_cs.properties @@ -0,0 +1,2858 @@ +# Keep display strings organized by domain +# Naming convention: We use camelCase and dot separated name spaces. +# Use as many sub spaces as required to make the structure clear, but as little as possible. +# E.g.: [main-view].[component].[description] +# In some cases we use enum values or constants to map to display strings + +# A annoying issue with property files is that we need to use 2 single quotes in display string +# containing variables (e.g. {0}), otherwise the variable will not be resolved. +# In display string which do not use a variable a single quote is ok. +# E.g. Don''t .... {1} + +# We use sometimes dynamic parts which are put together in the code and therefore sometimes use line breaks or spaces +# at the end of the string. Please never remove any line breaks or spaces. They are there with a purpose! +# To make longer strings with better readable you can make a line break with \ which does not result in a line break +# in the display but only in the editor. + +# Please use in all language files the exact same order of the entries, that way a comparison is easier. + +# Please try to keep the length of the translated string similar to English. If it is longer it might break layout or +# get truncated. We will need some adjustments in the UI code to support that but we want to keep effort at the minimum. + + +#################################################################### +# Shared +#################################################################### + +shared.readMore=Přečíst více +shared.openHelp=Otevřít nápovědu +shared.warning=Varování +shared.close=Zavřít +shared.cancel=Zrušit +shared.ok=OK +shared.yes=Ano +shared.no=Ne +shared.iUnderstand=Rozumím +shared.na=N/A +shared.shutDown=Vypnout +shared.reportBug=Nahlásit chybu na GitHubu +shared.buyBitcoin=Koupit bitcoin +shared.sellBitcoin=Prodat bitcoin +shared.buyCurrency=Koupit {0} +shared.sellCurrency=Prodat {0} +shared.buyingBTCWith=nakoupit BTC za {0} +shared.sellingBTCFor=prodat BTC za {0} +shared.buyingCurrency=nakoupit {0} (prodat BTC) +shared.sellingCurrency=prodat {0} (nakoupit BTC) +shared.buy=koupit +shared.sell=prodat +shared.buying=koupit +shared.selling=prodat +shared.P2P=P2P +shared.oneOffer=nabídka +shared.multipleOffers=nabídky +shared.Offer=Nabídka +shared.offerVolumeCode={0} Objem nabídky +shared.openOffers=otevřené nabídky +shared.trade=obchod +shared.trades=obchody +shared.openTrades=otevřené obchody +shared.dateTime=Datum/Čas +shared.price=Cena +shared.priceWithCur=Cena v {0} +shared.priceInCurForCur=Cena v {0} za 1 {1} +shared.fixedPriceInCurForCur=Pevná cena v {0} za 1 {1} +shared.amount=Množství +shared.txFee=Transakční poplatek +shared.tradeFee=Obchodní poplatek +shared.buyerSecurityDeposit=Vklad kupujícího +shared.sellerSecurityDeposit=Vklad prodejce +shared.amountWithCur=Množství v {0} +shared.volumeWithCur=Objem v {0} +shared.currency=Měna +shared.market=Trh +shared.paymentMethod=Platební metoda +shared.tradeCurrency=Obchodní měna +shared.offerType=Typ nabídky +shared.details=Detaily +shared.address=Adresa +shared.balanceWithCur=Zůstatek v {0} +shared.txId=ID transakce +shared.confirmations=Potvrzení +shared.revert=Návratová Tx +shared.select=Vybrat +shared.usage=Použití +shared.state=Stav +shared.tradeId=ID obchodu +shared.offerId=ID nabídky +shared.bankName=Jméno banky +shared.acceptedBanks=Přijímané banky +shared.amountMinMax=Množství (min - max) +shared.amountHelp=Pokud je v nabídce nastavena minimální a maximální částka, můžete obchodovat s jakoukoli částkou v tomto rozsahu. +shared.remove=Odstranit +shared.goTo=Přejít na {0} +shared.BTCMinMax=BTC (min - max) +shared.removeOffer=Odstranit nabídku +shared.dontRemoveOffer=Neodstraňovat nabídku +shared.editOffer=Upravit nabídku +shared.openLargeQRWindow=Otevřít velké okno s QR kódem +shared.tradingAccount=Obchodní účet +shared.faq=Navštívit stránku FAQ +shared.yesCancel=Ano, zrušit +shared.nextStep=Další krok +shared.selectTradingAccount=Vyberte obchodní účet +shared.fundFromSavingsWalletButton=Přesunout finance z Bisq peněženky +shared.fundFromExternalWalletButton=Otevřít vaši externí peněženku pro financování +shared.openDefaultWalletFailed=Nepodařilo se otevřít aplikaci bitcoinové peněženky. Jste si jisti, že máte máte nějakou nainstalovanou? +shared.distanceInPercent=Vzdálenost v % z tržní ceny +shared.belowInPercent=Pod % z tržní ceny +shared.aboveInPercent=Nad % z tržní ceny +shared.enterPercentageValue=Zadejte % hodnotu +shared.OR=NEBO +shared.notEnoughFunds=Ve své peněžence Bisq nemáte pro tuto transakci dostatek prostředků — je potřeba {0}, ale k dispozici je pouze {1}.\n\nPřidejte prostředky z externí peněženky nebo financujte svou peněženku Bisq v části Prostředky > Přijmout prostředky. +shared.waitingForFunds=Čekání na finance... +shared.depositTransactionId=ID vkladové transakce +shared.TheBTCBuyer=BTC kupující +shared.You=Vy +shared.reasonForPayment=Účel platby +shared.sendingConfirmation=Posílám potvrzení... +shared.sendingConfirmationAgain=Prosím pošlete potvrzení znovu +shared.exportCSV=Exportovat do CSV +shared.exportJSON=Exportovat do JSON +shared.noDateAvailable=Žádné datum není k dispozici +shared.noDetailsAvailable=Detaily nejsou k dispozici +shared.notUsedYet=Ještě nepoužito +shared.date=Datum +shared.sendFundsDetailsWithFee=Odesílání: {0}\nZ adresy: {1}\nNa přijímací adresu: {2}.\nPožadovaný poplatek za těžbu je: {3} ({4} satoshi/byte)\nTransakční vsize: {5} vKb\n\nPříjemce obdrží: {6}\n\nOpravdu chcete tuto částku vybrat? +# suppress inspection "TrailingSpacesInProperty" +shared.sendFundsDetailsDust=Bisq zjistil, že tato transakce by vytvořila drobné mince, které jsou pod limitem drobných mincí (a není to povoleno pravidly pro bitcoinový konsenzus). Místo toho budou tyto drobné mince ({0} satoshi {1}) přidány k poplatku za těžbu.\n\n\n +shared.copyToClipboard=Kopírovat do schránky +shared.language=Jazyk +shared.country=Země +shared.applyAndShutDown=Potvrdit a ukončit +shared.selectPaymentMethod=Vybrat platební metodu +shared.accountNameAlreadyUsed=Toto jméno účtu je již použito pro jiný účet.\nPoužijte prosím jiné jméno. +shared.askConfirmDeleteAccount=Skutečně chcete smazat vybraný účet? +shared.cannotDeleteAccount=Tento účet nemůžete smazat, protože je použit v otevřené nabídce (nebo v otevřeném obchodě). +shared.noAccountsSetupYet=Ještě nejsou nastaveny žádné účty +shared.manageAccounts=Spravovat účty +shared.addNewAccount=Přidat nový účet +shared.ExportAccounts=Exportovat účty +shared.importAccounts=Importovat účty +shared.createNewAccount=Vytvořit nový účet +shared.saveNewAccount=Uložit nový účet +shared.selectedAccount=Vybraný účet +shared.deleteAccount=Smazat účet +shared.errorMessageInline=\nChybová zpráva {0} +shared.errorMessage=Chybová zpráva +shared.information=Informace +shared.name=Jméno +shared.id=ID +shared.dashboard=Dashboard +shared.accept=Příjmout +shared.balance=Zůstatek +shared.save=Uložit +shared.onionAddress=Onion adresa +shared.supportTicket=úkol pro podporu +shared.dispute=spor +shared.mediationCase=mediační případ +shared.seller=prodejce +shared.buyer=kupující +shared.allEuroCountries=Všechny Euro země +shared.acceptedTakerCountries=Země příjemce akceptovány +shared.tradePrice=Tržní cena +shared.tradeAmount=Výše obchodu +shared.tradeVolume=Objem obchodu +shared.invalidKey=Vložený klíč není správný +shared.enterPrivKey=Pro odemknutí vložte privátní klíč +shared.makerFeeTxId=ID transakčního poplatku tvůrce +shared.takerFeeTxId=ID transakčního poplatku příjemce +shared.payoutTxId=ID platební transakce +shared.contractAsJson=Kontakt v JSON formátu +shared.viewContractAsJson=Zobrazit kontrakt v JSON formátu +shared.contract.title=Kontrakt pro obchod s ID: {0} +shared.paymentDetails=BTC {0} detaily platby +shared.securityDeposit=Kauce +shared.yourSecurityDeposit=Vaše kauce +shared.contract=Kontrakt +shared.messageArrived=Zpráva dorazila. +shared.messageStoredInMailbox=Zpráva uložena ve schránce +shared.messageSendingFailed=Odeslání zprávy selhalo. Chyba: {0} +shared.unlock=Odemknout +shared.toReceive=přijmout +shared.toSpend=utratit +shared.btcAmount=Částka BTC +shared.yourLanguage=Vaše jazyky +shared.addLanguage=Přidat jazyk +shared.total=Celkem +shared.totalsNeeded=Potřebné prostředky +shared.tradeWalletAddress=Adresa obchodní peněženky +shared.tradeWalletBalance=Zůstatek obchodní peněženky +shared.makerTxFee=Tvůrce: {0} +shared.takerTxFee=Příjemce: {0} +shared.iConfirm=Potvrzuji +shared.tradingFeeInBsqInfo=odpovídá {0} použitému jako obchodní poplatek +shared.openURL=Otevřené {0} +shared.fiat=Fiat +shared.crypto=Krypto +shared.all=Vše +shared.edit=Upravit +shared.advancedOptions=Pokročilé možnosti +shared.interval=Interval +shared.actions=Akce +shared.buyerUpperCase=Kupující +shared.sellerUpperCase=Prodejce +shared.new=NOVÝ +shared.blindVoteTxId=ID transakce se slepým hlasováním +shared.proposal=Návrh +shared.votes=Hlasů +shared.learnMore=Zjistit více +shared.dismiss=Zavřít +shared.selectedArbitrator=Zvolený rozhodce +shared.selectedMediator=Zvolený mediátor +shared.selectedRefundAgent=Zvolený rozhodce +shared.mediator=Mediátor +shared.arbitrator=Rozhodce +shared.refundAgent=Rozhodce +shared.refundAgentForSupportStaff=Vrátit finance agentovi +shared.delayedPayoutTxId=ID zpožděné platební transakce +shared.delayedPayoutTxReceiverAddress=Zpožděná výplatní transakce odeslána na +shared.unconfirmedTransactionsLimitReached=Momentálně máte příliš mnoho nepotvrzených transakcí. Prosím zkuste to znovu později. + + +#################################################################### +# UI views +#################################################################### + +#################################################################### +# MainView +#################################################################### + +mainView.menu.market=Trh +mainView.menu.buyBtc=Koupit BTC +mainView.menu.sellBtc=Prodat BTC +mainView.menu.portfolio=Portfolio +mainView.menu.funds=Finance +mainView.menu.support=Podpora +mainView.menu.settings=Nastavení +mainView.menu.account=Účet +mainView.menu.dao=DAO + +mainView.marketPriceWithProvider.label=Tržní cena {0} +mainView.marketPrice.bisqInternalPrice=Cena posledního Bisq obchodu +mainView.marketPrice.tooltip.bisqInternalPrice=Neexistují tržní ceny od externích poskytovatelů cenových feedů.\nZobrazená cena je nejnovější obchodní cena Bisq pro tuto měnu. +mainView.marketPrice.tooltip=Tržní cena je poskytována {0}{1}\nPoslední aktualizace: {2}\nURL uzlu poskytovatele: {3} +mainView.balance.available=Dostupný zůstatek +mainView.balance.reserved=Rezervováno v nabídkách +mainView.balance.locked=Zamčené v obchodech +mainView.balance.reserved.short=Rezervováno +mainView.balance.locked.short=Zamčeno + +mainView.footer.usingTor=(používá Tor) +mainView.footer.localhostBitcoinNode=(localhost) +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Aktuální sazba poplatku: {0} sat/vB +mainView.footer.btcInfo.initializing=Připojování do Bitcoinové sítě +mainView.footer.bsqInfo.synchronizing=/ Synchronizace DAO +mainView.footer.btcInfo.synchronizingWith=Synchronizace s +mainView.footer.btcInfo.synchronizedWith=Synchronizováno s +mainView.footer.btcInfo.connectingTo=Připojování +mainView.footer.btcInfo.connectionFailed=Připojení se nezdařilo +mainView.footer.p2pInfo=Bitcoin síťové nody: {0} / Bisq síťové nody: {1} +mainView.footer.daoFullNode=DAO full node + +mainView.bootstrapState.connectionToTorNetwork=(1/4) Připojování do sítě Tor... +mainView.bootstrapState.torNodeCreated=(2/4) Tor node vytvořen +mainView.bootstrapState.hiddenServicePublished=(3/4) Skrytá služba publikována +mainView.bootstrapState.initialDataReceived=(4/4) Iniciační data přijata + +mainView.bootstrapWarning.noSeedNodesAvailable=Žádné seed nody nejsou k dispozici +mainView.bootstrapWarning.noNodesAvailable=Žádné seed ani peer nody k dispozici +mainView.bootstrapWarning.bootstrappingToP2PFailed=Zavádění do sítě Bisq se nezdařilo + +mainView.p2pNetworkWarnMsg.noNodesAvailable=Pro vyžádání dat nejsou k dispozici žádné seed ani peer nody.\nZkontrolujte připojení k internetu nebo zkuste aplikaci restartovat. +mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Připojení k síti Bisq selhalo (nahlášená chyba: {0}).\nZkontrolujte připojení k internetu nebo zkuste aplikaci restartovat. + +mainView.walletServiceErrorMsg.timeout=Připojení k síti Bitcoin selhalo kvůli vypršení časového limitu. +mainView.walletServiceErrorMsg.connectionError=Připojení k síti Bitcoin selhalo kvůli chybě {0} + +mainView.walletServiceErrorMsg.rejectedTxException=Transakce byla ze sítě zamítnuta.\n\n{0} + +mainView.networkWarning.allConnectionsLost=Ztratili jste připojení ke všem {0} síťovým peer nodům.\nMožná jste ztratili připojení k internetu nebo byl váš počítač v pohotovostním režimu. +mainView.networkWarning.localhostBitcoinLost=Ztratili jste připojení k Bitcoinovému localhost nodu.\nRestartujte aplikaci Bisq a připojte se k jiným Bitcoinovým nodům nebo restartujte Bitcoinový localhost node. +mainView.version.update=(Dostupná aktualizace) + + +#################################################################### +# MarketView +#################################################################### + +market.tabs.offerBook=Seznam nabídek +market.tabs.spread=Detaily +market.tabs.trades=Obchody + +# OfferBookChartView +market.offerBook.buyAltcoin=Koupit {0} (prodat {1}) +market.offerBook.sellAltcoin=Prodat {0} (koupit {1}) +market.offerBook.buyWithFiat=Koupit {0} +market.offerBook.sellWithFiat=Prodat {0} +market.offerBook.sellOffersHeaderLabel=prodat {0} +market.offerBook.buyOffersHeaderLabel=Buy {0} od +market.offerBook.buy=Chci koupit bitcoin +market.offerBook.sell=Chci prodat bitcoin + +# SpreadView +market.spread.numberOfOffersColumn=Všechny nabídky ({0}) +market.spread.numberOfBuyOffersColumn=Koupit BTC ({0}) +market.spread.numberOfSellOffersColumn=Prodat BTC ({0}) +market.spread.totalAmountColumn=Celkem BTC ({0}) +market.spread.spreadColumn=Rozptyl + +# TradesChartsView +market.trades.nrOfTrades=Obchodů: {0} +market.trades.tooltip.volumeBar=Objem: {0}\nPočet obchodů: {1}\nDatum: {2} +market.trades.tooltip.candle.open=Otevřené: +market.trades.tooltip.candle.close=Zavřít: +market.trades.tooltip.candle.high=Nejvyšší: +market.trades.tooltip.candle.low=Nejnižší: +market.trades.tooltip.candle.average=Průměr: +market.trades.tooltip.candle.median=Medián: +market.trades.tooltip.candle.date=Datum: + +#################################################################### +# OfferView +#################################################################### + +offerbook.createOffer=Vytvořit nabídku +offerbook.takeOffer=Přijmout nabídku +offerbook.takeOfferToBuy=Přijmout nabídku na nákup {0} +offerbook.takeOfferToSell=Příjmout nabídku k prodeji {0} +offerbook.trader=Obchodník +offerbook.offerersBankId=ID banky tvůrce (BIC/SWIFT): {0} +offerbook.offerersBankName=Jméno banky tvůrce: {0} +offerbook.offerersBankSeat=Sídlo banky tvůrce: {0} +offerbook.offerersAcceptedBankSeatsEuro=Přijatá sídla bank (příjemce): Všechny země Eura +offerbook.offerersAcceptedBankSeats=Přijatá sídla bank (příjemce):\n {0} +offerbook.availableOffers=Dostupné nabídky +offerbook.filterByCurrency=Filtrovat podle měny +offerbook.filterByPaymentMethod=Filtrovat podle platební metody +offerbook.timeSinceSigning=Podepsáno od +offerbook.timeSinceSigning.info=Tento účet byl ověřen a {0} +offerbook.timeSinceSigning.info.arbitrator=podepsan rozhodcem a může podepisovat účty partnerů +offerbook.timeSinceSigning.info.peer=podepsán partnerem, který čeká na zrušení limitů +offerbook.timeSinceSigning.info.peerLimitLifted=podepsán partnerem a limity byly zrušeny +offerbook.timeSinceSigning.info.signer=podepsán partnerem a může podepsat účty partnera (zrušené limity) +offerbook.timeSinceSigning.info.banned=účet byl zablokován +offerbook.timeSinceSigning.daysSinceSigning={0} dní +offerbook.timeSinceSigning.daysSinceSigning.long={0} od podpisu +offerbook.xmrAutoConf=Je automatické potvrzení povoleno + +offerbook.timeSinceSigning.help=Když úspěšně dokončíte obchod s peerem, který má podepsaný platební účet, je váš platební účet podepsán.\n{0} dní později se počáteční limit {1} zruší a váš účet může podepisovat platební účty ostatních peerů. +offerbook.timeSinceSigning.notSigned=Dosud nepodepsáno +offerbook.timeSinceSigning.notSigned.noNeed=N/A +shared.notSigned=Tento účet dosud nebyl podepsán +shared.notSigned.noNeed=Tento typ účtu nepoužívá podepisování + +offerbook.nrOffers=Počet nabídek: {0} +offerbook.volume={0} (min - max) +offerbook.deposit=Vklad BTC (%) +offerbook.deposit.help=Kauce zaplacená každým obchodníkem k zajištění obchodu. Bude vrácena po dokončení obchodu. + +offerbook.createOfferToBuy=Vytvořit novou nabídku k nákupu {0} +offerbook.createOfferToSell=Vytvořit novou nabídku k prodeji {0} +offerbook.createOfferToBuy.withFiat=Vytvořit novou nabídku k nákupu {0} za {1} +offerbook.createOfferToSell.forFiat=Vytvořit novou nabídku k prodeji {0} za {1} +offerbook.createOfferToBuy.withCrypto=Vytvořit novou nabídku k prodeji {0} (koupit {1}) +offerbook.createOfferToSell.forCrypto=Vytvořit novou nabídku na nákup {0} (prodat {1}) + +offerbook.takeOfferButton.tooltip=Využijte nabídku pro {0} +offerbook.yesCreateOffer=Ano, vytvořit nabídku +offerbook.setupNewAccount=Založit nový obchodní účet +offerbook.removeOffer.success=Odebrání nabídky bylo úspěšné. +offerbook.removeOffer.failed=Odebrání nabídky selhalo:\n{0} +offerbook.deactivateOffer.failed=Deaktivace nabídky se nezdařila:\n{0} +offerbook.activateOffer.failed=Zveřejnění nabídky se nezdařilo:\n{0} +offerbook.withdrawFundsHint=Prostředky, které jste zaplatili, můžete vybrat z obrazovky {0}. + +offerbook.warning.noTradingAccountForCurrency.headline=Žádný platební účet pro vybranou měnu +offerbook.warning.noTradingAccountForCurrency.msg=Pro vybranou měnu nemáte nastavený platební účet.\n\nChcete místo toho vytvořit nabídku pro jinou měnu? +offerbook.warning.noMatchingAccount.headline=Žádný odpovídající platební účet. +offerbook.warning.noMatchingAccount.msg=Tato nabídka používá platební metodu, kterou jste dosud nenastavili.\n\nChcete nyní založit nový platební účet? + +offerbook.warning.counterpartyTradeRestrictions=Tuto nabídku nelze přijmout z důvodu obchodních omezení protistrany + +offerbook.warning.newVersionAnnouncement=S touto verzí softwaru mohou obchodní partneři navzájem ověřovat a podepisovat platební účty ostatních a vytvářet tak síť důvěryhodných platebních účtů.\n\nPo úspěšném obchodování s partnerským účtem s ověřeným platebním účtem bude váš platební účet podepsán a obchodní limity budou zrušeny po určitém časovém intervalu (délka tohoto intervalu závisí na způsobu ověření).\n\nDalší informace o podepsání účtu naleznete v dokumentaci na adrese [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. + +popup.warning.tradeLimitDueAccountAgeRestriction.seller=Povolená částka obchodu je omezena na {0} z důvodu bezpečnostních omezení na základě následujících kritérií:\n- Účet kupujícího nebyl podepsán rozhodcem ani obchodním partnerem\n- Doba od podpisu účtu kupujícího není alespoň 30 dní\n- Způsob platby této nabídky je považován za riskantní pro bankovní zpětné zúčtování\n\n{1} +popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Povolená částka obchodu je omezena na {0} z důvodu bezpečnostních omezení na základě následujících kritérií:\n- Váš účet nebyl podepsán rozhodcem ani obxhodním partnerem\n- Čas od podpisu vašeho účtu není alespoň 30 dní\n- Způsob platby této nabídky je považován za riskantní pro bankovní zpětné zúčtování\n\n{1} + +offerbook.warning.wrongTradeProtocol=Tato nabídka vyžaduje jinou verzi protokolu než ta, která byla použita ve vaší verzi softwaru.\n\nZkontrolujte, zda máte nainstalovanou nejnovější verzi, jinak uživatel, který nabídku vytvořil, použil starší verzi.\n\nUživatelé nemohou obchodovat s nekompatibilní verzí obchodního protokolu. +offerbook.warning.userIgnored=Do seznamu ignorovaných uživatelů jste přidali onion adresu tohoto uživatele. +offerbook.warning.offerBlocked=Tato nabídka byla blokována vývojáři Bisq.\nPravděpodobně existuje neošetřená chyba způsobující problémy při přijetí této nabídky. +offerbook.warning.currencyBanned=Měna použitá v této nabídce byla blokována vývojáři Bisq.\nDalší informace naleznete na fóru Bisq. +offerbook.warning.paymentMethodBanned=Vývojáři Bisq zablokovali způsob platby použitý v této nabídce.\nDalší informace naleznete na fóru Bisq. +offerbook.warning.nodeBlocked=Onion adresa tohoto obchodníka byla zablokována vývojáři Bisq.\nPravděpodobně existuje neošetřená chyba způsobující problémy při přijímání nabídek od tohoto obchodníka. +offerbook.warning.requireUpdateToNewVersion=Vaše verze Bisq již není kompatibilní pro obchodování. Aktualizujte prosím na nejnovější verzi Bisq na adrese [HYPERLINK:https://bisq.network/downloads]. +offerbook.warning.offerWasAlreadyUsedInTrade=Tuto nabídku nemůžete přijmout, protože jste ji již dříve využili. Je možné, že váš předchozí pokus o přijetí nabídky vyústil v neúspěšný obchod. + +offerbook.info.sellAtMarketPrice=Budete prodávat za tržní cenu (aktualizováno každou minutu). +offerbook.info.buyAtMarketPrice=Budete nakupovat za tržní cenu (aktualizováno každou minutu). +offerbook.info.sellBelowMarketPrice=Získáte o {0} méně než je aktuální tržní cena (aktualizováno každou minutu). +offerbook.info.buyAboveMarketPrice=Platíte o {0} více, než je aktuální tržní cena (aktualizováno každou minutu). +offerbook.info.sellAboveMarketPrice=Získáte o {0} více, než je aktuální tržní cena (aktualizováno každou minutu). +offerbook.info.buyBelowMarketPrice=Platíte o {0} méně, než je aktuální tržní cena (aktualizováno každou minutu). +offerbook.info.buyAtFixedPrice=Budete nakupovat za tuto pevnou cenu. +offerbook.info.sellAtFixedPrice=Budete prodávat za tuto pevnou cenu. +offerbook.info.noArbitrationInUserLanguage=V případě sporu mějte na paměti, že arbitráž pro tuto nabídku bude řešit {0}. Jazyk je aktuálně nastaven na {1}. +offerbook.info.roundedFiatVolume=Částka byla zaokrouhlena, aby se zvýšilo soukromí vašeho obchodu. + +#################################################################### +# Offerbook / Create offer +#################################################################### + +createOffer.amount.prompt=Vložte množství v BTC +createOffer.price.prompt=Zadejte cenu +createOffer.volume.prompt=Vložte množství v {0} +createOffer.amountPriceBox.amountDescription=Množství BTC k {0} +createOffer.amountPriceBox.buy.volumeDescription=Částka v {0}, kterou chcete utratit +createOffer.amountPriceBox.sell.volumeDescription=Částka v {0}, kterou chcete přijmout +createOffer.amountPriceBox.minAmountDescription=Minimální množství BTC +createOffer.securityDeposit.prompt=Kauce +createOffer.fundsBox.title=Financujte svou nabídku +createOffer.fundsBox.offerFee=Obchodní poplatek +createOffer.fundsBox.networkFee=Poplatek za těžbu +createOffer.fundsBox.placeOfferSpinnerInfo=Probíhá publikování nabídky ... +createOffer.fundsBox.paymentLabel=Bisq obchod s ID {0} +createOffer.fundsBox.fundsStructure=({0} kauce, {1} obchodní poplatek, {2} poplatek za těžbu) +createOffer.fundsBox.fundsStructure.BSQ=({0} kauce, {1} poplatek za těžbu) + {2} obchodní poplatek +createOffer.success.headline=Vaše nabídka byla publikována +createOffer.success.info=Otevřené nabídky můžete spravovat na stránce \"Portfolio/Moje otevřené nabídky\". +createOffer.info.sellAtMarketPrice=Vždy budete prodávat za tržní cenu, protože cena vaší nabídky bude průběžně aktualizována. +createOffer.info.buyAtMarketPrice=Vždy budete nakupovat za tržní cenu, protože cena vaší nabídky bude průběžně aktualizována. +createOffer.info.sellAboveMarketPrice=Vždy získáte o {0} % více, než je aktuální tržní cena, protože cena vaší nabídky bude průběžně aktualizována. +createOffer.info.buyBelowMarketPrice=Vždy zaplatíte o {0} % méně, než je aktuální tržní cena, protože cena vaší nabídky bude průběžně aktualizována. +createOffer.warning.sellBelowMarketPrice=Vždy získáte o {0} % méně, než je aktuální tržní cena, protože cena vaší nabídky bude průběžně aktualizována. +createOffer.warning.buyAboveMarketPrice=Vždy zaplatíte o {0} % více, než je aktuální tržní cena, protože cena vaší nabídky bude průběžně aktualizována. +createOffer.tradeFee.descriptionBTCOnly=Obchodní poplatek +createOffer.tradeFee.descriptionBSQEnabled=Zvolte měnu obchodního poplatku +createOffer.tradeFee.fiatAndPercent=≈ {0} / {1} z částky obchodu + +# new entries +createOffer.placeOfferButton=Přehled: Umístěte nabídku k {0} bitcoinu +createOffer.alreadyFunded=Tuto nabídku jste již financovali.\nVaše finanční prostředky byly přesunuty do vaší lokální peněženky Bisq a jsou k dispozici pro výběr na obrazovce \"Prostředky/Odeslat finanční prostředky\". +createOffer.createOfferFundWalletInfo.headline=Financujte svou nabídku +# suppress inspection "TrailingSpacesInProperty" +createOffer.createOfferFundWalletInfo.tradeAmount=- Výše obchodu: {0}\n +createOffer.createOfferFundWalletInfo.msg=Do této nabídky musíte vložit {0}.\n\nTyto prostředky jsou rezervovány ve vaší lokální peněžence a budou uzamčeny na vkladové multisig adrese, jakmile někdo příjme vaši nabídku.\n\nČástka je součtem:\n{1}- Vaše kauce: {2}\n- Obchodní poplatek: {3}\n- Poplatek za těžbu: {4}\n\nPři financování obchodu si můžete vybrat ze dvou možností:\n- Použijte svou peněženku Bisq (pohodlné, ale transakce mohou být propojitelné) NEBO\n- Přenos z externí peněženky (potenciálně více soukromé)\n\nPo uzavření tohoto vyskakovacího okna se zobrazí všechny možnosti a podrobnosti financování. + +# only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) +createOffer.amountPriceBox.error.message=Při zadávání nabídky došlo k chybě:\n\n{0}\n\nPeněženku ještě neopustily žádné finanční prostředky.\nRestartujte aplikaci a zkontrolujte síťové připojení. +createOffer.setAmountPrice=Nastavit množství a cenu +createOffer.warnCancelOffer=Tuto nabídku jste již financovali.\nPokud ji nyní zrušíte, budou vaše prostředky přesunuty do lokální peněženky Bisq a jsou k dispozici pro výběr na obrazovce \"Prostředky/Odeslat prostředky\".\nOpravdu ji chcete zrušit? +createOffer.timeoutAtPublishing=Při zveřejnění nabídky došlo k vypršení časového limitu. +createOffer.errorInfo=\n\nTvůrčí poplatek je již zaplacen. V nejhorším případě jste tento poplatek ztratili.\nZkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit. +createOffer.tooLowSecDeposit.warning=Nastavili jstekauci na nižší hodnotu, než je doporučená výchozí hodnota {0}.\nOpravdu chcete použít nižší kauci? +createOffer.tooLowSecDeposit.makerIsSeller=Poskytuje vám to menší ochranu v případě, že obchodní partner nedodrží obchodní protokol. +createOffer.tooLowSecDeposit.makerIsBuyer=Poskytuje to menší ochranu obchodním partnerům, že dodržujete obchodní protokol, protože máte méně rizikových vkladů. Ostatní uživatelé mohou raději využít jiné nabídky než ty vaše. +createOffer.resetToDefault=Ne, restartovat na výchozí hodnotu +createOffer.useLowerValue=Ano, použijte moji nižší hodnotu +createOffer.priceOutSideOfDeviation=Cena, kterou jste zadali, je mimo max. povolenou odchylku od tržní ceny.\nMax. povolená odchylka je {0} a lze ji upravit v preferencích. +createOffer.changePrice=Změnit cenu +createOffer.tac=Publikováním této nabídky souhlasím s obchodováním s jakýmkoli obchodníkem, který splňuje podmínky definované na této obrazovce. +createOffer.currencyForFee=Obchodní poplatek +createOffer.setDeposit=Nastavit kauci kupujícího (%) +createOffer.setDepositAsBuyer=Nastavit mou kauci jako kupujícího (%) +createOffer.setDepositForBothTraders=Nastavit kauci obou obchodníků (%) +createOffer.securityDepositInfo=Kauce vašeho kupujícího bude {0} +createOffer.securityDepositInfoAsBuyer=Vaše kauce jako kupující bude {0} +createOffer.minSecurityDepositUsed=Je použita min. záloha kupujícího + + +#################################################################### +# Offerbook / Take offer +#################################################################### + +takeOffer.amount.prompt=Vložte množství v BTC +takeOffer.amountPriceBox.buy.amountDescription=Množství BTC na prodej +takeOffer.amountPriceBox.sell.amountDescription=Množství BTC k nákupu +takeOffer.amountPriceBox.priceDescription=Cena za bitcoin v {0} +takeOffer.amountPriceBox.amountRangeDescription=Možný rozsah množství +takeOffer.amountPriceBox.warning.invalidBtcDecimalPlaces=Částka, kterou jste zadali, přesahuje počet povolených desetinných míst.\nČástka byla upravena na 4 desetinná místa. +takeOffer.validation.amountSmallerThanMinAmount=Částka nesmí být menší než minimální částka stanovená v nabídce. +takeOffer.validation.amountLargerThanOfferAmount=Vstupní částka nesmí být vyšší než částka stanovená v nabídce. +takeOffer.validation.amountLargerThanOfferAmountMinusFee=Toto vstupní množství by vytvořilo zanedbatelné drobné pro prodejce BTC. +takeOffer.fundsBox.title=Financujte svůj obchod +takeOffer.fundsBox.isOfferAvailable=Zkontrolujte, zda je nabídka k dispozici ... +takeOffer.fundsBox.tradeAmount=Částka k prodeji +takeOffer.fundsBox.offerFee=Obchodní poplatek +takeOffer.fundsBox.networkFee=Celkové poplatky za těžbu +takeOffer.fundsBox.takeOfferSpinnerInfo=Probíhá využití nabídky... +takeOffer.fundsBox.paymentLabel=Bisq obchod s ID {0} +takeOffer.fundsBox.fundsStructure=({0} kauce, {1} obchodní poplatek, {2} poplatek za těžbu) +takeOffer.success.headline=Úspěšně jste přijali nabídku. +takeOffer.success.info=Stav vašeho obchodu můžete vidět v \"Portfolio/Otevřené obchody\". +takeOffer.error.message=Při převzetí nabídky došlo k chybě.\n\n{0} + +# new entries +takeOffer.takeOfferButton=Přehled: Využijte nabídku na {0} bitcoin(y)\n +takeOffer.noPriceFeedAvailable=Tuto nabídku nemůžete vzít, protože používá procentuální cenu založenou na tržní ceně, ale není k dispozici žádný zdroj cen. +takeOffer.alreadyFunded.movedFunds=Tuto nabídku jste již financovali.\nVaše finanční prostředky byly přesunuty do vaší lokální peněženky Bisq a jsou k dispozici pro výběr na obrazovce \"Prostředky/Odeslat finanční prostředky\". +takeOffer.takeOfferFundWalletInfo.headline=Financujte svůj obchod +# suppress inspection "TrailingSpacesInProperty" +takeOffer.takeOfferFundWalletInfo.tradeAmount=- Výše obchodu: {0} +takeOffer.takeOfferFundWalletInfo.msg=Abyste mohli tuto nabídku využít, musíte vložit {0}.\n\nČástka je součtem:\n{1} - Vaší kauce: {2}\n- Obchodního poplatku: {3}\n- Celkového poplatku za těžbu: {4}\n\nPři financování obchodu si můžete vybrat ze dvou možností:\n- Použijte svou peněženku Bisq (pohodlné, ale transakce mohou být propojitelné) NEBO\n- Platba z externí peněženky (potenciálně více soukromé)\n\nPo uzavření tohoto vyskakovacího okna se zobrazí všechny možnosti a podrobnosti financování. +takeOffer.alreadyPaidInFunds=Pokud jste již prostředky zaplatili, můžete je vybrat na obrazovce \"Prostředky/Odeslat prostředky\". +takeOffer.paymentInfo=Informace o platbě +takeOffer.setAmountPrice=Nastavit částku +takeOffer.alreadyFunded.askCancel=Tuto nabídku jste již financovali.\nPokud ji nyní zrušíte, budou vaše prostředky přesunuty do lokální peněženky Bisq a jsou k dispozici pro výběr na obrazovce \"Prostředky/Odeslat prostředky\".\nOpravdu ji chcete zrušit? +takeOffer.failed.offerNotAvailable=Žádost o nabídku se nezdařila, protože nabídka již není k dispozici. Možná, že mezitím nabídku přijal jiný obchodník. +takeOffer.failed.offerTaken=Tuto nabídku nemůžete přijmout, protože ji již přijal jiný obchodník. +takeOffer.failed.offerRemoved=Tuto nabídku nemůžete přijmout, protože mezitím byla nabídka odstraněna. +takeOffer.failed.offererNotOnline=Přijetí nabídky se nezdařilo, protože tvůrce již není online. +takeOffer.failed.offererOffline=Tuto nabídku nemůžete přijmout, protože je tvůrce offline. +takeOffer.warning.connectionToPeerLost=Ztratili jste spojení s tvůrcem.\nMohli odejít do režimu offline nebo s vámi ukončili připojení kvůli příliš velkému počtu otevřených připojení.\n\nPokud stále jeho nabídku vidíte v seznamu nabídek, můžete zkusit nabídku znovu využít. + +takeOffer.error.noFundsLost=\n\nPeněženku ještě neopustily žádné finanční prostředky.\nZkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit. +# suppress inspection "TrailingSpacesInProperty" +takeOffer.error.feePaid=.\n\n +takeOffer.error.depositPublished=\n\nVkladová transakce je již zveřejněna.\nZkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit.\nPokud problém přetrvává, kontaktujte vývojáře a požádejte je o podporu. +takeOffer.error.payoutPublished=\n\nVyplacená transakce je již zveřejněna.\nZkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit.\nPokud problém přetrvává, kontaktujte vývojáře a požádejte je o podporu. +takeOffer.tac=Přijetím této nabídky souhlasím s obchodními podmínkami definovanými na této obrazovce. + + +#################################################################### +# Offerbook / Edit offer +#################################################################### + +editOffer.setPrice=Nastavit cenu +editOffer.confirmEdit=Potvrdit: Upravit nabídku +editOffer.publishOffer=Publikování vaší nabídky. +editOffer.failed=Úprava nabídky se nezdařila:\n{0} +editOffer.success=Vaše nabídka byla úspěšně upravena. +editOffer.invalidDeposit=Kauce kupujícího není v rámci omezení definovaných Bisq DAO a nemůže být dále upravována. + +#################################################################### +# Portfolio +#################################################################### + +portfolio.tab.openOffers=Moje otevřené nabídky +portfolio.tab.pendingTrades=Otevřené obchody +portfolio.tab.history=Historie +portfolio.tab.failed=Selhalo +portfolio.tab.editOpenOffer=Upravit nabídku + +portfolio.pending.invalidDelayedPayoutTx=Došlo k problému s chybějící nebo neplatnou transakcí.\n\nProsím neposílejte fiat nebo altcoin platby. Požádejte vývojáře Bisq na Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance\n\nChybová zpráva: {0} + +portfolio.pending.step1.waitForConf=Počkejte na potvrzení na blockchainu +portfolio.pending.step2_buyer.startPayment=Zahajte platbu +portfolio.pending.step2_seller.waitPaymentStarted=Počkejte, než začne platba +portfolio.pending.step3_buyer.waitPaymentArrived=Počkejte, než dorazí platba +portfolio.pending.step3_seller.confirmPaymentReceived=Potvrzující platba přijata +portfolio.pending.step5.completed=Hotovo + +portfolio.pending.step3_seller.autoConf.status.label=Stav automat. potvrzení +portfolio.pending.autoConf=Automaticky potvrzeno +portfolio.pending.autoConf.blocks=Potvrzení XMR: {0} / požadováno: {1} +portfolio.pending.autoConf.state.xmr.txKeyReused=Transakční klíč byl použit znovu. Otevřete prosím spor. +portfolio.pending.autoConf.state.confirmations=Potvrzení XMR: {0}/{1} +portfolio.pending.autoConf.state.txNotFound=Transakce zatím není v mem-poolu vidět +portfolio.pending.autoConf.state.txKeyOrTxIdInvalid=Žádné platné ID transakce / transakční klíč +portfolio.pending.autoConf.state.filterDisabledFeature=Zakázáno vývojáři. + +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.FEATURE_DISABLED=Funkce automatického potvrzení je zakázána. {0} +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.TRADE_LIMIT_EXCEEDED=Částka obchodu překračuje limit částky pro automatické potvrzení +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.INVALID_DATA=Peer poskytl neplatná data. {0} +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.PAYOUT_TX_ALREADY_PUBLISHED=Výplatní transakce již byla zveřejněna. +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.DISPUTE_OPENED=Spor byl otevřen. Automatické potvrzení je u tohoto obchodu deaktivováno. +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.REQUESTS_STARTED=Byly zahájeny žádosti o ověření transakce +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.PENDING=Úspěšné výsledky: {0}/{1}; {2} +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.COMPLETED=Důkaz u všech služeb byl úspěšný +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.ERROR=Došlo k chybě při požadavku na službu. Není možné automatické potvrzení. +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.FAILED=Služba se vrátila se selháním. Není možné automatické potvrzení. + +portfolio.pending.step1.info=Vkladová transakce byla zveřejněna.\n{0} před zahájením platby musíte počkat na alespoň jedno potvrzení na blockchainu. +portfolio.pending.step1.warn=Vkladová transakce není stále potvrzena. K tomu někdy dochází ve vzácných případech, kdy byl poplatek za financování jednoho obchodníka z externí peněženky příliš nízký. +portfolio.pending.step1.openForDispute=Vkladová transakce není stále potvrzena. Můžete počkat déle nebo požádat o pomoc mediátora. + +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2.confReached=Váš obchod dosáhl alespoň jednoho potvrzení na blockchainu.\n(Pokud chcete, můžete čekat na další potvrzení - 6 potvrzení je považováno za velmi bezpečné.)\n\n + +portfolio.pending.step2_buyer.copyPaste=(Po zavření vyskakovacího okna můžete hodnoty z hlavní obrazovky zkopírovat a vložit.) +portfolio.pending.step2_buyer.refTextWarn=NEPOUŽÍVEJTE žádné další poznámky v textu \"důvod platby\", jako je bitcoin, BTC nebo Bisq. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.accountDetails=Zde jsou podrobnosti o obchodním účtu prodejce BTC:\n +portfolio.pending.step2_buyer.tradeId=Nezapomeňte přidat ID obchodu +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.assign=jako \"důvod platby\", aby příjemce mohl vaši platbu přiřadit tomuto obchodu.\n\n +portfolio.pending.step2_buyer.fees=Pokud vaše banka účtuje poplatky, musíte tyto poplatky pokrýt. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.altcoin=Převeďte prosím z vaší externí {0} peněženky\n{1} prodejci BTC.\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.cash=Přejděte do banky a zaplatte {0} prodejci BTC.\n\n +portfolio.pending.step2_buyer.cash.extra=DŮLEŽITÉ POŽADAVKY:\nPo provedení platby zapište na papírový doklad: NO REFUNDS - bez náhrady.\nPoté ji roztrhněte na 2 části, vytvořte fotografii a odešlete ji na e-mailovou adresu prodejce BTC. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.moneyGram=Zaplaťte prosím {0} prodejci BTC pomocí MoneyGram.\n\n +portfolio.pending.step2_buyer.moneyGram.extra=DŮLEŽITÉ POŽADAVKY:\nPo provedení platby zašlete autorizační číslo a fotografii s potvrzením e-mailem prodejci BTC.\nPotvrzení musí jasně uvádět celé jméno, zemi, stát a částku prodávajícího. E-mail prodejce je: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.westernUnion=Zaplaťte prosím {0} prodejci BTC pomocí Western Union.\n\n +portfolio.pending.step2_buyer.westernUnion.extra=DŮLEŽITÉ POŽADAVKY:\nPo provedení platby zašlete prodejci BTC e-mail s MTCN (sledovací číslo) a fotografii s potvrzením o přijetí.\nPotvrzení musí jasně uvádět celé jméno prodávajícího, město, zemi a částku. E-mail prodejce je: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Kupte si na svém účtu Amazon kartu Amazon eGift za {0} a jako příjemce použijte e-mail nebo mobilní číslo prodejce BTC. V případě, že částka obchodu překročí povolenou částku, pošlete více karet.\n\n + +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.postal=Zašlete prosím {0} prodejci BTC pomocí \"US Postal Money Order\".\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.bank=Přejděte na webovou stránku online bankovnictví a zaplatte {0} prodejci BTC.\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.f2f=Kontaktujte prodejce BTC prostřednictvím poskytnutého kontaktu a domluvte si schůzku kde zaplatíte {0}.\n\n +portfolio.pending.step2_buyer.startPaymentUsing=Zahajte platbu pomocí {0} +portfolio.pending.step2_buyer.recipientsAccountData=Příjemci {0} +portfolio.pending.step2_buyer.amountToTransfer=Částka k převodu +portfolio.pending.step2_buyer.sellersAddress={0} adresa prodejce +portfolio.pending.step2_buyer.buyerAccount=Použijte svůj platební účet +portfolio.pending.step2_buyer.paymentStarted=Platba zahájena +portfolio.pending.step2_buyer.warn=Platbu {0} jste ještě neprovedli!\nVezměte prosím na vědomí, že obchod musí být dokončen do {1}. +portfolio.pending.step2_buyer.openForDispute=Neukončili jste platbu!\nMax. doba obchodu uplynula. Obraťte se na mediátora a požádejte o pomoc. +portfolio.pending.step2_buyer.paperReceipt.headline=Odeslali jste papírový doklad prodejci BTC? +portfolio.pending.step2_buyer.paperReceipt.msg=Zapamatujte si:\nMusíte napsat na papírový doklad: NO REFUNDS - bez náhrady.\nPoté ho roztrhněte na 2 části, vytvořte fotografii a odešlete ji na e-mailovou adresu prodejce BTC. +portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Odeslat autorizační číslo a účtenku +portfolio.pending.step2_buyer.moneyGramMTCNInfo.msg=Musíte zaslat autorizační číslo a fotografii dokladu e-mailem prodejci BTC.\nDoklad musí jasně uvádět celé jméno prodávajícího, zemi, stát a částku. E-mail prodejce je: {0}.\n\nOdeslali jste autorizační číslo a smlouvu prodejci? +portfolio.pending.step2_buyer.westernUnionMTCNInfo.headline=Pošlete MTCN a účtenku +portfolio.pending.step2_buyer.westernUnionMTCNInfo.msg=Musíte odeslat MTCN (sledovací číslo) a fotografii dokladu e-mailem prodejci BTC.\nDoklad musí jasně uvádět celé jméno prodávajícího, město, zemi a částku. E-mail prodejce je: {0}.\n\nOdeslali jste MTCN a smlouvu prodejci? +portfolio.pending.step2_buyer.halCashInfo.headline=Pošlete HalCash kód +portfolio.pending.step2_buyer.halCashInfo.msg=Musíte odeslat jak textovou zprávu s kódem HalCash tak i obchodní ID ({0}) prodejci BTC.\nMobilní číslo prodejce je {1}.\n\nPoslali jste kód prodejci? +portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=Některé banky mohou ověřovat jméno příjemce. Účty Faster Payments vytvořené u starých klientů Bisq neposkytují jméno příjemce, proto si jej (v případě potřeby) vyžádejte pomocí obchodního chatu. +portfolio.pending.step2_buyer.confirmStart.headline=Potvrďte, že jste zahájili platbu +portfolio.pending.step2_buyer.confirmStart.msg=Zahájili jste platbu {0} vašemu obchodnímu partnerovi? +portfolio.pending.step2_buyer.confirmStart.yes=Ano, zahájil jsem platbu +portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=Neposkytli jste doklad o platbě +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=Nezadali jste ID transakce a klíč transakce.\n\nNeposkytnutím těchto údajů nemůže peer použít funkci automatického potvrzení k uvolnění BTC, jakmile bude přijat XMR.\nKromě toho Bisq vyžaduje, aby odesílatel transakce XMR mohl tyto informace poskytnout mediátorovi nebo rozhodci v případě sporu.\nDalší podrobnosti na wiki Bisq: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Vstup není 32 bajtová hexadecimální hodnota +portfolio.pending.step2_buyer.confirmStart.warningButton=Ignorovat a přesto pokračovat +portfolio.pending.step2_seller.waitPayment.headline=Počkejte na platbu +portfolio.pending.step2_seller.f2fInfo.headline=Kontaktní informace kupujícího +portfolio.pending.step2_seller.waitPayment.msg=Vkladová transakce má alespoň jedno potvrzení na blockchainu.\nMusíte počkat, než kupující BTC zahájí platbu {0}. +portfolio.pending.step2_seller.warn=Kupující BTC dosud neprovedl platbu {0}.\nMusíte počkat, než zahájí platbu.\nPokud obchod nebyl dokončen dne {1}, bude rozhodce vyšetřovat. +portfolio.pending.step2_seller.openForDispute=Kupující BTC ještě nezačal s platbou!\nMax. povolené období pro obchod vypršelo.\nMůžete počkat déle a dát obchodnímu partnerovi více času nebo požádat o pomoc mediátora. +tradeChat.chatWindowTitle=Okno chatu pro obchod s ID ''{0}'' +tradeChat.openChat=Otevřít chatovací okno +tradeChat.rules=Můžete komunikovat se svým obchodním partnerem a vyřešit případné problémy s tímto obchodem.\nOdpovídat v chatu není povinné.\nPokud obchodník poruší některé z níže uvedených pravidel, zahajte spor a nahlašte jej mediátorovi nebo rozhodci.\n\nPravidla chatu:\n\t● Neposílejte žádné odkazy (riziko malwaru). Můžete odeslat ID transakce a jméno block exploreru.\n\t● Neposílejte seed slova, soukromé klíče, hesla nebo jiné citlivé informace!\n\t● Nepodporujte obchodování mimo Bisq (bez zabezpečení).\n\t● Nezapojujte se do žádných forem podvodů v oblasti sociálního inženýrství.\n\t● Pokud partner nereaguje a dává přednost nekomunikovat prostřednictvím chatu, respektujte jeho rozhodnutí.\n\t● Soustřeďte konverzaci pouze na obchod. Tento chat není náhradou messengeru.\n\t● Udržujte konverzaci přátelskou a uctivou. + +# suppress inspection "UnusedProperty" +message.state.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +message.state.SENT=Zpráva odeslána +# suppress inspection "UnusedProperty" +message.state.ARRIVED=Zpráva dorazila partnerovi +# suppress inspection "UnusedProperty" +message.state.STORED_IN_MAILBOX=Zpráva o platbě je odeslaná, ale není dosud přijatá partnerem +# suppress inspection "UnusedProperty" +message.state.ACKNOWLEDGED=Partner potvrdil přijetí zprávy +# suppress inspection "UnusedProperty" +message.state.FAILED=Odeslání zprávy se nezdařilo + +portfolio.pending.step3_buyer.wait.headline=Počkejte na potvrzení platby prodejce BTC +portfolio.pending.step3_buyer.wait.info=Čekání na potvrzení prodejce BTC na přijetí platby {0}. +portfolio.pending.step3_buyer.wait.msgStateInfo.label=Stav zprávy o zahájení platby +portfolio.pending.step3_buyer.warn.part1a=na {0} blockchainu +portfolio.pending.step3_buyer.warn.part1b=u vašeho poskytovatele plateb (např. banky) +portfolio.pending.step3_buyer.warn.part2=Prodejce BTC vaši platbu stále nepotvrdil. Zkontrolujte {0}, zda bylo odeslání platby úspěšné. +portfolio.pending.step3_buyer.openForDispute=Prodejce BTC nepotvrdil vaši platbu! Max. období pro uskutečnění obchodu uplynulo. Můžete počkat déle a dát obchodnímu partnerovi více času nebo požádat o pomoc mediátora. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.part=Váš obchodní partner potvrdil, že zahájil platbu {0}.\n\n +portfolio.pending.step3_seller.altcoin.explorer=ve vašem oblíbeném {0} blockchain exploreru +portfolio.pending.step3_seller.altcoin.wallet=na vaší {0} peněžence +portfolio.pending.step3_seller.altcoin={0}Zkontrolujte prosím {1}, zda transakce na vaši přijímací adresu\n{2}\nmá již dostatečné potvrzení na blockchainu.\nČástka platby musí být {3}\n\nPo zavření vyskakovacího okna můžete zkopírovat a vložit svou {4} adresu z hlavní obrazovky. +portfolio.pending.step3_seller.postal={0} Zkontrolujte, zda jste od kupujícího BTC obdrželi {1} přes \"US Postal Money Order\".\n\nObchodní ID (\"důvod platby\" text) transakce je: \"{2}\" +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.bank=Váš obchodní partner potvrdil, že zahájil platbu {0}.\n\nPřejděte na webovou stránku online bankovnictví a zkontrolujte, zda jste od kupujícího BTC obdrželi {1}.\n\nObchodní ID (\"důvod platby\" text) transakce je: \"{2}\"\n\n +portfolio.pending.step3_seller.cash=Vzhledem k tomu, že se platba provádí prostřednictvím hotovostního vkladu, musí kupující BTC napsat na papírový doklad \"NO REFUND\", roztrhat ho na 2 části a odeslat vám e-mailem fotografii.\n\nAbyste se vyhnuli riziku zpětného zúčtování, potvrďte pouze, zda jste obdrželi e-mail a zda si jste jisti, že papírový doklad je platný.\nPokud si nejste jisti, {0} +portfolio.pending.step3_seller.moneyGram=Kupující vám musí zaslat e-mailem autorizační číslo a fotografii s potvrzením.\nPotvrzení musí jasně uvádět vaše celé jméno, zemi, stát a částku. Zkontrolujte si prosím váš e-mail, pokud jste obdrželi autorizační číslo.\n\nPo uzavření tohoto vyskakovacího okna se zobrazí jméno a adresa kupujícího BTC pro vyzvednutí peněz z MoneyGram.\n\nPotvrďte příjem až po úspěšném vyzvednutí peněz! +portfolio.pending.step3_seller.westernUnion=Kupující vám musí zaslat MTCN (sledovací číslo) a fotografii s potvrzením e-mailem.\nPotvrzení musí jasně uvádět vaše celé jméno, město, zemi a částku. Zkontrolujte svůj e-mail, pokud jste obdrželi MTCN.\n\nPo zavření tohoto vyskakovacího okna uvidíte jméno a adresu kupujícího BTC pro vyzvednutí peněz z Western Union.\n\nPotvrďte příjem až po úspěšném vyzvednutí peněz! +portfolio.pending.step3_seller.halCash=Kupující vám musí poslat kód HalCash jako textovou zprávu. Kromě toho obdržíte zprávu od HalCash s požadovanými informacemi pro výběr EUR z bankomatu podporujícího HalCash.\n\nPoté, co jste vyzvedli peníze z bankomatu, potvrďte zde přijetí platby! +portfolio.pending.step3_seller.amazonGiftCard=Kupující vám poslal e-mailovou kartu Amazon eGift e-mailem nebo textovou zprávou na váš mobilní telefon. Uplatněte nyní kartu Amazon eGift ve svém účtu Amazon a po přijetí potvrďte potvrzení o platbě. + +portfolio.pending.step3_seller.bankCheck=\n\nOvěřte také, zda se jméno odesílatele uvedené v obchodní smlouvě shoduje s jménem uvedeným na výpisu z účtu:\nJméno odesílatele podle obchodní smlouvy: {0}\n\nPokud jména nejsou úplně stejná, {1} +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.openDispute=nepotvrzujte příjem platby. Místo toho otevřete spor stisknutím \"alt + o\" nebo \"option + o\".\n\n +portfolio.pending.step3_seller.confirmPaymentReceipt=Potvrďte příjem platby +portfolio.pending.step3_seller.amountToReceive=Částka k přijetí +portfolio.pending.step3_seller.yourAddress=Vaše {0} adresa +portfolio.pending.step3_seller.buyersAddress={0} adresa kupujících +portfolio.pending.step3_seller.yourAccount=Váš obchodní účet +portfolio.pending.step3_seller.xmrTxHash=ID transakce +portfolio.pending.step3_seller.xmrTxKey=Transakční klíč +portfolio.pending.step3_seller.buyersAccount=Údaje o účtu kupujícího +portfolio.pending.step3_seller.confirmReceipt=Potvrďte příjem platby +portfolio.pending.step3_seller.buyerStartedPayment=Kupující BTC zahájil platbu {0}.\n{1} +portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Podívejte se na potvrzení na blockchainu ve své alltcoin peněžence nebo v blok exploreru a potvrďte platbu, pokud máte dostatečné potvrzení na blockchainu. +portfolio.pending.step3_seller.buyerStartedPayment.fiat=Zkontrolujte na svém obchodním účtu (např. Bankovní účet) a potvrďte, kdy jste platbu obdrželi. +portfolio.pending.step3_seller.warn.part1a=na {0} blockchainu +portfolio.pending.step3_seller.warn.part1b=u vašeho poskytovatele plateb (např. banky) +portfolio.pending.step3_seller.warn.part2=Stále jste nepotvrdili přijetí platby. Zkontrolujte {0}, zda jste obdrželi platbu. +portfolio.pending.step3_seller.openForDispute=Nepotvrdili jste příjem platby!\nUplynulo max. období obchodu.\nPotvrďte nebo požádejte o pomoc mediátora. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.onPaymentReceived.part1=Obdrželi jste od svého obchodního partnera platbu {0}?\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.onPaymentReceived.fiat=ID obchodní (\"důvod platby\" text) transakce je: \"{0}\"\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.onPaymentReceived.name=Ověřte také, zda se jméno odesílatele uvedené v obchodní smlouvě shoduje s jménem uvedeným na výpisu z účtu:\nJméno odesílatele podle obchodní smlouvy: {0}\n\nPokud jména nejsou úplně stejná, nepotvrzujte příjem platby. Místo toho otevřete spor stisknutím \"alt + o\" nebo \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.onPaymentReceived.note=Vezměte prosím na vědomí, že jakmile potvrdíte příjem, bude uzamčená částka obchodu vrácena kupujícímu BTC a záloha bude vrácena.\n\n +portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Potvrďte, že jste obdržel(a) platbu +portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Ano, obdržel(a) jsem platbu +portfolio.pending.step3_seller.onPaymentReceived.signer=DŮLEŽITÉ: Potvrzením přijetí platby ověřujete také účet protistrany a odpovídajícím způsobem jej podepisujete. Protože účet protistrany dosud nebyl podepsán, měli byste odložit potvrzení platby co nejdéle, abyste snížili riziko zpětného zúčtování. + +portfolio.pending.step5_buyer.groupTitle=Shrnutí dokončeného obchodu +portfolio.pending.step5_buyer.tradeFee=Obchodní poplatek +portfolio.pending.step5_buyer.makersMiningFee=Poplatek za těžbu +portfolio.pending.step5_buyer.takersMiningFee=Celkové poplatky za těžbu +portfolio.pending.step5_buyer.refunded=Vrácená kauce +portfolio.pending.step5_buyer.withdrawBTC=Vyberte své bitcoiny +portfolio.pending.step5_buyer.amount=Částka k výběru +portfolio.pending.step5_buyer.withdrawToAddress=Adresa výběru +portfolio.pending.step5_buyer.moveToBisqWallet=Uchovat prostředky v peněžence Bisq +portfolio.pending.step5_buyer.withdrawExternal=Vybrat do externí peněženky +portfolio.pending.step5_buyer.alreadyWithdrawn=Vaše finanční prostředky již byly vybrány.\nZkontrolujte historii transakcí. +portfolio.pending.step5_buyer.confirmWithdrawal=Potvrďte žádost o výběr +portfolio.pending.step5_buyer.amountTooLow=Částka k převodu je nižší než transakční poplatek a min. možná hodnota tx (drobné). +portfolio.pending.step5_buyer.withdrawalCompleted.headline=Výběr byl dokončen +portfolio.pending.step5_buyer.withdrawalCompleted.msg=Vaše dokončené obchody jsou uloženy na \"Portfolio/Historie\".\nVšechny své bitcoinové transakce si můžete prohlédnout v sekci \"Prostředky/Transakce\" +portfolio.pending.step5_buyer.bought=Koupili jste +portfolio.pending.step5_buyer.paid=Zaplatili jste + +portfolio.pending.step5_seller.sold=Prodali jste +portfolio.pending.step5_seller.received=Přijali jste + +tradeFeedbackWindow.title=Gratulujeme k dokončení obchodu +tradeFeedbackWindow.msg.part1=Rádi bychom od vás slyšeli o vašich zkušenostech. Pomůže nám to vylepšit software a vyhladit všechny nejasnosti. Pokud chcete poskytnout zpětnou vazbu, vyplňte prosím tento krátký dotazník (není nutná registrace) na: +tradeFeedbackWindow.msg.part2=Pokud máte nějaké dotazy nebo máte nějaké problémy, obraťte se prosím na ostatní uživatele a přispěvatele prostřednictvím fóra Bisq na: +tradeFeedbackWindow.msg.part3=Děkujeme, že používáte Bisq! + +portfolio.pending.role=Moje role +portfolio.pending.tradeInformation=Obchodní informace +portfolio.pending.remainingTime=Zbývající čas +portfolio.pending.remainingTimeDetail={0} (do {1}) +portfolio.pending.tradePeriodInfo=Po prvním potvrzení na blockchainu začíná obchodní období. Na základě použitého způsobu platby se použije jiné maximální povolené obchodní období. +portfolio.pending.tradePeriodWarning=Pokud je tato lhůta překročena, mohou oba obchodníci zahájit spor. +portfolio.pending.tradeNotCompleted=Obchod nebyl dokončen včas (do {0}) +portfolio.pending.tradeProcess=Obchodní proces +portfolio.pending.openAgainDispute.msg=Pokud si nejste jisti, že zpráva pro mediátora nebo rozhodce dorazila (např. Pokud jste nedostali odpověď po 1 dni), neváhejte znovu zahájit spor s Cmd/Ctrl+o. Můžete také požádat o další pomoc na fóru Bisq na adrese [HYPERLINK:https://bisq.community]. +portfolio.pending.openAgainDispute.button=Otevřete spor znovu +portfolio.pending.openSupportTicket.headline=Otevřít úkol pro podporu +portfolio.pending.openSupportTicket.msg=Použijte tuto funkci pouze v naléhavých případech, pokud nevidíte tlačítko \"Otevřít podporu\" nebo \"Otevřít spor\".\n\nKdyž otevřete dotaz podporu, obchod bude přerušen a zpracován mediátorem nebo rozhodcem. + +portfolio.pending.timeLockNotOver=Než budete moci zahájit rozhodčí spor, musíte počkat do ≈{0} ({1} dalších bloků). +portfolio.pending.error.depositTxNull=Vkladová operace je nulová. Nemůžete otevřít spor bez platné vkladové transakce. Přejděte do \"Nastavení/Informace o síti\" a proveďte resynchronizaci SPV.\n\nPro další pomoc prosím kontaktujte podpůrný kanál v Bisq Keybase týmu. +portfolio.pending.mediationResult.error.depositTxNull=Vkladová transakce je nulová. Obchod můžete přesunout do neúspěšných obchodů. +portfolio.pending.mediationResult.error.delayedPayoutTxNull=Zpožděná výplatní transakce je nulová. Obchod můžete přesunout do neúspěšných obchodů. +portfolio.pending.error.depositTxNotConfirmed=Vkladová transakce není potvrzena. Nemůžete zahájit rozhodčí spor s nepotvrzenou vkladovou transakcí. Počkejte prosím, až bude potvrzena, nebo přejděte do \"Nastavení/Informace o síti\" a proveďte resynchronizaci SPV.\n\nPro další pomoc prosím kontaktujte podpůrný kanál v Bisq Keybase týmu. + +portfolio.pending.support.headline.getHelp=Potřebujete pomoc? +portfolio.pending.support.text.getHelp=Pokud máte nějaké problémy, můžete zkusit kontaktovat obchodníka v obchodním chatu nebo požádat komunitu Bisq na adrese https://bisq.community. Pokud váš problém stále není vyřešen, můžete požádat mediátora o další pomoc. +portfolio.pending.support.button.getHelp=Otevřít obchodovací chat +portfolio.pending.support.headline.halfPeriodOver=Zkontrolujte platbu +portfolio.pending.support.headline.periodOver=Obchodní období skončilo + +portfolio.pending.mediationRequested=Mediace požádána +portfolio.pending.refundRequested=Požadováno vrácení peněz +portfolio.pending.openSupport=Otevřít úkol pro podporu +portfolio.pending.supportTicketOpened=Úkol pro podporu otevřen +portfolio.pending.communicateWithArbitrator=Komunikujte prosím na obrazovce \"Podpora\" s rozhodcem. +portfolio.pending.communicateWithMediator=Komunikujte prosím na obrazovce \"Podpora\" s mediátorem. +portfolio.pending.disputeOpenedMyUser=Už jste otevřeli spor.\n{0} +portfolio.pending.disputeOpenedByPeer=Váš obchodní partner otevřel spor\n{0} +portfolio.pending.noReceiverAddressDefined=Není definována žádná adresa příjemce + +portfolio.pending.mediationResult.headline=Navrhovaná výplata z mediace +portfolio.pending.mediationResult.info.noneAccepted=Dokončete obchod přijetím návrhu mediátora na výplatu obchodu. +portfolio.pending.mediationResult.info.selfAccepted=Přijali jste návrh mediátora. Čekáte na to, aby ho také přijal partner. +portfolio.pending.mediationResult.info.peerAccepted=Váš obchodní partner přijal návrh mediátora. Přijímáte také? +portfolio.pending.mediationResult.button=Zobrazit navrhované řešení +portfolio.pending.mediationResult.popup.headline=Výsledek mediace obchodu s ID: {0} +portfolio.pending.mediationResult.popup.headline.peerAccepted=Váš obchodní partner přijal návrh mediátora na obchod {0} +portfolio.pending.mediationResult.popup.info=Mediátor navrhl následující výplatu:\nObdržíte: {0}\nVáš obchodní partner obdrží: {1}\n\nTuto navrhovanou výplatu můžete přijmout nebo odmítnout.\n\nPřijetím podepíšete navrhovanou výplatní transakci. Pokud váš obchodní partner také přijme a podepíše, výplata bude dokončena a obchod bude uzavřen.\n\nPokud jeden nebo oba odmítnete návrh, budete muset počkat do {2} (blok {3}), abyste zahájili spor druhého kola s rozhodcem, který případ znovu prošetří a na základě svých zjištění provede výplatu.\n\nRozhodce může jako náhradu za svou práci účtovat malý poplatek (maximální poplatek: bezpečnostní záloha obchodníka). Oba obchodníci, kteří souhlasí s návrhem zprostředkovatele, jsou na dobré cestě - žádost o arbitráž je určena pro výjimečné okolnosti, například pokud je obchodník přesvědčen, že zprostředkovatel neučinil návrh na spravedlivou výplatu (nebo pokud druhý partner nereaguje).\n\nDalší podrobnosti o novém rozhodčím modelu: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=Přijali jste výplatu navrženou mediátorem, ale zdá se, že váš obchodní partner ji nepřijal.\n\nPo uplynutí doby uzamčení na {0} (blok {1}) můžete zahájit spor druhého kola s rozhodcem, který případ znovu prošetří a na základě jeho zjištění provede platbu.\n\nDalší podrobnosti o rozhodčím modelu najdete na adrese: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.openArbitration=Odmítnout a požádat o arbitráž +portfolio.pending.mediationResult.popup.alreadyAccepted=Už jste přijali + +portfolio.pending.failedTrade.taker.missingTakerFeeTx=Chybí poplatek příjemce transakce.\n\nBez tohoto tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky a nebyl zaplacen žádný obchodní poplatek. Tento obchod můžete přesunout do neúspěšných obchodů. +portfolio.pending.failedTrade.maker.missingTakerFeeTx=Chybí poplatek příjemce transakce.\n\nBez tohoto tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky. Vaše nabídka je stále k dispozici dalším obchodníkům, takže jste neztratili poplatek za vytvoření. Tento obchod můžete přesunout do neúspěšných obchodů. +portfolio.pending.failedTrade.missingDepositTx=Vkladová transakce (transakce 2-of-2 multisig) chybí.\n\nBez tohoto tx nelze obchod dokončit. Nebyly uzamčeny žádné prostředky, ale byl zaplacen váš obchodní poplatek. Zde můžete požádat o vrácení obchodního poplatku: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nKlidně můžete přesunout tento obchod do neúspěšných obchodů. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=Zpožděná výplatní transakce chybí, ale prostředky byly uzamčeny v vkladové transakci.\n\nNezasílejte prosím fiat nebo altcoin platbu prodejci BTC, protože bez zpožděné platby tx nelze zahájit arbitráž. Místo toho otevřete mediační úkol pomocí Cmd/Ctrl+o. Mediátorl by měl navrhnout, aby oba partneři dostali zpět celou částku svých bezpečnostních vkladů (přičemž prodejce také obdrží plnou částku obchodu). Tímto způsobem nehrozí žádné bezpečnostní riziko a jsou ztraceny pouze obchodní poplatky.\n\nO vrácení ztracených obchodních poplatků můžete požádat zde: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Zpožděná výplatní transakce chybí, ale prostředky byly v depozitní transakci uzamčeny.\n\nPokud kupujícímu chybí také zpožděná výplatní transakce, bude poučen, aby platbu NEPOSLAL a místo toho otevřel mediační úkol. Měli byste také otevřít mediační úkol pomocí Cmd/Ctrl+o.\n\nPokud kupující ještě neposlal platbu, měl by zprostředkovatel navrhnout, aby oba partneři dostali zpět celou částku svých bezpečnostních vkladů (přičemž prodejce také obdrží plnou částku obchodu). Jinak by částka obchodu měla jít kupujícímu.\n\nO vrácení ztracených obchodních poplatků můžete požádat zde: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=Během provádění obchodního protokolu došlo k chybě.\n\nChyba: {0}\n\nJe možné, že tato chyba není kritická a obchod lze dokončit normálně. Pokud si nejste jisti, otevřete si mediační úkol a získejte radu od mediátorů Bisq.\n\nPokud byla chyba kritická a obchod nelze dokončit, možná jste ztratili obchodní poplatek. O vrácení ztracených obchodních poplatků požádejte zde: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=Obchodní kontrakt není stanoven.\n\nObchod nelze dokončit a možná jste ztratili poplatek za obchodování. Pokud ano, můžete požádat o vrácení ztracených obchodních poplatků zde: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.info.popup=Obchodní protokol narazil na některé problémy.\n\n{0} +portfolio.pending.failedTrade.txChainInvalid.moveToFailed=Obchodní protokol narazil na vážný problém.\n\n{0}\n\nChcete obchod přesunout do neúspěšných obchodů?\n\nZ obrazovky neúspěšných obchodů nemůžete otevřít mediaci nebo arbitráž, ale můžete kdykoli přesunout neúspěšný obchod zpět na obrazovku otevřených obchodů. +portfolio.pending.failedTrade.txChainValid.moveToFailed=Obchodní protokol narazil na některé problémy.\n\n{0}\n\nObchodní transakce byly zveřejněny a finanční prostředky jsou uzamčeny. Přesuňte obchod do neúspěšných obchodů, pouze pokud jste si opravdu jisti. Může to bránit možnostem řešení problému.\n\nChcete obchod přesunout do neúspěšných obchodů?\n\nZ obrazovky neúspěšných obchodů nemůžete otevřít mediaci nebo arbitráž, ale můžete kdykoli přesunout neúspěšný obchod zpět na obrazovku otevřených obchodů. +portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Přesuňte obchod do neúspěšných obchodů +portfolio.pending.failedTrade.warningIcon.tooltip=Kliknutím otevřete podrobnosti o problémech tohoto obchodu +portfolio.failed.revertToPending.popup=Chcete přesunout tento obchod do otevřených obchodů? +portfolio.failed.revertToPending=Přesunout obchod do otevřených obchodů + +portfolio.closed.completed=Hotovo +portfolio.closed.ticketClosed=Rozhodovaný +portfolio.closed.mediationTicketClosed=Mediovaný +portfolio.closed.canceled=Zrušeno +portfolio.failed.Failed=Selhalo +portfolio.failed.unfail=Před pokračováním se ujistěte, že máte zálohu vašeho datového adresáře!\nChcete tento obchod přesunout zpět do otevřených obchodů?\nJe to způsob, jak odemknout finanční prostředky uvízlé v neúspěšném obchodu. +portfolio.failed.cantUnfail=Tento obchod nelze v tuto chvíli přesunout zpět do otevřených obchodů.\nZkuste to znovu po dokončení obchodu (obchodů) {0} +portfolio.failed.depositTxNull=Obchod nelze změnit zpět na otevřený obchod. Transakce s vkladem je neplatná. +portfolio.failed.delayedPayoutTxNull=Obchod nelze změnit zpět na otevřený obchod. Zpožděná výplatní transakce je nulová. + + +#################################################################### +# Funds +#################################################################### + +funds.tab.deposit=Přijmout finanční prostředky +funds.tab.withdrawal=Poslat finanční prostředky +funds.tab.reserved=Vyhrazené prostředky +funds.tab.locked=Zamčené prostředky +funds.tab.transactions=Transakce + +funds.deposit.unused=Nepoužito +funds.deposit.usedInTx=Používá se v {0} transakcích +funds.deposit.fundBisqWallet=Financovat Bisq peněženku +funds.deposit.noAddresses=Dosud nebyly vygenerovány žádné adresy pro vklad +funds.deposit.fundWallet=Financujte svou peněženku +funds.deposit.withdrawFromWallet=Pošlete peníze z peněženky +funds.deposit.amount=Částka v BTC (volitelná) +funds.deposit.generateAddress=Vygenerujte novou adresu +funds.deposit.generateAddressSegwit=Nativní formát segwit (Bech32) +funds.deposit.selectUnused=Vyberte prosím nepoužívanou adresu z výše uvedené tabulky spíše než generovat novou. + +funds.withdrawal.arbitrationFee=Poplatek za arbitráž +funds.withdrawal.inputs=Volba vstupů +funds.withdrawal.useAllInputs=Použijte všechny dostupné vstupy +funds.withdrawal.useCustomInputs=Použijte vlastní vstupy +funds.withdrawal.receiverAmount=Částka příjemce +funds.withdrawal.senderAmount=Částka odesílatele +funds.withdrawal.feeExcluded=Částka nezahrnuje poplatek za těžbu +funds.withdrawal.feeIncluded=Částka zahrnuje poplatek za těžbu +funds.withdrawal.fromLabel=Výběr z adresy +funds.withdrawal.toLabel=Adresa výběru +funds.withdrawal.memoLabel=Poznámka k výběru +funds.withdrawal.memo=Volitelně vyplňte poznámku +funds.withdrawal.withdrawButton=Zvolen výběr +funds.withdrawal.noFundsAvailable=Pro výběr nejsou k dispozici žádné finanční prostředky +funds.withdrawal.confirmWithdrawalRequest=Potvrďte žádost o výběr +funds.withdrawal.withdrawMultipleAddresses=Výběr z více adres ({0}) +funds.withdrawal.withdrawMultipleAddresses.tooltip=Výběr z více adres:\n{0} +funds.withdrawal.notEnoughFunds=V peněžence nemáte dostatek finančních prostředků. +funds.withdrawal.selectAddress=Vyberte zdrojovou adresu z tabulky +funds.withdrawal.setAmount=Nastavte částku k výběru +funds.withdrawal.fillDestAddress=Vyplňte svou cílovou adresu +funds.withdrawal.warn.noSourceAddressSelected=Ve výše uvedené tabulce musíte vybrat zdrojovou adresu. +funds.withdrawal.warn.amountExceeds=Na vybrané adrese nemáte dostatek prostředků.\nZvažte výběr více adres ve výše uvedené tabulce nebo změňte přepínač poplatků tak, aby zahrnoval poplatek za těžbu. + +funds.reserved.noFunds=V otevřených nabídkách nejsou rezervovány žádné finanční prostředky +funds.reserved.reserved=Rezervováno v místní peněžence pro nabídku s ID: {0} + +funds.locked.noFunds=V obchodech nejsou zamčeny žádné prostředky +funds.locked.locked=Uzamčeno v multisig adrese pro obchodování s ID: {0} + +funds.tx.direction.sentTo=Odesláno na: +funds.tx.direction.receivedWith=Přijato s: +funds.tx.direction.genesisTx=Z Genesis tx: +funds.tx.txFeePaymentForBsqTx=Poplatek za těžbu za BSQ tx +funds.tx.createOfferFee=Poplatky tvůrce a tx: {0} +funds.tx.takeOfferFee=Poplatky příjemce a tx: {0} +funds.tx.multiSigDeposit=Vlkad na multisig adresu: {0} +funds.tx.multiSigPayout=Výběr z multisig adresy: {0} +funds.tx.disputePayout=Výběr ze sporu: {0} +funds.tx.disputeLost=Prohraných sporů: {0} +funds.tx.collateralForRefund=Zástava na vrácení peněz: {0} +funds.tx.timeLockedPayoutTx=Časově uzamčená výplata tx: {0} +funds.tx.refund=Vrácení peněz z rozhodčího řízení: {0} +funds.tx.unknown=Neznámý důvod: {0} +funds.tx.noFundsFromDispute=Žádná náhrada ze sporu +funds.tx.receivedFunds=Přijaté prostředky +funds.tx.withdrawnFromWallet=Výběr z peněženky +funds.tx.withdrawnFromBSQWallet=Výběr BTC z BSQ peněženky +funds.tx.memo=Poznámka +funds.tx.noTxAvailable=Není k dispozici žádná transakce +funds.tx.revert=Vrátit +funds.tx.txSent=Transakce byla úspěšně odeslána na novou adresu v lokální peněžence Bisq. +funds.tx.direction.self=Poslat sobě +funds.tx.daoTxFee=Poplatek za těžbu za DAO tx +funds.tx.reimbursementRequestTxFee=Žádost o vyrovnání +funds.tx.compensationRequestTxFee=Žádost o odškodnění +funds.tx.dustAttackTx=Přijaté drobné +funds.tx.dustAttackTx.popup=Tato transakce odesílá do vaší peněženky velmi malou částku BTC a může se jednat o pokus společností provádějících analýzu blockchainu o špehování vaší peněženky.\n\nPoužijete-li tento transakční výstup ve výdajové transakci, zjistí, že jste pravděpodobně také vlastníkem jiné adresy (sloučení mincí).\n\nKvůli ochraně vašeho soukromí ignoruje peněženka Bisq takové drobné výstupy pro účely utrácení a na obrazovce zůstatku. Můžete nastavit hodnotu "drobnosti", kdy je výstup považován za drobné, v nastavení. + + +#################################################################### +# Support +#################################################################### + +support.tab.mediation.support=Mediace +support.tab.arbitration.support=Arbitráž +support.tab.legacyArbitration.support=Starší arbitráž +support.tab.ArbitratorsSupportTickets={0} úkoly +support.filter=Hledat spory +support.filter.prompt=Zadejte ID obchodu, datum, onion adresu nebo údaje o účtu + +support.sigCheck.button=Ověřít výsledek +support.sigCheck.popup.info=V případě žádosti o vrácení peněz DAO musíte vložit souhrnnou zprávu procesu zprostředkování a rozhodčího řízení do své žádosti o vrácení peněz na Githubu. Aby bylo toto prohlášení ověřitelné, může každý uživatel pomocí tohoto nástroje zkontrolovat, zda se podpis mediátora nebo rozhodce shoduje se souhrnnou zprávou. +support.sigCheck.popup.header=Ověřít podpis výsledku sporu +support.sigCheck.popup.msg.label=Souhrnná zpráva +support.sigCheck.popup.msg.prompt=Zkopírovat a vložit souhrnnou zprávu ze sporu +support.sigCheck.popup.result=Výsledek ověření +support.sigCheck.popup.success=Podpis je platný +support.sigCheck.popup.failed=Ověření podpisu selhalo +support.sigCheck.popup.invalidFormat=Zpráva nemá očekávaný formát. Zkopírujte a vložte souhrnnou zprávu ze sporu. + +support.reOpenByTrader.prompt=Opravdu chcete spor znovu otevřít? +support.reOpenButton.label=Znovu otevřít +support.sendNotificationButton.label=Soukromé oznámení +support.reportButton.label=Zpráva +support.fullReportButton.label=Všechny spory +support.noTickets=Žádné otevřené úkoly +support.sendingMessage=Odesílání zprávy... +support.receiverNotOnline=Příjemce není online. Zpráva je uložena v jejich schránce. +support.sendMessageError=Odeslání zprávy se nezdařilo. Chyba: {0} +support.wrongVersion=Nabídka v tomto sporu byla vytvořena se starší verzí Bisq.\nTento spor nemůžete ukončit s touto verzí aplikace.\n\nPoužijte prosím starší verzi s verzí protokolu {0} +support.openFile=Otevřete soubor, který chcete připojit (maximální velikost souboru: {0} kb) +support.attachmentTooLarge=Celková velikost vašich příloh je {0} kb a překračuje maximální povolenou velikost zprávy {1} kB. +support.maxSize=Max. povolená velikost souboru je {0} kB. +support.attachment=Příloha +support.tooManyAttachments=V jedné zprávě nelze odeslat více než 3 přílohy. +support.save=Uložit soubor na disk +support.messages=Zprávy +support.input.prompt=Vložte zprávu... +support.send=Odeslat +support.addAttachments=Připojit soubory +support.closeTicket=Zavřít úkol +support.attachments=Přílohy: +support.savedInMailbox=Zpráva uložena ve schránce příjemce +support.arrived=Zpráva dorazila k příjemci +support.acknowledged=Příjetí zprávy potvrzeno příjemcem +support.error=Příjemce nemohl zpracovat zprávu. Chyba: {0} +support.buyerAddress=Adresa kupujícího BTC +support.sellerAddress=Adresa prodejce BTC +support.role=Role +support.state=Stav +support.closed=Zavřeno +support.open=Otevřené +support.buyerOfferer=Kupující BTC/Tvůrce +support.sellerOfferer=Prodejce BTC/Tvůrce +support.buyerTaker=Kupující BTC/Příjemce +support.sellerTaker=Prodávající BTC/Příjemce + +support.backgroundInfo=Bisq není společnost, takže spory řeší jinak.\n\nObchodníci mohou v rámci aplikace komunikovat prostřednictvím zabezpečeného chatu na obrazovce otevřených obchodů a zkusit řešení sporů sami. Pokud to nestačí, může jim pomoci mediátor. Mediátor vyhodnotí situaci a navrhne vyúčtování obchodních prostředků. Pokud oba obchodníci přijmou tento návrh, je výplata dokončena a obchod je uzavřen. Pokud jeden nebo oba obchodníci nesouhlasí s výplatou navrhovanou mediátorem, mohou požádat o rozhodčí řízení. Rozhodce přehodnotí situaci a v odůvodněných případech vrátí osobně prostředky obchodníkovi zpět a požádá o vrácení této platby od Bisq DAO. +support.initialInfo=Do níže uvedeného textového pole zadejte popis problému. Přidejte co nejvíce informací k urychlení doby řešení sporu.\n\nZde je kontrolní seznam informací, které byste měli poskytnout:\n\t● Pokud kupujete BTC: Provedli jste převod Fiat nebo Altcoinu? Pokud ano, klikli jste v aplikaci na tlačítko „Platba zahájena“?\n\t● Pokud jste prodejcem BTC: Obdrželi jste platbu Fiat nebo Altcoinu? Pokud ano, klikli jste v aplikaci na tlačítko „Platba přijata“?\n\t● Kterou verzi Bisq používáte?\n\t● Jaký operační systém používáte?\n\t● Pokud se vyskytl problém s neúspěšnými transakcemi, zvažte přechod na nový datový adresář.\n\t Někdy dojde k poškození datového adresáře a vede to k podivným chybám.\n\t  Viz: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nSeznamte se prosím se základními pravidly procesu sporu:\n\t● Musíte odpovědět na požadavky {0} do 2 dnů.\n\t● Mediátoři reagují do 2 dnů. Rozhodci odpoví do 5 pracovních dnů.\n\t● Maximální doba sporu je 14 dní.\n\t● Musíte spolupracovat s {1} a poskytnout informace, které požaduje, aby jste vyřešili váš případ.\n\t● Při prvním spuštění aplikace jste přijali pravidla uvedena v dokumentu sporu v uživatelské smlouvě.\n\nDalší informace o procesu sporu naleznete na: {2} +support.systemMsg=Systémová zpráva: {0} +support.youOpenedTicket=Otevřeli jste žádost o podporu.\n\n{0}\n\nVerze Bisq: {1} +support.youOpenedDispute=Otevřeli jste žádost o spor.\n\n{0}\n\nVerze Bisq: {1} +support.youOpenedDisputeForMediation=Vyžádali jste si mediaci.\n\n{0}\n\nBisq verze {1} +support.peerOpenedTicket=Váš obchodní partner požádal o podporu kvůli technickým problémům.\n\n{0}\n\nBisq verze: {1} +support.peerOpenedDispute=Váš obchodní partner požádal o spor.\n\n{0}\n\nBisq verze: {1} +support.peerOpenedDisputeForMediation=Váš obchodní partner požádal o mediaci.\n\n{0}\n\nBisq verze: {1} +support.mediatorsDisputeSummary=Systémová zpráva: Shrnutí sporu mediátora:\n{0} +support.mediatorsAddress=Adresa uzlu mediátora: {0} +support.warning.disputesWithInvalidDonationAddress=Zpožděná výplatní transakce použila neplatnou adresu příjemce. Neshoduje se s žádnou z hodnot parametrů DAO pro platné dárcovské adresy.\n\nMůže to být pokus o podvod. Informujte prosím vývojáře o tomto incidentu a neuzavírejte tento případ, dokud nebude situace vyřešena!\n\nAdresa použitá ve sporu: {0}\n\nVšechny parametry pro darovací adresy DAO: {1}\n\nObchodní ID: {2} {3} +support.warning.disputesWithInvalidDonationAddress.mediator=\n\nStále chcete spor uzavřít? +support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nVýplatu nesmíte provést. + + +#################################################################### +# Settings +#################################################################### +settings.tab.preferences=Preference +settings.tab.network=Informace o síti +settings.tab.about=O + +setting.preferences.general=Základní nastavení +setting.preferences.explorer=Bitcoin Explorer +setting.preferences.explorer.bsq=Bisq Explorer +setting.preferences.deviation=Max. odchylka od tržní ceny +setting.preferences.bsqAverageTrimThreshold=Mezní hodnota pro kurz BSQ +setting.preferences.avoidStandbyMode=Vyhněte se pohotovostnímu režimu +setting.preferences.autoConfirmXMR=Automatické potvrzení XMR +setting.preferences.autoConfirmEnabled=Povoleno +setting.preferences.autoConfirmRequiredConfirmations=Požadovaná potvrzení +setting.preferences.autoConfirmMaxTradeSize=Max. částka obchodu (BTC) +setting.preferences.autoConfirmServiceAddresses=Monero Explorer URL (používá Tor, kromě localhost, LAN IP adres a * .local hostname) +setting.preferences.deviationToLarge=Hodnoty vyšší než {0} % nejsou povoleny. +setting.preferences.txFee=Poplatek za výběr transakce (satoshi/vbyte) +setting.preferences.useCustomValue=Použijte vlastní hodnotu +setting.preferences.txFeeMin=Transakční poplatek musí být alespoň {0} satoshi/vbyte +setting.preferences.txFeeTooLarge=Váš vstup je nad jakoukoli rozumnou hodnotou (>5000 satoshi/vbyte). Transakční poplatek se obvykle pohybuje v rozmezí 50-400 satoshi/vbyte. +setting.preferences.ignorePeers=Ignorované peer uzly [onion addresa:port] +setting.preferences.ignoreDustThreshold=Min. hodnota výstupu bez drobných +setting.preferences.currenciesInList=Měny v seznamu zdrojů tržních cen +setting.preferences.prefCurrency=Preferovaná měna +setting.preferences.displayFiat=Zobrazit národní měny +setting.preferences.noFiat=Nejsou vybrány žádné národní měny +setting.preferences.cannotRemovePrefCurrency=Vybranou zobrazovanou měnu nelze odebrat. +setting.preferences.displayAltcoins=Zobrazit altcoiny +setting.preferences.noAltcoins=Nejsou vybrány žádné altcoiny +setting.preferences.addFiat=Přidejte národní měnu +setting.preferences.addAltcoin=Přidejte altcoin +setting.preferences.displayOptions=Zobrazit možnosti +setting.preferences.showOwnOffers=Zobrazit mé vlastní nabídky v seznamu nabídek +setting.preferences.useAnimations=Použít animace +setting.preferences.useDarkMode=Použít tmavý režim +setting.preferences.sortWithNumOffers=Seřadit seznamy trhů s počtem nabídek/obchodů +setting.preferences.resetAllFlags=Obnovit všechny příznaky \"Nezobrazovat znovu\" +settings.preferences.languageChange=Chcete-li použít změnu jazyka na všech obrazovkách, musíte restartovat aplikaci. +settings.preferences.supportLanguageWarning=V případě sporu mějte na paměti, že zprostředkování je řešeno v {0} a arbitráž v {1}. +setting.preferences.daoOptions=Možnosti DAO +setting.preferences.dao.resyncFromGenesis.label=Znovu obnovit stav DAO z genesis tx +setting.preferences.dao.resyncFromResources.label=Obnovit stav DAO ze zdrojů +setting.preferences.dao.resyncFromResources.popup=Po restartu aplikace budou data správy sítě Bisq znovu načtena z počátečních uzlů a stav konsensu BSQ bude znovu vytvořen z nejnovějších zdrojů. +setting.preferences.dao.resyncFromGenesis.popup=Resynchronizace z genesis transakce může stát značné množství času a prostředků CPU. Opravdu to chcete udělat? Většinou je resynchronizace z nejnovějších zdrojových souborů dostatečná a mnohem rychlejší.\n\nPokud budete pokračovat, po restartu aplikace budou data správy sítě Bisq znovu načtena z počátečních uzlů a stav konsensu BSQ bude znovu vytvořen z genesis transakce. +setting.preferences.dao.resyncFromGenesis.resync=Resynchronizovat z genesis transakce a vypnout +setting.preferences.dao.isDaoFullNode=Spusťte Bisq jako full node DAO +setting.preferences.dao.rpcUser=Uživatelské jméno RPC +setting.preferences.dao.rpcPw=RPC heslo +setting.preferences.dao.blockNotifyPort=Blokovat oznamovací port +setting.preferences.dao.fullNodeInfo=Pro spuštění Bisq jako DAO full nodu musíte mít lokálně spuštěný Bitcoin Core a povoleno RPC. Všechny požadavky jsou dokumentovány v ''{0}''.\n\nPo změně režimu je třeba restartovat. +setting.preferences.dao.fullNodeInfo.ok=Otevřete stránku dokumentace +setting.preferences.dao.fullNodeInfo.cancel=Ne, zůstanu u režimu lite node +settings.preferences.editCustomExplorer.headline=Nastavení Průzkumníku +settings.preferences.editCustomExplorer.description=Ze seznamu vlevo vyberte průzkumníka definovaného systémem nebo si jej přizpůsobte podle svých vlastních preferencí. +settings.preferences.editCustomExplorer.available=Dostupní průzkumníci +settings.preferences.editCustomExplorer.chosen=Nastavení zvoleného průzkumníka +settings.preferences.editCustomExplorer.name=Jméno +settings.preferences.editCustomExplorer.txUrl=Transakční URL +settings.preferences.editCustomExplorer.addressUrl=Adresa URL + +settings.net.btcHeader=Bitcoinová síť +settings.net.p2pHeader=Síť Bisq +settings.net.onionAddressLabel=Moje onion adresa +settings.net.btcNodesLabel=Použijte vlastní Bitcoin Core node +settings.net.bitcoinPeersLabel=Připojené peer uzly +settings.net.useTorForBtcJLabel=Použít Tor pro Bitcoinovou síť +settings.net.bitcoinNodesLabel=Bitcoin Core nody, pro připojení +settings.net.useProvidedNodesRadio=Použijte nabízené Bitcoin Core nody +settings.net.usePublicNodesRadio=Použít veřejnou Bitcoinovou síť +settings.net.useCustomNodesRadio=Použijte vlastní Bitcoin Core node +settings.net.warn.usePublicNodes=Používáte-li veřejnou bitcoinovou síť, jste vystaveni závažnému problému s ochranou soukromí způsobenému porušením návrhu a implementace bloom filtru, který se používá pro peněženky SPV, jako je BitcoinJ (použitý v Bisq). Každý full node, ke kterému jste připojeni, mohl zjistit, že všechny vaše adresy peněženky patří jedné entitě.\n\nPřečtěte si více o podrobnostech na adrese: [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nOpravdu chcete použít veřejné nody? +settings.net.warn.usePublicNodes.useProvided=Ne, použijte nabízené nody +settings.net.warn.usePublicNodes.usePublic=Ano, použít veřejnou síť +settings.net.warn.useCustomNodes.B2XWarning=Ujistěte se, že váš bitcoinový node je důvěryhodný BItcoin Core node!\n\nPřipojení k nodům, které nedodržují pravidla konsensu Bitcoin Core, může poškodit vaši peněženku a způsobit problémy v obchodním procesu.\n\nUživatelé, kteří se připojují k nodům, které porušují pravidla konsensu, odpovídají za případné škody, které z toho vyplývají. Jakékoli výsledné spory budou rozhodnuty ve prospěch druhého obchodníka. Uživatelům, kteří ignorují tyto varovné a ochranné mechanismy, nebude poskytována technická podpora! +settings.net.warn.invalidBtcConfig=Připojení k bitcoinové síti selhalo, protože je vaše konfigurace neplatná.\n\nVaše konfigurace byla resetována, aby se místo toho použily poskytnuté bitcoinové uzly. Budete muset restartovat aplikaci. +settings.net.localhostBtcNodeInfo=Základní informace: Bisq při spuštění hledá místní Bitcoinový uzel. Pokud je nalezen, Bisq bude komunikovat se sítí Bitcoin výhradně skrze něj. +settings.net.p2PPeersLabel=Připojené uzly +settings.net.onionAddressColumn=Onion adresa +settings.net.creationDateColumn=Založeno +settings.net.connectionTypeColumn=Příchozí/Odchozí +settings.net.sentDataLabel=Statistiky odeslaných dat +settings.net.receivedDataLabel=Statistiky přijatých dat +settings.net.roundTripTimeColumn=Roundtrip +settings.net.sentBytesColumn=Odesláno +settings.net.receivedBytesColumn=Přijato +settings.net.peerTypeColumn=Typ peer uzlu +settings.net.openTorSettingsButton=Otevřít nastavení Toru + +settings.net.versionColumn=Verze +settings.net.subVersionColumn=Subverze +settings.net.heightColumn=Výška + +settings.net.needRestart=Chcete-li použít tuto změnu, musíte restartovat aplikaci.\nChcete to udělat hned teď? +settings.net.notKnownYet=Není dosud známo... +settings.net.sentData=Odeslaná data: {0}, {1} zprávy, {2} zprávy/sekundu +settings.net.receivedData=Přijatá data: {0}, {1} zprávy, {2} zprávy/sekundu +settings.net.ips=[IP adresa:port | název hostitele:port | onion adresa:port] (oddělené čárkou). Pokud je použit výchozí port (8333), lze port vynechat. +settings.net.seedNode=Seed node +settings.net.directPeer=Peer uzel (přímý) +settings.net.peer=Peer +settings.net.inbound=příchozí +settings.net.outbound=odchozí +settings.net.reSyncSPVChainLabel=Znovu synchronizovat SPV řetěz +settings.net.reSyncSPVChainButton=Odstraňte soubor SPV a znovu synchronizujte +settings.net.reSyncSPVSuccess=Při dalším spuštění bude smazán řetězový soubor SPV. Nyní je třeba aplikaci restartovat.\n\nPo restartu může chvíli trvat, než se znovu synchronizuje se sítí, a všechny transakce uvidíte až po dokončení resynchronizace.\n\nV závislosti na počtu transakcí a stáří vaší peněženky může resynchronizace trvat až několik hodin a spotřebovávat 100% CPU. Proces nepřerušujte, jinak jej musíte opakovat. +settings.net.reSyncSPVAfterRestart=Soubor řetězu SPV byl odstraněn. Prosím, buďte trpěliví. Resynchronizace se sítí může chvíli trvat. +settings.net.reSyncSPVAfterRestartCompleted=Resynchronizace je nyní dokončena. Restartujte aplikaci. +settings.net.reSyncSPVFailed=Nelze odstranit soubor řetězce SPV.\nChyba: {0} +setting.about.aboutBisq=O projektu Bisq +setting.about.about=Bisq je software s otevřeným zdrojovým kódem, který usnadňuje směnu bitcoinů s národními měnami (a jinými kryptoměnami) prostřednictvím decentralizované sítě typu peer-to-peer způsobem, který silně chrání soukromí uživatelů. Zjistěte více o Bisq na naší webové stránce projektu. +setting.about.web=Webová stránka Bisq +setting.about.code=Zdrojový kód +setting.about.agpl=AGPL Licence +setting.about.support=Podpořte Bisq +setting.about.def=Bisq není společnost - je to projekt otevřený komunitě. Pokud se chcete zapojit nebo podpořit Bisq, postupujte podle níže uvedených odkazů. +setting.about.contribute=Přispět +setting.about.providers=Poskytovatelé dat +setting.about.apisWithFee=Bisq používá Bisq cenový index pro tržní ceny Fiat měn a Altcoinu a Bisq Mempool Nodes pro odhad poplatků za těžbu. +setting.about.apis=Bisq používá Bisq cenové indexy pro tržní ceny Fiat měn a Altcoinů. +setting.about.pricesProvided=Tržní ceny poskytované +setting.about.feeEstimation.label=Odhad poplatků za těžbu poskytl +setting.about.versionDetails=Podrobnosti o verzi +setting.about.version=Verze aplikace +setting.about.subsystems.label=Verze subsystémů +setting.about.subsystems.val=Verze sítě: {0}; Verze zpráv P2P: {1}; Verze lokální DB: {2}; Verze obchodního protokolu: {3} + +setting.about.shortcuts=Zkratky +setting.about.shortcuts.ctrlOrAltOrCmd=''Ctrl + {0}'' nebo ''alt + {0}'' nebo ''cmd + {0}'' + +setting.about.shortcuts.menuNav=Procházet hlavní nabídku +setting.about.shortcuts.menuNav.value=Pro pohyb v hlavním menu stiskněte: 'Ctrl' nebo 'alt' nebo 'cmd' s numerickou klávesou mezi '1-9' + +setting.about.shortcuts.close=Zavřít Bisq +setting.about.shortcuts.close.value=''Ctrl + {0}'' nebo ''cmd + {0}'' nebo ''Ctrl + {1}'' nebo ''cmd + {1}'' + +setting.about.shortcuts.closePopup=Zavřete vyskakovací nebo dialogové okno +setting.about.shortcuts.closePopup.value=Klávesa „ESCAPE“ + +setting.about.shortcuts.chatSendMsg=Odeslat obchodní soukromou zprávu +setting.about.shortcuts.chatSendMsg.value=''Ctrl + ENTER'' nebo ''alt + ENTER'' nebo ''cmd + ENTER'' + +setting.about.shortcuts.openDispute=Otevřít spor +setting.about.shortcuts.openDispute.value=Vyberte nevyřízený obchod a klikněte na: {0} + +setting.about.shortcuts.walletDetails=Otevřít okno s podrobností peněženky + +setting.about.shortcuts.openEmergencyBtcWalletTool=Otevřít nástroj nouzové peněženky pro BTC peněženku + +setting.about.shortcuts.openEmergencyBsqWalletTool=Otevřete nástroj nouzové peněženky pro BSQ peněženku + +setting.about.shortcuts.showTorLogs=Přepnout úroveň protokolu pro zprávy Tor mezi DEBUG a WARN + +setting.about.shortcuts.manualPayoutTxWindow=Otevřít okno pro manuální výběr z vkladu 2z2 Multisig tx + +setting.about.shortcuts.reRepublishAllGovernanceData=Zveřejnit data správy DAO (návrhy, hlasy) + +setting.about.shortcuts.removeStuckTrade=Otevřete vyskakovací okno a přesuňte zaseknutý obchod na kartu selhaných obchodů (použijte pouze pokud jste si jisti) +setting.about.shortcuts.removeStuckTrade.value=Vyberte nevyřízený obchod a stiskněte: {0} + +setting.about.shortcuts.registerArbitrator=Registrovat rozhodce (pouze mediátor/rozhodce) +setting.about.shortcuts.registerArbitrator.value=Přejděte na účet a stiskněte: {0} + +setting.about.shortcuts.registerMediator=Registrovat mediátora (pouze mediátor/rozhodce) +setting.about.shortcuts.registerMediator.value=Přejděte na účet a stiskněte: {0} + +setting.about.shortcuts.openSignPaymentAccountsWindow=Otevřené okno pro podpis věku účtu (pouze starší rozhodci) +setting.about.shortcuts.openSignPaymentAccountsWindow.value=Přejděte ke starému zobrazení rozhodce a stiskněte: {0} + +setting.about.shortcuts.sendAlertMsg=Odeslat výstražnou nebo aktualizační zprávu (privilegovaná aktivita) + +setting.about.shortcuts.sendFilter=Nastavit filtr (privilegovaná aktivita) + +setting.about.shortcuts.sendPrivateNotification=Odeslat soukromé oznámení partnerovi (privilegovaná aktivita) +setting.about.shortcuts.sendPrivateNotification.value=Otevřete informace o peeru na avataru a stiskněte: {0} + +setting.info.headline=Nová funkce automatického potvrzení XMR +setting.info.msg=Při prodeji BTC za XMR můžete pomocí funkce automatického potvrzení ověřit, že do vaší peněženky bylo odesláno správné množství XMR, takže Bisq může automaticky označit obchod jako dokončený, což zrychlí obchodování pro všechny.\n\nAutomatické potvrzení zkontroluje transakci XMR alespoň na 2 uzlech průzkumníka XMR pomocí klíče soukromé transakce poskytnutého odesílatelem XMR. Ve výchozím nastavení používá Bisq uzly průzkumníka spuštěné přispěvateli Bisq, ale pro maximální soukromí a zabezpečení doporučujeme spustit vlastní uzel průzkumníka XMR.\n\nMůžete také nastavit maximální částku BTC na obchod, která se má automaticky potvrdit, a také počet požadovaných potvrzení zde v Nastavení.\n\nZobrazit další podrobnosti (včetně toho, jak nastavit vlastní uzel průzkumníka) na Bisq wiki: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] +#################################################################### +# Account +#################################################################### + +account.tab.mediatorRegistration=Registrace mediátora +account.tab.refundAgentRegistration=Registrace agenta vrácení peněz +account.tab.signing=Podepisování +account.info.headline=Vítejte ve vašem účtu Bisq +account.info.msg=Zde můžete přidat obchodní účty pro národní měny & altcoiny a vytvořit zálohu dat vaší peněženky a účtu.\n\nPři prvním spuštění Bisq byla vytvořena nová bitcoinová peněženka.\n\nDůrazně doporučujeme zapsat si seed slova bitcoinových peněženek (viz záložka nahoře) a před financováním zvážit přidání hesla. Vklady a výběry bitcoinů jsou spravovány v sekci \ "Finance \".\n\nOchrana osobních údajů a zabezpečení: protože Bisq je decentralizovaná smenárna, všechna data jsou uložena ve vašem počítači. Neexistují žádné servery, takže nemáme přístup k vašim osobním informacím, vašim finančním prostředkům ani vaší IP adrese. Údaje, jako jsou čísla bankovních účtů, adresy altcoinů a bitcoinu atd., jsou sdíleny pouze s obchodním partnerem za účelem uskutečnění obchodů, které zahájíte (v případě sporu uvidí Prostředník nebo Rozhodce stejná data jako váš obchodní peer uzel). + +account.menu.paymentAccount=Účty v národní měně +account.menu.altCoinsAccountView=Altcoinové účty +account.menu.password=Heslo peněženky +account.menu.seedWords=Seed peněženky +account.menu.backup=Záloha +account.menu.notifications=Oznámení + +## TODO should we rename the following to a gereric name? +account.arbitratorRegistration.pubKey=Veřejný klíč + +account.arbitratorRegistration.register=Registrovat +account.arbitratorRegistration.registration={0} registrace +account.arbitratorRegistration.revoke=Odvolat +account.arbitratorRegistration.info.msg=Upozorňujeme, že po odvolání musíte zůstat k dispozici 15 dní, protože mohou existovat obchody, které vás používají jako {0}. Max. povolené obchodní období je 8 dní a proces řešení sporu může trvat až 7 dní. +account.arbitratorRegistration.warn.min1Language=Musíte nastavit alespoň 1 jazyk.\nPřidali jsme vám výchozí jazyk. +account.arbitratorRegistration.removedSuccess=Úspěšně jste odstranili svou registraci ze sítě Bisq. +account.arbitratorRegistration.removedFailed=Registraci se nepodařilo odebrat. {0} +account.arbitratorRegistration.registerSuccess=Úspěšně jste se zaregistrovali do sítě Bisq. +account.arbitratorRegistration.registerFailed=Registraci se nepodařilo dokončit. {0} + +account.altcoin.yourAltcoinAccounts=Vaše altcoinové účty +account.altcoin.popup.wallet.msg=Ujistěte se, že dodržujete požadavky na používání peněženek {0}, jak je popsáno na webové stránce {1}.\nPoužití peněženek z centralizovaných směnáren, kde (a) nevlastníte své privátní klíče nebo (b) které nepoužívají kompatibilní software peněženky, je riskantní: může to vést ke ztrátě obchodovaných prostředků!\nMediátor nebo rozhodce není specialista {2} a v takových případech nemůže pomoci. +account.altcoin.popup.wallet.confirm=Rozumím a potvrzuji, že vím, jakou peněženku musím použít. +# suppress inspection "UnusedProperty" +account.altcoin.popup.upx.msg=Obchodování s UPX na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání UPX musíte použít buď oficiální peněženku GUI uPlexa nebo CLI peněženku uPlexa s povoleným příznakem store-tx-info (výchozí hodnota v nových verzích). Ujistěte se, že máte přístup k klíči tx, který může být vyžadován v případě sporu.\nuplexa-wallet-cli (použijte příkaz get_tx_key)\nuplexa-wallet-gui (přejděte na záložku historie a pro potvrzení platby klikněte na tlačítko (P))\n\nV normálním block exploreru není přenos ověřitelný.\n\nV případě sporu musíte rozhodci poskytnout následující údaje:\n- Soukromý klíč tx\n- Hash transakce\n- Veřejnou adresa příjemce\n\nPokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke prohrání sporu. Odesílatel UPX odpovídá za zajištění ověření přenosu UPX rozhodci v případě sporu.\n\nNení požadováno žádné platební ID, pouze normální veřejná adresa.\nPokud si nejste jisti tímto procesem, vyhledejte další informace na discord kanálu uPlexa (https://discord.gg/vhdNSrV) nebo uPlexa Telegram Chatu (https://t.me/uplexaOfficial). +# suppress inspection "UnusedProperty" +account.altcoin.popup.arq.msg=Obchodování ARQ na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání ARQ musíte použít buď oficiální peněženku ArQmA GUI nebo peněženku ArQmA CLI s povoleným příznakem store-tx-info (výchozí hodnota v nových verzích). Ujistěte se, že máte přístup k klíči tx, který může být vyžadován v případě sporu.\narqma-wallet-cli (použijte příkaz get_tx_key)\narqma-wallet-gui (přejděte na kartu historie a pro potvrzení platby klikněte na tlačítko (P))\n\nV normálním blok exploreru není přenos ověřitelný.\n\nV případě sporu musíte mediátorovi nebo rozhodci poskytnout následující údaje:\n- Soukromý klíč tx\n- Hash transakce\n- Veřejnou adresu příjemce\n\nPokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke prohrání sporu. Odesílatel ARQ odpovídá za zajištění ověření převodu ARQ mediátorovi nebo rozhodci v případě sporu.\n\nNení požadováno žádné platební ID, pouze normální veřejná adresa.\nPokud si nejste jisti tímto procesem, navštivte discord kanál ArQmA (https://discord.gg/s9BQpJT) nebo fórum ArQmA (https://labs.arqma.com). +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Obchodování s XMR na Bisq vyžaduje, abyste pochopili následující požadavek.\n\nPokud prodáváte XMR, musíte být schopni v případě sporu poskytnout mediátorovi nebo rozhodci následující informace:\n- transakční klíč (Tx klíč, Tx tajný klíč nebo Tx soukromý klíč)\n- ID transakce (Tx ID nebo Tx Hash)\n- cílová adresa (adresa příjemce)\n\nNa wiki najdete podrobnosti, kde najdete tyto informace v populárních peněženkách Monero:\n[HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\n\nNeposkytnutí požadovaných údajů o transakci bude mít za následek ztrátu sporů.\n\nVšimněte si také, že Bisq nyní nabízí automatické potvrzení transakcí XMR, aby byly obchody rychlejší, ale musíte to povolit v Nastavení.\n\nDalší informace o funkci automatického potvrzení najdete na wiki:\n[HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" +account.altcoin.popup.msr.msg=Obchodování MSR na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání MSR musíte použít buď oficiální peněženku Masari GUI, peněženku Masari CLI s povoleným příznakem store-tx-info (ve výchozím nastavení povoleno) nebo webovou peněženku Masari (https://wallet.getmasari.org). Ujistěte se, že máte přístup k klíči tx, který může být vyžadován v případě sporu.\nmasari-wallet-cli (použijte příkaz get_tx_key)\nmasari-wallet-gui (přejděte na kartu historie a klikněte na tlačítko (P) pro potvrzení platby)\n\nWebová peněženka Masari (jděte do Účet -> Historie transakcí a zobrazte podrobností o odeslané transakci)\n\nOvěření lze provést v peněžence.\nmasari-wallet-cli: pomocí příkazu (check_tx_key).\nmasari-wallet-gui: na stránce Pokročilé > Dokázat/Ověřit.\nOvěření lze provést v block exploreru\nOtevřete Block explorer (https://explorer.getmasari.org), použijte vyhledávací lištu k nalezení hash transakce.\nJakmile je transakce nalezena, přejděte dolů do oblasti „Prokázat odesílání“ a podle potřeby vyplňte podrobnosti.\nV případě sporu musíte zprostředkovateli nebo rozhodci poskytnout následující údaje:\n- Soukromý klíč tx\n- Hash transakce\n- Veřejnou adresu příjemce\n\nPokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke ztrátě sporu. Odesílatel MSR odpovídá za zajištění ověření přenosu MSR mediátorovi nebo rozhodci v případě sporu.\n\nNení požadováno žádné platební ID, pouze normální veřejná adresa.\nPokud si nejste jisti tímto procesem, požádejte o pomoc oficiální Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" +account.altcoin.popup.blur.msg=Obchodování BLUR na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání BLUR musíte použít Blur Network CLI nebo GUI peněženku.\n\nPoužíváte-li peněženku CLI, po odeslání transakce se zobrazí hash transakce (tx ID). Tyto informace si musíte uložit. Ihned po odeslání tranakce musíte použít příkaz 'get_tx_key' pro načtení soukromého klíče transakce. Pokud tento krok neprovedete, pravděpodobně nebudete moci klíč získat později.\n\nPokud používáte peněženku GUI Blur Network, lze soukromý klíč transakce a ID transakce pohodlně nalézt na kartě Historie. Ihned po odeslání vyhledejte příslušnou transakci. Klikněte na "?" symbol v pravém dolním rohu pole obsahující transakci. Tyto informace si musíte uložit.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1.) ID transakce, 2.) soukromý klíč transakce a 3.) Adresu příjemce. Mediátor nebo rozhodce poté ověří přenos BLUR pomocí prohlížeče BLUR transakcí (https://blur.cash/#tx-viewer).\n\nNeposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese odesílatel BLUR 100% odpovědnosti za ověřování transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Bisq. Nejprve vyhledejte pomoc na Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" +account.altcoin.popup.solo.msg=Obchodování Solo na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání Solo musíte použít peněženku CLI Solo Network.\n\nPoužíváte-li peněženku CLI, po odeslání přenosu se zobrazí hash transakce (tx ID). Tyto informace si musíte uložit. Ihned po odeslání převodu musíte použít příkaz 'get_tx_key' pro načtení soukromého klíče transakce. Pokud tento krok neprovedete, pravděpodobně nebudete moci klíč získat později.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1.) ID transakce, 2.) Soukromý klíč transakce a 3.) Adresu příjemce. Mediátor nebo rozhodce poté ověří převod Solo pomocí Solo Block Exploreru vyhledáním transakce a poté pomocí funkce „Prokažte odesílání“ (https://explorer.minesolo.com/).\n\nneposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese Solo odesílatel 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Bisq. Nejprve vyhledejte pomoc na stránce Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" +account.altcoin.popup.cash2.msg=Obchodování CASH2 na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání CASH2 musíte použít peněženku Cash2 Wallet verze 3 nebo vyšší.\n\nPo odeslání transakce se zobrazí ID transakce. Tyto informace si musíte uložit. Ihned po odeslání transakce musíte použít příkaz 'getTxKey' v simplewallet a získat tajný klíč transakce.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1) ID transakce, 2) Tajný klíč transakce a 3) Adresu Cash2 příjemce. Mediátor nebo rozhodce poté ověří převod CASH2 pomocí průzkumníku Cash2 Block Explorer (https://blocks.cash2.org).\n\nNeposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese odesílatel CASH2 100% odpovědnost za ověření transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Bisq. Nejprve vyhledejte pomoc na Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" +account.altcoin.popup.qwertycoin.msg=Obchodování s Qwertycoinem na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání QWC musíte použít oficiální QWC peněženku verze 5.1.3 nebo vyšší.\n\nPo odeslání transakce se zobrazí ID transakce. Tyto informace si musíte uložit. Ihned po odeslání transakce musíte použít příkaz 'get_Tx_Key' v simplewallet a získat tajný klíč transakce.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit následující: 1) ID transakce, 2) Tajný klíč transakce a 3) Adresu QWC příjemce. Mediátor nebo rozhodce poté ověří přenos QWC pomocí Průzkumníka bloků QWC (https://explorer.qwertycoin.org).\n\nNeposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese odesílatel QWC 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Bisq. Nejprve vyhledejte pomoc na stránce QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" +account.altcoin.popup.drgl.msg=Obchodování Dragonglass na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nVzhledem k tomu, že Dragonglass poskytuje soukromí, není transakce na veřejném blockchainu ověřitelná. V případě potřeby můžete svou platbu prokázat pomocí vašeho soukromého klíče TXN.\nSoukromý klíč TXN je jednorázový klíč automaticky generovaný pro každou transakci, ke které lze přistupovat pouze z vaší DRGL peněženky.\nBuď pomocí GUI peněženky DRGL (uvnitř dialogu s podrobnostmi o transakci) nebo pomocí simplewallet CLI Dragonglass (pomocí příkazu "get_tx_key").\n\nVerze DRGL „Oathkeeper“ a vyšší jsou požadovány pro obě možnosti.\n\nV případě sporu musíte mediátorovi nebo rozhodci poskytnout následující údaje:\n- TXN-soukromý klíč\n- Hash transakce\n- Veřejnou adresu příjemce\n\nOvěření platby lze provést pomocí výše uvedených údajů jako vstupů na adrese (http://drgl.info/#check_txn).\n\nPokud neposkytnete výše uvedená data nebo použijete nekompatibilní peněženku, dojde ke ztrátě sporu. Odesílatel Dragonglass odpovídá za ověření přenosu DRGL mediátorovi nebo rozhodci v případě sporu. Použití PaymentID není nutné.\n\nPokud si nejste jisti některou částí tohoto procesu, navštivte nápovědu pro Dragonglass na Discord (http://discord.drgl.info). +# suppress inspection "UnusedProperty" +account.altcoin.popup.ZEC.msg=Při použití Zcash můžete použít pouze transparentní adresy (začínající t), nikoli z-adresy (soukromé), protože mediátor nebo rozhodce by nemohl ověřit transakci pomocí z-adres. +# suppress inspection "UnusedProperty" +account.altcoin.popup.XZC.msg=Při použití Zcoinu můžete použít pouze transparentní (sledovatelné) adresy, nikoli nevysledovatelné adresy, protože mediátor nebo rozhodce by nemohl ověřit transakci s nevysledovatelnými adresami v blok exploreru. +# suppress inspection "UnusedProperty" +account.altcoin.popup.grin.msg=GRIN vyžaduje k vytvoření transakce interaktivní proces mezi odesílatelem a příjemcem. Nezapomeňte postupovat podle pokynů z webové stránky projektu GRIN, abyste spolehlivě odeslali a přijali GRIN (příjemce musí být online nebo alespoň online v určitém časovém rozmezí).\n\nBisq podporuje pouze formát URL peněženky Grinbox (Wallet713).\n\nOdesílatel GRIN je povinen prokázat, že GRIN úspěšně odeslal. Pokud peněženka nemůže tento důkaz poskytnout, bude potenciální spor vyřešen ve prospěch příjemce GRIN. Ujistěte se, že používáte nejnovější software Grinbox, který podporuje důkaz transakcí a že chápete proces přenosu a přijímání GRIN a také způsob, jak vytvořit důkaz.\n\nViz https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only pro více informací o nástroji Grinbox proof. +# suppress inspection "UnusedProperty" +account.altcoin.popup.beam.msg=BEAM vyžaduje k vytvoření transakce interaktivní proces mezi odesílatelem a příjemcem.\n\nNezapomeňte postupovat podle pokynů na webové stránce projektu BEAM, abyste spolehlivě odeslali a přijali BEAM (příjemce musí být online nebo alespoň online během určitého časového období).\n\nOdesílatel BEAM je povinen prokázat, že úspěšně odeslali BEAM. Nezapomeňte použít software peněženku, která může takový důkaz předložit. Pokud peněženka nemůže poskytnout důkaz, bude potenciální spor vyřešen ve prospěch příjemce BEAM. +# suppress inspection "UnusedProperty" +account.altcoin.popup.pars.msg=Trading ParsiCoin na Bisq vyžaduje, abyste pochopili a splnili následující požadavky:\n\nK odeslání PARS musíte použít oficiální ParsiCoin peněženku verze 3.0.0 nebo vyšší.\n\nV Peněženka GUI (ParsiPay) si můžete zkontrolovat svůj Hash Transakce a Klíč Transakce on Transactions v sekci Transakce.\n\nV případě, že je nutné rozhodčí řízení, musíte mediátorovi nebo rozhodci předložit: 1) Hash Transakce, 2) Transakční Klíč a 3) Adresu PARS příjemce. Mediátor nebo rozhodce poté ověří přenos PARS pomocí Block exploreru ParsiCoin (http://explorer.parsicoin.net/#check_payment).\n\nNeposkytnutí požadovaných informací mediátorovi nebo rozhodci povede k prohrání sporu. Ve všech sporných případech nese odesílatel ParsiCoin 100% odpovědnost za ověřování transakcí mediátorovi nebo rozhodci.\n\nPokud těmto požadavkům nerozumíte, neobchodujte na Bisq. Nejprve vyhledejte pomoc na ParsiCoin Discord (https://discord.gg/c7qmFNh). + +# suppress inspection "UnusedProperty" +account.altcoin.popup.blk-burnt.msg=Chcete-li obchodovat s burnt blackcoiny, musíte znát následující:\n\nBurnt blackcoiny jsou nevyčerpatelné. Aby je bylo možné obchodovat na Bisq, musí mít výstupní skripty podobu: OP_RETURN OP_PUSHDATA, následované přidruženými datovými bajty, které po hexadecimálním zakódování tvoří adresy. Například Burnt blackcoiny s adresou 666f6f („foo“ v UTF-8) budou mít následující skript:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nPro vytvoření Burnt blackcoinů lze použít příkaz „burn“ RPC, který je k dispozici v některých peněženkách.\n\nPro možné případy použití se můžete podívat na https://ibo.laboratorium.ee.\n\nVzhledem k tomu, že Burnt blackcoiny jsou nevyčerpatelné, nelze je znovu prodat. „Prodej“ Burnt blackcoinů znamená vypalování běžných blackcoinů (s přidruženými údaji rovnými cílové adrese).\n\nV případě sporu musí prodejce BLK poskytnout hash transakce. + +# suppress inspection "UnusedProperty" +account.altcoin.popup.liquidbitcoin.msg=Obchodování s L-BTC na Bisq vyžaduje, abyste pochopili následující skutečnosti:\n\nKdyž přijímáte L-BTC za obchod na Bisq, nemůžete použít mobilní peněženku Green od Blockstreamu ani jinou custidial peněženku nebo peněženku na burze. L-BTC musíte přijmout pouze do peněženky Liquid Elements Core nebo do jiné L-BTC peněženky, která vám umožní získat slepý klíč pro vaši slepou adresu L-BTC.\n\nV případě, že je nutné zprostředkování, nebo pokud dojde k obchodnímu sporu, musíte zprostředkujícímu mediátorovi Bisq nebo agentovi, který vrací peníze zaslat slepý klíč pro vaši L-BTC adresu, aby mohli ověřit podrobnosti vaší důvěrné transakce na svém vlastním Elements Core full-nodu.\n\nNeposkytnutí požadovaných informací zprostředkovateli nebo agentovi pro vrácení peněz povede ke prohrání sporu. Ve všech sporných případech nese příjemce L-BTC 100% břemeno odpovědnosti za poskytnutí kryptografického důkazu zprostředkovateli nebo agentovi pro vrácení peněz.\n\nPokud těmto požadavkům nerozumíte, neobchodujte s L-BTC na Bisq. + +account.fiat.yourFiatAccounts=Vaše účty v národní měně + +account.backup.title=Zálohujte peněženku +account.backup.location=Umístění zálohy +account.backup.selectLocation=Zvolte umístění zálohy +account.backup.backupNow=Zálohujte nyní (záloha není šifrována!) +account.backup.appDir=Adresář dat aplikace +account.backup.openDirectory=Otevřít adresář +account.backup.openLogFile=Otevřít soubor log +account.backup.success=Záloha byla úspěšně uložena na:\n{0} +account.backup.directoryNotAccessible=Vybraný adresář není přístupný. {0} + +account.password.removePw.button=Odstraňte heslo +account.password.removePw.headline=Odstraňte ochranu peněženky pomocí hesla +account.password.setPw.button=Nastavit heslo +account.password.setPw.headline=Nastavte ochranu peněženky pomocí hesla +account.password.info=S ochranou pomocí hesla budete muset zadat heslo při spuštění aplikace, při výběru bitcoinů z vaší peněženky a při obnovení peněženky z seed slov. + +account.seed.backup.title=Zálohujte si seed slova peněženky +account.seed.info=Napište prosím seed slova peněženky a datum! Peněženku můžete kdykoli obnovit pomocí seed slov a datumu.\nStejná seed slova se používají pro peněženku BTC a BSQ.\n\nMěli byste si zapsat seed slova na list papíru. Neukládejte je do počítače.\n\nUpozorňujeme, že seed slova NEJSOU náhradou za zálohu.\nChcete-li obnovit stav a data aplikace, musíte vytvořit zálohu celého adresáře aplikace z obrazovky \"Účet/Záloha\".\nImport seed slov se doporučuje pouze v naléhavých případech. Aplikace nebude funkční bez řádného zálohování databázových souborů a klíčů! +account.seed.backup.warning=Pamatujte, že seed slova NEJSOU náhradou za zálohu.\nChcete-li obnovit stav a data aplikace, musíte z obrazovky \"Účet/Záloha\" vytvořit zálohu celého adresáře aplikace.\nImport seed slov se doporučuje pouze v naléhavých případech. Bez řádného zálohování databázových souborů a klíčů nebude aplikace funkční!\n\nDalší informace najdete na wiki stránce [HYPERLINK:https://bisq.wiki/Backing_up_application_data]. +account.seed.warn.noPw.msg=Nenastavili jste si heslo k peněžence, které by chránilo zobrazení seed slov.\n\nChcete zobrazit seed slova? +account.seed.warn.noPw.yes=Ano, a už se mě znovu nezeptat +account.seed.enterPw=Chcete-li zobrazit seed slova, zadejte heslo +account.seed.restore.info=Před použitím obnovení ze seed slov si vytvořte zálohu. Uvědomte si, že obnova peněženky je pouze pro naléhavé případy a může způsobit problémy s interní databází peněženky.\nNení to způsob, jak použít zálohu! K obnovení předchozího stavu aplikace použijte zálohu z adresáře dat aplikace.\n\nPo obnovení se aplikace automaticky vypne. Po restartování aplikace se bude znovu synchronizovat s bitcoinovou sítí. To může chvíli trvat a může spotřebovat hodně CPU, zejména pokud byla peněženka starší a měla mnoho transakcí. Vyhněte se přerušování tohoto procesu, jinak budete možná muset znovu odstranit soubor řetězu SPV nebo opakovat proces obnovy. +account.seed.restore.ok=Dobře, proveďte obnovu a vypněte Bisq + + +#################################################################### +# Mobile notifications +#################################################################### + +account.notifications.setup.title=Nastavení +account.notifications.download.label=Stáhnout mobilní aplikaci +account.notifications.waitingForWebCam=Čekání na webkameru... +account.notifications.webCamWindow.headline=Naskenujte QR kód z telefonu +account.notifications.webcam.label=Použijte webkameru +account.notifications.webcam.button=Naskenujte QR kód +account.notifications.noWebcam.button=Nemám webkameru +account.notifications.erase.label=Vymazat oznámení na telefonu +account.notifications.erase.title=Vymazat oznámení +account.notifications.email.label=Párovací token +account.notifications.email.prompt=Zadejte párovací token, který jste obdrželi e-mailem +account.notifications.settings.title=Nastavení +account.notifications.useSound.label=Přehrajte zvuk oznámení v telefonu +account.notifications.trade.label=Dostávat zprávy o obchodu +account.notifications.market.label=Dostávat upozornění na nabídky +account.notifications.price.label=Dostávat upozornění o cenách +account.notifications.priceAlert.title=Cenová upozornění +account.notifications.priceAlert.high.label=Upozorněte, pokud bude cena BTC nad +account.notifications.priceAlert.low.label=Upozorněte, pokud bude cena BTC pod +account.notifications.priceAlert.setButton=Nastavit upozornění na cenu +account.notifications.priceAlert.removeButton=Odstraňte upozornění na cenu +account.notifications.trade.message.title=Obchodní stav se změnil +account.notifications.trade.message.msg.conf=Vkladová transakce pro obchod s ID {0} je potvrzena. Otevřete prosím svou aplikaci Bisq a začněte s platbou. +account.notifications.trade.message.msg.started=Kupující BTC zahájil platbu za obchod s ID {0}. +account.notifications.trade.message.msg.completed=Obchod s ID {0} je dokončen. +account.notifications.offer.message.title=Vaše nabídka byla přijata +account.notifications.offer.message.msg=Vaše nabídka s ID {0} byla přijata +account.notifications.dispute.message.title=Nová zpráva o sporu +account.notifications.dispute.message.msg=Obdrželi jste zprávu o sporu pro obchod s ID {0} + +account.notifications.marketAlert.title=Upozornění na nabídku +account.notifications.marketAlert.selectPaymentAccount=Nabídky odpovídající platebnímu účtu +account.notifications.marketAlert.offerType.label=Typ nabídky, o kterou mám zájem +account.notifications.marketAlert.offerType.buy=Nákupní nabídky (Chci prodat BTC) +account.notifications.marketAlert.offerType.sell=Prodejní nabídky (Chci si koupit BTC) +account.notifications.marketAlert.trigger=Nabídková cenová vzdálenost (%) +account.notifications.marketAlert.trigger.info=Když je nastavena cenová vzdálenost, obdržíte upozornění pouze v případě, že je zveřejněna nabídka, která splňuje (nebo překračuje) vaše požadavky. Příklad: chcete prodat BTC, ale budete prodávat pouze s 2% přirážkou k aktuální tržní ceně. Nastavení tohoto pole na 2% zajistí, že budete dostávat upozornění pouze na nabídky s cenami, které jsou o 2% (nebo více) nad aktuální tržní cenou. +account.notifications.marketAlert.trigger.prompt=Procentní vzdálenost od tržní ceny (např. 2,50%, -0,50% atd.) +account.notifications.marketAlert.addButton=Přidat upozornění na nabídku +account.notifications.marketAlert.manageAlertsButton=Spravovat upozornění na nabídku +account.notifications.marketAlert.manageAlerts.title=Spravovat upozornění na nabídku +account.notifications.marketAlert.manageAlerts.header.paymentAccount=Platební účet +account.notifications.marketAlert.manageAlerts.header.trigger=Spouštěcí cena +account.notifications.marketAlert.manageAlerts.header.offerType=Typ nabídky +account.notifications.marketAlert.message.title=Upozornění na nabídku +account.notifications.marketAlert.message.msg.below=pod +account.notifications.marketAlert.message.msg.above=nad +account.notifications.marketAlert.message.msg=Do nabídky Bisq byla zveřejněna nová nabídka ''{0} {1}'' s cenou {2} ({3} {4} tržní cena) a způsob platby ''{5}''.\nID nabídky: {6}. +account.notifications.priceAlert.message.title=Upozornění na cenu pro {0} +account.notifications.priceAlert.message.msg=Vaše upozornění na cenu bylo spuštěno. Aktuální {0} cena je {1} {2} +account.notifications.noWebCamFound.warning=Nebyla nalezena žádná webkamera.\n\nPoužijte e-mailu k odeslání tokenu a šifrovacího klíče z vašeho mobilního telefonu do aplikace Bisq. +account.notifications.priceAlert.warning.highPriceTooLow=Vyšší cena musí být větší než nižší cena. +account.notifications.priceAlert.warning.lowerPriceTooHigh=Nižší cena musí být nižší než vyšší cena. + + + + +#################################################################### +# DAO +#################################################################### + +dao.tab.factsAndFigures=Fakta & Čísla +dao.tab.bsqWallet=Peněženka BSQ +dao.tab.proposals=Vláda +dao.tab.bonding=Upisování +dao.tab.proofOfBurn=Poplatek za výpis majetku/Důkaz o spálení +dao.tab.monitor=Sledování sítě +dao.tab.news=Novinky + +dao.paidWithBsq=zaplaceno BSQ +dao.availableBsqBalance=K dispozici pro výdaje (ověřené + nepotvrzené drobné výstupy) +dao.verifiedBsqBalance=Zůstatek všech ověřených UTXO +dao.unconfirmedChangeBalance=Zůstatek všech nepotvrzených drobných výstupů +dao.unverifiedBsqBalance=Zůstatek všech neověřených transakcí (čeká se na potvrzení bloku) +dao.lockedForVoteBalance=Použito pro hlasování +dao.lockedInBonds=Uzamčeno v úpisech +dao.availableNonBsqBalance=Dostupný zůstatek mimo BSQ (BTC) +dao.reputationBalance=Hodnota Meritů - (nedá se utratit) + +dao.tx.published.success=Vaše transakce byla úspěšně zveřejněna. +dao.proposal.menuItem.make=Navrhněte +dao.proposal.menuItem.browse=Procházet otevřené návrhy +dao.proposal.menuItem.vote=Hlasování o návrzích +dao.proposal.menuItem.result=Výsledky hlasování +dao.cycle.headline=Hlasovací cyklus +dao.cycle.overview.headline=Přehled hlasovacího cyklu +dao.cycle.currentPhase=Aktuální fáze +dao.cycle.currentBlockHeight=Aktuální výška bloku +dao.cycle.proposal=Fáze návrhu +dao.cycle.proposal.next=Další fáze návrhu +dao.cycle.blindVote=Fáze slepého hlasování +dao.cycle.voteReveal=Fáze odhalení hlasování +dao.cycle.voteResult=Výsledek hlasování +dao.cycle.phaseDuration={0} bloky (≈{1}); Bloky {2} - {3} (≈{4} - ≈{5}) +dao.cycle.phaseDurationWithoutBlocks=Blok {0} - {1} (≈{2} - ≈{3}) + +dao.voteReveal.txPublished.headLine=Odhalené hlasování o transakci zveřejněno +dao.voteReveal.txPublished=Vaše odhalené hlasování o transakci s ID transakce {0} bylo úspěšně zveřejněn.\n\nTo se stane automaticky pomocí softwaru, pokud jste se zúčastnili hlasování DAO. + +dao.results.cycles.header=Cykly +dao.results.cycles.table.header.cycle=Cyklus +dao.results.cycles.table.header.numProposals=Návrhy +dao.results.cycles.table.header.voteWeight=Váha hlasování +dao.results.cycles.table.header.issuance=Vydání + +dao.results.results.table.item.cycle=Cyklus {0} začal: {1} + +dao.results.proposals.header=Návrhy vybraného cyklu +dao.results.proposals.table.header.nameLink=Jméno/odkaz +dao.results.proposals.table.header.details=Detaily +dao.results.proposals.table.header.myVote=Můj hlas +dao.results.proposals.table.header.result=Výsledek hlasování +dao.results.proposals.table.header.threshold=Práh +dao.results.proposals.table.header.quorum=Kvorum + +dao.results.proposals.voting.detail.header=Výsledky hlasování pro vybraný návrh + +dao.results.exceptions=Výjimky výsledku hlasování + +# suppress inspection "UnusedProperty" +dao.param.UNDEFINED=Nedefinováno + +# suppress inspection "UnusedProperty" +dao.param.DEFAULT_MAKER_FEE_BSQ=Poplatek tvůrce BSQ +# suppress inspection "UnusedProperty" +dao.param.DEFAULT_TAKER_FEE_BSQ=Poplatek příjemce BSQ +# suppress inspection "UnusedProperty" +dao.param.MIN_MAKER_FEE_BSQ=Min. poplatek tvůrce BSQ +# suppress inspection "UnusedProperty" +dao.param.MIN_TAKER_FEE_BSQ=Min. poplatek příjemce BSQ +# suppress inspection "UnusedProperty" +dao.param.DEFAULT_MAKER_FEE_BTC=Poplatek tvůrce BTC +# suppress inspection "UnusedProperty" +dao.param.DEFAULT_TAKER_FEE_BTC=Poplatek příjemce BTC +# suppress inspection "UnusedProperty" +# suppress inspection "UnusedProperty" +dao.param.MIN_MAKER_FEE_BTC=Min. poplatek tvůrce BTC +# suppress inspection "UnusedProperty" +dao.param.MIN_TAKER_FEE_BTC=Min. poplatek příjemce BTC +# suppress inspection "UnusedProperty" + +# suppress inspection "UnusedProperty" +dao.param.PROPOSAL_FEE=Poplatek za návrh v BSQ +# suppress inspection "UnusedProperty" +dao.param.BLIND_VOTE_FEE=Hlasovací poplatek v BSQ + +# suppress inspection "UnusedProperty" +dao.param.COMPENSATION_REQUEST_MIN_AMOUNT=Žádost o odškodnění min. částka BSQ +# suppress inspection "UnusedProperty" +dao.param.COMPENSATION_REQUEST_MAX_AMOUNT=Žádost o odškodnění max. částka BSQ +# suppress inspection "UnusedProperty" +dao.param.REIMBURSEMENT_MIN_AMOUNT=Žádost o vyrovnání min. částka BSQ +# suppress inspection "UnusedProperty" +dao.param.REIMBURSEMENT_MAX_AMOUNT=Žádost o vyrovnání max. částka BSQ + +# suppress inspection "UnusedProperty" +dao.param.QUORUM_GENERIC=Požadované kvórum v BSQ pro obecný návrh +# suppress inspection "UnusedProperty" +dao.param.QUORUM_COMP_REQUEST=Požadované kvórum v BSQ pro žádost o odškodnění +# suppress inspection "UnusedProperty" +dao.param.QUORUM_REIMBURSEMENT=Požadované kvorum v BSQ pro žádost o vyrovnání +# suppress inspection "UnusedProperty" +dao.param.QUORUM_CHANGE_PARAM=Požadované kvorum v BSQ pro změnu parametru +# suppress inspection "UnusedProperty" +dao.param.QUORUM_REMOVE_ASSET=Požadované kvórum v BSQ pro odebrání aktiva +# suppress inspection "UnusedProperty" +dao.param.QUORUM_CONFISCATION=Požadované kvórum v BSQ pro žádost o konfiskaci +# suppress inspection "UnusedProperty" +dao.param.QUORUM_ROLE=Požadované kvorum v BSQ pro žádost o upsání + +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_GENERIC=Požadovaná prahová hodnota v % pro obecný návrh +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_COMP_REQUEST=Požadovaná prahová hodnota v % pro žádost o odškodnění +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_REIMBURSEMENT=Požadovaná prahová hodnota v % pro žádost o vyrovnání +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_CHANGE_PARAM=Požadovaná prahová hodnota v % pro změnu parametru +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_REMOVE_ASSET=Požadovaná prahová hodnota v % pro odebrání aktiva +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_CONFISCATION=Požadovaná prahová hodnota v % pro žádost o konfiskaci +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_ROLE=Požadovaná prahová hodnota v % pro žádost o úpis + +# suppress inspection "UnusedProperty" +dao.param.RECIPIENT_BTC_ADDRESS=BTC adresa příjemce + +# suppress inspection "UnusedProperty" +dao.param.ASSET_LISTING_FEE_PER_DAY=Poplatek za výpis aktiv za den +# suppress inspection "UnusedProperty" +dao.param.ASSET_MIN_VOLUME=Min. objem obchodu s aktivy + +# suppress inspection "UnusedProperty" +dao.param.LOCK_TIME_TRADE_PAYOUT=Doba uzamčení pro alternativní výplaty obchodu tx +# suppress inspection "UnusedProperty" +dao.param.ARBITRATOR_FEE=Poplatek rozhodce v BTC + +# suppress inspection "UnusedProperty" +dao.param.MAX_TRADE_LIMIT=Max. obchodní limit v BTC + +# suppress inspection "UnusedProperty" +dao.param.BONDED_ROLE_FACTOR=Jednotkový faktor úpisu v BSQ +# suppress inspection "UnusedProperty" +dao.param.ISSUANCE_LIMIT=Emisní limit cyklu v BSQ + +dao.param.currentValue=Aktuální hodnota: {0} +dao.param.currentAndPastValue=Aktuální hodnota: {0} (Hodnota v okamžiku vytvoření návrhu: {1}) +dao.param.blocks={0} bloků + +dao.results.invalidVotes=V tomto hlasovacím cyklu jsme měli neplatné hlasy. To se může stát, pokud hlas nebyl v síti Bisq dobře distribuován.\n{0} + +# suppress inspection "UnusedProperty" +dao.phase.PHASE_UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.phase.PHASE_PROPOSAL=Fáze návrhu +# suppress inspection "UnusedProperty" +dao.phase.PHASE_BREAK1=Přestávka 1 +# suppress inspection "UnusedProperty" +dao.phase.PHASE_BLIND_VOTE=Fáze slepého hlasování +# suppress inspection "UnusedProperty" +dao.phase.PHASE_BREAK2=Přestávka 2 +# suppress inspection "UnusedProperty" +dao.phase.PHASE_VOTE_REVEAL=Fáze odhalení hlasování +# suppress inspection "UnusedProperty" +dao.phase.PHASE_BREAK3=Přestávka 3 +# suppress inspection "UnusedProperty" +dao.phase.PHASE_RESULT=Výsledná fáze + +dao.results.votes.table.header.stakeAndMerit=Váha hlasování +dao.results.votes.table.header.stake=Vklad +dao.results.votes.table.header.merit=Vyděláno +dao.results.votes.table.header.vote=Hlas + +dao.bond.menuItem.bondedRoles=Úpisy +dao.bond.menuItem.reputation=Úpisová reputace +dao.bond.menuItem.bonds=Úpisy + +dao.bond.dashboard.bondsHeadline=Upsané BSQ +dao.bond.dashboard.lockupAmount=Zamknout prostředky +dao.bond.dashboard.unlockingAmount=Uvolnění prostředků (počkejte, dokud neuplyne doba uzamčení) + + +dao.bond.reputation.header=Zamknout úpis pro reputaci +dao.bond.reputation.table.header=Moje reputační úpisy +dao.bond.reputation.amount=Množství BSQ na uzamčení +dao.bond.reputation.time=Čas odemčení v blocích +dao.bond.reputation.salt=Salt +dao.bond.reputation.hash=Hash +dao.bond.reputation.lockupButton=Zamknout +dao.bond.reputation.lockup.headline=Potvrďte uzamčení transakce +dao.bond.reputation.lockup.details=Uzamčená částka: {0}\nČas odemknutí: {1} blok(ů) (≈ {2})\n\nPoplatek za těžbu: {3} ({4} Satoshis/vbyte)\nTransakční vsize: {5} Kb\n\nOpravdu chcete pokračovat? +dao.bond.reputation.unlock.headline=Potvrďte odemknutí transakce +dao.bond.reputation.unlock.details=Odemknout částku: {0}\nČas odemknutí: {1} blok(ů) (≈ {2})\n\nPoplatek za těžbu: {3} ({4} Satoshis/vbyte)\nTransakční vsize: {5} vKb\n\nOpravdu chcete pokračovat? + +dao.bond.allBonds.header=Všechny úpisy + +dao.bond.bondedReputation=Úpisová reputace +dao.bond.bondedRoles=Úpisy + +dao.bond.details.header=Podrobnosti role +dao.bond.details.role=Role +dao.bond.details.requiredBond=Požadované BSQ úpisy +dao.bond.details.unlockTime=Čas odemčení v blocích +dao.bond.details.link=Odkaz na popis role +dao.bond.details.isSingleton=Může být přijato více držiteli rolí +dao.bond.details.blocks={0} bloků + +dao.bond.table.column.name=Jméno +dao.bond.table.column.link=Odkaz +dao.bond.table.column.bondType=Typ úpisu +dao.bond.table.column.details=Detaily +dao.bond.table.column.lockupTxId=Zamknout Tx ID +dao.bond.table.column.bondState=Stav úpisu +dao.bond.table.column.lockTime=Čas odemknutí +dao.bond.table.column.lockupDate=Datum uzamčení + +dao.bond.table.button.lockup=Zamknout +dao.bond.table.button.unlock=Odemknout +dao.bond.table.button.revoke=Odvolat + +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.bond.bondState.READY_FOR_LOCKUP=Zatím není úpis +# suppress inspection "UnusedProperty" +dao.bond.bondState.LOCKUP_TX_PENDING=Uzamčení čeká na vyřízení +# suppress inspection "UnusedProperty" +dao.bond.bondState.LOCKUP_TX_CONFIRMED=Zamčený úpis +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNLOCK_TX_PENDING=Odemčení čeká na vyřízení +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNLOCK_TX_CONFIRMED=Odemknutí tx potvrzeno +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNLOCKING=Odblokování úpisů +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNLOCKED=Úpis odemčen +# suppress inspection "UnusedProperty" +dao.bond.bondState.CONFISCATED=Úpis konfiskován + +# suppress inspection "UnusedProperty" +dao.bond.lockupReason.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.bond.lockupReason.BONDED_ROLE=Úpis +# suppress inspection "UnusedProperty" +dao.bond.lockupReason.REPUTATION=Úpisová reputace + +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.GITHUB_ADMIN=GitHub admin +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.FORUM_ADMIN=Forum admin +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.TWITTER_ADMIN=Twitter admin +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.ROCKET_CHAT_ADMIN=Keybase admin +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.YOUTUBE_ADMIN=YouTube admin +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BISQ_MAINTAINER=Bisq správce +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BITCOINJ_MAINTAINER=BitcoinJ-fork správce +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.NETLAYER_MAINTAINER=Netlayer správce +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.WEBSITE_OPERATOR=Správce webu +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.FORUM_OPERATOR=Operator fóra +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.SEED_NODE_OPERATOR=Operátor seed nodu +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.DATA_RELAY_NODE_OPERATOR=Operátor cenového nodu +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BTC_NODE_OPERATOR=Operátor Bitcoinového nodu +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.MARKETS_OPERATOR=Operátor trhů +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BSQ_EXPLORER_OPERATOR=Provozovatel průzkumníka +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.MOBILE_NOTIFICATIONS_RELAY_OPERATOR=Operátor přenosu mobilních oznámení +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.DOMAIN_NAME_HOLDER=Držitel domény +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.DNS_ADMIN=DNS admin +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.MEDIATOR=Mediátor +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.ARBITRATOR=Rozhodce +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BTC_DONATION_ADDRESS_OWNER=Majitel dárcovské adresy BTC + +dao.burnBsq.assetFee=Výpis aktiv +dao.burnBsq.menuItem.assetFee=Poplatek za výpis aktiv +dao.burnBsq.menuItem.proofOfBurn=Důkaz spálením +dao.burnBsq.header=Poplatek za výpis aktiv +dao.burnBsq.selectAsset=Vybrat aktivum +dao.burnBsq.fee=Poplatek +dao.burnBsq.trialPeriod=Zkušební doba +dao.burnBsq.payFee=Zaplatit poplatek +dao.burnBsq.allAssets=Všechna aktiva +dao.burnBsq.assets.nameAndCode=Jméno aktiva +dao.burnBsq.assets.state=Stav +dao.burnBsq.assets.tradeVolume=Objem obchodu +dao.burnBsq.assets.lookBackPeriod=Období ověření +dao.burnBsq.assets.trialFee=Poplatek za zkušební období +dao.burnBsq.assets.totalFee=Celkové zaplacené poplatky +dao.burnBsq.assets.days={0} dní +dao.burnBsq.assets.toFewDays=Poplatek za aktivum je příliš nízký. Min. počet dnů pro zkušební období je {0}. + +# suppress inspection "UnusedProperty" +dao.assetState.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.assetState.IN_TRIAL_PERIOD=Ve zkušebním období +# suppress inspection "UnusedProperty" +dao.assetState.ACTIVELY_TRADED=Aktivně obchodováno +# suppress inspection "UnusedProperty" +dao.assetState.DE_LISTED=Odstranění ze seznamu kvůli nečinnosti +# suppress inspection "UnusedProperty" +dao.assetState.REMOVED_BY_VOTING=Odebráno hlasováním + +dao.proofOfBurn.header=Důkaz spálením +dao.proofOfBurn.amount=Množství +dao.proofOfBurn.preImage=Předobraz +dao.proofOfBurn.burn=Spálit +dao.proofOfBurn.allTxs=Všechny důkazy o spálení transakcí +dao.proofOfBurn.myItems=Můj důkaz o spálení transakcí +dao.proofOfBurn.date=Datum +dao.proofOfBurn.hash=Hash +dao.proofOfBurn.txs=Transakce +dao.proofOfBurn.pubKey=Pubkey +dao.proofOfBurn.signature.window.title=Podepište zprávu klíčem z důkazu o spálení transakce +dao.proofOfBurn.verify.window.title=Ověřte zprávu pomocí klíče z důkazu o spálení transakce +dao.proofOfBurn.copySig=Zkopírujte podpis do schránky +dao.proofOfBurn.sign=Podepsat +dao.proofOfBurn.message=Zpráva +dao.proofOfBurn.sig=Podpis +dao.proofOfBurn.verify=Ověřit +dao.proofOfBurn.verificationResult.ok=Ověření proběhlo úspěšně +dao.proofOfBurn.verificationResult.failed=Ověření se nezdařilo + +# suppress inspection "UnusedProperty" +dao.phase.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.phase.PROPOSAL=Fáze návrhu +# suppress inspection "UnusedProperty" +dao.phase.BREAK1=Přestávka před fází slepého hlasování +# suppress inspection "UnusedProperty" +dao.phase.BLIND_VOTE=Fáze slepého hlasování +# suppress inspection "UnusedProperty" +dao.phase.BREAK2=Přestávka před fází odhalení hlasování +# suppress inspection "UnusedProperty" +dao.phase.VOTE_REVEAL=Fáze odhalení hlasování +# suppress inspection "UnusedProperty" +dao.phase.BREAK3=Přestávka před výslednou fází +# suppress inspection "UnusedProperty" +dao.phase.RESULT=Hlasujte ve výsledné fázi + +# suppress inspection "UnusedProperty" +dao.phase.separatedPhaseBar.PROPOSAL=Fáze návrhu +# suppress inspection "UnusedProperty" +dao.phase.separatedPhaseBar.BLIND_VOTE=Slepý hlas +# suppress inspection "UnusedProperty" +dao.phase.separatedPhaseBar.VOTE_REVEAL=Odhalit hlasování +# suppress inspection "UnusedProperty" +dao.phase.separatedPhaseBar.RESULT=Výsledek hlasování + +# suppress inspection "UnusedProperty" +dao.proposal.type.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.proposal.type.COMPENSATION_REQUEST=Žádost o odškodnění +# suppress inspection "UnusedProperty" +dao.proposal.type.REIMBURSEMENT_REQUEST=Žádost o vyrovnání +# suppress inspection "UnusedProperty" +dao.proposal.type.BONDED_ROLE=Źádost o úpis +# suppress inspection "UnusedProperty" +dao.proposal.type.REMOVE_ASSET=Návrh na odstranění aktiva +# suppress inspection "UnusedProperty" +dao.proposal.type.CHANGE_PARAM=Návrh na změnu parametru +# suppress inspection "UnusedProperty" +dao.proposal.type.GENERIC=Obecný návrh +# suppress inspection "UnusedProperty" +dao.proposal.type.CONFISCATE_BOND=Źádost o konfiskaci úpisu + +# suppress inspection "UnusedProperty" +dao.proposal.type.short.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.proposal.type.short.COMPENSATION_REQUEST=Žádost o odškodnění +# suppress inspection "UnusedProperty" +dao.proposal.type.short.REIMBURSEMENT_REQUEST=Žádost o vyrovnání +# suppress inspection "UnusedProperty" +dao.proposal.type.short.BONDED_ROLE=Úpis +# suppress inspection "UnusedProperty" +dao.proposal.type.short.REMOVE_ASSET=Odstranění altcoinu +# suppress inspection "UnusedProperty" +dao.proposal.type.short.CHANGE_PARAM=Změna parametru +# suppress inspection "UnusedProperty" +dao.proposal.type.short.GENERIC=Obecný návrh +# suppress inspection "UnusedProperty" +dao.proposal.type.short.CONFISCATE_BOND=Konfiskovat úpis + +dao.proposal.details=Detaily návrhu +dao.proposal.selectedProposal=Vybraný návrh +dao.proposal.active.header=Návrhy současného cyklu +dao.proposal.active.remove.confirm=Opravdu chcete tento návrh odebrat?\nJiž zaplacený poplatek za návrh bude ztracen. +dao.proposal.active.remove.doRemove=Ano, odeberte můj návrh +dao.proposal.active.remove.failed=Návrh nelze odebrat. +dao.proposal.myVote.title=Hlasování +dao.proposal.myVote.accept=Přijmout návrh +dao.proposal.myVote.reject=Odmítnout návrh +dao.proposal.myVote.removeMyVote=Ignorovat návrh +dao.proposal.myVote.merit=Hlasovací váha ze získaného BSQ +dao.proposal.myVote.stake=Hlasovací váha z vkladu +dao.proposal.myVote.revealTxId=Hlasování odhalí ID transakce +dao.proposal.myVote.stake.prompt=Max. dostupný vklad pro hlasování: {0} +dao.proposal.votes.header=Nastavte vklad pro hlasování a zveřejněte své hlasy +dao.proposal.myVote.button=Zveřejnit hlasy +dao.proposal.myVote.setStake.description=Po hlasování o všech návrzích musíte nastavit svůj vklad pro hlasování zamknutím BSQ. Čím více BSQ zamknete, tím větší váhu bude mít váš hlas.\n\nBSQ uzamčené pro hlasování bude znovu odemčeno během fáze odhalení hlasování. +dao.proposal.create.selectProposalType=Vyberte typ nabídky +dao.proposal.create.phase.inactive=Počkejte prosím do další fáze návrhu +dao.proposal.create.proposalType=Typ nabídky +dao.proposal.create.new=Vytvořte nový návrh +dao.proposal.create.button=Navrhněte +dao.proposal.create.publish=Zveřejnit návrh +dao.proposal.create.publishing=Probíhá zveřejnění nabídek... +dao.proposal=návrh +dao.proposal.display.type=Typ nabídky +dao.proposal.display.name=Přesné uživatelské jméno na GitHub +dao.proposal.display.link=Odkaz na podrobné informace +dao.proposal.display.link.prompt=Odkaz na návrh +dao.proposal.display.requestedBsq=Požadovaná částka v BSQ +dao.proposal.display.txId=ID transakce návrhu +dao.proposal.display.proposalFee=Poplatek za návrh +dao.proposal.display.myVote=Můj hlas +dao.proposal.display.voteResult=Souhrn výsledku hlasování +dao.proposal.display.bondedRoleComboBox.label=Typ úpisu +dao.proposal.display.requiredBondForRole.label=Požadovaný úpis +dao.proposal.display.option=Možnost + +dao.proposal.table.header.proposalType=Typ nabídky +dao.proposal.table.header.link=Odkaz +dao.proposal.table.header.myVote=Můj hlas +# suppress inspection "UnusedProperty" +dao.proposal.table.header.remove=Odstranit +dao.proposal.table.icon.tooltip.removeProposal=Odebrat můj návrh +dao.proposal.table.icon.tooltip.changeVote=Aktuální hlas: ''{0}''. Změnit hlas na: ''{1}'' + +dao.proposal.display.myVote.accepted=Přijato +dao.proposal.display.myVote.rejected=Odmítnuto +dao.proposal.display.myVote.ignored=Ignorováno +dao.proposal.display.myVote.unCounted=Hlasování nebylo zahrnuto do výsledku +dao.proposal.myVote.summary=Hlasováno: {0}; Hlasovací váha: {1} (získané: {2} + vklad: {3}) {4} +dao.proposal.myVote.invalid=Hlasování bylo neplatné + +dao.proposal.voteResult.success=Přijato +dao.proposal.voteResult.failed=Odmítnuto +dao.proposal.voteResult.summary=Výsledek: {0}; Prahová hodnota: {1} (požadováno > {2}); Kvórum: {3} (povinné > {4}) + +dao.proposal.display.paramComboBox.label=Vyberte parametr, který chcete změnit +dao.proposal.display.paramValue=Hodnota parametru + +dao.proposal.display.confiscateBondComboBox.label=Zvolte úpis +dao.proposal.display.assetComboBox.label=Aktivum k odstranění + +dao.blindVote=slepý hlas + +dao.blindVote.startPublishing=Publikování transakce se slepým hlasováním ... +dao.blindVote.success=Vaše transakce se slepým hlasováním byla úspěšně zveřejněna.\n\nVezměte prosím na vědomí, že musíte být online ve fázi odhalení hlasování, aby vaše aplikace Bisq mohla zveřejnit transakci odhalení hlasování. Bez transakce odhalení hlasování by byl váš hlas neplatný! + +dao.wallet.menuItem.send=Odeslat +dao.wallet.menuItem.receive=Přijat +dao.wallet.menuItem.transactions=Transakce + +dao.wallet.dashboard.myBalance=Můj zůstatek v peněžence + +dao.wallet.receive.fundYourWallet=Vaše přijímací BSQ adresa +dao.wallet.receive.bsqAddress=Adresa peněženky BSQ (čerstvá nepoužitá adresa) + +dao.wallet.send.sendFunds=Poslat finanční prostředky +dao.wallet.send.sendBtcFunds=Odeslat prostředky jiné než BSQ (BTC) +dao.wallet.send.amount=Částka v BSQ +dao.wallet.send.btcAmount=Částka v BTC (jiná než BSQ prostředky) +dao.wallet.send.setAmount=Nastavit částku k výběru (minimální částka je {0}) +dao.wallet.send.receiverAddress=BSQ adresa příjemce +dao.wallet.send.receiverBtcAddress=BTC adresa příjemce +dao.wallet.send.setDestinationAddress=Vyplňte svou cílovou adresu +dao.wallet.send.send=Pošlete BSQ prostředky +dao.wallet.send.sendBtc=Pošlete BTC prostředky +dao.wallet.send.sendFunds.headline=Potvrďte žádost o výběr +dao.wallet.send.sendFunds.details=Odesílání: {0}\nNa přijímací adresu: {1}.\nPožadovaný transakční poplatek je: {2} ({3} satoshi/vbyte)\nTransakční vsize: {4} vKb\n\nPříjemce obdrží: {5}\n\nOpravdu chcete tuto částku vybrat? +dao.wallet.chainHeightSynced=Poslední ověřený blok: {0} +dao.wallet.chainHeightSyncing=Čekání na bloky... Ověřeno {0} bloků z {1} +dao.wallet.tx.type=Typ + +# suppress inspection "UnusedProperty" +dao.tx.type.enum.UNDEFINED=Nedefinováno +# suppress inspection "UnusedProperty" +dao.tx.type.enum.UNDEFINED_TX_TYPE=Nerozpoznáno +# suppress inspection "UnusedProperty" +dao.tx.type.enum.UNVERIFIED=Neověřená transakce BSQ +# suppress inspection "UnusedProperty" +dao.tx.type.enum.INVALID=Neplatná transakce BSQ +# suppress inspection "UnusedProperty" +dao.tx.type.enum.GENESIS=Genesis transakce +# suppress inspection "UnusedProperty" +dao.tx.type.enum.TRANSFER_BSQ=Převod BSQ +# suppress inspection "UnusedProperty" +dao.tx.type.enum.received.TRANSFER_BSQ=Přijaté BSQ +# suppress inspection "UnusedProperty" +dao.tx.type.enum.sent.TRANSFER_BSQ=Odeslané BSQ +# suppress inspection "UnusedProperty" +dao.tx.type.enum.PAY_TRADE_FEE=Obchodní poplatek +# suppress inspection "UnusedProperty" +dao.tx.type.enum.COMPENSATION_REQUEST=Poplatek za žádost o odškodnění +# suppress inspection "UnusedProperty" +dao.tx.type.enum.REIMBURSEMENT_REQUEST=Poplatek za žádost o vyrovnání +# suppress inspection "UnusedProperty" +dao.tx.type.enum.PROPOSAL=Poplatek za návrh +# suppress inspection "UnusedProperty" +dao.tx.type.enum.BLIND_VOTE=Poplatek za slepé hlasování +# suppress inspection "UnusedProperty" +dao.tx.type.enum.VOTE_REVEAL=Odhalit hlasování +# suppress inspection "UnusedProperty" +dao.tx.type.enum.LOCKUP=Zamknout úpis +# suppress inspection "UnusedProperty" +dao.tx.type.enum.UNLOCK=Odemknout úpis +# suppress inspection "UnusedProperty" +dao.tx.type.enum.ASSET_LISTING_FEE=Poplatek za výpis majetku +# suppress inspection "UnusedProperty" +dao.tx.type.enum.PROOF_OF_BURN=Důkaz spálením +# suppress inspection "UnusedProperty" +dao.tx.type.enum.IRREGULAR=Nepravidelný + +dao.tx.withdrawnFromWallet=BTC vybrané z peněženky +dao.tx.issuanceFromCompReq=Žádost o odškodnění/vydání +dao.tx.issuanceFromCompReq.tooltip=Žádost o kompenzaci, která vedla k vydání nového BSQ.\nDatum vydání: {0} +dao.tx.issuanceFromReimbursement=Žádost o vyrovnání/vydání +dao.tx.issuanceFromReimbursement.tooltip=Žádost o kompenzaci, která vedla k vydání nového BSQ.\nDatum vydání: {0} +dao.proposal.create.missingBsqFunds=Pro vytvoření návrhu nemáte dostatečné prostředky BSQ. Pokud máte nepotvrzenou transakci BSQ, musíte počkat na potvrzení na blockchainu, protože BSQ je validováno, pouze pokud je zahrnuto v bloku.\nChybí: {0} + +dao.proposal.create.missingBsqFundsForBond=Pro tuto roli nemáte dostatečné prostředky BSQ. Tento návrh můžete stále zveřejnit, ale pokud bude přijat, budete potřebovat celou částku BSQ potřebnou pro tuto roli.\nChybí: {0} + +dao.proposal.create.missingMinerFeeFunds=Nemáte dostatečné prostředky BTC pro vytvoření transakce návrhu. Všechny transakce BSQ vyžadují poplatek za těžbu v BTC.\nChybí: {0} + +dao.proposal.create.missingIssuanceFunds=Nemáte dostatečné prostředky BTC pro vytvoření transakce návrhu. Všechny transakce BSQ vyžadují poplatek za těžbu v BTC a emisní transakce také vyžadují BTC pro požadovanou částku BSQ ({0} Satoshi/BSQ).\nChybí: {1} + +dao.feeTx.confirm=Potvrďte {0} transakci +dao.feeTx.confirm.details={0} poplatek: {1}\nPoplatek za těžbu: {2} ({3} Satoshi/vbyte)\nTransakční vsize: {4} vKb\n\nOpravdu chcete publikovat transakci {5}? + +dao.feeTx.issuanceProposal.confirm.details={0} poplatek: {1}\nPro vydání BSQ je potřeba BTC: {2} ({3} Satoshi/BSQ)\nPoplatek za těžbu: {4} ({5} Satoshi/vbyte)\nTransakční vsize: {6} vKb\n\nPokud bude vaše žádost schválena, obdržíte požadovanou částku bez poplatku za návrh 2 BSQ.\n\nOpravdu chcete publikovat transakci {7}? + +dao.news.bisqDAO.title=BISQ DAO +dao.news.bisqDAO.description=Stejně jako je burza Bisq decentralizovaná a odolná vůči cenzuře, tak její model řízení - a Bisq DAO a BSQ token jsou nástroje, které to umožňují. +dao.news.bisqDAO.readMoreLink=Dozvědět se více o Bisq DAO + +dao.news.pastContribution.title=PŘISPĚLI JSTE V MINULOSTI? POŽÁDEJTE O BSQ +dao.news.pastContribution.description=Pokud jste přispěli do projektu Bisq, použijte prosím níže uvedenou adresu BSQ a požádejte o účast na distribuci prvních BSQ. +dao.news.pastContribution.yourAddress=Adresa vaší bsq peněženky +dao.news.pastContribution.requestNow=Požádat hned + +dao.news.DAOOnTestnet.title=SPUSŤTE BISQ DAO NA NAŠEM TESTNETU +dao.news.DAOOnTestnet.description=Síť Bisq DAO ještě nebyla spuštěn, ale o Bisq DAO se můžete dozvědět jeho spuštěním na našem testnetu. +dao.news.DAOOnTestnet.firstSection.title=1. Přepněte do režimu DAO Testnet +dao.news.DAOOnTestnet.firstSection.content=Na obrazovce Nastavení přepněte na DAO Testnet. +dao.news.DAOOnTestnet.secondSection.title=2. Získejte některé BSQ +dao.news.DAOOnTestnet.secondSection.content=Vyžádejte si BSQ na Slacku nebo kupte BSQ na Bisq. +dao.news.DAOOnTestnet.thirdSection.title=3. Zúčastněte se hlasovacího cyklu +dao.news.DAOOnTestnet.thirdSection.content=Předkládání návrhů a hlasování o návrzích na změnu různých aspektů Bisq. +dao.news.DAOOnTestnet.fourthSection.title=4. Prozkoumejte BSQ Blok Explorer +dao.news.DAOOnTestnet.fourthSection.content=Protože BSQ je jen bitcoin, můžete vidět BSQ transakce na našem bitcoinovém blok exploreru. +dao.news.DAOOnTestnet.readMoreLink=Přečtěte si celou dokumentaci + +dao.monitor.daoState=Stav DAO +dao.monitor.proposals=Stav návrhů +dao.monitor.blindVotes=Stav slepých hlasů + +dao.monitor.table.peers=Peer uzly +dao.monitor.table.conflicts=Konflikt +dao.monitor.state=Stav +dao.monitor.requestAlHashes=Vyžádat si všechny hashe +dao.monitor.resync=Znovu synchronizovat stav DAO +dao.monitor.table.header.cycleBlockHeight=Cyklus / Výška bloku +dao.monitor.table.cycleBlockHeight=Cyklus {0} / blok {1} +dao.monitor.table.seedPeers=Seed node: {0} + +dao.monitor.daoState.headline=Stav DAO +dao.monitor.daoState.table.headline=Řetězec hashů stavu DAO +dao.monitor.daoState.table.blockHeight=Výška bloku +dao.monitor.daoState.table.hash=Hash stavu DAO +dao.monitor.daoState.table.prev=Předchozí hash +dao.monitor.daoState.conflictTable.headline=Hashe stavu DAO od partnerů v konfliktu +dao.monitor.daoState.utxoConflicts=Konflikt UTXO +dao.monitor.daoState.utxoConflicts.blockHeight=Výška bloku: {0} +dao.monitor.daoState.utxoConflicts.sumUtxo=Součet všech UTXO: {0} BSQ +dao.monitor.daoState.utxoConflicts.sumBsq=Součet všech BSQ: {0} BSQ +dao.monitor.daoState.checkpoint.popup=Stav DAO není synchronizován se sítí. Po restartu se stav DAO znovu synchronizuje. + +dao.monitor.proposal.headline=Stav návrhů +dao.monitor.proposal.table.headline=Řetězec hashů stavu návrhu +dao.monitor.proposal.conflictTable.headline=Návrhované stavy hashů od partnerů v konfliktu + +dao.monitor.proposal.table.hash=Hash stavu návrhu +dao.monitor.proposal.table.prev=Předchozí hash +dao.monitor.proposal.table.numProposals=Počet návrhů + +dao.monitor.isInConflictWithSeedNode=Vaše lokální data nesouhlasí s alespoň jedním seed nodem. Synchronizujte znovu stav DAO. +dao.monitor.isInConflictWithNonSeedNode=Jeden z vašich peerů není v konsenzu se sítí, ale váš node je synchronizován se seed nody. +dao.monitor.daoStateInSync=Váš lokální node je v konsenzu se sítí + +dao.monitor.blindVote.headline=Stav slepých hlasů +dao.monitor.blindVote.table.headline=Řetězec hashů stavu slepého hlasování +dao.monitor.blindVote.conflictTable.headline=Hashe stavu slepého hlasování od partnerů v konfliktu +dao.monitor.blindVote.table.hash=Hash stavu slepého hlasování +dao.monitor.blindVote.table.prev=Předchozí hash +dao.monitor.blindVote.table.numBlindVotes=Počet slepých hlasování + +dao.factsAndFigures.menuItem.supply=Nabídka BSQ +dao.factsAndFigures.menuItem.transactions=Transakce BSQ + +dao.factsAndFigures.dashboard.avgPrice90=Průměrná obchodní cena BSQ/BTC za 90 dní +dao.factsAndFigures.dashboard.avgPrice30=Průměrná obchodní cena BSQ/BTC za 30 dní +dao.factsAndFigures.dashboard.avgUSDPrice90=90-denní objem váženého průměru obchodní ceny USD/BSQ +dao.factsAndFigures.dashboard.avgUSDPrice30=30-denní objem váženého průměru obchodní ceny USD/BSQ +dao.factsAndFigures.dashboard.marketCap=Tržní kapitalizace (na základě obchodní ceny) +dao.factsAndFigures.dashboard.availableAmount=Celkem k dispozici BSQ + +dao.factsAndFigures.supply.issuedVsBurnt=Vydaných BSQ v. Spálených BSQ + +dao.factsAndFigures.supply.issued=Vydáno BSQ +dao.factsAndFigures.supply.genesisIssueAmount=BSQ vydané při první (genesis) transakci +dao.factsAndFigures.supply.compRequestIssueAmount=BSQ vydáno pro žádosti o odškodnění +dao.factsAndFigures.supply.reimbursementAmount=BSQ vydané pro žádosti o vyrovnání + +dao.factsAndFigures.supply.burnt=Spálených BSQ +dao.factsAndFigures.supply.burntMovingAverage=15-denní klouzavý průměr +dao.factsAndFigures.supply.burntZoomToInliers=Přiblížit k vnitřnímu + +dao.factsAndFigures.supply.locked=Globální stav uzamčených BSQ +dao.factsAndFigures.supply.totalLockedUpAmount=Zamčeno v úpisech +dao.factsAndFigures.supply.totalUnlockingAmount=Odemykání BSQ z úpisů +dao.factsAndFigures.supply.totalUnlockedAmount=Odemčené BSQ z úpisů +dao.factsAndFigures.supply.totalConfiscatedAmount=Konfiskované BSQ z úpisů +dao.factsAndFigures.supply.invalidTxs=Spálené BSQ (neplatné transakce) +dao.factsAndFigures.supply.burntAmount=Spálené BSQ (poplatky) + +dao.factsAndFigures.transactions.genesis=Genesis transakce +dao.factsAndFigures.transactions.genesisBlockHeight=Výška počátečního (genesis) bloku +dao.factsAndFigures.transactions.genesisTxId=ID genesis transakce +dao.factsAndFigures.transactions.txDetails=Statistiky transakcí BSQ +dao.factsAndFigures.transactions.allTx=Počet všech transakcí BSQ +dao.factsAndFigures.transactions.utxo=Počet všech nevyčerpaných transakčních výstupů +dao.factsAndFigures.transactions.compensationIssuanceTx=Počet všech transakcí s žádostí o odškodnění +dao.factsAndFigures.transactions.reimbursementIssuanceTx=Počet všech transakcí k vydání žádosti o vyrovnání +dao.factsAndFigures.transactions.burntTx=Počet všech poplatků platebních transakcí +dao.factsAndFigures.transactions.invalidTx=Počet všech neplatných transakcí +dao.factsAndFigures.transactions.irregularTx=Počet všech nepravidelných transakcí + +#################################################################### +# Windows +#################################################################### + +contractWindow.title=Podrobnosti o sporu +contractWindow.dates=Datum nabídky / Datum obchodu +contractWindow.btcAddresses=Bitcoinová adresa kupujícího BTC / prodávajícího BTC +contractWindow.onions=Síťová adresa kupující BTC / prodávající BTC +contractWindow.accountAge=Stáří účtu BTC kupující / BTC prodejce +contractWindow.numDisputes=Počet sporů BTC kupující / BTC prodejce +contractWindow.contractHash=Hash kontraktu + +displayAlertMessageWindow.headline=Důležitá informace! +displayAlertMessageWindow.update.headline=Důležité informace o aktualizaci! +displayAlertMessageWindow.update.download=Stáhnout: +displayUpdateDownloadWindow.downloadedFiles=Soubory: +displayUpdateDownloadWindow.downloadingFile=Stahuji: {0} +displayUpdateDownloadWindow.verifiedSigs=Podpis ověřen pomocí klíčů: +displayUpdateDownloadWindow.status.downloading=Stahuji soubory... +displayUpdateDownloadWindow.status.verifying=Ověřování podpisu ... +displayUpdateDownloadWindow.button.label=Stáhněte si instalační program a ověřte podpis +displayUpdateDownloadWindow.button.downloadLater=Stáhnout později +displayUpdateDownloadWindow.button.ignoreDownload=Ignorovat tuto verzi +displayUpdateDownloadWindow.headline=K dispozici je nová aktualizace Bisq! +displayUpdateDownloadWindow.download.failed.headline=Stahování selhalo +displayUpdateDownloadWindow.download.failed=Stažení se nezdařilo.\nStáhněte a ručně ověřte na adrese [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Nelze určit správný instalační program. Stáhněte a ručně ověřte na adrese [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Ověření se nezdařilo.\nStáhněte a ručně ověřte na adrese [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.success=Nová verze byla úspěšně stažena a podpis ověřen.\n\nOtevřete adresář ke stažení, vypněte aplikaci a nainstalujte novou verzi. +displayUpdateDownloadWindow.download.openDir=Otevřít adresář ke stažení + +disputeSummaryWindow.title=Souhrn +disputeSummaryWindow.openDate=Datum otevření úkolu +disputeSummaryWindow.role=Role obchodníka +disputeSummaryWindow.payout=Výplata částky obchodu +disputeSummaryWindow.payout.getsTradeAmount=BTC {0} dostane výplatu částky obchodu +disputeSummaryWindow.payout.getsAll=BTC {0} získá vše +disputeSummaryWindow.payout.custom=Vlastní výplata +disputeSummaryWindow.payoutAmount.buyer=Výše výplaty kupujícího +disputeSummaryWindow.payoutAmount.seller=Výše výplaty prodejce +disputeSummaryWindow.payoutAmount.invert=Pužít prohraného jako vydavatele +disputeSummaryWindow.reason=Důvod sporu + +# dynamic values are not recognized by IntelliJ +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.BUG=Chyba +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.USABILITY=Použitelnost +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.PROTOCOL_VIOLATION=Porušení protokolu +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.NO_REPLY=Bez odpovědi +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.SCAM=Scam +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.OTHER=Jiný +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.BANK_PROBLEMS=Banka +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.OPTION_TRADE=Možnost obchodu +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.SELLER_NOT_RESPONDING=Prodejce neodpovídá +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.WRONG_SENDER_ACCOUNT=Špatný účet odesílatele +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.PEER_WAS_LATE=Peer se opozdil +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.TRADE_ALREADY_SETTLED=Obchod je již vypořádán + +disputeSummaryWindow.summaryNotes=Souhrnné poznámky +disputeSummaryWindow.addSummaryNotes=Přidejte souhrnné poznámky +disputeSummaryWindow.close.button=Zavřít úkol + +# Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.msg=Ticket uzavřen {0}\n{1} adresa uzlu: {2}\n\nSouhrn:\nObchodní ID: {3}\nMěna: {4}\nVýše obchodu: {5}\nVýplatní částka pro kupujícího BTC: {6}\nVýplatní částka pro prodejce BTC: {7}\n\nDůvod sporu: {8}\n\nSouhrnné poznámky:\n{9}\n + +# Do no change any line break or order of tokens as the structure is used for signature verification +disputeSummaryWindow.close.msgWithSig={0}{1}{2}{3} + +disputeSummaryWindow.close.nextStepsForMediation=\nDalší kroky:\nOtevřete obchod a přijměte nebo odmítněte návrhy od mediátora +disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nDalší kroky:\nNevyžadují se od vás žádné další kroky. Pokud rozhodce rozhodl ve váš prospěch, zobrazí se ve Prostředky/Transakce transakce „Vrácení peněz z rozhodčího řízení“ +disputeSummaryWindow.close.closePeer=Potřebujete také zavřít úkol obchodního peer uzlu! +disputeSummaryWindow.close.txDetails.headline=Zveřejněte transakci vrácení peněz +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.txDetails.buyer=Kupující obdrží {0} na adresu: {1}\n +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.txDetails.seller=Prodejce obdrží {0} na adresu: {1}\n +disputeSummaryWindow.close.txDetails=Výdaje: {0}\n{1} {2} Transakční poplatek: {3} ({4} satoshi/vbyte)\nTransakční vsize: {5} vKb\n\nOpravdu chcete tuto transakci zveřejnit? + +disputeSummaryWindow.close.noPayout.headline=Uzavřít bez jakékoli výplaty +disputeSummaryWindow.close.noPayout.text=Chcete zavřít bez výplaty? + +emptyWalletWindow.headline={0} nouzový nástroj peněženky +emptyWalletWindow.info=Použijte jej pouze v naléhavých případech, pokud nemůžete získat přístup k vašim prostředkům z uživatelského rozhraní.\n\nUpozorňujeme, že při použití tohoto nástroje budou všechny otevřené nabídky automaticky uzavřeny.\n\nPřed použitím tohoto nástroje si prosím zálohujte datový adresář. Můžete to udělat na obrazovce \"Účet/Záloha\".\n\nNahlaste nám svůj problém a nahlaste zprávu o chybě na GitHubu nebo na fóru Bisq, abychom mohli prozkoumat, co způsobilo problém. +emptyWalletWindow.balance=Váš zůstatek v peněžence +emptyWalletWindow.bsq.btcBalance=Zůstatek satoshi jiných než BSQ + +emptyWalletWindow.address=Vaše cílová adresa +emptyWalletWindow.button=Pošlete všechny prostředky +emptyWalletWindow.openOffers.warn=Máte otevřené nabídky, které budou odstraněny, pokud vyprázdníte peněženku.\nOpravdu chcete vyprázdnit peněženku? +emptyWalletWindow.openOffers.yes=Ano, jsem si jistý +emptyWalletWindow.sent.success=Zůstatek vaší peněženky byl úspěšně přenesen. + +enterPrivKeyWindow.headline=Zadejte soukromý klíč pro registraci + +filterWindow.headline=Upravit seznam filtrů +filterWindow.offers=Filtrované nabídky (oddělené čárkami) +filterWindow.onions=Filtrované onion adresy (oddělené čárkami) +filterWindow.accounts=Filtrovaná data obchodního účtu:\nFormát: seznam [ID platební metody | datové pole | hodnota] oddělený čárkami +filterWindow.bannedCurrencies=Filtrované kódy měn (oddělené čárkami) +filterWindow.bannedPaymentMethods=ID filtrované platební metody (oddělené čárkami) +filterWindow.bannedAccountWitnessSignerPubKeys=Filtrované veřejné klíče účtů podepisujícího svědka (hex nebo pub klíče oddělené čárkou) +filterWindow.bannedPrivilegedDevPubKeys=Filtrované privilegované klíče pub dev (hex nebo pub klíče oddělené čárkou) +filterWindow.arbitrators=Filtrovaní rozhodci (onion adresy oddělené čárkami) +filterWindow.mediators=Filtrovaní mediátoři (onion adresy oddělené čárkami) +filterWindow.refundAgents=Filtrovaní zástupci pro vrácení peněz (adresy oddělené čárkami) +filterWindow.seedNode=Filtrované seed nody (onion adresy oddělené čárkami) +filterWindow.priceRelayNode=Filtrované cenové relay nody (onion adresy oddělené čárkami) +filterWindow.btcNode=Filtrované Bitcoinové nody (adresy+porty oddělené čárkami) +filterWindow.preventPublicBtcNetwork=Zabraňte použití veřejné bitcoinové sítě +filterWindow.disableDao=Zakázat DAO +filterWindow.disableAutoConf=Zakázat automatické potvrzení +filterWindow.autoConfExplorers=Filtrované průzkumníky s automatickým potvrzením (adresy oddělené čárkami) +filterWindow.disableDaoBelowVersion=Min. verze nutná pro DAO +filterWindow.disableTradeBelowVersion=Min. verze nutná pro obchodování +filterWindow.add=Přidat filtr +filterWindow.remove=Zrušit filtr +filterWindow.btcFeeReceiverAddresses=Adresy příjemců poplatků BTC + +offerDetailsWindow.minBtcAmount=Min. částka BTC +offerDetailsWindow.min=(min. {0}) +offerDetailsWindow.distance=(vzdálenost od tržní ceny: {0}) +offerDetailsWindow.myTradingAccount=Můj obchodní účet +offerDetailsWindow.offererBankId=(ID banky/BIC/SWIFT tvůrce) +offerDetailsWindow.offerersBankName=(název banky tvůrce) +offerDetailsWindow.bankId=ID banky (např. BIC nebo SWIFT) +offerDetailsWindow.countryBank=Země původu banky tvůrce +offerDetailsWindow.commitment=Závazek +offerDetailsWindow.agree=Souhlasím +offerDetailsWindow.tac=Pravidla a podmínky +offerDetailsWindow.confirm.maker=Potvrďte: Umístit nabídku na {0} bitcoinu +offerDetailsWindow.confirm.taker=Potvrďte: Využít nabídku pro {0} bitcoinu +offerDetailsWindow.creationDate=Datum vzniku +offerDetailsWindow.makersOnion=Onion adresa tvůrce + +qRCodeWindow.headline=QR Kód +qRCodeWindow.msg=Použijte tento QR kód k financování vaší peněženky Bisq z vaší externí peněženky. +qRCodeWindow.request=Žádost o platbu:\n{0} + +selectDepositTxWindow.headline=Vyberte vkladovou transakci ke sporu +selectDepositTxWindow.msg=Vkladová transakce nebyla v obchodě uložena.\nVyberte prosím jednu z existujících multisig transakcí z vaší peněženky, která byla vkladovou transakcí použitou při selhání obchodu.\n\nSprávnou transakci najdete tak, že otevřete okno s podrobnostmi o obchodu (klikněte na ID obchodu v seznamu) a sledujete výstup transakce s platebním poplatkem za obchodní transakci k následující transakci, kde uvidíte transakci s multisig vklady (adresa začíná na 3). Toto ID transakce by mělo být viditelné v seznamu zde prezentovaném. Jakmile najdete správnou transakci, vyberte ji a pokračujte.\n\nOmlouváme se za nepříjemnosti, ale tento případ chyby by se měl stát velmi zřídka a v budoucnu se pokusíme najít lepší způsoby, jak jej vyřešit. +selectDepositTxWindow.select=Vyberte vkladovou transakci + +sendAlertMessageWindow.headline=Odeslat globální oznámení +sendAlertMessageWindow.alertMsg=Výstražná zpráva +sendAlertMessageWindow.enterMsg=Zadejte zprávu +sendAlertMessageWindow.isUpdate=Aktualizované oznámení +sendAlertMessageWindow.version=Číslo nové verze +sendAlertMessageWindow.send=Odeslat oznámení +sendAlertMessageWindow.remove=Odebrat oznámení + +sendPrivateNotificationWindow.headline=Odeslat soukromou zprávu +sendPrivateNotificationWindow.privateNotification=Soukromé oznámení +sendPrivateNotificationWindow.enterNotification=Zadejte oznámení +sendPrivateNotificationWindow.send=Odeslat soukromé oznámení + +showWalletDataWindow.walletData=Data peněženky +showWalletDataWindow.includePrivKeys=Zahrnout soukromé klíče + +setXMRTxKeyWindow.headline=Prokázat odeslání XMR +setXMRTxKeyWindow.note=Přidání tx informací níže umožní automatické potvrzení pro rychlejší obchody. Zobrazit více: https://bisq.wiki/Trading_Monero +setXMRTxKeyWindow.txHash=ID transakce (volitelné) +setXMRTxKeyWindow.txKey=Transakční klíč (volitelný) + +# We do not translate the tac because of the legal nature. We would need translations checked by lawyers +# in each language which is too expensive atm. +tacWindow.headline=Uživatelská dohoda +tacWindow.agree=Souhlasím +tacWindow.disagree=Nesouhlasím a odcházím +tacWindow.arbitrationSystem=Řešení sporů + +tradeDetailsWindow.headline=Obchod +tradeDetailsWindow.disputedPayoutTxId=ID sporné platební transakce: +tradeDetailsWindow.tradeDate=Datum obchodu +tradeDetailsWindow.txFee=Poplatek za těžbu +tradeDetailsWindow.tradingPeersOnion=Onion adresa obchodního peer uzlu +tradeDetailsWindow.tradingPeersPubKeyHash=Pubkey hash obchodních partnerů +tradeDetailsWindow.tradeState=Stav obchodu +tradeDetailsWindow.agentAddresses=Rozhodce/Mediátor + +walletPasswordWindow.headline=Pro odemknutí zadejte heslo + +torNetworkSettingWindow.header=Nastavení sítě Tor +torNetworkSettingWindow.noBridges=Nepoužívat most (bridge) +torNetworkSettingWindow.providedBridges=Spojte se s poskytnutými mosty (bridges) +torNetworkSettingWindow.customBridges=Zadejte vlastní mosty (bridge) +torNetworkSettingWindow.transportType=Typ přepravy +torNetworkSettingWindow.obfs3=obfs3 +torNetworkSettingWindow.obfs4=obfs4 (doporučeno) +torNetworkSettingWindow.meekAmazon=meek-amazon +torNetworkSettingWindow.meekAzure=meek-azure +torNetworkSettingWindow.enterBridge=Zadejte jedno nebo více mostových relé - bridge relays (jedno na řádek) +torNetworkSettingWindow.enterBridgePrompt=typ addresa:port +torNetworkSettingWindow.restartInfo=Chcete-li použít změny, musíte restartovat aplikaci +torNetworkSettingWindow.openTorWebPage=Otevřít webovou stránku projektu Tor +torNetworkSettingWindow.deleteFiles.header=Problémy s připojením? +torNetworkSettingWindow.deleteFiles.info=Pokud máte při spuštění opakované problémy s připojením, může pomoci odstranění zastaralých souborů Tor. Chcete-li to provést, klikněte na tlačítko níže a poté restartujte aplikaci. +torNetworkSettingWindow.deleteFiles.button=Odstranit zastaralé soubory Tor a vypnout aplikaci +torNetworkSettingWindow.deleteFiles.progress=Probíhá vypínání sítě Tor +torNetworkSettingWindow.deleteFiles.success=Zastaralé soubory Tor byly úspěšně odstraněny. Prosím restartujte aplikaci. +torNetworkSettingWindow.bridges.header=Je Tor blokovaný? +torNetworkSettingWindow.bridges.info=Pokud je Tor zablokován vaším internetovým poskytovatelem nebo vaší zemí, můžete zkusit použít Tor mosty (bridges).\nNavštivte webovou stránku Tor na adrese: https://bridges.torproject.org/bridges, kde se dozvíte více o mostech a připojitelných přepravách. + +feeOptionWindow.headline=Vyberte měnu pro platbu obchodního poplatku +feeOptionWindow.info=Můžete si vybrat, zda chcete zaplatit obchodní poplatek v BSQ nebo v BTC. Pokud zvolíte BSQ, oceníte zlevněný obchodní poplatek. +feeOptionWindow.optionsLabel=Vyberte měnu pro platbu obchodního poplatku +feeOptionWindow.useBTC=Použít BTC +feeOptionWindow.fee={0} (≈ {1}) + + +#################################################################### +# Popups +#################################################################### + +popup.headline.notification=Oznámení +popup.headline.instruction=Upozornění: +popup.headline.attention=Pozor +popup.headline.backgroundInfo=Základní informace +popup.headline.feedback=Hotovo +popup.headline.confirmation=Potvrzení +popup.headline.information=Informace +popup.headline.warning=Varování +popup.headline.error=Chyba + +popup.doNotShowAgain=Znovu nezobrazovat +popup.reportError.log=Otevřete log soubor +popup.reportError.gitHub=Nahlaste problém na GitHub +popup.reportError={0}\n\nChcete-li nám pomoci vylepšit software, nahlaste tuto chybu otevřením nového problému na adrese https://github.com/bisq-network/bisq/issues.\nVýše uvedená chybová zpráva bude zkopírována do schránky po kliknutí na některé z níže uvedených tlačítek.\nUsnadníte ladění, pokud zahrnete soubor bisq.log stisknutím tlačítka „Otevřít log soubor“, uložením kopie a připojením ke zprávě o chybě. + +popup.error.tryRestart=Zkuste prosím restartovat aplikaci a zkontrolovat síťové připojení, abyste zjistili, zda můžete problém vyřešit. +popup.error.takeOfferRequestFailed=Když se někdo pokusil využít jednu z vašich nabídek, došlo k chybě:\n{0} + +error.spvFileCorrupted=Při čtení řetězce SPV došlo k chybě.\nJe možné, že je poškozen řetězový soubor SPV.\n\nChybová zpráva: {0}\n\nChcete ji smazat a začít znovu synchronizovat? +error.deleteAddressEntryListFailed=Soubor AddressEntryList nelze smazat.\nChyba: {0} +error.closedTradeWithUnconfirmedDepositTx=Vkladová transakce uzavřeného obchodu s obchodním ID {0} je stále nepotvrzená.\n\nProveďte prosím SPV resynchronizaci v \"Nastavení/Informace o síti\" a zkontrolujte, zda je transakce platná. +error.closedTradeWithNoDepositTx=Vkladová transakce uzavřeného obchodu s obchodním ID {0} je nulová.\n\nChcete-li vyčistit seznam uzavřených obchodů, restartujte aplikaci. + +popup.warning.walletNotInitialized=Peněženka ještě není inicializována +popup.warning.osxKeyLoggerWarning=V souladu s přísnějšími bezpečnostními opatřeními v systému macOS 10.14 a novějších způsobí spuštění aplikace Java (Bisq používá Javu) upozornění na vyskakovací okno v systému MacOS („Bisq by chtěl přijímat stisknutí kláves z jakékoli aplikace“).\n\nChcete-li se tomuto problému vyhnout, otevřete své Nastavení macOS a přejděte do části "Zabezpečení a soukromí" -> "Soukromí" -> "Sledování vstupu" a ze seznamu na pravé straně odeberte „Bisq“.\n\nBisq upgraduje na novější verzi Java, aby se tomuto problému vyhnul, jakmile budou vyřešena technická omezení (balíček Java Packager pro požadovanou verzi Java ještě není dodán). +popup.warning.wrongVersion=Pravděpodobně máte nesprávnou verzi Bisq pro tento počítač.\nArchitektura vašeho počítače je: {0}.\nBinární kód Bisq, který jste nainstalovali, je: {1}.\nVypněte prosím a znovu nainstalujte správnou verzi ({2}). +popup.warning.incompatibleDB=Zjistili jsme nekompatibilní soubory databáze!\n\nTyto databázové soubory nejsou kompatibilní s naší aktuální kódovou základnou:\n{0}\n\nVytvořili jsme zálohu poškozených souborů a aplikovali jsme výchozí hodnoty na novou verzi databáze.\n\nZáloha se nachází na adrese:\n{1}/db/backup_of_corrupted_data.\n\nZkontrolujte, zda máte nainstalovanou nejnovější verzi Bisq.\nMůžete si jej stáhnout na adrese: [HYPERLINK:https://bisq.network/downloads].\n\nRestartujte aplikaci. +popup.warning.startupFailed.twoInstances=Bisq již běží. Nemůžete spustit dvě instance Bisq. +popup.warning.tradePeriod.halfReached=Váš obchod s ID {0} dosáhl poloviny max. povoleného obchodního období a stále není dokončen.\n\nObdobí obchodování končí {1}\n\nDalší informace o stavu obchodu naleznete na adrese \"Portfolio/Otevřené obchody\". +popup.warning.tradePeriod.ended=Váš obchod s ID {0} dosáhl max. povoleného obchodního období a není dokončen.\n\nObdobí obchodování skončilo {1}\n\nZkontrolujte prosím svůj obchod v sekci "Portfolio/Otevřené obchody\", abyste kontaktovali mediátora. +popup.warning.noTradingAccountSetup.headline=Nemáte nastaven obchodní účet +popup.warning.noTradingAccountSetup.msg=Než budete moci vytvořit nabídku, musíte si nastavit národní měnu nebo altcoinový účet.\nChcete si založit účet? +popup.warning.noArbitratorsAvailable=Nejsou k dispozici žádní rozhodci. +popup.warning.noMediatorsAvailable=Nejsou k dispozici žádní mediátoři. +popup.warning.notFullyConnected=Musíte počkat, až budete plně připojeni k síti.\nTo může při spuštění trvat až 2 minuty. +popup.warning.notSufficientConnectionsToBtcNetwork=Musíte počkat, až budete mít alespoň {0} připojení k bitcoinové síti. +popup.warning.downloadNotComplete=Musíte počkat, až bude stahování chybějících bitcoinových bloků kompletní. +popup.warning.removeOffer=Opravdu chcete tuto nabídku odebrat?\nPokud tuto nabídku odstraníte, ztratí se poplatek tvůrce {0}. +popup.warning.tooLargePercentageValue=Nelze nastavit procento 100% nebo větší. +popup.warning.examplePercentageValue=Zadejte procento jako číslo \"5.4\" pro 5.4% +popup.warning.noPriceFeedAvailable=Pro tuto měnu není k dispozici žádný zdroj cen. Nelze použít procentuální cenu.\nVyberte pevnou cenu. +popup.warning.sendMsgFailed=Odeslání zprávy vašemu obchodnímu partnerovi se nezdařilo.\nZkuste to prosím znovu a pokud to i nadále selže, nahláste chybu. +popup.warning.insufficientBtcFundsForBsqTx=Nemáte dostatečné prostředky BTC k zaplacení poplatku za těžbu za tuto transakci.\nFinancujte prosím svou BTC peněženku.\nChybějící prostředky: {0} +popup.warning.bsqChangeBelowDustException=Tato transakce vytváří výstup BSQ, který je pod limitem drobných (5,46 BSQ) a byl by bitcoinovou sítí odmítnut.\n\nMusíte buď poslat vyšší částku, abyste se vyhnuli drobným (např. Přidáním drobné částky do vaší odeslané částky), nebo přidejte do své peněženky další prostředky BSQ, abyste se vyhnuli generování drobných.\n\nVýstup drobných {0}. +popup.warning.btcChangeBelowDustException=Tato transakce vytváří výstup, který je pod limitem drobných (546 satoshi) a byl by bitcoinovou sítí odmítnut.\n\nMusíte přidat vyšší množství drobných k vašemu odesílanému množství, abyste se vyhnuli vytváření drobných.\n\nVýstup drobných je {0}. + +popup.warning.insufficientBsqFundsForBtcFeePayment=K provedení této transakce budete potřebovat více BSQ - posledních 5,46 BSQ ve vaší peněžence nelze použít k placení obchodních poplatků kvůli omezení prachových mincí v bitcoinovém protokolu.\n\nMůžete si buď koupit více BSQ, nebo zaplatit obchodní poplatky pomocí BTC.\n\nChybějící prostředky: {0} +popup.warning.noBsqFundsForBtcFeePayment=Peněženka BSQ nemá dostatečné prostředky na zaplacení obchodního poplatku v BSQ. +popup.warning.messageTooLong=Vaše zpráva překračuje max. povolená velikost. Zašlete jej prosím v několika částech nebo ji nahrajte do služby, jako je https://pastebin.com. +popup.warning.lockedUpFunds=Zamkli jste finanční prostředky z neúspěšného obchodu.\nUzamčený zůstatek: {0}\nVkladová tx adresa: {1}\nObchodní ID: {2}.\n\nOtevřete prosím úkol pro podporu výběrem obchodu na obrazovce otevřených obchodů a stisknutím \"alt + o\" nebo \"option + o\"." + +# suppress inspection "UnusedProperty" +popup.warning.nodeBanned=Jeden z {0} uzlů byl zabanován. +# suppress inspection "UnusedProperty" +popup.warning.priceRelay=cenové relé +popup.warning.seed=seed +popup.warning.mandatoryUpdate.trading=Aktualizujte prosím na nejnovější verzi Bisq. Byla vydána povinná aktualizace, která zakazuje obchodování se starými verzemi. Další informace naleznete na fóru Bisq. +popup.warning.mandatoryUpdate.dao=Aktualizujte prosím na nejnovější verzi Bisq. Byla vydána povinná aktualizace, která zakazuje Bisq DAO a BSQ pro staré verze. Další informace naleznete na fóru Bisq. +popup.warning.disable.dao=Bisq DAO a BSQ jsou dočasně deaktivovány. Další informace naleznete na fóru Bisq. +popup.warning.burnBTC=Tato transakce není možná, protože poplatky za těžbu {0} by přesáhly částku převodu {1}. Počkejte prosím, dokud nebudou poplatky za těžbu opět nízké nebo dokud nenahromadíte více BTC k převodu. + +popup.warning.openOffer.makerFeeTxRejected=Transakční poplatek tvůrce za nabídku s ID {0} byl bitcoinovou sítí odmítnut.\nID transakce = {1}.\nNabídka byla odstraněna, aby se předešlo dalším problémům.\nPřejděte do \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\nPro další pomoc prosím kontaktujte podpůrný kanál v Bisq Keybase týmu. + +popup.warning.trade.txRejected.tradeFee=obchodní poplatek +popup.warning.trade.txRejected.deposit=vklad +popup.warning.trade.txRejected={0} transakce pro obchod s ID {1} byla bitcoinovou sítí odmítnuta.\nID transakce = {2}}\nObchod byl přesunut do neúspěšných obchodů.\nPřejděte do \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\nPro další pomoc prosím kontaktujte podpůrný kanál v Bisq Keybase týmu. + +popup.warning.openOfferWithInvalidMakerFeeTx=Transakční poplatek tvůrce za nabídku s ID {0} je neplatný.\nID transakce = {1}.\nPřejděte do \"Nastavení/Informace o síti\" a proveďte synchronizaci SPV.\nPro další pomoc prosím kontaktujte podpůrný kanál v Bisq Keybase týmu. + +popup.info.securityDepositInfo=Aby oba obchodníci dodržovali obchodní protokol, musí oba obchodníci zaplatit kauci.\n\nTento vklad je uložen ve vaší obchodní peněžence, dokud nebude váš obchod úspěšně dokončen a poté vám bude vrácen.\n\nPoznámka: Pokud vytváříte novou nabídku, musí program Bisq běžet, aby ji převzal jiný obchodník. Chcete-li zachovat své nabídky online, udržujte Bisq spuštěný a ujistěte se, že tento počítač zůstává online (tj. Zkontrolujte, zda se nepřepne do pohotovostního režimu...pohotovostní režim monitoru je v pořádku). + +popup.info.cashDepositInfo=Ujistěte se, že ve své oblasti máte pobočku banky, abyste mohli provést hotovostní vklad.\nID banky prodávajícího (BIC/SWIFT) je: {0}. +popup.info.cashDepositInfo.confirm=Potvrzuji, že mohu provést vklad +popup.info.shutDownWithOpenOffers=Bisq se vypíná, ale existují otevřené nabídky.\n\nTyto nabídky nebudou dostupné v síti P2P, pokud bude Bisq vypnutý, ale budou znovu publikovány do sítě P2P při příštím spuštění Bisq.\n\nChcete-li zachovat své nabídky online, udržujte Bisq spuštěný a ujistěte se, že tento počítač zůstává online (tj. Ujistěte se, že nepřejde do pohotovostního režimu...pohotovostní režim monitoru není problém). +popup.info.qubesOSSetupInfo=Zdá se, že používáte Bisq na Qubes OS.\n\nUjistěte se, že je vaše Bisq qube nastaveno podle našeho průvodce nastavením na [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. + +popup.privateNotification.headline=Důležité soukromé oznámení! + +popup.securityRecommendation.headline=Důležité bezpečnostní doporučení +popup.securityRecommendation.msg=Chtěli bychom vám připomenout, abyste zvážili použití ochrany heslem pro vaši peněženku, pokud jste ji již neaktivovali.\n\nDůrazně se také doporučuje zapsat seed slova peněženky. Tato seed slova jsou jako hlavní heslo pro obnovení vaší bitcoinové peněženky.\nV sekci "Seed peněženky" naleznete další informace.\n\nDále byste měli zálohovat úplnou složku dat aplikace v sekci \"Záloha\". + +popup.bitcoinLocalhostNode.msg=Bisq detekoval lokálně spuštěný Bitcoin Core node (na localhostu).\nPřed spuštěním Bisq se ujistěte, že tento node je plně synchronizován a že není spuštěn v pruned mode režimu. +popup.bitcoinLocalhostNode.additionalRequirements=\n\nPožadavky pro dobře nakonfigurovaný uzel jsou, aby bylo zakázáno prořezávání (pruning) a aby byly povoleny bloom filtry. + +popup.shutDownInProgress.headline=Probíhá vypínání +popup.shutDownInProgress.msg=Vypnutí aplikace může trvat několik sekund.\nProsím, nepřerušujte tento proces. + +popup.attention.forTradeWithId=Je třeba věnovat pozornost obchodu s ID {0} + +popup.info.multiplePaymentAccounts.headline=K dispozici jsou účty a více platebními metodami +popup.info.multiplePaymentAccounts.msg=Pro tuto nabídku máte k dispozici více platebních účtů. Ujistěte se, že jste vybrali ten správný. + +popup.accountSigning.selectAccounts.headline=Vyberte platební účty +popup.accountSigning.selectAccounts.description=Na základě způsobu platby a časového limitu budou pro podpis vybrány všechny platební účty, které jsou spojeny se sporem, ve kterém došlo k výplatě kupujícímu. +popup.accountSigning.selectAccounts.signAll=Podepište všechny platební metody +popup.accountSigning.selectAccounts.datePicker=Vyberte čas, do kterého budou účty podepsány + +popup.accountSigning.confirmSelectedAccounts.headline=Potvrďte vybrané platební účty +popup.accountSigning.confirmSelectedAccounts.description=Na základě vašeho zadání bude vybráno {0} platebních účtů. +popup.accountSigning.confirmSelectedAccounts.button=Potvrďte platební účty +popup.accountSigning.signAccounts.headline=Potvrďte podpis platebních účtů +popup.accountSigning.signAccounts.description=Na základě vašeho výběru budou podepsány platební účty {0}. +popup.accountSigning.signAccounts.button=Podepsat platební účty +popup.accountSigning.signAccounts.ECKey=Zadejte soukromý klíč rozhodce +popup.accountSigning.signAccounts.ECKey.error=Špatný ECKey rozhodce + +popup.accountSigning.success.headline=Gratulujeme +popup.accountSigning.success.description=Všechny {0} platební účty byly úspěšně podepsány! +popup.accountSigning.generalInformation=Podpisový stav všech vašich účtů najdete v sekci účtu.\n\nDalší informace naleznete na adrese [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. +popup.accountSigning.signedByArbitrator=Jeden z vašich platebních účtů byl ověřen a podepsán rozhodcem. Obchodování s tímto účtem po úspěšném obchodování automaticky podepíše účet vašeho obchodního partnera.\n\n{0} +popup.accountSigning.signedByPeer=Jeden z vašich platebních účtů byl ověřen a podepsán obchodním partnerem. Váš počáteční obchodní limit bude zrušen a do {0} dnů budete moci podepsat další účty.\n\n{1} +popup.accountSigning.peerLimitLifted=Počáteční limit pro jeden z vašich účtů byl zrušen.\n\n{0} +popup.accountSigning.peerSigner=Jeden z vašich účtů je dostatečně zralý, aby podepsal další platební účty, a počáteční limit pro jeden z vašich účtů byl zrušen.\n\n{0} + +popup.accountSigning.singleAccountSelect.headline=Vyberte svědka stáří účtu +popup.accountSigning.singleAccountSelect.description=Vyhledejte svědka stáří účtu. +popup.accountSigning.singleAccountSelect.datePicker=Vyberte čas pro podpis +popup.accountSigning.confirmSingleAccount.headline=Potvrďte vybrané svědky o stáří účtu +popup.accountSigning.confirmSingleAccount.selectedHash=Hash vybraného svědka +popup.accountSigning.confirmSingleAccount.button=Podepsat svědka stáří účtu +popup.accountSigning.successSingleAccount.description=Svědek {0} byl podepsán +popup.accountSigning.successSingleAccount.success.headline=Úspěch +popup.accountSigning.successSingleAccount.signError=Nepodařilo se podepsat svědka, {0} + +popup.accountSigning.unsignedPubKeys.headline=Nepodepsané Pubkeys +popup.accountSigning.unsignedPubKeys.sign=Podepsat Pubkeys +popup.accountSigning.unsignedPubKeys.signed=Pubkeys byly podepsány +popup.accountSigning.unsignedPubKeys.result.signed=Podepsané pubkeys +popup.accountSigning.unsignedPubKeys.result.failed=Nepodařilo se podepsat + +#################################################################### +# Notifications +#################################################################### + +notification.trade.headline=Oznámení o obchodu s ID {0} +notification.ticket.headline=Úkol na podporu pro obchod s ID {0} +notification.trade.completed=Obchod je nyní dokončen a můžete si vybrat své prostředky. +notification.trade.accepted=Vaše nabídka byla přijata BTC {0}. +notification.trade.confirmed=Váš obchod má alespoň jedno potvrzení blockchainu.\nPlatbu můžete začít hned teď. +notification.trade.paymentStarted=Kupující BTC zahájil platbu. +notification.trade.selectTrade=Vyberte obchod +notification.trade.peerOpenedDispute=Váš obchodní partner otevřel {0}. +notification.trade.disputeClosed={0} byl uzavřen. +notification.walletUpdate.headline=Aktualizace obchodní peněženky +notification.walletUpdate.msg=Vaše obchodní peněženka má dostatečné finanční prostředky.\nČástka: {0} +notification.takeOffer.walletUpdate.msg=Vaše obchodní peněženka již byla dostatečně financována z předchozího pokusu o nabídku.\nČástka: {0} +notification.tradeCompleted.headline=Obchod dokončen +notification.tradeCompleted.msg=Prostředky můžete nyní vybrat do své externí bitcoinové peněženky nebo je převést do peněženky Bisq. + + +#################################################################### +# System Tray +#################################################################### + +systemTray.show=Otevřít okno aplikace +systemTray.hide=Skrýt okno aplikace +systemTray.info=Informace o Bisq +systemTray.exit=Odejít +systemTray.tooltip=Bisq: Decentralizovaná směnárna bitcoinů + + +#################################################################### +# GUI Util +#################################################################### + +guiUtil.miningFeeInfo=Ujistěte se, že poplatek za těžbu používaný vaší externí peněženkou je alespoň {0} satoshi/vbyte. Jinak nemusí být obchodní transakce potvrzeny včas a obchod skončí sporem. + +guiUtil.accountExport.savedToPath=Obchodní účty uložené na:\n{0} +guiUtil.accountExport.noAccountSetup=Nemáte nastaveny obchodní účty pro export. +guiUtil.accountExport.selectPath=Vyberte cestu k {0} +# suppress inspection "TrailingSpacesInProperty" +guiUtil.accountExport.tradingAccount=Obchodní účet s ID {0} +# suppress inspection "TrailingSpacesInProperty" +guiUtil.accountImport.noImport=Neobchodovali jsme obchodní účet s ID {0}, protože již existuje.\n +guiUtil.accountExport.exportFailed=Export do CSV selhal kvůli chybě.\nChyba = {0} +guiUtil.accountExport.selectExportPath=Vyberte složku pro export +guiUtil.accountImport.imported=Obchodní účet importovaný z:\n{0}\n\nImportované účty:\n{1} +guiUtil.accountImport.noAccountsFound=Nebyly nalezeny žádné exportované obchodní účty na: {0}.\nNázev souboru je {1}." +guiUtil.openWebBrowser.warning=Chystáte se otevřít webovou stránku ve webovém prohlížeči.\nChcete nyní otevřít webovou stránku?\n\nPokud nepoužíváte \"Tor Browser\" jako výchozí systémový webový prohlížeč, připojíte se k webové stránce v čisté síti.\n\nURL: \"{0}\" +guiUtil.openWebBrowser.doOpen=Otevřete webovou stránku a znovu se neptát +guiUtil.openWebBrowser.copyUrl=Zkopírovat URL a zrušit +guiUtil.ofTradeAmount=obchodní částky +guiUtil.requiredMinimum=(požadované minimum) + +#################################################################### +# Component specific +#################################################################### + +list.currency.select=Vyberte měnu +list.currency.showAll=Zobrazit vše +list.currency.editList=Upravit seznam měn + +table.placeholder.noItems=Momentálně nejsou k dispozici žádné {0} +table.placeholder.noData=V současné době nejsou k dispozici žádné údaje +table.placeholder.processingData=Zpracovávají se data... + + +peerInfoIcon.tooltip.tradePeer=Obchodního partnera +peerInfoIcon.tooltip.maker=Tvůrčí +peerInfoIcon.tooltip.trade.traded={0} onion adresa: {1}\nUž jste s tímto partnerem obchodovali {2} x\n{3} +peerInfoIcon.tooltip.trade.notTraded={0} onion adresa: {1}\nDosud jste s tímto partnerem neobchodovali.\n{2} +peerInfoIcon.tooltip.age=Platební účet byl vytvořen před {0}. +peerInfoIcon.tooltip.unknownAge=Stáří platebního účtu není znám. + +tooltip.openPopupForDetails=Otevřít vyskakovací okno pro podrobnosti +tooltip.invalidTradeState.warning=Tento obchod je v neplatném stavu. Chcete-li získat další informace, otevřete okno s podrobnostmi +tooltip.openBlockchainForAddress=Otevřít externí blockchain explorer pro adresu: {0} +tooltip.openBlockchainForTx=Otevřete externí blockchain explorer pro transakci: {0} + +confidence.unknown=Neznámý stav transakce +confidence.seen=Viděno {0} partnery / 0 potvrzení +confidence.confirmed=Potvrzeno v {0} blocích +confidence.invalid=Transakce je neplatná + +peerInfo.title=Info o peer uzlu +peerInfo.nrOfTrades=Počet dokončených obchodů +peerInfo.notTradedYet=Dosud jste s tímto uživatelem neobchodovali. +peerInfo.setTag=Nastavit štítek pro tento peer uzel +peerInfo.age.noRisk=Stáří platebního účtu +peerInfo.age.chargeBackRisk=Čas od podpisu +peerInfo.unknownAge=Stáří není známo + +addressTextField.openWallet=Otevřete výchozí bitcoinovou peněženku +addressTextField.copyToClipboard=Zkopírujte adresu do schránky +addressTextField.addressCopiedToClipboard=Adresa byla zkopírována do schránky +addressTextField.openWallet.failed=Otevření výchozí bitcoinové peněženky se nezdařilo. Možná nemáte žádnou nainstalovanou? + +peerInfoIcon.tooltip={0}\nŠtítek: {1} + +txIdTextField.copyIcon.tooltip=Zkopírujte ID transakce do schránky +txIdTextField.blockExplorerIcon.tooltip=Otevřete průzkumník blockchainu s tímto ID transakce +txIdTextField.missingTx.warning.tooltip=Chybí požadovaná transakce + + +#################################################################### +# Navigation +#################################################################### + +navigation.account=\"Účet\" +navigation.account.walletSeed=\"Účet/Seed peněženky\" +navigation.funds.availableForWithdrawal=\"Prostředky/Odeslat prostředky\" +navigation.portfolio.myOpenOffers=\"Portfolio/Moje otevřené nabídky\" +navigation.portfolio.pending=\"Portfolio/Otevřené obchody\" +navigation.portfolio.closedTrades=\"Portfolio/Historie\" +navigation.funds.depositFunds=\"Prostředky/Přijmout prostředky\" +navigation.settings.preferences=\"Nastavení/Preference\" +# suppress inspection "UnusedProperty" +navigation.funds.transactions=\"Prostředky/Transakce\" +navigation.support=\"Podpora\" +navigation.dao.wallet.receive=\"DAO/BSQ peněženka/Přímout\" + + +#################################################################### +# Formatter +#################################################################### + +formatter.formatVolumeLabel={0} částka{1} +formatter.makerTaker=Tvůrce jako {0} {1} / Příjemce jako {2} {3} +formatter.youAreAsMaker=Jste {0} {1} jako tvůrce / Příjemce je {2} {3} +formatter.youAreAsTaker=Jste {0} {1} jako příjemce / Tvůrce je {2} {3} +formatter.youAre=Jste {0} {1} ({2} {3}) +formatter.youAreCreatingAnOffer.fiat=Vytváříte nabídku pro {0} {1} +formatter.youAreCreatingAnOffer.altcoin=Vytváříte nabídku pro {0} {1} ({2} {3}) +formatter.asMaker={0} {1} jako tvůrce +formatter.asTaker={0} {1} jako příjemce + + +#################################################################### +# Domain specific +#################################################################### + +# we use enum values here +# dynamic values are not recognized by IntelliJ +# suppress inspection "UnusedProperty" +BTC_MAINNET=Bitcoin Mainnet +# suppress inspection "UnusedProperty" +BTC_TESTNET=Bitcoin Testnet +# suppress inspection "UnusedProperty" +BTC_REGTEST=Bitcoin Regtest +# suppress inspection "UnusedProperty" +BTC_DAO_TESTNET=Bitcoin DAO Testnet (zastaralé) +# suppress inspection "UnusedProperty" +BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet) +# suppress inspection "UnusedProperty" +BTC_DAO_REGTEST=Bitcoin DAO Regtest + +time.year=Rok +time.month=Měsíc +time.week=Týden +time.day=Den +time.hour=Hodina +time.minute10=10 minut +time.hours=hodiny +time.days=dny +time.1hour=1 hodina +time.1day=1 den +time.minute=minuta +time.second=sekunda +time.minutes=minuty +time.seconds=sekundy + + +password.enterPassword=Vložte heslo +password.confirmPassword=Potvrďte heslo +password.tooLong=Heslo musí mít méně než 500 znaků. +password.deriveKey=Odvozte klíč z hesla +password.walletDecrypted=Peněženka úspěšně dešifrována a ochrana heslem byla odstraněna. +password.wrongPw=Zadali jste nesprávné heslo.\n\nZkuste prosím zadat heslo znovu a pečlivě zkontrolujte překlepy nebo pravopisné chyby. +password.walletEncrypted=Peněženka úspěšně šifrována a ochrana heslem povolena. +password.walletEncryptionFailed=Heslo peněženky nelze nastavit. Možná jste importovali počáteční slova, která neodpovídají databázi peněženky. Kontaktujte vývojáře na Keybase ([HYPERLINK:https://keybase.io/team/bisq]). +password.passwordsDoNotMatch=Zadaná 2 hesla se neshodují. +password.forgotPassword=Zapomněli jste heslo? +password.backupReminder=Pamatujte, že při nastavování hesla do peněženky budou odstraněny všechny automaticky vytvořené zálohy z nezašifrované peněženky.\n\nPřed nastavením hesla se důrazně doporučuje provést zálohu adresáře aplikace a zapsat si počáteční slova! +password.backupWasDone=Už jsem provedl zálohu + +seed.seedWords=Seed slova peněženky +seed.enterSeedWords=Vložte seed slova peněženky +seed.date=Datum peněženky +seed.restore.title=Obnovit peněženky z seed slov +seed.restore=Obnovit peněženky +seed.creationDate=Datum vzniku +seed.warn.walletNotEmpty.msg=Vaše bitcoinová peněženka není prázdná.\n\nTuto peněženku musíte vyprázdnit, než se pokusíte obnovit starší, protože smíchání peněženek může vést ke zneplatnění záloh.\n\nDokončete své obchody, uzavřete všechny otevřené nabídky a přejděte do sekce Prostředky, kde si můžete vybrat své bitcoiny.\nV případě, že nemáte přístup ke svým bitcoinům, můžete použít nouzový nástroj k vyprázdnění peněženky.\nNouzový nástroj otevřete stisknutím kombinace kláves \"Alt+e\" or \"Cmd/Ctrl+e\". +seed.warn.walletNotEmpty.restore=Chci přesto obnovit +seed.warn.walletNotEmpty.emptyWallet=Nejprve vyprázdním své peněženky +seed.warn.notEncryptedAnymore=Vaše peněženky jsou šifrovány.\n\nPo obnovení již nebudou peněženky šifrovány a musíte nastavit nové heslo.\n\nChcete pokračovat? +seed.warn.walletDateEmpty=Protože jste nezadali datum peněženky, bude muset bisq skenovat blockchain od roku 2013.10.09 (datum spuštění BIP39).\n\nPeněženky BIP39 byly poprvé představeny v bisq dne 2017.06.28 (verze v0.5). Tímto datem můžete ušetřit čas.\n\nV ideálním případě byste měli určit datum, kdy byl vytvořen váš seed peněženky.\n\n\nOpravdu chcete pokračovat bez zadání data peněženky? +seed.restore.success=Peněženky byly úspěšně obnoveny pomocí nových seed slov.\n\nMusíte vypnout a restartovat aplikaci. +seed.restore.error=Při obnově peněženek pomocí seed slov došlo k chybě. {0} +seed.restore.openOffers.warn=Máte otevřené nabídky, které budou odstraněny, pokud obnovíte ze seedu.\nJste si jisti, že chcete pokračovat? + + +#################################################################### +# Payment methods +#################################################################### + +payment.account=Účet +payment.account.no=Číslo účtu +payment.account.name=Název účtu +payment.account.userName=Uživatelské jméno +payment.account.phoneNr=Telefonní číslo +payment.account.owner=Celé jméno vlastníka účtu +payment.account.fullName=Celé jméno (křestní, střední, příjmení) +payment.account.state=Stát/Provincie/Region +payment.account.city=Město +payment.bank.country=Země původu banky +payment.account.name.email=Celé jméno / e-mail majitele účtu +payment.account.name.emailAndHolderId=Celé jméno / e-mail / majitele účtu {0} +payment.bank.name=Jméno banky +payment.select.account=Vyberte typ účtu +payment.select.region=Vyberte region +payment.select.country=Vyberte zemi +payment.select.bank.country=Vyberte zemi původu banky +payment.foreign.currency=Opravdu chcete vybrat jinou měnu, než je výchozí měna země? +payment.restore.default=Ne, obnovit výchozí měnu +payment.email=E-mail +payment.country=Země +payment.extras=Zvláštní požadavky +payment.email.mobile=E-mail nebo mobilní číslo +payment.altcoin.address=Altcoin adresa +payment.altcoin.tradeInstantCheckbox=Obchodujte ihned s tímto altcoinem (do 1 hodiny) +payment.altcoin.tradeInstant.popup=Pro okamžité obchodování je nutné, aby oba obchodní partneři byli online, aby mohli obchod dokončit za méně než 1 hodinu.\n\nPokud máte otevřené nabídky a nejste k dispozici, deaktivujte je na obrazovce „Portfolio“. +payment.altcoin=Altcoin +payment.select.altcoin=Vyberte nebo vyhledejte altcoin +payment.secret=Tajná otázka +payment.answer=Odpověď +payment.wallet=ID peněženky +payment.uphold.accountId=Uživatelské jméno, e-mail nebo číslo telefonu +payment.moneyBeam.accountId=E-mail nebo číslo telefonu +payment.venmo.venmoUserName=Uživatelské jméno Venmo +payment.popmoney.accountId=E-mail nebo číslo telefonu +payment.promptPay.promptPayId=Občanské/daňové identifikační číslo nebo telefonní číslo +payment.supportedCurrencies=Podporované měny +payment.limitations=Omezení +payment.salt=Salt pro ověření stáří účtu +payment.error.noHexSalt=Salt musí být ve formátu HEX.\nDoporučujeme upravit pole salt, pokud chcete salt převést ze starého účtu, aby bylo stáří vašeho účtu zachováno. Stáří účtu se ověřuje pomocí salt účtu a identifikačních údajů účtu (např. IBAN). +payment.accept.euro=Přijímejte obchody z těchto zemí eurozóny +payment.accept.nonEuro=Přijímejte obchody z těchto zemí mimo eurozónu +payment.accepted.countries=Akceptované země +payment.accepted.banks=Akceptované banky (ID) +payment.mobile=Číslo mobilu +payment.postal.address=Poštovní adresa +payment.national.account.id.AR=Číslo CBU +shared.accountSigningState=Stav podpisu účtu + +#new +payment.altcoin.address.dyn={0} adresa +payment.altcoin.receiver.address=Altcoinová adresa příjemce +payment.accountNr=Číslo účtu +payment.emailOrMobile=E-mail nebo mobilní číslo +payment.useCustomAccountName=Použijte vlastní název účtu +payment.maxPeriod=Max. povolené obchodní období +payment.maxPeriodAndLimit=Max. doba trvání obchodu: {0} / Max. nákup: {1} / Max. prodej: {2} / Stáří účtu: {3} +payment.maxPeriodAndLimitCrypto=Max. doba trvání obchodu: {0} / Max. obchodní limit: {1} +payment.currencyWithSymbol=Měna: {0} +payment.nameOfAcceptedBank=Název akceptované banky +payment.addAcceptedBank=Přidat akceptovanou banku +payment.clearAcceptedBanks=Vymazat akceptované banky +payment.bank.nameOptional=Název banky (volitelné) +payment.bankCode=Kód banky +payment.bankId=ID Banky (BIC/SWIFT) +payment.bankIdOptional=ID Banky (BIC/SWIFT) (volitelné) +payment.branchNr=Číslo pobočky +payment.branchNrOptional=Číslo pobočky (volitelné) +payment.accountNrLabel=Číslo účtu. (IBAN) +payment.accountType=Typ účtu +payment.checking=Kontrola +payment.savings=Úspory +payment.personalId=Číslo občanského průkazu +payment.clearXchange.info=Zelle je služba převodu peněz, která funguje nejlépe *prostřednictvím* jiné banky.\n\n1. Na této stránce zjistěte, zda (a jak) vaše banka spolupracuje se Zelle:\n[HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Zaznamenejte si zvláštní limity převodů - limity odesílání se liší podle banky a banky často určují samostatné denní, týdenní a měsíční limity.\n\n3. Pokud vaše banka s Zelle nepracuje, můžete ji stále používat prostřednictvím mobilní aplikace Zelle, ale vaše limity převodu budou mnohem nižší.\n\n4. Název uvedený na vašem účtu Bisq MUSÍ odpovídat názvu vašeho účtu Zelle/bankovního účtu.\n\nPokud nemůžete dokončit transakci Zelle, jak je uvedeno ve vaší obchodní smlouvě, můžete ztratit část (nebo všechn) ze svého bezpečnostního vkladu.\n\nVzhledem k poněkud vyššímu riziku zpětného zúčtování společnosti Zelle se prodejcům doporučuje kontaktovat nepodepsané kupující prostřednictvím e-mailu nebo SMS, aby ověřili, že kupující skutečně vlastní účet Zelle uvedený v Bisq. +payment.fasterPayments.newRequirements.info=Některé banky začaly ověřovat celé jméno příjemce pro převody Faster Payments. Váš současný účet Faster Payments nepožadoval celé jméno.\n\nZvažte prosím znovu vytvoření svého Faster Payments účtu v Bisqu, abyste mohli budoucím kupujícím {0} poskytnout celé jméno.\n\nPři opětovném vytvoření účtu nezapomeňte zkopírovat přesný kód řazení, číslo účtu a hodnoty soli (salt) pro ověření věku ze starého účtu do nového účtu. Tím zajistíte zachování stáří a stavu vašeho stávajícího účtu. +payment.moneyGram.info=Při používání MoneyGram musí BTC kupující zaslat autorizační číslo a fotografii potvrzení e-mailem prodejci BTC. Potvrzení musí jasně uvádět celé jméno prodejce, zemi, stát a částku. E-mail prodávajícího se kupujícímu zobrazí během procesu obchodování. +payment.westernUnion.info=Při používání služby Western Union musí kupující BTC zaslat prodejci BTC e-mailem MTCN (sledovací číslo) a fotografii potvrzení. Potvrzení musí jasně uvádět celé jméno prodejce, město, zemi a částku. E-mail prodávajícího se kupujícímu zobrazí během procesu obchodování. +payment.halCash.info=Při používání HalCash musí kupující BTC poslat prodejci BTC kód HalCash prostřednictvím textové zprávy z mobilního telefonu.\n\nUjistěte se, že nepřekračujete maximální částku, kterou vám banka umožňuje odesílat pomocí HalCash. Min. částka za výběr je 10 EUR a max. částka je 600 EUR. Pro opakované výběry je to 3000 EUR za příjemce za den a 6000 EUR za příjemce za měsíc. Zkontrolujte prosím tyto limity u své banky, abyste se ujistili, že používají stejné limity, jaké jsou zde uvedeny.\n\nČástka pro výběr musí být násobkem 10 EUR, protože z bankomatu nemůžete vybrat jiné částky. Uživatelské rozhraní na obrazovce vytvořit-nabídku and přijmout-nabídku upraví částku BTC tak, aby částka EUR byla správná. Nemůžete použít tržní cenu, protože částka v EURECH se mění s měnícími se cenami.\n\nV případě sporu musí kupující BTC poskytnout důkaz, že zaslal EURA. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Uvědomte si, že u všech bankovních převodů existuje určité riziko zpětného zúčtování. Aby se toto riziko zmírnilo, stanoví Bisq limity pro jednotlivé obchody na základě odhadované úrovně rizika zpětného zúčtování pro použitou platební metodu.\n\nU této platební metody je váš limit pro jednotlivé obchody pro nákup a prodej {2}.\n\nToto omezení se vztahuje pouze na velikost jednoho obchodu - můžete zadat tolik obchodů, kolik chcete.\n\nDalší podrobnosti najdete na wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=Aby se omezilo riziko zpětného zúčtování, Bisq stanoví limity pro jednotlivé obchody pro tento typ platebního účtu na základě následujících 2 faktorů:\n\n1. Obecné riziko zpětného zúčtování pro platební metodu\n2. Stav podepisování účtu\n\nTento platební účet ještě není podepsán, takže je omezen na nákup {0} za obchod. Po podpisu se limity nákupu zvýší následovně:\n\n● Před podpisem a 30 dní po podpisu bude váš limit nákupu podle obchodu {0}\n● 30 dní po podpisu bude váš limit nákupu podle obchodu {1}\n● 60 dní po podpisu bude váš limit nákupu podle obchodu {2}\n\nPodpisy účtu neovlivňují prodejní limity. Můžete okamžitě prodat {2} v jednom obchodu.\n\nTato omezení platí pouze pro velikost jednoho obchodu - můžete zadat tolik obchodů, kolik chcete.\n\nDalší podrobnosti najdete na wiki [HYPERLINK:https://bisq.wiki/Account_limits]. + +payment.cashDeposit.info=Potvrďte, že vám vaše banka umožňuje odesílat hotovostní vklady na účty jiných lidí. Například Bank of America a Wells Fargo již takové vklady nepovolují. + +payment.revolut.info=Revolut vyžaduje „uživatelské jméno“ jako ID účtu, nikoli telefonní číslo nebo e-mail, jako tomu bylo v minulosti. +payment.account.revolut.addUserNameInfo={0}\nVáš stávající účet Revolut ({1}) nemá "Uživatelské jméno".\nChcete-li aktualizovat údaje o svém účtu, zadejte své "Uživatelské jméno" Revolut.\nTo neovlivní stav podepisování věku vašeho účtu. +payment.revolut.addUserNameInfo.headLine=Aktualizujte účet Revolut + +payment.usPostalMoneyOrder.info=Obchodování pomocí amerických poštovních poukázek (USPMO) na Bisq vyžaduje, abyste rozuměli následujícímu:\n\n- Kupující BTC musí před odesláním napsat jméno prodejce BTC do polí plátce i příjemce a pořídit fotografii USPMO a obálku s dokladem o sledování ve vysokém rozlišení.\n- Kupující BTC musí odeslat USPMO prodejci BTC s potvrzením dodávky.\n\nV případě, že je nutná mediace, nebo pokud dojde k obchodnímu sporu, budete povinni poslat fotografie mediátorovi Bisq nebo zástupci pro vrácení peněz spolu s pořadovým číslem USPMO, číslem pošty a částkou dolaru, aby mohli ověřit podrobnosti na webu US Post Office.\n\nNeposkytnutí požadovaných informací mediátorovi nebo arbitrovi bude mít za následek ztrátu případu sporu.\n\nVe všech sporných případech nese odesílatel USPMO 100% břemeno odpovědnosti za poskytnutí důkazů mediátorovi nebo arbitrovi.\n\nPokud těmto požadavkům nerozumíte, neobchodujte pomocí USPMO na Bisq. + +payment.f2f.contact=Kontaktní informace +payment.f2f.contact.prompt=Jak byste chtěli být kontaktováni obchodním partnerem? (e-mailová adresa, telefonní číslo, ...) +payment.f2f.city=Město pro setkání „tváří v tvář“ +payment.f2f.city.prompt=Město se zobrazí s nabídkou +payment.f2f.optionalExtra=Volitelné další informace +payment.f2f.extra=Dodatečné informace + +payment.f2f.extra.prompt=Tvůrce může definovat „smluvní podmínky“ nebo přidat veřejné kontaktní informace. Zobrazí se s nabídkou. +payment.f2f.info=Obchody „tváří v tvář“ mají různá pravidla a přicházejí s jinými riziky než online transakce.\n\nHlavní rozdíly jsou:\n● Obchodní partneři si musí vyměňovat informace o místě a čase schůzky pomocí poskytnutých kontaktních údajů.\n● Obchodní partneři musí přinést své notebooky a na místě setkání potvrdit „platba odeslána“ a „platba přijata“.\n● Pokud má tvůrce speciální „podmínky“, musí uvést podmínky v textovém poli „Další informace“ na účtu.\n● Přijetím nabídky zadavatel souhlasí s uvedenými „podmínkami a podmínkami“ tvůrce.\n● V případě sporu nemůže být mediátor nebo rozhodce příliš nápomocný, protože je obvykle obtížné získat důkazy o tom, co se na schůzce stalo. V takových případech mohou být prostředky BTC uzamčeny na dobu neurčitou nebo dokud se obchodní partneři nedohodnou.\n\nAbyste si byli jisti, že plně rozumíte rozdílům v obchodech „tváří v tvář“, přečtěte si pokyny a doporučení na adrese: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] +payment.f2f.info.openURL=Otevřít webovou stránku +payment.f2f.offerbook.tooltip.countryAndCity=Země a město: {0} / {1} +payment.f2f.offerbook.tooltip.extra=Další informace: {0} + +payment.japan.bank=Banka +payment.japan.branch=Pobočka +payment.japan.account=Účet +payment.japan.recipient=Jméno +payment.australia.payid=PayID +payment.payid=PayID spojené s finanční institucí. Jako e-mailová adresa nebo mobilní telefon. +payment.payid.info=PayID jako telefonní číslo, e-mailová adresa nebo australské obchodní číslo (ABN), které můžete bezpečně propojit se svou bankou, družstevní záložnou nebo účtem stavební spořitelny. Musíte mít již vytvořený PayID u své australské finanční instituce. Odesílající i přijímající finanční instituce musí podporovat PayID. Další informace najdete na [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=Chcete-li platit kartou Amazon eGift, musíte si na svém účtu Amazon zakoupit kartu Amazon eGift a použít e-mail nebo mobilní číslo prodejce BTC. jako příjemce. Amazon poté odešle příjemci e-mail nebo textovou zprávu. Pro pole zprávy použijte ID obchodu.\n\nKarty Amazon eGift lze uplatnit pouze na účtech Amazon se stejnou měnou.\n\nDalší informace najdete na webové stránce Amazon eGift Card. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] + +# We use constants from the code so we do not use our normal naming convention +# dynamic values are not recognized by IntelliJ + +# Only translate general terms +NATIONAL_BANK=Národní bankovní převod +SAME_BANK=Převod ve stejné bance +SPECIFIC_BANKS=Převody u konkrétních bank +US_POSTAL_MONEY_ORDER=Poukázka US Postal +CASH_DEPOSIT=Cash Deposit +MONEY_GRAM=MoneyGram +WESTERN_UNION=Western Union +F2F=Tváří v tvář (osobně) +JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australské PayID + +# suppress inspection "UnusedProperty" +NATIONAL_BANK_SHORT=Národní banky +# suppress inspection "UnusedProperty" +SAME_BANK_SHORT=Stejná banka +# suppress inspection "UnusedProperty" +SPECIFIC_BANKS_SHORT=Konkrétní banky +# suppress inspection "UnusedProperty" +US_POSTAL_MONEY_ORDER_SHORT=US Money Order +# suppress inspection "UnusedProperty" +CASH_DEPOSIT_SHORT=Cash Deposit +# suppress inspection "UnusedProperty" +MONEY_GRAM_SHORT=MoneyGram +# suppress inspection "UnusedProperty" +WESTERN_UNION_SHORT=Western Union +# suppress inspection "UnusedProperty" +F2F_SHORT=F2F +# suppress inspection "UnusedProperty" +JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID + +# Do not translate brand names +# suppress inspection "UnusedProperty" +UPHOLD=Uphold +# suppress inspection "UnusedProperty" +MONEY_BEAM=MoneyBeam (N26) +# suppress inspection "UnusedProperty" +POPMONEY=Popmoney +# suppress inspection "UnusedProperty" +REVOLUT=Revolut +# suppress inspection "UnusedProperty" +PERFECT_MONEY=Perfect Money +# suppress inspection "UnusedProperty" +ALI_PAY=AliPay +# suppress inspection "UnusedProperty" +WECHAT_PAY=WeChat Pay +# suppress inspection "UnusedProperty" +SEPA=SEPA +# suppress inspection "UnusedProperty" +SEPA_INSTANT=SEPA Okamžité platby +# suppress inspection "UnusedProperty" +FASTER_PAYMENTS=Faster Payments +# suppress inspection "UnusedProperty" +SWISH=Swish +# suppress inspection "UnusedProperty" +CLEAR_X_CHANGE=Zelle (ClearXchange) +# suppress inspection "UnusedProperty" +CHASE_QUICK_PAY=Chase QuickPay +# suppress inspection "UnusedProperty" +INTERAC_E_TRANSFER=Interac e-Transfer +# suppress inspection "UnusedProperty" +HAL_CASH=HalCash +# suppress inspection "UnusedProperty" +BLOCK_CHAINS=Altcoiny +# suppress inspection "UnusedProperty" +PROMPT_PAY=PromptPay +# suppress inspection "UnusedProperty" +ADVANCED_CASH=Advanced Cash +# suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" +BLOCK_CHAINS_INSTANT=Instantní Altcoiny + +# Deprecated: Cannot be deleted as it would break old trade history entries +# suppress inspection "UnusedProperty" +OK_PAY=OKPay +# suppress inspection "UnusedProperty" +CASH_APP=Cash App +# suppress inspection "UnusedProperty" +VENMO=Venmo + + +# suppress inspection "UnusedProperty" +UPHOLD_SHORT=Uphold +# suppress inspection "UnusedProperty" +MONEY_BEAM_SHORT=MoneyBeam (N26) +# suppress inspection "UnusedProperty" +POPMONEY_SHORT=Popmoney +# suppress inspection "UnusedProperty" +REVOLUT_SHORT=Revolut +# suppress inspection "UnusedProperty" +PERFECT_MONEY_SHORT=Perfect Money +# suppress inspection "UnusedProperty" +ALI_PAY_SHORT=AliPay +# suppress inspection "UnusedProperty" +WECHAT_PAY_SHORT=WeChat Pay +# suppress inspection "UnusedProperty" +SEPA_SHORT=SEPA +# suppress inspection "UnusedProperty" +SEPA_INSTANT_SHORT=SEPA okamžité +# suppress inspection "UnusedProperty" +FASTER_PAYMENTS_SHORT=Faster Payments +# suppress inspection "UnusedProperty" +SWISH_SHORT=Swish +# suppress inspection "UnusedProperty" +CLEAR_X_CHANGE_SHORT=Zelle +# suppress inspection "UnusedProperty" +CHASE_QUICK_PAY_SHORT=Chase QuickPay +# suppress inspection "UnusedProperty" +INTERAC_E_TRANSFER_SHORT=Interac e-Transfer +# suppress inspection "UnusedProperty" +HAL_CASH_SHORT=HalCash +# suppress inspection "UnusedProperty" +BLOCK_CHAINS_SHORT=Altcoiny +# suppress inspection "UnusedProperty" +PROMPT_PAY_SHORT=PromptPay +# suppress inspection "UnusedProperty" +ADVANCED_CASH_SHORT=Advanced Cash +# suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" +BLOCK_CHAINS_INSTANT_SHORT=Instantní Altcoiny + +# Deprecated: Cannot be deleted as it would break old trade history entries +# suppress inspection "UnusedProperty" +OK_PAY_SHORT=OKPay +# suppress inspection "UnusedProperty" +CASH_APP_SHORT=Cash App +# suppress inspection "UnusedProperty" +VENMO_SHORT=Venmo + + +#################################################################### +# Validation +#################################################################### + +validation.empty=Prázdný vstup není povolen. +validation.NaN=Vstup není platné číslo. +validation.notAnInteger=Vstup není celočíselná hodnota. +validation.zero=Vstup 0 není povolen. +validation.negative=Záporná hodnota není povolena. +validation.fiat.toSmall=Vstup menší než minimální možné množství není povolen. +validation.fiat.toLarge=Vstup větší než maximální možné množství není povolen. +validation.btc.fraction=Zadání povede k hodnotě bitcoinu menší než 1 satoshi +validation.btc.toLarge=Vstup větší než {0} není povolen. +validation.btc.toSmall=Vstup menší než {0} není povolen. +validation.passwordTooShort=Zadané heslo je příliš krátké. Musí mít min. 8 znaků. +validation.passwordTooLong=Zadané heslo je příliš dlouhé. Nemůže být delší než 50 znaků. +validation.sortCodeNumber={0} se musí skládat z {1} čísel. +validation.sortCodeChars={0} musí obsahovat {1} znaků. +validation.bankIdNumber={0} se musí skládat z {1} čísel. +validation.accountNr=Číslo účtu se musí skládat z {0} čísel. +validation.accountNrChars=Číslo účtu musí obsahovat {0} znaků. +validation.btc.invalidAddress=Adresa není správná. Zkontrolujte formát adresy. +validation.integerOnly=Zadejte pouze celá čísla. +validation.inputError=Váš vstup způsobil chybu:\n{0} +validation.bsq.insufficientBalance=Váš dostupný zůstatek je {0}. +validation.btc.exceedsMaxTradeLimit=Váš obchodní limit je {0}. +validation.bsq.amountBelowMinAmount=Min. částka je {0} +validation.nationalAccountId={0} se musí skládat z {1} čísel. + +#new +validation.invalidInput=Neplatný vstup: {0} +validation.accountNrFormat=Číslo účtu musí být ve formátu: {0} +# suppress inspection "UnusedProperty" +validation.altcoin.wrongStructure=Ověření adresy se nezdařilo, protože neodpovídá struktuře adresy {0}. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=Adresa LTZ musí začínat na "L". Adresy začínající na "z" nejsou podporovány. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=Adresy ZEC musí začínat na "t". Adresy začínající na "z" nejsou podporovány. +# suppress inspection "UnusedProperty" +validation.altcoin.invalidAddress=Adresa není platná {0} adresa! {1} +# suppress inspection "UnusedProperty" +validation.altcoin.liquidBitcoin.invalidAddress=Nativní adresy segwit (ty začínající na 'lq') nejsou podporovány. +validation.bic.invalidLength=Délka vstupu musí být 8 nebo 11 +validation.bic.letters=Banka a kód země musí být písmena +validation.bic.invalidLocationCode=BIC obsahuje neplatný location kód +validation.bic.invalidBranchCode=BIC obsahuje neplatný kód pobočky +validation.bic.sepaRevolutBic=Účty Revolut Sepa nejsou podporovány. +validation.btc.invalidFormat=Neplatný formát bitcoinové adresy. +validation.bsq.invalidFormat=Neplatný formát BSQ adresy. +validation.email.invalidAddress=Neplatná adresa +validation.iban.invalidCountryCode=Kód země je neplatný +validation.iban.checkSumNotNumeric=Kontrolní součet musí být číselný +validation.iban.nonNumericChars=Byl zjištěn nealfanumerický znak +validation.iban.checkSumInvalid=Kontrolní součet IBAN je neplatný +validation.iban.invalidLength=Číslo musí mít délku 15 až 34 znaků. +validation.interacETransfer.invalidAreaCode=Non-kanadské směrové číslo oblasti +validation.interacETransfer.invalidPhone=Zadejte platné 11místné telefonní číslo (např. 1-123-456-7890) nebo e-mailovou adresu +validation.interacETransfer.invalidQuestion=Musí obsahovat pouze písmena, čísla, mezery a/nebo symboly ' _ , . ? - +validation.interacETransfer.invalidAnswer=Musí to být jedno slovo a obsahovat pouze písmena, čísla a/nebo symbol - +validation.inputTooLarge=Vstup nesmí být větší než {0} +validation.inputTooSmall=Vstup musí být větší než {0} +validation.inputToBeAtLeast=Vstup musí být alespoň {0} +validation.amountBelowDust=Množství pod mezní hodnotou prachových mincí {0} satoshi není povoleno. +validation.length=Délka musí být mezi {0} a {1} +validation.pattern=Vstup musí být ve formátu: {0} +validation.noHexString=Vstup není ve formátu HEX. +validation.advancedCash.invalidFormat=Musí to být platný e-mail nebo ID peněženky ve formátu: X000000000000 +validation.invalidUrl=Toto není platná adresa URL +validation.mustBeDifferent=Váš vstup se musí lišit od aktuální hodnoty +validation.cannotBeChanged=Parametr nelze změnit +validation.numberFormatException=Výjimka formátu čísla {0} +validation.mustNotBeNegative=Vstup nesmí být záporný +validation.phone.missingCountryCode=K ověření telefonního čísla je potřeba dvoumístný kód země +validation.phone.invalidCharacters=Telefonní číslo {0} obsahuje neplatné znaky +validation.phone.insufficientDigits=V čísle {0} není dostatek číslic, aby mohlo být platné telefonní číslo +validation.phone.tooManyDigits=V čísle {0} je příliš mnoho číslic, než aby mohlo být platné telefonní číslo +validation.phone.invalidDialingCode=Telefonní předvolba země pro číslo {0} je pro zemi {1} neplatná. Správné předčíslí je {2}. +validation.invalidAddressList=Seznam platných adres musí být oddělený čárkami diff --git a/core/src/main/resources/i18n/displayStrings_de.properties b/core/src/main/resources/i18n/displayStrings_de.properties index b1e9c69923..1dc96b9a6f 100644 --- a/core/src/main/resources/i18n/displayStrings_de.properties +++ b/core/src/main/resources/i18n/displayStrings_de.properties @@ -35,7 +35,7 @@ shared.no=Nein shared.iUnderstand=Ich verstehe shared.na=N/A shared.shutDown=Herunterfahren -shared.reportBug=Report bug on GitHub +shared.reportBug=Fehler auf GitHub melden shared.buyBitcoin=Bitcoin kaufen shared.sellBitcoin=Bitcoin verkaufen shared.buyCurrency={0} kaufen @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=Angebot shared.multipleOffers=Angebote shared.Offer=Angebot +shared.offerVolumeCode={0} Angebot Volumen shared.openOffers=offene Angebote shared.trade=Handel shared.trades=Trades @@ -63,7 +64,7 @@ shared.priceInCurForCur=Preis in {0} für 1 {1} shared.fixedPriceInCurForCur=Festpreis in {0} für 1 {1} shared.amount=Betrag shared.txFee=Transaktionsgebühr -shared.tradeFee=Trade-Gebühr +shared.tradeFee=Handelsgebühr shared.buyerSecurityDeposit=Käufer-Kaution shared.sellerSecurityDeposit=Verkäufer-Kaution shared.amountWithCur=Betrag in {0} @@ -94,21 +95,21 @@ shared.BTCMinMax=BTC (min - max) shared.removeOffer=Angebot entfernen shared.dontRemoveOffer=Angebot nicht entfernen shared.editOffer=Angebot bearbeiten -shared.openLargeQRWindow=Open large QR code window +shared.openLargeQRWindow=QR Code größer anzeigen shared.tradingAccount=Handelskonto -shared.faq=Visit FAQ page +shared.faq=Zur FAQ Seite shared.yesCancel=Ja, abbrechen shared.nextStep=Nächster Schritt shared.selectTradingAccount=Handelskonto auswählen shared.fundFromSavingsWalletButton=Gelder aus Bisq-Wallet überweisen shared.fundFromExternalWalletButton=Ihre externe Wallet zum Finanzieren öffnen -shared.openDefaultWalletFailed=Failed to open a Bitcoin wallet application. Are you sure you have one installed? +shared.openDefaultWalletFailed=Öffnen einer Bitcoin Wallet Applikation fehlgeschlagen. Bist du sicher, dass du eine installiert hast? shared.distanceInPercent=Abstand vom Marktpreis in % shared.belowInPercent=% unter dem Marktpreis shared.aboveInPercent=% über dem Marktpreis shared.enterPercentageValue=%-Wert eingeben shared.OR=ODER -shared.notEnoughFunds=You don''t have enough funds in your Bisq wallet for this transaction—{0} is needed but only {1} is available.\n\nPlease add funds from an external wallet, or fund your Bisq wallet at Funds > Receive Funds. +shared.notEnoughFunds=Für diese Transaktion haben Sie nicht genug Gelder in Ihrem Bisq Wallet—{0} wird benötigt aber nur {1} sind verfügbar.\n\nBitte fügen Sie Gelder von einer externen Wallet hinzu, oder senden Sie Gelder an Ihr Bisq Wallet unter Gelder > Gelder erhalten. shared.waitingForFunds=Warte auf Gelder... shared.depositTransactionId=Kautionstransaktions-ID shared.TheBTCBuyer=Der BTC-Käufer @@ -116,22 +117,23 @@ shared.You=Sie shared.reasonForPayment=Verwendungszweck shared.sendingConfirmation=Sende Bestätigung... shared.sendingConfirmationAgain=Bitte senden Sie die Bestätigung erneut -shared.exportCSV=Export to CSV +shared.exportCSV=Als CSV exportieren shared.exportJSON=Exportiere als JSON shared.noDateAvailable=Kein Datum verfügbar shared.noDetailsAvailable=Keine Details vorhanden shared.notUsedYet=Noch ungenutzt shared.date=Datum -shared.sendFundsDetailsWithFee=Gesendet: {0}\nVon Adresse: {1}\nAn Empfangsadresse: {2}.\nBenötigte Mining-Gebühr ist: {3} ({4} Satoshis/Byte)\nTransaktionsgröße: {5} Kb\n\nDer Empfänger erhält: {6}\n\nSind Sie sicher, dass Sie diesen Betrag abheben wollen? -shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n +shared.sendFundsDetailsWithFee=Gesendet: {0}\nVon Adresse: {1}\nAn Empfangsadresse: {2}.\nBenötigte Mining-Gebühr ist: {3} ({4} satoshis/vbyte)\nTransaktionsgröße (vsize): {5} vKb\n\nDer Empfänger erhält: {6}\n\nSind Sie sicher, dass Sie diesen Betrag abheben wollen? +# suppress inspection "TrailingSpacesInProperty" +shared.sendFundsDetailsDust=Diese Transaktion wäre eine Wechselgeld-Ausgabe die unter dem min. Dust-Schwellenwert (und daher von den Bitcoin Konsens-Regeln untersagt wird). Stattdessen wird Dust ({0} satoshi{1}) zur Mining-Gebühr hinzugefügt.\n\n\n shared.copyToClipboard=In Zwischenablage kopieren shared.language=Sprache shared.country=Land shared.applyAndShutDown=Anwenden und herunterfahren shared.selectPaymentMethod=Zahlungsmethode wählen -shared.accountNameAlreadyUsed=That account name is already used for another saved account.\nPlease choose another name. +shared.accountNameAlreadyUsed=Der Name des Kontos wird bereits für ein existierendes Konto verwendet.\nBitte wählen Sie einen anderen Namen. shared.askConfirmDeleteAccount=Möchten Sie das ausgewählte Konto wirklich löschen? -shared.cannotDeleteAccount=You cannot delete that account because it is being used in an open offer (or in an open trade). +shared.cannotDeleteAccount=Sie können dieses Konto nicht löschen, da für dieses Konto ein Trade-Angebot offen ist (oder aktuell ein Trade stattfindet). shared.noAccountsSetupYet=Es wurden noch keine Konten eingerichtet shared.manageAccounts=Konten verwalten shared.addNewAccount=Neues Konto hinzufügen @@ -188,7 +190,6 @@ shared.tradeWalletAddress=Adresse der Handels-Wallet shared.tradeWalletBalance=Guthaben der Handels-Wallet shared.makerTxFee=Ersteller: {0} shared.takerTxFee=Abnehmer: {0} -shared.securityDepositBox.description=Kaution für BTC {0} shared.iConfirm=Ich bestätige shared.tradingFeeInBsqInfo=gleichwertig mit {0} als Trading-Gebühr shared.openURL=Öffne {0} @@ -214,8 +215,8 @@ shared.mediator=Mediator shared.arbitrator=Vermittler shared.refundAgent=Vermittler shared.refundAgentForSupportStaff=Rückerstattungsbeauftragten -shared.delayedPayoutTxId=Delayed payout transaction ID -shared.delayedPayoutTxReceiverAddress=Delayed payout transaction sent to +shared.delayedPayoutTxId=Verzögerte Auszahlungs-ID der Transaktion +shared.delayedPayoutTxReceiverAddress=Verzögerte Auszahlungs-Transaktion gesendet zu shared.unconfirmedTransactionsLimitReached=Sie haben im Moment zu viele unbestätigte Transaktionen. Bitte versuchen Sie es später noch einmal. @@ -237,8 +238,6 @@ mainView.menu.settings=Einstellungen mainView.menu.account=Konto mainView.menu.dao=DAO -mainView.marketPrice.provider=Preis von -mainView.marketPrice.label=Marktpreis mainView.marketPriceWithProvider.label=Marktpreis von {0} mainView.marketPrice.bisqInternalPrice=Preis des letzten Bisq-Handels mainView.marketPrice.tooltip.bisqInternalPrice=Es ist kein Marktpreis von externen Marktpreis-Anbietern verfügbar.\nDer angezeigte Preis, ist der letzte Bisq-Handelspreis für diese Währung. @@ -251,14 +250,15 @@ mainView.balance.locked.short=Gesperrt mainView.footer.usingTor=(nutzt Tor) mainView.footer.localhostBitcoinNode=(localhost) -mainView.footer.btcInfo=Bitcoin-Netzwerk-Peers: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Aktuelle Gebühr: {0} sat/vB mainView.footer.btcInfo.initializing=Verbindung mit Bitcoin-Netzwerk wird hergestellt mainView.footer.bsqInfo.synchronizing=/ Synchronisiere DAO mainView.footer.btcInfo.synchronizingWith=Synchronisiere mit mainView.footer.btcInfo.synchronizedWith=Synchronisiert mit mainView.footer.btcInfo.connectingTo=Verbinde mit mainView.footer.btcInfo.connectionFailed=Verbindung fehlgeschlagen zu -mainView.footer.p2pInfo=Bisq-Netzwerk-Peers: {0} +mainView.footer.p2pInfo=Bitcoin Netzwerk Peers: {0} / Bisq Netzwerk Peers: {1} mainView.footer.daoFullNode=DAO Full Node mainView.bootstrapState.connectionToTorNetwork=(1/4) Verbinde mit Tor-Netzwerk... @@ -292,7 +292,6 @@ market.tabs.spread=Details market.tabs.trades=Trades # OfferBookChartView -market.offerBook.chart.title=Angebotsbuch für {0} market.offerBook.buyAltcoin={0} kaufen ({1} verkaufen) market.offerBook.sellAltcoin={0} verkaufen ({1} kaufen) market.offerBook.buyWithFiat={0} kaufen @@ -337,7 +336,7 @@ offerbook.offerersAcceptedBankSeats=Als Banksitz akzeptierte Länder (Abnehmer): offerbook.availableOffers=Verfügbare Angebote offerbook.filterByCurrency=Nach Währung filtern offerbook.filterByPaymentMethod=Nach Zahlungsmethode filtern -offerbook.timeSinceSigning=Signed since +offerbook.timeSinceSigning=Unterzeichnet seit offerbook.timeSinceSigning.info=Dieses Konto wurde verifiziert und {0} offerbook.timeSinceSigning.info.arbitrator=von einem Vermittler unterzeichnet und kann Partner-Konten unterzeichnen offerbook.timeSinceSigning.info.peer=von einem Partner unterzeichnet, der darauf wartet, dass die Limits aufgehoben werden @@ -346,7 +345,7 @@ offerbook.timeSinceSigning.info.signer=vom Partner unterzeichnet und kann Partne offerbook.timeSinceSigning.info.banned=Konto wurde geblockt offerbook.timeSinceSigning.daysSinceSigning={0} Tage offerbook.timeSinceSigning.daysSinceSigning.long={0} seit der Unterzeichnung -offerbook.xmrAutoConf=Is auto-confirm enabled +offerbook.xmrAutoConf=Automatische Bestätigung aktiviert offerbook.timeSinceSigning.help=Wenn Sie einen Trade mit einem Partner erfolgreich abschließen, der ein unterzeichnetes Zahlungskonto hat, wird Ihr Zahlungskonto unterzeichnet.\n{0} Tage später wird das anfängliche Limit von {1} aufgehoben und Ihr Konto kann die Zahlungskonten anderer Partner unterzeichnen. offerbook.timeSinceSigning.notSigned=Noch nicht unterzeichnet @@ -357,7 +356,7 @@ shared.notSigned.noNeed=Dieser Kontotyp verwendet keine Unterzeichnung offerbook.nrOffers=Anzahl der Angebote: {0} offerbook.volume={0} (min - max) offerbook.deposit=Kaution BTC (%) -offerbook.deposit.help=Kaution, die von jedem Trader gezahlt wird, um den Trade zu garantieren. Wird zurückgezahlt, wenn der Trade abgeschlossen ist. +offerbook.deposit.help=Sicherheitskaution, die von jedem Trader bezahlt werden muss, um die Sicherheit für beide Trader zu erhöhen. Wird zurückgezahlt, wenn der Trade erfolgreich abgeschlossen ist. offerbook.createOfferToBuy=Neues Angebot erstellen, um {0} zu kaufen offerbook.createOfferToSell=Neues Angebot erstellen, um {0} zu verkaufen @@ -375,14 +374,14 @@ offerbook.deactivateOffer.failed=Deaktivieren des Angebots fehlgeschlagen:\n{0} offerbook.activateOffer.failed=Veröffentlichung des Angebots fehlgeschlagen:\n{0} offerbook.withdrawFundsHint=Sie können die eingezahlten Gelder im {0}-Bildschirm abheben. -offerbook.warning.noTradingAccountForCurrency.headline=No payment account for selected currency -offerbook.warning.noTradingAccountForCurrency.msg=You don't have a payment account set up for the selected currency.\n\nWould you like to create an offer for another currency instead? -offerbook.warning.noMatchingAccount.headline=No matching payment account. -offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you haven't set up yet. \n\nWould you like to set up a new payment account now? +offerbook.warning.noTradingAccountForCurrency.headline=Kein Zahlungskonto für die gewählte Währung +offerbook.warning.noTradingAccountForCurrency.msg=Sie haben kein Zahlungskonto für die gewählte Währung eingerichtet.\n\nWollen Sie stattdessen ein Handelsangebot für eine andere Währung erstellen? +offerbook.warning.noMatchingAccount.headline=Kein passendes Zahlungskonto. +offerbook.warning.noMatchingAccount.msg=Dieses Angebot verwendet eine Zahlungsmethode die Sie noch nicht eingerichtet haben.\n\nWollen Sie jetzt ein neues Zahlungskonto einrichten? offerbook.warning.counterpartyTradeRestrictions=Dieses Angebot kann aufgrund von Handelsbeschränkungen der Gegenpartei nicht angenommen werden -offerbook.warning.newVersionAnnouncement=Mit dieser Version der Software können Trading-Partner die Zahlungskonten der anderen verifizieren und unterzeichnen, um ein Netzwerk von vertrauenswürdigen Zahlungskonten zu erstellen.\n\nNach erfolgreichem Trading mit einem Partner mit einem verifizierten Zahlungskonto wird Ihr Zahlungskonto unterzeichnet und die Trade-Limits werden nach einem bestimmten Zeitintervall aufgehoben (die Länge dieses Intervalls basiert auf der Verifizierungsmethode).\n\nWeitere Informationen zur Kontounterzeichnung finden Sie in der Dokumentation unter https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=Mit dieser Software-Version können Trading-Peers gegenseitig Zahlungskonten unterzeichnen und verifizieren um ein Netzwerk von vertrauenswürdigen Zahlungskonten zu schaffen.\n\nNachdem mit einem Peer mit einem verifiziertem Zahlungskonto gehandelt wurde, wird Ihr Zahlungskonto unterzeichnet und die Trading-Limits werden nach einer gewissen Zeit (die Länge kann je nach Zahlungsmethode unterschiedlich sein) aufgehoben .\n\nWeitere Informationen zum Thema Signieren von Accounts finden Sie hier: [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=Der zulässige Trade-Betrag ist aufgrund von Sicherheitseinschränkungen, die auf den folgenden Kriterien basieren, auf {0} begrenzt:\n- Das Konto des Käufers wurde nicht von einem Vermittler oder einem Partner unterzeichnet\n- Die Zeit seit der Unterzeichnung des Kontos des Käufers beträgt nicht mindestens 30 Tage\n- Die Zahlungsmethode für dieses Angebot gilt als riskant für Bankrückbuchungen\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Der zulässige Trade-Betrag ist aufgrund von Sicherheitseinschränkungen, die auf den folgenden Kriterien basieren, auf {0} begrenzt:\n- Ihr Konto wurde nicht von einem Vermittler oder einem Partner unterzeichnet\n- Die Zeit seit der Unterzeichnung Ihres Kontos beträgt nicht mindestens 30 Tage\n- Die Zahlungsmethode für dieses Angebot gilt als riskant für Bankrückbuchungen\n\n{1} @@ -393,9 +392,8 @@ offerbook.warning.offerBlocked=Das Angebot wurde von den Bisq-Entwicklern blocki offerbook.warning.currencyBanned=Die in diesem Handel verwendete Währung wurde von den Bisq-Entwicklern blockiert.\nBitte besuchen sie das Bisq-Forum für weitere Informationen. offerbook.warning.paymentMethodBanned=Die in diesem Handel verwendete Zahlungsmethode wurde von den Bisq-Entwicklern blockiert.\nBitte besuchen sie das Bisq-Forum für weitere Informationen. offerbook.warning.nodeBlocked=Die Onion-Adresse dieses Händlers wurde von den Bisq-Entwicklern blockiert.\nWahrscheinlich gibt es einen unbehobenen Bug, der Probleme beim Annehmen von Angeboten dieses Händlers verursacht. -offerbook.warning.requireUpdateToNewVersion=Ihre Bisq Version ist nicht mehr zum Handeln kompatible.\nBitte updaten Sie auf die neuste Bisqversion von https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=Ihr Zahlungskonto wurde vor {0} erstellt. Ihr Trade-Limit basiert auf dem Kontoalter und ist für dieses Angebot nicht ausreichend.\n\nIhr Trade-Limit ist: {1}\nDer Trade-Mindestbetrag des Angebots ist: {2}.\n\nSie können dieses Angebot im Moment nicht annehmen. Sobald Ihr Konto älter als 2 Monate ist, wird diese Einschränkung aufgehoben. -offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. +offerbook.warning.requireUpdateToNewVersion=Ihre Bisq Version ist zum Traden nicht aktuell.\nBitte updaten Sie Bisq unter [HYPERLINK:https://bisq.network/downloads]. +offerbook.warning.offerWasAlreadyUsedInTrade=Sie können dieses Angebot nicht annehmen, da Sie es schon früher angenommen haben. Es kann sein, dass dein vorheriger Versuch ein fehlgeschlagener Trade war. offerbook.info.sellAtMarketPrice=Sie verkaufen zum aktuellen Marktpreis (jede Minute aktualisiert). offerbook.info.buyAtMarketPrice=Sie kaufen zum aktuellen Marktpreis (jede Minute aktualisiert). @@ -445,7 +443,6 @@ createOffer.alreadyFunded=Sie hatten das Angebot bereits finanziert.\nIhre Gelde createOffer.createOfferFundWalletInfo.headline=Ihr Angebot finanzieren # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- Handelsbetrag: {0} \n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} und {1} createOffer.createOfferFundWalletInfo.msg=Sie müssen zum Annehmen dieses Angebots {0} einzahlen.\n\nDiese Gelder werden in Ihrer lokalen Wallet reserviert und in die MultiSig-Kautionsadresse eingesperrt, wenn jemand Ihr Angebot annimmt.\n\nDer Betrag ist die Summe aus:\n{1}- Kaution: {2}\n- Handelsgebühr: {3}\n- Mining-Gebühr: {4}\n\nSie haben zwei Möglichkeiten, Ihren Handel zu finanzieren:\n- Nutzen Sie Ihre Bisq-Wallet (bequem, aber Transaktionen können nachverfolgbar sein) ODER\n- Von einer externen Wallet überweisen (möglicherweise vertraulicher)\n\nSie werden nach dem Schließen dieses Dialogs alle Finanzierungsmöglichkeiten und Details sehen. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -465,7 +462,7 @@ createOffer.tac=Mit der Erstellung dieses Angebots stimme ich zu, mit jedem Hän createOffer.currencyForFee=Handelsgebühr createOffer.setDeposit=Kaution des Käufers festlegen (%) createOffer.setDepositAsBuyer=Meine Kaution als Käufer festlegen (%) -createOffer.setDepositForBothTraders=Legen Sie die Kaution beider Trader fest (%) +createOffer.setDepositForBothTraders=Legen Sie die Kaution für beide Trader fest (%) createOffer.securityDepositInfo=Die Kaution ihres Käufers wird {0} createOffer.securityDepositInfoAsBuyer=Ihre Kaution als Käufer wird {0} createOffer.minSecurityDepositUsed=Min. Kaution des Käufers wird verwendet @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=Sie können das Angebot nicht annehmen, da der E takeOffer.warning.connectionToPeerLost=Sie haben die Verbindung zum Ersteller verloren.\nEr ist möglicherweise offline gegangen oder hat die Verbindung zu Ihnen wegen zu vieler offener Verbindungen geschlossen.\n\nFalls Sie das Angebot noch im Angebotsbuch sehen, können Sie versuchen das Angebot erneut anzunehmen. takeOffer.error.noFundsLost=\n\nEs haben noch keine Gelder Ihre Wallet verlassen.\nVersuchen Sie bitte Ihre Anwendung neu zu starten und überprüfen Sie Ihre Netzwerkverbindung, um zu sehen ob Sie das Problem beheben können. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=.\n\n takeOffer.error.depositPublished=\n\nDie Kautionstransaktion wurde schon veröffentlicht.\nVersuchen Sie bitte Ihre Anwendung neu zu starten und überprüfen Sie Ihre Netzwerkverbindung, um zu sehen ob Sie das Problem beheben können.\nWenn das Problem weiter besteht, kontaktieren Sie bitte die Entwickler für Support. takeOffer.error.payoutPublished=\n\nDie Auszahlungstransaktion wurde schon veröffentlicht.\nVersuchen Sie bitte Ihre Anwendung neu zu starten und überprüfen Sie Ihre Netzwerkverbindung, um zu sehen ob Sie das Problem beheben können.\nWenn das Problem weiter besteht, kontaktieren Sie bitte die Entwickler für Support. @@ -543,7 +541,7 @@ portfolio.tab.history=Verlauf portfolio.tab.failed=Fehlgeschlagen portfolio.tab.editOpenOffer=Angebot bearbeiten -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=Es gibt ein Problem mit einer fehlenden oder ungültigen Transaktion.\n\nBitte senden Sie KEINE Fiat oder Altcoin Zahlung. Kontaktieren Sie Bisq Entwickler auf Keybase [HYPERLINK:https://keybase.io/team/bisq] oder im Forum [HYPERLINK:https://bisq.community] for further assistance.\n\nFehlermeldung: {0} portfolio.pending.step1.waitForConf=Auf Blockchain-Bestätigung warten portfolio.pending.step2_buyer.startPayment=Zahlung beginnen @@ -552,8 +550,8 @@ portfolio.pending.step3_buyer.waitPaymentArrived=Auf Zahlungseingang warten portfolio.pending.step3_seller.confirmPaymentReceived=Zahlungseingang bestätigen portfolio.pending.step5.completed=Abgeschlossen -portfolio.pending.step3_seller.autoConf.status.label=Selbstbestätigung Status -portfolio.pending.autoConf=Selbstbestätigt +portfolio.pending.step3_seller.autoConf.status.label=Automatische Bestätigung Status +portfolio.pending.autoConf=Automatisch bestätigt portfolio.pending.autoConf.blocks=XMR Bestätigungen: {0} / Benötigt: {1} portfolio.pending.autoConf.state.xmr.txKeyReused=Transaktionsschlüssel erneut benutzt. Bitte eröffnen Sie einen Disput. portfolio.pending.autoConf.state.confirmations=XMR Bestätigungen: {0}/{1} @@ -562,25 +560,25 @@ portfolio.pending.autoConf.state.txKeyOrTxIdInvalid=ID / Schlüssel für Transak portfolio.pending.autoConf.state.filterDisabledFeature=Von Entwicklern deaktiviert. # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.FEATURE_DISABLED=Selbstbestätigungsfunktion ist deaktiviert. {0} +portfolio.pending.autoConf.state.FEATURE_DISABLED=Automatische Bestätigung ist deaktiviert. {0} # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.TRADE_LIMIT_EXCEEDED=Handelsbetrag überschreitet Limit für Selbstbestätigung +portfolio.pending.autoConf.state.TRADE_LIMIT_EXCEEDED=Handelsbetrag überschreitet Limit für automatische Bestätigung # suppress inspection "UnusedProperty" portfolio.pending.autoConf.state.INVALID_DATA=Peer hat ungültige Daten angegeben. {0} # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.PAYOUT_TX_ALREADY_PUBLISHED=Die Auszahlungstransaktion wurde bereits veröffentlicht. +portfolio.pending.autoConf.state.PAYOUT_TX_ALREADY_PUBLISHED=Die Auszahlungstransaktion wurde bereits durchgeführt. # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.DISPUTE_OPENED=Der Disput wurde eröffnet. Die Selbstbestätigung ist für diesen Trade deaktiviert. +portfolio.pending.autoConf.state.DISPUTE_OPENED=Der Disput wurde eröffnet. Die automatische Bestätigung ist für diesen Trade deaktiviert. # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.REQUESTS_STARTED=Transaktionsnachweis-Anforderungen gestartet +portfolio.pending.autoConf.state.REQUESTS_STARTED=Transaktionsnachweis Anfrage gestartet # suppress inspection "UnusedProperty" portfolio.pending.autoConf.state.PENDING=Erfolgsergebnisse: {0}/{1}; {2} # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.COMPLETED=Beweisführung bei allen Diensten gelungen +portfolio.pending.autoConf.state.COMPLETED=Beweise für alle Dienste gelungen # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.ERROR=An error at a service request occurred. No auto-confirm possible. +portfolio.pending.autoConf.state.ERROR=Während der Service Anfrage ist ein Fehler aufgetaucht. Automatische Bestätigung nicht möglich. # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.FAILED=A service returned with a failure. No auto-confirm possible. +portfolio.pending.autoConf.state.FAILED=Ein Service kam fehlerhaft zurück. Automatische Bestätigung nicht möglich. portfolio.pending.step1.info=Die Kautionstransaktion wurde veröffentlicht.\n{0} muss auf wenigstens eine Blockchain-Bestätigung warten, bevor die Zahlung beginnt. portfolio.pending.step1.warn=Die Kautionstransaktion ist noch nicht bestätigt. Dies geschieht manchmal in seltenen Fällen, wenn die Finanzierungsgebühr aus der externen Wallet eines Traders zu niedrig war. @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=WICHTIGE VORAUSSETZUNG: \nNachdem # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=Bitte zahlen Sie {0} an den BTC-Verkäufer mit Western Union.\n\n portfolio.pending.step2_buyer.westernUnion.extra=WICHTIGE VORAUSSETZUNG: \nNachdem Sie die Zahlung getätigt haben, senden Sie die MTCN (Tracking-Nummer) und ein Foto der Quittung per E-Mail an den BTC-Verkäufer.\nDie Quittung muss den vollständigen Namen, die Stadt, das Land des Verkäufers und den Betrag deutlich zeigen. Die E-Mail-Adresse des Verkäufers lautet: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Bitte kaufen Sie eine Amazon eGift Card für {0} in Ihrem Amazon-Konto und verwenden Sie die E-Mail- oder Mobilfunknummer des BTC-Verkäufers als Empfänger. Falls der Handelsbetrag den zulässigen Betrag überschreitet, senden Sie mehrere Karten.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=Bitte senden Sie {0} per \"US Postal Money Order\" an den BTC-Verkäufer.\n\n @@ -635,17 +635,15 @@ portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=Einige Banken könnte portfolio.pending.step2_buyer.confirmStart.headline=Bestätigen Sie, dass Sie die Zahlung begonnen haben portfolio.pending.step2_buyer.confirmStart.msg=Haben Sie die {0}-Zahlung an Ihren Handelspartner begonnen? portfolio.pending.step2_buyer.confirmStart.yes=Ja, ich habe die Zahlung begonnen -portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades -portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value -portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway +portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=Sie haben keinen Zahlungsbeweis eingereicht. +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=Sie haben keine Transaktions-ID und keinen Transaktionsschlüssel eingegeben.\n\nWenn Sie diese Informationen zur Verfügung stellen, kann der Peer die automatische Bestätigung (um die BTC freizugeben sobald die XMR erhalten wurden) nicht nutzen.\nDer Sender der XMR Transaktion muss diese Informationen im Falle eines Konflikts dem Mediator oder Arbitrator mitteilen.\nFinden Sie weitere Informationen im Bisq Wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Eingabe ist kein 32 byte Hexadezimalwert. +portfolio.pending.step2_buyer.confirmStart.warningButton=Ignorieren und fortfahren portfolio.pending.step2_seller.waitPayment.headline=Auf Zahlung warten portfolio.pending.step2_seller.f2fInfo.headline=Kontaktinformation des Käufers portfolio.pending.step2_seller.waitPayment.msg=Die Kautionstransaktion hat mindestens eine Blockchain-Bestätigung.\nSie müssen warten bis der BTC-Käufer die {0}-Zahlung beginnt. portfolio.pending.step2_seller.warn=Der BTC-Käufer hat die {0}-Zahlung noch nicht getätigt.\nSie müssen warten bis die Zahlung begonnen wurde.\nWenn der Handel nicht bis {1} abgeschlossen wurde, wird der Vermittler diesen untersuchen. portfolio.pending.step2_seller.openForDispute=Der BTC-Käufer hat seine Zahlung nicht begonnen!\nDie maximal zulässige Frist für den Handel ist abgelaufen.\nSie können länger warten und dem Handelspartner mehr Zeit geben oder den Vermittler um Hilfe bitten. -portfolio.pending.step2_seller.refresh=Trade-Status aktualisieren -portfolio.pending.step2_seller.refreshInfo=Manchmal werden P2P-Netzwerknachrichten, die die Zahlung bestätigen, nicht zugestellt, so dass der Trade ins Stocken gerät. Klicken Sie auf die Schaltfläche unten, damit Ihr Peer die letzte Nachricht erneut senden kann. tradeChat.chatWindowTitle=Chat-Fenster für Trade mit ID ''{0}'' tradeChat.openChat=Chat-Fenster öffnen tradeChat.rules=Sie können mit Ihrem Trade-Partner kommunizieren, um mögliche Probleme mit diesem Trade zu lösen.\nEs ist nicht zwingend erforderlich, im Chat zu antworten.\nWenn ein Trader gegen eine der folgenden Regeln verstößt, eröffnen Sie einen Streitfall und melden Sie ihn dem Mediator oder Vermittler.\n\nChat-Regeln:\n\t● Senden Sie keine Links (Risiko von Malware). Sie können die Transaktions-ID und den Namen eines Block-Explorers senden.\n\t● Senden Sie keine Seed-Wörter, Private Keys, Passwörter oder andere sensible Informationen!\n\t● Traden Sie nicht außerhalb von Bisq (keine Sicherheit).\n\t● Beteiligen Sie sich nicht an Betrugsversuchen in Form von Social Engineering.\n\t● Wenn ein Partner nicht antwortet und es vorzieht, nicht über den Chat zu kommunizieren, respektieren Sie seine Entscheidung.\n\t● Beschränken Sie Ihre Kommunikation auf das Traden. Dieser Chat ist kein Messenger-Ersatz oder eine Trollbox.\n\t● Bleiben Sie im Gespräch freundlich und respektvoll. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=Da die Zahlung per Cash Deposit ausgeführt portfolio.pending.step3_seller.moneyGram=Der Käufer muss Ihnen die Authorisierungs-Nummer und ein Foto der Quittung per E-Mail zusenden.\nDie Quittung muss deutlich Ihren vollständigen Namen, Ihr Land, Ihr Bundesland und den Betrag enthalten. Bitte überprüfen Sie Ihre E-Mail, wenn Sie die Authorisierungs-Nummer erhalten haben.\n\nNach dem Schließen dieses Pop-ups sehen Sie den Namen und die Adresse des BTC-Käufers, um das Geld von MoneyGram abzuholen.\n\nBestätigen Sie den Erhalt erst, nachdem Sie das Geld erfolgreich abgeholt haben! portfolio.pending.step3_seller.westernUnion=Der Käufer muss Ihnen die MTCN (Sendungsnummer) und ein Foto der Quittung per E-Mail zusenden.\nDie Quittung muss deutlich Ihren vollständigen Namen, Ihre Stadt, Ihr Land und den Betrag enthalten. Bitte überprüfen Sie Ihre E-Mail, wenn Sie die MTCN erhalten haben.\n\nNach dem Schließen dieses Pop-ups sehen Sie den Namen und die Adresse des BTC-Käufers, um das Geld von Western Union abzuholen.\n\nBestätigen Sie den Erhalt erst, nachdem Sie das Geld erfolgreich abgeholt haben! portfolio.pending.step3_seller.halCash=Der Käufer muss Ihnen den HalCash-Code als SMS zusenden. Außerdem erhalten Sie eine Nachricht von HalCash mit den erforderlichen Informationen, um EUR an einem HalCash-fähigen Geldautomaten abzuheben.\n\nNachdem Sie das Geld am Geldautomaten abgeholt haben, bestätigen Sie bitte hier den Zahlungseingang! +portfolio.pending.step3_seller.amazonGiftCard=Der Käufer hat Ihnen eine Amazon eGift Card per E-Mail oder per Textnachricht auf Ihr Mobiltelefon geschickt. Bitte lösen Sie jetzt die Amazon eGift Card in Ihrem Amazon-Konto ein und bestätigen Sie nach der Annahme den Zahlungseingang. portfolio.pending.step3_seller.bankCheck=\n\nBitte überprüfen Sie auch, ob der Name des im Trading-Vertrag angegebenen Absenders mit dem Namen auf Ihrem Kontoauszug übereinstimmt:\nName des Absenders, pro Trade-Vertrag: {0}\n\nWenn die Namen nicht genau gleich sind, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=bestätigen Sie den Zahlungseingang nicht. Eröffnen Sie stattdessen einen Konflikt, indem Sie \"alt + o\" oder \"option + o\" drücken.\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=Zahlungserhalt bestätigen portfolio.pending.step3_seller.amountToReceive=Zu erhaltender Betrag @@ -691,8 +691,8 @@ portfolio.pending.step3_seller.yourAddress=Ihre {0}-Adresse portfolio.pending.step3_seller.buyersAddress={0}-Adresse des Käufers portfolio.pending.step3_seller.yourAccount=Ihr Handelskonto portfolio.pending.step3_seller.xmrTxHash=Transaktions-ID -portfolio.pending.step3_seller.xmrTxKey=Transaction key -portfolio.pending.step3_seller.buyersAccount=Buyers account data +portfolio.pending.step3_seller.xmrTxKey=Transaktionsschlüssel +portfolio.pending.step3_seller.buyersAccount=Käufer Konto-Informationen portfolio.pending.step3_seller.confirmReceipt=Zahlungserhalt bestätigen portfolio.pending.step3_seller.buyerStartedPayment=Der BTC-Käufer hat die {0}-Zahlung begonnen.\n{1} portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Überprüfen Sie Ihre Altcoin-Wallet oder Ihren Block-Explorer auf Blockchain-Bestätigungen und bestätigen Sie die Zahlung, wenn ausreichend viele Blockchain-Bestätigungen angezeigt werden. @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=Ist die {0}-Zahlung Ihres portfolio.pending.step3_seller.onPaymentReceived.fiat=Die Handels-ID (\"Verwendungszweck\") der Transaktion ist: \"{0}\"\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Bitte überprüfen Sie auch, ob der Name des im Trade-Vertrag angegebenen Absenders mit dem Namen auf Ihrem Kontoauszug übereinstimmt:\nName des Absenders, pro Trade-Vertrag: {0}\n\nWenn die Namen nicht genau gleich sind, bestätigen Sie den Zahlungseingang nicht. Eröffnen Sie stattdessen einen Konflikt, indem Sie \"alt + o\" oder \"option + o\" drücken.\n\n +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.note=Bitte beachten Sie, dass, sobald Sie den Erhalt bestätigt haben, der gesperrte Trade-Betrag an den BTC-Käufer freigegeben wird und die Kaution zurückerstattet wird.\n\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Bestätigen Sie, die Zahlung erhalten zu haben portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Ja, ich habe die Zahlung erhalten @@ -746,25 +747,20 @@ portfolio.pending.tradePeriodInfo=Die Handelsdauer beginnt mit der ersten Blockc portfolio.pending.tradePeriodWarning=Wird die Dauer überschritten, können beide Händler einen Konflikt öffnen. portfolio.pending.tradeNotCompleted=Maximale Handelsdauer wurde überschritten (bis {0}) portfolio.pending.tradeProcess=Handelsprozess -portfolio.pending.openAgainDispute.msg=Falls Sie nicht sicher sind, ob Ihre Nachricht den Mediator oder Vermittler erreicht hat (z.B. wenn Sie nach 1 Tag noch keine Antwort erhalten haben), können Sie mit Cmd/Ctrl+o erneut einen Konflikt eröffnen. Sie können auch im Bisq-Forum unter https://bisq.community um zusätzliche Hilfe bitten. +portfolio.pending.openAgainDispute.msg=Wenn Sie sich nicht sicher sind ob die Nachricht für den Mediator oder Arbitrator angekommen ist (z.B. wenn Sie nach einem Tag keine Antwort erhalten haben), können Sie mit Cmd/Strg+o einen weiteren Konflikt öffnen. Sie können im Bisq Forum nach Hilfe fragen [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=Konflikt erneut öffnen portfolio.pending.openSupportTicket.headline=Support-Ticket öffnen portfolio.pending.openSupportTicket.msg=Bitte verwenden Sie diese Funktion nur in Notfällen, wenn Sie keinen \"Open support\" oder \"Open dispute\" Button sehen.\n\nWenn Sie ein Support-Ticket öffnen, wird der Trade unterbrochen und von einem Mediator oder Vermittler bearbeitet. portfolio.pending.timeLockNotOver=Sie müssen ≈{0} ({1} weitere Blöcke) warten, bevor Sie einen Vermittlungskonflikt eröffnen können. portfolio.pending.error.depositTxNull=Die Einzahlungstransaktion ist null. Sie können einen Streitfall nicht ohne eine gültige Einzahlungstransaktion eröffnen. Bitte gehen Sie zu \"Einstellungen/Netzwerkinformationen\" und führen Sie eine SPV-Resynchronisierung durch.\n\nFür weitere Hilfe wenden Sie sich bitte an den Bisq-Support-Kanal des Bisq Keybase Teams. -portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is null. You can move the trade to failed trades. -portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. +portfolio.pending.mediationResult.error.depositTxNull=Die Einzahlungstransaktion ist ungültig. Sie können den Trade zu den fehlgeschlagenen Trades verschieben. +portfolio.pending.mediationResult.error.delayedPayoutTxNull=Die verzögerte Auszahlungstransaktion ist ungültig. Sie können den Trade zu den fehlgeschlagenen Trades verschieben. portfolio.pending.error.depositTxNotConfirmed=Die Einzahlungstransaktion ist bestätigt. Sie können einen Vermittlungsfall nicht ohne eine bestätigte Einzahlungstransaktion eröffnen. Bitte warten Sie, bis sie bestätigt ist, oder gehen Sie zu \"Einstellungen/Netzwerkinformationen\" und führen Sie eine SPV-Resynchronisierung durch.\n\nFür weitere Hilfe wenden Sie sich bitte an den Bisq-Support-Kanal des Bisq Keybase Teams. -portfolio.pending.notification=Benachrichtigung - portfolio.pending.support.headline.getHelp=Brauchen Sie Hilfe? portfolio.pending.support.text.getHelp=Wenn Sie irgendwelche Probleme haben, können Sie versuchen, den Trade-Partner im Trade-Chat zu kontaktieren oder die Bisq-Community unter https://bisq.community zu fragen. Wenn Ihr Problem immer noch nicht gelöst ist, können Sie weitere Hilfe von einem Mediator anfordern. -portfolio.pending.support.text.getHelp.arbitrator=Wenn Sie irgendwelche Probleme haben, können Sie versuchen, den Trade-Partner im Trade-Chat zu kontaktieren oder die Bisq-Community unter https://bisq.community zu fragen. Wenn Ihr Problem immer noch nicht gelöst ist, können Sie weitere Hilfe von einem Vermittler anfordern. portfolio.pending.support.button.getHelp=Trader Chat öffnen -portfolio.pending.support.popup.info=Wenn Ihr Problem mit dem Trade weiterhin ungelöst bleibt, können Sie ein Support-Ticket eröffnen, um Hilfe von einem Mediator anzufordern. Wenn Sie die Zahlung nicht erhalten haben, warten Sie bitte, bis die Trading-Periode abgelaufen ist.\n\nSind Sie sicher, dass Sie ein Support-Ticket eröffnen möchten? -portfolio.pending.support.popup.button=Support-Ticket öffnen portfolio.pending.support.headline.halfPeriodOver=Zahlung überprüfen portfolio.pending.support.headline.periodOver=Die Handelsdauer ist abgelaufen @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Mediation beantragt portfolio.pending.refundRequested=Rückerstattung beantragt portfolio.pending.openSupport=Support-Ticket öffnen portfolio.pending.supportTicketOpened=Support-Ticket geöffnet -portfolio.pending.requestSupport=Support anfordern -portfolio.pending.error.requestSupport=Bitte melden Sie das Problem Ihrem Mediator oder Vermittler.\n\nDiese werden die Informationen an die Entwickler weiterleiten, um das Problem zu untersuchen.\nNachdem das Problem analysiert wurde, erhalten Sie alle gesperrten Gelder zurück. portfolio.pending.communicateWithArbitrator=Bitte setzen Sie sich im \"Support\"-Bildschirm mit dem Vermittler in Verbindung. portfolio.pending.communicateWithMediator=Bitte kommunizieren Sie im \"Support\" Bildschirm mit dem Mediator. -portfolio.pending.supportTicketOpenedMyUser=Sie haben bereits ein Support-Ticket geöffnet.\n{0} portfolio.pending.disputeOpenedMyUser=Sie haben bereits einen Konflikt geöffnet.\n{0} portfolio.pending.disputeOpenedByPeer=Ihr Handelspartner hat einen Konflikt geöffnet\n{0} -portfolio.pending.supportTicketOpenedByPeer=Ihr Handelspartner hat ein Support-Ticket geöffnet.\n{0} portfolio.pending.noReceiverAddressDefined=Keine Empfangsadresse festgelegt -portfolio.pending.removeFailedTrade=Ist dies ein gescheiterter Trade? Wenn ja, möchten Sie diesen manuell schließen, so dass er nicht mehr als offener Trade angezeigt wird? portfolio.pending.mediationResult.headline=Vorgeschlagene Auszahlung aus der Mediation portfolio.pending.mediationResult.info.noneAccepted=Schließen Sie den Trade ab, indem Sie den Vorschlag des Mediators für die Trade-Auszahlung annehmen. @@ -790,25 +781,25 @@ portfolio.pending.mediationResult.info.peerAccepted=Ihr Trade-Partner hat den Vo portfolio.pending.mediationResult.button=Lösungsvorschlag ansehen portfolio.pending.mediationResult.popup.headline=Mediationsergebnis für Trade mit ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=Ihr Trade-Partner hat den Vorschlag des Mediators akzeptiert für Trade {0} -portfolio.pending.mediationResult.popup.info=Der Mediator hat die folgende Auszahlung vorgeschlagen:\nSie erhalten: {0}\nIhr Trading-Partner erhält: {1}\n\nSie können diese vorgeschlagene Auszahlung akzeptieren oder ablehnen.\n\nMit der Annahme unterzeichnen Sie die vorgeschlagene Auszahlungstransaktion. Wenn Ihr Trading-Partner auch akzeptiert und unterzeichnet, wird die Auszahlung abgeschlossen und der Trade geschlossen.\n\nWenn einer oder beide von Ihnen den Vorschlag ablehnen, müssen Sie bis {2} (Block {3}) warten, um einen Konflikt in der zweiten Runde mit einem Vermittler zu eröffnen, der den Fall erneut untersuchen und eine Auszahlung auf der Grundlage seiner Erkenntnisse vornehmen wird.\n\nDer Vermittler kann eine geringe Gebühr (Gebühr maximal: die Kaution des Traders) als Entschädigung für seine Arbeit erheben. Der Idealfall wäre, dass beide Trader dem Vorschlag des Mediators zustimmen, da das Schlichtungsverfahren für außergewöhnliche Umstände gedacht ist, z.B. wenn ein Trader sicher ist, dass der Mediator keinen fairen Auszahlungsvorschlag gemacht hat (oder wenn der andere Trader nicht reagiert).\n\nMehr Details zum neuen Vermittlungsmodell:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=Der Mediator hat folgende Auzahlung vorgeschlagen: \nSie erhalten: {0}\nIhr Trading Peer erhaltet: {1}\n\nSie können die vorgeschlagene Auszahlung akzeptieren oder ablehnen.\n\nAkzeptieren Sie, unterzeichnen Sie die vorgeschlagene Transaktion. Wenn Ihr Trading Peer auch akzeptiert und unterzeichnet, wird die Auszahlung getätigt und der Trade abgeschlossen.\n\nWenn einer oder beide den Vorschlag ablehnen, müssen Sie bis {2} (block {3}) warten um eine zweite Konfliktrunde mit einem Arbitrator, der den Trade untersuchen wird und je nach Ergebnis eine Auszahlung tätigen wird, zu starten.\n\nDer Arbitrator könnte eine kleine Gebühr (maximale Gebühr: Sicherheitskaution des Traders) für seine Arbeit verrechnen. Im Idealfall akzeptieren beide Trader den Vorschlag des Mediators - einen Arbitrator hinzuzuziehen ist nur für außergewöhnliche Fälle vorgesehen. Ein Beispiel wäre, wenn der Trader sich sicher ist, dass der Auszahlungsvorschlag nicht fair ist oder der Peer nicht antwortet.\n\nWeitere Informationen über das Arbitrationssystem finden Sie unter [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=Sie haben die von dem Mediator vorgeschlagene Auszahlung akzeptiert aber es scheint so als hätte sie der Trading-Peer noch nicht akzeptiert.\n\nSobald die Sperre bei {0} (block {1})) aufgehoben ist, können Sie die zweite Runde des Konflikts öffnen. Der Arbitrator wird dann den Konflikt genauer untersuchen und je nach Ergebnis eine Auszahlung veranlassen.\n\nHier können Sie mehr informationen über das Arbitrations-Modell finden:\n[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Ablehnen und Vermittler hinzuziehen portfolio.pending.mediationResult.popup.alreadyAccepted=Sie haben bereits akzeptiert -portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. -portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} -portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Move trade to failed trades -portfolio.pending.failedTrade.warningIcon.tooltip=Click to open details about the issues of this trade -portfolio.failed.revertToPending.popup=Do you want to move this trade to open trades? -portfolio.failed.revertToPending=Move trade to open trades +portfolio.pending.failedTrade.taker.missingTakerFeeTx=Die Transaktion für die Käufer-Gebühr fehlt.\n\nOhne diese tx kann der Trade nicht abgeschlossen werden. Die Funds wurden nicht gesperrt und es wurde keine Trade-Gebühr bezahlt. Sie können diesen Trade zu den fehlgeschlagenen Trades verschieben. +portfolio.pending.failedTrade.maker.missingTakerFeeTx=Die Käufer-Gebühr des Peers fehlt.\n\nOhne diese tx kann der Trade nicht abgeschlossen werden. Die Funds wurden nicht gesperrt. Ihr Angebot ist für andere Trader noch immer verfügbar. Sie haben die Anbietergebühr also noch nicht verloren. Sie können diesen Trade zu den fehlgeschlagenen Trades verschieben. +portfolio.pending.failedTrade.missingDepositTx=Die Einzahlungstransaktion (die 2-of-2 Multisig-Transaktion) fehlt.\n\nOhne diese tx kann der Trade nicht abgeschlossen werden. Die Funds wurden noch nicht gesperrt aber die Trade-Gebühr wurde bezahlt. Sie können eine Anfrage für eine Rückerstattung der Trade-Gebühr hier einreichen: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nSie können diesen Trade gerne zu den fehlgeschlagenen Trades verschieben. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=Die verzögerte Auszahlungstransaktion fehlt aber die Funds wurden bereits in der Einzahlungstransaktion gesperrt.\n\nBitte senden Sie AUF KEINEN FALL die Fiat oder Altcoin Zahlung zum BTC Verkäufer, da ohne der verzögerten Auszahlungstransaktion keine Arbitration geöffnet werden kann. Stattdessen, öffnen Sie ein Mediations-Ticket mit Cmd/Strg+o. Der Mediator sollte vorschlagen, dass beide Peers die Sicherheitskaution zurückerstattet bekommen und der Verkäufer erhält auch den kompletten Trade-Betrag zurück. Durch diese Vorgehensweise entsteht kein Sicherheitsrisiko und es geht ausschließlich die Trade-Gebühr verloren.\n\nSie können eine Anfrage für eine Rückerstattung der verlorenen Trade-Gebühr hier einreichen: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Die verzögerte Auszahlungstransaktion fehlt aber die Funds wurden in der Einzahlungstransaktion gesperrt.\n\nWenn dem Käufer die verzögerte Auszahlungsstransaktion auch fehlt, wird er dazu aufgefordert die Zahlung NICHT zu senden und stattdessen ein Mediations-Ticket zu öffnen. Sie sollten auch ein Mediations-Ticket mit Cmd/Strg+o öffnen.\n\nWenn der Käufer die Zahlung noch nicht gesendet hat, wird der Mediator vorschlagen, dass beide Peers ihre Sicherheitskaution zurückerhalten. Der Verkäufer erhält den gesamten Trade-Betrag zurück. Ansonsten bekommt der Käufer den Trade-Betrag. \n\nSie können eine Anfrage für eine Rückerstattung der verlorenen Trade-Gebühr hier einreichen: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=Während der Ausführung des Trade-Protokolls ist ein Fehler aufgetreten.\n\nError: {0}\n\nEs kann sein, dass der Fehler nicht gravierend ist und der Trade ganz normal abgeschlossen werden kann. Wenn Sie unsicher sind, öffnen Sie ein Mediations-Ticket um Hilfe vom Bisq Mediator zu erhalten.\n\nWenn der Fehler gravierend war, kann der Trade nicht abgeschlossen werden und Sie haben vielleicht die Trade-Gebühr verloren. Sie können eine Anfrage für eine Rückerstattung der verlorenen Trade-Gebühr hier einreichen: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=Der Handelsvertrag ist nicht festgelegt.\n\nDer Trade kann nicht abgeschlossen werden und Sie haben möglicherweise die Trade-Gebühr verloren. Sollte das der Fall sein können Sie hier eine Rückerstattung für die verlorenen Trade-Gebühren beantragen: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.info.popup=Das Trade-Protokoll ist auf ein Problem gestoßen.\n\n{0} +portfolio.pending.failedTrade.txChainInvalid.moveToFailed=Das Trade-Protokoll ist auf ein gravierendes Problem gestoßen.\n\n{0}\n\nWollen Sie den Trade zu den fehlgeschlagenen Trades verschieben?\n\nSie können keine Mediation oder Arbitration für fehlgeschlagene Trades öffnen aber Sie können fehlgeschlagene Trades wieder zu den offenen Trades zurückverschieben. +portfolio.pending.failedTrade.txChainValid.moveToFailed=Das Trade-Protokoll ist auf ein Problem gestoßen.\n\n{0}\n\nDie Transaktionen des Trades wurden veröffentlicht und die Funds wurden gesperrt. Verschieben Sie den Trade nur zu den fehlgeschlagenen Trades wenn Sie sicher sind. Möglicherweise kann dies die Lösung des Problems verhindern.\n\nWollen Sie den Trade zu den fehlgeschlagenen Trades verschieben?\n\nSie können keine Mediation oder Arbitration für fehlgeschlagene Trades öffnen aber Sie können fehlgeschlagene Trades wieder zu den offenen Trades zurückverschieben. +portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Trade zu fehlgeschlagenen Trades verschieben. +portfolio.pending.failedTrade.warningIcon.tooltip=Klicken Sie hier um herauszufinden welche Probleme beim Trade aufgetreten sind. +portfolio.failed.revertToPending.popup=Wollen Sie diesen Trade zu den offenen Trades verschieben? +portfolio.failed.revertToPending=Trade zu den offenen Trades verschieben portfolio.closed.completed=Abgeschlossen portfolio.closed.ticketClosed=Vermittelt @@ -817,8 +808,8 @@ portfolio.closed.canceled=Abgebrochen portfolio.failed.Failed=Fehlgeschlagen portfolio.failed.unfail=Bevor Sie fortfahren, stellen Sie sicher, dass Sie ein Backup Ihres Datenverzeichnisses haben!\nWollen Sie diesen Trade wieder in offene Trades verschieben?\nDies ist eine Möglichkeit, Gelder freizugeben, die in einem gescheiterten Trade stecken geblieben sind. portfolio.failed.cantUnfail=Dieser Trade kann im Moment nicht wieder in offene Trades verschoben werden. \nVersuchen Sie es nach Abschluss des/der Trades erneut {0} -portfolio.failed.depositTxNull=The trade cannot be reverted to a open trade. Deposit transaction is null. -portfolio.failed.delayedPayoutTxNull=The trade cannot be reverted to a open trade. Delayed payout transaction is null. +portfolio.failed.depositTxNull=Der Trade kann nicht als offener Trade zurückgeändert werden. Einzahlungstransaktion ist ungültig. +portfolio.failed.delayedPayoutTxNull=Der Trade kann nicht als offener Trade zurückgeändert werden. Verzögerte Auszahlungstransaktion ist ungültig. #################################################################### @@ -839,6 +830,7 @@ funds.deposit.fundWallet=Ihre Wallet finanzieren funds.deposit.withdrawFromWallet=Gelder aus Wallet übertragen funds.deposit.amount=Betrag in BTC (optional) funds.deposit.generateAddress=Neue Adresse generieren +funds.deposit.generateAddressSegwit=Native segwit Format (Bech32) funds.deposit.selectUnused=Bitte wählen Sie eine ungenutzte Adresse aus der Tabelle oben, anstatt eine neue zu generieren. funds.withdrawal.arbitrationFee=Vermittlergebühr @@ -909,24 +901,24 @@ support.tab.mediation.support=Mediation support.tab.arbitration.support=Vermittlung support.tab.legacyArbitration.support=Legacy-Vermittlung support.tab.ArbitratorsSupportTickets={0} Tickets -support.filter=Search disputes +support.filter=Konflikte durchsuchen support.filter.prompt=Tragen sie Handel ID, Datum, Onion Adresse oder Kontodaten -support.sigCheck.button=Verify result -support.sigCheck.popup.info=In case of a reimbursement request to the DAO you need to paste the summary message of the mediation and arbitration process in your reimbursement request on Github. To make this statement verifiable any user can check with this tool if the signature of the mediator or arbitrator matches the summary message. -support.sigCheck.popup.header=Verify dispute result signature -support.sigCheck.popup.msg.label=Summary message -support.sigCheck.popup.msg.prompt=Copy & paste summary message from dispute -support.sigCheck.popup.result=Validation result -support.sigCheck.popup.success=Signature is valid -support.sigCheck.popup.failed=Signature verification failed -support.sigCheck.popup.invalidFormat=Message is not of expected format. Copy & paste summary message from dispute. +support.sigCheck.button=Ergebnis verifizieren +support.sigCheck.popup.info=Im Falle eines Rückerstattungsantrags an die DAO müssen Sie die Zusammenfassung des Mediations- und Vermittlungsverfahrens in Ihren Kostenerstattungsanfrage auf Github einfügen. Um diese Aussage überprüfbar zu machen, kann jeder Benutzer mit diesem Tool überprüfen, ob die Signatur des Mediators oder Vermittlers mit der Zusammenfassung übereinstimmt. +support.sigCheck.popup.header=Signatur des Konfliktergebnisses verifizieren +support.sigCheck.popup.msg.label=Zusammenfassende Nachricht +support.sigCheck.popup.msg.prompt=Zusammenfassende Meldung aus dem Konflikt-Fall kopieren und einfügen +support.sigCheck.popup.result=Validierungsergebnis +support.sigCheck.popup.success=Unterzeichnung ist gültig +support.sigCheck.popup.failed=Unterzeichnung der Signatur ist fehlgeschlagen +support.sigCheck.popup.invalidFormat=Nachricht ist nicht im erwarteten Format. Copy & paste Konflikt-Zusammenfassung. -support.reOpenByTrader.prompt=Are you sure you want to re-open the dispute? -support.reOpenButton.label=Re-open +support.reOpenByTrader.prompt=Sind Sie sicher, dass Sie den Konflikt wiedereröffnen möchten? +support.reOpenButton.label=Wiedereröffnen support.sendNotificationButton.label=Private Benachrichtigung -support.reportButton.label=Report -support.fullReportButton.label=All disputes +support.reportButton.label=Melden +support.fullReportButton.label=Alle Konflikte support.noTickets=Keine offenen Tickets vorhanden support.sendingMessage=Nachricht wird gesendet... support.receiverNotOnline=Empfänger ist nicht online. Nachricht wird in der Mailbox gespeichert. @@ -968,11 +960,11 @@ support.youOpenedDisputeForMediation=Sie haben um Mediation gebeten.\n\n{0}\n\nB support.peerOpenedTicket=Ihr Trading-Partner hat aufgrund technischer Probleme Unterstützung angefordert.\n\n{0}\n\nBisq-Version: {1} support.peerOpenedDispute=Ihr Trading-Partner hat einen Konflikt eröffnet.\n\n{0}\n\nBisq-Version: {1} support.peerOpenedDisputeForMediation=Ihr Trading-Partner hat eine Mediation beantragt.\n\n{0}\n\nBisq-Version: {1} -support.mediatorsDisputeSummary=System message: Mediator''s dispute summary:\n{0} +support.mediatorsDisputeSummary=Systemnachricht: Konflikt-Zusammenfassung des Mediators:\n{0} support.mediatorsAddress=Node-Adresse des Mediators: {0} -support.warning.disputesWithInvalidDonationAddress=The delayed payout transaction has used an invalid receiver address. It does not match any of the DAO parameter values for the valid donation addresses.\n\nThis might be a scam attempt. Please inform the developers about that incident and do not close that case before the situation is resolved!\n\nAddress used in the dispute: {0}\n\nAll DAO param donation addresses: {1}\n\nTrade ID: {2}{3} -support.warning.disputesWithInvalidDonationAddress.mediator=\n\nDo you still want to close the dispute? -support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nYou must not do the payout. +support.warning.disputesWithInvalidDonationAddress=Die verzögerte Auszahlungstransaktion hat eine ungültige Empfängeradresse verwendet. Sie stimmt mit keinem der DAO-Parameterwerte für die gültigen Spendenadressen überein.\n\nDies könnte ein Betrugsversuch sein. Bitte informieren Sie die Entwickler über diesen Vorfall und schließen Sie den Fall nicht ab, bevor die Situation geklärt ist!\n\nIn dem Konfliktfall verwendete Adresse: {0}\n\nAlle DAO-Param-Spendenadressen: {1}\n\nTrade-ID: {2}{3} +support.warning.disputesWithInvalidDonationAddress.mediator=\n\nWollen Sie den Konflikt trotzdem schließen? +support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nSie müssen nicht auszahlen. #################################################################### @@ -986,21 +978,20 @@ setting.preferences.general=Allgemeine Voreinstellungen setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=Max. Abweichung vom Marktpreis +setting.preferences.bsqAverageTrimThreshold=Auslöser-Schwellenwert für BSQ-Rate setting.preferences.avoidStandbyMode=Standby Modus verhindern -setting.preferences.autoConfirmXMR=XMR auto-confirm -setting.preferences.autoConfirmEnabled=Enabled -setting.preferences.autoConfirmRequiredConfirmations=Required confirmations -setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) -setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) +setting.preferences.autoConfirmXMR=XMR automatische Bestätigung +setting.preferences.autoConfirmEnabled=Aktiviert +setting.preferences.autoConfirmRequiredConfirmations=Benötigte Bestätigungen +setting.preferences.autoConfirmMaxTradeSize=Max. Trade-Höhe (BTC) +setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (verwendet Tor, außer localhost, LAN IP Adresse und *.local hostnames) setting.preferences.deviationToLarge=Werte größer als {0}% sind nicht erlaubt. -setting.preferences.txFee=Transaktionsgebühr zum Abheben (Satoshi/Byte) +setting.preferences.txFee=Auszahlungstransaktionsgebühr (satoshis/vbyte) setting.preferences.useCustomValue=Spezifischen Wert nutzen -setting.preferences.txFeeMin=Die Transaktionsgebühr muss mindestens {0} Satoshi/Byte betragen. -setting.preferences.txFeeTooLarge=Ihre Eingabe ist höher als jeder sinnvolle Wert (>5000 Satoshi/Byte). Transaktionsgebühren sind normalerweise 50-400 Satoshi/Byte. +setting.preferences.txFeeMin=Die Transaktionsgebühr muss mindestens {0} satoshis/vbyte betragen +setting.preferences.txFeeTooLarge=Ihre Eingabe ist höher als jeder sinnvolle Wert (>5000 satoshis/vbyte). Transaktionsgebühren sind normalerweise 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Ignorierte Peers [Onion Adresse:Port] -setting.preferences.refererId=Empfehlungs-ID setting.preferences.ignoreDustThreshold=Min. nicht-dust Ausgabewert -setting.preferences.refererId.prompt=Optionale Empfehlungs-ID: setting.preferences.currenciesInList=Währungen in Liste der Marktpreise setting.preferences.prefCurrency=Bevorzugte Währung setting.preferences.displayFiat=Nationale Währungen anzeigen @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=Animationen abspielen setting.preferences.useDarkMode=Nacht-Modus benutzen setting.preferences.sortWithNumOffers=Marktlisten nach Anzahl der Angebote/Trades sortieren setting.preferences.resetAllFlags=Alle \"Nicht erneut anzeigen\"-Häkchen zurücksetzen -setting.preferences.reset=Zurücksetzen settings.preferences.languageChange=Um den Sprachwechsel auf alle Bildschirme anzuwenden ist ein Neustart nötig. settings.preferences.supportLanguageWarning=Wenn es zu einem Streitfall kommen sollte, beachten Sie bitte, dass die Mediation in {0} und das Vermittlungsverfahren in {1} geregelt wird. -settings.preferences.selectCurrencyNetwork=Netzwerk auswählen setting.preferences.daoOptions=DAO-Optionen setting.preferences.dao.resyncFromGenesis.label=DAO-Zustand von der Genesis-Tx wiederherstellen setting.preferences.dao.resyncFromResources.label=DAO-Zustand aus Ressourcen wiederherstellen @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=Blockbenachrichtigung-Port setting.preferences.dao.fullNodeInfo=Um Bisq als DAO Fullnode laufen zu lassen, müssen Sie Bitcoin Core lokal laufen und RPC eingeschaltet haben. Alle Bedingungen sind in "{0}" dokumentiert.\n\nNach dem Ändern des Modus müssen Sie neu starten. setting.preferences.dao.fullNodeInfo.ok=Dokumentationsseite öffnen setting.preferences.dao.fullNodeInfo.cancel=Nein, ich möchte weiterhin den Lite Node Modus verwenden +settings.preferences.editCustomExplorer.headline=Explorer-Einstellungen +settings.preferences.editCustomExplorer.description=Wählen Sie einen systemdefinierten Explorer aus der Liste auf der linken Seite aus und/oder passen Sie ihn an Ihre eigenen Vorlieben an. +settings.preferences.editCustomExplorer.available=Verfügbare Explorer +settings.preferences.editCustomExplorer.chosen=Ausgewählte Explorer-Einstellungen +settings.preferences.editCustomExplorer.name=Name +settings.preferences.editCustomExplorer.txUrl=Transaktion-URL +settings.preferences.editCustomExplorer.addressUrl=Adresse-URL settings.net.btcHeader=Bitcoin-Netzwerk settings.net.p2pHeader=Bisq-Netzwerk @@ -1044,7 +1040,7 @@ settings.net.bitcoinNodesLabel=Mit Bitcoin-Core-Knoten verbinden settings.net.useProvidedNodesRadio=Bereitgestellte Bitcoin-Core-Knoten verwenden settings.net.usePublicNodesRadio=Öffentliches Bitcoin-Netzwerk benutzen settings.net.useCustomNodesRadio=Spezifische Bitcoin-Core-Knoten verwenden -settings.net.warn.usePublicNodes=Falls Sie das öffentliche Bitcoin-Netzwerk verwenden sind Sie einem schwerwiegenden Datenschutzproblem ausgesetzt durch das fehlerhafte Design und Implementierung des Bloom Filters in SPV-Wallets wie BitcoinJ (verwendet in Bisq). Jeder verbundene Bitcoin-Core-Knoten könnte herausfinden, dass alle Ihre Wallets-Adressen einer Person gehören.\n\nBitte informieren Sie sich dazu auf folgender Seite: https://bisq.network/blog/privacy-in-bitsquare.\n\nSind Sie sicher, dass Sie öffentliche Knoten verwenden möchten? +settings.net.warn.usePublicNodes=Wenn Sie das öffentliche Bitcoin Netzwerk verwenden, sind Sie den Privatsphäre-Probleme die durch das defekte Bloom Filter Design, das von SPV wallets wie BitcoinJ (verwendet von Bisq) verwendet wird, ausgesetzt. Jede Full Node mit der Sie sich verbinden könnte dadurch alle Adressen, die zu einer Entität gehören, herausfinden.\n\nWeitere Informationen finden Sie unter [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nSind Sie sicher, dass Sie die öffentlichen Nodes verwenden wollen? settings.net.warn.usePublicNodes.useProvided=Nein, bereitgestellte Knoten verwenden settings.net.warn.usePublicNodes.usePublic=Ja, öffentliches Netzwerk verwenden settings.net.warn.useCustomNodes.B2XWarning=Bitte stellen Sie sicher, dass Sie sich mit einem vertrauenswürdigen Bitcoin-Core-Knoten verbinden!\n\nWenn Sie sich mit Knoten verbinden, die gegen die Bitcoin Core Konsensus-Regeln verstoßen, kann es zu Problemen in Ihrer Wallet und im Verlauf des Handelsprozesses kommen.\n\nBenutzer die sich zu oben genannten Knoten verbinden, sind für den verursachten Schaden verantwortlich. Dadurch entstandene Konflikte werden zugunsten des anderen Teilnehmers entschieden. Benutzer die unsere Warnungen und Sicherheitsmechanismen ignorieren wird keine technische Unterstützung geleistet! @@ -1054,8 +1050,8 @@ settings.net.p2PPeersLabel=Verbundene Peers settings.net.onionAddressColumn=Onion-Adresse settings.net.creationDateColumn=Eingerichtet settings.net.connectionTypeColumn=Ein/Aus -settings.net.sentDataLabel=Sent data statistics -settings.net.receivedDataLabel=Received data statistics +settings.net.sentDataLabel=Daten-Statistiken senden +settings.net.receivedDataLabel=Daten-Statistiken empfangen settings.net.roundTripTimeColumn=Umlaufzeit settings.net.sentBytesColumn=Gesendet settings.net.receivedBytesColumn=Erhalten @@ -1068,8 +1064,8 @@ settings.net.heightColumn=Höhe settings.net.needRestart=Sie müssen die Anwendung neustarten, um die Änderungen anzuwenden.\nMöchten Sie jetzt neustarten? settings.net.notKnownYet=Noch nicht bekannt... -settings.net.sentData=Sent data: {0}, {1} messages, {2} messages/sec -settings.net.receivedData=Received data: {0}, {1} messages, {2} messages/sec +settings.net.sentData=Gesendete Daten: {0}, {1} Nachrichten, {2} Nachrichten/Sekunde +settings.net.receivedData=Empfangene Daten: {0}, {1} Nachrichten, {2} Nachrichten/Sekunde settings.net.ips=[IP Adresse:Port | Hostname:Port | Onion-Adresse:Port] (Komma getrennt). Port kann weggelassen werden, wenn Standard genutzt wird (8333). settings.net.seedNode=Seed-Knoten settings.net.directPeer=Peer (direkt) @@ -1091,8 +1087,8 @@ setting.about.support=Bisq unterstützen setting.about.def=Bisq ist keine Firma, sondern ein Gemeinschaftsprojekt, das offen für Mitwirken ist. Wenn Sie an Bisq mitwirken oder das Projekt unterstützen wollen, folgen Sie bitte den unten stehenden Links. setting.about.contribute=Mitwirken setting.about.providers=Datenanbieter -setting.about.apisWithFee=Bisq uses Bisq Price Indices for Fiat and Altcoin market prices, and Bisq Mempool Nodes for mining fee estimation. -setting.about.apis=Bisq uses Bisq Price Indices for Fiat and Altcoin market prices. +setting.about.apisWithFee=Bisq verwendet die Bisq Preis Indizes für Fiat und Altcoin Preise und die Bisq Mempool Nodes für die Abschätzung der Mining-Gebühr. +setting.about.apis=Bisq verwendet den Bisq Price Index für Fiat und Altcoin Preise. setting.about.pricesProvided=Marktpreise zur Verfügung gestellt von setting.about.feeEstimation.label=Geschätzte Mining-Gebühr bereitgestellt von setting.about.versionDetails=Versionsdetails @@ -1147,19 +1143,17 @@ setting.about.shortcuts.sendAlertMsg=Warnung oder Update per Nachricht senden (p setting.about.shortcuts.sendFilter=Filter einstellen (privilegierte Aktivität) setting.about.shortcuts.sendPrivateNotification=Private Benachrichtigung an Peer senden (privilegierte Aktivität) -setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} +setting.about.shortcuts.sendPrivateNotification.value=Öffnen Sie die Peer-Infos unter Avatar und klicken Sie: {0} -setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.headline=Neues automatisches Bestätigungs-Feature für XMR +setting.info.msg=Wenn Sie BTC für XMR verkaufen, können Sie die automatische Bestätigung aktivieren um nachzuprüfen ob die korrekte Menge an Ihr Wallet gesendet wurde. So kann Bisq den Trade automatisch abschließen und Trades dadurch für alle schneller machen.\n\nDie automatische Bestätigung überprüft die XMR Transaktion über mindestens 2 XMR Explorer Nodes mit dem privaten Transaktionsschlüssel den der Sender zur Verfügung gestellt hat. Bisq verwendet standardmäßig Explorer Nodes die von Bisq Contributors betrieben werden aber wir empfehlen, dass Sie für ein Maximum an Sicherheit und Privatsphäre Ihre eigene XMR Explorer Node betreiben.\n\nFür automatische Bestätigungen, können Sie die max. Höhe an BTC pro Trade und die Anzahl der benötigten Bestätigungen in den Einstellungen festlegen.\n\nFinden Sie weitere Informationen (und eine Anleitung wie Sie Ihre eigene Explorer Node aufsetzen) im Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=Vermittler-Registrierung account.tab.mediatorRegistration=Mediator-Registrierung account.tab.refundAgentRegistration=Registrierung des Rückerstattungsbeauftragten -account.tab.signing=Signing -account.tab.account=Konto +account.tab.signing=Unterzeichnung account.info.headline=Willkommen in Ihrem Bisq-Konto account.info.msg=Hier können Sie Trading-Konten für nationale Währungen und Altcoins hinzufügen und Backups für Ihre Wallets & Kontodaten erstellen.\n\nEine leere Bitcoin-Wallet wurde erstellt, als Sie das erste Mal Bisq gestartet haben.\n\nWir empfehlen, dass Sie Ihre Bitcoin-Wallet-Seed-Wörter aufschreiben (siehe Tab oben) und sich überlegen ein Passwort hinzuzufügen, bevor Sie einzahlen. Bitcoin-Einzahlungen und Auszahlungen werden unter \"Gelder\" verwaltet.\n\nHinweis zu Privatsphäre & Sicherheit: da Bisq eine dezentralisierte Börse ist, bedeutet dies, dass all Ihre Daten auf ihrem Computer bleiben. Es gibt keine Server und wir haben keinen Zugriff auf Ihre persönlichen Informationen, Ihre Gelder oder selbst Ihre IP-Adresse. Daten wie Bankkontonummern, Altcoin- & Bitcoinadressen, etc werden nur mit Ihrem Trading-Partner geteilt, um Trades abzuschließen, die Sie initiiert haben (im Falle eines Konflikts wird der Vermittler die selben Daten sehen wie Ihr Trading-Partner). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=Die Registrierung konnte nicht abg account.altcoin.yourAltcoinAccounts=Ihre Altcoin-Konten account.altcoin.popup.wallet.msg=Bitte stellen Sie sicher, dass Sie die Anforderungen für die Verwendung von {0} Wallets wie auf der {1} Webseite beschrieben erfüllen.\nDie Verwendung von Wallets von zentralisierten Börsen, bei denen (a) Sie Ihre Keys nicht kontrollieren oder (b) die keine kompatible Wallet-Software verwenden, ist riskant: Es kann zum Verlust der gehandelten Gelder führen!\nDer Mediator oder Vermittler ist kein {2} Spezialist und kann in solchen Fällen nicht helfen. account.altcoin.popup.wallet.confirm=Ich verstehe und bestätige, dass ich weiß, welche Wallet ich benutzen muss. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Der Handel mit UPX auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nFür das Senden von UPX müssen Sie entweder das offizielle uPlexa GUI-Wallet oder das uPlexa CLI-Wallet mit aktiviertem store-tx-info Flag verwenden (Standard in neuen Versionen). Bitte stellen Sie sicher, dass Sie auf den tx key zugreifen können, da dies bei einem Konfliktfall erforderlich wäre.\nuplexa-wallet-cli (verwenden Sie den Befehl get_tx_key)\nuplexa-wallet-gui (gehen Sie zum History Tab und klicken Sie auf (P) für den Zahlungsnachweis)\n\nBei normalen Blockexplorern ist der Transfer nicht verifizierbar.\n\nSie müssen dem Vermittler im Konfliktfall die folgenden Daten zur Verfügung stellen:\n- Der tx Private Key\n- Der Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Konfliktfall. Der UPX-Sender ist dafür verantwortlich, im Konfliktfall dem Vermittler die Verifizierung des UPX-Transfers nachzuweisen.\n\nEs ist keine Zahlungs-ID erforderlich, sondern nur die normale öffentliche Adresse.\nWenn Sie sich über diesen Prozess nicht sicher sind, besuchen Sie den uPlexa discord channel (https://discord.gg/vhdNSrV) oder den uPlexa Telegram Chat (https://t.me/uplexaOfficial), um weitere Informationen zu erhalten. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Der Handel mit ARQ auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nFür den Versand von ARQ müssen Sie entweder das offizielle ArQmA GUI-Wallet oder das ArQmA CLI-Wallet mit aktiviertem store-tx-info Flag verwenden (Standard in neuen Versionen). Bitte stellen Sie sicher, dass Sie auf den tx Key zugreifen können, da dies im Falle eines Konfliktes erforderlich wäre.\narqma-wallet-cli (verwenden Sie den Befehl get_tx_key)\narqma-wallet-gui (gehen Sie zur History Tab und klicken Sie auf (P) für den Zahlungsnachweis)\n\nBei normalen Blockexplorern ist der Transfer nicht verifizierbar.\n\nSie müssen dem Mediator oder Vermittler im Konfliktfall die folgenden Daten zur Verfügung stellen:\n- Der tx Private Key\n- Der Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Konfliktfall. Der ARQ-Sender ist im Fall eines Konflikts dafür verantwortlich, die Verifizierung des ARQ-Transfers dem Mediator oder Vermittler nachzuweisen.\n\nEs ist keine Zahlungs-ID erforderlich, sondern nur die normale öffentliche Adresse.\nWenn Sie sich über diesen Prozess nicht sicher sind, besuchen Sie den ArQmA Discord Channel (https://discord.gg/s9BQpJT) oder das ArQmA Forum (https://labs.arqma.com), um weitere Informationen zu erhalten. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Der Handel mit XMR auf Bisq setzt voraus, dass Sie die folgende Anforderung verstehen.\n\nWenn Sie XMR verkaufen, müssen Sie in der Lage sein, einem Mediator oder Vermittler im Falle eines Konflikts die folgenden Informationen zur Verfügung zu stellen:\n- den Transaktionsschlüssel (Tx Key, Tx Secret Key oder Tx Private Key)\n- die Transaktions-ID (Tx ID oder Tx Hash)\n- die Zieladresse (Empfängeradresse)\n\nIm Wiki finden Sie Einzelheiten darüber, wo Sie diese Informationen in den populärsten Monero-Wallets finden [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nWerden die erforderlichen Transaktionsdaten nicht zur Verfügung gestellt, führt dies dazu, dass der Konflikt zu Ihrem Nachteil entschieden wird.\n\nBeachten Sie auch, dass Bisq jetzt eine automatische Bestätigung für XMR-Transaktionen anbietet, um Transaktionen schneller zu machen, aber Sie müssen dies in den Einstellungen aktivieren.\n\nWeitere Informationen über die automatische Bestätigungsfunktion finden Sie im Wiki: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Der Handel mit MSR auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nFür den Versand von MSR müssen Sie entweder das offizielle Masari GUI Wallet, das Masari CLI Wallet mit dem aktivierten store-tx-info Flag (standardmäßig aktiviert) oder das Masari Web Wallet (https://wallet.getmasari.org) verwenden. Bitte stellen Sie sicher, dass Sie auf den tx Key zugreifen können, da dies im Falle eines Konfliktes erforderlich wäre.\nmasari-wallet-cli (verwenden Sie den Befehl get_tx_key)\nmasari-wallet-gui (gehen Sie zur History Tab und klicken Sie auf (P) für den Zahlungsnachweis).\n\nMasari Web Wallet (gehen Sie zum Konto -> Transaktionshistorie und lassen Sie Details zu Ihrer gesendeten Transaktion anzeigen)\n\nDie Verifizierung kann im Wallet durchgeführt werden.\nmasari-wallet-cli : mit dem Befehl (check_tx_key).\nmasari-wallet-gui : auf der Seite Advanced > Prove/Check.\nDie Verifizierung kann im Block-Explorer durchgeführt werden. \nÖffnen Sie den Block-Explorer (https://explorer.getmasari.org), verwenden Sie die Suchleiste, um Ihren Transaktionshash zu finden.\nSobald die Transaktion gefunden wurde, scrollen Sie nach unten zum Bereich 'Prove Sending' und geben Sie bei Bedarf Details ein.\nSie müssen dem Mediator oder Vermittler im Konfliktfall die folgenden Daten zur Verfügung stellen:\n- Den tx Private Key\n- Den Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Konfliktfall. Der MSR-Sender ist im Fall eines Konflikts dafür verantwortlich, die Verifizierung des MSR-Transfers dem Mediator oder Vermittler nachzuweisen.\n\nEs ist keine Zahlungs-ID erforderlich, sondern nur die normale öffentliche Adresse.\nWenn Sie sich über diesen Prozess nicht sicher sind, fragen Sie um Hilfe auf der offiziellen Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Der Handel mit BLUR auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm BLUR zu senden, müssen Sie die Blur Network CLI oder GUI Wallet verwenden. \n\nWenn Sie die CLI-Wallet verwenden, wird nach dem Senden eines Transfers ein Transaktionshash (tx ID) angezeigt. Sie müssen diese Informationen speichern. Unmittelbar nach dem Senden des Transfers müssen Sie den Private Key der Transaktion mit dem Befehl 'get_tx_key' ermitteln. Wenn Sie diesen Schritt nicht ausführen, können Sie den Key möglicherweise später nicht mehr abrufen. \n\nWenn Sie das Blur Network GUI Wallet verwenden, können Sie problemlos den Private Key der Transaktion und die Transaktion-ID im "History" Tab finden. Suchen Sie sofort nach dem Absenden die Transaktion, die von Interesse ist. Klicken Sie auf das Symbol "?" in der unteren rechten Ecke des Feldes, das die Transaktion enthält. Sie müssen diese Informationen speichern. \n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1.) die Transaktions-ID, 2.) den Private Key der Transaktion und 3.) die Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den BLUR-Transfer mit dem Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, verlieren Sie den Konfliktfall. In allen Konfliktfällen trägt der BLUR-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler. \n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq. Als Erstes suchen Sie Hilfe im Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Der Handel mit Solo auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm Solo zu senden, müssen Sie das Solo Network CLI Wallet verwenden. \n\nWenn Sie das CLI-Wallet verwenden, wird nach dem Senden eines Transfers ein Transaktionshash (tx ID) angezeigt. Sie müssen diese Informationen speichern. Unmittelbar nach dem Senden des Transfers müssen Sie den Private Key der Transaktion mit dem Befehl 'get_tx_key' ermitteln. Wenn Sie diesen Schritt nicht ausführen, können Sie den Key möglicherweise später nicht mehr abrufen.\n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1.) die Transaktion-ID, 2.) den Private Key der Transaktion und 3.) die Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den Solo-Transfer mit dem Solo Block Explorer, indem er nach der Transaktion sucht und dann die Funktion "Senden nachweisen" (https://explorer.minesolo.com/) verwendet.\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, verlieren Sie den Konfliktfall. In allen Konfliktfällen trägt der Solo-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler. \n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq. Suchen Sie zuerst Hilfe im Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Der Handel mit CASH2 auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm CASH2 zu versenden, müssen Sie die Cash2 Wallet Version 3 oder höher verwenden. \n\nNachdem eine Transaktion gesendet wurde, wird die Transaktions-ID angezeigt. Sie müssen diese Informationen speichern. Unmittelbar nach dem Senden der Transaktion müssen Sie den Befehl 'getTxKey' in simplewallet verwenden, um den Secret Key der Transaktion abzurufen. \n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1) die Transaktions-ID, 2) den Secret Key der Transaktion und 3) die Cash2-Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den CASH2-Transfer mit dem Cash2 Block Explorer (https://blocks.cash2.org).\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, werden Sie den Konfliktfall verlieren. In allen Konfliktfällen trägt der CASH2-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler.\n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq, sondern suchen Sie zunächst Hilfe im Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Der Handel mit Qwertycoin auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm QWC zu versenden, müssen Sie die offizielle QWC Wallet Version 5.1.3 oder höher verwenden. \n\nNachdem eine Transaktion gesendet wurde, wird die Transaktions-ID angezeigt. Sie müssen diese Informationen speichern. Unmittelbar nach dem Senden der Transaktion müssen Sie den Befehl 'get_Tx_Key' in simplewallet verwenden, um den Secret Key der Transaktion abzurufen. \n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1) die Transaktions-ID, 2) den Secret Key der Transaktion und 3) die QWC-Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den QWC-Transfer mit dem QWC Block Explorer (https://explorer.qwertycoin.org).\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, werden Sie den Konfliktfall verlieren. In allen Konfliktfällen trägt der QWC-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler.\n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq, sondern suchen Sie zunächst Hilfe im QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Der Handel mit Dragonglass auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nAufgrund der Privatsphäre, die Dragonglass bietet, ist eine Transaktion auf der Public Blockchain nicht verifizierbar. Bei Bedarf können Sie Ihre Zahlung durch die Verwendung Ihres TXN-Private-Key nachweisen.\nDer TXN-Private Key ist ein einmaliger Schlüssel, der automatisch für jede Transaktion generiert wird, auf die Sie nur über Ihre DRGL-Wallet zugreifen können - entweder über die DRGL-Wallet GUI (im Transaktionsdetaildialog) oder über die Dragonglass CLI simplewallet (mit dem Befehl "get_tx_key").\n\nDRGL-Version "Oathkeeper" und höher sind für beide ERFORDERLICH.\n\nIm Konfliktfall müssen Sie dem Mediator oder Vermittler die folgenden Daten zur Verfügung stellen:\n- Den TXN-Private-Key\n- Den Transaktionshash\n- Die öffentliche Adresse des Empfängers\n\nDie Verifizierung der Zahlung kann mit den oben genannten Daten als Eingabe unter (http://drgl.info/#check_txn) erfolgen.\n\nWenn Sie die oben genannten Daten nicht angeben oder wenn Sie eine inkompatible Wallet verwendet haben, verlieren Sie den Klärungsfall. Der Dragonglass-Sender ist für die Verifizierung des DRGL-Transfers gegenüber dem Mediator oder Vermittler im Konfliktfall verantwortlich. Die Verwendung einer PaymentID ist nicht erforderlich.\n\nWenn Sie sich über irgendeinen Teil dieses Prozesses unsicher sind, besuchen Sie Dragonglass auf Discord (http://discord.drgl.info) um Hilfe zu erhalten. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=Bei der Verwendung von Zcash können Sie nur die transparenten Adressen (beginnend mit t) verwenden, nicht die z-Adressen (privat), da der Mediator oder Vermittler nicht in der Lage wäre, die Transaktion mit z-Adressen zu verifizieren. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=Bei der Verwendung von Zcoin können Sie nur die transparenten (rückverfolgbaren) Adressen verwenden, nicht die nicht rückverfolgbaren Adressen, da der Mediator oder Vermittler nicht in der Lage wäre, die Transaktion mit nicht rückverfolgbaren Adressen in einem Block-Explorer zu verifizieren. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN benötigt einen interaktiven Prozess zwischen Sender und Empfänger, um die Transaktion zu erstellen. Stellen Sie sicher, den Anweisungen der GRIN Projekt Webseite zu folgen, um zuverlässig GRIN zu senden und empfangen (der Empfänger muss oinline oder wenigstens während eines gewissen Zeitfensters). \n\nBisq unterstützt nur das Grinbox (Wallet713) Wallet URL Format. \n\nDer GRIN Sender muss beweisen können, die GRIN erfolgreich gesendet zu haben. Wenn die Wallet dies nicht kann, wird ein potentieller Konflikt zugunsten des GRIN Empfängers entschieden. Bitte stellen Sie sicher, dass Sie die letzte Grinbox Software nutzen, die den Transaktionsbeweis unterstützt, und Sie den Prozess verstehen, wie GRIN gesendet und empfangen wird, sowie wie man den Beweis erstellt. \n\nBeachten Sie https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only für weitere Informationen über das Grinbox proof tool. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAM benötigt einen interaktiven Prozess zwischen Sender und Empfänger, um die Transaktion zu erstellen.\n\nStellen Sie sicher, den Anweisungen der BEAM Projekt Webseite zu folgen, um zuverlässig BEAM zu senden und empfangen (der Empfänger muss oinline oder wenigstens während eines gewissen Zeitfensters). \n\nDer BEAM Sender muss beweisen können, die BEAM erfolgreich gesendet zu haben. Bitte stellen Sie sicher, dass Sie Wallet Software verwenden, die solche Beweise erstellen kann. Falls Die Wallet den Beweis nicht erstellen kann, wird ein potentieller Konflikt zugunsten des BEAM Empfängers entschieden. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Der Handel mit ParsiCoin auf Bisq setzt voraus, dass Sie die folgenden Anforderungen verstehen und erfüllen:\n\nUm PARS zu versenden, müssen Sie die offizielle ParsiCoin Wallet Version 3.0.0 oder höher verwenden. \n\nSie können Ihren Transaktionshash und Transaktionsschlüssel im Bereich Transaktionen in Ihrer GUI-Wallet (ParsiPay) überprüfen. Sie müssen mit der rechten Maustaste auf die Transaktion und dann auf Details anzeigen klicken.\n\nFalls ein Vermittlungsverfahren erforderlich ist, müssen Sie einem Mediator oder Vermittler Folgendes vorlegen: 1) den Transaktionshash, 2) den Transaktionsschlüssel und 3) die PARS-Adresse des Empfängers. Der Mediator oder Vermittler überprüft dann den PARS-Transfer mit dem ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nWenn Sie dem Mediator oder Vermittler nicht die erforderlichen Informationen zur Verfügung stellen, werden Sie den Konfliktfall verlieren. In allen Konfliktfällen trägt der ParsiCoin-Sender 100% der Verantwortung für die Verifizierung von Transaktionen gegenüber einem Mediator oder Vermittler. \n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie nicht auf Bisq, sondern suchen Sie zunächst Hilfe im ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=Um "Burnt Blackcoins" zu handeln, müssen Sie folgendes wissen:\n\nBurnt Blackcoins können nicht ausgegeben werden. Um sie auf Bisq zu handeln, müssen die Ausgabeskripte in der Form vorliegen: OP_RETURN OP_PUSHDATA, gefolgt von zugehörigen Datenbytes, die nach der Hex-Codierung Adressen darstellen. Beispielsweise haben Burnt Blackcoins mit der Adresse 666f6f ("foo" in UTF-8) das folgende Skript:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nUm Burnt Blackcoins zu erstellen, kann man den in einigen Wallets verfügbaren RPC-Befehl "burn" verwenden.\n\nFür mögliche Anwendungsfälle kann man einen Blick auf https://ibo.laboratorium.ee werfen.\n\nDa Burnt Blackcoins nicht ausgegeben werden können, können sie nicht wieder verkauft werden. "Verkaufen" von Burnt Blackcoins bedeutet, gewöhnliche Blackcoins zu verbrennen (mit zugehörigen Daten entsprechend der Zieladresse).\n\nIm Konfliktfall hat der BLK-Verkäufer den Transaktionshash zur Verfügung zu stellen. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Das Trading mit L-BTC auf Bisq setzt voraus, dass Sie Folgendes verstehen:\n\nWenn Sie L-BTC für einen Trade auf Bisq erhalten, können Sie nicht die mobile Blockstream Green Wallet App oder eine Custodial/Exchange Wallet verwenden. Sie dürfen L-BTC nur in der Liquid Elements Core Wallet oder eine andere L-BTC-Wallet erhalten, die es Ihnen ermöglicht, den Blinding Key für Ihre verdeckte L-BTC-Adresse zu erhalten.\n\nFalls eine Mediation erforderlich ist oder ein Trade-Konflikt entsteht, müssen Sie den Blinding Key für Ihre L-BTC-Empfangsadresse dem Bisq-Mediator oder dem Refund Agent mitteilen, damit dieser die Details Ihrer vertraulichen Transaktion auf seinem eigenen Elements Core Full Node überprüfen kann.\n\nWenn Sie dem Mediator oder Refund Agent die erforderlichen Informationen nicht zur Verfügung stellen, führt dies dazu, dass Sie den Streitfall verlieren. In allen Streitfällen trägt der L-BTC-Empfänger 100 % der Verantwortung für die Bereitstellung kryptographischer Beweise an den Mediator oder den Refund Agent.\n\nWenn Sie diese Anforderungen nicht verstehen, sollten Sie nicht mit L-BTC auf Bisq traden. account.fiat.yourFiatAccounts=Ihre Nationalen Währungskonten @@ -1213,7 +1222,6 @@ account.backup.location=Speicherort des Backups account.backup.selectLocation=Speicherort des Backups wählen account.backup.backupNow=Backup jetzt erstellen (Backup ist nicht verschlüsselt!) account.backup.appDir=Verzeichnis der Anwendungsdaten -account.backup.logFile=Protokolldatei account.backup.openDirectory=Verzeichnis öffnen account.backup.openLogFile=Protokolldatei öffnen account.backup.success=Backup erfolgreich gespeichert in:\n{0} @@ -1227,7 +1235,7 @@ account.password.info=Mit Passwortschutz müssen Sie Ihr Passwort eingeben, sowo account.seed.backup.title=Backup der Seed-Wörter Ihrer Wallet erstellen account.seed.info=Bitte schreiben Sie die sowohl Seed-Wörter als auch das Datum auf! Mit diesen Seed-Wörtern und dem Datum können Sie Ihre Wallet jederzeit wiederherstellen.\nDie Seed-Wörter werden für die BTC- und BSQ-Wallet genutzt.\n\nSchreiben Sie die Seed-Wörter auf ein Blatt Papier schreiben und speichern Sie sie nicht auf Ihrem Computer.\n\nBitte beachten Sie, dass die Seed-Wörter KEIN Ersatz für ein Backup sind.\nSie müssen ein Backup des gesamten Anwendungsverzeichnisses unter \"Konto/Backup\" erstellen, um den ursprünglichen Zustand der Anwendung wiederherstellen zu können.\nDas Importieren der Seed-Wörter wird nur für Notfälle empfohlen. Die Anwendung wird ohne richtiges Backup der Datenbankdateien und Schlüssel nicht funktionieren! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=Bitte beachten Sie, dass die Seed Wörter kein Ersatz für ein Backup sind.\nSie müssen ein Backup vom gesamten Anwendungs-Verzeichnis vom \"Account/Backup\" Pfad machen um den Status und die Dateien der Anwendung wiederherzustellen. \nDie Seed Wörter zu importieren wird nur für Notfälle empfohlen. Die Anwendung wird ohne ordnungsgemäßes Backup der Dateien und Schlüssel nicht funktionieren!\n\nWeitere Informationen finden Sie auf der Wiki-Seite [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. account.seed.warn.noPw.msg=Sie haben kein Wallet-Passwort festgelegt, was das Anzeigen der Seed-Wörter schützen würde.\n\nMöchten Sie die Seed-Wörter jetzt anzeigen? account.seed.warn.noPw.yes=Ja, und nicht erneut fragen account.seed.enterPw=Geben Sie Ihr Passwort ein um die Seed-Wörter zu sehen @@ -1241,14 +1249,11 @@ account.seed.restore.ok=Ok, mache die Wiederherstellung und fahre Bisq herunter account.notifications.setup.title=Konfiguration account.notifications.download.label=Mobile App herunterladen -account.notifications.download.button=Download account.notifications.waitingForWebCam=Warte auf Webcam... account.notifications.webCamWindow.headline=Scanne QR-Code vom Smartphone account.notifications.webcam.label=Nutze Webcam account.notifications.webcam.button=QR-Code scannen account.notifications.noWebcam.button=Ich habe keine Webcam -account.notifications.testMsg.label=Test-Benachrichtigung senden -account.notifications.testMsg.title=Test account.notifications.erase.label=Benachrichtigungen von Smartphone löschen account.notifications.erase.title=Benachrichtigungen leeren account.notifications.email.label=Kopplungs-Token @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=Prozentualer Abstand zum Marktp account.notifications.marketAlert.addButton=Angebotsalarme hinzufügen account.notifications.marketAlert.manageAlertsButton=Angebotsalarme verwalten account.notifications.marketAlert.manageAlerts.title=Angebotsalarme verwalten -account.notifications.marketAlert.manageAlerts.label=Angebotsalarme -account.notifications.marketAlert.manageAlerts.item=Angebotsalarm für {0} Angebot mit Triggerpreis {1} und Zahlungskonto {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=Zahlungskonto account.notifications.marketAlert.manageAlerts.header.trigger=Triggerpreis account.notifications.marketAlert.manageAlerts.header.offerType=Angebotstyp @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=Guthaben aller unbestätigten Transaktionen (warte auf dao.lockedForVoteBalance=Zum wählen genutzt dao.lockedInBonds=In Kopplungen gesperrt dao.availableNonBsqBalance=Verfügbares nicht-BSQ-Guthaben (BTC) -dao.totalBsqBalance=Gesamtes BSQ-Guthaben dao.reputationBalance=Merit-Wert (nicht ausgabefähig) dao.tx.published.success=Ihre Transaktion wurde erfolgreich veröffentlicht. @@ -1455,11 +1457,6 @@ dao.param.currentValue=Aktueller Wert: {0} dao.param.currentAndPastValue=Aktueller Wert: {0} (Wert, als der Vorschlag gemacht wurde: {1}) dao.param.blocks={0} Blöcke -dao.results.cycle.duration.label=Dauer von {0} -dao.results.cycle.duration.value={0} Blöcke(Block) -dao.results.cycle.value.postFix.isDefaultValue=(Standard Wert) -dao.results.cycle.value.postFix.hasChanged=(Wurde in Wahl geändert) - dao.results.invalidVotes=Wir hatten in diesem Abstimmungszyklus ungültige Stimmen. Das kann passieren, wenn eine Abstimmung im Bisq-Netzwerk nicht gut verteilt wurde.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=Salt dao.bond.reputation.hash=Hash dao.bond.reputation.lockupButton=Sperren dao.bond.reputation.lockup.headline=Sperrung-Transaktion bestätigen -dao.bond.reputation.lockup.details=Gesperrter Betrag: {0}\nEntsperrzeit: {1} Block(Blöcke) (≈{2})\n\nMining-Gebühr: {3} ({4} Satoshis/Byte)\nTransaktionsgröße: {5} Kb\n\nSind Sie sicher, dass Sie fortfahren möchten? +dao.bond.reputation.lockup.details=Gesperrter Betrag: {0}\nEntsperrzeit: {1} Block(Blöcke) (≈{2})\n\nMining-Gebühr: {3} ({4} satoshis/vbyte)\nTransaktionsgröße (vsize): {5} Kb\n\nSind Sie sicher, dass Sie fortfahren möchten?? dao.bond.reputation.unlock.headline=Entsperrung-Transaktion bestätigen -dao.bond.reputation.unlock.details=Entsperrter Betrag: {0}\nEntsperrzeit: {1} Block(Blöcke) (≈{2})\n\nMining-Gebühr: {3} ({4} Satoshis/Byte)\nTransaktionsgröße: {5} Kb\n\nSind Sie sicher, dass Sie fortfahren möchten? +dao.bond.reputation.unlock.details=Entsperrter Betrag: {0}\nEntsperrzeit: {1} Block(Blöcke) (≈{2})\n\nMining-Gebühr: {3} ({4} Satoshis/vbyte)\nTransaktionsgröße (vsize): {5} Kb\n\nSind Sie sicher, dass Sie fortfahren möchten? dao.bond.allBonds.header=Alle Pfänder @@ -1588,7 +1585,7 @@ dao.bond.bondedRoleType.BTC_NODE_OPERATOR=Bitcoin-Node Betreiber # suppress inspection "UnusedProperty" dao.bond.bondedRoleType.MARKETS_OPERATOR=Betreiber der Handelsstatistik Webseite # suppress inspection "UnusedProperty" -dao.bond.bondedRoleType.BSQ_EXPLORER_OPERATOR=Explorer operator +dao.bond.bondedRoleType.BSQ_EXPLORER_OPERATOR=Explorer Operator # suppress inspection "UnusedProperty" dao.bond.bondedRoleType.MOBILE_NOTIFICATIONS_RELAY_OPERATOR=Mobile Benachrichtigung Weiterleitung Betreiber # suppress inspection "UnusedProperty" @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=Unterzeichnen dao.proofOfBurn.message=Nachricht dao.proofOfBurn.sig=Signatur dao.proofOfBurn.verify=Bestätigen -dao.proofOfBurn.verify.header=Verifiziere Nachricht mit Schlüssel vom Nachweis der Verbrennung dao.proofOfBurn.verificationResult.ok=Überprüfung erfolgreich dao.proofOfBurn.verificationResult.failed=Überprüfung fehlgeschlagen @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Exakter GitHub-Benutzername  dao.proposal.display.link=Link zu detaillierten Infos dao.proposal.display.link.prompt=Link zu Vorschlag dao.proposal.display.requestedBsq=Gelder in BSQ anfordern -dao.proposal.display.bsqAddress=BSQ Adresse dao.proposal.display.txId=Antrag Transaktion-ID: dao.proposal.display.proposalFee=Vorschlag-Gebühr dao.proposal.display.myVote=Meine Wahl dao.proposal.display.voteResult=Zusammenfassung des Wahlergebnisses dao.proposal.display.bondedRoleComboBox.label=Typ der Rolle mit Pfand dao.proposal.display.requiredBondForRole.label=Benötigter Pfand für Rolle -dao.proposal.display.tickerSymbol.label=Symbol für Ticker dao.proposal.display.option=Option dao.proposal.table.header.proposalType=Vorschlagtyp dao.proposal.table.header.link=Link dao.proposal.table.header.myVote=Meine Wahl +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=Entfernen dao.proposal.table.icon.tooltip.removeProposal=Antrag entfernen dao.proposal.table.icon.tooltip.changeVote=Aktuelles Votum: ''{0}''. Votum abändern zu: ''{1}'' @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=Mein Guthaben der Handels-Wallet dao.wallet.receive.fundYourWallet=Ihre BSQ Empfangs-Adresse dao.wallet.receive.bsqAddress=Adresse der BSQ-Wallet (Neue ungebrauchte Adresse) -dao.wallet.receive.dao.headline=Der Bisq DAO -dao.wallet.receive.daoInfo=Genauso wie der Bisq Handelsplatz dezentral und resistent gegen Zensur ist, ist auch die Führung der DAO - die Bisq DAO und der BSQ Token machen es möglich. -dao.wallet.receive.daoInfo.button=Erfahren Sie mehr über den Bisq DAO -dao.wallet.receive.daoTestnetInfo=Die Bisq DAO wurde im Mainnet noch nicht veröffentlicht, jedoch können sie die Bisq DAO in unserem Testnet ausprobieren. -dao.wallet.receive.daoTestnetInfo.button=Wie sie die Bisq DAO in unserem Testnet verwenden -dao.wallet.receive.daoContributorInfo=Falls sie zu Bisq beigetragen haben, verwenden sie die unterstehende BSQ Adresse um einen Antrag Teil der BSQ Genesis Transaktion zu sein. -dao.wallet.receive.daoContributorInfo.button=Wie sie Teil der BSQ Genesis Verteilung werden - dao.wallet.send.sendFunds=Gelder senden dao.wallet.send.sendBtcFunds=Sende nicht-BSQ-Gelder (BTC) dao.wallet.send.amount=Betrag in BSQ dao.wallet.send.btcAmount=Betrag in BTC (nicht-BSQ-Gelder) dao.wallet.send.setAmount=Betrag zum Abheben festlegen (Min­dest­be­trag ist {0}) -dao.wallet.send.setBtcAmount=Betrag in BTC zum Abheben festlegen (Min­dest­be­trag ist {0}) dao.wallet.send.receiverAddress=Adresse des BSQ Empfängers dao.wallet.send.receiverBtcAddress=Adresse des BTC Empfängers dao.wallet.send.setDestinationAddress=Tragen Sie Ihre Zieladresse ein dao.wallet.send.send=BSQ-Gelder senden dao.wallet.send.sendBtc=BTC-Gelder senden dao.wallet.send.sendFunds.headline=Abhebeanfrage bestätigen -dao.wallet.send.sendFunds.details=Sende: {0}\nAn Empfangsadresse: {1}\nBenötigte Transaktionsgebühr ist: {2} ({3} Satoshis/Byte)\nTransaktionsgröße: {4} Kb\n\nDer Empfänger erhält: {5}\n\nSind Sie sicher, dass Sie diesen Betrag abheben wollen? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=Synchronisiert bis Block: {0} dao.wallet.chainHeightSyncing=Erwarte Blöcke... {0} von {1} Blöcken verifiziert dao.wallet.tx.type=Typ @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=Du hast nicht ausreichend BTC, um die V dao.proposal.create.missingIssuanceFunds=Sie haben nicht ausreichend BTC, um die Vorschlags-Transaktion zu erstellen. Jede BSQ-Transaktion benötigt eine Mining-Gebühr in BTC, Ausgabetransaktionen brauchen auch BTC für den angefragten BSQ Betrag ({0} Satoshis/BSQ).\nEs fehlen: {1} dao.feeTx.confirm=Bestätige {0} Transaktion -dao.feeTx.confirm.details={0} Gebühr: {1}\nMining-Gebühr: {2} ({3} Satoshis/Byte)\nTransaktionsgröße: {4} Kb\n\nSind Sie sicher, dass Sie die {5} Transaktion senden wollen? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0} Gebühr: {1}\nBenötigte BTC für die BSQ Ausgabe: {2} ({3} Satoshis/BSQ)\nMining-Gebühr: {4} ({5} Satoshis/Byte)\nTransaktionsgröße: {6} Kb\n\nFalls Ihre Anfrage angenommen wird, erhalten Sie den angefragten Betrag minus die 2 BSQ Vorschlaggebühren.\n\nSind Sie sicher, dass Sie die {7} Transaktion veröffentlichen wollen? +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=DER BISQ DAO dao.news.bisqDAO.description=Genauso wie der Bisq Handelsplatz dezentral und resistent gegen Zensur ist, ist auch die Führung der DAO - die Bisq DAO und der BSQ Token machen es möglich. @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=Anzahl geheimer Wahlen dao.factsAndFigures.menuItem.supply=Angebot an BSQ dao.factsAndFigures.menuItem.transactions=BSQ Transaktionen -dao.factsAndFigures.dashboard.marketPrice=Marktdaten -dao.factsAndFigures.dashboard.price=Aktueller BSQ/BTC Handelspreis (in Bisq) dao.factsAndFigures.dashboard.avgPrice90=90 Tage durchschnittlicher BSQ/BTC-Handelspreis dao.factsAndFigures.dashboard.avgPrice30=30 Tage durchschnittlicher BSQ/BTC-Handelspreis dao.factsAndFigures.dashboard.avgUSDPrice90=90 Tage volumengewichteter durchschnittlicher USD/BSQ Trade-Preis @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=Später herunterladen displayUpdateDownloadWindow.button.ignoreDownload=Diese Version ignorieren displayUpdateDownloadWindow.headline=Ein neues Bisq-Update ist verfügbar! displayUpdateDownloadWindow.download.failed.headline=Download fehlgeschlagen -displayUpdateDownloadWindow.download.failed=Download fehlgeschlagen.\nBitte laden sie die Datei manuell von https://bisq.network/downloads herunter und überprüfen sie sie. -displayUpdateDownloadWindow.installer.failed=Der gewünschte Installer wurde nicht gefunden. Bitte laden sie die Datei manuell von https://bisq.network/downloads herunter und überprüfen sie sie. -displayUpdateDownloadWindow.verify.failed=Überprüfung fehlgeschlagen.\nBitte laden sie die Datei manuell von https://bisq.network/downloads herunter und überprüfen Sie sie. +displayUpdateDownloadWindow.download.failed=Download fehlgeschlagen.\nBitte downloaden Sie und verifizieren Sie manuell unter [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unfähig den richtigen Installer zu bestimmen. Bitte downloaden und verifizieren Sie manuell unter [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verifikation fehlgeschlagen.\nBitte downloaden Sie und verifizieren Sie manuell unter [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=Die neue Version wurde erfolgreich heruntergeladen und die Signatur überprüft.\n\nBitte öffnen Sie das Downloadverzeichnis, schließen die Anwendung und installieren die neue Version. displayUpdateDownloadWindow.download.openDir=Downloadverzeichnis öffnen @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=Auszahlung des Handelsbetrags disputeSummaryWindow.payout.getsTradeAmount=Der BTC-{0} erhält die Auszahlung des Handelsbetrags disputeSummaryWindow.payout.getsAll=Der BTC-{0} erhält alles disputeSummaryWindow.payout.custom=Spezifische Auszahlung -disputeSummaryWindow.payout.adjustAmount=Der eingegebene Betrag überschreitet den verfügbaren Betrag von {0}.\nDie Eingabe wurde auf den Maximalwert angepasst. disputeSummaryWindow.payoutAmount.buyer=Auszahlungsbetrag des Käufers disputeSummaryWindow.payoutAmount.seller=Auszahlungsbetrag des Verkäufers disputeSummaryWindow.payoutAmount.invert=Verlierer als Veröffentlicher nutzen @@ -2028,7 +2011,7 @@ disputeSummaryWindow.reason=Grund des Konflikts # suppress inspection "UnusedProperty" disputeSummaryWindow.reason.BUG=Fehler # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.USABILITY=Nutzbarkeit +disputeSummaryWindow.reason.USABILITY=Benutzerfreundlichkeit # suppress inspection "UnusedProperty" disputeSummaryWindow.reason.PROTOCOL_VIOLATION=Protokollverletzung # suppress inspection "UnusedProperty" @@ -2040,36 +2023,39 @@ disputeSummaryWindow.reason.OTHER=Andere # suppress inspection "UnusedProperty" disputeSummaryWindow.reason.BANK_PROBLEMS=Bank # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.OPTION_TRADE=Option trade +disputeSummaryWindow.reason.OPTION_TRADE=Option-Trade # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.SELLER_NOT_RESPONDING=Seller not responding +disputeSummaryWindow.reason.SELLER_NOT_RESPONDING=Verkäufer antwortet nicht # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.WRONG_SENDER_ACCOUNT=Wrong sender account +disputeSummaryWindow.reason.WRONG_SENDER_ACCOUNT=Falsches Sender-Konto # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.PEER_WAS_LATE=Peer was late +disputeSummaryWindow.reason.PEER_WAS_LATE=Peer war zu spät # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.TRADE_ALREADY_SETTLED=Trade already settled +disputeSummaryWindow.reason.TRADE_ALREADY_SETTLED=Trade wurde bereits festgelegt. disputeSummaryWindow.summaryNotes=Zusammenfassende Anmerkungen disputeSummaryWindow.addSummaryNotes=Zusammenfassende Anmerkungen hinzufügen disputeSummaryWindow.close.button=Ticket schließen # Do no change any line break or order of tokens as the structure is used for signature verification -disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.msg=Ticket geschlossen am {0}\n{1}Node Adresse: {2}\n\nZusammenfassung:\nTrade ID: {3}\nWährung: {4}\nTrade-Betrag: {5}\nAuszahlungsbetrag für den BTC Käufer: {6}\nAuszahlungsbetrag für den BTC Verkäufer: {7}\n\nGrund für den Konflikt: {8}\n\nWeitere Hinweise:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification disputeSummaryWindow.close.msgWithSig={0}{1}{2}{3} -disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and accept or reject suggestion from mediator -disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions +disputeSummaryWindow.close.nextStepsForMediation=\nNächster Schritt:\nTrade öffnen und Vorschlag des Mediators akzeptieren oder ablehnen. +disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNächster Schritt:\nSie müssen nichts weiteres machen. Wenn der Arbitrator in Ihrem Vorteil entscheidet, sehen Sie eine "Rückerstattung des Arbitratos"-Transaktion in Ihren Funds/Transaktionen disputeSummaryWindow.close.closePeer=Sie müssen auch das Ticket des Handelspartners schließen! disputeSummaryWindow.close.txDetails.headline=Rückerstattungstransaktion veröffentlichen +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=Käufer erhält {0} an Adresse: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=Verkäufer erhält {0} an Adresse: {1}\n -disputeSummaryWindow.close.txDetails=Ausgaben: {0}\n{1}{2}Transaktionsgebühr: {3} ({4} Satoshis/Byte)\nTransaktionsgröße: {5} Kb\n\nSind Sie sicher, dass Sie diese Transaktion veröffentlichen möchten? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? -disputeSummaryWindow.close.noPayout.headline=Close without any payout -disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? +disputeSummaryWindow.close.noPayout.headline=Ohne Auszahlung schließen +disputeSummaryWindow.close.noPayout.text=Wollen Sie schließen ohne eine Auszahlung zu tätigen? emptyWalletWindow.headline={0} Notfall-Wallets-Werkzeug emptyWalletWindow.info=Bitte nur in Notfällen nutzen, wenn Sie vom UI aus nicht auf Ihre Gelder zugreifen können.\n\nBeachten Sie bitte, dass alle offenen Angebote geschlossen werden, wenn Sie dieses Werkzeug verwenden.\n\nErstellen Sie ein Backup Ihres Dateiverzeichnisses, bevor Sie dieses Werkzeug verwenden. Dies können Sie unter \"Konto/Backup\" tun.\n\nBitte melden Sie uns das Problem und erstellen Sie einen Fehlerbericht auf GitHub oder im Bisq-Forum, damit wir feststellen können, was das Problem verursacht hat. @@ -2090,8 +2076,8 @@ filterWindow.onions=Herausgefilterte Onion-Adressen (durch Kommas getrennt) filterWindow.accounts=Herausgefilterte Handelskonten Daten:\nFormat: Komma getrennte Liste von [Zahlungsmethoden ID | Datenfeld | Wert] filterWindow.bannedCurrencies=Herausgefilterte Währungscodes (durch Kommas getrennt) filterWindow.bannedPaymentMethods=Herausgefilterte Zahlungsmethoden-IDs (durch Kommas getrennt) -filterWindow.bannedAccountWitnessSignerPubKeys=Filtered account witness signer pub keys (comma sep. hex of pub keys) -filterWindow.bannedPrivilegedDevPubKeys=Filtered privileged dev pub keys (comma sep. hex of pub keys) +filterWindow.bannedAccountWitnessSignerPubKeys=Gefilterte Pub Keys von unterzeichnenden Kontozeugen (durch Komma getrennte Hex der Pub Keys) +filterWindow.bannedPrivilegedDevPubKeys=Gefilterte privilegierte Dev Pub Keys (durch Komma getrennte Hex der Pub Keys) filterWindow.arbitrators=Gefilterte Vermittler (mit Komma getr. Onion-Adressen) filterWindow.mediators=Gefilterte Mediatoren (mit Komma getr. Onion-Adressen) filterWindow.refundAgents=Gefilterte Rückerstattungsagenten (mit Komma getr. Onion-Adressen) @@ -2100,7 +2086,8 @@ filterWindow.priceRelayNode=Gefilterte Preisrelais Knoten (Komma getr. Onion-Adr filterWindow.btcNode=Gefilterte Bitcoinknoten (Komma getr. Adresse + Port) filterWindow.preventPublicBtcNetwork=Nutzung des öffentlichen Bitcoin-Netzwerks verhindern filterWindow.disableDao=DAO deaktivieren -filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.disableAutoConf=Automatische Bestätigung deaktivieren +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Min. für DAO erforderliche Version filterWindow.disableTradeBelowVersion=Min. zum Handeln erforderliche Version filterWindow.add=Filter hinzufügen @@ -2124,17 +2111,13 @@ offerDetailsWindow.creationDate=Erstellungsdatum offerDetailsWindow.makersOnion=Onion-Adresse des Erstellers qRCodeWindow.headline=QR Code -qRCodeWindow.msg=Please use this QR code for funding your Bisq wallet from your external wallet. +qRCodeWindow.msg=Bitte nutzen Sie diesen QR Code um Ihr Bisq Wallet von Ihrem externen Wallet aufzuladen. qRCodeWindow.request=Zahlungsanfrage:\n{0} selectDepositTxWindow.headline=Kautionstransaktion für Konflikt auswählen selectDepositTxWindow.msg=Die Kautionstransaktion wurde nicht im Handel gespeichert.\nBitte wählen Sie die existierenden MultiSig-Transaktionen aus Ihrer Wallet, die die Kautionstransaktion für den fehlgeschlagenen Handel war.\n\nSie können die korrekte Transaktion finden, indem Sie das Handelsdetail-Fenster öffnen (klicken Sie auf die Handels-ID in der Liste) und dem Transaktions-Output der Handelsgebührenzahlung zur nächsten Transaktion folgen, wo Sie die MultiSig-Kautionstransaktion sehen (die Adresse beginnt mit einer 3). Diese Transaktions-ID sollte in der dargestellten Liste auftauchen. Sobald Sie die korrekte Transaktion gefunden haben, wählen Sie diese Transaktion hier aus und fahren fort.\n\nEntschuldigen Sie die Unannehmlichkeiten, aber dieser Fehler sollte sehr selten auftreten und wir werden in Zukunft versuchen bessere Wege zu finden, ihn zu lösen. selectDepositTxWindow.select=Kautionstransaktion auswählen -selectBaseCurrencyWindow.headline=Marktauswahl -selectBaseCurrencyWindow.msg=Der ausgewählte Standardmarkt ist {0}.\n\nWenn Sie zu einer anderen Ausgangswährung wechseln möchten, wählen Sie bitte eine aus dem Dropdown-Feld.\nSie können die Ausgangswährung auch später unter \"Einstellungen/Netzwerk\" ändern. -selectBaseCurrencyWindow.select=Ausgangswährung wählen - sendAlertMessageWindow.headline=Globale Benachrichtigung senden sendAlertMessageWindow.alertMsg=Warnmeldung sendAlertMessageWindow.enterMsg=Nachricht eingeben @@ -2151,10 +2134,10 @@ sendPrivateNotificationWindow.send=Private Benachrichtigung senden showWalletDataWindow.walletData=Wallet-Daten showWalletDataWindow.includePrivKeys=Private Schlüssel einbeziehen -setXMRTxKeyWindow.headline=Prove sending of XMR -setXMRTxKeyWindow.note=Adding tx info below enables auto-confirm for quicker trades. See more: https://bisq.wiki/Trading_Monero -setXMRTxKeyWindow.txHash=Transaction ID (optional) -setXMRTxKeyWindow.txKey=Transaction key (optional) +setXMRTxKeyWindow.headline=Senden der XMR beweisen +setXMRTxKeyWindow.note=Hinzufügen der Transaktionsinfo unten aktiviert die automatische Bestätigung für schneller Trades. Mehr lesen: https://bisq.wiki/Trading_Monero +setXMRTxKeyWindow.txHash=ID der Transaktion (optional) +setXMRTxKeyWindow.txKey=Transaktionsschlüssel (optional) # We do not translate the tac because of the legal nature. We would need translations checked by lawyers # in each language which is too expensive atm. @@ -2230,11 +2213,10 @@ error.closedTradeWithUnconfirmedDepositTx=Die Einzahlungstransaktion des geschlo error.closedTradeWithNoDepositTx=Die Einzahlungstransaktion des geschlossenen Trades mit der Trade-ID {0} ist null.\n\nBitte starten Sie die Anwendung neu, um die Liste der geschlossenen Trades zu bereinigen. popup.warning.walletNotInitialized=Die Wallet ist noch nicht initialisiert -popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. +popup.warning.osxKeyLoggerWarning=Aufgrund strengerer Sicherheitsmaßnahmen ab MacOS 10.14 führt der Start einer Java-Anwendung (Bisq verwendet Java) zu einer Popup-Warnung in MacOS ("Bisq möchte Tastenanschläge von einer Anwendung empfangen").\n\nUm dieses Problem zu vermeiden, öffnen Sie bitte Ihre 'macOS-Einstellungen' und gehen Sie zu 'Sicherheit & Datenschutz' -> 'Datenschutz' -> 'Eingabe-Überwachung' und entfernen Sie 'Bisq' aus der Liste auf der rechten Seite.\n\nBisq wird auf eine neuere Java-Version upgraden, um dieses Problem zu vermeiden, sobald die technischen Einschränkungen (Java-Packager für die benötigte Java-Version wird noch nicht ausgeliefert) behoben sind. popup.warning.wrongVersion=Sie verwenden vermutlich die falsche Bisq-Version für diesen Computer.\nDie Architektur Ihres Computers ist: {0}.\nDie installierten Bisq-Binärdateien sind: {1}.\nBitte fahren Sie Bisq herunter und installieren die korrekte Version ({2}). -popup.warning.incompatibleDB=Wir haben nicht kompatible Datenbankdateien entdeckt!\n\nDie Datenbankdatei(en) sind mit unserer momentanen Codebasis nicht kompatibel:\n{0}\n\nWir haben ein Backup der beschädigten Datei(en) erstellt und die Standardwerte in eine neue Datenbankversion übertragen.\n\nDas Backup befindet sich in:\n{1}/db/backup_of_corrupted_data.\n\nBitte überprüfen Sie, ob Sie die aktuellste Bisq-Version installiert haben.\nSie können diese hier herunterladen:\nhttps://bisq.network/downloads\n\nBitte starten Sie die Anwendung neu. +popup.warning.incompatibleDB=Wir haben inkompatible Datenbankdateien entdeckt!\n\nDiese Datenbankdatei(en) ist (sind) nicht kompatibel mit unserer aktuellen Code-Basis:\n{0}\n\nWir haben ein Backup der beschädigten Datei(en) erstellt und die Standardwerte auf eine neue Datenbankversion angewendet.\n\nDas Backup befindet sich unter:\n{1}/db/backup_of_corrupted_data.\n\nBitte prüfen Sie, ob Sie die neueste Version von Bisq installiert haben.\nSie können sie herunterladen unter: [HYPERLINK:https://bisq.network/downloads].\n\nBitte starten Sie die Anwendung neu. popup.warning.startupFailed.twoInstances=Bisq läuft bereits. Sie können nicht zwei Instanzen von Bisq laufen lassen. -popup.warning.cryptoTestFailed=Es scheint so, als würden Sie selbst kompilierte Binärdateien verwenden und wären nicht den Anweisung auf https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys gefolgt.\n\nWenn dies nicht der Fall ist und Sie die offiziellen Bisq-Binärdateien genutzt haben, erstellen Sie bitte einen Fehlerbericht auf der Github-Seite.\nFehler={0} popup.warning.tradePeriod.halfReached=Ihr Trade mit der ID {0} hat die Hälfte der maximal erlaubten Trade-Periode erreicht und ist immer noch nicht abgeschlossen.\n\nDie Trade-Periode endet am {1}\n\nBitte überprüfen Sie den Status Ihres Trades unter \"Portfolio/Offene Trades\" für weitere Informationen. popup.warning.tradePeriod.ended=Ihr Trade mit der ID {0} hat die maximal zulässige Trade-Periode erreicht und ist nicht abgeschlossen.\n\nDie Trade-Periode endete am {1}.\n\nBitte überprüfen Sie Ihren Trade unter \"Portfolio/Offene Trades\", um den Mediator zu kontaktieren. popup.warning.noTradingAccountSetup.headline=Sie haben kein Handelskonto eingerichtet @@ -2253,12 +2235,14 @@ popup.warning.insufficientBtcFundsForBsqTx=Sie haben nicht genügend BTC-Gelder, popup.warning.bsqChangeBelowDustException=Diese Transaktion erzeugt eine BSQ-Wechselgeld-Ausgabe, die unter dem Dust-Limit (5.46 BSQ) liegt und vom Bitcoin-Netzwerk abgelehnt werden würde.\n\nSie müssen entweder einen höheren Betrag senden, um die Wechselgeld-Ausgabe zu vermeiden (z.B. indem Sie den Dust-Betrag zu Ihrem Sende-Betrag hinzufügen) oder mehr BSQ-Guthaben zu Ihrer Wallet hinzufügen, damit Sie vermeiden, eine Dust-Ausgabe zu generieren.\n\nDie Dust-Ausgabe ist {0}. popup.warning.btcChangeBelowDustException=Diese Transaktion erzeugt eine Wechselgeld-Ausgabe, die unter dem Dust-Limit (546 Satoshi) liegt und vom Bitcoin-Netzwerk abgelehnt würde.\n\nSie müssen den Dust-Betrag zu Ihrem Sende-Betrag hinzufügen, um zu vermeiden, dass eine Dust-Ausgabe generiert wird.\n\nDie Dust-Ausgabe ist {0}. -popup.warning.insufficientBsqFundsForBtcFeePayment=You''ll need more BSQ to do this transaction—the last 5.46 BSQ in your wallet cannot be used to pay trade fees because of dust limits in the Bitcoin protocol.\n\nYou can either buy more BSQ or pay trade fees with BTC.\n\nMissing funds: {0} +popup.warning.insufficientBsqFundsForBtcFeePayment=Sie benötigen mehr BSQ um diese Transaktion durchzuführen - die letzten 5.46 BSQ in Ihrer Wallet können aufgrund der Dust-Limits im Bitcoin Protokoll nicht für die Trading-Gebühren verwendet werden.\n\nSie können entweder mehr BSQ kaufen oder die Trading-Gebühren in BTC bezahlen.\n\nFehlende Funds: {0} popup.warning.noBsqFundsForBtcFeePayment=Ihre BSQ-Wallet hat keine ausreichenden Gelder, um die Handels-Gebühr in BSQ zu bezahlen. popup.warning.messageTooLong=Ihre Nachricht überschreitet die maximal erlaubte Größe. Sende Sie diese in mehreren Teilen oder laden Sie sie in einen Dienst wie https://pastebin.com hoch. popup.warning.lockedUpFunds=Sie haben gesperrtes Guthaben aus einem gescheiterten Trade.\nGesperrtes Guthaben: {0} \nEinzahlungs-Tx-Adresse: {1}\nTrade ID: {2}.\n\nBitte öffnen Sie ein Support-Ticket, indem Sie den Trade im Bildschirm "Offene Trades" auswählen und auf \"alt + o\" oder \"option + o\" drücken. -popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" +popup.warning.nodeBanned=Einer der {0} Nodes wurde gebannt. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=Preisrelais popup.warning.seed=Seed popup.warning.mandatoryUpdate.trading=Bitte aktualisieren Sie auf die neueste Bisq-Version. Es wurde ein obligatorisches Update veröffentlicht, das den Handel mit alten Versionen deaktiviert. Bitte besuchen Sie das Bisq-Forum für weitere Informationen. @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=Die {0} Transaktion für den Trade mit der ID {1} popup.warning.openOfferWithInvalidMakerFeeTx=Die Verkäufergebühren-Transaktion für das Angebot mit der ID {0} ist ungültig.\nTransaktions-ID={1}.\nBitte gehen Sie zu \"Einstellungen/Netzwerkinformationen\" und führen Sie eine SPV-Resynchronisierung durch.\nFür weitere Hilfe wenden Sie sich bitte an den Bisq-Support-Kanal des Bisq Keybase Teams. -popup.warning.trade.depositTxNull=Der Trade mit der ID ''{0}'' hat keine Einzahlungstransaktion vorgenommen.\n\nBitte starten Sie die Anwendung erneut, um zu sehen, ob das Problem weiterhin besteht.\n\nWenn dies der Fall ist, öffnen Sie bitte das Trade-Details-Popup, indem Sie auf die Trade-ID klicken. Klicken Sie dann auf die Transaktions-IDs für die Maker Fee Transaktion und die Taker Fee Transaktion, um sie in einem Block-Explorer anzuzeigen. Eine Transaktion, die nicht in einem Block-Explorer gefunden werden kann, ist wahrscheinlich eine ungültige Transaktion.\n\nWenn dies geschieht, melden Sie es bitte im #support channel von Bisq Keybase (https://keybase.io/team/bisq). Wenn Ihre Trade Fee Transaktion ungültig ist und kein Geld mehr in Ihrer Wallet ist, können Sie den Trade zu den fehlgeschlagenen Trades verschieben und einen SPV Resync durchführen, damit Ihr Geld wieder erscheint (siehe unten).\n\nWenn Ihre Trade Fee-Transaktion gültig ist, ist der Gebührenbetrag verloren, und Sie können einen Antrag auf Rückerstattung über das Support-Repository auf GitHub (https://github.com/bisq-network/support/issues) stellen.\n\nIn beiden Fällen führen Sie bitte einen SPV-Resync vom Bildschirm ''Einstellungen/Netzwerk'' aus durch, um jegliche verbliebene Probleme in Ihrer Wallet zu beseitigen! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Verschieben in fehlgeschlagene Trades -popup.warning.trade.depositTxNull.shutDown=Bisq beenden - popup.info.securityDepositInfo=Um sicherzustellen, dass beide Händler dem Handelsprotokoll folgen, müssen diese eine Kaution zahlen.\n\nDie Kaution bleibt in Ihrer lokalen Wallet, bis das Angebot von einem anderen Händler angenommen wurde.\nSie wird Ihnen zurückerstattet, nachdem der Handel erfolgreich abgeschlossen wurde.\n\nBitte beachten Sie, dass Sie die Anwendung laufen lassen müssen, wenn Sie ein offenes Angebot haben.\nWenn ein anderer Händler Ihr Angebot annehmen möchte ist es notwendig, dass Ihre Anwendung online ist und reagieren kann.\nStellen Sie sicher, dass Sie den Ruhezustand deaktiviert haben, da dieser Ihren Client vom Netzwerk trennen würde (Der Ruhezustand des Monitors ist kein Problem). popup.info.cashDepositInfo=Stellen Sie sicher, dass eine Bank-Filiale in Ihrer Nähe befindet, um die Bargeld Kaution zu zahlen.\nDie Bankkennung (BIC/SWIFT) der Bank des Verkäufers ist: {0}. popup.info.cashDepositInfo.confirm=Ich bestätige, dass ich die Kaution zahlen kann popup.info.shutDownWithOpenOffers=Bisq wird heruntergefahren, aber Sie haben offene Angebote verfügbar.\n\nDiese Angebote sind nach dem Herunterfahren nicht mehr verfügbar und werden erneut im P2P-Netzwerk veröffentlicht wenn Sie das nächste Mal Bisq starten.\n\nLassen Sie Bisq weiter laufen und stellen Sie sicher, dass Ihr Computer online bleibt, um Ihre Angebote verfügbar zu halten (z.B.: verhindern Sie den Standby-Modus... der Standby-Modus des Monitors stellt kein Problem dar). -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=Es scheint so als ob Sie Bisq auf Qubes OS laufen haben.\n\nBitte stellen Sie sicher, dass Bisq qube nach unserem Setup Guide eingerichtet wurde: [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=Wichtige private Benachrichtigung! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=Der Handel mit der ID {0} benötigt Ihre Aufmerks popup.info.multiplePaymentAccounts.headline=Mehrere Zahlungskonten verfügbar popup.info.multiplePaymentAccounts.msg=Für dieses Angebot stehen Ihnen mehrere Zahlungskonten zur Verfügung. Bitte stellen Sie sicher, dass Sie das richtige ausgewählt haben. -popup.news.launch.headline=Zwei wichtige Updates -popup.news.launch.accountSigning.headline=KONTO-UNTERZEICHNUNG -popup.news.launch.accountSigning.description=Heben Sie das Fiat-Trade-Limit in Höhe von 0.01 BTC auf, indem Sie BTC von einem unterzeichneten Partner kaufen. -popup.news.launch.ntp.headline=NEUES TRADE-PROTOKOLL -popup.news.launch.ntp.description=Das neue 2-stufige Konfliktbewältigungssystem macht Bisq sicherer, skalierbarer und zensurresistenter. - popup.accountSigning.selectAccounts.headline=Zahlungskonten auswählen popup.accountSigning.selectAccounts.description=Basierend auf der Zahlungsmethode und dem Zeitpunkt werden alle Zahlungskonten, die mit einem Konfliktfall verbunden sind, bei dem eine Auszahlung an den Käufer erfolgt ist, zur Unterzeichnung ausgewählt. popup.accountSigning.selectAccounts.signAll=Alle Zahlungsmethoden unterzeichnen @@ -2324,26 +2297,25 @@ popup.accountSigning.signAccounts.ECKey.error=Ungültiger Vermittler ECKey popup.accountSigning.success.headline=Glückwunsch popup.accountSigning.success.description=Alle {0} Zahlungskonten wurden erfolgreich unterzeichnet! -popup.accountSigning.generalInformation=Den Unterzeichnungsstatus aller Ihrer Konten finden Sie im Konto-Bereich.\n\nWeitere Informationen finden Sie unter https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=Den Unterzeichnungsstand all Ihrer Konten finden Sie im Abschnitt Konto.\n\nFür weitere Informationen besuchen Sie bitte [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=Eines Ihrer Zahlungskonten wurde von einem Vermittler verifiziert und unterzeichnet. Wenn Sie mit diesem Konto traden, wird das Konto Ihres Trade-Partners nach einem erfolgreichen Trade automatisch unterzeichnet.\n\n{0} popup.accountSigning.signedByPeer=Eines Ihrer Zahlungskonten wurde von einem Trade-Partner verifiziert und unterzeichnet. Ihr anfängliches Trade-Limit wird aufgehoben und Sie können in {0} Tagen andere Konten unterzeichnen.\n\n{1} popup.accountSigning.peerLimitLifted=Das anfängliche Limit für eines Ihrer Konten wurde aufgehoben.\n\n{0} popup.accountSigning.peerSigner=Eines Ihrer Konten ist reif genug, um andere Zahlungskonten zu unterzeichnen, und das anfängliche Limit für eines Ihrer Konten wurde aufgehoben.\n\n{0} popup.accountSigning.singleAccountSelect.headline=Zeuge für Konto-Alter auswählen -popup.accountSigning.singleAccountSelect.description=Nach Zeuge für Konto-Alter suchen +popup.accountSigning.singleAccountSelect.description=Nach Zeuge für Konto-Alter suchen. popup.accountSigning.singleAccountSelect.datePicker=Zeitpunkt für Unterzeichnung auswählen popup.accountSigning.confirmSingleAccount.headline=Ausgewählten Zeugen für Konto-Alter bestätigen popup.accountSigning.confirmSingleAccount.selectedHash=Ausgewählter Zeugen-Hash popup.accountSigning.confirmSingleAccount.button=Zeuge für Konto-Alter unterzeichnen popup.accountSigning.successSingleAccount.description=Zeuge {0} wurde unterzeichnet popup.accountSigning.successSingleAccount.success.headline=Erfolg -popup.accountSigning.successSingleAccount.signError=Zeuge nicht unterzeichnet, {0} +popup.accountSigning.successSingleAccount.signError=Zeuge nicht unterzeichnet (fehlgeschlagen), {0} popup.accountSigning.unsignedPubKeys.headline=Nicht unterzeichnete Pubkeys popup.accountSigning.unsignedPubKeys.sign=Pubkeys unterzeichnen popup.accountSigning.unsignedPubKeys.signed=Pubkeys wurden unterzeichnet -popup.accountSigning.unsignedPubKeys.result.headline=Unterzeichnung abgeschlossen popup.accountSigning.unsignedPubKeys.result.signed=Unterzeichnete Pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Fehler bei Unterzeichnung @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: Ein dezentrales Bitcoin-Tauschbörsen-Netzwerk # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=Bitte stellen Sie sicher, dass die Mining-Gebühr für Ihre externe Wallet mindestens {0} satoshis/byte ist. Ansonsten wird die Transaktion des Trades nicht rechtzeitig bestätigt und der Trade wird in einem Konflikt enden. guiUtil.accountExport.savedToPath=Handelskonten in Verzeichnis gespeichert:\n{0} guiUtil.accountExport.noAccountSetup=Sie haben kein Handelskonto zum Exportieren eingerichtet. @@ -2422,7 +2394,7 @@ peerInfoIcon.tooltip.age=Zahlungskonto vor {0} erstellt. peerInfoIcon.tooltip.unknownAge=Alter des Zahlungskontos unbekannt. tooltip.openPopupForDetails=Dialogfenster für Details öffnen -tooltip.invalidTradeState.warning=This trade is in an invalid state. Open the details window for more information +tooltip.invalidTradeState.warning=Dieser Trade hat einen ungültigen Status. Öffnen Sie das Detail-Fenster für weitere Informationen. tooltip.openBlockchainForAddress=Externen Blockchain-Explorer für Adresse öffnen: {0} tooltip.openBlockchainForTx=Externen Blockchain-Explorer für Transaktion öffnen: {0} @@ -2447,8 +2419,8 @@ addressTextField.openWallet.failed=Öffnen einer Bitcoin-Wallet-Standardanwendun peerInfoIcon.tooltip={0}\nMarkierung: {1} txIdTextField.copyIcon.tooltip=Transaktions-ID in Zwischenablage kopieren -txIdTextField.blockExplorerIcon.tooltip=Open a blockchain explorer with this transaction ID -txIdTextField.missingTx.warning.tooltip=Missing required transaction +txIdTextField.blockExplorerIcon.tooltip=Blockchain Explorer mit dieser Transaktions-ID öffnen +txIdTextField.missingTx.warning.tooltip=Erforderliche Transaktion fehlt #################################################################### @@ -2457,12 +2429,13 @@ txIdTextField.missingTx.warning.tooltip=Missing required transaction navigation.account=\"Konto\" navigation.account.walletSeed=\"Konto/Wallet-Seed\" -navigation.funds.availableForWithdrawal=\"Funds/Send funds\" +navigation.funds.availableForWithdrawal=\"Funds/Funds senden\" navigation.portfolio.myOpenOffers=\"Portfolio/Meine offenen Angebote\" navigation.portfolio.pending=\"Portfolio/Offene Trades\" navigation.portfolio.closedTrades=\"Portfolio/Verlauf\" navigation.funds.depositFunds=\"Gelder/Gelder erhalten\" navigation.settings.preferences=\"Einstellungen/Voreinstellungen\" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"Gelder/Transaktionen\" navigation.support=\"Support\" navigation.dao.wallet.receive=\"DAO/BSQ-Wallet/Erhalten\" @@ -2525,11 +2498,11 @@ password.deriveKey=Schlüssel aus Passwort ableiten password.walletDecrypted=Die Wallet wurde erfolgreich entschlüsselt und der Passwortschutz entfernt. password.wrongPw=Sie haben das falsche Passwort eingegeben.\n\nVersuchen Sie bitte Ihr Passwort erneut einzugeben, wobei Sie dies vorsichtig auf Tipp- und Rechtschreibfehler überprüfen sollten. password.walletEncrypted=Die Wallet wurde erfolgreich verschlüsselt und der Passwortschutz aktiviert. -password.walletEncryptionFailed=Wallet Passwort konnte nicht gesetzt werden. Sie haben vielleicht Seed-Wörter importiert, die nicht mit der Wallet-Datenbank übereinstimmen. Bitte kontaktieren Sie die Entwickler im Bisq-Forum. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=Die 2 eingegebenen Passwörter stimmen nicht überein. password.forgotPassword=Passwort vergessen? -password.backupReminder=Beachten Sie, dass wenn Sie ein Passwort setzen, alle automatisch erstellten Backups der unverschlüsselten Wallet gelöscht werden.\n\nEs wird dringend empfohlen, ein Backup des Anwendungsverzeichnisses zu erstellen und die Seed-Wörter aufzuschreiben, bevor Sie ein Passwort setzen! -password.backupWasDone=Ich habe schon ein Backup erstellt +password.backupReminder=Beachten Sie, dass wenn Sie ein Passwort setzen, alle automatisch erstellten Backups der unverschlüsselten Wallet gelöscht werden.\n\nEs wird dringend empfohlen ein Backup des Anwendungsverzeichnisses zu erstellen und die Seed-Wörter aufzuschreiben, bevor Sie ein Passwort erstellen! +password.backupWasDone=Ich habe bereits ein Backup erstellt seed.seedWords=Seed-Wörter der Wallet seed.enterSeedWords=Seed-Wörter der Wallet eingeben @@ -2537,14 +2510,14 @@ seed.date=Wallets-Datum seed.restore.title=Wallets aus Seed-Wörtern wiederherstellen seed.restore=Wallets wiederherstellen seed.creationDate=Erstellungsdatum -seed.warn.walletNotEmpty.msg=Ihre Bitcoin-Wallet ist nicht leer.\n\nSie müssen diese Wallet leeren, bevor Sie versuchen, eine ältere Wallet wiederherzustellen, da das Mischen von Wallets zu ungültigen Backups führen kann.\n\nBitte schließen Sie Ihre Händel ab, schließen Sie all Ihre offenen Angebote und gehen Sie in den Abschnitt \"Gelder\", um Ihre Bitcoins abzuheben.\nSollten Sie nicht auf Ihre Bitcoins zugreifen können, können Sie das Notfallwerkzeug nutzen, um Ihre Wallet zu leeren.\nUm das Notfallwerkzeug zu öffnen, drücken Sie \"alt + e\" oder \"option + e\". +seed.warn.walletNotEmpty.msg=Ihre Bitcoin-Wallet ist nicht leer.\n\nSie müssen diese Wallet leeren, bevor Sie versuchen, eine ältere Wallet wiederherzustellen, da das Verwechseln von Wallets zu ungültigen Backups führen kann.\n\nBitte schließen Sie Ihre laufenden Trades ab, schließen Sie Ihre offenen Angebote und gehen Sie auf \"Gelder\", um Ihre Bitcoins zu versenden.\nSollten Sie nicht auf Ihre Bitcoins zugreifen können, können Sie das Notfallwerkzeug nutzen, um Ihre Wallet zu leeren.\nUm das Notfallwerkzeug zu öffnen, drücken Sie \"alt + e\" oder \"cmd/Strg + e\". seed.warn.walletNotEmpty.restore=Ich möchte trotzdem wiederherstellen seed.warn.walletNotEmpty.emptyWallet=Ich werde meine Wallets erst leeren seed.warn.notEncryptedAnymore=Ihre Wallets sind verschlüsselt.\n\nNach einer Wiederherstellung werden die Wallets nicht mehr verschlüsselt sein und Sie werden ein neues Passwort festlegen müssen.\n\nMöchten Sie fortfahren? -seed.warn.walletDateEmpty=Da Sie kein Wallet-Datum angegeben haben, muss bisq die Blockchain ab 09.10.2013 (dem Datum der BIP39-Epoche) scannen.\n\nBIP39-Wallets wurden in bisq erstmals am 28.06.2017 (Release v0.5) eingeführt. Sie könnten also durch die Verwendung dieses Datums Zeit sparen.\n\nIdealerweise sollten Sie das Datum angeben, an dem Ihr Wallet Seed erstellt wurde.\n\n\nSind Sie sicher, dass Sie ohne Angabe eines Wallet-Datums fortfahren wollen? +seed.warn.walletDateEmpty=Da Sie kein Wallet-Datum angegeben haben, muss bisq die Blockchain ab 09. 10. 2013 (seit diesem Datum existiert BIP39) scannen.\n\nBIP39-Wallets wurden in bisq erstmals am 28.06.2017 (Release v0.5) eingeführt. Wenn Sie dieses Datum nehmen, können Sie etwas Zeit sparen.\n\nIdealerweise sollten Sie das Datum angeben, an dem Ihr Wallet Seed erstellt wurde.\n\n\nSind Sie sicher, dass Sie ohne Angabe eines Wallet-Datums fortfahren wollen? seed.restore.success=Wallets mit den neuen Seed-Wörtern erfolgreich wiederhergestellt.\n\nSie müssen die Anwendung herunterfahren und neu starten. seed.restore.error=Beim Wiederherstellen der Wallets mit den Seed-Wörtern ist ein Fehler aufgetreten.{0} -seed.restore.openOffers.warn=You have open offers which will be removed if you restore from seed words.\nAre you sure that you want to continue? +seed.restore.openOffers.warn=Sie haben noch offene Angebote die entfernt werden wenn Sie Ihre Seed Wörter wiederherstellen.\nSind Sie sicher, dass Sie fortfahren möchten? #################################################################### @@ -2554,8 +2527,8 @@ seed.restore.openOffers.warn=You have open offers which will be removed if you r payment.account=Konto payment.account.no=Kontonummer payment.account.name=Kontoname -payment.account.userName=User name -payment.account.phoneNr=Phone number +payment.account.userName=Benutzername +payment.account.phoneNr=Telefonnummer payment.account.owner=Vollständiger Name des Kontoinhabers payment.account.fullName=Vollständiger Name (vor, zweit, nach) payment.account.state=Bundesland/Landkreis/Region @@ -2583,7 +2556,6 @@ payment.secret=Geheimfrage payment.answer=Antwort payment.wallet=Wallets-ID payment.uphold.accountId=Nutzername oder Email oder Telefonnr. -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=E-Mail oder Telefonnummer payment.venmo.venmoUserName=Venmo Nutzername payment.popmoney.accountId=E-Mail oder Telefonnummer @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=Personalausweis/Steuernummer oder Telefonnr. payment.supportedCurrencies=Unterstützte Währungen payment.limitations=Einschränkungen payment.salt=Salt für Überprüfung des Kontoalters -payment.error.noHexSalt=Der Salt muss im HEX-Format sein.\nEs wird nur empfohlen das Salt-Feld zu bearbeiten, wenn Sie den Salt von einem alten Konto übertragen, um das Alter Ihres Kontos zu erhalten. Das Alter des Kontos wird durch das Salt und die zu verifizierenden Kontodaten bestätigt (z.B. IBAN). +payment.error.noHexSalt=Der Salt muss im HEX-Format sein.\nEs wird empfohlen das Salt-Feld zu bearbeiten, wenn Sie den Salt von einem alten Konto übertragen, um das Alter Ihres Kontos zu erhalten. Das Alter des Kontos wird durch den Konto-Salt und die Kontodaten (z.B. IBAN) verifiziert. payment.accept.euro=Trades aus diesen Euroländern akzeptieren payment.accept.nonEuro=Trades aus diesen Nicht-Euroländern akzeptieren payment.accepted.countries=Akzeptierte Länder @@ -2605,7 +2577,7 @@ shared.accountSigningState=Konto-Unterzeichnungsstatus payment.altcoin.address.dyn={0} Adresse payment.altcoin.receiver.address=Altcoin Adresse des Empfängers payment.accountNr=Kontonummer -payment.emailOrMobile=E-Mail oder Telefonnr. +payment.emailOrMobile=E-Mail oder Telefonnummer payment.useCustomAccountName=Spezifischen Kontonamen nutzen payment.maxPeriod=Max. erlaubte Handelsdauer payment.maxPeriodAndLimit=Max. Trade-Dauer : {0} / Max. Kaufen: {1} / Max. Verkauf: {2} / Kontoalter: {3} @@ -2625,31 +2597,33 @@ payment.accountType=Kontotyp payment.checking=Überprüfe payment.savings=Ersparnisse payment.personalId=Personalausweis -payment.clearXchange.info=Zelle ist ein Geldtransferdienst, der am besten *durch* eine andere Bank funktioniert.\n\n1. Sehen Sie auf dieser Seite nach, ob (und wie) Ihre Bank mit Zelle zusammenarbeitet:\nhttps://www.zellepay.com/get-started\n\n2. Achten Sie besonders auf Ihre Überweisungslimits - die Sendelimits variieren je nach Bank, und die Banken geben oft separate Tages-, Wochen- und Monatslimits an.\n\n3. Wenn Ihre Bank nicht mit Zelle zusammenarbeitet, können Sie sie trotzdem über die Zelle Mobile App benutzen, aber Ihre Überweisungslimits werden viel niedriger sein.\n\n4. Der auf Ihrem Bisq-Konto angegebene Name MUSS mit dem Namen auf Ihrem Zelle/Bankkonto übereinstimmen. \n\nWenn Sie eine Zelle Transaktion nicht wie in Ihrem Handelsvertrag angegeben durchführen können, verlieren Sie möglicherweise einen Teil (oder die gesamte) Kaution.\n\nWegen des etwas höheren Chargeback-Risikos von Zelle wird Verkäufern empfohlen, nicht unterzeichnete Käufer per E-Mail oder SMS zu kontaktieren, um zu überprüfen, ob der Käufer wirklich das in Bisq angegebene Zelle-Konto besitzt. +payment.clearXchange.info=Zelle ist ein Geldtransferdienst, der am besten *durch* eine andere Bank funktioniert.\n\n1. Sehen Sie auf dieser Seite nach, ob (und wie) Ihre Bank mit Zelle zusammenarbeitet:\nhttps://www.zellepay.com/get-started\n\n2. Achten Sie besonders auf Ihre Überweisungslimits - die Sendelimits variieren je nach Bank, und die Banken geben oft separate Tages-, Wochen- und Monatslimits an.\n\n3. Wenn Ihre Bank nicht mit Zelle zusammenarbeitet, können Sie die Zahlungsmethode trotzdem über die Zelle Mobile App benutzen, aber Ihre Überweisungslimits werden viel niedriger sein.\n\n4. Der auf Ihrem Bisq-Konto angegebene Name MUSS mit dem Namen auf Ihrem Zelle/Bankkonto übereinstimmen. \n\nWenn Sie eine Zelle Transaktion nicht wie in Ihrem Handelsvertrag angegeben durchführen können, verlieren Sie möglicherweise einen Teil (oder die gesamte) Sicherheitskaution.\n\nWegen des etwas höheren Chargeback-Risikos von Zelle wird Verkäufern empfohlen, nicht unterzeichnete Käufer per E-Mail oder SMS zu kontaktieren, um zu überprüfen, ob der Käufer wirklich das in Bisq angegebene Zelle-Konto besitzt. payment.fasterPayments.newRequirements.info=Einige Banken haben damit begonnen, den vollständigen Namen des Empfängers für Faster Payments Überweisungen zu überprüfen. Ihr aktuelles Faster Payments-Konto gibt keinen vollständigen Namen an.\n\nBitte erwägen Sie, Ihr Faster Payments-Konto in Bisq neu einzurichten, um zukünftigen {0} Käufern einen vollständigen Namen zu geben.\n\nWenn Sie das Konto neu erstellen, stellen Sie sicher, dass Sie die genaue Bankleitzahl, Kontonummer und die "Salt"-Werte für die Altersverifikation von Ihrem alten Konto auf Ihr neues Konto kopieren. Dadurch wird sichergestellt, dass das Alter und der Unterschriftsstatus Ihres bestehenden Kontos erhalten bleiben. -payment.moneyGram.info=Wenn MoneyGram verwendet wird, muss der BTC Käufer die MoneyGram und ein Foto der Quittung per E-Mail an den BTC-Verkäufer senden. Die Quittung muss den vollständigen Namen, das Land, das Bundesland des Verkäufers und den Betrag deutlich zeigen. Der Käufer bekommt die E-Mail-Adresse des Verkäufers im Handelsprozess angezeigt. -payment.westernUnion.info=Wenn Western Union verwendet wird, muss der BTC Käufer die MTCN (Tracking-Nummer) und ein Foto der Quittung per E-Mail an den BTC-Verkäufer senden. Die Quittung muss den vollständigen Namen, die Stadt, das Land des Verkäufers und den Betrag deutlich zeigen. Der Käufer bekommt die E-Mail-Adresse des Verkäufers im Handelsprozess angezeigt. +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=Bei Verwendung von HalCash muss der BTC-Käufer dem BTC-Verkäufer den HalCash-Code per SMS vom Mobiltelefon senden.\n\nBitte achten Sie darauf, dass Sie den maximalen Betrag, den Sie bei Ihrer Bank mit HalCash versenden dürfen, nicht überschreiten. Der Mindestbetrag pro Auszahlung beträgt 10 EUR und der Höchstbetrag 600 EUR. Bei wiederholten Abhebungen sind es 3000 EUR pro Empfänger pro Tag und 6000 EUR pro Empfänger pro Monat. Bitte überprüfen Sie diese Limits bei Ihrer Bank, um sicherzustellen, dass sie die gleichen Limits wie hier angegeben verwenden.\n\nDer Auszahlungsbetrag muss ein Vielfaches von 10 EUR betragen, da Sie keine anderen Beträge an einem Geldautomaten abheben können. Die Benutzeroberfläche beim Erstellen und Annehmen eines Angebots passt den BTC-Betrag so an, dass der EUR-Betrag korrekt ist. Sie können keinen marktbasierten Preis verwenden, da sich der EUR-Betrag bei sich ändernden Preisen ändern würde.\n\nIm Streitfall muss der BTC-Käufer den Nachweis erbringen, dass er die EUR geschickt hat. -payment.limits.info=Bitte beachten Sie, dass alle Banküberweisungen mit einem gewissen Rückbuchungsrisiko verbunden sind.\n\nUm dieses Risiko zu mindern, setzt Bisq Limits pro Trade fest, die auf zwei Faktoren basieren:\n\n1. Die geschätzte Höhe des Rückbuchungsrisikos für die verwendete Zahlungsmethode\n2. Das Alter Ihres Kontos für diese Zahlungsmethode\n\nDas Konto, das Sie jetzt anlegen, ist neu und sein Alter ist Null. Wenn Ihr Konto altert, werden die Limits pro Trade erhöht:\n\n● Während des 1. Monats wird Ihr Limit pro Trade {0} betragen\n● Während des 2. Monats wird Ihr Limit pro Trade {1} betragen\n● Nach dem 2. Monat wird Ihr Limit pro Trade {2} betragen\n\nBitte beachten Sie: Die Beschränkungen gelten nur für die Trade-Größe. Sie können so viele Trades platzieren, wie Sie möchten. -payment.limits.info.withSigning=Um das Rückbuchungsrisiko zu begrenzen, setzt Bisq für diesen Zahlungskontotyp Limits pro Trade auf der Grundlage der folgenden 2 Faktoren fest:\n\n1. Allgemeines Rückbuchungsrisiko für die Zahlungsmethode\n2. Status der Kontounterzeichnung\n\nDieses Zahlungskonto ist noch nicht unterzeichnet, so dass es auf den Kauf von {0} pro Trade beschränkt ist. Nach der Unterzeichnung werden die Kauflimits wie folgt erhöht:\n\n● Vor der Unterzeichnung und für 30 Tage nach der Unterzeichnung beträgt Ihr Kauflimit pro Trade {0}\n● 30 Tage nach der Unterzeichnung beträgt Ihr Kauflimit pro Trade {1}\n● 60 Tage nach der Unterzeichnung beträgt Ihr Kauflimit pro Trade {2}\n\nVerkaufslimits sind von der Kontounterzeichnung nicht betroffen und erhöhen sich mit dem Alter des Kontos.\n\nSiehe mehr:\nhttps://bisq.wiki/Account_limits\n\n\nBitte beachten Sie: Die Beschränkungen gelten nur für die Trade-Größe. Sie können so viele Trades platzieren, wie Sie möchten. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=Bitte bestätigen Sie, dass Ihre Bank Bareinzahlungen in Konten von anderen Personen erlaubt. Zum Beispiel werden diese Einzahlungen bei der Bank of America und Wells Fargo nicht mehr erlaubt. -payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. -payment.revolut.addUserNameInfo.headLine=Update Revolut account +payment.revolut.info=Revolut benötigt den "Benutzernamen" als Account ID und nicht die Telefonnummer oder E-Mail, wie es in der Vergangenheit war. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.revolut.addUserNameInfo.headLine=Revolut Account updaten -payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. +payment.usPostalMoneyOrder.info=Der Handel auf Bisq unter Verwendung eines US Postal Money Orders (USPMO) setzt voraus, dass Sie Folgendes verstehen:\n\n- Der BTC-Käufer muss den Namen des BTC-Verkäufers sowohl in das Feld des Zahlers als auch in das Feld des Zahlungsempfängers eintragen und vor dem Versand ein hochauflösendes Foto des USPMO und des Umschlags mit dem Tracking-Nachweis machen.\n- Der BTC-Käufer muss den USPMO zusammen mit der Lieferbestätigung an den BTC-Verkäufer schicken.\n\nFür den Fall, dass eine Mediation erforderlich ist oder es zu einem Handelskonflikt kommt, müssen Sie die Fotos zusammen mit der USPMO-Seriennummer, der Nummer des Postamtes und dem Dollarbetrag an den Bisq-Mediator oder Erstattungsagenten schicken, damit dieser die Angaben auf der Website des US-Postamtes überprüfen kann.\n\nWenn Sie dem Mediator oder Vermittler die erforderlichen Informationen nicht zur Verfügung stellen, führt dies dazu, dass der Konflikt zu Ihrem Nachteil entschieden wird.\n\nIn allen Konfliktfällen trägt der USPMO-Absender 100 % der Verantwortung für die Bereitstellung von Beweisen/Nachweisen für den Mediator oder Vermittler.\n\nWenn Sie diese Anforderungen nicht verstehen, handeln Sie bitte nicht auf Bisq unter Verwendung eines USPMO. payment.f2f.contact=Kontaktinformationen -payment.f2f.contact.prompt=Wie möchten Sie vom Handeslpartner kontaktiert werden? (E-Mailadresse, Telefonnummer,...) +payment.f2f.contact.prompt=Wie möchten Sie vom Trading-Peer kontaktiert werden? (E-Mail Adresse, Telefonnummer,...) payment.f2f.city=Stadt für ein "Angesicht zu Angesicht" Treffen payment.f2f.city.prompt=Die Stadt wird mit dem Angebot angezeigt payment.f2f.optionalExtra=Freiwillige zusätzliche Informationen payment.f2f.extra=Zusätzliche Informationen payment.f2f.extra.prompt=Der Ersteller kann "Geschäftsbedingungen" festlegen oder öffentliche Kontaktinformationen hinterlegen. Diese werden mit dem Angebot angezeigt. -payment.f2f.info=Persönliche 'Face to Face' Trades haben unterschiedliche Regeln und sind mit anderen Risiken verbunden als Online-Transaktionen.\n\nDie Hauptunterschiede sind:\n● Die Trading Partner müssen Informationen über den Ort und die Uhrzeit des Treffens unter Verwendung ihrer Kontaktdaten austauschen.\n● Die Trading Partner müssen ihre Laptops mitbringen und die Bestätigung der "gesendeten Zahlung" und der "erhaltenen Zahlung" am Treffpunkt vornehmen.\n● Wenn ein Anbieter spezielle "Allgemeine Geschäftsbedingungen" hat, muss er diese im Textfeld "Zusatzinformationen" des Kontos angeben.\n● Mit der Annahme eines Angebots erklärt sich der Käufer mit den vom Anbieter angegebenen "Allgemeinen Geschäftsbedingungen" einverstanden.\n● Im Konfliktfall kann der Mediator oder Vermittler nicht viel tun, da es in der Regel schwierig ist, einen Originalitätsnachweis über das Geschehen in dem Treffen zu erhalten. In solchen Fällen können die BTC-Fonds auf unbestimmte Zeit oder bis zu einer Einigung der Trading Partner gesperrt werden.\n\nUm sicherzustellen, dass Sie die Unterschiede zu den persönlichen 'Face to Face' Trades vollständig verstehen, lesen Sie bitte die Anweisungen und Empfehlungen unter: 'https://docs.bisq.network/trading-rules.html#f2f-trading' +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=Webseite öffnen payment.f2f.offerbook.tooltip.countryAndCity=Land und Stadt: {0} / {1} payment.f2f.offerbook.tooltip.extra=Zusätzliche Informationen: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=Bank payment.japan.branch=Filiale payment.japan.account=Konto payment.japan.recipient=Name +payment.australia.payid=PayID +payment.payid=PayIDs wie E-Mail Adressen oder Telefonnummern die mit Finanzinstitutionen verbunden sind. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=Angesicht zu Angesicht (persönlich) JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australische PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=Inlandsbanken @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=A2A # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon Gift-Karte +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins schnell # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon Gift-Karte +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins schnell # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=Die Eingabe von 0 ist nicht erlaubt. validation.negative=Ein negativer Wert ist nicht erlaubt. validation.fiat.toSmall=Eingaben kleiner als der minimal mögliche Betrag sind nicht erlaubt. validation.fiat.toLarge=Eingaben größer als der maximal mögliche Betrag sind nicht erlaubt. -validation.btc.fraction=Die Eingabe führt zu einem Bitcoin-Wert mit einem Bruchteil der kleinsten Einheit (Satoshi). +validation.btc.fraction=Input wird einem Bitcoin Wert von weniger als 1 satoshi entsprechen validation.btc.toLarge=Eingaben größer als {0} sind nicht erlaubt. validation.btc.toSmall=Eingabe kleiner als {0} ist nicht erlaubt. -validation.securityDeposit.toSmall=Eingaben kleiner als {0} sind nicht erlaubt. -validation.passwordTooShort=Das eingegebene Passwort ist zu kurz. Es muss aus min. 8 Zeichen bestehen. +validation.passwordTooShort=Das Passwort das Sie eingegeben haben ist zu kurz. Es muss mindestens 8 Zeichen enthalten. validation.passwordTooLong=Das eingegebene Passwort ist zu lang. Es darf nicht aus mehr als 50 Zeichen bestehen. validation.sortCodeNumber={0} muss aus {1} Zahlen bestehen. validation.sortCodeChars={0} muss aus {1} Zeichen bestehen. @@ -2822,18 +2810,23 @@ validation.nationalAccountId={0} muss aus {1} Zahlen bestehen. #new validation.invalidInput=Ungültige Eingabe: {0} validation.accountNrFormat=Die Kontonummer muss folgendes Format haben: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=Die Adressvalidierung ist fehlgeschlagen, da diese nicht mit der Struktur einer {0}-Adresse übereinstimmt. -validation.altcoin.ltz.zAddressesNotSupported=Die LTZ-Adressen müssen mit einem L beginnen. Adressen, die mit z beginnen werden nicht unterstützt. -validation.altcoin.zAddressesNotSupported=Die ZEC-Adressen müssen mit einem t beginnen. Adressen, die mit z beginnen werden nicht unterstützt. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=Die LTZ Adresse muss mit L beginnen. Adressen die mit z beginnen werden nicht unterstützt. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC Adressen müssen mit t beginnen. Adressen die mit z beginnen werden nicht unterstützt. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=Die Adresse ist keine gültige {0}-Adresse! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Native Segwit-Adressen (die mit 'lq' beginnen) werden nicht unterstützt. -validation.bic.invalidLength=Die Eingabelänge ist weder 8 noch 11 +validation.bic.invalidLength=Eingabelänge muss 8 oder 11 betragen validation.bic.letters=Bank- und Ländercode müssen aus Buchstaben bestehen validation.bic.invalidLocationCode=Der BIC enthält einen ungültigen Standort-Code validation.bic.invalidBranchCode=Der BIC enthält eine ungültige Filialennummer validation.bic.sepaRevolutBic=Revolut SEPA Konten werden nicht unterstüzt. -validation.btc.invalidFormat=Ungültiges Format der Bitcoin-Adresse. -validation.bsq.invalidFormat=Ungültiges Format der BSQ-Adresse. +validation.btc.invalidFormat=Ungültiges Bitcoin Adressformat. +validation.bsq.invalidFormat=Ungültiges BSQ Adressformat. validation.email.invalidAddress=Ungültige Adresse validation.iban.invalidCountryCode=Der Ländercode ist ungültig validation.iban.checkSumNotNumeric=Die Prüfsumme muss numerisch sein @@ -2841,13 +2834,13 @@ validation.iban.nonNumericChars=Nicht-alphanumerisches Zeichen entdeckt validation.iban.checkSumInvalid=Die IBAN-Prüfsumme ist ungültig validation.iban.invalidLength=Die Zahl muss zwischen 15 und 34 Zeichen lang sein. validation.interacETransfer.invalidAreaCode=Nicht-kanadische Postleitzahl -validation.interacETransfer.invalidPhone=Ungültiges Telefonnummernformat und keine E-Mailadresse +validation.interacETransfer.invalidPhone=Bitte geben Sie eine gültige 11-stellige Telefonnummer (ex:1-123-456-7890) oder eine E-Mail Adresse an validation.interacETransfer.invalidQuestion=Nur Buchstaben, Zahlen, Leerzeichen und/oder die Symbole _ , . ? - sind erlaubt validation.interacETransfer.invalidAnswer=Muss ein Wort mit Buchstaben, Zahlen und/oder dem Symbol - sein validation.inputTooLarge=Eingabe darf nicht größer als {0} sein validation.inputTooSmall=Eingabe muss größer als {0} sein validation.inputToBeAtLeast=Eingabe muss mindestens {0} sein -validation.amountBelowDust=Ein Betrag unterhalb des Dust-Limits von {0} Satoshi ist nicht erlaubt. +validation.amountBelowDust=Menge unter dem Dust Limit von {0} Satoshi ist nicht erlaubt. validation.length=Die Länge muss zwischen {0} und {1} sein validation.pattern=Die Eingabe muss im Format {0} sein validation.noHexString=Die Eingabe ist nicht im HEX-Format. @@ -2859,7 +2852,7 @@ validation.numberFormatException=Zahlenformat Ausnahme {0} validation.mustNotBeNegative=Eingabe darf nicht negativ sein validation.phone.missingCountryCode=Es wird eine zweistellige Ländervorwahl benötigt, um die Telefonnummer zu bestätigen validation.phone.invalidCharacters=Telefonnummer {0} enthält ungültige Zeichen -validation.phone.insufficientDigits=Nicht genügend Ziffern in {0} für eine gültige Telefonnummer -validation.phone.tooManyDigits=Zu viele Ziffern in {0} für eine gültige Telefonnummer -validation.phone.invalidDialingCode=Die Ländervorwahl in der Nummer {0} ist für das Land {1} ungültig. Die richtige Vorwahl ist {2}. +validation.phone.insufficientDigits=Das ist keine gültige Telefonnummer. Sie habe nicht genügend Stellen angegeben. +validation.phone.tooManyDigits=Es sind zu viele Ziffern in {0} um eine gültige Telefonnummer zu sein. +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=Muss eine kommagetrennte Liste der gültigen Adressen sein diff --git a/core/src/main/resources/i18n/displayStrings_es.properties b/core/src/main/resources/i18n/displayStrings_es.properties index 7db7f14200..e6ca38d219 100644 --- a/core/src/main/resources/i18n/displayStrings_es.properties +++ b/core/src/main/resources/i18n/displayStrings_es.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=oferta shared.multipleOffers=ofertas shared.Offer=Oferta +shared.offerVolumeCode={0} Volumen de oferta shared.openOffers=ofertas abiertas shared.trade=intercambio shared.trades=intercambios @@ -122,7 +123,8 @@ shared.noDateAvailable=Sin fecha disponible shared.noDetailsAvailable=Sin detalles disponibles shared.notUsedYet=Sin usar aún shared.date=Fecha -shared.sendFundsDetailsWithFee=Enviando: {0}\nDe la dirección: {1}\nA la dirección del destinatario: {2}.\nLa tarifa de minado requerida es de: {3} ({4} satoshis/byte)\nTamaño de la transacción: {5} Kb\n\nEl destinatario recibirá: {6}\n\n¿Está seguro que desea retirar esta cantidad? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detectó que esta transacción crearía una salida que está por debajo del umbral mínimo considerada polvo (y no está permitida por las reglas de consenso en Bitcoin). En cambio, esta transacción polvo ({0} satoshi {1}) se agregará a la tarifa de minería.\n\n\n shared.copyToClipboard=Copiar al portapapeles shared.language=Idioma @@ -188,7 +190,6 @@ shared.tradeWalletAddress=Dirección de la cartera para intercambio shared.tradeWalletBalance=Saldo de la cartera de intercambio shared.makerTxFee=Creador: {0} shared.takerTxFee=Tomador: {0} -shared.securityDepositBox.description=Depósito de seguridad para BTC {0} shared.iConfirm=Confirmo shared.tradingFeeInBsqInfo=equivalente a {0} usado como tasa de intercambio shared.openURL=Abrir {0} @@ -214,8 +215,8 @@ shared.mediator=Mediador shared.arbitrator=Árbitro shared.refundAgent=Árbitro shared.refundAgentForSupportStaff=Agente de devolución de fondos -shared.delayedPayoutTxId=Delayed payout transaction ID -shared.delayedPayoutTxReceiverAddress=Delayed payout transaction sent to +shared.delayedPayoutTxId=ID de transacción del pago demorado +shared.delayedPayoutTxReceiverAddress=Transacción de pago demorado enviada a shared.unconfirmedTransactionsLimitReached=Tiene demasiadas transacciones no confirmadas en este momento. Por favor, inténtelo de nuevo más tarde. @@ -237,8 +238,6 @@ mainView.menu.settings=Configuración mainView.menu.account=Cuenta mainView.menu.dao=DAO -mainView.marketPrice.provider=Precio por -mainView.marketPrice.label=Precio de mercado mainView.marketPriceWithProvider.label=Precio de mercado por {0} mainView.marketPrice.bisqInternalPrice=Precio del último intercambio en Bisq mainView.marketPrice.tooltip.bisqInternalPrice=No existe un precio de mercado disponible proveniente de fuentes externas.\nEl precio mostrado es el último precio de intercambio en Bisq para esa moneda. @@ -251,14 +250,15 @@ mainView.balance.locked.short=Bloqueado mainView.footer.usingTor=(usando Tor) mainView.footer.localhostBitcoinNode=(localhost) -mainView.footer.btcInfo=Pares de red Bitcoin: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Tasas actuales: {0} sat/vB mainView.footer.btcInfo.initializing=Conectando a la red Bitcoin mainView.footer.bsqInfo.synchronizing=/ Sincronizando DAO mainView.footer.btcInfo.synchronizingWith=Sincronizando con mainView.footer.btcInfo.synchronizedWith=Sincronizado con mainView.footer.btcInfo.connectingTo=Conectando a mainView.footer.btcInfo.connectionFailed=Conexión fallida a -mainView.footer.p2pInfo=Pares de la red Bisq: {0} +mainView.footer.p2pInfo=Pares de Bitcoin: {0} / Pares de la red de Bisq: {1} mainView.footer.daoFullNode=Nodo completo DAO mainView.bootstrapState.connectionToTorNetwork=(1/4) Conectando a la red Tor... @@ -292,7 +292,6 @@ market.tabs.spread=Detalles market.tabs.trades=Intercambios # OfferBookChartView -market.offerBook.chart.title=Libro de ofertas para {0} market.offerBook.buyAltcoin=Comprar {0} (vender {1}) market.offerBook.sellAltcoin=Vender {0} (comprar {1}) market.offerBook.buyWithFiat=Comprar {0} @@ -337,7 +336,7 @@ offerbook.offerersAcceptedBankSeats=Países de sede de banco aceptados (tomador) offerbook.availableOffers=Ofertas disponibles offerbook.filterByCurrency=Filtrar por moneda offerbook.filterByPaymentMethod=Filtrar por método de pago -offerbook.timeSinceSigning=Signed since +offerbook.timeSinceSigning=Firmado desde offerbook.timeSinceSigning.info=Esta cuenta fue verificada y {0} offerbook.timeSinceSigning.info.arbitrator=firmada por un árbitro y puede firmar cuentas de pares offerbook.timeSinceSigning.info.peer=firmado por un par, esperando a que se eleven los límites @@ -346,7 +345,7 @@ offerbook.timeSinceSigning.info.signer=firmado por un par y puede firmar cuentas offerbook.timeSinceSigning.info.banned=La cuenta fue bloqueada offerbook.timeSinceSigning.daysSinceSigning={0} días offerbook.timeSinceSigning.daysSinceSigning.long={0} desde el firmado -offerbook.xmrAutoConf=Is auto-confirm enabled +offerbook.xmrAutoConf=¿Está habilitada la confirmación automática? offerbook.timeSinceSigning.help=Cuando complete con éxito un intercambio con un par que tenga una cuenta de pago firmada, su cuenta de pago es firmada.\n{0} días después, el límite inicial de {1} se eleva y su cuenta puede firmar tras cuentas de pago. offerbook.timeSinceSigning.notSigned=No firmada aún @@ -382,7 +381,7 @@ offerbook.warning.noMatchingAccount.msg=Esta oferta usa un método de pago que n offerbook.warning.counterpartyTradeRestrictions=Esta oferta no puede tomarse debido a restricciones de intercambio de la contraparte -offerbook.warning.newVersionAnnouncement=Con esta versión de software, los pares de intercambio pueden verificar y firmar entre sí sus cuentas de pago para crear una red de cuentas de pago de confianza.\n\nDespués de intercambiar con éxito con un par con una cuenta de pago verificada, su cuenta de pago será firmada y los límites de intercambio se elevarán después de un cierto intervalo de tiempo (la duración de este intervalo depende del método de verificación).\n\nPara más información acerca del firmado de cuentas, por favor vea la documentación en https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=Con esta versión de software, los pares de intercambio pueden verificar y firmar entre sí sus cuentas de pago para crear una red de cuentas de pago de confianza.\n\nDespués de intercambiar con éxito con un par con una cuenta de pago verificada, su cuenta de pago será firmada y los límites de intercambio se elevarán después de un cierto intervalo de tiempo (la duración de este intervalo depende del método de verificación).\n\nPara más información acerca del firmado de cuentas, por favor vea la documentación en [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=El monto de intercambio permitido está limitado a {0} debido a restricciones de seguridad basadas en los siguientes criterios:\n- La cuenta del comprador no ha sido firmada por un árbitro o par\n- El tiempo desde el firmado de la cuenta del comprador no es de al menos 30 días.\n- el método de pago para esta oferta se considera riesgoso para devoluciones de cargo\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=El monto de intercambio permitido está limitado a {0} debido a restricciones de seguridad basadas en los siguientes criterios:\n- Su cuenta de pago no ha sido firmada por un árbitro o par\n- El tiempo desde el firmado de su cuenta no es de al menos 30 días\n- El método de pago para esta oferta se considera riesgoso para devoluciones de cargo\n\n{1} @@ -393,9 +392,8 @@ offerbook.warning.offerBlocked=Esta oferta ha sido bloqueada por los desarrollad offerbook.warning.currencyBanned=La moneda utilizada en esta oferta fue bloqueada por los desarrolladores de Bisq.\nPor favor visite el Forum de Bisq para más información. offerbook.warning.paymentMethodBanned=El método de pago utilizado en esta oferta fue bloqueado por los desarrolladores de Bisq.\nPor favor visite el Forum Bisq para más información. offerbook.warning.nodeBlocked=La dirección onion de este comerciante ha sido bloqueada por los desarrolladores de Bisq.\nProbablemente existe un error de software desatendido que causa problemas al tomar ofertas de este comerciante. -offerbook.warning.requireUpdateToNewVersion=Su versión de Bisq ya no es compatible para realizar intercambios.\nPor favor actualice a la última versión de Bisq en https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=Su cuenta de pago ha sido creada hace {0}. Su límite de intercambio está basado en la edad de cuenta y no es suficiente para esta oferta.\n\nSu límite de intercambio es: {1}\nLa cantidad mínima de intercambio para esta oferta es: {2}\n\nNo puede tomar esta oferta por ahora. Una vez que su cuenta sea mayor de 2 meses esta restricción se eliminará. -offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. +offerbook.warning.requireUpdateToNewVersion=Su versión de Bisq ya no es compatible para realizar intercambios.\nPor favor actualice a la última versión de Bisq en [HYPERLINK:https://bisq.network/downloads]. +offerbook.warning.offerWasAlreadyUsedInTrade=No puede aceptar esta oferta porque ya lo hizo antes. Podría ser que su intento anterior de aceptar esta oferta haya terminado como un intercambio fallido. offerbook.info.sellAtMarketPrice=Venderá a precio de mercado (actualizado cada minuto). offerbook.info.buyAtMarketPrice=Comprará a precio de mercado (actualizado cada minuto). @@ -445,7 +443,6 @@ createOffer.alreadyFunded=Ya había destinado fondos para esa oferta.\nSus fondo createOffer.createOfferFundWalletInfo.headline=Dote de fondos su trato. # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- Cantidad a intercambiar: {0}\n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} y {1} createOffer.createOfferFundWalletInfo.msg=Necesita depositar {0} para completar esta oferta.\n\nEsos fondos son reservados en su cartera local y se bloquearán en la dirección de depósito multifirma una vez que alguien tome su oferta.\nLa cantidad es la suma de:\n{1}- Su depósito de seguridad: {2}\n- Comisión de intercambio: {3}\n- Comisión de minado: {4}\n\nPuede elegir entre dos opciones a la hora de depositar fondos para realizar su intercambio:\n- Usar su cartera Bisq (conveniente, pero las transacciones pueden ser trazables) O también\n- Transferir desde una cartera externa (potencialmente con mayor privacidad)\n\nConocerá todos los detalles y opciones para depositar fondos al cerrar esta ventana. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=No puede tomar la oferta porque el tomador está takeOffer.warning.connectionToPeerLost=Ha perdido conexión con el creador.\nPuede haberse desconectado o haber cortado la conexión hacia usted debido a que existan demasiadas conexiones abiertas.\n\nSi aún puede ver la oferta en el libro de ofertas puede intentar tomarla de nuevo. takeOffer.error.noFundsLost=\n\nNingún importe de su cartera ha sido deducido aún.\nPor favor intente reiniciar su aplicación y compruebe la conexión a la red para ver si puede resolver el problema. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=.\n\n takeOffer.error.depositPublished=\n\nLa transacción de depósito ya se ha publicado.\nPor favor intente reiniciar su aplicación y compruebe su conexión a la red para ver si puede resolver el problema.\nSi el problema persiste, por favor contacte a los desarrolladores para solicitar asistencia. takeOffer.error.payoutPublished=\n\nLa transacción de pago ya se ha publicado.\nPor favor intente reiniciar su aplicación y compruebe su conexión a la red para ver si puede resolver el problema.\nSi el problema persiste, por favor contacte a los desarrolladores para solicitar asistencia. @@ -543,7 +541,7 @@ portfolio.tab.history=Historial portfolio.tab.failed=Fallidas portfolio.tab.editOpenOffer=Editar oferta -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=Hay un problema con una transacción no válida o faltante.\n\nNO envíe el pago fiat o altcoin. Póngase en contacto con los desarrolladores de Bisq en Keybase [HYPERLINK:https://keybase.io/team/bisq] o en el foro [HYPERLINK:https://bisq.community] para obtener más ayuda.\n\nMensaje de error: {0} portfolio.pending.step1.waitForConf=Esperar a la confirmación en la cadena de bloques portfolio.pending.step2_buyer.startPayment=Comenzar pago @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=REQUERIMIENTO IMPORTANTE:\nDespué # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=Por favor pague {0} al vendedor de BTC usando Western Union.\n\n portfolio.pending.step2_buyer.westernUnion.extra=REQUERIMIENTO IMPORTANTE:\nDespués de haber realizado el pago envíe el MTCN (número de seguimiento) y una foto de el recibo por email a el vendedor de BTC.\nEl recibo debe mostrar claramente el nombre completo del emisor, la ciudad, país y la cantidad. El email del vendedor es: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=Por favor envíe {0} mediante \"US Postal Money Order\" a el vendedor de BTC.\n\n @@ -636,7 +636,7 @@ portfolio.pending.step2_buyer.confirmStart.headline=Confirme que ha comenzado el portfolio.pending.step2_buyer.confirmStart.msg=¿Ha iniciado el pago de {0} a su par de intercambio? portfolio.pending.step2_buyer.confirmStart.yes=Sí, lo he iniciado. portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=No ha entregado una prueba de pago válida. -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=No ha introducido la transacción de ID y la clave de transacción.\n\nAl no proveer esta información el par no puede usar la autoconfirmación para liberar los BTC en cuanto los XMR se han recibido.\nAdemás de esto, Bisq requiere que el emisor de la transacción XMR sea capaz de entregar esta información al mediador o árbitro en caso de disputa.\nVea más detalles en la wiki de Bisq: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=No ha introducido la transacción de ID y la clave de transacción.\n\nAl no proveer esta información el par no puede usar la autoconfirmación para liberar los BTC en cuanto los XMR se han recibido.\nAdemás de esto, Bisq requiere que el emisor de la transacción XMR sea capaz de entregar esta información al mediador o árbitro en caso de disputa.\nVea más detalles en la wiki de Bisq: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=El valor introducido no es un valor hexadecimal de 32 bytes portfolio.pending.step2_buyer.confirmStart.warningButton=Ignorar y continuar de todos modos portfolio.pending.step2_seller.waitPayment.headline=Esperar al pago. @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=Información de contacto del com portfolio.pending.step2_seller.waitPayment.msg=La transacción del depósito tiene al menos una confirmación en la cadena de bloques.\nTiene que esperar hasta que el comprador de BTC comience el pago de {0}. portfolio.pending.step2_seller.warn=El comprador de BTC aún no ha realizado el pago de {0}.\nNecesita esperar hasta que el pago comience.\nSi el intercambio aún no se ha completado el {1} el árbitro procederá a investigar. portfolio.pending.step2_seller.openForDispute=El comprador de BTC no ha comenzado su pago!\nEl periodo máximo permitido ha finalizado.\nPuede esperar más y dar más tiempo a la otra parte o contactar con el mediador para abrir una disputa. -portfolio.pending.step2_seller.refresh=Refrescar Estado de Intercambio -portfolio.pending.step2_seller.refreshInfo=A veces los mensajes de la red P2P que confirman el pago no son entregados, causando que los intercambios queden bloqueados. Pulse el botón inferior para hacer que su par de intercambio reenvíe el último mensaje. tradeChat.chatWindowTitle=Ventana de chat para transacción con ID "{0}" tradeChat.openChat=Abrir ventana de chat tradeChat.rules=Puede comunicarse con su par de intercambio para resolver posibles problemas con este intercambio.\nNo es obligatorio responder en el chat.\nSi un comerciante viola alguna de las reglas de abajo, abra una disputa y repórtelo al mediador o árbitro.\n\nReglas del chat:\n\t● No enviar ningún enlace (riesgo de malware). Puedes enviar el ID de la transacción y el nombre de un explorador de bloques.\n\t● ¡No enviar las palabras semilla, llaves privadas, contraseñas u otra información sensible!\n\t● No alentar a intercambiar fuera de Bisq (sin seguridad).\n\t● No se enfrente a ningún intento de estafa de ingeniería social.\n\t● Si un par no responde y prefiere no comunicarse, respete su decisión.\n\t● Limite el tema de conversación al intercambio. Este chat no es un sustituto del messenger o troll-box.\n\t● Mantenga la conversación amigable y respetuosa. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=Debido a que el pago se hecho vía depósito portfolio.pending.step3_seller.moneyGram=El comprador tiene que enviarle el número de autorización y una foto del recibo por correo electrónico.\n\nEl recibo debe mostrar claramente el monto, asi como su nombre completo, país y demarcación (departamento,estado, etc.). Por favor revise su correo electrónico si recibió el número de autorización.\n\nDespués de cerrar esa ventana emergente (popup), verá el nombre y la dirección del comprador de BTC para retirar el dinero de MoneyGram.\n\n¡Solo confirme el recibo de transacción después de haber obtenido el dinero con éxito! portfolio.pending.step3_seller.westernUnion=El comprador tiene que enviarle el MTCN (número de seguimiento) y una foto de el recibo por email.\nEl recibo debe mostrar claramente su nombre completo, ciudad, país y la cantidad. Por favor compruebe su email si ha recibido el MTCN.\n\nDespués de cerrar ese popup verá el nombre del comprador de BTC y la dirección para recoger el dinero de Western Union.\n\nSolo confirme el recibo después de haber recogido satisfactoriamente el dinero! portfolio.pending.step3_seller.halCash=El comprador tiene que enviarle el código HalCash como un mensaje de texto. Junto a esto recibirá un mensaje desde HalCash con la información requerida para retirar los EUR de un cajero que soporte HalCash.\n\nDespués de retirar el dinero del cajero confirme aquí la recepción del pago! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nPor favor verifique también que el nombre y el emisor especificado en el contrato de intercambio se corresponde con el nombre que aparece en su declaración bancaria:\nNombre del emisor, para el contrato de intercambio: {0}\n\nSi los nombres no son exactamente los mismos, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=no confirme el recibo de pago. En su lugar, abra una disputa pulsando \"alt + o\" o \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=Confirmar recibo de pago portfolio.pending.step3_seller.amountToReceive=Cantidad a recibir @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=¿Ha recibido el pago de portfolio.pending.step3_seller.onPaymentReceived.fiat=La ID de intercambio/transacción (texto \"concepto de pago\") de la transacción es: \"{0}\"\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Por favor verifique también que el nombre del emisor especificado en el contrato de intercambio concuerda con el nombre que aparece en su declaración bancaria:\nNombre del emisor, para el contrato de intercambio: {0}\n\nSi los nombres no son exactamente los mismos, no confirme el recibo de pago. En su lugar, abra una disputa pulsando \"alt + o\" o \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.note=Por favor tenga en cuenta, que tan pronto como haya confirmado el recibo, la cantidad de intercambio bloqueada será librerada al comprador de BTC y el depósito de seguridad será devuelto. portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirme que ha recibido el pago portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Sí, he recibido el pago @@ -746,25 +747,20 @@ portfolio.pending.tradePeriodInfo=Después de la primera confirmación en la cad portfolio.pending.tradePeriodWarning=Si el periodo se excede ambos comerciantes pueden abrir una disputa. portfolio.pending.tradeNotCompleted=Intercambio no completado a tiempo(hasta {0}) portfolio.pending.tradeProcess=Proceso de intercambio -portfolio.pending.openAgainDispute.msg=Si no está seguro de que el mensaje al mediador o árbitro llegó (Ej. si no ha tenido respuesta después de 1 día), siéntase libre de abrir una disputa de nuevo con Cmd/Ctrl+o. También puede pedir ayuda adicional en el forum de Bisq en https://bisq.community. +portfolio.pending.openAgainDispute.msg=Si no está seguro de que el mensaje al mediador o árbitro llegó (Ej. si no ha tenido respuesta después de 1 día), siéntase libre de abrir una disputa de nuevo con Cmd/Ctrl+o. También puede pedir ayuda adicional en el forum de Bisq en [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=Abrir disputa de nuevo portfolio.pending.openSupportTicket.headline=Abrir ticket de soporte portfolio.pending.openSupportTicket.msg=Por favor use esta función solo en caso de emergencia si no se muestra el botón \"Abrir soporte\" o \"Abrir disputa\".\n\nCuando abra un ticket de soporte el intercambio se interrumpirá y será manejado por un mediador o un árbitro. portfolio.pending.timeLockNotOver=Tiene hasta ≈{0} ({1} bloques más) antes de que pueda abrir una disputa de arbitraje. portfolio.pending.error.depositTxNull=La transacción de depósito es inválida. No puede abrir una disputa sin una transacción de depósito válida. Por favor vaya a \"Configuración/Información de red\" y haga una resincronización SPV.\n\nPara obtener ayuda contacte con el equipo de soporte en el canal Bisq de Keybase. -portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is null. You can move the trade to failed trades. -portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. +portfolio.pending.mediationResult.error.depositTxNull=La transacción de depósito es nula. Puede mover la transacción a operaciones fallidas. +portfolio.pending.mediationResult.error.delayedPayoutTxNull=La transacción de pago demorado es nula. Puede mover la transacción a operaciones fallidas. portfolio.pending.error.depositTxNotConfirmed=El depósito de transacción no se ha confirmado. No puede abrir una disputa de arbitraje con una transacción de depósito no confirmada. Por favor espere a que se confirme o vaya a \"Configuración/Información de red\" y haga una resincronización SPV.\n\nPara más ayuda por favor contacte con el equipo de soporte en el canal Bisq de Keybase. -portfolio.pending.notification=Notificación - portfolio.pending.support.headline.getHelp=¿Necesita ayuda? portfolio.pending.support.text.getHelp=Si tiene algún problema puede intentar contactar al par de intercambio en el chat o preguntar en la la comunidad Bisq en https://bisq.comunnity. Si su problema no se resuelve, puede abrir una disputa con un mediador. -portfolio.pending.support.text.getHelp.arbitrator=Si tiene algún problema puede contactar con su par de intercambio en el chat o preguntar en la comunidad Bisq en https://bisq.community. Si su problema sigue sin resolverse, puede solicitar ayuda de un mediador. portfolio.pending.support.button.getHelp=Abrir chat de intercambio -portfolio.pending.support.popup.info=Si su problema con el intercambio no se resuelve, puede abrir un ticket de soporte para solicitar ayuda de un mediador. Si no ha recibido el pago, por favor espere hasta que termine el periodo de intercambio.\n\n¿Está seguro de que quiere abrir un ticket de soporte? -portfolio.pending.support.popup.button=Abrir ticket de soporte portfolio.pending.support.headline.halfPeriodOver=Comprobar pago portfolio.pending.support.headline.periodOver=El periodo de intercambio se acabó @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Mediación solicitada portfolio.pending.refundRequested=Devolución de fondos solicitada portfolio.pending.openSupport=Abrir ticket de soporte portfolio.pending.supportTicketOpened=Ticket de soporte abierto -portfolio.pending.requestSupport=Solicitar soporte -portfolio.pending.error.requestSupport=Por favor, reporte el problema a su mediador o árbitro.\n\nEllos reenviarán la información a los desarrolladores para investigar el problema.\nDespués que el problema se analice, se le devolverán todos los fondos bloqueados. portfolio.pending.communicateWithArbitrator=Por favor, comuníquese en la pantalla de \"Soporte\" con el árbitro. portfolio.pending.communicateWithMediator=Por favor, comuníquese en la pantalla \"Soporte\" con el mediador. -portfolio.pending.supportTicketOpenedMyUser=Ya ha abierto un ticket de soporte.\n{0} portfolio.pending.disputeOpenedMyUser=Ya ha abierto una disputa.\n{0} portfolio.pending.disputeOpenedByPeer=Su pareja de intercambio ha abierto una disputa\n{0} -portfolio.pending.supportTicketOpenedByPeer=Su pareja de intercambio ha abierto un ticket de soporte.\n{0} portfolio.pending.noReceiverAddressDefined=No se ha definido la dirección del receptor. -portfolio.pending.removeFailedTrade=¿Es este un intercambio fallido? ¿Si lo fuera, podría cerrarlo manualmente, para que no aparezca como un intercambio abierto? portfolio.pending.mediationResult.headline=Pago sugerido por la mediación portfolio.pending.mediationResult.info.noneAccepted=Complete el intercambio aceptando la sugerencia del mediador para el pago de la transacción. @@ -790,25 +781,25 @@ portfolio.pending.mediationResult.info.peerAccepted=El par de intercambio ha ace portfolio.pending.mediationResult.button=Ver resolución propuesta portfolio.pending.mediationResult.popup.headline=Resultado de mediación para el intercambio con ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=El par de intercambio ha aceptado la sugerencia del mediador para el intercmabio {0} -portfolio.pending.mediationResult.popup.info=El mediador ha sugerido el siguiente pago:\nUsted recibe: {0}\nEl par de intercambio recibe: {1}\n\nUsted puede aceptar o rechazar esta sugerencia de pago.\n\nAceptándola, usted firma el pago propuesto. Si su par de intercambio también acepta y firma, el pago se completará y el intercambio se cerrará.\n\nSi una o ambas partes rechaza la sugerencia, tendrá que esperar hasta {2} (bloque {3}) para abrir una segunda ronda de disputa con un árbitro que investigará el caswo de nuevo y realizará el pago de acuerdo a sus hallazgos.\n\nEl árbitro puede cobrar una tasa pequeña (tasa máxima: el depósito de seguridad del comerciante) como compensación por su trabajo. Que las dos partes estén de acuerdo es el buen camino, ya que requerir arbitraje se reserva para circunstancias excepcionales, como que un comerciante esté seguro de que el mediador hizo una sugerencia de pago injusta (o que la otra parte no responda).\n\nMás detalles acerca del nuevo modelo de arbitraje:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=El mediador ha sugerido el siguiente pago:\nUsted recibe: {0}\nEl par de intercambio recibe: {1}\n\nUsted puede aceptar o rechazar esta sugerencia de pago.\n\nAceptándola, usted firma el pago propuesto. Si su par de intercambio también acepta y firma, el pago se completará y el intercambio se cerrará.\n\nSi una o ambas partes rechaza la sugerencia, tendrá que esperar hasta {2} (bloque {3}) para abrir una segunda ronda de disputa con un árbitro que investigará el caso de nuevo y realizará el pago de acuerdo a sus hallazgos.\n\nEl árbitro puede cobrar una tasa pequeña (tasa máxima: el depósito de seguridad del comerciante) como compensación por su trabajo. Que las dos partes estén de acuerdo es el buen camino, ya que requerir arbitraje se reserva para circunstancias excepcionales, como que un comerciante esté seguro de que el mediador hizo una sugerencia de pago injusta (o que la otra parte no responda).\n\nMás detalles acerca del nuevo modelo de arbitraje:\n[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=Ha aceptado el pago sugerido por el mediador, pero parece que su par de intercambio no lo ha aceptado.\n\nUna vez que finaliza el tiempo de bloqueo en el {0} (bloque {1}), puede abrir una segunda ronda de disputa con un árbitro que investigará el caso nuevamente y realizará un pago en función de sus hallazgos.\n\nPuede encontrar más detalles sobre el modelo de arbitraje en:\n[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Rechazar y solicitar arbitraje portfolio.pending.mediationResult.popup.alreadyAccepted=Ya ha aceptado -portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. -portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} -portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Move trade to failed trades -portfolio.pending.failedTrade.warningIcon.tooltip=Click to open details about the issues of this trade -portfolio.failed.revertToPending.popup=Do you want to move this trade to open trades? -portfolio.failed.revertToPending=Move trade to open trades +portfolio.pending.failedTrade.taker.missingTakerFeeTx=Falta la transacción de tasa de tomador\n\nSin esta tx, el intercambio no se puede completar. No se han bloqueado fondos y no se ha pagado ninguna tasa de intercambio. Puede mover esta operación a intercambios fallidos. +portfolio.pending.failedTrade.maker.missingTakerFeeTx=Falta la transacción de tasa de tomador de su par.\n\nSin esta tx, el intercambio no se puede completar. No se han bloqueado fondos. Su oferta aún está disponible para otros comerciantes, por lo que no ha perdido la tasa de tomador. Puede mover este intercambio a intercambios fallidos. +portfolio.pending.failedTrade.missingDepositTx=Falta la transacción de depósito (la transacción multifirma 2 de 2).\n\nSin esta tx, el intercambio no se puede completar. No se han bloqueado fondos, pero se ha pagado su tarifa comercial. Puede hacer una solicitud para que se le reembolse la tarifa comercial aquí: [HYPERLINK:https://github.com/bisq-network/support/issues].\n\nSiéntase libre de mover esta operación a operaciones fallidas. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=Falta la transacción de pago demorado, pero los fondos se han bloqueado en la transacción de depósito.\n\nNO envíe el pago fiat o altcoin al vendedor de BTC, porque sin el tx de pago demorado, no se puede abrir el arbitraje. En su lugar, abra un ticket de mediación con Cmd / Ctrl + o. El mediador debe sugerir que ambos pares recuperen el monto total de sus depósitos de seguridad (y el vendedor también recibirá el monto total de la operación). De esta manera, no hay riesgo en la seguridad y solo se pierden las tarifas comerciales.\n\nPuede solicitar un reembolso por las tarifas comerciales perdidas aquí: [HYPERLINK:https://github.com/bisq-network/support/issues]. +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Falta la transacción del pago demorado, pero los fondos se han bloqueado en la transacción de depósito.\n\nSi al comprador también le falta la transacción de pago demorado, se le indicará que NO envíe el pago y abra un ticket de mediación. También debe abrir un ticket de mediación con Cmd / Ctrl + o.\n\nSi el comprador aún no ha enviado el pago, el mediador debe sugerir que ambos pares recuperen el monto total de sus depósitos de seguridad (y el vendedor también recibirá el monto total de la operación). De lo contrario, el monto comercial debe ir al comprador.\n\nPuede solicitar un reembolso por las tarifas comerciales perdidas aquí: [HYPERLINK:https://github.com/bisq-network/support/issues]. +portfolio.pending.failedTrade.errorMsgSet=Hubo un error durante la ejecución del protocolo de intercambio.\n\nError: {0}\n\nPuede ser que este error no sea crítico y que el intercambio se pueda completar normalmente. Si no está seguro, abra un ticket de mediación para obtener consejos de los mediadores de Bisq.\n\nSi el error fue crítico y la operación no se puede completar, es posible que haya perdido su tarifa de operación. Solicite un reembolso por las tarifas comerciales perdidas aquí: [HYPERLINK:ttps://github.com/bisq-network/support/issues]. +portfolio.pending.failedTrade.missingContract=El contrato del intercambio no está establecido.\n\nLa operación no se puede completar y es posible que haya perdido su tarifa de operación. Si es así, puede solicitar un reembolso por las tarifas comerciales perdidas aquí: [HYPERLINK:https://github.com/bisq-network/support/issues]. +portfolio.pending.failedTrade.info.popup=El protocolo de intercambio encontró algunos problemas.\n\n{0} +portfolio.pending.failedTrade.txChainInvalid.moveToFailed=El protocolo de intercambio encontró un problema grave.\n\n{0}\n\n¿Quiere mover la operación a intercambios fallidos?\n\nNo puede abrir mediación o arbitraje desde la vista de operaciones fallidas, pero puede mover un intercambio fallido a la pantalla de intercambios abiertos en cualquier momento. +portfolio.pending.failedTrade.txChainValid.moveToFailed=El protocolo de intercambio encontró algunos problemas.\n\n{0}\n\nLas transacciones del intercambio se han publicado y los fondos están bloqueados. Mueva la operación a operaciones fallidas solo si está realmente seguro. Podría impedir opciones para resolver el problema.\n\n¿Quiere mover la operación a operaciones fallidas?\n\nNo puede abrir mediación o el arbitraje desde la vista de intercambios fallidos, pero puede mover un intercambio fallido a la pantalla de intercambios abiertos en cualquier momento. +portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Mover intercambio a intercambios fallidos +portfolio.pending.failedTrade.warningIcon.tooltip=Clique para mostrar los detalles sobre los problemas en este intercambio +portfolio.failed.revertToPending.popup=¿Quiere mover este intercambio a intercambios abiertos? +portfolio.failed.revertToPending=Mueva intercambio a intercambios abiertos portfolio.closed.completed=Completado portfolio.closed.ticketClosed=Arbitrada @@ -817,8 +808,8 @@ portfolio.closed.canceled=Cancelado portfolio.failed.Failed=Fallado portfolio.failed.unfail=Antes de continuar, ¡asegúrese de tener un respaldo de su directorio de datos!\n¿Desea mover este intercambio de nuevo a intercambios abiertos?\nEsta es una forma de desbloquear los fondos retenidos en los intercambios fallidos. portfolio.failed.cantUnfail=Este intercambio no puede ser movido de nuevo a intercambios abiertos en este momento.\nIntente de nuevo después de completar el/los intercambios/s {0} -portfolio.failed.depositTxNull=The trade cannot be reverted to a open trade. Deposit transaction is null. -portfolio.failed.delayedPayoutTxNull=The trade cannot be reverted to a open trade. Delayed payout transaction is null. +portfolio.failed.depositTxNull=El intercambio no se puede revertir a intercambios abiertos. La transacción de depósito es nula. +portfolio.failed.delayedPayoutTxNull=El intercambio no se puede revertir a uno abierto. La transacción del pago demorado es nula. #################################################################### @@ -839,6 +830,7 @@ funds.deposit.fundWallet=Dotar de fondos su monedero funds.deposit.withdrawFromWallet=Enviar fondos desde monedero funds.deposit.amount=Cantidad en BTC (opcional) funds.deposit.generateAddress=Generar una nueva dirección +funds.deposit.generateAddressSegwit=Formato de segwit nativo (Bech32) funds.deposit.selectUnused=Por favor seleccione una dirección no utilizada de la tabla de arriba en vez de generar una nueva. funds.withdrawal.arbitrationFee=Tasa de arbitraje @@ -912,21 +904,21 @@ support.tab.ArbitratorsSupportTickets=Tickets de {0} support.filter=Buscar disputas support.filter.prompt=Introduzca ID de transacción, fecha, dirección onion o datos de cuenta. -support.sigCheck.button=Verify result -support.sigCheck.popup.info=In case of a reimbursement request to the DAO you need to paste the summary message of the mediation and arbitration process in your reimbursement request on Github. To make this statement verifiable any user can check with this tool if the signature of the mediator or arbitrator matches the summary message. -support.sigCheck.popup.header=Verify dispute result signature -support.sigCheck.popup.msg.label=Summary message -support.sigCheck.popup.msg.prompt=Copy & paste summary message from dispute -support.sigCheck.popup.result=Validation result -support.sigCheck.popup.success=Signature is valid -support.sigCheck.popup.failed=Signature verification failed -support.sigCheck.popup.invalidFormat=Message is not of expected format. Copy & paste summary message from dispute. +support.sigCheck.button=Verificar resultado +support.sigCheck.popup.info=En caso de una solicitud de reembolso a la DAO, debe pegar el mensaje de resumen del proceso de mediación y arbitraje en su solicitud de reembolso en Github. Para que esta declaración sea verificable, cualquier usuario puede verificar con esta herramienta si la firma del mediador o árbitro coincide con el resumen del mensaje. +support.sigCheck.popup.header=Verificar firma del resultado de la disputa +support.sigCheck.popup.msg.label=Mensaje de resumen +support.sigCheck.popup.msg.prompt=Copie y pegue el mensaje de resumen de la disputa +support.sigCheck.popup.result=Resultado de la validación +support.sigCheck.popup.success=La firma es válida +support.sigCheck.popup.failed=La verificación de la firma ha fallado +support.sigCheck.popup.invalidFormat=El mensaje no tiene el formato esperado. Copie y pegue el resumen del mensaje desde la disputa. support.reOpenByTrader.prompt=¿Está seguro de que quiere reabrir la disputa? -support.reOpenButton.label=Re-open +support.reOpenButton.label=Volver a abrir support.sendNotificationButton.label=Notificación privada -support.reportButton.label=Report -support.fullReportButton.label=All disputes +support.reportButton.label=Reportar +support.fullReportButton.label=Todas las disputas support.noTickets=No hay tickets abiertos support.sendingMessage=Enviando mensaje... support.receiverNotOnline=El receptor no está conectado. El mensaje se ha guardado en su bandeja de entrada. @@ -970,9 +962,9 @@ support.peerOpenedDispute=Su pareja de intercambio ha solicitado una disputa.\n\ support.peerOpenedDisputeForMediation=Su par de intercambio ha solicitado mediación.\n\n{0}\n\nVersión Bisq: {1} support.mediatorsDisputeSummary=Mensaje de sistema: Resumen de la disputa del mediador: {0} support.mediatorsAddress=Dirección del nodo del mediador: {0} -support.warning.disputesWithInvalidDonationAddress=The delayed payout transaction has used an invalid receiver address. It does not match any of the DAO parameter values for the valid donation addresses.\n\nThis might be a scam attempt. Please inform the developers about that incident and do not close that case before the situation is resolved!\n\nAddress used in the dispute: {0}\n\nAll DAO param donation addresses: {1}\n\nTrade ID: {2}{3} -support.warning.disputesWithInvalidDonationAddress.mediator=\n\nDo you still want to close the dispute? -support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nYou must not do the payout. +support.warning.disputesWithInvalidDonationAddress=La transacción del pago demorado utilizó una dirección de receptor inválido. No coincide con ninguno de los valores de parámetro de la DAO para las direcciones de donación válidas.\n\nEsto podría ser un intento de estafa. Informe a los desarrolladores sobre ese incidente y no cierre ese caso antes de que se resuelva la situación.\n\nDirección utilizada en la disputa: {0}\n\nTodas las direcciones de donación en los parámetros de la DAO: {1}\n\nIdentificación comercial: {2} {3} +support.warning.disputesWithInvalidDonationAddress.mediator=\n\n¿Aún quiere cerrar la disputa? +support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nUsted no debería realizar el pago. #################################################################### @@ -986,6 +978,7 @@ setting.preferences.general=Preferencias generales setting.preferences.explorer=Explorador Bitcoin setting.preferences.explorer.bsq=Explorador Bisq setting.preferences.deviation=Desviación máxima del precio de mercado +setting.preferences.bsqAverageTrimThreshold=Umbral de valores atípicos de la tasa de BSQ setting.preferences.avoidStandbyMode=Evitar modo en espera setting.preferences.autoConfirmXMR=Autoconfirmación XMR setting.preferences.autoConfirmEnabled=Habilitado @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Confirmaciones requeridas setting.preferences.autoConfirmMaxTradeSize=Cantidad máxima de intecambio (BTC) setting.preferences.autoConfirmServiceAddresses=Explorador de URLs Monero (usa Tor, excepto para localhost, direcciones LAN IP, y hostnames *.local) setting.preferences.deviationToLarge=No se permiten valores superiores a {0}% -setting.preferences.txFee=Comisión de transacción de retiro (satoshis/byte) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=Usar valor personalizado -setting.preferences.txFeeMin=La comisión de transacción debe ser al menos de {0} sat/byte -setting.preferences.txFeeTooLarge=El valor introducido está muy por encima de lo razonable (>5000 satoshis/byte). La comisión de transacción normalmente está en el rango de 50-400 satoshis/byte. +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Pares ignorados [dirección onion:puerto] -setting.preferences.refererId=ID de referido setting.preferences.ignoreDustThreshold=Valor mínimo de output que no sea dust -setting.preferences.refererId.prompt=ID de referido opcional: setting.preferences.currenciesInList=Monedas en lista para precio de mercado setting.preferences.prefCurrency=Moneda preferida setting.preferences.displayFiat=Mostrar monedas nacionales @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=Usar animaciones setting.preferences.useDarkMode=Usar modo oscuro setting.preferences.sortWithNumOffers=Ordenar listas de mercado por número de ofertas/intercambios setting.preferences.resetAllFlags=Restablecer todas las casillas \"No mostrar de nuevo\" -setting.preferences.reset=Restablecer settings.preferences.languageChange=Para aplicar un cambio de idioma en todas las pantallas, se precisa reiniciar. settings.preferences.supportLanguageWarning=En caso de disputa, tenga en cuenta que la mediación se maneja en {0} y el arbitraje en {1}. -settings.preferences.selectCurrencyNetwork=Seleccionar red setting.preferences.daoOptions=Opciones de DAO setting.preferences.dao.resyncFromGenesis.label=Reconstruir estado de la DAO desde la tx génesis setting.preferences.dao.resyncFromResources.label=Reconstruir el estado de la DAO desde recursos @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=Puerto de notificación de bloque setting.preferences.dao.fullNodeInfo=Para ejecutar Bisq como un nodo completo de la DAO necesita estar ejecutando localmente Bitcoin Core con RPC activado. Todos los requisitos están documentados en ''{0}''.\n\nDespués de cambiar el modo, necesita reiniciar. setting.preferences.dao.fullNodeInfo.ok=Abrir página de documentos setting.preferences.dao.fullNodeInfo.cancel=No, me quedo con el modo ligero +settings.preferences.editCustomExplorer.headline=Configuraciones de explorador +settings.preferences.editCustomExplorer.description=Elija un explorador definido por el sistema de la lista de la izquierda, y/o personalícelo para ajustarse a sus preferencias. +settings.preferences.editCustomExplorer.available=Exploradores disponibles +settings.preferences.editCustomExplorer.chosen=Configuración de exploradores elegidos +settings.preferences.editCustomExplorer.name=Nombre +settings.preferences.editCustomExplorer.txUrl=URL de transacción +settings.preferences.editCustomExplorer.addressUrl=URL de la dirección settings.net.btcHeader=Red Bitcoin settings.net.p2pHeader=Red Bisq @@ -1044,7 +1040,7 @@ settings.net.bitcoinNodesLabel=Nodos Bitcoin Core para conectarse settings.net.useProvidedNodesRadio=Utilizar nodos Bitcoin Core proporcionados settings.net.usePublicNodesRadio=Utilizar red pública Bitcoin settings.net.useCustomNodesRadio=Utilizar nodos Bitcoin Core personalizados -settings.net.warn.usePublicNodes=Si usa la red pública de Bitcoin está expuesto a problemas de privacidad causados por el fallo en el diseño y la implementación del filtro bloom que se utiliza para carteras SPV como BitcoinJ (usado en Bisq). Cualquier nodo completo al que esté conectado podría conocer que todas las direcciones del monedero pertenecen a una entidad.\n\nPor favor, lea más sobre los detalles en: https://bisq.network/blog/privacy-in-bitsquare.\n\n¿Está seguro de que quiere utilizar los nodos públicos? +settings.net.warn.usePublicNodes=Si usa la red pública de Bitcoin está expuesto a problemas de privacidad causados por el fallo en el diseño y la implementación del filtro bloom que se utiliza para carteras SPV como BitcoinJ (usado en Bisq). Cualquier nodo completo al que esté conectado podría conocer que todas las direcciones del monedero pertenecen a una entidad.\n\nPor favor, lea más sobre los detalles en: [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\n¿Está seguro de que quiere utilizar los nodos públicos? settings.net.warn.usePublicNodes.useProvided=No, utilizar nodos proporcionados settings.net.warn.usePublicNodes.usePublic=Sí, utilizar la red pública settings.net.warn.useCustomNodes.B2XWarning=¡Por favor, asegúrese de que su nodo Bitcoin es un nodo de confianza Bitcoin Core!\n\nConectar a nodos que no siguen las reglas de consenso puede causar perjuicios a su cartera y causar problemas en el proceso de intercambio.\n\nLos usuarios que se conecten a los nodos que violan las reglas de consenso son responsables de cualquier daño que estos creen. Las disputas causadas por ello se decidirán en favor del otro participante. No se dará soporte técnico a usuarios que ignoren esta advertencia y los mecanismos de protección! @@ -1150,16 +1146,14 @@ setting.about.shortcuts.sendPrivateNotification=Enviar notificación privada a l setting.about.shortcuts.sendPrivateNotification.value=Abrir información de par en el avatar o disputa y pulsar: {0} setting.info.headline=Nueva función de autoconfirmación XMR -setting.info.msg=Al vender XMR por XMR puede usar la función de autoconfirmación para verificar que la cantidad correcta de XMR se envió al monedero con lo que Bisq pueda marcar el intercambio como completo, haciendo los intercambios más rápidos para todos.\n\nLa autoconfirmación comprueba que la transacción de XMR en al menos 2 nodos exploradores XMR usando la clave de transacción entregada por el emisor XMR. Por defecto, Bisq usa nodos exploradores ejecutados por contribuyentes Bisq, pero recomendamos usar sus propios nodos exploradores para un máximo de privacidad y seguridad.\n\nTambién puede configurar la cantidad máxima de BTC por intercambio para la autoconfirmación, así como el número de confirmaciones en Configuración.\n\nVea más detalles (incluído cómo configurar su propio nodo explorador) en la wiki Bisq: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.msg=Al vender XMR por XMR puede usar la función de autoconfirmación para verificar que la cantidad correcta de XMR se envió al monedero con lo que Bisq pueda marcar el intercambio como completo, haciendo los intercambios más rápidos para todos.\n\nLa autoconfirmación comprueba que la transacción de XMR en al menos 2 nodos exploradores XMR usando la clave de transacción entregada por el emisor XMR. Por defecto, Bisq usa nodos exploradores ejecutados por contribuyentes Bisq, pero recomendamos usar sus propios nodos exploradores para un máximo de privacidad y seguridad.\n\nTambién puede configurar la cantidad máxima de BTC por intercambio para la autoconfirmación, así como el número de confirmaciones en Configuración.\n\nVea más detalles (incluído cómo configurar su propio nodo explorador) en la wiki Bisq: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=Registro de árbitro account.tab.mediatorRegistration=Registro de mediador account.tab.refundAgentRegistration=Registro de agente de devolución de fondos account.tab.signing=Firmado -account.tab.account=Cuenta account.info.headline=Bienvenido a su cuenta Bisq account.info.msg=Aquí puede añadir cuentas de intercambio para monedas nacionales y altcoins y crear una copia de su cartera y datos de cuenta.\n\nUna nueva cartera Bitcoin fue creada la primera vez que inició Bisq.\n\nRecomendamos encarecidamente que escriba sus palabras de la semilla de la cartera Bitcoin (mire pestaña arriba) y considere añadir una contraseña antes de enviar fondos. Los ingresos y retiros de Bitcoin se administran en la sección \"Fondos\".\n\nNota de privacidad y seguridad: Debido a que Bisq es un exchange descentralizado, todos sus datos se guardan en su ordenador. No hay servidores, así que no tenemos acceso a su información personal, sus saldos, o incluso su dirección IP. Datos como número de cuenta bancaria, direcciones altcoin y Bitcoin, etc son solo compartidos con su par de intercambio para completar intercambios iniciados (en caso de una disputa el mediador o árbitro verá los mismos datos que el par de intercambio). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=No se pudo completar el registro.{ account.altcoin.yourAltcoinAccounts=Sus cuentas de altcoin account.altcoin.popup.wallet.msg=Por favor, asegúrese que sigue los requisitos para el uso de carteras {0} como se describe en la página web {1}.\nUsando carteras desde exchanges centralizados donde (a) usted no controla sus claves o (b) que no usan monederos compatibles con el software es un riesgo: ¡puede llevar a la perdida de los fondos intercambiados!\nEl mediador o árbitro no es un especialista en {2} y no puede ayudar en tales casos. account.altcoin.popup.wallet.confirm=Entiendo y confirmo que sé qué monedero tengo que utilizar. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Para intercambiar UPX en bisq es preciso que usted entienda y cumpla los siguientes requerimientos:\n\nPara enviar upx es preciso que use el monedero oficial de uPlexa GUI o el de uPlexa CLI con la opción "store-tx-info" habilitada (predeterminada en las nuevas versiones). Por favor, asegúrese de poder acceder a las llaves tx, ya que podrían requerirse en caso de disputa.\nuplexa-wallet-cli (utilice el comando get_tx_key)\nuplexa-wallet-gui (vaya a la pestaña historial y haga clic en el botón (P) para prueba de pago).\nEn los exploradores de bloques normales la transferencia no es verificable.\nUsted necesita proporcionar al árbitro los siguientes datos en caso de disputa:\n- La llave privada tx\n- El hash de la transacción\n- La dirección publica de recepción\nSi no proporciona los datos arriba señalados, o si utilizó una cartera incompatible, perderá la disputa.\nLa parte que envía UPX es responsable de proporcionar las evidencias de la transferencia de UPX al árbitro en caso de disputa.\nNo se requiere ID de pago, solo la dirección pública normal.\nSi no está seguro sobre el proceso, visite el canal de conflictos de uPlexa https://discord.gg/vhdNSrV) o el Chat de Telegram de uPlexa (https://t.me/uplexaOfficial) para encontrar más información. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=El ARQ de intercambio de Bisq requiere que entienda y cumpla los siguientes requerimientos:\n\nPara el ARQ de envío, necesita utilizar la cartera oficial ArQmA GUI o una cartera ArQmA CLI con la opción store-tx-info habilitada (predeterminada en nuevas versiones). Por favor asegúrese de poder acceder a la llave tx ya que podría ser requerido en caso de disputa.\narqma-wallet-cli (utilice el comando get_tx_key)\narqma-wallet-gui (vaya a la pestaña historial y pulse el botón (P) para prueba de pago)\n\nEn los exploradores de bloques normales la transferencia no es verificable.\n\nNecesita proveer al mediador o al árbitro los siguientes datos en caso de disputa:\n- El tx de la llave privada\n- El hash de transacción\n- La dirección publica de recepción\n\nNo proveer los datos arriba señalados, o si utilizó una cartera incompatible, resultará en perder la disputa. La parte ARQ que envía es responsable de proveer verificación de la transferencia ARQ al mediador o al árbitro en caso de disputa.\n\nNo se requiere ID de pago, solo la dirección pública normal.\nSi no está seguro sobre el proceso visite el canal ArQmA en discord (https://discord.gg/s9BQpJT) o el foro de ArQmA (https://labs.arqma.com) para encontrar más información. -account.altcoin.popup.xmr.msg=Intercambiar XMR en Bisq requiere entender y cumplir los siguientes requisitos\n\nPruebas de pago:\n\n\nSi está vendiendo XMR, debe ser capaz de entregar la siguiente información en caso de disputa:\n\n- La clave de transacción (Tx key, Tx Secret Key o Tx Private Key)\n- La ID de transacción (Tx ID o Tx Hash)\n- La dirección de destino (recipient's address)\n\nVea la wiki para detalles sobre dónde encontrar esta información en los principales monederos XMR:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\n\nNo entregar estos datos de transacción resultará en pérdida de la disputa.\n\nTenga en cuenta que Bisq ahora ofrece confirmación automática de transacciones XMR para realizar intercambios más rápido, pero necesita habilitarlo en Configuración. \n\nVea la wiki para más información sobre la función de autoconfirmación.\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Intercambiar XMR en Bisq requiere entender y cumplir los siguientes requisitos\n\nPruebas de pago:\n\n\nSi está vendiendo XMR, debe ser capaz de entregar la siguiente información en caso de disputa:\n\n- La clave de transacción (Tx key, Tx Secret Key o Tx Private Key)\n- La ID de transacción (Tx ID o Tx Hash)\n- La dirección de destino (recipient's address)\n\nVea la wiki para detalles sobre dónde encontrar esta información en los principales monederos XMR:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\n\nNo entregar estos datos de transacción resultará en pérdida de la disputa.\n\nTenga en cuenta que Bisq ahora ofrece confirmación automática de transacciones XMR para realizar intercambios más rápido, pero necesita habilitarlo en Configuración. \n\nVea la wiki para más información sobre la función de autoconfirmación.\n[HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Para intercambiar MSR en Bisq es necesario que usted entienda y cumpla los siguientes requisitos:\n\nPara enviar MSR es necesario que use el monedero oficial de Masari monedero GUI o Masari monedero CLI con la opción "store-tx-info" habilitada (predeterminada en las nuevas versiones) o el monedero oficial Masari Web (https://wallet.getmasari.org). Por favor, asegúrese de poder acceder a las llaves tx, ya que podrían requerirse en caso de alguna disputa. \nmasari-wallet-cli (utilice el comando get_tx_key)\nmasari-wallet-gui (vaya a la pestaña historial y haga clic en el botón (P) para prueba de pago). \n\nMonedero Masari Web (vaya a Cuenta -> historial transacción y vea los detalles de su transacción enviada.)\n\nPuede lograr verificación de la transacción dentro del monedero:\nmasari-wallet-cli : usando el comando (check_tx_key).\nmasari-wallet-gui: vaya a la pestaña Avanzado > Comprobar/Revisar.\nVerificación de transacción también se puede lograr desde el explorador de bloques\nAbrir explorador de bloques (https://explorer.getmasari.org), use la barra de búsqueda para buscar el hash de transacción. \nCuando encuentre su transacción, navegue hacia el final donde dice "Comprobar Envío" y rellene los detalles necesarios. \nUsted necesita compartir esta información con el mediador o árbitro en caso de disputa:\n- La clave privada tx\n- El hash de transacción\n- La dirección pública del que recibe\n\nSi no proporciona los datos arriba señalados, o si utilizó una cartera incompatible, perderá la disputa. El que envía MSR es responsable de entregar la verificación de transferencia al mediador o árbitro en caso de disputa.\n\nNo se requiere el ID de pago, sólo la dirección pública normal.\nSi no está seguro sobre el proceso, pida ayuda visitando el canal oficial de Masari en Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Intercambiar BLUR en Bisq requiere que entienda y cumpla los siguientes requisitos:\n\nPara enviar BLUR debe usar Blur Network CLI o la cartera GUI. \n\nSi utiliza la cartera CLI, un hash de transacción (tx ID) se mostrará después de hacer una transferencia. Deberá guardar esta información. Inmediatamente después de enviar la transferencia, deberá utilizar el comando 'get_tx_key' para obtener la clave privada de transacción. Si no realiza este paso, es posible que no pueda obtener la llave mas tarde. \n\nSi utiliza la cartera Blur Network GUI, la clave privada de transacción y el ID de transacción puede ser encontrada convenientemente en la pestaña "Historia". Inmediatamente después del envío, localice la transacción de interés. Pulse en el símbolo "?" en la esquina inferior derecha de la caja que contiene la transacción. Debe guardar esta información. \n\nEn caso de que sea necesaria una disputa, deberá presentar lo siguiente al mediador o al árbitro: 1.) el ID de transacción, 2.) la clave privada de transacción, y 3.) la dirección de destino. El mediador o árbitro entonces verificará la transferencia BLUR utilizando el Visor de Transacción Blur (https://blur.cash/#tx-viewer).\n\nSi no se proporciona la información requerida al mediador o al árbitro se perderá el caso de disputa. En todos los casos de disputa, el remitente BLUR asume el 100% de la responsabilidad en la verificación de las transacciones a un mediador o a un árbitro.. \n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Para intercambiar Solo en Bisq es necesario que usted entienda y cumpla los siguientes requisitos:\n\nPara enviar Solo es necesario que use el monedero Solo Network Monedero CLI\n\nSi usted usa el monedero CLI el hash de transacción (tx ID) aparecerá después de la transferencia. Usted debe guardar esta información. Inmediatamente después de mandar de la transferencia, usted debe usar el comando 'get_tx_key' para guardar la clave privada de transacción. Si usted no guarda esta información, es posible que no podrá coleccionar esta clave después .\n\nUsted necesita compartir esta información con el mediador o árbitro en caso de disputa:\n1.) el ID de transacción, 2.) la clave privada de transacción y 3.) la dirección pública de recepción. El mediador o árbitro podrá verificar la transferencia de Solo usando el explorador de bloques Solo, buscando la transacción y usando la función "Prove sending" (https://explorer.minesolo.com/).\n\nSi no proporciona los datos arriba señalados al mediador o árbitro perderá la disputa. En todos los casos de disputa, el emisor de Solo es 100% responsable de entregar la verificación de envío al mediador o árbitro.\n\nSi no está seguro o no entiendo estos requisitos, no haga intercambio/transacción en Bisq. Primero, pida ayuda visitando el canal oficial de Solo Network en Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Intercambiar CASH2 en Bisq requiere que usted comprenda y cumpla con los siguientes requisitos:\n\nPara enviar CASH2, debe utilizar la cartera Cash2 versión 3 o superior. \n\nDespués de que se envía una transacción, se mostrará el ID de transacción. Debe guardar esta información. Inmediatamente después de enviar la transacción, debe usar el comando 'getTxKey' en simplewallet para recuperar la llave secreta de la transacción. \n\nEn el caso de que sea necesario un arbitraje, debe presentar lo siguiente a un mediador o a un árbitro: 1) ID de transacción, 2) la llave secreta de la transacción y 3) la dirección Cash2 del destinatario. El mediador o el árbitro entonces verificará la transferencia CASH2 usando el Explorador de Bloques Cash2 (https://blocks.cash2.org).\n\nSi no se proporciona la información requerida al mediador o al árbitro, se perderá el caso de disputa. En todos los casos de disputa, el remitente de CASH2 lleva el 100% de la carga de la responsabilidad de verificar las transacciones a un mediador o a un árbitro.\n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Intercambiar Qwertycoin en Bisq requiere que usted comprenda y cumpla los siguientes requisitos:\n\nPara enviar QWC, debe utilizar la cartera oficial QWC versión 5.1.3 o superior. \n\nDespués de que se envía una transacción, se mostrará el ID de transacción. Debe guardar esta información. Inmediatamente después de enviar la transacción, debe usar el comando 'get_Tx_Key' en simplewallet para recuperar la llave secreta de la transacción.\n\nEn el caso de que sea necesario un arbitraje, debe presentar lo siguiente a un mediador o un árbitro: 1) ID de transacción, 2) la llave secreta de la transacción y 3) la dirección QWC del destinatario. El mediador o el árbitro entonces verificará la transferencia QWC usando el Explorador de Bloques QWC (https://explorer.qwertycoin.org).\n\nSi no se proporciona la información requerida al mediador o al árbitro, se perderá el caso de disputa. En todos los casos de disputa, el remitente de QWC lleva el 100% de la carga de la responsabilidad de verificar las transacciones a un mediador o un árbitro.\n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Intercambiar Dragonglass on Bisq requiere que usted comprenda y cumpla los siguientes requisitos:\n\nDebido a la privacidad que Dragonglass provee, una transacción no es verificable en la blockchain pública. Si es requerido, usted puede probar su pago a través del uso de su TXN-Private-Key.\nLa TXN-clave privada es una one-time clave generada automáticamente para cada transacción que solo puede ser accedida desde dentro de su cartera DRGL.\nO por DRGL-wallet GUI (dentro del diálogo de detalles de transacción) o por la Dragonglass CLI simplewallet (usando el comando "get_tx_key").\n\nDRGL version 'Oathkeeper' y superior son REQUERIDAS para ambos.\n\nEn caso de que sea necesario un arbitraje, debe presentar lo siguiente a un mediador o un árbitro:\n- La TXN-clave privada\n- El hash de transacción\n- La dirección pública del destinatario\n\nLa verificación de pago puede ser hecha usando los datos de arriba en (http://drgl.info/#check_txn).\n\nNo proporcionar los datos anteriores, o si usted usó una cartera incompatible, resultará en la pérdida del caso de disputa. El Dragonglass remitente es responsable de proveer verificación de la transferencia DRGL al mediador o al árbitro en caso de una disputa. El uso de PaymentID no es requerido.\n\nSi usted no está seguro sobre cualquier parte de este proceso, visite Dragonglass en Discord (http://discord.drgl.info) para ayuda. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=Al usar Zcash solo puede usar las direcciones transparentes (que comienzan con t), no las direcciones-z (privadas), porque el mediador o el árbitro no sería capaz de verificar la transacción con direcciones-z. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=Al usar Zcoin puede usar únicamente las direcciones transparentes (trazables) y no las no-trazables, porque el mediador o el árbitro no sería capaz de verificar la transacción con direcciones no trazables en el explorador de bloques. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN requiere un proceso interactivo entre el emisor y el receptor para crear la transacción. Asegúrese de seguir las instrucciones de la web del proyecto GRIN para enviar y recibir GRIN con seguridad (el receptor necesita estar en línea o al menos estar en línea durante un cierto periodo de tiempo).\nBisq solo soporta el Grinbox (Wallet713) monedero URL formato.\n\nEl emisor GRIN requiere proveer prueba que ha enviado GRIN correctamente. Si el monedero no puede proveer esa prueba, una posible controversia será resuelta a favor del GRIN receptor. Por favor asegúrese que usa el último Grinbox software que soporta la prueba de transacción y que usted entiende el proceso de transferir y recibir GRIN así como la forma de crear la prueba.\n\nVer https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only para más información sobre la herramienta de prueba Grinbox. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAM requiere un proceso interactivo entre el emisor y el receptor para crear la transacción.\n\nAsegúrese de seguir la instrucciones de la página web del proyecto BEAM para enviar y recibir BEAM con seguridad (el receptor necesita estar el línea o por lo menos estar en línea durante cierto periodo de tiempo).\n\nEl emisor BEAM requiere proveer prueba de que envió BEAM correctamente. Asegúrese de usar software de monedero que pueda producir tal prueba. Si el monedero no provee la prueba, una posible controversia será resuelta en favor del BEAM receptor. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Intercambiar ParsiCoin en Bisq requiere que usted comprenda y cumpla con los siguientes requisitos:\n\nPara enviar PARS, debe usar la cartera oficial ParsiCoin version 3.0.0 o superior.\n\nPuede comprobar su hash de transacción y la clave de la transacción en la sección de Transacciones en su cartera GUI (ParsiPay). Necesita pulsar el botón derecho en la transacción y pulsar mostrar detalles.\n\nEn el caso de que sea necesario arbitraje, debe presentar lo siguiente al mediador o al árbitro: 1) El hash de transacción, 2) La llave de la transacción, y 3) La dirección del receptor PARS. El árbitro entonces verificará la transferencia PARS usando el ParsiCoin Explorador de Bloques (http://explorer.parsicoin.net/#check_payment).\n\nSi no se proporciona la información requerida al mediador o al árbitro, se perderá el caso de disputa. En todos los casos de disputa, el remitente de ParsiCoin lleva 100% de la carga de la responsabilidad de verificar las transacciones a un mediador o un árbitro\n\nSi no comprende estos requisitos, no realice transacciones en Bisq. Primero, busque ayuda en ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=Para intercambiar blackcoins quemados. usted necesita saber lo siguiente:\n\nBlackcoins quemados son indestructibles. Para intercambiarlos en Bisq, los guiones de output tienen que estar en la forma: OP_RETURN OP_PUSHDATA, seguidos por bytes de datos asociados que, después de codificarlos en hexadecimal, construyen direcciones. Por ejemplo, blackcoins quemados con una dirección 666f6f ("foo" en UTF-8) tendrán el siguiente guion:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nPara crear blackcoins quemados, uno puede usar el comando RPC "quemar" disponible en algunas carteras.\n\nPara posibles casos de uso, uno puede mirar en https://ibo.laboratorium.ee .\n\nComo los blackcoins quemados son undestructibles, no pueden ser revendidos. "Vender" blackcoins quemados significa quemar blackcoins comunes (con datos asociados igual a la dirección de destino).\n\nEn caso de una disputa, el vendedor BLK necesita proveer el hash de transacción. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Comerciar L-BTC en Bisq requiere que entienda lo siguiente:\n\nAl recibir L-BTC de un intercambio en Bisq, no puede usar la app de monedero móvil Blockstream Green Wallet o un exchange/monedero que custodie sus fondos. Solo debe recibir L-BTC en el monedero Liquid Elements Core, u otro monedero L-BTC que le permita obtener la clave cegadora para su dirección L-BTC cegada.\n\nEn caso de ser necesaria mediación, o si se lleva a cabo una disputa, debe entregar la clave cegadora para su dirección receptora de L-BTC al mediador o agente de devolución de fondos Bisq para que verifique los detalles de su Transacción Confidencial en su nodo completo Elements Core.\n\nSi no entrega la información requerida al mediador o al agente de devolución de fondos se resolverá en una pérdida del caso en disputa. En todos los casos de disputa, el receptor de L-BTC es responsable del 100% de la carga de aportar la prueba criptográfica al mediador o agente de devolución de fondos.\n\nSi no entiende estos requerimientos, no intercambio L-BTC en Bisq. account.fiat.yourFiatAccounts=Sus cuentas de moneda nacional: @@ -1213,7 +1222,6 @@ account.backup.location=Ubicación de la copia de seguridad account.backup.selectLocation=Seleccionar localización de la copia de seguridad account.backup.backupNow=Hacer copia de seguridad ahora (la copia de seguridad no está encriptada!) account.backup.appDir=Directorio de datos de aplicación -account.backup.logFile=Archivo de registro account.backup.openDirectory=Abrir directorio account.backup.openLogFile=Abrir archivo de registro account.backup.success=Copia de seguridad guardada con éxito en:\n{0} @@ -1227,7 +1235,7 @@ account.password.info=Con protección por contraseña necesitará introducir su account.seed.backup.title=Copia de seguridad de palabras semilla del monedero account.seed.info=Por favor apunte en un papel tanto las palabras semilla del monedero como la fecha! Puede recuperar su monedero en cualquier momento con las palabras semilla y la fecha.\nLas mismas palabras semilla se usan para el monedero BTC como BSQ\n\nDebe apuntar las palabras semillas en una hoja de papel. No la guarde en su computadora.\n\nPor favor, tenga en cuenta que las palabras semilla no son un sustituto de la copia de seguridad.\nNecesita hacer la copia de seguridad de todo el directorio de aplicación en la pantalla \"Cuenta/Copia de Seguridad\" para recuperar un estado de aplicación válido y los datos.\nImportar las palabras semilla solo se recomienda para casos de emergencia. La aplicación no será funcional sin una buena copia de seguridad de los archivos de la base de datos y las claves! -account.seed.backup.warning=Por favor tenga en cuenta que las palabras semilla NO SON un sustituto de la copia de seguridad.\nTiene que crear una copia de todo el directorio de aplicación desde la pantalla \"Cuenta/Copia de seguridad\ para recuperar el estado y datos de la aplicación.\nImportar las palabras semilla solo se recomienda para casos de emergencia. La aplicación no funcionará sin una copia de seguridad adecuada de las llaves y archivos de sistema!\n\nVea la página wiki https://bisq.wiki/Backing_up_application_data para más información. +account.seed.backup.warning=Por favor tenga en cuenta que las palabras semilla NO SON un sustituto de la copia de seguridad.\nTiene que crear una copia de todo el directorio de aplicación desde la pantalla \"Cuenta/Copia de seguridad\ para recuperar el estado y datos de la aplicación.\nImportar las palabras semilla solo se recomienda para casos de emergencia. La aplicación no funcionará sin una copia de seguridad adecuada de las llaves y archivos de sistema!\n\nVea la página wiki [HYPERLINK:https://bisq.wiki/Backing_up_application_data] para más información. account.seed.warn.noPw.msg=No ha establecido una contraseña de cartera que proteja la visualización de las palabras semilla.\n\n¿Quiere que se muestren las palabras semilla? account.seed.warn.noPw.yes=Sí, y no preguntar de nuevo account.seed.enterPw=Introducir contraseña para ver las palabras semilla @@ -1241,14 +1249,11 @@ account.seed.restore.ok=Ok, adelante con la restauración y el apagado de Bisq. account.notifications.setup.title=Configuración account.notifications.download.label=Descargar aplicación móvil -account.notifications.download.button=Descargar account.notifications.waitingForWebCam=Esperando a la cámara web... account.notifications.webCamWindow.headline=Escanear código QR desde el teléfono account.notifications.webcam.label=Usar webcam account.notifications.webcam.button=Escanear código QR account.notifications.noWebcam.button=No tengo cámara web -account.notifications.testMsg.label=Enviar notificación de prueba -account.notifications.testMsg.title=Prueba account.notifications.erase.label=Eliminar notificaciones en el teléfono account.notifications.erase.title=Limpiar notificaciones account.notifications.email.label=Emparejar token @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=Porcentaje de distancia desde e account.notifications.marketAlert.addButton=Añadir alerta de oferta account.notifications.marketAlert.manageAlertsButton=Gestionar alertas de oferta account.notifications.marketAlert.manageAlerts.title=Gestionar alertas de oferta -account.notifications.marketAlert.manageAlerts.label=Alertas de oferta -account.notifications.marketAlert.manageAlerts.item=Alerta para oferta {0} con precio de activación {1} y cuenta de pago {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=Cuenta de pago account.notifications.marketAlert.manageAlerts.header.trigger=Precio de activación account.notifications.marketAlert.manageAlerts.header.offerType=Tipo de oferta @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=Balance de todas las transacciones no verificadas (espe dao.lockedForVoteBalance=Usado para votar dao.lockedInBonds=Bloqueado en garantías dao.availableNonBsqBalance=Saldo no-BSQ disponible (BTC) -dao.totalBsqBalance=Saldo total BSQ dao.reputationBalance=Valor de mérito (no se puede gastar) dao.tx.published.success=Su transacción ha sido publicada satisfactoriamente. @@ -1455,11 +1457,6 @@ dao.param.currentValue=Valor actual: {0} dao.param.currentAndPastValue=Valor actual: {0} (Valor cuando la propuesta fue hecha: {1}) dao.param.blocks={0} bloques -dao.results.cycle.duration.label=Duración de {0} -dao.results.cycle.duration.value={0} bloque(s) -dao.results.cycle.value.postFix.isDefaultValue=(valor por defecto) -dao.results.cycle.value.postFix.hasChanged=(ha sido cambiado en la votación) - dao.results.invalidVotes=Hubo votos inválidos en ese ciclo. Eso pueda ocurrir si un voto no fue bien distribuido en la red Bisq.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=Salt dao.bond.reputation.hash=Hash dao.bond.reputation.lockupButton=Bloquear dao.bond.reputation.lockup.headline=Confirmar transacción de bloqueo -dao.bond.reputation.lockup.details=Cantidad bloqueada: {0}\nTiempo de desbloqueo: {1} bloque(s) (≈{2})\n\nComisión de minado: {3} ({4} Satoshis/byte)\nTamaño de la transacción: {5} Kb\n\n¿Seguro que quiere proceder? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=Confirmar desbloqueo de transacción -dao.bond.reputation.unlock.details=Cantidad de desbloqueo: {0}\nTiempo de desbloqueo: {1} bloque(s) (≈{2})\n\nComisión de minado: {3} ({4} Satoshis/byte)\nTamaño de transacción: {5} Kb\n\n¿Seguro que quiere proceder? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=Todas las garantías @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=Firma dao.proofOfBurn.message=Mensaje dao.proofOfBurn.sig=Firma dao.proofOfBurn.verify=Verificar -dao.proofOfBurn.verify.header=Verificar mensaje con clave de transacción de quemado dao.proofOfBurn.verificationResult.ok=Verificación exitosa dao.proofOfBurn.verificationResult.failed=Verificación fallida @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Nombre de usuario exacto en GitHub dao.proposal.display.link=Enlace a información detallada dao.proposal.display.link.prompt=Enlace a la propuesta dao.proposal.display.requestedBsq=Cantidad solicitada en BSQ -dao.proposal.display.bsqAddress=Dirección BSQ dao.proposal.display.txId=ID de transacción de la propuesta dao.proposal.display.proposalFee=Comisión de propuesta dao.proposal.display.myVote=Mi voto dao.proposal.display.voteResult=Resumen del resultado de la votación dao.proposal.display.bondedRoleComboBox.label=Tipo de rol en garantía dao.proposal.display.requiredBondForRole.label=Garantía requerida para el rol -dao.proposal.display.tickerSymbol.label=Símbolo ticker dao.proposal.display.option=Opción dao.proposal.table.header.proposalType=Tipo de propuesta dao.proposal.table.header.link=Enlace dao.proposal.table.header.myVote=Mi voto +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=Eliminar dao.proposal.table.icon.tooltip.removeProposal=Eliminar mi propuesta dao.proposal.table.icon.tooltip.changeVote=Voto actual: ''{0}''. Cambiar voto a: ''{1}'' @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=Balance de mi cartera dao.wallet.receive.fundYourWallet=Su dirección para recibir BSQ dao.wallet.receive.bsqAddress=Dirección monedero BSQ (Dirección fresca, sin usar) -dao.wallet.receive.dao.headline=La DAO Bisq -dao.wallet.receive.daoInfo=Tal como el exchange Bisq es descentralizado y resistente a la censura, lo es su modelo de governanza - y la DAO BISQ y el token BSQ son herramientas que lo hacen posible. -dao.wallet.receive.daoInfo.button=Aprender más acerca de la DAO Bisq -dao.wallet.receive.daoTestnetInfo=La red principal de la DAO Bisq aún no se ha lanzado pero puede aprender acerca de la DAO ejecutándola en la testnet. -dao.wallet.receive.daoTestnetInfo.button=Como ejecutar la DAO Bisq en testnet -dao.wallet.receive.daoContributorInfo=Si ha contribuido a Bisq por favor use la dirección BSQ de abajo y haga una solicitud por haber participado en la distribución de BSQ génesis. -dao.wallet.receive.daoContributorInfo.button=Cómo ser parte de la distribución génesis de BSQ - dao.wallet.send.sendFunds=Enviar fondos dao.wallet.send.sendBtcFunds=Enviar fondos no-BSQ (BTC) dao.wallet.send.amount=Cantidad en BSQ dao.wallet.send.btcAmount=Cantidad en BTC (fondos no-BSQ) dao.wallet.send.setAmount=Indicar cantidad a retirar (la cantidad mínima es {0}) -dao.wallet.send.setBtcAmount=Establecer cantidad en BTC a retirar (cantidad mínima {0}) dao.wallet.send.receiverAddress=Dirección BSQ del receptor dao.wallet.send.receiverBtcAddress=Dirección BTC del receptor dao.wallet.send.setDestinationAddress=Introduzca su dirección de destino dao.wallet.send.send=Enviar fondos BSQ dao.wallet.send.sendBtc=Enviar fondos BTC dao.wallet.send.sendFunds.headline=Confirme la petición de retiro -dao.wallet.send.sendFunds.details=Enviando: {0}\nA la dirección receptora: {1}.\nLa comisión de transacción requerida es: {2} ({3} Satoshis/byte)\nTamaño de la transacción: {4} Kb\n\nEl receptor recibirá: {5}\n\n¿Seguro que quiere retirar esta cantidad? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=Último bloque verificado: {0} dao.wallet.chainHeightSyncing=Esperando bloques... {0} bloques verificados de {1} dao.wallet.tx.type=Tipo @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=No tiene suficientes fondos BTC para cr dao.proposal.create.missingIssuanceFunds=No tiene suficientes fondos BTC para crear la transacción de propuesta. Todas las transacciones BSQ requieren una comisión de minado en BTC, y la emisión de transacciones también requieren BTC para la cantidad de BSQ solicitada ({0} Satoshis/BSQ).\nNecesarios: {1} dao.feeTx.confirm=Confirmar transacción {0} -dao.feeTx.confirm.details={0} comisión: {1}\nComisión de minado: {2} ({3} Satoshis/byte)\nTamaño de la transacción: {4} Kb\n\n¿Está seguro de que quiere publicar la transacción {5}? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0} comisión: {1}\nBTC necesarios para emisión BSQ: {2} ({3} Satoshis/BSQ)\nTasa de minado: {4} ({5} Satoshis/byte)\nTamaño de transacción: {6} Kb\n\nSi la solicitud se aprueba, recibirá la cantidad neta que ha solicitado de las 2 BSQ de comisión de propuesta.\n¿Está seguro de que quiere publicar la transacción de {7}? +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=LA DAO BISQ dao.news.bisqDAO.description=Tal como el exchange Bisq es descentralizado y resistente a la censura, lo es su modelo de governanza - y la DAO BISQ y el token BSQ son herramientas que lo hacen posible. @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=No. de votos secretos dao.factsAndFigures.menuItem.supply=Oferta BSQ dao.factsAndFigures.menuItem.transactions=Transacciones BSQ -dao.factsAndFigures.dashboard.marketPrice=Datos de mercado -dao.factsAndFigures.dashboard.price=Último precio intercambio BSQ/BTC (en Bisq) dao.factsAndFigures.dashboard.avgPrice90=Medía de 90 días del precio de intercambio BSQ/BTC dao.factsAndFigures.dashboard.avgPrice30=Medía de 30 días del precio de intercambio BSQ/BTC dao.factsAndFigures.dashboard.avgUSDPrice90=Media ponderada de 90 días del precio de intercambio USD/BSQ @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=Descargar más tarde displayUpdateDownloadWindow.button.ignoreDownload=Ignorar esta versión displayUpdateDownloadWindow.headline=¡Una nueva versión de Bisq está disponible! displayUpdateDownloadWindow.download.failed.headline=Descarga fallida -displayUpdateDownloadWindow.download.failed=Descarga fallida.\nPor favor descargue y verifique manualmente en https://bisq.network/downloads -displayUpdateDownloadWindow.installer.failed=No se puede determinar el instalador correcto. Por favor, descargue y verifique manualmente en https://bisq.network/downloads -displayUpdateDownloadWindow.verify.failed=Verificación fallida.\nPor favor descargue y verifique manualmente en https://bisq.network/downloads +displayUpdateDownloadWindow.download.failed=Descarga fallida.\nPor favor descargue y verifique manualmente en [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=No se puede determinar el instalador correcto. Por favor, descargue y verifique manualmente en [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verificación fallida.\nPor favor descargue y verifique manualmente en [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=La nueva versión ha sido descargada con éxito y la firma verificada.\n\nPor favor abra el directorio de descargas, cierre la aplicación e instale la nueva versión. displayUpdateDownloadWindow.download.openDir=Abrir directorio de descargas @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=Pago de la cantidad de intercambio disputeSummaryWindow.payout.getsTradeAmount=BTC {0} obtiene la cantidad de pago de intercambio disputeSummaryWindow.payout.getsAll=El {0} BTC obtiene todo disputeSummaryWindow.payout.custom=Pago personalizado -disputeSummaryWindow.payout.adjustAmount=La cantidad introducida excede la cantidad disponible de {0}.\nAjustamos este campo al máximo posible. disputeSummaryWindow.payoutAmount.buyer=Cantidad de pago del comprador disputeSummaryWindow.payoutAmount.seller=Cantidad de pago del vendedor disputeSummaryWindow.payoutAmount.invert=Usar perdedor como publicador @@ -2055,21 +2038,24 @@ disputeSummaryWindow.addSummaryNotes=Añadir notas de sumario disputeSummaryWindow.close.button=Cerrar ticket # Do no change any line break or order of tokens as the structure is used for signature verification -disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.msg=Ticket cerrado el {0}\n{1} dirección de nodo: {2}\n\nResumen:\nID de intercambio: {3}\nMoneda: {4}\nCantidad del intercambio: {5}\nCantidad de pago para el comprador de BTC: {6}\nCantidad de pago para el vendedor de BTC: {7}\n\nMotivo de la disputa: {8}\n\nNotas resumidas:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification disputeSummaryWindow.close.msgWithSig={0}{1}{2}{3} -disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and accept or reject suggestion from mediator -disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions +disputeSummaryWindow.close.nextStepsForMediation=\nSiguientes pasos:\nAbrir intercambio y aceptar o rechazar la sugerencia del mediador +disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nSiguientes pasos:\nNo es necesario que realice ninguna otra acción. Si el árbitro decidió a su favor, verá una transacción de "Reembolso desde arbitraje" en Fondos / Transacciones disputeSummaryWindow.close.closePeer=Necesitar cerrar también el ticket del par de intercambio! disputeSummaryWindow.close.txDetails.headline=Publicar transacción de devolución de fondos +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=El comprador recibe {0} en la dirección: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=El vendedor recibe {0} en la dirección: {1}\n -disputeSummaryWindow.close.txDetails=Gastando: {0}\n{1}{2}Tasa de transacción: {3} ({4} satoshis/byte)\nTamaño de transacción: {5} Kb\n\n¿Está seguro de que quiere publicar esta transacción?\n +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? -disputeSummaryWindow.close.noPayout.headline=Close without any payout -disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? +disputeSummaryWindow.close.noPayout.headline=Cerrar sin realizar algún pago +disputeSummaryWindow.close.noPayout.text=¿Quiere cerrar sin realizar algún pago? emptyWalletWindow.headline=Herramienta de monedero {0} de emergencia emptyWalletWindow.info=Por favor usar sólo en caso de emergencia si no puede acceder a sus fondos desde la Interfaz de Usuario (UI).\n\nPor favor, tenga en cuenta que todas las ofertas abiertas se cerrarán automáticamente al usar esta herramienta.\n\nAntes de usar esta herramienta, por favor realice una copia de seguridad del directorio de datos. Puede hacerlo en \"Cuenta/Copia de Seguridad\".\n\nPor favor repórtenos su problema y envíe un reporte de fallos en Github en el foro de Bisq para que podamos investigar qué causa el problema. @@ -2101,6 +2087,7 @@ filterWindow.btcNode=Nodos Bitcoin filtrados (direcciones + puerto separadas por filterWindow.preventPublicBtcNetwork=Prevenir uso de la red Bitcoin pública filterWindow.disableDao=Deshabilitar DAO filterWindow.disableAutoConf=Deshabilitar autoconfirmación +filterWindow.autoConfExplorers=Exploradores de autoconfirmación filtrados (direcciones separadas por coma) filterWindow.disableDaoBelowVersion=Versión mínima requerida para DAO filterWindow.disableTradeBelowVersion=Versión mínima requerida para intercambios. filterWindow.add=Añadir filtro @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=Seleccione transacción de depósito para la disp selectDepositTxWindow.msg=La transacción de depósito no se almacenó en el intercambio.\nPor favor seleccione una de las transacciones multifirma existentes de su monedero en que se usó la transacción de depósito en el intercambio fallido.\nPuede encontrar la transacción correcta abriendo la ventana de detalles del intercambio (clic en la ID de intercambio en la lista) y a continuación el output de la transacción del pago de tasa de intercambio a la siguiente transacción donde puede ver la transacción de depósito multifirma (la dirección comienza con 3). La ID de transacción debería ser visible en la lista presentada aquí. Una vez haya encontrado la transacción correcta selecciónela aquí y continúe.\n\nDisculpe los inconvenientes, pero este error ocurre muy poco a menudo y en el futuro intentaremos encontrar mejores maneras de resolverlo. selectDepositTxWindow.select=Selección depósito de transacción -selectBaseCurrencyWindow.headline=Selección de mercado -selectBaseCurrencyWindow.msg=El mercado por defecto seleccionado es {0}.\n\nSi quiere cambiar a otra moneda base por favor seleccione una de las del menú desplegable.\nPuede cambiar más tarde la moneda base en la pantalla \"Ajustes/Red\". -selectBaseCurrencyWindow.select=Seleccione moneda base - sendAlertMessageWindow.headline=Enviar notificación global sendAlertMessageWindow.alertMsg=Mensaje de alerta: sendAlertMessageWindow.enterMsg=Introducir mensaje @@ -2232,9 +2215,8 @@ error.closedTradeWithNoDepositTx=El depósito de transacción de el intercambio popup.warning.walletNotInitialized=La cartera aún no sea ha iniciado popup.warning.osxKeyLoggerWarning=Debido a medidas de seguridad más estrictas en macOS 10.14 y siguientes, al iniciar una aplicación Java (Bisq usa Java) causa un popup de alarma en macOS ('Bisq would like to receive keystrokes from any application').\n\nPara evitar esto por favor abra su 'Configuración macOS' y vaya a 'Seguridad y privacidad' -> 'Privacidad¡ -> 'Monitorización de inputs' y elimine 'Bisq' de la lista a la derecha.\n\nBisq actualizara a una nueva versión de Java para evitar que este problema tan pronto como se resuelvan las limitaciones técnicas (el paquete de Java para la versión requerida de Java aún no se ha emitido). popup.warning.wrongVersion=Probablemente tenga una versión de Bisq incorrecta para este ordenador.\nLa arquitectura de su ordenador es: {0}.\nLos binarios de Bisq instalados son: {1}.\nPor favor cierre y reinstale la versión correcta ({2}). -popup.warning.incompatibleDB=¡Hemos detectado archivos de base de datos incompatibles!\n\nEstos archivos de base de datos no son compatibles con nuestro actual código base:\n{0}\n\nHemos hecho una copia de seguridad de los archivos corruptos y aplicado los valores por defecto a la nueva versión de base de datos.\n\nLa copia de seguridad se localiza en:\n{1}/db/backup_of_corrupted_data.\n\nPor favor, compruebe si tiene la última versión de Bisq instalada.\nPuede descargarla en:\nhttps://bisq.network/downloads\n\nPor favor, reinicie la aplicación. +popup.warning.incompatibleDB=¡Hemos detectado archivos de base de datos incompatibles!\n\nEstos archivos de base de datos no son compatibles con nuestro actual código base:\n{0}\n\nHemos hecho una copia de seguridad de los archivos corruptos y aplicado los valores por defecto a la nueva versión de base de datos.\n\nLa copia de seguridad se localiza en:\n{1}/db/backup_of_corrupted_data.\n\nPor favor, compruebe si tiene la última versión de Bisq instalada.\nPuede descargarla en:\n[HYPERLINK:https://bisq.network/downloads]\n\nPor favor, reinicie la aplicación. popup.warning.startupFailed.twoInstances=Ya está ejecutando Bisq. No puede ejecutar dos instancias de Bisq. -popup.warning.cryptoTestFailed=Al parecer está utilizando un binario que ha compilado usted mismo y no ha seguido las instrucciones en https://github.com/bitsquare/bitsquare/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSi no es el caso y está utilizando el binario oficial de Bisq, por favor informe del error en la página de Github.\nError={0} popup.warning.tradePeriod.halfReached=Su intercambio con ID {0} ha alcanzado la mitad de el periodo máximo permitido de intercambio y aún no está completada.\n\nEl periodo de intercambio termina el {1}\n\nPor favor, compruebe el estado de su intercambio en \"Portafolio/Intercambios abiertos\" para más información. popup.warning.tradePeriod.ended=Su intercambio con ID {0} ha alcanzado el periodo máximo de intercambio y no se ha completado.\n\nEl periodo de intercambio finalizó en {1}\n\nPor favor, compruebe su intrecambio en \"Portafolio/Intercambios abiertos\" para contactar con el mediador. popup.warning.noTradingAccountSetup.headline=No ha configurado una cuenta de intercambio @@ -2258,7 +2240,9 @@ popup.warning.noBsqFundsForBtcFeePayment=Su monedero BSQ no tiene suficientes fo popup.warning.messageTooLong=Su mensaje excede el tamaño máximo permitido. Por favor, envíelo por partes o súbalo a un servicio como https://pastebin.com popup.warning.lockedUpFunds=Ha bloqueado fondos de un intercambio fallido.\nBalance bloqueado: {0}\nDirección de depósito TX: {1}\nID de intercambio: {2}.\n\nPor favor, abra un ticket de soporte seleccionando el intercambio en la pantalla de intercambios pendientes y haciendo clic en \"alt + o\" o \"option + o\"." +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=Uno de los nodos {0} ha sido baneado. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=retransmisión de precio popup.warning.seed=semilla popup.warning.mandatoryUpdate.trading=Por favor, actualice a la última versión de Bisq. Se lanzó una actualización obligatoria que inhabilita intercambios con versiones anteriores. Por favor, lea el Foro de Bisq para más información\n @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=La transacción {0} para el intercambio con ID {1 popup.warning.openOfferWithInvalidMakerFeeTx=La transacción de tasa de creador para la oferta con ID {0} es inválida.\nID de transacción={1}.\nPor favor vaya a \"Configuración/Información de red\" y haga una resincronización SPV.\nPara más ayuda por favor contacte con el equipo de soporte de Bisq en el canal de Bisq de Keybase. -popup.warning.trade.depositTxNull=El intercambio con ID "{0}" no tiene transacción de depósito establecida.\n\nPor favor reinicie la aplicación para ver si el problema persiste.\n\nSi fuera así, por favor abra la ventana emergente de detalles de intercambio haciendo click en la ID de intercambio. Luego, haga click en las ID para la transacción de la tasa de tomador y la tasa de creador para verlas en un explorador de bloques. Una transacción que no pueda encontrarse en un explorador de bloques probablemente sea una transacción inválida.\n\nSi eso ocurriera, por favor reportelo en el canal #soporte de Bisq en Keybase (https://keybase.io/team/bisq). Si su tasa de intercambio es inválida, los fondos no han salido de su monedero, con lo que puede mover el intercambio a intercambios fallidos, y hacer una resincronización SPV para que los fondos vuelvan a aparecer (ver cómo abajo).\n\nSi su transacción es válida, la cantidad se ha perdido, y puede hacer una solicitud de reembolso en el repositorio de soporte de Github (https://github.com/bisq-network/support/issues).\n\nEn ambos casos, ¡por favor haga una resincronización SPV desde la pantalla "Configuración/Red" para limpiar su monedero de problemas recurrentes! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Mover a intercambios fallidos -popup.warning.trade.depositTxNull.shutDown=Cerrar Bisq - popup.info.securityDepositInfo=Para asegurarse de que ambos comerciantes siguen el protocolo de intercambio, ambos necesitan pagar un depósito de seguridad.\n\nEl depósito se guarda en su monedero de intercambio hasta que el intercambio se complete, y entonces se devuelve.\n\nPor favor, tenga en cuenta que al crear una nueva oferta, Bisq necesita estar en ejecución para que otro comerciante la tome. Para mantener sus ofertas en línea, mantenga Bisq funcionando y asegúrese de que su computadora está en línea también (Ej. asegúrese de que no pasa a modo standby...el monitor en standby no es problema!) popup.info.cashDepositInfo=Por favor asegúrese de que tiene una oficina bancaria donde pueda hacer el depósito de efectivo.\nEl ID del banco (BIC/SWIFT) de del vendedor es: {0} popup.info.cashDepositInfo.confirm=Confirmo que puedo hacer el depósito popup.info.shutDownWithOpenOffers=Bisq se está cerrando, pero hay ofertas abiertas.\n\nEstas ofertas no estarán disponibles en la red P2P mientras Bisq esté cerrado, pero serán re-publicadas a la red P2P la próxima vez que inicie Bisq.\n\nPara mantener sus ofertas en línea, mantenga Bisq ejecutándose y asegúrese de que la computadora permanece en línea también (Ej. asegúrese de que no se pone en modo standby... el monitor en espera no es un problema). -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=Parece que está ejecutando Bisq en Qubes OS\n\nAsegúrese de que su Bisq qube esté configurado de acuerdo con nuestra Guía de configuración en [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes] popup.privateNotification.headline=Notificación privada importante! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=Se requiere atención para el intercambio con ID popup.info.multiplePaymentAccounts.headline=Múltiples cuentas de pago disponibles popup.info.multiplePaymentAccounts.msg=Tiene múltiples cuentes de pago disponibles para esta oferta. Por favor, asegúrese de que ha elegido la correcta. -popup.news.launch.headline=Dos grandes actualizaciones -popup.news.launch.accountSigning.headline=FIRMADO DE CUENTAS -popup.news.launch.accountSigning.description=Se eleva el límite de intercambio de 0.01 BTC al comprar BTC desde un par firmado. -popup.news.launch.ntp.headline=NUEVO PROTOCOLO DE INTERCAMBIO -popup.news.launch.ntp.description=El nuevo sistema de resolución de disputas de 2 niveles hace Bisq más seguro, escalable y resistente a la censura. - popup.accountSigning.selectAccounts.headline=Seleccionar cuentas de pago popup.accountSigning.selectAccounts.description=Basado en el método de pago y el momento de tiempo todas las cuentas de pago que estén conectadas a una disputa donde ocurra el pago a el comprador será seleccionada por usted para firmarlas. popup.accountSigning.selectAccounts.signAll=Firma todos los métodos de pago @@ -2324,7 +2297,7 @@ popup.accountSigning.signAccounts.ECKey.error=ECKey de mal árbitro popup.accountSigning.success.headline=Felicidades popup.accountSigning.success.description=Todas las cuentas de pago {0} se firmaron con éxito! -popup.accountSigning.generalInformation=Encontrará el estado de firma de todas sus cuentas en la sección de cuentas.\n\nPara más información, por favor visite https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=Encontrará el estado de firma de todas sus cuentas en la sección de cuentas.\n\nPara más información, por favor visite [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=Una de sus cuentas de pago ha sido verificada y firmada por un árbitro. Intercambiar con esta cuenta firmará automáticamente la cuenta de su par de intercambio después de un intercambio exitoso.\n\n{0} popup.accountSigning.signedByPeer=Una de sus cuentas de pago ha sido verificada y firmada por un par de intercambio. Su límite inicial de intercambio ha sido elevado y podrá firmar otras cuentas en {0} días desde ahora.\n\n{1} popup.accountSigning.peerLimitLifted=El límite inicial para una de sus cuentas se ha elevado.\n\n{0} @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=Error al firmar el testigo, popup.accountSigning.unsignedPubKeys.headline=Claves públicas no firmadas popup.accountSigning.unsignedPubKeys.sign=Firmar claves públicas popup.accountSigning.unsignedPubKeys.signed=Las claves públicas se firmaron -popup.accountSigning.unsignedPubKeys.result.headline=Firmado completo popup.accountSigning.unsignedPubKeys.result.signed=Claves públicas firmadas popup.accountSigning.unsignedPubKeys.result.failed=Error al firmar @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: Una red de intercambio de bitcoin descentralizada # GUI Util #################################################################### -guiUtil.miningFeeInfo=Por favor asegúrese de que la comisión de minado usada en su monedero externo es de al menos {0} sat/byte. De lo contrario, las transacciones de intercambio podrían no confirmarse y el intercambio acabaría en disputa. +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=Las cuentas de intercambio se han guardado en el directorio:\n{0} guiUtil.accountExport.noAccountSetup=No tiene cuentas de intercambio configuradas para exportar. @@ -2422,7 +2394,7 @@ peerInfoIcon.tooltip.age=Cuenta de pago creada hace {0} peerInfoIcon.tooltip.unknownAge=Edad de cuenta de pago no conocida. tooltip.openPopupForDetails=Abrir popup para detalles -tooltip.invalidTradeState.warning=This trade is in an invalid state. Open the details window for more information +tooltip.invalidTradeState.warning=Esta transacción está en un estado inválido. Abra la ventana de detalles para obtener más información tooltip.openBlockchainForAddress=Abrir explorador de cadena de bloques externo para la dirección: {0} tooltip.openBlockchainForTx=Abrir explorador de cadena de bloques externo para la la transacción: {0} @@ -2447,8 +2419,8 @@ addressTextField.openWallet.failed=Fallo al abrir la cartera Bitcoin predetermin peerInfoIcon.tooltip={0}\nEtiqueta: {1} txIdTextField.copyIcon.tooltip=Copiar ID de transacción al monedero -txIdTextField.blockExplorerIcon.tooltip=Open a blockchain explorer with this transaction ID -txIdTextField.missingTx.warning.tooltip=Missing required transaction +txIdTextField.blockExplorerIcon.tooltip=Abrir un explorador de bloques con esta ID de transacción +txIdTextField.missingTx.warning.tooltip=Falta la transacción requerida #################################################################### @@ -2457,12 +2429,13 @@ txIdTextField.missingTx.warning.tooltip=Missing required transaction navigation.account=\"Cuenta\" navigation.account.walletSeed=\"Cuenta/Semilla de cartera\" -navigation.funds.availableForWithdrawal=\"Funds/Send funds\" +navigation.funds.availableForWithdrawal=\"Fondos/Enviar fondos"\" navigation.portfolio.myOpenOffers=\"Portafolio/Mis ofertas abiertas\" navigation.portfolio.pending=\"Portafolio/Intercambios abiertos\" navigation.portfolio.closedTrades=\"Portafolio/Historial\" navigation.funds.depositFunds=\"Fondos/Recibir fondos\" navigation.settings.preferences=\"Ajustes/Preferencias\" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"Fondos/Transacciones\" navigation.support=\"Soporte\" navigation.dao.wallet.receive=\"DAO/Monedero BSQ/Recibir\" @@ -2525,10 +2498,10 @@ password.deriveKey=Derivar clave desde contraseña password.walletDecrypted=El monedero se desencriptó con éxito y se eliminó la protección por contraseña. password.wrongPw=Ha introducido la contraseña incorrecta.\n\nPor favor, introduzca nuevamente la contraseña, evitando errores. password.walletEncrypted=El monedero se encriptó con éxito y se activó la protección por contraseña. -password.walletEncryptionFailed=No se pudo establecer la contraseña de la cartera. Puede que haya importado las palabras semilla que no corresponden a la base de datos de la cartera. Por favor, contacte con los desarrolladores en el foro de Bisq. +password.walletEncryptionFailed=No se pudo establecer la contraseña de de la cartera. Puede haber importado palabras semilla que no corresponden a la base de datos del monedero. Por favor contacte con los desarrolladores en Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=Las 2 contraseñas introducidas no coinciden. password.forgotPassword=¿Ha olvidado la contraseña? -password.backupReminder=Por favor, tenga en cuenta que al configurar una contraseña de cartera todas las copias de seguridad creadas desde la cartera no cifrada se borrarán.\n\n¡Es altamente recomendable hacer una copia de seguridad del directorio de aplicación y anotar las palabras semilla antes de configurar la contraseña! +password.backupReminder=Por favor, al establecer una contraseña para la cartera, tenga en cuenta que todas las copias de seguridad creadas de la cartera no encriptada serán borradas automáticamente password.backupWasDone=Ya he hecho una copia de seguridad seed.seedWords=Palabras semilla de la cartera @@ -2537,7 +2510,7 @@ seed.date=Fecha de la cartera seed.restore.title=Restaurar monederos desde las palabras semilla seed.restore=Restaurar monederos seed.creationDate=Fecha de creación -seed.warn.walletNotEmpty.msg=Su cartera de Bitcoin no está vacía.\n\nDebe vaciar esta cartera antes de intentar restaurar a otra más antigua, pues mezclar monederos puede llevar a copias de seguridad inválidas.\n\nPor favor, finalice sus intercambios, cierre todas las ofertas abiertas y vaya a la sección Fondos para retirar sus bitcoins.\nEn caso de que no pueda acceder a sus bitcoins puede utilizar la herramienta de emergencia para vaciar el monedero.\nPara abrir la herramienta de emergencia pulse \"alt + e\" o \"option + e\". +seed.warn.walletNotEmpty.msg=Su cartera de Bitcoin no está vacía.\n\nDebe vaciar esta cartera antes de intentar restaurar a otra más antigua, ya que mezclar monederos puede llevar a copias de seguridad inválidas.\n\nPor favor, finalice sus intercambios, cierre todas las ofertas abiertas y vaya a la sección Fondos para retirar sus bitcoins.\nEn caso de que no pueda acceder a sus bitcoins puede utilizar la herramienta de emergencia para vaciar el monedero.\nPara abrir la herramienta de emergencia pulse \"alt + e\" o \"Cmd/Ctrl + e\". seed.warn.walletNotEmpty.restore=Quiero restaurar de todos modos seed.warn.walletNotEmpty.emptyWallet=Vaciaré mi monedero antes seed.warn.notEncryptedAnymore=Sus carteras están cifradas.\n\nDespués de restaurarlas, las carteras no estarán cifradas y tendrá que introducir una nueva contraseña.\n\n¿Quiere continuar? @@ -2578,12 +2551,11 @@ payment.altcoin.address=Dirección altcoin payment.altcoin.tradeInstantCheckbox=Intercambio instantáneo (en una hora) con esta altcoin payment.altcoin.tradeInstant.popup=Para intercambios instantáneos se requiere que ambos pares estén en linea para poder completar el intercambio en menos de 1 hora.\n\nSi tiene ofertas abiertas y no está disponible, por favor deshabilite esas ofertas en la pantalla 'Portafolio'. payment.altcoin=Altcoin -payment.select.altcoin=Seleccione o busque altcoin +payment.select.altcoin=Seleccionar o buscar altcoin payment.secret=Pregunta secreta payment.answer=Respuesta payment.wallet=ID de cartera: payment.uphold.accountId=Nombre de usuario, correo electrónico o núm de teléfono -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=Correo electrónico o núm. de telefóno payment.venmo.venmoUserName=Nombre de usuario Venmo payment.popmoney.accountId=Correo electrónico o núm. de telefóno @@ -2625,31 +2597,33 @@ payment.accountType=Tipo de cuenta payment.checking=Comprobando payment.savings=Ahorros payment.personalId=ID personal: -payment.clearXchange.info=Zelle es un servicio de transmisión de dinero que funciona mejor *mediante* otro banco.\n\n1. Compruebe esta página para ver si (y cómo) su banco funciona con Zelle:\nhttps://www.zellepay.com/get-started\n2. Tome en consideración los límites de transferencia -los límites de envío varían en función del banco, y los bancos a menudo especifican diferentes límites diarios, semanales y mensuales.-\n\n3. Si su banco no funciona con Zelle, puede utilizarlo a través de la app móvil de Zelle, pero sus límites de transferencia serán mucho menores.\n\n4. El nombre especificado en su cuenta Bisq DEBE coincidir con el nombre en su cuenta Zelle/bancaria. +payment.clearXchange.info=Zelle es un servicio de transmisión de dinero que funciona mejor *a través* de otro banco..\n\n1. Compruebe esta página para ver si (y cómo) trabaja su banco con Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Preste atención a los límites de transferencia -límites de envío- que varían entre bancos, y que los bancos especifican a menudo diferentes límites diarios, semanales y mensuales..\n\n3. Si su banco no trabaja con Zelle, aún puede usarlo a través de la app móvil de Zelle, pero sus límites de transferencia serán mucho menores.\n\n4. El nombre especificado en su cuenta Bisq DEBE ser igual que el nombre en su cuenta de Zelle/bancaria. \n\nSi no puede completar una transacción Zelle tal como se especifica en el contrato, puede perder algo (o todo) el depósito de seguridad!\n\nDebido a que Zelle tiene cierto riesgo de reversión de pago, se aconseja que los vendedores contacten con los compradores no firmados a través de email o SMS para verificar que el comprador realmente tiene la cuenta de Zelle especificada en Bisq. payment.fasterPayments.newRequirements.info=Algunos bancos han comenzado a verificar el nombre completo del receptor para las transferencias Faster Payments. Su cuenta actual Faster Payments no especifica un nombre completo.\n\nConsidere recrear su cuenta Faster Payments en Bisq para proporcionarle a los futuros compradores {0} un nombre completo.\n\nCuando vuelva a crear la cuenta, asegúrese de copiar el UK Short Code de forma precisa , el número de cuenta y los valores salt de la cuenta anterior a su cuenta nueva para la verificación de edad. Esto asegurará que la edad de su cuenta existente y el estado de la firma se conserven. -payment.moneyGram.info=Al utilizar MoneyGram, el comprador de BTC tiene que enviar el número de autorización y una foto del recibo al vendedor de BTC por correo electrónico. El recibo debe mostrar claramente el monto, así como el nombre completo, país y demarcación (departamento,estado, etc.) del vendedor. Al comprador se le mostrará el correo electrónico del vendedor en el proceso de transacción. -payment.westernUnion.info=Al utilizar Western Union, el comprador de BTC tiene que enviar el número de autorización (MTCN) y una foto del recibo al vendedor de BTC por correo electrónico. El recibo debe mostrar claramente el monto, así como el nombre completo, país y demarcación (departamento,estado, etc.) del vendedor. Al comprador se le mostrará el correo electrónico del vendedor en el proceso de transacción. +payment.moneyGram.info=Al utilizar MoneyGram, el comprador de BTC tiene que enviar el número de autorización y una foto del recibo al vendedor de BTC por correo electrónico. El recibo debe mostrar claramente el nobre completo del vendedor, país, estado y cantidad. El email del vendedor se mostrará al comprador durante el proceso de intercambio. +payment.westernUnion.info=Al utilizar Western Union, el comprador de BTC tiene que enviar el número de seguimiento (MTCN) y una foto del recibo al vendedor de BTC por correo electrónico. El recibo debe mostrar claramente el como el nombre completo del vendedor, país, ciudad y cantidad. Al comprador se le mostrará el correo electrónico del vendedor en el proceso de intercambio. payment.halCash.info=Al usar HalCash el comprador de BTC necesita enviar al vendedor de BTC el código HalCash a través de un mensaje de texto desde el teléfono móvil.\n\nPor favor asegúrese de que no excede la cantidad máxima que su banco le permite enviar con HalCash. La cantidad mínima por retirada es de 10 EUR y el máximo son 600 EUR. Para retiros frecuentes es 3000 por receptor al día y 6000 por receptor al mes. Por favor compruebe estos límites con su banco y asegúrese que son los mismos aquí expuestos.\n\nLa cantidad de retiro debe ser un múltiplo de 10 EUR ya que no se puede retirar otras cantidades desde el cajero automático. La Interfaz de Usuario en la pantalla crear oferta y tomar oferta ajustará la cantidad de BTC para que la cantidad de EUR sea correcta. No puede usar precios basados en el mercado ya que la cantidad de EUR cambiaría con el cambio de precios.\n\nEn caso de disputa el comprador de BTC necesita proveer la prueba de que ha enviado EUR. -payment.limits.info=Por favor, tenga en cuenta que todas las transferencias bancarias tienen cierto riesgo de reversión de pago.\n\nPara disminuir este riesgo, Bisq establece límites por intercambio basándose en dos factores:\n\n1. El nivel estimado de riesgo de reversión de pago para el método de pago usado\n2. La edad de su cuenta para ese método de pago\n\nLa cuenta que está creando ahora es nueva y su edad es cero. A medida que su cuenta gane edad en un periodo de dos meses, también aumentará el límite por transacción.\n\n● Durante el primer mes, el límite será {0}\n● Durante el segundo mes, el límite será {1}\n● Después del segundo mes, el límite será {2}\n\nTenga en cuenta que no hay límites en el total de transacciones que puede realizar. -payment.limits.info.withSigning=Para limitar el riesgo de devolución de cargo, Bisq establece límites por compra basados en los 2 siguientes factores:\n\n1. Riesgo general de devolución de cargo para el método de pago\n2. Estado de firmado de cuenta\n\nEsta cuenta de pago aún no ha sido firmada por un árbitro o par de confianza, con lo que ha sido limitada para comprar {0} por intercambio. Después de firmarse, los límites de compra se incrementarán de esta manera:\n\n● Antes de ser firmada, y hasta 30 días después de la firma, su límite por intercambio de compra será {0}\n● 30 días después de la firma, su límite de compra por intercambio será de {1}\n● 60 días después de la firma, su límite de compra por intercambio será de {2}\n\nLos límites de venta no se ven afectados por el firmado de cuentas, y aumenta solo con el incremente de edad de la cuenta. Más información en https://bisq.wiki/Account_limits\n\nTenga en cuenta que los límites solo se aplican al tamaño del intercambio. Puede poner tantos intercambios como quiera. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Por favor, tenga en cuenta que todas las transferencias bancarias tienen cierto riesgo de reversión de pago.\n\nPara disminuir este riesgo, Bisq establece límites por intercambio en función del nivel estimado de riesgo de reversión de pago para el método usado.\n\nPara este método de pago, su límite por intercambio para comprar y vender es {2}.\n\nEste límite solo aplica al tamaño de un intercambio: puede poner tantos intercambios como quira.\n\nConsulte detalles en la wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=Para limitar el riesgo de devolución de cargo, Bisq establece límites por compra basados en los 2 siguientes factores:\n\n1. Riesgo general de devolución de cargo para el método de pago\n2. Estado de firmado de cuenta\n\nEsta cuenta de pago aún no ha sido firmada, con lo que ha sido limitada para comprar {0} por intercambio. Después de firmarse, los límites de compra se incrementarán de esta manera:\n\n● Antes de ser firmada, y hasta 30 días después de la firma, su límite por intercambio de compra será {0}\n● 30 días después de la firma, su límite de compra por intercambio será de {1}\n● 60 días después de la firma, su límite de compra por intercambio será de {2}\n\nLos límites de venta no se ven afectados por el firmado de cuentas. Puede vender {2} en un solo \nintercambio inmediatamente.\n\nEstos límites solo aplican al tamaño de un intercambio. Puede hacer tantos intercambios como quiera.\n\n Consulte detalles en la wiki [HYPERLINK:https://bisq.wiki/Account_limits].\n\n payment.cashDeposit.info=Por favor confirme que su banco permite enviar depósitos de efectivo a cuentas de otras personas. Por ejemplo, Bank of America y Wells Fargo ya no permiten estos depósitos. payment.revolut.info=Revolut requiere el 'nombre de usuario' como ID de cuenta y no el número de teléfono o el e-mail que se requería anteriormente. -payment.account.revolut.addUserNameInfo={0}\nSu cuenta Revolut actual ({1}) no ha establecido el "nombre de usuario".\nPor favor introduzca su "nombre de usuario" en Revolut para actualizar sus datos de cuenta.\nEsto no afectará al estado de su edad de cuenta. +payment.account.revolut.addUserNameInfo={0}\nSu cuenta de Revolut ({1}) no tiene un "nombre de usuario".\nPor favor introduzca su "nombre de usuario" en Revolut para actualizar sus datos de cuenta.\nEsto no afectará a su estado de edad de firmado de cuenta. payment.revolut.addUserNameInfo.headLine=Actualizar cuenta Revolut payment.usPostalMoneyOrder.info=Los intercambios usando US Postal Money Orders (USPMO) en Bisq requiere que entienda lo siguiente:\n\n- Los compradores de BTC deben escribir la dirección del vendedor en los campos de "Payer" y "Payee" y tomar una foto en alta resolución de la USPMO y del sobre con la prueba de seguimiento antes de enviar.\n- Los compradores de BTC deben enviar la USPMO con confirmación de entrega.\n\nEn caso de que sea necesaria la mediación, se requerirá al comprador que entregue las fotos al mediador o agente de devolución de fondos, junto con el número de serie de la USPMO, número de oficina postal, y la cantidad de USD, para que puedan verificar los detalles en la web de US Post Office.\n\nNo entregar la información requerida al Mediador o Árbitro resultará en pérdida del caso de disputa. \n\nEn todos los casos de disputa, el emisor de la USPMO tiene el 100% de responsabilidad en aportar la evidencia al Mediador o Árbitro.\n\nSi no entiende estos requerimientos, no comercie usando USPMO en Bisq. payment.f2f.contact=Información de contacto -payment.f2f.contact.prompt=¿Cómo quiere ser contactado por el par de intercambio? (dirección email, número de teléfono...) +payment.f2f.contact.prompt=Cómo le gustaría ser contactado por el par de intercambio? (dirección email, número de teléfono...) payment.f2f.city=Ciudad para la reunión 'cara a cara' payment.f2f.city.prompt=La ciudad se mostrará con la oferta payment.f2f.optionalExtra=Información adicional opcional payment.f2f.extra=Información adicional payment.f2f.extra.prompt=El creador puede definir los 'términos y condiciones' o añadir información de contacto pública. Será mostrada junto con la oferta. -payment.f2f.info=intercambiar, operarLos intercambios 'Cara a Cara' (F2F) tienen diferentes reglas y riesgos que las transacciones en línea.\n\nLas principales diferencias son:\n● Los pares de intercambio necesitan intercambiar información acerca del punto de reunión y la hora usando los detalles de contacto proporcionados.\n● Los pares de intercambio tienen que traer sus portátiles y hacer la confirmación de 'pago enviado' y 'pago recibido' en el lugar de reunión.\n● Si un creador tiene 'términos y condiciones' especiales necesita declararlos en el campo de texto 'información adicional' en la cuenta.\n● Tomando una oferta el tomador está de acuerdo con los 'términos y condiciones' declarados por el creador.\n● En caso de disputa el árbitro no puede ayudar mucho ya que normalmente es complicado obtener evidencias no manipulables de lo que ha pasado en una reunión. En estos casos los fondos BTC pueden bloquearse indefinidamente o hasta que los pares lleguen a un acuerdo.\n\nPara asegurarse de que comprende las diferencias con los intercambios 'Cara a Cara' por favor lea las instrucciones y recomendaciones en: 'https://docs.bisq.network/trading-rules.html#f2f-trading' +payment.f2f.info=Los intercambios 'Cara a Cara' tienen diferentes reglas y riesgos que las transacciones en línea.\n\nLas principales diferencias son:\n● Los pares de intercambio necesitan intercambiar información acerca del punto de reunión y la hora usando los detalles de contacto proporcionados.\n● Los pares de intercambio tienen que traer sus portátiles y hacer la confirmación de 'pago enviado' y 'pago recibido' en el lugar de reunión.\n● Si un creador tiene 'términos y condiciones' especiales necesita declararlos en el campo de texto 'información adicional' en la cuenta.\n● Tomando una oferta el tomador está de acuerdo con los 'términos y condiciones' declarados por el creador.\n● En caso de disputa el árbitro no puede ayudar mucho ya que normalmente es complicado obtener evidencias no manipulables de lo que ha pasado en una reunión. En estos casos los fondos BTC pueden bloquearse indefinidamente o hasta que los pares lleguen a un acuerdo.\n\nPara asegurarse de que comprende las diferencias con los intercambios 'Cara a Cara' por favor lea las instrucciones y recomendaciones en: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=Abrir paǵina web payment.f2f.offerbook.tooltip.countryAndCity=País y ciudad: {0} / {1} payment.f2f.offerbook.tooltip.extra=Información adicional: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=Banco payment.japan.branch=Branch payment.japan.account=Cuenta payment.japan.recipient=Nombre +payment.australia.payid=PayID +payment.payid=PayID conectado a una institución financiera. Como la dirección email o el número de móvil. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=Cara a cara (en persona) JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=PayID australiano # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=Bancos nacionales @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=El 0 no es un valor permitido. validation.negative=No se permiten entradas negativas. validation.fiat.toSmall=No se permite introducir un valor menor que el mínimo posible validation.fiat.toLarge=No se permiten entradas más grandes que la mayor posible. -validation.btc.fraction=El valor introducido resulta en un valor de bitcoin con una fracción de la menor unidad (Satoshi). +validation.btc.fraction=El valor introducido resulta en un valor de bitcoin menor a 1 satoshi validation.btc.toLarge=No se permiten valores mayores que {0}. validation.btc.toSmall=Valores menores que {0} no se permiten. -validation.securityDeposit.toSmall=No se permiten valores menores que {0}. -validation.passwordTooShort=La clave introducida es demasiado corta. Se precisan al menos 8 caracteres. +validation.passwordTooShort=El password introducido es muy corto. Necesita tener al menos 8 caracteres. validation.passwordTooLong=La clave introducida es demasiado larga. Máximo 50 caracteres. validation.sortCodeNumber={0} debe consistir en {1} números. validation.sortCodeChars={0} debe consistir en {1} caracteres @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} debe consistir de {1} número(s). #new validation.invalidInput=Entrada inválida: {0} validation.accountNrFormat=El número de cuenta debe ser del formato: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=La validación de dirección falló porque no se corresponde con la estructura de una dirección {0}. -validation.altcoin.ltz.zAddressesNotSupported=Dirección LTZ tiene que empezar con L. Las direcciones que empiezan por z no se soportan. -validation.altcoin.zAddressesNotSupported=La dirección ZEC tiene que empezar con t. Las direcciones que comienzan con z no están soportadas. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=Las drecciones LTZ deben empezar con L. Las direcciones que empiecen por z no están soportadas. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=Las direcciones ZEC deben empezar con t. Las direcciones empezando con z no están soportadas. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=La dirección no es una dirección {0} válida! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Direcciones de segwit nativas (las que empiezan con 'lq') no son compatibles. -validation.bic.invalidLength=La longitud de la entrada no es 8 ni 11 +validation.bic.invalidLength=La longitud del valor introducido debe ser 8 u 11. validation.bic.letters=El código de banco y país deben ser letras validation.bic.invalidLocationCode=BIC contiene un código de localización inválido validation.bic.invalidBranchCode=BIC contiene una sucursal inválida validation.bic.sepaRevolutBic=Cuentas Revolut Sepa no soportadas. -validation.btc.invalidFormat=Formato de dirección bitcoin inválido -validation.bsq.invalidFormat=Formato inválido de la dirección BSQ. +validation.btc.invalidFormat=Formato inválido para una dirección Bitcoin. +validation.bsq.invalidFormat=Formato inválido para una dirección BSQ. validation.email.invalidAddress=Dirección inválida validation.iban.invalidCountryCode=Código de país inválido validation.iban.checkSumNotNumeric=El checksum debe ser numérico validation.iban.nonNumericChars=Detectado carácter no alfanumérico validation.iban.checkSumInvalid=El checksum de IBAN es inválido -validation.iban.invalidLength=El número debe ser de una longitud de 15 a 34 carácteres. +validation.iban.invalidLength=El número debe tener una longitud de 15 a 34 caracteres. validation.interacETransfer.invalidAreaCode=Código de area no canadiense -validation.interacETransfer.invalidPhone=Formato de número de teléfono inválido y no una dirección e-mail. +validation.interacETransfer.invalidPhone=Por favor introduzca un número de teléfono de 11 dígitos (p.ej. 1-123-456-7890) o una dirección email. validation.interacETransfer.invalidQuestion=Debe contener solamente letras, números, espacios y/o símbolos ' _ , . ? - validation.interacETransfer.invalidAnswer=Debe ser una palabra y contener solamente letras, números, y/o el símbolo - validation.inputTooLarge=El valor introducido no debe ser mayor que {0} validation.inputTooSmall=Lo introducido tiene que ser mayor que {0} validation.inputToBeAtLeast=El valor introducido tiene que ser al menos {0} -validation.amountBelowDust=No se permite una cantidad por debajo del límite de una transacción polvo de {0} satoshis. +validation.amountBelowDust=No se permite una cantidad por debajo del límite de polvo {0} validation.length=La longitud debe estar entre {0} y {1} validation.pattern=El valor introducido debe ser de formato: {0} validation.noHexString=El valor introducido no es un formato HEX. @@ -2859,7 +2852,7 @@ validation.numberFormatException=Excepción en formato de número {0} validation.mustNotBeNegative=El valor introducido no debe ser negativo validation.phone.missingCountryCode=Se necesitan dos letras de código de país para validar el número de teléfono validation.phone.invalidCharacters=Número de teléfono {0} tiene caracteres inválidos -validation.phone.insufficientDigits=No hay suficientes dígitos en {0} para un número de teléfono válido -validation.phone.tooManyDigits=Demasiados dígitos en {0} para ser un número de teléfono válido -validation.phone.invalidDialingCode=Código de país en número {0} es inválido para el país {1}. El código correcto es {2}. +validation.phone.insufficientDigits=No hay suficientes dígitos en {0} para ser un número válido de teléfono +validation.phone.tooManyDigits=Hay demasiados dígitos en {0} para ser un número de teléfono válido. +validation.phone.invalidDialingCode=El código de país para el número {0} es inválido para el país {1}. El código de país correcto es {2}. validation.invalidAddressList=La lista de direcciones válidas debe ser separada por coma diff --git a/core/src/main/resources/i18n/displayStrings_fa.properties b/core/src/main/resources/i18n/displayStrings_fa.properties index cf998b4d16..89eb68de41 100644 --- a/core/src/main/resources/i18n/displayStrings_fa.properties +++ b/core/src/main/resources/i18n/displayStrings_fa.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=پیشنهاد shared.multipleOffers=پیشنهادها shared.Offer=پیشنهاد +shared.offerVolumeCode={0} Offer Volume shared.openOffers=پیشنهادهای باز shared.trade=معامله shared.trades=معاملات @@ -122,7 +123,8 @@ shared.noDateAvailable=تاریخ موجود نیست shared.noDetailsAvailable=جزئیاتی در دسترس نیست shared.notUsedYet=هنوز مورد استفاده قرار نگرفته shared.date=تاریخ -shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n shared.copyToClipboard=کپی در کلیپ‌بورد shared.language=زبان @@ -188,7 +190,6 @@ shared.tradeWalletAddress=آدرس کیف‌پول معاملات shared.tradeWalletBalance=موجودی کیف‌پول معاملات shared.makerTxFee=سفارش گذار: {0} shared.takerTxFee=پذیرنده سفارش: {0} -shared.securityDepositBox.description=سپرده‌ی اطمینان بیتکوین {0} shared.iConfirm=تایید می‌کنم shared.tradingFeeInBsqInfo=equivalent to {0} used as trading fee shared.openURL=باز {0} @@ -237,8 +238,6 @@ mainView.menu.settings=تنظیمات mainView.menu.account=حساب mainView.menu.dao=DAO (موسسه خودمختار غیرمتمرکز) -mainView.marketPrice.provider=قیمت بر اساس -mainView.marketPrice.label=قیمت بازار mainView.marketPriceWithProvider.label=قیمت بازار بر اساس {0} mainView.marketPrice.bisqInternalPrice=قیمت آخرین معامله‌ی Bisq mainView.marketPrice.tooltip.bisqInternalPrice=قیمت بازارهای خارجی موجود نیست.\nقیمت نمایش داده شده، از آخرین معامله‌ی Bisq برای ارز موردنظر اتخاذ شده است. @@ -251,14 +250,15 @@ mainView.balance.locked.short=قفل شده mainView.footer.usingTor=(استفاده از Tor) mainView.footer.localhostBitcoinNode=(لوکال هاست) -mainView.footer.btcInfo=همتایان شبکه بیتکوین: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=در حال ارتباط با شبکه بیت‌کوین mainView.footer.bsqInfo.synchronizing=/ همگام‌سازی DAO mainView.footer.btcInfo.synchronizingWith=در حال همگام شدن با -mainView.footer.btcInfo.synchronizedWith=همگام شده با +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=در حال ایجاد ارتباط با mainView.footer.btcInfo.connectionFailed=Connection failed to -mainView.footer.p2pInfo=Bisq network peers: {0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=گره کامل DAO mainView.bootstrapState.connectionToTorNetwork=(1/4) در حال ارتباط با شبکه Tor ... @@ -292,7 +292,6 @@ market.tabs.spread=جزئیات market.tabs.trades=معاملات # OfferBookChartView -market.offerBook.chart.title=دفتر پیشنهادها برای {0} market.offerBook.buyAltcoin=خرید {0} (فروش {1}) market.offerBook.sellAltcoin=فروش {1} (خرید {0}) market.offerBook.buyWithFiat=خرید {0} @@ -382,7 +381,7 @@ offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you hav offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions -offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} @@ -393,8 +392,7 @@ offerbook.warning.offerBlocked=پیشنهاد توسط توسعه دهندگان offerbook.warning.currencyBanned=ارز مورد استفاده در آن پیشنهاد، توسط توسعه‌دهندگان Bisq مسدود شد.\nبرای اطلاعات بیشتر، لطفاً از انجمن Bisq بازدید نمایید. offerbook.warning.paymentMethodBanned=روش پرداخت مورد استفاده در آن پیشنهاد، توسط توسعه دهندگان Bisq مسدود شد.\nلطفاً برای اطلاعات بیشتر، از انجمن Bisq بازدید نمایید. offerbook.warning.nodeBlocked=آدرس onion آن معامله گر، توسط توسعه دهندگان Bisq مسدود شد.\nاحتمالاً هنگام گرفتن پیشنهاد از جانب آن معامله گر، یک اشکال ناامن موجب پدید آمدن مسائلی شده است. -offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=Your payment account has been created {0} ago. Your trade limit is based on the account age and is not sufficient for that offer.\n\nYour trade limit is: {1}\nThe min. trade amount of the offer is: {2}.\n\nYou cannot take that offer at the moment. Once your account is older than 2 months this restriction gets removed. +offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. offerbook.info.sellAtMarketPrice=با قیمت روز بازار خواهید فروخت (به روز رسانی در هر دقیقه). @@ -445,7 +443,6 @@ createOffer.alreadyFunded=در حال حاضر آن پیشنهاد را تامی createOffer.createOfferFundWalletInfo.headline=پیشنهاد خود را تامین وجه نمایید # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=مقدار معامله:{0}\n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} و {1} createOffer.createOfferFundWalletInfo.msg=شما باید {0} برای این پیشنهاد، سپرده بگذارید.\nآن وجوه در کیف پول محلی شما ذخیره شده اند و هنگامی که کسی پیشنهاد شما را دریافت می کند، به آدرس سپرده چند امضایی قفل خواهد شد.\n\nمقدار مذکور، مجموع موارد ذیل است:\n{1} - سپرده‌ی اطمینان شما: {2}\n-هزینه معامله: {3}\n-هزینه تراکنش شبکه: {4}\nشما هنگام تامین مالی معامله‌ی خود، می‌توانید بین دو گزینه انتخاب کنید:\n- از کیف پول Bisq خود استفاده کنید (این روش راحت است، اما ممکن است تراکنش‌ها قابل رصد شوند)، یا\n- از کیف پول خارجی انتقال دهید (به طور بالقوه‌ای این روش ایمن‌تر و محافظ حریم خصوصی شما است)\n\nشما تمام گزینه‌ها و جزئیات تامین مالی را پس از بستن این پنجره، خواهید دید. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=شما نمی‌توانید آن پیشنهاد takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again. takeOffer.error.noFundsLost=\n\nهیچ پولی تاکنون از کیف پول شما کم نشده است.\nلطفاً برنامه را مجدداً راه اندازی کرده و ارتباط اینترنت خود را بررسی نمایید تا ببینید آیا می‌توانید مشکل را حل کنید یا خیر. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nتراکنش سپرده از قبل منتشر شده است.\nلطفاً سعی کنید تا برنامه را مجدداً راه اندازی کرده و ارتباط اینترنت خود را بررسی کنند تا ببینید آیا می‌توانید این مشکل را حل کنید یا خیر.\nاگر مشکل همچنان پابرجا است، لطفاً برای پشتیبانی با توسعه دهندگان تماس بگیرید. takeOffer.error.payoutPublished=\n\nتراکنش پرداخت از قبل منتشر شده است.\nلطفاً سعی کنید تا برنامه را مجدداً راه اندازی کرده و ارتباط اینترنت خود را بررسی کنند تا تا ببینید آیا می‌توانید این مشکل را حل کنید یا خیر.\nاگر مشکل همچنان پابرجا است، لطفاً برای پشتیبانی با توسعه دهندگان تماس بگیرید. @@ -543,7 +541,7 @@ portfolio.tab.history=تاریخچه portfolio.tab.failed=ناموفق portfolio.tab.editOpenOffer=ویرایش پیشنهاد -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance.\n\nError message: {0} portfolio.pending.step1.waitForConf=برای تأییدیه بلاک چین منتظر باشید portfolio.pending.step2_buyer.startPayment=آغاز پرداخت @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=مورد الزامی مهم:\nب # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=لطفاً {0} را با استفاده از Western Union به فروشنده‌ی بیتکوین پرداخت کنید.\n\n portfolio.pending.step2_buyer.westernUnion.extra=مورد الزامی مهم:\nبعد از اینکه پرداخت را انجام دادید، MTCN (عدد پیگیری) و یک عکس از رسید را با ایمیل به فروشنده‌ی بیتکوین ارسال کنید.\nرسید باید به طور واضح نام کامل، کشور، ایالت فروشنده و مقدار را نشان دهد. ایمیل فروشنده: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=لطفاً {0} را توسط \"US Postal Money Order\" به فروشنده‌ی بیتکوین پرداخت کنید.\n\n @@ -636,7 +636,7 @@ portfolio.pending.step2_buyer.confirmStart.headline=تأیید کنید که پ portfolio.pending.step2_buyer.confirmStart.msg=آیا شما پرداخت {0} را به شریک معاملاتی خود آغاز کردید؟ portfolio.pending.step2_buyer.confirmStart.yes=بلی، پرداخت را آغاز کرده‌ام portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway portfolio.pending.step2_seller.waitPayment.headline=برای پرداخت منتظر باشید @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=اطلاعات تماس خرید portfolio.pending.step2_seller.waitPayment.msg=تراکنش سپرده، حداقل یک تأییدیه بلاکچین دارد.شما\nباید تا آغاز پرداخت {0} از جانب خریدار بیتکوین، صبر نمایید. portfolio.pending.step2_seller.warn=خریدار بیت‌کوین هنوز پرداخت {0} را انجام نداده است.\nشما باید تا آغاز پرداخت از جانب او، صبر نمایید.\nاگر معامله تا {1} تکمیل نشد، داور بررسی خواهد کرد. portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance. -portfolio.pending.step2_seller.refresh=Refresh Trade State -portfolio.pending.step2_seller.refreshInfo=Sometimes P2P network messages acknowledging payment are not delivered, causing trades to get stuck. Hit the button below to make your peer resend the last message. tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}'' tradeChat.openChat=Open chat window tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=چون پرداخت از طریق سپرده portfolio.pending.step3_seller.moneyGram=خریدار باید شماره مجوز و عکسی از رسید را به ایمیل شما ارسال کند.\nرسید باید به طور واضح نام کامل شما ، کشور، ایالت فروشنده و مقدار را نشان دهد. لطفاً ایمیل خود را بررسی کنید که آیا شماره مجوز را دریافت کرده‌اید یا خیر.\n\nپس از بستن پنجره، نام و آدرس خریدار بیتکوین را برای برداشت پول از مانی‌گرام خواهید دید.\n\nتنها پس از برداشت موفقیت آمیز پول، رسید را تأیید کنید! portfolio.pending.step3_seller.westernUnion=خریدار باید MTCN (شماره پیگیری) و عکسی از رسید را به ایمیل شما ارسال کند.\nرسید باید به طور واضح نام کامل شما، کشور، ایالت فروشنده و مقدار را نشان دهد. لطفاً ایمیل خود را بررسی کنید که آیا MTCN را دریافت کرده اید یا خیر.\nپس از بستن پنجره، نام و آدرس خریدار بیتکوین را برای برداشت پول از Western Union خواهید دید.\nتنها پس از برداشت موفقیت آمیز پول، رسید را تأیید کنید! portfolio.pending.step3_seller.halCash=خریدار باید کد HalCash را برای شما با پیامک بفرستد. علاوه‌ برآن شما از HalCash پیامی را محتوی اطلاعات موردنیاز برای برداشت EUR از خودپردازهای پشتیبان HalCash دریافت خواهید کرد.\n\nپس از اینکه پول را از دستگاه خودپرداز دریافت کردید، لطفا در اینجا رسید پرداخت را تایید کنید. +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=تأیید رسید پرداخت portfolio.pending.step3_seller.amountToReceive=مبلغ قابل دریافت @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=آیا وجه {0} را ا portfolio.pending.step3_seller.onPaymentReceived.fiat=شناسه معامله (متن \"دلیل پرداخت\") تراکنش: \"{0}\"\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" 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.\n\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=تأیید کنید که وجه را دریافت کرده‌اید portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=بله وجه را دریافت کرده‌ام @@ -746,7 +747,7 @@ portfolio.pending.tradePeriodInfo=پس از تأییدیه بلاکچین اول portfolio.pending.tradePeriodWarning=اگر مهلت به پایان برسد، هر دو معامله گر می توانند یک مناقشه را باز کنند. portfolio.pending.tradeNotCompleted=معامله به موقع (تا {0}) تکمیل نشد portfolio.pending.tradeProcess=فرآیند معامله -portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community. +portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=باز کردن مجدد مناقشه portfolio.pending.openSupportTicket.headline=باز کردن تیکت پشتیبانی portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator. @@ -757,14 +758,9 @@ portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. portfolio.pending.error.depositTxNotConfirmed=The deposit transaction is not confirmed. You can not open an arbitration dispute with an unconfirmed deposit transaction. Please wait until it is confirmed or go to \"Settings/Network info\" and do a SPV resync.\n\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -portfolio.pending.notification=اطلاع رسانی - portfolio.pending.support.headline.getHelp=Need help? portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator. -portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator. portfolio.pending.support.button.getHelp=Open Trader Chat -portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket? -portfolio.pending.support.popup.button=باز کردن تیکت پشتیبانی portfolio.pending.support.headline.halfPeriodOver=Check payment portfolio.pending.support.headline.periodOver=Trade period is over @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Mediation requested portfolio.pending.refundRequested=Refund requested portfolio.pending.openSupport=باز کردن تیکت پشتیبانی portfolio.pending.supportTicketOpened=تیکت پشتیبانی باز شد -portfolio.pending.requestSupport=درخواست پشتیبانی -portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds. portfolio.pending.communicateWithArbitrator=لطفا در صفحه‌ی \"پشتیبانی\" با داور در ارتباط باشید. portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator. -portfolio.pending.supportTicketOpenedMyUser=شما در حال حاضر یک تیکت پشتیبانی باز کرده‌اید.\n{0} portfolio.pending.disputeOpenedMyUser=شما در حال حاضر یک مناقشه باز کرده‌اید.\n{0} portfolio.pending.disputeOpenedByPeer=طرف معامله شما یک مناقشه باز کرده است\n{0} -portfolio.pending.supportTicketOpenedByPeer=طرف معامله شما یک تیکت پشتیبانی باز کرده است.\n{0} portfolio.pending.noReceiverAddressDefined=آدرسی برای گیرنده تعیین نشده است -portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade? portfolio.pending.mediationResult.headline=Suggested payout from mediation portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout. @@ -790,18 +781,18 @@ portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted portfolio.pending.mediationResult.button=View proposed resolution portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0} -portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nOnce the lock time is over on {0} (block {1}), you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. +portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nFeel free to move this trade to failed trades. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. @@ -839,6 +830,7 @@ funds.deposit.fundWallet=تأمین مالی کیف پول شما funds.deposit.withdrawFromWallet=ارسال وجه از کیف‌پول funds.deposit.amount=مبلغ به BTC (اختیاری) funds.deposit.generateAddress=ایجاد آدرس جدید +funds.deposit.generateAddressSegwit=Native segwit format (Bech32) funds.deposit.selectUnused=لطفاً به جای ایجاد یک آدرس جدید، یک آدرس استفاده نشده را از جدول بالا انتخاب کنید. funds.withdrawal.arbitrationFee=هزینه‌ی داوری @@ -986,6 +978,7 @@ setting.preferences.general=اولویت‌های عمومی setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=حداکثر تفاوت از قیمت روز بازار +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=حالت «آماده باش» را نادیده بگیر setting.preferences.autoConfirmXMR=XMR auto-confirm setting.preferences.autoConfirmEnabled=Enabled @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Required confirmations setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) setting.preferences.deviationToLarge=مقادیر بزرگتر از {0}% مجاز نیست. -setting.preferences.txFee=کارمزد تراکنش برداشت (ساتوشی/بایت) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=استفاده از ارزش سفارشی -setting.preferences.txFeeMin=کارمزد تراکنش حداقل باید {0} ساتوشی/بایت باشد -setting.preferences.txFeeTooLarge=ورودی شما بالاتر از مقدار معقول (> 5000 ساتوشی/بایت) است. هزینه تراکنش معمولا در محدوده 50-400 ساتوشی / بایت است. +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Ignored peers [onion address:port] -setting.preferences.refererId=شناسه ارجاع setting.preferences.ignoreDustThreshold=Min. non-dust output value -setting.preferences.refererId.prompt=شناسه ارجاع اختیاری setting.preferences.currenciesInList=ارزها در لیست قیمت روز بازار setting.preferences.prefCurrency=ارز مطلوب setting.preferences.displayFiat=نمایش ارزهای ملی @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=استفاده از انیمیشن‌ها setting.preferences.useDarkMode=Use dark mode setting.preferences.sortWithNumOffers=مرتب سازی لیست‌ها با تعداد معاملات/پیشنهادها setting.preferences.resetAllFlags=تنظیم مجدد تمام پرچم‌های \"دوباره نشان نده\" -setting.preferences.reset=تنظیم مجدد settings.preferences.languageChange=اعمال تغییر زبان به تمام صفحات مستلزم یک راه‌اندازی مجدد است. settings.preferences.supportLanguageWarning=In case of a dispute, please note that mediation is handled in {0} and arbitration in {1}. -settings.preferences.selectCurrencyNetwork=انتخاب شبکه setting.preferences.daoOptions=گزینه‌های DAO setting.preferences.dao.resyncFromGenesis.label=بازسازی وضعیت DAO از تراکنش پیدایش setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=Block notify port setting.preferences.dao.fullNodeInfo=For running Bisq as DAO full node you need to have Bitcoin Core locally running and RPC enabled. All requirements are documented in ''{0}''.\n\nAfter changing the mode you need to restart. setting.preferences.dao.fullNodeInfo.ok=باز کردن صفحه مستندات setting.preferences.dao.fullNodeInfo.cancel=خیر، من با حالت «گره سبک» ادامه می‌دهم +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=نام +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=شبکه بیتکوین settings.net.p2pHeader=Bisq network @@ -1043,8 +1039,8 @@ settings.net.useTorForBtcJLabel=استفاده از Tor برای شبکه بیت settings.net.bitcoinNodesLabel=گره‌های Bitcoin Core در دسترس settings.net.useProvidedNodesRadio=استفاده از نودهای بیتکوین ارائه شده settings.net.usePublicNodesRadio=استفاده از شبکه بیتکوین عمومی -settings.net.useCustomNodesRadio= استفاده از نودهای بیتکوین اختصاصی -settings.net.warn.usePublicNodes=اگر از شبکه عمومی بیتکوین استفاده می‌کنید، حریم خصوصی شما در معرض نودهای شبکه بیتکوین قرار می‌گیرد. این نقص ناشی از طراحی و پیاده‌سازی معیوب تکنولوژی Bloom Filter است که در کیف پول های SPV مانند BitcoinJ (که در Bisq هم استفاده می‌شود) وجود دارد. هر نود کامل بیتکوین که به آن متصل باشید می‌تواند هویت شما را با آدرس‌های کیف‌پول‌شما مرتبط بداند و این می‌تواند باعث برملا شدن هویت شما به نودهای شبکه بیتکوین شود.\nلطفاً جزئیات بیشتر را در این لینک بخوانید: https://bisq.network/blog/privacy-in-bitsquare.\n\nآیا مطمئن هستید که می‌خواهید از نودهای عمومی استفاده کنید؟ +settings.net.useCustomNodesRadio=استفاده از نودهای بیتکوین اختصاصی +settings.net.warn.usePublicNodes=If you use the public Bitcoin network you are exposed to a severe privacy problem caused by the broken bloom filter design and implementation which is used for SPV wallets like BitcoinJ (used in Bisq). Any full node you are connected to could find out that all your wallet addresses belong to one entity.\n\nPlease read more about the details at [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nAre you sure you want to use the public nodes? settings.net.warn.usePublicNodes.useProvided=خیر، از نودهای فراهم شده استفاده کنید. settings.net.warn.usePublicNodes.usePublic=بلی، از شبکه عمومی استفاده کنید. settings.net.warn.useCustomNodes.B2XWarning=لطفا مطمئن شوید که گره بیت‌کوین شما یک گره مورد اعتماد Bitcoin Core است!\n\nمتصل شدن به گره‌هایی که از قوانین مورد اجماع موجود در Bitcoin Core پیروی نمی‌کنند می‌تواند باعث خراب شدن کیف پول شما شود و در فرآیند معامله مشکلاتی را به وجود بیاورد.\n\nکاربرانی که از گره‌های ناقض قوانین مورد اجماع استفاده می‌کند مسئول هر گونه آسیب ایجاد شده هستند. اگر هر گونه اختلافی به وجود بیاید به نفع دیگر گره‌هایی که از قوانین مورد اجماع پیروی می‌کنند درمورد آن تصمیم گیری خواهد شد. به کاربرانی که این هشدار و سازوکار محافظتی را نادیده می‌گیرند هیچ‌گونه پشتیبانی فنی ارائه نخواهد شد! @@ -1150,16 +1146,14 @@ setting.about.shortcuts.sendPrivateNotification=Send private notification to pee setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=ثبت نام داور account.tab.mediatorRegistration=Mediator registration account.tab.refundAgentRegistration=Refund agent registration account.tab.signing=Signing -account.tab.account=حساب account.info.headline=به حساب Bisq خود خوش آمدید account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=Could not complete registration.{0 account.altcoin.yourAltcoinAccounts=حساب‌های آلت‌کوین شما account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases. account.altcoin.popup.wallet.confirm=من می فهمم و تأیید می کنم که می دانم از کدام کیف پول باید استفاده کنم. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN requires an interactive process between the sender and receiver to create the transaction. Be sure to follow the instructions from the GRIN project web page to reliably send and receive GRIN (the receiver needs to be online or at least be online during a certain time frame). \n\nBisq supports only the Grinbox (Wallet713) wallet URL format. \n\nThe GRIN sender is required to provide proof that they have sent GRIN successfully. If the wallet cannot provide that proof, a potential dispute will be resolved in favor of the GRIN receiver. Please be sure that you use the latest Grinbox software which supports the transaction proof and that you understand the process of transferring and receiving GRIN as well as how to create the proof. \n\nSee https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only for more information about the Grinbox proof tool. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAM requires an interactive process between the sender and receiver to create the transaction. \n\nBe sure to follow the instructions from the BEAM project web page to reliably send and receive BEAM (the receiver needs to be online or at least be online during a certain time frame). \n\nThe BEAM sender is required to provide proof that they sent BEAM successfully. Be sure to use wallet software which can produce such a proof. If the wallet cannot provide the proof a potential dispute will be resolved in favor of the BEAM receiver. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Trading L-BTC on Bisq requires that you understand the following:\n\nWhen receiving L-BTC for a trade on Bisq, you cannot use the mobile Blockstream Green Wallet app or a custodial/exchange wallet. You must only receive L-BTC into the Liquid Elements Core wallet, or another L-BTC wallet which allows you to obtain the blinding key for your blinded L-BTC address.\n\nIn the event mediation is necessary, or if a trade dispute arises, you must disclose the blinding key for your receiving L-BTC address to the Bisq mediator or refund agent so they can verify the details of your Confidential Transaction on their own Elements Core full node.\n\nFailure to provide the required information to the mediator or refund agent will result in losing the dispute case. In all cases of dispute, the L-BTC receiver bears 100% of the burden of responsibility in providing cryptographic proof to the mediator or refund agent.\n\nIf you do not understand these requirements, do not trade L-BTC on Bisq. account.fiat.yourFiatAccounts=حساب‌های ارزهای ملی شما @@ -1213,7 +1222,6 @@ account.backup.location=محل پشتیبان‌گیری account.backup.selectLocation=انتخاب محل پشتیبان گیری account.backup.backupNow=پشتیبان گیری در حال حاضر (پشتیبان رمزگذاری نشده است!) account.backup.appDir=راهنمای داده های برنامه -account.backup.logFile=فایل گزارش account.backup.openDirectory=باز کردن راهنما account.backup.openLogFile=باز کردن فایل گزارش account.backup.success=پشتیبان به طور موفقیت آمیز در {0} ذخیره شد. @@ -1227,7 +1235,7 @@ account.password.info=با محافظت رمزعبوری شما باید با ه account.seed.backup.title=پشتیبان گیری از کلمات رمز خصوصی کیف های پول شما account.seed.info=لطفا هم کلمات seed و هم تاریخ را یادداشت کنید! شما هر زمانی که بخواهید می‌توانید کیف‌پولتان را با استفاده از کلمات seed و تاریخ بازیابی کنید.\nهمین کلمات seed برای کیف‌پول‌های BTC و BSQ هم استفاده می‌شود.\n\nشما باید کلمات seed را روی یک برگ کاغذ یادداشت کنید. آنها را روی کامپیوتر خودتان ذخیره نکنید.\n\nلطفا توجه کنید که کلمات seed جایگزینی برای یک پشتیبان نیستند.\nبرای بازیابی وضعیت و داده‌های برنامه باید از طریق صفحه \"Account/Backup\" از کل پوشه برنامه پشتیبان بسازید.\nوارد کردن کلمات seed فقط در موارد اورژانسی توصیه می‌شود. برنامه بدون پشتیبان از پایگاه داده و کلیدهای مناسب درست عمل نخواهد کرد! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. account.seed.warn.noPw.msg=شما یک رمز عبور کیف پول تنظیم نکرده اید که از نمایش کلمات رمز خصوصی محافظت کند.\n\nآیا می خواهید کلمات رمز خصوصی نشان داده شود؟ account.seed.warn.noPw.yes=بلی، و دوباره از من نپرس account.seed.enterPw=وارد کردن رمز عبور به منظور مشاهده ی کلمات رمز خصوصی @@ -1241,14 +1249,11 @@ account.seed.restore.ok=بسیار خب، Bisq را بازیابی و خاموش account.notifications.setup.title=آماده سازی account.notifications.download.label=بارگزاری برنامه موبایل -account.notifications.download.button=بارگزاری account.notifications.waitingForWebCam=منتظر دوربین... account.notifications.webCamWindow.headline=اسکن کد QR از طریق تلفن account.notifications.webcam.label=استفاده از دوربین account.notifications.webcam.button=اسکن کد QR account.notifications.noWebcam.button=دوربین ندارم -account.notifications.testMsg.label=ارسال اعلان امتحانی -account.notifications.testMsg.title=امتحان کردن account.notifications.erase.label=پاک کردن اعلان‌ها در تلفن account.notifications.erase.title=پاک کردن اعلان‌ها account.notifications.email.label=توکن جفت سازی @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=درصد فاصله از قیم account.notifications.marketAlert.addButton=اضافه کردن هشدار برای پیشنهادها account.notifications.marketAlert.manageAlertsButton=مدیریت هشدارهای مربوط به پیشنهادها account.notifications.marketAlert.manageAlerts.title=مدیریت هشدارهای مربوط به پیشنهادها -account.notifications.marketAlert.manageAlerts.label=هشدارهای مربوط به پیشنهادها -account.notifications.marketAlert.manageAlerts.item=هشدار مربوط به پیشنهاد {0} با قیمت نشان‌شده {1} و حساب پرداخت {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=حساب پرداخت account.notifications.marketAlert.manageAlerts.header.trigger=قیمت نشان‌شده account.notifications.marketAlert.manageAlerts.header.offerType=نوع پیشنهاد @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=متعادل کردن همه تراکنش های تائ dao.lockedForVoteBalance=در حال استفاده برای رای دادن dao.lockedInBonds=قفل شده در ضمانت dao.availableNonBsqBalance=موجودی غیر BSQ در دسترس (BTC) -dao.totalBsqBalance=مجموع موجودی BSQ dao.reputationBalance=Merit Value (not spendable) dao.tx.published.success=تراکنش شما به طور موفقیت آمیز منتشر شد. @@ -1455,11 +1457,6 @@ dao.param.currentValue=مقدار فعلی: {0} dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1}) dao.param.blocks={0} بلاک -dao.results.cycle.duration.label=زمان {0} -dao.results.cycle.duration.value={0} بلاک -dao.results.cycle.value.postFix.isDefaultValue=(مقدار پیش‌فرض) -dao.results.cycle.value.postFix.hasChanged=(در رای گیری تغییر کرده است) - dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=داده تصادفی dao.bond.reputation.hash=تابع درهم ساز (هش) dao.bond.reputation.lockupButton=قفل کردن dao.bond.reputation.lockup.headline=تایید تراکنش قفل کردن وجه -dao.bond.reputation.lockup.details=مبلغ قفل کردن: {0}\nزمان باز کردن قفل: (≈{2}) بلاک (ها) {1}\n\nهزینه استخراج: (بایت/ساتوشی ها {4}) {3}\nاندازه تراکنش: {5} Kb \n\nآیا مطمئن هستید که می خواهید ادامه دهید؟ +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=تایید تراکنش رها کردن وجه -dao.bond.reputation.unlock.details=مبلغ باز کردن قفل: {0}\nزمان باز کردن قفل: (≈{2}) بلاک (ها) {1}\n\nهزینه استخراج: (بایت/ساتوشی ها {4}) {3} اندازه تراکنش: {5}Kb\n\nآیا مطمئن هستید که می خواهید ادامه دهید؟ +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=همه ضمانت‌ها @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=امضا کردن dao.proofOfBurn.message=پیام dao.proofOfBurn.sig=امضا dao.proofOfBurn.verify=تایید کردن -dao.proofOfBurn.verify.header=پیغام تائید با کلیدی از اثبات سوختن تراکنش  dao.proofOfBurn.verificationResult.ok=تایید با موفقیت انجام شد dao.proofOfBurn.verificationResult.failed=تایید نا موفق بود @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Exact GitHub username dao.proposal.display.link=پیوند اینترنتی به اطلاعات جزئی dao.proposal.display.link.prompt=پیوند اینترنتی به طرح پیشنهادی dao.proposal.display.requestedBsq=مبلغ درخواستی به BSQ -dao.proposal.display.bsqAddress=آدرس BSQ dao.proposal.display.txId=شناسه تراکنش طرح پیشنهادی dao.proposal.display.proposalFee=کارمزد طرح پیشنهادی dao.proposal.display.myVote=رای من dao.proposal.display.voteResult=خلاصه نتایج رای‌گیری dao.proposal.display.bondedRoleComboBox.label=نوع نقش ضمانت شده dao.proposal.display.requiredBondForRole.label=ضمانت مورد نیاز برای نقش -dao.proposal.display.tickerSymbol.label=نماد dao.proposal.display.option=گزینه dao.proposal.table.header.proposalType=نوع طرح پیشنهادی dao.proposal.table.header.link=پیوند dao.proposal.table.header.myVote=رای من +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=حذف dao.proposal.table.icon.tooltip.removeProposal=طرح پیشنهادی من را حذف کن dao.proposal.table.icon.tooltip.changeVote=رای فعلی: ''{0}''. تغییر رای به: ''{1}'' @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=موجودی کیف‌پول من dao.wallet.receive.fundYourWallet=آدرس دریافت BSQ شما: dao.wallet.receive.bsqAddress=آدرس کیف پول BSQ (آدرس استفاده نشده جدید) -dao.wallet.receive.dao.headline=سازمان مستقل غیر متمرکز (Bisq (DAO -dao.wallet.receive.daoInfo=درست همانطور که مبادله کیف پول Bisq، غیر متمرکز است و در برابر سانسور مقاوم می باشد، مدل حاکمیت آن نیز وجود دارد و توکن Bisq DAO و BSQ ابزارهایی هستند که آنرا تحقق می بخشند. -dao.wallet.receive.daoInfo.button=درباره Bisq DAO بیشتر بدانید -dao.wallet.receive.daoTestnetInfo=شبکه اصلی سازمان مستقل غیر متمرکز(Bisq DAO) هنوز راه اندازی نشده است، اما شما می توانید با اجرای آن روی شبکه تستی، چیزهایی را راجع به Bisq DAO یاد بگیرید. -dao.wallet.receive.daoTestnetInfo.button=چطور Bisq DAO را روی شبکه تستی خود اجرا کنیم؟ -dao.wallet.receive.daoContributorInfo=اگر در رابطه با کیف پول Bisq مشارکت داشته اید، لطفا از آدرس BSQ زیر استفاده کنید و برای دریافت بخشی از توزیع جنسیس BSQ درخواست دهید. -dao.wallet.receive.daoContributorInfo.button=نحوه مشارکت در بخشی از توزیع جنسیس BSQ - dao.wallet.send.sendFunds=ارسال وجوه dao.wallet.send.sendBtcFunds=ارسال وجوه غیر BSQ (به BTC) dao.wallet.send.amount=مقدار به BSQ dao.wallet.send.btcAmount=مقدار به BTC (وجوه غیر BSQ) dao.wallet.send.setAmount=تعیین مبلغ به منظور برداشت (حداقل مبلغ {0} است) -dao.wallet.send.setBtcAmount=تنظیم مقدار برداشت به BTC (حداقل مقدار {0} است) dao.wallet.send.receiverAddress=آدرس BSQ گیرنده dao.wallet.send.receiverBtcAddress=آدرس BTC گیرنده dao.wallet.send.setDestinationAddress=آدرس مقصد خود را پر کنید dao.wallet.send.send=ارسال وجوه BSQ  dao.wallet.send.sendBtc=ارسال وجوه BTC dao.wallet.send.sendFunds.headline=تأیید درخواست برداشت -dao.wallet.send.sendFunds.details=در حال ارسال: {0} به آدرس گیرنده ی: {1} . \nهزینه لازم برای معامله عبارت است از: {2} ({3} ساتوشی/ بایت)\nاندازه تراکنش: {4} کیلوبایت\n\n دریافت کننده {5} دریافت خواهد کرد\n\n آیا شما مطمئن هستید که می خواهید این مبلغ را برداشت کنید؟ +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=آخرین بلاک تایید شده: {0} dao.wallet.chainHeightSyncing=منتظر بلاک‌ها... {0} تا از {1} بلاک تایید شده است dao.wallet.tx.type=نوع @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=شما سرمایه BSQ مناسبی ب dao.proposal.create.missingIssuanceFunds=شما سرمایه BTC مناسبی برای ایجاد تراکنش پروپوزال ندارید. همه تراکنش های BSQ نیازمند دستمزد استخراج کننده در BTC هستند و تراکنش های صدور نیز به BTC برای میزان BSQ درخواستی نیاز دارند (BSQ/ساتوشی ها {0}).\nاز دست رفته: {1} dao.feeTx.confirm=تایید {0} تراکنش -dao.feeTx.confirm.details=کارمزد {0}: {1}\nکارمزد استخراج: {2} ({3} ساتوشی بر بایت)\nاندازه تراکنش: {4} Kb\n\nآیا از انتشار تراکنش {5} اطمینان دارید؟ +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={1} :هزینه{0}\n\nBTCمورد نیاز برای صدورBSQ) : BSQ/ساتوشی ها {3}) {2}\nهزینه استخراج: (بایت/ساتوشی ها {5}) {4} اندازه تراکنش: {6}KB\n\nاگر درخواست شما پذیرفته شده باشد، مبلغ شبکه درخواستی از 2 هزینه پروپوزال BSQ را دریافت خواهید کرد.\n\nآیا اطمینان دارید که می خواهید {7} تراکنش را انتشار دهید؟ +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=سازمان مستقل غیر متمرکز (Bisq (DAO dao.news.bisqDAO.description=درست همانطور که مبادله کیف پول Bisq، غیر متمرکز و مقاوم در برابر سانسور است، مدل حاکمیت آن نیز وجود دارد و توکن های Bisq DAO و BSQ ابزارهایی هستند که آنرا محقق می سازند. @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=No. blind votes dao.factsAndFigures.menuItem.supply=BSQ Supply dao.factsAndFigures.menuItem.transactions=تراکنش‌های BSQ -dao.factsAndFigures.dashboard.marketPrice=داده‌های بازار -dao.factsAndFigures.dashboard.price=آخرین قیمت معاملاتی BSQ/BTC (به Bisq) dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=بعداً دانلود کن displayUpdateDownloadWindow.button.ignoreDownload=نادیده گرفتن این نسخه displayUpdateDownloadWindow.headline=یک به روز رسانی جدید برای Bisq موجود است! displayUpdateDownloadWindow.download.failed.headline=دانلود ناموفق بود -displayUpdateDownloadWindow.download.failed=دانلود ناموفق بود.\nلطفاً به صورت دستی در https://bisq.network/downloads دانلود کرده و امضا را تأیید کنید. -displayUpdateDownloadWindow.installer.failed=قادر به تعیین نصب کننده ی صحیح نیست. لطفاً به صورت دستی در https://bisq.network/downloads دانلود کرده و امضا را تأیید کنید. -displayUpdateDownloadWindow.verify.failed=اعتبارسنجی ناموفق بود.\nلطفاً به صورت دستی در https://bisq.network/downloads دانلود کرده و امضا را تأیید کنید. +displayUpdateDownloadWindow.download.failed=Download failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verification failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=نسخه ی جدید به طور موفقیت آمیز دانلود و امضا تأیید شد.\n\nلطفاً راهنمای دانلود را باز کرده، برنامه را ببندید و نسخه ی جدید را نصب نمایید. displayUpdateDownloadWindow.download.openDir=باز کردن راهنمای دانلود @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=پرداختی مقدار معامله disputeSummaryWindow.payout.getsTradeAmount=BTC {0} پرداختی مبلغ معامله را دریافت می کند disputeSummaryWindow.payout.getsAll=BTC {0} همه را دریافت می کند disputeSummaryWindow.payout.custom=پرداخت سفارشی -disputeSummaryWindow.payout.adjustAmount=مقدار وارد شده بیش از مقدار موجود {0} است. \nما این بخش ورودی را به حداکثر مقدار ممکن تنظیم می کنیم. disputeSummaryWindow.payoutAmount.buyer=مقدار پرداختی خریدار disputeSummaryWindow.payoutAmount.seller=مقدار پرداختی فروشنده disputeSummaryWindow.payoutAmount.invert=استفاده از بازنده به عنوان منتشر کننده @@ -2055,6 +2038,7 @@ disputeSummaryWindow.addSummaryNotes=افزودن نکات خلاصه disputeSummaryWindow.close.button=بستن تیکت # Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification @@ -2064,9 +2048,11 @@ disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and a disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions disputeSummaryWindow.close.closePeer=شما باید همچنین تیکت همتایان معامله را هم ببندید! disputeSummaryWindow.close.txDetails.headline=Publish refund transaction +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n -disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? disputeSummaryWindow.close.noPayout.headline=Close without any payout disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? @@ -2101,6 +2087,7 @@ filterWindow.btcNode=گره‌های بیت‌کوین فیلترشده (آدر filterWindow.preventPublicBtcNetwork=جلوگیری از استفاده ازشبکه عمومی بیت‌کوین filterWindow.disableDao=Disable DAO filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Min. version required for DAO filterWindow.disableTradeBelowVersion=Min. version required for trading filterWindow.add=افزودن فیلتر @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=تراکنش سپرده را برای مناقش selectDepositTxWindow.msg=تراکنش سپرده در معامله ذخیره نشده بود.\nلطفاً یکی از تراکنش های چندامضایی موجود از کیف پول خود را انتخاب کنید که تراکنش سپرده در معامله ی ناموفق، استفاده شده بود.\n\nشما می توانید تراکنش صحیح را با باز کردن پنجره جزئیات معامله (با کلیک بر روی شناسه معامله در لیست) و دنبال کردن خروجی تراکنش پرداخت هزینه معامله تا تراکنش بعدی که در آن شما می توانید تراکنش سپرده ی چند امضایی را ببینید (آدرس با 3 شروع می شود)، پیدا کنید. آن شناسه تراکنش باید در لیست ارائه شده در اینجا قابل مشاهده باشد. هنگامی که تراکنش صحیح را یافتید، آن تراکنش را در اینجا انتخاب نموده و ادامه دهید.\n\nبا عرض پوزش برای این مشکل، اما این خطا ندرتاً رخ دهد و در آینده ما سعی خواهیم کرد راه های بهتری برای حل آن پیدا کنیم. selectDepositTxWindow.select=انتخاب تراکنش سپرده -selectBaseCurrencyWindow.headline=انتخاب بازار -selectBaseCurrencyWindow.msg=بازار پیشفرض انتخاب شده، {0} است.\n\nاگر شما می خواهید به ارز پایه دیگری تغییر دهید، لطفاً یک ارز را از جعبه ی پایین انتخاب کنید.\nشما همچنین می توانید بعداً ارز پایه را در صفحه ی \"تنظیمات/شبکه\" تغییر دهید. -selectBaseCurrencyWindow.select=انتخاب ارز پایه - sendAlertMessageWindow.headline=ارسال اطلاع رسانی جهانی sendAlertMessageWindow.alertMsg=پیام هشدار sendAlertMessageWindow.enterMsg=وارد کردن پیام @@ -2232,9 +2215,8 @@ error.closedTradeWithNoDepositTx=The deposit transaction of the closed trade wit popup.warning.walletNotInitialized=کیف پول هنوز راه اندازی اولیه نشده است popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. popup.warning.wrongVersion=شما احتمالاً نسخه اشتباه Bisq را برای این رایانه دارید.\nمعماری کامپیوتر شما این است: {0}.\nباینری Bisq که شما نصب کرده اید،عبارت است از: {1}.\nلطفاً نسخه فعلی را خاموش کرده و مجدداً نصب نمایید ({2}). -popup.warning.incompatibleDB=ما فایل های پایه داده ناسازگار را کشف کردیم! \n\nاین فایل های(s) پایگاه داده با پایه کد فعلی ما سازگار نیست:\n {0}\n\n ما از فایل (های) خراب شده یک پشتیبان گرفتیم و مقادیر پیش فرض را به یک پایگاه داده نسخه ی جدید اعمال کردیم. \n\nپشتیبان واقع است در: {1}/db/backup_of_corrupted_data.\n\n لطفا بررسی کنید که آیا آخرین نسخه Bisq نصب شده است یا خیر. \nشما می توانید آن را در: https://bisq.network/downloads دانلود کنید\n\n لطفا برنامه را دوباره راه اندازی کنید. +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 new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application. popup.warning.startupFailed.twoInstances=Bisq در حال اجرا است. شما نمیتوانید دو نمونه از Bisq را اجرا کنید. -popup.warning.cryptoTestFailed=به نظر می رسد که شما از باینری خود کامپایل استفاده می کنید و از دستورالعمل های ساخت در https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys پیروی نکرده اید.\n\n اگر این مورد نیست و شما از باینری رسمی Bisq استفاده می کنید، لطفا گزارش اشکال را به صفحه GitHub ارسال کنید.\n Error={0} popup.warning.tradePeriod.halfReached=معامله شما با شناسه {0} نیمی از حداکثر مجاز دوره زمانی معامله را به پایان رسانده و هنوز کامل نشده است. \n\nدوره معامله در {1} به پایان می رسد\n\n لطفا وضعیت معامله خود را در \"سبد سهام/معاملات باز\" برای اطلاعات بیشتر، بررسی کنید. 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 mediator. popup.warning.noTradingAccountSetup.headline=شما یک حساب معاملاتی را راه اندازی نکرده اید @@ -2258,7 +2240,9 @@ popup.warning.noBsqFundsForBtcFeePayment=کیف‌پول BSQ شما BSQ کافی popup.warning.messageTooLong=پیام شما بیش از حداکثر اندازه مجاز است. لطفا آن را در چند بخش ارسال کنید یا آن را در یک سرویس مانند https://pastebin.com آپلود کنید. popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"." +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=رله قیمت popup.warning.seed=دانه popup.warning.mandatoryUpdate.trading=Please update to the latest Bisq version. A mandatory update was released which disables trading for old versions. Please check out the Bisq Forum for more information. @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=The {0} transaction for trade with ID {1} was rej popup.warning.openOfferWithInvalidMakerFeeTx=The maker fee transaction for offer with ID {0} is invalid.\nTransaction ID={1}.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -popup.warning.trade.depositTxNull=The trade with ID ''{0}'' has no deposit transaction set.\n\nPlease restart the application to see if the problem still exists.\n\nIf it does, please open the trade details popup by clicking on the trade ID. Then click on the transaction IDs for the maker fee transaction and the taker fee transaction to view them on a block explorer. A transaction that cannot be found in a block explorer is probably an invalid transaction.\n\nIf this happens, please report it in the #support channel on the Bisq Keybase (https://keybase.io/team/bisq). If your trade fee transaction is invalid, no funds have left your wallet, you can move the trade to failed trades,and do an SPV resync for your funds to reappear (see how below).\n\nIf your trade fee transaction is valid, the fee amount is lost, and you can make a request for reimbursement on the support repository on GitHub (https://github.com/bisq-network/support/issues).\n\nIn both cases, please do an SPV resync from the ''Settings/Network'' screen to clean your wallet of any lingering issues! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Move to failed trades -popup.warning.trade.depositTxNull.shutDown=Shut down Bisq - popup.info.securityDepositInfo=برای اطمینان از اینکه هر دو معامله گر پروتکل معامله را رعایت می‌کنند، هر دو معامله گر باید مبلغی را تحت عنوان سپرده اطمینان پرداخت کنند.\n\nاین سپرده در کیف‌پول معامله شما نگهداری می‌شود و زمانی که معامله شما با موفقیت انجام شد به خود شما بازگردانده خواهد شد.\n\nلطفا توجه کنید: اگر می‌خواهید یک پیشنهاد جدید ایجاد کنید، Bisq باید برای در سمت معامله دیگر اجرا باشد تا بتوانند آن را بپذیرد. برای اینکه پیشنهادات شما برخط بمانند، بگذارید Bisq در حال اجرابماند و همچنین مطمئن شوید که این کامپیوتر به اینترنت متصل است. (به عنوان مثال مطمئن شوید که به حالت آماده باش نمی‌رود.. البته حالت آماده باش برای نمایشگر ایرادی ندارد). popup.info.cashDepositInfo=لطفا مطمئن شوید که شما یک شعبه بانک در منطقه خود دارید تا بتوانید سپرده نقدی را بپردازید. شناسه بانکی (BIC/SWIFT) بانک فروشنده: {0}. popup.info.cashDepositInfo.confirm=تأیید می کنم که می توانم سپرده را ایجاد کنم popup.info.shutDownWithOpenOffers=Bisq در حال خاموش شدن است ولی پیشنهاداتی وجود دارند که باز هستند.\n\nزمانی که Bisq بسته باشد این پیشنهادات در شبکه P2P در دسترس نخواهند بود، ولی هر وقت دوباره Bisq را باز کنید این پیشنهادات دوباره در شبکه P2P منتشر خواهند شد.\n\n برای اینکه پیشنهادات شما برخط بمانند، بگذارید Bisq در حال اجرابماند و همچنین مطمئن شوید که این کامپیوتر به اینترنت متصل است. (به عنوان مثال مطمئن شوید که به حالت آماده باش نمی‌رود.. البته حالت آماده باش برای نمایشگر ایرادی ندارد). -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=اعلان خصوصی مهم! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=توجه الزامی برای معامله با popup.info.multiplePaymentAccounts.headline=Multiple payment accounts available popup.info.multiplePaymentAccounts.msg=You have multiple payment accounts available for this offer. Please make sure you've picked the right one. -popup.news.launch.headline=Two Major Updates -popup.news.launch.accountSigning.headline=ACCOUNT SIGNING -popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer. -popup.news.launch.ntp.headline=NEW TRADE PROTOCOL -popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant. - popup.accountSigning.selectAccounts.headline=Select payment accounts popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign. popup.accountSigning.selectAccounts.signAll=Sign all payment methods @@ -2324,7 +2297,7 @@ popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey popup.accountSigning.success.headline=Congratulations popup.accountSigning.success.description=All {0} payment accounts were successfully signed! -popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0} popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1} popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0} @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=Signing completed popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: A decentralized bitcoin exchange network # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=حساب های معاملاتی در مسیر ذیل ذخیره شد:\n{0} guiUtil.accountExport.noAccountSetup=شما حساب های معاملاتی برای صادرات ندارید. @@ -2463,6 +2435,7 @@ navigation.portfolio.pending=\"سبد سهام /معاملات باز\" navigation.portfolio.closedTrades=\"سبد سهام /تاریخچه\" navigation.funds.depositFunds=\"وجوه/دریافت وجوه\" navigation.settings.preferences=\"تنظیمات/اولویت ها\" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"وجوه/تراکنش ها\" navigation.support=\"پشتیبانی\" navigation.dao.wallet.receive=\"DAO/کیف پول BSQ/دریافت\" @@ -2525,11 +2498,11 @@ password.deriveKey=کلید را از رمز عبور استنتاج کنید password.walletDecrypted=کیف پول با موفقیت رمزگشایی شد و حفاظت با رمز عبور حذف شد. password.wrongPw=شما رمز عبور را اشتباه وارد کرده اید.\n\n لطفا سعی کنید رمز عبور خود را وارد کنید و با دقت خطاها و اشتباهات املایی را بررسی کنید. password.walletEncrypted=کیف پول به طور موفقیت آمیز کدگذاری و حفاظت کیف پول فعال شد. -password.walletEncryptionFailed=رمز عبور کیف پول را نمی توان تنظیم کرد .ممکن است کلمات رمز خصوصی را وارد کرده باشید که با پایگاه داده کیف پول منطبق نیستند. لطفا در تالار گفتگوی با توسعه دهندگان Bisq تماس بگیرید. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=2 رمز عبوری که وارد نموده اید باهم مطابقت ندارند. password.forgotPassword=رمز عبور را فراموش کرده اید؟ -password.backupReminder=لطفا توجه داشته باشید که هنگام تنظیم یک رمز عبور کیف پول، تمام پشتیبان های خودکار از کیف پول رمزگذاری نشده حذف خواهد شد.\n\n توصیه می شود که نسخه پشتیبان از دایرکتوری نرم برنامه را تهیه کنید و قبل از تنظیم رمز عبور، کلمات رمز خصوصی خود را بنویسید! -password.backupWasDone=من قبلا یک نسخه پشتیبان تهیه کرده ام +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=کلمات seed کیف‌پول seed.enterSeedWords=کلمات seed کیف‌پول را وارد کنید @@ -2537,7 +2510,7 @@ seed.date=تاریخ کیف‌پول seed.restore.title=بازگرداندن کیف های پول از کلمات رمز خصوصی seed.restore=بازگرداندن کیف های پول seed.creationDate=تاریخ ایجاد -seed.warn.walletNotEmpty.msg=کیف پول بیتکوین شما خالی نیست.\n\n شما باید قبل از تلاش برای بازگرداندن یک کیف پول قدیمی تر، این کیف پول را خالی کنید، زیرا ترکیب کیف پول ها با هم می تواند به پشتیبان گیری های نامعتبر منجر شود.\n\n لطفا معاملات خود را نهایی کنید، تمام پیشنهادهای باز را ببندید و برای برداشتن بیتکوین به قسمت وجوه بروید.\n در صورت عدم دسترسی به بیتکوین شما میتوانید از ابزار اضطراری برای خالی کردن کیف پول استفاده کنید.\n برای باز کردن این ابزار اضطراری، دکمه \"alt + e\" یا \"option + e\" را بزنید. +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=میخواهم به هر حال بازگردانی کنم seed.warn.walletNotEmpty.emptyWallet=من ابتدا کیف پول هایم را خالی می کنم seed.warn.notEncryptedAnymore=کیف های پول شما رمزگذاری شده اند. \n\nپس از بازگرداندن، کیف های پول دیگر رمزگذاری نخواهند شد و شما باید رمز عبور جدید را تنظیم کنید.\n\n آیا می خواهید ادامه دهید؟ @@ -2578,12 +2551,11 @@ payment.altcoin.address=آدرس آلت‌کوین payment.altcoin.tradeInstantCheckbox=Trade instant (within 1 hour) with this Altcoin payment.altcoin.tradeInstant.popup=For instant trading it is required that both trading peers are online to be able to complete the trade in less than 1 hour.\n\nIf you have offers open and you are not available please disable those offers under the 'Portfolio' screen. payment.altcoin=آلت‌کوین -payment.select.altcoin=انتخاب یا جستجوی آلت کوین +payment.select.altcoin=Select or search Altcoin payment.secret=سوال محرمانه payment.answer=پاسخ payment.wallet=شناسه کیف پول payment.uphold.accountId=نام کاربری یا ایمیل یا شماره تلفن -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=ایمیل یا شماره تلفن payment.venmo.venmoUserName=نام کاربری Venmo payment.popmoney.accountId=ایمیل یا شماره تلفن @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=شناسه شهروندی/شناسه مالیات payment.supportedCurrencies=ارزهای مورد حمایت payment.limitations=محدودیت‌ها payment.salt=داده‌های تصافی برای اعتبارسنجی سن حساب -payment.error.noHexSalt=داده تصادفی باید در فرمت HEX باشد.\n اگر بخواهید داده تصادفی را از یک حساب قدیمی برای حفظ سن حساب خود منتقل کنید، فقط توصیه می شود که فیلد داده تصادفی را ویرایش کنید. عمر حساب با استفاده از داده تصادفی حساب و شناسایی دادههای تصادفی (به عنوان مثال IBAN) تأیید شده است. +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=پذیرش معاملات از این کشورهای Euro ای payment.accept.nonEuro=پذیرش معاملات از کشورهای غیر Euro ای payment.accepted.countries=کشورهای پذیرفته شده @@ -2625,31 +2597,33 @@ payment.accountType=نوع حساب payment.checking=بررسی payment.savings=اندوخته ها payment.personalId=شناسه شخصی -payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle:\nhttps://www.zellepay.com/get-started\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. +payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Bisq to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved. -payment.moneyGram.info=هنگام استفاده از MoneyGram، خریدار BTC باید شماره مجوز و عکس رسید را از طریق ایمیل به فروشنده BTC ارسال کند. رسید باید به وضوح نام کامل فروشنده، کشور، دولت و مبلغ را نشان دهد. ایمیل فروشنده در فرآیند معامله به خریدار نشان داده می شود. -payment.westernUnion.info=هنگام استفاده از Western Union، خریدار BTC باید شماره MTCN (شماره پیگیری) را از طریق ایمیل به فروشنده BTC ارسال کند. رسید باید به وضوح نام کامل فروشنده، کشور، دولت و مبلغ را نشان دهد. ایمیل فروشنده در فرآیند معامله به خریدار نشان داده می شود. +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=زمانی که از HalCash استفاده می‌کنید، خریدار باید کد HalCash را از طریق پیام کوتاه موبایل به فروشنده BTC ارسال کند.\n\nلطفا مطمئن شوید که از حداکثر میزانی که بانک شما برای انتقال از طریق HalCash مجاز می‌داند تجاوز نکرده‌اید. حداقل مقداردر هر برداشت معادل 10 یورو و حداکثر مقدار 600 یورو می‌باشد. این محدودیت برای برداشت‌های تکراری برای هر گیرنده در روز 3000 یورو و در ماه 6000 یورو می‌باشد. لطفا این محدودیت‌ها را با بانک خود مطابقت دهید و مطمئن شوید که آنها هم همین محدودی‌ها را دارند.\n\nمقدار برداشت باید شریبی از 10 یورو باشد چرا که مقادیر غیر از این را نمی‌توانید از طریق ATM برداشت کنید. رابط کاربری در صفحه ساخت پینشهاد و پذیرش پیشنهاد مقدار BTC را به گونه‌ای تنظیم می‌کنند که مقدار EUR درست باشد. شما نمی‌توانید از قیمت بر مبنای بازار استفاده کنید چون مقدار یورو با تغییر قیمت‌ها عوض خواهد شد.\n\nدر صورت بروز اختلاف خریدار BTC باید شواهد مربوط به ارسال یورو را ارائه دهد. -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\nTo mitigate this risk, Bisq sets per-trade limits based on two factors:\n\n1. The estimated level of chargeback risk for the payment method used\n2. The age of your account for that payment method\n\nThe account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\n● During the 1st month, your per-trade limit will be {0}\n● During the 2nd month, your per-trade limit will be {1}\n● After the 2nd month, your per-trade limit will be {2}\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. -payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase with account age.\n\nSee more:\nhttps://bisq.wiki/Account_limits\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=لطفا مطمئن شوید که بانک شما اجازه پرداخت سپرده نفد به حساب دیگر افراد را می‌دهد. برای مثال، Bank of America و Wells Fargo دیگر اجازه چنین پرداخت‌هایی را نمی‌دهند. payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=Update Revolut account payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. payment.f2f.contact=اطلاعات تماس -payment.f2f.contact.prompt=از چه طریقی می‌خواهید توسط همتای معاملاتی با شما تماس حاصل شود؟ (آدرس ایمیل، شماره تلفن، ...) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=شهر جهت ملاقات 'رو در رو' payment.f2f.city.prompt=نام شهر به همراه پیشنهاد نمایش داده خواهد شد payment.f2f.optionalExtra=اطلاعات اضافی اختیاری payment.f2f.extra=اطلاعات اضافی payment.f2f.extra.prompt=سفارش‌گذار می‌تواند متن 'شرایط و الزامات' را تعیین کند و یا اطلاعات تماس عمومی را تنظیم کند. این اطلاعات به همراه پیشنهاد نمایش داده خواهد شد. -payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading' +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=باز کردن صفحه وب payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1} payment.f2f.offerbook.tooltip.extra=اطلاعات اضافی: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=بانک payment.japan.branch=Branch payment.japan.account=حساب payment.japan.recipient=نام +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=مانی گرام WESTERN_UNION=Western Union F2F=رو در رو (به طور فیزیکی) JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=بانک های ملی @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=رو در رو # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=ورودی 0 مجاز نیست. validation.negative=یک مقدار منفی مجاز نیست. validation.fiat.toSmall=ورودی کوچکتر از حداقل مقدار ممکن مجاز نیست. validation.fiat.toLarge=ورودی بزرگتر از حداکثر مقدار ممکن مجاز نیست. -validation.btc.fraction=نتایج ورودی در یک مقدار بیتکوین با کسری از کوچکترین واحد (ساتوشی). +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=ورودی بزرگتر از {0} مجاز نیست. validation.btc.toSmall=ورودی کوچکتر از {0} مجاز نیست. -validation.securityDeposit.toSmall=ورودی کوچکتر از {0} مجاز نیست. -validation.passwordTooShort=رمز عبور که شما وارد کرده اید خیلی کوتاه است.رمز عبور لازم است 8 کاراکتر حداقل باشد. +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=رمز عبور که شما وارد کرده اید خیلی طولانی است.رمز عبور بیش از 50 کاراکتر نمی تواند باشد. validation.sortCodeNumber={0} باید شامل {1} عدد باشد. validation.sortCodeChars={0} باید شامل {1} کاراکتر باشد. @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} باید شامل {1} عدد باشد. #new validation.invalidInput=ورودی نامعتبر: {0} validation.accountNrFormat=شماره حساب باید از فرمت {0} باشد +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=تأیید آدرس ناموفق بود زیرا آن با ساختار یک آدرس {0} مطابقت ندارد. -validation.altcoin.ltz.zAddressesNotSupported=LTZ address need to start with L. Addresses starting with z are not supported. -validation.altcoin.zAddressesNotSupported=آدرس ZEC باید با t شروع شود. آدرس هایی که با z می شوند، پشتیبانی نمی شوند. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=آدرس یک آدرس {0} معتبر نیست! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Native segwit addresses (those starting with 'lq') are not supported. -validation.bic.invalidLength=طول ورودی نه 8 و نه 11 است +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=کد بانک و کد کشور باید حروف باشند validation.bic.invalidLocationCode=BIC حاوی کد مکان نامعتبر است validation.bic.invalidBranchCode=BIC حاوی کد شعبه نامعتبر است validation.bic.sepaRevolutBic=حساب های Revolut Sepa پشتیبانی نمی شود. -validation.btc.invalidFormat=فرمت آدرس بیتکوین نامعتبر است. -validation.bsq.invalidFormat=فرمت آدرس BSQ نامعتبر است. +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=آدرس نامعتبر است validation.iban.invalidCountryCode=کد کشور نامعتبر است validation.iban.checkSumNotNumeric=سرجمع باید عددی باشد validation.iban.nonNumericChars=کاراکتر غیر الفبایی و غیر عددی شناسایی شد validation.iban.checkSumInvalid=سرجمع IBAN نامعتبر است -validation.iban.invalidLength=شماره باید طولی به اندازه ی 15 تا 34 کاراکتر داشته باشد. +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=کد ناحیه غیر کانادایی -validation.interacETransfer.invalidPhone=فرمت شماره تلفن نامعتبر است و نه یک آدرس ایمیل +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=باید فقط شامل حروف، اعداد، فاصله و یا نمادهای ' _ , . ? - باشد validation.interacETransfer.invalidAnswer=باید یک کلمه باشد و فقط شامل حروف، اعداد و یا نماد - باشد validation.inputTooLarge=ورودی نباید بزرگتر از {0} باشد validation.inputTooSmall=ورودی باید بزرگتر از {0} باشد validation.inputToBeAtLeast=Input has to be at least {0} -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=طول باید بین {0} و {1} باشد validation.pattern=ورودی باید در این قالب باشد: {0} validation.noHexString=ورودی در قالب HEX نیست @@ -2859,7 +2852,7 @@ validation.numberFormatException=Number format exception {0} validation.mustNotBeNegative=ورودی نباید منفی باشد validation.phone.missingCountryCode=Need two letter country code to validate phone number validation.phone.invalidCharacters=Phone number {0} contains invalid characters -validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number -validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number -validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}. +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=Must be comma separated list of valid addresses diff --git a/core/src/main/resources/i18n/displayStrings_fr.properties b/core/src/main/resources/i18n/displayStrings_fr.properties index 4cc45d3736..93f98cf04f 100644 --- a/core/src/main/resources/i18n/displayStrings_fr.properties +++ b/core/src/main/resources/i18n/displayStrings_fr.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=ordre shared.multipleOffers=ordres shared.Offer=Ordre +shared.offerVolumeCode={0} Offer Volume shared.openOffers=ordres ouverts shared.trade=transaction shared.trades=transactions @@ -122,7 +123,8 @@ shared.noDateAvailable=Pas de date disponible shared.noDetailsAvailable=Pas de détails disponibles shared.notUsedYet=Pas encore utilisé shared.date=Date -shared.sendFundsDetailsWithFee=Envoi: {0}\nDepuis l'adresse: {1}\nÀ l'adresse de réception: {2}\nLes frais de transaction requis sont : {3} ({4} satoshis/byte)\nMontant de la transaction: {5} Kb\n\nLe destinataire recevra: {6}\n\nÊtes-vous certain de vouloir retirer ce montant? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n shared.copyToClipboard=Copier dans le presse-papiers shared.language=Langue @@ -188,7 +190,6 @@ shared.tradeWalletAddress=Adresse du portefeuille de trading shared.tradeWalletBalance=Solde du portefeuille de trading shared.makerTxFee=Maker: {0} shared.takerTxFee=Taker: {0} -shared.securityDepositBox.description=Dépôt de garantie pour BTC {0} shared.iConfirm=Je confirme shared.tradingFeeInBsqInfo=Équivalent à {0} utilisé en frais de transaction shared.openURL=Ouvert {0} @@ -237,8 +238,6 @@ mainView.menu.settings=Paramètres mainView.menu.account=Compte mainView.menu.dao=DAO -mainView.marketPrice.provider=Prix par -mainView.marketPrice.label=Prix du marché mainView.marketPriceWithProvider.label=Prix du marché par {0} mainView.marketPrice.bisqInternalPrice=Cours de la dernière transaction Bisq mainView.marketPrice.tooltip.bisqInternalPrice=Il n'y a pas de cours de marché disponible depuis une source externe.\nLe cours affiché est celui de la dernière transaction Bisq pour cette devise. @@ -251,14 +250,15 @@ mainView.balance.locked.short=Vérouillé mainView.footer.usingTor=(utilisant Tor) mainView.footer.localhostBitcoinNode=(localhost) -mainView.footer.btcInfo=Pairs du réseau Bitcoin: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=Connexion au réseau Bitcoin en cours mainView.footer.bsqInfo.synchronizing=/ Synchronisation DAO en cours mainView.footer.btcInfo.synchronizingWith=Synchronisation avec -mainView.footer.btcInfo.synchronizedWith=Synchronisé avec +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=Se connecte à mainView.footer.btcInfo.connectionFailed=Connection failed to -mainView.footer.p2pInfo=Pairs du réseau Bisq: {0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=DAO full node mainView.bootstrapState.connectionToTorNetwork=(1/4) Connection au réseau Tor... @@ -292,7 +292,6 @@ market.tabs.spread=Détails market.tabs.trades=Échanges # OfferBookChartView -market.offerBook.chart.title=Livre des ordres pour {0} market.offerBook.buyAltcoin=Achat {0} (vente {1}) market.offerBook.sellAltcoin=Vente {0} (achat {1}) market.offerBook.buyWithFiat=Achat {0} @@ -382,7 +381,7 @@ offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you hav offerbook.warning.counterpartyTradeRestrictions=Cette offre ne peut être acceptée en raison de restrictions d'échange imposées par les contreparties -offerbook.warning.newVersionAnnouncement=Avec cette version du logiciel, les pairs de trading peuvent vérifier et signer les comptes de paiement des autres pour créer un réseau de comptes de paiement de confiance.\n\nAprès avoir effectué des transactions avec un pair disposant d'un compte de paiement vérifié, votre compte de paiement sera signé et les limites de trading seront levées après une période déterminée (la durée de cette période est basée sur la méthode de vérification).\n\nPour plus d'informations sur la signature de compte, veuillez consulter la documentation à l'adresse suivante https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=Le montant de transaction autorisé est limité à {0} en raison des restrictions de sécurité basées sur les critères suivants:\n- Le compte de l''acheteur n''a pas été signé par un arbitre ou par un pair\n- Le délai depuis la signature du compte de l''acheteur est inférieur à 30 jours\n- Le mode de paiement pour cette offre est considéré comme présentant un risque de rétrofacturation bancaire\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=Le montant de transaction autorisé est limité à {0} en raison des restrictions de sécurité basées sur les critères suivants:\n- Votre compte n''a pas été signé par un arbitre ou par un pair\n- Le délai depuis la signature de votre compte est inférieur à 30 jours\n- Le mode de paiement pour cette offre est considéré comme présentant un risque de rétrofacturation bancaire\n\n{1} @@ -393,8 +392,7 @@ offerbook.warning.offerBlocked=L'ordre a été bloqué par des développeurs de offerbook.warning.currencyBanned=La devise utilisée pour cet ordre a été bloquée par les développeurs de Bisq.\nVeuillez visiter le Forum Bisq pour obtenir plus d'informations. offerbook.warning.paymentMethodBanned=Le mode de paiement utilisé pour cet ordre a été bloqué par les développeurs de Bisq.\nVeuillez visiter le Forum Bisq pour obtenir plus d'informations. offerbook.warning.nodeBlocked=L'adresse onion de ce trader a été bloquée par les développeurs de Bisq.\nIl s'agit peut être d'un bug qui cause des problèmes lors de l'acceptation de cet ordre. -offerbook.warning.requireUpdateToNewVersion=Votre version de Bisq n'est plus compatible pour le trading.\nVeuillez mettre à jour votre version de Bisq sur https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=Votre compte de paiement a été créé il y a {0} . Votre limite de trading est basée sur l''âge du compte et n'est pas suffisante pour cette offre.\n\nVotre limite de trading est: {1}\nLe montant minimum de l'offre est de: {2}.\n\nVous ne pouvez pas accepter cette offre pour le moment. Une fois que votre compte aura plus de 2 mois, cette restriction sera levée. +offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. offerbook.info.sellAtMarketPrice=Vous vendrez au prix du marché (mis à jour chaque minute). @@ -445,7 +443,6 @@ createOffer.alreadyFunded=Vous aviez déjà financé cet ordre.\nVos fonds ont createOffer.createOfferFundWalletInfo.headline=Financer votre ordre # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=Montant du trade: {0}\n\n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} et {1} createOffer.createOfferFundWalletInfo.msg=Vous devez déposer {0} pour cet ordre.\n\nCes fonds sont réservés dans votre portefeuille local et seront bloqués sur une adresse de dépôt multisig une fois que quelqu''un aura accepté votre ordre.\n\nLe montant correspond à la somme de:\n{1}- Votre dépôt de garantie: {2}\n- Frais de trading: {3}\n- Frais d''exploitation minière: {4}\n\nVous avez le choix entre deux options pour financer votre transaction :\n- Utilisez votre portefeuille Bisq (pratique, mais les transactions peuvent être associables) OU\n- Transfert depuis un portefeuille externe (potentiellement plus privé)\n\nVous pourrez voir toutes les options de financement et les détails après avoir fermé ce popup. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=Vous ne pouvez pas saisir cet ordre car le maker takeOffer.warning.connectionToPeerLost=Vous avez perdu la connexion avec le maker.\nIl se peut qu'ils se soient déconnectés ou qu'ils aient interrompu la connexion avec vous en raison d'un trop grand nombre de connexions en cours.\n\nSi vous pouvez encore voir leur offre dans le livre des ordres, vous pouvez essayer d'accepter une nouvelle fois l'offre. takeOffer.error.noFundsLost=\n\nAucun fonds n'a quitté votre portefeuille pour le moment.\nVeuillez essayer de redémarrer votre application et vérifier votre connexion réseau pour voir si vous pouvez résoudre le problème. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nLa transaction du dépôt de garantie à déjà été publiée.\nVeuillez redémarrer l'application et vérifier votre connexion réseau pour voir si le problème peut être résolu.\nSi le problème persiste, merci de contacter les développeurs afin d'obtenir de l'aide. takeOffer.error.payoutPublished=\n\nLe versement de la transaction à déjà été publiée.\nVeuillez redémarrer l'application et vérifier votre connexion réseau pour voir si le problème peut être résolu.\nSi le problème persiste, veuillez contacter les développeurs afin d'obtenir de l'aide. @@ -543,7 +541,7 @@ portfolio.tab.history=Historique portfolio.tab.failed=Échec portfolio.tab.editOpenOffer=Éditer l'ordre -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance.\n\nError message: {0} portfolio.pending.step1.waitForConf=Attendre la confirmation de la blockchain portfolio.pending.step2_buyer.startPayment=Initier le paiement @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=CONDITIONS REQUISES:\nAprès avoir # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=Veuillez s''il vous plaît payer {0} au vendeur de BTC en utilisant Western Union.\n\n portfolio.pending.step2_buyer.westernUnion.extra=CONDITIONS REQUISES:\nAprès avoir effectué le paiement envoyez le MTCN (numéro de suivi) et une photo du reçu par e-mail au vendeur de BTC.\nLe reçu doit faire clairement figurer le nom complet du vendeur, son pays, l''état et le montant. Le mail du vendeur est: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=Merci d''envoyer {0} par \"US Postal Money Order\" au vendeur de BTC.\n\n @@ -636,7 +636,7 @@ portfolio.pending.step2_buyer.confirmStart.headline=Confirmez que vous avez init portfolio.pending.step2_buyer.confirmStart.msg=Avez-vous initié le {0} paiement auprès de votre partenaire de trading? portfolio.pending.step2_buyer.confirmStart.yes=Oui, j'ai initié le paiement portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway portfolio.pending.step2_seller.waitPayment.headline=En attende du paiement @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=Coordonnées de l'acheteur portfolio.pending.step2_seller.waitPayment.msg=La transaction de dépôt a été vérifiée au moins une fois sur la blockchain\nVous devez attendre que l''acheteur de BTC lance le {0} payment. portfolio.pending.step2_seller.warn=L''acheteur de BTC n''a toujours pas effectué le paiement {0}.\nVeuillez attendre qu''il effectue celui-ci.\nSi la transaction n''est pas effectuée le {1}, un arbitre enquêtera. portfolio.pending.step2_seller.openForDispute=L'acheteur de BTC n'a pas initié son paiement !\nLa période maximale autorisée pour ce trade est écoulée.\nVous pouvez attendre plus longtemps et accorder plus de temps à votre pair de trading ou contacter le médiateur pour obtenir de l'aide. -portfolio.pending.step2_seller.refresh=Refresh Trade State -portfolio.pending.step2_seller.refreshInfo=Sometimes P2P network messages acknowledging payment are not delivered, causing trades to get stuck. Hit the button below to make your peer resend the last message. tradeChat.chatWindowTitle=Fenêtre de discussion pour la transaction avec l''ID ''{0}'' tradeChat.openChat=Ouvrir une fenêtre de discussion tradeChat.rules=Vous pouvez communiquer avec votre pair de trading pour résoudre les problèmes potentiels liés à cet échange.\nIl n'est pas obligatoire de répondre sur le chat.\nSi un trader enfreint l'une des règles ci-dessous, ouvrez un litige et signalez-le au médiateur ou à l'arbitre.\n\nRègles sur le chat:\n\t● N'envoyez pas de liens (risque de malware). Vous pouvez envoyer l'ID de transaction et le nom d'un explorateur de blocs.\n\t● N'envoyez pas les mots de votre seed, clés privées, mots de passe ou autre information sensible !\n\t● N'encouragez pas le trading en dehors de Bisq (non sécurisé).\n\t● Ne vous engagez dans aucune forme d'escroquerie d'ingénierie sociale.\n\t● Si un pair ne répond pas et préfère ne pas communiquer par chat, respectez sa décision.\n\t● Limitez la portée de la conversation à l'échange en cours. Ce chat n'est pas une alternative à messenger ou une troll-box.\n\t● Entretenez une conversation amicale et respectueuse. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=Du fait que le paiement est réalisé via Ca portfolio.pending.step3_seller.moneyGram=L'acheteur doit vous envoyer le numéro d'autorisation et une photo du reçu par e-mail .\nLe reçu doit faire clairement figurer votre nom complet, votre pays, l'état et le montant. Veuillez s'il vous plaît vérifier que vous avez bien reçu par e-mail le numéro d'autorisation.\n\nAprès avoir fermé ce popup vous verrez le nom de l'acheteur de BTC et l'adresse où retirer l'argent depuis MoneyGram.\n\nN'accusez réception qu'après avoir retiré l'argent avec succès! portfolio.pending.step3_seller.westernUnion=L'acheteur doit vous envoyer le MTCN (numéro de suivi) et une photo du reçu par e-mail .\nLe reçu doit faire clairement figurer votre nom complet, votre pays, l'état et le montant. Veuillez s'il vous plaît vérifier si vous avez reçu par e-mail le MTCN.\n\nAprès avoir fermé ce popup vous verrez le nom de l'acheteur de BTC et l'adresse où retirer l'argent depuis Western Union.\n\nN'accusez réception qu'après avoir retiré l'argent avec succès! portfolio.pending.step3_seller.halCash=L'acheteur doit vous envoyer le code HalCash par message texte SMS. Par ailleurs, vous recevrez un message de la part d'HalCash avec les informations nécessaires pour retirer les EUR depuis un DAB Bancaire supportant HalCash.\n\nAprès avoir retiré l'argent au DAB, veuillez confirmer ici la réception du paiement ! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nVeuillez également vérifier que le nom de l''expéditeur indiqué sur le contrat de l''échange correspond au nom qui apparaît sur votre relevé bancaire:\nNom de l''expéditeur, associé au contrat de l''échange: {0}\n\nSi les noms ne sont pas exactement identiques, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=ne confirmez pas la réception du paiement. Au lieu de cela, ouvrez un litige en appuyant sur \"alt + o\" ou \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=Confirmer la réception du paiement portfolio.pending.step3_seller.amountToReceive=Montant à recevoir @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=Avez-vous reçu le paieme portfolio.pending.step3_seller.onPaymentReceived.fiat=Le trade ID (\"reason for payment\" text) de la transaction est: \"{0}\"\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Veuillez également vérifier que le nom de l''expéditeur indiqué sur le contrat de l''échange correspond au nom qui apparaît sur votre relevé bancaire:\nNom de l''expéditeur, avec le contrat de l''échange: {0}\n\nSi les noms ne sont pas exactement identiques, ne confirmez pas la réception du paiement. Au lieu de cela, ouvrez un litige en appuyant sur \"alt + o\" ou \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.note=Veuillez noter que dès que vous aurez confirmé la réception, le montant verrouillé pour l'échange sera remis à l'acheteur de BTC et le dépôt de garantie vous sera remboursé.\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirmez que vous avez bien reçu le paiement portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Oui, j'ai reçu le paiement @@ -746,7 +747,7 @@ portfolio.pending.tradePeriodInfo=Après la première confirmation de la blockch portfolio.pending.tradePeriodWarning=Si le délai est dépassé, l'es deux participants du trade peuvent ouvrir un litige. portfolio.pending.tradeNotCompleted=Trade inachevé dans le temps imparti (jusqu''à {0}) portfolio.pending.tradeProcess=Processus de transaction -portfolio.pending.openAgainDispute.msg=Si vous n'êtes pas certain que le message adressé au médiateur ou à l'arbitre soit arrivé (par exemple si vous n'avez pas reçu de réponse après 1 jour), n'hésitez pas à ouvrir à nouveau un litige avec Cmd/Ctrl+o. Vous pouvez également demander de l'aide complémentaire sur le forum Bisq à l'adresse https://bisq.community. +portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=Ouvrir à nouveau le litige portfolio.pending.openSupportTicket.headline=Ouvrir un ticket d'assistance portfolio.pending.openSupportTicket.msg=S'il vous plaît n'utilisez seulement cette fonction qu'en cas d'urgence si vous ne pouvez pas voir le bouton \"Open support\" ou \"Ouvrir un litige\.\n\nLorsque vous ouvrez un ticket de support, l'échange sera interrompu et pris en charge par le médiateur ou par l'arbitre. @@ -757,14 +758,9 @@ portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. portfolio.pending.error.depositTxNotConfirmed=La transaction de dépôt n'est pas confirmée. Vous ne pouvez pas ouvrir un arbitrage pour le litige avec une transaction de dépôt non confirmée. Veuillez patienter jusqu'à ce qu'elle soit confirmée ou allez à \"Paramètres/Info sur le réseau réseau\" et faites une resynchronisation SPV.\n\nPour obtenir de l'aide, le canal support de l'équipe Bisq est disponible sur Keybase. -portfolio.pending.notification=Notification - portfolio.pending.support.headline.getHelp=Besoin d'aide ? portfolio.pending.support.text.getHelp=Si vous rencontrez des problèmes, vous pouvez essayer de contacter votre pair de trading dans le chat de l'échange ou demander à la communauté Bisq sur https://bisq.community. Si votre problème n'est toujours pas résolu, vous pouvez demander l'aide d'un médiateur. -portfolio.pending.support.text.getHelp.arbitrator=Si vous rencontrez des problèmes, vous pouvez essayer de contacter votre pair de trading dans le chat de l'échange ou demander à la communauté Bisq sur https://bisq.community Si votre problème n'est toujours pas résolu, vous pouvez demander l'aide d'un arbitre. portfolio.pending.support.button.getHelp=Open Trader Chat -portfolio.pending.support.popup.info=Si votre problème avec l'échange n'est toujours pas résolu, vous pouvez ouvrir un ticket de support pour demander l'aide d'un médiateur. Si vous n'avez pas reçu le paiement, veuillez attendre la fin de la période d'échange.\n\nÊtes-vous sûr de vouloir ouvrir un ticket support ? -portfolio.pending.support.popup.button=Ouvrir un ticket d'assistance portfolio.pending.support.headline.halfPeriodOver=Vérifier le paiement portfolio.pending.support.headline.periodOver=Le délai alloué pour ce trade est écoulé. @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Médiation demandée portfolio.pending.refundRequested=Remboursement demandé portfolio.pending.openSupport=Ouvrir un ticket d'assistance portfolio.pending.supportTicketOpened=Ticket d'assistance ouvert -portfolio.pending.requestSupport=Demander de l'aide -portfolio.pending.error.requestSupport=Veuillez signaler le problème à votre médiateur ou à votre arbitre.\n\nIls transmettront l'information aux développeurs pour enquêter sur le problème.\nUne fois le problème analysé, vous récupérerez tous les fonds bloqués. portfolio.pending.communicateWithArbitrator=Veuillez communiquer avec l'arbitre depuis l'écran "Support". portfolio.pending.communicateWithMediator=Veuillez communiquer avec le médiateur dans l'onglet \"Support \". -portfolio.pending.supportTicketOpenedMyUser=Vous avez déjà ouvert un ticket d''assistance.\n{0} portfolio.pending.disputeOpenedMyUser=Vous avez déjà ouvert un litige.\n{0} portfolio.pending.disputeOpenedByPeer=Votre pair de trading à ouvert un litige\n{0} -portfolio.pending.supportTicketOpenedByPeer=Votre pair de trading a ouvert un ticket d'’assistance.\n{0} portfolio.pending.noReceiverAddressDefined=Aucune adresse de destinataire définie -portfolio.pending.removeFailedTrade=Est-ce un échange en échec ? Si oui, souhaitez-vous le fermer manuellement, de sorte qu'il ne s'affiche plus comme un échange en cours ? portfolio.pending.mediationResult.headline=Montant suggéré par la médiation portfolio.pending.mediationResult.info.noneAccepted=Terminez la transaction en acceptant la suggestion du médiateur concernant le paiement de la transaction. @@ -790,18 +781,18 @@ portfolio.pending.mediationResult.info.peerAccepted=Votre pair de trading a acce portfolio.pending.mediationResult.button=Voir la résolution proposée portfolio.pending.mediationResult.popup.headline=Résultat de la médiation pour la transaction avec l''ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=Votre pair de trading a accepté la suggestion du médiateur pour la transaction {0} -portfolio.pending.mediationResult.popup.info=Le médiateur a suggéré le paiement suivant:\nVous recevez: {0}\nVotre pair de trading recevra: {1}\n\nVous pouvez accepter ou rejeter cette proposition de paiement.\n\nEn acceptant, vous signez la proposition de transaction de paiement. Si votre pair de trading accepte et signe également, le paiement sera terminé et la transaction sera soldée.\n\nSi l''un ou les deux d''entre vous rejettent la proposition, vous devrez attendre jusqu''au {2} (block {3}) pour ouvrir un litige en deuxième instance avec un arbitre qui enquêtera de nouveau sur la situation et effectuera un paiement en fonction de ses conclusions.\n\nL''arbitre peut imputer des frais minimes (frais maximal : le dépôt de garantie du trader) au titre de rémunération pour son travail. Les deux traders acceptant la suggestion du médiateur créant ainsi une résolution heureuse—la demande d''arbitrage est prévue pour des circonstances exceptionnelles, par exemple si un trader est convaincu que le médiateur n''a pas proposé une solution de paiement équitable (ou si l''autre pair ne répond pas).\n\nPlus de détails sur le nouveau modèle d''arbitrage:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nOnce the lock time is over on {0} (block {1}), you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Refuser et demander un arbitrage portfolio.pending.mediationResult.popup.alreadyAccepted=Vous avez déjà accepté portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. +portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nFeel free to move this trade to failed trades. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. @@ -839,6 +830,7 @@ funds.deposit.fundWallet=Alimenter votre portefeuille funds.deposit.withdrawFromWallet=Transférer des fonds depuis le portefeuille funds.deposit.amount=Montant en BTC (optionnel) funds.deposit.generateAddress=Générer une nouvelle adresse +funds.deposit.generateAddressSegwit=Native segwit format (Bech32) funds.deposit.selectUnused=Merci de sélectionner une adresse inutilisée dans le champ ci-dessus plutôt que d'en générer une nouvelle. funds.withdrawal.arbitrationFee=Frais d'arbitrage @@ -986,6 +978,7 @@ setting.preferences.general=Préférences générales setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=Ecart maximal par rapport au prix du marché +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=Éviter le mode veille setting.preferences.autoConfirmXMR=XMR auto-confirm setting.preferences.autoConfirmEnabled=Enabled @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Required confirmations setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) setting.preferences.deviationToLarge=Les valeurs supérieures à {0}% ne sont pas autorisées. -setting.preferences.txFee=Frais de transaction du retrait (satoshis/byte) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=Utiliser une valeur personnalisée -setting.preferences.txFeeMin=Les frais de transaction doivent être d''au moins {0} satoshis/octet -setting.preferences.txFeeTooLarge=Votre saisie est supérieure à toute valeur raisonnable (>5000 satoshis/octet). Les frais de transaction sont généralement de l'ordre de 50-400 satoshis/octet. +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Pairs ignorés [adresse onion:port] -setting.preferences.refererId=ID de parrainage setting.preferences.ignoreDustThreshold=Valeur de l'output considérée comme "non-dust" minimale -setting.preferences.refererId.prompt=ID de parrainage optionel setting.preferences.currenciesInList=Devises disponibles dans le flux de cotation du marché setting.preferences.prefCurrency=Devise privilégiée setting.preferences.displayFiat=Afficher les monnaies nationales @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=Utiliser des animations setting.preferences.useDarkMode=Utiliser le mode sombre setting.preferences.sortWithNumOffers=Trier les listes de marché avec le nombre d'ordres/de transactions setting.preferences.resetAllFlags=Réinitialiser toutes les balises de notification \"Don't show again\" -setting.preferences.reset=Réinitialiser settings.preferences.languageChange=Un redémarrage est nécessaire pour appliquer le changement de langue à tous les écrans. settings.preferences.supportLanguageWarning=En cas de litige, veuillez noter que la médiation est traitée en {0} et l'arbitrage en {1}. -settings.preferences.selectCurrencyNetwork=Sélectionner un réseau setting.preferences.daoOptions=Options DAO setting.preferences.dao.resyncFromGenesis.label=Reconstituer l'état de la DAO à partir du tx genesis setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=Bloquer le port de notification setting.preferences.dao.fullNodeInfo=Pour exécuter la DAO de Bisq en tant que full node, vous devez avoir Bitcoin Core en exécution locale et avec le RPC activé. Toutes les recommandations sont indiquées dans ''{0}''.\n\nAprès avoir changé de mode, vous serez contraint de redémarrer.. setting.preferences.dao.fullNodeInfo.ok=Ouvrir la page des docs setting.preferences.dao.fullNodeInfo.cancel=Non, je m'en tiens au mode lite node +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=Nom +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=Réseau Bitcoin settings.net.p2pHeader=Le réseau Bisq @@ -1044,7 +1040,7 @@ settings.net.bitcoinNodesLabel=Nœuds Bitcoin Core pour se connecter à settings.net.useProvidedNodesRadio=Utiliser les nœuds Bitcoin Core fournis settings.net.usePublicNodesRadio=Utiliser le réseau Bitcoin public settings.net.useCustomNodesRadio=Utiliser des nœuds Bitcoin Core personnalisés -settings.net.warn.usePublicNodes=Si vous utilisez le réseau public Bitcoin, vous pouvez être exposé à un grave problème de confidentialité provoqué par la conception et l'implémentation d'un filtre bloom cassé qui est notamment utilisé dans les portefeuilles SPV comme BitcoinJ (utilisé par Bisq). N'importe quel full node auquel vous serez connecté pourrait découvrir que toutes les adresses de votre portefeuille appartiennent de fait à une seule entité.\n\nPour de plus amples informations, veuillez consulter le site : https://bisq.network/blog/privacy-in-bitsquare.\n\nÊtes-vous sûr de vouloir utiliser les nœuds publics ? +settings.net.warn.usePublicNodes=If you use the public Bitcoin network you are exposed to a severe privacy problem caused by the broken bloom filter design and implementation which is used for SPV wallets like BitcoinJ (used in Bisq). Any full node you are connected to could find out that all your wallet addresses belong to one entity.\n\nPlease read more about the details at [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nAre you sure you want to use the public nodes? settings.net.warn.usePublicNodes.useProvided=Non, utiliser les nœuds fournis. settings.net.warn.usePublicNodes.usePublic=Oui, utiliser un réseau public settings.net.warn.useCustomNodes.B2XWarning=Veuillez vous assurer que votre nœud Bitcoin est un nœud Bitcoin Core de confiance !\n\nLa connexion à des nœuds qui ne respectent pas les règles du consensus de Bitcoin Core peut corrompre votre portefeuille et causer des problèmes dans le processus de trading.\n\nLes utilisateurs qui se connectent à des nœuds qui ne respectent pas les règles du consensus sont responsables des dommages qui en résultent. Tout litige qui en résulte sera tranché en faveur de l'autre pair. Aucune assistance technique ne sera apportée aux utilisateurs qui ignorent ces mécanismes d'alertes et de protections ! @@ -1150,16 +1146,14 @@ setting.about.shortcuts.sendPrivateNotification=Envoyer une notification privée setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=Enregistrement de l'arbitre account.tab.mediatorRegistration=Enregistrement du médiateur account.tab.refundAgentRegistration=Enregistrement de l'agent de remboursement account.tab.signing=Signing -account.tab.account=Compte account.info.headline=Bienvenue sur votre compte Bisq account.info.msg=Ici, vous pouvez ajouter des comptes de trading en devises nationales et en altcoins et créer une sauvegarde de votre portefeuille ainsi que des données de votre compte.\n\nUn nouveau portefeuille Bitcoin a été créé un premier lancement de Bisq.\n\nNous vous recommandons vivement d'écrire les mots-clés de votre seed de portefeuille Bitcoin (voir l'onglet en haut) et d'envisager d'ajouter un mot de passe avant le transfert de fonds. Les dépôts et retraits de Bitcoin sont gérés dans la section \"Fonds\".\n\nNotice de confidentialité et de sécurité : Bisq étant une plateforme d'échange décentralisée, toutes vos données sont conservées sur votre ordinateur. Il n'y a pas de serveurs, nous n'avons donc pas accès à vos informations personnelles, à vos fonds ou même à votre adresse IP. Les données telles que les numéros de compte bancaire, les adresses altcoin & Bitcoin, etc ne sont partagées avec votre pair de trading que pour effectuer les transactions que vous initiez (en cas de litige, le médiateur et l’arbitre verront les mêmes données que votre pair de trading). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=Impossible de terminer l''enregist account.altcoin.yourAltcoinAccounts=Vos comptes altcoin account.altcoin.popup.wallet.msg=Veuillez vous assurer que vous respectez les exigences relatives à l''utilisation des {0} portefeuilles, selon les conditions présentées sur la page {1} du site.\nL''utilisation des portefeuilles provenant de plateformes de trading centralisées où (a) vous ne contrôlez pas vos clés ou (b) qui ne disposent pas d''un portefeuille compatible est risquée : cela peut entraîner la perte des fonds échangés!\nLe médiateur et l''arbitre ne sont pas des spécialistes {2} et ne pourront pas intervenir dans ce cas. account.altcoin.popup.wallet.confirm=Je comprends et confirme que je sais quel portefeuille je dois utiliser. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Le trading d'ARQ sur Bisq exige que vous compreniez et remplissiez les exigences suivantes:\n\nPour envoyer des ARQ, vous devez utiliser soit le portefeuille officiel ArQmA GUI soit le portefeuille ArQmA CLI avec le flag store-tx-info activé (par défaut dans les nouvelles versions). Veuillez vous assurer que vous pouvez accéder à la tx key car cela pourrait être nécessaire en cas de litige.\narqma-wallet-cli (utiliser la commande get_tx_key)\narqma-wallet-gui (allez dans l'onglet historique et cliquez sur le bouton (P) pour accéder à la preuve de paiement).\n\nAvec un l'explorateur de bloc normal, le transfert n'est pas vérifiable.\n\nVous devez fournir au médiateur ou à l'arbitre les données suivantes en cas de litige:\n- Le tx de la clé privée\n- Le hash de la transaction\n- L'adresse publique du destinataire\n\nSi vous manquez de communiquer les données ci-dessus ou si vous utilisez un portefeuille incompatible, vous perdrez le litige. L'expéditeur des ARQ est responsable de la transmission au médiateur ou à l'arbitre de la vérification du transfert ces informations relatives au litige.\n\nIl n'est pas nécessaire de fournir l'ID du paiement, seulement l'adresse publique normale.\nSi vous n'êtes pas sûr de ce processus, visitez le canal discord ArQmA (https://discord.gg/s9BQpJT) ou le forum ArQmA (https://labs.arqma.com) pour obtenir plus d'informations. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=Lors de l'utilisation de Zcash, vous ne pouvez utiliser que les adresses transparentes (commençant par t), et non les z-adresses (privées), car le médiateur ou l'arbitre ne seraient pas en mesure de vérifier la transaction avec les z-adresses. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=Lors de l'utilisation de Zcoin, vous ne pouvez utiliser que les adresses transparentes (traçables), et non les adresses intraçables, car le médiateur ou l'arbitre ne seraient pas en mesure de vérifier la transaction avec des adresses intraçables dans un explorateur de blocs. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN nécessite un échange interactif entre l'émetteur et le récepteur pour créer la transaction. Assurez-vous de suivre les instructions de la page Web du projet GRIN pour envoyer et recevoir des GRIN de façon fiable (le récepteur doit être en ligne au moins pendant un certain temps).\n\nBisq ne supporte que le portefeuille Grinbox (Wallet713) format URL.\n\nL'expéditeur des GRIN doit fournir la preuve qu'il a envoyé les GRIN avec succès. Si le portefeuille ne peut pas fournir cette preuve, un litige potentiel sera résolu en faveur du destinataire des GRIN. Veuillez vous assurer que vous utilisez le dernier logiciel Grinbox qui supporte la preuve de transaction et que vous comprenez le processus de transfert et de réception des GRIN ainsi que la façon de créer la preuve.\n\nVisitez https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only pour plus d'informations sur l'outil de preuve de Grinbox. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAM nécessite un processus interactif entre l'émetteur et le récepteur pour créer la transaction.\n\nAssurez-vous de suivre les instructions de la page Web du projet BEAM pour envoyer et recevoir les BEAM de façon fiable (le récepteur doit être en ligne pendant au moins un certain temps).\n\nL'expéditeur de BEAM est tenu de fournir la preuve qu'il a envoyé BEAM avec succès. Assurez-vous d'utiliser un portefeuille qui peut produire une telle preuve. Si le portefeuille ne peut fournir la preuve, un litige potentiel sera résolu en faveur du récepteur des BEAM. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Trading L-BTC on Bisq requires that you understand the following:\n\nWhen receiving L-BTC for a trade on Bisq, you cannot use the mobile Blockstream Green Wallet app or a custodial/exchange wallet. You must only receive L-BTC into the Liquid Elements Core wallet, or another L-BTC wallet which allows you to obtain the blinding key for your blinded L-BTC address.\n\nIn the event mediation is necessary, or if a trade dispute arises, you must disclose the blinding key for your receiving L-BTC address to the Bisq mediator or refund agent so they can verify the details of your Confidential Transaction on their own Elements Core full node.\n\nFailure to provide the required information to the mediator or refund agent will result in losing the dispute case. In all cases of dispute, the L-BTC receiver bears 100% of the burden of responsibility in providing cryptographic proof to the mediator or refund agent.\n\nIf you do not understand these requirements, do not trade L-BTC on Bisq. account.fiat.yourFiatAccounts=Vos comptes en devise nationale @@ -1213,7 +1222,6 @@ account.backup.location=Emplacement de la sauvegarde account.backup.selectLocation=Sélectionner l'emplacement de sauvegarde account.backup.backupNow=Sauvegarder maintenant (la sauvegarde n'est pas cryptée !) account.backup.appDir=Répertoire des données de l'application -account.backup.logFile=Dossier log account.backup.openDirectory=Ouvrir le répertoire account.backup.openLogFile=Ouvrir le fichier de log account.backup.success=Sauvegarder réussite vers l''emplacement:\n{0} @@ -1227,7 +1235,7 @@ account.password.info=Avec la protection par mot de passe, vous devrez entrer vo account.seed.backup.title=Sauvegarder les mots composant la seed de votre portefeuille account.seed.info=Veuillez noter les mots de la seed du portefeuille ainsi que la date! Vous pouvez récupérer votre portefeuille à tout moment avec les mots de la seed et la date.\nLes mêmes mots-clés de la seed sont utilisés pour les portefeuilles BTC et BSQ.\n\nVous devriez écrire les mots de la seed sur une feuille de papier. Ne les enregistrez pas sur votre ordinateur.\n\nVeuillez noter que les mots de la seed ne remplacent PAS une sauvegarde.\nVous devez créer une sauvegarde de l'intégralité du répertoire de l'application à partir de l'écran \"Compte/Sauvergarde\" pour restaurer correctement les données de l'application.\nL'importation de mots de la seed n'est recommandée qu'en cas d'urgence. L'application ne sera pas fonctionnelle sans une sauvegarde adéquate des fichiers et des clés de la base de données ! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. account.seed.warn.noPw.msg=Vous n'avez pas configuré un mot de passe de portefeuille qui protégerait l'affichage des mots composant la seed.\n\nVoulez-vous afficher les mots composant la seed? account.seed.warn.noPw.yes=Oui, et ne me le demander plus à l'avenir account.seed.enterPw=Entrer le mot de passe afficher les mots composant la seed @@ -1241,14 +1249,11 @@ account.seed.restore.ok=Ok, effectuer la restauration et arrêter Bisq account.notifications.setup.title=Configurer account.notifications.download.label=Télécharger l'application mobile -account.notifications.download.button=Télécharger account.notifications.waitingForWebCam=En attente de la webcam.... account.notifications.webCamWindow.headline=Scanner le code QR depuis le téléphone account.notifications.webcam.label=Utiliser la webcam account.notifications.webcam.button=Scanner le QR code account.notifications.noWebcam.button=Je ne possède pas de webcam -account.notifications.testMsg.label=Envoyer une notification de test -account.notifications.testMsg.title=Test account.notifications.erase.label=Effacer les notifications sur le téléphone account.notifications.erase.title=Effacer les notifications account.notifications.email.label=Pairing token @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=Écart en pourcentage par rappo account.notifications.marketAlert.addButton=Ajouter une alerte pour les ordres account.notifications.marketAlert.manageAlertsButton=Gérer les alertes des ordres account.notifications.marketAlert.manageAlerts.title=Gérer les alertes pour les ordres -account.notifications.marketAlert.manageAlerts.label=Alertes pour les ordres -account.notifications.marketAlert.manageAlerts.item=Alerte d''ordre relative à l''ordre {0} avec déclenchement selon le prix {1} et compte de paiement {2}. account.notifications.marketAlert.manageAlerts.header.paymentAccount=Compte de paiement account.notifications.marketAlert.manageAlerts.header.trigger=Prix de déclenchement account.notifications.marketAlert.manageAlerts.header.offerType=Type d'ordre @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=Solde de toutes les transactions non vérifiées (en at dao.lockedForVoteBalance=Utilisé pour le vote dao.lockedInBonds=Verrouillé en bonds dao.availableNonBsqBalance=Solde disponible non-BSQ (BTC) -dao.totalBsqBalance=Total du solde BSQ dao.reputationBalance=Score de mérite (non dépensable) dao.tx.published.success=Votre transaction a été publiée avec succès. @@ -1455,11 +1457,6 @@ dao.param.currentValue=Valeur actuelle: {0} dao.param.currentAndPastValue=Valeur actuelle: {0} (Valeur au moment de l''offre: {1}) dao.param.blocks={0} blocs -dao.results.cycle.duration.label=Durée de {0} -dao.results.cycle.duration.value={0} bloc(s) -dao.results.cycle.value.postFix.isDefaultValue=(valeur par défaut) -dao.results.cycle.value.postFix.hasChanged=(a été modifié par le vote) - dao.results.invalidVotes=Il est fait état de votes invalides au cours de ce cycle de vote. Cela peut arriver si un vote n''a pas été bien distribué sur le réseau Bisq.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=Salage dao.bond.reputation.hash=Hash dao.bond.reputation.lockupButton=Vérrouillage dao.bond.reputation.lockup.headline=Confirmer la transaction de verrouillage. -dao.bond.reputation.lockup.details=Montant verrouillé : {0}\nTemps de déverrouillage: {1} bloc(s) (≈{2})\n\nFrais de minage: {3} ({4} Satoshis/byte)\nTaille de la transaction: {5} Kb\n\nÊtes-vous certain de vouloir procéder? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=Confirmer le déblocage de la transaction -dao.bond.reputation.unlock.details=Déverrouiller le montant: {0}\nTemps de déverrouillage: {1} bloc(s) (≈{2})\n\nFrais de minage : {3} ({4} Satoshis/byte)\nTaille de la transaction: {5} Kb\n\nÊtes-vous certain de vouloir procéder ? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=Tous les bonds @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=Signer dao.proofOfBurn.message=Message dao.proofOfBurn.sig=Signature dao.proofOfBurn.verify=Vérifier -dao.proofOfBurn.verify.header=Vérifier le message avec la clé provenant de la preuve de la transaction de burn dao.proofOfBurn.verificationResult.ok=Vérification réussie dao.proofOfBurn.verificationResult.failed=Échec de la vérification @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Nom d'utilisateur GitHub exact dao.proposal.display.link=Lien vers les informations détaillées dao.proposal.display.link.prompt=Lien vers la proposition dao.proposal.display.requestedBsq=Montant démandé en BSQ -dao.proposal.display.bsqAddress=Adresse BSQ dao.proposal.display.txId=ID de transaction de la proposition dao.proposal.display.proposalFee=Frais de la demande dao.proposal.display.myVote=Mon vote dao.proposal.display.voteResult=Synthèse des résultats du vote dao.proposal.display.bondedRoleComboBox.label=Type de rôle Bonded dao.proposal.display.requiredBondForRole.label=Bond requis pour le rôle -dao.proposal.display.tickerSymbol.label=Symbole du ticker dao.proposal.display.option=Option dao.proposal.table.header.proposalType=Type de demande dao.proposal.table.header.link=Lien dao.proposal.table.header.myVote=Mon vote +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=Enlever dao.proposal.table.icon.tooltip.removeProposal=Retirer ma demande dao.proposal.table.icon.tooltip.changeVote=Vote actuel: ''{0}'''. Modifier le vote pour: ''{1}'' @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=Mon solde de portefeuille dao.wallet.receive.fundYourWallet=Votre adresse de réception BSQ dao.wallet.receive.bsqAddress=Adresse du portefeuille BSQ (nouvelle adresse non utilisée) -dao.wallet.receive.dao.headline=La DAO de Bisq -dao.wallet.receive.daoInfo=Tout comme la plateforme d'échange Bisq est décentralisée et résistante à la censure, son modèle de gouvernance l'est aussi— et la DAO de Bisq ainsi que le jeton BSQ sont les outils qui rendent cela possible. -dao.wallet.receive.daoInfo.button=En savoir plus sur la DAO de Bisq -dao.wallet.receive.daoTestnetInfo=Le mainnet de la DAO de Bisq n'est pas encore lancé mais vous pouvez vous en apprendre davantage la DAO de Bisq en l'exécutant sur le testnet. -dao.wallet.receive.daoTestnetInfo.button=Comment faire fonctionner la DAO de Bisq sur notre testnet -dao.wallet.receive.daoContributorInfo=Si vous avez contribué à Bisq, veuillez utiliser l'adresse BSQ ci-dessous et faire une requête de contribution pour participer à la distribution genesis de BSQ. -dao.wallet.receive.daoContributorInfo.button=Comment faire partie de la distribution genesis de BSQ - dao.wallet.send.sendFunds=Envoyer des fonds dao.wallet.send.sendBtcFunds=Envoyer des fonds non-BSQ (BTC) dao.wallet.send.amount=Montant en BSQ dao.wallet.send.btcAmount=Montant en BTC (fonds non-BSQ) dao.wallet.send.setAmount=Définir le montant à retirer (le montant minimum est {0}) -dao.wallet.send.setBtcAmount=Définir le montant en BTC à retirer (le montant min. est de {0}) dao.wallet.send.receiverAddress=Adresse BSQ du destinataire dao.wallet.send.receiverBtcAddress=Adresse BTC du destinataire dao.wallet.send.setDestinationAddress=Remplissez votre adresse de destination dao.wallet.send.send=Envoyer des fonds en BSQ dao.wallet.send.sendBtc=Envoyer des fonds en BTC dao.wallet.send.sendFunds.headline=Confirmer la demande de retrait -dao.wallet.send.sendFunds.details=Envoi: {0}\nA l''adresse de réception: {1}.\nLes frais de transaction requis sont: {2} ({3} satoshis/byte)\nTaille de la transaction: {4} Kb\n\nLe destinataire recevra: {5}\n\nÊtes-vous certain de vouloir retirer ce montant ? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=Dernier bloc vérifié: {0} dao.wallet.chainHeightSyncing=En attente des blocs.... {0} Blocs vérifiés sur {1}. dao.wallet.tx.type=Type @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=Vous ne disposez pas des fonds en BTC s dao.proposal.create.missingIssuanceFunds=Vous ne disposez pas de fonds BTC suffisants pour créer cette demande de transaction. Toutes les transactions BSQ exigent des frais pour le mineur en BTC, et la création d''une transaction exige également des frais en BTC d''un montant de ({0} Satoshis/BSQ).\nManquant: {1} dao.feeTx.confirm=Confirmer {0} transaction -dao.feeTx.confirm.details={0}frais: {1}\nFrais de minage: {2} ({3} Satoshis/byte)\nTaille de la transaction: {4} Kb\n\nÊtes-vous certain de vouloir publier la transaction {5}? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0}frais: {1}\nBTC nécessaire pour l''émission des BSQ: {2} ({3} Satoshis/BSQ)\nFrais de minage: {4} ({5} Satoshis/byte)\nTaille de la transaction: {6} Kb\n\nSi votre demande est approuvée, vous recevrez le montant que vous avez demandé, net des frais de la demande d''un montant de 2 BSQ.\n\nÊtes-vous sûr de vouloir publier la transaction {7}? +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=La DAO de BISQ dao.news.bisqDAO.description=Tout comme la plateforme d'échange Bisq est décentralisée et résistante à la censure, son modèle de gouvernance l'est aussi - ainsi que les jetons de la DAO de Bisq et BSQ sont les outils qui rendent cela possible. @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=Nombre de votes cachés dao.factsAndFigures.menuItem.supply=Quantité existante de bsq dao.factsAndFigures.menuItem.transactions=Transactions BSQ -dao.factsAndFigures.dashboard.marketPrice=Données du marché -dao.factsAndFigures.dashboard.price=Prix du dernier Trade BSQ/BTC (en Bisq) dao.factsAndFigures.dashboard.avgPrice90=Moyenne sur 90 jours du prix d'échange BSQ/BTC dao.factsAndFigures.dashboard.avgPrice30=Moyenne sur 30 jours du prix d'échange BSQ/BTC dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=Télécharger plus tard displayUpdateDownloadWindow.button.ignoreDownload=Ignorer cette version displayUpdateDownloadWindow.headline=Une nouvelle mise à jour Bisq est disponible ! displayUpdateDownloadWindow.download.failed.headline=Echec du téléchargement -displayUpdateDownloadWindow.download.failed=Le téléchargement a échoué.\nVeuillez télécharger et vérifier manuellement à l'adresse https://bisq.network/downloads -displayUpdateDownloadWindow.installer.failed=Impossible de déterminer le bon installer. Veuillez télécharger et vérifier manuellement à l'adresse https://bisq.network/downloads -displayUpdateDownloadWindow.verify.failed=Échec de la vérification.\nVeuillez télécharger et vérifier manuellement à l'adresse https://bisq.network/downloads +displayUpdateDownloadWindow.download.failed=Download failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verification failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=La nouvelle version a été téléchargée avec succès et la signature vérifiée.\n\nVeuillez ouvrir le répertoire de téléchargement, fermer l'application et installer la nouvelle version. displayUpdateDownloadWindow.download.openDir=Ouvrir le répertoire de téléchargement @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=Versement du montant de l'opération disputeSummaryWindow.payout.getsTradeAmount=BTC {0} obtient le montant du versement de la transaction disputeSummaryWindow.payout.getsAll=BTC {0} à reçu l''intégralité disputeSummaryWindow.payout.custom=Versement personnalisé -disputeSummaryWindow.payout.adjustAmount=La saisie dépasse le montant disponible de {0}.\nNous ajustons le champ de la saisie avec la valeur la plus grande possible. disputeSummaryWindow.payoutAmount.buyer=Montant du versement de l'acheteur disputeSummaryWindow.payoutAmount.seller=Montant du versement au vendeur disputeSummaryWindow.payoutAmount.invert=Utiliser le perdant comme publicateur @@ -2055,6 +2038,7 @@ disputeSummaryWindow.addSummaryNotes=Ajouter des notes de synthèse disputeSummaryWindow.close.button=Fermer le ticket # Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification @@ -2064,9 +2048,11 @@ disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and a disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions disputeSummaryWindow.close.closePeer=Vous devez également clore le ticket des pairs de trading ! disputeSummaryWindow.close.txDetails.headline=Publier la transaction de remboursement +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=L''acheteur reçoit {0} à l''adresse: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=Le vendeur reçoit {0} à l''adresse: {1}\n -disputeSummaryWindow.close.txDetails=Dépenser: {0}\n{1}{2}Frais de transaction: {3} ({4} satoshis/octet)\nTaille de la transaction: {5} Kb\n\nÊtes-vous sûr de vouloir publier cette transaction ? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? disputeSummaryWindow.close.noPayout.headline=Close without any payout disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? @@ -2101,6 +2087,7 @@ filterWindow.btcNode=Nœuds Bitcoin filtrés (adresses séparées par une virgul filterWindow.preventPublicBtcNetwork=Empêcher l'utilisation du réseau public Bitcoin filterWindow.disableDao=Désactiver la DAO filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Version minimale requise pour la DAO filterWindow.disableTradeBelowVersion=Version min. nécessaire pour pouvoir échanger filterWindow.add=Ajouter le filtre @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=Sélectionner la transaction de dépôt en cas de selectDepositTxWindow.msg=La transaction de dépôt n'a pas été incluse dans l"échange.\nVeuillez sélectionner l'une des transactions multisig existantes de votre portefeuille qui contient la transaction de dépôt utilisée lors de l'échec de l'échange.\n\nVous trouverez la bonne transaction en ouvrant la fenêtre des détails de la transaction (cliquez sur l'ID de la transaction dans la liste) et en retraçant les frais de transaction de sortie de la prochaine transaction où vous serez en mesure de voir la transaction de dépôt multisig (l'adresse commence par un 3). Cet ID de transaction doit être visible dans la liste ici. Une fois que vous aurez trouvé la bonne transaction, sélectionnez cette transaction la et continuez.\n\nDésolé pour le désagrément mais ce genre d'erreur devrait se produire très rarement et à l'avenir nous trouverons de meilleurs moyens pour le résoudre. selectDepositTxWindow.select=Sélectionner la transaction de dépôt -selectBaseCurrencyWindow.headline=Sélection du marché -selectBaseCurrencyWindow.msg=Le maker par défaut sélectionné est {0}.\n\nSi vous souhaitez changer de devise de base, veuillez en sélectionner une dans la liste déroulante.\nVous pouvez également modifier ultérieurement la devise de base sur l''écran \"Réglages/Réseau\". -selectBaseCurrencyWindow.select=Choisir la devise de base - sendAlertMessageWindow.headline=Envoyer une notification globale sendAlertMessageWindow.alertMsg=Message d'alerte sendAlertMessageWindow.enterMsg=Entrer le message @@ -2232,9 +2215,8 @@ error.closedTradeWithNoDepositTx=La transaction de dépôt de l'échange fermé popup.warning.walletNotInitialized=Le portefeuille n'est pas encore initialisé popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. popup.warning.wrongVersion=Vous avez probablement une mauvaise version de Bisq sur cet ordinateur.\nL''architecture de votre ordinateur est: {0}.\nLa binary Bisq que vous avez installé est: {1}.\nVeuillez éteindre et réinstaller une bonne version ({2}). -popup.warning.incompatibleDB=Nous avons détecté des fichiers de base de données incompatibles!\n\nCes fichier(s) de base de données ne sont pas compatibles avec notre code de base actuel:\n{0}\n\nNous avons fait une sauvegarde de fichier(s) corrompus et appliqué les valeurs par défaut sur une nouvelle version de la base de données.\n\nLa sauvegarde se trouve à l''adresse:\n{1}/db/backup_of_corrupted_data.\n\nVeuillez vérifier si vous avez la dernière version de Bisq installée.\nVous pouvez le télécharger à l''adresse:\nhttps://bisq.network/downloads\n\nVeuillez redémarrer l''application. +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 new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application. popup.warning.startupFailed.twoInstances=Bisq est déjà lancé. Vous ne pouvez pas lancer deux instances de bisq. -popup.warning.cryptoTestFailed=Il semble que vous utilisez un binaire auto-compilé et que vous n''avez pas suivi les instructions de compilation dans https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSi ce n''est pas le cas et que vous utilisez le binaire officiel du Bisq, veuillez déposer un rapport de bug sur la page GitHub.\nErreur={0} popup.warning.tradePeriod.halfReached=Votre transaction avec ID {0} a atteint la moitié de la période de trading maximale autorisée et n''est toujours pas terminée.\n\nLa période de trade se termine le {1}.\n\nVeuillez vérifier l''état de votre transaction dans \"Portfolio/échanges en cours\" pour obtenir de plus amples informations. popup.warning.tradePeriod.ended=Votre échange avec l''ID {0} a atteint la période de trading maximale autorisée et n''est pas terminé.\n\nLa période d''échange s''est terminée le {1}.\n\nVeuillez vérifier votre transaction sur \"Portfolio/Echanges en cours\" pour contacter le médiateur. popup.warning.noTradingAccountSetup.headline=Vous n'avez pas configuré de compte de trading @@ -2258,7 +2240,9 @@ popup.warning.noBsqFundsForBtcFeePayment=Votre portefeuille BSQ ne dispose pas d popup.warning.messageTooLong=Votre message dépasse la taille maximale autorisée. Veuillez l'envoyer en plusieurs parties ou le télécharger depuis un service comme https://pastebin.com. popup.warning.lockedUpFunds=Vous avez des fonds bloqués d''une transaction qui a échoué.\nSolde bloqué: {0}\nAdresse de la tx de dépôt: {1}\nID de l''échange: {2}.\n\nVeuillez ouvrir un ticket de support en sélectionnant la transaction dans l'écran des transactions ouvertes et en appuyant sur \"alt + o\" ou \"option + o\". +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=Relais de prix popup.warning.seed=seed popup.warning.mandatoryUpdate.trading=Veuillez faire une mise à jour vers la dernière version de Bisq. Une mise à jour obligatoire a été publiée, laquelle désactive le trading sur les anciennes versions. Veuillez consulter le Forum Bisq pour obtenir plus d'informations. @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=La transaction {0} pour l''échange avec ID {1} a popup.warning.openOfferWithInvalidMakerFeeTx=La transaction de frais de maker pour l''offre avec ID {0} n''est pas valide.\nID de transaction={1}.\nAllez dans \"Paramètres/Info sur le réseau réseau\" et faites une resynchronisation SPV.\nPour obtenir de l''aide, le canal support de l''équipe Bisq est disponible sur Keybase. -popup.warning.trade.depositTxNull=The trade with ID ''{0}'' has no deposit transaction set.\n\nPlease restart the application to see if the problem still exists.\n\nIf it does, please open the trade details popup by clicking on the trade ID. Then click on the transaction IDs for the maker fee transaction and the taker fee transaction to view them on a block explorer. A transaction that cannot be found in a block explorer is probably an invalid transaction.\n\nIf this happens, please report it in the #support channel on the Bisq Keybase (https://keybase.io/team/bisq). If your trade fee transaction is invalid, no funds have left your wallet, you can move the trade to failed trades,and do an SPV resync for your funds to reappear (see how below).\n\nIf your trade fee transaction is valid, the fee amount is lost, and you can make a request for reimbursement on the support repository on GitHub (https://github.com/bisq-network/support/issues).\n\nIn both cases, please do an SPV resync from the ''Settings/Network'' screen to clean your wallet of any lingering issues! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Déplacer vers les échanges en échec -popup.warning.trade.depositTxNull.shutDown=Éteindre Bisq - popup.info.securityDepositInfo=Afin de s'assurer que les deux traders suivent le protocole de trading, les deux traders doivent payer un dépôt de garantie.\n\nCe dépôt est conservé dans votre portefeuille d'échange jusqu'à ce que votre transaction soit terminée avec succès, et ensuite il vous sera restitué.\n\nRemarque : si vous créez un nouvel ordre, Bisq doit être en cours d'exécution pour qu'un autre trader puisse l'accepter. Pour garder vos ordres en ligne, laissez Bisq en marche et assurez-vous que cet ordinateur reste en ligne aussi (pour cela, assurez-vous qu'il ne passe pas en mode veille....le mode veille du moniteur ne pose aucun problème). popup.info.cashDepositInfo=Veuillez vous assurer d''avoir une succursale de l''établissement bancaire dans votre région afin de pouvoir effectuer le dépôt en espèces.\nL''identifiant bancaire (BIC/SWIFT) de la banque du vendeur est: {0}. popup.info.cashDepositInfo.confirm=Je confirme que je peux effectuer le dépôt. popup.info.shutDownWithOpenOffers=Bisq est en cours de fermeture, mais des ordres sont en attente.\n\nCes ordres ne seront pas disponibles sur le réseau P2P si Bisq est éteint, mais ils seront republiés sur le réseau P2P la prochaine fois que vous lancerez Bisq.\n\nPour garder vos ordres en ligne, laissez Bisq en marche et assurez-vous que cet ordinateur reste aussi en ligne (pour cela, assurez-vous qu'il ne passe pas en mode veille...la veille du moniteur ne pose aucun problème). -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=Notification privée importante! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=Attention requise la transaction avec l''ID {0} popup.info.multiplePaymentAccounts.headline=Comptes de paiement multiples disponibles popup.info.multiplePaymentAccounts.msg=Vous disposez de plusieurs comptes de paiement disponibles pour cet ordre. Assurez-vous de choisir le bon. -popup.news.launch.headline=Deux mises à jour majeures -popup.news.launch.accountSigning.headline=SIGNATURE DU COMPTE -popup.news.launch.accountSigning.description=Lever les limites de trading de 0,01 BTC par fiat en achetant des BTC auprès d'un pair signé. -popup.news.launch.ntp.headline=NOUVEAU PROTOCOLE D’ÉCHANGE -popup.news.launch.ntp.description=Le nouveau système de règlement des litiges à deux niveaux rend Bisq plus sûr, plus évolutif et plus résistant à la censure. - popup.accountSigning.selectAccounts.headline=Sélectionner les comptes de paiement popup.accountSigning.selectAccounts.description=En fonction du mode de paiement et du moment, tous les comptes de paiement qui sont liés à un litige où un paiement à l'acheteur a eu lieu seront sélectionnés afin que vous les signiez. popup.accountSigning.selectAccounts.signAll=Signer tous les modes de paiement @@ -2324,7 +2297,7 @@ popup.accountSigning.signAccounts.ECKey.error=Mauvaise ECKey de l'arbitre popup.accountSigning.success.headline=Félicitations popup.accountSigning.success.description=Tous les {0} comptes de paiement ont été signés avec succès ! -popup.accountSigning.generalInformation=Vous trouverez l'état de signature de tous vos comptes dans la section \"compte\".\n\nPour obtenir plus d'informations, veuillez consulter le site https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=Un de vos comptes de paiement a été vérifié et signé par un arbitre. Echanger avec ce compte signera automatiquement le compte de votre pair de trading après un échange réussi.\n\n{0} popup.accountSigning.signedByPeer=Un de vos comptes de paiement a été vérifié et signé par un pair de trading. Votre limite de trading initiale sera levée et vous pourrez signer d''autres comptes dans les {0} jours à venir.\n\n{1} popup.accountSigning.peerLimitLifted=La limite initiale pour l''un de vos comptes a été levée.\n\n{0} @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=Signing completed popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: Une plateforme d''échange décentralisée sur le rése # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=Les comptes de trading sont sauvegardés vers l''arborescence:\n{0} guiUtil.accountExport.noAccountSetup=Vous n'avez pas de comptes de trading configurés pour exportation. @@ -2463,6 +2435,7 @@ navigation.portfolio.pending=\"Portfolio/Échanges en cours\" navigation.portfolio.closedTrades=\"Portfolio/Historique\" navigation.funds.depositFunds=\"Fonds/Recevoir des fonds\" navigation.settings.preferences=\"Paramètres/Préférences\" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"Fonds/Transactions\" navigation.support=\"Assistance\" navigation.dao.wallet.receive=\"DAO/BSQ Portefeuille/Recevoir\" @@ -2525,11 +2498,11 @@ password.deriveKey=Récupérer la clé à partir du mot de passe password.walletDecrypted=Portefeuille décrypté avec succès et protection par mot de passe désactivée. password.wrongPw=Vous avez entré un mot de passe incorrect.\n\nVeuillez réessayer d'entrer votre mot de passe, en vérifiant soigneusement qu'il ne contient pas de fautes de frappe ou d'orthographe. password.walletEncrypted=Portefeuille crypté avec succès et protection par mot de passe activée. -password.walletEncryptionFailed=Le mot de passe du portefeuille n'a pas pu être défini. Vous avez peut-être importé des mots de la seed qui ne correspondent pas à la base de données du portefeuille. Veuillez contacter les développeurs sur le Forum Bisq. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=Les 2 mots de passe entrés ne correspondent pas. password.forgotPassword=Mot de passe oublié? -password.backupReminder=Veuillez noter que lors de la définition d'un mot de passe de portefeuille, toutes les sauvegardes créées automatiquement à partir du portefeuille non crypté seront supprimées.\n\nIl est fortement recommandé de faire une sauvegarde du répertoire de l'application et d'écrire les mots de votre seed avant de définir un mot de passe! -password.backupWasDone=J'ai déjà fait une sauvegarde +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=Mots qui composent la seed du portefeuille seed.enterSeedWords=Entrer les mots qui composent la seed du portefeuille @@ -2537,7 +2510,7 @@ seed.date=Date du portefeuille seed.restore.title=Restaurer les portefeuilles à partir des mots de la seed seed.restore=Restaurer les portefeuilles seed.creationDate=Date de création -seed.warn.walletNotEmpty.msg=Votre portefeuille Bitcoin n'est pas vide.\n\nVous devez vider ce portefeuille avant d'essayer de restaurer un portefeuille plus ancien, car le fait de mélanger les portefeuilles ensemble peut entraîner des sauvegardes invalides.\n\nVeuillez finaliser vos transactions, fermer tout vos ordres en cours et aller à le menu Fonds pour retirer vos Bitcoins.\nSi vous ne pouvez pas accéder à vos Bitcoins, vous pouvez utiliser l'outil d'urgence afin de vider votre portefeuille.\nPour ouvrir cet outil d'urgence, appuyez sur \"alt + e\" ou \"option + e\" . +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=Je veux quand même restaurer. seed.warn.walletNotEmpty.emptyWallet=Je viderai mes portefeuilles en premier. seed.warn.notEncryptedAnymore=Vos portefeuilles sont cryptés.\n\nAprès la restauration, les portefeuilles ne seront plus cryptés et vous devrez définir un nouveau mot de passe.\n\nSouhaitez-vous continuer ? @@ -2578,12 +2551,11 @@ payment.altcoin.address=Adresse Altcoin payment.altcoin.tradeInstantCheckbox=Échanger instantanément (en 1 heure) avec cet Altcoin payment.altcoin.tradeInstant.popup=Pour négocier immédiatement, il est nécessaire que les deux pairs de trading soient en ligne afin de pouvoir effectuer l'échange en moins d' 1 heure.\n\nSi vous avez des ordres en cours et que vous n'êtes pas disponible, veuillez désactiver ces ordres sur la page " Portfolio ". payment.altcoin=Altcoin -payment.select.altcoin=Sélectionner ou chercher un altcoin +payment.select.altcoin=Select or search Altcoin payment.secret=Question secrète payment.answer=Réponse payment.wallet=ID du portefeuille payment.uphold.accountId=Nom d'utilisateur ou email ou N° de téléphone -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=Email ou N° de téléphone payment.venmo.venmoUserName=Nom d'utilisateur Venmo payment.popmoney.accountId=Email ou N° de téléphone @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=N° de carte d'identité/d'identification du contr payment.supportedCurrencies=Devises acceptées payment.limitations=Restrictions payment.salt=Salage de la vérification de l'âge des comptes -payment.error.noHexSalt=Le salage doit être au format HEX .\nIl n'est recommandé de modifier le champ du salage que si vous souhaitez transférer le salage d'un ancien compte pour conserver l'ancienneté dans votre compte. L'ancienneté du compte est vérifié en utiliser le salage du compte et des données d'identification du compte (par ex. IBAN). +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=Accepter les transactions en provenance de ces pays de la zone Euro payment.accept.nonEuro=Accepter les transactions en provenance de ces pays hors zone Euro payment.accepted.countries=Pays acceptés @@ -2605,7 +2577,7 @@ shared.accountSigningState=État de la signature du compte payment.altcoin.address.dyn={0} adresse payment.altcoin.receiver.address=Adresse altcoin du destinataire payment.accountNr=Numéro de compte -payment.emailOrMobile=Email ou numéro de portable +payment.emailOrMobile=Email ou N° de portable payment.useCustomAccountName=Utiliser un nom de compte personnalisé payment.maxPeriod=Durée d'échange max. autorisée payment.maxPeriodAndLimit=Durée maximale de l''échange : {0} / Achat maximum : {1} / Vente maximum : {2} / Âge du compte : {3} @@ -2625,31 +2597,33 @@ payment.accountType=Type de compte payment.checking=Vérification payment.savings=Épargne payment.personalId=Pièce d'identité -payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle:\nhttps://www.zellepay.com/get-started\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. +payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Bisq to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved. -payment.moneyGram.info=Lors de l'utilisation de MoneyGram, l'acheteur de BTC doit envoyer le numéro d'autorisation et une photo du reçu par mail au vendeur de BTC. Le reçu doit clairement mentionner le nom complet du vendeur, le pays, la région et le montant. L'acheteur verra ensuite s'afficher le mail du vendeur pendant le processus de la transaction. -payment.westernUnion.info=Lors de l'utilisation de Western Union, l'acheteur BTC doit envoyer le MTCN (numéro de suivi) et une photo du reçu par e-mail au vendeur de BTC. Le reçu doit indiquer clairement le nom complet du vendeur, la ville, le pays et le montant. L'acheteur verra ensuite s'afficher le mail du vendeur pendant le processus de la transaction. +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=Lors de l'utilisation de HalCash, l'acheteur de BTC doit envoyer au vendeur de BTC le code HalCash par SMS depuis son téléphone portable.\n\nVeuillez vous assurer de ne pas dépasser le montant maximum que votre banque vous permet d'envoyer avec HalCash. Le montant minimum par retrait est de 10 EUR et le montant maximum est de 600 EUR. Pour les retraits récurrents, il est de 3000 EUR par destinataire par jour et 6000 EUR par destinataire par mois. Veuillez vérifier ces limites auprès de votre banque pour vous assurer qu'elles utilisent les mêmes limites que celles indiquées ici.\n\nLe montant du retrait doit être un multiple de 10 EUR car vous ne pouvez pas retirer d'autres montants à un distributeur automatique. Pendant les phases de create-offer et take-offer l'affichage de l'interface utilisateur ajustera le montant en BTC afin que le montant en euros soit correct. Vous ne pouvez pas utiliser le prix basé sur le marché, car le montant en euros varierait en fonction de l'évolution des prix.\n\nEn cas de litige, l'acheteur de BTC doit fournir la preuve qu'il a envoyé la somme en EUR. -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\nTo mitigate this risk, Bisq sets per-trade limits based on two factors:\n\n1. The estimated level of chargeback risk for the payment method used\n2. The age of your account for that payment method\n\nThe account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\n● During the 1st month, your per-trade limit will be {0}\n● During the 2nd month, your per-trade limit will be {1}\n● After the 2nd month, your per-trade limit will be {2}\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. -payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase with account age.\n\nSee more:\nhttps://bisq.wiki/Account_limits\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=Veuillez confirmer que votre banque vous permet d'envoyer des dépôts en espèces sur le compte d'autres personnes. Par exemple, Bank of America et Wells Fargo n'autorisent plus de tels dépôts. payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=Update Revolut account payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. payment.f2f.contact=information de contact -payment.f2f.contact.prompt=Comment souhaitez-vous être contacté par votre pair de trading? (adresse mail, numéro de téléphone,...) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=Ville pour la rencontre en face à face payment.f2f.city.prompt=La ville sera affichée en même temps que l'ordre payment.f2f.optionalExtra=Informations complémentaires facultatives payment.f2f.extra=Informations complémentaires payment.f2f.extra.prompt=Le maker peut définir des " conditions générales " ou ajouter des informations publiques de contact. Elles seront affichées avec l'ordre. -payment.f2f.info=Les transactions en 'face à face' ont des règles différentes et comportent des risques différents de ceux des transactions en ligne.\n\nLes principales différences sont les suivantes:\n● Les pairs de trading doivent échanger des informations sur le lieu et l'heure de la réunion en utilisant les coordonnées qu'ils ont fournies.\n● Les pairs de trading doivent apporter leur ordinateur portable et faire la confirmation du 'paiement envoyé' et du 'paiement reçu' sur le lieu de la réunion.\n● Si un maker a des 'modalités' spéciales, il doit les indiquer dans le champ 'Informations supplémentaires' du compte.\n● En acceptant une offre, le taker accepte les 'modalités' du maker.\n● En cas de litige, le médiateur ou l'arbitre ne peut pas beaucoup aider car il est généralement difficile d'obtenir des preuves de ce qui s'est passé lors de la réunion. Dans ce cas, les fonds des BTC peuvent être bloqués indéfiniment ou jusqu'à ce que les pairs parviennent à un accord.\n\nPour vous assurer de bien comprendre les spécificités des transactions 'face à face', veuillez lire les instructions et les recommandations à l'adresse https://docs.bisq.network/trading-rules.html#f2f-trading +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=Ouvrir la page web payment.f2f.offerbook.tooltip.countryAndCity=Pays et ville: {0} / {1} payment.f2f.offerbook.tooltip.extra=Informations complémentaires: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=Banque payment.japan.branch=Filiale payment.japan.account=Compte payment.japan.recipient=Nom +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=Face à face (en personne) JAPAN_BANK=Banque japonaise Furikomi +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=Banques nationales @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Furikomi japonais +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=La saisie d'une valeur égale à 0 n'est pas autorisé. validation.negative=Une valeur négative n'est pas autorisée. validation.fiat.toSmall=La saisie d'une valeur plus petite que le montant minimal possible n'est pas autorisée. validation.fiat.toLarge=La saisie d'une valeur supérieure au montant maximal possible n'est pas autorisée. -validation.btc.fraction=La saisie doit représenter une valeur en Bitcoin exprimée en la plus petite unité fractionnelle (satoshi). +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=La saisie d''une valeur supérieure à {0} n''est pas autorisée. validation.btc.toSmall=La saisie d''une valeur inférieure à {0} n''est pas autorisée. -validation.securityDeposit.toSmall=La saisie d''une valeur inférieure à {0} n''est pas autorisée. -validation.passwordTooShort=Le mot de passe que vous avez saisi est trop court. Il doit comporter au moins 8 caractères. +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=Le mot de passe que vous avez saisi est trop long. Il ne doit pas contenir plus de 50 caractères. validation.sortCodeNumber={0} doit être composer de {1} chiffres. validation.sortCodeChars={0} doit être composer de {1} caractères. @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} doit être composé de {1} nombres. #new validation.invalidInput=La valeur saisie est invalide: {0} validation.accountNrFormat=Le numéro du compte doit être au format: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=La validation de l''adresse a échoué car elle ne concorde pas avec la structure d''une adresse {0}. -validation.altcoin.ltz.zAddressesNotSupported=L'adresse LTZ doit commencer par L. Les adresses commençant par z ne sont pas prise en charge. -validation.altcoin.zAddressesNotSupported=L'adresse ZEC doit commencer par un t. Les adresses commençant par un z ne sont pas prise en charge. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=Address is not a valid {0} address! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Native segwit addresses (those starting with 'lq') are not supported. -validation.bic.invalidLength=La longueur de la valeur saisie n'est ni 8 ni 11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=Le code de la banque et le code du pays doivent être constitués de lettres validation.bic.invalidLocationCode=Le BIC contient un code de localisation invalide validation.bic.invalidBranchCode=Le BIC contient un branch code invalide. validation.bic.sepaRevolutBic=Les comptes Sepa de Revolut ne sont pas pris en charge. -validation.btc.invalidFormat=Le format de l'adresse Bitcoin est invalide. -validation.bsq.invalidFormat=Le format de l'adresse BSQ est invalide. +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=Adresse invalide validation.iban.invalidCountryCode=Code du pays invalide validation.iban.checkSumNotNumeric=La checksum doit être numérique validation.iban.nonNumericChars=Caractère non-alphanumérique détecté validation.iban.checkSumInvalid=La checksum de l'IBAN n'est pas valide -validation.iban.invalidLength=Le nombre doit être d'une longueur de 15 à 34 caractères. +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=Indicatif régional non Canadien -validation.interacETransfer.invalidPhone=Format de numéro de téléphone invalide et pas une adresse électronique +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=Ne doit contenir que des lettres, des chiffres, des espaces et/ou les symboles ' _ , . ? - validation.interacETransfer.invalidAnswer=Doit être composé d'un seul mot et contenir que des lettres, des chiffres et/ou le symbole - validation.inputTooLarge=La valeur saisie ne doit pas être supérieure à {0} validation.inputTooSmall=La valeur saisie doit être supérieure à {0} validation.inputToBeAtLeast=La valeur saisie doit être au minimum {0} -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=La longueur doit être comprise entre {0} et {1} validation.pattern=La valeur saisie doit être au format: {0} validation.noHexString=La valeur saisie n'est pas au format HEX. @@ -2859,7 +2852,7 @@ validation.numberFormatException=Number format exception {0} validation.mustNotBeNegative=La saisie ne doit pas être négative validation.phone.missingCountryCode=Un code pays à deux lettres est nécessaire pour valider le numéro de téléphone validation.phone.invalidCharacters=Le numéro de téléphone {0} contient des caractères invalides. -validation.phone.insufficientDigits=Pas assez de chiffres dans {0} pour un numéro de téléphone valide -validation.phone.tooManyDigits=Trop de chiffres dans {0} pour un numéro de téléphone valide -validation.phone.invalidDialingCode=L''indicatif de pays du numéro {0} n'est pas valable pour le pays {1}. Le bon indicatif est est {2}. +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=Must be comma separated list of valid addresses diff --git a/core/src/main/resources/i18n/displayStrings_it.properties b/core/src/main/resources/i18n/displayStrings_it.properties new file mode 100644 index 0000000000..d829bd4cf5 --- /dev/null +++ b/core/src/main/resources/i18n/displayStrings_it.properties @@ -0,0 +1,2858 @@ +# Keep display strings organized by domain +# Naming convention: We use camelCase and dot separated name spaces. +# Use as many sub spaces as required to make the structure clear, but as little as possible. +# E.g.: [main-view].[component].[description] +# In some cases we use enum values or constants to map to display strings + +# A annoying issue with property files is that we need to use 2 single quotes in display string +# containing variables (e.g. {0}), otherwise the variable will not be resolved. +# In display string which do not use a variable a single quote is ok. +# E.g. Don''t .... {1} + +# We use sometimes dynamic parts which are put together in the code and therefore sometimes use line breaks or spaces +# at the end of the string. Please never remove any line breaks or spaces. They are there with a purpose! +# To make longer strings with better readable you can make a line break with \ which does not result in a line break +# in the display but only in the editor. + +# Please use in all language files the exact same order of the entries, that way a comparison is easier. + +# Please try to keep the length of the translated string similar to English. If it is longer it might break layout or +# get truncated. We will need some adjustments in the UI code to support that but we want to keep effort at the minimum. + + +#################################################################### +# Shared +#################################################################### + +shared.readMore=Leggi di più +shared.openHelp=Apri la Guida +shared.warning=Attenzione +shared.close=Chiudi +shared.cancel=Annulla +shared.ok=OK +shared.yes=Si +shared.no=No +shared.iUnderstand=Capisco +shared.na=N/A +shared.shutDown=Spegni +shared.reportBug=Report bug on GitHub +shared.buyBitcoin=Acquista bitcoin +shared.sellBitcoin=Vendi bitcoin +shared.buyCurrency=Acquista {0} +shared.sellCurrency=Vendi {0} +shared.buyingBTCWith=acquistando BTC con {0} +shared.sellingBTCFor=vendendo BTC per {0} +shared.buyingCurrency=comprando {0} (vendendo BTC) +shared.sellingCurrency=vendendo {0} (comprando BTC) +shared.buy=compra +shared.sell=vendi +shared.buying=comprando +shared.selling=vendendo +shared.P2P=P2P +shared.oneOffer=offerta +shared.multipleOffers=offerte +shared.Offer=Offerta +shared.offerVolumeCode={0} Offer Volume +shared.openOffers=offerte aperte +shared.trade=scambio +shared.trades=scambi +shared.openTrades=scambi aperti +shared.dateTime=Data/Ora +shared.price=Prezzo +shared.priceWithCur=Prezzo in {0} +shared.priceInCurForCur=Prezzo in {0} per 1 {1} +shared.fixedPriceInCurForCur=Prezzo fissato in {0} per 1 {1} +shared.amount=Importo +shared.txFee=Commissioni di Transazione +shared.tradeFee=Trade Fee +shared.buyerSecurityDeposit=Deposito Acquirente +shared.sellerSecurityDeposit=Deposito Venditore +shared.amountWithCur=Importo in {0} +shared.volumeWithCur=Volume in {0} +shared.currency=Valuta +shared.market=Mercato +shared.paymentMethod=Metodo di pagamento +shared.tradeCurrency=Valuta di scambio +shared.offerType=Tipo di offerta +shared.details=Dettagli +shared.address=Indirizzo +shared.balanceWithCur=Saldo in {0} +shared.txId=ID Transazione +shared.confirmations=Conferme +shared.revert=Storno Tx +shared.select=Seleziona +shared.usage=Utilizzo +shared.state=Stato +shared.tradeId=ID Scambio +shared.offerId=ID Offerta +shared.bankName=Nome Banca +shared.acceptedBanks=Banche accettate +shared.amountMinMax=Importo (min - max) +shared.amountHelp=Se un'offerta ha un valore massimo e minimo definito, puoi scambiare qualsiasi valore compreso in questo range +shared.remove=Rimuovi +shared.goTo=Vai a {0} +shared.BTCMinMax=BTC (min - max) +shared.removeOffer=Rimuovi offerta +shared.dontRemoveOffer=Non rimuovere offerta +shared.editOffer=Modifica offerta +shared.openLargeQRWindow=Open large QR code window +shared.tradingAccount=Account di scambio +shared.faq=Visit FAQ page +shared.yesCancel=Si, annulla +shared.nextStep=Passo successivo +shared.selectTradingAccount=Seleziona conto di trading +shared.fundFromSavingsWalletButton=Trasferisci fondi dal portafoglio Bisq +shared.fundFromExternalWalletButton=Apri il tuo portafoglio esterno per aggiungere fondi +shared.openDefaultWalletFailed=Failed to open a Bitcoin wallet application. Are you sure you have one installed? +shared.distanceInPercent=Distanza in % dal prezzo di mercato +shared.belowInPercent=Sotto % del prezzo di mercato +shared.aboveInPercent=Sopra % del prezzo di mercato +shared.enterPercentageValue=Immetti il valore % +shared.OR=OPPURE +shared.notEnoughFunds=You don''t have enough funds in your Bisq wallet for this transaction—{0} is needed but only {1} is available.\n\nPlease add funds from an external wallet, or fund your Bisq wallet at Funds > Receive Funds. +shared.waitingForFunds=In attesa dei fondi... +shared.depositTransactionId=ID transazione di deposito +shared.TheBTCBuyer=L'acquirente di BTC +shared.You=Tu +shared.reasonForPayment=Causale del pagamento +shared.sendingConfirmation=Invio della conferma in corso... +shared.sendingConfirmationAgain=Invia nuovamente la conferma +shared.exportCSV=Export to CSV +shared.exportJSON=Esporta in JSON +shared.noDateAvailable=Nessuna data disponibile +shared.noDetailsAvailable=Dettagli non disponibili +shared.notUsedYet=Non ancora usato +shared.date=Data +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" +shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n +shared.copyToClipboard=Copia negli appunti +shared.language=Lingua +shared.country=Paese +shared.applyAndShutDown=Applica e chiudi +shared.selectPaymentMethod=Seleziona il metodo di pagamento +shared.accountNameAlreadyUsed=That account name is already used for another saved account.\nPlease choose another name. +shared.askConfirmDeleteAccount=Vuoi davvero cancellare l'account selezionato? +shared.cannotDeleteAccount=You cannot delete that account because it is being used in an open offer (or in an open trade). +shared.noAccountsSetupYet=Non ci sono ancora account impostati +shared.manageAccounts=Gestisci gli account +shared.addNewAccount=Aggiungi nuovo account +shared.ExportAccounts=Esporta Account +shared.importAccounts=Importa Account +shared.createNewAccount=Crea nuovo account +shared.saveNewAccount=Salva nuovo account +shared.selectedAccount=Account selezionato +shared.deleteAccount=Elimina account +shared.errorMessageInline=\nMessaggio di errore: {0} +shared.errorMessage=Messaggio di errore +shared.information=Informazione +shared.name=Nome +shared.id=ID +shared.dashboard=Dashboard +shared.accept=Accetta +shared.balance=Saldo +shared.save=Salva +shared.onionAddress=Indirizzo onion +shared.supportTicket=ticket di supporto +shared.dispute=disputa +shared.mediationCase=caso di mediazione +shared.seller=venditore +shared.buyer=acquirente +shared.allEuroCountries=Tutti i paesi Euro +shared.acceptedTakerCountries=Paesi accettati dall'acquirente +shared.tradePrice=Prezzo di scambio +shared.tradeAmount=Importo dello scambio +shared.tradeVolume=Volume di scambio +shared.invalidKey=La chiave inserita non è valida. +shared.enterPrivKey=Inserisci la chiave privata per sbloccare +shared.makerFeeTxId=ID Transazione della tassa del creatore dell'offerta +shared.takerFeeTxId=ID Transazione della commissione del creatore dell'offerta +shared.payoutTxId=ID transazione di pagamento +shared.contractAsJson=Contratto in formato JSON +shared.viewContractAsJson=Visualizza il contratto in formato JSON +shared.contract.title=Contratto per lo scambio con ID: {0} +shared.paymentDetails=Dettagli pagamento BTC {0}: +shared.securityDeposit=Deposito di sicurezza +shared.yourSecurityDeposit=Il tuo deposito di sicurezza +shared.contract=Contratto +shared.messageArrived=Messaggio arrivato. +shared.messageStoredInMailbox=Messaggio salvato nella posta. +shared.messageSendingFailed=Invio del messaggio fallito. Errore: {0} +shared.unlock=Sblocca +shared.toReceive=per ricevere +shared.toSpend=da spendere +shared.btcAmount=Importo BTC +shared.yourLanguage=Le tue lingue +shared.addLanguage=Aggiungi lingua +shared.total=Totale +shared.totalsNeeded=Fondi richiesti +shared.tradeWalletAddress=Indirizzo del portafoglio per gli scambi +shared.tradeWalletBalance=Saldo del portafogli per gli scambi +shared.makerTxFee=Maker: {0} +shared.takerTxFee=Taker: {0} +shared.iConfirm=Confermo +shared.tradingFeeInBsqInfo=equivalente a {0} utilizzato come commissione di negoziazione +shared.openURL=Aperti {0} +shared.fiat=Fiat +shared.crypto=Crypto +shared.all=Tutti +shared.edit=Modifica +shared.advancedOptions=Opzioni avanzate +shared.interval=Intervallo +shared.actions=Azioni +shared.buyerUpperCase=Acquirente +shared.sellerUpperCase=Venditore +shared.new=NUOVO +shared.blindVoteTxId=ID transazione voto cieco +shared.proposal=Proposta +shared.votes=Voti +shared.learnMore=Leggi di più +shared.dismiss=Chiudi +shared.selectedArbitrator=Arbitro selezionato +shared.selectedMediator=Mediatore selezionato +shared.selectedRefundAgent=Arbitro selezionato +shared.mediator=Mediatore +shared.arbitrator=Arbitro +shared.refundAgent=Arbitro +shared.refundAgentForSupportStaff=Agente di rimborso +shared.delayedPayoutTxId=Delayed payout transaction ID +shared.delayedPayoutTxReceiverAddress=Delayed payout transaction sent to +shared.unconfirmedTransactionsLimitReached=Al momento, hai troppe transazioni non confermate. Per favore riprova più tardi. + + +#################################################################### +# UI views +#################################################################### + +#################################################################### +# MainView +#################################################################### + +mainView.menu.market=Mercato +mainView.menu.buyBtc=Compra BTC +mainView.menu.sellBtc=Vendi BTC +mainView.menu.portfolio=Portafoglio +mainView.menu.funds=Fondi +mainView.menu.support=Supporto +mainView.menu.settings=Impostazioni +mainView.menu.account=Account +mainView.menu.dao=DAO + +mainView.marketPriceWithProvider.label=Prezzo di mercato per {0} +mainView.marketPrice.bisqInternalPrice=Prezzo dell'ultimo scambio su Bisq +mainView.marketPrice.tooltip.bisqInternalPrice=Non è disponibile alcun prezzo di mercato da fornitori terzi di feed dei prezzi.\nIl prezzo visualizzato è l'ultimo prezzo di scambio su Bisq per quella valuta. +mainView.marketPrice.tooltip=Il prezzo di mercato é fornito da {0}{1}\nUltimo aggiornamento: {2}\nURL del nodo del provider: {3} +mainView.balance.available=Saldo disponibile +mainView.balance.reserved=Riservati nelle offerte +mainView.balance.locked=Bloccati in scambi +mainView.balance.reserved.short=Riservati +mainView.balance.locked.short=Bloccati + +mainView.footer.usingTor=(usando Tor) +mainView.footer.localhostBitcoinNode=(localhost) +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB +mainView.footer.btcInfo.initializing=Connessione alla rete Bitcoin +mainView.footer.bsqInfo.synchronizing=/ Sincronizzando DAO +mainView.footer.btcInfo.synchronizingWith=Sincronizzazione con +mainView.footer.btcInfo.synchronizedWith=Synced with +mainView.footer.btcInfo.connectingTo=Connessione a +mainView.footer.btcInfo.connectionFailed=Connessione fallita +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} +mainView.footer.daoFullNode=Nodo completo DAO + +mainView.bootstrapState.connectionToTorNetwork=(1/4) Connessione alla rete Tor... +mainView.bootstrapState.torNodeCreated=(2/4) Nodo Tor creato +mainView.bootstrapState.hiddenServicePublished=(3/4) Servizio Nascosto pubbblicato +mainView.bootstrapState.initialDataReceived=(4/4) Dati iniziali ricevuti + +mainView.bootstrapWarning.noSeedNodesAvailable=Nessun nodo seme disponibile +mainView.bootstrapWarning.noNodesAvailable=Nessun nodo seme e peer disponibili +mainView.bootstrapWarning.bootstrappingToP2PFailed=Il bootstrap sulla rete Bisq non è riuscito + +mainView.p2pNetworkWarnMsg.noNodesAvailable=Non ci sono nodi seed o peer persistenti disponibili per la richiesta di dati.\nControlla la tua connessione Internet o prova a riavviare l'applicazione. +mainView.p2pNetworkWarnMsg.connectionToP2PFailed=Connessione alla rete Bisq non riuscita (errore segnalato: {0}).\nControlla la tua connessione Internet o prova a riavviare l'applicazione. + +mainView.walletServiceErrorMsg.timeout=Connessione alla rete Bitcoin fallita a causa di un timeout. +mainView.walletServiceErrorMsg.connectionError=Connessione alla rete Bitcoin fallita a causa di un errore: {0} + +mainView.walletServiceErrorMsg.rejectedTxException=Una transazione è stata rifiutata dalla rete.\n\n{0} + +mainView.networkWarning.allConnectionsLost=Hai perso la connessione a tutti i {0} peer di rete.\nForse hai perso la connessione a Internet o il computer era in modalità standby. +mainView.networkWarning.localhostBitcoinLost=Hai perso la connessione al nodo Bitcoin in localhost.\nRiavvia l'applicazione Bisq per connetterti ad altri nodi Bitcoin o riavvia il nodo Bitcoin in localhost. +mainView.version.update=(Aggiornamento disponibile) + + +#################################################################### +# MarketView +#################################################################### + +market.tabs.offerBook=Registro offerte +market.tabs.spread=Dettagli +market.tabs.trades=Scambi + +# OfferBookChartView +market.offerBook.buyAltcoin=Compra {0} (vendi {1}) +market.offerBook.sellAltcoin=Vendi {0} (compra {1}) +market.offerBook.buyWithFiat=Acquista {0} +market.offerBook.sellWithFiat=Vendi {0} +market.offerBook.sellOffersHeaderLabel=Vendi {0} a +market.offerBook.buyOffersHeaderLabel=Compra {0} da +market.offerBook.buy=Voglio comprare bitcoin +market.offerBook.sell=Voglio vendere bitcoin + +# SpreadView +market.spread.numberOfOffersColumn=Tutte le offerte ({0}) +market.spread.numberOfBuyOffersColumn=Acquista BTC ({0}) +market.spread.numberOfSellOffersColumn=Vendi BTC ({0}) +market.spread.totalAmountColumn=Totale BTC ({0}) +market.spread.spreadColumn=Spread + +# TradesChartsView +market.trades.nrOfTrades=Scambi: {0} +market.trades.tooltip.volumeBar=Volume: {0}\nN. di scambi: {1}\nData: {2} +market.trades.tooltip.candle.open=Aperti: +market.trades.tooltip.candle.close=Chiusi: +market.trades.tooltip.candle.high=Alto: +market.trades.tooltip.candle.low=Basso: +market.trades.tooltip.candle.average=Media: +market.trades.tooltip.candle.median=Mediana: +market.trades.tooltip.candle.date=Data: + +#################################################################### +# OfferView +#################################################################### + +offerbook.createOffer=Crea offerta +offerbook.takeOffer=Accetta offerta +offerbook.takeOfferToBuy=Accetta l'offerta per acquistare {0} +offerbook.takeOfferToSell=Accetta l'offerta per vendere {0} +offerbook.trader=Trader +offerbook.offerersBankId=ID banca del Maker (BIC/SWIFT): {0} +offerbook.offerersBankName=Nome della banca del Maker: {0} +offerbook.offerersBankSeat=Sede del paese bancario del Maker: {0} +offerbook.offerersAcceptedBankSeatsEuro=Sede accettata dei paesi della banca (acquirente): tutti i paesi dell'Euro +offerbook.offerersAcceptedBankSeats=Sede accettata dei paesi bancari (acquirente):\n  {0} +offerbook.availableOffers=Offerte disponibili +offerbook.filterByCurrency=Filtra per valuta +offerbook.filterByPaymentMethod=Filtra per metodo di pagamento +offerbook.timeSinceSigning=Signed since +offerbook.timeSinceSigning.info=Questo account è stato verificato e {0} +offerbook.timeSinceSigning.info.arbitrator=firmato da un arbitro e può firmare account peer +offerbook.timeSinceSigning.info.peer=firmato da un peer, in attesa che i limiti vengano alzati +offerbook.timeSinceSigning.info.peerLimitLifted=firmato da un peer e i limiti sono stati alzati +offerbook.timeSinceSigning.info.signer=firmato da un peer e può firmare account peer (limiti alzati) +offerbook.timeSinceSigning.info.banned= \nl'account è stato bannato +offerbook.timeSinceSigning.daysSinceSigning={0} giorni +offerbook.timeSinceSigning.daysSinceSigning.long={0} dalla firma +offerbook.xmrAutoConf=Is auto-confirm enabled + +offerbook.timeSinceSigning.help=Quando completi correttamente un'operazione con un peer che ha un account di pagamento firmato, il tuo account di pagamento viene firmato.\n{0} giorni dopo, il limite iniziale di {1} viene alzato e il tuo account può firmare account di pagamento di altri peer. +offerbook.timeSinceSigning.notSigned=Non ancora firmato +offerbook.timeSinceSigning.notSigned.noNeed=N/A +shared.notSigned=Questo account non è stato ancora firmato +shared.notSigned.noNeed=Questo tipo di account non utilizza la firma + +offerbook.nrOffers=N. di offerte: {0} +offerbook.volume={0} (min - max) +offerbook.deposit=Deposit BTC (%) +offerbook.deposit.help=Deposit paid by each trader to guarantee the trade. Will be returned when the trade is completed. + +offerbook.createOfferToBuy=Crea una nuova offerta per comprare {0} +offerbook.createOfferToSell=Crea una nuova offerta per vendere {0} +offerbook.createOfferToBuy.withFiat=Crea una nuova offerta per acquistare {0} con {1} +offerbook.createOfferToSell.forFiat=Crea una nuova offerta per vendere {0} per {1} +offerbook.createOfferToBuy.withCrypto=Crea una nuova offerta per vendere {0} (acquista {1}) +offerbook.createOfferToSell.forCrypto=Crea una nuova offerta per acquistare {0} (vendi {1}) + +offerbook.takeOfferButton.tooltip=Accetta offera per {0} +offerbook.yesCreateOffer=Sì, crea offerta +offerbook.setupNewAccount=Imposta un nuovo account di scambio +offerbook.removeOffer.success=L'offerta è stata rimossa con successo. +offerbook.removeOffer.failed=Rimozione offerta fallita:\n{0} +offerbook.deactivateOffer.failed=Disattivazione dell'offerta fallita:\n{0} +offerbook.activateOffer.failed=Pubblicazione dell'offerta fallita:\n{0} +offerbook.withdrawFundsHint=Puoi ritirare i fondi versati dalla schermata {0}. + +offerbook.warning.noTradingAccountForCurrency.headline=No payment account for selected currency +offerbook.warning.noTradingAccountForCurrency.msg=You don't have a payment account set up for the selected currency.\n\nWould you like to create an offer for another currency instead? +offerbook.warning.noMatchingAccount.headline=No matching payment account. +offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you haven't set up yet. \n\nWould you like to set up a new payment account now? + +offerbook.warning.counterpartyTradeRestrictions=Questa offerta non può essere accettata a causa di restrizioni di scambio della controparte + +offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. + +popup.warning.tradeLimitDueAccountAgeRestriction.seller=L'importo di scambio consentito è limitato a {0} a causa delle restrizioni di sicurezza basate sui seguenti criteri:\n- L'account dell'acquirente non è stato firmato da un arbitro o da un pari\n- Il tempo trascorso dalla firma dell'account dell'acquirente non è di almeno 30 giorni\n- Il metodo di pagamento per questa offerta è considerato rischioso per le richieste di storno bancarie\n\n{1} +popup.warning.tradeLimitDueAccountAgeRestriction.buyer=L'importo di scambio consentito è limitato a {0} a causa delle restrizioni di sicurezza basate sui seguenti criteri:\n- Il tuo account non è stato firmato da un arbitro o da un pari\n- Il tempo trascorso dalla firma del tuo account non è di almeno 30 giorni\n- Il metodo di pagamento per questa offerta è considerato rischioso per le richieste di storno bancarie\n\n{1} + +offerbook.warning.wrongTradeProtocol=Questa offerta richiede una versione di protocollo diversa da quella utilizzata nella versione del tuo software.\n\nVerifica di aver installato l'ultima versione, altrimenti l'utente che ha creato l'offerta ha utilizzato una versione precedente.\n\nGli utenti non possono effettuare scambi con una versione di protocollo di scambio incompatibile. +offerbook.warning.userIgnored=Hai aggiunto l'indirizzo onion dell'utente al tuo elenco di persone da ignorare. +offerbook.warning.offerBlocked=Tale offerta è stata bloccata dagli sviluppatori Bisq.\nProbabilmente c'è un bug non gestito che causa problemi quando si accetta tale offerta. +offerbook.warning.currencyBanned=La valuta utilizzata in quell'offerta è stata bloccata dagli sviluppatori Bisq.\nPer ulteriori informazioni, visitare il forum di Bisq. +offerbook.warning.paymentMethodBanned=Il metodo di pagamento utilizzato in quell'offerta è stato bloccato dagli sviluppatori Bisq.\nPer ulteriori informazioni, visitare il forum di Bisq. +offerbook.warning.nodeBlocked=L'indirizzo onion di quel trader è stato bloccato dagli sviluppatori Bisq.\nProbabilmente c'è un bug non gestito che causa problemi quando si accettano offerte da quel trader. +offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. +offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. + +offerbook.info.sellAtMarketPrice=Venderai al prezzo di mercato (aggiornato ogni minuto). +offerbook.info.buyAtMarketPrice=Acquisterai al prezzo di mercato (aggiornato ogni minuto). +offerbook.info.sellBelowMarketPrice=Otterrai {0} in meno del prezzo di mercato corrente (aggiornato ogni minuto). +offerbook.info.buyAboveMarketPrice=Pagherai {0} in più rispetto all'attuale prezzo di mercato (aggiornato ogni minuto). +offerbook.info.sellAboveMarketPrice=Otterrai {0} in più rispetto all'attuale prezzo di mercato (aggiornato ogni minuto). +offerbook.info.buyBelowMarketPrice=Pagherai {0} in meno del prezzo di mercato corrente (aggiornato ogni minuto). +offerbook.info.buyAtFixedPrice=Comprerai a questo prezzo fisso. +offerbook.info.sellAtFixedPrice=Venderai a questo prezzo fisso. +offerbook.info.noArbitrationInUserLanguage=In caso di disputa, si ricorda che l'arbitrato per questa offerta verrà gestito in {0}. La lingua è attualmente impostata su {1}. +offerbook.info.roundedFiatVolume=L'importo è stato arrotondato per aumentare la privacy del tuo scambio. + +#################################################################### +# Offerbook / Create offer +#################################################################### + +createOffer.amount.prompt=Inserisci quantità in BTC +createOffer.price.prompt=Inserisci prezzo +createOffer.volume.prompt=Inserisci importo in {0} +createOffer.amountPriceBox.amountDescription=Quantità di BTC a {0} +createOffer.amountPriceBox.buy.volumeDescription=Quantità in {0} da spendere +createOffer.amountPriceBox.sell.volumeDescription=Quantità in {0} da ricevere +createOffer.amountPriceBox.minAmountDescription=Quantità minima di BTC +createOffer.securityDeposit.prompt=Deposito di sicurezza +createOffer.fundsBox.title=Finanzia la tua offerta +createOffer.fundsBox.offerFee=Commissione di scambio +createOffer.fundsBox.networkFee=Commissione di mining +createOffer.fundsBox.placeOfferSpinnerInfo=Pubblicazione dell'offerta in corso ... +createOffer.fundsBox.paymentLabel=Scambio Bisq con ID {0} +createOffer.fundsBox.fundsStructure=({0} deposito cauzionale, {1} commissione di scambio, {2} commissione di mining) +createOffer.fundsBox.fundsStructure.BSQ=({0} deposito cauzionale, {1} commissione di mining) + {2} commissione di scambio +createOffer.success.headline=La tua offerta è stata pubblicata +createOffer.success.info=Puoi gestire le tue offerte aperte su \"Portafoglio/Le mie offerte aperte\". +createOffer.info.sellAtMarketPrice=Venderai sempre al prezzo di mercato poiché il prezzo della tua offerta verrà continuamente aggiornato. +createOffer.info.buyAtMarketPrice=Acquisterai sempre al prezzo di mercato poiché il prezzo della tua offerta verrà costantemente aggiornato. +createOffer.info.sellAboveMarketPrice=Otterrai sempre il {0}% in più rispetto al prezzo di mercato corrente poiché il prezzo della tua offerta verrà costantemente aggiornato. +createOffer.info.buyBelowMarketPrice=Pagherai sempre il {0}% in meno rispetto al prezzo di mercato corrente poiché il prezzo della tua offerta verrà costantemente aggiornato. +createOffer.warning.sellBelowMarketPrice=Otterrai sempre il {0}% in meno rispetto al prezzo di mercato corrente poiché il prezzo della tua offerta verrà costantemente aggiornato. +createOffer.warning.buyAboveMarketPrice=Pagherai sempre il {0}% in più rispetto al prezzo di mercato corrente poiché il prezzo della tua offerta verrà costantemente aggiornato. +createOffer.tradeFee.descriptionBTCOnly=Commissione di scambio +createOffer.tradeFee.descriptionBSQEnabled=Seleziona la valuta della commissione di scambio +createOffer.tradeFee.fiatAndPercent=≈ {0} / {1} dell'importo di scambio + +# new entries +createOffer.placeOfferButton=Revisione: piazza l'offerta a {0} bitcoin +createOffer.alreadyFunded=Hai già finanziato quell'offerta.\nI tuoi fondi sono stati spostati nel tuo portafoglio Bisq locale e sono disponibili per il prelievo nella schermata \"Fondi/Invia fondi\". +createOffer.createOfferFundWalletInfo.headline=Finanzia la tua offerta +# suppress inspection "TrailingSpacesInProperty" +createOffer.createOfferFundWalletInfo.tradeAmount=- Importo di scambio: {0} \n +createOffer.createOfferFundWalletInfo.msg=Devi depositare {0} a questa offerta.\n\nTali fondi sono riservati nel tuo portafoglio locale e verranno bloccati nell'indirizzo di deposito multisig una volta che qualcuno accetta la tua offerta.\n\nL'importo è la somma di:\n{1} - Il tuo deposito cauzionale: {2}\n- Commissione di scambio: {3}\n- Commissione di mining: {4}\n\nPuoi scegliere tra due opzioni quando finanzi il tuo scambio:\n- Usa il tuo portafoglio Bisq (comodo, ma le transazioni possono essere collegabili) OPPURE\n- Effettua il trasferimento da un portafoglio esterno (potenzialmente più privato)\n\nVedrai tutte le opzioni di finanziamento e i dettagli dopo aver chiuso questo popup. + +# only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) +createOffer.amountPriceBox.error.message=Si è verificato un errore durante l'immissione dell'offerta:\n\n{0}\n\nNon sono ancora usciti fondi dal tuo portafoglio.\nRiavvia l'applicazione e controlla la connessione di rete. +createOffer.setAmountPrice=Imposta importo e prezzo +createOffer.warnCancelOffer=Hai già finanziato questa offerta.\nSe annulli ora, i tuoi fondi verranno spostati sul tuo portafoglio Bisq locale e saranno disponibili per il prelievo nella schermata "Fondi/Invia fondi".\nSei sicuro di voler annullare? +createOffer.timeoutAtPublishing=Si è verificato un timeout durante la pubblicazione dell'offerta. +createOffer.errorInfo=\n\nLa maker fee è già pagata. Nel peggiore dei casi hai perso quella commissione.\nProva a riavviare l'applicazione e controlla la connessione di rete per vedere se riesci a risolvere il problema. +createOffer.tooLowSecDeposit.warning=Il deposito cauzionale è stato impostato su un valore inferiore rispetto al valore predefinito consigliato di {0}.\nSei sicuro di voler utilizzare un deposito di sicurezza inferiore? +createOffer.tooLowSecDeposit.makerIsSeller=Ti garantisce una minore protezione nel caso in cui il peer di scambio non segua il protocollo di negoziazione. +createOffer.tooLowSecDeposit.makerIsBuyer=Offre una protezione minore per al peer di trading che con cui commerci poiché hai meno depositi a rischio. Altri utenti potrebbero preferire altre offerte anziché le tue. +createOffer.resetToDefault=No, ripristina il valore predefinito +createOffer.useLowerValue=Sì, usa il mio valore più basso +createOffer.priceOutSideOfDeviation=Il prezzo che hai inserito è al di fuori del massimo consentito dalla deviazione dal prezzo di mercato.\nIl massimo consentito per la deviazione è {0} e può essere regolato nelle preferenze. +createOffer.changePrice=Cambia prezzo +createOffer.tac=Con la pubblicazione di questa offerta, accetto di negoziare con qualsiasi operatore che soddisfi le condizioni definite in questa schermata. +createOffer.currencyForFee=Commissione di scambio +createOffer.setDeposit=Imposta il deposito cauzionale dell'acquirente (%) +createOffer.setDepositAsBuyer=Imposta il mio deposito cauzionale come acquirente (%) +createOffer.setDepositForBothTraders=Set both traders' security deposit (%) +createOffer.securityDepositInfo=Il deposito cauzionale dell'acquirente sarà {0} +createOffer.securityDepositInfoAsBuyer=Il tuo deposito cauzionale come acquirente sarà {0} +createOffer.minSecurityDepositUsed=Viene utilizzato il minimo deposito cauzionale dell'acquirente + + +#################################################################### +# Offerbook / Take offer +#################################################################### + +takeOffer.amount.prompt=Inserisci importo in BTC +takeOffer.amountPriceBox.buy.amountDescription=Importo di BTC da vendere +takeOffer.amountPriceBox.sell.amountDescription=Importo di BTC da acquistare +takeOffer.amountPriceBox.priceDescription=Prezzo per bitcoin in {0} +takeOffer.amountPriceBox.amountRangeDescription=Range di importo possibile +takeOffer.amountPriceBox.warning.invalidBtcDecimalPlaces=L'importo che hai inserito supera il numero di decimali permessi.\nL'importo è stato regolato a 4 decimali. +takeOffer.validation.amountSmallerThanMinAmount=L'importo non può essere più piccolo dell'importo minimo definito nell'offerta. +takeOffer.validation.amountLargerThanOfferAmount=L'importo inserito non può essere più alto dell'importo definito nell'offerta. +takeOffer.validation.amountLargerThanOfferAmountMinusFee=Questo importo inserito andrà a creare un resto di basso valore per il venditore di BTC. +takeOffer.fundsBox.title=Finanzia il tuo scambio +takeOffer.fundsBox.isOfferAvailable=Controlla se l'offerta è disponibile ... +takeOffer.fundsBox.tradeAmount=Importo da vendere +takeOffer.fundsBox.offerFee=Commissione di scambio +takeOffer.fundsBox.networkFee=Totale commissioni di mining +takeOffer.fundsBox.takeOfferSpinnerInfo=Accettazione dell'offerta in corso ... +takeOffer.fundsBox.paymentLabel=Scambia Bisq con ID {0} +takeOffer.fundsBox.fundsStructure=({0} deposito cauzionale, {1} commissione commerciale, {2} commissione mineraria) +takeOffer.success.headline=Hai accettato con successo un'offerta. +takeOffer.success.info=Puoi vedere lo stato del tuo scambio su \"Portafoglio/Scambi aperti\". +takeOffer.error.message=Si è verificato un errore durante l'accettazione dell'offerta.\n\n{0} + +# new entries +takeOffer.takeOfferButton=Rivedi: Accetta l'offerta per {0} bitcoin +takeOffer.noPriceFeedAvailable=Non puoi accettare questa offerta poiché utilizza un prezzo in percentuale basato sul prezzo di mercato ma non è disponibile alcun feed di prezzi. +takeOffer.alreadyFunded.movedFunds=Hai già finanziato quell'offerta.\nI tuoi fondi sono stati spostati nel tuo portafoglio Bisq locale e sono disponibili per il prelievo nella schermata \"Fondi/Invia fondi\". +takeOffer.takeOfferFundWalletInfo.headline=Finanzia il tuo scambio +# suppress inspection "TrailingSpacesInProperty" +takeOffer.takeOfferFundWalletInfo.tradeAmount=- Importo di scambio: {0} \n +takeOffer.takeOfferFundWalletInfo.msg=Devi depositare {0} per accettare questa offerta.\n\nL'importo è la somma de:\n{1} - Il tuo deposito cauzionale: {2}\n- La commissione di trading: {3}\n- I costi di mining: {4}\n\nPuoi scegliere tra due opzioni quando finanzi il tuo scambio:\n- Usare il tuo portafoglio Bisq (comodo, ma le transazioni possono essere collegabili) OPPURE\n- Trasferimento da un portafoglio esterno (potenzialmente più privato)\n\nVedrai tutte le opzioni di finanziamento e i dettagli dopo aver chiuso questo popup. +takeOffer.alreadyPaidInFunds=Se hai già pagato in fondi puoi effettuare il ritiro nella schermata \"Fondi/Invia fondi\". +takeOffer.paymentInfo=Informazioni sul pagamento +takeOffer.setAmountPrice=Importo stabilito +takeOffer.alreadyFunded.askCancel=Hai già finanziato questa offerta.\nSe annulli ora, i tuoi fondi verranno spostati sul tuo portafoglio Bisq locale e saranno disponibili per il prelievo nella schermata "Fondi/Invia fondi".\nSei sicuro di voler annullare? +takeOffer.failed.offerNotAvailable=Accettazione dell'offerta non riuscita perché l'offerta non è più disponibile. Nel frattempo, un altro trader potrebbe aver già accettato l'offerta. +takeOffer.failed.offerTaken=Non puoi accettare questa offerta perché l'offerta è già stata presa da un altro trader. +takeOffer.failed.offerRemoved=Non puoi accettare quell'offerta perché nel frattempo l'offerta è stata rimossa. +takeOffer.failed.offererNotOnline=Richiesta di accettazione dell'ooferta non riuscita perché il maker non è più online. +takeOffer.failed.offererOffline=Non puoi accettare l'offerta poiché chi l'ha formulata è offline. +takeOffer.warning.connectionToPeerLost=Hai perso la connessione con il maker.\nPotrebbe essersi scollegato o aver chiuso la connessione verso di te a causa di troppe connessioni aperte.\nSe riesci ancora a vedere l'offerta nel registro offerte, puoi provare a riprenderla. + +takeOffer.error.noFundsLost=\n\nNon è ancora uscito alcun fondo dal tuo portafoglio.\nProva a riavviare l'applicazione e controlla la connessione di rete per vedere se riesci a risolvere il problema. +# suppress inspection "TrailingSpacesInProperty" +takeOffer.error.feePaid=\n\n +takeOffer.error.depositPublished=\n\nLa transazione di deposito è già stata pubblicata.\nProva a riavviare l'applicazione e verifica la connessione di rete per cercare di risolvere il problema.\nSe il problema persiste, contatta gli sviluppatori per ricevere supporto. +takeOffer.error.payoutPublished=\n\nLa transazione di pagamento è già stata pubblicata.\nProva a riavviare l'applicazione e verifica la connessione di rete per cercare di risolvere il problema.\nSe il problema persiste, contatta gli sviluppatori per ricevere supporto. +takeOffer.tac=Accettando questa offerta, accetto le condizioni commerciali definite in questa schermata. + + +#################################################################### +# Offerbook / Edit offer +#################################################################### + +editOffer.setPrice=Imposta prezzo +editOffer.confirmEdit=Conferma: modifica offerta +editOffer.publishOffer=Pubblica la tua offerta. +editOffer.failed=Modifica dell'offerta fallita:\n{0} +editOffer.success=La tua offerta è stata modificata con successo. +editOffer.invalidDeposit=Il deposito di sicurezza dell'acquirente non rientra nei vincoli definiti dalla DAO di Bisq e non può più essere modificato. + +#################################################################### +# Portfolio +#################################################################### + +portfolio.tab.openOffers=Le mie offerte aperte +portfolio.tab.pendingTrades=Scambi aperti +portfolio.tab.history=Storia +portfolio.tab.failed=Fallita +portfolio.tab.editOpenOffer=Modifica offerta + +portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance.\n\nError message: {0} + +portfolio.pending.step1.waitForConf=Attendi la conferma della blockchain +portfolio.pending.step2_buyer.startPayment=Inizia il pagamento +portfolio.pending.step2_seller.waitPaymentStarted=Attendi fino all'avvio del pagamento +portfolio.pending.step3_buyer.waitPaymentArrived=Attendi fino all'arrivo del pagamento +portfolio.pending.step3_seller.confirmPaymentReceived=Conferma la ricezione del pagamento +portfolio.pending.step5.completed=Completato + +portfolio.pending.step3_seller.autoConf.status.label=Auto-confirm status +portfolio.pending.autoConf=Auto-confirmed +portfolio.pending.autoConf.blocks=XMR confirmations: {0} / Required: {1} +portfolio.pending.autoConf.state.xmr.txKeyReused=Transaction key re-used. Please open a dispute. +portfolio.pending.autoConf.state.confirmations=XMR confirmations: {0}/{1} +portfolio.pending.autoConf.state.txNotFound=Transaction not seen in mem-pool yet +portfolio.pending.autoConf.state.txKeyOrTxIdInvalid=No valid transaction ID / transaction key +portfolio.pending.autoConf.state.filterDisabledFeature=Disabled by developers. + +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.FEATURE_DISABLED=Auto-confirm feature is disabled. {0} +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.TRADE_LIMIT_EXCEEDED=Trade amount exceeds auto-confirm amount limit +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.INVALID_DATA=Peer provided invalid data. {0} +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.PAYOUT_TX_ALREADY_PUBLISHED=Payout transaction was already published. +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.DISPUTE_OPENED=Dispute was opened. Auto-confirm is deactivated for that trade. +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.REQUESTS_STARTED=Transaction proof requests started +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.PENDING=Success results: {0}/{1}; {2} +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.COMPLETED=Proof at all services succeeded +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.ERROR=An error at a service request occurred. No auto-confirm possible. +# suppress inspection "UnusedProperty" +portfolio.pending.autoConf.state.FAILED=A service returned with a failure. No auto-confirm possible. + +portfolio.pending.step1.info=La transazione di deposito è stata pubblicata.\n {0} deve attendere almeno una conferma dalla blockchain prima di avviare il pagamento. +portfolio.pending.step1.warn=La transazione di deposito non è ancora confermata. Questo accade raramente e nel caso in cui la commissione di transazione di un trader proveniente da un portafoglio esterno è troppo bassa. +portfolio.pending.step1.openForDispute=La transazione di deposito non è ancora confermata. Puoi attendere più a lungo o contattare il mediatore per ricevere assistenza. + +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2.confReached=Il tuo scambio ha raggiunto almeno una conferma sulla blockchain.\n(Se lo desideri, puoi attendere altre conferme - 6 conferme sono considerate molto sicure.) \n\n + +portfolio.pending.step2_buyer.copyPaste=(Puoi copiare & incollare i valori dalla schermata principale dopo aver chiuso quel popup.) +portfolio.pending.step2_buyer.refTextWarn=NON utilizzare alcun avviso aggiuntivo nel testo \"motivo del pagamento\" come ad esempio bitcoin, BTC o Bisq. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.accountDetails=Ecco i dettagli dell'account commerciale del venditore BTC:\n +portfolio.pending.step2_buyer.tradeId=Non dimenticare di aggiungere l'ID dello scambio +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.assign=come \"motivo per il pagamento\" in modo che il destinatario possa assegnare il pagamento a questo scambio.\n\n +portfolio.pending.step2_buyer.fees=Se la tua banca applica commissioni bancarie, è necessario che tu copra tali commissioni. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.altcoin=Trasferisci dal tuo portafoglio esterno {0}\n{1} al venditore BTC.\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.cash=Vai in banca e paga {0} al venditore BTC.\n\n +portfolio.pending.step2_buyer.cash.extra=REQUISITI IMPORTANTI:\nDopo aver effettuato il pagamento scrivi sulla ricevuta cartacea: NESSUN RIMBORSO.\nQuindi strappalo in 2 parti, fai una foto e inviala all'indirizzo e-mail del venditore BTC. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.moneyGram=Si prega di pagare {0} al venditore BTC utilizzando MoneyGram.\n\n +portfolio.pending.step2_buyer.moneyGram.extra=REQUISITO IMPORTANTE:\nDopo aver effettuato il pagamento, invia il numero di autorizzazione e una foto della ricevuta via e-mail al venditore BTC.\nLa ricevuta deve mostrare chiaramente il nome completo, il paese, lo stato e l'importo del venditore. L'email del venditore è: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.westernUnion=Si prega di pagare {0} al venditore BTC utilizzando Western Union.\n\n +portfolio.pending.step2_buyer.westernUnion.extra=REQUISITO IMPORTANTE:\nDopo aver effettuato il pagamento, invia l'MTCN (numero di tracciamento) e una foto della ricevuta via e-mail al venditore BTC.\nLa ricevuta deve mostrare chiaramente il nome completo, la città, il paese e l'importo del venditore. L'email del venditore è: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n + +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.postal=Invia {0} tramite \"Vaglia Postale Statunitense\" al venditore BTC.\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.bank=Accedi al tuo online banking e paga {0} al venditore BTC.\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.f2f=Contatta il venditore BTC tramite il contatto fornito e organizza un incontro per pagare {0}.\n\n +portfolio.pending.step2_buyer.startPaymentUsing=Inizia il pagamento utilizzando {0} +portfolio.pending.step2_buyer.recipientsAccountData=Recipients {0} +portfolio.pending.step2_buyer.amountToTransfer=Importo da trasferire +portfolio.pending.step2_buyer.sellersAddress=Indirizzo {0} del venditore +portfolio.pending.step2_buyer.buyerAccount=Il tuo conto di pagamento da utilizzare +portfolio.pending.step2_buyer.paymentStarted=Il pagamento è iniziato +portfolio.pending.step2_buyer.warn=Non hai ancora effettuato il tuo pagamento {0}!\nSi prega di notare che lo scambio è stato completato da {1}. +portfolio.pending.step2_buyer.openForDispute=Non hai completato il pagamento!\nÈ trascorso il massimo periodo di scambio. Si prega di contattare il mediatore per assistenza. +portfolio.pending.step2_buyer.paperReceipt.headline=Hai inviato la ricevuta cartacea al venditore BTC? +portfolio.pending.step2_buyer.paperReceipt.msg=Ricorda:\nDevi scrivere sulla ricevuta cartacea: NESSUN RIMBORSO.\nQuindi strappala in 2 parti, fai una foto e inviala all'indirizzo e-mail del venditore BTC. +portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=Invia numero di autorizzazione e ricevuta +portfolio.pending.step2_buyer.moneyGramMTCNInfo.msg=È necessario inviare il numero di Autorizzazione e una foto della ricevuta via e-mail al venditore BTC.\nLa ricevuta deve indicare chiaramente il nome completo, il paese, lo stato e l'importo del venditore. L'email del venditore è: {0}.\n\nHai inviato il numero di Autorizzazione e il contratto al venditore? +portfolio.pending.step2_buyer.westernUnionMTCNInfo.headline=Invia MTCN e ricevuta +portfolio.pending.step2_buyer.westernUnionMTCNInfo.msg=Devi inviare l'MTCN (numero di tracciamento) e una foto della ricevuta via e-mail al venditore BTC.\nLa ricevuta deve indicare chiaramente il nome completo, la città, il paese e l'importo del venditore. L'email del venditore è: {0}.\n\nHai inviato l'MTCN e la ricevuta al venditore? +portfolio.pending.step2_buyer.halCashInfo.headline=Invia il codice HalCash +portfolio.pending.step2_buyer.halCashInfo.msg=È necessario inviare un messaggio di testo con il codice HalCash e l'ID dello scambio ({0}) al venditore BTC.\nIl numero di cellulare del venditore è {1}.\n\nHai inviato il codice al venditore? +portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=Alcune banche potrebbero richiedere il nome del destinatario. Gli account di Pagamento Veloci creati dai vecchi client Bisq non forniscono il nome del destinatario, quindi (se necessario) utilizza la chat dell scambio per fartelo comunicare. +portfolio.pending.step2_buyer.confirmStart.headline=Conferma di aver avviato il pagamento +portfolio.pending.step2_buyer.confirmStart.msg=Hai avviato il pagamento {0} al tuo partner commerciale? +portfolio.pending.step2_buyer.confirmStart.yes=Sì, ho avviato il pagamento +portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value +portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway +portfolio.pending.step2_seller.waitPayment.headline=In attesa del pagamento +portfolio.pending.step2_seller.f2fInfo.headline=Informazioni di contatto dell'acquirente +portfolio.pending.step2_seller.waitPayment.msg=La transazione di deposito necessita di almeno una conferma blockchain.\nDevi attendere fino a quando l'acquirente BTC invia il pagamento {0}. +portfolio.pending.step2_seller.warn=L'acquirente BTC non ha ancora effettuato il pagamento {0}.\nDevi aspettare fino a quando non invia il pagamento.\nSe lo scambio non sarà completato il {1}, l'arbitro comincierà ad indagare. +portfolio.pending.step2_seller.openForDispute=L'acquirente BTC non ha ancora inviato il pagamento!\nIl periodo massimo consentito per lo scambio è trascorso.\nPuoi aspettare più a lungo e dare più tempo al partner di scambio oppure puoi contattare il mediatore per ricevere assistenza. +tradeChat.chatWindowTitle=Finestra di chat per scambi con ID '' {0} '' +tradeChat.openChat=Apri la finestra di chat +tradeChat.rules=Puoi comunicare con il tuo peer di trading per risolvere potenziali problemi con questo scambio.\nNon è obbligatorio rispondere nella chat.\nSe un trader viola una delle seguenti regole, apri una controversia ed effettua una segnalazione al mediatore o all'arbitro.\n\nRegole della chat:\n● Non inviare nessun link (rischio di malware). È possibile inviare l'ID transazione e il nome di un block explorer.\n● Non inviare parole del seed, chiavi private, password o altre informazioni sensibili!\n● Non incoraggiare il trading al di fuori di Bisq (non garantisce nessuna sicurezza).\n● Non intraprendere alcuna forma di tentativo di frode di ingegneria sociale.\n● Se un peer non risponde e preferisce non comunicare tramite chat, rispettane la decisione.\n● Limita l'ambito della conversazione allo scambio. Questa chat non è una sostituzione di messenger o un troll-box.\n● Mantieni la conversazione amichevole e rispettosa.\n  + +# suppress inspection "UnusedProperty" +message.state.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +message.state.SENT=Messaggio inviato +# suppress inspection "UnusedProperty" +message.state.ARRIVED=Il messaggio è arrivato al peer +# suppress inspection "UnusedProperty" +message.state.STORED_IN_MAILBOX=Messaggio di pagamento inviato ma non ancora ricevuto dal peer +# suppress inspection "UnusedProperty" +message.state.ACKNOWLEDGED=Il peer ha confermato la ricezione de messaggio +# suppress inspection "UnusedProperty" +message.state.FAILED=Invio del messaggio fallito + +portfolio.pending.step3_buyer.wait.headline=Attendi la conferma del pagamento del venditore BTC +portfolio.pending.step3_buyer.wait.info=In attesa della conferma del venditore BTC per la ricezione del pagamento {0}. +portfolio.pending.step3_buyer.wait.msgStateInfo.label=Stato del messaggio di pagamento avviato +portfolio.pending.step3_buyer.warn.part1a=sulla {0} blockchain +portfolio.pending.step3_buyer.warn.part1b=presso il tuo fornitore di servizi di pagamento (ad es. banca) +portfolio.pending.step3_buyer.warn.part2=Il venditore BTC non ha ancora confermato il pagamento. Controlla {0} se l'invio del pagamento è andato a buon fine. +portfolio.pending.step3_buyer.openForDispute=Il venditore BTC non ha confermato il tuo pagamento! Il max. periodo per lo scambio è trascorso. Puoi aspettare più a lungo e dare più tempo al peer di trading o richiedere assistenza al mediatore. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.part=Il tuo partner commerciale ha confermato di aver avviato il pagamento {0}.\n\n +portfolio.pending.step3_seller.altcoin.explorer=sul tuo {0} blockchain explorer preferito +portfolio.pending.step3_seller.altcoin.wallet=sul tuo portafoglio {0} +portfolio.pending.step3_seller.altcoin={0}Controlla {1} se la transazione è indirizzata correttamente al tuo indirizzo di ricezione\n{2}\nha già sufficienti conferme sulla blockchain.\nL'importo del pagamento deve essere {3}\n\nPuoi copiare e incollare il tuo indirizzo {4} dalla schermata principale dopo aver chiuso questo popup. +portfolio.pending.step3_seller.postal={0}Verifica di aver ricevuto {1} con \"Vaglia Postale Statunitense\" dall'acquirente BTC.\n\nL'ID di scambio (\"motivo per il pagamento\" testo) della transazione è: \"{2}\" +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.bank=Il tuo partner di scambio ha confermato di aver avviato il pagamento {0}.\n\nVai al sito web del tuo online banking e controlla di aver ricevuto {1} dall'acquirente BTC.\n\nL'ID di scambio (\"motivo per il pagamento\" testo) della transazione è: \"{2}\"\n\n +portfolio.pending.step3_seller.cash=Poiché il pagamento viene effettuato tramite deposito in contanti, l'acquirente BTC deve scrivere \"NESSUN RIMBORSO\" sulla ricevuta cartacea, strapparlo in 2 parti e inviarti una foto via e-mail.\n\nPer evitare il rischio di storno, conferma solamente se hai ricevuto l'e-mail e se sei sicuro che la ricevuta cartacea sia valida.\nSe non sei sicuro, {0} +portfolio.pending.step3_seller.moneyGram=L'acquirente deve inviarti il numero di autorizzazione e una foto della ricevuta via e-mail.\nLa ricevuta deve mostrare chiaramente il tuo nome completo, il paese, lo stato e l'importo. Controlla nella tua e-mail se hai ricevuto il numero di autorizzazione.\n\nDopo aver chiuso il popup, vedrai il nome e l'indirizzo dell'acquirente BTC per effettuare il ritiro dell'importo da MoneyGram.\n\nConferma la ricevuta solo dopo aver ricevuto con successo i soldi! +portfolio.pending.step3_seller.westernUnion=L'acquirente deve inviarti l'MTCN (numero di tracciamento) e una foto della ricevuta via e-mail.\nLa ricevuta deve mostrare chiaramente il tuo nome completo, la città, il paese e l'importo. Controlla nella tua e-mail se hai ricevuto l'MTCN.\n\nDopo aver chiuso il popup, vedrai il nome e l'indirizzo dell'acquirente BTC per effettuare il ritiro dell'importo da Western Union.\n\nConferma la ricevuta solo dopo aver ricevuto con successo i soldi! +portfolio.pending.step3_seller.halCash=L'acquirente deve inviarti il codice HalCash come messaggio di testo. Riceverai un secondo un messaggio da HalCash con le informazioni richieste per poter ritirare gli EUR da un bancomat supportato da HalCash.\n\nDopo aver ritirato i soldi dal bancomat, conferma qui la ricevuta del pagamento! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. + +portfolio.pending.step3_seller.bankCheck=\n\nVerifica inoltre che il nome del mittente specificato nel contratto dello scambio corrisponda al nome che appare sul tuo estratto conto bancario:\nNome del mittente, per contratto di scambio: {0}\n\nSe i nomi non sono esattamente gli stessi, {1} +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.openDispute=non confermare la ricevuta del pagamento. Apri una disputa premendo \"alt + o\" oppure \"option + o\".\n\n +portfolio.pending.step3_seller.confirmPaymentReceipt=Conferma pagamento ricevuto +portfolio.pending.step3_seller.amountToReceive=Importo da ricevere +portfolio.pending.step3_seller.yourAddress=Il tuo indirizzo {0} +portfolio.pending.step3_seller.buyersAddress=Indirizzo dell'acquirente {0} +portfolio.pending.step3_seller.yourAccount=Il tuo conto di trading +portfolio.pending.step3_seller.xmrTxHash=ID Transazione +portfolio.pending.step3_seller.xmrTxKey=Transaction key +portfolio.pending.step3_seller.buyersAccount=Buyers account data +portfolio.pending.step3_seller.confirmReceipt=Conferma pagamento ricevuto +portfolio.pending.step3_seller.buyerStartedPayment=L'acquirente BTC ha avviato il pagamento {0}.\n{1} +portfolio.pending.step3_seller.buyerStartedPayment.altcoin=Controlla le conferme blockchain sul tuo portafoglio altcoin o block explorer e conferma il pagamento quando hai sufficienti conferme blockchain +portfolio.pending.step3_seller.buyerStartedPayment.fiat=Controlla sul tuo conto di trading (ad es. Conto bancario) e conferma quando hai ricevuto il pagamento. +portfolio.pending.step3_seller.warn.part1a=sulla {0} blockchain +portfolio.pending.step3_seller.warn.part1b=presso il tuo fornitore di servizi di pagamento (ad es. banca) +portfolio.pending.step3_seller.warn.part2=Non hai ancora confermato la ricevuta del pagamento. Controlla {0} se hai ricevuto il pagamento. +portfolio.pending.step3_seller.openForDispute=Non hai confermato la ricevuta del pagamento!\nIl max. periodo per lo scambio è trascorso.\nConferma o richiedi assistenza al mediatore. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.onPaymentReceived.part1=Hai ricevuto il pagamento {0} dal tuo partner commerciale?\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.onPaymentReceived.fiat=L'ID di scambio (\"motivo per il pagamento\" testo) della transazione è: \"{0}\"\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.onPaymentReceived.name=Verifica inoltre che il nome del mittente specificato nel contratto di scambio corrisponda al nome che appare sul tuo estratto conto bancario:\nNome del mittente, per contratto di scambio: {0}\n\nSe i nomi non sono uguali, non confermare la ricevuta del pagamento. Apri invece una disputa premendo \"alt + o\" oppure \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.onPaymentReceived.note=Tieni presente che non appena avrai confermato la ricevuta, l'importo commerciale bloccato verrà rilasciato all'acquirente BTC e il deposito cauzionale verrà rimborsato. +portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Conferma di aver ricevuto il pagamento +portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Si, ho ricevuto il pagamento +portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANTE: confermando la ricezione del pagamento, stai anche verificando il conto della controparte e, di conseguenza, lo stai firmando. Poiché il conto della controparte non è stato ancora firmato, è necessario ritardare la conferma del pagamento il più a lungo possibile per ridurre il rischio di uno storno di addebito. + +portfolio.pending.step5_buyer.groupTitle=Riepilogo degli scambi completati +portfolio.pending.step5_buyer.tradeFee=Commissione di scambio +portfolio.pending.step5_buyer.makersMiningFee=Commissione di mining +portfolio.pending.step5_buyer.takersMiningFee=Totale commissioni di mining +portfolio.pending.step5_buyer.refunded=Deposito di sicurezza rimborsato +portfolio.pending.step5_buyer.withdrawBTC=Preleva i tuoi bitcoin +portfolio.pending.step5_buyer.amount=Importo da prelevare +portfolio.pending.step5_buyer.withdrawToAddress=Ritirare all'indirizzo +portfolio.pending.step5_buyer.moveToBisqWallet=Keep funds in Bisq wallet +portfolio.pending.step5_buyer.withdrawExternal=Ritira verso un portafoglio esterno +portfolio.pending.step5_buyer.alreadyWithdrawn=I tuoi fondi sono già stati ritirati.\nSi prega di controllare la cronologia delle transazioni. +portfolio.pending.step5_buyer.confirmWithdrawal=Conferma richiesta di prelievo +portfolio.pending.step5_buyer.amountTooLow=L'importo da trasferire è inferiore alla commissione di transazione e al min. valore tx possibile (polvere). +portfolio.pending.step5_buyer.withdrawalCompleted.headline=Prelievo completato +portfolio.pending.step5_buyer.withdrawalCompleted.msg=Gli scambi completati vengono archiviati in \"Portafoglio/Storia\".\nPuoi rivedere tutte le tue transazioni bitcoin in \"Fondi/Transazioni\" +portfolio.pending.step5_buyer.bought=Hai acquistato +portfolio.pending.step5_buyer.paid=Hai pagato + +portfolio.pending.step5_seller.sold=Hai venduto +portfolio.pending.step5_seller.received=Hai ricevuto + +tradeFeedbackWindow.title=Congratulazioni per aver concluso il tuo scambio +tradeFeedbackWindow.msg.part1=Ci piacerebbe avere notizie sulla tua esperienza. Ci aiuterà a migliorare il software e a correggere eventuali errori. Se desideri fornire un feedback, compila questo breve sondaggio (non è richiesta la registrazione) all'indirizzo: +tradeFeedbackWindow.msg.part2=In caso di domande o problemi, si prega di mettersi in contatto con altri utenti e collaboratori tramite il forum Bisq all'indirizzo: +tradeFeedbackWindow.msg.part3=Grazie per aver usato Bisq! + +portfolio.pending.role=Il mio ruolo +portfolio.pending.tradeInformation=Informazioni sullo scambio +portfolio.pending.remainingTime=Tempo rimanente +portfolio.pending.remainingTimeDetail={0} (fino a {1}) +portfolio.pending.tradePeriodInfo=Dopo la prima conferma della blockchain, inizia il periodo di scambio. In base al metodo di pagamento utilizzato, verrà applicato un diverso periodo di scambio massimo consentito. +portfolio.pending.tradePeriodWarning=Se il periodo viene superato, entrambi i trader possono aprire una disputa. +portfolio.pending.tradeNotCompleted=Scambio non completato in tempo (fino a {0}) +portfolio.pending.tradeProcess=Processo dello scambio +portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at [HYPERLINK:https://bisq.community]. +portfolio.pending.openAgainDispute.button=Apri nuovamente la disputa +portfolio.pending.openSupportTicket.headline=Apri ticket di supporto +portfolio.pending.openSupportTicket.msg=Utilizza questa funzione solo in caso di emergenza se non viene visualizzato il pulsante \"Apri supporto\" o \"Apri disputa\".\n\nQuando apri un ticket di supporto, lo scambio verrà interrotto e gestito da un mediatore o da un arbitro. + +portfolio.pending.timeLockNotOver=Devi aspettare fino a ≈ {0} ({1} più blocchi) prima di poter aprire una controversia arbitrale. +portfolio.pending.error.depositTxNull=La transazione di deposito è nulla. Non è possibile aprire una disputa senza una transazione di deposito valida. Vai su \"Impostazioni/Informazioni di rete\" ed esegui una risincronizzazione SPV.\n\nPer ulteriore assistenza, contatta il canale di supporto Bisq nel team di Bisq Keybase. +portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is null. You can move the trade to failed trades. +portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. +portfolio.pending.error.depositTxNotConfirmed=La transazione di deposito non è confermata. Non è possibile aprire una disputa arbitrale con una transazione di deposito non confermata. Attendi fino alla conferma o vai su \"Impostazioni/Informazioni di rete\" ed esegui una risincronizzazione SPV.\n\nPer ulteriore assistenza, contatta il canale di supporto Bisq nel team di Bisq Keybase. + +portfolio.pending.support.headline.getHelp=Ho bisogno di aiuto? +portfolio.pending.support.text.getHelp=In caso di problemi, puoi provare a contattare il peer di scambio tramite la chat oppure puoi chiedere aiuto alla comunità Bisq all'indirizzo https://bisq.community. Se il problema persiste, puoi richiedere ulteriore aiuto ad un mediatore. +portfolio.pending.support.button.getHelp=Apri la chat dello scambio +portfolio.pending.support.headline.halfPeriodOver=Controlla il pagamento +portfolio.pending.support.headline.periodOver=Il periodo di scambio è finito + +portfolio.pending.mediationRequested=Mediazione richiesta +portfolio.pending.refundRequested=Rimborso richiesto +portfolio.pending.openSupport=Apri ticket di supporto +portfolio.pending.supportTicketOpened=Ticket di supporto aperto +portfolio.pending.communicateWithArbitrator=Si prega di comunicare nella schermata \"Supporto\" con l'arbitro. +portfolio.pending.communicateWithMediator=Si prega di comunicare nella schermata \"Supporto\" con il mediatore. +portfolio.pending.disputeOpenedMyUser=Hai già aperto una disputa.\n{0} +portfolio.pending.disputeOpenedByPeer=Il tuo pari commerciale ha aperto una controversia\n{0} +portfolio.pending.noReceiverAddressDefined=Nessun indirizzo del destinatario definito + +portfolio.pending.mediationResult.headline=Pagamento suggerito dalla mediazione +portfolio.pending.mediationResult.info.noneAccepted=Completa lo scambio accettando il suggerimento del mediatore per il pagamento dello stesso. +portfolio.pending.mediationResult.info.selfAccepted=Hai accettato il suggerimento del mediatore. In attesa che anche il peer accetti. +portfolio.pending.mediationResult.info.peerAccepted=Il tuo pari commerciale ha accettato il suggerimento del mediatore. Accetti anche tu? +portfolio.pending.mediationResult.button=Visualizza la risoluzione proposta +portfolio.pending.mediationResult.popup.headline=Risultato della mediazione per gli scambi con ID: {0} +portfolio.pending.mediationResult.popup.headline.peerAccepted=Il tuo pari commerciale ha accettato il suggerimento del mediatore per lo scambio {0} +portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nOnce the lock time is over on {0} (block {1}), you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.openArbitration=Rifiuta e richiedi l'arbitrato +portfolio.pending.mediationResult.popup.alreadyAccepted=Hai già accettato + +portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. +portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. +portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nFeel free to move this trade to failed trades. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} +portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. +portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. +portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Move trade to failed trades +portfolio.pending.failedTrade.warningIcon.tooltip=Click to open details about the issues of this trade +portfolio.failed.revertToPending.popup=Do you want to move this trade to open trades? +portfolio.failed.revertToPending=Move trade to open trades + +portfolio.closed.completed=Completato +portfolio.closed.ticketClosed=Arbitrato +portfolio.closed.mediationTicketClosed=Mediato +portfolio.closed.canceled=Annullato +portfolio.failed.Failed=Fallito +portfolio.failed.unfail= \nPrima di procedere, assicurati di avere un backup della tua directory dei dati!\nVuoi riportare questo scambio nella sezione degli scambi aperti?\nQuesto è un modo per rientrare in possesso dei fondi bloccati in uno scambio fallito.\n  +portfolio.failed.cantUnfail= \nAl momento questo scambio non può tornare nella sezione degli scambi aperti.\nRiprova dopo il completamento degli scambi {0} +portfolio.failed.depositTxNull=The trade cannot be reverted to a open trade. Deposit transaction is null. +portfolio.failed.delayedPayoutTxNull=The trade cannot be reverted to a open trade. Delayed payout transaction is null. + + +#################################################################### +# Funds +#################################################################### + +funds.tab.deposit=Ricevi fondi +funds.tab.withdrawal=Invia fondi +funds.tab.reserved=Fondi riservati +funds.tab.locked=Fondi bloccati +funds.tab.transactions=Transazioni + +funds.deposit.unused=Non usato +funds.deposit.usedInTx=Utilizzato in {0} transazioni +funds.deposit.fundBisqWallet=Finanzia portafoglio Bisq +funds.deposit.noAddresses=Non sono stati ancora generati indirizzi di deposito +funds.deposit.fundWallet=Finanzia il tuo portafoglio +funds.deposit.withdrawFromWallet=Invia fondi dal portafoglio +funds.deposit.amount=Importo in BTC (facoltativo) +funds.deposit.generateAddress=Crea nuovo indirizzo +funds.deposit.generateAddressSegwit=Native segwit format (Bech32) +funds.deposit.selectUnused=Seleziona un indirizzo inutilizzato dalla tabella sopra anziché generarne uno nuovo. + +funds.withdrawal.arbitrationFee=Commissione arbitraggio +funds.withdrawal.inputs=Selezione input +funds.withdrawal.useAllInputs=Utilizza tutti gli input disponibili +funds.withdrawal.useCustomInputs=Utilizza input personalizzati +funds.withdrawal.receiverAmount=Importo del destinatario +funds.withdrawal.senderAmount=Importo del mittente +funds.withdrawal.feeExcluded=L'importo esclude la commissione di mining +funds.withdrawal.feeIncluded=L'importo include la commissione di mining +funds.withdrawal.fromLabel=Ritirare dall'indirizzo +funds.withdrawal.toLabel=Ritirare all'indirizzo +funds.withdrawal.memoLabel=Withdrawal memo +funds.withdrawal.memo=Optionally fill memo +funds.withdrawal.withdrawButton=Ritira selezionato +funds.withdrawal.noFundsAvailable=Non sono disponibili fondi per il prelievo +funds.withdrawal.confirmWithdrawalRequest=Conferma richiesta di prelievo +funds.withdrawal.withdrawMultipleAddresses=Ritira da più indirizzi ({0}) +funds.withdrawal.withdrawMultipleAddresses.tooltip=Ritira da più indirizzi\n({0}) +funds.withdrawal.notEnoughFunds=Non hai abbastanza fondi nel tuo portafoglio. +funds.withdrawal.selectAddress=Seleziona un indirizzo sorgente dalla tabella +funds.withdrawal.setAmount=Imposta l'importo da prelevare +funds.withdrawal.fillDestAddress=Inserisci il tuo indirizzo di destinazione +funds.withdrawal.warn.noSourceAddressSelected=È necessario selezionare un indirizzo di origine nella tabella sopra. +funds.withdrawal.warn.amountExceeds=Non hai fondi sufficienti disponibili presso l'indirizzo selezionato.\nConsidera di selezionare più indirizzi nella tabella sopra o di cambiare la tariffa per includere la commissione del miner. + +funds.reserved.noFunds=Nessun fondo è riservato nelle offerte aperte +funds.reserved.reserved=Riservato nel portafoglio locale per l'offerta con ID: {0} + +funds.locked.noFunds=Nessun fondo è bloccato nelle negoziazioni +funds.locked.locked=Bloccato in multisig per lo scambio con ID: {0} + +funds.tx.direction.sentTo=Inviato a: +funds.tx.direction.receivedWith=Ricevuto con: +funds.tx.direction.genesisTx=Da tx Genesi: +funds.tx.txFeePaymentForBsqTx=Commissione di mining per transazioni BSQ +funds.tx.createOfferFee=Commissione per maker e tx: {0} +funds.tx.takeOfferFee=Commissione per taker e tx: {0} +funds.tx.multiSigDeposit=Deposito multisig: {0} +funds.tx.multiSigPayout=Pagamento Multisig: {0} +funds.tx.disputePayout=Pagamento disputa: {0} +funds.tx.disputeLost=Caso di disputa persa : {0} +funds.tx.collateralForRefund=Garanzia di rimborso: {0} +funds.tx.timeLockedPayoutTx=Tx di pagamento bloccata: {0} +funds.tx.refund=Rimborso dell'arbitrato: {0} +funds.tx.unknown=Motivo sconosciuto: {0} +funds.tx.noFundsFromDispute=Nessun rimborso dalla controversia +funds.tx.receivedFunds=Fondi ricevuti +funds.tx.withdrawnFromWallet=Prelevato dal portafoglio +funds.tx.withdrawnFromBSQWallet=BTC prelevati dal portafoglio BSQ +funds.tx.memo=Memo +funds.tx.noTxAvailable=Nessuna transazione disponibile +funds.tx.revert=Storna +funds.tx.txSent=Transazione inviata con successo ad un nuovo indirizzo nel portafoglio Bisq locale. +funds.tx.direction.self=Invia a te stesso +funds.tx.daoTxFee=Commissione al miner per la tx verso la DAO +funds.tx.reimbursementRequestTxFee=Richiesta di rimborso +funds.tx.compensationRequestTxFee=Richiesta di compenso +funds.tx.dustAttackTx=Polvere ricevuta +funds.tx.dustAttackTx.popup=Questa transazione sta inviando un importo BTC molto piccolo al tuo portafoglio e potrebbe essere un tentativo da parte delle società di chain analysis per spiare il tuo portafoglio.\n\nSe usi quell'output della transazione in una transazione di spesa, scopriranno che probabilmente sei anche il proprietario dell'altro indirizzo (combinazione di monete).\n\nPer proteggere la tua privacy, il portafoglio Bisq ignora tali output di polvere a fini di spesa e nella visualizzazione del saldo. È possibile impostare la soglia al di sotto della quale un output è considerato polvere.\n  + + +#################################################################### +# Support +#################################################################### + +support.tab.mediation.support=Mediazione +support.tab.arbitration.support=Arbitrato +support.tab.legacyArbitration.support=Arbitrato Legacy +support.tab.ArbitratorsSupportTickets=I ticket di {0} +support.filter=Search disputes +support.filter.prompt=Inserisci ID commerciale, data, indirizzo onion o dati dell'account + +support.sigCheck.button=Verify result +support.sigCheck.popup.info=In case of a reimbursement request to the DAO you need to paste the summary message of the mediation and arbitration process in your reimbursement request on Github. To make this statement verifiable any user can check with this tool if the signature of the mediator or arbitrator matches the summary message. +support.sigCheck.popup.header=Verify dispute result signature +support.sigCheck.popup.msg.label=Summary message +support.sigCheck.popup.msg.prompt=Copy & paste summary message from dispute +support.sigCheck.popup.result=Validation result +support.sigCheck.popup.success=Signature is valid +support.sigCheck.popup.failed=Signature verification failed +support.sigCheck.popup.invalidFormat=Message is not of expected format. Copy & paste summary message from dispute. + +support.reOpenByTrader.prompt=Are you sure you want to re-open the dispute? +support.reOpenButton.label=Re-open +support.sendNotificationButton.label=Notifica privata +support.reportButton.label=Report +support.fullReportButton.label=All disputes +support.noTickets=Non ci sono ticket aperti +support.sendingMessage=Inviando il messaggio ... +support.receiverNotOnline=Il destinatario non è online. Il messaggio viene salvato nella loro casella di posta. +support.sendMessageError=Invio messaggio non riuscito. Errore: {0} +support.wrongVersion=L'offerta in quella controversia è stata creata con una versione precedente di Bisq.\nNon puoi chiudere quella controversia con la versione della tua applicazione.\n\nUtilizza una versione precedente con la versione del protocollo {0} +support.openFile=Apri il file da allegare (dimensione massima del file: {0}) +support.attachmentTooLarge=La dimensione dei tuoi allegati è di {0} e supera il massimo consentito di {1} kB. +support.maxSize=La dimensione massima del file permessa è di {0} kB. +support.attachment=Allegato +support.tooManyAttachments=Non è possibile inviare più di 3 allegati in un messaggio. +support.save=Salva il file sul computer +support.messages=Messaggi +support.input.prompt=Inserisci messaggio... +support.send=Invia +support.addAttachments=Aggiungi allegati +support.closeTicket=Chiudi ticket +support.attachments=Allegati: +support.savedInMailbox=Messaggio salvato nella cassetta postale del destinatario +support.arrived=Il messaggio è arrivato al destinatario +support.acknowledged=Arrivo del messaggio confermato dal destinatario +support.error=Il destinatario non ha potuto elaborare il messaggio. Errore: {0} +support.buyerAddress=Indirizzo BTC dell'acquirente +support.sellerAddress=Indirizzo BTC del venditore +support.role=Ruolo +support.state=Stato +support.closed=Chiuso +support.open=Aperto +support.buyerOfferer=Acquirente/Maker BTC +support.sellerOfferer=Venditore/Maker BTC +support.buyerTaker=Acquirente/Taker BTC +support.sellerTaker=Venditore/Taker BTC + +support.backgroundInfo=Bisq non è una società, quindi gestisce le controversie in modo diverso.\n\nI trader possono comunicare all'interno dell'applicazione tramite chat sicura nella schermata degli scambi aperti per provare a risolvere le controversie da soli. Se ciò non è sufficiente, un mediatore può intervenire per aiutare. Il mediatore valuterà la situazione e suggerirà un pagamento di fondi commerciali. Se entrambi i trader accettano questo suggerimento, la transazione di pagamento è completata e lo scambio è chiuso. Se uno o entrambi i trader non accettano il pagamento suggerito dal mediatore, possono richiedere l'arbitrato. L'arbitro rivaluterà la situazione e, se garantito, ripagherà personalmente il trader e chiederà il rimborso per questo pagamento dal DAO Bisq. +support.initialInfo=Inserisci una descrizione del tuo problema nel campo di testo qui sotto. Aggiungi quante più informazioni possibili per accelerare i tempi di risoluzione della disputa.\n\nEcco una lista delle informazioni che dovresti fornire:\n● Se sei l'acquirente BTC: hai effettuato il trasferimento Fiat o Altcoin? In tal caso, hai fatto clic sul pulsante "pagamento avviato" nell'applicazione?\n● Se sei il venditore BTC: hai ricevuto il pagamento Fiat o Altcoin? In tal caso, hai fatto clic sul pulsante "pagamento ricevuto" nell'applicazione?\n● Quale versione di Bisq stai usando?\n● Quale sistema operativo stai usando?\n● Se si è verificato un problema con transazioni non riuscite, prendere in considerazione la possibilità di passare a una nuova directory di dati.\n  A volte la directory dei dati viene danneggiata e porta a strani bug.\n  Vedi: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nAcquisire familiarità con le regole di base per la procedura di disputa:\n● È necessario rispondere alle richieste di {0} entro 2 giorni.\n● I mediatori rispondono entro 2 giorni. Gli arbitri rispondono entro 5 giorni lavorativi.\n● Il periodo massimo per una disputa è di 14 giorni.\n● È necessario collaborare con {1} e fornire le informazioni richieste per presentare il proprio caso.\n● Hai accettato le regole delineate nel documento di contestazione nel contratto con l'utente al primo avvio dell'applicazione.\n\nPuoi leggere ulteriori informazioni sulla procedura di contestazione all'indirizzo: {2}\n  +support.systemMsg=Messaggio di sistema: {0} +support.youOpenedTicket=Hai aperto una richiesta di supporto.\n\n{0}\n\nVersione Bisq: {1} +support.youOpenedDispute=Hai aperto una richiesta per una controversia.\n\n{0}\n\nVersione Bisq: {1} +support.youOpenedDisputeForMediation=Hai richiesto la mediazione.\n\n{0}\n\nVersione Bisq: {1} +support.peerOpenedTicket=Il tuo peer di trading ha richiesto supporto a causa di problemi tecnici.\n\n{0}\n\nVersione Bisq: {1} +support.peerOpenedDispute=Il tuo peer di trading ha richiesto una controversia.\n\n{0}\n\nVersione Bisq: {1} +support.peerOpenedDisputeForMediation=Il tuo peer di trading ha richiesto la mediazione.\n\n{0}\n\nVersione Bisq: {1} +support.mediatorsDisputeSummary=System message: Mediator''s dispute summary:\n{0} +support.mediatorsAddress=Indirizzo nodo del mediatore: {0} +support.warning.disputesWithInvalidDonationAddress=The delayed payout transaction has used an invalid receiver address. It does not match any of the DAO parameter values for the valid donation addresses.\n\nThis might be a scam attempt. Please inform the developers about that incident and do not close that case before the situation is resolved!\n\nAddress used in the dispute: {0}\n\nAll DAO param donation addresses: {1}\n\nTrade ID: {2}{3} +support.warning.disputesWithInvalidDonationAddress.mediator=\n\nDo you still want to close the dispute? +support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nYou must not do the payout. + + +#################################################################### +# Settings +#################################################################### +settings.tab.preferences=Preferenze +settings.tab.network=Informazioni della Rete +settings.tab.about=Circa + +setting.preferences.general=Preferenze generali +setting.preferences.explorer=Bitcoin Explorer +setting.preferences.explorer.bsq=Bisq Explorer +setting.preferences.deviation=Deviazione massima del prezzo di mercato +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate +setting.preferences.avoidStandbyMode=Evita modalità standby +setting.preferences.autoConfirmXMR=XMR auto-confirm +setting.preferences.autoConfirmEnabled=Enabled +setting.preferences.autoConfirmRequiredConfirmations=Required confirmations +setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) +setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) +setting.preferences.deviationToLarge=Non sono ammessi valori superiori a {0}%. +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) +setting.preferences.useCustomValue=Usa valore personalizzato +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. +setting.preferences.ignorePeers=Peer ignorati [indirizzo:porta onion] +setting.preferences.ignoreDustThreshold=Valore minimo di output non-dust +setting.preferences.currenciesInList=Valute nell'elenco dei feed dei prezzi di mercato +setting.preferences.prefCurrency=Valuta preferita +setting.preferences.displayFiat=Mostra valute nazionali +setting.preferences.noFiat=Non ci sono valute nazionali selezionate +setting.preferences.cannotRemovePrefCurrency=Non è possibile rimuovere la valuta di visualizzazione preferita selezionata +setting.preferences.displayAltcoins=Visualizza altcoin +setting.preferences.noAltcoins=Non ci sono altcoin selezionate +setting.preferences.addFiat=Aggiungi valuta nazionale +setting.preferences.addAltcoin=Aggiungi altcoin +setting.preferences.displayOptions=Mostra opzioni +setting.preferences.showOwnOffers=Mostra le mie offerte nel libro delle offerte +setting.preferences.useAnimations=Usa animazioni +setting.preferences.useDarkMode=Usa modalità notte +setting.preferences.sortWithNumOffers=Ordina le liste di mercato con n. di offerte/scambi +setting.preferences.resetAllFlags=Ripristina tutti i flag \"Non mostrare più\" +settings.preferences.languageChange=Per applicare la modifica della lingua a tutte le schermate è necessario riavviare. +settings.preferences.supportLanguageWarning=In caso di controversia, tenere presente che la mediazione è gestita in {0} e l'arbitrato in {1}. +setting.preferences.daoOptions=Opzioni DAO +setting.preferences.dao.resyncFromGenesis.label=Ricostruisci lo stato della DAO dalla transazione di genesi +setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources +setting.preferences.dao.resyncFromResources.popup=After an application restart the Bisq network governance data will be reloaded from the seed nodes and the BSQ consensus state will be rebuilt from the latest resource files. +setting.preferences.dao.resyncFromGenesis.popup=A resync from genesis transaction can take considerable time and CPU resources. Are you sure you want to do that? Mostly a resync from latest resource files is sufficient and much faster.\n\nIf you proceed, after an application restart the Bisq network governance data will be reloaded from the seed nodes and the BSQ consensus state will be rebuilt from the genesis transaction. +setting.preferences.dao.resyncFromGenesis.resync=Resync from genesis and shutdown +setting.preferences.dao.isDaoFullNode=Lancia Bisq come full node DAO +setting.preferences.dao.rpcUser=Username RPC +setting.preferences.dao.rpcPw=Password RPC +setting.preferences.dao.blockNotifyPort=Blocca porta di notifica +setting.preferences.dao.fullNodeInfo=Per eseguire Bisq come nodo DAO completo devi avere Bitcoin Core in esecuzione localmente e RPC abilitato. Tutti i requisiti sono documentati in ''{0}''.\n\nDopo aver modificato la modalità, è necessario riavviare. +setting.preferences.dao.fullNodeInfo.ok=Apri la pagina dei documenti +setting.preferences.dao.fullNodeInfo.cancel=No, continuo ad utilizzare il nodo leggero +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=Nome +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL + +settings.net.btcHeader=Network Bitcoin +settings.net.p2pHeader=Rete Bisq +settings.net.onionAddressLabel=Il mio indirizzo onion +settings.net.btcNodesLabel=Usa nodi Bitcoin Core personalizzati +settings.net.bitcoinPeersLabel=Peer connessi +settings.net.useTorForBtcJLabel=Usa Tor per la rete Bitcoin +settings.net.bitcoinNodesLabel=Nodi Bitcoin Core a cui connettersi +settings.net.useProvidedNodesRadio=Usa i nodi Bitcoin Core forniti +settings.net.usePublicNodesRadio=Usa la rete pubblica di Bitcoin +settings.net.useCustomNodesRadio=Usa nodi Bitcoin Core personalizzati +settings.net.warn.usePublicNodes=If you use the public Bitcoin network you are exposed to a severe privacy problem caused by the broken bloom filter design and implementation which is used for SPV wallets like BitcoinJ (used in Bisq). Any full node you are connected to could find out that all your wallet addresses belong to one entity.\n\nPlease read more about the details at [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nAre you sure you want to use the public nodes? +settings.net.warn.usePublicNodes.useProvided=No, utilizza i nodi forniti +settings.net.warn.usePublicNodes.usePublic=Sì, usa la rete pubblica +settings.net.warn.useCustomNodes.B2XWarning=Assicurati che il tuo nodo Bitcoin sia un nodo Bitcoin Core di fiducia!\n\nLa connessione a nodi che non seguono le regole di consenso di Bitcoin Core potrebbe corrompere il tuo portafoglio e causare problemi nel processo di scambio.\n\nGli utenti che si connettono a nodi che violano le regole di consenso sono responsabili per qualsiasi danno risultante. Eventuali controversie risultanti saranno decise a favore dell'altro pari. Nessun supporto tecnico verrà fornito agli utenti che ignorano questo meccanismo di avvertimento e protezione! +settings.net.warn.invalidBtcConfig=Connessione alla rete Bitcoin non riuscita perché la configurazione non è valida.\n\nLa tua configurazione è stata ripristinata per utilizzare invece i nodi Bitcoin forniti. Dovrai riavviare l'applicazione. +settings.net.localhostBtcNodeInfo=Informazioni di base: Bisq cerca un nodo Bitcoin locale all'avvio. Se viene trovato, Bisq comunicherà con la rete Bitcoin esclusivamente attraverso di esso. +settings.net.p2PPeersLabel=Peer connessi +settings.net.onionAddressColumn=Indirizzo onion +settings.net.creationDateColumn=Stabilito +settings.net.connectionTypeColumn=Dentro/Fuori +settings.net.sentDataLabel=Sent data statistics +settings.net.receivedDataLabel=Received data statistics +settings.net.roundTripTimeColumn=Ritorno +settings.net.sentBytesColumn=Inviato +settings.net.receivedBytesColumn=Ricevuto +settings.net.peerTypeColumn=Tipo di peer +settings.net.openTorSettingsButton=Apri impostazioni di Tor + +settings.net.versionColumn=Versione +settings.net.subVersionColumn=Sottoversione +settings.net.heightColumn=Altezza + +settings.net.needRestart=È necessario riavviare l'applicazione per applicare tale modifica.\nVuoi farlo adesso? +settings.net.notKnownYet=Non ancora noto... +settings.net.sentData=Sent data: {0}, {1} messages, {2} messages/sec +settings.net.receivedData=Received data: {0}, {1} messages, {2} messages/sec +settings.net.ips=[Indirizzo IP:porta | hostname:porta | indirizzo onion:porta] (separato da una virgola). La porta può essere omessa se è usata quella predefinita (8333). +settings.net.seedNode=Nodo seme +settings.net.directPeer=Peer (diretto) +settings.net.peer=Peer +settings.net.inbound=in entrata +settings.net.outbound=in uscita +settings.net.reSyncSPVChainLabel=Risincronizza la catena SPV +settings.net.reSyncSPVChainButton=Elimina il file SPV e risincronizza +settings.net.reSyncSPVSuccess=Il file della catena SPV verrà eliminato al successivo avvio. È necessario riavviare l'applicazione ora.\n\nDopo il riavvio, la risincronizzazione con la rete può richiedere del tempo e vedrai tutte le transazioni solo una volta completata la risincronizzazione.\n\nA seconda del numero di transazioni e dell'età del tuo portafoglio, la risincronizzazione può richiedere fino a qualche ora e consuma il 100% della CPU. Non interrompere il processo, altrimenti sarà necessario ripeterlo. +settings.net.reSyncSPVAfterRestart=Il file della catena SPV è stato eliminato. Per favore sii paziente. La risincronizzazione con la rete può richiedere del tempo. +settings.net.reSyncSPVAfterRestartCompleted=La risincronizzazione è ora completata. Si prega di riavviare l'applicazione. +settings.net.reSyncSPVFailed=Impossibile eliminare il file della catena SPV.\nErrore: {0} +setting.about.aboutBisq=Riguardo Bisq +setting.about.about=Bisq è un software open source che facilita lo scambio di bitcoin con valute nazionali (e altre criptovalute) attraverso una rete peer-to-peer decentralizzata in modo da proteggere fortemente la privacy degli utenti. Leggi di più riguardo Bisq sulla pagina web del progetto. +setting.about.web=Pagina web Bisq +setting.about.code=Codice sorgente +setting.about.agpl=Licenza AGPL +setting.about.support=Supporta Bisq +setting.about.def=Bisq non è un'azienda, è un progetto aperto alla comunità. Se vuoi partecipare o supportare Bisq, segui i link qui sotto. +setting.about.contribute=Contribuisci +setting.about.providers=Fornitori di dati +setting.about.apisWithFee=Bisq uses Bisq Price Indices for Fiat and Altcoin market prices, and Bisq Mempool Nodes for mining fee estimation. +setting.about.apis=Bisq uses Bisq Price Indices for Fiat and Altcoin market prices. +setting.about.pricesProvided=Prezzi di mercato forniti da +setting.about.feeEstimation.label=Previsione della commissione di mining fornita da +setting.about.versionDetails=Dettagli versione +setting.about.version=Versione applicazione +setting.about.subsystems.label=Versioni di sottosistemi +setting.about.subsystems.val=Versione di rete: {0}; Versione del messaggio P2P: {1}; Versione DB locale: {2}; Versione del protocollo di scambio: {3} + +setting.about.shortcuts=Scorciatoie +setting.about.shortcuts.ctrlOrAltOrCmd=''Ctrl + {0}'' o ''alt + {0}'' o ''cmd + {0}'' + +setting.about.shortcuts.menuNav=Naviga il menu principale +setting.about.shortcuts.menuNav.value=Per navigare nel menu principale premere: 'Ctrl' o 'alt' o 'cmd' con un tasto numerico tra '1-9' + +setting.about.shortcuts.close=Chiudi Bisq +setting.about.shortcuts.close.value=''Ctrl + {0}'' o ''cmd + {0}'' o ''Ctrl + {1}'' o ''cmd + {1}'' + +setting.about.shortcuts.closePopup=Chiudi popup o finestra di dialogo +setting.about.shortcuts.closePopup.value=Tasto 'ESC' + +setting.about.shortcuts.chatSendMsg=Invia messaggio chat al trader +setting.about.shortcuts.chatSendMsg.value=''Ctrl + ENTER'' o ''alt + ENTER'' o ''cmd + ENTER'' + +setting.about.shortcuts.openDispute=Apri disputa +setting.about.shortcuts.openDispute.value=Seleziona lo scambio in sospeso e fai clic: {0} + +setting.about.shortcuts.walletDetails=Apri la finestra dei dettagli del portafoglio + +setting.about.shortcuts.openEmergencyBtcWalletTool=Apri lo strumento portafoglio di emergenza per il portafoglio BTC + +setting.about.shortcuts.openEmergencyBsqWalletTool=Apri lo strumento portafoglio di emergenza per il portafoglio BSQ + +setting.about.shortcuts.showTorLogs=Attiva / disattiva il livello di registro per i messaggi Tor tra DEBUG e WARN + +setting.about.shortcuts.manualPayoutTxWindow=Apri la finestra per il pagamento manuale da una transazione di deposito Multisig 2di2 + +setting.about.shortcuts.reRepublishAllGovernanceData=Ripubblicare i dati di governance DAO (proposte, voti) + +setting.about.shortcuts.removeStuckTrade=Apri il popup per spostare lo scambio bloccato nella scheda degli scambi non riusciti (utilizza solo se ne sei sicuro) +setting.about.shortcuts.removeStuckTrade.value=Seleziona scambio in sospeso e premi: {0} + +setting.about.shortcuts.registerArbitrator=Registra arbitro (solo mediatore/arbitro) +setting.about.shortcuts.registerArbitrator.value=Passare all'account e premere: {0} + +setting.about.shortcuts.registerMediator=Registra mediatore (solo mediatore/arbitro) +setting.about.shortcuts.registerMediator.value=Passare all'account e premere: {0} + +setting.about.shortcuts.openSignPaymentAccountsWindow=Apri la finestra aperta per firnare l'età dell'account (solo arbitri legacy) +setting.about.shortcuts.openSignPaymentAccountsWindow.value=Passare alla visualizzazione dell'arbitro legacy e premere: {0} + +setting.about.shortcuts.sendAlertMsg=Invia avviso o aggiorna messaggio (attività privilegiata) + +setting.about.shortcuts.sendFilter=Imposta Filtro (attività privilegiata) + +setting.about.shortcuts.sendPrivateNotification=Invia notifica privata al peer (attività privilegiata) +setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} + +setting.info.headline=New XMR auto-confirm Feature +setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] +#################################################################### +# Account +#################################################################### + +account.tab.mediatorRegistration=Registrazione del mediatore +account.tab.refundAgentRegistration=Registrazione agente di rimborso +account.tab.signing=Signing +account.info.headline=Benvenuto nel tuo Account Bisq +account.info.msg=Qui puoi aggiungere conti di trading per valute nazionali e altcoin e creare un backup dei tuoi dati di portafoglio e conto.\n\nUn nuovo portafoglio Bitcoin è stato creato la prima volta che hai avviato Bisq.\n\nTi consigliamo vivamente di annotare le parole del seme del portafoglio Bitcoin (vedi la scheda in alto) e prendere in considerazione l'aggiunta di una password prima del finanziamento. I depositi e prelievi di bitcoin sono gestiti nella sezione \"Fondi\".\n\nInformativa sulla privacy e sulla sicurezza: poiché Bisq è un exchange decentralizzato, tutti i tuoi dati vengono conservati sul tuo computer. Non ci sono server, quindi non abbiamo accesso alle tue informazioni personali, ai tuoi fondi o persino al tuo indirizzo IP. Dati come numeri di conto bancario, altcoin e indirizzi Bitcoin, ecc. vengono condivisi con il proprio partner commerciale per adempiere alle negoziazioni avviate (in caso di controversia il mediatore o l'arbitro vedrà gli stessi dati del proprio peer di negoziazione). + +account.menu.paymentAccount=Conti in valuta nazionale +account.menu.altCoinsAccountView=Conti altcoin +account.menu.password=Password portafoglio +account.menu.seedWords=Seme portafoglio +account.menu.backup=Backup +account.menu.notifications=Notifiche + +## TODO should we rename the following to a gereric name? +account.arbitratorRegistration.pubKey=Chiave pubblica + +account.arbitratorRegistration.register=Registrare +account.arbitratorRegistration.registration={0} registrazione +account.arbitratorRegistration.revoke=Revoca +account.arbitratorRegistration.info.msg=Nota che è necessario rimanere disponibili per 15 giorni dopo la revoca poiché potrebbero esserci operazioni che ti utilizzano come {0}. Il periodo massimo di scambio consentito è di 8 giorni e il processo di contestazione potrebbe richiedere fino a 7 giorni. +account.arbitratorRegistration.warn.min1Language=Devi impostare almeno 1 lingua.\nAbbiamo aggiunto la lingua predefinita per te. +account.arbitratorRegistration.removedSuccess=Hai rimosso con successo la tua registrazione dalla rete Bisq. +account.arbitratorRegistration.removedFailed=Impossibile rimuovere la registrazione. {0} +account.arbitratorRegistration.registerSuccess=Ti sei registrato correttamente alla rete Bisq. +account.arbitratorRegistration.registerFailed=Impossibile completare la registrazione. {0} + +account.altcoin.yourAltcoinAccounts=I tuoi conti altcoin +account.altcoin.popup.wallet.msg=Assicurati di seguire i requisiti per l'uso di {0} portafogli come descritto nella pagina web {1}.\nL'uso di portafogli da exchange centralizzati in cui (a) non controlli le tue chiavi o (b) che non usano software di portafoglio compatibile è rischioso: può portare alla perdita dei fondi scambiati!\nIl mediatore o l'arbitro non è uno specialista {2} e non può essere d'aiuto in questi casi. +account.altcoin.popup.wallet.confirm=Capisco e confermo di sapere quale portafoglio devo usare. +# suppress inspection "UnusedProperty" +account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. +# suppress inspection "UnusedProperty" +account.altcoin.popup.arq.msg=Il trading di ARQ su Bisq richiede di comprendere e soddisfare i seguenti requisiti:\n\nPer inviare ARQ, è necessario utilizzare il portafoglio GUI ArQmA ufficiale o il portafoglio CLI ArQmA con il flag store-tx-info abilitato (impostazione predefinita nelle nuove versioni). Assicurati di poter accedere alla chiave tx come sarebbe richiesto in caso di controversia.\narqma-wallet-cli (utilizzare il comando get_tx_key)\narqma-wallet-gui (vai allo storico trnsazioni e fai clic sul pulsante (P) per la prova del pagamento)\n\nNegli explorer di blocchi normali il trasferimento non è verificabile.\n\nÈ necessario fornire al mediatore o all'arbitro i seguenti dati in caso di controversia:\n- La chiave privata tx\n- L'hash della transazione\n- L'indirizzo pubblico del destinatario\n\nIl mancato conferimento dei dati di cui sopra o l'utilizzo di un portafoglio incompatibile comporterà la perdita del caso di contestazione. Il mittente ARQ è responsabile di fornire la verifica del trasferimento ARQ al mediatore o all'arbitro in caso di controversia.\n\nNon è richiesto un ID di pagamento, ma solo il normale indirizzo pubblico.\nSe non si è sicuri di tale processo, visitare il canale discord ArQmA (https://discord.gg/s9BQpJT) o il forum ArQmA (https://labs.arqma.com) per trovare ulteriori informazioni.\n  +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" +account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" +account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" +account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" +account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" +account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" +account.altcoin.popup.drgl.msg=Il trading di Dragonglass su Bisq richiede di comprendere e soddisfare i seguenti requisiti:\n\nA causa della privacy fornita da Dragonglass, una transazione non è verificabile sulla blockchain pubblica. Se necessario, puoi provare il tuo pagamento utilizzando la tua chiave privata TXN.\nLa chiave privata TXN è una chiave una tantum generata automaticamente per ogni transazione a cui è possibile accedere solo dal proprio portafoglio DRGL.\nOppore dalla GUI del wallet DRGL (nella finestra di dialogo dei dettagli della transazione) o dalla semplice interfaccia CLI di Dragonglass (usando il comando "get_tx_key").\n\nPer entrambi è richiesta la versione DRGL 'Oathkeeper' e successive.\n\nIn caso di controversia, è necessario fornire al mediatore o all'arbitro i seguenti dati:\n- La chiave privata TXN\n- L'hash della transazione\n- L'indirizzo pubblico del destinatario\n\nLa verifica del pagamento può essere effettuata utilizzando i dati sopra riportati come input su (http://drgl.info/#check_txn).\n\nIl mancato conferimento dei dati di cui sopra o l'utilizzo di un portafoglio incompatibile comporterà la perdita del caso di disputa. Il mittente Dragonglass è responsabile di fornire la verifica del trasferimento DRGL al mediatore o all'arbitro in caso di controversia. L'uso di PaymentID non è richiesto.\n\nIn caso di dubbi su qualsiasi parte di questo processo, visitare Dragonglass su Discord (http://discord.drgl.info) per assistenza.\n  +# suppress inspection "UnusedProperty" +account.altcoin.popup.ZEC.msg=Quando si utilizza Zcash è possibile utilizzare solo gli indirizzi trasparenti (a partire da t), non gli indirizzi z (privati), poiché il mediatore o l'arbitro non sarebbero in grado di verificare la transazione con gli indirizzi z. +# suppress inspection "UnusedProperty" +account.altcoin.popup.XZC.msg=Quando si utilizza Zcoin è possibile utilizzare solo gli indirizzi trasparenti (tracciabili), non quelli non rintracciabili, poiché il mediatore o l'arbitro non sarebbero in grado di verificare la transazione con indirizzi non rintracciabili in un explorer di blocchi. +# suppress inspection "UnusedProperty" +account.altcoin.popup.grin.msg=GRIN richiede un processo interattivo tra il mittente e il destinatario per creare la transazione. Assicurati di seguire le istruzioni dalla pagina web del progetto GRIN per inviare e ricevere in modo affidabile GRIN (il ricevitore deve essere online o almeno essere online durante un certo periodo di tempo).\n\nBisq supporta solo il formato URL del portafoglio Grinbox (Wallet713).\n\nIl mittente GRIN è tenuto a dimostrare di aver inviato GRIN correttamente. Se il portafoglio non è in grado di fornire tale prova, una potenziale disputa verrà risolta a favore del destinatario GRIN. Assicurati di utilizzare il software Grinbox più recente che supporti la prova delle transazioni e di comprendere il processo di trasferimento e ricezione di GRIN e come creare la prova.\n\nVedi https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only per ulteriori informazioni sullo strumento Grinbox proof. +# suppress inspection "UnusedProperty" +account.altcoin.popup.beam.msg=BEAM richiede un processo interattivo tra il mittente e il destinatario per creare la transazione.\n\nAssicurati di seguire le istruzioni dalla pagina web del progetto BEAM per inviare e ricevere in modo affidabile BEAM (il ricevitore deve essere online o almeno essere online durante un certo periodo di tempo).\n\nIl mittente BEAM è tenuto a fornire la prova di aver inviato BEAM correttamente. Assicurati di utilizzare il software del portafoglio che può produrre tale prova. Se il portafoglio non è in grado di fornire la prova, una potenziale disputa verrà risolta a favore del destinatario BEAM. +# suppress inspection "UnusedProperty" +account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). + +# suppress inspection "UnusedProperty" +account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash. + +# suppress inspection "UnusedProperty" +account.altcoin.popup.liquidbitcoin.msg=Il trading di L-BTC su Bisq richiede la comprensione di quanto segue:\n\nQuando ricevi L-BTC per uno scambio su Bisq, non puoi utilizzare l'applicazione mobile Blockstream Green Wallet o un portafoglio di custodia/scambio. Devi ricevere L-BTC solo nel portafoglio Liquid Elements Core o in un altro portafoglio L-BTC che ti consenta di ottenere la chiave per il tuo indirizzo L-BTC.\n\nNel caso in cui sia necessaria la mediazione o in caso di disputa nello scambio, è necessario divulgare la chiave di ricezione per il proprio indirizzo L-BTC al mediatore Bisq o all'agente di rimborso in modo che possano verificare i dettagli della propria Transazione riservata sul proprio full node Elements Core.\n\nLa mancata fornitura delle informazioni richieste dal mediatore o dall'agente di rimborso comporterà la perdita della disputa. In tutti i casi di disputa, il ricevente L-BTC si assume al 100% l'onere della responsabilità nel fornire prove crittografiche al mediatore o all'agente di rimborso.\n\nSe non comprendi i sopracitati requisiti, non scambiare L-BTC su Bisq. + +account.fiat.yourFiatAccounts=I tuoi conti in valuta nazionale + +account.backup.title=Portafoglio di backup +account.backup.location=Posizione di backup +account.backup.selectLocation=Seleziona la posizione di backup +account.backup.backupNow=Esegui il backup ora (il backup non è crittografato!) +account.backup.appDir=Cartella dei dati dell'applicazione +account.backup.openDirectory=Apri cartella +account.backup.openLogFile=Apri il file di registro +account.backup.success=Backup salvato correttamente in:\n{0} +account.backup.directoryNotAccessible=La cartella che hai scelto non è accessibile. {0} + +account.password.removePw.button=Rimuovi password +account.password.removePw.headline=Rimuovi la protezione con password per il portafoglio +account.password.setPw.button=Imposta password +account.password.setPw.headline=Imposta la protezione con password per il portafoglio +account.password.info=Con la protezione con password dovrai inserire la password all'avvio dell'applicazione, quando ritiri bitcoin dal tuo portafoglio e quando ripristini il tuo portafoglio dalle parole chiave. + +account.seed.backup.title=Effettua il backup delle parole del seed dei tuoi portafogli +account.seed.info=Si prega di scrivere sia le parole del seed del portafoglio che la data! Puoi recuperare il tuo portafoglio in qualsiasi momento con le parole del seed e la data.\nLe stesse parole del seed vengono utilizzate per il portafoglio BTC e BSQ.\n\nDovresti scrivere le parole del seed su un foglio di carta. Non salvarli sul tuo computer.\n\nSi noti che le parole del seed NON sostituiscono un backup.\nÈ necessario creare un backup dell'intera directory dell'applicazione dalla schermata \"Account/Backup\" per ripristinare lo stato e i dati dell'applicazione.\nL'importazione delle parole del seed è consigliata solo in casi di emergenza. L'applicazione non funzionerà senza un corretto backup dei file del database e delle chiavi del seed! +account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. +account.seed.warn.noPw.msg=Non hai impostato una password per il portafoglio che protegga la visualizzazione delle parole del seed.\n\nVuoi visualizzare le parole del seed? +account.seed.warn.noPw.yes=Sì, e non chiedermelo più +account.seed.enterPw=Immettere la password per visualizzare le parole chiave +account.seed.restore.info=Effettuare un backup prima di cominciare il ripristino dalle parole del seed. Tenere presente che il ripristino del portafoglio è solo per casi di emergenza e potrebbe causare problemi con il database del portafoglio interno.\nNon è un modo per effettuare un backup! Utilizzare un backup della directory dei dati dell'applicazione per ripristinare uno stato dell'applicazione precedente.\n\nDopo aver ripristinato, l'applicazione si spegnerà automaticamente. Dopo aver riavviato l'applicazione, si risincronizzerà con la rete Bitcoin. Questo può richiedere del tempo e può consumare molta CPU, soprattutto se il portafoglio era vecchio e aveva molte transazioni. Evita di interrompere tale processo, altrimenti potrebbe essere necessario eliminare nuovamente il file della catena SPV o ripetere il processo di ripristino. +account.seed.restore.ok=Ok, fai il ripristino e spegni Bisq + + +#################################################################### +# Mobile notifications +#################################################################### + +account.notifications.setup.title=Setup +account.notifications.download.label=Scarica app mobile +account.notifications.waitingForWebCam=In attesa della webcam... +account.notifications.webCamWindow.headline=Scansiona il codice QR dal telefono +account.notifications.webcam.label=Utilizza webcam +account.notifications.webcam.button=Scansiona il codice QR +account.notifications.noWebcam.button=Non ho una webcam +account.notifications.erase.label=Cancella notifiche sul telefono +account.notifications.erase.title=Cancella notifiche +account.notifications.email.label=Token di associazione +account.notifications.email.prompt=Inserisci il token di associazione che hai ricevuto via e-mail +account.notifications.settings.title=Impostazioni +account.notifications.useSound.label=Riproduci l'audio di notifica sul telefono +account.notifications.trade.label=Ricevi messaggi commerciali +account.notifications.market.label=Ricevi avvisi sulle offerte +account.notifications.price.label=Ricevi avvisi sui prezzi +account.notifications.priceAlert.title=Avvisi sui prezzi +account.notifications.priceAlert.high.label=Notifica se il prezzo BTC è superiore +account.notifications.priceAlert.low.label=Notifica se il prezzo BTC è inferiore +account.notifications.priceAlert.setButton=Imposta un avviso di prezzo +account.notifications.priceAlert.removeButton=Rimuovi avviso di prezzo +account.notifications.trade.message.title=Lo stato dello scambio è cambiato +account.notifications.trade.message.msg.conf=La transazione di deposito per lo scambio con ID {0} è confermata. Si prega di aprire l'applicazione Bisq e avviare il pagamento. +account.notifications.trade.message.msg.started=L'acquirente BTC ha avviato il pagamento per lo scambio con ID {0}. +account.notifications.trade.message.msg.completed=Lo scambio con ID {0} è completato. +account.notifications.offer.message.title=La tua offerta è stata presa +account.notifications.offer.message.msg=La tua offerta con ID {0} è stata accettata +account.notifications.dispute.message.title=Nuovo messaggio di contestazione +account.notifications.dispute.message.msg=Hai ricevuto un messaggio di contestazione per lo scambio con ID {0} + +account.notifications.marketAlert.title=Offri avvisi +account.notifications.marketAlert.selectPaymentAccount=Offre un account di pagamento corrispondente +account.notifications.marketAlert.offerType.label=Tipo di offerta che mi interessa +account.notifications.marketAlert.offerType.buy=Acquista offerte (voglio vendere BTC) +account.notifications.marketAlert.offerType.sell=Offerte di vendita (Voglio comprare BTC) +account.notifications.marketAlert.trigger=Distanza prezzo offerta (%) +account.notifications.marketAlert.trigger.info=Con una distanza di prezzo impostata, riceverai un avviso solo quando viene pubblicata un'offerta che soddisfa (o supera) i tuoi requisiti. Esempio: vuoi vendere BTC, ma venderai solo con un premio del 2% dal prezzo di mercato attuale. Se si imposta questo campo su 2%, si riceveranno avvisi solo per offerte con prezzi superiori del 2% (o più) dal prezzo di mercato corrente.\n  +account.notifications.marketAlert.trigger.prompt=Distanza percentuale dal prezzo di mercato (ad es. 2,50%, -0,50%, ecc.) +account.notifications.marketAlert.addButton=Aggiungi avviso offerta +account.notifications.marketAlert.manageAlertsButton=Gestisci avvisi di offerta +account.notifications.marketAlert.manageAlerts.title=Gestisci avvisi di offerta +account.notifications.marketAlert.manageAlerts.header.paymentAccount=Conto di Pagamento +account.notifications.marketAlert.manageAlerts.header.trigger=Prezzo di attivazione +account.notifications.marketAlert.manageAlerts.header.offerType=Tipo di offerta +account.notifications.marketAlert.message.title=Avviso di offerta +account.notifications.marketAlert.message.msg.below=sotto +account.notifications.marketAlert.message.msg.above=sopra +account.notifications.marketAlert.message.msg=Una nuova ''{0} {1}'' offerta con prezzo {2} ({3} {4} prezzo di mercato) e metodo di pagamento ''{5}'' è stata pubblicata sulla pagina delle offerte Bisq.\nID offerta: {6}. +account.notifications.priceAlert.message.title=Avviso di prezzo per {0} +account.notifications.priceAlert.message.msg=Il tuo avviso di prezzo è stato attivato. L'attuale prezzo {0} è {1} {2} +account.notifications.noWebCamFound.warning=Nessuna webcam trovata.\n\nUtilizzare l'opzione e-mail per inviare il token e la chiave di crittografia dal telefono cellulare all'applicazione Bisq. +account.notifications.priceAlert.warning.highPriceTooLow=Il prezzo più alto deve essere maggiore del prezzo più basso. +account.notifications.priceAlert.warning.lowerPriceTooHigh=Il prezzo più basso deve essere inferiore al prezzo più alto. + + + + +#################################################################### +# DAO +#################################################################### + +dao.tab.factsAndFigures=Fatti e cifre +dao.tab.bsqWallet=Portafoglio BSQ +dao.tab.proposals=Governance +dao.tab.bonding=Bonding +dao.tab.proofOfBurn=Commissione di quotazione delle attività/Proof of burn +dao.tab.monitor=Monitor di rete +dao.tab.news=Notizie + +dao.paidWithBsq=pagato con BSQ +dao.availableBsqBalance=Disponibile per la spesa (verificati + output di resti non confermati) +dao.verifiedBsqBalance=Saldo di tutte le UTXO verificate +dao.unconfirmedChangeBalance=Saldo di tutte gli output di resto non confermati +dao.unverifiedBsqBalance=Saldo di tutte le transazioni non verificate (in attesa di conferma del blocco) +dao.lockedForVoteBalance=Utilizzato per il voto +dao.lockedInBonds=Bloccati in bond +dao.availableNonBsqBalance=Saldo disponibile non-BSQ (BTC) +dao.reputationBalance=Valore di merito (non spendibile) + +dao.tx.published.success=La tua transazione è stata pubblicata con successo. +dao.proposal.menuItem.make=Fai una proposta +dao.proposal.menuItem.browse=Sfoglia le proposte aperte +dao.proposal.menuItem.vote=Vota le proposte +dao.proposal.menuItem.result=Risultati del voto +dao.cycle.headline=Ciclo di votazione +dao.cycle.overview.headline=Panoramica del ciclo di votazione +dao.cycle.currentPhase=Fase attuale +dao.cycle.currentBlockHeight=Altezza attuale del blocco +dao.cycle.proposal=Fase della proposta +dao.cycle.proposal.next=Prossima fase della proposta +dao.cycle.blindVote=Fase di voto alla cieca +dao.cycle.voteReveal=Fase di rivelazione dei voti +dao.cycle.voteResult=Risultato del voto +dao.cycle.phaseDuration={0} blocchi (≈{1}); Blocco {2} - {3} (≈{4} - ≈{5}) +dao.cycle.phaseDurationWithoutBlocks=Blocco {0} - {1} (≈{2} - ≈{3}) + +dao.voteReveal.txPublished.headLine=Transazione del voto di rivelazione pubblicata +dao.voteReveal.txPublished=Il tuo voto ha rivelato che la transazione con identificativo transazione {0} è stata pubblicata correttamente.\n\nCiò accade automaticamente, attraverso il software, se hai partecipato al voto DAO. + +dao.results.cycles.header=Cicli +dao.results.cycles.table.header.cycle=Ciclo +dao.results.cycles.table.header.numProposals=Proposte +dao.results.cycles.table.header.voteWeight=Peso del voto +dao.results.cycles.table.header.issuance=Emissione + +dao.results.results.table.item.cycle=Ciclo {0} avviato: {1} + +dao.results.proposals.header=Proposte del ciclo selezionato +dao.results.proposals.table.header.nameLink=Nome/link +dao.results.proposals.table.header.details=Dettagli +dao.results.proposals.table.header.myVote=Il mio voto +dao.results.proposals.table.header.result=Risultato del voto +dao.results.proposals.table.header.threshold=Soglia +dao.results.proposals.table.header.quorum=Quorum + +dao.results.proposals.voting.detail.header=Risultati del voto per la proposta selezionata + +dao.results.exceptions=Eccezioni del risultato del voto + +# suppress inspection "UnusedProperty" +dao.param.UNDEFINED=Non definito + +# suppress inspection "UnusedProperty" +dao.param.DEFAULT_MAKER_FEE_BSQ=Commissione maker BSQ +# suppress inspection "UnusedProperty" +dao.param.DEFAULT_TAKER_FEE_BSQ=Commissione taker BSQ +# suppress inspection "UnusedProperty" +dao.param.MIN_MAKER_FEE_BSQ=Commissione in BSQ minima per il maker +# suppress inspection "UnusedProperty" +dao.param.MIN_TAKER_FEE_BSQ=Commissione in BSQ minima per il taker +# suppress inspection "UnusedProperty" +dao.param.DEFAULT_MAKER_FEE_BTC=Commissione maker BTC +# suppress inspection "UnusedProperty" +dao.param.DEFAULT_TAKER_FEE_BTC=Commissione taker BTC +# suppress inspection "UnusedProperty" +# suppress inspection "UnusedProperty" +dao.param.MIN_MAKER_FEE_BTC=Commissione in BTC minima per il maker +# suppress inspection "UnusedProperty" +dao.param.MIN_TAKER_FEE_BTC=Commissione in BSQ minima per il taker +# suppress inspection "UnusedProperty" + +# suppress inspection "UnusedProperty" +dao.param.PROPOSAL_FEE=Commissione di proposta in BSQ +# suppress inspection "UnusedProperty" +dao.param.BLIND_VOTE_FEE=Commissione di voto in BSQ + +# suppress inspection "UnusedProperty" +dao.param.COMPENSATION_REQUEST_MIN_AMOUNT=Richiesta di compenso min. importo BSQ +# suppress inspection "UnusedProperty" +dao.param.COMPENSATION_REQUEST_MAX_AMOUNT=Richiesta di compenso max. importo BSQ +# suppress inspection "UnusedProperty" +dao.param.REIMBURSEMENT_MIN_AMOUNT=Richiesta di rimborso min. importo BSQ +# suppress inspection "UnusedProperty" +dao.param.REIMBURSEMENT_MAX_AMOUNT=Richiesta di rimborso max. importo BSQ + +# suppress inspection "UnusedProperty" +dao.param.QUORUM_GENERIC=Quorum richiesto in BSQ per proposta generica +# suppress inspection "UnusedProperty" +dao.param.QUORUM_COMP_REQUEST=Quorum richiesto in BSQ per la richiesta di compenso +# suppress inspection "UnusedProperty" +dao.param.QUORUM_REIMBURSEMENT=Quorum richiesto in BSQ per la richiesta di rimborso +# suppress inspection "UnusedProperty" +dao.param.QUORUM_CHANGE_PARAM=Quorum richiesto in BSQ per la modifica di un parametro +# suppress inspection "UnusedProperty" +dao.param.QUORUM_REMOVE_ASSET=Quorum richiesto in BSQ per la rimozione di un asset +# suppress inspection "UnusedProperty" +dao.param.QUORUM_CONFISCATION=Quorum richiesto in BSQ per una richiesta di confisca +# suppress inspection "UnusedProperty" +dao.param.QUORUM_ROLE=Quorum richiesto in BSQ per le proposte di ruoli vincolati + +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_GENERIC=Soglia richiesta in% per la proposta generica +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_COMP_REQUEST=Soglia richiesta in% per la richiesta di compenso +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_REIMBURSEMENT=Soglia richiesta in% per la richiesta di rimborso +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_CHANGE_PARAM=Soglia richiesta in% per modificare un parametro +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_REMOVE_ASSET=Soglia obbligatoria in% per la rimozione di un asset +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_CONFISCATION=Soglia richiesta in% per una richiesta di confisca +# suppress inspection "UnusedProperty" +dao.param.THRESHOLD_ROLE=Soglia richiesta in % per le proposte di ruolo vincolati + +# suppress inspection "UnusedProperty" +dao.param.RECIPIENT_BTC_ADDRESS=Indirizzo BTC del destinatario + +# suppress inspection "UnusedProperty" +dao.param.ASSET_LISTING_FEE_PER_DAY=Commissione di quotazione giornaliera degli asset +# suppress inspection "UnusedProperty" +dao.param.ASSET_MIN_VOLUME=Volume di scambi minimo degli asset + +# suppress inspection "UnusedProperty" +dao.param.LOCK_TIME_TRADE_PAYOUT=Tempo di blocco per pagamento alternativo di scambio tx +# suppress inspection "UnusedProperty" +dao.param.ARBITRATOR_FEE=Commissione arbitrale in BTC + +# suppress inspection "UnusedProperty" +dao.param.MAX_TRADE_LIMIT=Limite di scambio massimo in BTC + +# suppress inspection "UnusedProperty" +dao.param.BONDED_ROLE_FACTOR=Ruolo legato all’unità di fattore in BSQ +# suppress inspection "UnusedProperty" +dao.param.ISSUANCE_LIMIT=Limite di emissione per ciclo in BSQ + +dao.param.currentValue=Valore corrente: {0} +dao.param.currentAndPastValue=Valore corrente: {0} (valore al momento della proposta: {1}) +dao.param.blocks={0} blocchi + +dao.results.invalidVotes=Abbiamo avuto voti non validi in quel ciclo di votazione. Ciò può accadere se un voto non è stato distribuito bene nella rete Bisq.\n{0} + +# suppress inspection "UnusedProperty" +dao.phase.PHASE_UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.phase.PHASE_PROPOSAL=Fase della proposta +# suppress inspection "UnusedProperty" +dao.phase.PHASE_BREAK1=Pausa 1 +# suppress inspection "UnusedProperty" +dao.phase.PHASE_BLIND_VOTE=Fase di voto alla cieca +# suppress inspection "UnusedProperty" +dao.phase.PHASE_BREAK2=Pausa 2 +# suppress inspection "UnusedProperty" +dao.phase.PHASE_VOTE_REVEAL=Fase di rivelazione dei voti +# suppress inspection "UnusedProperty" +dao.phase.PHASE_BREAK3=Pausa 3 +# suppress inspection "UnusedProperty" +dao.phase.PHASE_RESULT=Fase del risultato + +dao.results.votes.table.header.stakeAndMerit=Peso del voto +dao.results.votes.table.header.stake=Stake +dao.results.votes.table.header.merit=Guadagnato +dao.results.votes.table.header.vote=Votazione + +dao.bond.menuItem.bondedRoles=Ruoli vincolati +dao.bond.menuItem.reputation=Reputazione vincolata +dao.bond.menuItem.bonds=Bond + +dao.bond.dashboard.bondsHeadline=BSQ vincolati +dao.bond.dashboard.lockupAmount=Fondi bloccati +dao.bond.dashboard.unlockingAmount=Sblocco fondi (attendere fino al termine del tempo di blocco) + + +dao.bond.reputation.header=Blocca un deposito per la reputazione +dao.bond.reputation.table.header=I miei vincoli di reputazione +dao.bond.reputation.amount=Quantità di BSQ da bloccare +dao.bond.reputation.time=Tempo di sblocco in blocchi +dao.bond.reputation.salt=Sale +dao.bond.reputation.hash=Hash +dao.bond.reputation.lockupButton=Blocco +dao.bond.reputation.lockup.headline=Conferma transazione di blocco +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? +dao.bond.reputation.unlock.headline=Conferma transazione di sblocco +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? + +dao.bond.allBonds.header=Tutti bond + +dao.bond.bondedReputation=Reputazione Vincolata +dao.bond.bondedRoles=Ruoli vincolati + +dao.bond.details.header=Dettagli ruolo +dao.bond.details.role=Ruolo +dao.bond.details.requiredBond=Bond in BSQ richiesto +dao.bond.details.unlockTime=Tempo di sblocco in blocchi +dao.bond.details.link=Link alla descrizione del ruolo +dao.bond.details.isSingleton=Può essere assunto da più detentori di ruoli +dao.bond.details.blocks={0} blocchi + +dao.bond.table.column.name=Nome +dao.bond.table.column.link=Link +dao.bond.table.column.bondType=Tipo di bond +dao.bond.table.column.details=Dettagli +dao.bond.table.column.lockupTxId=ID Tx di blocco +dao.bond.table.column.bondState=Stato bond +dao.bond.table.column.lockTime=Tempo di sblocco +dao.bond.table.column.lockupDate=Data di blocco + +dao.bond.table.button.lockup=Blocco +dao.bond.table.button.unlock=Sbocca +dao.bond.table.button.revoke=Revoca + +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.bond.bondState.READY_FOR_LOCKUP=Non ancora legato +# suppress inspection "UnusedProperty" +dao.bond.bondState.LOCKUP_TX_PENDING=Blocco in sospeso +# suppress inspection "UnusedProperty" +dao.bond.bondState.LOCKUP_TX_CONFIRMED=Bond bloccato +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNLOCK_TX_PENDING=Sblocco in sospeso +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNLOCK_TX_CONFIRMED=Tx di sblocco confermata +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNLOCKING=Sbloccando il bond +# suppress inspection "UnusedProperty" +dao.bond.bondState.UNLOCKED=Bond bloccato +# suppress inspection "UnusedProperty" +dao.bond.bondState.CONFISCATED=Bond confiscato + +# suppress inspection "UnusedProperty" +dao.bond.lockupReason.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.bond.lockupReason.BONDED_ROLE=Ruolo vincolato +# suppress inspection "UnusedProperty" +dao.bond.lockupReason.REPUTATION=Reputazione vincolata + +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.GITHUB_ADMIN=Admin GitHub +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.FORUM_ADMIN=Admin forum +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.TWITTER_ADMIN=Admin Twitter +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.ROCKET_CHAT_ADMIN=Keybase admin +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.YOUTUBE_ADMIN=Admin YouTube +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BISQ_MAINTAINER=Maintainer Bisq +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BITCOINJ_MAINTAINER=Maintainer BitcoinJ-fork +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.NETLAYER_MAINTAINER=Maintainer Netlayer +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.WEBSITE_OPERATOR=Operatore sito web +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.FORUM_OPERATOR=Operatore forum +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.SEED_NODE_OPERATOR=Operatore nodo seme +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.DATA_RELAY_NODE_OPERATOR=Operatore nodo prezzi +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BTC_NODE_OPERATOR=Operatore nodo Bitcoin +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.MARKETS_OPERATOR=Operatore mercati +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BSQ_EXPLORER_OPERATOR=Explorer operator +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.MOBILE_NOTIFICATIONS_RELAY_OPERATOR=Operatore di inoltro delle notifiche mobile +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.DOMAIN_NAME_HOLDER=Titolare del nome di dominio +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.DNS_ADMIN=Admin DNS +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.MEDIATOR=Mediatore +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.ARBITRATOR=Arbitro +# suppress inspection "UnusedProperty" +dao.bond.bondedRoleType.BTC_DONATION_ADDRESS_OWNER=Proprietario dell'indirizzo di donazione BTC + +dao.burnBsq.assetFee=Listaggio asset +dao.burnBsq.menuItem.assetFee=Commissione listing dell'asset +dao.burnBsq.menuItem.proofOfBurn=Proof of burn +dao.burnBsq.header=Commissione per listaggio asset +dao.burnBsq.selectAsset=Seleziona Asset +dao.burnBsq.fee=Commissione +dao.burnBsq.trialPeriod=Periodo di prova +dao.burnBsq.payFee=Paga commissione +dao.burnBsq.allAssets=Tutti gli asset +dao.burnBsq.assets.nameAndCode=Nome asset +dao.burnBsq.assets.state=Stato +dao.burnBsq.assets.tradeVolume=Volume di scambio +dao.burnBsq.assets.lookBackPeriod=Periodo di verifica +dao.burnBsq.assets.trialFee=Commissione per il periodo di prova +dao.burnBsq.assets.totalFee=Commissioni totali pagate +dao.burnBsq.assets.days={0} giorni +dao.burnBsq.assets.toFewDays=La commissione è troppo bassa. Il numero minimo di giorni per il periodo di prova è {0}. + +# suppress inspection "UnusedProperty" +dao.assetState.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.assetState.IN_TRIAL_PERIOD=Nel periodo di prova +# suppress inspection "UnusedProperty" +dao.assetState.ACTIVELY_TRADED=Scambiato attivamente +# suppress inspection "UnusedProperty" +dao.assetState.DE_LISTED=De-listato per inattività +# suppress inspection "UnusedProperty" +dao.assetState.REMOVED_BY_VOTING=Rimosso votando + +dao.proofOfBurn.header=Proof of burn +dao.proofOfBurn.amount=Importo +dao.proofOfBurn.preImage=Pre-immagine +dao.proofOfBurn.burn=Burn +dao.proofOfBurn.allTxs=Tutte le transazioni proof of burn +dao.proofOfBurn.myItems=Le mie transazioni proof of burn +dao.proofOfBurn.date=Data +dao.proofOfBurn.hash=Hash +dao.proofOfBurn.txs=Transazioni +dao.proofOfBurn.pubKey=Pubkey +dao.proofOfBurn.signature.window.title=Firma un messaggio con la chiave dalla transazione proof of burn +dao.proofOfBurn.verify.window.title=Verifica un messaggio con la chiave dalla transazione proof of burn +dao.proofOfBurn.copySig=Copia la firma negli appunti +dao.proofOfBurn.sign=Firma +dao.proofOfBurn.message=Messaggio +dao.proofOfBurn.sig=Firma +dao.proofOfBurn.verify=Verifica +dao.proofOfBurn.verificationResult.ok=Verifica riuscita +dao.proofOfBurn.verificationResult.failed=Verifica fallita + +# suppress inspection "UnusedProperty" +dao.phase.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.phase.PROPOSAL=Fase della proposta +# suppress inspection "UnusedProperty" +dao.phase.BREAK1=Pausa prima della fase di voto alla cieca +# suppress inspection "UnusedProperty" +dao.phase.BLIND_VOTE=Fase di voto alla cieca +# suppress inspection "UnusedProperty" +dao.phase.BREAK2=Pausa prima della fase di rivelazione dei voti +# suppress inspection "UnusedProperty" +dao.phase.VOTE_REVEAL=Fase di rivelazione dei voti +# suppress inspection "UnusedProperty" +dao.phase.BREAK3=Pausa prima della fase del risultato +# suppress inspection "UnusedProperty" +dao.phase.RESULT=Fase del risultato della votazione + +# suppress inspection "UnusedProperty" +dao.phase.separatedPhaseBar.PROPOSAL=Fase della proposta +# suppress inspection "UnusedProperty" +dao.phase.separatedPhaseBar.BLIND_VOTE=Voto cieco +# suppress inspection "UnusedProperty" +dao.phase.separatedPhaseBar.VOTE_REVEAL=Rivelazione voto +# suppress inspection "UnusedProperty" +dao.phase.separatedPhaseBar.RESULT=Risultato del voto + +# suppress inspection "UnusedProperty" +dao.proposal.type.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.proposal.type.COMPENSATION_REQUEST=Richiesta di compenso +# suppress inspection "UnusedProperty" +dao.proposal.type.REIMBURSEMENT_REQUEST=Richiesta di rimborso +# suppress inspection "UnusedProperty" +dao.proposal.type.BONDED_ROLE=Proposta per un ruolo vincolato +# suppress inspection "UnusedProperty" +dao.proposal.type.REMOVE_ASSET=Proposta per la rimozione di un asset +# suppress inspection "UnusedProperty" +dao.proposal.type.CHANGE_PARAM=Proposta di modifica di un parametro +# suppress inspection "UnusedProperty" +dao.proposal.type.GENERIC=Proposta generica +# suppress inspection "UnusedProperty" +dao.proposal.type.CONFISCATE_BOND=Proposta di confisca di un bond + +# suppress inspection "UnusedProperty" +dao.proposal.type.short.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.proposal.type.short.COMPENSATION_REQUEST=Richiesta di compenso +# suppress inspection "UnusedProperty" +dao.proposal.type.short.REIMBURSEMENT_REQUEST=Richiesta di rimborso +# suppress inspection "UnusedProperty" +dao.proposal.type.short.BONDED_ROLE=Ruolo bloccato +# suppress inspection "UnusedProperty" +dao.proposal.type.short.REMOVE_ASSET=Rimuovere un altcoin +# suppress inspection "UnusedProperty" +dao.proposal.type.short.CHANGE_PARAM=Cambiare un parametro +# suppress inspection "UnusedProperty" +dao.proposal.type.short.GENERIC=Proposta generica +# suppress inspection "UnusedProperty" +dao.proposal.type.short.CONFISCATE_BOND=Confiscare un bond + +dao.proposal.details=Dettagli della proposta +dao.proposal.selectedProposal=Proposta selezionata +dao.proposal.active.header=Proposte del ciclo attuale +dao.proposal.active.remove.confirm=Sei sicuro di voler rimuovere questa proposta?\nLa commissione di proposta già pagata verrà persa. +dao.proposal.active.remove.doRemove=Sì, rimuovi la mia proposta +dao.proposal.active.remove.failed=Impossibile rimuovere la proposta. +dao.proposal.myVote.title=Voto +dao.proposal.myVote.accept=Accetta la proposta +dao.proposal.myVote.reject=Rifiuta la proposta +dao.proposal.myVote.removeMyVote=Ignora la proposta +dao.proposal.myVote.merit=Peso del voto dai BSQ guadagnati +dao.proposal.myVote.stake=Peso del voto dallo stake +dao.proposal.myVote.revealTxId=ID transazione di rivelazione del voto +dao.proposal.myVote.stake.prompt=Valore massimo disponibile per la votazione: {0} +dao.proposal.votes.header=Imposta il valore per la votazione e pubblica i tuoi voti +dao.proposal.myVote.button=Pubblica voti +dao.proposal.myVote.setStake.description=Dopo aver votato su tutte le proposte devi impostare your stake per il voto bloccando BSQ. Più BSQ bloccati, più peso avrà il tuo voto.\n\nI BSQ bloccati per il voto verranno nuovamente sbloccati durante la fase di rivelazione del voto. +dao.proposal.create.selectProposalType=Seleziona il tipo di proposta +dao.proposal.create.phase.inactive=Attendere fino alla fase della proposta successiva +dao.proposal.create.proposalType=Tipo di proposta +dao.proposal.create.new=Fai una nuova proposta +dao.proposal.create.button=Fai una proposta +dao.proposal.create.publish=Pubblica proposta +dao.proposal.create.publishing=La pubblicazione della proposta è in corso ... +dao.proposal=proposta +dao.proposal.display.type=Tipo di proposta +dao.proposal.display.name=Nome utente GitHub esatto +dao.proposal.display.link=Link a informazioni dettagliate +dao.proposal.display.link.prompt=Link alla proposta +dao.proposal.display.requestedBsq=Importo richiesto in BSQ +dao.proposal.display.txId=ID transazione proposta +dao.proposal.display.proposalFee=Commissione proposta +dao.proposal.display.myVote=Il mio voto +dao.proposal.display.voteResult=Riepilogo dei risultati della votazione +dao.proposal.display.bondedRoleComboBox.label=Tipo di ruolo vincolato +dao.proposal.display.requiredBondForRole.label=Obbligazione richiesta per ruolo +dao.proposal.display.option=Opzione + +dao.proposal.table.header.proposalType=Tipo di proposta +dao.proposal.table.header.link=Link +dao.proposal.table.header.myVote=Il mio voto +# suppress inspection "UnusedProperty" +dao.proposal.table.header.remove=Rimuovi +dao.proposal.table.icon.tooltip.removeProposal=Rimuovi la mia proposta +dao.proposal.table.icon.tooltip.changeVote=Voto attuale: ''{0}''. Cambia voto in: ''{1}'' + +dao.proposal.display.myVote.accepted=Accettato +dao.proposal.display.myVote.rejected=Respinto +dao.proposal.display.myVote.ignored=Ignorato +dao.proposal.display.myVote.unCounted=Il voto non è stato incluso nel risultato +dao.proposal.myVote.summary=Votato: {0}; Peso del voto: {1} (guadagnato: {2} + stake: {3}) {4} +dao.proposal.myVote.invalid=Il voto non è valido + +dao.proposal.voteResult.success=Accettato +dao.proposal.voteResult.failed=Respinto +dao.proposal.voteResult.summary=Risultato: {0}; Soglia: {1} (richiesto> {2}); Quorum: {3} (richiesto> {4}) + +dao.proposal.display.paramComboBox.label=Seleziona il parametro da modificare +dao.proposal.display.paramValue=Valore del parametro + +dao.proposal.display.confiscateBondComboBox.label=Scegli bond +dao.proposal.display.assetComboBox.label=Asset da rimuovere + +dao.blindVote=voto cieco + +dao.blindVote.startPublishing=Pubblicando la transazione di voto alla cieca... +dao.blindVote.success=La tua transazione di voto alla cieca è stata pubblicata con successo.\n\nSi noti che è necessario essere online nella fase di rivelazione dei voti in modo che la propria applicazione Bisq possa pubblicare la transazione di rivelazione del voto. Senza la transazione di rivelazione del voto, il tuo voto non sarebbe valido! + +dao.wallet.menuItem.send=Invia +dao.wallet.menuItem.receive=Ricevi +dao.wallet.menuItem.transactions=Transazioni + +dao.wallet.dashboard.myBalance=Saldo del mio portafoglio + +dao.wallet.receive.fundYourWallet=Il tuo indirizzo di ricezione BSQ +dao.wallet.receive.bsqAddress=Indirizzo del portafoglio BSQ (Indirizzo non ancora utilizzato) + +dao.wallet.send.sendFunds=Invia fondi +dao.wallet.send.sendBtcFunds=Invia fondi non BSQ (BTC) +dao.wallet.send.amount=Importo in BSQ +dao.wallet.send.btcAmount=Importo in BTC (fondi non BSQ) +dao.wallet.send.setAmount=Imposta l'importo da prelevare (l'importo minimo è {0}) +dao.wallet.send.receiverAddress=Indirizzo BSQ del destinatario +dao.wallet.send.receiverBtcAddress=Indirizzo BTC del destinatario +dao.wallet.send.setDestinationAddress=Inserisci il tuo indirizzo di destinazione +dao.wallet.send.send=Invia fondi BSQ +dao.wallet.send.sendBtc=Invia fondi BTC +dao.wallet.send.sendFunds.headline=Conferma richiesta di prelievo +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? +dao.wallet.chainHeightSynced=Ultimo blocco verificato: {0} +dao.wallet.chainHeightSyncing=In attesa di blocchi... Verificati {0} blocchi su {1} +dao.wallet.tx.type=Tipo + +# suppress inspection "UnusedProperty" +dao.tx.type.enum.UNDEFINED=Non definito +# suppress inspection "UnusedProperty" +dao.tx.type.enum.UNDEFINED_TX_TYPE=Non riconosciuto +# suppress inspection "UnusedProperty" +dao.tx.type.enum.UNVERIFIED=Transazione BSQ non verificata +# suppress inspection "UnusedProperty" +dao.tx.type.enum.INVALID=Transazione BSQ non valida +# suppress inspection "UnusedProperty" +dao.tx.type.enum.GENESIS=Transazione genesi +# suppress inspection "UnusedProperty" +dao.tx.type.enum.TRANSFER_BSQ=Trasferisci BSQ +# suppress inspection "UnusedProperty" +dao.tx.type.enum.received.TRANSFER_BSQ=BSQ ricevuti +# suppress inspection "UnusedProperty" +dao.tx.type.enum.sent.TRANSFER_BSQ=BSQ inviati +# suppress inspection "UnusedProperty" +dao.tx.type.enum.PAY_TRADE_FEE=Commissione di scambio +# suppress inspection "UnusedProperty" +dao.tx.type.enum.COMPENSATION_REQUEST=Commissione per richiesta di compenso +# suppress inspection "UnusedProperty" +dao.tx.type.enum.REIMBURSEMENT_REQUEST=Commissione per richiesta di rimborso +# suppress inspection "UnusedProperty" +dao.tx.type.enum.PROPOSAL=Commissione per la proposta +# suppress inspection "UnusedProperty" +dao.tx.type.enum.BLIND_VOTE=Commissione per voto alla cieca +# suppress inspection "UnusedProperty" +dao.tx.type.enum.VOTE_REVEAL=Rivelazione voto +# suppress inspection "UnusedProperty" +dao.tx.type.enum.LOCKUP=Blocca bond +# suppress inspection "UnusedProperty" +dao.tx.type.enum.UNLOCK=Sblocca bond +# suppress inspection "UnusedProperty" +dao.tx.type.enum.ASSET_LISTING_FEE=Commissione listing dell'asset +# suppress inspection "UnusedProperty" +dao.tx.type.enum.PROOF_OF_BURN=Proof of burn +# suppress inspection "UnusedProperty" +dao.tx.type.enum.IRREGULAR=Irregolare + +dao.tx.withdrawnFromWallet=BTC prelevati dal portafoglio +dao.tx.issuanceFromCompReq=Richiesta di compensazione +dao.tx.issuanceFromCompReq.tooltip=Richiesta di compenso che ha portato all'emissione di nuovi BSQ.\nData di emissione: {0} +dao.tx.issuanceFromReimbursement=Richiesta di rimborso/emissione +dao.tx.issuanceFromReimbursement.tooltip=Richiesta di rimborso che ha portato all'emissione di nuovi BSQ.\nData di emissione: {0} +dao.proposal.create.missingBsqFunds=Non hai fondi BSQ sufficienti per creare la proposta. Se hai una transazione BSQ non confermata, devi attendere una conferma sulla blockchain perché BSQ è validato solo se è incluso in un blocco.\nMancante: {0} + +dao.proposal.create.missingBsqFundsForBond=Non hai fondi BSQ sufficienti per questo ruolo. Puoi comunque pubblicare questa proposta, ma avrai bisogno dell'intero importo BSQ richiesto per questo ruolo se viene accettato.\nMancante: {0} + +dao.proposal.create.missingMinerFeeFunds=Non hai fondi BTC sufficienti per creare la transazione di proposta. Tutte le transazioni BSQ richiedono una commissione di mining in BTC.\nMancante: {0} + +dao.proposal.create.missingIssuanceFunds=Non hai fondi BTC sufficienti per creare la transazione di proposta. Tutte le transazioni BSQ richiedono una commissione di mining in BTC e anche le transazioni di emissione richiedono BTC per l'importo BSQ richiesto ({0} Satoshi/BSQ).\nMancante: {1} + +dao.feeTx.confirm=Conferma transazione {0} +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? + +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? + +dao.news.bisqDAO.title=LA DAO BISQ +dao.news.bisqDAO.description=Proprio come lo scambio di Bisq è decentralizzato e resistente alla censura, così è il suo modello di governance - e il token Bisq DAO e BSQ sono gli strumenti che lo rendono possibile. +dao.news.bisqDAO.readMoreLink=Ulteriori informazioni sulla Bisq DAO + +dao.news.pastContribution.title=HAI EFFETTUATO CONTRIBUTI IN PASSATO? RICHIEDI BSQ +dao.news.pastContribution.description=Se hai contribuito a Bisq, utilizza l'indirizzo BSQ qui sotto e fai una richiesta per prendere parte alla distribuzione genesi BSQ. +dao.news.pastContribution.yourAddress=L'indirizzo del tuo wallet BSQ +dao.news.pastContribution.requestNow=Richiedi ora + +dao.news.DAOOnTestnet.title=ESEGUI LA BISQ DAO NEL NOSTRO TESTNET +dao.news.DAOOnTestnet.description=La mainnet Bisq DAO non è ancora stata lanciata, ma puoi conoscere Bisq DAO eseguendolo sulla nostra testnet. +dao.news.DAOOnTestnet.firstSection.title=1. Passa alla modalità Testnet DAO +dao.news.DAOOnTestnet.firstSection.content=Passa a DAO Testnet dalla schermata Impostazioni. +dao.news.DAOOnTestnet.secondSection.title=2. Acquista un po' di BSQ +dao.news.DAOOnTestnet.secondSection.content=Richiedi BSQ su Slack o Acquista BSQ su Bisq. +dao.news.DAOOnTestnet.thirdSection.title=3. Partecipa a un Ciclo di Votazione +dao.news.DAOOnTestnet.thirdSection.content=Fare proposte e votare proposte per cambiare vari aspetti di Bisq. +dao.news.DAOOnTestnet.fourthSection.title=4. Esplora un BSQ Block Explorer +dao.news.DAOOnTestnet.fourthSection.content=Poiché BSQ è solo bitcoin, puoi vedere le transazioni BSQ sul nostro explorer di blocchi bitcoin. +dao.news.DAOOnTestnet.readMoreLink=Leggi la documentazione completa + +dao.monitor.daoState=Stato DAO +dao.monitor.proposals=Stato delle proposte +dao.monitor.blindVotes=Stato dei voti ciechi + +dao.monitor.table.peers=Peers +dao.monitor.table.conflicts=Conflitti +dao.monitor.state=Stato +dao.monitor.requestAlHashes=Richiedi tutti gli hash +dao.monitor.resync=Risincronizza lo stato della DAO +dao.monitor.table.header.cycleBlockHeight=Altezza ciclo / blocco +dao.monitor.table.cycleBlockHeight=Ciclo {0} / blocco {1} +dao.monitor.table.seedPeers=Nodo seme: {0} + +dao.monitor.daoState.headline=Stato DAO +dao.monitor.daoState.table.headline=Catena di hash di stato DAO +dao.monitor.daoState.table.blockHeight=Altezza del blocco +dao.monitor.daoState.table.hash=Hash dello stato DAO +dao.monitor.daoState.table.prev=Hash precedente +dao.monitor.daoState.conflictTable.headline=Hash di stato DAO da peer in conflitto +dao.monitor.daoState.utxoConflicts=Conflitti UTXO +dao.monitor.daoState.utxoConflicts.blockHeight=Altezza blocco: {0} +dao.monitor.daoState.utxoConflicts.sumUtxo=Somma di tutti gli UTXO: {0} BSQ +dao.monitor.daoState.utxoConflicts.sumBsq=Somma di tutti i BSQ: {0} BSQ +dao.monitor.daoState.checkpoint.popup=Lo stato DAO non è sincronizzato con la rete. Dopo il riavvio, lo stato DAO verrà risincronizzato. + +dao.monitor.proposal.headline=Stato delle proposte +dao.monitor.proposal.table.headline=Catena di hash dello stato della proposta +dao.monitor.proposal.conflictTable.headline=Hash di stato della proposta da peer in conflitto + +dao.monitor.proposal.table.hash=Hash dello stato della proposta +dao.monitor.proposal.table.prev=Hash precedente +dao.monitor.proposal.table.numProposals=N. di proposte + +dao.monitor.isInConflictWithSeedNode=I dati locali non sono in accordo con almeno un nodo seme. Risincronizzare nuovamente lo stato DAO. +dao.monitor.isInConflictWithNonSeedNode=Uno dei tuoi peer non è d'accordo con la rete ma il tuo nodo è sincronizzato con i nodi seed. +dao.monitor.daoStateInSync=Il nodo locale è in accordo con la rete + +dao.monitor.blindVote.headline=Stato dei voti ciechi +dao.monitor.blindVote.table.headline=Catena di hash dello stato del voto cieco +dao.monitor.blindVote.conflictTable.headline=Hash dello stato del voto alla cieca da peer in conflitto +dao.monitor.blindVote.table.hash=Hash dello stato di voto cieco +dao.monitor.blindVote.table.prev=Hash precedente +dao.monitor.blindVote.table.numBlindVotes=N. di voti ciechi + +dao.factsAndFigures.menuItem.supply=Supply BSQ +dao.factsAndFigures.menuItem.transactions=Transazioni BSQ + +dao.factsAndFigures.dashboard.avgPrice90=Prezzo di scambio medio BSQ/BTC di 90 giorni +dao.factsAndFigures.dashboard.avgPrice30=Prezzo di scambio medio BSQ/BTC di 30 giorni +dao.factsAndFigures.dashboard.avgUSDPrice90=Prezzo medio ponderato USD/BSQ degli ultimi 90 giorni +dao.factsAndFigures.dashboard.avgUSDPrice30=Prezzo medio ponderato USD / BSQ degli ultimi 30 giorni +dao.factsAndFigures.dashboard.marketCap=Capitalizzazione di mercato (basata sul prezzo di scambio) +dao.factsAndFigures.dashboard.availableAmount=BSQ totale disponibile + +dao.factsAndFigures.supply.issuedVsBurnt=BSQ emessi v. BSQ bruciati + +dao.factsAndFigures.supply.issued=BSQ coniati +dao.factsAndFigures.supply.genesisIssueAmount=BSQ coniati nella trasazione di genesi +dao.factsAndFigures.supply.compRequestIssueAmount=BSQ coniati per le richieste di compensazione +dao.factsAndFigures.supply.reimbursementAmount=BSQ coniati per le richieste di rimborso + +dao.factsAndFigures.supply.burnt=BSQ bruciati +dao.factsAndFigures.supply.burntMovingAverage=Media mobile di 15 giorni +dao.factsAndFigures.supply.burntZoomToInliers=Zoom su inlier + +dao.factsAndFigures.supply.locked=Stato globale dei BSQ bloccati +dao.factsAndFigures.supply.totalLockedUpAmount=Bloccati in bond +dao.factsAndFigures.supply.totalUnlockingAmount=Sbloccando i BSQ dai vincoli +dao.factsAndFigures.supply.totalUnlockedAmount=BSQ sbloccati dalle obbligazioni +dao.factsAndFigures.supply.totalConfiscatedAmount=BSQ confiscati dalle obbligazioni +dao.factsAndFigures.supply.invalidTxs=BSQ burciati (transazioni non valide) +dao.factsAndFigures.supply.burntAmount=BSQ bruciati (commissioni) + +dao.factsAndFigures.transactions.genesis=Transazione genesi +dao.factsAndFigures.transactions.genesisBlockHeight=Altezza del blocco genesi +dao.factsAndFigures.transactions.genesisTxId=ID transazione genesi +dao.factsAndFigures.transactions.txDetails=Statistiche transazioni BSQ +dao.factsAndFigures.transactions.allTx=Numero di tutte le transazioni BSQ +dao.factsAndFigures.transactions.utxo=Numero di tutti gli output di transazione non spesi +dao.factsAndFigures.transactions.compensationIssuanceTx=Numero di tutte le transazioni di richieste di compensazione +dao.factsAndFigures.transactions.reimbursementIssuanceTx=Numero di tutte le transazioni di richieste di rimborso +dao.factsAndFigures.transactions.burntTx=Numero di tutte le transazioni di pagamento delle commissioni +dao.factsAndFigures.transactions.invalidTx=N. di tutte le transazioni invalide +dao.factsAndFigures.transactions.irregularTx=N. di tutte le transazioni irregolari + +#################################################################### +# Windows +#################################################################### + +contractWindow.title=Dettagli disputa +contractWindow.dates=Data dell'offerta / Data di scambio +contractWindow.btcAddresses=Indirizzo Bitcoin acquirente BTC / venditore BTC +contractWindow.onions=Indirizzo di rete acquirente BTC / venditore BTC +contractWindow.accountAge=Età account acquirente BTC / venditore BTC +contractWindow.numDisputes=Numero di controversie acquirente BTC / venditore BTC +contractWindow.contractHash=Hash contratto + +displayAlertMessageWindow.headline=Informazioni importanti! +displayAlertMessageWindow.update.headline=Informazioni importanti sull'aggiornamento! +displayAlertMessageWindow.update.download=Download: +displayUpdateDownloadWindow.downloadedFiles=File: +displayUpdateDownloadWindow.downloadingFile=Download: {0} +displayUpdateDownloadWindow.verifiedSigs=Firma verificata con chiavi: +displayUpdateDownloadWindow.status.downloading=Download file... +displayUpdateDownloadWindow.status.verifying=Verifica firma... +displayUpdateDownloadWindow.button.label=Scarica il programma di installazione e verifica la firma +displayUpdateDownloadWindow.button.downloadLater=Scarica più tardi +displayUpdateDownloadWindow.button.ignoreDownload=Ignora questa versione +displayUpdateDownloadWindow.headline=È disponibile un nuovo aggiornamento di Bisq! +displayUpdateDownloadWindow.download.failed.headline=Download fallito +displayUpdateDownloadWindow.download.failed=Download failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verification failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.success=La nuova versione è stata scaricata correttamente e la firma è stata verificata.\n\nAprire la cartella di download, chiudere l'applicazione e installare la nuova versione. +displayUpdateDownloadWindow.download.openDir=Apri la cartella di download + +disputeSummaryWindow.title=Sommario +disputeSummaryWindow.openDate=Data di apertura del ticket +disputeSummaryWindow.role=Ruolo del trader +disputeSummaryWindow.payout=Pagamento dell'importo di scambio +disputeSummaryWindow.payout.getsTradeAmount=BTC {0} ottiene il pagamento dell'importo commerciale +disputeSummaryWindow.payout.getsAll=BTC {0} ottiene tutto +disputeSummaryWindow.payout.custom=Pagamento personalizzato +disputeSummaryWindow.payoutAmount.buyer=Importo pagamento dell'acquirente +disputeSummaryWindow.payoutAmount.seller=Importo pagamento del venditore +disputeSummaryWindow.payoutAmount.invert=Utilizza perdente come editore +disputeSummaryWindow.reason=Motivo della disputa + +# dynamic values are not recognized by IntelliJ +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.BUG=Errore +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.USABILITY=Usabilità +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.PROTOCOL_VIOLATION=Violazione del protocollo +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.NO_REPLY=Nessuna risposta +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.SCAM=Truffa +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.OTHER=Altro +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.BANK_PROBLEMS=Banca +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.OPTION_TRADE=Option trade +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.SELLER_NOT_RESPONDING=Seller not responding +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.WRONG_SENDER_ACCOUNT=Wrong sender account +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.PEER_WAS_LATE=Peer was late +# suppress inspection "UnusedProperty" +disputeSummaryWindow.reason.TRADE_ALREADY_SETTLED=Trade already settled + +disputeSummaryWindow.summaryNotes=Note di sintesi +disputeSummaryWindow.addSummaryNotes=Aggiungi note di sitensi +disputeSummaryWindow.close.button=Chiudi ticket + +# Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n + +# Do no change any line break or order of tokens as the structure is used for signature verification +disputeSummaryWindow.close.msgWithSig={0}{1}{2}{3} + +disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and accept or reject suggestion from mediator +disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions +disputeSummaryWindow.close.closePeer=Devi chiudere anche il ticket dei peer di trading! +disputeSummaryWindow.close.txDetails.headline=Pubblica transazione di rimborso +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.txDetails.buyer=L'acquirente riceve {0} all'indirizzo: {1}\n +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.txDetails.seller=Il venditore riceve {0} all'indirizzo: {1}\n +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? + +disputeSummaryWindow.close.noPayout.headline=Close without any payout +disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? + +emptyWalletWindow.headline={0} strumento portafoglio di emergenza +emptyWalletWindow.info=Utilizzalo solo in caso di emergenza se non puoi accedere al tuo fondo dall'interfaccia utente.\n\nSi noti che tutte le offerte aperte verranno chiuse automaticamente quando si utilizza questo strumento.\n\nPrima di utilizzare questo strumento, eseguire il backup della directory dei dati. Puoi farlo in \"Account/Backup\".\n\nTi preghiamo di segnalarci il tuo problema e di presentare una segnalazione di bug su GitHub o sul forum Bisq in modo da poter esaminare la causa del problema. +emptyWalletWindow.balance=Il saldo disponibile del tuo portafoglio +emptyWalletWindow.bsq.btcBalance=Saldo di satoshi non-BSQ + +emptyWalletWindow.address=Il tuo indirizzo di destinazione +emptyWalletWindow.button=Invia tutti i fondi +emptyWalletWindow.openOffers.warn=Hai offerte aperte che verranno rimosse se svuoti il portafoglio.\nSei sicuro di voler svuotare il tuo portafoglio? +emptyWalletWindow.openOffers.yes=Sì, ne sono sicuro +emptyWalletWindow.sent.success=Il saldo del tuo portafoglio è stato trasferito correttamente. + +enterPrivKeyWindow.headline=Immettere la chiave privata per la registrazione + +filterWindow.headline=Modifica elenco filtri +filterWindow.offers=Offerte filtrate (separate con una virgola) +filterWindow.onions=Indirizzi di onion filtrati (separati con una virgola) +filterWindow.accounts=Dati dell'account di trading filtrati:\nFormato: virgola sep. elenco di [ID metodo di pagamento | campo dati | valore] +filterWindow.bannedCurrencies=Codici valuta filtrati (separati con una virgola) +filterWindow.bannedPaymentMethods=ID dei metodi di pagamento filtrati (separati con una virgola) +filterWindow.bannedAccountWitnessSignerPubKeys=Filtered account witness signer pub keys (comma sep. hex of pub keys) +filterWindow.bannedPrivilegedDevPubKeys=Filtered privileged dev pub keys (comma sep. hex of pub keys) +filterWindow.arbitrators=Arbitri filtrati (indirizzi onion separati con una virgola) +filterWindow.mediators=Mediatori filtrati (indirizzi onion separati con una virgola) +filterWindow.refundAgents=Agenti di rimborso filtrati (virgola sep. indirizzi onion) +filterWindow.seedNode=Nodi seme filtrati (separati con una virgola) +filterWindow.priceRelayNode=Prezzo filtrato dai nodi relay (virgola sep. indirizzi onion) +filterWindow.btcNode=Nodi Bitcoin filtrati (indirizzo + porta separati con una virgola) +filterWindow.preventPublicBtcNetwork=Impedisci l'utilizzo della rete pubblica Bitcoin +filterWindow.disableDao=Disabilita DAO +filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) +filterWindow.disableDaoBelowVersion=Versione minima richiesta per la DAO +filterWindow.disableTradeBelowVersion=Versione minima richiesta per il trading +filterWindow.add=Aggiungi filtro +filterWindow.remove=Rimuovi filtro +filterWindow.btcFeeReceiverAddresses=BTC fee receiver addresses + +offerDetailsWindow.minBtcAmount=Importo BTC minimo +offerDetailsWindow.min=(min. {0}) +offerDetailsWindow.distance=(distanza dal prezzo di mercato: {0}) +offerDetailsWindow.myTradingAccount=Il mio account di scambio +offerDetailsWindow.offererBankId=(ID banca del produttore/BIC/SWIFT) +offerDetailsWindow.offerersBankName=(nome della banca del maker) +offerDetailsWindow.bankId=ID Banca (es. BIC o SWIFT) +offerDetailsWindow.countryBank=Paese della banca del maker +offerDetailsWindow.commitment=Impegno +offerDetailsWindow.agree=Accetto +offerDetailsWindow.tac=Termini e condizioni +offerDetailsWindow.confirm.maker=Conferma: Piazza l'offerta a {0} bitcoin +offerDetailsWindow.confirm.taker=Conferma: Accetta l'offerta a {0} bitcoin +offerDetailsWindow.creationDate=Data di creazione +offerDetailsWindow.makersOnion=Indirizzo .onion del maker + +qRCodeWindow.headline=QR Code +qRCodeWindow.msg=Please use this QR code for funding your Bisq wallet from your external wallet. +qRCodeWindow.request=Richiesta di pagamento:\n{0} + +selectDepositTxWindow.headline=Seleziona la transazione di deposito per la disputa +selectDepositTxWindow.msg=La transazione di deposito non è stata archiviata nello scambio.\nSeleziona una delle transazioni multisig esistenti dal tuo portafoglio che era la transazione di deposito utilizzata nello scambio fallito.\n\nPuoi trovare la transazione corretta aprendo la finestra dei dettagli dello scambio (fai clic sull'ID dello scambio nell'elenco) e seguendo l'output della commissione di scambio della transazione successiva in cui vedi la transazione di deposito multisig (l'indirizzo inizia con 3). Tale ID transazione dovrebbe essere visibile nell'elenco presentato qui. Una volta trovata la transazione corretta, seleziona quella transazione e continua.\n\nCi scusiamo per l'inconveniente, ma questo caso di errore dovrebbe accadere molto raramente e in futuro cercheremo di trovare modi migliori per risolverlo.\n  +selectDepositTxWindow.select=Seleziona la transazione di deposito + +sendAlertMessageWindow.headline=Invia notifica globale +sendAlertMessageWindow.alertMsg=Messaggio d'avvertimento +sendAlertMessageWindow.enterMsg=Inserisci messaggio +sendAlertMessageWindow.isUpdate=Notifica di aggiornamento +sendAlertMessageWindow.version=Nuova versione numero +sendAlertMessageWindow.send=Invia notifica +sendAlertMessageWindow.remove=Rimuovi notifica + +sendPrivateNotificationWindow.headline=Invia messaggio privato +sendPrivateNotificationWindow.privateNotification=Notifica privata +sendPrivateNotificationWindow.enterNotification=Inserisci notifica +sendPrivateNotificationWindow.send=Invia notifica privata + +showWalletDataWindow.walletData=Dati portafoglio +showWalletDataWindow.includePrivKeys=Includi chiavi private + +setXMRTxKeyWindow.headline=Prove sending of XMR +setXMRTxKeyWindow.note=Adding tx info below enables auto-confirm for quicker trades. See more: https://bisq.wiki/Trading_Monero +setXMRTxKeyWindow.txHash=Transaction ID (optional) +setXMRTxKeyWindow.txKey=Transaction key (optional) + +# We do not translate the tac because of the legal nature. We would need translations checked by lawyers +# in each language which is too expensive atm. +tacWindow.headline=Accordo per gli utenti +tacWindow.agree=Accetto +tacWindow.disagree=Non accetto ed esco +tacWindow.arbitrationSystem=Risoluzione disputa + +tradeDetailsWindow.headline=Scambio +tradeDetailsWindow.disputedPayoutTxId=ID transazione di pagamento contestato: +tradeDetailsWindow.tradeDate=Data di scambio +tradeDetailsWindow.txFee=Commissione di mining +tradeDetailsWindow.tradingPeersOnion=Indirizzi onion peer di trading +tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash +tradeDetailsWindow.tradeState=Stato di scambio +tradeDetailsWindow.agentAddresses=Arbitro/Mediatore + +walletPasswordWindow.headline=Inserisci la password per sbloccare + +torNetworkSettingWindow.header=Impostazioni rete Tor +torNetworkSettingWindow.noBridges=Non usare bridge +torNetworkSettingWindow.providedBridges=Connetti con i bridge forniti +torNetworkSettingWindow.customBridges=Inserisci bridge personalizzati +torNetworkSettingWindow.transportType=Tipo di trasporto +torNetworkSettingWindow.obfs3=obfs3 +torNetworkSettingWindow.obfs4=obfs4 (consigliato) +torNetworkSettingWindow.meekAmazon=meek-amazon +torNetworkSettingWindow.meekAzure=meek-azure +torNetworkSettingWindow.enterBridge=Immettere uno o più bridge relays (uno per riga) +torNetworkSettingWindow.enterBridgePrompt=tipo indirizzo:porta +torNetworkSettingWindow.restartInfo=Devi riavviare per applicare i cambiamenti +torNetworkSettingWindow.openTorWebPage=Apri il sito web del progetto Tor +torNetworkSettingWindow.deleteFiles.header=Problemi di connessione? +torNetworkSettingWindow.deleteFiles.info=Se si verificano ripetuti problemi di connessione all'avvio, l'eliminazione di file Tor obsoleti potrebbe essere d'aiuto. Per fare ciò, fai clic sul pulsante in basso e riavvia in seguito. +torNetworkSettingWindow.deleteFiles.button=Rimuovi i file Tor obsoleti e spegni +torNetworkSettingWindow.deleteFiles.progress=Spegnimento Tor in corso +torNetworkSettingWindow.deleteFiles.success=File obsoleti di Tor eliminati con successo. Riavvia. +torNetworkSettingWindow.bridges.header=Tor è bloccato? +torNetworkSettingWindow.bridges.info=Se Tor è bloccato dal tuo provider di servizi Internet o dal tuo paese, puoi provare a utilizzare i bridge Tor.\nVisitare la pagina Web Tor all'indirizzo: https://bridges.torproject.org/bridges per ulteriori informazioni sui bridge e sui trasporti collegabili.\n  + +feeOptionWindow.headline=Scegli la valuta per il pagamento delle commissioni commerciali +feeOptionWindow.info=Puoi scegliere di pagare la commissione commerciale in BSQ o in BTC. Se scegli BSQ approfitti della commissione commerciale scontata. +feeOptionWindow.optionsLabel=Scegli la valuta per il pagamento delle commissioni commerciali +feeOptionWindow.useBTC=Usa BTC +feeOptionWindow.fee={0} (≈ {1}) + + +#################################################################### +# Popups +#################################################################### + +popup.headline.notification=Notifica +popup.headline.instruction=Nota bene: +popup.headline.attention=Attenzione +popup.headline.backgroundInfo=Informazioni di base +popup.headline.feedback=Completato +popup.headline.confirmation=Conferma +popup.headline.information=Informazione +popup.headline.warning=Attenzione +popup.headline.error=Errore + +popup.doNotShowAgain=Non mostrare di nuovo +popup.reportError.log=Apri file di registro +popup.reportError.gitHub=Segnala sugli errori di GitHub +popup.reportError={0}\n\nPer aiutarci a migliorare il software, segnala questo errore aprendo un nuova segnalazione su https://github.com/bisq-network/bisq/issues.\nIl messaggio di errore sopra verrà copiato negli appunti quando si fa clic su uno dei pulsanti di seguito.\nFaciliterà il debug se includi il file bisq.log premendo "Apri file di registro", salvando una copia e allegandolo alla tua segnalazione di bug.\n  + +popup.error.tryRestart=Prova a riavviare l'applicazione e controlla la connessione di rete per vedere se riesci a risolvere il problema. +popup.error.takeOfferRequestFailed=Si è verificato un errore quando qualcuno ha tentato di accettare una delle tue offerte:\n{0} + +error.spvFileCorrupted=Si è verificato un errore durante la lettura del file della catena SPV.\nÈ possibile che il file della catena SPV sia danneggiato.\n\nMessaggio di errore: {0}\n\nVuoi cancellarlo ed iniziare una nuova sincronizzazione? +error.deleteAddressEntryListFailed=Impossibile eliminare il file AddressEntryList.\nErrore: {0} +error.closedTradeWithUnconfirmedDepositTx=La transazione di deposito dello scambio chiuso con ID {0} non è ancora confermata.\n\nEffettuare una risincronizzazione SPV in \"Setting/Network info\" per verificare se la transazione è valida.\n  +error.closedTradeWithNoDepositTx=La transazione di deposito dello scambio chiuso con ID {0} è nulla.\n\nRiavvia l'applicazione per ripulire l'elenco delle transazioni chiuse. + +popup.warning.walletNotInitialized=Il portafoglio non è ancora inizializzato +popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. +popup.warning.wrongVersion=Probabilmente hai la versione Bisq sbagliata per questo computer.\nL'architettura del tuo computer è: {0}.\nIl binario Bisq che hai installato è: {1}.\nChiudere e reinstallare la versione corretta ({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 new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application. +popup.warning.startupFailed.twoInstances=Bisq è già in esecuzione. Non è possibile eseguire due istanze di Bisq. +popup.warning.tradePeriod.halfReached=Il tuo scambio con ID {0} ha raggiunto la metà del massimo periodo di negoziazione consentito e non è ancora completato.\n\nIl periodo di scambio termina il {1}\n\nPer ulteriori informazioni, controllare lo stato dello scambio in \"Portafoglio/Scambi aperti\". +popup.warning.tradePeriod.ended= \nIl tuo scambio con ID {0} ha raggiunto il limite massimo del periodo di scambio consentito e non è stato completato.\n\nIl periodo di scambio è terminato il {1}\n\nPer favore verifica il tuo trade su \"Portafoglio/Scambi aperti\" per contattare il mediatore. +popup.warning.noTradingAccountSetup.headline=Non hai impostato un account di trading +popup.warning.noTradingAccountSetup.msg=È necessario impostare un conto in valuta nazionale o altcoin prima di poter creare un'offerta.\nVuoi configurare un conto? +popup.warning.noArbitratorsAvailable=Non ci sono arbitri disponibili. +popup.warning.noMediatorsAvailable=Non ci sono mediatori disponibili. +popup.warning.notFullyConnected=È necessario attendere fino a quando non si è completamente connessi alla rete.\nQuesto potrebbe richiedere fino a circa 2 minuti all'avvio. +popup.warning.notSufficientConnectionsToBtcNetwork=Devi aspettare fino a quando non hai almeno {0} connessioni alla rete Bitcoin. +popup.warning.downloadNotComplete=Devi aspettare fino al completamento del download dei blocchi Bitcoin mancanti. +popup.warning.removeOffer=Sei sicuro di voler rimuovere quell'offerta?\nLa commissione del maker di {0} andrà persa se rimuovi quell'offerta. +popup.warning.tooLargePercentageValue=Non è possibile impostare una percentuale del 100% o superiore. +popup.warning.examplePercentageValue=Inserisci un numero percentuale come \"5.4\" per il 5,4% +popup.warning.noPriceFeedAvailable=Non è disponibile alcun feed di prezzi per la valuta. Non è possibile utilizzare un prezzo basato su percentuale.\nSeleziona il prezzo fisso. +popup.warning.sendMsgFailed=Invio del messaggio al tuo partner commerciale non riuscito.\nTi preghiamo di riprovare e se continua a fallire segnalare un bug. +popup.warning.insufficientBtcFundsForBsqTx=Non hai fondi BTC sufficienti per pagare la commissione di mining per quella transazione.\nPer favore finanzia il tuo portafoglio BTC.\nFondi mancanti: {0} +popup.warning.bsqChangeBelowDustException=Questa transazione crea un output di cambio BSQ che è inferiore al limite di polvere (5,46 BSQ) e verrebbe rifiutato dalla rete Bitcoin.\n\nÈ necessario inviare una quantità maggiore per evitare l'output di cambio (ad es. aggiungendo la quantità di polvere alla quantità di invio) o aggiungere più fondi BSQ al portafoglio in modo da evitare di generare una produzione di polvere.\n\nL'output della polvere è {0}. +popup.warning.btcChangeBelowDustException=Questa transazione crea un output di cambio che è al di sotto del limite di polvere (546 Satoshi) e verrebbe rifiutato dalla rete Bitcoin.\n\nÈ necessario aggiungere la quantità di polvere alla quantità di invio per evitare di generare un output di polvere.\n\nL'output della polvere è {0}. + +popup.warning.insufficientBsqFundsForBtcFeePayment=You''ll need more BSQ to do this transaction—the last 5.46 BSQ in your wallet cannot be used to pay trade fees because of dust limits in the Bitcoin protocol.\n\nYou can either buy more BSQ or pay trade fees with BTC.\n\nMissing funds: {0} +popup.warning.noBsqFundsForBtcFeePayment=Il tuo portafoglio BSQ non ha fondi sufficienti per pagare la commissione commerciale in BSQ. +popup.warning.messageTooLong=Il tuo messaggio supera la dimensione massima consentita. Si prega di inviarlo in più parti o caricarlo su un servizio come https://pastebin.com. +popup.warning.lockedUpFunds=Hai bloccato i fondi da uno scambio fallito.\nSaldo bloccato: {0}\nIndirizzo tx deposito: {1}\nID scambio: {2}.\n\nApri un ticket di supporto selezionando lo scambio nella schermata degli scambi aperti e premendo \"alt + o\" o \"option + o\"." + +# suppress inspection "UnusedProperty" +popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" +popup.warning.priceRelay=ripetitore di prezzo +popup.warning.seed=seme +popup.warning.mandatoryUpdate.trading=Si prega di aggiornare Bisq all'ultima versione. È stato rilasciato un aggiornamento obbligatorio che disabilita il trading per le vecchie versioni. Per ulteriori informazioni, consultare il forum Bisq. +popup.warning.mandatoryUpdate.dao=Si prega di aggiornare Bisq all'ultima versione. È stato rilasciato un aggiornamento obbligatorio che disabilita Bisq DAO e BSQ per le vecchie versioni. Per ulteriori informazioni, consultare il forum Bisq.\n  +popup.warning.disable.dao=Bisq DAO e BSQ sono temporaneamente disabilitati. Per ulteriori informazioni, consultare il forum Bisq. +popup.warning.burnBTC=Questa transazione non è possibile, poiché le commissioni di mining di {0} supererebbero l'importo da trasferire di {1}. Attendi fino a quando le commissioni di mining non saranno nuovamente basse o fino a quando non avrai accumulato più BTC da trasferire. + +popup.warning.openOffer.makerFeeTxRejected=La commissione della transazione del creatore dell'offerta con ID {0} è stata rifiutata dalla rete Bitcoin.\nTransazione ID={1}.\nL'offerta è stata rimossa per evitare ulteriori problemi.\nVai su \"Impostazioni/Informazioni di rete\" ed esegui una risincronizzazione SPV.\nPer ulteriore assistenza, contattare il canale di supporto Bisq nel team di Bisq Keybase. + +popup.warning.trade.txRejected.tradeFee=commissione di scambio +popup.warning.trade.txRejected.deposit=deposita +popup.warning.trade.txRejected=La transazione {0} per lo scambio con ID {1} è stata rifiutata dalla rete Bitcoin.\nTransazione ID={2}}\nLo scambio è stato trasferito nella sezione scambi falliti.\nVai su \"Impostazioni/Informazioni di rete\" ed esegui una risincronizzazione SPV.\nPer ulteriore assistenza, contattare il canale di supporto Bisq nel team di Bisq Keybase. + +popup.warning.openOfferWithInvalidMakerFeeTx=La commissione della transazione del creatore dell'offerta con ID {0} non è valida.\nTransazione ID={1}.\nVai su \"Impostazioni/Informazioni di rete\" ed esegui una risincronizzazione SPV.\nPer ulteriore assistenza, contattare il canale di supporto Bisq nel team di Bisq Keybase. + +popup.info.securityDepositInfo=Per garantire che i trader seguano il protocollo di scambio, entrambi devono pagare un deposito cauzionale.\n\nQuesto deposito viene conservato nel tuo portafoglio di scambio fino a quando la tua transazione non è stata completata con successo, quindi ti viene rimborsato.\n\nNota: se stai creando una nuova offerta, Bisq deve essere in esecuzione per essere accettato da un altro trader. Per mantenere le tue offerte online, mantieni Bisq in funzione e assicurati che anche questo computer rimanga online (ad esempio, assicurati che non passi alla modalità standby ... monitor standby va bene). + +popup.info.cashDepositInfo=Assicurati di avere una filiale bancaria nella tua zona per poter effettuare il deposito in contanti.\nL'ID bancario (BIC/SWIFT) della banca del venditore è: {0}. +popup.info.cashDepositInfo.confirm=Confermo di poter effettuare il deposito +popup.info.shutDownWithOpenOffers=Bisq viene chiuso, ma ci sono offerte aperte.\n\nQueste offerte non saranno disponibili sulla rete P2P mentre Bisq rimane chiuso, ma verranno ripubblicate sulla rete P2P al prossimo avvio di Bisq.\n\nPer mantenere le tue offerte attive è necessario che Bisq rimanga in funzione ed il computer online (assicurati che non vada in modalità standby. Il solo monitor in standby non è un problema). +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. + +popup.privateNotification.headline=Notifica privata importante! + +popup.securityRecommendation.headline=Raccomandazione di sicurezza importante +popup.securityRecommendation.msg=Vorremmo ricordarti di prendere in considerazione l'utilizzo della protezione con password per il tuo portafoglio se non l'avessi già abilitato.\n\nSi consiglia inoltre di annotare le parole seme del portafoglio. Le parole seme sono come una password principale per recuperare il tuo portafoglio Bitcoin.\nNella sezione \"Wallet Seed\" trovi ulteriori informazioni.\n\nInoltre, è necessario eseguire il backup della cartella completa dei dati dell'applicazione nella sezione \"Backup\". + +popup.bitcoinLocalhostNode.msg=Bisq ha rilevato un nodo Bitcoin Core in esecuzione localmente (su localhost).\nAssicurarsi che questo nodo sia completamente sincronizzato prima di avviare Bisq e che non sia in esecuzione in modalità di eliminazione. +popup.bitcoinLocalhostNode.additionalRequirements=\n\nPer un nodo ben configurato, i requisiti necessari sono che il nodo abbia il pruning disabilitato e i filtri bloom abilitati. + +popup.shutDownInProgress.headline=Arresto in corso +popup.shutDownInProgress.msg=La chiusura dell'applicazione può richiedere un paio di secondi.\nNon interrompere il processo. + +popup.attention.forTradeWithId=Attenzione richiesta per gli scambi con ID {0} + +popup.info.multiplePaymentAccounts.headline=Disponibili più conti di pagamento +popup.info.multiplePaymentAccounts.msg=Hai più account di pagamento disponibili per questa offerta. Assicurati di aver scelto quello giusto. + +popup.accountSigning.selectAccounts.headline=Seleziona conti di pagamento +popup.accountSigning.selectAccounts.description=In base al metodo di pagamento e al momento in cui verranno selezionati tutti i conti di pagamento collegati a una controversia in cui si è verificato un pagamento +popup.accountSigning.selectAccounts.signAll=Firma tutti i metodi di pagamento +popup.accountSigning.selectAccounts.datePicker=Seleziona il momento in cui verranno firmati gli account + +popup.accountSigning.confirmSelectedAccounts.headline=Conferma account di pagamento selezionati +popup.accountSigning.confirmSelectedAccounts.description=In base ai dati inseriti, verranno selezionati {0} account di pagamento. +popup.accountSigning.confirmSelectedAccounts.button=Conferma conti di pagamento +popup.accountSigning.signAccounts.headline=Conferma la firma dei conti di pagamento +popup.accountSigning.signAccounts.description=In base alla tua selezione, verranno firmati {0} account di pagamento. +popup.accountSigning.signAccounts.button=Firma conti di pagamento +popup.accountSigning.signAccounts.ECKey=Immettere la chiave dell'arbitro privato +popup.accountSigning.signAccounts.ECKey.error=ECKey dell'arbitro errata + +popup.accountSigning.success.headline=Congratulazioni +popup.accountSigning.success.description=Tutti gli account di pagamento {0} sono stati firmati correttamente! +popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. +popup.accountSigning.signedByArbitrator=Uno dei tuoi conti di pagamento è stato verificato e firmato da un arbitro. Il trading con questo account firmerà automaticamente l'account del tuo peer di trading dopo una negoziazione di successo.\n\n{0} +popup.accountSigning.signedByPeer=Uno dei tuoi conti di pagamento è stato verificato e firmato da un peer di trading. Il limite di trading iniziale verrà revocato e sarai in grado di firmare altri account tra {0} giorni da adesso.\n\n{1} +popup.accountSigning.peerLimitLifted=Il limite iniziale per uno dei tuoi account è stato revocato.\n\n{0} +popup.accountSigning.peerSigner=Uno dei tuoi account è abbastanza maturo per firmare altri account di pagamento e il limite iniziale per uno dei tuoi account è stato revocato.\n\n{0} + +popup.accountSigning.singleAccountSelect.headline=Select account age witness +popup.accountSigning.singleAccountSelect.description=Search for account age witness. +popup.accountSigning.singleAccountSelect.datePicker=Select point of time for signing +popup.accountSigning.confirmSingleAccount.headline=Confirm selected account age witness +popup.accountSigning.confirmSingleAccount.selectedHash=Selected witness hash +popup.accountSigning.confirmSingleAccount.button=Sign account age witness +popup.accountSigning.successSingleAccount.description=Witness {0} was signed +popup.accountSigning.successSingleAccount.success.headline=Success +popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} + +popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys +popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys +popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed +popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys +popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign + +#################################################################### +# Notifications +#################################################################### + +notification.trade.headline=Notifica per scambi con ID {0} +notification.ticket.headline=Biglietto di supporto per scambi con ID {0} +notification.trade.completed=Il commercio è ora completato e puoi ritirare i tuoi fondi. +notification.trade.accepted=La tua offerta è stata accettata da un BTC {0}. +notification.trade.confirmed=Il tuo trade ha almeno una conferma blockchain.\nPuoi iniziare il pagamento ora. +notification.trade.paymentStarted=L'acquirente BTC ha avviato il pagamento. +notification.trade.selectTrade=Seleziona scambio +notification.trade.peerOpenedDispute=Il tuo peer di trading ha aperto un {0}. +notification.trade.disputeClosed={0} è stato chiuso. +notification.walletUpdate.headline=Aggiornamento del portafoglio di trading +notification.walletUpdate.msg=Il tuo portafoglio di trading è sufficientemente finanziato.\nImporto: {0} +notification.takeOffer.walletUpdate.msg=Il tuo portafoglio di trading era già sufficientemente finanziato da un precedente tentativo di offerta.\nImporto: {0} +notification.tradeCompleted.headline=Scambio completato +notification.tradeCompleted.msg=Puoi ritirare i tuoi fondi sul tuo portafoglio Bitcoin esterno o trasferirlo sul portafoglio Bisq. + + +#################################################################### +# System Tray +#################################################################### + +systemTray.show=Mostra la finestra dell'applicazione +systemTray.hide=Nascondi la finestra dell'applicazione +systemTray.info=Informazioni su Bisq +systemTray.exit=Esci +systemTray.tooltip=Bisq: una rete di scambio decentralizzata di bitcoin + + +#################################################################### +# GUI Util +#################################################################### + +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. + +guiUtil.accountExport.savedToPath=Account di trading salvati nel percorso:\n{0} +guiUtil.accountExport.noAccountSetup=Non hai account di trading impostati per l'esportazione. +guiUtil.accountExport.selectPath=Seleziona il percorso per {0} +# suppress inspection "TrailingSpacesInProperty" +guiUtil.accountExport.tradingAccount=Account di trading con id {0}\n +# suppress inspection "TrailingSpacesInProperty" +guiUtil.accountImport.noImport=Non abbiamo importato un account di trading con ID {0} perché esiste già. +guiUtil.accountExport.exportFailed=L'esportazione CSV non è andata a buon fine a causa di un errore.\nErrore = {0} +guiUtil.accountExport.selectExportPath=Seleziona il percorso di esportazione +guiUtil.accountImport.imported=Conto di trading importato dalla cartella:\n{0}\n\nAccount importati:\n{1} +guiUtil.accountImport.noAccountsFound=Non è stato trovato alcun conto di trading esportato nella cartella: {0}.\nIl nome del file è {1}." +guiUtil.openWebBrowser.warning=Stai per aprire una pagina web nel tuo browser.\nVuoi aprire la pagina web adesso?\n\nSe non si utilizza \"Tor Browser\" come Web browser predefinito, ci si collegherà alla pagina Web in chiaro.\n\nURL: \"{0}\" +guiUtil.openWebBrowser.doOpen=Apri la pagina web e non chiedere più +guiUtil.openWebBrowser.copyUrl=Copia URL e annulla +guiUtil.ofTradeAmount=di importo commerciale +guiUtil.requiredMinimum=(minimo richiesto) + +#################################################################### +# Component specific +#################################################################### + +list.currency.select=Seleziona valuta +list.currency.showAll=Mostra tutto +list.currency.editList=Modifica elenco valuta + +table.placeholder.noItems=Attualmente non ci sono {0} disponibili +table.placeholder.noData=Attualmente non ci sono dati disponibili +table.placeholder.processingData=Elaborazione dei dati... + + +peerInfoIcon.tooltip.tradePeer=Peer di scambio +peerInfoIcon.tooltip.maker=Del Maker +peerInfoIcon.tooltip.trade.traded={0} Indirizzo onion: {1}\nHai già scambiato {2} volte in quel peer\n{3} +peerInfoIcon.tooltip.trade.notTraded={0} Indirizzo onion: {1}\nFinora non hai commerciato con quel peer.\n{2} +peerInfoIcon.tooltip.age=Conto di pagamento creato {0} fa. +peerInfoIcon.tooltip.unknownAge=Età dell'account di pagamento non nota. + +tooltip.openPopupForDetails=Apri il popup per i dettagli +tooltip.invalidTradeState.warning=This trade is in an invalid state. Open the details window for more information +tooltip.openBlockchainForAddress=Apri Explorer blockchain esterno per indirizzo: {0} +tooltip.openBlockchainForTx=Apri Explorer blockchain esterno per la transazione: {0} + +confidence.unknown=Stato della transazione sconosciuto +confidence.seen=Visto da {0} conferme peer / 0 +confidence.confirmed=Confermato in {0} blocco (chi) +confidence.invalid=La transazione non è valida + +peerInfo.title=Info peer +peerInfo.nrOfTrades=Numero di scambi effettuati +peerInfo.notTradedYet=Finora non hai commerciato con quell'utente. +peerInfo.setTag=Imposta tag per questo peer +peerInfo.age.noRisk=Età del conto di pagamento +peerInfo.age.chargeBackRisk=Tempo dall'iscrizione +peerInfo.unknownAge=Età sconosciuta + +addressTextField.openWallet=Apri il tuo portafoglio Bitcoin predefinito +addressTextField.copyToClipboard=Copia l'indirizzo negli appunti +addressTextField.addressCopiedToClipboard=L'indirizzo è stato copiato negli appunti +addressTextField.openWallet.failed=Il tentativo di aprire un portafoglio bitcoin predefinito è fallito. Forse non ne hai installato uno? + +peerInfoIcon.tooltip={0}\nTag: {1} + +txIdTextField.copyIcon.tooltip=Copia l'ID transazione negli appunti +txIdTextField.blockExplorerIcon.tooltip=Open a blockchain explorer with this transaction ID +txIdTextField.missingTx.warning.tooltip=Missing required transaction + + +#################################################################### +# Navigation +#################################################################### + +navigation.account=\"Conto\" +navigation.account.walletSeed=\"Conto/Seed wallet\" +navigation.funds.availableForWithdrawal=\"Funds/Send funds\" +navigation.portfolio.myOpenOffers=\"Portfolio/Le mie offerte aperte\" +navigation.portfolio.pending=\"Portafoglio/Scambi aperti\" +navigation.portfolio.closedTrades=\"Portafoglio/Storia\" +navigation.funds.depositFunds=\"Fondi/Ricevifondi\" +navigation.settings.preferences=\"Impostazioni/Preferenze\" +# suppress inspection "UnusedProperty" +navigation.funds.transactions=\"Fondi/Transazioni\" +navigation.support=\"Supporto\" +navigation.dao.wallet.receive=\"Portafoglio DAO/BSQ/Ricevi\" + + +#################################################################### +# Formatter +#################################################################### + +formatter.formatVolumeLabel={0} importo{1} +formatter.makerTaker=Maker come {0} {1} / Taker come {2} {3} +formatter.youAreAsMaker=Sei {0} {1} come maker / Taker è {2} {3} +formatter.youAreAsTaker=Sei {0} {1} come Taker / make è {2} {3} +formatter.youAre=Sei {0} {1} ({2} {3}) +formatter.youAreCreatingAnOffer.fiat=Stai creando un'offerta per {0} {1} +formatter.youAreCreatingAnOffer.altcoin=Stai creando un'offerta per {0} {1} ({2} {3}) +formatter.asMaker={0} {1} come maker +formatter.asTaker={0} {1} come taker + + +#################################################################### +# Domain specific +#################################################################### + +# we use enum values here +# dynamic values are not recognized by IntelliJ +# suppress inspection "UnusedProperty" +BTC_MAINNET=Mainnet Bitcoin +# suppress inspection "UnusedProperty" +BTC_TESTNET=Testnet Bitcoin +# suppress inspection "UnusedProperty" +BTC_REGTEST=Regtest Bitcoin +# suppress inspection "UnusedProperty" +BTC_DAO_TESTNET=Testnet DAO Bitcoin (deprecata) +# suppress inspection "UnusedProperty" +BTC_DAO_BETANET=Betanet Bisq DAO (Mainnet Bitcoin) +# suppress inspection "UnusedProperty" +BTC_DAO_REGTEST=Regtest DAO Bitcoin + +time.year=Anno +time.month=Mese +time.week=Settimana +time.day=Giorno +time.hour=Ora +time.minute10=10 Minuti +time.hours=ore +time.days=giorni +time.1hour=1 ora +time.1day=1 giorno +time.minute=minuto +time.second=secondo +time.minutes=minuti +time.seconds=secondi + + +password.enterPassword=Inserisci password +password.confirmPassword=Conferma password +password.tooLong=La password deve contenere meno di 500 caratteri. +password.deriveKey=Deriva la chiave dalla password +password.walletDecrypted=Portafoglio decodificato correttamente e protezione con password rimossa. +password.wrongPw=Hai inserito la password errata.\n\nProva a inserire nuovamente la password, verificando attentamente errori di battitura o errori di ortografia. +password.walletEncrypted=Portafoglio crittografato correttamente e protezione con password abilitata. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). +password.passwordsDoNotMatch=Le 2 password inserite non corrispondono. +password.forgotPassword=Password dimenticata? +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup + +seed.seedWords=Parole seed del portafoglio +seed.enterSeedWords=Inserisci le parole del seed del portafoglio +seed.date=Data portafoglio +seed.restore.title=Ripristina portafogli dalle parole del seed +seed.restore=Ripristina portafogli +seed.creationDate=Data di creazione +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". +seed.warn.walletNotEmpty.restore=Voglio comunque effettuare il ripristino +seed.warn.walletNotEmpty.emptyWallet=Prima svuoterò i miei portafogli +seed.warn.notEncryptedAnymore=I tuoi portafogli sono crittografati.\n\nDopo il ripristino, i portafogli non saranno più crittografati ed è necessario impostare una nuova password.\n\nVuoi procedere? +seed.warn.walletDateEmpty=As you have not specified a wallet date, bisq will have to scan the blockchain from 2013.10.09 (the BIP39 epoch date).\n\nBIP39 wallets were first introduced in bisq on 2017.06.28 (release v0.5). So you could save time by using that date.\n\nIdeally you should specify the date your wallet seed was created.\n\n\nAre you sure you want to go ahead without specifying a wallet date? +seed.restore.success=Portafogli ripristinati con successo con le nuove parole mnemoniche.\n\nÈ necessario arrestare e riavviare l'applicazione. +seed.restore.error=Si è verificato un errore durante il ripristino dei portafogli con le parole del seme. {0} +seed.restore.openOffers.warn=You have open offers which will be removed if you restore from seed words.\nAre you sure that you want to continue? + + +#################################################################### +# Payment methods +#################################################################### + +payment.account=Account +payment.account.no=Account n° +payment.account.name=Nome conto +payment.account.userName=User name +payment.account.phoneNr=Phone number +payment.account.owner=Nome completo del proprietario del conto +payment.account.fullName=Nome completo (nome, secondo nome, cognome) +payment.account.state=Stato/Provincia/Regione +payment.account.city=Città +payment.bank.country=Paese della banca +payment.account.name.email=Nome completo / email del proprietario dell'account +payment.account.name.emailAndHolderId=Nome completo del proprietario dell'account / email / {0} +payment.bank.name=Nome Banca +payment.select.account=Seleziona il tipo di account +payment.select.region=Seleziona regione +payment.select.country=Seleziona nazione +payment.select.bank.country=Seleziona il paese della banca +payment.foreign.currency=Sei sicuro di voler scegliere una valuta diversa dalla valuta predefinita del paese? +payment.restore.default=No, ripristina valuta predefinita +payment.email=Email +payment.country=Paese +payment.extras=Requisiti extra +payment.email.mobile=Email o numero di telefono cellulare +payment.altcoin.address=Indirizzo altcoin +payment.altcoin.tradeInstantCheckbox=Fai trading istantaneo (entro 1 ora) con questa Altcoin +payment.altcoin.tradeInstant.popup=Per il trading istantaneo è necessario che entrambi i peer di trading siano online per poter completare lo scambio in meno di 1 ora.\n\nSe le tue offerte sono aperte ma non sei momentaneamente disponibile, disabilita tali offerte nella schermata "Portafoglio". +payment.altcoin=Altcoin +payment.select.altcoin=Select or search Altcoin +payment.secret=Domanda segreta +payment.answer=Risposta +payment.wallet=ID portafoglio +payment.uphold.accountId=Nome utente o e-mail o n. di telefono +payment.moneyBeam.accountId=Email o numero di telefono fisso +payment.venmo.venmoUserName=Nome utente Venmo +payment.popmoney.accountId=Email o numero di telefono fisso +payment.promptPay.promptPayId=Codice fiscale/P.IVA o n. di telefono +payment.supportedCurrencies=Valute supportate +payment.limitations=Limitazioni +payment.salt=Sale per la verifica dell'età dell'account +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). +payment.accept.euro=Accetta operazioni da questi paesi dell'Euro +payment.accept.nonEuro=Accetta operazioni da questi paesi non Euro +payment.accepted.countries=Paesi accettati +payment.accepted.banks=Banche accettate (ID) +payment.mobile=N. di cellulare +payment.postal.address=Indirizzo postale +payment.national.account.id.AR=Numero CBU +shared.accountSigningState=Stato della firma dell'account + +#new +payment.altcoin.address.dyn={0} indirizzi +payment.altcoin.receiver.address=Indirizzo altcoin del destinatario +payment.accountNr=Numero conto +payment.emailOrMobile=Email o numero di telefono cellulare +payment.useCustomAccountName=Usa nome dell'account personalizzato +payment.maxPeriod=Max. periodo di scambio consentito +payment.maxPeriodAndLimit=Max. durata dello scambio: {0} / Max. acquisto: {1} / Max. vendita: {2} / Età dell'account: {3} +payment.maxPeriodAndLimitCrypto=Max. durata commerciale: {0} / Max. limite commerciale: {1} +payment.currencyWithSymbol=Valuta: {0} +payment.nameOfAcceptedBank=Nome della banca accettata +payment.addAcceptedBank=Aggiungi banca accettata +payment.clearAcceptedBanks=Cancella banche accettate +payment.bank.nameOptional=Nome della banca (opzionale) +payment.bankCode=Codice bancario +payment.bankId=ID banca (BIC/SWIFT) +payment.bankIdOptional=ID banca (BIC/SWIFT) (opzionale) +payment.branchNr=Filiale n. +payment.branchNrOptional=Filiale n. (opzionale) +payment.accountNrLabel=Conto n. (IBAN) +payment.accountType=Tipologia conto +payment.checking=Verifica +payment.savings=Risparmi +payment.personalId=ID personale +payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. +payment.fasterPayments.newRequirements.info=Alcune banche hanno iniziato a verificare il nome completo del destinatario per i trasferimenti di Faster Payments (UK). Il tuo attuale account Faster Payments non specifica un nome completo.\n\nTi consigliamo di ricreare il tuo account Faster Payments in Bisq per fornire ai futuri acquirenti {0} un nome completo.\n\nQuando si ricrea l'account, assicurarsi di copiare il codice di ordinamento preciso, il numero di account e i valori salt della verifica dell'età dal vecchio account al nuovo account. Ciò garantirà il mantenimento dell'età del tuo account esistente e lo stato della firma.\n  +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.halCash.info=Quando utilizza HalCash, l'acquirente BTC deve inviare al venditore BTC il codice HalCash tramite un messaggio di testo dal proprio telefono cellulare.\n\nAssicurati di non superare l'importo massimo che la tua banca ti consente di inviare con HalCash. L'importo minimo per prelievo è di 10 EURO, l'importo massimo è di 600 EURO. Per prelievi ripetuti è di 3000 EURO per destinatario al giorno e 6000 EURO per destintario al mese. Verifica i limiti con la tua banca per accertarti che utilizzino gli stessi limiti indicati qui.\n\nL'importo del prelievo deve essere un multiplo di 10 EURO in quanto non è possibile prelevare altri importi da un bancomat. L'interfaccia utente nella schermata di creazione offerta e accettazione offerta modificherà l'importo BTC in modo che l'importo in EURO sia corretto. Non è possibile utilizzare il prezzo di mercato poiché l'importo in EURO cambierebbe al variare dei prezzi.\n\nIn caso di controversia, l'acquirente BTC deve fornire la prova di aver inviato gli EURO. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. + +payment.cashDeposit.info=Conferma che la tua banca ti consente di inviare depositi in contanti su conti di altre persone. Ad esempio, Bank of America e Wells Fargo non consentono più tali depositi. + +payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.revolut.addUserNameInfo.headLine=Update Revolut account + +payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. + +payment.f2f.contact=Informazioni di contatto +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) +payment.f2f.city=Città per l'incontro 'Faccia a faccia' +payment.f2f.city.prompt=La città verrà visualizzata con l'offerta +payment.f2f.optionalExtra=Ulteriori informazioni opzionali +payment.f2f.extra=Informazioni aggiuntive + +payment.f2f.extra.prompt=Il maker può definire "termini e condizioni" o aggiungere informazioni di contatto pubbliche. Verrà visualizzato con l'offerta. +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] +payment.f2f.info.openURL=Apri sito web +payment.f2f.offerbook.tooltip.countryAndCity=Paese e città: {0} / {1} +payment.f2f.offerbook.tooltip.extra=Ulteriori informazioni: {0} + +payment.japan.bank=Banca +payment.japan.branch=Filiale +payment.japan.account=Account +payment.japan.recipient=Nome +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] + +# We use constants from the code so we do not use our normal naming convention +# dynamic values are not recognized by IntelliJ + +# Only translate general terms +NATIONAL_BANK=Bonifico bancario nazionale +SAME_BANK=Trasferimento con la stessa banca +SPECIFIC_BANKS=Trasferimenti con banche specifiche +US_POSTAL_MONEY_ORDER=Vaglia Postale USA +CASH_DEPOSIT=Deposito contanti +MONEY_GRAM=MoneyGram +WESTERN_UNION=Western Union +F2F=Faccia a faccia (di persona) +JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australian PayID + +# suppress inspection "UnusedProperty" +NATIONAL_BANK_SHORT=Banche nazionali +# suppress inspection "UnusedProperty" +SAME_BANK_SHORT=Stessa banca +# suppress inspection "UnusedProperty" +SPECIFIC_BANKS_SHORT=Banche specifiche +# suppress inspection "UnusedProperty" +US_POSTAL_MONEY_ORDER_SHORT=US Money Order +# suppress inspection "UnusedProperty" +CASH_DEPOSIT_SHORT=Deposito contanti +# suppress inspection "UnusedProperty" +MONEY_GRAM_SHORT=MoneyGram +# suppress inspection "UnusedProperty" +WESTERN_UNION_SHORT=Western Union +# suppress inspection "UnusedProperty" +F2F_SHORT=F2F +# suppress inspection "UnusedProperty" +JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID + +# Do not translate brand names +# suppress inspection "UnusedProperty" +UPHOLD=Uphold +# suppress inspection "UnusedProperty" +MONEY_BEAM=MoneyBeam (N26) +# suppress inspection "UnusedProperty" +POPMONEY=Popmoney +# suppress inspection "UnusedProperty" +REVOLUT=Revolut +# suppress inspection "UnusedProperty" +PERFECT_MONEY=Perfect Money +# suppress inspection "UnusedProperty" +ALI_PAY=AliPay +# suppress inspection "UnusedProperty" +WECHAT_PAY=WeChat Pay +# suppress inspection "UnusedProperty" +SEPA=SEPA +# suppress inspection "UnusedProperty" +SEPA_INSTANT=Pagamenti istantanei SEPA +# suppress inspection "UnusedProperty" +FASTER_PAYMENTS=Faster Payments +# suppress inspection "UnusedProperty" +SWISH=Swish +# suppress inspection "UnusedProperty" +CLEAR_X_CHANGE=Zelle (ClearXchange) +# suppress inspection "UnusedProperty" +CHASE_QUICK_PAY=Chase QuickPay +# suppress inspection "UnusedProperty" +INTERAC_E_TRANSFER=Interac e-Transfer +# suppress inspection "UnusedProperty" +HAL_CASH=HalCash +# suppress inspection "UnusedProperty" +BLOCK_CHAINS=Altcoin +# suppress inspection "UnusedProperty" +PROMPT_PAY=PromptPay +# suppress inspection "UnusedProperty" +ADVANCED_CASH=Advanced Cash +# suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" +BLOCK_CHAINS_INSTANT=Altcoin Instant + +# Deprecated: Cannot be deleted as it would break old trade history entries +# suppress inspection "UnusedProperty" +OK_PAY=OKPay +# suppress inspection "UnusedProperty" +CASH_APP=Cash App +# suppress inspection "UnusedProperty" +VENMO=Venmo + + +# suppress inspection "UnusedProperty" +UPHOLD_SHORT=Uphold +# suppress inspection "UnusedProperty" +MONEY_BEAM_SHORT=MoneyBeam (N26) +# suppress inspection "UnusedProperty" +POPMONEY_SHORT=Popmoney +# suppress inspection "UnusedProperty" +REVOLUT_SHORT=Revolut +# suppress inspection "UnusedProperty" +PERFECT_MONEY_SHORT=Perfect Money +# suppress inspection "UnusedProperty" +ALI_PAY_SHORT=AliPay +# suppress inspection "UnusedProperty" +WECHAT_PAY_SHORT=WeChat Pay +# suppress inspection "UnusedProperty" +SEPA_SHORT=SEPA +# suppress inspection "UnusedProperty" +SEPA_INSTANT_SHORT=SEPA Istantaneo +# suppress inspection "UnusedProperty" +FASTER_PAYMENTS_SHORT=Faster Payments +# suppress inspection "UnusedProperty" +SWISH_SHORT=Swish +# suppress inspection "UnusedProperty" +CLEAR_X_CHANGE_SHORT=Zelle +# suppress inspection "UnusedProperty" +CHASE_QUICK_PAY_SHORT=Chase QuickPay +# suppress inspection "UnusedProperty" +INTERAC_E_TRANSFER_SHORT=Interac e-Transfer +# suppress inspection "UnusedProperty" +HAL_CASH_SHORT=HalCash +# suppress inspection "UnusedProperty" +BLOCK_CHAINS_SHORT=Altcoin +# suppress inspection "UnusedProperty" +PROMPT_PAY_SHORT=PromptPay +# suppress inspection "UnusedProperty" +ADVANCED_CASH_SHORT=Advanced Cash +# suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" +BLOCK_CHAINS_INSTANT_SHORT=Altcoin Instant + +# Deprecated: Cannot be deleted as it would break old trade history entries +# suppress inspection "UnusedProperty" +OK_PAY_SHORT=OKPay +# suppress inspection "UnusedProperty" +CASH_APP_SHORT=Cash App +# suppress inspection "UnusedProperty" +VENMO_SHORT=Venmo + + +#################################################################### +# Validation +#################################################################### + +validation.empty=Un input vuoto non è consentito. +validation.NaN=L'input non è un numero valido. +validation.notAnInteger=L'input non è un valore intero. +validation.zero=Un input di 0 non è consentito. +validation.negative=Un valore negativo non è consentito. +validation.fiat.toSmall=Non è consentito un input inferiore al minimo possibile. +validation.fiat.toLarge=Non è consentito un input maggiore del massimo possibile. +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi +validation.btc.toLarge=L'immissione maggiore di {0} non è consentita. +validation.btc.toSmall=L'immissione inferiore a {0} non è consentita. +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. +validation.passwordTooLong=La password inserita è troppo lunga. Non può contenere più di 50 caratteri. +validation.sortCodeNumber={0} deve essere composto da {1} numeri. +validation.sortCodeChars={0} deve essere composto da {1} caratteri. +validation.bankIdNumber={0} deve essere composto da {1} numeri. +validation.accountNr=Il numero di conto deve essere composto da {0} numeri. +validation.accountNrChars=Il numero di conto deve contenere {0} caratteri. +validation.btc.invalidAddress=L'indirizzo non è corretto Si prega di controllare il formato dell'indirizzo. +validation.integerOnly=Inserisci solo numeri interi. +validation.inputError=Il tuo input ha causato un errore:\n{0} +validation.bsq.insufficientBalance=Il saldo disponibile è {0}. +validation.btc.exceedsMaxTradeLimit=Il tuo limite commerciale è {0}. +validation.bsq.amountBelowMinAmount=L'importo minimo è di {0} +validation.nationalAccountId={0} deve essere composto da {1} numeri. + +#new +validation.invalidInput=Input non valido: {0} +validation.accountNrFormat=Il numero di conto deve essere nel formato: {0} +# suppress inspection "UnusedProperty" +validation.altcoin.wrongStructure=Convalida dell'indirizzo non riuscita perché non corrisponde alla struttura di un indirizzo {0}. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.invalidAddress=L'indirizzo non è un indirizzo {0} valido! {1} +# suppress inspection "UnusedProperty" +validation.altcoin.liquidBitcoin.invalidAddress=Gli indirizzi segwit nativi (quelli che iniziano con 'lq') non sono supportati. +validation.bic.invalidLength=Input length must be 8 or 11 +validation.bic.letters=Il codice bancario e quello nazionale devono essere lettere +validation.bic.invalidLocationCode=BIC contiene un codice di posizione non valido +validation.bic.invalidBranchCode=BIC contiene un codice di filiale non valido +validation.bic.sepaRevolutBic=Gli account Revolut Sepa non sono supportati. +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. +validation.email.invalidAddress=Indirizzo non valido +validation.iban.invalidCountryCode=Codice paese non valido +validation.iban.checkSumNotNumeric=Il checksum deve essere numerico +validation.iban.nonNumericChars=Rilevato carattere non alfanumerico +validation.iban.checkSumInvalid=Il checksum IBAN non è valido +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. +validation.interacETransfer.invalidAreaCode=Prefisso non canadese +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address +validation.interacETransfer.invalidQuestion=Deve contenere solo lettere, numeri, spazi e / o i simboli ' _ , . ? - +validation.interacETransfer.invalidAnswer=Deve essere una parola e contenere solo lettere, numeri e/o il simbolo - +validation.inputTooLarge=L'input non deve essere maggiore di {0} +validation.inputTooSmall=L'input deve essere maggiore di {0} +validation.inputToBeAtLeast=L'input deve essere almeno di {0} +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. +validation.length=La lunghezza deve essere compresa tra {0} e {1} +validation.pattern=L'input deve essere nel formato: {0} +validation.noHexString=L'input non è in formato HEX. +validation.advancedCash.invalidFormat=Deve essere un ID e-mail o portafoglio valido del formato: X000000000000 +validation.invalidUrl=Questo URL non è valido +validation.mustBeDifferent=L'input deve essere diverso dal valore corrente +validation.cannotBeChanged=Il parametro non può essere modificato +validation.numberFormatException=Eccezione formato numero {0} +validation.mustNotBeNegative=L'input non deve essere negativo +validation.phone.missingCountryCode=È necessario un codice paese di due lettere per convalidare il numero di telefono +validation.phone.invalidCharacters=Il numero di telefono {0} contiene caratteri non validi +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. +validation.invalidAddressList=Deve essere un elenco separato da virgole di indirizzi validi diff --git a/core/src/main/resources/i18n/displayStrings_ja.properties b/core/src/main/resources/i18n/displayStrings_ja.properties index 81173b5701..8c83fda0c8 100644 --- a/core/src/main/resources/i18n/displayStrings_ja.properties +++ b/core/src/main/resources/i18n/displayStrings_ja.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=オファー shared.multipleOffers=オファー shared.Offer=オファー +shared.offerVolumeCode={0} オファー量 shared.openOffers=オープンオファー shared.trade=トレード shared.trades=トレード @@ -96,7 +97,7 @@ shared.dontRemoveOffer=オファー取り消さない shared.editOffer=オファーを編集 shared.openLargeQRWindow=大きいQRコードウィンドウを開く shared.tradingAccount=取引アカウント -shared.faq=よくある質問ページを訪れる +shared.faq=FAQを参照する shared.yesCancel=はい、取り消します shared.nextStep=次へ shared.selectTradingAccount=取引アカウントを選択 @@ -122,7 +123,8 @@ shared.noDateAvailable=日付がありません shared.noDetailsAvailable=詳細不明 shared.notUsedYet=未使用 shared.date=日付 -shared.sendFundsDetailsWithFee=送金中: {0}\n送金元アドレス: {1}\n入金先アドレス: {2}\n必要なマイニング手数料: {3} ({4} Satoshis/byte)\nトランザクションサイズ: {5} Kb\n\n入金先の受け取る金額: {6}\n\n本当にこの金額を出金しますか? +shared.sendFundsDetailsWithFee=送金中: {0}\n送金元アドレス: {1}\n入金先アドレス: {2}\n必要なマイニング手数料: {3} ({4} Satoshis/byte)\nトランザクションvサイズ: {5} vKb\n\n入金先の受け取る金額: {6}\n\n本当にこの金額を出金しますか? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisqがこのトランザクションはダストの最小閾値以下のおつりアウトプットを生じることを検出しました(それにしたがって、ビットコインのコンセンサス・ルールによって許されない)。代わりに、その ({0} satoshi{1}) のダストはマイニング手数料に追加されます。\n\n\n shared.copyToClipboard=クリップボードにコピー shared.language=言語 @@ -188,7 +190,6 @@ shared.tradeWalletAddress=トレードウォレットアドレス shared.tradeWalletBalance=トレードウォレット残高 shared.makerTxFee=メイカー: {0} shared.takerTxFee=テイカー: {0} -shared.securityDepositBox.description=BTC {0} のセキュリティデポジット shared.iConfirm=確認します shared.tradingFeeInBsqInfo=トレード手数料として使用される{0}と同じ shared.openURL={0} をオープン @@ -208,14 +209,14 @@ shared.votes=投票 shared.learnMore=もっと詳しく知る shared.dismiss=却下する shared.selectedArbitrator=選択された調停人 -shared.selectedMediator=選択された調停人 -shared.selectedRefundAgent=選択された調停人 +shared.selectedMediator=選択された調停者 +shared.selectedRefundAgent=選択された仲裁者 shared.mediator=調停者 -shared.arbitrator=調停人 -shared.refundAgent=調停人 -shared.refundAgentForSupportStaff=Refund agent -shared.delayedPayoutTxId=Delayed payout transaction ID -shared.delayedPayoutTxReceiverAddress=Delayed payout transaction sent to +shared.arbitrator=仲裁者 +shared.refundAgent=仲裁者 +shared.refundAgentForSupportStaff=仲裁者 +shared.delayedPayoutTxId=遅延支払いトランザクションID +shared.delayedPayoutTxReceiverAddress=遅延支払いトランザクション送り先 shared.unconfirmedTransactionsLimitReached=現在、非確認されたトランザクションが多すぎます。しばらく待ってからもう一度試して下さい。 @@ -237,8 +238,6 @@ mainView.menu.settings=設定 mainView.menu.account=アカウント mainView.menu.dao=DAO -mainView.marketPrice.provider=価格 by -mainView.marketPrice.label=市場価格 mainView.marketPriceWithProvider.label={0} による市場価格 mainView.marketPrice.bisqInternalPrice=Bisqにおける最新の取引価格 mainView.marketPrice.tooltip.bisqInternalPrice=利用可能な外部価格フィードプロバイダーからの市場価格がありません。\n表示されている価格は、その通貨の最新のBisq取引価格です。 @@ -251,14 +250,15 @@ mainView.balance.locked.short=ロック中 mainView.footer.usingTor=(Torを使用中) mainView.footer.localhostBitcoinNode=(ローカルホスト) -mainView.footer.btcInfo=ビットコインネットワークピア: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ 現在の手数料率: {0} サトシ/vB mainView.footer.btcInfo.initializing=ビットコインネットワークに接続中 mainView.footer.bsqInfo.synchronizing=/ DAOと同期中 mainView.footer.btcInfo.synchronizingWith=同期中 mainView.footer.btcInfo.synchronizedWith=同期されています: mainView.footer.btcInfo.connectingTo=接続中: mainView.footer.btcInfo.connectionFailed=接続失敗 -mainView.footer.p2pInfo=Bisqネットワークピア: {0} +mainView.footer.p2pInfo=ビットコインネットワークピア: {0} / Bisqネットワークピア: {1} mainView.footer.daoFullNode=DAOのフルノード mainView.bootstrapState.connectionToTorNetwork=(1/4) Torネットワークに接続中... @@ -292,7 +292,6 @@ market.tabs.spread=詳細 market.tabs.trades=取引 # OfferBookChartView -market.offerBook.chart.title={0}のオファーブック market.offerBook.buyAltcoin={0}を買う({1}を売る) market.offerBook.sellAltcoin={0}を売る({1}を買う) market.offerBook.buyWithFiat={0}を買う @@ -312,12 +311,12 @@ market.spread.spreadColumn=スプレッド # TradesChartsView market.trades.nrOfTrades=取引: {0} market.trades.tooltip.volumeBar=取引量: {0}\n取引数: {1}\n日付: {2} -market.trades.tooltip.candle.open=オープン: +market.trades.tooltip.candle.open=オープン: market.trades.tooltip.candle.close=クローズ: market.trades.tooltip.candle.high=最高: market.trades.tooltip.candle.low=最低: market.trades.tooltip.candle.average=平均: -market.trades.tooltip.candle.median=Median: +market.trades.tooltip.candle.median=中央値: market.trades.tooltip.candle.date=日付: #################################################################### @@ -337,7 +336,7 @@ offerbook.offerersAcceptedBankSeats=利用可能な銀行の国名(テイカ offerbook.availableOffers=利用可能なオファー offerbook.filterByCurrency=通貨でフィルター offerbook.filterByPaymentMethod=支払い方法でフィルター -offerbook.timeSinceSigning=Signed since +offerbook.timeSinceSigning=署名後経過時間 offerbook.timeSinceSigning.info=このアカウントは認証されまして、{0} offerbook.timeSinceSigning.info.arbitrator=調停人に署名されました。ピアアカウントも署名できます offerbook.timeSinceSigning.info.peer=ピアが署名しました。制限の解除を待ちます @@ -346,9 +345,9 @@ offerbook.timeSinceSigning.info.signer=ピアが署名しました。ピアア offerbook.timeSinceSigning.info.banned=このアカウントは禁止されました offerbook.timeSinceSigning.daysSinceSigning={0}日 offerbook.timeSinceSigning.daysSinceSigning.long=署名する後から {0} -offerbook.xmrAutoConf=Is auto-confirm enabled +offerbook.xmrAutoConf=自動確認は有効されますか? -offerbook.timeSinceSigning.help=When you successfully complete a trade with a peer who has a signed payment account, your payment account is signed.\n{0} days later, the initial limit of {1} is lifted and your account can sign other peers'' payment accounts. +offerbook.timeSinceSigning.help=署名された支払いアカウントを持っているピアと成功にトレードすると、自身の支払いアカウントも署名されることになります。\n{0} 日後に、{1} という初期の制限は解除され、他のピアの支払いアカウントを署名できるようになります。 offerbook.timeSinceSigning.notSigned=まだ署名されていません offerbook.timeSinceSigning.notSigned.noNeed=N/A shared.notSigned=このアカウントはまだ署名されていません @@ -380,12 +379,12 @@ offerbook.warning.noTradingAccountForCurrency.msg=選択した通貨の支払い offerbook.warning.noMatchingAccount.headline=一致する支払いアカウントがありません offerbook.warning.noMatchingAccount.msg=このオファーは、まだ設定されない支払い方法を利用します。\n\n今すぐ新しい支払いアカウントを設定しますか? -offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions +offerbook.warning.counterpartyTradeRestrictions=相手方のトレード制限のせいでこのオファーを受けることができません -offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=このバージョンのソフトウェアでは、トレードするピアがお互いの支払いアカウントを署名・検証でき、信頼できる支払いアカウントのネットワークを作れるようにします。\n\n検証されたアカウントと成功にトレードしたら、自身の支払いアカウントも署名されることになり、一定の時間が過ぎたらトレード制限は解除されます(時間の長さは検証方法によって異なります)。\n\nアカウント署名について詳しくは、ドキュメンテーションを参照して下さい:[HYPERLINK:https://docs.bisq.network/payment-methods#account-signing] -popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} -popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} +popup.warning.tradeLimitDueAccountAgeRestriction.seller=許可されたトレード金額は以下のセキュリティ基準に基づいて {0} に制限されました:\n- 買い手のアカウントは調停人やピアに署名されていません\n- 買い手のアカウントが署名された時から30日未満がたちました\n- このオファーの支払い方法は、銀行のチャージバックのリスクが高いと考えられます\n\n{1} +popup.warning.tradeLimitDueAccountAgeRestriction.buyer=許可されたトレード金額は以下のセキュリティ基準に基づいて {0} に制限されました:\n- このアカウントは調停人やピアに署名されていません\n- このアカウントが署名された時から30日未満がたちました\n- このオファーの支払い方法は、銀行のチャージバックのリスクが高いと考えられます\n\n{1} offerbook.warning.wrongTradeProtocol=そのオファーには、ご使用のソフトウェアのバージョンで使用されているものとは異なるプロトコルバージョンが必要です。\n\n最新バージョンがインストールされているかどうかを確認してください。そうでなければ、オファーを作成したユーザーが古いバージョンを使用しています。\n\nユーザーは、互換性のないトレードプロトコルバージョンと取引することはできません。 offerbook.warning.userIgnored=そのユーザのonionアドレスを無視リストに追加しました。 @@ -393,9 +392,8 @@ offerbook.warning.offerBlocked=そのオファーはBisq開発者によってブ offerbook.warning.currencyBanned=そのオファーで使用されている通貨はBisq開発者によってブロックされています。\n詳しくはBisqフォーラムをご覧ください。 offerbook.warning.paymentMethodBanned=そのオファーで使用されている支払い方法はBisq開発者によってブロックされています。\n詳しくはBisqフォーラムをご覧ください。 offerbook.warning.nodeBlocked=そのonionアドレスはBisq開発者によってブロックされました。\nおそらくその取引者からのオファーを受けるときに問題が引きおこさる未処理のバグがあります。 -offerbook.warning.requireUpdateToNewVersion=あなたのBisqのバージョンではもうトレードの互換性がありません。\nhttps://bisq.network/downloads で最新のBisqバージョンに更新してください。 -offerbook.warning.tradeLimitNotMatching=Your payment account has been created {0} ago. Your trade limit is based on the account age and is not sufficient for that offer.\n\nYour trade limit is: {1}\nThe min. trade amount of the offer is: {2}.\n\nYou cannot take that offer at the moment. Once your account is older than 2 months this restriction gets removed. -offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. +offerbook.warning.requireUpdateToNewVersion=このBisqのバージョンはもはやトレードする互換性がありません。\n[HYPERLINK:https://bisq.network/downloads] で最新のBisqバージョンに更新してください。 +offerbook.warning.offerWasAlreadyUsedInTrade=このオファーを以前に受けましたせいで、現在受けることができません。以前のオファー受け入り試みは失敗トレードに終わりましたかもしれません。 offerbook.info.sellAtMarketPrice=市場価格で売却されるでしょう(毎分更新されます)。 offerbook.info.buyAtMarketPrice=市場価格で購入されるでしょう(毎分更新されます)。 @@ -445,7 +443,6 @@ createOffer.alreadyFunded=このオファーは既に入金済みです。\n資 createOffer.createOfferFundWalletInfo.headline=あなたのオファーへ入金 # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount= - 取引額: {0}\n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0}と{1} createOffer.createOfferFundWalletInfo.msg=このオファーに対して {0} のデポジットを送金する必要があります。\n\nこの資金はあなたのローカルウォレットに予約済として保管され、オファーが受け入れられた時にマルチシグデポジットアドレスに移動しロックされます。\n\n金額の合計は以下の通りです\n{1} - セキュリティデポジット: {2}\n- 取引手数料: {3}\n- マイニング手数料: {4}\n\nこのオファーにデポジットを送金するには、以下の2つの方法があります。\n- Bisqウォレットを使う (便利ですがトランザクションが追跡される可能性があります)\n- 外部のウォレットから送金する (機密性の高い方法です)\n\nこのポップアップを閉じると全ての送金方法について詳細な情報が表示されます。 # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -513,9 +510,10 @@ takeOffer.failed.offerTaken=そのオファーは既に別の取引者によっ takeOffer.failed.offerRemoved=そのオファーはこの間に削除されたため、そのオファーは受け取れません takeOffer.failed.offererNotOnline=メイカーがオンラインになっていないため、オファー受け入れに失敗しました。 takeOffer.failed.offererOffline=このオファーはメーカーがオフラインのため受け取れません -takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again. +takeOffer.warning.connectionToPeerLost=メイカーとの接続が切れました。\n相手がオフラインになったか、オープンな接続が多すぎるため、あなたへの接続を閉じた可能性があります。\n\nまだオファーブックに相手のオファーが表示されている場合は、もう一度そのオファーを受け取って下さい。 takeOffer.error.noFundsLost=\n\nあなたのウォレットにはまだ資金がありません\nアプリケーションを再起動し、ネットワーク接続を確認して問題を解決できるかどうかを確認してください。 +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nデポジットトランザクションは既に公開されています。\nアプリケーションを再起動し、ネットワーク接続を確認して問題を解決できるかどうかを確認してください。\nそれでも問題が解決しない場合は、開発者に連絡してください。 takeOffer.error.payoutPublished=\n\n支払いトランザクションは既に公開されています。\nアプリケーションを再起動し、ネットワーク接続を確認して問題を解決できるかどうかを確認してください。\nそれでも問題が解決しない場合は、開発者に連絡してください。 @@ -543,7 +541,7 @@ portfolio.tab.history=履歴 portfolio.tab.failed=失敗 portfolio.tab.editOpenOffer=オファーを編集 -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=欠測あるいは無効なトランザクションに関する問題があります。\n\nこの法定通貨・アルトコイン支払いの送信しないで下さい!サポートを受けるのに、Keybase [HYPERLINK:https://keybase.io/team/bisq] あるいは掲示板 [HYPERLINK:https://bisq.community] でBisqの開発者と連絡して下さい。\n\nエラーメッセージ: {0} portfolio.pending.step1.waitForConf=ブロックチェーンの承認をお待ち下さい portfolio.pending.step2_buyer.startPayment=支払い開始 @@ -552,10 +550,10 @@ portfolio.pending.step3_buyer.waitPaymentArrived=支払いが到着するまで portfolio.pending.step3_seller.confirmPaymentReceived=支払いを受領したことを確認して下さい portfolio.pending.step5.completed=完了 -portfolio.pending.step3_seller.autoConf.status.label=ステータスを自動確認する +portfolio.pending.step3_seller.autoConf.status.label=自動確認のステータス portfolio.pending.autoConf=自動確認されました portfolio.pending.autoConf.blocks=XMR承認: {0} / 必要: {1} -portfolio.pending.autoConf.state.xmr.txKeyReused=Transaction key re-used. Please open a dispute. +portfolio.pending.autoConf.state.xmr.txKeyReused=トランザクション・キーは再利用されました。係争を開始して下さい。 portfolio.pending.autoConf.state.confirmations=XMR承認: {0}/{1} portfolio.pending.autoConf.state.txNotFound=トランザクションはまだメモリプールに見られません portfolio.pending.autoConf.state.txKeyOrTxIdInvalid=有効なトランザクションID/トランザクション・キーはありません @@ -564,26 +562,26 @@ portfolio.pending.autoConf.state.filterDisabledFeature=開発者により無効 # suppress inspection "UnusedProperty" portfolio.pending.autoConf.state.FEATURE_DISABLED=自動確認機能は無効されました。{0} # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.TRADE_LIMIT_EXCEEDED=Trade amount exceeds auto-confirm amount limit +portfolio.pending.autoConf.state.TRADE_LIMIT_EXCEEDED=トレード金額は自動確認の金額制限を越えます # suppress inspection "UnusedProperty" portfolio.pending.autoConf.state.INVALID_DATA=ピアは無効データを提供しました。{0} # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.PAYOUT_TX_ALREADY_PUBLISHED=Payout transaction was already published. +portfolio.pending.autoConf.state.PAYOUT_TX_ALREADY_PUBLISHED=支払いトランザクションはすでに公開されました。 # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.DISPUTE_OPENED=Dispute was opened. Auto-confirm is deactivated for that trade. +portfolio.pending.autoConf.state.DISPUTE_OPENED=係争は開始されました。そのトレードでは自動確認が無効にされました。 # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.REQUESTS_STARTED=Transaction proof requests started +portfolio.pending.autoConf.state.REQUESTS_STARTED=トランザクション証明依頼を開始しました # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.PENDING=Success results: {0}/{1}; {2} +portfolio.pending.autoConf.state.PENDING=成功の成果: {0}/{1}; {2} # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.COMPLETED=Proof at all services succeeded +portfolio.pending.autoConf.state.COMPLETED=全てのサービスでは、証明が成功に終わりました # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.ERROR=An error at a service request occurred. No auto-confirm possible. +portfolio.pending.autoConf.state.ERROR=サービスリクエストにはエラーが生じました。自動確認できません。 # suppress inspection "UnusedProperty" -portfolio.pending.autoConf.state.FAILED=A service returned with a failure. No auto-confirm possible. +portfolio.pending.autoConf.state.FAILED=サービスは失敗を返しました。自動確認できません。 portfolio.pending.step1.info=デポジットトランザクションが発行されました。\n{0}は、支払いを開始する前に少なくとも1つのブロックチェーンの承認を待つ必要があります。 -portfolio.pending.step1.warn=The deposit transaction is still not confirmed. This sometimes happens in rare cases when the funding fee of one trader from an external wallet was too low. +portfolio.pending.step1.warn=デポジットトランザクションがまだ承認されていません。外部ウォレットからの取引者の資金調達手数料が低すぎるときには、例外的なケースで起こるかもしれません。 portfolio.pending.step1.openForDispute=デポジットトランザクションがまだ承認されていません。もう少し待つか、助けを求めて調停人に連絡できます。 # suppress inspection "TrailingSpacesInProperty" @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=重要な要件: \n支払いが完 # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=Western Unionを使用してBTCの売り手へ{0}をお支払いください。\n\n portfolio.pending.step2_buyer.westernUnion.extra=重要な要件: \n支払いが完了したら、MTCN(追跡番号)と領収書の写真を電子メールでBTCの売り手へ送信して下さい。\n領収書には、売り手の氏名、市区町村、国、金額が明確に示されている必要があります。売り手のメールアドレス: {0} +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard={0}のためのeGiftカードをアマゾンアカウントから買って、BTC売り手のEメールアドレスあるいは携帯電話番号を受取人に設定して下さい。トレード金額は最大許容量を越える場合、複数のカードを送って下さい。\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal={0}を「米国の郵便為替」でBTCの売り手に送付してください。\n\n @@ -631,24 +631,22 @@ portfolio.pending.step2_buyer.westernUnionMTCNInfo.headline=MTCNと領収書を portfolio.pending.step2_buyer.westernUnionMTCNInfo.msg=あなたはMTCN(追跡番号)とレシートの写真をBTCの売り手にEメールで送る必要があります。\n領収書には、売り手の氏名、市区町村、国、金額が明確に示されている必要があります。 販売者のメールアドレス: {0}\n\nMTCNと契約書を売り手へ送付しましたか? portfolio.pending.step2_buyer.halCashInfo.headline=HalCashコードを送信 portfolio.pending.step2_buyer.halCashInfo.msg=HalCashコードと取引ID({0})を含むテキストメッセージをBTCの売り手に送信する必要があります。\n売り手の携帯電話番号は {1} です。\n\n売り手にコードを送信しましたか? -portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=Some banks might verify the receiver's name. Faster Payments accounts created in old Bisq clients do not provide the receiver's name, so please use trade chat to obtain it (if needed). +portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=銀行によっては、受信者の名前を検証する場合があります。 旧バージョンのBisqクライアントで作成した「Faster Payments」アカウントでは、受信者の名前は提供されませんので、(必要ならば)トレードチャットで尋ねて下さい。 portfolio.pending.step2_buyer.confirmStart.headline=支払いが開始したことを確認 portfolio.pending.step2_buyer.confirmStart.msg=トレーディングパートナーへの{0}支払いを開始しましたか? portfolio.pending.step2_buyer.confirmStart.yes=はい、支払いを開始しました portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=支払証明を提出していません -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=トランザクションIDとトランザクション・キーを入力していません。\n\nこのデータを提供しなければ、ピアはXMRを受取る直後にBTCを解放するため自動確認機能を利用できません。\nその上、係争の場合にBisqはXMRトランザクションの送信者がこの情報を調停者や調停人に送れることを必要とします。\n詳しくはBisqのWikiを参照 [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] 。 portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=入力が32バイトの16進値ではありません。 portfolio.pending.step2_buyer.confirmStart.warningButton=無視して続ける portfolio.pending.step2_seller.waitPayment.headline=支払いをお待ちください portfolio.pending.step2_seller.f2fInfo.headline=買い手の連絡先 portfolio.pending.step2_seller.waitPayment.msg=デポジットトランザクションには、少なくとも1つのブロックチェーン承認があります。\nBTCの買い手が{0}の支払いを開始するまで待つ必要があります。 portfolio.pending.step2_seller.warn=BTCの買い手はまだ{0}の支払いを行っていません。\n支払いが開始されるまで待つ必要があります。\n取引が{1}で完了していない場合は、調停人が調査します。 -portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance. -portfolio.pending.step2_seller.refresh=Refresh Trade State -portfolio.pending.step2_seller.refreshInfo=Sometimes P2P network messages acknowledging payment are not delivered, causing trades to get stuck. Hit the button below to make your peer resend the last message. -tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}'' +portfolio.pending.step2_seller.openForDispute=BTCの買い手は支払いを開始していません!\nトレードの許可された最大期間が経過しました。\nもっと長く待ってトレードピアにもっと時間を与えるか、助けを求めるために調停者に連絡することができます。 +tradeChat.chatWindowTitle=トレードID '{0}'' のチャットウィンドウ tradeChat.openChat=チャットウィンドウを開く -tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful. +tradeChat.rules=このトレードに対する潜在的な問題を解決するため、トレードピアと連絡できます。\nチャットに返事する義務はありません。\n取引者が以下のルールを破ると、係争を開始して調停者や調停人に報告して下さい。\n\nチャット・ルール:\n\t●リンクを送らないこと(マルウェアの危険性)。トランザクションIDとブロックチェーンエクスプローラの名前を送ることができます。\n\t●シードワード、プライベートキー、パスワードなどの機密な情報を送らないこと。\n\t●Bisq外のトレードを助長しないこと(セキュリティーがありません)。\n\t●ソーシャル・エンジニアリングや詐欺の行為に参加しないこと。\n\t●チャットで返事されない場合、それともチャットでの連絡が断られる場合、ピアの決断を尊重すること。\n\t●チャットの範囲をトレードに集中しておくこと。チャットはメッセンジャーの代わりや釣りをする場所ではありません。\n\t●礼儀正しく丁寧に話すこと。 # suppress inspection "UnusedProperty" message.state.UNDEFINED=未定義 @@ -657,7 +655,7 @@ message.state.SENT=メッセージ送信済 # suppress inspection "UnusedProperty" message.state.ARRIVED=相手からのメールが来ました # suppress inspection "UnusedProperty" -message.state.STORED_IN_MAILBOX=Message of payment sent but not yet received by peer +message.state.STORED_IN_MAILBOX=支払いのメッセージは送りしましたが、まだピアに受信されていません。 # suppress inspection "UnusedProperty" message.state.ACKNOWLEDGED=相手がメッセージ受信を確認 # suppress inspection "UnusedProperty" @@ -682,9 +680,11 @@ portfolio.pending.step3_seller.cash=支払いは現金入金で行われるの portfolio.pending.step3_seller.moneyGram=買い手は承認番号と領収書の写真を電子メールで送信する必要があります。\n領収書には、氏名、国、州、および金額を明確に記載する必要があります。 認証番号を受け取った場合は、メールを確認してください。\n\nそのポップアップを閉じた後、あなたはMoneyGramからお金を得るためのBTC買い手の名前と住所を見られるでしょう。\n\nあなたが正常にお金を得た後にのみ領収書を承認してください! portfolio.pending.step3_seller.westernUnion=買い手はMTCN(追跡番号)と領収書の写真をEメールで送信する必要があります。\n領収書には、氏名、市区町村、国、金額が明確に記載されている必要があります。 MTCNを受け取った場合は、メールを確認してください。\n\nそのポップアップを閉じた後、あなたはWestern Unionからお金を得るためのBTC買い手の名前と住所を見られるでしょう。\n\nあなたが正常にお金を得た後にのみ領収書を承認してください! portfolio.pending.step3_seller.halCash=買い手はHalCashコードをテキストメッセージとして送信する必要があります。それに加えて、HalCash対応ATMからEURを出金するために必要な情報を含むメッセージがHalCashから届きます。\n\nあなたはATMからお金を得た後、ここで支払いの領収書を承認して下さい! +portfolio.pending.step3_seller.amazonGiftCard=買い手はEメールアドレス、それともSMSで携帯電話番号までアマゾンeGiftカードを送りました。アマゾンアカウントにeGiftカードを受け取って、済ましたら支払いの受領を確認して下さい。 -portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1} -portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n +portfolio.pending.step3_seller.bankCheck=\n\nまた、トレード契約書に記載されている送付者の名前が、銀行取引明細書のものと一致することも確認してください:\nトレード契約書のとおり、送信者の名前: {0}\n\n名前がここに表示されているものと同じではない場合、{1} +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step3_seller.openDispute=支払いの受領を確認せず、「alt + o」または「option + o」を入力して係争を開始して下さい。\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=支払い受領を承認 portfolio.pending.step3_seller.amountToReceive=受取額 portfolio.pending.step3_seller.yourAddress=あなたの{0} アドレス @@ -692,25 +692,26 @@ portfolio.pending.step3_seller.buyersAddress=買い手の{0} アドレス portfolio.pending.step3_seller.yourAccount=あなたのトレードアカウント portfolio.pending.step3_seller.xmrTxHash=トランザクションID portfolio.pending.step3_seller.xmrTxKey=トランザクション・キー -portfolio.pending.step3_seller.buyersAccount=Buyers account data +portfolio.pending.step3_seller.buyersAccount=買い手のアカウント・データ portfolio.pending.step3_seller.confirmReceipt=支払い受領を確認 portfolio.pending.step3_seller.buyerStartedPayment=BTCの買い手が{0}の支払いを開始しました。\n{1} portfolio.pending.step3_seller.buyerStartedPayment.altcoin=あなたのアルトコインウォレットやブロックエクスプローラーでブロックチェーンの確認を確認し、十分なブロックチェーンの承認があるときに支払いを確認してください。 portfolio.pending.step3_seller.buyerStartedPayment.fiat=あなたのトレードアカウント(例えば銀行口座)をチェックして、あなたが支払いを受領した時に承認して下さい。 portfolio.pending.step3_seller.warn.part1a={0} blockchain上で portfolio.pending.step3_seller.warn.part1b=支払いプロバイダ(銀行など)で -portfolio.pending.step3_seller.warn.part2=You still have not confirmed the receipt of the payment. Please check {0} if you have received the payment. -portfolio.pending.step3_seller.openForDispute=You have not confirmed the receipt of the payment!\nThe max. period for the trade has elapsed.\nPlease confirm or request assistance from the mediator. +portfolio.pending.step3_seller.warn.part2=あなたはまだ支払いの受領を承認していません。支払い{0}を受け取ったかどうかを確認してください。 +portfolio.pending.step3_seller.openForDispute=支払いの受領を承認していません!\nトレードの最大期間が経過しました。\n確認するか、調停人に助けを求めて下さい。 # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.part1=あなたの取引相手から{0}の支払いを受けましたか?\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.fiat=このトランザクションのトレードID(「支払理由」のテキスト)は \"{0} \"\n\n # suppress inspection "TrailingSpacesInProperty" -portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n +portfolio.pending.step3_seller.onPaymentReceived.name=また、銀行取引明細書に記載されている送付者の名前が、トレード契約書のものと一致していることも確認してください:\nトレード契約書とおり、送信者の名前: {0}\n\n送付者の名前がここに表示されているものと異なる場合は、支払いの受領を承認しないで下さい。「alt + o」または「option + o」を入力して係争を開始して下さい。\n\n +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.note=領収書の確認が済むとすぐに、ロックされたトレード金額がBTCの買い手に解放され、保証金が返金されます。\n\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=支払いを受け取ったことを確認 portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=はい、支払いを受け取りました -portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming receipt of payment, you are also verifying the account of the counterparty and signing it accordingly. Since the account of the counterparty hasn't been signed yet, you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback. +portfolio.pending.step3_seller.onPaymentReceived.signer=重要:支払いの受け取りを承認すると、相手方のアカウントを検証して署名することになります。相手方のアカウントはまだ署名されていないので、支払取り消しリスクを減らすために支払いの承認をできる限り延期して下さい。 portfolio.pending.step5_buyer.groupTitle=完了したトレードのまとめ portfolio.pending.step5_buyer.tradeFee=取引手数料 @@ -720,7 +721,7 @@ portfolio.pending.step5_buyer.refunded=返金されたセキュリティデポ portfolio.pending.step5_buyer.withdrawBTC=ビットコインを出金する portfolio.pending.step5_buyer.amount=出金額 portfolio.pending.step5_buyer.withdrawToAddress=出金先アドレス -portfolio.pending.step5_buyer.moveToBisqWallet=Keep funds in Bisq wallet +portfolio.pending.step5_buyer.moveToBisqWallet=資金をBisqウォレットに保管する portfolio.pending.step5_buyer.withdrawExternal=外部ウォレットに出金する portfolio.pending.step5_buyer.alreadyWithdrawn=資金はすでに出金されています。\nトランザクション履歴を確認してください。 portfolio.pending.step5_buyer.confirmWithdrawal=出金リクエストを承認 @@ -746,79 +747,69 @@ portfolio.pending.tradePeriodInfo=最初のブロックチェーンの確認後 portfolio.pending.tradePeriodWarning=この期間を超えた場合、両方の取引者が係争を開始できます。 portfolio.pending.tradeNotCompleted=時間内に完了してないトレード({0}まで) portfolio.pending.tradeProcess=トレードプロセス -portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community. +portfolio.pending.openAgainDispute.msg=調停人や調停者へのメッセージが到着したことに確信が持てない場合(例えば、1日経っても返事がない場合)、「command/ctrl+o」で再度係争を申し立てる、あるいは [HYPERLINK:https://bisq.community] でBisq掲示板からさらにサポートを受けることができます。 portfolio.pending.openAgainDispute.button=もう一度係争を開始 portfolio.pending.openSupportTicket.headline=サポートチケットをオープン -portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator. +portfolio.pending.openSupportTicket.msg=この機能を \"サポートをオープン\" や \"係争を開始\" ボタンが表示されていない緊急の場合のみに利用して下さい。\n\nサポートチケットをオープンすると、トレードは割り込まれ調停人や調停者によって扱われます。 -portfolio.pending.timeLockNotOver=You have to wait until ≈{0} ({1} more blocks) before you can open an arbitration dispute. -portfolio.pending.error.depositTxNull=The deposit transaction is null. You cannot open a dispute without a valid deposit transaction. Please go to \"Settings/Network info\" and do a SPV resync.\n\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is null. You can move the trade to failed trades. -portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. -portfolio.pending.error.depositTxNotConfirmed=The deposit transaction is not confirmed. You can not open an arbitration dispute with an unconfirmed deposit transaction. Please wait until it is confirmed or go to \"Settings/Network info\" and do a SPV resync.\n\nFor further help please contact the Bisq support channel at the Bisq Keybase team. +portfolio.pending.timeLockNotOver=係争仲裁を開始するには、≈{0} ({1} ブロック) 確認まで待たなければなりません。 +portfolio.pending.error.depositTxNull=入金トランザクションは無効とされました。有効な入金トランザクションがなければ、係争を開始できません。\"設定/ネットワーク情報\"を開いてSPV再同期を行って下さい。\n\nさらにサポートを受けるため、Bisq Keybaseチームのサポートチャンネルに連絡して下さい。 +portfolio.pending.mediationResult.error.depositTxNull=デポジットトランザクションは無効とされました。「失敗トレード」へ送れます。 +portfolio.pending.mediationResult.error.delayedPayoutTxNull=遅延支払いトランザクションは無効とされました。「失敗トレード」へ送れます。 +portfolio.pending.error.depositTxNotConfirmed=入金トランザクションは承認されていません。非確認された入金トランザクションで係争を開始できません。承認まで待つか、\"設定/ネットワーク情報\"を開いてSPV再同期を行って下さい。\n\nさらにサポートを受けるため、Bisq Keybaseチームのサポートチャンネルに連絡して下さい。 -portfolio.pending.notification=通知 +portfolio.pending.support.headline.getHelp=助けが必要ですか? +portfolio.pending.support.text.getHelp=問題があれば、トレードチャットにトレードピアと連絡してみるか、 https://bisq.community でBisqコミュニティーから助けを求めることができます。それでも問題は解決されない場合、調停者からさらに助けを求めることもできます。 +portfolio.pending.support.button.getHelp=取引者チャットを開く +portfolio.pending.support.headline.halfPeriodOver=支払いを確認 +portfolio.pending.support.headline.periodOver=トレード期間は終了しました -portfolio.pending.support.headline.getHelp=Need help? -portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator. -portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator. -portfolio.pending.support.button.getHelp=Open Trader Chat -portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket? -portfolio.pending.support.popup.button=サポートチケットをオープン -portfolio.pending.support.headline.halfPeriodOver=Check payment -portfolio.pending.support.headline.periodOver=Trade period is over - -portfolio.pending.mediationRequested=Mediation requested -portfolio.pending.refundRequested=Refund requested +portfolio.pending.mediationRequested=調停は依頼されました +portfolio.pending.refundRequested=返金は請求されました portfolio.pending.openSupport=サポートチケットをオープン portfolio.pending.supportTicketOpened=サポートチケットがオープンされた -portfolio.pending.requestSupport=サポートをリクエスト -portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds. portfolio.pending.communicateWithArbitrator=「サポート」画面で調停人と連絡を取ってください。 -portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator. -portfolio.pending.supportTicketOpenedMyUser=あなたは既にサポートチケットをオープンしています\n{0} +portfolio.pending.communicateWithMediator=\"サポート\" 画面で調停者と連絡を取ってください。 portfolio.pending.disputeOpenedMyUser=あなたは既に係争を開始しています\n{0} portfolio.pending.disputeOpenedByPeer=あなたのトレード相手は係争を開始しました\n{0} -portfolio.pending.supportTicketOpenedByPeer=あなたのトレード相手はサポートチケットをオープンしました\n{0} portfolio.pending.noReceiverAddressDefined=受信者のアドレスが定義されていません -portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade? -portfolio.pending.mediationResult.headline=Suggested payout from mediation -portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout. -portfolio.pending.mediationResult.info.selfAccepted=You have accepted the mediator's suggestion. Waiting for peer to accept as well. -portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted the mediator's suggestion. Do you accept as well? -portfolio.pending.mediationResult.button=View proposed resolution -portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0} -portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0} -portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration -portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted +portfolio.pending.mediationResult.headline=調停から提案された支払い +portfolio.pending.mediationResult.info.noneAccepted=調停者のトレード支払い提案に応じることでトレードを完了する。 +portfolio.pending.mediationResult.info.selfAccepted=調停者の提案を受け入れました。ピアの受け入りを待ち。 +portfolio.pending.mediationResult.info.peerAccepted=トレードピアは調停者の提案を受け入れました。同じく提案に応じますか? +portfolio.pending.mediationResult.button=提案解決法を表示する +portfolio.pending.mediationResult.popup.headline=トレードID {0} の調停の結果 +portfolio.pending.mediationResult.popup.headline.peerAccepted=トレードピアは、トレード {0} に関する調停者の提案を受け入れました。 +portfolio.pending.mediationResult.popup.info=調停者の資金分け提案は以下のとおり:\nあなたの分: {0}\nトレードピアの分: {1}\n\nこの支払い提案を受け取るまたは断ることができます。\n\n受け取ることで、支払い提案のトランザクションを署名します。トレードピアも同じく受け取って署名すると、支払いは完了しトレードは成立されます。\n\n片当事者もしくは両当事者が提案を断ると、2回目の係争を開始するのに{2} (ブロック {3}) まで待つ必要があります。調停人は再びに問題を検討し、調査結果に基づいて支払い提案を申し出ます。\n\n仕事に対する補償として、調停人は手数料を徴収するかもしれない(手数料の上限:取引者のセキュリティデポジット)。両当事者が提案に応じるのは最高の結果です。調停を依頼するのは異例の事態のためです、例えば取引者が調停者の支払い提案は不正だということを確信している場合(それともピアが無反応になる場合)。\n\n新しい仲裁モデルの詳しくは: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=調停者の支払い提案に応じましたが、トレードピアは断りましたそうです。\n\n{0}のロック時間が終わったら(ブロック{1})、2回目の係争を開始できます、そして調停人は再びに問題を検討し調査結果に基づいて支払い提案を申し出るでしょう。\n\n新しい仲裁モデルの詳しくは: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.openArbitration=拒絶して仲裁を求める +portfolio.pending.mediationResult.popup.alreadyAccepted=すでに受け入れています -portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. -portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} -portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Move trade to failed trades -portfolio.pending.failedTrade.warningIcon.tooltip=Click to open details about the issues of this trade -portfolio.failed.revertToPending.popup=Do you want to move this trade to open trades? -portfolio.failed.revertToPending=Move trade to open trades +portfolio.pending.failedTrade.taker.missingTakerFeeTx=欠測テイカー手数料のトランザクション。\n\nこのtxがなければ、トレードを完了できません。資金はロックされず、トレード手数料は支払いませんでした。「失敗トレード」へ送ることができます。 +portfolio.pending.failedTrade.maker.missingTakerFeeTx=ピアのテイカー手数料のトランザクションは欠測します。\n\nこのtxがなければ、トレードを完了できません。資金はロックされませんでした。あなたのオファーがまだ他の取引者には有効ですので、メイカー手数料は失っていません。このトレードを「失敗トレード」へ送ることができます。 +portfolio.pending.failedTrade.missingDepositTx=入金トランザクション(2-of-2マルチシグトランザクション)は欠測します。\n\nこのtxがなければ、トレードを完了できません。資金はロックされませんでしたが、トレード手数料は支払いました。トレード手数料の返済要求はここから提出できます: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nこのトレードを「失敗トレード」へ送れます。 +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=遅延支払いトランザクションは欠測しますが、資金は入金トランザクションにロックされました。\n\nこの法定通貨・アルトコイン支払いをBTC売り手に送信しないで下さい。遅延支払いtxがなければ、係争仲裁は開始されることができません。代りに、「Cmd/Ctrl+o」で調停チケットをオープンして下さい。調停者はおそらく両方のピアへセキュリティデポジットの全額を払い戻しを提案します(売り手はトレード金額も払い戻しを受ける)。このような方法でセキュリティーのリスクがなし、トレード手数料のみが失われます。\n\n失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=遅延支払いトランザクションは欠測しますが、資金は入金トランザクションにロックされました。\n\n買い手の遅延支払いトランザクションが同じく欠測される場合、相手は支払いを送信せず調停チケットをオープンするように指示されます。同様に「Cmd/Ctrl+o」で調停チケットをオープンするのは賢明でしょう。\n\n買い手はまだ支払いを送信しなかった場合、調停者はおそらく両方のピアへセキュリティデポジットの全額を払い戻しを提案します(売り手はトレード金額も払い戻しを受ける)。さもなければ、トレード金額は買い手に支払われるでしょう。\n\n失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=トレードプロトコルの実行にはエラーが生じました。\n\nエラー: {0}\n\nクリティカル・エラーではない可能性はあり、トレードは普通に完了できるかもしれない。迷う場合は調停チケットをオープンして、Bisq調停者からアドバイスを受けることができます。\n\nクリティカル・エラーでトレードが完了できなかった場合はトレード手数料は失われた可能性があります。失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=トレード契約書は設定されません。\n\nトレードは完了できません。トレード手数料は失われた可能性もあります。その場合は失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.info.popup=トレードプロトコルは問題に遭遇しました。\n\n{0} +portfolio.pending.failedTrade.txChainInvalid.moveToFailed=トレードプロトコルは深刻な問題に遭遇しました。\n\n{0}\n\nトレードを「失敗トレード」へ送りますか?\n\n「失敗トレード」画面から調停・仲裁を開始できませんけど、失敗トレードがいつでも「オープントレード」へ戻されることができます。 +portfolio.pending.failedTrade.txChainValid.moveToFailed=トレードプロトコルは問題に遭遇しました。\n\n{0}\n\nトレードのトランザクションは公開され、資金はロックされました。絶対に確信している場合のみにトレードを「失敗トレード」へ送りましょう。問題を解決できる選択肢に邪魔する可能性はあります。\n\nトレードを「失敗トレード」へ送りますか?\n\n「失敗トレード」画面から調停・仲裁を開始できませんけど、失敗トレードがいつでも「オープントレード」へ戻されることができます。 +portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=トレードを「失敗トレード」へ送る +portfolio.pending.failedTrade.warningIcon.tooltip=このトレードに関する問題の詳細を開くのにクリックする +portfolio.failed.revertToPending.popup=このトレードを「オープントレード」に送りますか? +portfolio.failed.revertToPending=トレードを「オープントレード」へ送る portfolio.closed.completed=完了 -portfolio.closed.ticketClosed=Arbitrated -portfolio.closed.mediationTicketClosed=Mediated +portfolio.closed.ticketClosed=仲裁をされました +portfolio.closed.mediationTicketClosed=調停をされました portfolio.closed.canceled=キャンセルされています portfolio.failed.Failed=失敗 -portfolio.failed.unfail=Before proceeding, make sure you have a backup of your data directory!\nDo you want to move this trade back to open trades?\nThis is a way to unlock funds stuck in a failed trade. -portfolio.failed.cantUnfail=This trade cannot be moved back to open trades at the moment. \nTry again after completion of trade(s) {0} -portfolio.failed.depositTxNull=The trade cannot be reverted to a open trade. Deposit transaction is null. -portfolio.failed.delayedPayoutTxNull=The trade cannot be reverted to a open trade. Delayed payout transaction is null. +portfolio.failed.unfail=進む前に、必ずデータディレクトリーをバックアップしといて下さい!\nこのトレードを「オープントレード」へ戻しますか?\n失敗トレードにはまり込まれている資金を解放させる方法の1つです。 +portfolio.failed.cantUnfail=このトレードは現在のところ「オープントレード」へ戻されることができません。\nトレード {0} が完了された後にもう一度試して下さい。 +portfolio.failed.depositTxNull=このトレードは「オープントレード」へ戻されることができません。入金トランザクションは無効とされました。 +portfolio.failed.delayedPayoutTxNull=このトレードは「オープントレード」へ戻されることができません。遅延支払いトランザクションは無効とされました。 #################################################################### @@ -839,6 +830,7 @@ funds.deposit.fundWallet=あなたのウォレットに入金 funds.deposit.withdrawFromWallet=ウォレットから資金を送金 funds.deposit.amount=BTCの金額(オプション) funds.deposit.generateAddress=新しいアドレスの生成 +funds.deposit.generateAddressSegwit=ネイティブセグウィットのフォーマット(Bech32) funds.deposit.selectUnused=新しいアドレスを生成するのではなく、上の表から未使用のアドレスを選択してください。 funds.withdrawal.arbitrationFee=調停手数料 @@ -851,8 +843,8 @@ funds.withdrawal.feeExcluded=マイニング手数料を含まない金額 funds.withdrawal.feeIncluded=マイニング手数料を含む金額 funds.withdrawal.fromLabel=アドレスから出金 funds.withdrawal.toLabel=出金先アドレス -funds.withdrawal.memoLabel=Withdrawal memo -funds.withdrawal.memo=Optionally fill memo +funds.withdrawal.memoLabel=出金メモ +funds.withdrawal.memo=任意入力メモ funds.withdrawal.withdrawButton=選択された出金 funds.withdrawal.noFundsAvailable=出金のための利用可能な資金がありません funds.withdrawal.confirmWithdrawalRequest=出金リクエストを承認 @@ -873,7 +865,7 @@ funds.locked.locked=次のIDとのトレードはマルチシグでロック中 funds.tx.direction.sentTo=送信 to: funds.tx.direction.receivedWith=次に予約済: -funds.tx.direction.genesisTx=ジェネシスTXから: +funds.tx.direction.genesisTx=ジェネシスTXから: funds.tx.txFeePaymentForBsqTx=BSQのTXのマイニング手数料 funds.tx.createOfferFee=メイカーとTXの手数料: {0} funds.tx.takeOfferFee=テイカーとTXの手数料: {0} @@ -881,15 +873,15 @@ funds.tx.multiSigDeposit=マルチシグデポジット: {0} funds.tx.multiSigPayout=マルチシグ支払い: {0} funds.tx.disputePayout=係争の支払い: {0} funds.tx.disputeLost=係争事案が消失: {0} -funds.tx.collateralForRefund=Refund collateral: {0} -funds.tx.timeLockedPayoutTx=Time locked payout tx: {0} -funds.tx.refund=Refund from arbitration: {0} +funds.tx.collateralForRefund=担保の払い戻し: {0} +funds.tx.timeLockedPayoutTx=時間ロック支払いtx: {0} +funds.tx.refund=仲裁からの払い戻し: {0} funds.tx.unknown=不明な理由: {0} funds.tx.noFundsFromDispute=係争からの返金はありません funds.tx.receivedFunds=受取済み資金 funds.tx.withdrawnFromWallet=ウォレットからの出金 funds.tx.withdrawnFromBSQWallet=BSQウォレットから出金されたBTC -funds.tx.memo=Memo +funds.tx.memo=メモ funds.tx.noTxAvailable=利用できるトランザクションがありません funds.tx.revert=元に戻す funds.tx.txSent=トランザクションはローカルBisqウォレットの新しいアドレスに正常に送信されました。 @@ -905,31 +897,31 @@ funds.tx.dustAttackTx.popup=このトランザクションはごくわずかなB # Support #################################################################### -support.tab.mediation.support=Mediation -support.tab.arbitration.support=Arbitration -support.tab.legacyArbitration.support=Legacy Arbitration -support.tab.ArbitratorsSupportTickets={0}'s tickets -support.filter=Search disputes +support.tab.mediation.support=調停 +support.tab.arbitration.support=仲裁 +support.tab.legacyArbitration.support=レガシー仲裁 +support.tab.ArbitratorsSupportTickets={0} のチケット +support.filter=係争を検索 support.filter.prompt=トレードID、日付、onionアドレスまたはアカウントデータを入力してください -support.sigCheck.button=Verify result -support.sigCheck.popup.info=In case of a reimbursement request to the DAO you need to paste the summary message of the mediation and arbitration process in your reimbursement request on Github. To make this statement verifiable any user can check with this tool if the signature of the mediator or arbitrator matches the summary message. -support.sigCheck.popup.header=Verify dispute result signature -support.sigCheck.popup.msg.label=Summary message -support.sigCheck.popup.msg.prompt=Copy & paste summary message from dispute -support.sigCheck.popup.result=Validation result -support.sigCheck.popup.success=Signature is valid -support.sigCheck.popup.failed=Signature verification failed -support.sigCheck.popup.invalidFormat=Message is not of expected format. Copy & paste summary message from dispute. +support.sigCheck.button=結果を検証 +support.sigCheck.popup.info=DAOに払い戻しリクエストを提出する場合、調停・仲裁プロセスの概要メッセージをGithubで提出された払い戻しリクエストに張り付ける必要があります。検証を可能にするため、ユーザがこのツールで概要メッセージと調停者や調停人の署名が照合するかどうか確かめることができます。 +support.sigCheck.popup.header=係争結果の署名を検証する +support.sigCheck.popup.msg.label=概要メッセージ +support.sigCheck.popup.msg.prompt=係争からの概要メッセージをコピーして貼り付ける +support.sigCheck.popup.result=検証結果 +support.sigCheck.popup.success=有効な署名です +support.sigCheck.popup.failed=署名検証失敗 +support.sigCheck.popup.invalidFormat=メッセージは期待されるフォーマットではありません。係争からの概要メッセージをコピーして貼り付けて下さい。 -support.reOpenByTrader.prompt=Are you sure you want to re-open the dispute? -support.reOpenButton.label=Re-open +support.reOpenByTrader.prompt=係争を再開しても本当によろしいですか? +support.reOpenButton.label=再開する support.sendNotificationButton.label=プライベート通知 -support.reportButton.label=Report -support.fullReportButton.label=All disputes +support.reportButton.label=報告する +support.fullReportButton.label=全ての係争 support.noTickets=オープンなチケットはありません support.sendingMessage=メッセージを送信中 -support.receiverNotOnline=Receiver is not online. Message is saved to their mailbox. +support.receiverNotOnline=受信者はオンラインではありません。 メッセージは彼のメールボックスに保存されます。 support.sendMessageError=メッセージ送信失敗。エラー: {0} support.wrongVersion=その係争の申し出はBisqの古いバージョンで作成されました。\nあなたのアプリケーションのバージョンではその係争を閉じることはできません。\n\n次のより古いバージョンを使用してください:プロトコルバージョン{0} support.openFile=添付ファイルを開く(最大ファイルサイズ: {0} kb) @@ -939,11 +931,11 @@ support.attachment=添付ファイル support.tooManyAttachments=1つのメッセージに3つを超える添付ファイルは送信できません support.save=ファイルをディスクに保存 support.messages=メッセージ -support.input.prompt=Enter message... +support.input.prompt=メッセージを入力... support.send=送信 support.addAttachments=添付ファイルを追加 support.closeTicket=チケットを閉じる -support.attachments=添付ファイル: +support.attachments=添付ファイル: support.savedInMailbox=メッセージ受信箱に保存されました support.arrived=メッセージが受信者へ届きました support.acknowledged=受信者からメッセージ到着が確認されました @@ -959,20 +951,20 @@ support.sellerOfferer=BTC 売り手/メイカー support.buyerTaker=BTC 買い手/テイカー support.sellerTaker=BTC 売り手/テイカー -support.backgroundInfo=Bisq is not a company, so it handles disputes differently.\n\nTraders can communicate within the application via secure chat on the open trades screen to try solving disputes on their own. If that is not sufficient, a mediator can step in to help. The mediator will evaluate the situation and suggest a payout of trade funds. If both traders accept this suggestion, the payout transaction is completed and the trade is closed. If one or both traders do not agree to the mediator's suggested payout, they can request arbitration.The arbitrator will re-evaluate the situation and, if warranted, personally pay the trader back and request reimbursement for this payment from the Bisq DAO. -support.initialInfo=Please enter a description of your problem in the text field below. Add as much information as possible to speed up dispute resolution time.\n\nHere is a check list for information you should provide:\n\t● If you are the BTC buyer: Did you make the Fiat or Altcoin transfer? If so, did you click the 'payment started' button in the application?\n\t● If you are the BTC seller: Did you receive the Fiat or Altcoin payment? If so, did you click the 'payment received' button in the application?\n\t● Which version of Bisq are you using?\n\t● Which operating system are you using?\n\t● If you encountered an issue with failed transactions please consider switching to a new data directory.\n\t Sometimes the data directory gets corrupted and leads to strange bugs. \n\t See: https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\nPlease make yourself familiar with the basic rules for the dispute process:\n\t● You need to respond to the {0}''s requests within 2 days.\n\t● Mediators respond in between 2 days. Arbitrators respond in between 5 business days.\n\t● The maximum period for a dispute is 14 days.\n\t● You need to cooperate with the {1} and provide the information they request to make your case.\n\t● You accepted the rules outlined in the dispute document in the user agreement when you first started the application.\n\nYou can read more about the dispute process at: {2} +support.backgroundInfo=Bisqは会社ではないので、係争の扱いが異なります。\n\n取引者はアプリ内の「オープントレード」画面からセキュアチャットでお互いに紛争を解決しようと努めれる。その方法は十分でない場合、調停者は間に入って助けることもできます。調停者は状況を判断して、トレード資金の支払い配分を提案します。両当事者は提案に同意する場合、支払いトランザクションは完了され、トレードは閉じられます。片当事者もしくは両当事者は調停者の支払い提案に同意しない場合、仲裁を求めることができます。調停人は再びに問題を検討し、正当な場合は個人的に取引者に払い戻す、そしてBisqのDAOからその分の払い戻し要求を提出します。 +support.initialInfo=下のテキストフィールドに問題の説明を入力してください。係争解決の時間を短縮するために、可能な限り多くの情報を追加してください。\n\n提供する必要がある情報のチェックリストを次に示します:\n\t●BTC買い手の場合:法定通貨またはアルトコインの送金を行いましたか?その場合、アプリケーションの「支払い開始」ボタンをクリックしましたか?\n\t●BTC売り手の場合:法定通貨またはアルトコインの支払いを受け取りましたか?その場合、アプリケーションの「支払いを受け取った」ボタンをクリックしましたか?\n\t●どのバージョンのBisqを使用していますか?\n\t●どのオペレーティングシステムを使用していますか?\n\t●失敗したトランザクションで問題が発生した場合は、新しいデータディレクトリへの切り替えを検討してください。\n\t データディレクトリが破損し、不可解なバグが発生している場合があります。\n\t 参照:https://docs.bisq.network/backup-recovery.html#switch-to-a-new-data-directory\n\n係争プロセスの基本的なルールをよく理解してください:\n\t●2日以内に{0}の要求に応答する必要があります。\n\t●調停者は2日以内に返事をするでしょう。調停人は5営業日以内に返事をするでしょう。\n\t●係争の最大期間は14日間です。\n\t●{1}と協力し、彼らがあなたの主張をするために、要求された情報を提供する必要があります\n\t●あなたは申請を最初に開始したときに、ユーザー契約の係争文書に記載されている規則を受け入れています。\n\n係争プロセスの詳細については、{2} をご覧ください。 support.systemMsg=システムメッセージ: {0} support.youOpenedTicket=サポートのリクエスト開始しました。\n\n{0}\n\nBisqバージョン: {1} support.youOpenedDispute=係争のリクエスト開始しました。\n\n{0}\n\nBisqバージョン: {1} -support.youOpenedDisputeForMediation=You requested mediation.\n\n{0}\n\nBisq version: {1} -support.peerOpenedTicket=Your trading peer has requested support due to technical problems.\n\n{0}\n\nBisq version: {1} -support.peerOpenedDispute=Your trading peer has requested a dispute.\n\n{0}\n\nBisq version: {1} -support.peerOpenedDisputeForMediation=Your trading peer has requested mediation.\n\n{0}\n\nBisq version: {1} -support.mediatorsDisputeSummary=System message: Mediator''s dispute summary:\n{0} -support.mediatorsAddress=Mediator''s node address: {0} -support.warning.disputesWithInvalidDonationAddress=The delayed payout transaction has used an invalid receiver address. It does not match any of the DAO parameter values for the valid donation addresses.\n\nThis might be a scam attempt. Please inform the developers about that incident and do not close that case before the situation is resolved!\n\nAddress used in the dispute: {0}\n\nAll DAO param donation addresses: {1}\n\nTrade ID: {2}{3} -support.warning.disputesWithInvalidDonationAddress.mediator=\n\nDo you still want to close the dispute? -support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nYou must not do the payout. +support.youOpenedDisputeForMediation=調停を求めました。\n\n{0}\n\nBisqバージョン: {1} +support.peerOpenedTicket=トレードピアは技術的な問題によるサポートを要求しました。\n\n{0}\n\nBisqバージョン: {1} +support.peerOpenedDispute=トレードピアは係争を求めました。\n\n{0}\n\nBisqバージョン: {1} +support.peerOpenedDisputeForMediation=トレードピアは調停を求めました。\n\n{0}\n\nBisqバージョン: {1} +support.mediatorsDisputeSummary=システム・メッセージ:調停者の係争概要:\n{0} +support.mediatorsAddress=調停人のノードアドレス: {0} +support.warning.disputesWithInvalidDonationAddress=遅延支払いトランザクションは無効な受信アドレスを利用しました。有効な寄付アドレスに対するDAOパラメーターと合っていません。\n\n詐欺の未遂かもしれません。開発者に報告して、問題が解決される前に事件を閉じないで下さい!\n\nこの係争に利用されたアドレス: {0}\n\nDAOパラメーターに合う寄付アドレス: {1}\n\nトレードID: {2}{3} +support.warning.disputesWithInvalidDonationAddress.mediator=\n\n係争を閉じても本当によろしいですか? +support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\n支払いを送信してはいけません。 #################################################################### @@ -983,24 +975,23 @@ settings.tab.network=ネットワーク情報 settings.tab.about=About setting.preferences.general=一般設定 -setting.preferences.explorer=Bitcoin Explorer -setting.preferences.explorer.bsq=Bisq Explorer +setting.preferences.explorer=ビットコインのエクスプローラ +setting.preferences.explorer.bsq=Bisqのエクスプローラ setting.preferences.deviation=市場価格からの最大偏差 +setting.preferences.bsqAverageTrimThreshold=BSQ率の外れ閾値 setting.preferences.avoidStandbyMode=スタンバイモードを避ける -setting.preferences.autoConfirmXMR=XMR auto-confirm -setting.preferences.autoConfirmEnabled=Enabled -setting.preferences.autoConfirmRequiredConfirmations=Required confirmations -setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) -setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) +setting.preferences.autoConfirmXMR=XMR自動確認 +setting.preferences.autoConfirmEnabled=有効されました +setting.preferences.autoConfirmRequiredConfirmations=必要承認 +setting.preferences.autoConfirmMaxTradeSize=最大トレード金額(BTC) +setting.preferences.autoConfirmServiceAddresses=モネロエクスプローラURL(localhost、LANのIPアドレス、または*.localのホストネーム以外はTorを利用します) setting.preferences.deviationToLarge={0}%以上の値は許可されていません。 -setting.preferences.txFee=出金取引手数料 (satoshis/byte) +setting.preferences.txFee=出金トランザクション手数料 (satoshis/vbyte) setting.preferences.useCustomValue=任意の値を使う -setting.preferences.txFeeMin=トランザクション手数料は少なくとも{0} satoshis/byte でなければなりません -setting.preferences.txFeeTooLarge=あなたの入力は妥当な値(> 5000 satoshis / byte)を超えています。トランザクション手数料は通常 50-400 satoshis/byteの範囲です。 +setting.preferences.txFeeMin=トランザクション手数料は少なくとも{0} satoshis/vbyte でなければなりません +setting.preferences.txFeeTooLarge=あなたの入力は妥当な値(> 5000 satoshis / vbyte)を超えています。トランザクション手数料は通常 50-400 satoshis/vbyteの範囲です。 setting.preferences.ignorePeers=無視されたピア [onion アドレス:ポート] -setting.preferences.refererId=紹介ID setting.preferences.ignoreDustThreshold=最小の非ダストアウトプット値 -setting.preferences.refererId.prompt=紹介ID (オプション) setting.preferences.currenciesInList=市場価格フィードリストの通貨 setting.preferences.prefCurrency=希望する通貨 setting.preferences.displayFiat=各国通貨の表示 @@ -1013,19 +1004,17 @@ setting.preferences.addAltcoin=アルトコインを追加する setting.preferences.displayOptions=表示設定 setting.preferences.showOwnOffers=オファーブックに自分のオファーを表示 setting.preferences.useAnimations=アニメーションを使用 -setting.preferences.useDarkMode=Use dark mode +setting.preferences.useDarkMode=ダークモードを利用 setting.preferences.sortWithNumOffers=市場リストをオファー/トレードの数で並び替える setting.preferences.resetAllFlags=「次回から表示しない」フラグを全てリセット -setting.preferences.reset=リセット settings.preferences.languageChange=言語の変更をすべての画面に適用するには再起動が必要です。 -settings.preferences.supportLanguageWarning=In case of a dispute, please note that mediation is handled in {0} and arbitration in {1}. -settings.preferences.selectCurrencyNetwork=ネットワーク選択 +settings.preferences.supportLanguageWarning=係争が発生した場合、調停は{0}で、仲裁は{1}で処理されることに注意して下さい。 setting.preferences.daoOptions=DAO設定 setting.preferences.dao.resyncFromGenesis.label=ジェネシスTXからDAO状態を再構築 -setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources -setting.preferences.dao.resyncFromResources.popup=After an application restart the Bisq network governance data will be reloaded from the seed nodes and the BSQ consensus state will be rebuilt from the latest resource files. -setting.preferences.dao.resyncFromGenesis.popup=A resync from genesis transaction can take considerable time and CPU resources. Are you sure you want to do that? Mostly a resync from latest resource files is sufficient and much faster.\n\nIf you proceed, after an application restart the Bisq network governance data will be reloaded from the seed nodes and the BSQ consensus state will be rebuilt from the genesis transaction. -setting.preferences.dao.resyncFromGenesis.resync=Resync from genesis and shutdown +setting.preferences.dao.resyncFromResources.label=リソースからDAO状態を再構築 +setting.preferences.dao.resyncFromResources.popup=アプリケーションの再起動後、Bisqネットワークガバナンスデータはシードノードから再ロードされ、BSQのコンセンサス状態は最新リソースファイルから再構築されます。 +setting.preferences.dao.resyncFromGenesis.popup=ジェネシストランザクションからの再同期はかなりの時間をかけて、かなりのCPUリソースを消費します。本当によろしいですか?大抵の場合は最新リソースファイルからの再同期は十分、より早い選択です。\n\n進めたら、アプリケーションの再起動後、Bisqネットワークガバナンスデータはシードノードから再ロードされ、BSQのコンセンサス状態はジェネシストランザクションから再構築されるでしょう。 +setting.preferences.dao.resyncFromGenesis.resync=ジェネシスから再同期して終了 setting.preferences.dao.isDaoFullNode=BisqをDAOのフルノードで実行 setting.preferences.dao.rpcUser=RPCユーザ名 setting.preferences.dao.rpcPw=RPCパスワード @@ -1033,43 +1022,50 @@ setting.preferences.dao.blockNotifyPort=通知ポートをブロック setting.preferences.dao.fullNodeInfo=DAOフルノードとしてBisqを実行するには、Bitcoin Coreをローカルで実行し、RPCを有効にする必要があります。すべての要件は '' {0} ''に文書化されています。\n\nモードを変更した後は、再起動する必要があります。 setting.preferences.dao.fullNodeInfo.ok=ドキュメントページを開く setting.preferences.dao.fullNodeInfo.cancel=いいえ、ライトノードモードを使い続けます +settings.preferences.editCustomExplorer.headline=エクスプローラー設定 +settings.preferences.editCustomExplorer.description=左のリストからシステム定義エクスプローラを選択、それともニーズや好みに合わせてカスタマイズする。 +settings.preferences.editCustomExplorer.available=利用可能なエクスプローラ +settings.preferences.editCustomExplorer.chosen=選択したエクスプローラ設定 +settings.preferences.editCustomExplorer.name=名義 +settings.preferences.editCustomExplorer.txUrl=トランザクションURL +settings.preferences.editCustomExplorer.addressUrl=アドレスURL settings.net.btcHeader=ビットコインのネットワーク -settings.net.p2pHeader=Bisq network +settings.net.p2pHeader=Bisqネットワーク settings.net.onionAddressLabel=私のonionアドレス settings.net.btcNodesLabel=任意のビットコインノードを使う settings.net.bitcoinPeersLabel=接続されたピア settings.net.useTorForBtcJLabel=BitcoinネットワークにTorを使用 -settings.net.bitcoinNodesLabel=接続するBitcoin Coreノード: +settings.net.bitcoinNodesLabel=接続するBitcoin Coreノード: settings.net.useProvidedNodesRadio=提供されたBitcoin Core ノードを使う settings.net.usePublicNodesRadio=ビットコインの公共ネットワークを使用 settings.net.useCustomNodesRadio=任意のビットコインノードを使う -settings.net.warn.usePublicNodes=パブリックなビットコインネットワークを使用する場合、BitcoinJ(Bisqで使用)のようなSPVウォレットに使用される破損したブルームフィルターの設計と実装によって、重大なプライバシー問題にさらされます。接続しているすべてのノードは、すべてのウォレットアドレスが1つのエンティティに属していることがわかります。\n\n詳細については、https://bisq.network/blog/privacy-in-bitsquare をご覧ください。\n\nパブリックノードを使用してもよろしいですか? +settings.net.warn.usePublicNodes=パブリックなビットコインネットワークを使用する場合、BitcoinJ(Bisqで使用)のようなSPVウォレットに使用される破損したブルームフィルターの設計と実装によって、重大なプライバシー問題にさらされます。接続しているすべてのノードは、すべてのウォレットアドレスが1つのエンティティに属していることがわかります。\n\n詳細については、[HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare] をご覧ください。\n\nパブリックノードを使用しても本当によろしいですか? settings.net.warn.usePublicNodes.useProvided=いいえ、提供されたノードを使用します settings.net.warn.usePublicNodes.usePublic=はい、公共ネットワークを使います settings.net.warn.useCustomNodes.B2XWarning=あなたのBitcoinノードが信頼できるBitcoin Coreノードであることを確認してください!\n\nBitcoin Coreのコンセンサスルールに従わないノードに接続すると、ウォレットが破損し、トレードプロセスに問題が生じる可能性があります。\n\nコンセンサスルールに違反するノードへ接続したユーザーは、引き起こされるいかなる損害に対しても責任を負います。 結果として生じる係争は、他のピアによって決定されます。この警告と保護のメカニズムを無視しているユーザーには、テクニカルサポートは提供されません! -settings.net.warn.invalidBtcConfig=Connection to the Bitcoin network failed because your configuration is invalid.\n\nYour configuration has been reset to use the provided Bitcoin nodes instead. You will need to restart the application. -settings.net.localhostBtcNodeInfo=Background information: Bisq looks for a local Bitcoin node when starting. If it is found, Bisq will communicate with the Bitcoin network exclusively through it. +settings.net.warn.invalidBtcConfig=無効な設定によりビットコインネットワークとの接続は失敗しました。\n\n代りに提供されたビットコインノードを利用するのに設定はリセットされました。アプリを再起動する必要があります。 +settings.net.localhostBtcNodeInfo=バックグラウンド情報:Bisqが起動時に、ローカルビットコインノードを探します。見つかれば、Bisqはそのノードを排他的に介してビットコインネットワークと接続します。 settings.net.p2PPeersLabel=接続されたピア settings.net.onionAddressColumn=Onionアドレス settings.net.creationDateColumn=既定 settings.net.connectionTypeColumn=イン/アウト -settings.net.sentDataLabel=Sent data statistics -settings.net.receivedDataLabel=Received data statistics +settings.net.sentDataLabel=通信されたデータ統計 +settings.net.receivedDataLabel=受信されたデータ統計 settings.net.roundTripTimeColumn=往復 settings.net.sentBytesColumn=送信済 settings.net.receivedBytesColumn=受信済 settings.net.peerTypeColumn=ピアタイプ settings.net.openTorSettingsButton=Torの設定を開く -settings.net.versionColumn=Version -settings.net.subVersionColumn=Subversion -settings.net.heightColumn=Height +settings.net.versionColumn=バージョン +settings.net.subVersionColumn=サブバージョン +settings.net.heightColumn=高さ settings.net.needRestart=その変更を適用するには、アプリケーションを再起動する必要があります。\n今すぐ行いますか? settings.net.notKnownYet=まだわかりません... -settings.net.sentData=Sent data: {0}, {1} messages, {2} messages/sec -settings.net.receivedData=Received data: {0}, {1} messages, {2} messages/sec +settings.net.sentData=通信されたデータ: {0}, {1} メッセージ、 {2} メッセージ/秒 +settings.net.receivedData=受信されたデータ: {0}, {1} メッセージ、 {2} メッセージ/秒 settings.net.ips=[IPアドレス:ポート | ホスト名:ポート | onionアドレス:ポート](コンマ区切り)。デフォルト(8333)が使用される場合、ポートは省略できます。 settings.net.seedNode=シードノード settings.net.directPeer=ピア (ダイレクト) @@ -1078,7 +1074,7 @@ settings.net.inbound=インバウンド settings.net.outbound=アウトバウンド settings.net.reSyncSPVChainLabel=SPVチェーンを再同期 settings.net.reSyncSPVChainButton=SPVファイルを削除してを再同期 -settings.net.reSyncSPVSuccess=The SPV chain file will be deleted on the next startup. You need to restart your application now.\n\nAfter the restart it can take a while to resync with the network and you will only see all transactions once the resync is completed.\n\nDepending on the number of transactions and the age of your wallet the resync can take up to a few hours and consumes 100% of CPU. Do not interrupt the process otherwise you have to repeat it. +settings.net.reSyncSPVSuccess=SPVチェーンファイルは、次回の起動時に削除されます。今すぐアプリケーションを再起動する必要があります。\n\n再起動後、ネットワークとの再同期に時間がかかることがあり、再同期が完了するとすべてのトランザクションのみが表示されます。\n\nトランザクションの数そしてウォレットの時代によって、再同期は数時間かかり、CPUのリソースを100%消費します。再同期プロセスを割り込みしないで下さい。さもなければやり直す必要があります。 settings.net.reSyncSPVAfterRestart=SPVチェーンファイルが削除されました。しばらくお待ちください。ネットワークとの再同期には時間がかかる場合があります。 settings.net.reSyncSPVAfterRestartCompleted=再同期が完了しました。アプリケーションを再起動してください。 settings.net.reSyncSPVFailed=SPVチェーンファイルを削除できませんでした。\nエラー: {0} @@ -1091,8 +1087,8 @@ setting.about.support=Bisqをサポートする setting.about.def=Bisqは会社ではなく、開かれたコミュニティのプロジェクトです。Bisqにサポートしたい時は下のURLをチェックしてください。 setting.about.contribute=貢献 setting.about.providers=データプロバイダー -setting.about.apisWithFee=Bisq uses Bisq Price Indices for Fiat and Altcoin market prices, and Bisq Mempool Nodes for mining fee estimation. -setting.about.apis=Bisq uses Bisq Price Indices for Fiat and Altcoin market prices. +setting.about.apisWithFee=Bisqは、法定通貨とアルトコインの市場価格の推定にBisq物価指数を利用し、マイニング手数料の推定にMempoolノードを使用します。 +setting.about.apis=Bisqは、法定通貨とアルトコインの市場価格の推定にBisq物価指数を利用します。 setting.about.pricesProvided=市場価格を提供している: setting.about.feeEstimation.label=推定マイニング手数料の提供: setting.about.versionDetails=バージョン詳細 @@ -1100,68 +1096,66 @@ setting.about.version=アプリのバージョン setting.about.subsystems.label=サブシステムのバージョン setting.about.subsystems.val=ネットワークバージョン: {0}; P2Pメッセージバージョン: {1}; ローカルDBバージョン: {2}; トレードプロトコルバージョン: {3} -setting.about.shortcuts=Short cuts -setting.about.shortcuts.ctrlOrAltOrCmd=''Ctrl + {0}'' or ''alt + {0}'' or ''cmd + {0}'' +setting.about.shortcuts=ショートカット +setting.about.shortcuts.ctrlOrAltOrCmd=「Ctrl + {0}」または「Alt + {0}」それとも「Cmd + {0}」 -setting.about.shortcuts.menuNav=Navigate main menu -setting.about.shortcuts.menuNav.value=To navigate the main menu press: 'Ctrl' or 'alt' or 'cmd' with a numeric key between '1-9' +setting.about.shortcuts.menuNav=メインメニューをナビゲートする +setting.about.shortcuts.menuNav.value=メインメニューをナビゲートするのに:「Ctrl」または「Alt」それとも「Cmd」キーと1-9の数字キーを押して下さい。 -setting.about.shortcuts.close=Close Bisq -setting.about.shortcuts.close.value=''Ctrl + {0}'' or ''cmd + {0}'' or ''Ctrl + {1}'' or ''cmd + {1}'' +setting.about.shortcuts.close=Bisqを閉じる +setting.about.shortcuts.close.value=「Ctrl + {0}」か「cmd + {0}」、それとも「Ctrl + {1}」か「cmd + {1}」 -setting.about.shortcuts.closePopup=Close popup or dialog window -setting.about.shortcuts.closePopup.value='ESCAPE' key +setting.about.shortcuts.closePopup=ポップアップやダイアログ・ウィンドウを閉じる +setting.about.shortcuts.closePopup.value=エスケープキー -setting.about.shortcuts.chatSendMsg=Send trader chat message -setting.about.shortcuts.chatSendMsg.value=''Ctrl + ENTER'' or ''alt + ENTER'' or ''cmd + ENTER'' +setting.about.shortcuts.chatSendMsg=取引者チャットメッセージを送る +setting.about.shortcuts.chatSendMsg.value=「Ctrl + ENTER」または「Alt + ENTER」それとも「cmd + ENTER」 -setting.about.shortcuts.openDispute=Open dispute -setting.about.shortcuts.openDispute.value=Select pending trade and click: {0} +setting.about.shortcuts.openDispute=係争を開始 +setting.about.shortcuts.openDispute.value=未決トレードを選択してクリックする:{0} -setting.about.shortcuts.walletDetails=Open wallet details window +setting.about.shortcuts.walletDetails=ウォレット詳細ウィンドウを開く -setting.about.shortcuts.openEmergencyBtcWalletTool=Open emergency wallet tool for BTC wallet +setting.about.shortcuts.openEmergencyBtcWalletTool=BTCウォレットに対する緊急ウォレットツールを開く -setting.about.shortcuts.openEmergencyBsqWalletTool=Open emergency wallet tool for BSQ wallet +setting.about.shortcuts.openEmergencyBsqWalletTool=BSQウォレットに対する緊急ウォレットツールを開く -setting.about.shortcuts.showTorLogs=Toggle log level for Tor messages between DEBUG and WARN +setting.about.shortcuts.showTorLogs=TorメッセージのログレベルをDEBUGとWARNを切り替える -setting.about.shortcuts.manualPayoutTxWindow=Open window for manual payout from 2of2 Multisig deposit tx +setting.about.shortcuts.manualPayoutTxWindow=2of2マルチシグ入金txから手動支払いのウィンドウを開く -setting.about.shortcuts.reRepublishAllGovernanceData=Republish DAO governance data (proposals, votes) +setting.about.shortcuts.reRepublishAllGovernanceData=DAOガバナンスデータ(提案、票)を再発行する -setting.about.shortcuts.removeStuckTrade=Open popup to move stuck trade to failed trades tab (only use if you are sure) -setting.about.shortcuts.removeStuckTrade.value=Select pending trade and press: {0} +setting.about.shortcuts.removeStuckTrade=はまり込められているトレードを「失敗トレード」タブへ送るのにポップアップを開く(確信する場合のみに使って下さい) +setting.about.shortcuts.removeStuckTrade.value=未決トレードを選択して押す:{0} -setting.about.shortcuts.registerArbitrator=Register arbitrator (mediator/arbitrator only) -setting.about.shortcuts.registerArbitrator.value=Navigate to account and press: {0} +setting.about.shortcuts.registerArbitrator=調停人を登録(調停者/調停人のみ) +setting.about.shortcuts.registerArbitrator.value=アカウントへナビゲートして押す: {0} -setting.about.shortcuts.registerMediator=Register mediator (mediator/arbitrator only) -setting.about.shortcuts.registerMediator.value=Navigate to account and press: {0} +setting.about.shortcuts.registerMediator=調停者を登録(調停者/調停人のみ) +setting.about.shortcuts.registerMediator.value=アカウントへナビゲートして押す: {0} -setting.about.shortcuts.openSignPaymentAccountsWindow=Open window for account age signing (legacy arbitrators only) -setting.about.shortcuts.openSignPaymentAccountsWindow.value=Navigate to legacy arbitrator view and press: {0} +setting.about.shortcuts.openSignPaymentAccountsWindow=アカウント年齢署名のウィンドウを開く(レガシー調停人のみ) +setting.about.shortcuts.openSignPaymentAccountsWindow.value=レガシー調停人表示へナビゲートして押す: {0} -setting.about.shortcuts.sendAlertMsg=Send alert or update message (privileged activity) +setting.about.shortcuts.sendAlertMsg=アラートまたはアップデートメッセージを送る(特権的行為) -setting.about.shortcuts.sendFilter=Set Filter (privileged activity) +setting.about.shortcuts.sendFilter=フィルターを設定する(特権的行為) -setting.about.shortcuts.sendPrivateNotification=Send private notification to peer (privileged activity) -setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} +setting.about.shortcuts.sendPrivateNotification=ピアにプライベート通知を送る(特権的行為) +setting.about.shortcuts.sendPrivateNotification.value=アバターからピア情報を開いて押す:{0} -setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.headline=新しいXMR自動確認の機能 +setting.info.msg=BTC売ってXMR買う場合、Bisqが自動的にトレードを完了としてマークできるように自動確認機能で適正量のXMRはウォレットに送られたかを検証できます。その際、皆にトレードをより早く完了できるようにします。\n\n自動確認はXMR送信者が提供するプライベート・トランザクション・キーを利用して少なくとも2つのXMRエクスプローラノードでXMRトランザクションを確認します。デフォルト設定でBisqは貢献者に管理されるエクスプローラノードを利用しますが、最大のプライバシーやセキュリティーのため自分のXMRエクスプローラノードを管理するのをおすすめします。\n\n1つのトレードにつき自動確認する最大額のBTC、そして必要承認の数をこの画面で設定できます。\n\nBisqのWikiから詳細(自分のエクスプローラノードを管理する方法も含めて)を参照できます: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=調停人登録 -account.tab.mediatorRegistration=Mediator registration -account.tab.refundAgentRegistration=Refund agent registration -account.tab.signing=Signing -account.tab.account=アカウント +account.tab.mediatorRegistration=調停者登録 +account.tab.refundAgentRegistration=仲裁人登録 +account.tab.signing=署名中 account.info.headline=あなたのBisqアカウントへようこそ! -account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer). +account.info.msg=ここでは、各国通貨とアルトコインのトレードアカウントを追加したり、ウォレットやアカウントデータのバックアップを作成することができます。\n\nBisqは最初に起動した時、新しいビットコインウォレットが自動的に作られました。\n\nビットコインウォレットのシードワードを書き留めて(上部のタブを参照)、入金の前にパスワードを追加することを検討することを強くお勧めします。 ビットコインの入出金は「資金」セクションで管理されます。\n\nプライバシーとセキュリティに関するメモ: Bisqは非中央集権型の交換であるため、すべてのデータはコンピュータに保存されています。 サーバーがないので、私たちはあなたの個人情報、あなたの資金、あるいはあなたのIPアドレスにさえもアクセスできません。 銀行口座番号、アルトコイン&ビットコインのアドレスなどのデータは、あなたが開始したトレードを遂行するためにあなたのトレード相手とだけ共有されます(係争の場合には調停人があなたのトレードピアと同じデータを見るでしょう)。 account.menu.paymentAccount=各国通貨口座 account.menu.altCoinsAccountView=アルトコインアカウント @@ -1173,38 +1167,53 @@ account.menu.notifications=通知 ## TODO should we rename the following to a gereric name? account.arbitratorRegistration.pubKey=パブリックキー -account.arbitratorRegistration.register=Register -account.arbitratorRegistration.registration={0} registration +account.arbitratorRegistration.register=登録する +account.arbitratorRegistration.registration={0} 登録 account.arbitratorRegistration.revoke=取り消し -account.arbitratorRegistration.info.msg=Please note that you need to stay available for 15 days after revoking as there might be trades which are using you as {0}. The max. allowed trade period is 8 days and the dispute process might take up to 7 days. +account.arbitratorRegistration.info.msg={0} としてあなたを使用しているトレードが存在する可能性があるので、取り消し後の15日間にかけて必ず待機しておいて下さい。許可されるトレード期間は8日間で、係争処理には最長で7日間かかる場合があります。 account.arbitratorRegistration.warn.min1Language=少なくとも1つの言語を設定する必要があります。\nデフォルトの言語を追加しました。 -account.arbitratorRegistration.removedSuccess=You have successfully removed your registration from the Bisq network. -account.arbitratorRegistration.removedFailed=Could not remove registration.{0} -account.arbitratorRegistration.registerSuccess=You have successfully registered to the Bisq network. -account.arbitratorRegistration.registerFailed=Could not complete registration.{0} +account.arbitratorRegistration.removedSuccess=Bisqネットワークから登録を正常に削除しました。 +account.arbitratorRegistration.removedFailed=登録を削除できませんでした。{0} +account.arbitratorRegistration.registerSuccess=Bisqネットワークに正常に登録しました。 +account.arbitratorRegistration.registerFailed=登録を完了できませんでした。{0} account.altcoin.yourAltcoinAccounts=あなたのアルトコインアカウント -account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases. +account.altcoin.popup.wallet.msg={1} のWebページに記載されているように、{0}ウォレットの使用に関する要件に必ず従ってください。\n(a)あなたが自分で鍵を管理していない、または(b)互換性のあるウォレットソフトウェアを使用していないような、中央集権化された取引所でウォレットを使用することは危険です。トレード資金の損失につながる可能性があります!\n調停者や調停人は{2}スペシャリストではなく、そのような場合には手助けできません。 account.altcoin.popup.wallet.confirm=どのウォレットを使うべきか理解しており、承認する +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. -account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.arq.msg=BisqでARQをトレードするには、次の要件を理解し、満たす必要があります。\n\nARQを送信するには、store-tx-infoフラグを有効(新しいバージョンではデフォルト)にした公式のArQmA GUIウォレットまたはArQmA CLIウォレットのいずれかを使用する必要があります。係争が発生した場合に必要になるため、txキーにアクセスできることを確認してください。\narqma-wallet-cli(コマンドget_tx_keyを使用)\narqma-wallet-gui(履歴タブに移動し、支払い証明のために(P)ボタンをクリックします)\n\n通常のブロックエクスプローラーでは、転送は検証できません。\n\n係争の場合、調停人に次のデータを提供する必要があります。\n-txプライベートキー\n-トランザクションハッシュ\n-受信者のパブリックアドレス\n\n上記のデータを提供しない場合、または互換性のないウォレットを使用した場合は、係争のケースが失われます。 ARQ送信者は、係争の場合にARQ転送の検証を調停人に提供する責任があります。\n\n支払いIDは不要で、通常のパブリックアドレスのみです。\nこのプロセスがわからない場合は、ArQmA Discordチャンネル( https://discord.gg/s9BQpJT )またはArQmAフォーラム( https://labs.arqma.com )にアクセスして、詳細を確認してください。 +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=BisqでXMRをトレードするには、以下の要件を理解し、満たす必要があります。\n\nXMRを売る場合、係争を解決するため調停者や調停人に以下の情報を提供できる必要があります:\n- トランザクションキー(Txキー、Tx秘密キー、Txプライベートキー)\n- トランザクションID(TxID、Txハッシュ)\n- 宛先アドレス(受領者のアドレス)\n\n人気のモネロウォレットからこういう情報を見つける方法について、BisqのWikiを参照して下さい [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments]\n必要のトランザクションデータを提供しなければ、係争で不利な裁定を下されます。\n\nBisqではXMRトランザクションに自動確認機能を提供しますが、設で有効にする必要があります。\n\n自動確認機能について詳しくはWikiで参照して下さい:\n[HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs). -account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" +account.altcoin.popup.blur.msg=BisqでBLURをトレードするには、次の要件を理解し、満たす必要があります。\n\nBLURを送信するには、Blur Network CLIまたはGUI ウォレットを使用する必要があります。\n\nCLIウォレットを使用している場合、転送の送信後にトランザクションハッシュ(tx ID)が表示されます。この情報を保存する必要があります。転送を送信した直後に、コマンド「get_tx_key」を使用してトランザクションプライベートキーを取得する必要があります。この手順を実行しないと、後でキーを取得できない場合があります。\n\nBlur Network GUIウォレットを使用している場合、トランザクションのプライベートキーとトランザクションIDは「履歴」タブで簡単に見つけることができます。送信後すぐに、目的のトランザクションを見つけてください。このトランザクションを含むボックスの右下隅にある「?」記号をクリックしてください。この情報を保存する必要があります。\n\n調停が必要な場合は、1) トランザクションID、2) トランザクションプライベートキー、3) 受信者のアドレス を調停人に提示する必要があります。調停人は、Blur Transaction Viewer( https://blur.cash/#tx-viewer )を使用してBLUR転送を検証します。\n\n必要な情報を調停人に提供しないと、係争のケースが失われます。係争のすべての場合において、BLUR送信者は、調停人に対する取引を確認する責任の100%を負担します。\n\nこれらの要件を理解していない場合は、Bisqで取引しないでください。まず、Blur Network Discord( https://discord.gg/dMWaqVW )で助けを求めてください。 +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/). -account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN). -account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). -account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help. -account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses. -account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer. +# suppress inspection "UnusedProperty" +account.altcoin.popup.cash2.msg=BisqでCASH2をトレードするには、次の要件を理解し、満たす必要があります。\n\nCASH2を送信するには、Cash2 Walletバージョン3以降を使用する必要があります。\n\nトランザクションが送信された後、トランザクションIDが表示されます。この情報を保存する必要があります。トランザクションを送信した直後に、simplewalletのコマンド「getTxKey」を使用して、トランザクションのプライベートキーを取得する必要があります。\n\n調停が必要な場合は、1) トランザクションID、2) トランザクションプライベートキー、および 3) 受信者のCash2アドレス を調停人に提示する必要があります。その後、調停人は、Cash2 Block Explorer( https://blocks.cash2.org )を使用してCASH2転送を検証します。\n\n必要な情報を調停人に提供しないと、係争のケースが失われます。係争のすべての場合において、CASH2の送信者が、仲裁人への取引を確認する責任を100%負います。\n\nこれらの要件を理解していない場合は、Bisqで取引しないでください。まず、Cash2 Discord( https://discord.gg/FGfXAYN )で助けを求めてください。 +# suppress inspection "UnusedProperty" +account.altcoin.popup.qwertycoin.msg=BisqでQwertycoinをトレードするには、次の要件を理解し、満たす必要があります。\n\nQWCを送信するには、公式のQWCウォレットバージョン5.1.3以降を使用する必要があります。\n\nトランザクションが送信された後、トランザクションIDが表示されます。この情報を保存する必要があります。トランザクションを送信した直後に、simplewalletのコマンド「get_Tx_Key」を使用してトランザクションのプライベートキーを取得する必要があります。\n\n調停が必要な場合は、1) トランザクションID、2) トランザクションプライベートキー、3)受信者のQWCアドレス を調停人に提示する必要があります。その後、調停人はQWC Block Explorer( https://explorer.qwertycoin.org )を使用してQWC転送を検証します。\n\n必要な情報を調停人に提供しないと、係争のケースが失われます。係争のすべての場合において、QWCの送信者が、調停人のトレードの検証における100%の責任を負います。\n\nこれらの要件を理解していない場合は、Bisqで取引しないでください。まず、QWC Discord( https://discord.gg/rUkfnpC )で助けを求めてください。 +# suppress inspection "UnusedProperty" +account.altcoin.popup.drgl.msg=BisqでDragonglassをトレードするには、次の要件を理解し、満たす必要があります。\n\nDragonglassが提供するプライバシーのため、トランザクションはパブリックブロックチェーンでは検証できません。必要に応じて、TXN-Private-Keyを使用して支払いを証明できます。\nTXN-Private-Keyは、DRGLウォレット内からのみアクセスできるトランザクションごとに自動的に生成されるワンタイムキーです。\nDRGLウォレットGUI(トランザクション詳細ダイアログ内)またはDragonglass CLIシンプルウォレット(コマンド「get_tx_key」を使用)のいずれか。\n\nDRGLバージョン「Oathkeeper」以降には両方が「必要」です。\n\n係争が発生した場合、調停人に次のデータを提供する必要があります。\n-TXN-Private-Key\n-トランザクションハッシュ\n-受信者のパブリックアドレス\n\n上記のデータを( http://drgl.info/#check_txn )の入力として使用して、支払いの検証を行うことができます。\n\n上記のデータを提供しない場合、または互換性のないウォレットを使用した場合は、係争のケースが失われます。 Dragonglassの送信者は、係争の場合にDRGL転送の調停人に検証を提供する責任があります。 PaymentIDの使用は必要ありません。\n\nこのプロセスについて不明な点がある場合は、Dragonglass on Discord( http://discord.drgl.info )にアクセスしてください。 +# suppress inspection "UnusedProperty" +account.altcoin.popup.ZEC.msg=Zcashを使用する場合、調停者や調停人はzアドレスを持つトランザクションを検証できないため、zアドレス(プライベート)ではなく、透過アドレス(tで始まる)のみを使用できます。 +# suppress inspection "UnusedProperty" +account.altcoin.popup.XZC.msg=Zcoinを使用する場合、調停者や調停人はブロックエクスプローラーで追跡不可能なアドレスを持つトランザクションを検証できないため、追跡不可能なアドレスではなく、透過(追跡可能な)アドレスのみを使用できます。 +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRINでは、トランザクションを作成するために送信者と受信者の間の対話型プロセスが必要です。 GRINプロジェクトのWebページの指示に従って、GRINを確実に送受信してください(受信者はオンラインであるか、特定の時間枠内で少なくともオンラインである必要があります)。\n\nBisqは、Grinbox(Wallet713)ウォレットURL形式のみをサポートします。\n\nGRIN送信者は、GRINが正常に送信されたことを証明する必要があります。ウォレットがその証拠を提供できない場合、起こり得る係争はGRIN受信者に有利に解決されるでしょう。トランザクションプルーフをサポートする最新のGrinboxソフトウェアを使用し、GRINの送受信プロセスとプルーフの作成方法を理解してください。\n\nGrinboxプルーフツールの詳細については、https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only を参照してください。 +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAMではトランザクションを作成するために、送信者と受信者の間で対話型プロセスが必要です。\n\n必ずBEAMプロジェクトのWebページの指示に従って、BEAMを確実に送受信してください(受信者はオンラインであるか、特定の時間枠で少なくともオンラインである必要があります)。\n\nBEAM送信者は、BEAMが正常に送信されたことを証明する必要があります。そのような証拠を作成できるウォレットソフトウェアを使用してください。ウォレットが証拠を提供できない場合、起こり得る論争はBEAM受信者に有利に解決されるでしょう。 -account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" +account.altcoin.popup.pars.msg=ParsiCoinをBisqでトレードするには、次の要件を理解し、満たす必要があります。\n\nPARSを送信するには、公式のParsiCoin Walletバージョン3.0.0以降を使用する必要があります。\n\nGUIウォレット(ParsiPay)のTransactionsセクションでトランザクションハッシュとトランザクションキーを確認できます。Transactionを右クリックして、show detailsをクリックします。\n\n調停が必要な場合は、1) トランザクションハッシュ、2) トランザクションキー、および3) 受信者のPARSア​​ドレス を調停人に提示する必要があります。その後、調停人は、ParsiCoin Block Explorer( http://explorer.parsicoin.net/#check_payment )を使用してPARS転送を検証します。\n\n必要な情報を調停人に提供しないと、係争のケースが失われます。係争のすべての場合において、ParsiCoinの送信者が、係争人のトランザクションの検証における100%の責任を負います。\n\nこれらの要件を理解していない場合は、Bisqで取引しないでください。まず、ParsiCoin Discord( https://discord.gg/c7qmFNh )で助けを求めてください。 +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash. -account.altcoin.popup.liquidbitcoin.msg=Trading L-BTC on Bisq requires that you understand the following:\n\nWhen receiving L-BTC for a trade on Bisq, you cannot use the mobile Blockstream Green Wallet app or a custodial/exchange wallet. You must only receive L-BTC into the Liquid Elements Core wallet, or another L-BTC wallet which allows you to obtain the blinding key for your blinded L-BTC address.\n\nIn the event mediation is necessary, or if a trade dispute arises, you must disclose the blinding key for your receiving L-BTC address to the Bisq mediator or refund agent so they can verify the details of your Confidential Transaction on their own Elements Core full node.\n\nFailure to provide the required information to the mediator or refund agent will result in losing the dispute case. In all cases of dispute, the L-BTC receiver bears 100% of the burden of responsibility in providing cryptographic proof to the mediator or refund agent.\n\nIf you do not understand these requirements, do not trade L-BTC on Bisq. +# suppress inspection "UnusedProperty" +account.altcoin.popup.liquidbitcoin.msg=BisqでL-BTCをトレードするには、以下を理解する必要があります:\n\nBisqでのトレードにL-BTCを受け取る場合、モバイル用「Blockstream Green」ウォレットアプリそれとも取引場などの第三者によって保管されるウォレットの利用は不可能です。「Liquid Elements Core」ウォレット、あるいは機密L-BTCアドレスの「blindingキー」が入手可能のウォレットのみにL-BTCを受け取って下さい。\n\n調停が必要になる場合、あるいはトレード係争が開始される場合、調停者や調停人が「Elements Core」フルノードで機密トランザクションを検証できるように、受取アドレスのblindingキーを明かす必要があります。\n\n調停者や調停人に必要な情報を提供しなければ、係争で不利な裁定を下されます。全ての係争には、調停者や調停人に暗号証明を提供するのは100%受信者の責任です。\n\n以上の条件を理解しない場合、BisqでL-BTCのトレードをしないで下さい。 account.fiat.yourFiatAccounts=あなたの各国通貨口座 @@ -1213,7 +1222,6 @@ account.backup.location=バックアップの場所 account.backup.selectLocation=バックアップの場所を選択 account.backup.backupNow=今すぐバックアップ(バックアップは暗号化されていません!) account.backup.appDir=アプリケーションデータディレクトリー -account.backup.logFile=ログファイル account.backup.openDirectory=ディレクトリーを開く account.backup.openLogFile=ログファイルを開く account.backup.success=次の場所へのバックアップに成功しました:\n{0} @@ -1227,7 +1235,7 @@ account.password.info=パスワード保護を使用すると、アプリケー account.seed.backup.title=あなたのウォレットのシードワードをバックアップ account.seed.info=ウォレットのシードワードと日付の両方を書き留めてください!あなたはシードワードと日付でいつでもウォレットを復元することができます。\nBTCおよびBSQウォレットには同じシードワードが使用されています。\n\nあなたは一枚の紙にシードワードを書き留めるべきです。コンピュータに保存しないでください。\n\nシードワードはバックアップの代わりにはならないことに気をつけて下さい。\nアプリケーションの状態とデータを復元するには「アカウント/バックアップ」画面からアプリケーションディレクトリ全体のバックアップを作成する必要があります。\nシードワードのインポートは緊急の場合にのみ推奨されます。データベースファイルとキーの適切なバックアップがなければ、アプリケーションは機能しません! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=ここで留意すべきはシードワードがバックアップの代りとして機能を果たさないことです。\nアプリケーションステートとデータを復元するのに、「アカウント/バックアップ」画面からアプリケーションディレクトリの完全バックアップを作成する必要があります。\nシードワードのインポートは緊急の場合のみにおすすめします。データベースファイルとキーの正当なバックアップがなければ、アプリケーションは機能するようになれません!\n\n詳しくはWikiのページから: [HYPERLINK:https://bisq.wiki/Backing_up_application_data] account.seed.warn.noPw.msg=シードワードの表示を保護するためのウォレットパスワードを設定していません。 \n\nシードワードを表示しますか? account.seed.warn.noPw.yes=はい、そして次回から確認しないで下さい account.seed.enterPw=シードワードを見るためにパスワードを入力 @@ -1241,14 +1249,11 @@ account.seed.restore.ok=わかりました、復元してBisqをシャットダ account.notifications.setup.title=セットアップ account.notifications.download.label=モバイルアプリをダウンロードする -account.notifications.download.button=ダウンロード account.notifications.waitingForWebCam=webcamを待っています... account.notifications.webCamWindow.headline=携帯でQRコードをスキャン account.notifications.webcam.label=ウェブカメラを使う account.notifications.webcam.button=QRコードをスキャンする account.notifications.noWebcam.button=ウェブカメラを持ってない -account.notifications.testMsg.label=テスト通知を送信 -account.notifications.testMsg.title=テスト account.notifications.erase.label=スマホの通知を削除 account.notifications.erase.title=通知を削除 account.notifications.email.label=ペア通貨 @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=市場価格からの乖離の account.notifications.marketAlert.addButton=オファーアラートを追加 account.notifications.marketAlert.manageAlertsButton=オファーアラートを管理 account.notifications.marketAlert.manageAlerts.title=オファーアラートを管理 -account.notifications.marketAlert.manageAlerts.label=オファーのアラート -account.notifications.marketAlert.manageAlerts.item={0}のオファーの{1}の価格トリガーで、支払いアカウントが{2}のオファーアラート account.notifications.marketAlert.manageAlerts.header.paymentAccount=支払いアカウント account.notifications.marketAlert.manageAlerts.header.trigger=価格トリガー account.notifications.marketAlert.manageAlerts.header.offerType=オファーの種類 @@ -1321,8 +1324,7 @@ dao.unverifiedBsqBalance=未検証の全トランザクション残高(ブロッ dao.lockedForVoteBalance=投票に使用済 dao.lockedInBonds=ロック中の担保 dao.availableNonBsqBalance=利用可能な非BSQ残高 (BTC) -dao.totalBsqBalance=合計BSQ残高 -dao.reputationBalance=Merit Value (not spendable) +dao.reputationBalance=メリット値(支出できません) dao.tx.published.success=トランザクションの発行に成功しました dao.proposal.menuItem.make=提案する @@ -1353,12 +1355,12 @@ dao.results.cycles.table.header.issuance=発行 dao.results.results.table.item.cycle=サイクル {0} 開始: {1} dao.results.proposals.header=選択されたサイクルの提案 -dao.results.proposals.table.header.nameLink=Name/link +dao.results.proposals.table.header.nameLink=名前/リンク dao.results.proposals.table.header.details=詳細 dao.results.proposals.table.header.myVote=自分の投票 dao.results.proposals.table.header.result=投票結果 -dao.results.proposals.table.header.threshold=Threshold -dao.results.proposals.table.header.quorum=Quorum +dao.results.proposals.table.header.threshold=閾値 +dao.results.proposals.table.header.quorum=定足数 dao.results.proposals.voting.detail.header=選択された提案の投票結果 @@ -1452,15 +1454,10 @@ dao.param.BONDED_ROLE_FACTOR=BSQの担保された役割単位係数 dao.param.ISSUANCE_LIMIT=BSQのサイクルごとの発行制限 dao.param.currentValue=現在の値: {0} -dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1}) +dao.param.currentAndPastValue=現在の値: {0} (提案した時の値: {1} ) dao.param.blocks={0} ブロック -dao.results.cycle.duration.label={0}の期間 -dao.results.cycle.duration.value={0} ブロック -dao.results.cycle.value.postFix.isDefaultValue=(既定値) -dao.results.cycle.value.postFix.hasChanged=(投票により変更された) - -dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0} +dao.results.invalidVotes=その投票サイクルで無効な投票がありました。投票がBisqネットワークでうまく配布されなかった場合、それが起こる可能性があります。\n{0} # suppress inspection "UnusedProperty" dao.phase.PHASE_UNDEFINED=未定義 @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=ソルト dao.bond.reputation.hash=ハッシュ dao.bond.reputation.lockupButton=ロック dao.bond.reputation.lockup.headline=トランザクションのロックを承認 -dao.bond.reputation.lockup.details=ロックされる金額: {0}\nアンロック時間: {1}ブロック(≈{2})\n\nマイニング手数料: {3} ({4} Satoshis/byte)\nトランザクションサイズ: {5} Kb\n\n続行してよろしいですか? +dao.bond.reputation.lockup.details=ロックされる金額: {0}\nアンロック時間: {1}ブロック(≈{2})\n\nマイニング手数料: {3} ({4} Satoshis/vbyte)\nトランザクションvサイズ: {5} Kb\n\n続行してよろしいですか? dao.bond.reputation.unlock.headline=トランザクションのアンロックを承認 -dao.bond.reputation.unlock.details=アンロックされる金額: {0}\nアンロック時間: {1}ブロック(≈{2})\n\nマイニング手数料: {3} ({4} Satoshis/byte)\nトランザクションサイズ: {5} Kb\n\n続行してよろしいですか? +dao.bond.reputation.unlock.details=アンロックされる金額: {0}\nアンロック時間: {1}ブロック(≈{2})\n\nマイニング手数料: {3} ({4} Satoshis/vbyte)\nトランザクションvサイズ: {5} Kb\n\n続行してよろしいですか? dao.bond.allBonds.header=すべての担保 @@ -1524,7 +1521,7 @@ dao.bond.table.column.bondType=担保タイプ dao.bond.table.column.details=詳細 dao.bond.table.column.lockupTxId=ロック Tx ID dao.bond.table.column.bondState=担保状態 -dao.bond.table.column.lockTime=Unlock time +dao.bond.table.column.lockTime=アンロック時間 dao.bond.table.column.lockupDate=ロック日 dao.bond.table.button.lockup=ロック @@ -1566,7 +1563,7 @@ dao.bond.bondedRoleType.FORUM_ADMIN=フォーラム管理者 # suppress inspection "UnusedProperty" dao.bond.bondedRoleType.TWITTER_ADMIN=Twitter管理者 # suppress inspection "UnusedProperty" -dao.bond.bondedRoleType.ROCKET_CHAT_ADMIN=Keybase admin +dao.bond.bondedRoleType.ROCKET_CHAT_ADMIN=Keybase管理者 # suppress inspection "UnusedProperty" dao.bond.bondedRoleType.YOUTUBE_ADMIN=YouTube管理者 # suppress inspection "UnusedProperty" @@ -1582,13 +1579,13 @@ dao.bond.bondedRoleType.FORUM_OPERATOR=フォーラム運営者 # suppress inspection "UnusedProperty" dao.bond.bondedRoleType.SEED_NODE_OPERATOR=シードノード運営者 # suppress inspection "UnusedProperty" -dao.bond.bondedRoleType.DATA_RELAY_NODE_OPERATOR=Price node operator +dao.bond.bondedRoleType.DATA_RELAY_NODE_OPERATOR=価格ノード運営者 # suppress inspection "UnusedProperty" -dao.bond.bondedRoleType.BTC_NODE_OPERATOR=Bitcoin node operator +dao.bond.bondedRoleType.BTC_NODE_OPERATOR=ビットコインノード運営者 # suppress inspection "UnusedProperty" dao.bond.bondedRoleType.MARKETS_OPERATOR=市場運営者 # suppress inspection "UnusedProperty" -dao.bond.bondedRoleType.BSQ_EXPLORER_OPERATOR=Explorer operator +dao.bond.bondedRoleType.BSQ_EXPLORER_OPERATOR=エクスプローラー運営者 # suppress inspection "UnusedProperty" dao.bond.bondedRoleType.MOBILE_NOTIFICATIONS_RELAY_OPERATOR=モバイル通知中継の運営者 # suppress inspection "UnusedProperty" @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=署名する dao.proofOfBurn.message=メッセージ dao.proofOfBurn.sig=署名 dao.proofOfBurn.verify=検証する -dao.proofOfBurn.verify.header=バーントランザクションの証明からのキーでメッセージを検証 dao.proofOfBurn.verificationResult.ok=検証成功 dao.proofOfBurn.verificationResult.failed=検証失敗 @@ -1738,23 +1734,22 @@ dao.proposal.create.publish=提案の発行 dao.proposal.create.publishing=提案の発行が進行中です... dao.proposal=提案 dao.proposal.display.type=提案タイプ -dao.proposal.display.name=Exact GitHub username +dao.proposal.display.name=正確なGithubのユーザ名 dao.proposal.display.link=詳細情報へのリンク dao.proposal.display.link.prompt=提案へのリンク dao.proposal.display.requestedBsq=BSQのリクエスト額 -dao.proposal.display.bsqAddress=BSQアドレス dao.proposal.display.txId=提案トランザクションID dao.proposal.display.proposalFee=提案手数料 dao.proposal.display.myVote=自分の投票 dao.proposal.display.voteResult=投票結果の概要 dao.proposal.display.bondedRoleComboBox.label=担保された役割のタイプ dao.proposal.display.requiredBondForRole.label=役割に必要な担保 -dao.proposal.display.tickerSymbol.label=ティッカーシンボル dao.proposal.display.option=オプション dao.proposal.table.header.proposalType=提案タイプ dao.proposal.table.header.link=リンク dao.proposal.table.header.myVote=自分の投票 +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=取り消す dao.proposal.table.icon.tooltip.removeProposal=自分の提案を削除 dao.proposal.table.icon.tooltip.changeVote=現在の投票:「{0}」。 次の投票へ変更:「{1}」 @@ -1762,8 +1757,8 @@ dao.proposal.table.icon.tooltip.changeVote=現在の投票:「{0}」。 次の dao.proposal.display.myVote.accepted=承認 dao.proposal.display.myVote.rejected=拒否 dao.proposal.display.myVote.ignored=無視 -dao.proposal.display.myVote.unCounted=Vote was not included in result -dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3}) {4} +dao.proposal.display.myVote.unCounted=票は結果に含められませんでした +dao.proposal.myVote.summary=投票済: {0}; 投票の重さ: {1} (獲得済み: {2} + ステーク: {3}) {4} dao.proposal.myVote.invalid=投票が無効でした dao.proposal.voteResult.success=承認 @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=ウォレット残高 dao.wallet.receive.fundYourWallet=あなたのBSQ受信アドレス dao.wallet.receive.bsqAddress=BSQウォレットアドレス(未使用の新しいアドレス) -dao.wallet.receive.dao.headline=Bisq DAO -dao.wallet.receive.daoInfo=Bisqの交換が非中央集権化され検閲に抵抗するように、そのガバナンスモデルも、つまりBisq DAOとBSQトークンはそれを可能にするツールです。 -dao.wallet.receive.daoInfo.button=Bisq DAOについてもっと詳しく知る -dao.wallet.receive.daoTestnetInfo=メインネットBisq DAOはまだ起動されていませんが、テストネットで実行することでBisq DAOについて学ぶことができます。 -dao.wallet.receive.daoTestnetInfo.button=テストネットでBisq DAOを実行する方法 -dao.wallet.receive.daoContributorInfo=Bisqに貢献している場合は、以下のBSQアドレスを使用して、BSQジェネシス配布に参加するようにリクエストしてください。 -dao.wallet.receive.daoContributorInfo.button=BSQジェネシス配布への参加方法 - dao.wallet.send.sendFunds=送金する dao.wallet.send.sendBtcFunds=非BSQ残高の送金 (BTC) dao.wallet.send.amount=BSQの額 dao.wallet.send.btcAmount=BTCの額(非BSQ残高) dao.wallet.send.setAmount=出金額を設定(最少額は{0}) -dao.wallet.send.setBtcAmount=BTCの出金額を設定(最少額は{0}) dao.wallet.send.receiverAddress=受信者のBSQアドレス dao.wallet.send.receiverBtcAddress=受信者のBTCアドレス dao.wallet.send.setDestinationAddress=あなたの出金先アドレスを記入 dao.wallet.send.send=BSQ残高の送信 dao.wallet.send.sendBtc=BTC残高の送信 dao.wallet.send.sendFunds.headline=出金リクエストを承認 -dao.wallet.send.sendFunds.details=送金中: {0}\n入金先アドレス: {1}\n必要なトランザクション手数料: {2} ({3} satoshis/byte)\nトランザクションサイズ: {4} Kb\n\n入金先の受け取る金額: {5}\n\n本当にこの金額を出金しますか? +dao.wallet.send.sendFunds.details=送金中: {0}\n入金先アドレス: {1}\n必要なトランザクション手数料: {2} ({3} satoshis/vbyte)\nトランザクションvサイズ: {4} Kb\n\n入金先の受け取る金額: {5}\n\n本当にこの金額を出金しますか? dao.wallet.chainHeightSynced=最新検証済みブロック: {0} dao.wallet.chainHeightSyncing=ブロック待機中... {1}のうち{0}ブロックを検証済み dao.wallet.tx.type=タイプ @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=提案トランザクションを作成 dao.proposal.create.missingIssuanceFunds=提案トランザクションを作成するための十分なBTC残高がありません。すべてのBSQトランザクションにはBTCのマイニング手数料が必要で、発行トランザクションにも要求されたBSQ金額({0} Satoshis/BSQ)のBTCが必要です。\n不足: {1} dao.feeTx.confirm={0}トランザクションの承認 -dao.feeTx.confirm.details={0}手数料: {1}\nマイニング手数料: {2} ({3} Satoshis/byte)\nトランザクションサイズ {4} Kb\n\n本当に{5}トランザクションを発行しますか? +dao.feeTx.confirm.details={0}手数料: {1}\nマイニング手数料: {2} ({3} Satoshis/vbyte)\nトランザクションvサイズ {4} vKb\n\n本当に{5}トランザクションを発行しますか? -dao.feeTx.issuanceProposal.confirm.details={0}手数料: {1}\nBSQ発行に必要なBTC: {2}({3} Satoshis/BSQ)\nマイニング手数料: {4} ({5} Satoshis/byte)\nトランザクションサイズ {6} Kb\n\nリクエストが承認されると、あなたは2 BSQの提案料金を差し引いた金額を受け取ります。\n\n本当に{7}トランザクションを発行しますか? +dao.feeTx.issuanceProposal.confirm.details={0}手数料: {1}\nBSQ発行に必要なBTC: {2}({3} Satoshis/BSQ)\nマイニング手数料: {4} ({5} Satoshis/vbyte)\nトランザクションvサイズ {6} vKb\n\nリクエストが承認されると、あなたは2 BSQの提案料金を差し引いた金額を受け取ります。\n\n本当に{7}トランザクションを発行しますか? dao.news.bisqDAO.title=THE BISQ DAO dao.news.bisqDAO.description=Bisqの交換が非中央集権化され検閲に抵抗するように、そのガバナンスモデルも、つまりBisq DAOとBSQトークンはそれを可能にするツールです。 @@ -1916,7 +1902,7 @@ dao.monitor.daoState.utxoConflicts=UTXOの競合 dao.monitor.daoState.utxoConflicts.blockHeight=ブロックの高さ: {0} dao.monitor.daoState.utxoConflicts.sumUtxo=全UTXOの合計: {0} BSQ dao.monitor.daoState.utxoConflicts.sumBsq=全BSQの合計: {0} BSQ -dao.monitor.daoState.checkpoint.popup=DAO state is not in sync with the network. After restart the DAO state will resync. +dao.monitor.daoState.checkpoint.popup=DAOステートはネットワークと同期していません。再起動したらDAOステートは再同期します。 dao.monitor.proposal.headline=提案の状態 dao.monitor.proposal.table.headline=提案状態のハッシュのチェーン @@ -1940,16 +1926,14 @@ dao.monitor.blindVote.table.numBlindVotes=秘密投票数 dao.factsAndFigures.menuItem.supply=BSQ 供給 dao.factsAndFigures.menuItem.transactions=BSQ トランザクション -dao.factsAndFigures.dashboard.marketPrice=市場データ -dao.factsAndFigures.dashboard.price=最新の BSQ/BTCのトレード価格(Bisqによる) -dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price -dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price -dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price -dao.factsAndFigures.dashboard.avgUSDPrice30=30 days volume weighted average USD/BSQ trade price +dao.factsAndFigures.dashboard.avgPrice90=90日間の平均BSQ/BTCのトレード価格 +dao.factsAndFigures.dashboard.avgPrice30=30日間の平均BSQ/BTCのトレード価格 +dao.factsAndFigures.dashboard.avgUSDPrice90=90日間の加重平均USD/BSQトレード価格 +dao.factsAndFigures.dashboard.avgUSDPrice30=30日間の加重平均USD/BSQトレード価格 dao.factsAndFigures.dashboard.marketCap=時価総額(トレード価格に基づく) dao.factsAndFigures.dashboard.availableAmount=合計利用可能BSQ -dao.factsAndFigures.supply.issuedVsBurnt=BSQ issued v. BSQ burnt +dao.factsAndFigures.supply.issuedVsBurnt=発行されたBSQ v. バーンされたBSQ dao.factsAndFigures.supply.issued=発行されたBSQ dao.factsAndFigures.supply.genesisIssueAmount=ジェネシストランザクションで発行されたBSQ @@ -1957,8 +1941,8 @@ dao.factsAndFigures.supply.compRequestIssueAmount=報酬リクエストの為に dao.factsAndFigures.supply.reimbursementAmount=払い戻しリクエストの為に発行されたBSQ dao.factsAndFigures.supply.burnt=バーン済BSQ -dao.factsAndFigures.supply.burntMovingAverage=15-day moving average -dao.factsAndFigures.supply.burntZoomToInliers=Zoom to inliers +dao.factsAndFigures.supply.burntMovingAverage=15日間移動平均 +dao.factsAndFigures.supply.burntZoomToInliers=inlierにズームイン dao.factsAndFigures.supply.locked=ロックされたBSQのグローバル状態 dao.factsAndFigures.supply.totalLockedUpAmount=担保でロックされている @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=後でダウンロード displayUpdateDownloadWindow.button.ignoreDownload=このバージョンを無視 displayUpdateDownloadWindow.headline=新しいBisqの更新が利用可能です! displayUpdateDownloadWindow.download.failed.headline=ダウンロードに失敗 -displayUpdateDownloadWindow.download.failed=ダウンロード失敗。\nhttps://bisq.network/downloads から手動でダウンロードして確認してください。 -displayUpdateDownloadWindow.installer.failed=正しいインストーラーを判別できません。 https://bisq.network/downloads から手動でダウンロードして検証してください。 -displayUpdateDownloadWindow.verify.failed=検証失敗。\nhttps://bisq.network/downloads から手動でダウンロードして確認してください。 +displayUpdateDownloadWindow.download.failed=ダウンロード失敗。\n[HYPERLINK:https://bisq.network/downloads] から手動でダウンロード、確認してください。 +displayUpdateDownloadWindow.installer.failed=正しいインストーラーを判別できません。 [HYPERLINK:https://bisq.network/downloads] から手動でダウンロードして検証してください。 +displayUpdateDownloadWindow.verify.failed=検証失敗。\n[HYPERLINK:https://bisq.network/downloads] から手動でダウンロードして確認してください。 displayUpdateDownloadWindow.success=新しいバージョンが正常にダウンロードされ、署名が検証されました。\n\nダウンロードディレクトリを開き、アプリケーションを終了して新しいバージョンをインストールしてください。 displayUpdateDownloadWindow.download.openDir=ダウンロードフォルダを開く @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=トレード金額の支払い disputeSummaryWindow.payout.getsTradeAmount=BTC {0}はトレード金額の支払いを受け取ります disputeSummaryWindow.payout.getsAll=BTC {0} は全て受け取ります disputeSummaryWindow.payout.custom=任意の支払い -disputeSummaryWindow.payout.adjustAmount=入力された金額が利用可能な金額 {0} を超えています。\nこの入力フィールドを可能な最大値に調整します。 disputeSummaryWindow.payoutAmount.buyer=買い手の支払額 disputeSummaryWindow.payoutAmount.seller=売り手の支払額 disputeSummaryWindow.payoutAmount.invert=発行者として敗者を使用 @@ -2040,36 +2023,39 @@ disputeSummaryWindow.reason.OTHER=その他 # suppress inspection "UnusedProperty" disputeSummaryWindow.reason.BANK_PROBLEMS=銀行 # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.OPTION_TRADE=Option trade +disputeSummaryWindow.reason.OPTION_TRADE=オプション・トレード # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.SELLER_NOT_RESPONDING=Seller not responding +disputeSummaryWindow.reason.SELLER_NOT_RESPONDING=売り手は不反応 # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.WRONG_SENDER_ACCOUNT=Wrong sender account +disputeSummaryWindow.reason.WRONG_SENDER_ACCOUNT=間違った送信者アカウント # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.PEER_WAS_LATE=Peer was late +disputeSummaryWindow.reason.PEER_WAS_LATE=ピアが遅れました # suppress inspection "UnusedProperty" -disputeSummaryWindow.reason.TRADE_ALREADY_SETTLED=Trade already settled +disputeSummaryWindow.reason.TRADE_ALREADY_SETTLED=トレードはすでに決められました disputeSummaryWindow.summaryNotes=概要ノート disputeSummaryWindow.addSummaryNotes=概要ノートを追加 disputeSummaryWindow.close.button=チケットを閉じる # Do no change any line break or order of tokens as the structure is used for signature verification -disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.msg=チケットは {0} に閉じられました\n{1} ノードアドレス: {2}\n\nまとめ\nトレードID: {3}\n通貨: {4}\nトレード金額: {5}\n買い手のBTC支払額: {6}\n売り手のBTC支払額 {7}\n\n係争の理由: {8}\n\n概要ノート:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification disputeSummaryWindow.close.msgWithSig={0}{1}{2}{3} -disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and accept or reject suggestion from mediator -disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions +disputeSummaryWindow.close.nextStepsForMediation=\n次のステップ:\nトレードをオープンして、調停者からの提案を受け入れるまたは拒否する +disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\n次のステップ:\nこれ以上の行動が必要ありません。調停人があなたに有利に決める場合、「仲裁からの払い戻し」というトランザクションは「資金/トランザクション」に表示されます。 disputeSummaryWindow.close.closePeer=取引相手のチケットも閉じる必要があります! -disputeSummaryWindow.close.txDetails.headline=Publish refund transaction -disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n -disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n -disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction? +disputeSummaryWindow.close.txDetails.headline=払い戻しトランザクションを公開する +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.txDetails.buyer=買い手が {0} を受けます、入金先アドレス: {1}\n +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.txDetails.seller=売り手が {0} を受けます、入金先アドレス: {1}\n +disputeSummaryWindow.close.txDetails=支払う金額: {0}\n{1}{2}トランザクション手数料: {3}({4}サトシ/vバイト)\nトランザクションvサイズ: {5} vKb\n\nこのトランザクションを発行してもよろしいですか? -disputeSummaryWindow.close.noPayout.headline=Close without any payout -disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? +disputeSummaryWindow.close.noPayout.headline=支払いなしで閉じる +disputeSummaryWindow.close.noPayout.text=支払いなしで閉じてもよろしいですか? emptyWalletWindow.headline={0} 緊急ウォレットツール emptyWalletWindow.info=UIから資金にアクセスできない緊急時にのみ使用してください。\n\nこのツールを使用すると、開いているオファーはすべて自動的に閉じられることに注意してください。\n\nこのツールを使用する前に、データディレクトリをバックアップしてください。これは「アカウント/バックアップ」で行えます。\n\n問題の原因を調査できるように、問題を報告し、GitHubまたはBisqフォーラムにバグレポートを提出してください。 @@ -2082,7 +2068,7 @@ emptyWalletWindow.openOffers.warn=ウォレット空にすると削除される emptyWalletWindow.openOffers.yes=はい、そうです emptyWalletWindow.sent.success=あなたのウォレットの残高は正常に送金されました。 -enterPrivKeyWindow.headline=Enter private key for registration +enterPrivKeyWindow.headline=登録のためにプライベートキーを入力 filterWindow.headline=フィルターリストを編集 filterWindow.offers=フィルター済オファー(コンマ区切り) @@ -2090,22 +2076,23 @@ filterWindow.onions=フィルター済onionアドレス(コンマ区切り) filterWindow.accounts=フィルター済トレードアカウントデータ:\n形式: コンマ区切りのリスト [支払方法id | データフィールド | 値] filterWindow.bannedCurrencies=フィルター済通貨コード(コンマ区切り) filterWindow.bannedPaymentMethods=フィルター済支払方法ID(コンマ区切り) -filterWindow.bannedAccountWitnessSignerPubKeys=Filtered account witness signer pub keys (comma sep. hex of pub keys) -filterWindow.bannedPrivilegedDevPubKeys=Filtered privileged dev pub keys (comma sep. hex of pub keys) +filterWindow.bannedAccountWitnessSignerPubKeys=フィルター済アカウントWitness署名者パブリックキー(コンマ区切りパブリックキーの16進値) +filterWindow.bannedPrivilegedDevPubKeys=フィルター済特権的開発者パブリックキー(コンマ区切りパブリックキーの16進値) filterWindow.arbitrators=フィルター済調停人(コンマ区切り onionアドレス) -filterWindow.mediators=Filtered mediators (comma sep. onion addresses) -filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses) +filterWindow.mediators=フィルター済調停者(コンマ区切り onionアドレス) +filterWindow.refundAgents=フィルター済仲裁人(コンマ区切り onionアドレス) filterWindow.seedNode=フィルター済シードノード(コンマ区切り onionアドレス) filterWindow.priceRelayNode=フィルター済価格中継ノード(コンマ区切り onionアドレス) filterWindow.btcNode=フィルター済ビットコインノード(コンマ区切り アドレス+ポート) filterWindow.preventPublicBtcNetwork=パブリックビットコインネットワークの使用を防止 filterWindow.disableDao=DAOを無効化 -filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.disableAutoConf=自動確認を無効にする +filterWindow.autoConfExplorers=フィルター済自動確認エクスプローラ(コンマ区切りアドレス) filterWindow.disableDaoBelowVersion=DAOに必要な最低バージョン filterWindow.disableTradeBelowVersion=トレードに必要な最低バージョン filterWindow.add=フィルターを追加 filterWindow.remove=フィルターを削除 -filterWindow.btcFeeReceiverAddresses=BTC fee receiver addresses +filterWindow.btcFeeReceiverAddresses=BTC手数料受信アドレス offerDetailsWindow.minBtcAmount=最小のBTC金額 offerDetailsWindow.min=(最小 {0}) @@ -2123,18 +2110,14 @@ offerDetailsWindow.confirm.taker=承認: ビットコインを{0}オファーを offerDetailsWindow.creationDate=作成日 offerDetailsWindow.makersOnion=メイカーのonionアドレス -qRCodeWindow.headline=QR Code -qRCodeWindow.msg=Please use this QR code for funding your Bisq wallet from your external wallet. +qRCodeWindow.headline=QRコード +qRCodeWindow.msg=外部ウォレットからBisqウォレットへ送金するのに、このQRコードを利用して下さい。 qRCodeWindow.request=支払いリクエスト:\n{0} selectDepositTxWindow.headline=係争の為のデポジットトランザクションを選択 selectDepositTxWindow.msg=このデポジットトランザクションはトレードに保存されませんでした。\n失敗したトレードで使用されたデポジットトランザクションであった、既存のマルチシグトランザクションのいずれかをウォレットから選択してください。\n\n正しいトランザクションを見つけるためには、トレード詳細ウィンドウを開き(リストのトレードIDをクリック)、マルチシグデポジットトランザクション(アドレスは3で始まります)が表示されている次のトランザクションへの、トレード手数料の支払いトランザクションアウトプットをたどってください。そのトランザクションIDは、ここに表示されているリストに見つかるはずです。正しいトランザクションが見つかったら、ここでそのトランザクションを選択して続行します。\n\nご不便をおかけして申し訳ありませんが、そのエラーのケースはごくまれにしか発生しません。今後、より良い解決方法を探します。 selectDepositTxWindow.select=デポジットトランザクションを選択 -selectBaseCurrencyWindow.headline=マーケット選択 -selectBaseCurrencyWindow.msg=選択されたデフォルト市場は{0}です。\n\n別の基本通貨に変更する場合は、ドロップダウンボックスから選択してください。\n「設定/ネットワーク」画面で基本通貨を後から変更することもできます。 -selectBaseCurrencyWindow.select=基準通貨を選択 - sendAlertMessageWindow.headline=グローバル通知を送信 sendAlertMessageWindow.alertMsg=警告メッセージ sendAlertMessageWindow.enterMsg=メッセージを入力 @@ -2152,7 +2135,7 @@ showWalletDataWindow.walletData=ウォレットデータ showWalletDataWindow.includePrivKeys=プライベートキーを含む setXMRTxKeyWindow.headline=XMR送金を証明 -setXMRTxKeyWindow.note=Adding tx info below enables auto-confirm for quicker trades. See more: https://bisq.wiki/Trading_Monero +setXMRTxKeyWindow.note=以下にtx情報を追加すると、より早いトレードのため自動確認を有効にします。詳しくは:https://bisq.wiki/Trading_Monero setXMRTxKeyWindow.txHash=トランザクションID(任意) setXMRTxKeyWindow.txKey=トランザクション・キー(任意) @@ -2168,9 +2151,9 @@ tradeDetailsWindow.disputedPayoutTxId=係争中の支払い取引ID: tradeDetailsWindow.tradeDate=取引日 tradeDetailsWindow.txFee=マイニング手数料 tradeDetailsWindow.tradingPeersOnion=トレード相手のonionアドレス -tradeDetailsWindow.tradingPeersPubKeyHash=Trading peers pubkey hash +tradeDetailsWindow.tradingPeersPubKeyHash=トレードピアのパブリックキーハッシュ tradeDetailsWindow.tradeState=トレード状態 -tradeDetailsWindow.agentAddresses=調停人 +tradeDetailsWindow.agentAddresses=仲裁者 / 調停人 walletPasswordWindow.headline=アンロックするためにパスワードを入力してください @@ -2226,21 +2209,20 @@ popup.error.takeOfferRequestFailed=誰かがあなたのいずれかのオファ error.spvFileCorrupted=SPVチェーンファイルの読み込み中にエラーが発生しました。\nSPVチェーンファイルが破損している可能性があります。\n\nエラーメッセージ: {0} \n\n削除して再同期を開始しますか? error.deleteAddressEntryListFailed=AddressEntryListファイルを削除できませんでした。\nエラー: {0} -error.closedTradeWithUnconfirmedDepositTx=The deposit transaction of the closed trade with the trade ID {0} is still unconfirmed.\n\nPlease do a SPV resync at \"Setting/Network info\" to see if the transaction is valid. -error.closedTradeWithNoDepositTx=The deposit transaction of the closed trade with the trade ID {0} is null.\n\nPlease restart the application to clean up the closed trades list. +error.closedTradeWithUnconfirmedDepositTx=トレードID{0}で識別されるトレードのデポジットトランザクションはまだ承認されていません。\n\nトランザクションは有効かどうかを確認するため、\"設定/ネットワーク情報\"を開いてSPV再同期を行って下さい。 +error.closedTradeWithNoDepositTx=トレードID{0}で識別されるトレードのデポジットトランザクションは無効とされました。\n\n閉じられたトレードリストを更新するため、アプリケーションを再起動して下さい。 popup.warning.walletNotInitialized=ウォレットはまだ初期化されていません -popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. +popup.warning.osxKeyLoggerWarning=macOS 10.14以上の厳しいセキュリティー対策のため、Javaアプリケーション(BisqはJavaを利用します)はmacOSで警告用のポップアップ・ウィンドウを生じます(「Bisqは他のアプリからキー操作をアクセスしたい」)。\n\nこの問題を解決するのに、macOS設定を開いて、「セキュリティとプライバシー -> プライバシー -> 入力監視」において右側のリストからBisqを外して下さい。\n\n技術的な限界は克服されたら(必要のJavaバージョンパッケージャーがまだリリースされていません)、問題を避けるためにBisqは新しいJavaバージョンにアップグレードします。 popup.warning.wrongVersion=このコンピューターのBisqバージョンが間違っている可能性があります。\nコンピューターのアーキテクチャ: {0}\nインストールしたBisqバイナリ: {1}\nシャットダウンして、次の正しいバージョンを再インストールしてください({2})。 -popup.warning.incompatibleDB=互換性のないデータベースファイルが検出されました!\n\nこれらのデータベースファイルは、現在のコードベースと互換性がありません:\n{0}\n\n破損したファイルのバックアップを作成し、デフォルト値を新しいデータベースバージョンに適用しました。\n\nバックアップは次の場所にあります。\n{1}/db/backup_of_corrupted_data.\n\nBisqの最新バージョンがインストールされているかどうかを確認してください。\n以下からダウンロードできます。\nhttps://bisq.network/downloads\n\nアプリケーションを再起動してください。 +popup.warning.incompatibleDB=互換性のないデータベースファイルが検出されました!\n\nこういうデータベースファイルは、現在のコードベースと互換性がありません:\n{0}\n\n破損したファイルのバックアップを作成し、デフォルト値を新しいデータベースバージョンに適用しました。\n\nバックアップは次の場所にあります。\n{1}/db/backup_of_corrupted_data.\n\nBisqの最新バージョンがインストールされているかどうかを確認してください。\n以下からダウンロードできます。\n[HYPERLINK:https://bisq.network/downloads]\n\nアプリケーションを再起動してください。 popup.warning.startupFailed.twoInstances=Bisqは既に起動中です。Bisqを2つ起動することはできません。 -popup.warning.cryptoTestFailed=自己コンパイルされたバイナリを使用しており、以下のビルド手順に従っていないようです https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys。\n\nそうではなく、公式のBisqバイナリを使用している場合は、GitHubページにバグレポートを提出してください。\nエラー={0} popup.warning.tradePeriod.halfReached=ID {0}とのトレードは許可された最大トレード期間の半分に達しましたが、まだ完了していません\n\n取引期間は{1}で終了します\n\n詳細については、「ポートフォリオ/オープントレード」でトレード状態を確認してください。 -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 mediator. +popup.warning.tradePeriod.ended=ID {0}とのトレードは許可された最大トレード期間に達しましたが、まだ完了していません。\n\nトレード期間は{1}で終了しました\n\n調停者に連絡するには、「ポートフォリオ/オープントレード」であなたのトレードを確認してください。 popup.warning.noTradingAccountSetup.headline=トレードアカウントが設定されていません popup.warning.noTradingAccountSetup.msg=オファーを作成する前に、国内通貨またはアルトコインのアカウントを設定する必要があります。\nアカウントを設定しますか? popup.warning.noArbitratorsAvailable=利用可能な調停人がいません。 -popup.warning.noMediatorsAvailable=There are no mediators available. +popup.warning.noMediatorsAvailable=利用可能な調停人がいません。 popup.warning.notFullyConnected=ネットワークへ完全に接続するまで待つ必要があります。\n起動までに約2分かかります。 popup.warning.notSufficientConnectionsToBtcNetwork=少なくとも{0}のビットコインネットワークへの接続が確立されるまでお待ちください。 popup.warning.downloadNotComplete=欠落しているビットコインブロックのダウンロードが完了するまで待つ必要があります。 @@ -2250,15 +2232,17 @@ popup.warning.examplePercentageValue=パーセントの数字を入力してく popup.warning.noPriceFeedAvailable=その通貨で利用できる価格フィードはありません。パーセントベースの価格は使用できません。 固定価格を選択してください。 popup.warning.sendMsgFailed=トレード相手へのメッセージの送信に失敗しました。\nもう一度試してください。失敗し続ける場合はバグを報告してください。 popup.warning.insufficientBtcFundsForBsqTx=あなたはそのトランザクションのマイニング手数料を支払うのに十分なBTC残高を持っていません。 BTCウォレットに資金を入金してください。 \n不足残高: {0} -popup.warning.bsqChangeBelowDustException=This transaction creates a BSQ change output which is below dust limit (5.46 BSQ) and would be rejected by the Bitcoin network.\n\nYou need to either send a higher amount to avoid the change output (e.g. by adding the dust amount to your sending amount) or add more BSQ funds to your wallet so you avoid to generate a dust output.\n\nThe dust output is {0}. -popup.warning.btcChangeBelowDustException=This transaction creates a change output which is below dust limit (546 Satoshi) and would be rejected by the Bitcoin network.\n\nYou need to add the dust amount to your sending amount to avoid to generate a dust output.\n\nThe dust output is {0}. +popup.warning.bsqChangeBelowDustException=このトランザクションは、ダスト制限(5.46 BSQ)を下回るBSQおつりアウトプットを作成し、ビットコインネットワークによって拒否されます。\n\nおつりアウトプットを回避するために、より高い金額を送信する必要があります(たとえば、送金額にダスト額を追加することによって)、またはダストアウトプットを生成しないようにウォレットにBSQ残高を追加する必要があります。\n\nダストアウトプットは{0}。 +popup.warning.btcChangeBelowDustException=このトランザクションは、ダスト制限(546 Satoshi)を下回るBSQおつりアウトプットを作成し、ビットコインネットワークによって拒否されます。\n\nダストアウトプットを生成しないように、あなたの送金額にダスト額を追加する必要があります。\n\nダストアウトプットは{0}。 -popup.warning.insufficientBsqFundsForBtcFeePayment=You''ll need more BSQ to do this transaction—the last 5.46 BSQ in your wallet cannot be used to pay trade fees because of dust limits in the Bitcoin protocol.\n\nYou can either buy more BSQ or pay trade fees with BTC.\n\nMissing funds: {0} -popup.warning.noBsqFundsForBtcFeePayment=BSQウォレットにBSQのトレード手数料を支払うのに十分な残高がありません。 +popup.warning.insufficientBsqFundsForBtcFeePayment=このトランザクションにはBSQが足りません。ビットコインプロトコルのダスト制限によると、ウォレットから最後の5.46BSQはトレード手数料に使われることができません。\n\nもっとBSQを買うか、BTCでトレード手数料を支払うことができます。\n\n不足している資金: {0} +popup.warning.noBsqFundsForBtcFeePayment=BSQウォレットにBSQのトレード手数料を支払うのに十分な残高がありません。 popup.warning.messageTooLong=メッセージが許容サイズ上限を超えています。いくつかに分けて送信するか、 https://pastebin.com のようなサービスにアップロードしてください。 -popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"." +popup.warning.lockedUpFunds=失敗したトレードから残高をロックしました。\nロックされた残高: {0} \nデポジットtxアドレス: {1} \nトレードID: {2}。\n\nオープントレード画面でこのトレードを選択し、「alt + o」または「option + o」を押してサポートチケットを開いてください。 -popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" +popup.warning.nodeBanned={0}ノードの1つが禁止されました。 +# suppress inspection "UnusedProperty" popup.warning.priceRelay=価格中継 popup.warning.seed=シード popup.warning.mandatoryUpdate.trading=最新のBisqバージョンに更新してください。古いバージョンのトレードを無効にする必須の更新プログラムがリリースされました。詳細については、Bisqフォーラムをご覧ください。 @@ -2266,25 +2250,20 @@ popup.warning.mandatoryUpdate.dao=最新のBisqバージョンに更新してく popup.warning.disable.dao=Bisq DAOとBSQは一時的に無効になっています。詳細については、Bisqフォーラムをご覧ください。 popup.warning.burnBTC={0}のマイニング手数料が{1}の送金額を超えるため、このトランザクションは利用不可です。マイニング手数料が再び低くなるか、送金するBTCがさらに蓄積されるまでお待ちください。 -popup.warning.openOffer.makerFeeTxRejected=The maker fee transaction for offer with ID {0} was rejected by the Bitcoin network.\nTransaction ID={1}.\nThe offer has been removed to avoid further problems.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Bisq support channel at the Bisq Keybase team. +popup.warning.openOffer.makerFeeTxRejected=ID{0}で識別されるオファーのためのメイカー手数料トランザクションがビットコインネットワークに拒否されました。\nトランザクションID= {1} 。\n更なる問題を避けるため、そのオファーは削除されました。\n\"設定/ネットワーク情報\"を開いてSPV再同期を行って下さい。\nさらにサポートを受けるため、Bisq Keybaseチームのサポートチャンネルに連絡して下さい。 -popup.warning.trade.txRejected.tradeFee=trade fee -popup.warning.trade.txRejected.deposit=deposit -popup.warning.trade.txRejected=The {0} transaction for trade with ID {1} was rejected by the Bitcoin network.\nTransaction ID={2}}\nThe trade has been moved to failed trades.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Bisq support channel at the Bisq Keybase team. +popup.warning.trade.txRejected.tradeFee=トレード手数料 +popup.warning.trade.txRejected.deposit=デポジット +popup.warning.trade.txRejected=ID{1}で識別されるトレードのための{0}トランザクションがビットコインネットワークに拒否されました。\nトランザクションID= {2}} 。\nトレードは「失敗トレード」へ送られました。\n\"設定/ネットワーク情報\"を開いてSPV再同期を行って下さい。\nさらにサポートを受けるため、Bisq Keybaseチームのサポートチャンネルに連絡して下さい。 -popup.warning.openOfferWithInvalidMakerFeeTx=The maker fee transaction for offer with ID {0} is invalid.\nTransaction ID={1}.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Bisq support channel at the Bisq Keybase team. - -popup.warning.trade.depositTxNull=The trade with ID ''{0}'' has no deposit transaction set.\n\nPlease restart the application to see if the problem still exists.\n\nIf it does, please open the trade details popup by clicking on the trade ID. Then click on the transaction IDs for the maker fee transaction and the taker fee transaction to view them on a block explorer. A transaction that cannot be found in a block explorer is probably an invalid transaction.\n\nIf this happens, please report it in the #support channel on the Bisq Keybase (https://keybase.io/team/bisq). If your trade fee transaction is invalid, no funds have left your wallet, you can move the trade to failed trades,and do an SPV resync for your funds to reappear (see how below).\n\nIf your trade fee transaction is valid, the fee amount is lost, and you can make a request for reimbursement on the support repository on GitHub (https://github.com/bisq-network/support/issues).\n\nIn both cases, please do an SPV resync from the ''Settings/Network'' screen to clean your wallet of any lingering issues! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Move to failed trades -popup.warning.trade.depositTxNull.shutDown=Shut down Bisq +popup.warning.openOfferWithInvalidMakerFeeTx=ID{0}で識別されるオファーのためのメイカー手数料トランザクションが無効とされました。\nトランザクションID= {1} 。\n更なる問題を避けるため、そのオファーは削除されました。\n\"設定/ネットワーク情報\"を開いてSPV再同期を行って下さい。\nさらにサポートを受けるため、Bisq Keybaseチームのサポートチャンネルに連絡して下さい。 popup.info.securityDepositInfo=両方の取引者がトレードプロトコルに従うことを保証するために、両方のトレーダーはセキュリティデポジットを支払う必要があります。\n\nこのデポジットはあなたのトレードがうまく完了するまであなたのトレードウォレットに保管され、それからあなたに返金されます。\n\n注意してください:あなたが新しいオファーを作成しているなら、他の取引者がそれを受けるためにBisqを実行しておく必要があります。オファーをオンラインにしておくには、Bisqを実行したままにして、このコンピュータもオンラインにしたままにします(つまり、スタンバイモードに切り替わらないようにします…モニターのスタンバイは大丈夫です)。 popup.info.cashDepositInfo=あなたの地域の銀行支店が現金デポジットが作成できることを確認してください。\n売り手の銀行ID(BIC / SWIFT)は{0}です。 popup.info.cashDepositInfo.confirm=デポジットを作成できるか確認します popup.info.shutDownWithOpenOffers=Bisqはシャットダウン中ですが、オファーはあります。\n\nこれらのオファーは、Bisqがシャットダウンされている間はP2Pネットワークでは利用できませんが、次回Bisqを起動したときにP2Pネットワークに再公開されます。\n\nオファーをオンラインに保つには、Bisqを実行したままにして、このコンピュータもオンラインにしたままにします(つまり、スタンバイモードにならないようにしてください。モニタースタンバイは問題ありません)。 -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=Qubes OS内でBisqを実行しているようです。\n\nBisqのqubeはセットアップガイドに従って設定されていることを確かめて下さい: [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes] popup.privateNotification.headline=重要なプライベート通知! @@ -2292,7 +2271,7 @@ popup.securityRecommendation.headline=重要なセキュリティ勧告 popup.securityRecommendation.msg=ウォレットのパスワード保護をまだ有効にしてない場合は、使用することを検討してください。\n\nウォレットシードワードを書き留めることも強くお勧めします。 これらのシードワードは、あなたのビットコインウォレットを復元するためのマスターパスワードのようなものです。\n「ウォレットシード」セクションにてより詳細な情報を確認できます。\n\nまた、「バックアップ」セクションのアプリケーションデータフォルダ全体をバックアップするべきでしょう。 popup.bitcoinLocalhostNode.msg=Bisqはローカルで動作するBitcoin Coreノード(ローカルホスト)を検出しました。Bisqを起動する前にこのノードが完全に同期されていることと、プルーニングモードで実行されていないことを確認してください。 -popup.bitcoinLocalhostNode.additionalRequirements=\n\nFor a well configured node, the requirements are for the node to have pruning disabled and bloom filters enabled. +popup.bitcoinLocalhostNode.additionalRequirements=\n\n適切に設定されるノードの条件は、剪定が無効とされることそしてブルームフィルターが有効とされることです。 popup.shutDownInProgress.headline=シャットダウン中 popup.shutDownInProgress.msg=アプリケーションのシャットダウンには数秒かかることがあります。\nこのプロセスを中断しないでください。 @@ -2302,16 +2281,10 @@ popup.attention.forTradeWithId=ID {0}とのトレードには注意が必要で popup.info.multiplePaymentAccounts.headline=複数の支払いアカウントが使用可能です popup.info.multiplePaymentAccounts.msg=このオファーに使用できる支払いアカウントが複数あります。あなたが正しいものを選んだことを確認してください。 -popup.news.launch.headline=Two Major Updates -popup.news.launch.accountSigning.headline=ACCOUNT SIGNING -popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer. -popup.news.launch.ntp.headline=NEW TRADE PROTOCOL -popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant. - popup.accountSigning.selectAccounts.headline=支払いアカウントを選択 -popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign. -popup.accountSigning.selectAccounts.signAll=Sign all payment methods -popup.accountSigning.selectAccounts.datePicker=Select point of time until which accounts will be signed +popup.accountSigning.selectAccounts.description=支払い方法そして時点に基づいて、買い手への支払いが起こった係争と繋がっている全てのアカウントは署名されるように選択されます。 +popup.accountSigning.selectAccounts.signAll=全ての支払い方法を署名 +popup.accountSigning.selectAccounts.datePicker=アカウント署名のは終了する時点を選択して下さい。 popup.accountSigning.confirmSelectedAccounts.headline=選択された支払いアカウントを確認 popup.accountSigning.confirmSelectedAccounts.description=入力に基づいて、{0}口の支払いアカウントは選択されます @@ -2319,32 +2292,31 @@ popup.accountSigning.confirmSelectedAccounts.button=支払いアカウントを popup.accountSigning.signAccounts.headline=支払いアカウントの署名を確認 popup.accountSigning.signAccounts.description=選択に基づいて、{0}口の支払いアカウントは署名されます popup.accountSigning.signAccounts.button=支払いアカウントに署名 -popup.accountSigning.signAccounts.ECKey=Enter private arbitrator key -popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey +popup.accountSigning.signAccounts.ECKey=プライベート調停人キーを入力 +popup.accountSigning.signAccounts.ECKey.error=不良の調停人ECKey popup.accountSigning.success.headline=おめでとう popup.accountSigning.success.description=全{0}口の支払いアカウントは成功裏に署名されました! -popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing. -popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0} -popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1} -popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0} -popup.accountSigning.peerSigner=One of your accounts is mature enough to sign other payment accounts and the initial limit for one of your accounts has been lifted.\n\n{0} +popup.accountSigning.generalInformation=全てのアカウントの署名状態はアカウント画面に表示されます。\n\n詳しくは: [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing] +popup.accountSigning.signedByArbitrator=支払いアカウントの1つは調停人に検証、署名されました。このアカウントからトレードを行ったら、トレードピアと成功にトレードする後に相手のアカウントを自動的に署名します。\n\n{0} +popup.accountSigning.signedByPeer=支払いアカウントの1つはトレードピアに検証、署名されました。{0} 日後に、初期のトレード制限は解除され、他の支払いアカウントを署名できるようになります。\n\n{1} +popup.accountSigning.peerLimitLifted=支払いアカウントの1つにおいて初期の制限は解除されました。\n\n{0} +popup.accountSigning.peerSigner=支払いアカウントの1つは十分に熟成されて、初期の制限は解除されました。\n\n{0} -popup.accountSigning.singleAccountSelect.headline=Select account age witness -popup.accountSigning.singleAccountSelect.description=Search for account age witness. -popup.accountSigning.singleAccountSelect.datePicker=Select point of time for signing -popup.accountSigning.confirmSingleAccount.headline=Confirm selected account age witness -popup.accountSigning.confirmSingleAccount.selectedHash=Selected witness hash -popup.accountSigning.confirmSingleAccount.button=Sign account age witness -popup.accountSigning.successSingleAccount.description=Witness {0} was signed +popup.accountSigning.singleAccountSelect.headline=アカウント年齢witnessを選択 +popup.accountSigning.singleAccountSelect.description=アカウント年齢witnessを検索 +popup.accountSigning.singleAccountSelect.datePicker=署名の時点を選択 +popup.accountSigning.confirmSingleAccount.headline=選択されたアカウント年齢witnessを確認 +popup.accountSigning.confirmSingleAccount.selectedHash=選択されたwitnessのハッシュ +popup.accountSigning.confirmSingleAccount.button=アカウント年齢witnessを署名 +popup.accountSigning.successSingleAccount.description=Witness {0} は署名された popup.accountSigning.successSingleAccount.success.headline=成功 -popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} +popup.accountSigning.successSingleAccount.signError=Witnessの署名が失敗しました, {0} -popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys -popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys -popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=署名が完了しました -popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys +popup.accountSigning.unsignedPubKeys.headline=無署名のパブリックキー +popup.accountSigning.unsignedPubKeys.sign=パブリックキーを署名 +popup.accountSigning.unsignedPubKeys.signed=パブリックキーは署名されました +popup.accountSigning.unsignedPubKeys.result.signed=署名されたパブリックキー popup.accountSigning.unsignedPubKeys.result.failed=署名が失敗しました #################################################################### @@ -2375,14 +2347,14 @@ systemTray.show=アプリケーションウィンドウを表示 systemTray.hide=アプリケーションウィンドウを隠す systemTray.info=Bisqについての情報 systemTray.exit=終了 -systemTray.tooltip=Bisq: A decentralized bitcoin exchange network +systemTray.tooltip=Bisq: 分散的ビットコイン取引ネットワーク #################################################################### # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=外部ウォレットで使用されるマイニング手数料が少なくとも{0} satoshis/vbyte あることを確認してください。 そうでなければ、このトレードトランザクションは承認されない可能性、トレードは係争に終わる可能性があります。 guiUtil.accountExport.savedToPath=取引アカウントを下記パスに保存しました:\n{0} guiUtil.accountExport.noAccountSetup=取引アカウントのエクスポート設定がされていません @@ -2399,7 +2371,7 @@ guiUtil.openWebBrowser.warning=あなたのシステムウェブブラウザでW guiUtil.openWebBrowser.doOpen=Webページを開き、次回から確認しない guiUtil.openWebBrowser.copyUrl=URLをコピーしてキャンセル guiUtil.ofTradeAmount=取引額に対して -guiUtil.requiredMinimum=(required minimum) +guiUtil.requiredMinimum=(必要な最低限) #################################################################### # Component specific @@ -2411,7 +2383,7 @@ list.currency.editList=通貨リストを編集する table.placeholder.noItems=現在利用可能な{0}がありません table.placeholder.noData=現在利用可能なデータがありません -table.placeholder.processingData=Processing data... +table.placeholder.processingData=データ処理中... peerInfoIcon.tooltip.tradePeer=トレード相手 @@ -2422,7 +2394,7 @@ peerInfoIcon.tooltip.age=支払いアカウントが{0}前に作成されまし peerInfoIcon.tooltip.unknownAge=支払いアカウントの年齢は不明です。 tooltip.openPopupForDetails=詳細についてのポップアップを開く -tooltip.invalidTradeState.warning=This trade is in an invalid state. Open the details window for more information +tooltip.invalidTradeState.warning=このトレードは無効な状態とされました。詳しくは詳細ウィンドウを開く tooltip.openBlockchainForAddress=外部ブロックチェーンエクスプローラーで次のアドレスを開く: {0} tooltip.openBlockchainForTx=外部ブロックチェーンエクスプローラーで次のトランザクションを開く: {0} @@ -2447,8 +2419,8 @@ addressTextField.openWallet.failed=既定のビットコインウォレットが peerInfoIcon.tooltip={0}\nタグ: {1} txIdTextField.copyIcon.tooltip=トランザクションIDをクリップボードにコピー -txIdTextField.blockExplorerIcon.tooltip=Open a blockchain explorer with this transaction ID -txIdTextField.missingTx.warning.tooltip=Missing required transaction +txIdTextField.blockExplorerIcon.tooltip=このトランザクションIDをブロックチェーンエクスプローラで開く +txIdTextField.missingTx.warning.tooltip=必要なトランザクションは欠測 #################################################################### @@ -2457,12 +2429,13 @@ txIdTextField.missingTx.warning.tooltip=Missing required transaction navigation.account=「アカウント」 navigation.account.walletSeed=「アカウント/ウォレットシード」 -navigation.funds.availableForWithdrawal=\"Funds/Send funds\" +navigation.funds.availableForWithdrawal=\"資金/送金する\" navigation.portfolio.myOpenOffers=「ポートフォリオ/私の公開オファー navigation.portfolio.pending=「ポートフォリオ/オープントレード」 navigation.portfolio.closedTrades=「ポートフォリオ/履歴」 navigation.funds.depositFunds=「資金/資金の受取」 navigation.settings.preferences=「設定/設定」 +# suppress inspection "UnusedProperty" navigation.funds.transactions=「資金/トランザクション」 navigation.support=「サポート」 navigation.dao.wallet.receive=「DAO/BSQウォレット/受取」 @@ -2498,7 +2471,7 @@ BTC_REGTEST=ビットコイン(Regtest) # suppress inspection "UnusedProperty" BTC_DAO_TESTNET=ビットコインDAOテストネット(非推奨) # suppress inspection "UnusedProperty" -BTC_DAO_BETANET=Bisq DAO Betanet (Bitcoin Mainnet) +BTC_DAO_BETANET=BisqDAOベータネット(ビットコイン メインネット) # suppress inspection "UnusedProperty" BTC_DAO_REGTEST=ビットコインDAO Regtest @@ -2525,7 +2498,7 @@ password.deriveKey=パスワードから鍵を引き出す password.walletDecrypted=ウォレットは正常に復号化され、パスワード保護が解除されました。 password.wrongPw=間違ったパスワードを入力しています。\n\nパスワードをもう一度入力してみてください。入力ミスやスペルミスがないか慎重に確認してください。 password.walletEncrypted=ウォレットは正常に暗号化され、パスワード保護が有効になりました。 -password.walletEncryptionFailed=ウォレットのパスワードを設定できませんでした。ウォレットデータベースと一致しないシードワードをインポートした可能性があります。Bisqフォーラムの開発者に連絡してください。 +password.walletEncryptionFailed=ウォレットのパスワードを設定できませんでした。ウォレットデータベースと一致しないシードワードをインポートした可能性があります。Keybase ([HYPERLINK:https://keybase.io/team/bisq]) で開発者と連絡して下さい。 password.passwordsDoNotMatch=入力した2つのパスワードが一致しません。 password.forgotPassword=パスワードを忘れましたか? password.backupReminder=ウォレットパスワードを設定すると、暗号化されていないウォレットから自動的に作成されたすべてのバックアップが削除されます。\n\nパスワードを設定する前に、アプリケーションディレクトリのバックアップを作成してシードワードを書き留めておくことを強く推奨します。 @@ -2537,14 +2510,14 @@ seed.date=ウォレットの日付 seed.restore.title=シードワードからウォレットを復元する seed.restore=ウォレットを復元する seed.creationDate=作成日 -seed.warn.walletNotEmpty.msg=あなたのビットコインウォレットは空ではありません。\n\nウォレットを混在させると無効なバックアップになる可能性があるため、古いウォレットを復元する前に、このウォレットを空にする必要があります。\n\nあなたの取引を終了し、あなたの全てのオープンオファーを閉じて、あなたのビットコインを出金するために資金セクションに行ってください。\nあなたが自身のビットコインにアクセスできない場合、ウォレットを空にするために緊急ツールを使うことができます。\n緊急ツールを開くには「alt + e」か「option + e」を押してください。 +seed.warn.walletNotEmpty.msg=あなたのビットコインウォレットは空ではありません。\n\nウォレットを混在させると無効なバックアップになる可能性があるため、古いウォレットを復元する前に、このウォレットを空にする必要があります。\n\nあなたの取引を終了し、あなたの全てのオープンオファーを閉じて、あなたのビットコインを出金するために資金セクションに行ってください。\nあなたが自身のビットコインにアクセスできない場合、ウォレットを空にするために緊急ツールを使うことができます。\n緊急ツールを開くには \"Alt+e\" か \"Cmd/Ctrl+e\" を押してください。 seed.warn.walletNotEmpty.restore=とにかく復元したい seed.warn.walletNotEmpty.emptyWallet=最初にウォレットを空にしたい seed.warn.notEncryptedAnymore=あなたの財布は暗号化されています。\n\n復元後、ウォレットは暗号化されなくなり、新しいパスワードを設定する必要があります。\n\n続行しますか? -seed.warn.walletDateEmpty=As you have not specified a wallet date, bisq will have to scan the blockchain from 2013.10.09 (the BIP39 epoch date).\n\nBIP39 wallets were first introduced in bisq on 2017.06.28 (release v0.5). So you could save time by using that date.\n\nIdeally you should specify the date your wallet seed was created.\n\n\nAre you sure you want to go ahead without specifying a wallet date? +seed.warn.walletDateEmpty=ウォレット日を特定しなかったため、Bisqは2013.10.09(BIP39エポック日)からブロックチェーンをスキャンしなければなりません。\n\nBIP39のウォレットは2017.06.28(リリースv0.5)にBisqに使われ始めたので、その日を利用して時間を節約できます。\n\n理想的に、ウォレット・シードが作成された日を特定すべきです。\n\n\nウォレット日を特定せずに続いても本当によろしいですか? seed.restore.success=ウォレットは、新しいシードワードで正常に復元されました。\n\nアプリケーションをシャットダウンして再起動する必要があります。 seed.restore.error=シードワードを使用したウォレットの復元中にエラーが発生しました。{0} -seed.restore.openOffers.warn=You have open offers which will be removed if you restore from seed words.\nAre you sure that you want to continue? +seed.restore.openOffers.warn=シードワードから復元すると削除されるオープンオファーがあります。 \n本当に続いてもよろしいですか? #################################################################### @@ -2583,7 +2556,6 @@ payment.secret=秘密の質問 payment.answer=答え payment.wallet=ウォレットID payment.uphold.accountId=ユーザーネームかメールか電話番号 -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=メールか電話番号 payment.venmo.venmoUserName=Venmo ユーザー名 payment.popmoney.accountId=メールか電話番号 @@ -2599,7 +2571,7 @@ payment.accepted.banks=利用可能な銀行 (ID) payment.mobile=携帯電話番号 payment.postal.address=郵便住所 payment.national.account.id.AR=CBU番号 -shared.accountSigningState=Account signing status +shared.accountSigningState=アカウント署名状況 #new payment.altcoin.address.dyn={0}アドレス @@ -2608,7 +2580,7 @@ payment.accountNr=アカウント番号 payment.emailOrMobile=メールまたは携帯電話番号 payment.useCustomAccountName=任意のアカウント名を使う payment.maxPeriod=許可された最大トレード期間 -payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3} +payment.maxPeriodAndLimit=最大トレード期間: {0} / 最大買い: {1} / 最大売り: {2}/アカウントの年齢: {3} payment.maxPeriodAndLimitCrypto=最大トレード期間: {0} / 最大トレード制限: {1} payment.currencyWithSymbol=通貨: {0} payment.nameOfAcceptedBank=利用可能な銀行の名前 @@ -2625,39 +2597,45 @@ payment.accountType=口座種別 payment.checking=当座口座 payment.savings=普通口座 payment.personalId=個人ID -payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle:\nhttps://www.zellepay.com/get-started\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. -payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Bisq to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved. -payment.moneyGram.info=MoneyGramを使用する場合、BTCの買い手は認証番号と領収書の写真をEメールでBTCの売り手に送信する必要があります。領収書には、売り手の氏名、市区町村、国、金額を明確に記載する必要があります。買い手には、取引プロセスにて売り手のEメールが表示されます。 -payment.westernUnion.info=Western Unionを使用する場合、BTCの買い手はMTCN(追跡番号)と領収書の写真をEメールでBTCの売り手に送信する必要があります。領収書には、売り手の氏名、市区町村、国、金額を明確に記載する必要があります。買い手には、取引プロセスにて売り手のEメールが表示されます。 +payment.clearXchange.info=Zelleは他の銀行を介して利用するとよりうまくいく送金サービスです。\n\n1. あなたの銀行がZelleと協力するか(そして利用の方法)をここから確認して下さい: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. 送金制限に注意して下さい。制限は銀行によって異なり、1日、1週、1月当たりの制限に分けられていることが多い。\n\n3. 銀行がZelleと協力しない場合でも、Zelleのモバイルアプリ版を使えますが、送金制限ははるかに低くなります。\n\n4. Bisqアカウントで特定される名前は必ずZelleアカウントと銀行口座に特定される名前と合う必要があります。\n\nトレード契約書とおりにZelleトランザクションを完了できなければ、一部(あるいは全て)のセキュリティデポジットを失う可能性はあります。\n\nZelleにおいてやや高い支払取り消しリスクがあるので、売り手はメールやSMSで無署名買い手に連絡して、Bisqに特定されるZelleアカウントの所有者かどうかを確かめるようにおすすめします。 +payment.fasterPayments.newRequirements.info=「Faster Payments」で送金する場合、銀行が受信者の姓名を確認するケースが最近多くなりました。現在の「Faster Payments」アカウントは姓名を特定しません。\n\nこれからの{0}買い手に姓名を提供するため、Bisq内に新しい「Faster Payments」アカウントを作成するのを検討して下さい。\n\n新しいアカウントを作成すると、完全に同じ分類コード、アカウントの口座番号、そしてアカウント年齢検証ソルト値を古いアカウントから新しいアカウントにコピーして下さい。こうやって現在のアカウントの年齢そして署名状況は維持されます。 +payment.moneyGram.info=MoneyGramを使用する場合、BTCの買い手は認証番号と領収書の写真をEメールでBTCの売り手に送信する必要があります。領収書には、売り手の氏名、市区町村、国、金額を明確に記載する必要があります。トレードプロセスにて、売り手のEメールは買い手に表示されます。 +payment.westernUnion.info=Western Unionを使用する場合、BTCの買い手はMTCN(追跡番号)と領収書の写真をEメールでBTCの売り手に送信する必要があります。領収書には、売り手の氏名、市区町村、国、金額を明確に記載する必要があります。トレードプロセスにて、売り手のEメールは買い手に表示されます。 payment.halCash.info=HalCashを使用する場合、BTCの買い手は携帯電話からのテキストメッセージを介してBTCの売り手にHalCashコードを送信する必要があります。\n\n銀行がHalCashで送金できる最大額を超えないようにしてください。 1回の出金あたりの最小金額は10EURで、最大金額は600EURです。繰り返し出金する場合は、1日に受取人1人あたり3000EUR、1ヶ月に受取人1人あたり6000EURです。あなたの銀行でも、ここに記載されているのと同じ制限を使用しているか、これらの制限を銀行と照合して確認してください。\n\n出金額は10の倍数EURでなければ、ATMから出金できません。 オファーの作成画面およびオファー受け入れ画面のUIは、EUR金額が正しくなるようにBTC金額を調整します。価格の変化とともにEURの金額は変化するため、市場ベースの価格を使用することはできません。\n\n係争が発生した場合、BTCの買い手はEURを送ったという証明を提出する必要があります。 -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\nTo mitigate this risk, Bisq sets per-trade limits based on two factors:\n\n1. The estimated level of chargeback risk for the payment method used\n2. The age of your account for that payment method\n\nThe account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\n● During the 1st month, your per-trade limit will be {0}\n● During the 2nd month, your per-trade limit will be {1}\n● After the 2nd month, your per-trade limit will be {2}\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. -payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase with account age.\n\nSee more:\nhttps://bisq.wiki/Account_limits\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=すべての銀行振込にはある程度の支払取り消しのリスクがあることに気を付けて下さい。\n\nこのリスクを軽減するために、Bisqは使用する支払い方法での支払取り消しリスクの推定レベルに基づいてトレードごとの制限を設定します。\n\n現在使用する支払い方法では、トレードごとの売買制限は{2}です。\n\n制限は各トレードの量のみに適用されることに注意して下さい。トレードできる合計回数には制限はありません。\n\n詳しくはWikiを調べて下さい [HYPERLINK:https://bisq.wiki/Account_limits] 。 +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=支払取り消しのリスクを軽減するために、Bisqはこの支払いアカウントに下記の2つの要因に基づいてトレードごとの制限を設定します。\n\n1.使用する支払い方法での支払取り消しリスクの推定レベル\n2.アカウントの署名状況\n\nこの支払いアカウントはまだ無署名ですので、トレードごとに{0}の買い制限があります。 アカウントが署名される後、トレードごとの制限は以下のように成長します:\n\n●署名の前、そして署名から30日間までに、1トレードあたりの買い制限は{0}になります\n●署名から30日間後に、1トレードあたりの買い制限は{1}になります\n●署名から60日間後に、1トレードあたりの買い制限は{2}になります\n\n売り制限は署名状況に関係がありません。現在のところ、1トレードあたりに{2}を売ることができます。\n\n制限は各トレードの量のみに適用されることに注意して下さい。取引できる合計回数には制限はありません。\n\n詳しくは: [HYPERLINK:https://bisq.wiki/Account_limits] payment.cashDeposit.info=あなたの銀行が他の人の口座に現金入金を送ることを許可していることを確認してください。たとえば、Bank of America と Wells Fargo では、こうした預金は許可されなくなりました。 -payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. -payment.revolut.addUserNameInfo.headLine=Update Revolut account +payment.revolut.info=以前の場合と違って、Revolutは電話番号やメールアドレスではなく「ユーザ名」をアカウントIDとして要求します。 +payment.account.revolut.addUserNameInfo={0}\n現在の「Revolut」アカウント({1})には「ユーザ名」がありません。 \nアカウントデータを更新するのにRevolutの「ユーザ名」を入力して下さい。\nアカウント年齢署名状況に影響を及ぼしません。 +payment.revolut.addUserNameInfo.headLine=Revolutアカウントをアップデートする -payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. +payment.usPostalMoneyOrder.info=Bisqでアメリカ合衆国郵便為替(USPMO)をトレードするには、以下を理解する必要があります:\n\n-送る前に、BTC買い手は必ずBTC売り手の名前を支払人そして支払先フィールド両方に書いて、追跡証明も含めるUSPMOそして封筒の高解像度写真を取る必要があります。\n-BTC買い手は必ず配達確認を利用してBTC売り手にUSPMOを送る必要があります。\n\n調停が必要になる場合、あるいはトレード係争が開始される場合、調停者や調停人がアメリカ合衆国郵便のサイトで詳細を確認できるように、取った写真、USPMOシリアル番号、郵便局番号、そしてドル金額を送る必要があります。\n\n調停者や調停人に必要な情報を提供しなければ、係争で不利な裁定を下されます。\n\n全ての係争には、調停者や調停人に証明を提供するのは100%USPMO送付者の責任です。\n\n以上の条件を理解しない場合、BisqでUSPMOのトレードをしないで下さい。 payment.f2f.contact=連絡情報 -payment.f2f.contact.prompt=取引相手からどのように連絡を受け取りたいですか?(メールアドレス、電話番号…) +payment.f2f.contact.prompt=トレードピアからどのように連絡を受け取りたいのでしょうか?(メールアドレス、電話番号…) payment.f2f.city=「対面」で会うための市区町村 payment.f2f.city.prompt=オファーとともに市区町村が表示されます payment.f2f.optionalExtra=オプションの追加情報 payment.f2f.extra=追加情報 payment.f2f.extra.prompt=メイカーは「取引条件」を定めたり、公開連絡先情報を追加したりできます。 これはオファーと一緒に表示されます。 -payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading' +payment.f2f.info=「対面」トレードには違うルールがあり、オンライントレードとは異なるリスクを伴います。\n\n主な違いは以下の通りです。\n●取引者は、提供される連絡先の詳細を使用して、出会う場所と時間に関する情報を交換する必要があります。\n●取引者は自分のノートパソコンを持ってきて、集合場所で「送金」と「入金」の確認をする必要があります。\n●メイカーに特別な「取引条件」がある場合は、アカウントの「追加情報」テキストフィールドにその旨を記載する必要があります。\n●オファーを受けると、テイカーはメイカーの「トレード条件」に同意したものとします。\n●係争が発生した場合、集合場所で何が起きたのかについての改ざん防止証明を入手することは通常困難であるため、調停者や調停人はあまりサポートをできません。このような場合、BTCの資金は無期限に、または取引者が合意に達するまでロックされる可能性があります。\n\n「対面」トレードでの違いを完全に理解しているか確認するためには、次のURLにある手順と推奨事項をお読みください:[HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=Webページを開く -payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1} +payment.f2f.offerbook.tooltip.countryAndCity=国と都市: {0} / {1} payment.f2f.offerbook.tooltip.extra=追加情報: {0} payment.japan.bank=銀行 payment.japan.branch=支店 payment.japan.account=口座 payment.japan.recipient=名義 +payment.australia.payid=PayID +payment.payid=金融機関と繋がっているPayID。例えばEメールアドレスそれとも携帯電話番号。 +payment.payid.info=銀行、信用金庫、あるいは住宅金融組合アカウントと安全に繋がれるPayIDとして使われる電話番号、Eメールアドレス、それともオーストラリア企業番号(ABN)。すでにオーストラリアの金融機関とPayIDを作った必要があります。送金と受取の金融機関は両方PayIDをサポートする必要があります。詳しくは以下を訪れて下さい [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=アマゾンeGiftカードで支払うには、アマゾンアカウントからeGiftカードを買って、BTC売り手のEメールアドレスあるいは携帯電話番号を受取人に設定します。アマゾンは受取人へメールあるいはSMSを送ります。メッセージ・フィールドにトレードIDを入力して下さい。\n\nアマゾンeGiftカードは同じ通貨を使うアマゾンアカウントのみに受け取られることができます。\n\n詳しくはアマゾンeGiftカードホームページを訪れて下さい。 [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=対面(直接) JAPAN_BANK=日本全銀振込 +AUSTRALIA_PAYID=オーストラリアのPayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=国立銀行 @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=対面 # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=日本全銀振込 +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2710,7 +2691,7 @@ WECHAT_PAY=WeChat Pay # suppress inspection "UnusedProperty" SEPA=SEPA # suppress inspection "UnusedProperty" -SEPA_INSTANT=SEPAインスタント支払い +SEPA_INSTANT=SEPAインスタント支払い # suppress inspection "UnusedProperty" FASTER_PAYMENTS=Faster Payments # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=アマゾンeGiftカード +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=アルトコイン インスタント # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=アマゾンeGiftカード +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=アルトコイン インスタント # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,10 +2789,9 @@ validation.zero=0の入力は許可されていません。 validation.negative=負の値は許可されていません。 validation.fiat.toSmall=可能な最小量より小さい入力は許可されていません。 validation.fiat.toLarge=可能な最大量より大きい入力は許可されていません。 -validation.btc.fraction=入力すると、最小単位の端数(satoshi)でのビットコイン値が生成されます。 +validation.btc.fraction=この入力では1サトシ以下のビットコイン値が生成されます。 validation.btc.toLarge={0}より大きい入力は許可されていません。 validation.btc.toSmall={0}より小さい入力は許可されていません。 -validation.securityDeposit.toSmall={0}より小さい入力は許可されていません。 validation.passwordTooShort=入力したパスワードが短すぎます。最低8文字が必要です。 validation.passwordTooLong=入力したパスワードが長すぎます。 50文字を超えることはできません。 validation.sortCodeNumber={0}は{1}個の数字で構成されている必要があります。 @@ -2822,18 +2810,23 @@ validation.nationalAccountId={0}は{1}個の数字で構成されている必要 #new validation.invalidInput=不正な入力: {0} validation.accountNrFormat=アカウント番号は次の形式である必要があります: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure={0}アドレスの構造と一致しないためアドレス検証に失敗しました。 -validation.altcoin.ltz.zAddressesNotSupported=LTZアドレスはLで始まる必要があります。zで始まるアドレスはサポートされていません。 -validation.altcoin.zAddressesNotSupported=ZECアドレスはtで始まる必要があります。zで始まるアドレスはサポートされていません。 +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZアドレスは必ずLで始まる必要があります。zで始まるアドレスはサポートされていません。 +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZECアドレスは必ずtで始まる必要があります。zで始まるアドレスはサポートされていません。 +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=アドレスが無効な{0}アドレスです!{1} -validation.altcoin.liquidBitcoin.invalidAddress=Native segwit addresses (those starting with 'lq') are not supported. -validation.bic.invalidLength=入力長が8でも11でもありません +# suppress inspection "UnusedProperty" +validation.altcoin.liquidBitcoin.invalidAddress=ネイティブsegwitアドレス(lqで始まるアドレス)はサポートされていません。 +validation.bic.invalidLength=入力長が8か11であるべきです validation.bic.letters=銀行コードと国コードは英字でなければなりません validation.bic.invalidLocationCode=BICに不正なロケーションコードが含まれています validation.bic.invalidBranchCode=BICに不正な支店コードが含まれています validation.bic.sepaRevolutBic=Revolut Sepaのアカウントはサポートされていません。 -validation.btc.invalidFormat=無効な形式のビットコインアドレス。 -validation.bsq.invalidFormat=無効な形式のBSQアドレス。 +validation.btc.invalidFormat=ビットコインアドレスにとって無効な形式です。 +validation.bsq.invalidFormat=BSQアドレスにとって無効な形式です。 validation.email.invalidAddress=不正なアドレス validation.iban.invalidCountryCode=不正な国コード validation.iban.checkSumNotNumeric=チェックサムは数値でなければなりません @@ -2841,25 +2834,25 @@ validation.iban.nonNumericChars=英数字以外の文字が検出されました validation.iban.checkSumInvalid=IBANチェックサムが不正です validation.iban.invalidLength=数字の長さは15〜34文字でなければなりません。 validation.interacETransfer.invalidAreaCode=非カナダ圏のコード -validation.interacETransfer.invalidPhone=無効な電話番号の形式で、メールアドレスではありません +validation.interacETransfer.invalidPhone=有効な11桁の電話番号(例えば1-123-456-7890)それともEメールアドレスを入力して下さい。 validation.interacETransfer.invalidQuestion=文字、数字、スペースおよび/または記号 ' _ , . ? - だけを含める必要があります validation.interacETransfer.invalidAnswer=1つの単語で、文字、数字、- 記号のみを含む必要があります validation.inputTooLarge=入力は{0}より大きくてはいけません validation.inputTooSmall=入力は{0}より大きくなければなりません validation.inputToBeAtLeast=入力は少なくとも{0}でなければなりません -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=ダスト制限である{0}サトシ未満の金額は許可されていません。 validation.length=長さは{0}から{1}の間である必要があります validation.pattern=入力は次の形式である必要があります: {0} validation.noHexString=入力がHEXフォーマットではありません。 -validation.advancedCash.invalidFormat=有効なメールアドレスか次のウォレットID形式である必要があります: X000000000000 +validation.advancedCash.invalidFormat=有効なメールアドレスか次のウォレットID形式である必要があります: X000000000000 validation.invalidUrl=有効なURLではありません -validation.mustBeDifferent=Your input must be different from the current value +validation.mustBeDifferent=入力する値は現在の値と異なるべきです。 validation.cannotBeChanged=パラメーターは変更できません validation.numberFormatException=例外の数値フォーマット {0} validation.mustNotBeNegative=負の値は入力できません -validation.phone.missingCountryCode=Need two letter country code to validate phone number -validation.phone.invalidCharacters=Phone number {0} contains invalid characters -validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number -validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number -validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}. -validation.invalidAddressList=Must be comma separated list of valid addresses +validation.phone.missingCountryCode=電話番号を検証するのに2文字国コードが必要です +validation.phone.invalidCharacters=電話番号 {0} には無効な文字が含まれている +validation.phone.insufficientDigits={0} には桁数が不十分で有効電話番号になりません +validation.phone.tooManyDigits={0} には桁数が多過ぎて有効電話番号になりません +validation.phone.invalidDialingCode=電話番号 {0} の国番号は国の {1} にとって間違っています。正しい国番号は {2} です。 +validation.invalidAddressList=有効アドレスのコンマ区切りリストでなければなりません diff --git a/core/src/main/resources/i18n/displayStrings_pt-br.properties b/core/src/main/resources/i18n/displayStrings_pt-br.properties index ee68fe79de..ca804fcffd 100644 --- a/core/src/main/resources/i18n/displayStrings_pt-br.properties +++ b/core/src/main/resources/i18n/displayStrings_pt-br.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=oferta shared.multipleOffers=ofertas shared.Offer=Oferta +shared.offerVolumeCode={0} Offer Volume shared.openOffers=ofertas abertas shared.trade=negociação shared.trades=negociações @@ -122,7 +123,8 @@ shared.noDateAvailable=Sem data disponível shared.noDetailsAvailable=Sem detalhes disponíveis shared.notUsedYet=Ainda não usado shared.date=Data -shared.sendFundsDetailsWithFee=Enviando: {0}\nDo endereço: {1}\nPara o endereço do recipiente: {2}\nTaxa de mineração é: {3} ({4} satoshis/byte)\nTamanho da transação: {5} Kb\n\nO recipiente irá receber: {6}\n\nVocê tem certeza de que quer sacar essa quantia? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n shared.copyToClipboard=Copiar para área de transferência shared.language=Idioma @@ -188,7 +190,6 @@ shared.tradeWalletAddress=Endereço da carteira de negociação shared.tradeWalletBalance=Saldo da carteira de negociação shared.makerTxFee=Ofertante: {0} shared.takerTxFee=Aceitador: {0} -shared.securityDepositBox.description=Depósito de segurança para BTC {0} shared.iConfirm=Eu confirmo shared.tradingFeeInBsqInfo=equivalente a {0} utilizado como taxa de negociação shared.openURL=Aberto {0} @@ -237,8 +238,6 @@ mainView.menu.settings=Configurações mainView.menu.account=Conta mainView.menu.dao=DAO -mainView.marketPrice.provider=Preço por -mainView.marketPrice.label=Preço de mercado mainView.marketPriceWithProvider.label=Preço de mercado por {0} mainView.marketPrice.bisqInternalPrice=Preço da última negociação Bisq mainView.marketPrice.tooltip.bisqInternalPrice=Não foi encontrado preço de mercado nos provedores externos.\nO preço exibido corresponde ao último preço de negociação no Bisq para essa moeda. @@ -251,14 +250,15 @@ mainView.balance.locked.short=Travado mainView.footer.usingTor=(usando Tor) mainView.footer.localhostBitcoinNode=(localhost) -mainView.footer.btcInfo=Pares na rede Bitcoin: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=Conectando-se à rede Bitcoin mainView.footer.bsqInfo.synchronizing=/ Sincronizando DAO mainView.footer.btcInfo.synchronizingWith=Sincronizando com -mainView.footer.btcInfo.synchronizedWith=Sincronizado com +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=Conectando-se a mainView.footer.btcInfo.connectionFailed=Falha na conexão à -mainView.footer.p2pInfo=Pares na rede Bisq: {0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=Full node da DAO mainView.bootstrapState.connectionToTorNetwork=(1/4) Conectando-se à rede Tor... @@ -292,7 +292,6 @@ market.tabs.spread=Detalhes market.tabs.trades=Negociações # OfferBookChartView -market.offerBook.chart.title=Livro de ofertas para {0} market.offerBook.buyAltcoin=Comprar {0} (vender {1}) market.offerBook.sellAltcoin=Vender {0} (comprar {1}) market.offerBook.buyWithFiat=Comprar {0} @@ -382,7 +381,7 @@ offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you hav offerbook.warning.counterpartyTradeRestrictions=Esta oferta não pode ser tomada por restrições de negociação da outra parte -offerbook.warning.newVersionAnnouncement=Com essa versão do software, os pares negociantes podem verificar e assinar as contas de pagamento uns dos outros para criarem uma rede de contas de pagamento confiáveis.\n\nApós realizar uma negociação bem sucedida com um parceiro que tenha uma conta de pagamento verificada, a sua conta de pagamento será assinada e seu limite de negociação será aumentado depois de um certo período de tempo (o tempo de espera depende do método de verificação).\n\nPara mais informações sobre a assinatura de contas, veja por favor a documentação em https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=A quantia permitida para a negociação está limitada a {0} devido a restrições de segurança baseadas nos seguintes critérios:\n- A conta do comprador não foi assinada por um árbitro ou um par\n- A conta do comprador foi assinada há menos de 30 dias\n- O meio de pagamento para essa oferta é considerado de risco para estornos bancários.\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=A quantia permitida para a negociação está limitada a {0} devido a restrições de segurança baseadas nos seguintes critérios:\n- A sua conta não foi assinada por um árbitro ou um par\n- A sua conta foi assinada há menos de 30 dias\n- O meio de pagamento para essa oferta é considerado de risco para estornos bancários.\n\n{1} @@ -393,8 +392,7 @@ offerbook.warning.offerBlocked=Essa oferta foi bloqueada pelos desenvolvedores d offerbook.warning.currencyBanned=A moeda usada nesta oferta foi bloqueada pelos desenvolvedores do Bisq.\nPor favor, visite o Fórum do Bisq para maiores informações. offerbook.warning.paymentMethodBanned=O método de pagamento usado nesta oferta foi bloqueado pelos desenvolvedores do Bisq.\nPor favor, visite o Fórum do Bisq para maiores informações. offerbook.warning.nodeBlocked=O endereço onion daquele negociador foi bloqueado pelos desenvolvedores do Bisq.\nProvavelmente há um problema não resolvido associado àquele negociador. -offerbook.warning.requireUpdateToNewVersion=A sua versão do Bisq deixou de ser compatível para negociação.\nAtualize para a versão mais recente do Bisq em https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=A sua conta de pagamentos foi criada {0} atrás. O seu limite de negociação é baseado na idade da conta e é insuficiente para essa oferta.\n\nO seu limite de negociação é: {1}\nA quantia mínima de negociação para essa oferta é: {2}.\n\nVocê não pode aceitar essa oferta neste momento. Essa restrição será removida assim que sua conta atingir 2 meses de criação. +offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. offerbook.info.sellAtMarketPrice=Você irá vender a preço de mercado (atualizado a cada minuto). @@ -405,7 +403,7 @@ offerbook.info.sellAboveMarketPrice=Você irá receber {0} a mais do que o atual offerbook.info.buyBelowMarketPrice=Você irá pagar {0} a menos do que o atual preço de mercado (atualizado a cada minuto). offerbook.info.buyAtFixedPrice=Você irá comprar nesse preço fixo. offerbook.info.sellAtFixedPrice=Você irá vender neste preço fixo. -offerbook.info.noArbitrationInUserLanguage=Em caso de disputa, a arbitragem para essa oferta será realizada em {0}. O idioma atualmente está definido como {1}. +offerbook.info.noArbitrationInUserLanguage=Em caso de disputa, a arbitragem para essa oferta será realizada em {0}. O idioma atualmente está definido como {1}. offerbook.info.roundedFiatVolume=O valor foi arredondado para aumentar a privacidade da sua negociação. #################################################################### @@ -445,7 +443,6 @@ createOffer.alreadyFunded=Você já havia financiado aquela oferta.\nSeus fundos createOffer.createOfferFundWalletInfo.headline=Financiar sua oferta # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- Quantia da negociação: {0} \n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} e {1} createOffer.createOfferFundWalletInfo.msg=Você precisa depositar {0} para esta oferta.\n\nEsses fundos ficam reservados na sua carteira local e ficarão travados no endereço de depósito multisig quando alguém aceitar a sua oferta.\n\nA quantia equivale à soma de:\n{1}- Seu depósito de segurança: {2}\n- Taxa de negociação: {3}\n- Taxa de mineração: {4}\n\nVocê pode financiar sua negociação das seguintes maneiras:\n- Usando a sua carteira Bisq (conveniente, mas transações poderão ser associadas entre si) OU\n- Usando uma carteira externa (maior privacidade)\n\nVocê verá todas as opções de financiamento e detalhes após fechar esta janela. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=Erro ao aceitar a oferta: o ofertante está offl takeOffer.warning.connectionToPeerLost=Você perdeu a conexão com o ofertante.\nEle pode ter ficado offline ou teve a conexão com você fechada em decorrência de muitas conexões abertas.\n\nSe você ainda pode ver a oferta dele no livro de ofertas você pode tentar aceitá-la novamente. takeOffer.error.noFundsLost=\n\nA sua carteira ainda não realizou o pagamento.\nPor favor, reinicie o programa e verifique a sua conexão com a internet. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nA transação do depósito já foi publicada.\nPor favor, reinicie o programa e verifique sua conexão de internet para tentar resolver o problema.\nSe o problema persistir, entre em contato com os desenvolvedores. takeOffer.error.payoutPublished=\n\nA transação de pagamento já foi publicada.\nPor favor, reinicie o programa e verifique sua conexão de internet para tentar resolver o problema.\nSe o problema persistir, entre em contato com os desenvolvedores. @@ -543,7 +541,7 @@ portfolio.tab.history=Histórico portfolio.tab.failed=Falha portfolio.tab.editOpenOffer=Editar oferta -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance.\n\nError message: {0} portfolio.pending.step1.waitForConf=Aguardar confirmação da blockchain portfolio.pending.step2_buyer.startPayment=Iniciar pagamento @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=IMPORTANTE:\nApós ter feito o pag # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=Pague {0} ao vendedor de BTC usando Western Union.\n\n portfolio.pending.step2_buyer.westernUnion.extra=IMPORTANTE:\nApós ter feito o pagamento, envie o número de rastreamento (MTCN) e uma foto do comprovante por e-mail para o vendedor de BTC.\nO comprovante deve exibir claramente o nome completo, o país e o estado do vendedor, assim como a quantia. O e-mail do vendedor é: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=Envie {0} através de \"US Postal Money Order\" para o vendedor de BTC.\n\n @@ -636,7 +636,7 @@ portfolio.pending.step2_buyer.confirmStart.headline=Confirme que você iniciou o portfolio.pending.step2_buyer.confirmStart.msg=Você iniciou o pagamento {0} para o seu parceiro de negociação? portfolio.pending.step2_buyer.confirmStart.yes=Sim, iniciei o pagamento portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway portfolio.pending.step2_seller.waitPayment.headline=Aguardar pagamento @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=Informações de contato do comp portfolio.pending.step2_seller.waitPayment.msg=A transação de depósito tem pelo menos uma confirmação blockchain do protocolo.\nVocê precisa aguardar até que o comprador de BTC inicie o pagamento de {0}. portfolio.pending.step2_seller.warn=O comprador de BTC ainda não fez o pagamento de {0}.\nVocê precisa esperar até que ele inicie o pagamento.\nCaso a negociação não conclua em {1}, o árbitro irá investigar. portfolio.pending.step2_seller.openForDispute=O comprador de BTC ainda não iniciou o pagamento!\nO período máximo permitido para a negociação expirou.\nVocê pode aguardar mais um pouco, dando mais tempo para o seu parceiro de negociação, ou você pode entrar em contato com o mediador para pedir assistência. -portfolio.pending.step2_seller.refresh=Atualizar o Estado da Negociação -portfolio.pending.step2_seller.refreshInfo=Às vezes algumas mensagens informando sobre o pagamento não são entregues na rede P2P, causando o bloqueio da negociação. Aperte o botão abaixo pra fazer seu par reenviar a última mensagem. tradeChat.chatWindowTitle=Abrir janela de conversa para a negociação com ID "{0}" tradeChat.openChat=Abrir janela de conversa tradeChat.rules=Você pode conversar com seu par da negociação para resolver potenciais problemas desta negociação.\nNão é obrigatório responder no chat.\nSe um negociante violar qualquer das regras abaixo, abra uma disputa e reporte o caso ao mediador ou árbitro.\n\nRegras do chat:\n\t● Não envie nenhum link (risco de malware). Você pode enviar a ID de transação e o nome de um explorador de blocos.\n\t● Não envie suas palavras-semente, chaves privadas, senhas ou outras informações sensíveis!\n\t● Não encoraje negociações fora da Bisq (sem segurança).\n\t● Não tente aplicar golpes por meio de qualquer forma de engenharia social.\n\t● Se o par não responder e preferir não se comunicar pelo chat, respeite essa decisão.\n\t● Mantenha o escopo da conversa limitado à negociação. Este chat não é um substituto de aplicativos de mensagens ou local para trolagens.\n\t● Mantenha a conversa amigável e respeitosa. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=Como o pagamento é realizado através de de portfolio.pending.step3_seller.moneyGram=O comprador deve enviar o Número de Autorização e uma foto do recibo por e-mail.\nO recibo deve mostrar claramente o seu nome completo, país, estado e a quantia. Por favor verifique seu e-mail se recebeu o Número de Autorização.\n\nDepois de fechar esse pop-up, verá o nome e o endereço do comprador do BTC para retirar o dinheiro da MoneyGram.\n\nConfirme apenas o recebimento depois de ter conseguido o dinheiro com sucesso! portfolio.pending.step3_seller.westernUnion=O comprador deve enviar-lhe o MTCN (número de rastreamento) e uma foto do recibo por e-mail.\nO recibo deve mostrar claramente seu nome completo, cidade, país e a quantia Por favor verifique no seu e-mail se você recebeu o MTCN.\n\nDepois de fechar esse pop-up, você verá o nome e endereço do comprador de BTC para receber o dinheiro da Western Union.\n\nConfirme apenas o recebimento depois de ter conseguido o dinheiro com sucesso! portfolio.pending.step3_seller.halCash=O comprador deve-lhe enviar o código HalCash como mensagem de texto. Além disso, você receberá uma mensagem do HalCash com as informações necessárias para sacar o EUR de uma ATM que suporte o HalCash.\n\nDepois de retirar o dinheiro na ATM, confirme aqui o recibo do pagamento! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nVerifique também se o nome de quem envia o pagamento no contrato de negociação é o mesmo que aparece em seu extrato bancário:\nNome do pagante, pelo contrato de negociação: {0}\n\nSe os nomes não forem exatamente iguais, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=não confirme o recebimento do pagamento. Em vez disso, abra uma disputa pressionando \"alt + o\" or \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=Confirmar recebimento do pagamento portfolio.pending.step3_seller.amountToReceive=Quantia a receber @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=Você recebeu o pagamento portfolio.pending.step3_seller.onPaymentReceived.fiat=O ID de negociação (texto \"razão do pagamento\") da transação é: \"{0}\"\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Verifique também se o nome de quem envia o pagamento no contrato de negociação é o mesmo que aparece em seu extrato bancário:\nNome do pagante, pelo contrato de negociação: {0}\n\nSe os nomes não forem exatamente iguais, não confirme o recebimento do pagamento. Em vez disso, abra uma disputa pressionando \"alt + o\" or \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.note=Assim que você confirmar o recebimento do pagamento, o valor da transação será liberado para o comprador de BTC e o depósito de segurança será devolvido.\n\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirmar recebimento do pagamento portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Sim, eu recebi o pagamento @@ -746,7 +747,7 @@ portfolio.pending.tradePeriodInfo=O período de negociação irá se iniciar ap portfolio.pending.tradePeriodWarning=Se o período expirar, os dois negociantes poderão abrir uma disputa. portfolio.pending.tradeNotCompleted=Negociação não completada a tempo (até {0}) portfolio.pending.tradeProcess=Processo de negociação -portfolio.pending.openAgainDispute.msg=Se você não tem certeza de que a mensagem foi entregue ao árbitro ou mediador (ex: se você não recebeu uma resposta após 1 dia), sinta-se livre para abrir novamente uma disputa pressionando Cmd/Ctrl+o. Você ainda pode solicitar ajuda adicional no fórum da Bisq em https://bisq.community. +portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=Abrir disputa novamente portfolio.pending.openSupportTicket.headline=Abrir ticket de suporte portfolio.pending.openSupportTicket.msg=Por favor, apenas use esta função em casos de emergência quando não houver um botão para "Abrir ticket de suporte" ou "Abrir disputa".\n\nQuando você abrir um ticket de suporte, a negociação será interrompida e tratada por um mediador ou árbitro. @@ -757,14 +758,9 @@ portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. portfolio.pending.error.depositTxNotConfirmed=A transação de depósito não está confirmada. Você não pode abrir uma disputa com uma transação não-confirmada. Por favor, espere até que a transação seja confirmada ou vá até "Configurações/Informações da rede" e ressincronize o arquivo SPV.\n\nPara mais informações, por favor acesse o canal #support do time da Bisq na Keybase. -portfolio.pending.notification=Notificação - portfolio.pending.support.headline.getHelp=Precisa de ajuda? portfolio.pending.support.text.getHelp=Caso tenha problemas, você pode tentar contactar o par de negociação no chat ou solicitar ajuda na comunidade da Bisq em https://bisq.community. Se o problema persistir, você pode solicitar ajuda adicional a um mediador. -portfolio.pending.support.text.getHelp.arbitrator=Caso tenha problemas, você pode tentar contactar o par de negociação no chat ou solicitar ajuda na comunidade da Bisq em https://bisq.community. Se o problema persistir, você pode solicitar ajuda adicional a um árbitro. portfolio.pending.support.button.getHelp=Abrir Chat de Negociante -portfolio.pending.support.popup.info=Se o seu problema com a negociação ainda não foi resolvido, você pode abrir um ticket de suporte para pedir ajuda a um mediador. Se você não recebeu o pagamento, por favor aguarde até o final do período de negociação.\n\nVocê tem certeza de que quer abrir um ticket de suporte? -portfolio.pending.support.popup.button=Abrir ticket de suporte portfolio.pending.support.headline.halfPeriodOver=Verifique o pagamento portfolio.pending.support.headline.periodOver=O período de negociação acabou @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Mediação requerida portfolio.pending.refundRequested=Reembolso requerido portfolio.pending.openSupport=Abrir ticket de suporte portfolio.pending.supportTicketOpened=Ticket de suporte aberto -portfolio.pending.requestSupport=Solicitar suporte -portfolio.pending.error.requestSupport=Por favor, informe o problema ao seu mediador ou árbitro.\n\nEles irão encaminhar as informações para os desenvolvedores investigarem o problema.\nApós a análise, você receberá todos os seus fundos travados. portfolio.pending.communicateWithArbitrator=Por favor, vá até a seção \"Suporte\" e entre em contato com o árbitro. portfolio.pending.communicateWithMediator=Por favor, entre em contato com o mediador na seção \"Suporte\". -portfolio.pending.supportTicketOpenedMyUser=Você já abriu um ticket de suporte\n{0} portfolio.pending.disputeOpenedMyUser=Você já abriu uma disputa.\n{0} portfolio.pending.disputeOpenedByPeer=Seu parceiro de negociação abriu uma disputa\n{0} -portfolio.pending.supportTicketOpenedByPeer=Seu parceiro de negociação abriu um ticket de suporte.\n{0} portfolio.pending.noReceiverAddressDefined=Nenhum endereço de recebimento definido -portfolio.pending.removeFailedTrade=Esta negociação falhou? Caso afirmativo, gostaria de fechá-la manualmente para que ela não apareça mais como negociação em aberto? portfolio.pending.mediationResult.headline=Sugestão de pagamento da mediação portfolio.pending.mediationResult.info.noneAccepted=Completar a negociação aceitando a sugestão do mediador para o pagamento @@ -790,18 +781,18 @@ portfolio.pending.mediationResult.info.peerAccepted=O seu parceiro de negociaç portfolio.pending.mediationResult.button=Ver solução proposta portfolio.pending.mediationResult.popup.headline=Resultado da mediação para a negociação com ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=O seu parceiro de negociação aceitou a sugestão do mediador para a negociação {0} -portfolio.pending.mediationResult.popup.info=O mediador sugeriu o seguinte pagamento:\nVocê recebe: {0}\nSeu parceiro de negociação recebe: {1}\n\nVocê pode aceitar ou rejeitar esta sugestão de pagamento.\n\nAceitando, você assina a transação de pagamentos proposta. Se seu parceiro de negociação também aceitar e assinar, o pagamento será efetuado, e a negociação será fechada.\n\nSe um ou ambos de vocês rejeitarem a sugestão você terá que esperar até {2} (bloco {3}) para abrir uma segunda rodada de disputa com um árbitro que investigará o caso novamente e fará um pagamento baseado nas evidências.\n\nO árbitro poderá cobrar uma pequena taxa (taxa máxima: o depósito de segurança do negociador) como compensação pelo seu trabalho. Ambos negociadores concordarem com as sugestões do mediador é o caminho feliz—requisitar árbitro é destinado a circunstâncias excepcionais, como quando um negociador está certo de que o mediador não fez uma sugestão de pagamento justa (ou se o outro parceiro de negociação não responde).\n\nPara mais detalhes sobre o novo modelo de arbitragem:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nOnce the lock time is over on {0} (block {1}), you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Rejeitar e solicitar arbitramento portfolio.pending.mediationResult.popup.alreadyAccepted=Você já aceitou portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. +portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nFeel free to move this trade to failed trades. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. @@ -839,6 +830,7 @@ funds.deposit.fundWallet=Financiar sua carteira funds.deposit.withdrawFromWallet=Enviar fundos da carteira funds.deposit.amount=Quantia em BTC (opcional) funds.deposit.generateAddress=Gerar um endereço novo +funds.deposit.generateAddressSegwit=Native segwit format (Bech32) funds.deposit.selectUnused=Selecione um endereço não utilizado da tabela acima ao invés de gerar um novo. funds.withdrawal.arbitrationFee=Taxa de arbitragem @@ -986,6 +978,7 @@ setting.preferences.general=Preferências gerais setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=Desvio máx. do preço do mercado +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=Impedir modo de economia de energia setting.preferences.autoConfirmXMR=XMR auto-confirm setting.preferences.autoConfirmEnabled=Enabled @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Required confirmations setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) setting.preferences.deviationToLarge=Valores acima de {0}% não são permitidos. -setting.preferences.txFee=Taxa da transação de retirada (satoshis/byte) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=Usar valor personalizado -setting.preferences.txFeeMin=A taxa de transação precisa ter pelo menos {0} satoshis/byte -setting.preferences.txFeeTooLarge=Seu valor está muito alto (>5.000 satoshis/byte). A taxa de transação normalmente fica na faixa de 50-400 satoshis/byte. +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Pares ignorados [endereço onion:porta] -setting.preferences.refererId=ID de referência setting.preferences.ignoreDustThreshold=Mín. valor de output não-poeira -setting.preferences.refererId.prompt=ID de referência opcional setting.preferences.currenciesInList=Moedas na lista de preços de mercado setting.preferences.prefCurrency=Moeda de preferência setting.preferences.displayFiat=Exibir moedas nacionais @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=Usar animações setting.preferences.useDarkMode=Usar modo escuro setting.preferences.sortWithNumOffers=Ordenar pelo nº de ofertas/negociações setting.preferences.resetAllFlags=Esquecer marcações \"Não exibir novamente\" -setting.preferences.reset=Resetar settings.preferences.languageChange=Aplicar a mudança de idioma em todas as telas requer uma reinicialização. settings.preferences.supportLanguageWarning=Em caso de disputa, por favor note que a mediação é feita em {0} e a arbitração em {1}. -settings.preferences.selectCurrencyNetwork=Rede setting.preferences.daoOptions=Opções da DAO setting.preferences.dao.resyncFromGenesis.label=Reconstruir o estado da DAO à partir da tx genesis setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources @@ -1030,9 +1019,16 @@ setting.preferences.dao.isDaoFullNode=Executar Bisq como nó completo DAO setting.preferences.dao.rpcUser=Nome de usuário de RPC setting.preferences.dao.rpcPw=Senha de RPC setting.preferences.dao.blockNotifyPort=Bloquear porta de notificação -setting.preferences.dao.fullNodeInfo=Para executar o Bisq como nó completo da DAO você precisa ter Bitcoin Core em rodando localmente e RPC ativado. Todos os requisitos estão documentados em '' {0} ''. +setting.preferences.dao.fullNodeInfo=Para executar o Bisq como nó completo da DAO você precisa ter Bitcoin Core em rodando localmente e RPC ativado. Todos os requisitos estão documentados em '' {0} ''. setting.preferences.dao.fullNodeInfo.ok=Abrir página de documentos setting.preferences.dao.fullNodeInfo.cancel=Não, eu fico com o modo nó lite +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=Nome +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=Rede Bitcoin settings.net.p2pHeader=Rede Bisq @@ -1044,7 +1040,7 @@ settings.net.bitcoinNodesLabel=Conexão a nodos do Bitcoin Core settings.net.useProvidedNodesRadio=Usar nodos do Bitcoin Core fornecidos settings.net.usePublicNodesRadio=Usar rede pública do Bitcoin settings.net.useCustomNodesRadio=Usar nodos personalizados do Bitcoin Core -settings.net.warn.usePublicNodes=Ao usar a rede pública do Bitcoin, você estará se expondo a um problema grave de privacidade que é causado por uma falha de projeto e de implementação do filtro bloom, o qual é usado em carteiras SPV como a BitcoinJ (a carteira SPV usada no Bisq). Qualquer nodo completo a que você se conectar será capaz de descobrir que todos os endereços da sua carteira pertencem a uma mesma pessoa/entidade.\n\nPor favor, leia mais sobre os detalhes em: https://bisq.network/blog/privacy-in-bitsquare.\n\nVocê tem certeza de que realmente quer usar os nodos públicos? +settings.net.warn.usePublicNodes=If you use the public Bitcoin network you are exposed to a severe privacy problem caused by the broken bloom filter design and implementation which is used for SPV wallets like BitcoinJ (used in Bisq). Any full node you are connected to could find out that all your wallet addresses belong to one entity.\n\nPlease read more about the details at [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nAre you sure you want to use the public nodes? settings.net.warn.usePublicNodes.useProvided=Não, usar os nodos fornecidos settings.net.warn.usePublicNodes.usePublic=Sim, usar rede pública settings.net.warn.useCustomNodes.B2XWarning=Certifique-se de que o seu nodo Bitcoin é um nodo Bitcoin Core confiável!\n\nAo se conectar a nodos que não estão seguindo as regras de consenso do Bitcoin Core, você pode corromper a sua carteira e causar problemas no processo de negociação.\n\nOs usuários que se conectam a nodos que violam as regras de consenso são responsáveis pelos danos que forem criados por isso. As disputas causadas por esse motivo serão decididas a favor do outro negociante. Nenhum suporte técnico será fornecido para os usuários que ignorarem esse aviso e os mecanismos de proteção! @@ -1150,16 +1146,14 @@ setting.about.shortcuts.sendPrivateNotification=Enviar notificação privada ao setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=Registro de árbitro account.tab.mediatorRegistration=Registro de mediador account.tab.refundAgentRegistration=Registro de agente de reembolsos account.tab.signing=Signing -account.tab.account=Conta account.info.headline=Bem vindo à sua conta Bisq account.info.msg=Aqui você pode adicionar contas de negociação para moedas nacionais & altcoins e criar um backup da sua carteira e dados da sua conta.\n\nUma nova carteira Bitcoin foi criada na primeira vez em que você iniciou a Bisq.\nNós encorajamos fortemente que você anote as palavras semente da sua carteira Bitcoin (veja a aba no topo) e considere adicionar uma senha antes de depositar fundos. Depósitos e retiradas de Bitcoin são gerenciados na seção "Fundos".\n\nNota de privacidade & segurança: visto que a Bisq é uma exchange decentralizada, todos os seus dados são mantidos no seu computador. Não existem servidores, então não temos acesso às suas informações pessoais, seus fundos ou até mesmo ao seu endereço IP. Dados como número de conta bancária, endereços de Bitcoin & altcoin, etc apenas são compartilhados com seu parceiro de negociação para completar as negociações iniciadas por você (em caso de disputa, o mediador ou árbitro verá as mesmas informações que seu parceiro de negociação). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=Não foi possível completar o reg account.altcoin.yourAltcoinAccounts=Suas contas de altcoins account.altcoin.popup.wallet.msg=Por favor, certifique-se de seguir os requisitos para uso de carteiras {0} como descritos na página {1}.\nUsar carteiras de exchanges centralizadas onde (a) você não tem controle das suas chaves privadas ou (b) não se usa um software de carteira compatível é arriscado: você pode perder seus fundos negociados!\nO mediador ou árbitro não é um especialista em {2} e não pode ajudar em tais casos. account.altcoin.popup.wallet.confirm=Eu entendo e confirmo que sei qual carteira preciso usar. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Negociar MSR Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPara enviar MSR, você deve usar uma destas: carteira oficial GUI Masari, carteira CLI Masari com a opção store-tx-info habilitada (habilitada por padrão) ou a carteira web Masari (https://wallet.getmasari.org). Por favor, certifique-se que você tenha acesso à chave da transação pois esta seria necessária em caso de uma disputa.\nmasari-wallet-cli (use o comando get_tx_key)\nmasari-wallet-gui (vá até a aba histórico e clique no botão (P) para prova de pagamento)\n\nCarteira Web Masari (vá até Conta -> histórico de transações e veja os detalhes da sua transação enviada.)\n\nVerificação pode ser feita dentro da carteira.\nmasari-wallet-cli : usando um comando (check_tx_key).\nmasari-wallet-gui : na página Avançado > Comprovar/Verificar.\nVerificação pode ser feita via explorador de blocos.\nAbra o explorador de blocos (https://explorer.getmasari.org) e use a barra de busca para encontrar o hash da sua transação.\nAssim que a transação for encontrada, role até o final da seção 'Comprovar envio' e preencha os detalhes conforme necessário.\nVocê precisa fornecer os seguintes dados ao mediador ou árbitro em caso de uma disputa:\n- Chave privada da transação\n- Hash da transação\n- Endereço público do destinatário\n\nA impossibilidade de fornecer as informações acima ou uso de uma carteira incompatível resultará na perda do caso de disputa. Em caso de uma disputa, o remetente de MSR é responsável por providenciar, ao mediador ou árbitro, a verificação do envio de MSR.\n\nNão é necessário um ID de pagamento, apenas o endereço público convencional.\nCaso tenha dúvidas sobre este processo, solicite ajuda no Discord oficial Masari (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Negociar Solo na Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPara enviar Solo, você deve usar a carteira CLI Solo Network. \n\nSe você estiver usando a carteira CLI, um hash de transação (tx ID) será exibido após o envio de uma transferência. Você deve salvar essa informação. Imediatamente após o envio, você deve utilizar o comando 'get_tx_key' para obter a chave privada da transação. Se você não executar este passo devidamente, você pode não conseguir obter a chave depois.\n\nEm um evento onde uma arbitragem for necessária, você deve apresentar o seguinte para um árbitro ou mediador: 1.) ID da transação, 2.) a chave privada da transação, e 3.) o endereço do destinatário. O mediador ou árbitro irá então verificar a transferência Solo usando o explorador de blocos Solo, buscando pela transação e então usando a função "Provar envio" (https://explorer.minesolo.com/).\n\nA impossibilidade de fornecer as informações requeridas ao mediador ou árbitro resultará na perda do caso de disputa. Em todos os casos de disputa, In all cases of dispute, o remetente de Solo arca 100% com a responsabilidade de verificar as transações para um árbitro ou mediador.\n\nCaso não entenda estes requisitos, não negocie na Bisq. Procure ajuda no Discord da Solo Network primeiro. (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Negociar CASH2 na Bisq requer que você entenda e cumpra os seguintes requisitos:\n\nPara enviar CASH2, você deve usar a carteira Cash2 versão 3 ou superior. \n\nApós o envio de uma transação, o ID da transação será exibido. Você deve salvar essa informação. Imediatamente após enviar a transação, você deve utilizar o comando 'getTxKey' na simplewallet para obter a chave secreta da transação. Se você não executar este passo devidamente, você pode não conseguir obter a chave depois.\n\nEm um evento onde uma arbitragem for necessária, você deve apresentar o seguinte para um árbitro ou mediador: 1.) ID da transação, 2.) a chave secreta da transação, e 3.) o endereço do destinatário Cash2. O mediador ou árbitro irá então verificar a transferência CASH2 usando o explorador de blocos CASH2 (https://blocks.cash2.org).\n\nA impossibilidade de fornecer as informações requeridas ao mediador ou árbitro resultará na perda do caso de disputa. Em todos os casos de disputa, In all cases of dispute, o remetente de CASH2 arca 100% com a responsabilidade de verificar as transações para um árbitro ou mediador.\n\nCaso não entenda estes requisitos, não negocie na Bisq. Procure ajuda no Discord da Cash2 primeiro. (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=Ao usar Zcash você só pode usar endereços transparentes(que começam com t), não os z-addresses (privados), pois o mediador e o árbitro não conseguiriam verificar a transação com endereços privados num explorador de blocos. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=Ao usar Zcoin você só pode usar endereços transparentes(rastreáveis), não os inrrastreáveis, pois o mediador e o árbitro não conseguiriam verificar a transação com endereços irrastreáveis num explorador de blocos. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN requer um processo interativo entre o remetente e o destinatário para criar a transação. Certifique-se de seguir as instruções da página web do projeto GRIN para enviar e receber de forma confiável o GRIN (o destinatário precisa estar online ou pelo menos estar online durante um determinado período de tempo).\n\nBisq suporta apenas o formato de URL da carteira Grinbox (Wallet713).\n\nO remetente GRIN é obrigado a fornecer prova de que ele enviou GRIN com sucesso. Se a carteira não puder fornecer essa prova, uma potencial disputa será resolvida em favor do destinatário de GRIN. Certifique-se de usar o software Grinbox mais recente, que suporta a prova de transação e que você entende o processo de transferência e receção do GRIN, bem como criar a prova.\n\nConsulte https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only para obter mais informações sobre a ferramenta de prova Grinbox. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAM requer um processo interativo entre o remetente e o destinatário para criar a transação.\n\nCertifique-se de seguir as instruções da página Web do projeto BEAM para enviar e receber BEAM de forma confiável (o destinatário precisa estar online ou pelo menos estar online durante um determinado período de tempo).\n\nO remetente BEAM é obrigado a fornecer prova de que ele enviou o BEAM com sucesso. Certifique-se de usar uma carteira que possa produzir tal prova. Se a carteira não puder fornecer a prova, uma disputa potencial será resolvida em favor do destinarário do BEAM. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Para negociar com L-BTC na Bisq é preciso entender o seguinte:\n\nQuando se recebe L-BTC de uma negociação na Bisq, você não pode usar a carteira móvel Blockstream Green ou uma carteira de exchange. Você só pode receber L-BTC numa carteira Liquid Elements Core, ou outra carteira L-BTC que lhe permita obter a blinding key para o seu endereço blinded de L-BTC.\n\nNo caso de mediação ou se uma disputa acontecer, você precisa divulgar ao mediador, ou agente de reembolsos, a blinding key do seu endereço receptor de L-BTC para que ele possa verificar os detalhes da sua Transação Confidencial no node próprio deles.\n\nCaso essa informação não seja fornecida ao mediador ou agente de reembolsos você corre o risco de perder a disputa. Em todos os casos de disputa o recebedor de L-BTC tem 100% de responsabilidade em fornecer a prova criptográfica ao mediador ou agente de reembolsos.\n\nSe você não entendeu esses requisitos, por favor não negocie L-BTC na Bisq. account.fiat.yourFiatAccounts=Suas contas de moeda nacional @@ -1213,7 +1222,6 @@ account.backup.location=Local de backup account.backup.selectLocation=Selecione local para backup account.backup.backupNow=Fazer backup agora (o backup não é criptografado!) account.backup.appDir=Pasta de dados do programa -account.backup.logFile=Arquivo de Log account.backup.openDirectory=Abrir pasta account.backup.openLogFile=Abrir arquivo de Log account.backup.success=Backup salvo com sucesso em:\n{0} @@ -1227,7 +1235,7 @@ account.password.info=Ao proteger a carteira com uma senha, você precisará dig account.seed.backup.title=Fazer backup das palavras-semente da carteira account.seed.info=Por favor, anote em um papel a data e as palavras-semente da carteira! Com essas informações, você poderá recuperar sua carteira à qualquer momento.\nA semente exibida é usada tanto para a carteira BTC quanto para a carteira BSQ.\n\nVocê deve anotá-las em uma folha de papel. Jamais anote as palavras em um arquivo no seu computador ou em seu e-mail.\n\nNote que a semente da carteira NÃO substitui um backup.\nPara fazer isso, você precisa fazer backup da pasta do Bisq na seção \"Conta/Backup\".\nA importação da semente da carteira só é recomendada em casos de emergência. O programa não funcionará corretamente se você não recuperá-lo através de um backup! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. account.seed.warn.noPw.msg=Você não definiu uma senha para carteira, que protegeria a exibição das palavras-semente.\n\nGostaria de exibir as palavras-semente? account.seed.warn.noPw.yes=Sim, e não me pergunte novamente account.seed.enterPw=Digite a senha para ver a semente da carteira @@ -1241,14 +1249,11 @@ account.seed.restore.ok=Ok, restaurar e desligar o Bisq account.notifications.setup.title=Configurações account.notifications.download.label=Baixar app móvel -account.notifications.download.button=Baixar account.notifications.waitingForWebCam=Aguardando webcam... account.notifications.webCamWindow.headline=Escanear código QR do celular account.notifications.webcam.label=Usar webcam account.notifications.webcam.button=Escanear código QR account.notifications.noWebcam.button=Eu não tenho uma webcam -account.notifications.testMsg.label=Enviar notificação de teste -account.notifications.testMsg.title=Testar account.notifications.erase.label=Limpar notificações no celular account.notifications.erase.title=Limpar notificações account.notifications.email.label=Token de pareamento @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=Distância percentual do preço account.notifications.marketAlert.addButton=Inserir alerta de oferta account.notifications.marketAlert.manageAlertsButton=Gerenciar alertas de oferta account.notifications.marketAlert.manageAlerts.title=Gerenciar alertas de oferta -account.notifications.marketAlert.manageAlerts.label=Alertas de oferta -account.notifications.marketAlert.manageAlerts.item=Alerta de oferta para {0} oferta com o preço gatilho de {1} e conta de pagamento {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=Conta de pagamento account.notifications.marketAlert.manageAlerts.header.trigger=Preço gatilho account.notifications.marketAlert.manageAlerts.header.offerType=Tipo de oferta @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=Saldo de todas as transações não verificadas (aguard dao.lockedForVoteBalance=Usado para votação dao.lockedInBonds=Bloqueado em vínculos dao.availableNonBsqBalance=Saldo não-BSQ disponível (BTC) -dao.totalBsqBalance=Saldo total de BSQ dao.reputationBalance=Valor de mérito (não gastável) dao.tx.published.success=Sua transação foi publicada com sucesso. @@ -1455,11 +1457,6 @@ dao.param.currentValue=Valor atual: {0} dao.param.currentAndPastValue=Valor atual: {0} (Valor quando a proposta foi feita: {1}) dao.param.blocks={0} blocos -dao.results.cycle.duration.label=Duração de {0} -dao.results.cycle.duration.value={0} bloco(s) -dao.results.cycle.value.postFix.isDefaultValue=(valor padrão) -dao.results.cycle.value.postFix.hasChanged=(foi modificado em votação) - dao.results.invalidVotes=Tivemos votos inválidos naquele ciclo de votação. Isso pode acontecer se o voto não foi bem propagado pela rede da Bisq.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=Sal dao.bond.reputation.hash=Hash dao.bond.reputation.lockupButton=Travar dao.bond.reputation.lockup.headline=Confirmar transação de bloqueio -dao.bond.reputation.lockup.details=Quantia a bloquear: {0}\nTempo de desbloqueio: {1} bloco(s) (≈ {2})\n\nTaxa de mineração: {3} ({4} satoshis/byte)\nTamanho da transação: {5} Kb\n\nTem certeza de que deseja continuar? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=Confirmar transação de desbloqueio -dao.bond.reputation.unlock.details=Quantia de desbloqueio: {0}\nTempo de desbloqueio: {1} bloco(s) (≈ {2})\n\nTaxa de mineração: {3} ({4} satoshis/byte)\nTamanho da transação: {5} Kb\n\nTem certeza de que deseja continuar? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=Todos os vínculos @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=Assinar dao.proofOfBurn.message=Mensagem dao.proofOfBurn.sig=Assinatura dao.proofOfBurn.verify=Verificar -dao.proofOfBurn.verify.header=Verificar a mensagem com a chave da transação da prova-de-queima dao.proofOfBurn.verificationResult.ok=Verificação realizada com sucesso dao.proofOfBurn.verificationResult.failed=Erro na verificação @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Usuário no GitHub dao.proposal.display.link=Link para mais detalhes dao.proposal.display.link.prompt=Link para proposta dao.proposal.display.requestedBsq=Quantia requerida em BSQ -dao.proposal.display.bsqAddress=Endereço BSQ dao.proposal.display.txId=ID de transação de proposta dao.proposal.display.proposalFee=Taxa de proposta dao.proposal.display.myVote=Meu voto dao.proposal.display.voteResult=Resumo do resultado da votação dao.proposal.display.bondedRoleComboBox.label=Tipo de cargo vinculado dao.proposal.display.requiredBondForRole.label=Vínculo necessário para cargo -dao.proposal.display.tickerSymbol.label=Símbolo do ticker dao.proposal.display.option=Opção dao.proposal.table.header.proposalType=Tipo de proposta dao.proposal.table.header.link=Link dao.proposal.table.header.myVote=Meu voto +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=Remover dao.proposal.table.icon.tooltip.removeProposal=Remover minha proposta dao.proposal.table.icon.tooltip.changeVote=Voto atual: ''{0}''. Mudar voto para: ''{1}'' @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=Meu saldo de carteira dao.wallet.receive.fundYourWallet=Seu endereço de recebimento BSQ dao.wallet.receive.bsqAddress=Endereço da carteira BSQ (endereço não utilizado) -dao.wallet.receive.dao.headline=DAO da Bisq -dao.wallet.receive.daoInfo=Assim como o mercado de câmbio do Bisq é descentralizado e resistente à censura, o seu modelo de governança também o é - e a DAO do Bisq e o token BSQ são as ferramentas que tornam isso possível. -dao.wallet.receive.daoInfo.button=Ler mais sobre o DAO da Bisq -dao.wallet.receive.daoTestnetInfo=A mainnet da DAO do Bisq ainda não foi lançada, mas você pode aprender sobre a DAO do Bisq executando-a na testnet. -dao.wallet.receive.daoTestnetInfo.button=Como executar a DAO do Bisq na nossa testnet -dao.wallet.receive.daoContributorInfo=Se você já contribuiu para a Bisq, use o endereço BSQ abaixo e faça uma solicitação para fazer parte da distribuição gênese do BSQ. -dao.wallet.receive.daoContributorInfo.button=Como ser parte da distribuição genesis de BSQ - dao.wallet.send.sendFunds=Enviar fundos dao.wallet.send.sendBtcFunds=Enviar fundos não-BSQ (BTC) dao.wallet.send.amount=Quantia em BSQ dao.wallet.send.btcAmount=Quantia em BTC (fundos não-BSQ) dao.wallet.send.setAmount=Definir quantia a retirar (quantia mínima é {0}) -dao.wallet.send.setBtcAmount=Definir quantia em BTC para saque (mínimo é {0}) dao.wallet.send.receiverAddress=Endereço BSQ do destinatário dao.wallet.send.receiverBtcAddress=Endereço BTC do destinatário dao.wallet.send.setDestinationAddress=Preencha seu endereço de destino dao.wallet.send.send=Enviar fundos BSQ dao.wallet.send.sendBtc=Enviar fundos BTC dao.wallet.send.sendFunds.headline=Confirmar solicitação de retirada. -dao.wallet.send.sendFunds.details=Enviando: {0}\nPara o endereço: {1}\nTaxa de transação: {2} ({3} satoshis/byte)\nTamanho da transação: {4} Kb\n\nO destinatário receberá: {5}\n\nTem certeza de que deseja retirar essa quantia? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=Último bloco verificado: {0} dao.wallet.chainHeightSyncing=Aguardando blocos... Verificados {0} blocos de {1} dao.wallet.tx.type=Tipo @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=Você não tem BTC suficiente para cria dao.proposal.create.missingIssuanceFunds=Você não tem BTC suficiente para criar a transação da proposta. Todas as transações de BSQ exigem uma taxa de mineração em BTC, e as transações de emissão também exigem BTC pela quantia de BSQ solicitado ({0} satoshis/BSQ).\nEm falta: {1} dao.feeTx.confirm=Confirmar transação {0} -dao.feeTx.confirm.details=Taxa de {0}: {1}\nTaxa de mineração: {2} ({3} satoshis/byte)\nTamanho da transação: {4} Kb\n\nTem certeza de que deseja publicar a transação {5}? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0} Taxa: {1}\nBTC necessário para a emissão de BSQ: {2} ({3} satoshis/BSQ)\nTaxa de mineração: {4} ({5} satoshis/byte)\nTamanho da transação: {6} Kb\n\nSe o seu pedido for aprovado, você receberá a quantia solicitada menos a taxa de proposta de 2 BSQ.\n\nTem certeza de que deseja publicar a transação de {7}?" +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=A DAO BISQ dao.news.bisqDAO.description=O modelo de governança da Bisq é assim como a exchange - descentralizado e resistente à censura. As ferramentas que tornam isso realidade são a DAO da BISQ e o token BSQ. @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=Nº de votos fechados dao.factsAndFigures.menuItem.supply=Estoque de BSQ dao.factsAndFigures.menuItem.transactions=Transações BSQ -dao.factsAndFigures.dashboard.marketPrice=Dados de mercado -dao.factsAndFigures.dashboard.price=Último preço negociado de BSQ/BTC (no Bisq) dao.factsAndFigures.dashboard.avgPrice90=Média de 90 dias BSQ/BTC dao.factsAndFigures.dashboard.avgPrice30=Média de 30 dias BSQ/BTC dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=Baixar depois displayUpdateDownloadWindow.button.ignoreDownload=Ignorar essa versão displayUpdateDownloadWindow.headline=Uma nova atualização para o Bisq está disponível! displayUpdateDownloadWindow.download.failed.headline=Erro no download -displayUpdateDownloadWindow.download.failed=Erro no Download.\nPor favor, baixe manualmente em https://bisq.network/downloads -displayUpdateDownloadWindow.installer.failed=Não foi possível determinar o instalador correto. Por favor, baixe o instalador em https://bisq.network/downloads e verifique-o manualmente -displayUpdateDownloadWindow.verify.failed=Falha durante a verificação.\nBaixe manualmente em https://bisq.network/downloads +displayUpdateDownloadWindow.download.failed=Download failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verification failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=A nova versão foi baixada com sucesso e teve a sua assinatura verificada.\n\nPara usá-la, abra a pasta de downloads, feche o programa e instale a nova versão. displayUpdateDownloadWindow.download.openDir=Abrir pasta de download @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=Pagamento da quantia negociada disputeSummaryWindow.payout.getsTradeAmount={0} BTC fica com o pagamento da negociação disputeSummaryWindow.payout.getsAll={0} BTC fica com tudo disputeSummaryWindow.payout.custom=Pagamento personalizado -disputeSummaryWindow.payout.adjustAmount=A quantia digitada excede a quantidade disponível de {0}.\nNós ajustamos este campo para o valor máximo possível. disputeSummaryWindow.payoutAmount.buyer=Quantia do pagamento do comprador disputeSummaryWindow.payoutAmount.seller=Quantia de pagamento do vendedor disputeSummaryWindow.payoutAmount.invert=Usar perdedor como publicador @@ -2055,6 +2038,7 @@ disputeSummaryWindow.addSummaryNotes=Adicionar notas de resumo disputeSummaryWindow.close.button=Fechar ticket # Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification @@ -2064,9 +2048,11 @@ disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and a disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions disputeSummaryWindow.close.closePeer=Você também precisa fechar o ticket dos parceiros de negociação! disputeSummaryWindow.close.txDetails.headline=Publicar transação de reembolso +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=Comprador recebe {0} no endereço: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=Vendedor recebe {0} no endereço: {1}\n -disputeSummaryWindow.close.txDetails=Gastando: {0}\n{1}{2}Taxa de transação: {3} ({4} satoshis/byte)\nTamanho da transação: {5} Kb\n\nTem certeza de que quer publicar essa transação? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? disputeSummaryWindow.close.noPayout.headline=Close without any payout disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? @@ -2101,6 +2087,7 @@ filterWindow.btcNode=Nós de Bitcoin filtrados (endereços + portas sep. por ví filterWindow.preventPublicBtcNetwork=Prevenir uso da rede de Bitcoin pública filterWindow.disableDao=Desativar DAO filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Versão mín. necessária para a DAO filterWindow.disableTradeBelowVersion=Versão mínima necessária para negociação filterWindow.add=Adicionar filtro @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=Selecionar transação de depósito para disputa selectDepositTxWindow.msg=A transação do depósito não foi armazenada na negociação.\nPor favor, selecione a transação multisig da sua carteira utilizada como transação de depósito na negociação que falhou.\n\nVocê pode verificar qual foi a transação abrindo a janela de detalhe de negociações (clique no ID da negociação na lista) e seguindo a saída (output) da transação de pagamento da taxa de negociação para a próxima transação onde você verá a transação de depósito multisig (o endereço começa com o número 3). Esse ID de transação deve estar visível na lista apresentada aqui. Uma vez encontrada a transação, selecione-a aqui e continue.\n\nDesculpe o transtorno, este erro deve ocorrer muito pouco e no futuro vamos procurar melhores formas de resolvê-lo. selectDepositTxWindow.select=Selecionar transação de depósito -selectBaseCurrencyWindow.headline=Seleção de mercado -selectBaseCurrencyWindow.msg=O mercado padrão selecionado é {0}.\n\nSe quiser trocá-lo para outra moeda, por favor, selecione.\nVocê também pode trocar a moeda depois, na tela \"Configurações/Rede\". -selectBaseCurrencyWindow.select=Escolher moeda de base - sendAlertMessageWindow.headline=Enviar notificação global sendAlertMessageWindow.alertMsg=Mensagem de alerta sendAlertMessageWindow.enterMsg=Digitar mensagem @@ -2232,9 +2215,8 @@ error.closedTradeWithNoDepositTx=A transação de depósito da negociação já popup.warning.walletNotInitialized=A carteira ainda não foi inicializada popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. popup.warning.wrongVersion=Você provavelmente está usando a versão incorreta do Bisq para este computador.\nA arquitetura do seu computador é: {0}.\nO binário do Bisq que você instalou é: {1}.\nPor favor, feche o programa e instale a versão correta ({2}). -popup.warning.incompatibleDB=Detectamos arquivos de base de dados incompatíveis!\n\nEsse(s) arquivo(s) de base de dados não são compatíveis com nossa base de código atual:\n{0}\n\nFizemos um backup do(s) arquivo(s) corrompido(s) e aplicamos os valores padrão a uma nova versão da base de dados.\n\nO backup está em:\n{1} /db/backup_of_corrupted_data.\n\nPor favor, verifique se você tem a última versão do Bisq instalada.\nVocê pode baixá-lo em:\nhttps://bisq.network/downloads\n\nPor favor, reinicie o programa. +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 new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application. popup.warning.startupFailed.twoInstances=O Bisq já está sendo executado. Você não pode executar duas instâncias do Bisq ao mesmo tempo. -popup.warning.cryptoTestFailed=Parece que você usa um binário auto-compilado e não seguiu as instruções de compilação publicadas em: https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSe não for este o caso, e você estiver usando o binário oficial do Bisq, por favor, envie um relatório de erros para a página do Github.\nErro = {0} popup.warning.tradePeriod.halfReached=Sua negociação com ID {0} chegou à metade do período máximo permitido e ainda não foi concluída.\n\nO período de negociação acaba em {1}\n\nFavor verifique o estado de sua negociação em \"Portfolio/Negociações em aberto\" para mais informações. popup.warning.tradePeriod.ended=Sua negociação com ID {0} atingiu o período máximo de negociação e não foi finalizada.\n\nO período de negociação terminou em {1}.\n\nPor favor, verifique sua negociação em "Portfolio/Negociações em aberto" para contactar o mediador. popup.warning.noTradingAccountSetup.headline=Você ainda não configurou uma conta para negociação @@ -2258,7 +2240,9 @@ popup.warning.noBsqFundsForBtcFeePayment=Sua carteira BSQ não possui fundos suf popup.warning.messageTooLong=Sua mensagem excede o tamanho máximo permitido. Favor enviá-la em várias partes ou utilizando um serviço como https://pastebin.com. popup.warning.lockedUpFunds=Você possui fundos travados em uma negociação com erro.\nSaldo travado: {0}\nEndereço da transação de depósito: {1}\nID da negociação: {2}.\n\nPor favor, abra um ticket de suporte selecionando a negociação na tela de negociações em aberto e depois pressionando "\alt+o\" ou \"option+o\". +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=transmissão de preço popup.warning.seed=semente popup.warning.mandatoryUpdate.trading=Faça o update para a última versão do Bisq. Um update obrigatório foi lançado e desabilita negociações em versões antigas. Por favor, veja o Fórum do Bisq para mais informações. @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=A transação {0} para a negociação com ID {1} popup.warning.openOfferWithInvalidMakerFeeTx=A transação de taxa de ofertante para a oferta com ID {0} é inválida.\nID da transação: {1}.\nPor favor, vá até "Configurações/Informações da rede" e ressincronize o arquivo SPV.\nPara mais informações, por favor acesse o canal #support do time da Bisq na Keybase. -popup.warning.trade.depositTxNull=A negociação com ID "{0}" ainda não possui transação de depósito.\nPor favor, reinicie o aplicativo para verificar se o problema ainda persiste.\nCaso afirmativo, por favor abra o pop-up com os detalhes da negociação clicando em seu ID. Em seguida, clique nos IDs das transações com as taxas de ofertante e tomador para visualizá-las no explorador de blocos. Uma transação que não aparece no explorador de blocos é provavelmente uma transação inválida.\n\nSe isto ocorrer, por favor informe o problema no canal #support da Bisq Keybase (https://keybase.io/team/bisq). Se sua transação de taxa de negociação for inválida, nenhum fundo saiu da sua carteira, então você pode mover a negociação para as negociações com erro e ressincronizar o arquivo SPV para que seus fundos sejam exibidos novamente (veja abaixo).\n\nSe sua transação de taxa de negociação for válida, a quantia da taxa foi perdida e você pode solicitar o reembolso no repositório de suporte no GitHub (https://github.com/bisq-network/support/issues).\nEm ambos os casos, por favor ressincronize o arquivo SPV na tela "Configurações/Informações da rede" para remover quaisquer problemas remanescentes em sua carteira! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Mover para negociações com erro -popup.warning.trade.depositTxNull.shutDown=Desligar Bisq - popup.info.securityDepositInfo=Para garantir que ambas as partes sigam o protocolo de negociação, tanto o vendedor quanto o comprador precisam fazer um depósito de segurança.\n\nEste depósito permanecerá em sua carteira local até que a negociação seja concluída com sucesso. Depois, ele será devolvido para você.\n\nAtenção: se você está criando uma nova oferta, é necessário que você mantenha o programa aberto, para que outro usuário possa aceitar a sua oferta. Para manter suas ofertas online, mantenha o Bisq sempre aberto e conectado à internet (por exemplo: verifique-se de que as funções de economia de energia do seu computador estão desativadas). popup.info.cashDepositInfo=Certifique-se de que você possui uma agência bancária em sua região para poder fazer o depósito em dinheiro.\nO ID (BIC/SWIFT) do banco do vendedor é: {0}. popup.info.cashDepositInfo.confirm=Eu confirmo que posso fazer o depósito popup.info.shutDownWithOpenOffers=O Bisq está desligando, mas há ofertas abertas.\n\nEstas ofertas não ficarão disponíveis na rede P2P enquanto o Bisq estiver desligado, mas elas serão republicadas na rede assim que você reiniciar o programa.\n\nPara manter suas ofertas online, mantenha o Bisq aberto e certifique-se de que o seu computador continua online (ex: certifique-se de que o computador não está entrando em modo de hibernação). -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=Notificação privada importante! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=Atenção para a negociação com ID {0} popup.info.multiplePaymentAccounts.headline=Múltiplas contas de pagamento disponíveis popup.info.multiplePaymentAccounts.msg=Você tem várias contas de pagamento disponíveis para esta oferta. Por favor, verifique se você escolheu a correta. -popup.news.launch.headline=Duas Atualizações Importantes -popup.news.launch.accountSigning.headline=ASSINATURA DE CONTAS -popup.news.launch.accountSigning.description=Aumente o limite de 0.01 BTC de negociações em moeda nacional comprando BTC de um par que seja assinado. -popup.news.launch.ntp.headline=NOVO PROTOCOLO DE NEGOCIAÇÕES -popup.news.launch.ntp.description=O novo sistema de resolução de disputa em 2-níveis torna a Bisq mais segura, escalável e resistente à censura. - popup.accountSigning.selectAccounts.headline=Selecionar contas de pagamento popup.accountSigning.selectAccounts.description=Baseado no método de pagamento e ponto no tempo, todas as contas de pagamento que estiverem ligadas a um disputa em que o pagamento ocorreu em favor do comprador serão selecionadas para que você assine-as. popup.accountSigning.selectAccounts.signAll=Assinar todas as contas de pagamento @@ -2324,7 +2297,7 @@ popup.accountSigning.signAccounts.ECKey.error=Chave ECKey de árbitro errada. popup.accountSigning.success.headline=Parabéns popup.accountSigning.success.description=Todas as {0} contas de pagamento foram assinadas com sucesso! -popup.accountSigning.generalInformation=Você encontra o status de assinatura de todas as suas contas na sessão de contas.\n\nPara mais informação, por favor visite https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=Uma de suas contas de pagamento foi verificada e assinada por um árbitro. Ao negociar com essa conta você automaticamente assinará a conta de seu par após uma negociação bem succedida.\n\n{0} popup.accountSigning.signedByPeer=Uma de suas contas de pagamento foi verificada e assinada por um par de negociação. Seu limite de negociação inicial será aumentado e você poderá assinar outras contas em {0} dias.\n\n{1} popup.accountSigning.peerLimitLifted=O limite inicial para uma de suas contas acaba de ser aumentado. @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=Signing completed popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: a rede de exchange decentralizada de bitcoin # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=Contas de negociação salvas na pasta:\n{0} guiUtil.accountExport.noAccountSetup=Você não tem contas de negociação para exportar. @@ -2463,6 +2435,7 @@ navigation.portfolio.pending=\"Portfolio/Negociações em aberto\" navigation.portfolio.closedTrades=\"Portfólio/Histórico\" navigation.funds.depositFunds=\"Fundos/Receber fundos\" navigation.settings.preferences=\"Configurações/Preferências\" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"Fundos/Transações\" navigation.support=\"Suporte\" navigation.dao.wallet.receive=\"DAO/Carteira BSQ/Receber\" @@ -2525,11 +2498,11 @@ password.deriveKey=Derivando chave a partir da senha password.walletDecrypted=A carteira foi decifrada com sucesso e a proteção por senha removida password.wrongPw=Você digitou a senha incorreta.\n\nFavor tentar novamente, verificando com cuidado erros de digitação ou ortografia. password.walletEncrypted=A carteira foi encriptada e a proteção por senha foi ativada com sucesso. -password.walletEncryptionFailed=A senha da carteira não pôde ser definida. Você pode ter importado palavras-semente que não correspondem à base de dados da carteira. Por favor, entre em contato com os desenvolvedores no Fórum Bisq. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=As 2 senhas inseridas não são iguais. password.forgotPassword=Esqueceu a senha? -password.backupReminder=Ao definir uma senha para a carteira, todos os backups criados automaticamente a partir da carteira não encriptada serão apagados.\n\nAntes de definir uma senha, é altamente recomendável que você faça um backup da pasta do Bisq e anote a semente da carteira em um papel. -password.backupWasDone=Eu já fiz um backup +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=Semente da carteira seed.enterSeedWords=Insira a semente da carteira @@ -2537,7 +2510,7 @@ seed.date=Data da carteira seed.restore.title=Recuperar carteira a partir das palavras semente seed.restore=Recuperar carteira seed.creationDate=Criada em -seed.warn.walletNotEmpty.msg=Sua carteira do Bitcoin não está vazia.\n\nVocê deve esvaziar esta carteira antes de tentar restaurar uma mais antiga, já que misturar as carteiras pode levar à backups inválidos.\n\nPor favor, finalize suas negociações, feche todas as suas ofertas abertas e vá para a seção Fundos para sacar seus bitcoins.\nCaso você não consiga acessar seus bitcoins, você pode usar a ferramenta de emergência para esvaziar a carteira.\nPara abrir essa ferramenta de emergência, pressione \"alt + e\" ou \"option + e\". +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=Desejo recuperar mesmo assim seed.warn.walletNotEmpty.emptyWallet=Esvaziarei as carteiras primeiro seed.warn.notEncryptedAnymore=Suas carteiras estão encriptadas.\n\nApós a restauração, as carteiras não estarão mais encriptadas e você deverá definir uma nova senha.\n\nDeseja continuar? @@ -2578,12 +2551,11 @@ payment.altcoin.address=Endereço altcoin payment.altcoin.tradeInstantCheckbox=Negócio instantâneo (dentro de 1 hora) com esta Altcoin payment.altcoin.tradeInstant.popup=Para negociação instantânea, é necessário que os dois pares de negociação estejam online para concluir a negociação em menos de 1 hora.\n\nSe você tem ofertas abertas e você não está disponível, por favor desative essas ofertas na tela 'Portfolio'. payment.altcoin=Altcoin -payment.select.altcoin=Selecionar ou buscar altcoin +payment.select.altcoin=Select or search Altcoin payment.secret=Pergunta secreta payment.answer=Resposta payment.wallet=ID da carteira payment.uphold.accountId=Nome de usuário, e-mail ou nº de telefone -payment.cashApp.cashTag=$Cashtag: payment.moneyBeam.accountId=E-mail ou nº de telefone payment.venmo.venmoUserName=Nome do usuário do Venmo payment.popmoney.accountId=E-mail ou nº de telefone @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=ID de cidadão/ID de impostos ou nº de telefone payment.supportedCurrencies=Moedas disponíveis payment.limitations=Limitações payment.salt=Sal para verificação da idade da conta -payment.error.noHexSalt=O sal precisa estar em formato hexadecimal.\nO campo sal só deve ser editado se você quiser transferir o sal de uma conta antiga para manter a idade de conta. A idade da conta é verificada utilizando o sal da conta e os dados identificadores da conta (por exemplo, o IBAN). +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=Aceitar negociações destes países do Euro payment.accept.nonEuro=Aceitar negociações desses países fora do Euro payment.accepted.countries=Países aceitos @@ -2625,31 +2597,33 @@ payment.accountType=Tipo de conta payment.checking=Conta Corrente payment.savings=Poupança payment.personalId=Identificação pessoal -payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle:\nhttps://www.zellepay.com/get-started\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. +payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Bisq to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved. -payment.moneyGram.info=Ao usar o MoneyGram, o comprador de BTC deve enviar o Número de Autorização e uma foto do recibo por e-mail ao vendedor de BTC. O recibo deve mostrar claramente o nome completo do vendedor, o país, o estado e a quantia. O comprador visualizará o e-mail do vendedor no processo de negócio. -payment.westernUnion.info=Ao usar o Western Union, o comprador do BTC deve enviar o MTCN (número de rastreamento) e uma foto do recibo por e-mail ao vendedor de BTC. O recibo deve mostrar claramente o nome completo do vendedor, a cidade, o país e a quantia. O comprador visualizará o e-mail do vendedor no processo de negócio. +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=Ao usar o HalCash, o comprador de BTC precisa enviar ao vendedor de BTC o código HalCash através de uma mensagem de texto do seu telefone.\n\nPor favor, certifique-se de não exceder a quantia máxima que seu banco lhe permite enviar com o HalCash. O valor mínimo de saque é de 10 euros e valor máximo é de 600 EUR. Para saques repetidos é de 3000 euros por destinatário por dia e 6000 euros por destinatário por mês. Por favor confirme esses limites com seu banco para ter certeza de que eles usam os mesmos limites mencionados aqui.\n\nO valor de saque deve ser um múltiplo de 10 euros, pois você não pode sacar notas diferentes de uma ATM. Esse valor em BTC será ajustado na telas de criar e aceitar ofertas para que a quantia de EUR esteja correta. Você não pode usar o preço com base no mercado, pois o valor do EUR estaria mudando com a variação dos preços.\n\nEm caso de disputa, o comprador de BTC precisa fornecer a prova de que enviou o EUR. -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\nTo mitigate this risk, Bisq sets per-trade limits based on two factors:\n\n1. The estimated level of chargeback risk for the payment method used\n2. The age of your account for that payment method\n\nThe account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\n● During the 1st month, your per-trade limit will be {0}\n● During the 2nd month, your per-trade limit will be {1}\n● After the 2nd month, your per-trade limit will be {2}\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. -payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase with account age.\n\nSee more:\nhttps://bisq.wiki/Account_limits\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=Certifique-se de que o seu banco permite a realização de depósitos em espécie na conta de terceiros. payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=Update Revolut account payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. payment.f2f.contact=Informações para contato -payment.f2f.contact.prompt=Como prefere ser contatado pelo seu parceiro de negociação? (e-mail, telefone...) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=Cidade para se encontrar 'Cara-a-cara' payment.f2f.city.prompt=A cidade será exibida na oferta payment.f2f.optionalExtra=Informações adicionais opcionais payment.f2f.extra=Informações adicionais payment.f2f.extra.prompt=O ofertante pode definir 'termos e condições' ou adicionar informação de um contato público. Este será exibido junto da oferta. -payment.f2f.info=Negociações 'cara-a-cara' possuem regras diferentes e também trazem riscos diferentes das transações online.\n\nAs principais diferenças são:\n ● Os parceiros de negociação precisam trocar informações sobre o local de encontro e o horário usando seus dados de contato fornecidos.\n● Os parceiros de negociação precisam levar seus laptops e fazer as confirmações de 'pagamento enviado' e 'pagamento recebido' no local de encontro.\n● Se o ofertante tiver 'termos e condições' especiais, ele precisa informá-los no campo "Informações adicionais" na conta.\n● Ao tomar uma oferta, o tomador aceita os 'termos e condições' estabelecidos pelo ofertante.\n● Em caso de disputa, o mediador ou árbitro não poderão ajudar muito, visto que é muito difícil obter evidências que provam o que de fato ocorreu no encontro. Nestes casos, os fundos em BTC podem ficar travados indefinidamente ou até que os parceiros de negociação cheguem a algum acordo.\n\nPara certificar que você compreende totalmente as diferenças nas negociações 'Cara-a-Cara', por favor leia as instruções e recomendações em: 'https://docs.bisq.network/trading-rules.html#f2f-trading +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=Abrir site payment.f2f.offerbook.tooltip.countryAndCity=País e cidade: {0} / {1} payment.f2f.offerbook.tooltip.extra=Informações adicionais: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=Banco payment.japan.branch=Ramo payment.japan.account=Conta payment.japan.recipient=Nome +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=Face a face (pessoalmente) JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=Bancos nacionais @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Instant Altcoins # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=Número 0 não é permitido validation.negative=Valores negativos não são permitidos. validation.fiat.toSmall=Quantia menor do que a mínima permitida. validation.fiat.toLarge=Quantia maior do que a máxima permitida. -validation.btc.fraction=A quantia resulta em um valor de bitcoin menor do que a unidade mínima (satoshi). +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=Quantia máx. permitida: {0} validation.btc.toSmall=Quantia mín. permitida: {0} -validation.securityDeposit.toSmall=Quantia mín. permitida: {0} -validation.passwordTooShort=A senha inserida é muito curta. É necessário conter no mínimo 8 caracteres +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=A senha inserida é muito longa. Não pode ser maior do que 50 caracteres validation.sortCodeNumber={0} deve consistir de {1} números. validation.sortCodeChars={0} deve consistir de {1} caracteres. @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} deve consistir de {1} números. #new validation.invalidInput=Entrada inválida: {0} validation.accountNrFormat=O número da conta deve estar no formato: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=Validação do endereço falhou pois este não é compatível com a estrutura de um endereço {0}. -validation.altcoin.ltz.zAddressesNotSupported=Endereços LTZ precisam de começar com L. Endereços começando com z não são suportados. -validation.altcoin.zAddressesNotSupported=Endereços ZEC precisam iniciar com t. Endereços iniciando com z não são suportados. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=Endereço não é um endereço {0} válido! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Endereços nativos de Segwit (começando com "lq") não são suportados. -validation.bic.invalidLength=Comprimento da entrada não é 8 ou 11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=Banco e código de país devem ser letras validation.bic.invalidLocationCode=BIC contém código de localização inválido validation.bic.invalidBranchCode=BIC contém código da agência inválido validation.bic.sepaRevolutBic=Contas Revolut Sepa não são suportadas. -validation.btc.invalidFormat=Formato inválido do endereço Bitcoin. -validation.bsq.invalidFormat=Formato inválido do endereço BSQ. +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=Endereço inválido validation.iban.invalidCountryCode=Código de país inválido validation.iban.checkSumNotNumeric=Código verificador deve ser numérico validation.iban.nonNumericChars=Caractere não alfanumérico detectado validation.iban.checkSumInvalid=Código de verificação IBAN é inválido -validation.iban.invalidLength=Número deve ter entre 15 e 34 caracteres. +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=Código de área não é canadense. -validation.interacETransfer.invalidPhone=Número de telefone inválido e não é um endereço de email +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=Deve conter somente letras, números, espaços e/ou os símbolos ' _ , . ? - validation.interacETransfer.invalidAnswer=Deve ser uma palavra e conter apenas letras, números e/ou o símbolo - validation.inputTooLarge=Não deve ser maior do que {0} validation.inputTooSmall=Deve ser maior do que {0} validation.inputToBeAtLeast=O input tem de ser pelo menos {0} -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=Comprimento deve ser entre {0} e {1} validation.pattern=Input deve ser no formato: {0} validation.noHexString=O input não está no formato hexadecimal @@ -2859,7 +2852,7 @@ validation.numberFormatException=Exceção do formato do número {0} validation.mustNotBeNegative=O input não deve ser negativo validation.phone.missingCountryCode=Precisa do código do país com duas letras para validar o número de telefone validation.phone.invalidCharacters=O número de telefone {0} contém caracteres inválidos. -validation.phone.insufficientDigits=Não há dígitos suficientes em {0} para ser um telefone válido -validation.phone.tooManyDigits=Digitos de mais em {0} para ser um telefone válido -validation.phone.invalidDialingCode=DDI no número {0} é inválido para o país {1}. O DDI correto é {2}. +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=Precisa ser uma lista delimitada por vírgulas de endereços válidos diff --git a/core/src/main/resources/i18n/displayStrings_pt.properties b/core/src/main/resources/i18n/displayStrings_pt.properties index 3885e9f10e..19fb55f4bf 100644 --- a/core/src/main/resources/i18n/displayStrings_pt.properties +++ b/core/src/main/resources/i18n/displayStrings_pt.properties @@ -35,7 +35,7 @@ shared.no=Não shared.iUnderstand=Eu compreendo shared.na=N/D shared.shutDown=Desligar -shared.reportBug=Report bug on GitHub +shared.reportBug=Reportar erro no GitHub shared.buyBitcoin=Comprar bitcoin shared.sellBitcoin=Vender bitcoin shared.buyCurrency=Comprar {0} @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=oferta shared.multipleOffers=ofertas shared.Offer=Oferta +shared.offerVolumeCode={0} Offer Volume shared.openOffers=ofertas abertas shared.trade=negócio shared.trades=negócios @@ -94,7 +95,7 @@ shared.BTCMinMax=BTC (mín - máx) shared.removeOffer=Remover oferta shared.dontRemoveOffer=Não remover a oferta shared.editOffer=Editar oferta -shared.openLargeQRWindow=Open large QR code window +shared.openLargeQRWindow=Abrir QR-Code em janela grande shared.tradingAccount=Conta de negociação shared.faq=Visit FAQ page shared.yesCancel=Sim, cancelar @@ -122,7 +123,8 @@ shared.noDateAvailable=Sem dada disponível shared.noDetailsAvailable=Sem detalhes disponíveis shared.notUsedYet=Ainda não usado shared.date=Data -shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n shared.copyToClipboard=Copiar para área de transferência shared.language=Idioma @@ -188,7 +190,6 @@ shared.tradeWalletAddress=Endereço da carteira do negócio shared.tradeWalletBalance=Saldo da carteira de negócio shared.makerTxFee=Ofertante: {0} shared.takerTxFee=Aceitador: {0} -shared.securityDepositBox.description=Depósito de segurança para BTC {0} shared.iConfirm=Eu confirmo shared.tradingFeeInBsqInfo=equivalente à {0} utilizado como taxa de negociação shared.openURL=Abrir {0} @@ -237,8 +238,6 @@ mainView.menu.settings=Definições mainView.menu.account=Conta mainView.menu.dao=OAD -mainView.marketPrice.provider=Preço por -mainView.marketPrice.label=Preço de mercado mainView.marketPriceWithProvider.label=Preço de mercado por {0} mainView.marketPrice.bisqInternalPrice=Preço do último negócio do Bisq mainView.marketPrice.tooltip.bisqInternalPrice=Não há preço de mercado de fornecedores de feed de preço externos disponíveis.\nO preço exibido é o mais recente preço de negócio do Bisq para essa moeda. @@ -251,14 +250,15 @@ mainView.balance.locked.short=Bloqueado mainView.footer.usingTor=(usando Tor) mainView.footer.localhostBitcoinNode=(localhost) -mainView.footer.btcInfo=Pares na rede Bitcoin: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=Conectando à rede Bitcoin mainView.footer.bsqInfo.synchronizing=/ Sincronizando a OAD mainView.footer.btcInfo.synchronizingWith=Sincronizando com -mainView.footer.btcInfo.synchronizedWith=Sincronizado com +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=Conectando à mainView.footer.btcInfo.connectionFailed=Connection failed to -mainView.footer.p2pInfo=Pares na rede do Bisq: {0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=Nó completo da OAD mainView.bootstrapState.connectionToTorNetwork=(1/4) Conectando à rede Tor.... @@ -292,7 +292,6 @@ market.tabs.spread=Detalhes market.tabs.trades=Negócios # OfferBookChartView -market.offerBook.chart.title=Livro de ofertas para {0} market.offerBook.buyAltcoin=Eu quero comprar {0} (vender {1}) market.offerBook.sellAltcoin=Eu quero vender {0} (comprar {1}) market.offerBook.buyWithFiat=Comprar {0} @@ -382,7 +381,7 @@ offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you hav offerbook.warning.counterpartyTradeRestrictions=Esta oferta não pode ser aceite devido às restrições de negócio da contraparte -offerbook.warning.newVersionAnnouncement=Com esta versão do software, os pares de negociação podem verificar e assinar as contas de pagamento uns dos outros para criar uma rede de contas de pagamento confiáveis.\n\nApós a negociação bem-sucedida com um par com uma conta de pagamento verificada, a sua conta de pagamento será assinada e os limites de negociação serão aumentados após um determinado intervalo de tempo (a duração desse intervalo é baseada no método de verificação).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=A quantia de negócio é limitada à {0} devido à restrições de segurança baseadas nos seguinte critérios:\n- A conta do comprador não foi assinada por um árbitro ou um par\n- O tempo decorrido desde a assinatura da conta do comprador não é de pelo menos 30 dias\n- O método de pagamento para esta oferta é considerado arriscado para estornos bancários\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=A quantia de negócio é limitada à {0} devido à restrições de segurança baseadas nos seguinte critérios:\n- A sua conta não foi assinada por um árbitro ou um par\n- O tempo decorrido desde a assinatura da sua conta não é de pelo menos 30 dias\n- O método de pagamento para esta oferta é considerado arriscado para estornos bancários\n\n{1} @@ -393,8 +392,7 @@ offerbook.warning.offerBlocked=Essa oferta foi bloqueada pelos desenvolvedores d offerbook.warning.currencyBanned=A moeda usada nessa oferta foi bloqueada pelos desenvolvedores do Bisq.\nPor favor, visite o Fórum Bisq para mais informações. offerbook.warning.paymentMethodBanned=O método de pagamento usado nessa oferta foi bloqueado pelos desenvolvedores do Bisq.\nPor favor, visite o Fórum Bisq para mais informações. offerbook.warning.nodeBlocked=O endereço onion desse negociador foi bloqueado pelos desenvolvedores do Bisq.\nProvavelmente, há um erro não tratado causando problemas ao aceitar ofertas desse negociador. -offerbook.warning.requireUpdateToNewVersion=A sua versão do Bisq deixou de ser compatível para negociação.\nAtualize para a versão mais recente do Bisq em https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=A sua conta de pagamento foi criada há {0}. O seu limite de negócio é baseado na idade da conta e não é suficiente para essa oferta.\n\nO seu limite de negócio é de: {1}\nA mín. quantia de negócio da oferta é de: {2}.\n\nVocê não pode aceitar essa oferta agora. Assim que a sua conta tiver mais de 2 meses esta restrição será removida. +offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. offerbook.info.sellAtMarketPrice=Venderá ao preço de mercado (atualizado à cada minuto). @@ -445,7 +443,6 @@ createOffer.alreadyFunded=Você já tinha financiado essa oferta.\nSeus fundos f createOffer.createOfferFundWalletInfo.headline=Financiar sua oferta # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- Quantia de negócio: {0} \n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} e {1} createOffer.createOfferFundWalletInfo.msg=Você precisa depositar {0} para esta oferta.\n\nEsses fundos estão reservados na sua carteira local e serão bloqueados no endereço de depósito multi-assinatura assim que alguém aceitar a sua oferta.\n\nA quantia é a soma de:\n{1} - Seu depósito de segurança: {2}\n- Taxa de negociação: {3}\n- Taxa de mineração: {4}\n\nVocê pode escolher entre duas opções ao financiar o seu negócio:\n- Use sua carteira Bisq (conveniente, mas as transações podem ser conectadas) OU\n- Transferência de uma carteira externa (potencialmente mais privada)\n\nVocê verá todas as opções de financiamento e detalhes depois de fechar este popup. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=Não pode aceitar a oferta porque o ofertante es takeOffer.warning.connectionToPeerLost=Perdeu a conexão ao ofertante.\nEle pode ter ficado offline ou fechado a conexão consigo devido à demasiadas conexões abertas.\n\nSe ainda consegue ver a sua oferta no livro de ofertas pode tentar aceitar a oferta de novo. takeOffer.error.noFundsLost=\n\nAinda não saíram nenhuns fundos da sua carteira.\nPor favor, tente reiniciar o seu programa e verifique sua conexão de rede para ver se você pode resolver o problema. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nA transação de depósito já está publicada.\nPor favor, tente reiniciar o seu programa e verifique sua conexão de rede para ver se você pode resolver o problema.\nSe o problema persistir, por favor contacte os desenvolvedores para obter apoio. takeOffer.error.payoutPublished=\n\nA transação de depósito já está publicada.\nPor favor, tente reiniciar o seu programa e verifique sua conexão de rede para ver se você pode resolver o problema.\nSe o problema persistir, por favor contacte os desenvolvedores para obter apoio. @@ -543,7 +541,7 @@ portfolio.tab.history=Histórico portfolio.tab.failed=Falhou portfolio.tab.editOpenOffer=Editar oferta -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance.\n\nError message: {0} portfolio.pending.step1.waitForConf=Esperando confirmação da blockchain portfolio.pending.step2_buyer.startPayment=Iniciar pagamento @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=REQUERIMENTO IMPORTANTE:\nDepois d # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=Por favor pague {0} ao vendedor de BTC usando Western Union.\n\n portfolio.pending.step2_buyer.westernUnion.extra=REQUISITO IMPORTANTE:\nDepois de ter feito o pagamento, envie o MTCN (número de rastreamento) e uma foto do recibo por e-mail para o vendedor de BTC.\nO recibo deve mostrar claramente o nome completo do vendedor, a cidade, o país e a quantia. O e-mail do vendedor é: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=Por favor envie {0} por \"US Postal Money Order\" para o vendedor de BTC.\n\n @@ -636,7 +636,7 @@ portfolio.pending.step2_buyer.confirmStart.headline=Confirme que você iniciou o portfolio.pending.step2_buyer.confirmStart.msg=Você iniciou o pagamento de {0} para o seu parceiro de negociação? portfolio.pending.step2_buyer.confirmStart.yes=Sim, iniciei o pagamento portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway portfolio.pending.step2_seller.waitPayment.headline=Aguardar o pagamento @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=Informação do contacto do comp portfolio.pending.step2_seller.waitPayment.msg=A transação de depósito tem pelo menos uma confirmação da blockchain.\nVocê precisa esperar até que o comprador de BTC inicie o pagamento {0}. portfolio.pending.step2_seller.warn=O comprador do BTC ainda não efetuou o pagamento de {0}.\nVocê precisa esperar até que eles tenham iniciado o pagamento.\nSe o negócio não for concluído em {1}, o árbitro irá investigar. portfolio.pending.step2_seller.openForDispute=O comprador de BTC não iniciou o seu pagamento!\nO período máx. permitido para o negócio acabou.\nVocê pode esperar e dar mais tempo ao seu par de negociação ou entrar em contacto com o mediador para assistência. -portfolio.pending.step2_seller.refresh=Atualizar o Estado do Negócio -portfolio.pending.step2_seller.refreshInfo=Às vezes, as mensagens da rede P2P que reconhecem o pagamento não são entregues, causando falhas no negócio. Clique no botão abaixo para que o seu par reenvie a última mensagem. tradeChat.chatWindowTitle=Janela de chat para o negócio com o ID ''{0}'' tradeChat.openChat=Abrir janela de chat tradeChat.rules=Você pode comunicar com o seu par de negociação para resolver problemas com este negócio.\nNão é obrigatório responder no chat.\nSe algum negociante infringir alguma das regras abaixo, abra uma disputa e reporte-o ao mediador ou ao árbitro.\n\nRegras do chat:\n\t● Não envie nenhum link (risco de malware). Você pode enviar o ID da transação e o nome de um explorador de blocos.\n\t● Não envie as suas palavras-semente, chaves privadas, senhas ou outra informação sensitiva!\n\t● Não encoraje negócios fora do Bisq (sem segurança).\n\t● Não engaje em nenhuma forma de scams de engenharia social.\n\t● Se um par não responde e prefere não comunicar pelo chat, respeite a sua decisão.\n\t● Mantenha o âmbito da conversa limitado ao negócio. Este chat não é um substituto para o messenger ou uma caixa para trolls.\n\t● Mantenha a conversa amigável e respeitosa. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=Como o pagamento é feito via Depósito em D portfolio.pending.step3_seller.moneyGram=O comprador deve enviar o Número de Autorização e uma foto do recibo por e-mail.\nO recibo deve mostrar claramente o seu nome completo, país, estado e a quantia. Por favor verifique seu e-mail se recebeu o Número de Autorização.\n\nDepois de fechar esse pop-up, verá o nome e o endereço do comprador do BTC para levantar o dinheiro da MoneyGram.\n\nConfirme apenas o recebimento depois de ter conseguido o dinheiro com sucesso! portfolio.pending.step3_seller.westernUnion=O comprador deve enviar-lhe o MTCN (número de rastreamento) e uma foto do recibo por e-mail.\nO recibo deve mostrar claramente seu nome completo, cidade, país e a quantia Por favor verifique no seu e-mail se você recebeu o MTCN.\n\nDepois de fechar esse pop-up, você verá o nome e endereço do comprador de BTC para levantar o dinheiro da Western Union.\n\nConfirme apenas o recebimento depois de ter conseguido o dinheiro com sucesso! portfolio.pending.step3_seller.halCash=O comprador deve-lhe enviar o código HalCash como mensagem de texto. Além disso, você receberá uma mensagem do HalCash com as informações necessárias para retirar o EUR de uma ATM que suporte o HalCash.\n\nDepois de levantar o dinheiro na ATM, confirme aqui o recibo do pagamento! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nVerifique também se o nome do remetente especificado no contrato de negócio corresponde ao nome que aparece no seu extrato bancário:\nNome do remetente, por contrato de negócio: {0}\n\nSe os nomes não forem exatamente iguais, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=não confirme a recepção do pagamento. Em vez disso, abra uma disputa pressionando \"alt + o\" ou \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=Confirmar recibo de pagamento portfolio.pending.step3_seller.amountToReceive=Quantia a receber @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=Você recebeu o pagamento portfolio.pending.step3_seller.onPaymentReceived.fiat=O ID do negócio (\ "razão para pagamento \"texto) da transação é: \ "{0} \"\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Verifique também se o nome do remetente especificado no contrato de negócio corresponde ao nome que aparece no seu extrato bancário:\nNome do remetente, por contrato de negócio: {0}\n\nSe os nomes não forem exatamente iguais, não confirme a recepção do pagamento. Em vez disso, abra uma disputa pressionando \"alt + o\" ou \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.note=Observe que, assim que você confirmar a recepção, o valor da transação bloqueada será liberado para o comprador de BTC e o depósito de segurança será reembolsado.\n\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Confirme que recebeu o pagamento portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Sim, eu recebi o pagamento @@ -746,7 +747,7 @@ portfolio.pending.tradePeriodInfo=Após a primeira confirmação da blockchain, portfolio.pending.tradePeriodWarning=Se o período é excedido ambos os negociadores podem abrir disputa. portfolio.pending.tradeNotCompleted=Negócio não completo à tempo (até {0}) portfolio.pending.tradeProcess=Processo de negócio -portfolio.pending.openAgainDispute.msg=Se você não tiver certeza de que a mensagem para o mediador ou o àrbitro foi enviada (ex: se você não recebeu uma resposta depois de 1 dia) sinta-se à vontade para abrir uma nova disputa com Cmd/Ctrl+o. Você também pode pedir ajuda adicional no fórum do Bisq em https://bisq.community. +portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=Abrir disputa novamente portfolio.pending.openSupportTicket.headline=Abrir bilhete de apoio portfolio.pending.openSupportTicket.msg=Por favor, use esta função apenas em casos de emergência, se você não vir o botão \"Abrir apoio\" ou \"Abrir disputa\".\n\nQuando você abre um bilhete de apoio, o negócio será interrompido e tratado por um mediador ou árbitro. @@ -757,14 +758,9 @@ portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. portfolio.pending.error.depositTxNotConfirmed=A transação de depósito não foi confirmada. Você pode abrir uma disputa de arbitragem com uma transação de depósito não confirmada. Por favor espere até que seja confirmada ou vá à \"Definições/Informação da Rede\" e re-sincronize o ficheiro SPV.\n\nPara mais ajuda por favor contacte o canal de apoio do Bisq na equipa Keybase do Bisq. -portfolio.pending.notification=Notificação - portfolio.pending.support.headline.getHelp=Precisa de ajuda? portfolio.pending.support.text.getHelp=Se tiver algum problema você pode tentar contactar o par de negociação no chat do negócio or perguntar à comunidade do Bisq em https://bisq.community. Se o seu problema ainda não for resolvido, você pode pedir mais ajuda à um mediador. -portfolio.pending.support.text.getHelp.arbitrator=Se tiver algum problema você pode tentar contactar o par de negociação no chat do negócio or perguntar à comunidade do Bisq em https://bisq.community. Se o seu problema ainda não for resolvido, você pode pedir mais ajuda à um árbitro. portfolio.pending.support.button.getHelp=Open Trader Chat -portfolio.pending.support.popup.info=Se o seu problema com o negócio continua sem resolução, você pode abrir um bilhete de apoio para pedir ajuda de um mediador. Se você não recebeu o pagamento por favor espere até ao final do período de negócio.\n\nTem certeza de que quer abrir um bilhete de apoio? -portfolio.pending.support.popup.button=Abrir bilhete de apoio portfolio.pending.support.headline.halfPeriodOver=Verificar o pagamento portfolio.pending.support.headline.periodOver=O período de negócio acabou @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Mediação solicitada portfolio.pending.refundRequested=Reembolso pedido portfolio.pending.openSupport=Abrir bilhete de apoio portfolio.pending.supportTicketOpened=Bilhete de apoio aberto -portfolio.pending.requestSupport=Solicitar apoio -portfolio.pending.error.requestSupport=Por favor reporte o problema ao seu mediador ou árbitro.\n\nEles passarão a informação aos desenvolvedores para investigarem o problema.\nDepois que o problema for analisado você receberá os seus fundos bloqueados. portfolio.pending.communicateWithArbitrator=Por favor comunique no ecrã \"Apoio\" com o árbitro. portfolio.pending.communicateWithMediator=Por favor comunique com o mediador no ecrã \"Apoio\". -portfolio.pending.supportTicketOpenedMyUser=Você já abriu um bilhete de apoio.\n{0} portfolio.pending.disputeOpenedMyUser=Você já abriu uma disputa.\n{0} portfolio.pending.disputeOpenedByPeer=O seu par de negociação abriu uma disputa\n{0} -portfolio.pending.supportTicketOpenedByPeer=O seu par de negociação abriu um bilhete de apoio.\n{0} portfolio.pending.noReceiverAddressDefined=Nenhum endereço de recipiente definido -portfolio.pending.removeFailedTrade=Este é um negócio falido? Se sim, você gostaria de fechá-lo manualmente, para que não apareça mais como um negócio aberto? portfolio.pending.mediationResult.headline=Pagamento sugerido pela mediação portfolio.pending.mediationResult.info.noneAccepted=Conclua o negócio aceitando a sugestão do mediador para o pagamento do negócio. @@ -790,18 +781,18 @@ portfolio.pending.mediationResult.info.peerAccepted=O seu par de negócio aceito portfolio.pending.mediationResult.button=Ver a resolução proposta portfolio.pending.mediationResult.popup.headline=Resultado da mediação para o negócio com o ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=O seu par de negócio aceitou a sugestão do mediador para o negócio {0} -portfolio.pending.mediationResult.popup.info=O mediador sugeriu o seguinte pagamento:\nVocê recebeu: {0}\nO seu par de negociação recebe: {1}\n\nVocê pode aceitar ou rejeitar este pagamento sugerido.\n\nAo aceitar, você assina a transação do pagamento sugerido. Se o seu par de negociação também aceitar e assinar, o pagamento será completado e o negócio será fechado.\n\nSe ambos rejeitarem a sugestão, você terá que esperar até {2} (bloco {3}) para abrir uma segunda ronda de disputa com um árbitro que investigará o caso novamente e fará um pagamento baseado nas suas descobertas .\n\nO árbitro pode cobrar uma pequena taxa (máximo: o depósito de segurança do negociador) como compensação para o seu trabalho. Ter ambos os negociadores concordando com a sugestão do mediador é o caminho preferido - solicitar arbitragem é para circunstâncias excepcionais, tais como se um negociador estiver seguro de que o mediador não fez uma sugestão de pagamento justa (ou se o seu par estiver inacessível).\n\nPara mais detalhes sobre o novo modelo de arbitragem:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nOnce the lock time is over on {0} (block {1}), you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Rejeitar e solicitar arbitragem portfolio.pending.mediationResult.popup.alreadyAccepted=Você já aceitou portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. +portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nFeel free to move this trade to failed trades. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. @@ -839,6 +830,7 @@ funds.deposit.fundWallet=Financiar sua carteira funds.deposit.withdrawFromWallet=Enviar fundos da carteira funds.deposit.amount=Quantia em BTC (opcional) funds.deposit.generateAddress=Gerar um endereço novo +funds.deposit.generateAddressSegwit=Native segwit format (Bech32) funds.deposit.selectUnused=Favor selecione um endereço não utilizado da tabela acima ao invés de gerar um novo. funds.withdrawal.arbitrationFee=Taxa de arbitragem @@ -986,6 +978,7 @@ setting.preferences.general=Preferências gerais setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=Máx. desvio do preço de mercado +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=Evite o modo espera setting.preferences.autoConfirmXMR=XMR auto-confirm setting.preferences.autoConfirmEnabled=Enabled @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Required confirmations setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) setting.preferences.deviationToLarge=Valores acima de {0}% não são permitidos. -setting.preferences.txFee=Taxa de transação de levantamento (satoshis/byte): +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=Usar valor personalizado -setting.preferences.txFeeMin=Taxa de transação tem de ser pelo menos {0} satoshi/byte -setting.preferences.txFeeTooLarge=O seu input é acima de qualquer valor razoável (>5000 satoshi/byte). A taxa de transação normalmente fica na faixa de 50-400 satoshis/byte. +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Pares ignorados [endereço onion:porta] -setting.preferences.refererId=ID de referência setting.preferences.ignoreDustThreshold=Mín. valor de output não-poeira -setting.preferences.refererId.prompt=ID de referência opcional setting.preferences.currenciesInList=Moedas na lista de feed de preço de mercado setting.preferences.prefCurrency=Moeda preferrida setting.preferences.displayFiat=Mostrar moedas nacionais @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=Usar animações setting.preferences.useDarkMode=Usar o modo escuro setting.preferences.sortWithNumOffers=Ordenar listas de mercado por nº de ofertas/negociações: setting.preferences.resetAllFlags=Reiniciar todos os marcadores \"Não mostrar novamente\" -setting.preferences.reset=Limpar settings.preferences.languageChange=Para aplicar a mudança de língua em todas os ecrãs requer uma reinicialização. settings.preferences.supportLanguageWarning=Em caso de disputa, por favor saiba que a mediação será tratada em {0} e a arbitragem em {1}. -settings.preferences.selectCurrencyNetwork=Selecionar rede setting.preferences.daoOptions=Opções da OAD setting.preferences.dao.resyncFromGenesis.label=Reconstruir o estado da OAD à partir da tx genesis setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources @@ -1030,9 +1019,16 @@ setting.preferences.dao.isDaoFullNode=Executar Bisq como nó completo OAD setting.preferences.dao.rpcUser=Nome de usuário de RPC setting.preferences.dao.rpcPw=Senha de RPC setting.preferences.dao.blockNotifyPort=Bloquear porta de notificação -setting.preferences.dao.fullNodeInfo=Para executar o Bisq como nó completo da OAD você precisa ter Bitcoin Core em execução local e RPC ativado. Todos os requerimentos estão documentados em '' {0} ''. +setting.preferences.dao.fullNodeInfo=Para executar o Bisq como nó completo da OAD você precisa ter Bitcoin Core em execução local e RPC ativado. Todos os requerimentos estão documentados em '' {0} ''. setting.preferences.dao.fullNodeInfo.ok=Abrir página de documentos setting.preferences.dao.fullNodeInfo.cancel=Não, eu fico com o modo nó lite +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=Nome +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=Rede Bitcoin settings.net.p2pHeader=Rede do Bisq @@ -1044,7 +1040,7 @@ settings.net.bitcoinNodesLabel=Nós de Bitcoin Core para conectar settings.net.useProvidedNodesRadio=Usar nós de Bitcoin Core providenciados settings.net.usePublicNodesRadio=Usar rede de Bitcoin pública settings.net.useCustomNodesRadio=Usar nós de Bitcoin Core personalizados -settings.net.warn.usePublicNodes=Se você usa a rede pública Bitcoin, você está exposto à um grave problema de privacidade causado pelo quebrado design e implementação do filtro bloom, que é usado para carteiras SPV como o BitcoinJ (usado no Bisq). Qualquer nó completo ao qual você está conectado pode descobrir que todos os seus endereços de carteira pertencem a uma entidade.\n\nPor favor, leia mais sobre os detalhes em: https://bisq.network/blog/privacy-in-bitsquare.\n\nTem certeza de que deseja usar os nós públicos? +settings.net.warn.usePublicNodes=If you use the public Bitcoin network you are exposed to a severe privacy problem caused by the broken bloom filter design and implementation which is used for SPV wallets like BitcoinJ (used in Bisq). Any full node you are connected to could find out that all your wallet addresses belong to one entity.\n\nPlease read more about the details at [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nAre you sure you want to use the public nodes? settings.net.warn.usePublicNodes.useProvided=Não, usar nós providenciados settings.net.warn.usePublicNodes.usePublic=Sim, usar a rede pública settings.net.warn.useCustomNodes.B2XWarning=Por favor, certifique-se de que seu nó Bitcoin é um nó confiável do Bitcoin Core!\n\nConectar-se a nós que não seguem as regras de consenso do Bitcoin Core pode corromper a sua carteira e causar problemas no processo de negócio.\n\nOs usuários que se conectam a nós que violam regras de consenso são responsáveis por qualquer dano resultante. Quaisquer disputas resultantes serão decididas em favor do outro par. Nenhum suporte técnico será dado aos usuários que ignorarem esses alertas e mecanismos de proteção! @@ -1150,16 +1146,14 @@ setting.about.shortcuts.sendPrivateNotification=Enviar notificação privada ao setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=Registo de árbitro account.tab.mediatorRegistration=Registo do Mediador account.tab.refundAgentRegistration=Registro de agente de reembolso account.tab.signing=Signing -account.tab.account=Conta account.info.headline=Bem vindo à sua conta Bisq account.info.msg=Aqui você pode adicionar contas de negociação para moedas nacionais e altcoins e criar um backup da sua carteira e dos dados da conta.\n\nUma nova carteira de Bitcoin foi criada na primeira vez que você iniciou o Bisq.\n\nÉ altamente recomendável que você anote as sua palavras-semente da carteira do Bitcoin (consulte a guia na parte superior) e considere adicionar uma senha antes do financiamento. Depósitos e retiradas de Bitcoin são gerenciados na secção \"Fundos\".\n\nNota sobre privacidade e segurança: como o Bisq é uma exchange descentralizada, todos os seus dados são mantidos no seu computador. Como não há servidores, não temos acesso às suas informações pessoais, fundos ou mesmo seu endereço IP. Dados como números de contas bancárias, endereços de altcoin e Bitcoin etc. são compartilhados apenas com seu par de negociação para realizar negociações iniciadas (no caso de uma disputa, o mediador ou o árbitro verá os mesmos dados que o seu parceiro de negociação). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=Não foi possível completar o reg account.altcoin.yourAltcoinAccounts=As suas contas de altcoins account.altcoin.popup.wallet.msg=Certifique-se de seguir os requisitos para o uso das carteiras de {0}, conforme descrito na página da web de {1}.\nO uso de carteiras de exchanges centralizadas nas quais (a) você não controla suas chaves ou (b) que não utiliza software de carteira compatível é arriscado: pode levar à perda dos fundos negociados!\nO mediador ou árbitro não é um especialista em {2} e não pode ajudar nesses casos. account.altcoin.popup.wallet.confirm=Eu entendo e confirmo que eu sei qual carteira que preciso usar. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Negociar UPX no Bisq exige que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o UPX, você precisa usar a carteira GUI oficial do uPlexa ou a carteira CLI do uPlexa com o sinalizador store-tx-info ativado (padrão em novas versões). Certifique-se de que você pode acessar a chave da tx, pois isso seria necessário em caso de disputa.\nuplexa-wallet-cli (use o comando get_tx_key)\nuplexa-wallet-gui (vá para a aba do histoórico e clique no botão (P) para prova de pagamento)\n\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- Endereço público do destinatário\n\nA falha no fornecimento dos dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso da disputa. O remetente de UPX é responsável por fornecer a verificação da transferência de UPX ao árbitro em caso de disputa.\n\nNão é necessário um ID de pagamento, apenas o endereço público normal.\nSe você não tiver certeza sobre esse processo, visite o canal de discord do uPlexa (https://discord.gg/vhdNSrV) ou o chat do Telegram do uPlexa (https://t.me/uplexaOfficial) para encontrar mais informações. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Negociar o ARQ no Bisq requer que você entenda e atenda aos seguintes requerimentos:\n\nPara enviar o ARQ, você precisa usar a wallet oficial do ArQmA GUI ou a carteira do ArQmA CLI com o marcador store-tx-info ativado (padrão em novas versões). Por favor, certifique-se que você pode acessar a chave da tx porque isso seria necessário em caso de uma disputa.\narqma-wallet-cli (use o comando get_tx_key)\narqma-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nEm exploradores de blocos normais, a transferência não é verificável.\n\nVocê precisa fornecer ao mediador ou árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- o endereço público do destinatário\n\nA falha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso de disputa. O remetente do ARQ é responsável por fornecer a verificação da transferência do ARQ ao mediador ou árbitro em caso de disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tiver certeza sobre esse processo, visite o canal de discord do ArQmA (https://discord.gg/s9BQpJT) ou o fórum do ArQmA (https://labs.arqma.com) para obter mais informações. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Negociar MSR no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar MSR, você precisa usar a carteira GUI oficial do Masari ou a carteira CLI do Masari com o marcador store-tx-info ativado (ativado por padrão) ou a carteira web do Masari (https://wallet.getmasari.org). Por favor, certifique-se que você pode acessar a chave da tx porque isso seria necessário em caso de uma disputa.\nmasari-wallet-cli (use o comando get_tx_key)\nmasari-wallet-gui (vá para a aba do histórico e clique no botão (P) para comprovar o pagamento)\n\nMasari Web Wallet (vá para Account -> histórico de transação e veja os detalhes da sua transação enviada)\n\nA verificação pode ser realizada na carteira.\nmasari-wallet-cli: usando o comando (check_tx_key).\nmasari-wallet-gui: na aba Advanced > Prove/Check.\nA verificação pode ser realizada no eplorador de blocos\nExplorador de blocos aberto (https://explorer.getmasari.org), use a barra de procurar para encontrar o hash da transação.\nUma que vez que a transação for encontrada, desça até ao baixo da àrea 'Prove Sending' e preencha os detalhes necessários.\nVocê precisa fornecer ao mediador ou ao árbitro os seguintes dados em caso de disputa:\n- A chave privada da tx\n- O hash da transação\n- o endereço público do destinatário\n\nFalha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda do caso de disputa. O remetente da XMR é responsável por fornecer a verificação da transferência da MSR para o mediador ou o árbitro no caso de uma disputa.\n\nNão é necessário um código de pagamento, apenas o endereço público normal.\nSe você não tem certeza sobre o processo, peça ajuda no Discord official do Masari (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Negociar o BLUR no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o BLUR você deve usar a carteira CLI da Blur Network ou a carteira GUI.\n\nSe você estiver usando a carteira CLI, um hash da transação (tx ID) será exibido após uma transferência ser enviada. Você deve guardar esta informação. Imediatamente após o envio da transferência, você deve usar o comando 'get_tx_key' para recuperar a chave privada da transação. Se você não conseguir executar essa etapa, talvez não consiga recuperar a chave mais tarde.\n\nSe você estiver usando a carteira GUI do Blur Network, a chave privada da transação e a ID da transação podem ser encontradas convenientemente na aba "Histórico". Imediatamente após o envio, localize a transação de interesse. Clique no símbolo "?" no canto inferior direito da caixa que contém a transação. Você deve guardar esta informação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um mediador ou árbitro: 1.) a ID da transação, 2.) a chave privada da transação e 3.) o endereço do destinatário. O mediador ou árbitro verificará a transferência do BLUR usando o Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nO não fornecimento das informações necessárias ao mediador ou árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente de BLUR tem 100% de responsabilidade na verificação de transações para um mediador ou árbitro.\n\nSe você não entender esses requerimentos não negocie no Bisq. Primeiro, procure ajuda no Discord da Rede de Blur (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Negociar Solo no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o Solo, você deve usar a carteira CLI do Solo.\n\nSe você está a usar a carteira CLI, um hash da transação (tx ID) aparecerá depois de a transação ser feita. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'get_tx_key' para recuperar a chave secreta da transação. Se você não conseguir executar este passo, talvez não seja possível recuperar a chave mais tarde.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um mediador ou árbitro: 1.) o ID da transação, 2.) a chave privada da transação e 3.) o endereço do recipiente. O mediador ou árbitro então verificará a transferência do Solo usando o Explorador de Blocos Solo (https://explorer.minesolo.com/).\n\nO não fornecimento das informações necessárias ao mediador ou árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente de Solo tem 100% da responsabilidade na verificação de transações para um mediador ou árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro, procure ajuda no Discord da Rede do Solo (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Negociar o CASH2 no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar CASH2, você deve usar a versão Cash2 Wallet versão 3 ou superior.\n\nDepois que uma transação é enviada, a ID da transação será exibida. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'getTxKey' no simplewallet para recuperar a chave secreta da transação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um mediador ou árbitro: 1) a ID da transação, 2) a chave secreta da transação e 3) o endereço Cash2 do destinatário. O mediador ou árbitro irá então verificar a transferência do CASH2 usando o Explorador de Blocos do Cash2 (https://blocks.cash2.org).\n\nO não fornecimento das informações necessárias ao mediador ou árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente do CASH2 tem 100% de responsabilidade na verificação de transações para um mediador ou árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro procure ajuda no Discord do Cash2 (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Negociar Qwertycoin no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar o QWC, você deve usar a versão oficial do QWC Wallet 5.1.3 ou superior.\n\nDepois que uma transação é enviada, o ID da transação será exibida. Você deve guardar esta informação. Imediatamente após o envio da transação, você deve usar o comando 'get_Tx_Key' na simplewallet para recuperar a chave secreta da transação.\n\nCaso a arbitragem seja necessária, você deve apresentar o seguinte à um mediador ou árbitro: 1) o ID da transação, 2) a chave secreta da transação e 3) o endereço QWC do destinatário. O mediador ou árbitro então verificará a transferência do QWC usando o Explorador de Blocos QWC (https://explorer.qwertycoin.org).\n\nO não fornecimento das informações necessárias ao mediador ou árbitro resultará na perda da disputa. Em todos os casos de disputa, o remetente QWC tem 100% da responsabilidade na verificação de transações para um mediador ou árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro, procure ajuda no QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Negociar Dragonglass no Bisq requer que você entenda e cumpra os seguintes requerimentos:\n\nPor causa da privacidade que a Dragonglass fornece, uma transação não é verificável na blockchain pública. Se necessário, você pode comprovar seu pagamento através do uso de sua chave privada TXN.\nA chave privade TXN é uma chave única gerada automaticamente para cada transação que só pode ser acessada dentro da sua carteira DRGL.\nTanto pela GUI do DRGL-wallet (dentro da janela de detalhes da transação) ou pelo simplewallet da CLI do Dragonglass (usando o comando "get_tx_key").\n\nA versão do DRGL 'Oathkeeper' e superior são NECESSÁRIAS para ambos.\n\nEm caso de disputa, você deve fornecer ao mediador ou árbitro os seguintes dados:\n- A chave privada TXN\n- O hash da transação\n- o endereço público do destinatário\n\nA verificação do pagamento pode ser feita usando os dados acima como inputs em (http://drgl.info/#check_txn).\n\nA falha em fornecer os dados acima, ou se você usou uma carteira incompatível, resultará na perda disputa. O remetente da Dragonglass é responsável por fornecer a verificação da transferência do DRGL para o mediador ou árbitro em caso de disputa. O uso de PaymentID não é obrigatório.\n\nSe você não tiver certeza sobre qualquer parte deste processo, visite Dragonglass on Discord (http://discord.drgl.info) para obter ajuda. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=Ao usar o Zcash você só pode usar os endereços transparentes (começando com t), e não os endereços z (privados), porque o mediador ou árbitro não seria capaz de verificar a transação com endereços z. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=Ao usar a Zcoin, você só pode usar os endereços transparentes (rastreáveis) e não os endereços não rastreáveis, porque o mediador ou árbitro não seria capaz de verificar a transação com endereços não rastreáveis num explorador de blocos. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN requer um processo interativo entre o remetente e o recipiente para criar a transação. Certifique-se de seguir as instruções da página web do projeto GRIN para enviar e receber de forma confiável o GRIN (o recipiente precisa estar online ou pelo menos estar online durante um determinado período de tempo).\n\nO Bisq suporta apenas o formato de URL da carteira Grinbox (Wallet713).\n\nO remetente GRIN é obrigado a fornecer prova de que eles enviaram GRIN com sucesso. Se a carteira não puder fornecer essa prova, uma disputa potencial será resolvida em favor do recipiente de GRIN. Por favor, certifique-se de usar o software Grinbox mais recente que suporta a prova da transação e que você entende o processo de transferência e receção do GRIN, bem como criar a prova.\n\nConsulte https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only para obter mais informações sobre a ferramenta de prova Grinbox. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=O BEAM requer um processo interativo entre o remetente e o recipiente para criar a transação.\n\nCertifique-se de seguir as instruções da página Web do projeto BEAM para enviar e receber BEAM de forma confiável (o recipiente precisa estar online ou pelo menos estar online durante um determinado período de tempo).\n\nO remetente BEAM é obrigado a fornecer prova de que eles enviaram o BEAM com sucesso. Certifique-se de usar software de carteira que pode produzir tal prova. Se a carteira não puder fornecer a prova, uma disputa potencial será resolvida em favor do recipiente de BEAM. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=A negociação de ParsiCoin no Bisq exige que você entenda e cumpra os seguintes requerimentos:\n\nPara enviar PARS você deve usar a versão oficial da Carteira ParsiCoin 3.0.0 ou superior.\n\nVocê pode verificar o Hash da Transação e a Chave da Transação na secção das Transações na sua carteira GUI (ParsiPay) Você precisa clicar com o lado direito na transação e, em seguida, clicar em mostrar detalhes.\n\nEm caso de arbitragem, você deve apresentar o seguinte para um mediador ou árbitro: 1) o Hash da Transação, 2) a Chave da Transação, e 3) endereço PARS do recipiente. O mediador ou árbitro irá então verificar a transferência PARS usando o Explorador de Blocos da ParsiCoin (http://explorer.parsicoin.net/#check_payment).\n\nFalha em fornecer as informações necessárias ao mediador ou árbitro resultará na perda do caso de disputa. Em todos os casos de disputa, o remetente da ParsiCoin carrega 100% da carga de responsabilidade em verificar as transações à um mediador ou árbitro.\n\nSe você não entender esses requerimentos, não negocie no Bisq. Primeiro procure ajuda no Discord da ParsiCoin (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=Para negociar blackcoins queimados, você precisa saber o seguinte:\n\nBlackcoins queimados não podem ser gastos. Para os negociar no Bisq, os output scripts precisam estar na forma: OP_RETURN OP_PUSHDATA, seguido pelos data bytes que, após serem codificados em hex, constituem endereços. Por exemplo, blackcoins queimados com um endereço 666f6f (“foo” em UTF-8) terá o seguinte script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nPara criar blackcoins queimados, deve-se usar o comando RPC “burn” disponível em algumas carteiras.\n\nPara casos possíveis, confira https://ibo.laboratorium.ee .\n\nComo os blackcoins queimados não podem ser gastos, eles não podem voltar a ser vendidos. “Vender” blackcoins queimados significa queimar blackcoins comuns (com os dados associados iguais ao endereço de destino).\n\nEm caso de disputa, o vendedor de BLK precisa providenciar o hash da transação. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=A negociação de L-BTC no Bisq exige que você entenda o seguinte:\n\nAo receber L-BTC para um negócio no Bisq, você não pode usar a aplicação móvel Blockstream Green Wallet ou uma carteira de custódia / exchange. Você só deve receber o L-BTC na carteira Liquid Elements Core ou em outra carteira L-BTC que permita obter a chave ofuscante para o seu endereço L-BTC cego.\n\nNo caso de ser necessária mediação, ou se surgir uma disputa de negócio, você deve divulgar a chave ofuscante do seu endereço L-BTC de recebimento ao mediador ou agente de reembolso Bisq, para que eles possam verificar os detalhes da sua Transação Confidencial no seu próprio Elements Core full node.\n\nO não fornecimento das informações necessárias ao mediador ou ao agente de reembolso resultará na perda do caso de disputa. Em todos os casos de disputa, o recipiente de L-BTC suporta 100% da responsabilidade ao fornecer prova criptográfica ao mediador ou ao agente de reembolso.\n\nSe você não entender esses requerimentos, não negocie o L-BTC no Bisq. account.fiat.yourFiatAccounts=A sua conta de moeda nacional @@ -1213,7 +1222,6 @@ account.backup.location=Localizacao do backup account.backup.selectLocation=Selecione localização para backup account.backup.backupNow=Fazer backup agora (o backup não é criptografado) account.backup.appDir=Diretório de dados do programa -account.backup.logFile=Ficheiro de log account.backup.openDirectory=Abrir diretório account.backup.openLogFile=Abrir ficheiro de log account.backup.success=Backup guardado com sucesso em:\n{0} @@ -1227,7 +1235,7 @@ account.password.info=Com a proteção por senha, você precisará inserir a sua account.seed.backup.title=Fazer backup das palavras semente da sua carteira account.seed.info=Por favor, anote as palavras-semente da carteira e a data! Você pode recuperar sua carteira a qualquer momento com palavras-semente e a data.\nAs mesmas palavras-semente são usadas para a carteira BTC e BSQ.\n\nVocê deve anotar as palavras-semente numa folha de papel. Não as guarde no seu computador.\n\nPor favor, note que as palavras-semente não são um substituto para um backup.\nVocê precisa criar um backup de todo o diretório do programa a partir do ecrã \"Conta/Backup\" para recuperar o estado e os dados do programa.\nA importação de palavras-semente é recomendada apenas para casos de emergência. O programa não será funcional sem um backup adequado dos arquivos da base de dados e das chaves! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. account.seed.warn.noPw.msg=Você não definiu uma senha da carteira que protegeria a exibição das palavras-semente.\n\nVocê quer exibir as palavras-semente? account.seed.warn.noPw.yes=Sim, e não me pergunte novamente account.seed.enterPw=Digite a senha para ver palavras-semente @@ -1241,14 +1249,11 @@ account.seed.restore.ok=Ok, restaurar e desligar Bisq account.notifications.setup.title=Configuração account.notifications.download.label=Baixar a aplicação móvel -account.notifications.download.button=Baixar account.notifications.waitingForWebCam=Esperando pela webcam... account.notifications.webCamWindow.headline=Scannear código QR à partir do telemóvel account.notifications.webcam.label=Usar webcam account.notifications.webcam.button=Scannear código QR account.notifications.noWebcam.button=Eu não tenho webcam -account.notifications.testMsg.label=Enviar notificação de teste -account.notifications.testMsg.title=Teste account.notifications.erase.label=Limpar notificações no telemóvel account.notifications.erase.title=Limpar notificações account.notifications.email.label=Token de emparelhamento @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=Distância da percentagem do pr account.notifications.marketAlert.addButton=Adicionar alerta de oferta account.notifications.marketAlert.manageAlertsButton=Gerir alertas de oferta account.notifications.marketAlert.manageAlerts.title=Gerir alertas de oferta -account.notifications.marketAlert.manageAlerts.label=Alertas de oferta -account.notifications.marketAlert.manageAlerts.item=Alerta de oferta para oferta de {0} com preço de desencadeamento de {1} e conta de pagamento {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=Conta de pagamento account.notifications.marketAlert.manageAlerts.header.trigger=Preço de desencadeamento account.notifications.marketAlert.manageAlerts.header.offerType=Tipo de oferta @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=Saldo de todas as transações não verificadas (aguard dao.lockedForVoteBalance=Usado para votação dao.lockedInBonds=Bloqueado em vínculos dao.availableNonBsqBalance=Balanço não-BSQ disponível (BTC) -dao.totalBsqBalance=Saldo total de BSQ dao.reputationBalance=Valor de Mérito (não gastável) dao.tx.published.success=Sua transação foi publicada com sucesso. @@ -1455,11 +1457,6 @@ dao.param.currentValue=Valor atual: {0} dao.param.currentAndPastValue=Valor atual: {0} (Valor quando a proposta foi feita: {1}) dao.param.blocks={0} blocos -dao.results.cycle.duration.label=Duração de {0} -dao.results.cycle.duration.value={0} bloco(s) -dao.results.cycle.value.postFix.isDefaultValue=(valor padrão) -dao.results.cycle.value.postFix.hasChanged=(foi alterado em votação) - dao.results.invalidVotes=Tivemos votos inválidos naquele ciclo de votação. Isso pide acontecer se o voto não foi bem distribuído pela rede do Bisq.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=Sal dao.bond.reputation.hash=Hash dao.bond.reputation.lockupButton=Bloquear dao.bond.reputation.lockup.headline=Confirmar transação de bloqueio -dao.bond.reputation.lockup.details=Qantia de bloqueio: {0}\nTempo de desbloqueio: {1} bloco(s) (≈ {2})\n\nTaxa de mineração: {3} ({4} satoshis/byte)\nTamanho da transação: {5} Kb\n\nTem certeza de que deseja continuar? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=Confirmar transação de desbloqueio -dao.bond.reputation.unlock.details=Quantia de desbloqueio: {0}\nTempo de desbloqueio: {1} bloco(s) (≈ {2})\n\nTaxa de mineração: {3} ({4} satoshis/byte)\nTamanho da transação: {5} Kb\n\nTem certeza de que deseja continuar? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=Todos os vínculos @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=Assinar dao.proofOfBurn.message=Mensagem dao.proofOfBurn.sig=Assinatura dao.proofOfBurn.verify=Verificar -dao.proofOfBurn.verify.header=Verificar a mensagem com a chave da transação da prova de destruição dao.proofOfBurn.verificationResult.ok=Verificação sucedida dao.proofOfBurn.verificationResult.failed=Verificação falhada @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Exacto nome de usuário no Github dao.proposal.display.link=Link para informação detalhada dao.proposal.display.link.prompt=Link para a proposta dao.proposal.display.requestedBsq=Quantia requerida em BSQ -dao.proposal.display.bsqAddress=Endereço BSQ dao.proposal.display.txId=ID de transação de proposta dao.proposal.display.proposalFee=Taxa de proposta dao.proposal.display.myVote=O meu voto dao.proposal.display.voteResult=Resumo do resultado da votação dao.proposal.display.bondedRoleComboBox.label=Tipo de cargo vinculado dao.proposal.display.requiredBondForRole.label=Vínculo necessário para cargo -dao.proposal.display.tickerSymbol.label=Símbolo do ticker dao.proposal.display.option=Opção dao.proposal.table.header.proposalType=Tipo de proposta dao.proposal.table.header.link=Link dao.proposal.table.header.myVote=O meu voto +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=Remover dao.proposal.table.icon.tooltip.removeProposal=Remover a minha proposta dao.proposal.table.icon.tooltip.changeVote=Voto atual: ''{0}''. Mudar o voto para: ''{1}'' @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=O saldo da minha carteira dao.wallet.receive.fundYourWallet=O seu endereço recipiente de BSQ dao.wallet.receive.bsqAddress=Endereço da carteira BSQ (endereço não utilizado) -dao.wallet.receive.dao.headline=A OAD do Bisq -dao.wallet.receive.daoInfo=Assim como o mercado de câmbio do Bisq é descentralizado e resistente à censura, o seu modelo de governação também o é - e a OAD do Bisq e o token BSQ são as ferramentas que tornam isso possível. -dao.wallet.receive.daoInfo.button=Aprender mais sobre a OAD do Bisq -dao.wallet.receive.daoTestnetInfo=A mainnet da OAD do Bisq ainda não foi lançada, mas você pode aprender sobre a OAD do Bisq executando-a na testnet. -dao.wallet.receive.daoTestnetInfo.button=Como executar a OAD do Bisq na nossa testnet -dao.wallet.receive.daoContributorInfo=Se você contribuiu para o Bisq, por favor, use o endereço BSQ abaixo e faça um pedido para participar da distribuição genesis de BSQ. -dao.wallet.receive.daoContributorInfo.button=Como ser parte da distribuição genesis de BSQ - dao.wallet.send.sendFunds=Enviar fundos dao.wallet.send.sendBtcFunds=Enviar fundos não-BSQ (BTC) dao.wallet.send.amount=Quantia em BSQ dao.wallet.send.btcAmount=Quantia em BTC (fundos não-BSQ) dao.wallet.send.setAmount=Definir quantia a levantar (mín. quantia é {0}) -dao.wallet.send.setBtcAmount=Definir quantia em BTC a levantar (mín. quantia é {0}) dao.wallet.send.receiverAddress=Endereço BSQ do recipiente dao.wallet.send.receiverBtcAddress=Endereço BTC do recipiente dao.wallet.send.setDestinationAddress=Preencha seu endereço de destino dao.wallet.send.send=Enviar fundos BSQ dao.wallet.send.sendBtc=Enviar fundos BTC dao.wallet.send.sendFunds.headline=Confirmar pedido de levantamento. -dao.wallet.send.sendFunds.details=Enviando: {0}\nPara o endereço recipiente: {1}.\nA taxa de transação necessária é de: {2} ({3} satoshis/byte)\nTamanho da transação: {4} Kb\n\nO recipiente receberá: {5}\n\nTem certeza de que deseja levantar esse valor? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=Último bloco verificado: {0} dao.wallet.chainHeightSyncing=Esperando blocos... {0} dos {1} blocos verificados dao.wallet.tx.type=Tipo @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=Você não tem suficientes fundos de BT dao.proposal.create.missingIssuanceFunds=Você não tem suficientes fundos de BTC para criar a transação da proposta. Todas as transações de BSQ exigem uma taxa do mineiro em BTC, e as transações de emissão também exigem BTC pela quantia de BSQ solicitado ({0} satoshis/BSQ).\nEm falta: {1} dao.feeTx.confirm=Confirmar transação {0} -dao.feeTx.confirm.details={0} taxa: {1}\nTaxa de mineração: {2} ({3} satoshis/byte)\nTamanho da transação: {4} Kb\n\nTem certeza de que deseja publicar a transação {5}? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0} taxa: {1}\nBTC necessário para a emissão de BSQ: {2} ({3} satoshis/BSQ)\nTaxa de mineração: {4} ({5} satoshis/byte)\nTamanho da transação: {6} Kb\n\nSe o seu pedido for aprovado, você receberá a quantia solicitada menos a taxa de proposta de 2 BSQ.\n\nTem certeza de que deseja publicar a transação de {7}?" +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=A OAD DO BISQ dao.news.bisqDAO.description=Assim como o mercado de câmbio do Bisq é descentralizado e resistente à censura, o seu modelo de governação também o é - e a OAD do Bisq e o token da BSQ são as ferramentas que tornam isso possível. @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=Nº de votos cegos dao.factsAndFigures.menuItem.supply=Estoque de BSQ dao.factsAndFigures.menuItem.transactions=Transações BSQ -dao.factsAndFigures.dashboard.marketPrice=Dados do mercado -dao.factsAndFigures.dashboard.price=Último preço de negócio de BSQ/BTC (no Bisq) dao.factsAndFigures.dashboard.avgPrice90=Média de 90 dias do preço de negócio de BSQ/BTC dao.factsAndFigures.dashboard.avgPrice30=Média de 30 dias do preço de negócio de BSQ/BTC dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=Descarregar depois displayUpdateDownloadWindow.button.ignoreDownload=Ignorar esta versão displayUpdateDownloadWindow.headline=Uma nova atualização do Bisq está disponível! displayUpdateDownloadWindow.download.failed.headline=Download falhou -displayUpdateDownloadWindow.download.failed=Download falhou.\nPor favor descarregue e verifique em https://bisq.network/downloads -displayUpdateDownloadWindow.installer.failed=Não é possível determinar o instalador correto. Por favor, descarregue e verifique manualmente em https://bisq.network/downloads -displayUpdateDownloadWindow.verify.failed=Verificação falhou.\nPor favor descarregue e verifique manualmente em https://bisq.network/downloads +displayUpdateDownloadWindow.download.failed=Download failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verification failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=A nova versão foi descarregada com sucesso e a assinatura foi verificada.\n\nPor favor, abra o diretório de download, desligue o programa e instale a nova versão. displayUpdateDownloadWindow.download.openDir=Abrir diretório de download @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=Pagamento da quantia de negócio disputeSummaryWindow.payout.getsTradeAmount={0} de BTC fica com o pagamento da quantia de negócio disputeSummaryWindow.payout.getsAll={0} BTC fica com tudo disputeSummaryWindow.payout.custom=Pagamento personalizado -disputeSummaryWindow.payout.adjustAmount=A quantia inserida excede o valor disponível de {0}.\nAjustamos esse campo de input para o valor máx. possível. disputeSummaryWindow.payoutAmount.buyer=Quantia de pagamento do comprador disputeSummaryWindow.payoutAmount.seller=Quantia de pagamento do vendedor disputeSummaryWindow.payoutAmount.invert=Usar perdedor como publicador @@ -2055,6 +2038,7 @@ disputeSummaryWindow.addSummaryNotes=Adicionar notas de resumo disputeSummaryWindow.close.button=Fechar bilhete # Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification @@ -2064,9 +2048,11 @@ disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and a disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions disputeSummaryWindow.close.closePeer=Você também precisa fechar o bilhete dos pares de negociação! disputeSummaryWindow.close.txDetails.headline=Publicar transação de reembolso +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=O comprador recebe {0} no endereço: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=O vendedor recebe {0} no endereço: {1}\n -disputeSummaryWindow.close.txDetails=Gastando: {0}\n{1}{2}Taxa da transação: {3} ({4} satoshis/byte)\nTamanho da transação: {5} Kb\n\nTem a certeza de que quer publicar esta transação? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? disputeSummaryWindow.close.noPayout.headline=Close without any payout disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? @@ -2101,6 +2087,7 @@ filterWindow.btcNode=Nós de Bitcoin filtrados (endereços + portas sep. por ví filterWindow.preventPublicBtcNetwork=Prevenir uso da rede de Bitcoin pública filterWindow.disableDao=Desativar OAD filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Versão mín. necessária para a OAD filterWindow.disableTradeBelowVersion=Mín. versão necessária para negociação filterWindow.add=Adicionar filtro @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=Selecionar transação de depósito para disputa selectDepositTxWindow.msg=A transação de depósito não foi armazenada no negócio.\nPor favor, selecione uma das transações multi-assinatura existentes na sua carteira, que foi a transação de depósito usada no negócio falhado.\n\nVocê pode encontrar a transação correta abrindo a janela de detalhes de negócio (clique na ID do negócio na lista) e seguindo o output da transação de pagamento da taxa de negociação para a próxima transação onde você ver a transação de depósito multi-assinatura (o endereço começa com 3). Esse ID de transação deve estar visível na lista apresentada aqui. Depois de encontrar a transação correta, selecione a transação aqui e continue.\n\nDesculpe pela inconveniência, mas esse caso de erro deve acontecer muito raramente e, no futuro, tentaremos encontrar maneiras melhores de resolvê-lo. selectDepositTxWindow.select=Selecionar transação de depósito -selectBaseCurrencyWindow.headline=Seleção de mercado -selectBaseCurrencyWindow.msg=O mercado padrão selecionado é {0}.\n\nSe você quiser mudar para outra moeda base, selecione uma na lista.\nVocê também pode alterar posteriormente a moeda base no ecrã \"Definições/Rede\". -selectBaseCurrencyWindow.select=Selecionar moeda base - sendAlertMessageWindow.headline=Enviar notificação global sendAlertMessageWindow.alertMsg=Mensagem de alerta sendAlertMessageWindow.enterMsg=Digitar mensagem @@ -2232,9 +2215,8 @@ error.closedTradeWithNoDepositTx=A transação de depósito do negócio fechado popup.warning.walletNotInitialized=A carteira ainda não foi inicializada popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. popup.warning.wrongVersion=Você provavelmente tem a versão errada do Bisq para este computador.\nA arquitetura do seu computador é: {0}.\nO binário Bisq que você instalou é: {1}.\nPor favor, desligue e reinstale a versão correta ({2}). -popup.warning.incompatibleDB=Detectamos ficheiros de base de dados incompatíveis!\n\nEsses ficheiros de base de dados não são compatíveis com nossa base de código atual:\n{0}\n\nFizemos um backup do(s) ficheiro(s) corrompido(s) e aplicamos os valores padrão para uma nova versão da base de dados.\n\nO backup está localizado em:\n{1} /db/backup_of_corrupted_data.\n\nPor favor, verifique se você tem a última versão do Bisq instalada.\nVocê pode baixá-lo em:\nhttps://bisq.network/downloads\n\nPor favor, reinicie o programa. +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 new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application. popup.warning.startupFailed.twoInstances=Bisq já está em execução. Você não pode executar duas instâncias do Bisq. -popup.warning.cryptoTestFailed=Parece que você usa um binário auto-compilado e não segue as instruções de compilação em https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSe não for esse o caso e você usar o binário oficial do Bisq, por favor, envie um relatório de erros para a página do Github.\nErro = {0} popup.warning.tradePeriod.halfReached=Sua negociação com o ID {0} atingiu a metade do valor máx. do período de negociação permitido e ainda não está concluído.\n\nO período de negócio termina em {1}\n\nPor favor, verifique o seu estado de negócio em \"Portefólio/Ofertas abertas\" para mais informações. popup.warning.tradePeriod.ended=O seu negócio com o ID {0} atingiu o limite do máx. período de negociação permitido e não está concluído.\n\nO período de negócio terminou em {1}\n\nPor favor, verifique o seu negócio em \"Portefólio/Negócios abertos\" para entrar em contacto com o mediador. popup.warning.noTradingAccountSetup.headline=Você ainda não configurou uma conta de negociação @@ -2258,7 +2240,9 @@ popup.warning.noBsqFundsForBtcFeePayment=Sua carteira BSQ não possui fundos suf popup.warning.messageTooLong=Sua mensagem excede o tamanho máx. permitido. Por favor enviá-la em várias partes ou carregá-la utilizando um serviço como https://pastebin.com. popup.warning.lockedUpFunds=Você trancou fundos de um negócio falhado..\nSaldo trancado: {0} \nEndereço da tx de Depósito: {1}\nID de negócio: {2}.\n\nPor favor abra um bilhete de apoio selecionando o negócio no ecrã de negócios abertos e pressione \"alt + o\" ou \"option + o\"." +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=transmissão de preço popup.warning.seed=semente popup.warning.mandatoryUpdate.trading=Por favor, atualize para a versão mais recente do Bisq. Uma atualização obrigatória que desativa negociação para versões antigas foi lançada. Por favor, confira o Fórum Bisq para mais informações. @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=A transação de {0} para o negócio com o ID {1} popup.warning.openOfferWithInvalidMakerFeeTx=A transação de taxa de ofertante para a oferta com o ID {0} é inválida\nID da transação={1}.\nPor favor vá à \"Definições/Informação da Rede\" e re-sincronize o ficheiro SPV.\nPara mais ajuda por favor contacte o canal de apoio do Bisq na equipa Keybase do Bisq. -popup.warning.trade.depositTxNull=O negócio com o ID ''{0}'' não tem transação de depósito definida.\n\nPor favor reinicie o programa para ver se o problema continua.\n\nSe continuar, por favor abra o popup de detalhes do negócio clicando no ID de negócio. De seguida, clique nos IDs da transação para a transação da taxa de ofertante e para a transação da taxa de aceitador para vê-las num explorador de blocos. Uma transação que não possa ser encontrada num explorador de blocos é provavelmente uma transação inválida.\n\nSe isto acontecer, por favor reporte-o no canal #support no Keybase do Bisq (https://keybase.io/team/bisq). Se a sua transação da taxa de negócio for inválida, nenhum dos fundos saiu da sua carteira. Você pode mover o negócio para negócios falhados e resincronizar o ficheiro SPV para que os seus fundos re-apareçam (veja como em baixo).\n\nSe a sua transação da taxa de negócio for válida, a quantia da taxa foi perdida e você pode fazer um pedido para reembolso no repositório de apoio no GitHub (https://github.com/bisq-network/support/issues).\n\nEm ambos os casos, por favor re-sincronize o ficheiro SPV na aba ''Definições/Informação da rede' para limbar a sua carteira de qualquer problema que reste! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Mover para negócios falhados -popup.warning.trade.depositTxNull.shutDown=Desligar o Bisq - popup.info.securityDepositInfo=Para garantir que ambos os negociadores seguem o protocolo de negócio, ambos os negociadores precisam pagar um depósito de segurança.\n\nEsse depósito é mantido na sua carteira de negócio até que o seu negócio seja concluído com sucesso, e então lhe será reembolsado.\n\nPor favor note: se você está criando uma nova oferta, o Bisq precisa estar em execução para que um outro negociador a aceite. Para manter suas ofertas online, mantenha o Bisq em execução e certifique-se de que este computador permaneça online também (ou seja, certifique-se de que ele não alterne para o modo de espera... o modo de espera do monitor não causa problema). popup.info.cashDepositInfo=Por favor, certifique-se de que você tem uma agência bancária na sua área para poder fazer o depósito em dinheiro.\nO ID do banco (BIC/SWIFT) do vendedor é: {0}. popup.info.cashDepositInfo.confirm=Eu confirmo que eu posso fazer o depósito popup.info.shutDownWithOpenOffers=Bisq está sendo fechado, mas há ofertas abertas. \n\nEstas ofertas não estarão disponíveis na rede P2P enquanto o Bisq estiver desligado, mas elas serão publicadas novamente na rede P2P na próxima vez que você iniciar o Bisq.\n\nPara manter suas ofertas on-line, mantenha o Bisq em execução e certifique-se de que este computador também permaneça online (ou seja, certifique-se de que ele não entra no modo de espera... o modo de espera do monitor não causa problema). -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=Notificação privada importante! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=Atenção necessária para o negócio com ID {0} popup.info.multiplePaymentAccounts.headline=Múltiplas contas de pagamento disponíveis popup.info.multiplePaymentAccounts.msg=Você tem várias contas de pagamento disponíveis para esta oferta. Por favor, verifique se você escolheu a correta. -popup.news.launch.headline=Duas Grandes Atualizações -popup.news.launch.accountSigning.headline=ASSINATURA DA CONTA -popup.news.launch.accountSigning.description=Aumente os limites de negociação fiat de 0,01 BTC comprando BTC de um par assinado. -popup.news.launch.ntp.headline=NOVO PROTOCOLO DE NEGÓCIO -popup.news.launch.ntp.description=O novo sistema de resolução de disputas em 2-níveis torna o Bisq mais seguro, escalável e resistente à censura. - popup.accountSigning.selectAccounts.headline=Selecionar contas de pagamento popup.accountSigning.selectAccounts.description=Com base no método de pagamento e no momento, todas as contas de pagamento conectadas a uma disputa em que ocorreu um pagamento ao comprador serão selecionadas para você assinar. popup.accountSigning.selectAccounts.signAll=Assinar todos os métodos de pagamento @@ -2324,7 +2297,7 @@ popup.accountSigning.signAccounts.ECKey.error=Má ECKey do árbitro popup.accountSigning.success.headline=Parabéns popup.accountSigning.success.description=Todas as contas de pagamento de {0} foram assinadas com sucesso! -popup.accountSigning.generalInformation=Você encontrará o estado de assinatura de todas as suas contas na seção de contas.\n\nPara mais informações, visite https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=Uma das suas contas de pagamento foi verificada e assinada por um árbitro. Fazendo negócios com esta conta assinará automaticamente a conta do seu par de negociação após um negócio bem-sucedido.\n\n{0} popup.accountSigning.signedByPeer=Uma das suas contas de pagamento foi verificada e assinada por um par de negociação. Seu limite inicial de negociação será aumentado e você poderá assinar outras contas dentro de {0} dias a partir de agora.\n\n{1} popup.accountSigning.peerLimitLifted=O limite inicial de uma das suas contas foi aumentado.\n\n{0} @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=Signing completed popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: Uma rede de echange de bitcoin descentralizada # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=Contas de negociação guardadas em:\n{0} guiUtil.accountExport.noAccountSetup=Você não tem contas de negociação prontas para exportar. @@ -2463,6 +2435,7 @@ navigation.portfolio.pending=\"Portefólio/Negócios abertos\" navigation.portfolio.closedTrades=\"Portefólio/Histórico\" navigation.funds.depositFunds=\"Fundos/Receber fundos\" navigation.settings.preferences=\"Definições/Preferências\" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"Fundos/Transações\" navigation.support=\"Apoio\" navigation.dao.wallet.receive=\"OAD/Carteira BSQ/Receber\" @@ -2525,11 +2498,11 @@ password.deriveKey=Derivar chave a partir da senha password.walletDecrypted=A carteira foi descriptografada com sucesso e a proteção por senha removida. password.wrongPw=Você digitou a senha errada.\n\nPor favor, tente digitar sua senha novamente, verificando com atenção se há erros de ortografia. password.walletEncrypted=Carteira encriptada com sucesso e proteção por senha ativada. -password.walletEncryptionFailed=A senha da carteira não pôde ser definida. Você pode ter importado palavras-semente que não correspondem à base de dados da carteira. Por favor, contacte os desenvolvedores no Fórum Bisq. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=As 2 senhas inseridas não são iguais. password.forgotPassword=Esqueceu a senha? -password.backupReminder=Observe que, ao definir uma senha da carteira, todos os backups criados automaticamente a partir da carteira não criptografada serão apagados.\n\nÉ altamente recomendado fazer um backup do diretório do programa e anotar suas palavras-semente antes de definir uma senha! -password.backupWasDone=Eu já fiz um backup +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=Palavras-semente da carteira seed.enterSeedWords=Inserir as palavras-semente da carteira @@ -2537,7 +2510,7 @@ seed.date=Data da carteira seed.restore.title=Restaurar carteira a partir de palavras-semente seed.restore=Restaurar carteiras seed.creationDate=Data de criação -seed.warn.walletNotEmpty.msg=Sua carteira do Bitcoin não está vazia.\n\nVocê deve esvaziar esta carteira antes de tentar restaurar uma mais antiga, já que misturar as carteiras pode levar à backups invalidados.\n\nPor favor, finalize seus negócios, feche todas as suas ofertas abertas e vá para a secção Fundos para levantar a sua bitcoin.\nCaso você não consiga acessar a sua bitcoin, você pode usar a ferramenta de emergência para esvaziar a carteira.\nPara abrir essa ferramenta de emergência, pressione \"alt + e\" ou \"option + e\". +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=Eu desejo restaurar de qualquer forma seed.warn.walletNotEmpty.emptyWallet=Eu esvaziarei as carteiras primeiro seed.warn.notEncryptedAnymore=Suas carteiras são encriptadas.\n\nApós a restauração, as carteiras não serão mais encriptadas e você deverá definir uma nova senha.\n\nVocê quer continuar? @@ -2578,12 +2551,11 @@ payment.altcoin.address=Endereço de altcoin payment.altcoin.tradeInstantCheckbox=Negócio instantâneo (dentro de 1 hora) com esta Altcoin payment.altcoin.tradeInstant.popup=Para negociação instantânea, é necessário que os dois pares de negociação estejam online para concluir o negócio em menos de 1 hora..\n\nSe você tem ofertas abertas e você não está disponível, por favor desative essas ofertas no ecrã 'Portefólio'. payment.altcoin=Altcoin -payment.select.altcoin=Selecionar ou procurar altcoin +payment.select.altcoin=Select or search Altcoin payment.secret=Pergunta secreta payment.answer=Resposta payment.wallet=ID da carteira payment.uphold.accountId=Nome de utilizador, email ou nº de telemóvel -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=Email ou nº de telemóvel payment.venmo.venmoUserName=Nome de utilizador do Venmo payment.popmoney.accountId=Email ou nº de telemóvel @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=ID de cidadão/ID de impostos ou nº de telemóvel payment.supportedCurrencies=Moedas suportadas payment.limitations=Limitações payment.salt=Sal para verificação da idade da conta -payment.error.noHexSalt=O sal precisa de estar no formato HEX.\nSó é recomendável editar o campo do sal se você quiser transferir o sal de uma conta antiga para manter a idade da sua conta. A idade da conta é verificada usando o sal da conta e os dados da conta de identificação, (ex. IBAN). +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=Aceitar negócios destes países do Euro payment.accept.nonEuro=Aceitar negócios desses países fora do Euro payment.accepted.countries=Países aceites @@ -2625,31 +2597,33 @@ payment.accountType=Tipo de conta payment.checking=Conta Corrente payment.savings=Poupança payment.personalId=ID pessoal -payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle:\nhttps://www.zellepay.com/get-started\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. +payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Bisq to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved. -payment.moneyGram.info=Ao usar o MoneyGram, o comprador de BTC deve enviar o Número de Autorização e uma foto do recibo por e-mail ao vendedor de BTC. O recibo deve mostrar claramente o nome completo do vendedor, o país, o estado e a quantia. O comprador visualizará o e-mail do vendedor no processo de negócio. -payment.westernUnion.info=Ao usar o Western Union, o comprador do BTC deve enviar o MTCN (número de rastreamento) e uma foto do recibo por e-mail ao vendedor de BTC. O recibo deve mostrar claramente o nome completo do vendedor, a cidade, o país e a quantia. O comprador visualizará o e-mail do vendedor no processo de negócio. +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=Ao usar o HalCash, o comprador de BTC precisa enviar ao vendedor de BTC o código HalCash através de uma mensagem de texto do seu telemóvel.\n\nPor favor, certifique-se de não exceder a quantia máxima que seu banco lhe permite enviar com o HalCash. A quantia mín. de levantamento é de 10 euros e a quantia máx. é de 600 EUR. Para levantamentos repetidos é de 3000 euros por recipiente por dia e 6000 euros por recipiente por mês. Por favor confirme esses limites com seu banco para ter certeza de que eles usam os mesmos limites mencionados aqui.\n\nA quantia de levantamento deve ser um múltiplo de 10 euros, pois você não pode levantar outras quantias de uma ATM. A interface do utilizador no ecrã para criar oferta e aceitar ofertas ajustará a quantia de BTC para que a quantia de EUR esteja correta. Você não pode usar o preço com base no mercado, pois o valor do EUR estaria mudando com a variação dos preços.\n\nEm caso de disputa, o comprador de BTC precisa fornecer a prova de que enviou o EUR. -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\nTo mitigate this risk, Bisq sets per-trade limits based on two factors:\n\n1. The estimated level of chargeback risk for the payment method used\n2. The age of your account for that payment method\n\nThe account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\n● During the 1st month, your per-trade limit will be {0}\n● During the 2nd month, your per-trade limit will be {1}\n● After the 2nd month, your per-trade limit will be {2}\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. -payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase with account age.\n\nSee more:\nhttps://bisq.wiki/Account_limits\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=Por favor, confirme que seu banco permite-lhe enviar depósitos em dinheiro para contas de outras pessoas. Por exemplo, o Bank of America e o Wells Fargo não permitem mais esses depósitos. payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=Update Revolut account payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. payment.f2f.contact=Informação de contacto -payment.f2f.contact.prompt=Como deseja ser contactado pelo par de negociação? (endereço de e-mail, número de telefone, ...) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=Cidade para o encontro 'Face à face' payment.f2f.city.prompt=A cidade será exibida com a oferta payment.f2f.optionalExtra=Informação adicional opcional payment.f2f.extra=Informação adicional payment.f2f.extra.prompt=O ofertante pode definir 'termos e condições' ou adicionar informação de um contacto público. Este será exibido com a oferta. -payment.f2f.info=Negócios 'Cara à Cara' têm diferentes regras e vêm com riscos diferentes às transações online.\n\nAs principais diferenças são:\n● Os pares de negociação precisam de trocar informação sobre a localização e hora do encontro, usando os contactos providenciados.\n● Os pares de negociação precisam de trazer os seus laptops a fazer a confirmação de 'pagamento enviado' e 'pagamento recebido' no local de encontro.\n● Se um ofertante tem 'termos e condições' especiais, ele precisa de menciona-los no campo de texto 'Informações Adicionais' na sua conta.\n● Ao aceitar uma oferta, o aceitador concorda com os 'termos e condições' declarados pelo ofertante.\n● Em caso de disputa o mediador ou o árbitro não pode ajudar muito porque normalmente é difícil obter evidência inalterável do que aconteceu no encontro. Nesses casos os fundos em BTC podem ficar bloqueados indefinidamente ou até que os pares de negociação cheguem à um acordo.\n\nPara ter a certeza de que percebe a diferença com negociações 'Cara à Cara' por favor leias as instruções e recomendações em: 'https://docs.bisq.network/trading-rules.html#f2f-trading' +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=Abrir página web payment.f2f.offerbook.tooltip.countryAndCity=País e cidade: {0} / {1} payment.f2f.offerbook.tooltip.extra=Informação adicional: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=Banco payment.japan.branch=Agência payment.japan.account=Conta payment.japan.recipient=Nome +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=Face à face (em pessoa) JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=Bancos nacionais @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins Instantâneas # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=Número 0 não é permitido validation.negative=Valores negativos não são permitidos. validation.fiat.toSmall=Input menor do que a quantia mínima permitida. validation.fiat.toLarge=Input maior do que a quantia máxima permitida. -validation.btc.fraction=O input resulta em um valor de bitcoin com uma fração da menor unidade (satoshi). +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=O input maior que {0} não é permitido. validation.btc.toSmall=Input menor que {0} não é permitido. -validation.securityDeposit.toSmall=Input menor que {0} não é permitido. -validation.passwordTooShort=A senha inserida é muito curta. É necessário conter no mínimo 8 caracteres. +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=A senha inserida é muito longa. Não pode ser maior do que 50 caracteres. validation.sortCodeNumber={0} deve consistir de {1} números. validation.sortCodeChars={0} deve consistir de {1} caracteres. @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} tem de ser constituído por {1} números #new validation.invalidInput=Input inválido: {0} validation.accountNrFormat=O número da conta deve estar no formato: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=Validação do endereço falhou pois este não é compatível com a estrutura de um endereço {0}. -validation.altcoin.ltz.zAddressesNotSupported=Endereços LTZ precisam de começar com L. Endereços começando com z não são suportados. -validation.altcoin.zAddressesNotSupported=Endereços ZEC precisam começar com t. Endereços iniciando com z não são suportados. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=Endereço não é um endereço {0} válido! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Native segwit addresses (those starting with 'lq') are not supported. -validation.bic.invalidLength=Comprimento do input não é 8 ou 11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=Banco e Código de país devem ser letras validation.bic.invalidLocationCode=BIC contém código de localização inválido validation.bic.invalidBranchCode=BIC contém código da agência inválido validation.bic.sepaRevolutBic=Contas Revolut SEPA não são suportadas. -validation.btc.invalidFormat=Formato inválido de endereço Bitcoin. -validation.bsq.invalidFormat=Formato inválido de endereço BSQ. +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=Endereço inválido validation.iban.invalidCountryCode=Código de país inválido validation.iban.checkSumNotNumeric=Soma de verificação deve ser numérica validation.iban.nonNumericChars=Carácter não alfanumérico detectado validation.iban.checkSumInvalid=Soma de verificação dp IBAN é inválida -validation.iban.invalidLength=Número deve ter entre 15 e 34 caracteres. +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=Código de área não é canadense. -validation.interacETransfer.invalidPhone=Número de telefone inválido e não é um endereço de email +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=Deve conter apenas letras, números, espaços e/ou símbolos ' _ , . ? - validation.interacETransfer.invalidAnswer=Deve ser uma palavra e conter apenas letras, números e/ou o símbolo - validation.inputTooLarge=O input não deve ser maior que {0} validation.inputTooSmall=O input deve ser maior que {0} validation.inputToBeAtLeast=O input tem de ser pelo menos {0} -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=O comprimento deve estar entre {0} e {1} validation.pattern=O input deve ter o formato: {0} validation.noHexString=O input não está no formato HEX. @@ -2859,7 +2852,7 @@ validation.numberFormatException=Exceção do formato do número {0} validation.mustNotBeNegative=O input não deve ser negativo validation.phone.missingCountryCode=É preciso o código do país de duas letras para validar o número de telefone validation.phone.invalidCharacters=O número de telfone {0} contém carácteres inválidos -validation.phone.insufficientDigits=Faltam algarismos em {0} para um número de telefone válido -validation.phone.tooManyDigits=Demasiados algarismos em {0} para ser um número de telefone válido -validation.phone.invalidDialingCode=O código de discagem do país no número {0} é inválido para o país {1}. O correcto código de discagem é {2}. -validation.invalidAddressList=Deve ser um lista de endereços válidos separados por vírgulas +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. +validation.invalidAddressList=Deve ser um lista de endereços válidos separados por vírgulas diff --git a/core/src/main/resources/i18n/displayStrings_ru.properties b/core/src/main/resources/i18n/displayStrings_ru.properties index d9ab63b2f7..c378302ce5 100644 --- a/core/src/main/resources/i18n/displayStrings_ru.properties +++ b/core/src/main/resources/i18n/displayStrings_ru.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=предложение shared.multipleOffers=предложения shared.Offer=Предложение +shared.offerVolumeCode={0} Offer Volume shared.openOffers=текущие предложения shared.trade=сделка shared.trades=сделки @@ -122,7 +123,8 @@ shared.noDateAvailable=Дата не указана shared.noDetailsAvailable=Подробности не указаны shared.notUsedYet=Ещё не использовано shared.date=Дата -shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n shared.copyToClipboard=Скопировать в буфер shared.language=Язык @@ -188,7 +190,6 @@ shared.tradeWalletAddress=Адрес кошелька сделки shared.tradeWalletBalance=Баланс кошелька сделки shared.makerTxFee=Мейкер: {0} shared.takerTxFee=Тейкер: {0} -shared.securityDepositBox.description=Залоговый депозит для BTC {0} shared.iConfirm=Подтверждаю shared.tradingFeeInBsqInfo=equivalent to {0} used as trading fee shared.openURL=Открыть {0} @@ -237,8 +238,6 @@ mainView.menu.settings=Настройки mainView.menu.account=Счёт mainView.menu.dao=ДАО -mainView.marketPrice.provider=Курс предоставлен -mainView.marketPrice.label=Рыночный курс mainView.marketPriceWithProvider.label=Рыночный курс {0} mainView.marketPrice.bisqInternalPrice=Курс последней сделки в Bisq mainView.marketPrice.tooltip.bisqInternalPrice=Нет данных от источника рыночного курса.\nПредоставлен курс последней сделки в Bisq для этой валютной пары. @@ -251,14 +250,15 @@ mainView.balance.locked.short=В сделках mainView.footer.usingTor=(используется Tor) mainView.footer.localhostBitcoinNode=(локальный узел) -mainView.footer.btcInfo=Пиров сети Биткойн: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=Подключение к сети Биткойн mainView.footer.bsqInfo.synchronizing=/ Синхронизация ДАО mainView.footer.btcInfo.synchronizingWith=Синхронизация с -mainView.footer.btcInfo.synchronizedWith=Синхронизировано с +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=Подключение к mainView.footer.btcInfo.connectionFailed=Connection failed to -mainView.footer.p2pInfo=Bisq network peers: {0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=Полный узел ДАО mainView.bootstrapState.connectionToTorNetwork=(1/4) Подключение к сети Tor... @@ -292,7 +292,6 @@ market.tabs.spread=Подробности market.tabs.trades=Сделки # OfferBookChartView -market.offerBook.chart.title=Предложения {0} market.offerBook.buyAltcoin=Хочу купить {0} (продать {1}) market.offerBook.sellAltcoin=Хочу продать {0} (купить {1}) market.offerBook.buyWithFiat=Купить {0} @@ -382,7 +381,7 @@ offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you hav offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions -offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} @@ -393,8 +392,7 @@ offerbook.warning.offerBlocked=Это предложение заблокиро offerbook.warning.currencyBanned=Валюта, используемая в этом предложении, заблокирована разработчиками Bisq.\nПодробности можно узнать на форуме Bisq. offerbook.warning.paymentMethodBanned=Метод платежа, использованный в этом предложении, заблокирован разработчиками Bisq.\nПодробности можно узнать на форуме Bisq. offerbook.warning.nodeBlocked=Onion-адрес этого трейдера заблокирован разработчиками Bisq.\nВероятно, принятие предложения от данного трейдера вызывает необрабатываемую ошибку. -offerbook.warning.requireUpdateToNewVersion=Ваша версия Bisq больше не подходит для торговли.\nУстановите последнюю версию Bisq, перейдя по ссылке https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=Your payment account has been created {0} ago. Your trade limit is based on the account age and is not sufficient for that offer.\n\nYour trade limit is: {1}\nThe min. trade amount of the offer is: {2}.\n\nYou cannot take that offer at the moment. Once your account is older than 2 months this restriction gets removed. +offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. offerbook.info.sellAtMarketPrice=Продажа по рыночному курсу (обновляется ежеминутно). @@ -445,7 +443,6 @@ createOffer.alreadyFunded=Вы уже обеспечили это предлож createOffer.createOfferFundWalletInfo.headline=Обеспечить своё предложение # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- Сумма сделки: {0} \n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} и {1} createOffer.createOfferFundWalletInfo.msg=Вы должны внести {0} для обеспечения этого предложения.\n\nЭти средства будут зарезервированы в вашем локальном кошельке, а когда кто-то примет ваше предложение — заблокированы на депозитном multisig-адресе.\n\nСумма состоит из:\n{1}- вашего залога: {2},\n- комиссии за сделку: {3},\n- комиссии майнера: {4}.\n\nВы можете выбрать один из двух вариантов финансирования сделки:\n - использовать свой кошелёк Bisq (удобно, но сделки можно отследить) ИЛИ\n - перевести из внешнего кошелька (потенциально более анонимно).\n\nВы увидите все варианты обеспечения предложения и их подробности после закрытия этого окна. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=Невозможно принять это пр takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again. takeOffer.error.noFundsLost=\n\nСредства ещё не сняты с вашего кошелька.\nПерезапустите приложение и проверьте сетевое соединение, чтобы попытаться решить эту проблему. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nВнесение депозита завершено.\nПерезапустите приложение и проверьте сетевое соединение, чтобы попытаться решить эту проблему.\nЕсли это не поможет, свяжитесь с разработчиками. takeOffer.error.payoutPublished=\n\nВыплата завершена.\nПерезапустите приложение и проверьте сетевое соединение, чтобы попытаться решить эту проблему.\nЕсли это не поможет, свяжитесь с разработчиками. @@ -543,7 +541,7 @@ portfolio.tab.history=История portfolio.tab.failed=Не удалось portfolio.tab.editOpenOffer=Изменить предложение -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance.\n\nError message: {0} portfolio.pending.step1.waitForConf=Ожидание подтверждения в блокчейне portfolio.pending.step2_buyer.startPayment=Сделать платеж @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=ВАЖНОЕ ТРЕБОВАНИЕ: # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=Заплатите {0} продавцу BTC через Western Union.\n\n portfolio.pending.step2_buyer.westernUnion.extra=ВАЖНОЕ ТРЕБОВАНИЕ: \nПосле оплаты отправьте по электронной почте продавцу BTC контрольный номер MTCN и фото квитанции.\nВ квитанции должно быть четко указано полное имя продавца, город, страна и сумма. Электронный адрес продавца: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=Отправьте {0} \«Почтовым денежным переводом США\» продавцу BTC.\n\n @@ -636,7 +636,7 @@ portfolio.pending.step2_buyer.confirmStart.headline=Подтвердите на portfolio.pending.step2_buyer.confirmStart.msg=Вы начали платеж {0} своему контрагенту? portfolio.pending.step2_buyer.confirmStart.yes=Да portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway portfolio.pending.step2_seller.waitPayment.headline=Ожидайте платеж @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=Контактная инфор portfolio.pending.step2_seller.waitPayment.msg=Депозитная транзакция подтверждена в блокчейне не менее одного раза.\nДождитесь начала платежа в {0} покупателем BTC. portfolio.pending.step2_seller.warn=Покупатель BTC все еще не завершил платеж в {0}.\nДождитесь начала оплаты.\nЕсли сделка не завершится {1}, арбитр начнет разбирательство. portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance. -portfolio.pending.step2_seller.refresh=Refresh Trade State -portfolio.pending.step2_seller.refreshInfo=Sometimes P2P network messages acknowledging payment are not delivered, causing trades to get stuck. Hit the button below to make your peer resend the last message. tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}'' tradeChat.openChat=Open chat window tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=Так как оплата осуществ portfolio.pending.step3_seller.moneyGram=Покупатель обязан отправить вам по электронной почте код подтверждения и фото квитанции.\nВ квитанции должно быть четко указано ваше полное имя, страна (штат) и сумма. Убедитесь, что вы получили код подтверждения по электронной почте.\n\nПосле закрытия этого окна вы увидите имя и адрес покупателя BTC, которые необходимо указать для получения денег от MoneyGram.\n\nПодтвердите получение только после того, как вы успешно заберете деньги! portfolio.pending.step3_seller.westernUnion=Покупатель обязан отправить вам по электронной почте контрольный номер MTCN и фото квитанции.\nВ квитанции должно быть четко указано ваше полное имя, город, страна и сумма. Убедитесь, что вы получили номер MTCN по электронной почте.\n\nПосле закрытия этого окна вы увидите имя и адрес покупателя BTC, которые необходимо указать для получения денег от Western Union. \n\nПодтвердите получение только после того, как вы успешно заберете деньги! portfolio.pending.step3_seller.halCash=Покупатель должен отправить вам код HalCash в текстовом сообщении. Кроме того, вы получите сообщение от HalCash с информацией, необходимой для снятия EUR в банкомате, поддерживающем HalCash.\n\nПосле того, как вы заберете деньги из банкомата, подтвердите получение платежа в приложении! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=Подтвердите получение платежа portfolio.pending.step3_seller.amountToReceive=Сумма поступления @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=Вы получили п portfolio.pending.step3_seller.onPaymentReceived.fiat=Идентификатор сделки (поле \«Назначение платежа\»): \«{0}\»\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" 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.\n\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Подтвердите получение платежа portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Да, я получил (-а) платёж @@ -746,7 +747,7 @@ portfolio.pending.tradePeriodInfo=Начало отсчета срока сде portfolio.pending.tradePeriodWarning=При превышении срока оба трейдера могут начать спор. portfolio.pending.tradeNotCompleted=Сделка не завершена вовремя (до {0}) portfolio.pending.tradeProcess=Процесс сделки -portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community. +portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=Начать спор заново portfolio.pending.openSupportTicket.headline=Обратиться за поддержкой portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator. @@ -757,14 +758,9 @@ portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. portfolio.pending.error.depositTxNotConfirmed=The deposit transaction is not confirmed. You can not open an arbitration dispute with an unconfirmed deposit transaction. Please wait until it is confirmed or go to \"Settings/Network info\" and do a SPV resync.\n\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -portfolio.pending.notification=Уведомление - portfolio.pending.support.headline.getHelp=Need help? portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator. -portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator. portfolio.pending.support.button.getHelp=Open Trader Chat -portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket? -portfolio.pending.support.popup.button=Обратиться за поддержкой portfolio.pending.support.headline.halfPeriodOver=Check payment portfolio.pending.support.headline.periodOver=Время сделки истекло @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Mediation requested portfolio.pending.refundRequested=Refund requested portfolio.pending.openSupport=Обратиться за поддержкой portfolio.pending.supportTicketOpened=Запрос на поддержку отправлен -portfolio.pending.requestSupport=Запрос поддержки -portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds. portfolio.pending.communicateWithArbitrator=Свяжитесь с арбитром в разделе \«Поддержка\». portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator. -portfolio.pending.supportTicketOpenedMyUser=Вы уже обратились за поддержкой.\n{0} portfolio.pending.disputeOpenedMyUser=Вы уже начали спор.\n{0} portfolio.pending.disputeOpenedByPeer=Ваш контрагент начал спор\n{0} -portfolio.pending.supportTicketOpenedByPeer=Ваш контрагент обратился за поддержкой.\n{0} portfolio.pending.noReceiverAddressDefined=Адрес получателя не установлен -portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade? portfolio.pending.mediationResult.headline=Suggested payout from mediation portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout. @@ -790,18 +781,18 @@ portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted portfolio.pending.mediationResult.button=View proposed resolution portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0} -portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nOnce the lock time is over on {0} (block {1}), you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. +portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nFeel free to move this trade to failed trades. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. @@ -839,6 +830,7 @@ funds.deposit.fundWallet=Пополнить кошелёк funds.deposit.withdrawFromWallet=Отправить средства из кошелька funds.deposit.amount=Сумма в ВТС (необязательно) funds.deposit.generateAddress=Создать новый адрес +funds.deposit.generateAddressSegwit=Native segwit format (Bech32) funds.deposit.selectUnused=Выберите неиспользованный адрес из таблицы выше вместо создания нового. funds.withdrawal.arbitrationFee=Комиссия арбитра @@ -986,6 +978,7 @@ setting.preferences.general=Основные настройки setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=Макс. отклонение от рыночного курса +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=Избегать режима ожидания setting.preferences.autoConfirmXMR=XMR auto-confirm setting.preferences.autoConfirmEnabled=Enabled @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Required confirmations setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) setting.preferences.deviationToLarge=Значения выше {0}% запрещены. -setting.preferences.txFee=Комиссия за снятие средств (сатоши/байт) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=Задать своё значение -setting.preferences.txFeeMin=Комиссия должна составлять не меньше {0} сатоши/байт -setting.preferences.txFeeTooLarge=Введённый параметр слишком высок (>5000 сатоши/байт). Размер комиссии за совершение транзакции обычно находится в пределе 50—400 сатоши/байт. +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Игнорируемые пиры [onion-адрес:порт] -setting.preferences.refererId=Реферальный идентификатор setting.preferences.ignoreDustThreshold=Мин. значение, не являющееся «пылью» -setting.preferences.refererId.prompt=Доп. реферальный идентификатор setting.preferences.currenciesInList=Валюты в перечне источника рыночного курса setting.preferences.prefCurrency=Предпочитаемая валюта setting.preferences.displayFiat=Показать нац. валюты @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=Использовать анимацию setting.preferences.useDarkMode=Use dark mode setting.preferences.sortWithNumOffers=Сортировать списки по кол-ву предложений/сделок setting.preferences.resetAllFlags=Сбросить все флажки \«Не показывать снова\» -setting.preferences.reset=Сброс settings.preferences.languageChange=Изменение языка во всех разделах вступит в силу после перезагрузки приложения. settings.preferences.supportLanguageWarning=In case of a dispute, please note that mediation is handled in {0} and arbitration in {1}. -settings.preferences.selectCurrencyNetwork=Выбрать сеть setting.preferences.daoOptions=Настройки ДАО setting.preferences.dao.resyncFromGenesis.label=Перестроить состояние ДАО от первичной транзакции setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=Блокировать сообщающ setting.preferences.dao.fullNodeInfo=Для запуска Bisq в качестве полного узла ДАО вам необходим локальный узел Bitcoin Core с включенным удаленным вызовом процедур (RPC). Другие требования описаны в «{0}».\n\nПосле смены режима необходимо перезапустить приложение. setting.preferences.dao.fullNodeInfo.ok=Открыть документацию setting.preferences.dao.fullNodeInfo.cancel=Нет, остаюсь в режиме облегчённого узла +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=Имя +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=Сеть Биткойн settings.net.p2pHeader=Bisq network @@ -1044,7 +1040,7 @@ settings.net.bitcoinNodesLabel=Узлы Bitcoin Core для подключени settings.net.useProvidedNodesRadio=Использовать предоставленные узлы Bitcoin Core settings.net.usePublicNodesRadio=Использовать общедоступную сеть Bitcoin settings.net.useCustomNodesRadio=Использовать особые узлы Bitcoin Core -settings.net.warn.usePublicNodes=Если вы используете общедоступную сеть Bitcoin, вы подвергаете свою конфиденциальность серьезной угрозе, вызванной несовершенным дизайном и реализацией фильтра Блума, который применяется в кошельках SPV, таких как BitcoinJ (используется в Bisq). Любой полный узел, к которому вы подключены, может вычислить, что все ваши адреса кошельков принадлежат одному лицу.\n\nПодробную информацию можно найти по ссылке: https://bisq.network/blog/privacy-in-bitsquare.\n\nИспользовать общедоступные узлы? +settings.net.warn.usePublicNodes=If you use the public Bitcoin network you are exposed to a severe privacy problem caused by the broken bloom filter design and implementation which is used for SPV wallets like BitcoinJ (used in Bisq). Any full node you are connected to could find out that all your wallet addresses belong to one entity.\n\nPlease read more about the details at [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nAre you sure you want to use the public nodes? settings.net.warn.usePublicNodes.useProvided=Нет, использовать предоставленные узлы settings.net.warn.usePublicNodes.usePublic=Да, использовать общедоступную сеть settings.net.warn.useCustomNodes.B2XWarning=Убедитесь, что ваш узел Биткойн является доверенным узлом Bitcoin Core! \n\nПодключение к узлам, не следующим правилам консенсуса Bitcoin Core, может повредить ваш кошелек и вызвать проблемы в процессе торговли.\n\nПользователи, подключающиеся к узлам, нарушающим правила консенсуса, несут ответственность за любой причиненный ущерб. Любые споры в таком случае будут решаться в пользу вашего контрагента. Пользователям, игнорирующим это предупреждение и механизмы защиты, техническая поддержка предоставляться не будет! @@ -1150,16 +1146,14 @@ setting.about.shortcuts.sendPrivateNotification=Send private notification to pee setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=Регистрация арбитра account.tab.mediatorRegistration=Mediator registration account.tab.refundAgentRegistration=Refund agent registration account.tab.signing=Signing -account.tab.account=Счёт account.info.headline=Добро пожаловать в ваш счёт Bisq account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=Could not complete registration.{0 account.altcoin.yourAltcoinAccounts=Ваши альткойн-счета account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases. account.altcoin.popup.wallet.confirm=Я понимаю и подтверждаю, что знаю, какой кошелёк нужно использовать. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=При создании транзакции в GRIN требуется взаимодействие в реальном времени между отправителем и получателем. Следуйте инструкциям на веб-сайте проекта GRIN, чтобы узнать, как отправлять и получать GRIN (получатель должен находиться в сети в момент отправки перевода или в течение определенного периода). \n\nBisq поддерживает кошельки только в формате Grinbox (Wallet713). \n\nОтправитель GRIN должен предоставить доказательство успешной отправки перевода. Если отправитель не сможет предоставить это доказательство, потенциальный спор будет решен в пользу получателя GRIN. Убедитесь, что используете последнюю версию Grinbox с поддержкой доказательства транзакций и что понимаете, как нужно отправлять и получать GRIN, а также как создавать доказательство перевода. \n\nЧтобы узнать подробности работы с инструментом доказательства транзакции в Grinbox, см. https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=При создании транзакции в BEAM требуется взаимодействие в реальном времени между отправителем и получателем. \n\nСледуйте инструкциям на веб-сайте проекта BEAM, чтобы узнать, как отправлять и получать BEAM (получатель должен находиться в сети в момент отправки перевода или в течение определенного периода). \n\nОтправитель BEAM должен предоставить доказательство успешной отправки перевода. Используйте кошелёк, позволяющий получить доказательство перевода. Если отправитель не сможет предоставить это доказательство, потенциальный спор будет решен в пользу получателя BEAM. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Trading L-BTC on Bisq requires that you understand the following:\n\nWhen receiving L-BTC for a trade on Bisq, you cannot use the mobile Blockstream Green Wallet app or a custodial/exchange wallet. You must only receive L-BTC into the Liquid Elements Core wallet, or another L-BTC wallet which allows you to obtain the blinding key for your blinded L-BTC address.\n\nIn the event mediation is necessary, or if a trade dispute arises, you must disclose the blinding key for your receiving L-BTC address to the Bisq mediator or refund agent so they can verify the details of your Confidential Transaction on their own Elements Core full node.\n\nFailure to provide the required information to the mediator or refund agent will result in losing the dispute case. In all cases of dispute, the L-BTC receiver bears 100% of the burden of responsibility in providing cryptographic proof to the mediator or refund agent.\n\nIf you do not understand these requirements, do not trade L-BTC on Bisq. account.fiat.yourFiatAccounts=Ваши счета в нац. валюте @@ -1213,7 +1222,6 @@ account.backup.location=Место хранения резервной копи account.backup.selectLocation=Выбрать место сохранения резервной копии account.backup.backupNow=Создать резервную копию (резервная копия не зашифрована!) account.backup.appDir=Каталог данных приложения -account.backup.logFile=Файл журнала account.backup.openDirectory=Открыть каталог account.backup.openLogFile=Открыть файл журнала account.backup.success=Резервная копия успешно сохранена в:\n{0} @@ -1227,7 +1235,7 @@ account.password.info=При использовании пароля его не account.seed.backup.title=Сохраните мнемоническую фразу для вашего кошелька account.seed.info=Запишите мнемоническую фразу для кошелька и дату создания его! Используя эти данные, вы сможете восстановить ваш кошелёк когда угодно.\nДля обоих кошельков, BTC и BSQ, используется одна и та же мнемоническая фраза.\n\nВам следует записать её на бумаге и не хранить на компьютере.\n\nМнемоническая фраза НЕ заменяет резервную копию.\nВам следует сделать резервную копию всего каталога приложения в разделе \«Счёт/Резервное копирование\» для восстановления состояния приложения и данных.\nИмпорт мнемонической фразы рекомендуется только в экстренных случаях. Приложение не будет функционировать должным образом без наличия резервной копии файлов базы данных и ключей! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. account.seed.warn.noPw.msg=Вы не установили пароль от кошелька для защиты мнемонической фразы.\n\nОтобразить мнемоническую фразу на экране? account.seed.warn.noPw.yes=Да и не спрашивать снова account.seed.enterPw=Введите пароль, чтобы увидеть мнемоническую фразу @@ -1241,14 +1249,11 @@ account.seed.restore.ok=Восстановить и закрыть Bisq account.notifications.setup.title=Установка account.notifications.download.label=Скачать мобильное приложение -account.notifications.download.button=Скачать account.notifications.waitingForWebCam=Ожидание веб-камеры... account.notifications.webCamWindow.headline=Сканировать код QR с телефона account.notifications.webcam.label=Использовать веб-камеру account.notifications.webcam.button=Сканировать код QR account.notifications.noWebcam.button=Нет веб-камеры -account.notifications.testMsg.label=Отправить тестовое уведомление -account.notifications.testMsg.title=Проверка account.notifications.erase.label=Очистить уведомления на телефоне account.notifications.erase.title=Очистить уведомления account.notifications.email.label=Токен сопряжения @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=Отклонение в про account.notifications.marketAlert.addButton=Добавить оповещение о предложении account.notifications.marketAlert.manageAlertsButton=Управление оповещениями о предложениях account.notifications.marketAlert.manageAlerts.title=Управление оповещениями о предложениях -account.notifications.marketAlert.manageAlerts.label=Оповещения о предложении -account.notifications.marketAlert.manageAlerts.item=Оповещение о предложении {0} с начальной ценой {1} и платежным счетом {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=Платёжный счёт account.notifications.marketAlert.manageAlerts.header.trigger=Начальная цена account.notifications.marketAlert.manageAlerts.header.offerType=Тип предложения @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=Баланс всех неподтвержденных dao.lockedForVoteBalance=Использовано для голосования dao.lockedInBonds=Заблокировано в гарантийных депозитах dao.availableNonBsqBalance=Доступный баланс в ВТС (без учёта BSQ) -dao.totalBsqBalance=Общий баланс BSQ dao.reputationBalance=Merit Value (not spendable) dao.tx.published.success=Ваша транзакция опубликована. @@ -1455,11 +1457,6 @@ dao.param.currentValue=Текущее значение {0} dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1}) dao.param.blocks={0} блоков -dao.results.cycle.duration.label=Продолжительность {0} -dao.results.cycle.duration.value={0} блок (-ов) -dao.results.cycle.value.postFix.isDefaultValue=(значение по умолчанию) -dao.results.cycle.value.postFix.hasChanged=(были изменены при голосовании) - dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=Соль dao.bond.reputation.hash=Хеш dao.bond.reputation.lockupButton=Заблокировать dao.bond.reputation.lockup.headline=Подтвердить транзакцию блокировки -dao.bond.reputation.lockup.details=Заблокированная сумма: {0}\nВремя разблокирования: {1} блок (-а/-ов) (≈{2})\n\nКомиссия: {3} ({4} сатоши/байт)\nРазмер транзакции: {5} Кб\n\nХотите продолжить? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=Подтвердить транзакцию разблокировки -dao.bond.reputation.unlock.details=Разблокированная сумма: {0}\nВремя разблокирования: {1} блок (-а/-ов) (≈{2})\n\nКомиссия: {3} ({4} сатоши/байт)\nРазмер транзакции: {5} Кб\n\nХотите продолжить? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=Все гарантийные депозиты @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=Подписать dao.proofOfBurn.message=Сообщение dao.proofOfBurn.sig=Подпись dao.proofOfBurn.verify=Подтвердить -dao.proofOfBurn.verify.header=Подтвердить сообщение ключом из транзакции proof or burn dao.proofOfBurn.verificationResult.ok=Подтверждено dao.proofOfBurn.verificationResult.failed=Проверка не удалась @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Exact GitHub username dao.proposal.display.link=Ссылка на подробную информацию dao.proposal.display.link.prompt=Ссылка на предложение dao.proposal.display.requestedBsq=Запрашиваемая сумма в BSQ -dao.proposal.display.bsqAddress=BSQ-адрес dao.proposal.display.txId=Идент. транзакции предложения dao.proposal.display.proposalFee=Сбор за предложение dao.proposal.display.myVote=Мой голос dao.proposal.display.voteResult=Сводка итогов голосования dao.proposal.display.bondedRoleComboBox.label=Тип обеспеченной роли dao.proposal.display.requiredBondForRole.label=Требуемый гарантийный депозит для роли -dao.proposal.display.tickerSymbol.label=Биржевой код dao.proposal.display.option=Вариант dao.proposal.table.header.proposalType=Тип предложения dao.proposal.table.header.link=Ссылка dao.proposal.table.header.myVote=Мой голос +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=Удалить dao.proposal.table.icon.tooltip.removeProposal=Удалить моё предложение dao.proposal.table.icon.tooltip.changeVote=Текущий голос: «{0}». Изменить на: «{1}» @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=Баланс моего кошелька dao.wallet.receive.fundYourWallet=Ваш адрес BSQ dao.wallet.receive.bsqAddress=Адрес кошелька BSQ (новый неиспользованный адрес) -dao.wallet.receive.dao.headline=ДАО Bisq -dao.wallet.receive.daoInfo=Модель управления Bisq так же децентрализована и защищена от цензуры, как и сама биржа Bisq. Это возможно благодаря ДАО Bisq и токену BSQ. -dao.wallet.receive.daoInfo.button=Подробнее о ДАО Bisq -dao.wallet.receive.daoTestnetInfo=Основная сеть ДАО Bisq еще не запущена, но вы можете узнать о ней подробнее, запустив ДАО в тестовой сети. -dao.wallet.receive.daoTestnetInfo.button=Как запустить ДАО Bisq в нашей тестовой сети -dao.wallet.receive.daoContributorInfo=Если вы внесли свой вклад в Bisq, используйте свой адрес BSQ ниже и запросите участие в первоначальном распределении BSQ. -dao.wallet.receive.daoContributorInfo.button=Как принять участие в первоначальном распределении BSQ - dao.wallet.send.sendFunds=Отправить средства dao.wallet.send.sendBtcFunds=Отправить средства (BTC), исключая BSQ dao.wallet.send.amount=Сумма в BSQ dao.wallet.send.btcAmount=Сумма в ВТС (исключая BSQ) dao.wallet.send.setAmount=Установленная сумма для вывода (мин. сумма равна {0}) -dao.wallet.send.setBtcAmount=Установить сумму вывода в BTC (мин. сумма {0}) dao.wallet.send.receiverAddress=BSQ-адрес получателя dao.wallet.send.receiverBtcAddress=BTC-адрес получателя dao.wallet.send.setDestinationAddress=Укажите адрес получателя dao.wallet.send.send=Отправить BSQ dao.wallet.send.sendBtc=Отправить BTC dao.wallet.send.sendFunds.headline=Подтвердите запрос на вывод средств -dao.wallet.send.sendFunds.details=Отправка: {0}\nАдрес получателя: {1}.\nКомиссия за транзакцию: {2} ({3} сатоши/байт)\nРазмер транзакции: {4} Кб\n\nК получению: {5}\n\nВывести эту сумму? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=Последний проверенный блок: {0} dao.wallet.chainHeightSyncing=Ожидание блоков... Проверено: {0} бл. из {1} dao.wallet.tx.type=Тип @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=У вас недостаточно BTC dao.proposal.create.missingIssuanceFunds=У вас недостаточно BTC для создания предложения. Любая транзакция в BSQ требует оплаты комиссии в ВТС. Все транзакции, в том числе связанные с эмиссией BSQ, для выплаты запрошенной суммы BSQ требуют оплаты комиссии в ВТС ({0} сатоши/BSQ).\nНе хватает: {1} dao.feeTx.confirm=Подтвердить транзакцию {0} -dao.feeTx.confirm.details=Комиссия в {0}: {1}\nКомиссия майнера: {2} ({3} сатоши/байт)\nРазмер транзакции: {4} Кб\n\nДействительно хотите опубликовать транзакцию {5}? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details=Комиссия в {0}: {1}\nКол-во BTC, необходимое для эмиссии BSQ: {2} ({3} сатоши/BSQ)\nКомиссия майнера: {4} ({5} сатоши/байт)\nРазмер транзакции: {6} Kb\n\nЕсли ваш запрос будет одобрен, вы получите запрошенную сумму за вычетом 2 BSQ в качестве комиссии за выдвижение предложения.\n\nХотите опубликовать транзакцию {7}? +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=ДАО BISQ dao.news.bisqDAO.description=Модель управления Bisq так же децентрализована и защищена от цензуры, как и сама биржа Bisq. Это возможно благодаря ДАО Bisq и токену BSQ. @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=Кол-во слепых голосо dao.factsAndFigures.menuItem.supply=Предложение BSQ dao.factsAndFigures.menuItem.transactions=Транзакции в BSQ -dao.factsAndFigures.dashboard.marketPrice=Данные рынка -dao.factsAndFigures.dashboard.price=Текущий курс BSQ/BTC (в Bisq) dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=Скачать позже displayUpdateDownloadWindow.button.ignoreDownload=Игнорировать эту версию displayUpdateDownloadWindow.headline=Доступно новое обновление Bisq! displayUpdateDownloadWindow.download.failed.headline=Загрузка не удалась -displayUpdateDownloadWindow.download.failed=Сбой загрузки.\nСкачайте и проверьте вручную на https://bisq.network/downloads -displayUpdateDownloadWindow.installer.failed=Не удалось определить правильный установщик. Скачайте и проверьте вручную на https://bisq.network/downloads -displayUpdateDownloadWindow.verify.failed=Проверка не удалась.\nСкачайте и проверьте вручную на https://bisq.network/downloads +displayUpdateDownloadWindow.download.failed=Download failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verification failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=Новая версия загружена, а её подпись проверена.\n\nОткройте директорию загрузки, закройте приложение и установите новую версию. displayUpdateDownloadWindow.download.openDir=Открыть директорию загрузки @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=Выплата суммы сделки disputeSummaryWindow.payout.getsTradeAmount={0} BTC получит выплату суммы сделки disputeSummaryWindow.payout.getsAll={0} BTC получит всё disputeSummaryWindow.payout.custom=Пользовательская выплата -disputeSummaryWindow.payout.adjustAmount=Введённая сумма превышает доступное количество {0}. \nМы введём максимально возможное значение. disputeSummaryWindow.payoutAmount.buyer=Сумма выплаты покупателя disputeSummaryWindow.payoutAmount.seller=Сумма выплаты продавца disputeSummaryWindow.payoutAmount.invert=Проигравший публикует @@ -2055,6 +2038,7 @@ disputeSummaryWindow.addSummaryNotes=Добавить примечания disputeSummaryWindow.close.button=Закрыть обращение # Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification @@ -2064,9 +2048,11 @@ disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and a disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions disputeSummaryWindow.close.closePeer=Вам также необходимо закрыть обращение контрагента! disputeSummaryWindow.close.txDetails.headline=Publish refund transaction +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n -disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? disputeSummaryWindow.close.noPayout.headline=Close without any payout disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? @@ -2101,6 +2087,7 @@ filterWindow.btcNode=Отфильтрованные узлы Биткойн (а filterWindow.preventPublicBtcNetwork=Не использовать общедоступную сеть Биткойн filterWindow.disableDao=Отключить ДАО filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Мин. версия, необходимая для работы с ДАО filterWindow.disableTradeBelowVersion=Мин. версия, необходимая для торговли filterWindow.add=Добавить фильтр @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=Выберите транзакцию ввода selectDepositTxWindow.msg=Транзакция ввода средств не сохранилась в сделке.\nВыберите в своём кошельке одну из существующих multisig-транзакций, которая использовалась для ввода средств в неудавшейся сделке.\n\nНужную транзакцию можно найти, открыв окно сведений о сделке (щелкните на идентификаторе сделки в списке). Multisig-транзакция ввода средств (её адрес начинается с 3) следует сразу за транзакцией оплаты торгового сбора. Этот идентификатор транзакции должен быть виден в представленном здесь списке. После того, как вы найдёте нужную транзакцию, выберите её здесь и продолжите.\n\nПриносим извинения за неудобство. Такие ошибки случаются редко, и мы работаем над тем, чтобы найти наилучший способ их решения. selectDepositTxWindow.select=Выберите транзакцию ввода средств -selectBaseCurrencyWindow.headline=Выбор рынка -selectBaseCurrencyWindow.msg=Выбранный рынок по умолчанию: {0}.\n\nЕсли вы хотите изменить базовую валюту, выберите её в раскрывающемся списке.\nВы также можете изменить базовую валюту в разделе \«Настройки/Параметры\». -selectBaseCurrencyWindow.select=Выбор базовой валюты - sendAlertMessageWindow.headline=Отправить глобальное уведомление sendAlertMessageWindow.alertMsg=Предупреждение sendAlertMessageWindow.enterMsg=Введите сообщение @@ -2232,9 +2215,8 @@ error.closedTradeWithNoDepositTx=The deposit transaction of the closed trade wit popup.warning.walletNotInitialized=Кошелёк ещё не инициализирован popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. popup.warning.wrongVersion=Вероятно, у вас установлена не та версия Bisq.\nАрхитектура Вашего компьютера: {0}.\nУстановленная версия Bisq: {1}.\nЗакройте приложение и установите нужную версию ({2}). -popup.warning.incompatibleDB=Обнаружены несовместимые файлы базы данных!\nБазы данных этих файлов несовместимы с нашей текущей базой кода:\n{0}\n\nМы сделали резервную копию повреждённых файлов и применили значения по умолчанию к новой версии базы данных.\n\nРезервная копия находится по адресу:\n{1}/db/backup_of_corrupted_data.\n\nПроверьте, установлена ли у вас новейшая версия Bisq.\nВы можете скачать её по адресу:\nhttps://bisq.network/downloads\n\nПерезапустите приложение. +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 new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application. popup.warning.startupFailed.twoInstances=Bisq уже запущен. Нельзя запустить два экземпляра Bisq. -popup.warning.cryptoTestFailed=Кажется, вы используете самостоятельно скомпилированный двоичный файл и не следуете инструкциям сборки, указанным по ссылке https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nЕсли это не так и вы используете официальный двоичный файл Bisq, опубликуйте отчет об ошибке на Github.\nОшибка={0} popup.warning.tradePeriod.halfReached=Половина макс. допустимого срока сделки с идентификатором {0} истекла, однако она до сих пор не завершена.\n\nСрок сделки заканчивается {1}\n\nДополнительную информацию о состоянии сделки можно узнать в разделе \«Сделки/Текущие сделки\». 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 mediator. popup.warning.noTradingAccountSetup.headline=Вы не создали торговый счёт @@ -2258,7 +2240,9 @@ popup.warning.noBsqFundsForBtcFeePayment=В вашем кошельке BSQ не popup.warning.messageTooLong=Ваше сообщение превышает макс. разрешённый размер. Разбейте его на несколько частей или загрузите в веб-приложение для работы с отрывками текста, например https://pastebin.com. popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"." +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=ретранслятор курса popup.warning.seed=мнемоническая фраза popup.warning.mandatoryUpdate.trading=Обновите Bisq до последней версии. Вышло обязательное обновление, которое делает невозможной торговлю в старых версиях приложения. Посетите форум Bisq, чтобы узнать подробности. @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=The {0} transaction for trade with ID {1} was rej popup.warning.openOfferWithInvalidMakerFeeTx=The maker fee transaction for offer with ID {0} is invalid.\nTransaction ID={1}.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -popup.warning.trade.depositTxNull=The trade with ID ''{0}'' has no deposit transaction set.\n\nPlease restart the application to see if the problem still exists.\n\nIf it does, please open the trade details popup by clicking on the trade ID. Then click on the transaction IDs for the maker fee transaction and the taker fee transaction to view them on a block explorer. A transaction that cannot be found in a block explorer is probably an invalid transaction.\n\nIf this happens, please report it in the #support channel on the Bisq Keybase (https://keybase.io/team/bisq). If your trade fee transaction is invalid, no funds have left your wallet, you can move the trade to failed trades,and do an SPV resync for your funds to reappear (see how below).\n\nIf your trade fee transaction is valid, the fee amount is lost, and you can make a request for reimbursement on the support repository on GitHub (https://github.com/bisq-network/support/issues).\n\nIn both cases, please do an SPV resync from the ''Settings/Network'' screen to clean your wallet of any lingering issues! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Move to failed trades -popup.warning.trade.depositTxNull.shutDown=Shut down Bisq - popup.info.securityDepositInfo=Чтобы гарантировать соблюдение торгового протокола трейдерами, им обоим необходимо внести залог.\n\nЗалог останется в вашем кошельке до успешного завершения сделки, а затем будет возвращен вам.\n\nОбратите внимание, что если вы создаёте новое предложение, приложение Bisq должно быть подключено к сети, чтобы его могли принять другие трейдеры. Чтобы ваши предложения были доступны в сети, компьютер и приложение должны быть включены и подключены к сети (убедитесь, что компьютер не перешёл в режим ожидания; переход монитора в спящий режим не влияет на работу приложения). popup.info.cashDepositInfo=Убедитесь, что в вашем районе есть отделение банка, где можно произвести перевод наличных.\nИдентификатор (BIC/SWIFT) банка продавца: {0}. popup.info.cashDepositInfo.confirm=Я подтверждаю, что могу внести оплату popup.info.shutDownWithOpenOffers=Bisq закрывается, но у вас есть открытые предложения.\n\nЭти предложения будут недоступны в сети P2P, пока приложение Bisq закрыто, но будут повторно опубликованы в сети P2P при следующем запуске Bisq.\n\nЧтобы ваши предложения были доступны в сети, компьютер и приложение должны быть включены и подключены к сети (убедитесь, что компьютер не перешёл в режим ожидания; переход монитора в спящий режим не влияет на работу приложения). -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=Важное личное уведомление! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=Обратите внимание на сделк popup.info.multiplePaymentAccounts.headline=Доступно несколько платёжных счетов popup.info.multiplePaymentAccounts.msg=У вас есть несколько платёжных счетов, доступных для этого предложения. Просьба убедиться, что вы выбрали правильный счёт. -popup.news.launch.headline=Two Major Updates -popup.news.launch.accountSigning.headline=ACCOUNT SIGNING -popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer. -popup.news.launch.ntp.headline=NEW TRADE PROTOCOL -popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant. - popup.accountSigning.selectAccounts.headline=Select payment accounts popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign. popup.accountSigning.selectAccounts.signAll=Sign all payment methods @@ -2324,7 +2297,7 @@ popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey popup.accountSigning.success.headline=Congratulations popup.accountSigning.success.description=All {0} payment accounts were successfully signed! -popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0} popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1} popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0} @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=Signing completed popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: A decentralized bitcoin exchange network # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=Торговые счета в:\n{0} guiUtil.accountExport.noAccountSetup=У вас нет торговых счетов для экспортирования. @@ -2463,6 +2435,7 @@ navigation.portfolio.pending=\«Сделки/Текущие сделки\» navigation.portfolio.closedTrades=\«Сделки/История\» navigation.funds.depositFunds=\«Средства/Получить средства\» navigation.settings.preferences=\«Настройки/Параметры\» +# suppress inspection "UnusedProperty" navigation.funds.transactions=\«Средства/Транзакции\» navigation.support=\«Поддержка\» navigation.dao.wallet.receive=\«ДАО/BSQ-кошелёк/Получить\» @@ -2525,11 +2498,11 @@ password.deriveKey=Извлечь ключ из пароля password.walletDecrypted=Кошелёк успешно расшифрован, защита паролем удалена. password.wrongPw=Вы ввели неверный пароль.\n\nПопробуйте снова, обратив внимание на возможные ошибки ввода. password.walletEncrypted=Кошелёк успешно зашифрован, защита паролем включена. -password.walletEncryptionFailed=Не удалось установить пароль на кошелёк. Возможно, вы импортировали мнемоническую фразу, не соответствующую базе данных кошелька. Просьба связаться с разработчиками на форуме Bisq. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=Введённые вами 2 пароля не совпадают. password.forgotPassword=Забыли пароль? -password.backupReminder=При установке пароля кошелька все автоматически создаваемые резервные копии незашифрованного кошелька будут удалены.\n\nНастоятельно рекомендуется сделать резервную копию директории приложения и записать мнемоническую фразу перед установкой пароля! -password.backupWasDone=Я уже сделал (-а) резервную копию +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=Мнемоническая фраза кошелька seed.enterSeedWords=Введите мнемоническую фразу кошелька @@ -2537,7 +2510,7 @@ seed.date=Дата создания кошелька seed.restore.title=Восстановить кошельки с помощью мнемонической фразы seed.restore=Восстановить кошельки seed.creationDate=Дата создания -seed.warn.walletNotEmpty.msg=В вашем биткойн-кошельке остались средства.\n\nВы должны вывести все средства из него, прежде чем пытаться восстановить старый, так как смешивание кошельков может привести к недействительным резервным копиям.\n\nЗавершите свои сделки, закройте все открытые предложения и перейдите в раздел «Средства», чтобы вывести свои биткойны.\nЕсли вы не сможете получить доступ к своим биткойнам, можно воспользоваться аварийным инструментом для вывода средств из кошелька.\nЧтобы открыть этот аварийный инструмент, нажмите \«alt + e\» или \«option + e\». +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=Всё равно хочу восстановить seed.warn.walletNotEmpty.emptyWallet=Вывести все средства с моих кошельков seed.warn.notEncryptedAnymore=Ваши кошельки зашифрованы.\n\nПосле восстановления кошельки больше не будут зашифрованы, и вам потребуется установить новый пароль.\n\nПродолжить? @@ -2578,12 +2551,11 @@ payment.altcoin.address=Альткойн-адрес payment.altcoin.tradeInstantCheckbox=Совершайте мгновенные сделки (в течение 1 часа) с этим альткойном payment.altcoin.tradeInstant.popup=Для ускоренной торговли требуется, чтобы оба контрагента были в сети и могли завершить сделку менее чем за 1 час.\n\nЕсли у вас есть текущие предложения, но вы не можете находиться в сети, отключите их в разделе «Папка». payment.altcoin=Альткойны -payment.select.altcoin=Выберите или найдите альткойн +payment.select.altcoin=Select or search Altcoin payment.secret=Секретный вопрос payment.answer=Ответ payment.wallet=Идентификатор кошелька payment.uphold.accountId=Имя пользователя, эл. адрес или тел. номер -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=Эл. адрес или тел. номер payment.venmo.venmoUserName=Имя пользователя Venmo payment.popmoney.accountId=Эл. адрес или тел. номер @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=Удостовер. личности / налог. payment.supportedCurrencies=Поддерживаемые валюты payment.limitations=Ограничения payment.salt=Модификатор («соль») для подтверждения возраста счёта -payment.error.noHexSalt=«Соль» должна быть в шестнадцатеричном формате.\nРекомендуется редактировать поле «соли» только при переносе её из старого счёта, чтобы сохранить его возраст. Возраст проверяется с помощью «соли» и уникальных данных счёта (напр. IBAN). +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=Принять сделки из этих стран, использующих EUR payment.accept.nonEuro=Принять сделки из этих стран, не использующих EUR payment.accepted.countries=Одобренные страны @@ -2625,31 +2597,33 @@ payment.accountType=Тип счёта payment.checking=Текущий payment.savings=Сберегательный payment.personalId=Личный идентификатор -payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle:\nhttps://www.zellepay.com/get-started\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. +payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Bisq to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved. -payment.moneyGram.info=При использовании MoneyGram покупатель BTC должен отправить по электронной почте продавцу BTC код подтверждения и фотографию квитанции. В квитанции должно быть четко указано полное имя продавца, страна, штат (область) и сумма. Электронный адрес продавца будет показан покупателю в процессе сделки. -payment.westernUnion.info=При использовании Western Union покупатель BTC должен отправить по электронной почте продавцу BTC контрольный номер MTCN и фотографию квитанции. В квитанции должно быть четко указано полное имя продавца, страна, город и сумма. Электронный адрес продавца будет показан покупателю в процессе сделки. +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=Используя HalCash, покупатель BTC обязуется отправить продавцу BTC код HalCash через СМС с мобильного телефона.\n\nУбедитесь, что не вы не превысили максимальную сумму, которую ваш банк позволяет отправить с HalCash. Минимальная сумма на вывод средств составляет 10 EUR, а и максимальная — 600 EUR. При повторном выводе средств лимит составляет 3000 EUR на получателя в день и 6000 EUR на получателя в месяц. Просьба сверить эти лимиты с вашим банком и убедиться, что лимиты банка соответствуют лимитам, указанным здесь.\n\nВыводимая сумма должна быть кратна 10 EUR, так как другие суммы снять из банкомата невозможно. Приложение само отрегулирует сумму BTC, чтобы она соответствовала сумме в EUR, во время создания или принятия предложения. Вы не сможете использовать текущий рыночный курс, так как сумма в EUR будет меняться с изменением курса.\n\nВ случае спора покупателю BTC необходимо предоставить доказательство отправки EUR. -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\nTo mitigate this risk, Bisq sets per-trade limits based on two factors:\n\n1. The estimated level of chargeback risk for the payment method used\n2. The age of your account for that payment method\n\nThe account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\n● During the 1st month, your per-trade limit will be {0}\n● During the 2nd month, your per-trade limit will be {1}\n● After the 2nd month, your per-trade limit will be {2}\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. -payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase with account age.\n\nSee more:\nhttps://bisq.wiki/Account_limits\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=Убедитесь, что ваш банк позволяет отправлять денежные переводы на счета других лиц. Например, Bank of America и Wells Fargo больше не разрешают такие переводы. payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=Update Revolut account payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. payment.f2f.contact=Контактная информация -payment.f2f.contact.prompt=Как вы хотите связаться с контрагентом? (электронная почта, телефон...) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=Город для личной встречи payment.f2f.city.prompt=Город будет указан в предложении payment.f2f.optionalExtra=Дополнительная необязательная информация payment.f2f.extra=Дополнительная информация payment.f2f.extra.prompt=Мейкер вправе определить условия сделки или добавить общедоступную контактную информацию. Эти данные будут указаны в предложении. -payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading' +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=Открыть веб-страницу payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1} payment.f2f.offerbook.tooltip.extra=Дополнительная информация: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=Банк payment.japan.branch=Branch payment.japan.account=Счёт payment.japan.recipient=Имя +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=Личная встреча JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=Национальные банки @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=Личная встреча # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Альткойны (мгновенно) # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Альткойны (мгновенно) # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=Введённое значение не может быть р validation.negative=Отрицательное значение недопустимо. validation.fiat.toSmall=Ввод значения меньше минимально возможного не допускается. validation.fiat.toLarge=Ввод значения больше максимально возможного не допускается. -validation.btc.fraction=Результатом ввода является биткойн с долей наименьшей единицы (сатоши). +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=Значение не может превышать {0}. validation.btc.toSmall=Значение не может быть меньше {0}. -validation.securityDeposit.toSmall=Значение не может быть меньше {0}. -validation.passwordTooShort=Введенный пароль слишком короткий. Его длина должна составлять не менее 8 символов. +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=Введенный пароль слишком длинный. Его длина не должна превышать 50 символов. validation.sortCodeNumber={0} должен состоять из {1} цифр. validation.sortCodeChars={0} должен состоять из {1} символов. @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} должен состоять из {1} цифр #new validation.invalidInput=Недействительное значение: {0} validation.accountNrFormat=Допустимый формат номера счёта: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=Сбой проверки адреса. Адрес не соответствует структуре адреса {0}. -validation.altcoin.ltz.zAddressesNotSupported=Адрес LTZ должен начинаться с L. Адреса, начинающиеся с z, не поддерживаются. -validation.altcoin.zAddressesNotSupported=Адрес ZEC должен начинаться с t. Адреса, начинающиеся с z, не поддерживаются. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=Адрес не является действительным адресом {0}! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Native segwit addresses (those starting with 'lq') are not supported. -validation.bic.invalidLength=Значение не равно 8 или 11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=Код банка и страны должен быть буквенным validation.bic.invalidLocationCode=BIC содержит недействительный код местности validation.bic.invalidBranchCode=BIC содержит недействительный код отделения validation.bic.sepaRevolutBic=Счета SEPA в Revolut не поддерживаются. -validation.btc.invalidFormat=Неверный формат биткойн-адреса. -validation.bsq.invalidFormat=Неверный формат адреса BSQ. +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=Недействительный адрес validation.iban.invalidCountryCode=Код страны недействителен validation.iban.checkSumNotNumeric=Контрольная сумма должна иметь числовой формат validation.iban.nonNumericChars=Введен не буквенно-цифровой знак validation.iban.checkSumInvalid=Контрольная сумма IBAN недействительна -validation.iban.invalidLength=Длина номера должна составлять от 15 до 34 символов. +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=Код не канадского региона -validation.interacETransfer.invalidPhone=Неверный формат номера телефона или адрес электронной почты +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=Должен содержать только буквы, цифры, пробелы и/или символы ' _ , . ? - validation.interacETransfer.invalidAnswer=Должен состоять из одного слова, содержащего только буквы, цифры и/или символ - validation.inputTooLarge=Значение не должно превышать {0} validation.inputTooSmall=Значение должно быть более {0} validation.inputToBeAtLeast=Значение должно быть не менее {0} -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=Длина должна составлять от {0} до {1} validation.pattern=Формат значения: {0} validation.noHexString=Значение не соответствует шестнадцатеричному формату. @@ -2859,7 +2852,7 @@ validation.numberFormatException=Исключение числового фор validation.mustNotBeNegative=Значение не может быть отрицательным validation.phone.missingCountryCode=Need two letter country code to validate phone number validation.phone.invalidCharacters=Phone number {0} contains invalid characters -validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number -validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number -validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}. +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=Must be comma separated list of valid addresses diff --git a/core/src/main/resources/i18n/displayStrings_th.properties b/core/src/main/resources/i18n/displayStrings_th.properties index ebddfe418e..7527a45ad2 100644 --- a/core/src/main/resources/i18n/displayStrings_th.properties +++ b/core/src/main/resources/i18n/displayStrings_th.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=เสนอ shared.multipleOffers=ข้อเสนอ shared.Offer=การเสนอ +shared.offerVolumeCode={0} Offer Volume shared.openOffers=เปิดข้อเสนอ shared.trade=ซื้อขาย shared.trades=การซื้อขายแลกเปลี่ยน @@ -122,7 +123,8 @@ shared.noDateAvailable=ไม่มีวันที่ให้แสดง shared.noDetailsAvailable=ไม่มีรายละเอียด shared.notUsedYet=ยังไม่ได้ใช้งาน shared.date=วันที่ -shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n shared.copyToClipboard=คัดลอกไปที่คลิปบอร์ด shared.language=ภาษา @@ -188,7 +190,6 @@ shared.tradeWalletAddress=ที่อยู่ Trade wallet shared.tradeWalletBalance=ยอดคงเหลือของ Trade wallet shared.makerTxFee=ผู้ทำ: {0} shared.takerTxFee=ผู้รับ: {0} -shared.securityDepositBox.description=เงินประกันสำหรับ BTC {0} shared.iConfirm=ฉันยืนยัน shared.tradingFeeInBsqInfo=equivalent to {0} used as trading fee shared.openURL=เปิด {0} @@ -237,8 +238,6 @@ mainView.menu.settings=ตั้งค่า mainView.menu.account=บัญชี mainView.menu.dao=DAO -mainView.marketPrice.provider=ราคาโดย -mainView.marketPrice.label=ราคาตลาด mainView.marketPriceWithProvider.label=ราคาตลาดโดย {0} mainView.marketPrice.bisqInternalPrice=ราคาของการซื้อขาย Bisq ล่าสุด mainView.marketPrice.tooltip.bisqInternalPrice=ไม่มีราคาตลาดจากผู้ให้บริการด้านราคาภายนอก\nราคาที่แสดงเป็นราคาล่าสุดของ Bisq สำหรับสกุลเงินนั้น @@ -251,14 +250,15 @@ mainView.balance.locked.short=ถูกล็อคไว้ mainView.footer.usingTor=(ใช้งาน Tor) mainView.footer.localhostBitcoinNode=(แม่ข่ายเฉพาะที่) -mainView.footer.btcInfo=Bitcoin network peers (เครือข่ายแบบเพียร์): {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=Connecting to Bitcoin network mainView.footer.bsqInfo.synchronizing=/ Synchronizing DAO mainView.footer.btcInfo.synchronizingWith=Synchronizing with -mainView.footer.btcInfo.synchronizedWith=Synchronized with +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=Connecting to mainView.footer.btcInfo.connectionFailed=Connection failed to -mainView.footer.p2pInfo=Bisq network peers: {0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=DAO full node mainView.bootstrapState.connectionToTorNetwork=(1/4) เชื่อมต่อไปยัง Tor network... @@ -292,7 +292,6 @@ market.tabs.spread=รายละเอียด market.tabs.trades=การซื้อขาย # OfferBookChartView -market.offerBook.chart.title=การจองข้อเสนอสำหรับ {0} market.offerBook.buyAltcoin=ซื้อ {0} (ขาย {1}) market.offerBook.sellAltcoin=ขาย {0} (ซื้อ {1}) market.offerBook.buyWithFiat=ซื้อ {0} @@ -382,7 +381,7 @@ offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you hav offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions -offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} @@ -393,8 +392,7 @@ offerbook.warning.offerBlocked=ข้อเสนอดังกล่าวถ offerbook.warning.currencyBanned=สกุลเงินที่ใช้ในข้อเสนอนั้นถูกบล็อกโดยนักพัฒนา Bisq\nสามารถอ่านข้อมูลเพิ่มเติมได้ที่ฟอรั่มของ Bisq offerbook.warning.paymentMethodBanned=วิธีการชำระเงินที่ใช้ในข้อเสนอนั้นถูกบล็อกโดยนักพัฒนา Bisq\nกรุณาเข้าไปอ่านที่ Forum ของ Bisq สำหรับข้อมูลเพิ่มเติม offerbook.warning.nodeBlocked=ที่อยู่ onion ของผู้ซื้อขายรายนั้นถูกบล็อกโดยนักพัฒนา Bisq\nอาจมีข้อบกพร่องที่ไม่ได้รับการจัดการ ซึ่งก่อให้เกิดปัญหาเมื่อรับข้อเสนอจากผู้ซื้อขายรายนั้น -offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=Your payment account has been created {0} ago. Your trade limit is based on the account age and is not sufficient for that offer.\n\nYour trade limit is: {1}\nThe min. trade amount of the offer is: {2}.\n\nYou cannot take that offer at the moment. Once your account is older than 2 months this restriction gets removed. +offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. offerbook.info.sellAtMarketPrice=คุณจะขายในราคาตลาด (อัปเดตทุกนาที) @@ -444,8 +442,7 @@ createOffer.placeOfferButton=รีวิว: ใส่ข้อเสนอไ createOffer.alreadyFunded=คุณได้รับเงินจากข้อเสนอนั้นแล้ว\nเงินของคุณถูกย้ายไปที่กระเป๋าสตางค์ Bisq ของคุณและคุณสามารถถอนเงินออกได้โดยไปที่หน้า \"เงิน / ส่งเงิน \" createOffer.createOfferFundWalletInfo.headline=เงินทุนสำหรับข้อเสนอของคุณ # suppress inspection "TrailingSpacesInProperty" -createOffer.createOfferFundWalletInfo.tradeAmount=- ปริมาณการซื้อขาย: {0} -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} and {1} +createOffer.createOfferFundWalletInfo.tradeAmount=- ปริมาณการซื้อขาย: {0} createOffer.createOfferFundWalletInfo.msg=คุณต้องวางเงินมัดจำ {0} ข้อเสนอนี้\n\nเงินเหล่านั้นจะถูกสงวนไว้ใน wallet ภายในประเทศของคุณและจะถูกล็อคไว้ในที่อยู่ที่ฝากเงิน multisig เมื่อมีคนรับข้อเสนอของคุณ\n\nผลรวมของจำนวนของ: \n{1} - เงินประกันของคุณ: {2} \n- ค่าธรรมเนียมการซื้อขาย: {3} \n- ค่าขุด: {4} \n\nคุณสามารถเลือกระหว่างสองตัวเลือกเมื่อมีการระดุมทุนการซื้อขายของคุณ: \n- ใช้กระเป๋าสตางค์ Bisq ของคุณ (สะดวก แต่ธุรกรรมอาจเชื่อมโยงกันได้) หรือ\n- โอนเงินจากเงินภายนอกเข้ามา (อาจเป็นส่วนตัวมากขึ้น) \n\nคุณจะเห็นตัวเลือกและรายละเอียดการระดมทุนทั้งหมดหลังจากปิดป๊อปอัปนี้ # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -502,7 +499,7 @@ takeOffer.noPriceFeedAvailable=คุณไม่สามารถรับข takeOffer.alreadyFunded.movedFunds=คุณได้รับเงินสนับสนุนแล้ว\nเงินของคุณถูกย้ายไปที่กระเป๋าสตางค์ Bisq ของคุณและพร้อมสำหรับการถอนเงินโดยไปที่หน้า \"เงิน / ส่งเงิน \" takeOffer.takeOfferFundWalletInfo.headline=ทุนการซื้อขายของคุณ # suppress inspection "TrailingSpacesInProperty" -takeOffer.takeOfferFundWalletInfo.tradeAmount=- ปริมาณการซื้อขาย: {0} +takeOffer.takeOfferFundWalletInfo.tradeAmount=- ปริมาณการซื้อขาย: {0} takeOffer.takeOfferFundWalletInfo.msg=คุณต้องวางเงินประกัน {0} เพื่อรับข้อเสนอนี้\n\nจำนวนเงินคือผลรวมของ: \n{1} - เงินประกันของคุณ: {2} \n- ค่าธรรมเนียมการซื้อขาย: {3} \n- ค่าธรรมเนียมการขุดทั้งหมด: {4} \n\nคุณสามารถเลือกระหว่างสองตัวเลือกเมื่อลงทุนการซื้อขายของคุณ: \n- ใช้กระเป๋าสตางค์ Bisq ของคุณ (สะดวก แต่ธุรกรรมอาจเชื่อมโยงกันได้) หรือ\n- โอนเงินจากแหล่งเงินภายนอก (อาจเป็นส่วนตัวมากขึ้น) \n\nคุณจะเห็นตัวเลือกและรายละเอียดการลงทุนทั้งหมดหลังจากปิดป๊อปอัปนี้ takeOffer.alreadyPaidInFunds=หากคุณได้ชำระเงินแล้วคุณสามารถถอนเงินออกได้ในหน้าจอ \"เงิน / ส่งเงิน \" takeOffer.paymentInfo=ข้อมูลการชำระเงิน @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=คุณไม่สามารถรับข takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again. takeOffer.error.noFundsLost=\n\nยังไม่มีเงินเหลือ wallet อยู่เลย\nโปรดลองเริ่มแอปพลิเคชันของคุณใหม่และตรวจสอบการเชื่อมต่อเครือข่ายของคุณเพื่อดูว่าคุณสามารถแก้ไขปัญหาได้หรือไม่ +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nธุรกรรมเงินฝากได้รับการเผยแพร่เป็นที่เรียบร้อยแล้ว\nโปรดลองเริ่มแอปพลิเคชันของคุณใหม่และตรวจสอบการเชื่อมต่อเครือข่ายของคุณเพื่อดูว่าคุณสามารถแก้ไขปัญหาได้หรือไม่?\nหากปัญหายังคงอยู่โปรดติดต่อนักพัฒนาซอฟต์แวร์เพื่อขอความช่วยเหลือ takeOffer.error.payoutPublished=\n\nมีการเผยแพร่รายการการชำระแล้ว\nโปรดลองเริ่มแอปพลิเคชันของคุณใหม่และตรวจสอบการเชื่อมต่อเครือข่ายของคุณเพื่อดูว่าคุณสามารถแก้ไขปัญหาได้หรือไม่?\nหากปัญหายังคงอยู่โปรดติดต่อนักพัฒนาซอฟต์แวร์เพื่อขอความช่วยเหลือ @@ -543,7 +541,7 @@ portfolio.tab.history=ประวัติ portfolio.tab.failed=ผิดพลาด portfolio.tab.editOpenOffer=แก้ไขข้อเสนอ -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance.\n\nError message: {0} portfolio.pending.step1.waitForConf=รอการยืนยันของบล็อกเชน portfolio.pending.step2_buyer.startPayment=เริ่มการชำระเงิน @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=ข้อกำหนดที่ # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=โปรดชำระเงิน {0} ให้กับผู้ขาย BTC โดยใช้ Western Union portfolio.pending.step2_buyer.westernUnion.extra=ข้อกำหนดที่สำคัญ: \nหลังจากที่คุณได้ชำระเงินแล้วให้ส่ง MTCN (หมายเลขติดตาม) และรูปใบเสร็จรับเงินไปยังผู้ขาย BTC ทางอีเมล\nใบเสร็จจะต้องแสดงชื่อเต็ม เมือง ประเทศ และจำนวนเงินทั้งหมดของผู้ขาย อีเมลของผู้ขายคือ: {0} +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=โปรดส่ง {0} โดยธนาณัติ \"US Postal Money Order \" ไปยังผู้ขาย BTC\n @@ -636,7 +636,7 @@ portfolio.pending.step2_buyer.confirmStart.headline=ยืนยันว่า portfolio.pending.step2_buyer.confirmStart.msg=คุณได้เริ่มต้นการ {0} การชำระเงินให้กับคู่ค้าของคุณแล้วหรือยัง portfolio.pending.step2_buyer.confirmStart.yes=ใช่ฉันได้เริ่มต้นการชำระเงินแล้ว portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway portfolio.pending.step2_seller.waitPayment.headline=รอการชำระเงิน @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=ข้อมูลการต portfolio.pending.step2_seller.waitPayment.msg=ธุรกรรมการฝากเงินมีการยืนยันบล็อกเชนอย่างน้อยหนึ่งรายการ\nคุณต้องรอจนกว่าผู้ซื้อ BTC จะเริ่มการชำระเงิน {0} portfolio.pending.step2_seller.warn=ผู้ซื้อ BTC ยังไม่ได้ทำ {0} การชำระเงิน\nคุณต้องรอจนกว่าผู้ซื้อจะเริ่มชำระเงิน\nหากการซื้อขายยังไม่เสร็จสิ้นในวันที่ {1} ผู้ไกล่เกลี่ยจะดำเนินการตรวจสอบ portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance. -portfolio.pending.step2_seller.refresh=Refresh Trade State -portfolio.pending.step2_seller.refreshInfo=Sometimes P2P network messages acknowledging payment are not delivered, causing trades to get stuck. Hit the button below to make your peer resend the last message. tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}'' tradeChat.openChat=Open chat window tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=เนื่องจากการชำ portfolio.pending.step3_seller.moneyGram=ผู้ซื้อต้องส่งหมายเลขอนุมัติและรูปใบเสร็จรับเงินทางอีเมล\nใบเสร็จรับเงินต้องแสดงชื่อเต็มของคุณ ประเทศ รัฐ และจำนวนเงิน โปรดตรวจสอบอีเมลของคุณหากคุณได้รับหมายเลขการให้สิทธิ์\n\nหลังจากปิดป๊อปอัปคุณจะเห็นชื่อและที่อยู่ของผู้ซื้อ BTC เพื่อรับเงินจาก MoneyGram\n\nยืนยันเฉพาะใบเสร็จหลังจากที่คุณได้รับเงินเรียบร้อยแล้ว! portfolio.pending.step3_seller.westernUnion=ผู้ซื้อต้องส่ง MTCN (หมายเลขติดตาม) และรูปใบเสร็จรับเงินทางอีเมล\nใบเสร็จรับเงินต้องแสดงชื่อ เมือง ประเทศ และจำนวนเงินทั้งหมดไว้อย่างชัดเจน โปรดตรวจสอบอีเมลของคุณหากคุณได้รับ MTCN\n\nหลังจากปิดป๊อปอัปคุณจะเห็นชื่อและที่อยู่ของผู้ซื้อ BTC สำหรับการขอรับเงินจาก Western Union \n\nยืนยันเฉพาะใบเสร็จหลังจากที่คุณได้รับเงินเรียบร้อยแล้ว! portfolio.pending.step3_seller.halCash=ผู้ซื้อต้องส่งข้อความรหัส HalCash ให้คุณ ในขณะเดียวกันคุณจะได้รับข้อความจาก HalCash พร้อมกับคำขอข้อมูลจำเป็นในการถอนเงินยูโรุจากตู้เอทีเอ็มที่รองรับ HalCash \n\n หลังจากที่คุณได้รับเงินจากตู้เอทีเอ็มโปรดยืนยันใบเสร็จรับเงินจากการชำระเงินที่นี่ ! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=ใบเสร็จยืนยันการชำระเงิน portfolio.pending.step3_seller.amountToReceive=จำนวนเงินที่ได้รับ @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=คุณได้รั portfolio.pending.step3_seller.onPaymentReceived.fiat=ID การซื้อขาย (\"เหตุผลในการชำระเงิน \") ของธุรกรรมคือ: \"{0} \" \n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" 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.\n\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=ยืนยันว่าคุณได้รับการชำระเงินแล้ว portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=ใช่ ฉันได้รับการชำระเงินแล้ว @@ -746,7 +747,7 @@ portfolio.pending.tradePeriodInfo=หลังจากการยืนยั portfolio.pending.tradePeriodWarning=หากเกินระยะเวลานักซื้อขายทั้งสองฝ่ายสามารถเปิดข้อพิพาทได้ portfolio.pending.tradeNotCompleted=การซื้อขายไม่เสร็จสิ้นภายในเวลา (จนถึง {0}) portfolio.pending.tradeProcess=กระบวนการทางการซื้อขาย -portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community. +portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=เปิดข้อพิพาทอีกครั้ง portfolio.pending.openSupportTicket.headline=เปิดปุ่มช่วยเหลือ portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator. @@ -757,14 +758,9 @@ portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. portfolio.pending.error.depositTxNotConfirmed=The deposit transaction is not confirmed. You can not open an arbitration dispute with an unconfirmed deposit transaction. Please wait until it is confirmed or go to \"Settings/Network info\" and do a SPV resync.\n\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -portfolio.pending.notification=การแจ้งเตือน - portfolio.pending.support.headline.getHelp=Need help? portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator. -portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator. portfolio.pending.support.button.getHelp=Open Trader Chat -portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket? -portfolio.pending.support.popup.button=เปิดปุ่มช่วยเหลือ portfolio.pending.support.headline.halfPeriodOver=Check payment portfolio.pending.support.headline.periodOver=Trade period is over @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Mediation requested portfolio.pending.refundRequested=Refund requested portfolio.pending.openSupport=เปิดปุ่มช่วยเหลือ portfolio.pending.supportTicketOpened=ปุ่มช่วยเหลือถูกเปิดแล้ว -portfolio.pending.requestSupport=ขอการสนับสนุนและช่วยเหลือ -portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds. portfolio.pending.communicateWithArbitrator=กรุณาติดต่อโดยไปที่ \"ช่วยเหลือและสนับสนุน \" กับผู้ไกล่เกลี่ย portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator. -portfolio.pending.supportTicketOpenedMyUser=คุณได้ทำการเปิดปุ่มช่วยเหลือและสนับสนุนแล้ว\n{0} portfolio.pending.disputeOpenedMyUser=คุณได้เปิดข้อพิพาทแล้ว\n{0} portfolio.pending.disputeOpenedByPeer=ผู้ร่วมการค้าของคุณได้เปิดประเด็นการอภิปรายขึ้น\n{0} -portfolio.pending.supportTicketOpenedByPeer=เน็ตเวิร์ก peer ที่ร่วมการค้าของคุณเปิดปุ่มช่วยเหลือและสนับสนุนแล้ว\n{0} portfolio.pending.noReceiverAddressDefined=ไม่ได้ระบุที่อยู่ผู้รับ -portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade? portfolio.pending.mediationResult.headline=Suggested payout from mediation portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout. @@ -790,18 +781,18 @@ portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted portfolio.pending.mediationResult.button=View proposed resolution portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0} -portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nOnce the lock time is over on {0} (block {1}), you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. +portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nFeel free to move this trade to failed trades. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. @@ -839,6 +830,7 @@ funds.deposit.fundWallet=เติมเงินใน wallet ของคุ funds.deposit.withdrawFromWallet=ส่งเงินทุนจากกระเป๋าสตางค์ของคุณ funds.deposit.amount=จำนวนเงินใน BTC (ตัวเลือก) funds.deposit.generateAddress=สร้างที่อยู่ใหม่ +funds.deposit.generateAddressSegwit=Native segwit format (Bech32) funds.deposit.selectUnused=โปรดเลือกที่อยู่ที่ไม่ได้ใช้จากตารางด้านบนแทนที่จะสร้างที่อยู่ใหม่ funds.withdrawal.arbitrationFee=ค่าธรรมเนียมอนุญาโตตุลาการ @@ -986,6 +978,7 @@ setting.preferences.general=การตั้งค่าทั่วไป setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=สูงสุด ส่วนเบี่ยงเบนจากราคาตลาด +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=หลีกเลี่ยงโหมดแสตนบายด์ setting.preferences.autoConfirmXMR=XMR auto-confirm setting.preferences.autoConfirmEnabled=Enabled @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Required confirmations setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) setting.preferences.deviationToLarge=ค่าที่สูงกว่า {0}% ไม่ได้รับอนุญาต -setting.preferences.txFee=ค่าธรรมเนียมการทำรายการถอนเงิน (satoshis / byte) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=ใช้ค่าที่กำหนดเอง -setting.preferences.txFeeMin=ค่าธรรมเนียมการทำรายการต้องมีอย่างน้อย {0} satoshis / byte -setting.preferences.txFeeTooLarge=การป้อนข้อมูลของคุณอยู่เหนือค่าที่สมเหตุสมผล (> 5000 satoshis / byte) ค่าธรรมเนียมการทำธุรกรรมมักอยู่ในช่วง 50-400 satoshis / byte +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Ignored peers [onion address:port] -setting.preferences.refererId=ID อ้างอิง setting.preferences.ignoreDustThreshold=Min. non-dust output value -setting.preferences.refererId.prompt=ID อ้างอิงเพิ่มเติม setting.preferences.currenciesInList=สกุลเงินอยู่ในหน้ารายการราคาตลาด setting.preferences.prefCurrency=สกุลเงินที่ต้องการ setting.preferences.displayFiat=แสดงสกุลเงินของประเทศ @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=ใช้ภาพเคลื่อนไห setting.preferences.useDarkMode=Use dark mode setting.preferences.sortWithNumOffers=จัดเรียงรายการโดยเลขของข้อเสนอ / การซื้อขาย setting.preferences.resetAllFlags=รีเซ็ตทั้งหมด \"ไม่ต้องแสดงอีกครั้ง \" ปักธง -setting.preferences.reset=ตั้งค่าใหม่ settings.preferences.languageChange=หากต้องการเปลี่ยนภาษากับทุกหน้าต้องทำการรีสตาร์ท settings.preferences.supportLanguageWarning=In case of a dispute, please note that mediation is handled in {0} and arbitration in {1}. -settings.preferences.selectCurrencyNetwork=เลือกเครือข่าย setting.preferences.daoOptions=ตัวเลือก DAO setting.preferences.dao.resyncFromGenesis.label=สร้างสถานะ DAO ใหม่จากธุรกรรมต้นกำเนิด setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=Block notify port setting.preferences.dao.fullNodeInfo=For running Bisq as DAO full node you need to have Bitcoin Core locally running and RPC enabled. All requirements are documented in ''{0}''.\n\nAfter changing the mode you need to restart. setting.preferences.dao.fullNodeInfo.ok=เปิดหน้าเอกสาร setting.preferences.dao.fullNodeInfo.cancel=ไม่ ฉันติดกับไลท์โหนดโหมด (lite node mode) +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=ชื่อ +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=เครือข่าย Bitcoin settings.net.p2pHeader=Bisq network @@ -1044,7 +1040,7 @@ settings.net.bitcoinNodesLabel=ใช้โหนดเครือข่าย settings.net.useProvidedNodesRadio=ใช้โหนดเครือข่าย Bitcoin ที่ให้มา settings.net.usePublicNodesRadio=ใช้เครือข่าย Bitcoin สาธารณะ settings.net.useCustomNodesRadio=ใช้โหนดเครือข่าย Bitcoin Core ที่กำหนดเอง -settings.net.warn.usePublicNodes=หากคุณใช้เครือข่าย Bitcoin สาธารณะ คุณจะพบกับปัญหาความเป็นส่วนตัวเป็นอย่างมาก อันเนื่องมาจากการออกแบบและการใช้ตัวกรองที่ใช้สำหรับกระเป๋าสตางค์ของ SPV เช่น BitcoinJ (ใช้ใน Bisq) โหนดใดโหนดหนึ่งที่คุณเชื่อมต่ออยู่อาจพบว่าที่อยู่กระเป๋าสตางค์ทั้งหมดอาจจัดอยู่ภายใต้การใช้ชื่อร่วมกันเพียงหนึ่งเดียว\n\nโปรดอ่านรายละเอียดเพิ่มเติมได้ที่: https://bisq.network/blog/privacy-in-bitsquare.\n\nคุณแน่ใจหรือไม่ว่าต้องการใช้โหนดสาธารณะ +settings.net.warn.usePublicNodes=If you use the public Bitcoin network you are exposed to a severe privacy problem caused by the broken bloom filter design and implementation which is used for SPV wallets like BitcoinJ (used in Bisq). Any full node you are connected to could find out that all your wallet addresses belong to one entity.\n\nPlease read more about the details at [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nAre you sure you want to use the public nodes? settings.net.warn.usePublicNodes.useProvided=ไม่ ใช้โหนดที่ให้มา settings.net.warn.usePublicNodes.usePublic=ใช่ ใช้เครือข่ายสาธารณะ settings.net.warn.useCustomNodes.B2XWarning=โปรดตรวจสอบว่าโหนด Bitcoin ของคุณเป็นโหนด Bitcoin Core ที่เชื่อถือได้!\n\nการเชื่อมต่อกับโหนดที่ไม่ปฏิบัติตามกฎกติกาการยินยอมของ Bitcoin Core อาจทำให้ wallet ของคุณเกิดปัญหาในกระบวนการทางการซื้อขายได้\n\nผู้ใช้ที่เชื่อมต่อกับโหนดที่ละเมิดกฎเป็นเอกฉันท์นั้นจำเป็นต้องรับผิดชอบต่อความเสียหายที่สร้างขึ้น ข้อพิพาทที่เกิดจากการที่จะได้รับการตัดสินใจจาก เน็ตกเวิร์ก Peer คนอื่น ๆ จะไม่มีการสนับสนุนด้านเทคนิคแก่ผู้ใช้ที่ไม่สนใจคำเตือนและกลไกการป้องกันของเรา! @@ -1150,16 +1146,14 @@ setting.about.shortcuts.sendPrivateNotification=Send private notification to pee setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=การลงทะเบียนผู้ไกล่เกลี่ย account.tab.mediatorRegistration=Mediator registration account.tab.refundAgentRegistration=Refund agent registration account.tab.signing=Signing -account.tab.account=บัญชี account.info.headline=ยินดีต้อนรับสู่บัญชี Bisq ของคุณ account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=Could not complete registration.{0 account.altcoin.yourAltcoinAccounts=บัญชี altcoin (เหรียญทางเลือก) ของคุณ account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases. account.altcoin.popup.wallet.confirm=ฉันเข้าใจและยืนยันว่าฉันรู้ว่า wallet ใดที่ฉันต้องการใช้ +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer. +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN requires an interactive process between the sender and receiver to create the transaction. Be sure to follow the instructions from the GRIN project web page to reliably send and receive GRIN (the receiver needs to be online or at least be online during a certain time frame). \n\nBisq supports only the Grinbox (Wallet713) wallet URL format. \n\nThe GRIN sender is required to provide proof that they have sent GRIN successfully. If the wallet cannot provide that proof, a potential dispute will be resolved in favor of the GRIN receiver. Please be sure that you use the latest Grinbox software which supports the transaction proof and that you understand the process of transferring and receiving GRIN as well as how to create the proof. \n\nSee https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only for more information about the Grinbox proof tool. +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAM requires an interactive process between the sender and receiver to create the transaction. \n\nBe sure to follow the instructions from the BEAM project web page to reliably send and receive BEAM (the receiver needs to be online or at least be online during a certain time frame). \n\nThe BEAM sender is required to provide proof that they sent BEAM successfully. Be sure to use wallet software which can produce such a proof. If the wallet cannot provide the proof a potential dispute will be resolved in favor of the BEAM receiver. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Trading L-BTC on Bisq requires that you understand the following:\n\nWhen receiving L-BTC for a trade on Bisq, you cannot use the mobile Blockstream Green Wallet app or a custodial/exchange wallet. You must only receive L-BTC into the Liquid Elements Core wallet, or another L-BTC wallet which allows you to obtain the blinding key for your blinded L-BTC address.\n\nIn the event mediation is necessary, or if a trade dispute arises, you must disclose the blinding key for your receiving L-BTC address to the Bisq mediator or refund agent so they can verify the details of your Confidential Transaction on their own Elements Core full node.\n\nFailure to provide the required information to the mediator or refund agent will result in losing the dispute case. In all cases of dispute, the L-BTC receiver bears 100% of the burden of responsibility in providing cryptographic proof to the mediator or refund agent.\n\nIf you do not understand these requirements, do not trade L-BTC on Bisq. account.fiat.yourFiatAccounts=บัญชีสกุลเงินของคุณ @@ -1213,7 +1222,6 @@ account.backup.location=ที่ตั้งการสำรองข้อ account.backup.selectLocation=เลือกตำแหน่งการสำรอง account.backup.backupNow=สำรองข้อมูลตอนนี้ (สำรองข้อมูลไม่ได้เข้ารหัส!) account.backup.appDir=สารบบข้อมูลแอ็พพลิเคชั่น -account.backup.logFile=เข้าสู่ไฟล์ account.backup.openDirectory=เปิดสารบบ account.backup.openLogFile=เปิดการเข้าสู่ไฟล์ account.backup.success=สำรองข้อมูลสำเร็จแล้วบันทึกไว้ที่: \n{0} @@ -1227,7 +1235,7 @@ account.password.info=ด้วยระบบป้องกันรหัส account.seed.backup.title=สำรองข้อมูล wallet โค้ดของคุณ account.seed.info=โปรดเขียนรหัสสำรองข้อมูล wallet และวันที่! คุณสามารถกู้ข้อมูล wallet ของคุณได้ทุกเมื่อด้วย รหัสสำรองข้อมูล wallet และวันที่\nรหัสสำรองข้อมูล ใช้ทั้ง BTC และ BSQ wallet\n\nคุณควรเขียนรหัสสำรองข้อมูล wallet ลงบนแผ่นกระดาษและไม่บันทึกไว้ในคอมพิวเตอร์ของคุณ\n\nโปรดทราบว่า รหัสสำรองข้อมูล wallet ไม่ได้แทนการสำรองข้อมูล\nคุณจำเป็นต้องสำรองข้อมูลสารบบแอ็พพลิเคชั่นทั้งหมดที่หน้าจอ \"บัญชี / การสำรองข้อมูล \" เพื่อกู้คืนสถานะแอ็พพลิเคชั่นและข้อมูลที่ถูกต้อง\nการนำเข้ารหัสสำรองข้อมูล wallet เป็นคำแนะนำเฉพาะสำหรับกรณีฉุกเฉินเท่านั้น แอพพลิเคชั่นจะไม่สามารถใช้งานได้หากไม่มีไฟล์สำรองฐานข้อมูลและคีย์ที่ถูกต้อง! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. account.seed.warn.noPw.msg=คุณยังไม่ได้ตั้งรหัสผ่าน wallet ซึ่งจะช่วยป้องกันการแสดงผลของรหัสสำรองข้อมูล wallet \n\nคุณต้องการแสดงรหัสสำรองข้อมูล wallet หรือไม่ account.seed.warn.noPw.yes=ใช่ และไม่ต้องถามฉันอีก account.seed.enterPw=ป้อนรหัสผ่านเพื่อดูรหัสสำรองข้อมูล wallet @@ -1241,14 +1249,11 @@ account.seed.restore.ok=Ok, do the restore and shut down Bisq account.notifications.setup.title=ติดตั้ง account.notifications.download.label=ดาวน์โหลดแอปพลิเคชั่นบนมือถือ -account.notifications.download.button=ดาวน์โหลด account.notifications.waitingForWebCam=กำลังเปิดกล้องเว็บแคม ... account.notifications.webCamWindow.headline=สแกน QR โค้ดจากโทรศัพท์ account.notifications.webcam.label=ใช้เว็บแคม account.notifications.webcam.button=สแกน QR โค้ด account.notifications.noWebcam.button=ฉันไม่มีเว็บแคม -account.notifications.testMsg.label=ส่งการทดสอบการแจ้งเตือน -account.notifications.testMsg.title=การทดสอบ account.notifications.erase.label=ล้างการแจ้งเตือนบนโทรศัพท์ account.notifications.erase.title=ล้างการแจ้งเตือน account.notifications.email.label=การจับคู่โทเค็น @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=เปอร์เซ็นต account.notifications.marketAlert.addButton=เพิ่มการแจ้งเตือนข้อเสนอพิเศษ account.notifications.marketAlert.manageAlertsButton=จัดการการแจ้งเตือนข้อเสนอพิเศษ account.notifications.marketAlert.manageAlerts.title=จัดการการแจ้งเตือนข้อเสนอพิเศษ -account.notifications.marketAlert.manageAlerts.label=การแจ้งเตือนข้อเสนอ -account.notifications.marketAlert.manageAlerts.item=เสนอการแจ้งเตือนสำหรับ {0} ข้อเสนอพิเศษพร้อมราคาเรียกเก็บ {1} และบัญชีการชำระเงิน {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=บัญชีการชำระเงิน account.notifications.marketAlert.manageAlerts.header.trigger= ราคาเงื่อนไขที่ตั้งไว้ account.notifications.marketAlert.manageAlerts.header.offerType=ประเภทข้อเสนอ @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=Balance of all unverified transactions (awaiting block dao.lockedForVoteBalance=ถูกใช้สำหรับการโหวต dao.lockedInBonds=ถูกล็อคไว้ในการค้ำประกัน dao.availableNonBsqBalance=ยอดคงเหลือที่ไม่ใช่ BSQ (BTC) ซึ่งใช้งานได้ -dao.totalBsqBalance=ยอด BSQ คงเหลือทั้งหมด dao.reputationBalance=Merit Value (not spendable) dao.tx.published.success=การทำธุรกรรมของคุณได้รับการเผยแพร่เรียบร้อยแล้ว @@ -1455,11 +1457,6 @@ dao.param.currentValue=มูลค่าปัจจุบัน: {0} dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1}) dao.param.blocks={0} บล็อก -dao.results.cycle.duration.label=ระยะเวลา {0} -dao.results.cycle.duration.value={0} บล็อก -dao.results.cycle.value.postFix.isDefaultValue=(มูลค่าเริ่มต้น) -dao.results.cycle.value.postFix.hasChanged=(มีการเปลี่ยนแปลงในการลงคะแนนเสียง) - dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=ข้อมูลแบบสุ่ม dao.bond.reputation.hash=Hash dao.bond.reputation.lockupButton=ล็อค dao.bond.reputation.lockup.headline=ยืนยันล็อคการทำรายการ -dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to proceed? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=ยืนยันการปลดล็อกธุรกรรม -dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to proceed? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=การค้ำประกันทั้งหมด @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=ลงนาม dao.proofOfBurn.message=ข้อความ dao.proofOfBurn.sig=ลายเซ็น dao.proofOfBurn.verify=ยืนยัน -dao.proofOfBurn.verify.header=Verify message with key from proof of burn transaction dao.proofOfBurn.verificationResult.ok=การตรวจสอบดำเนินการเรียบร้อยแล้ว dao.proofOfBurn.verificationResult.failed=การตรวจสอบล้มเหลว @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Exact GitHub username dao.proposal.display.link=Link to detailed info dao.proposal.display.link.prompt=Link to proposal dao.proposal.display.requestedBsq=จำนวนที่ต้องการใน BSQ -dao.proposal.display.bsqAddress=ที่อยู่ BSQ dao.proposal.display.txId=รหัสธุรกรรมของข้อเสนอ dao.proposal.display.proposalFee=ค่าธรรมเนียมข้อเสนอ dao.proposal.display.myVote=การลงคะแนนของฉัน dao.proposal.display.voteResult=สรุปผลโหวต dao.proposal.display.bondedRoleComboBox.label=ประเภทของตำแหน่งหลักประกัน dao.proposal.display.requiredBondForRole.label=การประกันที่จำเป็นโดยหลักการ -dao.proposal.display.tickerSymbol.label=สัญลักษณ์เครื่องพิมพ์ราคาหุ้น (Ticker Symbol) dao.proposal.display.option=ตัวเลือก dao.proposal.table.header.proposalType=ประเภทข้อเสนอ dao.proposal.table.header.link=ลิงค์ dao.proposal.table.header.myVote=การลงคะแนนของฉัน +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=ลบออก dao.proposal.table.icon.tooltip.removeProposal=ลบข้อเสนอของฉัน dao.proposal.table.icon.tooltip.changeVote=ผลโหวตปัจจุบัน: ''{0}''. เปลี่ยนโหวตไปยัง: ''{1}'' @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=ยอดคงเหลือในกระเ dao.wallet.receive.fundYourWallet=Your BSQ receive address dao.wallet.receive.bsqAddress=BSQ wallet address (Fresh unused address) -dao.wallet.receive.dao.headline=The Bisq DAO -dao.wallet.receive.daoInfo=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model — and the Bisq DAO and BSQ token are the tools that make it possible. -dao.wallet.receive.daoInfo.button=Learn more about the Bisq DAO -dao.wallet.receive.daoTestnetInfo=The mainnet Bisq DAO is not launched yet but you can learn about the Bisq DAO by running it on testnet. -dao.wallet.receive.daoTestnetInfo.button=How to run the Bisq DAO on our testnet -dao.wallet.receive.daoContributorInfo=If you have contributed to Bisq please use the BSQ address below and make a request for taking part of the BSQ genesis distribution. -dao.wallet.receive.daoContributorInfo.button=How to be part of the BSQ genesis distribution - dao.wallet.send.sendFunds=ส่งเงิน dao.wallet.send.sendBtcFunds=ส่งเงินทุนที่ไม่ใช่เครือ BSQ (BTC) dao.wallet.send.amount=จำนวนเงินใน BSQ dao.wallet.send.btcAmount=ยอดรวมทั้งหมดใน BTC (เงินทุนที่ไม่ใช่ในเครือ BSQ) dao.wallet.send.setAmount=กำหนดจำนวนเงินที่จะถอน (จำนวนเงินขั้นต่ำคือ {0}) -dao.wallet.send.setBtcAmount=ตั้งค่ายอดรวมใน BTC เพื่อถอนออก (จำนวนยอดรวมขั้นต่ำคือ {0}) dao.wallet.send.receiverAddress=ที่อยู่ BSQ ของผู้รับ dao.wallet.send.receiverBtcAddress=ที่อยู่ BTC ของผู้รับ dao.wallet.send.setDestinationAddress=กรอกที่อยู่ปลายทางของคุณ dao.wallet.send.send=ส่งเงิน BSQ dao.wallet.send.sendBtc=ส่งเงินทุน BTC dao.wallet.send.sendFunds.headline=ยืนยันคำขอถอนเงิน -dao.wallet.send.sendFunds.details=กำลังส่ง: {0} \nไปยังที่อยู่ที่ได้รับ: {1} .\nค่าธรรมเนียมการทำธุรกรรมคือ: {2} ({3} satoshis / byte) \nขนาดการทำรายการ: {4} Kb\n\nผู้รับจะได้รับ: {5} \n\nคุณแน่ใจหรือไม่ว่าคุณต้องการถอนจำนวนเงินดังกล่าว +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=บล็อกที่ได้รับการพิสูจน์แล้วล่าสุด: {0} dao.wallet.chainHeightSyncing=บล็อกที่กำลังรอดำเนินการ... ตรวจสอบแล้ว {0} จากบล็อกทั้งหมด {1} dao.wallet.tx.type=หมวด @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds fo dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1} dao.feeTx.confirm=ยืนยันการทำรายการ {0} -dao.feeTx.confirm.details={0} ค่าธรรมเนียม: {1}\nค่าธรรมเนียมการขุด: {2} ({3} Satoshis / byte)\nขนาดของธุรกรรม: {4} Kb\n\nคุณแน่ใจหรือไม่ว่าต้องการเผยแพร่ {5} ธุรกรรม? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=THE BISQ DAO dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible. @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=No. blind votes dao.factsAndFigures.menuItem.supply=BSQ Supply dao.factsAndFigures.menuItem.transactions=BSQ Transactions -dao.factsAndFigures.dashboard.marketPrice=ข้อมูลทางการตลาด -dao.factsAndFigures.dashboard.price=ราคาเทรด BSQ/BTC ล่าสุด (in Bisq) dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=ดาวน์โหลดใ displayUpdateDownloadWindow.button.ignoreDownload=ไม่สนใจเวอร์ชั่นนี้ displayUpdateDownloadWindow.headline=การอัปเดต Bisq ใหม่พร้อมแล้ว! displayUpdateDownloadWindow.download.failed.headline=การดาวน์โหลดล้มเหลว -displayUpdateDownloadWindow.download.failed=การดาวน์โหลดล้มเหลว\nโปรดดาวน์โหลดและยืนยันด้วยตนเองที่ https://bisq.network/downloads -displayUpdateDownloadWindow.installer.failed=ไม่สามารถกำหนดตัวติดตั้งที่ถูกต้อง โปรดดาวน์โหลดและยืนยันด้วยตนเองที่ https://bisq.network/downloads -displayUpdateDownloadWindow.verify.failed=การยืนยันล้มเหลว\nโปรดดาวน์โหลดและยืนยันด้วยตนเองที่ https://bisq.network/downloads +displayUpdateDownloadWindow.download.failed=Download failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verification failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=ดาวน์โหลดเวอร์ชั่นใหม่เรียบร้อยแล้วและได้รับการยืนยันลายเซ็นแล้ว\n\nโปรดเปิดสารบบดาวน์โหลด หลังจากนั้นปิดโปรแกรมและติดตั้งเวอร์ชั่นใหม่ displayUpdateDownloadWindow.download.openDir=เปิดสารบบดาวน์โหลด @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=การจ่ายเงินของจำน disputeSummaryWindow.payout.getsTradeAmount=BTC {0} รับการจ่ายเงินของปริมาณการซื้อขาย: disputeSummaryWindow.payout.getsAll=BTC {0} รับทั้งหมด disputeSummaryWindow.payout.custom=การชำระเงินที่กำหนดเอง -disputeSummaryWindow.payout.adjustAmount=จำนวนเงินที่ป้อนเกินจำนวนเงินที่มีอยู่ {0} .\nเราปรับช่องป้อนข้อมูลนี้ให้เป็นค่าที่เป็นไปได้สูงสุด disputeSummaryWindow.payoutAmount.buyer=จำนวนเงินที่จ่ายของผู้ซื้อ disputeSummaryWindow.payoutAmount.seller=จำนวนเงินที่จ่ายของผู้ขาย disputeSummaryWindow.payoutAmount.invert=ใช้ผู้แพ้เป็นผู้เผยแพร่ @@ -2055,6 +2038,7 @@ disputeSummaryWindow.addSummaryNotes=เพิ่มสรุปบันทึ disputeSummaryWindow.close.button=ปิดการยื่นคำขอและความช่วยเหลือ # Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification @@ -2064,9 +2048,11 @@ disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and a disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions disputeSummaryWindow.close.closePeer=คุณจำเป็นต้องยุติคำขอความช่วยเหลือคู่ค้าด้วย ! disputeSummaryWindow.close.txDetails.headline=Publish refund transaction +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n -disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? disputeSummaryWindow.close.noPayout.headline=Close without any payout disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? @@ -2101,6 +2087,7 @@ filterWindow.btcNode=โหนด Bitcoin ที่ได้รับการ filterWindow.preventPublicBtcNetwork=ป้องกันการใช้เครือข่าย Bitcoin สาธารณะ filterWindow.disableDao=Disable DAO filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Min. version required for DAO filterWindow.disableTradeBelowVersion=Min. version required for trading filterWindow.add=เพิ่มตัวกรอง @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=เลือกรายการเงินฝ selectDepositTxWindow.msg=ธุรกรรมเงินฝากไม่ได้เก็บไว้ในการซื้อขาย\nโปรดเลือกหนึ่งในธุรกรรม multisig (การรองรับหลายลายเซ็น) ที่มีอยู่จากกระเป๋าสตางค์ของคุณซึ่งเป็นรายการฝากเงินที่ใช้ในการซื้อขายที่มีเกิดความผิดพลาด\n\nคุณสามารถค้นหารายการที่ถูกต้องได้โดยการเปิดหน้าต่างรายละเอียดทางการซื้อขาย (คลิกที่ ID การซื้อขายในรายการ) และทำรายการธุรกรรมการชำระเงินค่าธรรมเนียมการซื้อขายต่อไปยังรายการถัดไปที่คุณเห็นรายการเงินฝาก multisig (ที่อยู่เริ่มต้นด้วย 3) ID ธุรกรรมนี้ควรปรากฏในรายการที่นำเสนอที่นี่ เมื่อคุณพบรายการถูกต้องเลือกรายการที่นี่และดำเนินต่อไป\n\nขออภัยในความไม่สะดวก แต่กรณีข้อผิดพลาดดังกล่าวควรเกิดขึ้นน้อยมากและในอนาคตเราจะพยายามหาวิธีที่ดีกว่าในการแก้ไข selectDepositTxWindow.select=เลือกรายการเงินฝาก -selectBaseCurrencyWindow.headline=การเลือกตลาด -selectBaseCurrencyWindow.msg=ตลาดเริ่มต้นที่เลือกคือ {0} .\n\nหากคุณต้องการเปลี่ยนเป็นสกุลเงินหลักอื่น โปรดเลือกจากกล่องแบบเลื่อนลง\nนอกจากนี้คุณสามารถเปลี่ยนสกุลเงินหลักได้ที่หน้าจอ \"การตั้งค่า / เครือข่าย \" -selectBaseCurrencyWindow.select=เลือกสกุลเงินหลัก - sendAlertMessageWindow.headline=ส่งการแจ้งเตือนทั่วโลก sendAlertMessageWindow.alertMsg=ข้อความแจ้งเตือน sendAlertMessageWindow.enterMsg=ใส่ข้อความ @@ -2232,9 +2215,8 @@ error.closedTradeWithNoDepositTx=The deposit transaction of the closed trade wit popup.warning.walletNotInitialized=wallet ยังไม่ได้เริ่มต้น popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. popup.warning.wrongVersion=คุณอาจมีเวอร์ชั่น Bisq ไม่เหมาะสำหรับคอมพิวเตอร์นี้\nสถาปัตยกรรมคอมพิวเตอร์ของคุณคือ: {0} .\nเลขฐานสอง Bisq ที่คุณติดตั้งคือ: {1} .\nโปรดปิดตัวลงและติดตั้งรุ่นที่ถูกต้องอีกครั้ง ({2}) -popup.warning.incompatibleDB=เราตรวจพบไฟล์ฐานข้อมูลที่ไม่เข้ากัน! \n\nไฟล์ฐานข้อมูลเหล่านี้ไม่สามารถใช้งานได้กับฐานข้อมูลปัจจุบันของเรา:\n{0} \n\nเราได้สำรองข้อมูลไฟล์ที่เสียหายแล้วใช้ค่าเริ่มต้นกับเวอร์ชั่นฐานข้อมูลใหม่\n\nการสำรองข้อมูลอยู่ที่: \n{1} /db/backup_of_corrupted_data.\n\nโปรดตรวจสอบว่าคุณมี Bisq เวอร์ชั่นล่าสุดหรือไม่\nคุณสามารถดาวน์โหลดได้ที่: \nhttps://bisq.network/downloads\n\nโปรดรีสตาร์ทแอ็พพลิเคชั่น +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 new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application. popup.warning.startupFailed.twoInstances=Bisq กำลังทำงานอยู่ คุณไม่สามารถเรียกใช้ Bisq พร้อมกันได้ -popup.warning.cryptoTestFailed=ดูเหมือนว่าคุณใช้เรียบเรียงเลขฐานสองด้วยตนเองและไม่ได้ทำตามคำแนะนำใน Build ใน https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for- cryptographic-keys.\n\nหากไม่ใช่กรณีนี้และคุณใช้เลขฐานสอง Bisq อย่างเป็นทางการโปรดยื่นรายงานข้อบกพร่องไปที่หน้า GitHub\nข้อผิดพลาด = {0} popup.warning.tradePeriod.halfReached=การซื้อขายของคุณที่มีรหัส ID {0} ได้ถึงครึ่งหนึ่งของจำนวนสูงสุดแล้ว อนุญาตให้ซื้อขายได้และยังไม่สมบูรณ์\n\nช่วงเวลาการซื้อขายสิ้นสุดวันที่ {1} \n\nโปรดตรวจสอบสถานะการค้าของคุณที่ \"Portfolio (แฟ้มผลงาน) / เปิดการซื้อขาย \" สำหรับข้อมูลเพิ่มเติม 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 mediator. popup.warning.noTradingAccountSetup.headline=คุณยังไม่ได้ตั้งค่าบัญชีการซื้อขาย @@ -2258,7 +2240,9 @@ popup.warning.noBsqFundsForBtcFeePayment=กระเป๋าสตางค์ popup.warning.messageTooLong=ข้อความของคุณเกินขีดจำกัดสูงสุดที่อนุญาต โปรดแบ่งส่งเป็นหลายส่วนหรืออัปโหลดไปยังบริการเช่น https://pastebin.com popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"." +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=ราคาผลัดเปลี่ยน popup.warning.seed=รหัสลับเพื่อกู้ข้อมูล popup.warning.mandatoryUpdate.trading=Please update to the latest Bisq version. A mandatory update was released which disables trading for old versions. Please check out the Bisq Forum for more information. @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=The {0} transaction for trade with ID {1} was rej popup.warning.openOfferWithInvalidMakerFeeTx=The maker fee transaction for offer with ID {0} is invalid.\nTransaction ID={1}.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -popup.warning.trade.depositTxNull=The trade with ID ''{0}'' has no deposit transaction set.\n\nPlease restart the application to see if the problem still exists.\n\nIf it does, please open the trade details popup by clicking on the trade ID. Then click on the transaction IDs for the maker fee transaction and the taker fee transaction to view them on a block explorer. A transaction that cannot be found in a block explorer is probably an invalid transaction.\n\nIf this happens, please report it in the #support channel on the Bisq Keybase (https://keybase.io/team/bisq). If your trade fee transaction is invalid, no funds have left your wallet, you can move the trade to failed trades,and do an SPV resync for your funds to reappear (see how below).\n\nIf your trade fee transaction is valid, the fee amount is lost, and you can make a request for reimbursement on the support repository on GitHub (https://github.com/bisq-network/support/issues).\n\nIn both cases, please do an SPV resync from the ''Settings/Network'' screen to clean your wallet of any lingering issues! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Move to failed trades -popup.warning.trade.depositTxNull.shutDown=Shut down Bisq - popup.info.securityDepositInfo=เพื่อให้แน่ใจว่าเทรดเดอร์ทั้งคู่นั้นได้ปฏิบัติตามข้อสนธิสัญญาในการค้า เทรดเดอร์จำเป็นต้องทำการชำระค่าประกัน\n\nค่าประกันนี้คือถูกเก็บไว้ในกระเป๋าสตางค์การเทรดของคุณจนกว่าการเทรดของคุณจะดำเนินการสำเร็จ และคุณจะได้รับมันคืนหลังจากนั้น \n\nโปรดทราบ: หากคุณกำลังสร้างข้อเสนอขึ้นมาใหม่ Bisq จำเป็นที่ต้องดำเนินงานต่อเนื่องไปยังเทรดเดอร์รายอื่น และเพื่อที่สถานะข้อเสนอทางออนไลน์ของคุณจะยังคงอยู่ Bisq จะยังคงดำเนินงานต่อเนื่อง และโปรดมั่นใจว่าเครื่องคอมพิวเตอร์นี้กำลังออนไลน์อยู่ด้วยเช่นกัน (ยกตัวอย่างเช่น ตรวจเช็คว่าสวิทช์ไฟไม่ได้อยู่ในโหมดแสตนบายด์...หน้าจอแสตนบายด์คือปกติดี) popup.info.cashDepositInfo=โปรดตรวจสอบว่าคุณมีสาขาธนาคารในพื้นที่ของคุณเพื่อสามารถฝากเงินได้\nรหัสธนาคาร (BIC / SWIFT) ของธนาคารผู้ขายคือ: {0} popup.info.cashDepositInfo.confirm=ฉันยืนยันว่าฉันสามารถฝากเงินได้ popup.info.shutDownWithOpenOffers=Bisq คือกำลังจะปิดลง แต่ยังคงมีการเปิดขายข้อเสนอปกติ\nข้อเสนอเหล่านี้จะไม่ใข้งานได้บนเครือข่าย P2P network ในขณะที่ Bisq ปิดตัวลง แต่จะมีการเผยแพร่บนเครือข่าย P2P ครั้งถัดไปเมื่อคุณมีการเริ่มใช้งาน Bisq.\n\nในการคงสถานะข้อเสนอแบบออนไลน์ คือเปิดใข้งาน Bisq และทำให้มั่นใจว่าคอมพิวเตอร์เครื่องนี้กำลังออนไลน์อยู่ด้วยเช่นกัน (เช่น ตรวจสอบว่าคอมพิวเตอร์ไม่ได้อยู่ในโหมดแสตนบายด์...หน้าจอแสตนบายด์ไม่มีปัญหา) -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=การแจ้งเตือนส่วนตัวที่สำคัญ! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=ต้องให้ความสำคัญ popup.info.multiplePaymentAccounts.headline=Multiple payment accounts available popup.info.multiplePaymentAccounts.msg=You have multiple payment accounts available for this offer. Please make sure you've picked the right one. -popup.news.launch.headline=Two Major Updates -popup.news.launch.accountSigning.headline=ACCOUNT SIGNING -popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer. -popup.news.launch.ntp.headline=NEW TRADE PROTOCOL -popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant. - popup.accountSigning.selectAccounts.headline=Select payment accounts popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign. popup.accountSigning.selectAccounts.signAll=Sign all payment methods @@ -2324,7 +2297,7 @@ popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey popup.accountSigning.success.headline=Congratulations popup.accountSigning.success.description=All {0} payment accounts were successfully signed! -popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0} popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1} popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0} @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=Signing completed popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: A decentralized bitcoin exchange network # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=บัญชีการค้าที่บันทึกไว้ในเส้นทาง: \n{0} guiUtil.accountExport.noAccountSetup=คุณไม่มีบัญชีการซื้อขายที่ตั้งค่าไว้สำหรับการส่งออก @@ -2463,6 +2435,7 @@ navigation.portfolio.pending=\"แฟ้มผลงาน / เปิดกา navigation.portfolio.closedTrades=\"แฟ้มผลงาน/ประวัติ\" navigation.funds.depositFunds=\"เงิน / รับเงิน \" navigation.settings.preferences=\ "การตั้งค่า / สิ่งที่ชอบ \" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"เงิน / ธุรกรรม\" navigation.support=\"ช่วยเหลือและสนับสนุน\" navigation.dao.wallet.receive=\ "Wallet DAO / BSQ / การรับ \" @@ -2525,11 +2498,11 @@ password.deriveKey=ดึงข้อมูลจากรหัสผ่าน password.walletDecrypted=กระเป๋าสตางค์ถูกถอดรหัสสำเร็จและการป้องกันรหัสผ่านได้มีการออกแล้ว password.wrongPw=คุณป้อนรหัสผ่านไม่ถูกต้อง\n\nโปรดลองป้อนรหัสผ่านอีกครั้งโดยละเอียด เพื่อตรวจสอบความผิดพลาดในการพิมพ์หรือสะกด password.walletEncrypted=เปิดใช้งานกระเป๋าสตางค์ที่เข้ารหัสแล้วและเปิดใช้งานการป้องกันด้วยรหัสผ่านแล้ว -password.walletEncryptionFailed=ไม่สามารถตั้งรหัสผ่านกระเป๋าสตางค์ได้ คุณอาจกรอกรหัสลับป้องกันกระเป๋าสตางค์ที่ไม่ตรงกับฐานข้อมูลโปรดติดต่อนักพัฒนาซอฟต์แวร์ในฟอรัม Bisq Forum +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=รหัสผ่าน 2 รายการที่คุณป้อนไม่ตรงกัน password.forgotPassword=ลืมรหัสผ่านหรือเปล่า? -password.backupReminder=โปรดทราบว่าเมื่อตั้งค่ารหัสผ่านกระเป๋าสตางค์ที่สร้างขึ้นโดยอัตโนมัติทั้งหมดจาก wallet ที่ไม่ได้รับการเข้ารหัสจะถูกลบออก\n\nขอแนะนำให้ทำการสำรองข้อมูลของสารบบแอ็พพลิเคชั่นและเขียนรหัสลับป้องกันกระเป๋าสตางค์ก่อนที่จะตั้งรหัสผ่าน! -password.backupWasDone=ฉันได้ทำสำรองไว้แล้ว +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=รหัสลับป้องกันกระเป๋าสตางค์ seed.enterSeedWords=ป้อนรหัสลับกระเป๋าสตางค์ @@ -2537,7 +2510,7 @@ seed.date=วันที่ในกระเป๋าสตางค์ seed.restore.title=เรียกคืนกระเป๋าสตางค์จากรหัสลับ seed.restore=เรียกกระเป๋าสตางค์คืน seed.creationDate=วันที่สร้าง -seed.warn.walletNotEmpty.msg=กระเป๋าสตางค์ Bitcoin ของคุณยังมีเงินเหลือ\n\nคุณต้องยกเลิกกระเป๋าสตางค์นี้ก่อนที่จะพยายามกู้คืนแฟ้มที่เก่ากว่าเนื่องจากการรวมกระเป๋าสตางค์เข้าด้วยกันอาจทำให้เกิดการสำรองข้อมูลที่ไม่ถูกต้อง "\n\nโปรดปิดบัญชีการซื้อขายของคุณ และปิดข้อเสนอทั้งหมดของคุณและไปที่ส่วนเงินทุนเพื่อถอนเงิน bitcoin ของคุณ\nในกรณีที่คุณไม่สามารถเข้าถึง Bitcoin คุณสามารถใช้เครื่องมือฉุกเฉินเพื่อลบกระเป๋าสตางค์ได้\nหากต้องการเปิดเครื่องมือฉุกเฉินให้กด \"alt + e \" หรือ \"option + e \" +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=ฉันต้องการเรียกคืนอีกครั้ง seed.warn.walletNotEmpty.emptyWallet=ฉันจะทำให้กระเป๋าสตางค์ของฉันว่างเปล่าก่อน seed.warn.notEncryptedAnymore=กระเป๋าสตางค์ของคุณได้รับการเข้ารหัสแล้ว\n\nหลังจากเรียกคืน wallets จะไม่ได้รับการเข้ารหัสและคุณต้องตั้งรหัสผ่านใหม่\n\nคุณต้องการดำเนินการต่อหรือไม่ @@ -2578,12 +2551,11 @@ payment.altcoin.address=ที่อยู่ Altcoin (เหรียญทา payment.altcoin.tradeInstantCheckbox=Trade instant (within 1 hour) with this Altcoin payment.altcoin.tradeInstant.popup=For instant trading it is required that both trading peers are online to be able to complete the trade in less than 1 hour.\n\nIf you have offers open and you are not available please disable those offers under the 'Portfolio' screen. payment.altcoin=Altcoin (เหรียญทางเลือก) -payment.select.altcoin=เลือกหรือค้นหา altcoin (เหรียญทางเลือก) +payment.select.altcoin=Select or search Altcoin payment.secret=คำถามลับ payment.answer=คำตอบ payment.wallet=ID กระเป๋าสตางค์ payment.uphold.accountId=ชื่อผู้ใช้ หรือ อีเมล หรือ หมายเลขโทรศัพท์ -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=อีเมลหรือหมายเลขโทรศัพท์ payment.venmo.venmoUserName=ชื่อผู้ใช้ Venmo payment.popmoney.accountId=อีเมลหรือหมายเลขโทรศัพท์ @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=รหัสบัตรประชาชน/ร payment.supportedCurrencies=สกุลเงินที่ได้รับการสนับสนุน payment.limitations=ข้อจำกัด payment.salt=ข้อมูลแบบสุ่มสำหรับการตรวจสอบอายุบัญชี -payment.error.noHexSalt=ข้อมูลแบบสุ่มต้องอยู่ในรูปแบบ HEX \nแนะนำให้คุณแก้ไขเขตข้อมูลแบบสุ่ม ถ้าต้องการโอนข้อมูลแบบสุ่มจากบัญชีเก่าเพื่อยืดอายุบัญชีของคุณ อายุบัญชีได้รับการยืนยันโดยใช้ข้อมูลแบบสุ่มในบัญชีและข้อมูลบัญชีที่ระบุ (เช่น IBAN) +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=ยอมรับการซื้อขายจากประเทศยุโรปเหล่านี้ payment.accept.nonEuro=ยอมรับการซื้อขายจากประเทศนอกสหภาพยุโรปเหล่านี้ payment.accepted.countries=ประเทศที่ยอมรับ @@ -2605,7 +2577,7 @@ shared.accountSigningState=Account signing status payment.altcoin.address.dyn={0} ที่อยู่ payment.altcoin.receiver.address=ที่อยู่เหรียญทางเลือกของผู้รับ payment.accountNr=หมายเลขบัญชี -payment.emailOrMobile=หมายเลขโทรศัพท์มือถือหรืออีเมล +payment.emailOrMobile=อีเมลหรือหมายเลขโทรศัพท์มือถือ payment.useCustomAccountName=ใช้ชื่อบัญชีที่กำหนดเอง payment.maxPeriod=ระยะเวลาสูงสุดการค้าที่อนุญาต payment.maxPeriodAndLimit=Max. trade duration: {0} / Max. buy: {1} / Max. sell: {2} / Account age: {3} @@ -2625,31 +2597,33 @@ payment.accountType=ประเภทบัญชี payment.checking=การตรวจสอบ payment.savings=ออมทรัพย์ payment.personalId=รหัส ID ประจำตัวบุคคล -payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle:\nhttps://www.zellepay.com/get-started\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. +payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Bisq to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved. -payment.moneyGram.info=เมื่อใช้ MoneyGram ผู้ซื้อ BTC จะต้องส่งหมายเลขการอนุมัติและรูปใบเสร็จรับเงินทางอีเมลไปยังผู้ขาย BTC ใบเสร็จจะต้องแสดงชื่อเต็ม ประเทศ รัฐและจำนวนเงินทั้งหมดของผู้ขาย ผู้ซื้อจะได้รับอีเมลของผู้ขายในขั้นตอนการค้า -payment.westernUnion.info=เมื่อใช้ Western Union ผู้ซื้อ BTC จะต้องส่ง MTCN (หมายเลขติดตาม) และรูปใบเสร็จรับเงินทางอีเมลไปยังผู้ขาย BTC ใบเสร็จรับเงินต้องแสดงชื่อเต็ม ประเทศ เมืองและจำนวนเงินทั้งหมดของผู้ขาย ผู้ซื้อจะได้รับอีเมลของผู้ขายในขั้นตอนการค้า -payment.halCash.info=เมื่อมีการใช้งาน HalCash ผู้ซื้อ BTC จำเป็นต้องส่งรหัส Halcash ให้กับผู้ขายทางข้อความโทรศัพท์มือถือ\n\nโปรดตรวจสอบว่าไม่เกินจำนวนเงินสูงสุดที่ธนาคารของคุณอนุญาตให้คุณส่งด้วย HalCash จำนวนเงินขั้นต่ำในการเบิกถอนคือ 10 EUR และสูงสุดในจำนวนเงิน 600 EUR สำหรับการถอนซ้ำเป็น 3000 EUR ต่อผู้รับและต่อวัน และ 6000 EUR ต่อผู้รับและต่อเดือน โปรดตรวจสอบข้อจำกัดจากทางธนาคารคุณเพื่อให้มั่นใจได้ว่าทางธนาคารได้มีการใช้มาตรฐานข้อกำหนดเดียวกันกับดังที่ระบุไว้ ณ ที่นี่\n\nจำนวนเงินที่ถอนจะต้องเป็นจำนวนเงินหลาย 10 EUR เนื่องจากคุณไม่สามารถถอนเงินอื่น ๆ ออกจากตู้เอทีเอ็มได้ UI ในหน้าจอสร้างข้อเสนอและรับข้อเสนอจะปรับจำนวนเงิน BTC เพื่อให้จำนวนเงิน EUR ถูกต้อง คุณไม่สามารถใช้ราคาตลาดเป็นจำนวนเงิน EUR ซึ่งจะเปลี่ยนแปลงไปตามราคาที่มีการปรับเปลี่ยน\n\nในกรณีที่มีข้อพิพาทผู้ซื้อ BTC ต้องแสดงหลักฐานว่าได้ส่ง EUR แล้ว -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\nTo mitigate this risk, Bisq sets per-trade limits based on two factors:\n\n1. The estimated level of chargeback risk for the payment method used\n2. The age of your account for that payment method\n\nThe account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\n● During the 1st month, your per-trade limit will be {0}\n● During the 2nd month, your per-trade limit will be {1}\n● After the 2nd month, your per-trade limit will be {2}\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. -payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase with account age.\n\nSee more:\nhttps://bisq.wiki/Account_limits\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.halCash.info=เมื่อมีการใช้งาน HalCash ผู้ซื้อ BTC จำเป็นต้องส่งรหัส Halcash ให้กับผู้ขายทางข้อความโทรศัพท์มือถือ\n\nโปรดตรวจสอบว่าไม่เกินจำนวนเงินสูงสุดที่ธนาคารของคุณอนุญาตให้คุณส่งด้วย HalCash จำนวนเงินขั้นต่ำในการเบิกถอนคือ 10 EUR และสูงสุดในจำนวนเงิน 600 EUR สำหรับการถอนซ้ำเป็น 3000 EUR ต่อผู้รับและต่อวัน และ 6000 EUR ต่อผู้รับและต่อเดือน โปรดตรวจสอบข้อจำกัดจากทางธนาคารคุณเพื่อให้มั่นใจได้ว่าทางธนาคารได้มีการใช้มาตรฐานข้อกำหนดเดียวกันกับดังที่ระบุไว้ ณ ที่นี่\n\nจำนวนเงินที่ถอนจะต้องเป็นจำนวนเงินหลาย 10 EUR เนื่องจากคุณไม่สามารถถอนเงินอื่น ๆ ออกจากตู้เอทีเอ็มได้ UI ในหน้าจอสร้างข้อเสนอและรับข้อเสนอจะปรับจำนวนเงิน BTC เพื่อให้จำนวนเงิน EUR ถูกต้อง คุณไม่สามารถใช้ราคาตลาดเป็นจำนวนเงิน EUR ซึ่งจะเปลี่ยนแปลงไปตามราคาที่มีการปรับเปลี่ยน\n\nในกรณีที่มีข้อพิพาทผู้ซื้อ BTC ต้องแสดงหลักฐานว่าได้ส่ง EUR แล้ว +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=โปรดยืนยันว่าธนาคารของคุณได้อนุมัติให้คุณสามารถส่งเงินสดให้กับบัญชีบุคคลอื่นได้ ตัวอย่างเช่น บางธนาคารที่ไม่ได้มีการบริการถ่ายโอนเงินสดอย่าง Bank of America และ Wells Fargo payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=Update Revolut account payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. payment.f2f.contact=ข้อมูลติดต่อ -payment.f2f.contact.prompt=วิธีการที่คุณต้องการได้รับการติดต่อจากการค้าจากระบบ peer (ที่อยู่อีเมล , หมายเลขโทรศัพท์ ... ) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=เมืองสำหรับการประชุมแบบเห็นหน้ากัน payment.f2f.city.prompt=ชื่อเมืองจะแสดงพร้อมกับข้อเสนอ payment.f2f.optionalExtra=ข้อมูลตัวเลือกเพิ่มเติม payment.f2f.extra=ข้อมูลเพิ่มเติม payment.f2f.extra.prompt=ผู้สร้างสามารถกำหนด 'ข้อกำหนดในการให้บริการ' หรือเพิ่มข้อมูลการติดต่อสาธารณะได้ สิ่งเหล่านี้จะปรากฏพร้อมกับข้อเสนอ -payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading' +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=เปิดหน้าเว็บ payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1} payment.f2f.offerbook.tooltip.extra=ข้อมูลเพิ่มเติม: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=ธนาคาร payment.japan.branch=Branch payment.japan.account=บัญชี payment.japan.recipient=ชื่อ +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=เห็นหน้ากัน (แบบตัวต่อตัว) JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=ธนาคารแห่งชาติ @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=ไม่อนุญาตให้ป้อนข้อมู validation.negative=ไม่อนุญาตให้ใช้ค่าลบ validation.fiat.toSmall=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดเล็กกว่าจำนวนเป็นไปได้ต่ำสุด validation.fiat.toLarge=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดใหญ่กว่าจำนวนสูงสุดที่เป็นไปได้ -validation.btc.fraction=ป้อนผลลัพธ์เป็นค่า bitcoin ด้วยเศษของหน่วยที่เล็กที่สุด (satoshi) +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=ไม่อนุญาตให้ป้อนข้อมูลขนาดใหญ่กว่า {0} validation.btc.toSmall=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดเล็กกว่า {0} -validation.securityDeposit.toSmall=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดเล็กกว่า {0} -validation.passwordTooShort=รหัสผ่านที่คุณป้อนสั้นเกินไป ต้องมีอย่างน้อย 8 ตัวอักษร +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=รหัสผ่านที่คุณป้อนยาวเกินไป ต้องมีความยาวไม่เกิน 50 ตัว validation.sortCodeNumber={0} ต้องประกอบด้วย {1} ตัวเลข validation.sortCodeChars={0} ต้องประกอบด้วย {1} ตัวอักษร @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} ต้องประกอบด้วย {1} #new validation.invalidInput=ใส่ข้อมูลไม่ถูกต้อง: {0} validation.accountNrFormat=หมายเลขบัญชีต้องเป็นรูปแบบ: {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=การตรวจสอบความถูกต้องของที่อยู่ล้มเหลวเนื่องจากไม่ตรงกับโครงสร้างของที่อยู่ {0} -validation.altcoin.ltz.zAddressesNotSupported=LTZ address need to start with L. Addresses starting with z are not supported. -validation.altcoin.zAddressesNotSupported=ที่อยู่ ZEC ต้องเริ่มต้นด้วย t ไม่รองรับที่อยู่ที่ขึ้นต้นด้วย z +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=ที่อยู่ไม่ใช่ที่อยู่ {0} ที่ถูกต้อง! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Native segwit addresses (those starting with 'lq') are not supported. -validation.bic.invalidLength=ความยาวของการป้อนข้อมูลนำเข้าไม่ใช่ 8 หรือ 11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=รหัสธนาคารและรหัสประเทศต้องเป็นตัวอักษร validation.bic.invalidLocationCode=BIC มีรหัสตำแหน่งไม่ถูกต้อง validation.bic.invalidBranchCode=BIC มีรหัสสาขาไม่ถูกต้อง validation.bic.sepaRevolutBic=บัญชี Revolut Sepa ไม่รองรับ -validation.btc.invalidFormat=รูปแบบที่อยู่ Bitcoin ไม่ถูกต้อง -validation.bsq.invalidFormat=รูปแบบที่อยู่ BSQ ไม่ถูกต้อง +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=ที่อยู่ไม่ถูกต้อง validation.iban.invalidCountryCode=รหัสประเทศไม่ถูกต้อง validation.iban.checkSumNotNumeric=Checksum ต้องเป็นตัวเลข validation.iban.nonNumericChars=ไม่พบอักขระที่เป็นตัวเลขและตัวอักษร validation.iban.checkSumInvalid=การตรวจสอบ IBAN ไม่ถูกต้อง -validation.iban.invalidLength=จำนวนต้องมีความยาว 15 ถึง 34 ตัวอักษร +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=รหัสพื้นที่ที่ไม่ใช่แคนาดา -validation.interacETransfer.invalidPhone=รูปแบบหมายเลขโทรศัพท์ไม่ถูกต้อง และไม่ใช่ที่อยู่อีเมล +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=ต้องประกอบด้วยตัวอักษร ตัวเลข เว้นวรรค และ/หรือ สัญลักษณ์ ' _ , . ? - validation.interacETransfer.invalidAnswer=ต้องเป็นคำเดียว และประกอบด้วยตัวอักษร ตัวเลข และ/หรือ สัญลักษณ์ - เท่านั้น validation.inputTooLarge=ข้อมูลที่ป้อนต้องไม่เป็นจำนวนที่มากกว่า {0} validation.inputTooSmall=การป้อนเข้าจะต้องมีจำนวนมากกว่า {0} validation.inputToBeAtLeast=Input has to be at least {0} -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=ความยาวจะต้องอยู่ระหว่าง {0} และ {1} validation.pattern=การป้อนเข้าจะต้องเป็นรูปแบบ {0} validation.noHexString=การป้อนเข้านั้นคือไม่ใช่รูปแบบของ HEX @@ -2859,7 +2852,7 @@ validation.numberFormatException=Number format exception {0} validation.mustNotBeNegative=Input must not be negative validation.phone.missingCountryCode=Need two letter country code to validate phone number validation.phone.invalidCharacters=Phone number {0} contains invalid characters -validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number -validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number -validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}. +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=Must be comma separated list of valid addresses diff --git a/core/src/main/resources/i18n/displayStrings_vi.properties b/core/src/main/resources/i18n/displayStrings_vi.properties index 0f2205fca3..4533181518 100644 --- a/core/src/main/resources/i18n/displayStrings_vi.properties +++ b/core/src/main/resources/i18n/displayStrings_vi.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=chào giá shared.multipleOffers=nhiều chào giá shared.Offer=Chào giá +shared.offerVolumeCode={0} Offer Volume shared.openOffers=Các lệnh đang mở shared.trade=giao dịch shared.trades=nhiều giao dịch @@ -122,7 +123,8 @@ shared.noDateAvailable=Ngày tháng không hiển thị shared.noDetailsAvailable=Không có thông tin shared.notUsedYet=Chưa được sử dụng shared.date=Ngày -shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq detected that this transaction would create a change output which is below the minimum dust threshold (and therefore not allowed by Bitcoin consensus rules). Instead, this dust ({0} satoshi{1}) will be added to the mining fee.\n\n\n shared.copyToClipboard=Sao chép đến clipboard shared.language=Ngôn ngữ @@ -188,7 +190,6 @@ shared.tradeWalletAddress=Địa chỉ ví giao dịch shared.tradeWalletBalance=Số dư ví giao dịch shared.makerTxFee=Người tạo: {0} shared.takerTxFee=Người nhận: {0} -shared.securityDepositBox.description=Tiền đặt cọc cho BTC {0} shared.iConfirm=Tôi xác nhận shared.tradingFeeInBsqInfo=equivalent to {0} used as trading fee shared.openURL=Mở {0} @@ -237,8 +238,6 @@ mainView.menu.settings=Cài đặt mainView.menu.account=Tài khoản mainView.menu.dao=DAO -mainView.marketPrice.provider=Giá theo -mainView.marketPrice.label=Giá thị trường mainView.marketPriceWithProvider.label=Giá thị trường theo {0} mainView.marketPrice.bisqInternalPrice=Giá giao dịch Bisq gần nhất mainView.marketPrice.tooltip.bisqInternalPrice=Không có giá thị trường từ nhà cung cấp bên ngoài.\nGiá hiển thị là giá giao dịch Bisq gần nhất với đồng tiền này. @@ -251,14 +250,15 @@ mainView.balance.locked.short=Bị khóa mainView.footer.usingTor=(sử dụng Tor) mainView.footer.localhostBitcoinNode=(Máy chủ nội bộ) -mainView.footer.btcInfo=Các mạng Bitcoin ngang hàng: {0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=Đang kết nối với mạng Bitcoin mainView.footer.bsqInfo.synchronizing=/ Đang đồng bộ hóa DAO mainView.footer.btcInfo.synchronizingWith=Synchronizing with -mainView.footer.btcInfo.synchronizedWith=Đã đồng bộ hóa với +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=Đang kết nối với mainView.footer.btcInfo.connectionFailed=Connection failed to -mainView.footer.p2pInfo=Bisq network peers: {0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=Full node DAO mainView.bootstrapState.connectionToTorNetwork=(1/4) Kết nối với mạng ... @@ -292,7 +292,6 @@ market.tabs.spread=Thông tin chi tiết market.tabs.trades=Các giao dịch # OfferBookChartView -market.offerBook.chart.title=Đặt chào giá cho {0} market.offerBook.buyAltcoin=Mua {0} (bán {1}) market.offerBook.sellAltcoin=Bán {0} (mua {1}) market.offerBook.buyWithFiat=Mua {0} @@ -382,7 +381,7 @@ offerbook.warning.noMatchingAccount.msg=This offer uses a payment method you hav offerbook.warning.counterpartyTradeRestrictions=This offer cannot be taken due to counterparty trade restrictions -offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at https://docs.bisq.network/payment-methods#account-signing. +offerbook.warning.newVersionAnnouncement=With this version of the software, trading peers can verify and sign each others' payment accounts to create a network of trusted payment accounts.\n\nAfter successfully trading with a peer with a verified payment account, your payment account will be signed and trading limits will be lifted after a certain time interval (length of this interval is based on the verification method).\n\nFor more information on account signing, please see the documentation at [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.warning.tradeLimitDueAccountAgeRestriction.seller=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- The buyer''s account has not been signed by an arbitrator or a peer\n- The time since signing of the buyer''s account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} popup.warning.tradeLimitDueAccountAgeRestriction.buyer=The allowed trade amount is limited to {0} because of security restrictions based on the following criteria:\n- Your account has not been signed by an arbitrator or a peer\n- The time since signing of your account is not at least 30 days\n- The payment method for this offer is considered risky for bank chargebacks\n\n{1} @@ -393,8 +392,7 @@ offerbook.warning.offerBlocked=Báo giá này bị chặn bởi các lập trìn offerbook.warning.currencyBanned=Loại tiền sử dụng trong báo giá này bị chặn bởi các lập trình viên Bisq.\nTruy cập diễn đàn Bisq để biết thêm thông tin. offerbook.warning.paymentMethodBanned=Phương thức thanh toán sử dụng trong báo giá này bị chặn bởi các lập trình viên Bisq.\nTruy cập diễn đàn Bisq để biết thêm thông tin. offerbook.warning.nodeBlocked=Địa chỉ onion của Thương gia bị chặn bởi các lập trình viên Bisq.\nCó thể có sự cố chưa được xử lý dẫn tới vấn đề khi nhận báo giá từ Thương gia này. -offerbook.warning.requireUpdateToNewVersion=Phiên bản Bisq bạn đang sử dụng không còn hỗ trợ giao dịch nữa.\nVui lòng cập nhận phiên bản Bisq mới nhất tại https://bisq.network/downloads. -offerbook.warning.tradeLimitNotMatching=Your payment account has been created {0} ago. Your trade limit is based on the account age and is not sufficient for that offer.\n\nYour trade limit is: {1}\nThe min. trade amount of the offer is: {2}.\n\nYou cannot take that offer at the moment. Once your account is older than 2 months this restriction gets removed. +offerbook.warning.requireUpdateToNewVersion=Your version of Bisq is not compatible for trading anymore.\nPlease update to the latest Bisq version at [HYPERLINK:https://bisq.network/downloads]. offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. offerbook.info.sellAtMarketPrice=Bạn sẽ bán với giá thị trường (cập nhật mỗi phút). @@ -445,7 +443,6 @@ createOffer.alreadyFunded=Bạn đã nộp tiền cho chào giá.\nSố tiền c createOffer.createOfferFundWalletInfo.headline=Nộp tiền cho báo giá của bạn # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- Khoản tiền giao dịch: {0} \n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} và {1} createOffer.createOfferFundWalletInfo.msg=Bạn cần đặt cọc {0} cho báo giá này.\n\nCác khoản tiền này sẽ được giữ trong ví nội bộ của bạn và sẽ bị khóa vào địa chỉ đặt cọc multisig khi có người nhận báo giá của bạn.\n\nKhoản tiền này là tổng của:\n{1}- tiền gửi đại lý của bạn: {2}\n- Phí giao dịch: {3}\n- Phí đào: {4}\n\nBạn có thể chọn giữa hai phương án khi nộp tiền cho giao dịch:\n- Sử dụng ví Bisq của bạn (tiện lợi, nhưng giao dịch có thể bị kết nối) OR\n- Chuyển từ ví bên ngoài (riêng tư hơn)\n\nBạn sẽ xem các phương án nộp tiền và thông tin chi tiết sau khi đóng cửa sổ này. # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=Bạn không thể nhận báo giá vì người takeOffer.warning.connectionToPeerLost=You lost connection to the maker.\nThey might have gone offline or has closed the connection to you because of too many open connections.\n\nIf you can still see their offer in the offerbook you can try to take the offer again. takeOffer.error.noFundsLost=\n\nVí của bạn không còn tiền.\nHãy khởi động lại ứng dụng và kiểm tra kết nối mạng để xem bạn có thể xử lý vấn đề này hay không. +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n\n takeOffer.error.depositPublished=\n\nGiao dịch đặt cọc đã được công bố.\nHãy khởi động lại ứng dụng và kiểm tra kết nối mạng để xem bạn có thể xử lý vấn đề này hay không.\nNếu vấn đề vẫn không được xử lý, hãy liên hệ các lập trình viên để được hỗ trợ. takeOffer.error.payoutPublished=\n\nGiao dịch hoàn tiền đã được công bố.\nHãy khởi động lại ứng dụng và kiểm tra kết nối mạng để xem bạn có thể xử lý vấn đề này hay không.\nNếu vấn đề vẫn không được xử lý, hãy liên hệ các lập trình viên để được hỗ trợ. @@ -543,7 +541,7 @@ portfolio.tab.history=Lịch sử portfolio.tab.failed=Không thành công portfolio.tab.editOpenOffer=Chỉnh sửa báo giá -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase [HYPERLINK:https://keybase.io/team/bisq] or on the forum [HYPERLINK:https://bisq.community] for further assistance.\n\nError message: {0} portfolio.pending.step1.waitForConf=Đợi xác nhận blockchain portfolio.pending.step2_buyer.startPayment=Bắt đầu thanh toán @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=Yêu cầu quan trọng:\nSau khi # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=Hãy thanh toán {0} cho người bán BTC bằng cách sử dụng Western Union.\n\n portfolio.pending.step2_buyer.westernUnion.extra=YÊU CẦU QUAN TRỌNG:\nSau khi bạn đã thanh toán xong hãy gửi MTCN (số theo dõi) và ảnh giấy biên nhận bằng email cho người bán BTC.\nGiấy biên nhận phải ghi rõ họ tên của người bán, thành phố, quốc gia và số tiền. Địa chỉ email của người bán là: {0}. +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=Hãy gửi {0} bằng \"Phiếu chuyển tiền US\" cho người bán BTC.\n\n @@ -636,7 +636,7 @@ portfolio.pending.step2_buyer.confirmStart.headline=Xác nhận rằng bạn đ portfolio.pending.step2_buyer.confirmStart.msg=Bạn đã kích hoạt thanh toán {0} cho Đối tác giao dịch của bạn chưa? portfolio.pending.step2_buyer.confirmStart.yes=Có, tôi đã bắt đầu thanh toán portfolio.pending.step2_buyer.confirmStart.proof.warningTitle=You have not provided proof of payment -portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +portfolio.pending.step2_buyer.confirmStart.proof.noneProvided=You have not entered the transaction ID and the transaction key.\n\nBy not providing this data the peer cannot use the auto-confirm feature to release the BTC as soon the XMR has been received.\nBeside that, Bisq requires that the sender of the XMR transaction is able to provide this information to the mediator or arbitrator in case of a dispute.\nSee more details on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. portfolio.pending.step2_buyer.confirmStart.proof.invalidInput=Input is not a 32 byte hexadecimal value portfolio.pending.step2_buyer.confirmStart.warningButton=Ignore and continue anyway portfolio.pending.step2_seller.waitPayment.headline=Đợi thanh toán @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=Thông tin liên lạc của ng portfolio.pending.step2_seller.waitPayment.msg=Giao dịch đặt cọc có ít nhất một xác nhận blockchain.\nBạn cần phải đợi cho đến khi người mua BTC bắt đầu thanh toán {0}. portfolio.pending.step2_seller.warn=Người mua BTC vẫn chưa thanh toán {0}.\nBạn cần phải đợi cho đến khi người mua bắt đầu thanh toán.\nNếu giao dịch không được hoàn thành vào {1} trọng tài sẽ điều tra. portfolio.pending.step2_seller.openForDispute=The BTC buyer has not started their payment!\nThe max. allowed period for the trade has elapsed.\nYou can wait longer and give the trading peer more time or contact the mediator for assistance. -portfolio.pending.step2_seller.refresh=Refresh Trade State -portfolio.pending.step2_seller.refreshInfo=Sometimes P2P network messages acknowledging payment are not delivered, causing trades to get stuck. Hit the button below to make your peer resend the last message. tradeChat.chatWindowTitle=Chat window for trade with ID ''{0}'' tradeChat.openChat=Open chat window tradeChat.rules=You can communicate with your trade peer to resolve potential problems with this trade.\nIt is not mandatory to reply in the chat.\nIf a trader violates any of the rules below, open a dispute and report it to the mediator or arbitrator.\n\nChat rules:\n\t● Do not send any links (risk of malware). You can send the transaction ID and the name of a block explorer.\n\t● Do not send your seed words, private keys, passwords or other sensitive information!\n\t● Do not encourage trading outside of Bisq (no security).\n\t● Do not engage in any form of social engineering scam attempts.\n\t● If a peer is not responding and prefers to not communicate via chat, respect their decision.\n\t● Keep conversation scope limited to the trade. This chat is not a messenger replacement or troll-box.\n\t● Keep conversation friendly and respectful. @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=Vì thanh toán được thực hiện qua T portfolio.pending.step3_seller.moneyGram=Người mua phải gửi mã số xác nhận và ảnh chụp của hoá đơn qua email.\nHoá đơn cần ghi rõ họ tên đầy đủ, quốc gia, tiêu bang và số lượng. Vui lòng kiểm tra email nếu bạn nhận được số xác thực.\n\nSau khi popup đóng, bạn sẽ thấy tên người mua BTC và địa chỉ để nhận tiền từ MoneyGram.\n\nChỉ xác nhận hoá đơn sau khi bạn hoàn thành việc nhận tiền. portfolio.pending.step3_seller.westernUnion=Người mua phải gửi cho bạn MTCN (số theo dõi) và ảnh giấy biên nhận qua email.\nGiấy biên nhận phải ghi rõ họ tên của bạn, thành phố, quốc gia và số tiền. Hãy kiểm tra email xem bạn đã nhận được MTCN chưa.\n\nSau khi đóng cửa sổ này, bạn sẽ thấy tên và địa chỉ của người mua BTC để nhận tiền từ Western Union.\n\nChỉ xác nhận giấy biên nhận sau khi bạn đã nhận tiền thành công! portfolio.pending.step3_seller.halCash=Người mua phải gửi mã HalCash cho bạn bằng tin nhắn. Ngoài ra, bạn sẽ nhận được một tin nhắn từ HalCash với thông tin cần thiết để rút EUR từ một máy ATM có hỗ trợ HalCash. \n\nSau khi nhận được tiền từ ATM vui lòng xác nhận lại biên lai thanh toán tại đây! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\nPlease also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=don't confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n portfolio.pending.step3_seller.confirmPaymentReceipt=Xác nhận đã nhận được thanh toán portfolio.pending.step3_seller.amountToReceive=Số tiền nhận được @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=Bạn đã nhận đượ portfolio.pending.step3_seller.onPaymentReceived.fiat=ID giao dịch (nội dung \"lý do thanh toán\") của giao dịch là: \"{0}\"\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=Please also verify that the name of the sender specified on the trade contract matches the name that appears on your bank statement:\nSender''s name, per trade contract: {0}\n\nIf the names are not exactly the same, don''t confirm payment receipt. Instead, open a dispute by pressing \"alt + o\" or \"option + o\".\n\n +# suppress inspection "TrailingSpacesInProperty" 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.\n\n portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=Xác nhận rằng bạn đã nhận được thanh toán portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=Vâng, tôi đã nhận được thanh toán @@ -746,7 +747,7 @@ portfolio.pending.tradePeriodInfo=Sau xác nhận blockchain đầu tiên, thờ portfolio.pending.tradePeriodWarning=Nếu quá thời gian giao dịch, cả hai Thương gia đều có thể mở khiếu nại. portfolio.pending.tradeNotCompleted=giao dịch không được hoàn thành đúng thời gian (cho đến khi {0}) portfolio.pending.tradeProcess=Quá trình giao dịch -portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at https://bisq.community. +portfolio.pending.openAgainDispute.msg=If you are not sure that the message to the mediator or arbitrator arrived (e.g. if you did not get a response after 1 day) feel free to open a dispute again with Cmd/Ctrl+o. You can also ask for additional help on the Bisq forum at [HYPERLINK:https://bisq.community]. portfolio.pending.openAgainDispute.button=Mở khiếu nại lần nữa portfolio.pending.openSupportTicket.headline=Mở vé hỗ trợ portfolio.pending.openSupportTicket.msg=Please use this function only in emergency cases if you don't see a \"Open support\" or \"Open dispute\" button.\n\nWhen you open a support ticket the trade will be interrupted and handled by a mediator or arbitrator. @@ -757,14 +758,9 @@ portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. portfolio.pending.error.depositTxNotConfirmed=The deposit transaction is not confirmed. You can not open an arbitration dispute with an unconfirmed deposit transaction. Please wait until it is confirmed or go to \"Settings/Network info\" and do a SPV resync.\n\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -portfolio.pending.notification=Thông báo - portfolio.pending.support.headline.getHelp=Need help? portfolio.pending.support.text.getHelp=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from a mediator. -portfolio.pending.support.text.getHelp.arbitrator=If you have any problems you can try to contact the trade peer in the trade chat or ask the Bisq community at https://bisq.community. If your issue still isn't resolved, you can request more help from an arbitrator. portfolio.pending.support.button.getHelp=Open Trader Chat -portfolio.pending.support.popup.info=If your issue with the trade remains unsolved, you can open a support ticket to request help from a mediator. If you have not received the payment, please wait until the trade period is over.\n\nAre you sure you want to open a support ticket? -portfolio.pending.support.popup.button=Mở đơn hỗ trợ portfolio.pending.support.headline.halfPeriodOver=Check payment portfolio.pending.support.headline.periodOver=Trade period is over @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=Mediation requested portfolio.pending.refundRequested=Refund requested portfolio.pending.openSupport=Mở đơn hỗ trợ portfolio.pending.supportTicketOpened=Đơn hỗ trợ đã mở -portfolio.pending.requestSupport=Yêu cầu hỗ trợ -portfolio.pending.error.requestSupport=Please report the problem to your mediator or arbitrator.\n\nThey will forward the information to the developers to investigate the problem.\nAfter the problem has been analyzed you will get back all locked funds. portfolio.pending.communicateWithArbitrator=Vui lòng liên lạc với trong tài qua màn hình \"Hỗ trợ\". portfolio.pending.communicateWithMediator=Please communicate in the \"Support\" screen with the mediator. -portfolio.pending.supportTicketOpenedMyUser=Bạn đã mở một đơn hỗ trợ.\n{0} portfolio.pending.disputeOpenedMyUser=Bạn đã mở một khiếu nại.\n{0} portfolio.pending.disputeOpenedByPeer=Đối tác giao dịch của bạn đã mở một khiếu nại\n{0} -portfolio.pending.supportTicketOpenedByPeer=Đối tác giao dịch của bạn đã mở một đơn hỗ trợ.\n{0} portfolio.pending.noReceiverAddressDefined=Không có địa chỉ người nhận -portfolio.pending.removeFailedTrade=Is this a failed trade? If so, would you like to manually close it, so that it no longer shows as an open trade? portfolio.pending.mediationResult.headline=Suggested payout from mediation portfolio.pending.mediationResult.info.noneAccepted=Complete the trade by accepting the mediator's suggestion for the trade payout. @@ -790,18 +781,18 @@ portfolio.pending.mediationResult.info.peerAccepted=Your trade peer has accepted portfolio.pending.mediationResult.button=View proposed resolution portfolio.pending.mediationResult.popup.headline=Mediation result for trade with ID: {0} portfolio.pending.mediationResult.popup.headline.peerAccepted=Your trade peer has accepted the mediator''s suggestion for trade {0} -portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model:\nhttps://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.info=The mediator has suggested the following payout:\nYou receive: {0}\nYour trading peer receives: {1}\n\nYou can accept or reject this suggested payout.\n\nBy accepting, you sign the proposed payout transaction. If your trading peer also accepts and signs, the payout will be completed, and the trade will be closed.\n\nIf one or both of you reject the suggestion, you will have to wait until {2} (block {3}) to open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nThe arbitrator may charge a small fee (fee maximum: the trader''s security deposit) as compensation for their work. Both traders agreeing to the mediator''s suggestion is the happy path—requesting arbitration is meant for exceptional circumstances, such as if a trader is sure the mediator did not make a fair payout suggestion (or if the other peer is unresponsive).\n\nMore details about the new arbitration model: [HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nOnce the lock time is over on {0} (block {1}), you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:[HYPERLINK:https://docs.bisq.network/trading-rules.html#arbitration] portfolio.pending.mediationResult.popup.openArbitration=Reject and request arbitration portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. +portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: [HYPERLINK:https://github.com/bisq-network/support/issues]\n\nFeel free to move this trade to failed trades. +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. @@ -839,6 +830,7 @@ funds.deposit.fundWallet=Nộp tiền cho ví của bạn funds.deposit.withdrawFromWallet=Chuyển tiền từ ví funds.deposit.amount=Số tiền bằng BTC (tùy chọn) funds.deposit.generateAddress=Tạo địa chỉ mới +funds.deposit.generateAddressSegwit=Native segwit format (Bech32) funds.deposit.selectUnused=Vui lòng chọn địa chỉ chưa sử dụng từ bảng trên hơn là tạo một địa chỉ mới. funds.withdrawal.arbitrationFee=Phí trọng tài @@ -898,7 +890,7 @@ funds.tx.daoTxFee=Phí đào cho giao dịch DAO funds.tx.reimbursementRequestTxFee=Yêu cầu bồi hoàn funds.tx.compensationRequestTxFee=Yêu cầu bồi thường funds.tx.dustAttackTx=Số dư nhỏ đã nhận -funds.tx.dustAttackTx.popup=Giao dịch này đang gửi một lượng BTC rất nhỏ vào ví của bạn và có thể đây là cách các công ty phân tích chuỗi đang tìm cách theo dõi ví của bạn.\nNếu bạn sử dụng đầu ra giao dịch đó cho một giao dịch chi tiêu, họ sẽ phát hiện ra rằng rất có thể bạn cũng là người sở hửu cái ví kia (nhập coin). \n\nĐể bảo vệ quyền riêng tư của bạn, ví Bisq sẽ bỏ qua các đầu ra có số dư nhỏ dành cho mục đích chi tiêu cũng như hiển thị số dư. Bạn có thể thiết lập ngưỡng khi một đầu ra được cho là có số dư nhỏ trong phần cài đặt. +funds.tx.dustAttackTx.popup=Giao dịch này đang gửi một lượng BTC rất nhỏ vào ví của bạn và có thể đây là cách các công ty phân tích chuỗi đang tìm cách theo dõi ví của bạn.\nNếu bạn sử dụng đầu ra giao dịch đó cho một giao dịch chi tiêu, họ sẽ phát hiện ra rằng rất có thể bạn cũng là người sở hửu cái ví kia (nhập coin). \n\nĐể bảo vệ quyền riêng tư của bạn, ví Bisq sẽ bỏ qua các đầu ra có số dư nhỏ dành cho mục đích chi tiêu cũng như hiển thị số dư. Bạn có thể thiết lập ngưỡng khi một đầu ra được cho là có số dư nhỏ trong phần cài đặt. #################################################################### @@ -986,6 +978,7 @@ setting.preferences.general=Tham khảo chung setting.preferences.explorer=Bitcoin Explorer setting.preferences.explorer.bsq=Bisq Explorer setting.preferences.deviation=Sai lệch tối đa so với giá thị trường +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=Tránh để chế độ chờ setting.preferences.autoConfirmXMR=XMR auto-confirm setting.preferences.autoConfirmEnabled=Enabled @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=Required confirmations setting.preferences.autoConfirmMaxTradeSize=Max. trade amount (BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer URLs (uses Tor, except for localhost, LAN IP addresses, and *.local hostnames) setting.preferences.deviationToLarge=Giá trị không được phép lớn hơn {0}%. -setting.preferences.txFee=phí giao dịch rút (satoshis/byte) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=Sử dụng giá trị thông dụng -setting.preferences.txFeeMin=phí giao dịch phải tối thiểu là {0} satoshis/byte -setting.preferences.txFeeTooLarge=Giá trị nhập của bạn cao hơn giá trị hợp lý (>5000 satoshis/byte). phí giao dịch thường nằm trong phạm vi 50-400 satoshis/byte. +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=Bỏ qua đối tác[địa chỉ onion:cổng] -setting.preferences.refererId=ID giới thiệu setting.preferences.ignoreDustThreshold=Giá trị đầu ra tối thiểu không phải số dư nhỏ -setting.preferences.refererId.prompt=tuỳ chọn ID giới thiệu setting.preferences.currenciesInList=Tiền tệ trong danh sách cung cấp giá thị trường setting.preferences.prefCurrency=Tiền tệ ưu tiên setting.preferences.displayFiat=Hiển thị tiền tệ các nước @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=Sử dụng hoạt ảnh setting.preferences.useDarkMode=Use dark mode setting.preferences.sortWithNumOffers=Sắp xếp danh sách thị trường với số chào giá/giao dịch setting.preferences.resetAllFlags=Cài đặt lại tất cả nhãn \"Không hiển thị lại\" -setting.preferences.reset=Cài đặt lại settings.preferences.languageChange=Áp dụng thay đổi ngôn ngữ cho tất cả màn hình yêu cầu khởi động lại. settings.preferences.supportLanguageWarning=In case of a dispute, please note that mediation is handled in {0} and arbitration in {1}. -settings.preferences.selectCurrencyNetwork=Chọn mạng setting.preferences.daoOptions=Tùy chọn DAO setting.preferences.dao.resyncFromGenesis.label=Tái dựng trạng thái DAO từ giao dịch genesis setting.preferences.dao.resyncFromResources.label=Rebuild DAO state from resources @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=Cổng thông báo chặn setting.preferences.dao.fullNodeInfo=Để chạy Bisq như một DAO full node, bạn cần phải chạy Bitcoin Core trên máy tính của mình và cho phép RPC. Tất cả các yêu cầu khác được nêu rõ tại ''{0}''.\n\nSau khi thay đổi chế độ bạn cần phải khởi động lại. setting.preferences.dao.fullNodeInfo.ok=Mở trang docs setting.preferences.dao.fullNodeInfo.cancel=Không, tôi sẽ tiếp tục dùng chế độ lite node +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=Tên +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=Mạng Bitcoin settings.net.p2pHeader=Bisq network @@ -1044,7 +1040,7 @@ settings.net.bitcoinNodesLabel=nút Bitcoin Core để kết nối settings.net.useProvidedNodesRadio=Sử dụng các nút Bitcoin Core đã cung cấp settings.net.usePublicNodesRadio=Sử dụng mạng Bitcoin công cộng settings.net.useCustomNodesRadio=Sử dụng nút Bitcoin Core thông dụng -settings.net.warn.usePublicNodes=Nếu bạn sử dụng mạng Bitcoin công cộng, bạn có thể gặp vấn đề về quyền riêng tư do thiết kế bộ lọc bloom bị hư hỏng và quá trình thực hiện áp dụng cho ví SPV như BitcoinJ (sử dụng trong Bisq). Bất cứ nút nào mà bạn kết nối cũng có thể thấy địa chỉ ví của bạn thuộc về một tổ chức.\n\nVui lòng đọc thêm thông tin chi tiết tại: https://bisq.network/blog/privacy-in-bitsquare.\n\nBạn có chắc muốn sử dụng nút công cộng? +settings.net.warn.usePublicNodes=If you use the public Bitcoin network you are exposed to a severe privacy problem caused by the broken bloom filter design and implementation which is used for SPV wallets like BitcoinJ (used in Bisq). Any full node you are connected to could find out that all your wallet addresses belong to one entity.\n\nPlease read more about the details at [HYPERLINK:https://bisq.network/blog/privacy-in-bitsquare].\n\nAre you sure you want to use the public nodes? settings.net.warn.usePublicNodes.useProvided=Không, sử dụng nút được cung cấp settings.net.warn.usePublicNodes.usePublic=Vâng, sử dụng nút công cộng settings.net.warn.useCustomNodes.B2XWarning=Vui lòng chắc chắn rằng nút Bitcoin của bạn là nút Bitcoin Core đáng tin cậy!\n\nKết nối với nút không tuân thủ nguyên tắc đồng thuận Bitcoin Core có thể làm hỏng ví của bạn và gây ra các vấn đề trong quá trình giao dịch.\n\nNgười dùng kết nối với nút vi phạm nguyên tắc đồng thuận chịu trách nhiệm đối với các thiệt hại mà việc này gây ra. Các khiếu nại do điều này gây ra sẽ được quyết định theo hướng có lợi cho đối tác bên kia. Sẽ không có hỗ trợ về mặt kỹ thuật nào cho người dùng không tuân thủ cơ chế cảnh báo và bảo vệ của chúng tôi! @@ -1150,16 +1146,14 @@ setting.about.shortcuts.sendPrivateNotification=Send private notification to pee setting.about.shortcuts.sendPrivateNotification.value=Open peer info at avatar and press: {0} setting.info.headline=New XMR auto-confirm Feature -setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki: https://bisq.wiki/Trading_Monero#Auto-confirming_trades +setting.info.msg=When selling BTC for XMR you can use the auto-confirm feature to verify that the correct amount of XMR was sent to your wallet so that Bisq can automatically mark the trade as complete, making trades quicker for everyone.\n\nAuto-confirm checks the XMR transaction on at least 2 XMR explorer nodes using the private transaction key provided by the XMR sender. By default, Bisq uses explorer nodes run by Bisq contributors, but we recommend running your own XMR explorer node for maximum privacy and security.\n\nYou can also set the maximum amount of BTC per trade to auto-confirm as well as the number of required confirmations here in Settings.\n\nSee more details (including how to set up your own explorer node) on the Bisq wiki [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades] #################################################################### # Account #################################################################### -account.tab.arbitratorRegistration=Đăng ký trọng tài account.tab.mediatorRegistration=Mediator registration account.tab.refundAgentRegistration=Refund agent registration account.tab.signing=Signing -account.tab.account=Tài khoản account.info.headline=Chào mừng đến với tài khoản Bisq của bạn account.info.msg=Here you can add trading accounts for national currencies & altcoins and create a backup of your wallet & account data.\n\nA new Bitcoin wallet was created the first time you started Bisq.\n\nWe strongly recommend that you write down your Bitcoin wallet seed words (see tab on the top) and consider adding a password before funding. Bitcoin deposits and withdrawals are managed in the \"Funds\" section.\n\nPrivacy & security note: because Bisq is a decentralized exchange, all your data is kept on your computer. There are no servers, so we have no access to your personal info, your funds, or even your IP address. Data such as bank account numbers, altcoin & Bitcoin addresses, etc are only shared with your trading partner to fulfill trades you initiate (in case of a dispute the mediator or arbitrator will see the same data as your trading peer). @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=Could not complete registration.{0 account.altcoin.yourAltcoinAccounts=Tài khoản altcoin của bạn account.altcoin.popup.wallet.msg=Please be sure that you follow the requirements for the usage of {0} wallets as described on the {1} web page.\nUsing wallets from centralized exchanges where (a) you don''t control your keys or (b) which don''t use compatible wallet software is risky: it can lead to loss of the traded funds!\nThe mediator or arbitrator is not a {2} specialist and cannot help in such cases. account.altcoin.popup.wallet.confirm=Tôi hiểu và xác nhận rằng tôi đã biết loại ví mình cần sử dụng. +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=Trading UPX on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending UPX, you need to use either the official uPlexa GUI wallet or uPlexa CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\nuplexa-wallet-cli (use the command get_tx_key)\nuplexa-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The UPX sender is responsible for providing verification of the UPX transfer to the arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit uPlexa discord channel (https://discord.gg/vhdNSrV) or the uPlexa Telegram Chat (https://t.me/uplexaOfficial) to find more information. +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=Trading ARQ on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending ARQ, you need to use either the official ArQmA GUI wallet or ArQmA CLI wallet with the store-tx-info flag enabled (default in new versions). Please be sure you can access the tx key as that would be required in case of a dispute.\narqma-wallet-cli (use the command get_tx_key)\narqma-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nAt normal block explorers the transfer is not verifiable.\n\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The ARQ sender is responsible for providing verification of the ARQ transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process visit ArQmA discord channel (https://discord.gg/s9BQpJT) or the ArQmA forum (https://labs.arqma.com) to find more information. -account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" +account.altcoin.popup.xmr.msg=Trading XMR on Bisq requires that you understand the following requirement.\n\nIf selling XMR, you must be able to provide the following information to a mediator or arbitrator in case of a dispute:\n- the transaction key (Tx Key, Tx Secret Key or Tx Private Key)\n- the transaction ID (Tx ID or Tx Hash)\n- the destination address (recipient's address)\n\nSee the wiki for details on where to find this information on popular Monero wallets [HYPERLINK:https://bisq.wiki/Trading_Monero#Proving_payments].\nFailure to provide the required transaction data will result in losing disputes.\n\nAlso note that Bisq now offers automatic confirming for XMR transactions to make trades quicker, but you need to enable it in Settings.\n\nSee the wiki for more information about the auto-confirm feature: [HYPERLINK:https://bisq.wiki/Trading_Monero#Auto-confirming_trades]. +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=Trading MSR on Bisq requires that you understand and fulfill the following requirements:\n\nFor sending MSR, you need to use either the official Masari GUI wallet, Masari CLI wallet with the store-tx-info flag enabled (enabled by default) or the Masari web wallet (https://wallet.getmasari.org). Please be sure you can access the tx key as that would be required in case of a dispute.\nmasari-wallet-cli (use the command get_tx_key)\nmasari-wallet-gui (go to history tab and click on the (P) button for payment proof)\n\nMasari Web Wallet (goto Account -> transaction history and view details on your sent transaction)\n\nVerification can be accomplished in-wallet.\nmasari-wallet-cli : using command (check_tx_key).\nmasari-wallet-gui : on the Advanced > Prove/Check page.\nVerification can be accomplished in the block explorer \nOpen block explorer (https://explorer.getmasari.org), use the search bar to find your transaction hash.\nOnce transaction is found, scroll to bottom to the 'Prove Sending' area and fill in details as needed.\nYou need to provide the mediator or arbitrator the following data in case of a dispute:\n- The tx private key\n- The transaction hash\n- The recipient's public address\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The MSR sender is responsible for providing verification of the MSR transfer to the mediator or arbitrator in case of a dispute.\n\nThere is no payment ID required, just the normal public address.\nIf you are not sure about that process, ask for help on the Official Masari Discord (https://discord.gg/sMCwMqs). +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=Trading BLUR on Bisq requires that you understand and fulfill the following requirements:\n\nTo send BLUR you must use the Blur Network CLI or GUI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIf you are using the Blur Network GUI Wallet, the transaction private key and transaction ID can be found conveniently in the "History" tab. Immediately after sending, locate the transaction of interest. Click the "?" symbol in the lower-right corner of the box containing the transaction. You must save this information. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the BLUR transfer using the Blur Transaction Viewer (https://blur.cash/#tx-viewer).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the BLUR sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Blur Network Discord (https://discord.gg/dMWaqVW). +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=Trading Solo on Bisq requires that you understand and fulfill the following requirements:\n\nTo send Solo you must use the Solo Network CLI Wallet. \n\nIf you are using the CLI wallet, a transaction hash (tx ID) will be displayed after a transfer is sent. You must save this information. Immediately after sending the transfer, you must use the command 'get_tx_key' to retrieve the transaction private key. If you fail to perform this step, you may not be able to retrieve the key later. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1.) the transaction ID, 2.) the transaction private key, and 3.) the recipient's address. The mediator or arbitrator will then verify the Solo transfer using the Solo Block Explorer by searching for the transaction and then using the "Prove sending" function (https://explorer.minesolo.com/).\n\nfailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the Solo sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Solo Network Discord (https://discord.minesolo.com/). +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=Trading CASH2 on Bisq requires that you understand and fulfill the following requirements:\n\nTo send CASH2 you must use the Cash2 Wallet version 3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'getTxKey' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's Cash2 address. The mediator or arbitrator will then verify the CASH2 transfer using the Cash2 Block Explorer (https://blocks.cash2.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the CASH2 sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the Cash2 Discord (https://discord.gg/FGfXAYN). +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=Trading Qwertycoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send QWC you must use the official QWC Wallet version 5.1.3 or higher. \n\nAfter a transaction is sent, the transaction ID will be displayed. You must save this information. Immediately after sending the transaction, you must use the command 'get_Tx_Key' in simplewallet to retrieve the transaction secret key. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the transaction ID, 2) the transaction secret key, and 3) the recipient's QWC address. The mediator or arbitrator will then verify the QWC transfer using the QWC Block Explorer (https://explorer.qwertycoin.org).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the QWC sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the QWC Discord (https://discord.gg/rUkfnpC). +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=Trading Dragonglass on Bisq requires that you understand and fulfill the following requirements:\n\nBecause of the privacy Dragonglass provides, a transaction is not verifiable on the public blockchain. If required, you can prove your payment through the use of your TXN-Private-Key.\nThe TXN-Private Key is a one-time key automatically generated for every transaction that can only be accessed from within your DRGL wallet.\nEither by DRGL-wallet GUI (inside transaction details dialog) or by the Dragonglass CLI simplewallet (using command "get_tx_key").\n\nDRGL version 'Oathkeeper' and higher are REQUIRED for both.\n\nIn case of a dispute, you must provide the mediator or arbitrator the following data:\n- The TXN-Private key\n- The transaction hash\n- The recipient's public address\n\nVerification of payment can be made using the above data as inputs at (http://drgl.info/#check_txn).\n\nFailure to provide the above data, or if you used an incompatible wallet, will result in losing the dispute case. The Dragonglass sender is responsible for providing verification of the DRGL transfer to the mediator or arbitrator in case of a dispute. Use of PaymentID is not required.\n\nIf you are unsure about any part of this process, visit Dragonglass on Discord (http://discord.drgl.info) for help. +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=When using Zcash you can only use the transparent addresses (starting with t), not the z-addresses (private), because the mediator or arbitrator would not be able to verify the transaction with z-addresses. +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=When using Zcoin you can only use the transparent (traceable) addresses, not the untraceable addresses, because the mediator or arbitrator would not be able to verify the transaction with untraceable addresses at a block explorer. -account.altcoin.popup.grin.msg=GRIN yêu cầu một quá trình tương tác giữa người gửi và người nhận để thực hiện một giao dịch. Vui lòng làm theo hướng dẫn từ trang web của dự án GRIN để gửi và nhận GRIN đúng cách. (người nhận cần phải trực tuyến hoặc ít nhất là trực tuyến trong một khung thời gian nhất định).\n\nBisq chỉ hỗ trợ ví Grinbox(wallet713) theo định dạng URL.\n\nNgười gửi GRIN phải cung cấp bằng chứng là họ đã gửi GRIN thành công. Nếu ví không thể cung cấp bằng chứng đó, nếu có tranh chấp thì sẽ được giải quyết theo hướng có lợi cho người nhận GRIN. Vui lòng đảm bảo rằng bạn sử dụng phần mềm Grinbox mới nhất có hỗ trợ bằng chứng giao dịch và bạn hiểu quy trình chuyển và nhận GRIN cũng như tạo bằng chứng. \n\nXem https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only để biết thêm thông tin về công cụ bằng chứng Grinbox. -account.altcoin.popup.beam.msg=BEAM yêu cầu một quá trình tương tác giữa người gửi và người nhận để thực hiện một giao dịch. \n\nVui lòng làm theo hướng dẫn từ trang web của dự án BEAM để gửi và nhận BEAM đúng cách. (người nhận cần phải trực tuyến hoặc ít nhất là trực tuyến trong một khung thời gian nhất định).\n\nNgười gửi BEAM phải cung cấp bằng chứng là họ đã gửi BEAM thành công. Vui lòng đảm bảo là bạn sử dụng phần mềm ví có thể tạo ra một bằng chứng như vậy. Nếu ví không thể cung cấp bằng chứng đó, nếu có tranh chấp thì sẽ được giải quyết theo hướng có lợi cho người nhận BEAM. +# suppress inspection "UnusedProperty" +account.altcoin.popup.grin.msg=GRIN yêu cầu một quá trình tương tác giữa người gửi và người nhận để thực hiện một giao dịch. Vui lòng làm theo hướng dẫn từ trang web của dự án GRIN để gửi và nhận GRIN đúng cách. (người nhận cần phải trực tuyến hoặc ít nhất là trực tuyến trong một khung thời gian nhất định).\n\nBisq chỉ hỗ trợ ví Grinbox(wallet713) theo định dạng URL.\n\nNgười gửi GRIN phải cung cấp bằng chứng là họ đã gửi GRIN thành công. Nếu ví không thể cung cấp bằng chứng đó, nếu có tranh chấp thì sẽ được giải quyết theo hướng có lợi cho người nhận GRIN. Vui lòng đảm bảo rằng bạn sử dụng phần mềm Grinbox mới nhất có hỗ trợ bằng chứng giao dịch và bạn hiểu quy trình chuyển và nhận GRIN cũng như tạo bằng chứng. \n\nXem https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only để biết thêm thông tin về công cụ bằng chứng Grinbox. +# suppress inspection "UnusedProperty" +account.altcoin.popup.beam.msg=BEAM yêu cầu một quá trình tương tác giữa người gửi và người nhận để thực hiện một giao dịch. \n\nVui lòng làm theo hướng dẫn từ trang web của dự án BEAM để gửi và nhận BEAM đúng cách. (người nhận cần phải trực tuyến hoặc ít nhất là trực tuyến trong một khung thời gian nhất định).\n\nNgười gửi BEAM phải cung cấp bằng chứng là họ đã gửi BEAM thành công. Vui lòng đảm bảo là bạn sử dụng phần mềm ví có thể tạo ra một bằng chứng như vậy. Nếu ví không thể cung cấp bằng chứng đó, nếu có tranh chấp thì sẽ được giải quyết theo hướng có lợi cho người nhận BEAM. +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=Trading ParsiCoin on Bisq requires that you understand and fulfill the following requirements:\n\nTo send PARS you must use the official ParsiCoin Wallet version 3.0.0 or higher. \n\nYou can Check your Transaction Hash and Transaction Key on Transactions Section on your GUI Wallet (ParsiPay) You need to right Click on the Transaction and then click on show details. \n\nIn the event that arbitration is necessary, you must present the following to an mediator or arbitrator: 1) the Transaction Hash, 2) the Transaction Key, and 3) the recipient's PARS address. The mediator or arbitrator will then verify the PARS transfer using the ParsiCoin Block Explorer (http://explorer.parsicoin.net/#check_payment).\n\nFailure to provide the required information to the mediator or arbitrator will result in losing the dispute case. In all cases of dispute, the ParsiCoin sender bears 100% of the burden of responsibility in verifying transactions to an mediator or arbitrator. \n\nIf you do not understand these requirements, do not trade on Bisq. First, seek help at the ParsiCoin Discord (https://discord.gg/c7qmFNh). +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=To trade burnt blackcoins, you need to know the following:\n\nBurnt blackcoins are unspendable. To trade them on Bisq, output scripts need to be in the form: OP_RETURN OP_PUSHDATA, followed by associated data bytes which, after being hex-encoded, constitute addresses. For example, burnt blackcoins with an address 666f6f (“foo” in UTF-8) will have the following script:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\nTo create burnt blackcoins, one may use the “burn” RPC command available in some wallets.\n\nFor possible use cases, one may look at https://ibo.laboratorium.ee .\n\nAs burnt blackcoins are unspendable, they can not be reselled. “Selling” burnt blackcoins means burning ordinary blackcoins (with associated data equal to the destination address).\n\nIn case of a dispute, the BLK seller needs to provide the transaction hash. +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=Trading L-BTC on Bisq requires that you understand the following:\n\nWhen receiving L-BTC for a trade on Bisq, you cannot use the mobile Blockstream Green Wallet app or a custodial/exchange wallet. You must only receive L-BTC into the Liquid Elements Core wallet, or another L-BTC wallet which allows you to obtain the blinding key for your blinded L-BTC address.\n\nIn the event mediation is necessary, or if a trade dispute arises, you must disclose the blinding key for your receiving L-BTC address to the Bisq mediator or refund agent so they can verify the details of your Confidential Transaction on their own Elements Core full node.\n\nFailure to provide the required information to the mediator or refund agent will result in losing the dispute case. In all cases of dispute, the L-BTC receiver bears 100% of the burden of responsibility in providing cryptographic proof to the mediator or refund agent.\n\nIf you do not understand these requirements, do not trade L-BTC on Bisq. account.fiat.yourFiatAccounts=Các tài khoản tiền tệ quốc gia của bạn @@ -1213,7 +1222,6 @@ account.backup.location=Vị trí sao lưu account.backup.selectLocation=Chọn vị trí dự phòng account.backup.backupNow=Dự phòng bây giờ (dự phòng không được mã hóa!) account.backup.appDir=Thư mục dữ liệu ứng dụng -account.backup.logFile=Tệp nhật ký account.backup.openDirectory=Mở thư mục account.backup.openLogFile=Mở tệp nhật ký account.backup.success=Dự phòng đã lưu thành công tại:\n{0} @@ -1227,11 +1235,11 @@ account.password.info=Bằng cách bảo vệ với mật khẩu, bạn cần nh account.seed.backup.title=Sao lưu dự phòng từ khởi tạo ví của bạn account.seed.info=Hãy viết ra từ khởi tạo ví của bạn và ngày! Bạn có thể khôi phục ví của bạn bất cứ lúc nào với các từ khởi tạo và ngày này.\nTừ khởi tạo được sử dụng chung cho cả ví BTC và BSQ.\n\nBạn nên viết các từ khởi tạo ra tờ giấy. Không được lưu trên máy tính.\n\nLưu ý rằng từ khởi tạo KHÔNG PHẢI là phương án thay thế cho sao lưu dự phòng.\nBạn cần sao lưu dự phòng toàn bộ thư mục của ứng dụng tại màn hình \"Tài khoản/Sao lưu dự phòng\" để khôi phục trạng thái và dữ liệu ứng dụng.\nNhập từ khởi tạo chỉ được thực hiện trong tình huống khẩn cấp. Ứng dụng sẽ không hoạt động mà không có dự phòng các file dữ liệu và khóa phù hợp! -account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page https://bisq.wiki/Backing_up_application_data for extended info. +account.seed.backup.warning=Please note that the seed words are NOT a replacement for a backup.\nYou need to create a backup of the whole application directory from the \"Account/Backup\" screen to recover application state and data.\nImporting seed words is only recommended for emergency cases. The application will not be functional without a proper backup of the database files and keys!\n\nSee the wiki page [HYPERLINK:https://bisq.wiki/Backing_up_application_data] for extended info. account.seed.warn.noPw.msg=Bạn đã tạo mật khẩu ví để bảo vệ tránh hiển thị Seed words.\n\nBạn có muốn hiển thị Seed words? account.seed.warn.noPw.yes=Có và không hỏi lại account.seed.enterPw=Nhập mật khẩu để xem seed words -account.seed.restore.info=Vui lòng tạo sao lưu dự phòng trước khi tiến hành khôi phục ví từ các từ khởi tạo. Phải hiểu rằng việc khôi phục ví chỉ nên thực hiện trong các trường hợp khẩn cấp và có thể gây sự cố với cơ sở dữ liệu ví bên trong.\nĐây không phải là một cách sao lưu dự phòng! Vui lòng sử dụng sao lưu dự phòng từ thư mục dữ liệu của ứng dụng để khôi phục trạng thái ban đầu của ứng dụng.\n\nSau khi khôi phục ứng dụng sẽ tự động tắt. Sau khi bạn khởi động lại, ứng dụng sẽ tái đồng bộ với mạng Bitcoin. Quá trình này có thể mất một lúc và tiêu tốn khá nhiều CPU, đặc biệt là khi ví đã cũ và có nhiều giao dịch. Vui lòng không làm gián đoạn quá trình này, nếu không bạn có thể sẽ phảỉ xóa file chuỗi SPV một lần nữa hoặc lặp lại quy trình khôi phục. +account.seed.restore.info=Vui lòng tạo sao lưu dự phòng trước khi tiến hành khôi phục ví từ các từ khởi tạo. Phải hiểu rằng việc khôi phục ví chỉ nên thực hiện trong các trường hợp khẩn cấp và có thể gây sự cố với cơ sở dữ liệu ví bên trong.\nĐây không phải là một cách sao lưu dự phòng! Vui lòng sử dụng sao lưu dự phòng từ thư mục dữ liệu của ứng dụng để khôi phục trạng thái ban đầu của ứng dụng.\n\nSau khi khôi phục ứng dụng sẽ tự động tắt. Sau khi bạn khởi động lại, ứng dụng sẽ tái đồng bộ với mạng Bitcoin. Quá trình này có thể mất một lúc và tiêu tốn khá nhiều CPU, đặc biệt là khi ví đã cũ và có nhiều giao dịch. Vui lòng không làm gián đoạn quá trình này, nếu không bạn có thể sẽ phảỉ xóa file chuỗi SPV một lần nữa hoặc lặp lại quy trình khôi phục. account.seed.restore.ok=Được, hãy thực hiện khôi phục và tắt ứng dụng Bisq @@ -1241,14 +1249,11 @@ account.seed.restore.ok=Được, hãy thực hiện khôi phục và tắt ứn account.notifications.setup.title=Cài đặt account.notifications.download.label=Tải ứng dụng di động -account.notifications.download.button=Tải về account.notifications.waitingForWebCam=Đang chờ webcam... account.notifications.webCamWindow.headline=Quét mã QR từ điện thoại account.notifications.webcam.label=Dùng webcam account.notifications.webcam.button=Quét mã QR account.notifications.noWebcam.button=Tôi không có webcam -account.notifications.testMsg.label=Gửi thông báo kiểm tra -account.notifications.testMsg.title=Kiểm tra account.notifications.erase.label=xóa thông báo trên điện thoại account.notifications.erase.title=Xóa thông báo account.notifications.email.label=Mã tài sản đảm bảo @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=Khoảng cách phần trăm so account.notifications.marketAlert.addButton=Thêm thông báo chào giá account.notifications.marketAlert.manageAlertsButton=Quản lý thông báo chào giá account.notifications.marketAlert.manageAlerts.title=Quản lý thông báo chào giá -account.notifications.marketAlert.manageAlerts.label=Thông báo chào giá -account.notifications.marketAlert.manageAlerts.item=Thông báo chào giá cho {0} chào giá với giá khởi phát {1} và tài khoản thanh toán {2} account.notifications.marketAlert.manageAlerts.header.paymentAccount=tài khoản thanh toán account.notifications.marketAlert.manageAlerts.header.trigger=Giá khởi phát account.notifications.marketAlert.manageAlerts.header.offerType=Loại chào giá @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=Số dư tất cả các giao dịch chưa xác minh ( dao.lockedForVoteBalance=Dùng để bỏ phiếu dao.lockedInBonds=Bị khóa trong hợp đồng dao.availableNonBsqBalance=Số dư không phải BSQ có sẵn (tính bằng BTC) -dao.totalBsqBalance=Tổng số dư BSQ dao.reputationBalance=Merit Value (not spendable) dao.tx.published.success=Giao dịch của bạn đã được công bố thành công. @@ -1455,11 +1457,6 @@ dao.param.currentValue=Giá trị hiện tại: {0} dao.param.currentAndPastValue=Current value: {0} (Value when proposal was made: {1}) dao.param.blocks={0} khối -dao.results.cycle.duration.label=Thời lượng {0} -dao.results.cycle.duration.value={0} (các) khối -dao.results.cycle.value.postFix.isDefaultValue=(giá trị mặc định) -dao.results.cycle.value.postFix.hasChanged=(đã được thay đổi qua bỏ phiếu) - dao.results.invalidVotes=We had invalid votes in that voting cycle. That can happen if a vote was not distributed well in the Bisq network.\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=Salt dao.bond.reputation.hash=Hash dao.bond.reputation.lockupButton=Khóa dao.bond.reputation.lockup.headline=Xác nhận giao dịch khóa -dao.bond.reputation.lockup.details=Khối lượng khóa: {0}\nThời gian mở khóa: {1} khối (≈{2})\n\nPhí đào: {3} ({4} Satoshis/byte)\nKích thước giao dịch: {5} Kb\n\nBạn có chắc là muốn tiếp tục? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=Xác nhận giao dịch mở khóa -dao.bond.reputation.unlock.details=Khối lượng mở khóa: {0}\nThời gian mở khóa: {1} khối (≈{2})\n\nPhí đào: {3} ({4} Satoshis/byte)\nKích thước giao dịch: {5} Kb\n\nBạn có chắc là muốn tiếp tục? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=Tất cả cách tài sản đảm bảo @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=Ký dao.proofOfBurn.message=Tin nhắn dao.proofOfBurn.sig=Chữ ký dao.proofOfBurn.verify=Xác minh -dao.proofOfBurn.verify.header=Xác minh một thông điệp với khóa lấy từ bằng chứng giao dịch đốt dao.proofOfBurn.verificationResult.ok=Xác minh thành công dao.proofOfBurn.verificationResult.failed=Xác minh thất bại @@ -1742,19 +1738,18 @@ dao.proposal.display.name=Exact GitHub username dao.proposal.display.link=Link to detailed info dao.proposal.display.link.prompt=Link to proposal dao.proposal.display.requestedBsq=Số lượng yêu cầu tính theo BSQ -dao.proposal.display.bsqAddress=Địa chỉ BSQ dao.proposal.display.txId=ID giao dịch đề xuất dao.proposal.display.proposalFee=Phí đề xuất dao.proposal.display.myVote=Phiếu bầu của tôi dao.proposal.display.voteResult=Tóm tắt kết quả bỏ phiếu dao.proposal.display.bondedRoleComboBox.label=Loại vi trò được đảm bảo dao.proposal.display.requiredBondForRole.label=Tài sản đảm bảo BSQ yêu cầu cho vai trò -dao.proposal.display.tickerSymbol.label=Biểu tượng tên rút gọn dao.proposal.display.option=Tùy chọn dao.proposal.table.header.proposalType=Kiểu đề xuất dao.proposal.table.header.link=đường dẫn dao.proposal.table.header.myVote=Phiếu bầu của tôi +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=Xoá dao.proposal.table.icon.tooltip.removeProposal=Gỡ bỏ đề xuất của tôi dao.proposal.table.icon.tooltip.changeVote=phiếu bầu hiện tại: ''{0}''. Thay đổi phiếu bầu tới: ''{1}'' @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=Số dư trong ví của tôi dao.wallet.receive.fundYourWallet=Địa chỉ nhận BSQ của bạn dao.wallet.receive.bsqAddress=Đại chỉ ví BSQ (Địa chỉ mới chưa sử dụng) -dao.wallet.receive.dao.headline=DAO Bisq -dao.wallet.receive.daoInfo=Vì BIsq là sàn giao dịch phi tập trung và không bị kiểm duyệt, bởi vậy mô hình vận hành của nó, DAO Bisq và đồng BSQ là công cụ giúp điều này trở thành hiện thực. -dao.wallet.receive.daoInfo.button=Tìm hiểu thêm về DAO Bisq -dao.wallet.receive.daoTestnetInfo=Mainnet DAO Bisq chưa ra mắt nhưng bạn vẫn có thể tìm hiểu về DAO Bisq bằng cách chạy nó trên testnet. -dao.wallet.receive.daoTestnetInfo.button=Cách chạy Bisq DAO trên testnet của chúng tôi -dao.wallet.receive.daoContributorInfo=Nếu như bạn đã tham giao đóng góp cho Bisq, vui lòng sử dụng ví BSQ phía dưới và thực hiện một yêu cầu tham gia vào sự kiện phát hành BSQ genesis. -dao.wallet.receive.daoContributorInfo.button=Cách tham gia vào sự kiện phát hành BSQ genesis - dao.wallet.send.sendFunds=Gửi vốn dao.wallet.send.sendBtcFunds=Gửi các loại tiền không phải BSQ (BTC) dao.wallet.send.amount=Số tiền tính bằng BQS dao.wallet.send.btcAmount=Số tiền tính bằng BTC (các loại tiền không phải BSQ) dao.wallet.send.setAmount=Cài đặt số tiền được rút (số tiền tối thiểu là {0}) -dao.wallet.send.setBtcAmount=Cài đặt số tiền tính bằng BTC được rút (số tiền tối thiểu là {0}) dao.wallet.send.receiverAddress=Địa chỉ BSQ của người nhận dao.wallet.send.receiverBtcAddress=Địa chỉ BTC của người nhận dao.wallet.send.setDestinationAddress=Điền địa chỉ đến của bạn dao.wallet.send.send=Gửi vốn BSQ dao.wallet.send.sendBtc=Gửi vốn BTC dao.wallet.send.sendFunds.headline=Xác nhận yêu cầu rút -dao.wallet.send.sendFunds.details=Đang gửi: {0}\nĐến địa chỉ nhận: {1}.\nphí giao dịch cần thiết: {2} ({3} satoshis/byte)\nQuy mô giao dịch: {4} Kb\n\nNgười nhận sẽ nhận: {5}\n\nBạn có chắc bạn muốn rút số tiền này? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=Khối đã xác minh mới nhất: {0} dao.wallet.chainHeightSyncing=Đang chờ khối mới... Đã xác nhận{0} / {1} khối dao.wallet.tx.type=Loại @@ -1868,16 +1854,16 @@ dao.proposal.create.missingMinerFeeFunds=Bạn không đủ BTC để tạo giao dao.proposal.create.missingIssuanceFunds=Bạn không có đủ BTC để tạo giao dịch đề xuất này. Tất cả các giao dịch BSQ đều yêu cầu phí đào bằng BTC, và các giao dịch phát hành cũng yêu cầu BTC cho lượng BSQ yêu cầu ({0} Satoshis/BSQ).\nCòn thiếu: {1} dao.feeTx.confirm=Xác nhận {0} giao dịch -dao.feeTx.confirm.details={0} phí: {1}\nPhí đào: {2} ({3} Satoshis/byte)\nKích thước giao dịch: {4} Kb\n\nBạn có chắc là muốn công bố giao dịch {5}? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0} phí: {1}\nLượng BTC cần cho phát hành BSQ: {2} ({3} Satoshis/BSQ)\nPhí đào: {4} ({5} Satoshis/byte)\nKhích thước giao dịch: {6} Kb\n\nNếu yêu cầu của bạn được chấp nhận, bạn sẽ nhận được số lượng phí đề xuất 2 BSQ bạn yêu cầu.\n\nBạn có chắc là muốn công bố giao dịch {7}? +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=DAO BISQ -dao.news.bisqDAO.description=Vì BIsq là sàn giao dịch phi tập trung và không bị kiểm duyệt, bởi vậy mô hình vận hành của nó, DAO Bisq và đồng BSQ là công cụ giúp điều này trở thành hiện thực. +dao.news.bisqDAO.description=Vì BIsq là sàn giao dịch phi tập trung và không bị kiểm duyệt, bởi vậy mô hình vận hành của nó, DAO Bisq và đồng BSQ là công cụ giúp điều này trở thành hiện thực. dao.news.bisqDAO.readMoreLink=Tìm hiểu thêm về DAO Bisq dao.news.pastContribution.title=BẠN ĐÃ THAM GIA ĐÓNG GÓP? YÊU CẦU BSQ -dao.news.pastContribution.description=Nếu như bạn đã tham giao đóng góp cho Bisq, vui lòng sử dụng ví BSQ phía dưới và thực hiện một yêu cầu tham gia vào sự kiện phát hành BSQ genesis. +dao.news.pastContribution.description=Nếu như bạn đã tham giao đóng góp cho Bisq, vui lòng sử dụng ví BSQ phía dưới và thực hiện một yêu cầu tham gia vào sự kiện phát hành BSQ genesis. dao.news.pastContribution.yourAddress=Ví BSQ của bạn dao.news.pastContribution.requestNow=Yêu cầu ngay @@ -1888,9 +1874,9 @@ dao.news.DAOOnTestnet.firstSection.content=1. Chuyển qua chế độ Testnet D dao.news.DAOOnTestnet.secondSection.title=2. Kiếm BSQ dao.news.DAOOnTestnet.secondSection.content=Yêu cầu BSQ trên Slack hoặc Mua BSQ trên Bisq dao.news.DAOOnTestnet.thirdSection.title=3. Tham gia một vòng bỏ phiếu -dao.news.DAOOnTestnet.thirdSection.content=Tạo đề xuất và bỏ phiếu cho đề xuất để thanh đổi nhiều khía cạnh của Bisq. +dao.news.DAOOnTestnet.thirdSection.content=Tạo đề xuất và bỏ phiếu cho đề xuất để thanh đổi nhiều khía cạnh của Bisq. dao.news.DAOOnTestnet.fourthSection.title=4. Tìm hiểu về BSQ Block Explorer -dao.news.DAOOnTestnet.fourthSection.content=Vì BSQ chỉa là bitcoin, bạn có thể thấy các giao dịch BSQ trên trình duyện bitcoin Block Explorer của chúng tôi. +dao.news.DAOOnTestnet.fourthSection.content=Vì BSQ chỉa là bitcoin, bạn có thể thấy các giao dịch BSQ trên trình duyện bitcoin Block Explorer của chúng tôi. dao.news.DAOOnTestnet.readMoreLink=Đọc tài liệu đầy đủ dao.monitor.daoState=Trạng thái DAO @@ -1908,7 +1894,7 @@ dao.monitor.table.seedPeers=Seed node: {0} dao.monitor.daoState.headline=Trạng thái DAO dao.monitor.daoState.table.headline=Chuỗi Hash trạng thái DAO -dao.monitor.daoState.table.blockHeight=Chiều cao khối +dao.monitor.daoState.table.blockHeight=Chiều cao khối dao.monitor.daoState.table.hash=Hash của trạng thái DAO dao.monitor.daoState.table.prev=Hash trước đó dao.monitor.daoState.conflictTable.headline=Hash trạng thái DAO từ đối tác đang trong xung dột @@ -1926,7 +1912,7 @@ dao.monitor.proposal.table.hash=Hash trạng thái đề xuất dao.monitor.proposal.table.prev=Hash trước đó dao.monitor.proposal.table.numProposals=Số đề xuất -dao.monitor.isInConflictWithSeedNode=Dữ liệu trên máy bạn không đồng bộ với ít nhất một seed node. Vui lòng đồng bộ lại trạng thái DAO. +dao.monitor.isInConflictWithSeedNode=Dữ liệu trên máy bạn không đồng bộ với ít nhất một seed node. Vui lòng đồng bộ lại trạng thái DAO. dao.monitor.isInConflictWithNonSeedNode=Một trong các đối tác của bạn không đồng bộ với mạng nhưng node của bạn vẫn đang đồng bộ với các seed node. dao.monitor.daoStateInSync=Node trên máy tính của bạn đang dồng bộ với mạng @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=Số lượng phiếu mù dao.factsAndFigures.menuItem.supply=Lượng cung BSQ dao.factsAndFigures.menuItem.transactions=Giao dịch BSQ -dao.factsAndFigures.dashboard.marketPrice=Dữ liệu thị trường -dao.factsAndFigures.dashboard.price=Giá giao dịch BSQ/BTC gần nhất (tính bằng BSQ) dao.factsAndFigures.dashboard.avgPrice90=90 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgPrice30=30 days average BSQ/BTC trade price dao.factsAndFigures.dashboard.avgUSDPrice90=90 days volume weighted average USD/BSQ trade price @@ -2005,9 +1989,9 @@ displayUpdateDownloadWindow.button.downloadLater=Download sau displayUpdateDownloadWindow.button.ignoreDownload=Bỏ qua phiên bản này displayUpdateDownloadWindow.headline=Hiện có một cập nhật Bisq mới! displayUpdateDownloadWindow.download.failed.headline=Download không thành công -displayUpdateDownloadWindow.download.failed=Download không thành công\nVui lòng download và xác minh chữ ký thủ công tại https://bisq.network/downloads -displayUpdateDownloadWindow.installer.failed=Không thể xác định đúng chương trình cài đặt. Vui lòng download và xác minh thủ công tại https://bisq.network/downloads -displayUpdateDownloadWindow.verify.failed=Xác minh không thành công.\nVui lòng download và xác minh thủ công tại https://bisq.network/downloads +displayUpdateDownloadWindow.download.failed=Download failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at [HYPERLINK:https://bisq.network/downloads] +displayUpdateDownloadWindow.verify.failed=Verification failed.\nPlease download and verify manually at [HYPERLINK:https://bisq.network/downloads] displayUpdateDownloadWindow.success=Phiên bản mới đã được download thành công và chữ ký đã được xác minh.\n\nVui lòng mở thư mục download, tắt ứng dụng và cài đặt phiên bản mới. displayUpdateDownloadWindow.download.openDir=Mở thư mục download @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=Khoản tiền giao dịch hoàn lại disputeSummaryWindow.payout.getsTradeAmount=BTC {0} nhận được khoản tiền giao dịch hoàn lại disputeSummaryWindow.payout.getsAll=BTC {0} nhận tất cả disputeSummaryWindow.payout.custom=Thuế hoàn lại -disputeSummaryWindow.payout.adjustAmount=Số tiền nhập vượt quá số tiền hiện có {0}.\nChúng tôi điều chỉnh trường nhập này đến giá trị có thể lớn nhất. disputeSummaryWindow.payoutAmount.buyer=Khoản tiền hoàn lại của người mua disputeSummaryWindow.payoutAmount.seller=Khoản tiền hoàn lại của người bán disputeSummaryWindow.payoutAmount.invert=Sử dụng người thua như người công bố @@ -2055,6 +2038,7 @@ disputeSummaryWindow.addSummaryNotes=Thêm lưu ý tóm tắt disputeSummaryWindow.close.button=Đóng đơn # Do no change any line break or order of tokens as the structure is used for signature verification +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification @@ -2064,9 +2048,11 @@ disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and a disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions disputeSummaryWindow.close.closePeer=Bạn cũng cần phải đóng Đơn Đối tác giao dịch! disputeSummaryWindow.close.txDetails.headline=Publish refund transaction +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=Buyer receives {0} on address: {1}\n +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=Seller receives {0} on address: {1}\n -disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/byte)\nTransaction size: {5} Kb\n\nAre you sure you want to publish this transaction? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? disputeSummaryWindow.close.noPayout.headline=Close without any payout disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? @@ -2101,6 +2087,7 @@ filterWindow.btcNode=nút Bitcoin đã lọc (địa chỉ cách nhau bằng d filterWindow.preventPublicBtcNetwork=Ngăn sử dụng mạng Bitcoin công cộng filterWindow.disableDao=Tắt DAO filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Phiên bản tối thiểu yêu cầu cho DAO filterWindow.disableTradeBelowVersion=Phiên bản tối thiể yêu cầu cho giao dịch filterWindow.add=Thêm bộ lọc @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=Chọn giao dịch tiền gửi để khiếu n selectDepositTxWindow.msg=Giao dịch tiền gửi không được lưu trong danh mục giao dịch.\nVui lòng chọn một trong các giao dịch multisig hiện có từ ví của bạn là giao dịch tiền gửi sử dụng trong danh mục giao dịch không thành công.\n\nBạn có thể tìm đúng giao dịch bằng cách mở cửa sổ thông tin giao dịch (nhấp vào ID giao dịch trong danh sách) và tuân thủ yêu cầu thanh toán phí giao dịch cho giao dịch tiếp theo khi bạn thấy giao dịch tiền gửi multisig (địa chỉ bắt đầu bằng số 3). ID giao dịch sẽ thấy trong danh sách tại đây. Khi bạn thấy đúng giao dịch, chọn giao dịch đó và tiếp tục.\n\nXin lỗi vì sự bất tiện này nhưng thỉnh thoảng sẽ có lỗi xảy ra và trong tương lai chúng tôi sẽ tìm cách tốt hơn để xử lý vấn đề này. selectDepositTxWindow.select=Chọn giao dịch tiền gửi -selectBaseCurrencyWindow.headline=Chọn thị trường -selectBaseCurrencyWindow.msg=Thị trường mặc định được chọn là {0}.\n\nNếu bạn muốn chuyển sang tiền tệ cơ sở khác vui lòng chọn một trong hộp thả xuống.\nBạn cũng có thể thay đổi tiền tệ cơ sở sau tại màn hình \"Cài đặt/Mạng\". -selectBaseCurrencyWindow.select=Chọn tiền tệ cơ sở - sendAlertMessageWindow.headline=Gửi thông báo toàn cầu sendAlertMessageWindow.alertMsg=Tin nhắn cảnh báo sendAlertMessageWindow.enterMsg=Nhận tin nhắn @@ -2232,9 +2215,8 @@ error.closedTradeWithNoDepositTx=The deposit transaction of the closed trade wit popup.warning.walletNotInitialized=Ví chưa được kích hoạt popup.warning.osxKeyLoggerWarning=Due to stricter security measures in macOS 10.14 and above, launching a Java application (Bisq uses Java) causes a popup warning in macOS ('Bisq would like to receive keystrokes from any application').\n\nTo avoid that issue please open your 'macOS Settings' and go to 'Security & Privacy' -> 'Privacy' -> 'Input Monitoring' and Remove 'Bisq' from the list on the right side.\n\nBisq will upgrade to a newer Java version to avoid that issue as soon the technical limitations (Java packager for the required Java version is not shipped yet) are resolved. popup.warning.wrongVersion=Có thể máy tính của bạn có phiên bản Bisq không đúng.\nCấu trúc máy tính của bạn là: {0}.\nHệ nhị phân Bisq bạn cài đặt là: {1}.\nVui lòng tắt máy và cài đặt lại phiên bản đúng ({2}). -popup.warning.incompatibleDB=Chúng tôi phát hiện ra file dữ liệu không tương thích!\n\nCác file dữ liệu này không tương thích với mã hiện tại:\n{0}\n\nChúng tôi đã sao lưu dự phòng các file bị hỏng và sử dụng giá trị mặc định cho phiên bản dữ liệu mới.\n\nSao lưu dự phòng tại:\n{1}/db/backup_of_corrupted_data.\n\nVui lòng kiểm tra xem bạn đã cài đặt phiên bản mới nhất của Bisq chưa.\nBạn có thể tải về tại:\nhttps://bisq.network/downloads\n\nVui lòng khởi động lại ứng dụng. +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 new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at: [HYPERLINK:https://bisq.network/downloads].\n\nPlease restart the application. popup.warning.startupFailed.twoInstances=Bisq đã chạy. Bạn không thể chạy hai chương trình Bisq. -popup.warning.cryptoTestFailed=Có vẻ bạn sử dụng hệ nhị phân tự soạn và không tuân thủ hướng dẫn thiết kế tại https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nNếu không phải và bạn sử dụng hệ nhị phân Bisq chính thức, vui lòng lập báo cáo sự cố và gửi về trang GitHub.\nLỗi={0} popup.warning.tradePeriod.halfReached=giao dịch của bạn với ID {0} đã qua một nửa thời gian giao dịch cho phép tối đa và vẫn chưa hoàn thành.\n\nThời gian giao dịch kết thúc vào {1}\n\nVui lòng kiểm tra trạng thái giao dịch của bạn tại \"Portfolio/Các giao dịch mở\" để biết thêm thông tin. 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 mediator. popup.warning.noTradingAccountSetup.headline=Bạn chưa thiết lập tài khoản giao dịch @@ -2258,13 +2240,15 @@ popup.warning.noBsqFundsForBtcFeePayment=Ví BSQ của bạn không đủ tiền popup.warning.messageTooLong=Tin nhắn của bạn vượt quá kích cỡ tối đa cho phép. Vui lòng gửi thành nhiều lần hoặc tải lên mạng như https://pastebin.com. popup.warning.lockedUpFunds=You have locked up funds from a failed trade.\nLocked up balance: {0} \nDeposit tx address: {1}\nTrade ID: {2}.\n\nPlease open a support ticket by selecting the trade in the open trades screen and pressing \"alt + o\" or \"option + o\"." +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=One of the {0} nodes got banned. +# suppress inspection "UnusedProperty" popup.warning.priceRelay=rơle giá popup.warning.seed=seed popup.warning.mandatoryUpdate.trading=Please update to the latest Bisq version. A mandatory update was released which disables trading for old versions. Please check out the Bisq Forum for more information. popup.warning.mandatoryUpdate.dao=Please update to the latest Bisq version. A mandatory update was released which disables the Bisq DAO and BSQ for old versions. Please check out the Bisq Forum for more information. popup.warning.disable.dao=The Bisq DAO and BSQ are temporary disabled. Please check out the Bisq Forum for more information. -popup.warning.burnBTC=Không thể thực hiện giao dịch, vì phí đào {0} vượt quá số lượng {1} cần chuyển. Vui lòng chờ tới khi phí đào thấp xuống hoặc khi bạn tích lũy đủ BTC để chuyển. +popup.warning.burnBTC=Không thể thực hiện giao dịch, vì phí đào {0} vượt quá số lượng {1} cần chuyển. Vui lòng chờ tới khi phí đào thấp xuống hoặc khi bạn tích lũy đủ BTC để chuyển. popup.warning.openOffer.makerFeeTxRejected=The maker fee transaction for offer with ID {0} was rejected by the Bitcoin network.\nTransaction ID={1}.\nThe offer has been removed to avoid further problems.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Bisq support channel at the Bisq Keybase team. @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=The {0} transaction for trade with ID {1} was rej popup.warning.openOfferWithInvalidMakerFeeTx=The maker fee transaction for offer with ID {0} is invalid.\nTransaction ID={1}.\nPlease go to \"Settings/Network info\" and do a SPV resync.\nFor further help please contact the Bisq support channel at the Bisq Keybase team. -popup.warning.trade.depositTxNull=The trade with ID ''{0}'' has no deposit transaction set.\n\nPlease restart the application to see if the problem still exists.\n\nIf it does, please open the trade details popup by clicking on the trade ID. Then click on the transaction IDs for the maker fee transaction and the taker fee transaction to view them on a block explorer. A transaction that cannot be found in a block explorer is probably an invalid transaction.\n\nIf this happens, please report it in the #support channel on the Bisq Keybase (https://keybase.io/team/bisq). If your trade fee transaction is invalid, no funds have left your wallet, you can move the trade to failed trades,and do an SPV resync for your funds to reappear (see how below).\n\nIf your trade fee transaction is valid, the fee amount is lost, and you can make a request for reimbursement on the support repository on GitHub (https://github.com/bisq-network/support/issues).\n\nIn both cases, please do an SPV resync from the ''Settings/Network'' screen to clean your wallet of any lingering issues! - -popup.warning.trade.depositTxNull.moveToFailedTrades=Move to failed trades -popup.warning.trade.depositTxNull.shutDown=Shut down Bisq - popup.info.securityDepositInfo=Để đảm bảo cả hai người giao dịch đều tuân thủ giao thức giao dịch, cả hai cần phải trả một khoản tiền cọc. \n\nSố tiền cọc này được giữ ở ví giao dịch cho đến khi giao dịch của bạn được hoàn thành, sau đó nó sẽ được trả lại cho bạn. \nXin lưu ý: Nếu bạn tạo một chào giá mới, ứng dụng Bisq cần phải chạy để người giao dịch khác có thể nhận chào giá đó. Để giữ cho chào giá của bạn online, để Bisq chạy và đảm bảo là máy tính của bạn cũng online (nghĩa là đảm bảo là máy tính của bạn không chuyển qua chế độ standby, nếu màn hình chuyển qua chế độ standby thì không sao). popup.info.cashDepositInfo=Chắc chắn rằng khu vực của bạn có chi nhánh ngân hàng có thể gửi tiền mặt.\nID (BIC/SWIFT) ngân hàng của bên bán là: {0}. popup.info.cashDepositInfo.confirm=Tôi xác nhận tôi đã gửi tiền popup.info.shutDownWithOpenOffers=Bisq đang đóng, nhưng vẫn có các chào giá đang mở. \n\nNhững chào giá này sẽ không có tại mạng P2P khi Bisq đang đóng, nhưng chúng sẽ được công bố lại trên mạng P2P vào lần tiếp theo bạn khởi động Bisq.\nĐể giữ các chào giá luôn trực tuyến, vui lòng để Bisq chạy và đảm bảo là máy tính của bạn cũng đang trực tuyến(có nghĩa là đảm bảo là máy tính của bạn không chuyển về chế độ chờ...nếu màn hình về chế độ chờ thì không sao). -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=Thông báo riêng tư quan trọng! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=Cần chú ý khi giao dịch có ID {0} popup.info.multiplePaymentAccounts.headline=Có sẵn nhiều tài khoản thanh toán popup.info.multiplePaymentAccounts.msg=Bạn có sẵn nhiều tài khoản thanh toán cho chào giá này. Vui lòng đảm bảo là bạn chọn đúng tài khoản. -popup.news.launch.headline=Two Major Updates -popup.news.launch.accountSigning.headline=ACCOUNT SIGNING -popup.news.launch.accountSigning.description=Lift 0.01 BTC fiat trading limits by buying BTC from a signed peer. -popup.news.launch.ntp.headline=NEW TRADE PROTOCOL -popup.news.launch.ntp.description=New 2-level dispute resolution system makes Bisq more secure, scalable, and censorship-resistant. - popup.accountSigning.selectAccounts.headline=Select payment accounts popup.accountSigning.selectAccounts.description=Based on the payment method and point of time all payment accounts that are connected to a dispute where a payout to the buyer occurred will be selected for you to sign. popup.accountSigning.selectAccounts.signAll=Sign all payment methods @@ -2324,7 +2297,7 @@ popup.accountSigning.signAccounts.ECKey.error=Bad arbitrator ECKey popup.accountSigning.success.headline=Congratulations popup.accountSigning.success.description=All {0} payment accounts were successfully signed! -popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit https://docs.bisq.network/payment-methods#account-signing. +popup.accountSigning.generalInformation=You'll find the signing state of all your accounts in the account section.\n\nFor further information, please visit [HYPERLINK:https://docs.bisq.network/payment-methods#account-signing]. popup.accountSigning.signedByArbitrator=One of your payment accounts has been verified and signed by an arbitrator. Trading with this account will automatically sign your trading peer''s account after a successful trade.\n\n{0} popup.accountSigning.signedByPeer=One of your payment accounts has been verified and signed by a trading peer. Your initial trading limit will be lifted and you''ll be able to sign other accounts in {0} days from now.\n\n{1} popup.accountSigning.peerLimitLifted=The initial limit for one of your accounts has been lifted.\n\n{0} @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=Failed to sign witness, {0} popup.accountSigning.unsignedPubKeys.headline=Unsigned Pubkeys popup.accountSigning.unsignedPubKeys.sign=Sign Pubkeys popup.accountSigning.unsignedPubKeys.signed=Pubkeys were signed -popup.accountSigning.unsignedPubKeys.result.headline=Signing completed popup.accountSigning.unsignedPubKeys.result.signed=Signed pubkeys popup.accountSigning.unsignedPubKeys.result.failed=Failed to sign @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq: A decentralized bitcoin exchange network # GUI Util #################################################################### -guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/byte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=tài khoản giao dịch được lưu vào đường dẫn:\n{0} guiUtil.accountExport.noAccountSetup=Bạn không có tài khoản giao dịch được thiết lập để truy xuất. @@ -2463,6 +2435,7 @@ navigation.portfolio.pending=\"Portfolio/Các giao dịch mở\" navigation.portfolio.closedTrades=\"Portfolio/Lịch sử\" navigation.funds.depositFunds=\"Vốn/Nhận vốn\" navigation.settings.preferences=\"Cài đặt/Tham khảo\" +# suppress inspection "UnusedProperty" navigation.funds.transactions=\"Vốn/Giao dịch\" navigation.support=\"Hỗ trợ\" navigation.dao.wallet.receive=\"DAO/Ví BSQ/Nhận\" @@ -2525,11 +2498,11 @@ password.deriveKey=Lấy khóa từ mật khẩu password.walletDecrypted=Ví đã giải mã thành công và bảo vệ bằng mật khẩu bị gỡ bỏ. password.wrongPw=Bạn nhập sai mật khẩu.\n\nVui lòng nhập lại mật khẩu, kiểm tra lỗi do gõ phí hoặc lỗi chính tả cẩn thận. password.walletEncrypted=Ví đã được mã hóa thành công và bảo vệ bằng mật khẩu được kích hoạt. -password.walletEncryptionFailed=Mật khẩu ví không thể cài đặt. Có thể bạn đã nhập từ khởi tạo không khớp với cơ sở dữ liệu cảu ví. Vui lòng liên hệ lập trình viên tại diễn đàn Bisq. +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=2 mật khẩu bạn nhập không khớp. password.forgotPassword=Quên mật khẩu? -password.backupReminder=Lưu ý rằng khi cài đặt mật khẩu ví, tất cả dữ liệu sao lưu dự phòng tự đồng tạo từ ví mã hóa sẽ bị xóa.\n\nKhuyến cáo nên sao lưu dự phòng thư mục của ứng dụng và viết từ khởi tạo ra giấy trước khi cài đặt mật khẩu! -password.backupWasDone=Tôi đã sao lưu dự phòng +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=Seed words ví seed.enterSeedWords=Nhập seed words ví @@ -2537,7 +2510,7 @@ seed.date=Ngày ví seed.restore.title=Khôi phục vú từ Seed words seed.restore=Khôi phục ví seed.creationDate=Ngày tạo -seed.warn.walletNotEmpty.msg=Ví Bitcoin của bạn không trống.\n\nBạn phải làm trống ví trước khi khôi phục ví cũ, vì nhiều ví lẫn với nhau có thể dẫn tới sao lưu dự phòng vô hiệu.\n\nHãy hoàn thành giao dịch của bạn, đóng tất cả Báo giá mở và truy cập mục Vốn để rút bitcoin của bạn.\nNếu bạn không thể truy cập bitcoin của bạn, bạn có thể sử dụng công cụ khẩn cấp để làm trống ví.\nĐể mở công cụ khẩn cấp, ấn \"alt + e\" hoặc \"option + e\" . +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=Tôi muốn khôi phục seed.warn.walletNotEmpty.emptyWallet=Tôi sẽ làm trống ví trước seed.warn.notEncryptedAnymore=Ví của bạn đã được mã hóa.\n\nSau khi khôi phục, ví sẽ không còn được mã hóa và bạn phải cài đặt mật khẩu mới.\n\nBạn có muốn tiếp tục? @@ -2578,12 +2551,11 @@ payment.altcoin.address=Địa chỉ Altcoin payment.altcoin.tradeInstantCheckbox=Giao dịch ngay với Altcoin này (trong 1 giờ) payment.altcoin.tradeInstant.popup=Để giao dịch ngay, cả hai đối tác giao dịch phải cùng trực tuyến để hoàn thành giao dịch trong vòng ít hơn 1 giờ. \n\nNếu bạn có chào giá đang mở mà bạn không trực tuyến, vui lòng tắt chúng ở phần 'Danh mục'. payment.altcoin=Altcoin -payment.select.altcoin=Chọn hoặc tìm altcoin +payment.select.altcoin=Select or search Altcoin payment.secret=Câu hỏi bí mật payment.answer=Trả lời payment.wallet=ID ví payment.uphold.accountId=Tên người dùng hoặc email hoặc số điện thoại -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=Email hoặc số điện thoại payment.venmo.venmoUserName=Tên người dùng Venmo payment.popmoney.accountId=Email hoặc số điện thoại @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=ID công dân/ ID thuế hoặc số điện tho payment.supportedCurrencies=Tiền tệ hỗ trợ payment.limitations=Hạn chế payment.salt=Salt để xác minh tuổi tài khoản -payment.error.noHexSalt=Salt cần phải có định dạng HEX.\nKhuyến cáo chỉ chỉnh sửa trường salt nếu bạn muốn chuyển salt từ tài khoản cũ để giữ nguyên tuổi tài khoản. Tuổi tài khoản được xác minh bằng cách sử dụng salt tài khoản và dữ liệu nhận dạng tài khoản (VD: IBAN). +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=Chấp nhận giao dịch từ các nước Châu Âu này payment.accept.nonEuro=Chấp nhận giao dịch từ các nước không thuộc Châu Âu này payment.accepted.countries=Các nước được chấp nhận @@ -2625,31 +2597,33 @@ payment.accountType=Loại tài khoản payment.checking=Đang kiểm tra payment.savings=Tiết kiệm payment.personalId=ID cá nhân -payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle:\nhttps://www.zellepay.com/get-started\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. +payment.clearXchange.info=Zelle is a money transfer service that works best *through* another bank.\n\n1. Check this page to see if (and how) your bank works with Zelle: [HYPERLINK:https://www.zellepay.com/get-started]\n\n2. Take special note of your transfer limits—sending limits vary by bank, and banks often specify separate daily, weekly, and monthly limits.\n\n3. If your bank does not work with Zelle, you can still use it through the Zelle mobile app, but your transfer limits will be much lower.\n\n4. The name specified on your Bisq account MUST match the name on your Zelle/bank account. \n\nIf you cannot complete a Zelle transaction as specified in your trade contract, you may lose some (or all) of your security deposit.\n\nBecause of Zelle''s somewhat higher chargeback risk, sellers are advised to contact unsigned buyers through email or SMS to verify that the buyer really owns the Zelle account specified in Bisq. payment.fasterPayments.newRequirements.info=Some banks have started verifying the receiver''s full name for Faster Payments transfers. Your current Faster Payments account does not specify a full name.\n\nPlease consider recreating your Faster Payments account in Bisq to provide future {0} buyers with a full name.\n\nWhen you recreate the account, make sure to copy the precise sort code, account number and account age verification salt values from your old account to your new account. This will ensure your existing account''s age and signing status are preserved. -payment.moneyGram.info=Khi dùng MoneyGram người mua BTC phải gửi số xác nhận và ảnh chụp hoá đơn đến emailnguoiwf bán. Hoá đơn phải chỉ rõ tên đầy đủ, quốc gia, tiểu bang và số lượng. Người mua sẽ trình email của người bán ra trong quá trình giao dịch -payment.westernUnion.info=Khi sử dụng Western Union, người mua BTC phải gửi MTCN (số theo dõi) và ảnh giấy biên nhận bằng email cho người bán BTC. Giấy biên nhận phải nêu rõ họ tên, thành phố, quốc gia của người bán và số tiền. Người mua sẽ được hiển thị email người bán trong quá trình giao dịch. +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=Khi sử dụng HalCash người mua BTC cần phải gửi cho người bán BTC mã HalCash bằng tin nhắn điện thoại.\n\nVui lòng đảm bảo là lượng tiền này không vượt quá số lượng tối đa mà ngân hàng của bạn cho phép gửi khi dùng HalCash. Số lượng rút tối thiểu là 10 EUR và tối đa là 600 EUR. Nếu rút nhiều lần thì giới hạn sẽ là 3000 EUR/ người nhận/ ngày và 6000 EUR/người nhận/tháng. Vui lòng kiểm tra chéo những giới hạn này với ngân hàng của bạn để chắc chắn là họ cũng dùng những giới hạn như ghi ở đây.\n\nSố tiền rút phải là bội số của 10 EUR vì bạn không thể rút các mệnh giá khác từ ATM. Giao diện người dùng ở phần 'tạo chào giá' và 'chấp nhận chào giá' sẽ điều chỉnh lượng btc sao cho lượng EUR tương ứng sẽ chính xác. Bạn không thể dùng giá thị trường vì lượng EUR có thể sẽ thay đổi khi giá thay đổi.\n\nTrường hợp tranh chấp, người mua BTC cần phải cung cấp bằng chứng chứng minh mình đã gửi EUR. -payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\nTo mitigate this risk, Bisq sets per-trade limits based on two factors:\n\n1. The estimated level of chargeback risk for the payment method used\n2. The age of your account for that payment method\n\nThe account you are creating now is new and its age is zero. As your account ages, your per-trade limits will grow:\n\n● During the 1st month, your per-trade limit will be {0}\n● During the 2nd month, your per-trade limit will be {1}\n● After the 2nd month, your per-trade limit will be {2}\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. -payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing, and increase with account age.\n\nSee more:\nhttps://bisq.wiki/Account_limits\n\nPlease note: limits only apply to trade size. You can place as many trades as you like. +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=Vui lòng xác nhận rằng ngân hàng của bạn cho phép nạp tiền mặt vào tài khoản của người khác. Chẳng hạn, Ngân Hàng Mỹ và Wells Fargo không còn cho phép nạp tiền như vậy nữa. payment.revolut.info=Revolut requires the 'User name' as account ID not the phone number or email as it was the case in the past. -payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not has set the ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=Update Revolut account payment.usPostalMoneyOrder.info=Trading using US Postal Money Orders (USPMO) on Bisq requires that you understand the following:\n\n- BTC buyers must write the BTC Seller’s name in both the Payer and the Payee’s fields & take a high-resolution photo of the USPMO and envelope with proof of tracking before sending.\n- BTC buyers must send the USPMO to the BTC seller with Delivery Confirmation.\n\nIn the event mediation is necessary, or if there is a trade dispute, you will be required to send the photos to the Bisq mediator or refund agent, together with the USPMO Serial Number, Post Office Number, and dollar amount, so they can verify the details on the US Post Office website.\n\nFailure to provide the required information to the Mediator or Arbitrator will result in losing the dispute case.\n\nIn all dispute cases, the USPMO sender bears 100% of the burden of responsibility in providing evidence/proof to the Mediator or Arbitrator.\n\nIf you do not understand these requirements, do not trade using USPMO on Bisq. payment.f2f.contact=thông tin liên hệ -payment.f2f.contact.prompt=Bạn muốn liên hệ với đối tác giao dịch qua đâu? (email, địa chỉ, số điện thoại,....) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=Thành phố để gặp mặt trực tiếp payment.f2f.city.prompt=Thành phố sẽ được hiển thị cùng báo giá payment.f2f.optionalExtra=Thông tin thêm tuỳ chọn. payment.f2f.extra=thông tin thêm payment.f2f.extra.prompt=Người tạo có thể đặt ‘ các điều khoản’ hoặc thêm thông tin liên hệ mở, để hiểnnthij trong báo giá -payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot help much as it is usually hard to get tamper proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: 'https://docs.bisq.network/trading-rules.html#f2f-trading' +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=Mở trang web payment.f2f.offerbook.tooltip.countryAndCity=Country and city: {0} / {1} payment.f2f.offerbook.tooltip.extra=Thông tin thêm: {0} @@ -2658,6 +2632,10 @@ payment.japan.bank=Ngân hàng payment.japan.branch=Branch payment.japan.account=Tài khoản payment.japan.recipient=Tên +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=Western Union F2F=Giao dịch trực tiếp (gặp mặt) JAPAN_BANK=Japan Bank Furikomi +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=Ngân hàng trong nước @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=Western Union F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoin ngay tức thì # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoin ngay tức thì # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=Không cho phép nhập giá trị 0. validation.negative=Không cho phép nhập giá trị âm. validation.fiat.toSmall=Không cho phép giá trị nhập nhỏ hơn giá trị có thể nhỏ nhất. validation.fiat.toLarge=Không cho phép giá trị nhập lớn hơn giá trị có thể lớn nhất. -validation.btc.fraction=Giá trị nhập dẫn tới giá trị bitcoin có phân số đơn vị nhỏ nhất (satoshi). +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=Không cho phép giá trị nhập lớn hơn {0}. validation.btc.toSmall=Không cho phép giá trị nhập nhỏ hơn {0}. -validation.securityDeposit.toSmall=Không cho phép giá trị nhập nhỏ hơn {0}. -validation.passwordTooShort=Mật khẩu bạn vừa nhập quá ngắn. Tối thiểu phải có 8 ký tự. +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=Mật khẩu bạn vừa nhập quá dài. Không được quá 50 ký tự. validation.sortCodeNumber={0} phải có {1} số. validation.sortCodeChars={0} phải có {1} ký tự. @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} phải có {1} số. #new validation.invalidInput=Giá trị nhập không hợp lệ: {0} validation.accountNrFormat=Số tài khoản phải có định dạng : {0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=Xác nhận địa chỉ không thành công vì không khớp với cấu trúc của {0} địa chỉ. -validation.altcoin.ltz.zAddressesNotSupported=Địa chỉ LTZ phải bắt đầu bằng L. Địa chỉ bắng đầu bằng z không được hỗ trợ. -validation.altcoin.zAddressesNotSupported=Địa chỉ ZEC phải bắt đầu bằng t. Địa chỉ bắng đầu bằng z không được hỗ trợ. +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=Địa chỉ không phải là địa chỉ {0} hợp lệ! {1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=Native segwit addresses (those starting with 'lq') are not supported. -validation.bic.invalidLength=Độ dài giá trị nhập không được là 8 hoặc 11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=Mã NH và quốc gia phải là chữ validation.bic.invalidLocationCode=BIC chứa mã vị trí không hợp lệ validation.bic.invalidBranchCode=BIC chứa mã chi nhánh không hợp lệ validation.bic.sepaRevolutBic=Tài khoản Revolut Sepa không được hỗ trợ. -validation.btc.invalidFormat=Định dạng địa chỉ Bitcoin không hợp lệ. -validation.bsq.invalidFormat=Định dạng địa chỉ BSQ không hợp lệ. +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=Địa chỉ không hợp lệ validation.iban.invalidCountryCode=Mã quốc gia không hợp lệ validation.iban.checkSumNotNumeric=Mã kiểm tra phải là số validation.iban.nonNumericChars=Phát hiện ký tự không phải kiểu chữ-số validation.iban.checkSumInvalid=Mã kiểm tra IBAN không hợp lệ -validation.iban.invalidLength=Số phải dài từ 15 đến 34 ký tự. +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=Mã vùng không phải Canada -validation.interacETransfer.invalidPhone=Định dạng số điện thoại không hợp lệ và không phải là địa chỉ email +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=Chỉ được chứa chữ cái, số, khoảng trắng, và/hoặc các ký tự ' _ , . ? - validation.interacETransfer.invalidAnswer=Phải được viết liền và chỉ bao gồm chữ cái, số, và/hoặc ký tự - validation.inputTooLarge=Giá trị nhập không được lớn hơn {0} validation.inputTooSmall=Giá trị nhập phải lớn hơn {0} validation.inputToBeAtLeast=Giá trị nhập tối thiểu phải bằng {0} -validation.amountBelowDust=The amount below the dust limit of {0} satoshi is not allowed. +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=Chiều dài phải nằm trong khoảng từ {0} đến {1} validation.pattern=Giá trị nhập phải có định dạng: {0} validation.noHexString=Giá trị nhập không ở định dạng HEX @@ -2859,7 +2852,7 @@ validation.numberFormatException=Ngoại lệ cho định dạng số {0} validation.mustNotBeNegative=Giá trị nhập không được là số âm validation.phone.missingCountryCode=Need two letter country code to validate phone number validation.phone.invalidCharacters=Phone number {0} contains invalid characters -validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone number -validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number -validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. The correct dialing code is {2}. +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=Must be comma separated list of valid addresses diff --git a/core/src/main/resources/i18n/displayStrings_zh-hans.properties b/core/src/main/resources/i18n/displayStrings_zh-hans.properties index 52dd35787e..59aca890d8 100644 --- a/core/src/main/resources/i18n/displayStrings_zh-hans.properties +++ b/core/src/main/resources/i18n/displayStrings_zh-hans.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=报价 shared.multipleOffers=报价 shared.Offer=报价 +shared.offerVolumeCode={0} 报价量 shared.openOffers=可用报价 shared.trade=交易 shared.trades=交易 @@ -122,7 +123,8 @@ shared.noDateAvailable=没有可用数据 shared.noDetailsAvailable=没有可用详细 shared.notUsedYet=尚未使用 shared.date=日期 -shared.sendFundsDetailsWithFee=发送:{0}\n来自:{1}\n接收地址:{2}\n要求的最低交易费:{3}({4} 聪/byte)\n交易大小:{5} Kb\n\n收款方将收到:{6}\n\n您确定您想要提现吗? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq 检测到,该交易将产生一个低于最低零头阈值的输出(不被比特币共识规则所允许)。相反,这些零头({0}satoshi{1})将被添加到挖矿手续费中。 shared.copyToClipboard=复制到剪贴板 shared.language=语言 @@ -188,7 +190,6 @@ shared.tradeWalletAddress=交易钱包地址 shared.tradeWalletBalance=交易钱包余额 shared.makerTxFee=卖家:{0} shared.takerTxFee=买家:{0} -shared.securityDepositBox.description=BTC 保证金 {0} shared.iConfirm=我确认 shared.tradingFeeInBsqInfo=相当于使用 {0} 交易手续费 shared.openURL=打开 {0} @@ -214,8 +215,8 @@ shared.mediator=调解员 shared.arbitrator=仲裁员 shared.refundAgent=仲裁员 shared.refundAgentForSupportStaff=退款助理 -shared.delayedPayoutTxId=Delayed payout transaction ID -shared.delayedPayoutTxReceiverAddress=Delayed payout transaction sent to +shared.delayedPayoutTxId=延迟支付交易 ID +shared.delayedPayoutTxReceiverAddress=延迟交易交易已发送至 shared.unconfirmedTransactionsLimitReached=你现在有过多的未确认交易。请稍后尝试 @@ -237,8 +238,6 @@ mainView.menu.settings=设置 mainView.menu.account=账户 mainView.menu.dao=DAO -mainView.marketPrice.provider=价格提供者 -mainView.marketPrice.label=交易所价格 mainView.marketPriceWithProvider.label=交易所价格提供商:{0} mainView.marketPrice.bisqInternalPrice=最新 Bisq 交易的价格 mainView.marketPrice.tooltip.bisqInternalPrice=外部交易所供应商没有可用的市场价格。\n显示的价格是该货币的最新 Bisq 交易价格。 @@ -251,14 +250,15 @@ mainView.balance.locked.short=冻结 mainView.footer.usingTor=(使用 Tor 中) mainView.footer.localhostBitcoinNode=(本地主机) -mainView.footer.btcInfo=比特币网络节点:{0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ 当前矿工手续费费率:{0} sat/vB mainView.footer.btcInfo.initializing=连接至比特币网络 mainView.footer.bsqInfo.synchronizing=正在同步 DAO mainView.footer.btcInfo.synchronizingWith=正在同步至 mainView.footer.btcInfo.synchronizedWith=已同步至 mainView.footer.btcInfo.connectingTo=连接至 mainView.footer.btcInfo.connectionFailed=连接失败: -mainView.footer.p2pInfo=Bisq 网络对等点:{0} +mainView.footer.p2pInfo=比特币网络节点:{0} / Bisq 网络节点:{1} mainView.footer.daoFullNode=DAO 全节点 mainView.bootstrapState.connectionToTorNetwork=(1/4) 连接至 Tor 网络... @@ -292,7 +292,6 @@ market.tabs.spread=详情 market.tabs.trades=行情图 # OfferBookChartView -market.offerBook.chart.title={0} 的报价列表 market.offerBook.buyAltcoin=我想要买入 {0}(卖出 {1}) market.offerBook.sellAltcoin=我想要卖出 {0}(买入 {1}) market.offerBook.buyWithFiat=购买 {0} @@ -337,7 +336,7 @@ offerbook.offerersAcceptedBankSeats=接受的银行所在国家(买家):\n offerbook.availableOffers=可用报价 offerbook.filterByCurrency=以货币筛选 offerbook.filterByPaymentMethod=以支付方式筛选 -offerbook.timeSinceSigning=Signed since +offerbook.timeSinceSigning=已验证,从 offerbook.timeSinceSigning.info=此账户已验证,{0} offerbook.timeSinceSigning.info.arbitrator=由仲裁员验证,并可以验证伙伴账户 offerbook.timeSinceSigning.info.peer=由对方验证,等待限制被解除 @@ -346,7 +345,7 @@ offerbook.timeSinceSigning.info.signer=由对方验证,并可验证对方账 offerbook.timeSinceSigning.info.banned=账户已被封禁 offerbook.timeSinceSigning.daysSinceSigning={0} 天 offerbook.timeSinceSigning.daysSinceSigning.long=自验证{0} -offerbook.xmrAutoConf=Is auto-confirm enabled +offerbook.xmrAutoConf=是否开启自动确认 offerbook.timeSinceSigning.help=当您成功地完成与拥有已验证付款帐户的伙伴交易时,您的付款帐户已验证。\n{0} 天后,最初的 {1} 的限制解除以及你的账户可以验证其他人的付款账户。 offerbook.timeSinceSigning.notSigned=尚未验证 @@ -359,10 +358,10 @@ offerbook.volume={0}(最小 - 最大) offerbook.deposit=BTC 保证金(%) offerbook.deposit.help=交易双方均已支付保证金确保这个交易正常进行。这会在交易完成时退还。 -offerbook.createOfferToBuy=创建新的报价来买入 {0} -offerbook.createOfferToSell=创建新的报价来卖出 {0} +offerbook.createOfferToBuy=创建新的报价来买入 {0} +offerbook.createOfferToSell=创建新的报价来卖出 {0} offerbook.createOfferToBuy.withFiat=创建新的报价用 {1} 购买 {0} -offerbook.createOfferToSell.forFiat=创建新的报价以 {1} 出售 {0} +offerbook.createOfferToSell.forFiat=创建新的报价以 {1} 出售 {0} offerbook.createOfferToBuy.withCrypto=创建新的卖出报价 {0} (买入 {1}) offerbook.createOfferToSell.forCrypto=创建新的买入报价 {0}(卖出 {1}) @@ -394,8 +393,7 @@ offerbook.warning.currencyBanned=该报价中使用的货币被 Bisq 开发人 offerbook.warning.paymentMethodBanned=该报价中使用的付款方式被 Bisq 开发人员阻止。\n请访问 Bisq 论坛了解更多信息。 offerbook.warning.nodeBlocked=该交易者的匿名地址被 Bisq 开发人员限制。\n当获取来自该交易者的报价,可能有一个未处理的漏洞导致了问题。 offerbook.warning.requireUpdateToNewVersion=您的 Bisq 版本不再兼容交易。\n请通过 https://bisq.network/downloads 更新到最新的 Bisq 版本。 -offerbook.warning.tradeLimitNotMatching=您的付款帐户已于 {0} 前创建。您的交易限额基于账龄,因此不满足该报价的要求。\n您的交易限额是:{1}\n最小交易金额为:{2}\n您现在不能接受这个报价。\n只要您的账龄超过 2 个月,此限制就会被移除。 -offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. +offerbook.warning.offerWasAlreadyUsedInTrade=您不能吃单因为您已经完成了该操作。可能是你之前的吃单尝试导致了交易失败。 offerbook.info.sellAtMarketPrice=您会以市场价格进行出售(每分钟更新) offerbook.info.buyAtMarketPrice=您将以市场价格进行购买(每分钟更新)。 @@ -445,7 +443,6 @@ createOffer.alreadyFunded=您已经为该报价充值了。\n您的资金已经 createOffer.createOfferFundWalletInfo.headline=为您的报价充值 # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- 交易数量:{0}\n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} 和 {1} createOffer.createOfferFundWalletInfo.msg=这个报价您需要 {0} 作为保证金。\n\n这些资金保留在您的本地钱包并会被冻结到多重验证保证金地址直到报价交易成功。\n\n总数量:{1}\n- 保证金:{2}\n- 挂单费:{3}\n- 矿工手续费:{4}\n\n您有两种选项可以充值您的交易:\n- 使用您的 Bisq 钱包(方便,但交易可能会被链接到)或者\n- 从外部钱包转入(或许这样更隐秘一些)\n\n关闭此弹出窗口后,您将看到所有资金选项和详细信息。 # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=您不能下单,因为卖家已经下线。 takeOffer.warning.connectionToPeerLost=您与卖家失去连接。\n因为太多连接,他或许已经下线或者关掉了与您的连接。\n\n如果您还是能在报价列表中看到他的报价,您可以再次尝试下单。 takeOffer.error.noFundsLost=\n\n你的钱包里还没有钱。 \n请尝试重启您的应用程序或者检查您的网络连接。 +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n!\n takeOffer.error.depositPublished=\n\n您的保证金转账已经发布。\n请尝试重启您的应用程序或者检查您的网络连接。\n如果始终存在问题,请到帮助界面联系开发者。 takeOffer.error.payoutPublished=\n\n您的支付转账已经发布。\n请尝试重启您的应用程序或者检查您的网络连接。\n如果始终存在问题,请到帮助界面联系开发者。 @@ -543,7 +541,7 @@ portfolio.tab.history=历史记录 portfolio.tab.failed=失败 portfolio.tab.editOpenOffer=编辑报价 -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=这里有一个缺失或不可用交易导致的问题\n\n请不要发送法币或者任何数字货币。联系 Bisq 开发者在 Keybase 上 https://keybase.io/team/bisq 或者在论坛上https://bisq.community 以寻求更多协助。\n\n错误信息:{0} portfolio.pending.step1.waitForConf=等待区块链确认 portfolio.pending.step2_buyer.startPayment=开始付款 @@ -608,6 +606,8 @@ portfolio.pending.step2_buyer.moneyGram.extra=重要要求:\n完成支付后 # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=请使用 Western Union 向 BTC 卖家支付 {0}。\n\n portfolio.pending.step2_buyer.westernUnion.extra=重要要求:\n完成支付后,请通过电邮发送 MTCN(追踪号码)和照片给 BTC 卖家。\n收据必须清楚地向卖家写明您的全名、城市、国家或地区、数量。卖方的电子邮件是:{0}。 +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=请用“美国邮政汇票”发送 {0} 给 BTC 卖家。\n\n @@ -629,7 +629,7 @@ portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=发送授权编号和 portfolio.pending.step2_buyer.moneyGramMTCNInfo.msg=请通过电邮发送授权编号和照片给 BTC 卖家。\n收据必须清楚地向卖家写明您的全名、城市、国家或地区、数量。卖方的电子邮件是:{0}。\n\n您把授权编号和合同发给卖方了吗? portfolio.pending.step2_buyer.westernUnionMTCNInfo.headline=发送 MTCN 和收据 portfolio.pending.step2_buyer.westernUnionMTCNInfo.msg=请通过电邮发送 MTCN(追踪号码)和照片给 BTC 卖家。\n收据必须清楚地向卖家写明您的全名、城市、国家或地区、数量。卖方的电子邮件是:{0}。\n\n您把 MTCN 和合同发给卖方了吗? -portfolio.pending.step2_buyer.halCashInfo.headline=请发送 HalCash 代码 +portfolio.pending.step2_buyer.halCashInfo.headline=请发送 HalCash 代码 portfolio.pending.step2_buyer.halCashInfo.msg=您需要向 BTC 卖家发送带有 HalCash 代码和交易 ID({0})的文本消息。\n\n卖方的手机号码是 {1} 。\n\n您是否已经将代码发送至卖家? portfolio.pending.step2_buyer.fasterPaymentsHolderNameInfo=有些银行可能会要求接收方的姓名。在较旧的 Bisq 客户端创建的快速支付帐户没有提供收款人的姓名,所以请使用交易聊天来获得收款人姓名(如果需要)。 portfolio.pending.step2_buyer.confirmStart.headline=确定您已经付款 @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=买家的合同信息 portfolio.pending.step2_seller.waitPayment.msg=存款交易至少有一个区块链确认。\n您需要等到 BTC 买家开始 {0} 付款。 portfolio.pending.step2_seller.warn=BTC 买家仍然没有完成 {0} 付款。\n你需要等到他开始付款。\n如果 {1} 交易尚未完成,仲裁员将进行调查。 portfolio.pending.step2_seller.openForDispute=BTC 买家尚未开始付款!\n允许的最长交易期限已经过去了。你可以继续等待给予交易双方更多时间,或联系仲裁员以争取解决纠纷。 -portfolio.pending.step2_seller.refresh=刷新交易状态 -portfolio.pending.step2_seller.refreshInfo=有时 P2P 网络上的确认付款消息没有收到,导致交易变为异常交易。点击下面的按钮,让你的同伴重新发送上一条消息。 tradeChat.chatWindowTitle=使用 ID “{0}” 进行交易的聊天窗口 tradeChat.openChat=打开聊天窗口 tradeChat.rules=您可以与您的伙伴沟通,以解决该交易的潜在问题。\n在聊天中不强制回复。\n如果交易员违反了下面的任何规则,打开纠纷并向调解员或仲裁员报告。\n聊天规则:\n\n\t●不要发送任何链接(有恶意软件的风险)。您可以发送交易 ID 和区块资源管理器的名称。\n\t●不要发送还原密钥、私钥、密码或其他敏感信息!\n\t●不鼓励 Bisq 以外的交易(无安全保障)。\n\t●不要参与任何形式的危害社会安全的计划。\n\t●如果对方没有回应,也不愿意通过聊天进行沟通,那就尊重对方的决定。\n\t●将谈话范围限制在行业内。这个聊天不是一个社交软件替代品或troll-box。\n\t●保持友好和尊重的交谈。 @@ -682,8 +680,10 @@ portfolio.pending.step3_seller.cash=因为付款是通过现金存款完成的 portfolio.pending.step3_seller.moneyGram=买方必须发送授权编码和一张收据的照片。\n收据必须清楚地显示您的全名、城市、国家或地区、数量。如果您收到授权编码,请查收邮件。\n\n关闭弹窗后,您将看到 BTC 买家的姓名和在 MoneyGram 的收款地址。\n\n只有在您成功收到钱之后,再确认收据! portfolio.pending.step3_seller.westernUnion=买方必须发送 MTCN(跟踪号码)和一张收据的照片。\n收据必须清楚地显示您的全名、城市、国家或地区、数量。如果您收到 MTCN,请查收邮件。\n\n关闭弹窗后,您将看到 BTC 买家的姓名和在 Western Union 的收款地址。\n\n只有在您成功收到钱之后,再确认收据! portfolio.pending.step3_seller.halCash=买方必须将 HalCash代码 用短信发送给您。除此之外,您将收到来自 HalCash 的消息,其中包含从支持 HalCash 的 ATM 中提取欧元所需的信息\n从 ATM 取款后,请在此确认付款收据! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\n还请确认您的银行对帐单中的发件人姓名与委托合同中的发件人姓名相符:\n发件人姓名:{0}\n\n如果名称与此处显示的名称不同,则 {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=请不要确认,而是通过键盘组合键“alt + o”或“option + o”来打开纠纷。 portfolio.pending.step3_seller.confirmPaymentReceipt=确定付款收据 portfolio.pending.step3_seller.amountToReceive=接收数量: @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=您是否收到了您交 portfolio.pending.step3_seller.onPaymentReceived.fiat=交易 ID(“付款理由”文本)是“{0}”\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=还请确认您的银行对帐单中的发件人姓名与委托合同中的发件人姓名相符:\n每个交易合约的发送者姓名:{0}\n\n如果名称与此处显示的名称不一致,请不要通过确认付款,而是通过“alt + o”或“option + o”打开纠纷。\n\n +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.note=请注意,一旦您确认收到,冻结交易金额将被发放给 BTC 买家,保证金将被退还。 portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=确定您已经收到付款 portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=是的,我已经收到付款。 @@ -753,18 +754,13 @@ portfolio.pending.openSupportTicket.msg=请仅在紧急情况下使用此功能 portfolio.pending.timeLockNotOver=你必须等到≈{0}(还需等待{1}个区块)才能提交纠纷。 portfolio.pending.error.depositTxNull=保证金交易无效。没有有效的保证金交易,你使用创建纠纷。请到“设置/网络信息”进行 SPV 重新同步。\n \n如需更多帮助,请联系 Bisq Keybase 团队的 Support 频道。 -portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is null. You can move the trade to failed trades. -portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. +portfolio.pending.mediationResult.error.depositTxNull=保证金交易为空。你可以移动该交易至失败的交易。 +portfolio.pending.mediationResult.error.delayedPayoutTxNull=延迟支付交易为空。你可以移动该交易至失败的交易。 portfolio.pending.error.depositTxNotConfirmed=保证金交易未确认。未经确认的存款交易不能发起纠纷或仲裁请求。请耐心等待,直到它被确认或进入“设置/网络信息”进行 SPV 重新同步。\n\n如需更多帮助,请联系 Bisq Keybase 团队的 Support 频道。 -portfolio.pending.notification=通知 - portfolio.pending.support.headline.getHelp=需要帮助? portfolio.pending.support.text.getHelp=如果您有任何问题,您可以尝试在交易聊天中联系交易伙伴,或在 https://bisq.community 询问 Bisq 社区。如果您的问题仍然没有解决,您可以向调解员取得更多的帮助。 -portfolio.pending.support.text.getHelp.arbitrator=如果您有任何问题,您可以尝试在交易聊天中联系交易伙伴,或在 https://bisq.community 询问 Bisq 社区。如果你的问题仍然没有解决,你可以向仲裁员取得更多的帮助。 portfolio.pending.support.button.getHelp=开启交易聊天 -portfolio.pending.support.popup.info=如果您与交易的问题仍然没有解决,您可以提交工单来请求调解员的帮助。如果您还没有收到付款,请等到交易结束。\n\n您确定要提交工单吗? -portfolio.pending.support.popup.button=创建帮助话题 portfolio.pending.support.headline.halfPeriodOver=确认付款 portfolio.pending.support.headline.periodOver=交易期结束 @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=已请求调解员协助 portfolio.pending.refundRequested=已请求退款 portfolio.pending.openSupport=创建帮助话题 portfolio.pending.supportTicketOpened=帮助话题已经创建 -portfolio.pending.requestSupport=请求帮助 -portfolio.pending.error.requestSupport=请将问题报告给您的调解员或仲裁员。\n\n他会将信息转交给开发人员调查问题。\n在解决问题后,您将收回所有冻结资金。 portfolio.pending.communicateWithArbitrator=请在“帮助”界面上与仲裁员联系。 portfolio.pending.communicateWithMediator=请在“支持”页面中与调解员进行联系。 -portfolio.pending.supportTicketOpenedMyUser=您创建了一个帮助话题。\n{0} portfolio.pending.disputeOpenedMyUser=您创建了一个纠纷。\n{0} portfolio.pending.disputeOpenedByPeer=您的交易对象创建了一个纠纷。\n{0} -portfolio.pending.supportTicketOpenedByPeer=您的交易对象创建了一个帮助工单。\n{0} portfolio.pending.noReceiverAddressDefined=没有定义接收地址 -portfolio.pending.removeFailedTrade=这是一笔失败的交易吗?如果是,请问你想手动关闭它吗?使它不再显示为一个未完成交易。 portfolio.pending.mediationResult.headline=调解费用的支出 portfolio.pending.mediationResult.info.noneAccepted=通过接受调解员关于交易的建议的支出来完成交易。 @@ -791,24 +782,24 @@ portfolio.pending.mediationResult.button=查看建议的解决方案 portfolio.pending.mediationResult.popup.headline=调解员在交易 ID:{0}上的建议 portfolio.pending.mediationResult.popup.headline.peerAccepted=你的伙伴已经接受了调解员的建议 portfolio.pending.mediationResult.popup.info=调解员建议的支出如下:\n你将支付:{0}\n你的交易伙伴将支付:{1}\n\n你可以接受或拒绝这笔调解费支出。\n\n通过接受,你验证了合约的支付交易。如果你的交易伙伴也接受和验证,支付将完成,交易将关闭。\n\n如果你们其中一人或双方都拒绝该建议,你将必须等到(2)({3}区块)与仲裁员展开第二轮纠纷讨论,仲裁员将再次调查该案件,并根据他们的调查结果进行支付。\n\n仲裁员可以收取少量费用(费用上限:交易的保证金)作为其工作的补偿。两个交易者都同意调解员的建议是愉快的路径请求仲裁是针对特殊情况的,比如如果一个交易者确信调解员没有提出公平的赔偿建议(或者如果另一个同伴没有回应)。\n\n关于新的仲裁模型的更多细节:https://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=您已经接受了调解员的建议支付但是似乎您的交易对手并没有接受。\n\n一旦锁定时间到{0}(区块{1})您可以打开第二轮纠纷让仲裁员重新研究该案件并重新作出支出决定。\n\n您可以找到更多关于仲裁模型的信息在:\nhttps://docs.bisq.network/trading-rules.html#arbitration portfolio.pending.mediationResult.popup.openArbitration=拒绝并请求仲裁 portfolio.pending.mediationResult.popup.alreadyAccepted=您已经接受了。 -portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. -portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} -portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Move trade to failed trades -portfolio.pending.failedTrade.warningIcon.tooltip=Click to open details about the issues of this trade -portfolio.failed.revertToPending.popup=Do you want to move this trade to open trades? -portfolio.failed.revertToPending=Move trade to open trades +portfolio.pending.failedTrade.taker.missingTakerFeeTx=吃单交易费未找到。\n\n如果没有 tx,交易不能完成。没有资金被锁定以及没有支付交易费用。你可以将交易移至失败的交易。 +portfolio.pending.failedTrade.maker.missingTakerFeeTx=挂单费交易未找到。\n\n如果没有 tx,交易不能完成。没有资金被锁定以及没有支付交易费用。你可以将交易移至失败的交易。 +portfolio.pending.failedTrade.missingDepositTx=这个保证金交易(2 对 2 多重签名交易)缺失\n\n没有该 tx,交易不能完成。没有资金被锁定但是您的交易手续费仍然已支出。您可以发起一个请求去赔偿改交易手续费在这里:https://github.com/bisq-network/support/issues\n\n请随意的将该交易移至失败交易 +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=延迟支付交易缺失,但是资金仍然被锁定在保证金交易中。\n\n请不要给比特币卖家发送法币或数字货币,因为没有延迟交易 tx,不能开启仲裁。使用 Cmd/Ctrl+o开启调解协助。调解员应该建议交易双方分别退回全部的保证金(卖方支付的交易金额也会全数返还)。这样的话不会有任何的安全问题只会损失交易手续费。\n\n你可以在这里为失败的交易提出赔偿要求:https://github.com/bisq-network/support/issues +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=延迟支付交易确实但是资金仍然被锁定在保证金交易中。\n\n如果卖家仍然缺失延迟支付交易,他会接到请勿付款的指示并开启一个调节帮助。你也应该使用 Cmd/Ctrl+O 去打开一个调节协助\n\n如果买家还没有发送付款,调解员应该会建议交易双方分别退回全部的保证金(卖方支付的交易金额也会全数返还)。否则交易额应该判给买方。\n\n你可以在这里为失败的交易提出赔偿要求:https://github.com/bisq-network/support/issues +portfolio.pending.failedTrade.errorMsgSet=在处理交易协议是发生了一个错误\n\n错误:{0}\n\n这应该不是致命错误,您可以正常的完成交易。如果你仍担忧,打开一个调解协助并从 Bisq 调解员处得到建议。\n\n如果这个错误是致命的那么这个交易就无法完成,你可能会损失交易费。可以在这里为失败的交易提出赔偿要求:https://github.com/bisq-network/support/issues +portfolio.pending.failedTrade.missingContract=没有设置交易合同。\n\n这个交易无法完成,你可能会损失交易手续费。可以在这里为失败的交易提出赔偿要求:https://github.com/bisq-network/support/issues +portfolio.pending.failedTrade.info.popup=交易协议出现了问题。\n\n{0} +portfolio.pending.failedTrade.txChainInvalid.moveToFailed=交易协议出现了严重问题。\n\n{0}\n\n您确定想要将该交易移至失败的交易吗?\n\n您不能在失败的交易中打开一个调解或仲裁,但是你随时可以将失败的交易重新移至未完成交易。 +portfolio.pending.failedTrade.txChainValid.moveToFailed=这个交易协议存在一些问题。\n\n{0}\n\n这个报价交易已经被发布以及资金已被锁定。只有在确定情况下将该交易移至失败交易。这可能会阻止解决问题的可用选项。\n\n您确定想要将该交易移至失败的交易吗?\n\n您不能在失败的交易中打开一个调解或仲裁,但是你随时可以将失败的交易重新移至未完成交易。 +portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=将交易移至失败交易 +portfolio.pending.failedTrade.warningIcon.tooltip=点击打开该交易的问题细节 +portfolio.failed.revertToPending.popup=您想要将该交易移至未完成交易吗 +portfolio.failed.revertToPending=将交易移至未完成交易 portfolio.closed.completed=完成 portfolio.closed.ticketClosed=已仲裁 @@ -817,8 +808,8 @@ portfolio.closed.canceled=已取消 portfolio.failed.Failed=失败 portfolio.failed.unfail=再继续之前,请保证你有一份根目录的备份!\n您想要将此交易移至未完成的交易吗?\n这是一个解锁卡在失败交易的资金的方法 portfolio.failed.cantUnfail=目前该交易暂无法移至未完成的交易。\n请在完成交易后重试{0} -portfolio.failed.depositTxNull=The trade cannot be reverted to a open trade. Deposit transaction is null. -portfolio.failed.delayedPayoutTxNull=The trade cannot be reverted to a open trade. Delayed payout transaction is null. +portfolio.failed.depositTxNull=交易无法恢复至未完成交易。保证金交易为空。 +portfolio.failed.delayedPayoutTxNull=交易无法恢复至未完成交易。延迟支付交易为空。 #################################################################### @@ -839,6 +830,7 @@ funds.deposit.fundWallet=充值您的钱包 funds.deposit.withdrawFromWallet=从钱包转出资金 funds.deposit.amount=BTC 数量(可选) funds.deposit.generateAddress=生成新的地址 +funds.deposit.generateAddressSegwit=原生 segwit 格式(Bech32) funds.deposit.selectUnused=请从上表中选择一个未使用的地址,而不是生成一个新地址。 funds.withdrawal.arbitrationFee=仲裁费用 @@ -912,21 +904,21 @@ support.tab.ArbitratorsSupportTickets={0} 的工单 support.filter=查找纠纷 support.filter.prompt=输入 交易 ID、日期、洋葱地址或账户信息 -support.sigCheck.button=Verify result -support.sigCheck.popup.info=In case of a reimbursement request to the DAO you need to paste the summary message of the mediation and arbitration process in your reimbursement request on Github. To make this statement verifiable any user can check with this tool if the signature of the mediator or arbitrator matches the summary message. -support.sigCheck.popup.header=Verify dispute result signature -support.sigCheck.popup.msg.label=Summary message -support.sigCheck.popup.msg.prompt=Copy & paste summary message from dispute -support.sigCheck.popup.result=Validation result -support.sigCheck.popup.success=Signature is valid -support.sigCheck.popup.failed=Signature verification failed -support.sigCheck.popup.invalidFormat=Message is not of expected format. Copy & paste summary message from dispute. +support.sigCheck.button=确认结果 +support.sigCheck.popup.info=如果向在 DAO 发送赔偿请求,您需要在 Github 上粘贴您的赔偿请求中的调解和仲裁过程的摘要消息。要使此声明可验证,任何用户都可以使用此工具检查调解或仲裁人员的签名是否与摘要消息匹配。 +support.sigCheck.popup.header=确认纠纷结果签名 +support.sigCheck.popup.msg.label=总结消息 +support.sigCheck.popup.msg.prompt=复制粘贴纠纷总结消息 +support.sigCheck.popup.result=验证结果 +support.sigCheck.popup.success=签名有效 +support.sigCheck.popup.failed=签名验证失败 +support.sigCheck.popup.invalidFormat=消息并不是正确的格式。请复制粘贴纠纷总结消息。 support.reOpenByTrader.prompt=您确定想要重新开启纠纷? -support.reOpenButton.label=Re-open +support.reOpenButton.label=重新打开 support.sendNotificationButton.label=私人通知 -support.reportButton.label=Report -support.fullReportButton.label=All disputes +support.reportButton.label=报告 +support.fullReportButton.label=所有纠纷 support.noTickets=没有创建的话题 support.sendingMessage=发送消息... support.receiverNotOnline=收件人未在线。消息被保存到他们的邮箱。 @@ -970,9 +962,9 @@ support.peerOpenedDispute=对方创建了一个纠纷请求。\n\n{0}\n\nBisq support.peerOpenedDisputeForMediation=对方创建了一个调解请求。\n\n{0}\n\nBisq 版本:{1} support.mediatorsDisputeSummary=系统消息:\n调解纠纷总结:\n{0} support.mediatorsAddress=仲裁员的节点地址:{0} -support.warning.disputesWithInvalidDonationAddress=The delayed payout transaction has used an invalid receiver address. It does not match any of the DAO parameter values for the valid donation addresses.\n\nThis might be a scam attempt. Please inform the developers about that incident and do not close that case before the situation is resolved!\n\nAddress used in the dispute: {0}\n\nAll DAO param donation addresses: {1}\n\nTrade ID: {2}{3} -support.warning.disputesWithInvalidDonationAddress.mediator=\n\nDo you still want to close the dispute? -support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nYou must not do the payout. +support.warning.disputesWithInvalidDonationAddress=延迟支付交易已经被用于一个不可用接受者地址。它与有效捐赠地址的任何 DAO 中参数值均不匹配。\n\n这可能是一个骗局。请将该事件通知开发者,在问题解决之前不要关闭该案件!\n\n纠纷所用的地址:{0}\n\n所有 DAO 参数中捐赠地址:{1}\n\n交易:{2}{3} +support.warning.disputesWithInvalidDonationAddress.mediator=\n\n您确定一定要关闭纠纷吗? +support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\n您不能进行支付。 #################################################################### @@ -986,6 +978,7 @@ setting.preferences.general=通用偏好 setting.preferences.explorer=比特币区块浏览器 setting.preferences.explorer.bsq=Bisq 区块浏览器 setting.preferences.deviation=与市场价格最大差价 +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=避免待机模式 setting.preferences.autoConfirmXMR=XMR 自动确认 setting.preferences.autoConfirmEnabled=启用 @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=已要求确认 setting.preferences.autoConfirmMaxTradeSize=最大交易量(BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer 链接(使用Tor,但本地主机,LAN IP地址和 *.local 主机名除外) setting.preferences.deviationToLarge=值不允许大于30% -setting.preferences.txFee=提现交易费(聪/byte) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=使用自定义值 -setting.preferences.txFeeMin=交易费必须最少 5 聪/byte -setting.preferences.txFeeTooLarge=您的输入高于任何合理的值(> 5000 聪 / byte)。 交易费通常在 50-400 聪 / byte 范围内。 +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=忽略节点 [洋葱地址:端口] -setting.preferences.refererId=推荐人 ID setting.preferences.ignoreDustThreshold=最小无零头输出值 -setting.preferences.refererId.prompt=可选的推荐人 ID setting.preferences.currenciesInList=市场价的货币列表 setting.preferences.prefCurrency=首选货币 setting.preferences.displayFiat=显示国家货币 @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=使用动画 setting.preferences.useDarkMode=使用夜间模式 setting.preferences.sortWithNumOffers=使用“报价ID/交易ID”筛选列表 setting.preferences.resetAllFlags=重置所有“不再提示”的提示 -setting.preferences.reset=重置 settings.preferences.languageChange=同意重启请求以更换语言 settings.preferences.supportLanguageWarning=如有任何争议,请注意调解在 {0} 处理,仲裁在 {1} 处理。 -settings.preferences.selectCurrencyNetwork=选择网络 setting.preferences.daoOptions=DAO 选项 setting.preferences.dao.resyncFromGenesis.label=从初始 tx 重构 DAO 状态 setting.preferences.dao.resyncFromResources.label=从指定资源重新构建 DAO 状态 @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=区块通知端口 setting.preferences.dao.fullNodeInfo=如果要将 Bisq 以 DAO 全节点运行,您需要在本地运行比特币核心并启用 RPC 。所有的需求都记录在“ {0} ”中。 setting.preferences.dao.fullNodeInfo.ok=打开文档页面 setting.preferences.dao.fullNodeInfo.cancel=不,我坚持使用轻节点模式 +settings.preferences.editCustomExplorer.headline=浏览设置。 +settings.preferences.editCustomExplorer.description=从左侧列表中选择一个系统默认浏览器,或使用您偏好的自定义设置。 +settings.preferences.editCustomExplorer.available=可用浏览器 +settings.preferences.editCustomExplorer.chosen=已选择的浏览器设置 +settings.preferences.editCustomExplorer.name=名称 +settings.preferences.editCustomExplorer.txUrl=交易 URL +settings.preferences.editCustomExplorer.addressUrl=地址 URL settings.net.btcHeader=比特币网络 settings.net.p2pHeader=Bisq 网络 @@ -1155,11 +1151,9 @@ setting.info.msg=当你完成 BTC/XMR 交易时,您可以使用自动确认功 # Account #################################################################### -account.tab.arbitratorRegistration=仲裁员注册 account.tab.mediatorRegistration=调解员注册 account.tab.refundAgentRegistration=退款助理注册 account.tab.signing=验证中 -account.tab.account=账户 account.info.headline=欢迎来到 Bisq 账户 account.info.msg=在这里你可以设置交易账户的法定货币及数字货币,选择仲裁员和备份你的钱包及账户数据。\n\n当你开始运行 Bisq 就已经创建了一个空的比特币钱包。\n\n我们建议你在充值之前写下你比特币钱包的还原密钥(在左边的列表)和考虑添加密码。在“资金”选项中管理比特币存入和提现。\n\n隐私 & 安全:\nBisq 是一个去中心化的交易所 – 意味着您的所有数据都保存在您的电脑上,没有服务器,我们无法访问您的个人信息,您的资金,甚至您的 IP 地址。如银行账号、数字货币、比特币地址等数据只分享给与您交易的人,以实现您发起的交易(如果有争议,仲裁员将会看到您的交易数据)。 @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=无法注册仲裁员。{0} account.altcoin.yourAltcoinAccounts=您的数字货币账户 account.altcoin.popup.wallet.msg=请确保您按照 {1} 网页上所述使用 {0} 钱包的要求。\n使用集中式交易所的钱包,您无法控制密钥或使用不兼容的钱包软件,可能会导致交易资金的流失!\n调解员或仲裁员不是 {2} 专家,在这种情况下不能帮助。 account.altcoin.popup.wallet.confirm=我了解并确定我知道我需要哪种钱包。 +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=在 Bisq 上交易 UPX 需要您了解并满足以下要求:\n\n要发送 UPX ,您需要使用官方的 UPXmA GUI 钱包或启用 store-tx-info 标志的 UPXmA CLI 钱包(在新版本中是默认的)。请确保您可以访问Tx密钥,因为在纠纷状态时需要。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\n在普通的区块链浏览器中,这种交易是不可验证的。\n\n如有纠纷,你须向仲裁员提供下列资料:\n \n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,UPX 发送方负责向仲裁员提供 UPX 转账的验证。\n\n不需要支付 ID,只需要普通的公共地址。\n \n如果您对该流程不确定,请访问 UPXmA Discord 频道(https://discord.gg/vhdNSrV)或 Telegram 交流群(https://t.me/uplexaOfficial)了解更多信息。\n\n +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=在 Bisq 上交易 ARQ 需要您了解并满足以下要求:\n\n要发送 ARQ ,您需要使用官方的 ArQmA GUI 钱包或启用 store-tx-info 标志的 ArQmA CLI 钱包(在新版本中是默认的)。请确保您可以访问Tx密钥,因为在纠纷状态时需要。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\n在普通的区块链浏览器中,这种交易是不可验证的。\n\n如有纠纷,你须向调解员或仲裁员提供下列资料:\n\n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,ARQ 发送方负责向调解员或仲裁员提供 ARQ 转账的验证。\n\n不需要交易 ID,只需要普通的公共地址。\n\n如果您对该流程不确定,请访问 ArQmA Discord 频道(https://discord.gg/s9BQpJT)或 ArQmA 论坛(https://labs.arqma.com)了解更多信息。 +# suppress inspection "UnusedProperty" account.altcoin.popup.xmr.msg=在 Bisq 上交易 XMR 需要你理解并满足以下要求。\n\n如果您出售 XMR,当您在纠纷中您必须要提供下列信息给调解员或仲裁员:\n- 交易密钥(Tx 公钥,Tx密钥,Tx私钥)\n- 交易 ID(Tx ID 或 Tx 哈希)\n- 交易目标地址(接收者地址)\n\n在 wiki 中查看更多关于 Monero 钱包的信息:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\n如未能提供要求的交易数据将在纠纷中直接判负\n\n还要注意,Bisq 现在提供了自动确认 XMR 交易的功能,以使交易更快,但是您需要在设置中启用它。\n\n有关自动确认功能的更多信息,请参见 Wiki:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" +# suppress inspection "UnusedProperty" account.altcoin.popup.msr.msg=区块链浏览器在 Bisq 上交易 XMR 需要您了解并满足以下要求:\n\n发送MSR时,您需要使用官方的 Masari GUI 钱包、启用store-tx-info标记的Masari CLI钱包(默认启用)或Masari 网页钱包(https://wallet.getmasari.org)。请确保您可以访问的 tx 密钥,因为如果发生纠纷这是需要的。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高级>证明/检查页面。\n\nMasari 网页钱包(前往 帐户->交易历史和查看您发送的交易细节)\n\n验证可以在钱包中完成。\nmonero-wallet-cli:使用命令(check_tx_key)。\nmonero-wallet-gui:在高级>证明/检查页面\n验证可以在区块浏览器中完成\n打开区块浏览器(https://explorer.getmasari.org),使用搜索栏查找您的事务哈希。\n一旦找到交易,滚动到底部的“证明发送”区域,并填写所需的详细信息。\n如有纠纷,你须向调解员或仲裁员提供下列资料:\n- Tx私钥\n- 交易哈希\n- 接收者的公开地址\n\n不需要交易 ID,只需要正常的公共地址。\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。如果发生纠纷,XMR 发送方负责向调解员或仲裁员提供 XMR 转账的验证。\n\n如果您对该流程不确定,请访问官方的 Masari Discord(https://discord.gg/sMCwMqs)上寻求帮助。 +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=在 Bisq 上交易 BLUR 需要你了解并满足以下要求:\n\n要发送匿名信息你必须使用匿名网络 CLI 或 GUI 钱包。\n如果您正在使用 CLI 钱包,在传输发送后将显示交易哈希(tx ID)。您必须保存此信息。在发送传输之后,您必须立即使用“get_tx_key”命令来检索交易私钥。如果未能执行此步骤,以后可能无法检索密钥。\n\n如果您使用 Blur Network GUI 钱包,可以在“历史”选项卡中方便地找到交易私钥和交易 ID。发送后立即定位感兴趣的交易。单击包含交易的框的右下角的“?”符号。您必须保存此信息。\n\n如果仲裁是必要的,您必须向调解员或仲裁员提供以下信息:1.)交易ID,2.)交易私钥,3.)收件人地址。调解或仲裁程序将使用 BLUR 事务查看器(https://blur.cash/#tx-viewer)验证 BLUR 转账。\n\n未能向调解员或仲裁员提供必要的信息将导致败诉。在所有争议的情况下,匿名发送方承担100%的责任来向调解员或仲裁员核实交易。\n\n如果你不了解这些要求,不要在 Bisq 上交易。首先,在 Blur Network Discord 中寻求帮助(https://discord.gg/dMWaqVW)。 +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=在 Bisq 上交易 Solo 需要您了解并满足以下要求:\n\n要发送 Solo,您必须使用 Solo CLI 网络钱包版本 5.1.3 或更高。\n\n如果您使用的是CLI钱包,则在发送交易之后,将显示交易ID。您必须保存此信息。在发送交易之后,您必须立即使用'get_tx_key'命令来检索交易密钥。如果未能执行此步骤,则以后可能无法检索密钥。\n\n如果仲裁是必要的,您必须向调解员或仲裁员提供以下信息:1)交易 ID,、2)交易密钥,3)收件人的地址。调解员或仲裁员将使用 Solo 区块资源管理器(https://explorer.Solo.org)搜索交易然后使用“发送证明”功能(https://explorer.minesolo.com/)\n\n未能向调解员或仲裁员提供必要的信息将导致败诉。在所有发生争议的情况下,在向调解员或仲裁员核实交易时,QWC 的发送方承担 100% 的责任。\n\n如果你不理解这些要求,不要在 Bisq 上交易。首先,在 Solo Discord 中寻求帮助(https://discord.minesolo.com/)。\n\n +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=在 Bisq 上交易 CASH2 需要您了解并满足以下要求:\n\n要发送 CASH2,您必须使用 CASH2 钱包版本 3 或更高。\n\n在发送交易之后,将显示交易ID。您必须保存此信息。在发送交易之后,必须立即在 simplewallet 中使用命令“getTxKey”来检索交易密钥。\n\n如果仲裁是必要的,您必须向调解员或仲裁员提供以下信息:1)交易 ID,2)交易密钥,3)收件人的 CASH2 地址。调解员或仲裁员将使用 CASH2 区块资源管理器(https://blocks.cash2.org)验证 CASH2 转账。\n\n未能向调解员或仲裁员提供必要的信息将导致败诉。在所有发生争议的情况下,在向调解员或仲裁员核实交易时,CASH2 的发送方承担 100% 的责任。\n\n如果你不理解这些要求,不要在 Bisq 上交易。首先,在 Cash2 Discord 中寻求帮助(https://discord.gg/FGfXAYN)。 +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=在 Bisq 上交易 Qwertycoin 需要您了解并满足以下要求:\n\n要发送 Qwertycoin,您必须使用 Qwertycoin 钱包版本 5.1.3 或更高。\n\n在发送交易之后,将显示交易ID。您必须保存此信息。在发送交易之后,必须立即在 simplewallet 中使用命令“get_Tx_Key”来检索交易密钥。\n\n如果仲裁是必要的,您必须向调解员或仲裁员提供以下信息::1)交易 ID,、2)交易密钥,3)收件人的 QWC 地址。调解员或仲裁员将使用 QWC 区块资源管理器(https://explorer.qwertycoin.org)验证 QWC 转账。\n\n未能向调解员或仲裁员提供必要的信息将导致败诉。在所有发生争议的情况下,在向调解员或仲裁员核实交易时,QWC 的发送方承担 100% 的责任。\n\n如果你不理解这些要求,不要在 Bisq 上交易。首先,在 QWC Discord 中寻求帮助(https://discord.gg/rUkfnpC)。 +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=在 Bisq 上交易 Dragonglass 需要您了解并满足以下要求:\n\n由于 Dragonglass 提供了隐私保护,所以交易不能在公共区块链上验证。如果需要,您可以通过使用您的 TXN-Private-Key 来证明您的付款。\nTXN-Private 密匙是自动生成的一次性密匙,用于只能从 DRGL 钱包中访问的每个交易。\n要么通过 DRGL-wallet GUI(内部交易细节对话框),要么通过 Dragonglass CLI simplewallet(使用命令“get_tx_key”)。\n\n两者都需要 DRGL 版本的“Oathkeeper”或更高版本。\n\n如有争议,你必须向调解员或仲裁员提供下列资料:\n\n- txn-Privite-ket\n- 交易哈希 \n- 接收者的公开地址\n\n付款验证可以使用上面的数据作为输入(http://drgl.info/#check_txn)。\n\n如未能提供上述资料,或使用不兼容的钱包,将会导致纠纷败诉。Dragonglass 发送方负责在发生争议时向调解员或仲裁员提供 DRGL 转账的验证。不需要使用付款 ID。\n\n如果您对这个过程的任何部分都不确定,请访问(http://discord.drgl.info)上的 Dragonglass 寻求帮助。 +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=当使用 Zcash 时,您只能使用透明地址(以 t 开头),而不能使用 z 地址(私有),因为调解员或仲裁员无法使用 z 地址验证交易。 +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=在使用 Zcoin 时,您只能使用透明的(可跟踪的)地址,而不能使用不可跟踪的地址,因为调解员或仲裁员无法在区块资源管理器中使用不可跟踪的地址验证交易。 +# suppress inspection "UnusedProperty" account.altcoin.popup.grin.msg=GRIN 需要发送方和接收方之间的交互过程来创建交易。请确保遵循 GRIN 项目网页中的说明,以可靠地发送和接收 GRIN(接收方需要在线,或至少在一定时间内在线)。\n \nBisq 只支持 Grinbox(Wallet713)钱包 URL 格式。\n\nGRIN 发送者需要提供他们已成功发送 GRIN 的证明。如果钱包不能提供证明,一个潜在的纠纷将被解决,有利于露齿微笑的接受者。请确保您使用了最新的支持交易证明的 Grinbox 软件,并且您了解传输和接收 GRIN 的过程以及如何创建证明。\n请参阅 https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only,以获得关于 Grinbox 证明工具的更多信息。\n +# suppress inspection "UnusedProperty" account.altcoin.popup.beam.msg=BEAM 需要发送方和接收方之间的交互过程来创建交易。\n\n\n确保遵循 BEAM 项目网页的指示可靠地发送和接收 BEAM(接收方需要在线,或者至少在一定的时间范围内在线)。\n\nBEAM 发送者需要提供他们成功发送 BEAM 的证明。一定要使用钱包软件,可以产生这样的证明。如果钱包不能提供证据,一个潜在的纠纷将得到解决,有利于 BEAM 接收者。 +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=在 Bisq 上交易 ParsiCoin 需要您了解并满足以下要求:\n\n要发送 PARS ,您必须使用官方 ParsiCoin Wallet 版本 3.0.0 或更高。\n\n您可以在 GUI 钱包(ParsiPay)的交易部分检查您的交易哈希和交易键,您需要右键单击“交易”,然后单击“显示详情”。\n\n如果仲裁是 100% 必要的,您必须向调解员或仲裁员提供以下内容:1)交易哈希,2)交易密钥,以及3)接收方的 PARS 地址。调解员或仲裁员将使用 ParsiCoin 区块链浏览器 (http://explorer.parsicoin.net/#check_payment)验证 PARS 传输。\n\n如果你不了解这些要求,不要在 Bisq 上交易。首先,在 ParsiCoin Discord 寻求帮助(https://discord.gg/c7qmFNh)。 +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=要交易烧毁的货币,你需要知道以下几点:\n\n烧毁的货币是不能花的。要在 Bisq 上交易它们,输出脚本需要采用以下形式:OP_RETURN OP_PUSHDATA,后跟相关的数据字节,这些字节经过十六进制编码后构成地址。例如,地址为666f6f(在UTF-8中的"foo")的烧毁的货币将有以下脚本:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\n要创建烧毁的货币,您可以使用“烧毁”RPC命令,它在一些钱包可用。\n\n对于可能的情况,可以查看 https://ibo.laboratorium.ee\n\n因为烧毁的货币是不能用的,所以不能重新出售。“出售”烧毁的货币意味着焚烧初始的货币(与目的地地址相关联的数据)。\n\n如果发生争议,BLK 卖方需要提供交易哈希。 +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=在 Bisq 上交易 L-BTC 你必须理解下述条款:\n\n当你在 Bisq 上接受 L-BTC 交易时,你不能使用手机 Blockstream Green Wallet 或者是一个托管/交易钱包。你必须只接收 L-BTC 到 Liquid Elements Core 钱包,或另一个 L-BTC 钱包且允许你获得匿名的 L-BTC 地址以及密钥。\n\n在需要进行调解的情况下,或者如果发生了交易纠纷,您必须将接收 L-BTC地址的安全密钥披露给 Bisq 调解员或退款代理,以便他们能够在他们自己的 Elements Core 全节点上验证您的匿名交易的细节。\n\n如果你不了解或了解这些要求,不要在 Bisq 上交易 L-BTC。 account.fiat.yourFiatAccounts=您的法定货币账户 @@ -1213,7 +1222,6 @@ account.backup.location=备份路径 account.backup.selectLocation=选择备份路径 account.backup.backupNow=立即备份(备份没有被加密!) account.backup.appDir=应用程序数据目录 -account.backup.logFile=日志文件 account.backup.openDirectory=打开目录 account.backup.openLogFile=打开日志文件 account.backup.success=备份成功保存在:\n{0} @@ -1241,14 +1249,11 @@ account.seed.restore.ok=好的,立即执行回复并且关闭 Bisq account.notifications.setup.title=安装 account.notifications.download.label=下载手机应用 -account.notifications.download.button=下载 account.notifications.waitingForWebCam=等待网络摄像头... account.notifications.webCamWindow.headline=用手机扫描二维码 account.notifications.webcam.label=使用网络摄像头 account.notifications.webcam.button=扫描二维码 account.notifications.noWebcam.button=我没有网络摄像头 -account.notifications.testMsg.label=发送测试通知 -account.notifications.testMsg.title=测试 account.notifications.erase.label=在手机上清除通知 account.notifications.erase.title=清除通知 account.notifications.email.label=验证码 @@ -1283,8 +1288,6 @@ account.notifications.marketAlert.trigger.prompt=与市场价格的百分比距 account.notifications.marketAlert.addButton=添加报价提醒 account.notifications.marketAlert.manageAlertsButton=管理报价提醒 account.notifications.marketAlert.manageAlerts.title=管理报价提醒 -account.notifications.marketAlert.manageAlerts.label=报价提醒 -account.notifications.marketAlert.manageAlerts.item=触发价格 {1} 以及支付账户为 {2} 的报价提醒 {0} account.notifications.marketAlert.manageAlerts.header.paymentAccount=支付账户 account.notifications.marketAlert.manageAlerts.header.trigger=触发价格 account.notifications.marketAlert.manageAlerts.header.offerType=报价类型 @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=所有未验证交易的余额(等待区块确认) dao.lockedForVoteBalance=用于投票 dao.lockedInBonds=冻结余额 dao.availableNonBsqBalance=可用的非 BSQ 余额(BTC) -dao.totalBsqBalance=BSQ 总额 dao.reputationBalance=声望值(不会花费) dao.tx.published.success=你的交易已经成功发布 @@ -1455,11 +1457,6 @@ dao.param.currentValue=当前值:{0} dao.param.currentAndPastValue=当前余额:{0}(提案时的余额:{1}) dao.param.blocks={0} 区块 -dao.results.cycle.duration.label={0} 的周期 -dao.results.cycle.duration.value={0} 区块 -dao.results.cycle.value.postFix.isDefaultValue=(默认值) -dao.results.cycle.value.postFix.hasChanged=(在投票中更改) - dao.results.invalidVotes=在那个投票周期中,我们有无效的投票。如果投票没有在 Bisq 网络中很好地分布,就会发生这种情况。\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=盐 dao.bond.reputation.hash=哈希 dao.bond.reputation.lockupButton=锁定 dao.bond.reputation.lockup.headline=确认锁定交易 -dao.bond.reputation.lockup.details=锁定金额:{0}\n锁定时间:{1} 区块(≈{2})\n\n挖矿手续费:{3}({4} 聪/Byte)\n交易大小:{5} Kb\n\n你想继续这个操作吗? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=确认解锁交易 -dao.bond.reputation.unlock.details=解锁金额:{0}\n解锁时间:{1} 区块(≈{2})\n\n挖矿手续费:{3}({4} 聪/Byte)\n交易大小:{5} Kb\n\n你想继续这个操作吗? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=所有担保 @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=验证 dao.proofOfBurn.message=消息 dao.proofOfBurn.sig=验证 dao.proofOfBurn.verify=确认 -dao.proofOfBurn.verify.header=使用烧毁证明交易中的密钥确认消息 dao.proofOfBurn.verificationResult.ok=确认成功 dao.proofOfBurn.verificationResult.failed=确认失败 @@ -1742,19 +1738,18 @@ dao.proposal.display.name=确切的 GitHub 的用户名 dao.proposal.display.link=详情的链接 dao.proposal.display.link.prompt=提案的链接 dao.proposal.display.requestedBsq=申请的 BSQ 数量 -dao.proposal.display.bsqAddress=BSQ 地址 dao.proposal.display.txId=提案交易 ID dao.proposal.display.proposalFee=提案手续费 dao.proposal.display.myVote=我的投票 dao.proposal.display.voteResult=投票结果总结 dao.proposal.display.bondedRoleComboBox.label=担保角色类型 dao.proposal.display.requiredBondForRole.label=角色需要的担保 -dao.proposal.display.tickerSymbol.label=份额编号 dao.proposal.display.option=选项 dao.proposal.table.header.proposalType=提议类型 dao.proposal.table.header.link=绑定 dao.proposal.table.header.myVote=我的投票 +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=移除 dao.proposal.table.icon.tooltip.removeProposal=移除我的提案 dao.proposal.table.icon.tooltip.changeVote=当前投票:“{0}”。更改投票至:“{1}” @@ -1790,27 +1785,18 @@ dao.wallet.dashboard.myBalance=我的钱包余额 dao.wallet.receive.fundYourWallet=你的 BSQ 接收地址 dao.wallet.receive.bsqAddress=BSQ 钱包地址(刷新未使用地址) -dao.wallet.receive.dao.headline=Bisq DAO -dao.wallet.receive.daoInfo=正如 Bisq 交易是分散的,并且不受审查,它的治理模型也是如此 — Bisq DAO 和 BSQ 是使其成为可能的工具。 -dao.wallet.receive.daoInfo.button=了解有关 Bisq DAO 的更多信息 -dao.wallet.receive.daoTestnetInfo=核心网络 Bisq DAO 还没有启动,但是您可以通过在测试网络上运行它来了解 Bisq DAO 。 -dao.wallet.receive.daoTestnetInfo.button=如何在我们的测试网络上运行 Bisq DAO -dao.wallet.receive.daoContributorInfo=如果您对 Bisq 有贡献,请使用下面的 BSQ 地址,并申请参与 BSQ 初始分发。 -dao.wallet.receive.daoContributorInfo.button=如何加入 BSQ 初始分发 - dao.wallet.send.sendFunds=提现 dao.wallet.send.sendBtcFunds=发送非 BSQ 资金(BTC) dao.wallet.send.amount=BSQ 数量 dao.wallet.send.btcAmount=BTC 数量(无 BSQ 资金) dao.wallet.send.setAmount=设置提现数量(最小量 {0}) -dao.wallet.send.setBtcAmount=设置 BTC 提现数量(最小量 {0}) dao.wallet.send.receiverAddress=接收者的 BSQ 地址 dao.wallet.send.receiverBtcAddress=接收者的 BTC 地址 dao.wallet.send.setDestinationAddress=输入您的目标地址 dao.wallet.send.send=发送 BSQ 资金 dao.wallet.send.sendBtc=发送 BTC 资金 dao.wallet.send.sendFunds.headline=确定提现申请 -dao.wallet.send.sendFunds.details=发送:{0}\n来自:{1}\n要求的交易费:{2}({3} 聪/byte)\n交易大小:{4} Kb\n\n收件人将收到:{5}\n\n您确定您想要提现这些数量吗? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=最新确认区块:{0} dao.wallet.chainHeightSyncing=等待区块... 已确认{0}/{1}区块 dao.wallet.tx.type=类型 @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=您没有足够的BTC资金来支付该 dao.proposal.create.missingIssuanceFunds=您没有足够的BTC资金来支付该提案交易。所有的 BSQ交易需要用 BTC 支付挖矿手续费以及发起交易也需要用 BTC 支付所需的 BSQ 数量({0} 聪/BSQ)\n缺少:{1} dao.feeTx.confirm=确认 {0} 交易 -dao.feeTx.confirm.details={0}手续费:{1}\n矿工手续费:{2}({3} 聪/byte)\n交易大小:{4} Kb\n\n您确定您要发送这个 {5} 交易吗? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0}手续费:{1}\n为 BSQ 提案所需要的BTC:{2}({3}聪 / BSQ)\n挖矿手续费:{4}({5}聪 /字节)\n交易大小:{6}Kb\n\n如果你的要求被批准,你将收到你要求数量的 2 个 BSQ 提议的费用。\n\n你确定你想要发布{7}交易? +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=Bisq DAO dao.news.bisqDAO.description=正如 Bisq交易是分散的,并且不受审查,它的治理模型也是如此—— Bisq DAO 和 BSQ 是使其成为可能的工具。 @@ -1940,21 +1926,19 @@ dao.monitor.blindVote.table.numBlindVotes=匿名投票编号 dao.factsAndFigures.menuItem.supply=BSQ 供给 dao.factsAndFigures.menuItem.transactions=BSQ 交易 -dao.factsAndFigures.dashboard.marketPrice=市场数据 -dao.factsAndFigures.dashboard.price=最新的 BSQ/BTC 的市场价(在 Bisq) dao.factsAndFigures.dashboard.avgPrice90=90天平均 BSQ/BTC 交易价格 dao.factsAndFigures.dashboard.avgPrice30=30天平均 BSQ/BTC 交易价格 dao.factsAndFigures.dashboard.avgUSDPrice90=90 天成交量加权平均 USD/BSQ 交易价格 dao.factsAndFigures.dashboard.avgUSDPrice30=30 天成交量加权平均 USD/BSQ 交易价格 dao.factsAndFigures.dashboard.marketCap=市值(基于市场价) -dao.factsAndFigures.dashboard.availableAmount=总共可用的 BSQ +dao.factsAndFigures.dashboard.availableAmount=总共可用的 BSQ dao.factsAndFigures.supply.issuedVsBurnt=已发放的 BSQ 已销毁的 BSQ dao.factsAndFigures.supply.issued=已发放的 BSQ dao.factsAndFigures.supply.genesisIssueAmount=在初始交易中心有问题的 BSQ -dao.factsAndFigures.supply.compRequestIssueAmount=报偿申请发放的 BSQ -dao.factsAndFigures.supply.reimbursementAmount=退还申请发放的 BSQ +dao.factsAndFigures.supply.compRequestIssueAmount=报偿申请发放的 BSQ +dao.factsAndFigures.supply.reimbursementAmount=退还申请发放的 BSQ dao.factsAndFigures.supply.burnt=BSQ 烧毁总量 dao.factsAndFigures.supply.burntMovingAverage=15天动态平均线 @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=交易金额支付 disputeSummaryWindow.payout.getsTradeAmount=BTC {0} 获得交易金额支付 disputeSummaryWindow.payout.getsAll=BTC {0} 获取全部 disputeSummaryWindow.payout.custom=自定义支付 -disputeSummaryWindow.payout.adjustAmount=输入金额超过 {0} 的可用金额。\n我们将此输入字段调整为最大可能值。 disputeSummaryWindow.payoutAmount.buyer=买家支付金额 disputeSummaryWindow.payoutAmount.seller=卖家支付金额 disputeSummaryWindow.payoutAmount.invert=使用失败者作为发布者 @@ -2055,21 +2038,24 @@ disputeSummaryWindow.addSummaryNotes=添加总结说明 disputeSummaryWindow.close.button=关闭话题 # Do no change any line break or order of tokens as the structure is used for signature verification -disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.msg=工单已关闭{0}\n{1} 节点地址:{12}\n\n总结:\n交易 ID:{3}\n货币:{4}\n交易金额:{5}\nBTC 买家支付金额:{6}\nBTC 卖家支付金额:{7}\n\n纠纷原因:{8}\n\n总结:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification disputeSummaryWindow.close.msgWithSig={0}{1}{2}{3} -disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and accept or reject suggestion from mediator -disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions +disputeSummaryWindow.close.nextStepsForMediation=\n\n下一个步骤:\n打开未完成交易,接受或拒绝建议的调解员的建议 +disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\n\n下一个步骤:\n不需要您采取进一步的行动。如果仲裁员做出了对你有利的裁决,你将在 资金/交易 页中看到“仲裁退款”交易 disputeSummaryWindow.close.closePeer=你也需要关闭交易对象的话题! disputeSummaryWindow.close.txDetails.headline=发布交易退款 +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=买方收到{0}在地址:{1} +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=卖方收到{0}在地址:{1} -disputeSummaryWindow.close.txDetails=费用:{0}\n{1}{2}交易费:{3}({4}satoshis/byte)\n事务大小:{5} Kb\n\n您确定要发布此事务吗? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? -disputeSummaryWindow.close.noPayout.headline=Close without any payout -disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? +disputeSummaryWindow.close.noPayout.headline=未支付关闭 +disputeSummaryWindow.close.noPayout.text=你想要在未作支付的情况下关闭吗? emptyWalletWindow.headline={0} 钱包急救工具 emptyWalletWindow.info=请在紧急情况下使用,如果您无法从 UI 中访问您的资金。\n\n请注意,使用此工具时,所有未结报价将自动关闭。\n\n在使用此工具之前,请备份您的数据目录。您可以在“帐户/备份”中执行此操作。\n\n请报告我们您的问题,并在 Github 或 Bisq 论坛上提交错误报告,以便我们可以调查导致问题的原因。 @@ -2101,6 +2087,7 @@ filterWindow.btcNode=筛选后的比特币节点(用逗号“,”隔开的地 filterWindow.preventPublicBtcNetwork=禁止使用公共比特币网络 filterWindow.disableDao=禁用 DAO filterWindow.disableAutoConf=禁用自动确认 +filterWindow.autoConfExplorers=已过滤自动确认浏览器(逗号分隔地址) filterWindow.disableDaoBelowVersion=DAO 最低所需要的版本 filterWindow.disableTradeBelowVersion=交易最低所需要的版本 filterWindow.add=添加筛选 @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=选择纠纷的存款交易 selectDepositTxWindow.msg=存款交易未存储在交易中。\n请从您的钱包中选择一个现有的多重验证交易,这是在失败的交易中使用的存款交易。\n\n您可以通过打开交易详细信息窗口(点击列表中的交易 ID)并按照交易费用支付交易输出到您看到多重验证存款交易的下一个交易(地址从3开始),找到正确的交易。 该交易 ID 应在此处列出的列表中显示。 一旦您找到正确的交易,请在此处选择该交易并继续\n\n抱歉给您带来不便,但是错误的情况应该非常罕见,将来我们会尝试找到更好的解决方法。 selectDepositTxWindow.select=选择存款交易 -selectBaseCurrencyWindow.headline=交易所选择 -selectBaseCurrencyWindow.msg=您选择的默认交易所是 {0}。\n\n从下拉项里更换您想要的基础币种。\n您也可以稍后在“设置/偏好”更换基础币种。 -selectBaseCurrencyWindow.select=选择基础币种 - sendAlertMessageWindow.headline=发送全球通知 sendAlertMessageWindow.alertMsg=提醒消息 sendAlertMessageWindow.enterMsg=输入消息: @@ -2230,11 +2213,10 @@ error.closedTradeWithUnconfirmedDepositTx=交易 ID 为 {0} 的已关闭交易 error.closedTradeWithNoDepositTx=交易 ID 为 {0} 的保证金交易已被确认。\n\n请重新启动应用程序来清理已关闭的交易列表。 popup.warning.walletNotInitialized=钱包至今未初始化 -popup.warning.osxKeyLoggerWarning=由于 MacOS 10.14 及更高版本中的安全措施更加严格,因此启动 Java 应用程序(Bisq 使用Java)会在 MacOS 中引发弹出警告(``Bisq 希望从任何应用程序接收击键'').\n\n为了避免该问题,请打开“ MacOS 设置”,然后转到“安全和隐私”->“隐私”->“输入监视”,然后从右侧列表中删除“ Bisq”。\n\n一旦解决了技术限制(所需的 Java 版本的 Java 打包程序尚未交付),Bisq将升级到新的 Java 版本,以避免该问题。 +popup.warning.osxKeyLoggerWarning=由于 MacOS 10.14 及更高版本中的安全措施更加严格,因此启动 Java 应用程序(Bisq 使用Java)会在 MacOS 中引发弹出警告(``Bisq 希望从任何应用程序接收击键'').\n\n为了避免该问题,请打开“ MacOS 设置”,然后转到“安全和隐私”->“隐私”->“输入监视”,然后从右侧列表中删除“ Bisq”。\n\n一旦解决了技术限制(所需的 Java 版本的 Java 打包程序尚未交付),Bisq将升级到新的 Java 版本,以避免该问题。 popup.warning.wrongVersion=您这台电脑上可能有错误的 Bisq 版本。\n您的电脑的架构是:{0}\n您安装的 Bisq 二进制文件是:{1}\n请关闭并重新安装正确的版本({2})。 popup.warning.incompatibleDB=我们检测到不兼容的数据库文件!\n\n那些数据库文件与我们当前的代码库不兼容:\n{0}\n\n我们对损坏的文件进行了备份,并将默认值应用于新的数据库版本。\n\n备份位于:\n{1}/db/backup_of_corrupted_data。\n\n请检查您是否安装了最新版本的 Bisq\n您可以下载:\nhttps://bisq.network/downloads\n\n请重新启动应用程序。 popup.warning.startupFailed.twoInstances=Bisq 已经在运行。 您不能运行两个 Bisq 实例。 -popup.warning.cryptoTestFailed=看起来你使用自编译的二进制文件,并且没有遵循 https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys\n\n如果不是这种情况,并且使用官方的 Bisq 二进制文件,请向 Github 页面提交错误报告。\n错误={0} popup.warning.tradePeriod.halfReached=您与 ID {0} 的交易已达到最长交易期的一半,且仍未完成。\n\n交易期结束于 {1}\n\n请查看“业务/未完成交易”的交易状态,以获取更多信息。 popup.warning.tradePeriod.ended=您与 ID {0} 的已达到最长交易期,且未完成。\n\n交易期结束于 {1}\n\n请查看“业务/未完成交易”的交易状态,以从调解员获取更多信息。 popup.warning.noTradingAccountSetup.headline=您还没有设置交易账户 @@ -2258,7 +2240,9 @@ popup.warning.noBsqFundsForBtcFeePayment=您的 BSQ 钱包没有足够的资金 popup.warning.messageTooLong=您的信息超过最大允许的大小。请将其分成多个部分发送,或将其上传到 https://pastebin.com 之类的服务器。 popup.warning.lockedUpFunds=你已经从一个失败的交易中冻结了资金。\n冻结余额:{0}\n存款tx地址:{1}\n交易单号:{2}\n\n请通过选择待处理交易界面中的交易并点击“alt + o”或“option+ o”打开帮助话题。 +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=其中一个 {0} 节点已被禁用 +# suppress inspection "UnusedProperty" popup.warning.priceRelay=价格传递 popup.warning.seed=种子 popup.warning.mandatoryUpdate.trading=请更新到最新的 Bisq 版本。强制更新禁止了旧版本进行交易。更多信息请访问 Bisq 论坛。 @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=使用 ID {1} 进行交易的 {0} 交易被比特 popup.warning.openOfferWithInvalidMakerFeeTx=交易 ID 为 {0} 的挂单费交易无效。\n交易 ID = {1}。\n请到“设置/网络信息”进行 SPV 重新同步。\n如需更多帮助,请联系 Bisq Keybase 团队的 Support 频道 -popup.warning.trade.depositTxNull=交易 ID 为 {0} 没有设置保证金交易。\n\n请重新启动应用程序以检查是否仍然存在上述问题。\n\n如果问题仍然存在,请点击交易 ID 打开交易详情弹窗。然后点击买家手续费交易的交易 ID 和卖家的交易 ID 以在区块浏览器中了解详情。一个交易如果不能在区块浏览器中查询则很可能是一个无效交易。\n\n如果发生,请报告在 Keybase 中 Bisq 团队(https://keybase.io/team/bisq)中的 #support 频道。如果你的交易手续费交易不存在,且没有资金在钱包中,你可以将交易移至失败交易,然后使用 SPV 重新同步以让资金重现(下方有详细步骤)\n\n如果你的交易手续费交易存在,这些手续费会丢失,您还可以在 GitHub 上的支持库中提出报销请求(https://github.com/bisq-network/support/issues)。\n\n在这两种情况下,请做一个 SPV 重新同步从“设置/网络”页面,以解决您的钱包任何问题! - -popup.warning.trade.depositTxNull.moveToFailedTrades=移至失败交易 -popup.warning.trade.depositTxNull.shutDown=关闭 Bisq - popup.info.securityDepositInfo=为了确保双方都遵守交易协议,双方都需要支付保证金。\n\n这笔存款一直保存在您的交易钱包里,直到您的交易成功完成,然后再退还给您。\n\n请注意:如果您正在创建一个新的报价,Bisq 需要运行另一个交易员接受它。为了让您的报价在线,保持 Bisq 运行,并确保这台计算机也在线(即,确保它没有切换到待机模式…显示器可以待机)。 popup.info.cashDepositInfo=请确保您在您的地区有一个银行分行,以便能够进行现金存款。\n卖方银行的银行 ID(BIC/SWIFT)为:{0}。 popup.info.cashDepositInfo.confirm=我确认我可以支付保证金 popup.info.shutDownWithOpenOffers=Bisq 正在被关闭,但仍有公开的报价。\n\n当 Bisq 关闭时,这些提供将不能在 P2P 网络上使用,但是它们将在您下次启动 Bisq 时重新发布到 P2P 网络上。\n\n为了让您的报价在线,保持 Bisq 运行,并确保这台计算机也在线(即,确保它不会进入待机模式…显示器待机不是问题)。 -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=你似乎好像在 Qubes OS 上运行 Bisq。\n\n请确保您的 Bisq qube 是参考设置指南的说明设置的 https://bisq.wiki/Running_Bisq_on_Qubes popup.privateNotification.headline=重要私人通知! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=交易 ID {0} 需要注意 popup.info.multiplePaymentAccounts.headline=多个支付账户可用 popup.info.multiplePaymentAccounts.msg=您有多个支付帐户在这个报价中可用。请确你做了正确的选择。 -popup.news.launch.headline=两个重要更新 -popup.news.launch.accountSigning.headline=账户验证 -popup.news.launch.accountSigning.description=提高0.01 BTC 的法币交易限制,从认证的交易者购买 BTC。 -popup.news.launch.ntp.headline=新的交易协议 -popup.news.launch.ntp.description=新的两级争端解决系统使 Bisq 更安全、可扩展、更能抵抗审查。 - popup.accountSigning.selectAccounts.headline=选择付款账户 popup.accountSigning.selectAccounts.description=根据付款方式和时间点,所有与支付给买方的付款发生的争议有关的付款帐户将被选择让您验证。 popup.accountSigning.selectAccounts.signAll=验证所有付款方式 @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=未能成功验证证据,{ popup.accountSigning.unsignedPubKeys.headline=未验证公钥 popup.accountSigning.unsignedPubKeys.sign=验证公钥 popup.accountSigning.unsignedPubKeys.signed=公钥已被验证 -popup.accountSigning.unsignedPubKeys.result.headline=验证已完成 popup.accountSigning.unsignedPubKeys.result.signed=已验证公钥 popup.accountSigning.unsignedPubKeys.result.failed=未能验证公钥 @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq:去中心化比特币交易网络 # GUI Util #################################################################### -guiUtil.miningFeeInfo=请确保您的外部钱包使用的矿工手续费费用足够高至少为 {0} ,以便矿工接受资金交易。\n否则交易所交易无法确认,交易最终将会出现纠纷。 +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=交易账户保存在路径:\n{0} guiUtil.accountExport.noAccountSetup=您没有交易账户设置导出。 @@ -2422,7 +2394,7 @@ peerInfoIcon.tooltip.age=支付账户在 {0} 前创建。 peerInfoIcon.tooltip.unknownAge=支付账户账龄未知。 tooltip.openPopupForDetails=打开弹出窗口的详细信息 -tooltip.invalidTradeState.warning=This trade is in an invalid state. Open the details window for more information +tooltip.invalidTradeState.warning=这个交易处于不可用状态。打开详情窗口以发现更多细节。 tooltip.openBlockchainForAddress=使用外部区块链浏览器打开地址:{0} tooltip.openBlockchainForTx=使用外部区块链浏览器打开交易:{0} @@ -2447,8 +2419,8 @@ addressTextField.openWallet.failed=打开默认的比特币钱包应用程序失 peerInfoIcon.tooltip={0}\n标识:{1} txIdTextField.copyIcon.tooltip=复制交易 ID 到剪贴板 -txIdTextField.blockExplorerIcon.tooltip=Open a blockchain explorer with this transaction ID -txIdTextField.missingTx.warning.tooltip=Missing required transaction +txIdTextField.blockExplorerIcon.tooltip=使用外部区块链浏览器打开这个交易 ID +txIdTextField.missingTx.warning.tooltip=所需的交易缺失 #################################################################### @@ -2457,12 +2429,13 @@ txIdTextField.missingTx.warning.tooltip=Missing required transaction navigation.account=“账户” navigation.account.walletSeed=“账户/钱包密钥” -navigation.funds.availableForWithdrawal=\"Funds/Send funds\" +navigation.funds.availableForWithdrawal=“资金/提现” navigation.portfolio.myOpenOffers=“资料/未完成报价” navigation.portfolio.pending=“业务/未完成交易” navigation.portfolio.closedTrades=“资料/历史” navigation.funds.depositFunds=“资金/收到资金” navigation.settings.preferences=“设置/偏好” +# suppress inspection "UnusedProperty" navigation.funds.transactions=“资金/交易记录” navigation.support=“帮助” navigation.dao.wallet.receive=“DAO/BSQ 钱包/接收” @@ -2525,11 +2498,11 @@ password.deriveKey=从密码中提取密钥 password.walletDecrypted=钱包成功解密并移除密码保护 password.wrongPw=你输入了错误的密码。\n\n请再次尝试输入密码,仔细检查拼写错误。 password.walletEncrypted=钱包成功加密并开启密码保护。 -password.walletEncryptionFailed=无法设置钱包密码。您可能导入了与钱包数据库不匹配的还原密钥。请在 Bisq 论坛上与开发者联系。 +password.walletEncryptionFailed=无法设置钱包密码。您可能导入了与钱包数据库不匹配的还原密钥。请在 Keybase 上联系开发者(https://keybase.io/team/bisq]) password.passwordsDoNotMatch=这2个密码您输入的不相同 password.forgotPassword=忘记密码? password.backupReminder=请注意,设置钱包密码时,所有未加密的钱包的自动创建的备份将被删除。\n\n强烈建议您备份应用程序的目录,并在设置密码之前记下您的还原密钥! -password.backupWasDone=我已经备份了 +password.backupWasDone=我已备份 seed.seedWords=钱包密钥 seed.enterSeedWords=输入钱包密钥 @@ -2537,7 +2510,7 @@ seed.date=钱包时间 seed.restore.title=使用还原密钥恢复钱包 seed.restore=恢复钱包 seed.creationDate=创建时间 -seed.warn.walletNotEmpty.msg=你的比特币钱包不是空的。\n\n在尝试恢复较旧的钱包之前,您必须清空此钱包,因为将钱包混在一起会导致无效的备份。\n\n请完成您的交易,关闭所有您的未完成报价,并转到资金界面撤回您的比特币。\n如果您无法访问您的比特币,您可以使用紧急工具清空钱包。\n要打开该应急工具,请按“alt + e”或“option + e” 。 +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=无论如何我要恢复 seed.warn.walletNotEmpty.emptyWallet=我先清空我的钱包 seed.warn.notEncryptedAnymore=你的钱包被加密了。\n\n恢复后,钱包将不再加密,您必须设置新的密码。\n\n你要继续吗? @@ -2578,12 +2551,11 @@ payment.altcoin.address=数字货币地址 payment.altcoin.tradeInstantCheckbox=使用数字货币进行即时交易( 1 小时内) payment.altcoin.tradeInstant.popup=对于即时交易,要求交易双方都在线,能够在不到1小时内完成交易。\n \n如果你已经有未完成的报价以及你不能即时完成,请在资料页面禁用这些报价。 payment.altcoin=数字货币 -payment.select.altcoin=选择或搜索数字货币 +payment.select.altcoin=Select or search Altcoin payment.secret=密保问题 payment.answer=答案 payment.wallet=钱包 ID payment.uphold.accountId=用户名或电子邮箱或电话号码 -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=电子邮箱或者电话号码 payment.venmo.venmoUserName=Venmo 用户名: payment.popmoney.accountId=电子邮箱或者电话号码 @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=公民身份证/税号或电话号码 payment.supportedCurrencies=支持的货币 payment.limitations=限制条件 payment.salt=帐户年龄验证盐值 -payment.error.noHexSalt=盐值需要十六进制的。\n如果您想要从旧帐户转移盐值以保留帐龄,只建议编辑盐值字段。帐龄通过帐户盐值和识别帐户数据(例如 IBAN )来验证。 +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=接受来自这些欧元国家的交易 payment.accept.nonEuro=接受来自这些非欧元国家的交易 payment.accepted.countries=接受的国家 @@ -2627,29 +2599,31 @@ payment.savings=保存 payment.personalId=个人 ID payment.clearXchange.info=Zelle是一项转账服务,转账到其他银行做的很好。\n\n1.检查此页面以查看您的银行是否(以及如何)与 Zelle 合作:\nhttps://www.zellepay.com/get-started\n\n2.特别注意您的转账限额-汇款限额因银行而异,银行通常分别指定每日,每周和每月的限额。\n\n3.如果您的银行不能使用 Zelle,您仍然可以通过 Zelle 移动应用程序使用它,但是您的转账限额会低得多。\n\n4.您的 Bisq 帐户上指定的名称必须与 Zelle/银行帐户上的名称匹配。 \n\n如果您无法按照贸易合同中的规定完成 Zelle 交易,则可能会损失部分(或全部)保证金。\n\n由于 Zelle 的拒付风险较高,因此建议卖家通过电子邮件或 SMS 与未签名的买家联系,以确认买家确实拥有 Bisq 中指定的 Zelle 帐户。 payment.fasterPayments.newRequirements.info=有些银行已经开始核实快捷支付收款人的全名。您当前的快捷支付帐户没有填写全名。\n\n请考虑在 Bisq 中重新创建您的快捷支付帐户,为将来的 {0} 买家提供一个完整的姓名。\n\n重新创建帐户时,请确保将银行区号、帐户编号和帐龄验证盐值从旧帐户复制到新帐户。这将确保您现有的帐龄和签名状态得到保留。 -payment.moneyGram.info=使用 MoneyGram 时,BTC 买方必须将授权号码和收据的照片通过电子邮件发送给 BTC 卖方。收据必须清楚地显示卖方的全名、国家或地区、州和金额。买方将在交易过程中显示卖方的电子邮件。 -payment.westernUnion.info=使用 Western Union 时,BTC 买方必须通过电子邮件将 MTCN(运单号)和收据照片发送给 BTC 卖方。收据上必须清楚地显示卖方的全名、城市、国家或地区和金额。买方将在交易过程中显示卖方的电子邮件。 +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=使用 HalCash 时,BTC 买方需要通过手机短信向 BTC 卖方发送 HalCash 代码。\n\n请确保不要超过银行允许您用半现金汇款的最高金额。每次取款的最低金额是 10 欧元,最高金额是 10 欧元。金额是 600 欧元。对于重复取款,每天每个接收者 3000 欧元,每月每个接收者 6000 欧元。请与您的银行核对这些限额,以确保它们使用与此处所述相同的限额。\n\n提现金额必须是 10 欧元的倍数,因为您不能从 ATM 机提取其他金额。 创建报价和下单屏幕中的 UI 将调整 BTC 金额,使 EUR 金额正确。你不能使用基于市场的价格,因为欧元的数量会随着价格的变化而变化。\n -payment.limits.info=请注意,所有银行转账都有一定的退款风险。\n\n为了降低这一风险,Bisq 基于两个因素对每笔交易设置了限制:\n\n1. 使用的付款方法的预估退款风险水平\n2. 您的付款方式的账龄\n\n您现在创建的帐户是新的,它的账龄为零。随着你的账龄增长,你的每笔交易限额也会随之增长:\n\n●在第一个月,您的每笔交易限额为 {0}\n●在第二个月,您的每笔交易限额将为 {1}\n●第二个月后,您的每笔交易限额为 {2}\n\n请注意:限制只应用在单笔交易,你可以尽可能多的进行交易。 -payment.limits.info.withSigning=为了降低这一风险,Bisq 基于两个因素对该付款方式每笔交易设置了限制:\n\n1. 使用的付款方法的预估退款风险水平\n2. 您的付款方式的账龄\n\n这个付款账户还没有被验证,所以他每个交易最多购买{0}。在验证之后,购买限制会以以下规则逐渐增加:\n\n●签署前,以及签署后30天内,您的每笔最大交易将限制为{0}\n●签署后30天,每笔最大交易将限制为{1}\n●签署后60天,每笔最大交易将限制为{2}\n\n出售限制不会被账户验证状态限制,会与随着您的账龄增加\n\n查看更多:\nhttps://bisq.wiki/Account_limits\n\n请注意:限制只应用在单笔交易,你可以尽可能多的进行交易。 +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=请确认您的银行允许您将现金存款汇入他人账户。例如,美国银行和富国银行不再允许此类存款。 payment.revolut.info=Revolut 要求使用“用户名”作为帐户 ID,而不是像以往的电话号码或电子邮件。 -payment.account.revolut.addUserNameInfo={0}\n您现有的 Revolut 帐户({1})尚未设置“用户名”。\n请输入您的 Revolut ``用户名''以更新您的帐户数据。\n这不会影响您的账龄验证状态。 +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=更新 Revolut 账户 payment.usPostalMoneyOrder.info=在 Bisq 上交易 US Postal Money Orders (USPMO)您必须理解下述条款:\n\n- BTC 买方必须在发送方和收款人字段中都写上 BTC 卖方的名称,并在发送之前对 USPMO 和信封进行高分辨率照片拍照,并带有跟踪证明。\n- BTC 买方必须将 USPMO 连同交货确认书一起发送给 BTC 卖方。\n\n如果需要调解,或有交易纠纷,您将需要将照片连同 USPMO 编号,邮局编号和交易金额一起发送给 Bisq 调解员或退款代理,以便他们进行验证美国邮局网站上的详细信息。\n\n如未能提供要求的交易数据将在纠纷中直接判负\n\n在所有争议案件中,USPMO 发送方在向调解人或仲裁员提供证据/证明时承担 100% 的责任。\n\n如果您不理解这些要求,请不要在 Bisq 上使用 USPMO 进行交易。 payment.f2f.contact=联系方式 -payment.f2f.contact.prompt=您希望如何与交易伙伴联系?(电子邮箱、电话号码、…) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=“面对面”会议的城市 payment.f2f.city.prompt=城市将与报价一同显示 payment.f2f.optionalExtra=可选的附加信息 payment.f2f.extra=附加信息 payment.f2f.extra.prompt=交易方可以定义“条款和条件”或添加公共联系信息。它将与报价一同显示。 -payment.f2f.info=与网上交易相比,“面对面”交易有不同的规则,也有不同的风险。\n\n主要区别是:\n●交易伙伴需要使用他们提供的联系方式交换关于会面地点和时间的信息。\n●交易双方需要携带笔记本电脑,在会面地点确认“已发送付款”和“已收到付款”。\n●如果交易方有特殊的“条款和条件”,他们必须在账户的“附加信息”文本框中声明这些条款和条件。\n●在发生争议时,调解员或仲裁员不能提供太多帮助,因为通常很难获得有关会面上所发生情况的篡改证据。在这种情况下,BTC 资金可能会被无限期锁定,或者直到交易双方达成协议。\n\n为确保您完全理解“面对面”交易的不同之处,请阅读以下说明和建议:“https://docs.bisq.network/trading-rules.html#f2f-trading” +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=打开网页 payment.f2f.offerbook.tooltip.countryAndCity=国家或地区及城市:{0} / {1} payment.f2f.offerbook.tooltip.extra=附加信息:{0} @@ -2658,6 +2632,10 @@ payment.japan.bank=银行 payment.japan.branch=分行 payment.japan.account=账户 payment.japan.recipient=名称 +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=西联汇款 F2F=面对面(当面交易) JAPAN_BANK=日本银行汇款 +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=国内银行 @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=西联汇款 F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=不允许输入0。 validation.negative=不允许输入负值。 validation.fiat.toSmall=不允许输入比最小可能值还小的数值。 validation.fiat.toLarge=不允许输入比最大可能值还大的数值。 -validation.btc.fraction=此充值将会造成产生微量(聪)级别的比特币数量。 +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=不允许充值大于{0} validation.btc.toSmall=不允许充值小于{0} -validation.securityDeposit.toSmall=不允许充值小于{0} -validation.passwordTooShort=你输入的密码太短。最少8个字符。 +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=你输入的密码太长。最长不要超过50个字符。 validation.sortCodeNumber={0} 必须由 {1} 个数字构成。 validation.sortCodeChars={0} 必须由 {1} 个字符构成。 @@ -2822,32 +2810,37 @@ validation.nationalAccountId={0} 必须由{1}个数字组成。 #new validation.invalidInput=输入无效:{0} validation.accountNrFormat=帐号必须是格式:{0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=地址验证失败,因为它与 {0} 地址的结构不匹配。 -validation.altcoin.ltz.zAddressesNotSupported=LTZ 地址需要以 L 开头。 不支持以 Z 开头的地址。 -validation.altcoin.zAddressesNotSupported=ZEC 地址需要以 t 开头。 不支持以z开头的地址。 +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=这个地址不是有效的{0}地址!{1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=不支持本地 segwit 地址(以“lq”开头的地址)。 -validation.bic.invalidLength=输入长度既不是8也不是11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=必须输入银行和国家或地区代码 validation.bic.invalidLocationCode=BIC 包含无效的地址代码 validation.bic.invalidBranchCode=BIC 包含无效的分行代码 validation.bic.sepaRevolutBic=不支持 Revolut Sepa 账户 -validation.btc.invalidFormat=无效格式的比特币地址 -validation.bsq.invalidFormat=无效格式的 BSQ 地址 +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=无效地址 validation.iban.invalidCountryCode=国家或地区代码无效 validation.iban.checkSumNotNumeric=校验必须是数字 validation.iban.nonNumericChars=检测到非字母数字字符 validation.iban.checkSumInvalid=IBAN 校验无效 -validation.iban.invalidLength=数字的长度必须为15到34个字符。 +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=非加拿大区号 -validation.interacETransfer.invalidPhone=电话号码格式无效并且不是电子邮件地址 +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=必须只包含字母、数字、空格和/或符号“_ , . ? -” validation.interacETransfer.invalidAnswer=必须是一个单词,只包含字母、数字和/或符号- validation.inputTooLarge=输入不能大于 {0} validation.inputTooSmall=输入必须大于 {0} validation.inputToBeAtLeast=输入必须至少为 {0} -validation.amountBelowDust=不允许低于 {0} 聪的零头限制。 +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=长度必须在 {0} 和 {1} 之间 validation.pattern=输入格式必须为:{0} validation.noHexString=输入不是十六进制格式。 @@ -2859,7 +2852,7 @@ validation.numberFormatException=数字格式异常 {0} validation.mustNotBeNegative=不能输入负值 validation.phone.missingCountryCode=需要两个字母的国家或地区代码来验证电话号码 validation.phone.invalidCharacters=电话号码 {0} 包含无效字符 -validation.phone.insufficientDigits={0} 中没有足够的数字作为有效的电话号码 -validation.phone.tooManyDigits={0} 中的数字太多,不是有效的电话号码 -validation.phone.invalidDialingCode=数字 {0} 中的国际拨号代码对于 {1} 无效。正确的拨号号码是 {2} 。 +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=使用逗号分隔有效地址列表 diff --git a/core/src/main/resources/i18n/displayStrings_zh-hant.properties b/core/src/main/resources/i18n/displayStrings_zh-hant.properties index fad923f2c7..98e92d5782 100644 --- a/core/src/main/resources/i18n/displayStrings_zh-hant.properties +++ b/core/src/main/resources/i18n/displayStrings_zh-hant.properties @@ -52,6 +52,7 @@ shared.P2P=P2P shared.oneOffer=報價 shared.multipleOffers=報價 shared.Offer=報價 +shared.offerVolumeCode={0} Offer Volume shared.openOffers=可用報價 shared.trade=交易 shared.trades=交易 @@ -68,11 +69,11 @@ shared.buyerSecurityDeposit=買家保證金 shared.sellerSecurityDeposit=賣家保證金 shared.amountWithCur={0} 數量 shared.volumeWithCur={0} 總量 -shared.currency=貨幣類型 -shared.market=交易項目 +shared.currency=貨幣型別 +shared.market=交易專案 shared.paymentMethod=付款方式 shared.tradeCurrency=交易貨幣 -shared.offerType=報價類型 +shared.offerType=報價型別 shared.details=詳情 shared.address=地址 shared.balanceWithCur={0} 餘額 @@ -122,7 +123,8 @@ shared.noDateAvailable=沒有可用資料 shared.noDetailsAvailable=沒有可用詳細 shared.notUsedYet=尚未使用 shared.date=日期 -shared.sendFundsDetailsWithFee=傳送:{0}\n來自:{1}\n接收地址:{2}\n要求的最低交易費:{3}({4} 聰/byte)\n交易大小:{5} Kb\n\n收款方將收到:{6}\n\n您確定您想要提現嗎? +shared.sendFundsDetailsWithFee=Sending: {0}\nFrom address: {1}\nTo receiving address: {2}.\nRequired mining fee is: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nThe recipient will receive: {6}\n\nAre you sure you want to withdraw this amount? +# suppress inspection "TrailingSpacesInProperty" shared.sendFundsDetailsDust=Bisq 檢測到,該交易將產生一個低於最低零頭閾值的輸出(不被比特幣共識規則所允許)。相反,這些零頭({0}satoshi{1})將被新增到挖礦手續費中。 shared.copyToClipboard=複製到剪貼簿 shared.language=語言 @@ -188,7 +190,6 @@ shared.tradeWalletAddress=交易錢包地址 shared.tradeWalletBalance=交易錢包餘額 shared.makerTxFee=賣家:{0} shared.takerTxFee=買家:{0} -shared.securityDepositBox.description=BTC 保證金 {0} shared.iConfirm=我確認 shared.tradingFeeInBsqInfo=相當於使用 {0} 交易手續費 shared.openURL=開啟 {0} @@ -214,8 +215,8 @@ shared.mediator=調解員 shared.arbitrator=仲裁員 shared.refundAgent=仲裁員 shared.refundAgentForSupportStaff=退款助理 -shared.delayedPayoutTxId=Delayed payout transaction ID -shared.delayedPayoutTxReceiverAddress=Delayed payout transaction sent to +shared.delayedPayoutTxId=延遲支付交易 ID +shared.delayedPayoutTxReceiverAddress=延遲交易交易已傳送至 shared.unconfirmedTransactionsLimitReached=你現在有過多的未確認交易。請稍後嘗試 @@ -227,7 +228,7 @@ shared.unconfirmedTransactionsLimitReached=你現在有過多的未確認交易 # MainView #################################################################### -mainView.menu.market=交易項目 +mainView.menu.market=交易專案 mainView.menu.buyBtc=買入 BTC mainView.menu.sellBtc=賣出 BTC mainView.menu.portfolio=業務 @@ -237,8 +238,6 @@ mainView.menu.settings=設定 mainView.menu.account=賬戶 mainView.menu.dao=DAO -mainView.marketPrice.provider=價格提供者 -mainView.marketPrice.label=交易所價格 mainView.marketPriceWithProvider.label=交易所價格提供商:{0} mainView.marketPrice.bisqInternalPrice=最新 Bisq 交易的價格 mainView.marketPrice.tooltip.bisqInternalPrice=外部交易所供應商沒有可用的市場價格。\n顯示的價格是該貨幣的最新 Bisq 交易價格。 @@ -251,14 +250,15 @@ mainView.balance.locked.short=凍結 mainView.footer.usingTor=(使用 Tor 中) mainView.footer.localhostBitcoinNode=(本地主機) -mainView.footer.btcInfo=比特幣網路節點:{0} / {1} {2} +mainView.footer.btcInfo={0} {1} {2} +mainView.footer.btcFeeRate=/ Current fee rate: {0} sat/vB mainView.footer.btcInfo.initializing=連線至比特幣網路 mainView.footer.bsqInfo.synchronizing=正在同步 DAO mainView.footer.btcInfo.synchronizingWith=正在同步至 -mainView.footer.btcInfo.synchronizedWith=已同步至 +mainView.footer.btcInfo.synchronizedWith=Synced with mainView.footer.btcInfo.connectingTo=連線至 mainView.footer.btcInfo.connectionFailed=連線失敗: -mainView.footer.p2pInfo=Bisq 網路對等點:{0} +mainView.footer.p2pInfo=Bitcoin network peers: {0} / Bisq network peers: {1} mainView.footer.daoFullNode=DAO 全節點 mainView.bootstrapState.connectionToTorNetwork=(1/4) 連線至 Tor 網路... @@ -292,7 +292,6 @@ market.tabs.spread=詳情 market.tabs.trades=行情圖 # OfferBookChartView -market.offerBook.chart.title={0} 的報價列表 market.offerBook.buyAltcoin=我想要買入 {0}(賣出 {1}) market.offerBook.sellAltcoin=我想要賣出 {0}(買入 {1}) market.offerBook.buyWithFiat=購買 {0} @@ -337,22 +336,22 @@ offerbook.offerersAcceptedBankSeats=接受的銀行所在國家(買家):\n offerbook.availableOffers=可用報價 offerbook.filterByCurrency=以貨幣篩選 offerbook.filterByPaymentMethod=以支付方式篩選 -offerbook.timeSinceSigning=Signed since +offerbook.timeSinceSigning=已驗證,從 offerbook.timeSinceSigning.info=此賬戶已驗證,{0} offerbook.timeSinceSigning.info.arbitrator=由仲裁員驗證,並可以驗證夥伴賬戶 offerbook.timeSinceSigning.info.peer=由對方驗證,等待限制被解除 offerbook.timeSinceSigning.info.peerLimitLifted=由對方驗證,限制被取消 offerbook.timeSinceSigning.info.signer=由對方驗證,並可驗證對方賬戶(限制已取消) -offerbook.timeSinceSigning.info.banned=帳號已被封禁 +offerbook.timeSinceSigning.info.banned=賬戶已被封禁 offerbook.timeSinceSigning.daysSinceSigning={0} 天 offerbook.timeSinceSigning.daysSinceSigning.long=自驗證{0} -offerbook.xmrAutoConf=Is auto-confirm enabled +offerbook.xmrAutoConf=是否開啟自動確認 offerbook.timeSinceSigning.help=當您成功地完成與擁有已驗證付款帳戶的夥伴交易時,您的付款帳戶已驗證。\n{0} 天后,最初的 {1} 的限制解除以及你的賬戶可以驗證其他人的付款賬戶。 offerbook.timeSinceSigning.notSigned=尚未驗證 offerbook.timeSinceSigning.notSigned.noNeed=N/A shared.notSigned=此賬戶還沒有被驗證 -shared.notSigned.noNeed=此賬戶類型不適用驗證 +shared.notSigned.noNeed=此賬戶型別不適用驗證 offerbook.nrOffers=報價數量:{0} offerbook.volume={0}(最小 - 最大) @@ -394,8 +393,7 @@ offerbook.warning.currencyBanned=該報價中使用的貨幣被 Bisq 開發人 offerbook.warning.paymentMethodBanned=該報價中使用的付款方式被 Bisq 開發人員阻止。\n請訪問 Bisq 論壇瞭解更多資訊。 offerbook.warning.nodeBlocked=該交易者的匿名地址被 Bisq 開發人員限制。\n當獲取來自該交易者的報價,可能有一個未處理的漏洞導致了問題。 offerbook.warning.requireUpdateToNewVersion=您的 Bisq 版本不再相容交易。\n請通過 https://bisq.network/downloads 更新到最新的 Bisq 版本。 -offerbook.warning.tradeLimitNotMatching=您的付款帳戶已於 {0} 前建立。您的交易限額基於賬齡,因此不滿足該報價的要求。\n您的交易限額是:{1}\n最小交易金額為:{2}\n您現在不能接受這個報價。\n只要您的賬齡超過 2 個月,此限制就會被移除。 -offerbook.warning.offerWasAlreadyUsedInTrade=You cannot take this offer because you already took it earlier. It could be that your previous take-offer attempt resulted in a failed trade. +offerbook.warning.offerWasAlreadyUsedInTrade=您不能吃單因為您已經完成了該操作。可能是你之前的吃單嘗試導致了交易失敗。 offerbook.info.sellAtMarketPrice=您會以市場價格進行出售(每分鐘更新) offerbook.info.buyAtMarketPrice=您將以市場價格進行購買(每分鐘更新)。 @@ -445,7 +443,6 @@ createOffer.alreadyFunded=您已經為該報價充值了。\n您的資金已經 createOffer.createOfferFundWalletInfo.headline=為您的報價充值 # suppress inspection "TrailingSpacesInProperty" createOffer.createOfferFundWalletInfo.tradeAmount=- 交易數量:{0}\n -createOffer.createOfferFundWalletInfo.feesWithBSQ={0} 和 {1} createOffer.createOfferFundWalletInfo.msg=這個報價您需要 {0} 作為保證金。\n\n這些資金保留在您的本地錢包並會被凍結到多重驗證保證金地址直到報價交易成功。\n\n總數量:{1}\n- 保證金:{2}\n- 掛單費:{3}\n- 礦工手續費:{4}\n\n您有兩種選項可以充值您的交易:\n- 使用您的 Bisq 錢包(方便,但交易可能會被連結到)或者\n- 從外部錢包轉入(或許這樣更隱祕一些)\n\n關閉此彈出視窗後,您將看到所有資金選項和詳細資訊。 # only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!) @@ -516,6 +513,7 @@ takeOffer.failed.offererOffline=您不能下單,因為賣家已經下線。 takeOffer.warning.connectionToPeerLost=您與賣家失去連線。\n因為太多連線,他或許已經下線或者關掉了與您的連線。\n\n如果您還是能在報價列表中看到他的報價,您可以再次嘗試下單。 takeOffer.error.noFundsLost=\n\n你的錢包裡還沒有錢。 \n請嘗試重啟您的應用程式或者檢查您的網路連線。 +# suppress inspection "TrailingSpacesInProperty" takeOffer.error.feePaid=\n!\n takeOffer.error.depositPublished=\n\n您的保證金轉賬已經發布。\n請嘗試重啟您的應用程式或者檢查您的網路連線。\n如果始終存在問題,請到幫助介面聯絡開發者。 takeOffer.error.payoutPublished=\n\n您的支付轉賬已經發布。\n請嘗試重啟您的應用程式或者檢查您的網路連線。\n如果始終存在問題,請到幫助介面聯絡開發者。 @@ -543,7 +541,7 @@ portfolio.tab.history=歷史記錄 portfolio.tab.failed=失敗 portfolio.tab.editOpenOffer=編輯報價 -portfolio.pending.invalidDelayedPayoutTx=There is an issue with a missing or invalid transaction.\n\nPlease do NOT send the fiat or altcoin payment. Contact Bisq developers on Keybase (https://keybase.io/team/bisq) or on the forum (https://bisq.community) for further assistance.\n\nError message: {0} +portfolio.pending.invalidDelayedPayoutTx=這裡有一個缺失或不可用交易導致的問題\n\n請不要傳送法幣或者任何數字貨幣。聯絡 Bisq 開發者在 Keybase 上 https://keybase.io/team/bisq 或者在論壇上https://bisq.community 以尋求更多協助。\n\n錯誤資訊:{0} portfolio.pending.step1.waitForConf=等待區塊鏈確認 portfolio.pending.step2_buyer.startPayment=開始付款 @@ -590,7 +588,7 @@ portfolio.pending.step1.openForDispute=保證金交易仍未得到確認。請 portfolio.pending.step2.confReached=您的交易已經達到至少一個區塊鏈確認。\n(如果需要,您可以等待更多的確認 - 6個確認被認為是非常安全的。)\n\n portfolio.pending.step2_buyer.copyPaste=(您可以在關閉該彈出視窗後從主介面複製並貼上值。) -portfolio.pending.step2_buyer.refTextWarn=不要在比特幣、BTC 或 Bisq 的“付款原因”文本里新增任何提示。 +portfolio.pending.step2_buyer.refTextWarn=不要在比特幣、BTC 或 Bisq 的“付款原因”文字里新增任何提示。 # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.accountDetails=以下是 BTC 賣家的交易賬戶詳細資訊:\n portfolio.pending.step2_buyer.tradeId=請不要忘記新增交易 ID @@ -601,13 +599,15 @@ portfolio.pending.step2_buyer.fees=如果您的銀行收取費用,您必須支 portfolio.pending.step2_buyer.altcoin=請從您的外部 {0} 錢包劃轉\n{1} 到 BTC 賣家。\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.cash=請到銀行並支付 {0} 給 BTC 賣家。\n\n -portfolio.pending.step2_buyer.cash.extra=重要要求:\n完成付款後在紙質收據上寫下:不退款。\n然後將其撕成2份,拍照片併發送給 BTC 賣家的電子郵件地址。 +portfolio.pending.step2_buyer.cash.extra=重要要求:\n完成付款後在紙質收據上寫下:不退款。\n然後將其撕成2份,拍照片併傳送給 BTC 賣家的電子郵件地址。 # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.moneyGram=請使用 MoneyGram 向 BTC 賣家支付 {0}。\n\n portfolio.pending.step2_buyer.moneyGram.extra=重要要求:\n完成支付後,請通過電郵傳送授權編號和照片給 BTC 賣家。\n收據必須清楚地向賣家寫明您的全名、城市、國家或地區、數量。賣方的電子郵件是:{0}。 # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.westernUnion=請使用 Western Union 向 BTC 賣家支付 {0}。\n\n portfolio.pending.step2_buyer.westernUnion.extra=重要要求:\n完成支付後,請通過電郵傳送 MTCN(追蹤號碼)和照片給 BTC 賣家。\n收據必須清楚地向賣家寫明您的全名、城市、國家或地區、數量。賣方的電子郵件是:{0}。 +# suppress inspection "TrailingSpacesInProperty" +portfolio.pending.step2_buyer.amazonGiftCard=Please purchase an Amazon eGift Card for {0} at your Amazon account and use the BTC seller''s email or mobile number as receiver. In case the trade amount exceeds the permitted amount send multiple cards.\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.postal=請用“美國郵政匯票”傳送 {0} 給 BTC 賣家。\n\n @@ -624,7 +624,7 @@ portfolio.pending.step2_buyer.paymentStarted=付款開始 portfolio.pending.step2_buyer.warn=你還沒有完成你的 {0} 付款!\n請注意,交易必須在 {1} 之前完成。 portfolio.pending.step2_buyer.openForDispute=您還沒有完成您的付款!\n最大交易期限已過。請聯絡調解員尋求幫助。 portfolio.pending.step2_buyer.paperReceipt.headline=您是否將紙質收據傳送給 BTC 賣家? -portfolio.pending.step2_buyer.paperReceipt.msg=請牢記:\n完成付款後在紙質收據上寫下:不退款。\n然後將其撕成2份,拍照片併發送給 BTC 賣家的電子郵件地址。 +portfolio.pending.step2_buyer.paperReceipt.msg=請牢記:\n完成付款後在紙質收據上寫下:不退款。\n然後將其撕成2份,拍照片併傳送給 BTC 賣家的電子郵件地址。 portfolio.pending.step2_buyer.moneyGramMTCNInfo.headline=傳送授權編號和收據 portfolio.pending.step2_buyer.moneyGramMTCNInfo.msg=請通過電郵傳送授權編號和照片給 BTC 賣家。\n收據必須清楚地向賣家寫明您的全名、城市、國家或地區、數量。賣方的電子郵件是:{0}。\n\n您把授權編號和合同發給賣方了嗎? portfolio.pending.step2_buyer.westernUnionMTCNInfo.headline=傳送 MTCN 和收據 @@ -644,8 +644,6 @@ portfolio.pending.step2_seller.f2fInfo.headline=買家的合同資訊 portfolio.pending.step2_seller.waitPayment.msg=存款交易至少有一個區塊鏈確認。\n您需要等到 BTC 買家開始 {0} 付款。 portfolio.pending.step2_seller.warn=BTC 買家仍然沒有完成 {0} 付款。\n你需要等到他開始付款。\n如果 {1} 交易尚未完成,仲裁員將進行調查。 portfolio.pending.step2_seller.openForDispute=BTC 買家尚未開始付款!\n允許的最長交易期限已經過去了。你可以繼續等待給予交易雙方更多時間,或聯絡仲裁員以爭取解決糾紛。 -portfolio.pending.step2_seller.refresh=重新整理交易狀態 -portfolio.pending.step2_seller.refreshInfo=有時 P2P 網路上的確認付款訊息沒有收到,導致交易變為異常交易。點選下面的按鈕,讓你的同伴重新發送上一條訊息。 tradeChat.chatWindowTitle=使用 ID “{0}” 進行交易的聊天視窗 tradeChat.openChat=開啟聊天視窗 tradeChat.rules=您可以與您的夥伴溝通,以解決該交易的潛在問題。\n在聊天中不強制回覆。\n如果交易員違反了下面的任何規則,開啟糾紛並向調解員或仲裁員報告。\n聊天規則:\n\n\t●不要傳送任何連結(有惡意軟體的風險)。您可以傳送交易 ID 和區塊資源管理器的名稱。\n\t●不要傳送還原金鑰、私鑰、密碼或其他敏感資訊!\n\t●不鼓勵 Bisq 以外的交易(無安全保障)。\n\t●不要參與任何形式的危害社會安全的計劃。\n\t●如果對方沒有迴應,也不願意通過聊天進行溝通,那就尊重對方的決定。\n\t●將談話範圍限制在行業內。這個聊天不是一個社交軟體替代品或troll-box。\n\t●保持友好和尊重的交談。 @@ -679,11 +677,13 @@ portfolio.pending.step3_seller.postal={0} 請檢查您是否已經從 BTC 買家 # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.bank=您的交易物件已確認他已啟動 {0} 付款\n\n請訪問您的網上銀行網頁,並檢查您是否已從 BTC 買家收到 {1}\n\n交易 ID(“付款原因”文字)是:“{2}”\n\n portfolio.pending.step3_seller.cash=因為付款是通過現金存款完成的,BTC 買家必須在紙質收據上寫“不退款”,將其撕成2份,並通過電子郵件向您傳送照片。\n\n為避免退款風險,請僅確認您是否收到電子郵件,如果您確定收據有效。\n如果您不確定,{0} -portfolio.pending.step3_seller.moneyGram=買方必須傳送授權編碼和一張收據的照片。\n收據必須清楚地顯示您的全名、城市、國家或地區、數量。如果您收到授權編碼,請查收郵件。\n\n關閉彈窗後,您將看到 BTC 買家的姓名和在 MoneyGram 的收款地址。\n\n只有在您成功收到錢之後,再確認收據! -portfolio.pending.step3_seller.westernUnion=買方必須傳送 MTCN(跟蹤號碼)和一張收據的照片。\n收據必須清楚地顯示您的全名、城市、國家或地區、數量。如果您收到 MTCN,請查收郵件。\n\n關閉彈窗後,您將看到 BTC 買家的姓名和在 Western Union 的收款地址。\n\n只有在您成功收到錢之後,再確認收據! +portfolio.pending.step3_seller.moneyGram=買方必鬚髮送授權編碼和一張收據的照片。\n收據必須清楚地顯示您的全名、城市、國家或地區、數量。如果您收到授權編碼,請查收郵件。\n\n關閉彈窗後,您將看到 BTC 買家的姓名和在 MoneyGram 的收款地址。\n\n只有在您成功收到錢之後,再確認收據! +portfolio.pending.step3_seller.westernUnion=買方必鬚髮送 MTCN(跟蹤號碼)和一張收據的照片。\n收據必須清楚地顯示您的全名、城市、國家或地區、數量。如果您收到 MTCN,請查收郵件。\n\n關閉彈窗後,您將看到 BTC 買家的姓名和在 Western Union 的收款地址。\n\n只有在您成功收到錢之後,再確認收據! portfolio.pending.step3_seller.halCash=買方必須將 HalCash程式碼 用簡訊傳送給您。除此之外,您將收到來自 HalCash 的訊息,其中包含從支援 HalCash 的 ATM 中提取歐元所需的資訊\n從 ATM 取款後,請在此確認付款收據! +portfolio.pending.step3_seller.amazonGiftCard=The buyer has sent you an Amazon eGift Card by email or by text message to your mobile phone. Please redeem now the Amazon eGift Card at your Amazon account and once accepted confirm the payment receipt. portfolio.pending.step3_seller.bankCheck=\n\n還請確認您的銀行對帳單中的發件人姓名與委託合同中的發件人姓名相符:\n發件人姓名:{0}\n\n如果名稱與此處顯示的名稱不同,則 {1} +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.openDispute=請不要確認,而是通過鍵盤組合鍵“alt + o”或“option + o”來開啟糾紛。 portfolio.pending.step3_seller.confirmPaymentReceipt=確定付款收據 portfolio.pending.step3_seller.amountToReceive=接收數量: @@ -707,6 +707,7 @@ portfolio.pending.step3_seller.onPaymentReceived.part1=您是否收到了您交 portfolio.pending.step3_seller.onPaymentReceived.fiat=交易 ID(“付款理由”文字)是“{0}”\n\n # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.name=還請確認您的銀行對帳單中的發件人姓名與委託合同中的發件人姓名相符:\n每個交易合約的傳送者姓名:{0}\n\n如果名稱與此處顯示的名稱不一致,請不要通過確認付款,而是通過“alt + o”或“option + o”開啟糾紛。\n\n +# suppress inspection "TrailingSpacesInProperty" portfolio.pending.step3_seller.onPaymentReceived.note=請注意,一旦您確認收到,凍結交易金額將被髮放給 BTC 買家,保證金將被退還。 portfolio.pending.step3_seller.onPaymentReceived.confirm.headline=確定您已經收到付款 portfolio.pending.step3_seller.onPaymentReceived.confirm.yes=是的,我已經收到付款。 @@ -753,18 +754,13 @@ portfolio.pending.openSupportTicket.msg=請僅在緊急情況下使用此功能 portfolio.pending.timeLockNotOver=你必須等到≈{0}(還需等待{1}個區塊)才能提交糾紛。 portfolio.pending.error.depositTxNull=保證金交易無效。沒有有效的保證金交易,你使用建立糾紛。請到“設定/網路資訊”進行 SPV 重新同步。\n \n如需更多幫助,請聯絡 Bisq Keybase 團隊的 Support 頻道。 -portfolio.pending.mediationResult.error.depositTxNull=The deposit transaction is null. You can move the trade to failed trades. -portfolio.pending.mediationResult.error.delayedPayoutTxNull=The delayed payout transaction is null. You can move the trade to failed trades. +portfolio.pending.mediationResult.error.depositTxNull=保證金交易為空。你可以移動該交易至失敗的交易。 +portfolio.pending.mediationResult.error.delayedPayoutTxNull=延遲支付交易為空。你可以移動該交易至失敗的交易。 portfolio.pending.error.depositTxNotConfirmed=保證金交易未確認。未經確認的存款交易不能發起糾紛或仲裁請求。請耐心等待,直到它被確認或進入“設定/網路資訊”進行 SPV 重新同步。\n\n如需更多幫助,請聯絡 Bisq Keybase 團隊的 Support 頻道。 -portfolio.pending.notification=通知 - portfolio.pending.support.headline.getHelp=需要幫助? portfolio.pending.support.text.getHelp=如果您有任何問題,您可以嘗試在交易聊天中聯絡交易夥伴,或在 https://bisq.community 詢問 Bisq 社群。如果您的問題仍然沒有解決,您可以向調解員取得更多的幫助。 -portfolio.pending.support.text.getHelp.arbitrator=如果您有任何問題,您可以嘗試在交易聊天中聯絡交易夥伴,或在 https://bisq.community 詢問 Bisq 社群。如果你的問題仍然沒有解決,你可以向仲裁員取得更多的幫助。 portfolio.pending.support.button.getHelp=開啟交易聊天 -portfolio.pending.support.popup.info=如果您與交易的問題仍然沒有解決,您可以提交工單來請求調解員的幫助。如果您還沒有收到付款,請等到交易結束。\n\n您確定要提交工單嗎? -portfolio.pending.support.popup.button=建立幫助話題 portfolio.pending.support.headline.halfPeriodOver=確認付款 portfolio.pending.support.headline.periodOver=交易期結束 @@ -772,16 +768,11 @@ portfolio.pending.mediationRequested=已請求調解員協助 portfolio.pending.refundRequested=已請求退款 portfolio.pending.openSupport=建立幫助話題 portfolio.pending.supportTicketOpened=幫助話題已經建立 -portfolio.pending.requestSupport=請求幫助 -portfolio.pending.error.requestSupport=請將問題報告給您的調解員或仲裁員。\n\n他會將資訊轉交給開發人員調查問題。\n在解決問題後,您將收回所有凍結資金。 portfolio.pending.communicateWithArbitrator=請在“幫助”介面上與仲裁員聯絡。 portfolio.pending.communicateWithMediator=請在“支援”頁面中與調解員進行聯絡。 -portfolio.pending.supportTicketOpenedMyUser=您建立了一個幫助話題。\n{0} portfolio.pending.disputeOpenedMyUser=您建立了一個糾紛。\n{0} portfolio.pending.disputeOpenedByPeer=您的交易物件建立了一個糾紛。\n{0} -portfolio.pending.supportTicketOpenedByPeer=您的交易物件建立了一個幫助工單。\n{0} portfolio.pending.noReceiverAddressDefined=沒有定義接收地址 -portfolio.pending.removeFailedTrade=這是一筆失敗的交易嗎?如果是,請問你想手動關閉它嗎?使它不再顯示為一個未完成交易。 portfolio.pending.mediationResult.headline=調解費用的支出 portfolio.pending.mediationResult.info.noneAccepted=通過接受調解員關於交易的建議的支出來完成交易。 @@ -791,24 +782,24 @@ portfolio.pending.mediationResult.button=檢視建議的解決方案 portfolio.pending.mediationResult.popup.headline=調解員在交易 ID:{0}上的建議 portfolio.pending.mediationResult.popup.headline.peerAccepted=你的夥伴已經接受了調解員的建議 portfolio.pending.mediationResult.popup.info=調解員建議的支出如下:\n你將支付:{0}\n你的交易夥伴將支付:{1}\n\n你可以接受或拒絕這筆調解費支出。\n\n通過接受,你驗證了合約的支付交易。如果你的交易夥伴也接受和驗證,支付將完成,交易將關閉。\n\n如果你們其中一人或雙方都拒絕該建議,你將必須等到(2)({3}區塊)與仲裁員展開第二輪糾紛討論,仲裁員將再次調查該案件,並根據他們的調查結果進行支付。\n\n仲裁員可以收取少量費用(費用上限:交易的保證金)作為其工作的補償。兩個交易者都同意調解員的建議是愉快的路徑請求仲裁是針對特殊情況的,比如如果一個交易者確信調解員沒有提出公平的賠償建議(或者如果另一個同伴沒有迴應)。\n\n關於新的仲裁模型的更多細節:https://docs.bisq.network/trading-rules.html#arbitration -portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=You have accepted the mediator''s suggested payout but it seems that your trading peer has not accepted it.\n\nThe lock time is since {0} (block {1}) over and you can open a second-round dispute with an arbitrator who will investigate the case again and do a payout based on their findings.\n\nYou can find more details about the arbitration model at:\nhttps://docs.bisq.network/trading-rules.html#arbitration +portfolio.pending.mediationResult.popup.selfAccepted.lockTimeOver=您已經接受了調解員的建議支付但是似乎您的交易對手並沒有接受。\n\n一旦鎖定時間到{0}(區塊{1})您可以開啟第二輪糾紛讓仲裁員重新研究該案件並重新作出支出決定。\n\n您可以找到更多關於仲裁模型的資訊在:\nhttps://docs.bisq.network/trading-rules.html#arbitration portfolio.pending.mediationResult.popup.openArbitration=拒絕並請求仲裁 portfolio.pending.mediationResult.popup.alreadyAccepted=您已經接受了。 -portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades. -portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades. -portfolio.pending.failedTrade.missingDepositTx=The deposit transaction (the 2-of-2 multisig transaction) is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked but your trade fee has been paid. You can make a request to be reimbursed the trade fee here: https://github.com/bisq-network/support/issues. \n\nFeel free to move this trade to failed trades. -portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. -portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: https://github.com/bisq-network/support/issues. +portfolio.pending.failedTrade.taker.missingTakerFeeTx=吃單交易費未找到。\n\n如果沒有 tx,交易不能完成。沒有資金被鎖定以及沒有支付交易費用。你可以將交易移至失敗的交易。 +portfolio.pending.failedTrade.maker.missingTakerFeeTx=掛單費交易未找到。\n\n如果沒有 tx,交易不能完成。沒有資金被鎖定以及沒有支付交易費用。你可以將交易移至失敗的交易。 +portfolio.pending.failedTrade.missingDepositTx=這個保證金交易(2 對 2 多重簽名交易)缺失\n\n沒有該 tx,交易不能完成。沒有資金被鎖定但是您的交易手續費仍然已支出。您可以發起一個請求去賠償改交易手續費在這裡:https://github.com/bisq-network/support/issues\n\n請隨意的將該交易移至失敗交易 +portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the fiat or altcoin payment to the BTC seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Bisq mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] +portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/bisq-network/support/issues] portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0} portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time. -portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=Move trade to failed trades -portfolio.pending.failedTrade.warningIcon.tooltip=Click to open details about the issues of this trade -portfolio.failed.revertToPending.popup=Do you want to move this trade to open trades? -portfolio.failed.revertToPending=Move trade to open trades +portfolio.pending.failedTrade.txChainValid.moveToFailed=這個交易協議存在一些問題。\n\n{0}\n\n這個報價交易已經被髮布以及資金已被鎖定。只有在確定情況下將該交易移至失敗交易。這可能會阻止解決問題的可用選項。\n\n您確定想要將該交易移至失敗的交易嗎?\n\n您不能在失敗的交易中開啟一個調解或仲裁,但是你隨時可以將失敗的交易重新移至未完成交易。 +portfolio.pending.failedTrade.moveTradeToFailedIcon.tooltip=將交易移至失敗交易 +portfolio.pending.failedTrade.warningIcon.tooltip=點選開啟該交易的問題細節 +portfolio.failed.revertToPending.popup=您想要將該交易移至未完成交易嗎 +portfolio.failed.revertToPending=將交易移至未完成交易 portfolio.closed.completed=完成 portfolio.closed.ticketClosed=已仲裁 @@ -817,8 +808,8 @@ portfolio.closed.canceled=已取消 portfolio.failed.Failed=失敗 portfolio.failed.unfail=再繼續之前,請保證你有一份根目錄的備份!\n您想要將此交易移至未完成的交易嗎?\n這是一個解鎖卡在失敗交易的資金的方法 portfolio.failed.cantUnfail=目前該交易暫無法移至未完成的交易。\n請在完成交易後重試{0} -portfolio.failed.depositTxNull=The trade cannot be reverted to a open trade. Deposit transaction is null. -portfolio.failed.delayedPayoutTxNull=The trade cannot be reverted to a open trade. Delayed payout transaction is null. +portfolio.failed.depositTxNull=交易無法恢復至未完成交易。保證金交易為空。 +portfolio.failed.delayedPayoutTxNull=交易無法恢復至未完成交易。延遲支付交易為空。 #################################################################### @@ -839,6 +830,7 @@ funds.deposit.fundWallet=充值您的錢包 funds.deposit.withdrawFromWallet=從錢包轉出資金 funds.deposit.amount=BTC 數量(可選) funds.deposit.generateAddress=生成新的地址 +funds.deposit.generateAddressSegwit=原生 segwit 格式(Bech32) funds.deposit.selectUnused=請從上表中選擇一個未使用的地址,而不是生成一個新地址。 funds.withdrawal.arbitrationFee=仲裁費用 @@ -912,26 +904,26 @@ support.tab.ArbitratorsSupportTickets={0} 的工單 support.filter=查詢糾紛 support.filter.prompt=輸入 交易 ID、日期、洋蔥地址或賬戶資訊 -support.sigCheck.button=Verify result +support.sigCheck.button=確認結果 support.sigCheck.popup.info=In case of a reimbursement request to the DAO you need to paste the summary message of the mediation and arbitration process in your reimbursement request on Github. To make this statement verifiable any user can check with this tool if the signature of the mediator or arbitrator matches the summary message. -support.sigCheck.popup.header=Verify dispute result signature -support.sigCheck.popup.msg.label=Summary message -support.sigCheck.popup.msg.prompt=Copy & paste summary message from dispute -support.sigCheck.popup.result=Validation result -support.sigCheck.popup.success=Signature is valid -support.sigCheck.popup.failed=Signature verification failed -support.sigCheck.popup.invalidFormat=Message is not of expected format. Copy & paste summary message from dispute. +support.sigCheck.popup.header=確認糾紛結果簽名 +support.sigCheck.popup.msg.label=總結訊息 +support.sigCheck.popup.msg.prompt=複製貼上糾紛總結訊息 +support.sigCheck.popup.result=驗證結果 +support.sigCheck.popup.success=簽名有效 +support.sigCheck.popup.failed=簽名驗證失敗 +support.sigCheck.popup.invalidFormat=訊息並不是正確的格式。請複製貼上糾紛總結訊息。 support.reOpenByTrader.prompt=您確定想要重新開啟糾紛? -support.reOpenButton.label=Re-open +support.reOpenButton.label=重新開啟 support.sendNotificationButton.label=私人通知 -support.reportButton.label=Report -support.fullReportButton.label=All disputes +support.reportButton.label=報告 +support.fullReportButton.label=所有糾紛 support.noTickets=沒有建立的話題 support.sendingMessage=傳送訊息... support.receiverNotOnline=收件人未線上。訊息被儲存到他們的郵箱。 support.sendMessageError=傳送訊息失敗。錯誤:{0} -support.wrongVersion=糾紛中的訂單創建於一箇舊版本的 Bisq。\n您不能在當前版本關閉這個糾紛。\n\n請您使用舊版本/協議版本: {0} +support.wrongVersion=糾紛中的訂單建立於一箇舊版本的 Bisq。\n您不能在當前版本關閉這個糾紛。\n\n請您使用舊版本/協議版本: {0} support.openFile=開啟附件檔案(檔案最大大小:{0} kb) support.attachmentTooLarge=您的附件的總大小為 {0} kb,並超過最大值。 允許訊息大小為 {1} kB。 support.maxSize=檔案允許的最大大小 {0} kB。 @@ -970,9 +962,9 @@ support.peerOpenedDispute=對方建立了一個糾紛請求。\n\n{0}\n\nBisq support.peerOpenedDisputeForMediation=對方建立了一個調解請求。\n\n{0}\n\nBisq 版本:{1} support.mediatorsDisputeSummary=系統訊息:\n調解糾紛總結:\n{0} support.mediatorsAddress=仲裁員的節點地址:{0} -support.warning.disputesWithInvalidDonationAddress=The delayed payout transaction has used an invalid receiver address. It does not match any of the DAO parameter values for the valid donation addresses.\n\nThis might be a scam attempt. Please inform the developers about that incident and do not close that case before the situation is resolved!\n\nAddress used in the dispute: {0}\n\nAll DAO param donation addresses: {1}\n\nTrade ID: {2}{3} -support.warning.disputesWithInvalidDonationAddress.mediator=\n\nDo you still want to close the dispute? -support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\nYou must not do the payout. +support.warning.disputesWithInvalidDonationAddress=延遲支付交易已經被用於一個不可用接受者地址。它與有效捐贈地址的任何 DAO 中引數值均不匹配。\n\n這可能是一個騙局。請將該事件通知開發者,在問題解決之前不要關閉該案件!\n\n糾紛所用的地址:{0}\n\n所有 DAO 引數中捐贈地址:{1}\n\n交易:{2}{3} +support.warning.disputesWithInvalidDonationAddress.mediator=\n\n您確定一定要關閉糾紛嗎? +support.warning.disputesWithInvalidDonationAddress.refundAgent=\n\n您不能進行支付。 #################################################################### @@ -986,6 +978,7 @@ setting.preferences.general=通用偏好 setting.preferences.explorer=比特幣區塊瀏覽器 setting.preferences.explorer.bsq=Bisq 區塊瀏覽器 setting.preferences.deviation=與市場價格最大差價 +setting.preferences.bsqAverageTrimThreshold=Outlier threshold for BSQ rate setting.preferences.avoidStandbyMode=避免待機模式 setting.preferences.autoConfirmXMR=XMR 自動確認 setting.preferences.autoConfirmEnabled=啟用 @@ -993,14 +986,12 @@ setting.preferences.autoConfirmRequiredConfirmations=已要求確認 setting.preferences.autoConfirmMaxTradeSize=最大交易量(BTC) setting.preferences.autoConfirmServiceAddresses=Monero Explorer 連結(使用Tor,但本地主機,LAN IP地址和 *.local 主機名除外) setting.preferences.deviationToLarge=值不允許大於30% -setting.preferences.txFee=提現交易費(聰/byte) +setting.preferences.txFee=Withdrawal transaction fee (satoshis/vbyte) setting.preferences.useCustomValue=使用自定義值 -setting.preferences.txFeeMin=交易費必須最少 5 聰/byte -setting.preferences.txFeeTooLarge=您的輸入高於任何合理的值(> 5000 聰 / byte)。 交易費通常在 50-400 聰 / byte 範圍內。 +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshis/vbyte +setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshis/vbyte). Transaction fee is usually in the range of 50-400 satoshis/vbyte. setting.preferences.ignorePeers=忽略節點 [洋蔥地址:埠] -setting.preferences.refererId=推薦人 ID setting.preferences.ignoreDustThreshold=最小無零頭輸出值 -setting.preferences.refererId.prompt=可選的推薦人 ID setting.preferences.currenciesInList=市場價的貨幣列表 setting.preferences.prefCurrency=首選貨幣 setting.preferences.displayFiat=顯示國家貨幣 @@ -1016,10 +1007,8 @@ setting.preferences.useAnimations=使用動畫 setting.preferences.useDarkMode=使用夜間模式 setting.preferences.sortWithNumOffers=使用“報價ID/交易ID”篩選列表 setting.preferences.resetAllFlags=重置所有“不再提示”的提示 -setting.preferences.reset=重置 settings.preferences.languageChange=同意重啟請求以更換語言 settings.preferences.supportLanguageWarning=如有任何爭議,請注意調解在 {0} 處理,仲裁在 {1} 處理。 -settings.preferences.selectCurrencyNetwork=選擇網路 setting.preferences.daoOptions=DAO 選項 setting.preferences.dao.resyncFromGenesis.label=從初始 tx 重構 DAO 狀態 setting.preferences.dao.resyncFromResources.label=從指定資源重新構建 DAO 狀態 @@ -1033,6 +1022,13 @@ setting.preferences.dao.blockNotifyPort=區塊通知埠 setting.preferences.dao.fullNodeInfo=如果要將 Bisq 以 DAO 全節點執行,您需要在本地執行比特幣核心並啟用 RPC 。所有的需求都記錄在“ {0} ”中。 setting.preferences.dao.fullNodeInfo.ok=開啟文件頁面 setting.preferences.dao.fullNodeInfo.cancel=不,我堅持使用輕節點模式 +settings.preferences.editCustomExplorer.headline=Explorer Settings +settings.preferences.editCustomExplorer.description=Choose a system defined explorer from the list on the left, and/or customize to suit your own preferences. +settings.preferences.editCustomExplorer.available=Available explorers +settings.preferences.editCustomExplorer.chosen=Chosen explorer settings +settings.preferences.editCustomExplorer.name=名稱 +settings.preferences.editCustomExplorer.txUrl=Transaction URL +settings.preferences.editCustomExplorer.addressUrl=Address URL settings.net.btcHeader=比特幣網路 settings.net.p2pHeader=Bisq 網路 @@ -1059,7 +1055,7 @@ settings.net.receivedDataLabel=統計資料已接收 settings.net.roundTripTimeColumn=延遲 settings.net.sentBytesColumn=傳送 settings.net.receivedBytesColumn=接收 -settings.net.peerTypeColumn=節點類型 +settings.net.peerTypeColumn=節點型別 settings.net.openTorSettingsButton=開啟 Tor 設定 settings.net.versionColumn=版本 @@ -1083,12 +1079,12 @@ settings.net.reSyncSPVAfterRestart=SPV 鏈檔案已被刪除。請耐心等待 settings.net.reSyncSPVAfterRestartCompleted=重新同步剛剛完成,請重啟應用程式。 settings.net.reSyncSPVFailed=無法刪除 SPV 鏈檔案。\n錯誤:{0} setting.about.aboutBisq=關於 Bisq -setting.about.about=Bisq 是一款開源軟體,它通過分散的對等網路促進了比特幣與各國貨幣(以及其他加密貨幣)的交易,嚴格保護了使用者隱私的方式。請到我們項目的網站閱讀更多關於 Bisq 的資訊。 +setting.about.about=Bisq 是一款開源軟體,它通過分散的對等網路促進了比特幣與各國貨幣(以及其他加密貨幣)的交易,嚴格保護了使用者隱私的方式。請到我們專案的網站閱讀更多關於 Bisq 的資訊。 setting.about.web=Bisq 網站 setting.about.code=原始碼 setting.about.agpl=AGPL 協議 setting.about.support=支援 Bisq -setting.about.def=Bisq 不是一個公司,而是一個社群項目,開放參與。如果您想參與或支援 Bisq,請點選下面連線。 +setting.about.def=Bisq 不是一個公司,而是一個社群專案,開放參與。如果您想參與或支援 Bisq,請點選下面連線。 setting.about.contribute=貢獻 setting.about.providers=資料提供商 setting.about.apisWithFee=Bisq 使用 Bisq 價格指數來表示法幣與虛擬貨幣的市場價格,並使用 Bisq 記憶體池節點來估算採礦費。 @@ -1155,11 +1151,9 @@ setting.info.msg=當你完成 BTC/XMR 交易時,您可以使用自動確認功 # Account #################################################################### -account.tab.arbitratorRegistration=仲裁員註冊 account.tab.mediatorRegistration=調解員註冊 account.tab.refundAgentRegistration=退款助理註冊 account.tab.signing=驗證中 -account.tab.account=賬戶 account.info.headline=歡迎來到 Bisq 賬戶 account.info.msg=在這裡你可以設定交易賬戶的法定貨幣及數字貨幣,選擇仲裁員和備份你的錢包及賬戶資料。\n\n當你開始執行 Bisq 就已經建立了一個空的比特幣錢包。\n\n我們建議你在充值之前寫下你比特幣錢包的還原金鑰(在左邊的列表)和考慮新增密碼。在“資金”選項中管理比特幣存入和提現。\n\n隱私 & 安全:\nBisq 是一個去中心化的交易所 – 意味著您的所有資料都儲存在您的電腦上,沒有伺服器,我們無法訪問您的個人資訊,您的資金,甚至您的 IP 地址。如銀行賬號、數字貨幣、比特幣地址等資料只分享給與您交易的人,以實現您發起的交易(如果有爭議,仲裁員將會看到您的交易資料)。 @@ -1177,7 +1171,7 @@ account.arbitratorRegistration.register=註冊 account.arbitratorRegistration.registration={0} 註冊 account.arbitratorRegistration.revoke=撤銷 account.arbitratorRegistration.info.msg=請注意,撤銷後需要保留15天,因為可能有交易正在以你作為 {0}。最大允許的交易期限為8天,糾紛過程最多可能需要7天。 -account.arbitratorRegistration.warn.min1Language=您需要設定至少1種語言。\n我們已經為您添加了預設語言。 +account.arbitratorRegistration.warn.min1Language=您需要設定至少1種語言。\n我們已經為您新增了預設語言。 account.arbitratorRegistration.removedSuccess=您已從 Bisq 網路成功刪除仲裁員註冊資訊。 account.arbitratorRegistration.removedFailed=無法刪除仲裁員。{0} account.arbitratorRegistration.registerSuccess=您已從 Bisq 網路成功註冊您的仲裁員。 @@ -1186,24 +1180,39 @@ account.arbitratorRegistration.registerFailed=無法註冊仲裁員。{0} account.altcoin.yourAltcoinAccounts=您的數字貨幣賬戶 account.altcoin.popup.wallet.msg=請確保您按照 {1} 網頁上所述使用 {0} 錢包的要求。\n使用集中式交易所的錢包,您無法控制金鑰或使用不相容的錢包軟體,可能會導致交易資金的流失!\n調解員或仲裁員不是 {2} 專家,在這種情況下不能幫助。 account.altcoin.popup.wallet.confirm=我瞭解並確定我知道我需要哪種錢包。 +# suppress inspection "UnusedProperty" account.altcoin.popup.upx.msg=在 Bisq 上交易 UPX 需要您瞭解並滿足以下要求:\n\n要傳送 UPX ,您需要使用官方的 UPXmA GUI 錢包或啟用 store-tx-info 標誌的 UPXmA CLI 錢包(在新版本中是預設的)。請確保您可以訪問Tx金鑰,因為在糾紛狀態時需要。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高階>證明/檢查頁面。\n\n在普通的區塊鏈瀏覽器中,這種交易是不可驗證的。\n\n如有糾紛,你須向仲裁員提供下列資料:\n \n- Tx私鑰\n- 交易雜湊\n- 接收者的公開地址\n\n如未能提供上述資料,或使用不相容的錢包,將會導致糾紛敗訴。如果發生糾紛,UPX 傳送方負責向仲裁員提供 UPX 轉賬的驗證。\n\n不需要支付 ID,只需要普通的公共地址。\n \n如果您對該流程不確定,請訪問 UPXmA Discord 頻道(https://discord.gg/vhdNSrV)或 Telegram 交流群(https://t.me/uplexaOfficial)瞭解更多資訊。\n\n +# suppress inspection "UnusedProperty" account.altcoin.popup.arq.msg=在 Bisq 上交易 ARQ 需要您瞭解並滿足以下要求:\n\n要傳送 ARQ ,您需要使用官方的 ArQmA GUI 錢包或啟用 store-tx-info 標誌的 ArQmA CLI 錢包(在新版本中是預設的)。請確保您可以訪問Tx金鑰,因為在糾紛狀態時需要。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高階>證明/檢查頁面。\n\n在普通的區塊鏈瀏覽器中,這種交易是不可驗證的。\n\n如有糾紛,你須向調解員或仲裁員提供下列資料:\n\n- Tx私鑰\n- 交易雜湊\n- 接收者的公開地址\n\n如未能提供上述資料,或使用不相容的錢包,將會導致糾紛敗訴。如果發生糾紛,ARQ 傳送方負責向調解員或仲裁員提供 ARQ 轉賬的驗證。\n\n不需要交易 ID,只需要普通的公共地址。\n\n如果您對該流程不確定,請訪問 ArQmA Discord 頻道(https://discord.gg/s9BQpJT)或 ArQmA 論壇(https://labs.arqma.com)瞭解更多資訊。 +# suppress inspection "UnusedProperty" account.altcoin.popup.xmr.msg=在 Bisq 上交易 XMR 需要你理解並滿足以下要求。\n\n如果您出售 XMR,當您在糾紛中您必須要提供下列資訊給調解員或仲裁員:\n- 交易金鑰(Tx 公鑰,Tx金鑰,Tx私鑰)\n- 交易 ID(Tx ID 或 Tx 雜湊)\n- 交易目標地址(接收者地址)\n\n在 wiki 中檢視更多關於 Monero 錢包的資訊:\nhttps://bisq.wiki/Trading_Monero#Proving_payments\n\n如未能提供要求的交易資料將在糾紛中直接判負\n\n還要注意,Bisq 現在提供了自動確認 XMR 交易的功能,以使交易更快,但是您需要在設定中啟用它。\n\n有關自動確認功能的更多資訊,請參見 Wiki:\nhttps://bisq.wiki/Trading_Monero#Auto-confirming_trades -# suppress inspection "TrailingSpacesInProperty" -account.altcoin.popup.msr.msg=區塊鏈瀏覽器在 Bisq 上交易 XMR 需要您瞭解並滿足以下要求:\n\n傳送MSR時,您需要使用官方的 Masari GUI 錢包、啟用store-tx-info標記的Masari CLI錢包(預設啟用)或Masari 網頁錢包(https://wallet.getmasari.org)。請確保您可以訪問的 tx 金鑰,因為如果發生糾紛這是需要的。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高階>證明/檢查頁面。\n\nMasari 網頁錢包(前往 帳戶->交易歷史和檢視您傳送的交易細節)\n\n驗證可以在錢包中完成。\nmonero-wallet-cli:使用命令(check_tx_key)。\nmonero-wallet-gui:在高階>證明/檢查頁面\n驗證可以在區塊瀏覽器中完成\n開啟區塊瀏覽器(https://explorer.getmasari.org),使用搜索欄查詢您的事務雜湊。\n一旦找到交易,滾動到底部的“證明發送”區域,並填寫所需的詳細資訊。\n如有糾紛,你須向調解員或仲裁員提供下列資料:\n- Tx私鑰\n- 交易雜湊\n- 接收者的公開地址\n\n不需要交易 ID,只需要正常的公共地址。\n如未能提供上述資料,或使用不相容的錢包,將會導致糾紛敗訴。如果發生糾紛,XMR 傳送方負責向調解員或仲裁員提供 XMR 轉賬的驗證。\n\n如果您對該流程不確定,請訪問官方的 Masari Discord(https://discord.gg/sMCwMqs)上尋求幫助。 +# suppress inspection "UnusedProperty" +account.altcoin.popup.msr.msg=區塊鏈瀏覽器在 Bisq 上交易 XMR 需要您瞭解並滿足以下要求:\n\n傳送MSR時,您需要使用官方的 Masari GUI 錢包、啟用store-tx-info標記的Masari CLI錢包(預設啟用)或Masari 網頁錢包(https://wallet.getmasari.org)。請確保您可以訪問的 tx 金鑰,因為如果發生糾紛這是需要的。\nmonero-wallet-cli(使用get_Tx_key命令)\nmonero-wallet-gui:在高階>證明/檢查頁面。\n\nMasari 網頁錢包(前往 帳戶->交易歷史和檢視您傳送的交易細節)\n\n驗證可以在錢包中完成。\nmonero-wallet-cli:使用命令(check_tx_key)。\nmonero-wallet-gui:在高階>證明/檢查頁面\n驗證可以在區塊瀏覽器中完成\n開啟區塊瀏覽器(https://explorer.getmasari.org),使用搜尋欄查詢您的事務雜湊。\n一旦找到交易,滾動到底部的“證明傳送”區域,並填寫所需的詳細資訊。\n如有糾紛,你須向調解員或仲裁員提供下列資料:\n- Tx私鑰\n- 交易雜湊\n- 接收者的公開地址\n\n不需要交易 ID,只需要正常的公共地址。\n如未能提供上述資料,或使用不相容的錢包,將會導致糾紛敗訴。如果發生糾紛,XMR 傳送方負責向調解員或仲裁員提供 XMR 轉賬的驗證。\n\n如果您對該流程不確定,請訪問官方的 Masari Discord(https://discord.gg/sMCwMqs)上尋求幫助。 +# suppress inspection "UnusedProperty" account.altcoin.popup.blur.msg=在 Bisq 上交易 BLUR 需要你瞭解並滿足以下要求:\n\n要傳送匿名資訊你必須使用匿名網路 CLI 或 GUI 錢包。\n如果您正在使用 CLI 錢包,在傳輸傳送後將顯示交易雜湊(tx ID)。您必須儲存此資訊。在傳送傳輸之後,您必須立即使用“get_tx_key”命令來檢索交易私鑰。如果未能執行此步驟,以後可能無法檢索金鑰。\n\n如果您使用 Blur Network GUI 錢包,可以在“歷史”選項卡中方便地找到交易私鑰和交易 ID。傳送後立即定位感興趣的交易。單擊包含交易的框的右下角的“?”符號。您必須儲存此資訊。\n\n如果仲裁是必要的,您必須向調解員或仲裁員提供以下資訊:1.)交易ID,2.)交易私鑰,3.)收件人地址。調解或仲裁程式將使用 BLUR 事務檢視器(https://blur.cash/#tx-viewer)驗證 BLUR 轉賬。\n\n未能向調解員或仲裁員提供必要的資訊將導致敗訴。在所有爭議的情況下,匿名傳送方承擔100%的責任來向調解員或仲裁員核實交易。\n\n如果你不瞭解這些要求,不要在 Bisq 上交易。首先,在 Blur Network Discord 中尋求幫助(https://discord.gg/dMWaqVW)。 +# suppress inspection "UnusedProperty" account.altcoin.popup.solo.msg=在 Bisq 上交易 Solo 需要您瞭解並滿足以下要求:\n\n要傳送 Solo,您必須使用 Solo CLI 網路錢包版本 5.1.3 或更高。\n\n如果您使用的是CLI錢包,則在傳送交易之後,將顯示交易ID。您必須儲存此資訊。在傳送交易之後,您必須立即使用'get_tx_key'命令來檢索交易金鑰。如果未能執行此步驟,則以後可能無法檢索金鑰。\n\n如果仲裁是必要的,您必須向調解員或仲裁員提供以下資訊:1)交易 ID,、2)交易金鑰,3)收件人的地址。調解員或仲裁員將使用 Solo 區塊資源管理器(https://explorer.Solo.org)搜尋交易然後使用“傳送證明”功能(https://explorer.minesolo.com/)\n\n未能向調解員或仲裁員提供必要的資訊將導致敗訴。在所有發生爭議的情況下,在向調解員或仲裁員核實交易時,QWC 的傳送方承擔 100% 的責任。\n\n如果你不理解這些要求,不要在 Bisq 上交易。首先,在 Solo Discord 中尋求幫助(https://discord.minesolo.com/)。\n\n +# suppress inspection "UnusedProperty" account.altcoin.popup.cash2.msg=在 Bisq 上交易 CASH2 需要您瞭解並滿足以下要求:\n\n要傳送 CASH2,您必須使用 CASH2 錢包版本 3 或更高。\n\n在傳送交易之後,將顯示交易ID。您必須儲存此資訊。在傳送交易之後,必須立即在 simplewallet 中使用命令“getTxKey”來檢索交易金鑰。\n\n如果仲裁是必要的,您必須向調解員或仲裁員提供以下資訊:1)交易 ID,2)交易金鑰,3)收件人的 CASH2 地址。調解員或仲裁員將使用 CASH2 區塊資源管理器(https://blocks.cash2.org)驗證 CASH2 轉賬。\n\n未能向調解員或仲裁員提供必要的資訊將導致敗訴。在所有發生爭議的情況下,在向調解員或仲裁員核實交易時,CASH2 的傳送方承擔 100% 的責任。\n\n如果你不理解這些要求,不要在 Bisq 上交易。首先,在 Cash2 Discord 中尋求幫助(https://discord.gg/FGfXAYN)。 +# suppress inspection "UnusedProperty" account.altcoin.popup.qwertycoin.msg=在 Bisq 上交易 Qwertycoin 需要您瞭解並滿足以下要求:\n\n要傳送 Qwertycoin,您必須使用 Qwertycoin 錢包版本 5.1.3 或更高。\n\n在傳送交易之後,將顯示交易ID。您必須儲存此資訊。在傳送交易之後,必須立即在 simplewallet 中使用命令“get_Tx_Key”來檢索交易金鑰。\n\n如果仲裁是必要的,您必須向調解員或仲裁員提供以下資訊::1)交易 ID,、2)交易金鑰,3)收件人的 QWC 地址。調解員或仲裁員將使用 QWC 區塊資源管理器(https://explorer.qwertycoin.org)驗證 QWC 轉賬。\n\n未能向調解員或仲裁員提供必要的資訊將導致敗訴。在所有發生爭議的情況下,在向調解員或仲裁員核實交易時,QWC 的傳送方承擔 100% 的責任。\n\n如果你不理解這些要求,不要在 Bisq 上交易。首先,在 QWC Discord 中尋求幫助(https://discord.gg/rUkfnpC)。 +# suppress inspection "UnusedProperty" account.altcoin.popup.drgl.msg=在 Bisq 上交易 Dragonglass 需要您瞭解並滿足以下要求:\n\n由於 Dragonglass 提供了隱私保護,所以交易不能在公共區塊鏈上驗證。如果需要,您可以通過使用您的 TXN-Private-Key 來證明您的付款。\nTXN-Private 密匙是自動生成的一次性密匙,用於只能從 DRGL 錢包中訪問的每個交易。\n要麼通過 DRGL-wallet GUI(內部交易細節對話方塊),要麼通過 Dragonglass CLI simplewallet(使用命令“get_tx_key”)。\n\n兩者都需要 DRGL 版本的“Oathkeeper”或更高版本。\n\n如有爭議,你必須向調解員或仲裁員提供下列資料:\n\n- txn-Privite-ket\n- 交易雜湊 \n- 接收者的公開地址\n\n付款驗證可以使用上面的資料作為輸入(http://drgl.info/#check_txn)。\n\n如未能提供上述資料,或使用不相容的錢包,將會導致糾紛敗訴。Dragonglass 傳送方負責在發生爭議時向調解員或仲裁員提供 DRGL 轉賬的驗證。不需要使用付款 ID。\n\n如果您對這個過程的任何部分都不確定,請訪問(http://discord.drgl.info)上的 Dragonglass 尋求幫助。 +# suppress inspection "UnusedProperty" account.altcoin.popup.ZEC.msg=當使用 Zcash 時,您只能使用透明地址(以 t 開頭),而不能使用 z 地址(私有),因為調解員或仲裁員無法使用 z 地址驗證交易。 +# suppress inspection "UnusedProperty" account.altcoin.popup.XZC.msg=在使用 Zcoin 時,您只能使用透明的(可跟蹤的)地址,而不能使用不可跟蹤的地址,因為調解員或仲裁員無法在區塊資源管理器中使用不可跟蹤的地址驗證交易。 -account.altcoin.popup.grin.msg=GRIN 需要傳送方和接收方之間的互動過程來建立交易。請確保遵循 GRIN 項目網頁中的說明,以可靠地傳送和接收 GRIN(接收方需要線上,或至少在一定時間內線上)。\n \nBisq 只支援 Grinbox(Wallet713)錢包 URL 格式。\n\nGRIN 傳送者需要提供他們已成功傳送 GRIN 的證明。如果錢包不能提供證明,一個潛在的糾紛將被解決,有利於露齒微笑的接受者。請確保您使用了最新的支援交易證明的 Grinbox 軟體,並且您瞭解傳輸和接收 GRIN 的過程以及如何建立證明。\n請參閱 https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only,以獲得關於 Grinbox 證明工具的更多資訊。\n -account.altcoin.popup.beam.msg=BEAM 需要傳送方和接收方之間的互動過程來建立交易。\n\n\n確保遵循 BEAM 項目網頁的指示可靠地傳送和接收 BEAM(接收方需要線上,或者至少在一定的時間範圍內線上)。\n\nBEAM 傳送者需要提供他們成功傳送 BEAM 的證明。一定要使用錢包軟體,可以產生這樣的證明。如果錢包不能提供證據,一個潛在的糾紛將得到解決,有利於 BEAM 接收者。 +# suppress inspection "UnusedProperty" +account.altcoin.popup.grin.msg=GRIN 需要傳送方和接收方之間的互動過程來建立交易。請確保遵循 GRIN 專案網頁中的說明,以可靠地傳送和接收 GRIN(接收方需要線上,或至少在一定時間內線上)。\n \nBisq 只支援 Grinbox(Wallet713)錢包 URL 格式。\n\nGRIN 傳送者需要提供他們已成功傳送 GRIN 的證明。如果錢包不能提供證明,一個潛在的糾紛將被解決,有利於露齒微笑的接受者。請確保您使用了最新的支援交易證明的 Grinbox 軟體,並且您瞭解傳輸和接收 GRIN 的過程以及如何建立證明。\n請參閱 https://github.com/vault713/wallet713/blob/master/docs/usage.md#transaction-proofs-grinbox-only,以獲得關於 Grinbox 證明工具的更多資訊。\n +# suppress inspection "UnusedProperty" +account.altcoin.popup.beam.msg=BEAM 需要傳送方和接收方之間的互動過程來建立交易。\n\n\n確保遵循 BEAM 專案網頁的指示可靠地傳送和接收 BEAM(接收方需要線上,或者至少在一定的時間範圍內線上)。\n\nBEAM 傳送者需要提供他們成功傳送 BEAM 的證明。一定要使用錢包軟體,可以產生這樣的證明。如果錢包不能提供證據,一個潛在的糾紛將得到解決,有利於 BEAM 接收者。 +# suppress inspection "UnusedProperty" account.altcoin.popup.pars.msg=在 Bisq 上交易 ParsiCoin 需要您瞭解並滿足以下要求:\n\n要傳送 PARS ,您必須使用官方 ParsiCoin Wallet 版本 3.0.0 或更高。\n\n您可以在 GUI 錢包(ParsiPay)的交易部分檢查您的交易雜湊和交易鍵,您需要右鍵單擊“交易”,然後單擊“顯示詳情”。\n\n如果仲裁是 100% 必要的,您必須向調解員或仲裁員提供以下內容:1)交易雜湊,2)交易金鑰,以及3)接收方的 PARS 地址。調解員或仲裁員將使用 ParsiCoin 區塊鏈瀏覽器 (http://explorer.parsicoin.net/#check_payment)驗證 PARS 傳輸。\n\n如果你不瞭解這些要求,不要在 Bisq 上交易。首先,在 ParsiCoin Discord 尋求幫助(https://discord.gg/c7qmFNh)。 +# suppress inspection "UnusedProperty" account.altcoin.popup.blk-burnt.msg=要交易燒燬的貨幣,你需要知道以下幾點:\n\n燒燬的貨幣是不能花的。要在 Bisq 上交易它們,輸出指令碼需要採用以下形式:OP_RETURN OP_PUSHDATA,後跟相關的資料位元組,這些位元組經過十六進位制編碼後構成地址。例如,地址為666f6f(在UTF-8中的"foo")的燒燬的貨幣將有以下指令碼:\n\nOP_RETURN OP_PUSHDATA 666f6f\n\n要建立燒燬的貨幣,您可以使用“燒燬”RPC命令,它在一些錢包可用。\n\n對於可能的情況,可以檢視 https://ibo.laboratorium.ee\n\n因為燒燬的貨幣是不能用的,所以不能重新出售。“出售”燒燬的貨幣意味著焚燒初始的貨幣(與目的地地址相關聯的資料)。\n\n如果發生爭議,BLK 賣方需要提供交易雜湊。 +# suppress inspection "UnusedProperty" account.altcoin.popup.liquidbitcoin.msg=在 Bisq 上交易 L-BTC 你必須理解下述條款:\n\n當你在 Bisq 上接受 L-BTC 交易時,你不能使用手機 Blockstream Green Wallet 或者是一個託管/交易錢包。你必須只接收 L-BTC 到 Liquid Elements Core 錢包,或另一個 L-BTC 錢包且允許你獲得匿名的 L-BTC 地址以及金鑰。\n\n在需要進行調解的情況下,或者如果發生了交易糾紛,您必須將接收 L-BTC地址的安全金鑰披露給 Bisq 調解員或退款代理,以便他們能夠在他們自己的 Elements Core 全節點上驗證您的匿名交易的細節。\n\n如果你不瞭解或瞭解這些要求,不要在 Bisq 上交易 L-BTC。 account.fiat.yourFiatAccounts=您的法定貨幣賬戶 @@ -1213,7 +1222,6 @@ account.backup.location=備份路徑 account.backup.selectLocation=選擇備份路徑 account.backup.backupNow=立即備份(備份沒有被加密!) account.backup.appDir=應用程式資料目錄 -account.backup.logFile=日誌檔案 account.backup.openDirectory=開啟目錄 account.backup.openLogFile=開啟日誌檔案 account.backup.success=備份成功儲存在:\n{0} @@ -1241,14 +1249,11 @@ account.seed.restore.ok=好的,立即執行回覆並且關閉 Bisq account.notifications.setup.title=安裝 account.notifications.download.label=下載手機應用 -account.notifications.download.button=下載 account.notifications.waitingForWebCam=等待網路攝像頭... account.notifications.webCamWindow.headline=用手機掃描二維碼 account.notifications.webcam.label=使用網路攝像頭 account.notifications.webcam.button=掃描二維碼 account.notifications.noWebcam.button=我沒有網路攝像頭 -account.notifications.testMsg.label=傳送測試通知 -account.notifications.testMsg.title=測試 account.notifications.erase.label=在手機上清除通知 account.notifications.erase.title=清除通知 account.notifications.email.label=驗證碼 @@ -1274,7 +1279,7 @@ account.notifications.dispute.message.msg=您收到了一個 ID 為 {0} 的交 account.notifications.marketAlert.title=報價提醒 account.notifications.marketAlert.selectPaymentAccount=提供匹配的付款帳戶 -account.notifications.marketAlert.offerType.label=我感興趣的報價類型 +account.notifications.marketAlert.offerType.label=我感興趣的報價型別 account.notifications.marketAlert.offerType.buy=買入報價(我想要出售 BTC ) account.notifications.marketAlert.offerType.sell=賣出報價(我想要購買 BTC ) account.notifications.marketAlert.trigger=報價距離(%) @@ -1283,18 +1288,16 @@ account.notifications.marketAlert.trigger.prompt=與市場價格的百分比距 account.notifications.marketAlert.addButton=新增報價提醒 account.notifications.marketAlert.manageAlertsButton=管理報價提醒 account.notifications.marketAlert.manageAlerts.title=管理報價提醒 -account.notifications.marketAlert.manageAlerts.label=報價提醒 -account.notifications.marketAlert.manageAlerts.item=觸發價格 {1} 以及支付賬戶為 {2} 的報價提醒 {0} account.notifications.marketAlert.manageAlerts.header.paymentAccount=支付賬戶 account.notifications.marketAlert.manageAlerts.header.trigger=觸發價格 -account.notifications.marketAlert.manageAlerts.header.offerType=報價類型 +account.notifications.marketAlert.manageAlerts.header.offerType=報價型別 account.notifications.marketAlert.message.title=報價提醒 account.notifications.marketAlert.message.msg.below=低於 account.notifications.marketAlert.message.msg.above=高於 account.notifications.marketAlert.message.msg=價格為 {2}({3} {4}市場價)和支付方式為 {5} 的報價 {0} {1} 已釋出到 Bisq 報價列表。\n報價ID: {6}。 account.notifications.priceAlert.message.title=價格提醒 {0} account.notifications.priceAlert.message.msg=您的價格提醒已被觸發。當前 {0} 的價格為 {1} {2} -account.notifications.noWebCamFound.warning=未找到網路攝像頭。\n\n請使用電子郵件選項將程式碼和加密金鑰從您的手機發送到 Bisq 應用程式。 +account.notifications.noWebCamFound.warning=未找到網路攝像頭。\n\n請使用電子郵件選項將程式碼和加密金鑰從您的手機傳送到 Bisq 應用程式。 account.notifications.priceAlert.warning.highPriceTooLow=較高的價格必須大於較低的價格。 account.notifications.priceAlert.warning.lowerPriceTooHigh=較低的價格必須低於較高的價格。 @@ -1321,7 +1324,6 @@ dao.unverifiedBsqBalance=所有未驗證交易的餘額(等待區塊確認) dao.lockedForVoteBalance=用於投票 dao.lockedInBonds=凍結餘額 dao.availableNonBsqBalance=可用的非 BSQ 餘額(BTC) -dao.totalBsqBalance=BSQ 總額 dao.reputationBalance=聲望值(不會花費) dao.tx.published.success=你的交易已經成功釋出 @@ -1407,7 +1409,7 @@ dao.param.QUORUM_COMP_REQUEST=BSQ 要求的報償申請的仲裁人數 # suppress inspection "UnusedProperty" dao.param.QUORUM_REIMBURSEMENT=BSQ 要求的退還申請的仲裁人數 # suppress inspection "UnusedProperty" -dao.param.QUORUM_CHANGE_PARAM=BSQ 要求的改變參數的仲裁人數 +dao.param.QUORUM_CHANGE_PARAM=BSQ 要求的改變引數的仲裁人數 # suppress inspection "UnusedProperty" dao.param.QUORUM_REMOVE_ASSET=BSQ 要求的移除資產要求的人數 # suppress inspection "UnusedProperty" @@ -1422,7 +1424,7 @@ dao.param.THRESHOLD_COMP_REQUEST=報償申請的要求百分比 # suppress inspection "UnusedProperty" dao.param.THRESHOLD_REIMBURSEMENT=退還申請的要求百分比 # suppress inspection "UnusedProperty" -dao.param.THRESHOLD_CHANGE_PARAM=改變參數的要求百分比 +dao.param.THRESHOLD_CHANGE_PARAM=改變引數的要求百分比 # suppress inspection "UnusedProperty" dao.param.THRESHOLD_REMOVE_ASSET=移除資產的要求百分比 # suppress inspection "UnusedProperty" @@ -1455,11 +1457,6 @@ dao.param.currentValue=當前值:{0} dao.param.currentAndPastValue=當前餘額:{0}(提案時的餘額:{1}) dao.param.blocks={0} 區塊 -dao.results.cycle.duration.label={0} 的週期 -dao.results.cycle.duration.value={0} 區塊 -dao.results.cycle.value.postFix.isDefaultValue=(預設值) -dao.results.cycle.value.postFix.hasChanged=(在投票中更改) - dao.results.invalidVotes=在那個投票週期中,我們有無效的投票。如果投票沒有在 Bisq 網路中很好地分佈,就會發生這種情況。\n{0} # suppress inspection "UnusedProperty" @@ -1501,9 +1498,9 @@ dao.bond.reputation.salt=鹽 dao.bond.reputation.hash=雜湊 dao.bond.reputation.lockupButton=鎖定 dao.bond.reputation.lockup.headline=確認鎖定交易 -dao.bond.reputation.lockup.details=鎖定金額:{0}\n鎖定時間:{1} 區塊(≈{2})\n\n挖礦手續費:{3}({4} 聰/Byte)\n交易大小:{5} Kb\n\n你想繼續這個操作嗎? +dao.bond.reputation.lockup.details=Lockup amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.reputation.unlock.headline=確認解鎖交易 -dao.bond.reputation.unlock.details=解鎖金額:{0}\n解鎖時間:{1} 區塊(≈{2})\n\n挖礦手續費:{3}({4} 聰/Byte)\n交易大小:{5} Kb\n\n你想繼續這個操作嗎? +dao.bond.reputation.unlock.details=Unlock amount: {0}\nUnlock time: {1} block(s) (≈{2})\n\nMining fee: {3} ({4} Satoshis/vbyte)\nTransaction vsize: {5} Kb\n\nAre you sure you want to proceed? dao.bond.allBonds.header=所有擔保 @@ -1520,7 +1517,7 @@ dao.bond.details.blocks={0} 區塊 dao.bond.table.column.name=名稱 dao.bond.table.column.link=繫結 -dao.bond.table.column.bondType=連線類型 +dao.bond.table.column.bondType=連線型別 dao.bond.table.column.details=詳情 dao.bond.table.column.lockupTxId=鎖定 Tx ID dao.bond.table.column.bondState=連線狀態 @@ -1648,7 +1645,6 @@ dao.proofOfBurn.sign=驗證 dao.proofOfBurn.message=訊息 dao.proofOfBurn.sig=驗證 dao.proofOfBurn.verify=確認 -dao.proofOfBurn.verify.header=使用燒燬證明交易中的金鑰確認訊息 dao.proofOfBurn.verificationResult.ok=確認成功 dao.proofOfBurn.verificationResult.failed=確認失敗 @@ -1689,7 +1685,7 @@ dao.proposal.type.BONDED_ROLE=擔保角色的提案 # suppress inspection "UnusedProperty" dao.proposal.type.REMOVE_ASSET=移除資產提案 # suppress inspection "UnusedProperty" -dao.proposal.type.CHANGE_PARAM=修改參數的提議 +dao.proposal.type.CHANGE_PARAM=修改引數的提議 # suppress inspection "UnusedProperty" dao.proposal.type.GENERIC=一般提議 # suppress inspection "UnusedProperty" @@ -1706,7 +1702,7 @@ dao.proposal.type.short.BONDED_ROLE=擔保角色 # suppress inspection "UnusedProperty" dao.proposal.type.short.REMOVE_ASSET=移除一個數字貨幣 # suppress inspection "UnusedProperty" -dao.proposal.type.short.CHANGE_PARAM=修改參數 +dao.proposal.type.short.CHANGE_PARAM=修改引數 # suppress inspection "UnusedProperty" dao.proposal.type.short.GENERIC=一般提議 # suppress inspection "UnusedProperty" @@ -1729,32 +1725,31 @@ dao.proposal.myVote.stake.prompt=在投票中最大可用份額:{0} dao.proposal.votes.header=設定投票的份額,併發布您的投票 dao.proposal.myVote.button=釋出投票 dao.proposal.myVote.setStake.description=在對所有提案進行投票後,您必須鎖定BSQ來設定投票的份額。您鎖定的 BSQ 越多,你的投票權重就越大。\n\n投票會鎖定 BSQ 將在投票顯示階段再次解鎖。 -dao.proposal.create.selectProposalType=選擇提案類型 +dao.proposal.create.selectProposalType=選擇提案型別 dao.proposal.create.phase.inactive=請等到下一個提案階段 -dao.proposal.create.proposalType=提議類型 +dao.proposal.create.proposalType=提議型別 dao.proposal.create.new=建立新的賠償要求 dao.proposal.create.button=建立賠償要求 dao.proposal.create.publish=釋出提案 dao.proposal.create.publishing=正在釋出提案中... dao.proposal=提案 -dao.proposal.display.type=提議類型 +dao.proposal.display.type=提議型別 dao.proposal.display.name=確切的 GitHub 的使用者名稱 dao.proposal.display.link=詳情的連結 dao.proposal.display.link.prompt=提案的連結 dao.proposal.display.requestedBsq=申請的 BSQ 數量 -dao.proposal.display.bsqAddress=BSQ 地址 dao.proposal.display.txId=提案交易 ID dao.proposal.display.proposalFee=提案手續費 dao.proposal.display.myVote=我的投票 dao.proposal.display.voteResult=投票結果總結 -dao.proposal.display.bondedRoleComboBox.label=擔保角色類型 +dao.proposal.display.bondedRoleComboBox.label=擔保角色型別 dao.proposal.display.requiredBondForRole.label=角色需要的擔保 -dao.proposal.display.tickerSymbol.label=份額編號 dao.proposal.display.option=選項 -dao.proposal.table.header.proposalType=提議類型 +dao.proposal.table.header.proposalType=提議型別 dao.proposal.table.header.link=繫結 dao.proposal.table.header.myVote=我的投票 +# suppress inspection "UnusedProperty" dao.proposal.table.header.remove=移除 dao.proposal.table.icon.tooltip.removeProposal=移除我的提案 dao.proposal.table.icon.tooltip.changeVote=當前投票:“{0}”。更改投票至:“{1}” @@ -1770,8 +1765,8 @@ dao.proposal.voteResult.success=已接受 dao.proposal.voteResult.failed=已拒絕 dao.proposal.voteResult.summary=結果:{0};閾值:{1}(要求> {2});仲裁人數:{3}(要求> {4}) -dao.proposal.display.paramComboBox.label=選擇需要改變的參數 -dao.proposal.display.paramValue=參數值 +dao.proposal.display.paramComboBox.label=選擇需要改變的引數 +dao.proposal.display.paramValue=引數值 dao.proposal.display.confiscateBondComboBox.label=選擇擔保 dao.proposal.display.assetComboBox.label=需要移除的資產 @@ -1790,30 +1785,21 @@ dao.wallet.dashboard.myBalance=我的錢包餘額 dao.wallet.receive.fundYourWallet=你的 BSQ 接收地址 dao.wallet.receive.bsqAddress=BSQ 錢包地址(重新整理未使用地址) -dao.wallet.receive.dao.headline=Bisq DAO -dao.wallet.receive.daoInfo=正如 Bisq 交易是分散的,並且不受審查,它的治理模型也是如此 — Bisq DAO 和 BSQ 是使其成為可能的工具。 -dao.wallet.receive.daoInfo.button=瞭解有關 Bisq DAO 的更多資訊 -dao.wallet.receive.daoTestnetInfo=核心網路 Bisq DAO 還沒有啟動,但是您可以通過在測試網路上執行它來了解 Bisq DAO 。 -dao.wallet.receive.daoTestnetInfo.button=如何在我們的測試網路上執行 Bisq DAO -dao.wallet.receive.daoContributorInfo=如果您對 Bisq 有貢獻,請使用下面的 BSQ 地址,並申請參與 BSQ 初始分發。 -dao.wallet.receive.daoContributorInfo.button=如何加入 BSQ 初始分發 - dao.wallet.send.sendFunds=提現 dao.wallet.send.sendBtcFunds=傳送非 BSQ 資金(BTC) dao.wallet.send.amount=BSQ 數量 dao.wallet.send.btcAmount=BTC 數量(無 BSQ 資金) dao.wallet.send.setAmount=設定提現數量(最小量 {0}) -dao.wallet.send.setBtcAmount=設定 BTC 提現數量(最小量 {0}) dao.wallet.send.receiverAddress=接收者的 BSQ 地址 dao.wallet.send.receiverBtcAddress=接收者的 BTC 地址 dao.wallet.send.setDestinationAddress=輸入您的目標地址 dao.wallet.send.send=傳送 BSQ 資金 dao.wallet.send.sendBtc=傳送 BTC 資金 dao.wallet.send.sendFunds.headline=確定提現申請 -dao.wallet.send.sendFunds.details=傳送:{0}\n來自:{1}\n要求的交易費:{2}({3} 聰/byte)\n交易大小:{4} Kb\n\n收件人將收到:{5}\n\n您確定您想要提現這些數量嗎? +dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount? dao.wallet.chainHeightSynced=最新確認區塊:{0} dao.wallet.chainHeightSyncing=等待區塊... 已確認{0}/{1}區塊 -dao.wallet.tx.type=類型 +dao.wallet.tx.type=型別 # suppress inspection "UnusedProperty" dao.tx.type.enum.UNDEFINED=未定義 @@ -1868,9 +1854,9 @@ dao.proposal.create.missingMinerFeeFunds=您沒有足夠的BTC資金來支付該 dao.proposal.create.missingIssuanceFunds=您沒有足夠的BTC資金來支付該提案交易。所有的 BSQ交易需要用 BTC 支付挖礦手續費以及發起交易也需要用 BTC 支付所需的 BSQ 數量({0} 聰/BSQ)\n缺少:{1} dao.feeTx.confirm=確認 {0} 交易 -dao.feeTx.confirm.details={0}手續費:{1}\n礦工手續費:{2}({3} 聰/byte)\n交易大小:{4} Kb\n\n您確定您要傳送這個 {5} 交易嗎? +dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/vbyte)\nTransaction vsize: {4} vKb\n\nAre you sure you want to publish the {5} transaction? -dao.feeTx.issuanceProposal.confirm.details={0}手續費:{1}\n為 BSQ 提案所需要的BTC:{2}({3}聰 / BSQ)\n挖礦手續費:{4}({5}聰 /位元組)\n交易大小:{6}Kb\n\n如果你的要求被批准,你將收到你要求數量的 2 個 BSQ 提議的費用。\n\n你確定你想要釋出{7}交易? +dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/vbyte)\nTransaction vsize: {6} vKb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction? dao.news.bisqDAO.title=Bisq DAO dao.news.bisqDAO.description=正如 Bisq交易是分散的,並且不受審查,它的治理模型也是如此—— Bisq DAO 和 BSQ 是使其成為可能的工具。 @@ -1940,8 +1926,6 @@ dao.monitor.blindVote.table.numBlindVotes=匿名投票編號 dao.factsAndFigures.menuItem.supply=BSQ 供給 dao.factsAndFigures.menuItem.transactions=BSQ 交易 -dao.factsAndFigures.dashboard.marketPrice=市場資料 -dao.factsAndFigures.dashboard.price=最新的 BSQ/BTC 的市場價(在 Bisq) dao.factsAndFigures.dashboard.avgPrice90=90天平均 BSQ/BTC 交易價格 dao.factsAndFigures.dashboard.avgPrice30=30天平均 BSQ/BTC 交易價格 dao.factsAndFigures.dashboard.avgUSDPrice90=90 天成交量加權平均 USD/BSQ 交易價格 @@ -1960,7 +1944,7 @@ dao.factsAndFigures.supply.burnt=BSQ 燒燬總量 dao.factsAndFigures.supply.burntMovingAverage=15天動態平均線 dao.factsAndFigures.supply.burntZoomToInliers=放大至 inliers -dao.factsAndFigures.supply.locked=BSQ 全局鎖定狀態 +dao.factsAndFigures.supply.locked=BSQ 全域性鎖定狀態 dao.factsAndFigures.supply.totalLockedUpAmount=擔保的鎖定 dao.factsAndFigures.supply.totalUnlockingAmount=正在從擔保解鎖 BSQ dao.factsAndFigures.supply.totalUnlockedAmount=已從擔保解鎖 BSQ @@ -2018,7 +2002,6 @@ disputeSummaryWindow.payout=交易金額支付 disputeSummaryWindow.payout.getsTradeAmount=BTC {0} 獲得交易金額支付 disputeSummaryWindow.payout.getsAll=BTC {0} 獲取全部 disputeSummaryWindow.payout.custom=自定義支付 -disputeSummaryWindow.payout.adjustAmount=輸入金額超過 {0} 的可用金額。\n我們將此輸入欄位調整為最大可能值。 disputeSummaryWindow.payoutAmount.buyer=買家支付金額 disputeSummaryWindow.payoutAmount.seller=賣家支付金額 disputeSummaryWindow.payoutAmount.invert=使用失敗者作為釋出者 @@ -2055,21 +2038,24 @@ disputeSummaryWindow.addSummaryNotes=新增總結說明 disputeSummaryWindow.close.button=關閉話題 # Do no change any line break or order of tokens as the structure is used for signature verification -disputeSummaryWindow.close.msg=Ticket closed on {0}\n{1} node address: {2}\n\nSummary:\nTrade ID: {3}\nCurrency: {4}\nTrade amount: {5}\nPayout amount for BTC buyer: {6}\nPayout amount for BTC seller: {7}\n\nReason for dispute: {8}\n\nSummary notes:\n{9}\n +# suppress inspection "TrailingSpacesInProperty" +disputeSummaryWindow.close.msg=工單已關閉{0}\n{1} 節點地址:{12}\n\n總結:\n交易 ID:{3}\n貨幣:{4}\n交易金額:{5}\nBTC 買家支付金額:{6}\nBTC 賣家支付金額:{7}\n\n糾紛原因:{8}\n\n總結:\n{9}\n # Do no change any line break or order of tokens as the structure is used for signature verification disputeSummaryWindow.close.msgWithSig={0}{1}{2}{3} -disputeSummaryWindow.close.nextStepsForMediation=\nNext steps:\nOpen trade and accept or reject suggestion from mediator -disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\nNext steps:\nNo further action is required from you. If the arbitrator decided in your favor, you'll see a "Refund from arbitration" transaction in Funds/Transactions +disputeSummaryWindow.close.nextStepsForMediation=\n\n下一個步驟:\n開啟未完成交易,接受或拒絕建議的調解員的建議 +disputeSummaryWindow.close.nextStepsForRefundAgentArbitration=\n\n下一個步驟:\n不需要您採取進一步的行動。如果仲裁員做出了對你有利的裁決,你將在 資金/交易 頁中看到“仲裁退款”交易 disputeSummaryWindow.close.closePeer=你也需要關閉交易物件的話題! disputeSummaryWindow.close.txDetails.headline=釋出交易退款 +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.buyer=買方收到{0}在地址:{1} +# suppress inspection "TrailingSpacesInProperty" disputeSummaryWindow.close.txDetails.seller=賣方收到{0}在地址:{1} -disputeSummaryWindow.close.txDetails=費用:{0}\n{1}{2}交易費:{3}({4}satoshis/byte)\n事務大小:{5} Kb\n\n您確定要釋出此事務嗎? +disputeSummaryWindow.close.txDetails=Spending: {0}\n{1}{2}Transaction fee: {3} ({4} satoshis/vbyte)\nTransaction vsize: {5} vKb\n\nAre you sure you want to publish this transaction? -disputeSummaryWindow.close.noPayout.headline=Close without any payout -disputeSummaryWindow.close.noPayout.text=Do you want to close without doing any payout? +disputeSummaryWindow.close.noPayout.headline=未支付關閉 +disputeSummaryWindow.close.noPayout.text=你想要在未作支付的情況下關閉嗎? emptyWalletWindow.headline={0} 錢包急救工具 emptyWalletWindow.info=請在緊急情況下使用,如果您無法從 UI 中訪問您的資金。\n\n請注意,使用此工具時,所有未結報價將自動關閉。\n\n在使用此工具之前,請備份您的資料目錄。您可以在“帳戶/備份”中執行此操作。\n\n請報告我們您的問題,並在 Github 或 Bisq 論壇上提交錯誤報告,以便我們可以調查導致問題的原因。 @@ -2101,6 +2087,7 @@ filterWindow.btcNode=篩選後的比特幣節點(用逗號“,”隔開的地 filterWindow.preventPublicBtcNetwork=禁止使用公共比特幣網路 filterWindow.disableDao=禁用 DAO filterWindow.disableAutoConf=禁用自動確認 +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=DAO 最低所需要的版本 filterWindow.disableTradeBelowVersion=交易最低所需要的版本 filterWindow.add=新增篩選 @@ -2131,10 +2118,6 @@ selectDepositTxWindow.headline=選擇糾紛的存款交易 selectDepositTxWindow.msg=存款交易未儲存在交易中。\n請從您的錢包中選擇一個現有的多重驗證交易,這是在失敗的交易中使用的存款交易。\n\n您可以通過開啟交易詳細資訊視窗(點選列表中的交易 ID)並按照交易費用支付交易輸出到您看到多重驗證存款交易的下一個交易(地址從3開始),找到正確的交易。 該交易 ID 應在此處列出的列表中顯示。 一旦您找到正確的交易,請在此處選擇該交易並繼續\n\n抱歉給您帶來不便,但是錯誤的情況應該非常罕見,將來我們會嘗試找到更好的解決方法。 selectDepositTxWindow.select=選擇存款交易 -selectBaseCurrencyWindow.headline=交易所選擇 -selectBaseCurrencyWindow.msg=您選擇的預設交易所是 {0}。\n\n從下拉項裡更換您想要的基礎幣種。\n您也可以稍後在“設定/偏好”更換基礎幣種。 -selectBaseCurrencyWindow.select=選擇基礎幣種 - sendAlertMessageWindow.headline=傳送全球通知 sendAlertMessageWindow.alertMsg=提醒訊息 sendAlertMessageWindow.enterMsg=輸入訊息: @@ -2178,7 +2161,7 @@ torNetworkSettingWindow.header=Tor 網路設定 torNetworkSettingWindow.noBridges=不使用網橋 torNetworkSettingWindow.providedBridges=連線到提供的網橋 torNetworkSettingWindow.customBridges=輸入自定義網橋 -torNetworkSettingWindow.transportType=傳輸類型 +torNetworkSettingWindow.transportType=傳輸型別 torNetworkSettingWindow.obfs3=obfs3 torNetworkSettingWindow.obfs4=obfs4(推薦) torNetworkSettingWindow.meekAmazon=meek-amazon @@ -2219,7 +2202,7 @@ popup.headline.error=錯誤 popup.doNotShowAgain=不要再顯示 popup.reportError.log=開啟日誌檔案 popup.reportError.gitHub=報告至 Github issue tracker -popup.reportError={0}\n\n為了幫助我們改進軟體,請在 https://github.com/bisq-network/bisq/issues 上開啟一個新問題來報告這個 bug 。\n\n當您單擊下面任意一個按鈕時,上面的錯誤訊息將被複制到剪貼簿。\n\n如果您通過按下“開啟日誌檔案”,儲存一份副本,並將其附加到 bug 報告中,如果包含 bisq.log 檔案,那麼偵錯就會變得更容易。 +popup.reportError={0}\n\n為了幫助我們改進軟體,請在 https://github.com/bisq-network/bisq/issues 上開啟一個新問題來報告這個 bug 。\n\n當您單擊下面任意一個按鈕時,上面的錯誤訊息將被複制到剪貼簿。\n\n如果您通過按下“開啟日誌檔案”,儲存一份副本,並將其附加到 bug 報告中,如果包含 bisq.log 檔案,那麼除錯就會變得更容易。 popup.error.tryRestart=請嘗試重啟您的應用程式或者檢查您的網路連線。 popup.error.takeOfferRequestFailed=當有人試圖接受你的報價時發生了一個錯誤:\n{0} @@ -2234,7 +2217,6 @@ popup.warning.osxKeyLoggerWarning=由於 MacOS 10.14 及更高版本中的安全 popup.warning.wrongVersion=您這臺電腦上可能有錯誤的 Bisq 版本。\n您的電腦的架構是:{0}\n您安裝的 Bisq 二進位制檔案是:{1}\n請關閉並重新安裝正確的版本({2})。 popup.warning.incompatibleDB=我們檢測到不相容的資料庫檔案!\n\n那些資料庫檔案與我們當前的程式碼庫不相容:\n{0}\n\n我們對損壞的檔案進行了備份,並將預設值應用於新的資料庫版本。\n\n備份位於:\n{1}/db/backup_of_corrupted_data。\n\n請檢查您是否安裝了最新版本的 Bisq\n您可以下載:\nhttps://bisq.network/downloads\n\n請重新啟動應用程式。 popup.warning.startupFailed.twoInstances=Bisq 已經在執行。 您不能執行兩個 Bisq 例項。 -popup.warning.cryptoTestFailed=看起來你使用自編譯的二進位制檔案,並且沒有遵循 https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys\n\n如果不是這種情況,並且使用官方的 Bisq 二進位制檔案,請向 Github 頁面提交錯誤報告。\n錯誤={0} popup.warning.tradePeriod.halfReached=您與 ID {0} 的交易已達到最長交易期的一半,且仍未完成。\n\n交易期結束於 {1}\n\n請檢視“業務/未完成交易”的交易狀態,以獲取更多資訊。 popup.warning.tradePeriod.ended=您與 ID {0} 的已達到最長交易期,且未完成。\n\n交易期結束於 {1}\n\n請檢視“業務/未完成交易”的交易狀態,以從調解員獲取更多資訊。 popup.warning.noTradingAccountSetup.headline=您還沒有設定交易賬戶 @@ -2255,10 +2237,12 @@ popup.warning.btcChangeBelowDustException=該交易建立的更改輸出低於 popup.warning.insufficientBsqFundsForBtcFeePayment=您需要更多的 BSQ 去完成這筆交易 - 錢包中最後剩餘 5.46 BSQ 將無法用於支付交易手續費因為 BTC 協議中的零頭限制。\n\n你可以購買更多的 BSQ 或用 BTC支付交易手續費\n\n缺少 BSQ 資金:{0} popup.warning.noBsqFundsForBtcFeePayment=您的 BSQ 錢包沒有足夠的資金支付 BSQ 的交易費用。 -popup.warning.messageTooLong=您的資訊超過最大允許的大小。請將其分成多個部分發送,或將其上傳到 https://pastebin.com 之類的伺服器。 +popup.warning.messageTooLong=您的資訊超過最大允許的大小。請將其分成多個部分傳送,或將其上傳到 https://pastebin.com 之類的伺服器。 popup.warning.lockedUpFunds=你已經從一個失敗的交易中凍結了資金。\n凍結餘額:{0}\n存款tx地址:{1}\n交易單號:{2}\n\n請通過選擇待處理交易介面中的交易並點選“alt + o”或“option+ o”開啟幫助話題。 +# suppress inspection "UnusedProperty" popup.warning.nodeBanned=其中一個 {0} 節點已被禁用 +# suppress inspection "UnusedProperty" popup.warning.priceRelay=價格傳遞 popup.warning.seed=種子 popup.warning.mandatoryUpdate.trading=請更新到最新的 Bisq 版本。強制更新禁止了舊版本進行交易。更多資訊請訪問 Bisq 論壇。 @@ -2274,17 +2258,12 @@ popup.warning.trade.txRejected=使用 ID {1} 進行交易的 {0} 交易被比特 popup.warning.openOfferWithInvalidMakerFeeTx=交易 ID 為 {0} 的掛單費交易無效。\n交易 ID = {1}。\n請到“設定/網路資訊”進行 SPV 重新同步。\n如需更多幫助,請聯絡 Bisq Keybase 團隊的 Support 頻道 -popup.warning.trade.depositTxNull=交易 ID 為 {0} 沒有設定保證金交易。\n\n請重新啟動應用程式以檢查是否仍然存在上述問題。\n\n如果問題仍然存在,請點選交易 ID 開啟交易詳情彈窗。然後點選買家手續費交易的交易 ID 和賣家的交易 ID 以在區塊瀏覽器中瞭解詳情。一個交易如果不能在區塊瀏覽器中查詢則很可能是一個無效交易。\n\n如果發生,請報告在 Keybase 中 Bisq 團隊(https://keybase.io/team/bisq)中的 #support 頻道。如果你的交易手續費交易不存在,且沒有資金在錢包中,你可以將交易移至失敗交易,然後使用 SPV 重新同步以讓資金重現(下方有詳細步驟)\n\n如果你的交易手續費交易存在,這些手續費會丟失,您還可以在 GitHub 上的支援庫中提出報銷請求(https://github.com/bisq-network/support/issues)。\n\n在這兩種情況下,請做一個 SPV 重新同步從“設定/網路”頁面,以解決您的錢包任何問題! - -popup.warning.trade.depositTxNull.moveToFailedTrades=移至失敗交易 -popup.warning.trade.depositTxNull.shutDown=關閉 Bisq - popup.info.securityDepositInfo=為了確保雙方都遵守交易協議,雙方都需要支付保證金。\n\n這筆存款一直儲存在您的交易錢包裡,直到您的交易成功完成,然後再退還給您。\n\n請注意:如果您正在建立一個新的報價,Bisq 需要執行另一個交易員接受它。為了讓您的報價線上,保持 Bisq 執行,並確保這臺計算機也線上(即,確保它沒有切換到待機模式…顯示器可以待機)。 popup.info.cashDepositInfo=請確保您在您的地區有一個銀行分行,以便能夠進行現金存款。\n賣方銀行的銀行 ID(BIC/SWIFT)為:{0}。 popup.info.cashDepositInfo.confirm=我確認我可以支付保證金 popup.info.shutDownWithOpenOffers=Bisq 正在被關閉,但仍有公開的報價。\n\n當 Bisq 關閉時,這些提供將不能在 P2P 網路上使用,但是它們將在您下次啟動 Bisq 時重新發布到 P2P 網路上。\n\n為了讓您的報價線上,保持 Bisq 執行,並確保這臺計算機也線上(即,確保它不會進入待機模式…顯示器待機不是問題)。 -popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at https://bisq.wiki/Running_Bisq_on_Qubes +popup.info.qubesOSSetupInfo=It appears you are running Bisq on Qubes OS. \n\nPlease make sure your Bisq qube is setup according to our Setup Guide at [HYPERLINK:https://bisq.wiki/Running_Bisq_on_Qubes]. popup.privateNotification.headline=重要私人通知! @@ -2302,12 +2281,6 @@ popup.attention.forTradeWithId=交易 ID {0} 需要注意 popup.info.multiplePaymentAccounts.headline=多個支付賬戶可用 popup.info.multiplePaymentAccounts.msg=您有多個支付帳戶在這個報價中可用。請確你做了正確的選擇。 -popup.news.launch.headline=兩個重要更新 -popup.news.launch.accountSigning.headline=賬戶驗證 -popup.news.launch.accountSigning.description=提高0.01 BTC 的法幣交易限制,從認證的交易者購買 BTC。 -popup.news.launch.ntp.headline=新的交易協議 -popup.news.launch.ntp.description=新的兩級爭端解決系統使 Bisq 更安全、可擴充套件、更能抵抗審查。 - popup.accountSigning.selectAccounts.headline=選擇付款賬戶 popup.accountSigning.selectAccounts.description=根據付款方式和時間點,所有與支付給買方的付款發生的爭議有關的付款帳戶將被選擇讓您驗證。 popup.accountSigning.selectAccounts.signAll=驗證所有付款方式 @@ -2343,7 +2316,6 @@ popup.accountSigning.successSingleAccount.signError=未能成功驗證證據,{ popup.accountSigning.unsignedPubKeys.headline=未驗證公鑰 popup.accountSigning.unsignedPubKeys.sign=驗證公鑰 popup.accountSigning.unsignedPubKeys.signed=公鑰已被驗證 -popup.accountSigning.unsignedPubKeys.result.headline=驗證已完成 popup.accountSigning.unsignedPubKeys.result.signed=已驗證公鑰 popup.accountSigning.unsignedPubKeys.result.failed=未能驗證公鑰 @@ -2382,7 +2354,7 @@ systemTray.tooltip=Bisq:去中心化比特幣交易網路 # GUI Util #################################################################### -guiUtil.miningFeeInfo=請確保您的外部錢包使用的礦工手續費費用足夠高至少為 {0} ,以便礦工接受資金交易。\n否則交易所交易無法確認,交易最終將會出現糾紛。 +guiUtil.miningFeeInfo=Please be sure that the mining fee used by your external wallet is at least {0} satoshis/vbyte. Otherwise the trade transactions may not be confirmed in time and the trade will end up in a dispute. guiUtil.accountExport.savedToPath=交易賬戶儲存在路徑:\n{0} guiUtil.accountExport.noAccountSetup=您沒有交易賬戶設定匯出。 @@ -2422,7 +2394,7 @@ peerInfoIcon.tooltip.age=支付賬戶在 {0} 前建立。 peerInfoIcon.tooltip.unknownAge=支付賬戶賬齡未知。 tooltip.openPopupForDetails=開啟彈出視窗的詳細資訊 -tooltip.invalidTradeState.warning=This trade is in an invalid state. Open the details window for more information +tooltip.invalidTradeState.warning=這個交易處於不可用狀態。開啟詳情視窗以發現更多細節。 tooltip.openBlockchainForAddress=使用外部區塊鏈瀏覽器開啟地址:{0} tooltip.openBlockchainForTx=使用外部區塊鏈瀏覽器開啟交易:{0} @@ -2447,8 +2419,8 @@ addressTextField.openWallet.failed=開啟預設的比特幣錢包應用程式失 peerInfoIcon.tooltip={0}\n標識:{1} txIdTextField.copyIcon.tooltip=複製交易 ID 到剪貼簿 -txIdTextField.blockExplorerIcon.tooltip=Open a blockchain explorer with this transaction ID -txIdTextField.missingTx.warning.tooltip=Missing required transaction +txIdTextField.blockExplorerIcon.tooltip=使用外部區塊鏈瀏覽器開啟這個交易 ID +txIdTextField.missingTx.warning.tooltip=所需的交易缺失 #################################################################### @@ -2457,12 +2429,13 @@ txIdTextField.missingTx.warning.tooltip=Missing required transaction navigation.account=“賬戶” navigation.account.walletSeed=“賬戶/錢包金鑰” -navigation.funds.availableForWithdrawal=\"Funds/Send funds\" +navigation.funds.availableForWithdrawal=“資金/提現” navigation.portfolio.myOpenOffers=“資料/未完成報價” navigation.portfolio.pending=“業務/未完成交易” navigation.portfolio.closedTrades=“資料/歷史” navigation.funds.depositFunds=“資金/收到資金” navigation.settings.preferences=“設定/偏好” +# suppress inspection "UnusedProperty" navigation.funds.transactions=“資金/交易記錄” navigation.support=“幫助” navigation.dao.wallet.receive=“DAO/BSQ 錢包/接收” @@ -2525,11 +2498,11 @@ password.deriveKey=從密碼中提取金鑰 password.walletDecrypted=錢包成功解密並移除密碼保護 password.wrongPw=你輸入了錯誤的密碼。\n\n請再次嘗試輸入密碼,仔細檢查拼寫錯誤。 password.walletEncrypted=錢包成功加密並開啟密碼保護。 -password.walletEncryptionFailed=無法設定錢包密碼。您可能匯入了與錢包資料庫不匹配的還原金鑰。請在 Bisq 論壇上與開發者聯絡。 +password.walletEncryptionFailed=Wallet password could not be set. You may have imported seed words which do not match the wallet database. Please contact the developers on Keybase ([HYPERLINK:https://keybase.io/team/bisq]). password.passwordsDoNotMatch=這2個密碼您輸入的不相同 password.forgotPassword=忘記密碼? -password.backupReminder=請注意,設定錢包密碼時,所有未加密的錢包的自動建立的備份將被刪除。\n\n強烈建議您備份應用程式的目錄,並在設定密碼之前記下您的還原金鑰! -password.backupWasDone=我已經備份了 +password.backupReminder=Please note that when setting a wallet password all automatically created backups from the unencrypted wallet will be deleted.\n\nIt is highly recommended that you make a backup of the application directory and write down your seed words before setting a password! +password.backupWasDone=I have already made a backup seed.seedWords=錢包金鑰 seed.enterSeedWords=輸入錢包金鑰 @@ -2537,7 +2510,7 @@ seed.date=錢包時間 seed.restore.title=使用還原金鑰恢復錢包 seed.restore=恢復錢包 seed.creationDate=建立時間 -seed.warn.walletNotEmpty.msg=你的比特幣錢包不是空的。\n\n在嘗試恢復較舊的錢包之前,您必須清空此錢包,因為將錢包混在一起會導致無效的備份。\n\n請完成您的交易,關閉所有您的未完成報價,並轉到資金介面撤回您的比特幣。\n如果您無法訪問您的比特幣,您可以使用緊急工具清空錢包。\n要開啟該應急工具,請按“alt + e”或“option + e” 。 +seed.warn.walletNotEmpty.msg=Your Bitcoin wallet is not empty.\n\nYou must empty this wallet before attempting to restore an older one, as mixing wallets together can lead to invalidated backups.\n\nPlease finalize your trades, close all your open offers and go to the Funds section to withdraw your bitcoin.\nIn case you cannot access your bitcoin you can use the emergency tool to empty the wallet.\nTo open the emergency tool press \"Alt+e\" or \"Cmd/Ctrl+e\". seed.warn.walletNotEmpty.restore=無論如何我要恢復 seed.warn.walletNotEmpty.emptyWallet=我先清空我的錢包 seed.warn.notEncryptedAnymore=你的錢包被加密了。\n\n恢復後,錢包將不再加密,您必須設定新的密碼。\n\n你要繼續嗎? @@ -2564,7 +2537,7 @@ payment.bank.country=銀行所在國家或地區 payment.account.name.email=賬戶擁有者姓名/電子郵箱 payment.account.name.emailAndHolderId=賬戶擁有者姓名/電子郵箱 / {0} payment.bank.name=銀行名稱 -payment.select.account=選擇賬戶類型 +payment.select.account=選擇賬戶型別 payment.select.region=選擇地區 payment.select.country=選擇國家或地區 payment.select.bank.country=選擇銀行所在國家或地區 @@ -2578,12 +2551,11 @@ payment.altcoin.address=數字貨幣地址 payment.altcoin.tradeInstantCheckbox=使用數字貨幣進行即時交易( 1 小時內) payment.altcoin.tradeInstant.popup=對於即時交易,要求交易雙方都線上,能夠在不到1小時內完成交易。\n \n如果你已經有未完成的報價以及你不能即時完成,請在資料頁面禁用這些報價。 payment.altcoin=數字貨幣 -payment.select.altcoin=選擇或搜尋數字貨幣 +payment.select.altcoin=Select or search Altcoin payment.secret=密保問題 payment.answer=答案 payment.wallet=錢包 ID payment.uphold.accountId=使用者名稱或電子郵箱或電話號碼 -payment.cashApp.cashTag=$Cashtag payment.moneyBeam.accountId=電子郵箱或者電話號碼 payment.venmo.venmoUserName=Venmo 使用者名稱: payment.popmoney.accountId=電子郵箱或者電話號碼 @@ -2591,7 +2563,7 @@ payment.promptPay.promptPayId=公民身份證/稅號或電話號碼 payment.supportedCurrencies=支援的貨幣 payment.limitations=限制條件 payment.salt=帳戶年齡驗證鹽值 -payment.error.noHexSalt=鹽值需要十六進位制的。\n如果您想要從舊帳戶轉移鹽值以保留帳齡,只建議編輯鹽值欄位。帳齡通過帳戶鹽值和識別帳戶資料(例如 IBAN )來驗證。 +payment.error.noHexSalt=The salt needs to be in HEX format.\nIt is only recommended to edit the salt field if you want to transfer the salt from an old account to keep your account age. The account age is verified by using the account salt and the identifying account data (e.g. IBAN). payment.accept.euro=接受來自這些歐元國家的交易 payment.accept.nonEuro=接受來自這些非歐元國家的交易 payment.accepted.countries=接受的國家 @@ -2621,35 +2593,37 @@ payment.bankIdOptional=銀行 ID(BIC/SWIFT)(可選) payment.branchNr=分行編碼 payment.branchNrOptional=分行編碼(可選) payment.accountNrLabel=賬號(IBAN) -payment.accountType=賬戶類型 +payment.accountType=賬戶型別 payment.checking=檢查 payment.savings=儲存 payment.personalId=個人 ID payment.clearXchange.info=Zelle是一項轉賬服務,轉賬到其他銀行做的很好。\n\n1.檢查此頁面以檢視您的銀行是否(以及如何)與 Zelle 合作:\nhttps://www.zellepay.com/get-started\n\n2.特別注意您的轉賬限額-匯款限額因銀行而異,銀行通常分別指定每日,每週和每月的限額。\n\n3.如果您的銀行不能使用 Zelle,您仍然可以通過 Zelle 移動應用程式使用它,但是您的轉賬限額會低得多。\n\n4.您的 Bisq 帳戶上指定的名稱必須與 Zelle/銀行帳戶上的名稱匹配。 \n\n如果您無法按照貿易合同中的規定完成 Zelle 交易,則可能會損失部分(或全部)保證金。\n\n由於 Zelle 的拒付風險較高,因此建議賣家通過電子郵件或 SMS 與未簽名的買家聯絡,以確認買家確實擁有 Bisq 中指定的 Zelle 帳戶。 -payment.fasterPayments.newRequirements.info=有些銀行已經開始核實快捷支付收款人的全名。您當前的快捷支付帳戶沒有填寫全名。\n\n請考慮在 Bisq 中重新建立您的快捷支付帳戶,為將來的 {0} 買家提供一個完整的姓名。\n\n重新建立帳戶時,請確保將銀行區號、帳戶編號和帳齡驗證鹽值從舊帳戶複製到新帳戶。這將確保您現有的帳齡和簽名狀態得到保留。\n\n -payment.moneyGram.info=使用 MoneyGram 時,BTC 買方必須將授權號碼和收據的照片通過電子郵件傳送給 BTC 賣方。收據必須清楚地顯示賣方的全名、國家或地區、州和金額。買方將在交易過程中顯示賣方的電子郵件。 -payment.westernUnion.info=使用 Western Union 時,BTC 買方必須通過電子郵件將 MTCN(運單號)和收據照片傳送給 BTC 賣方。收據上必須清楚地顯示賣方的全名、城市、國家或地區和金額。買方將在交易過程中顯示賣方的電子郵件。 +payment.fasterPayments.newRequirements.info=有些銀行已經開始核實快捷支付收款人的全名。您當前的快捷支付帳戶沒有填寫全名。\n\n請考慮在 Bisq 中重新建立您的快捷支付帳戶,為將來的 {0} 買家提供一個完整的姓名。\n\n重新建立帳戶時,請確保將銀行區號、帳戶編號和帳齡驗證鹽值從舊帳戶複製到新帳戶。這將確保您現有的帳齡和簽名狀態得到保留。 +payment.moneyGram.info=When using MoneyGram the BTC buyer has to send the Authorisation number and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, country, state and the amount. The seller's email will be displayed to the buyer during the trade process. +payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. The receipt must clearly show the seller's full name, city, country and the amount. The seller's email will be displayed to the buyer during the trade process. payment.halCash.info=使用 HalCash 時,BTC 買方需要通過手機簡訊向 BTC 賣方傳送 HalCash 程式碼。\n\n請確保不要超過銀行允許您用半現金匯款的最高金額。每次取款的最低金額是 10 歐元,最高金額是 10 歐元。金額是 600 歐元。對於重複取款,每天每個接收者 3000 歐元,每月每個接收者 6000 歐元。請與您的銀行核對這些限額,以確保它們使用與此處所述相同的限額。\n\n提現金額必須是 10 歐元的倍數,因為您不能從 ATM 機提取其他金額。 建立報價和下單螢幕中的 UI 將調整 BTC 金額,使 EUR 金額正確。你不能使用基於市場的價格,因為歐元的數量會隨著價格的變化而變化。\n -payment.limits.info=請注意,所有銀行轉賬都有一定的退款風險。\n\n為了降低這一風險,Bisq 基於兩個因素對每筆交易設定了限制:\n\n1. 使用的付款方法的預估退款風險水平\n2. 您的付款方式的賬齡\n\n您現在建立的帳戶是新的,它的賬齡為零。隨著你的賬齡增長,你的每筆交易限額也會隨之增長:\n\n●在第一個月,您的每筆交易限額為 {0}\n●在第二個月,您的每筆交易限額將為 {1}\n●第二個月後,您的每筆交易限額為 {2}\n\n請注意:限制只應用在單筆交易,你可以儘可能多的進行交易。 -payment.limits.info.withSigning=為了降低這一風險,Bisq 基於兩個因素對該付款方式每筆交易設定了限制:\n\n1. 使用的付款方法的預估退款風險水平\n2. 您的付款方式的賬齡\n\n這個付款賬戶還沒有被驗證,所以他每個交易最多購買{0}。在驗證之後,購買限制會以以下規則逐漸增加:\n\n●簽署前,以及簽署後30天內,您的每筆最大交易將限制為{0}\n●簽署後30天,每筆最大交易將限制為{1}\n●簽署後60天,每筆最大交易將限制為{2}\n\n出售限制不會被賬戶驗證狀態限制,會與隨著您的賬齡增加\n\n檢視更多:\nhttps://bisq.wiki/Account_limits\n\n請注意:限制只應用在單筆交易,你可以儘可能多的進行交易。 +# suppress inspection "UnusedMessageFormatParameter" +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk. To mitigate this risk, Bisq sets per-trade limits based on the estimated level of chargeback risk for the payment method used.\n\nFor this payment method, your per-trade limit for buying and selling is {2}.\n\nThis limit only applies to the size of a single trade—you can place as many trades as you like.\n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. +# suppress inspection "UnusedProperty" +payment.limits.info.withSigning=To limit chargeback risk, Bisq sets per-trade limits for this payment account type based on the following 2 factors:\n\n1. General chargeback risk for the payment method\n2. Account signing status\n\nThis payment account is not yet signed, so it is limited to buying {0} per trade. After signing, buy limits will increase as follows:\n\n● Before signing, and for 30 days after signing, your per-trade buy limit will be {0}\n● 30 days after signing, your per-trade buy limit will be {1}\n● 60 days after signing, your per-trade buy limit will be {2}\n\nSell limits are not affected by account signing. You can sell {2} in a single trade immediately.\n\nThese limits only apply to the size of a single trade—you can place as many trades as you like. \n\nSee more details on the wiki [HYPERLINK:https://bisq.wiki/Account_limits]. payment.cashDeposit.info=請確認您的銀行允許您將現金存款匯入他人賬戶。例如,美國銀行和富國銀行不再允許此類存款。 payment.revolut.info=Revolut 要求使用“使用者名稱”作為帳戶 ID,而不是像以往的電話號碼或電子郵件。 -payment.account.revolut.addUserNameInfo={0}\n您現有的 Revolut 帳戶({1})尚未設定“使用者名稱”。\n請輸入您的 Revolut ``使用者名稱''以更新您的帳戶資料。\n這不會影響您的賬齡驗證狀態。 +payment.account.revolut.addUserNameInfo={0}\nYour existing Revolut account ({1}) does not have a ''User name''.\nPlease enter your Revolut ''User name'' to update your account data.\nThis will not affect your account age signing status. payment.revolut.addUserNameInfo.headLine=更新 Revolut 賬戶 payment.usPostalMoneyOrder.info=在 Bisq 上交易 US Postal Money Orders (USPMO)您必須理解下述條款:\n\n- BTC 買方必須在傳送方和收款人欄位中都寫上 BTC 賣方的名稱,並在傳送之前對 USPMO 和信封進行高解析度照片拍照,並帶有跟蹤證明。\n- BTC 買方必須將 USPMO 連同交貨確認書一起傳送給 BTC 賣方。\n\n如果需要調解,或有交易糾紛,您將需要將照片連同 USPMO 編號,郵局編號和交易金額一起傳送給 Bisq 調解員或退款代理,以便他們進行驗證美國郵局網站上的詳細資訊。\n\n如未能提供要求的交易資料將在糾紛中直接判負\n\n在所有爭議案件中,USPMO 傳送方在向調解人或仲裁員提供證據/證明時承擔 100% 的責任。\n\n如果您不理解這些要求,請不要在 Bisq 上使用 USPMO 進行交易。 payment.f2f.contact=聯絡方式 -payment.f2f.contact.prompt=您希望如何與交易夥伴聯絡?(電子郵箱、電話號碼、…) +payment.f2f.contact.prompt=How would you like to be contacted by the trading peer? (email address, phone number,...) payment.f2f.city=“面對面”會議的城市 payment.f2f.city.prompt=城市將與報價一同顯示 payment.f2f.optionalExtra=可選的附加資訊 payment.f2f.extra=附加資訊 payment.f2f.extra.prompt=交易方可以定義“條款和條件”或新增公共聯絡資訊。它將與報價一同顯示。 -payment.f2f.info=與網上交易相比,“面對面”交易有不同的規則,也有不同的風險。\n\n主要區別是:\n●交易夥伴需要使用他們提供的聯絡方式交換關於會面地點和時間的資訊。\n●交易雙方需要攜帶膝上型電腦,在會面地點確認“已傳送付款”和“已收到付款”。\n●如果交易方有特殊的“條款和條件”,他們必須在賬戶的“附加資訊”文字框中聲明這些條款和條件。\n●在發生爭議時,調解員或仲裁員不能提供太多幫助,因為通常很難獲得有關會面上所發生情況的篡改證據。在這種情況下,BTC 資金可能會被無限期鎖定,或者直到交易雙方達成協議。\n\n為確保您完全理解“面對面”交易的不同之處,請閱讀以下說明和建議:“https://docs.bisq.network/trading-rules.html#f2f-trading” +payment.f2f.info='Face to Face' trades have different rules and come with different risks than online transactions.\n\nThe main differences are:\n● The trading peers need to exchange information about the meeting location and time by using their provided contact details.\n● The trading peers need to bring their laptops and do the confirmation of 'payment sent' and 'payment received' at the meeting place.\n● If a maker has special 'terms and conditions' they must state those in the 'Additional information' text field in the account.\n● By taking an offer the taker agrees to the maker's stated 'terms and conditions'.\n● In case of a dispute the mediator or arbitrator cannot be of much assistance as it is usually difficult to get tamper-proof evidence of what happened at the meeting. In such cases the BTC funds might get locked indefinitely or until the trading peers come to an agreement.\n\nTo be sure you fully understand the differences with 'Face to Face' trades please read the instructions and recommendations at: [HYPERLINK:https://docs.bisq.network/trading-rules.html#f2f-trading] payment.f2f.info.openURL=開啟網頁 payment.f2f.offerbook.tooltip.countryAndCity=國家或地區及城市:{0} / {1} payment.f2f.offerbook.tooltip.extra=附加資訊:{0} @@ -2658,6 +2632,10 @@ payment.japan.bank=銀行 payment.japan.branch=分行 payment.japan.account=賬戶 payment.japan.recipient=名稱 +payment.australia.payid=PayID +payment.payid=PayID linked to financial institution. Like email address or mobile phone. +payment.payid.info=A PayID like a phone number, email address or an Australian Business Number (ABN), that you can securely link to your bank, credit union or building society account. You need to have already created a PayID with your Australian financial institution. Both sending and receiving financial institutions must support PayID. For more information please check [HYPERLINK:https://payid.com.au/faqs/] +payment.amazonGiftCard.info=To pay with Amazon eGift Card you need to purchase an Amazon eGift Card at your Amazon account and use the BTC seller''s email or mobile nr. as receiver. Amazon sends then an email or text message to the receiver. Use the trade ID for the message field.\n\nAmazon eGift Cards can only be redeemed by Amazon accounts with the same currency.\n\nFor more information visit the Amazon eGift Card webpage. [HYPERLINK:https://www.amazon.com/Amazon-1_US_Email-eGift-Card/dp/B004LLIKVU] # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -2672,6 +2650,7 @@ MONEY_GRAM=MoneyGram WESTERN_UNION=西聯匯款 F2F=面對面(當面交易) JAPAN_BANK=日本銀行匯款 +AUSTRALIA_PAYID=Australian PayID # suppress inspection "UnusedProperty" NATIONAL_BANK_SHORT=國內銀行 @@ -2691,6 +2670,8 @@ WESTERN_UNION_SHORT=西聯匯款 F2F_SHORT=F2F # suppress inspection "UnusedProperty" JAPAN_BANK_SHORT=Japan Furikomi +# suppress inspection "UnusedProperty" +AUSTRALIA_PAYID_SHORT=PayID # Do not translate brand names # suppress inspection "UnusedProperty" @@ -2730,6 +2711,10 @@ PROMPT_PAY=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2778,6 +2763,10 @@ PROMPT_PAY_SHORT=PromptPay # suppress inspection "UnusedProperty" ADVANCED_CASH_SHORT=Advanced Cash # suppress inspection "UnusedProperty" +TRANSFERWISE_SHORT=TransferWise +# suppress inspection "UnusedProperty" +AMAZON_GIFT_CARD_SHORT=Amazon eGift Card +# suppress inspection "UnusedProperty" BLOCK_CHAINS_INSTANT_SHORT=Altcoins Instant # Deprecated: Cannot be deleted as it would break old trade history entries @@ -2800,11 +2789,10 @@ validation.zero=不允許輸入0。 validation.negative=不允許輸入負值。 validation.fiat.toSmall=不允許輸入比最小可能值還小的數值。 validation.fiat.toLarge=不允許輸入比最大可能值還大的數值。 -validation.btc.fraction=此充值將會造成產生微量(聰)級別的比特幣數量。 +validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.btc.toLarge=不允許充值大於{0} validation.btc.toSmall=不允許充值小於{0} -validation.securityDeposit.toSmall=不允許充值小於{0} -validation.passwordTooShort=你輸入的密碼太短。最少8個字元。 +validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooLong=你輸入的密碼太長。最長不要超過50個字元。 validation.sortCodeNumber={0} 必須由 {1} 個數字構成。 validation.sortCodeChars={0} 必須由 {1} 個字元構成。 @@ -2822,44 +2810,49 @@ validation.nationalAccountId={0} 必須由{1}個數字組成。 #new validation.invalidInput=輸入無效:{0} validation.accountNrFormat=帳號必須是格式:{0} +# suppress inspection "UnusedProperty" validation.altcoin.wrongStructure=地址驗證失敗,因為它與 {0} 地址的結構不匹配。 -validation.altcoin.ltz.zAddressesNotSupported=LTZ 地址需要以 L 開頭。 不支援以 Z 開頭的地址。 -validation.altcoin.zAddressesNotSupported=ZEC 地址需要以 t 開頭。 不支援以z開頭的地址。 +# suppress inspection "UnusedProperty" +validation.altcoin.ltz.zAddressesNotSupported=LTZ address must start with L. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" +validation.altcoin.zAddressesNotSupported=ZEC addresses must start with t. Addresses starting with z are not supported. +# suppress inspection "UnusedProperty" validation.altcoin.invalidAddress=這個地址不是有效的{0}地址!{1} +# suppress inspection "UnusedProperty" validation.altcoin.liquidBitcoin.invalidAddress=不支援本地 segwit 地址(以“lq”開頭的地址)。 -validation.bic.invalidLength=輸入長度既不是8也不是11 +validation.bic.invalidLength=Input length must be 8 or 11 validation.bic.letters=必須輸入銀行和國家或地區程式碼 validation.bic.invalidLocationCode=BIC 包含無效的地址程式碼 validation.bic.invalidBranchCode=BIC 包含無效的分行程式碼 validation.bic.sepaRevolutBic=不支援 Revolut Sepa 賬戶 -validation.btc.invalidFormat=無效格式的比特幣地址 -validation.bsq.invalidFormat=無效格式的 BSQ 地址 +validation.btc.invalidFormat=Invalid format for a Bitcoin address. +validation.bsq.invalidFormat=Invalid format for a BSQ address. validation.email.invalidAddress=無效地址 validation.iban.invalidCountryCode=國家或地區程式碼無效 validation.iban.checkSumNotNumeric=校驗必須是數字 validation.iban.nonNumericChars=檢測到非字母數字字元 validation.iban.checkSumInvalid=IBAN 校驗無效 -validation.iban.invalidLength=數字的長度必須為15到34個字元。 +validation.iban.invalidLength=Number must have a length of 15 to 34 chars. validation.interacETransfer.invalidAreaCode=非加拿大區號 -validation.interacETransfer.invalidPhone=電話號碼格式無效並且不是電子郵件地址 +validation.interacETransfer.invalidPhone=Please enter a valid 11 digit phone number (ex: 1-123-456-7890) or an email address validation.interacETransfer.invalidQuestion=必須只包含字母、數字、空格和/或符號“_ , . ? -” validation.interacETransfer.invalidAnswer=必須是一個單詞,只包含字母、數字和/或符號- validation.inputTooLarge=輸入不能大於 {0} validation.inputTooSmall=輸入必須大於 {0} validation.inputToBeAtLeast=輸入必須至少為 {0} -validation.amountBelowDust=不允許低於 {0} 聰的零頭限制。 +validation.amountBelowDust=An amount below the dust limit of {0} satoshi is not allowed. validation.length=長度必須在 {0} 和 {1} 之間 validation.pattern=輸入格式必須為:{0} validation.noHexString=輸入不是十六進位制格式。 validation.advancedCash.invalidFormat=必須是有效的電子郵箱或錢包 ID 的格式為:X000000000000 validation.invalidUrl=輸入的不是有效 URL 連結。 validation.mustBeDifferent=您輸入的值必須與當前值不同 -validation.cannotBeChanged=參數不能更改 +validation.cannotBeChanged=引數不能更改 validation.numberFormatException=數字格式異常 {0} validation.mustNotBeNegative=不能輸入負值 validation.phone.missingCountryCode=需要兩個字母的國家或地區程式碼來驗證電話號碼 validation.phone.invalidCharacters=電話號碼 {0} 包含無效字元 -validation.phone.insufficientDigits={0} 中沒有足夠的數字作為有效的電話號碼 -validation.phone.tooManyDigits={0} 中的數字太多,不是有效的電話號碼 -validation.phone.invalidDialingCode=數字 {0} 中的國際撥號程式碼對於 {1} 無效。正確的撥號號碼是 {2} 。 +validation.phone.insufficientDigits=There are not enough digits in {0} to be a valid phone number +validation.phone.tooManyDigits=There are too many digits in {0} to be a valid phone number +validation.phone.invalidDialingCode=Country dialing code for number {0} is invalid for country {1}. The correct dialing code is {2}. validation.invalidAddressList=使用逗號分隔有效地址列表 diff --git a/core/src/main/resources/wallet/checkpoints.txt b/core/src/main/resources/wallet/checkpoints.txt index f38809740f..8e22a7f75a 100644 --- a/core/src/main/resources/wallet/checkpoints.txt +++ b/core/src/main/resources/wallet/checkpoints.txt @@ -1,6 +1,6 @@ TXT CHECKPOINTS 1 0 -323 +325 AAAAAAAAB+EH4QfhAAAH4AEAAABjl7tqvU/FIcDT9gcbVlA4nwtFUbxAtOawZzBpAAAAAKzkcK7NqciBjI/ldojNKncrWleVSgDfBCCn3VRrbSxXaw5/Sf//AB0z8Bkv AAAAAAAAD8EPwQ/BAAAPwAEAAADfP83Sx8MZ9RsrnZCvqzAwqB2Ma+ZesNAJrTfwAAAAACwESaNKhvRgz6WuE7UFdFk1xwzfRY/OIdIOPzX5yaAdjnWUSf//AB0GrNq5 AAAAAAAAF6EXoRehAAAXoAEAAADonWzAaUAKd30XT3NnHKobZMnLOuHdzm/xtehsAAAAAD8cUJA6NBIHHcqPHLc4IrfHw+6mjCGu3e+wRO81EvpnMVqrSf//AB1ffy8G @@ -324,3 +324,5 @@ ErrgKoeevYMpfx+WAAnYAADg/y/Zjrsqarpkd5PIhR21HJ55cSMyymaaBAAAAAAAAAAAAKPhdir1YiPG EzihxS/9MDJCHTIfAAnf4AAAQCAGq48tARXjK5m5ygIMjtFJqlySqsdXBgAAAAAAAAAAAPJaEbuOk1ZnpJ4y6SR6yn+dY6fB5QaJHhb6QWgMXit2KCxWXxI6EBdJ5KeT E7TgpleovIarz4zNAAnnwADg/zelTTDUGas2KxqgEH2WV5EilGEY8VASBgAAAAAAAAAAAJVJFZNI4Kxh1AUjFLdY7k6MLVY47YSfxE1acJIuEMlMpcRmX6qSDhc6QrMB FD83ZUplM/sW8MloAAnvoAAAQCBUTUlenrKovQvyeNaLUYJBmxfT5hcuDQAAAAAAAAAAAIaxf5jfjr8MifLPauOJeh6OWDYxSUUPluG5E8hVh+rrWD95X96VDhf7Be0Q +FMlwaWsoL8M1y3sGAAn3gAAAICD2It4VF1dZC7XR51SjkuBPy2c1ot7iBQAAAAAAAAAAAOto2NUucHczD9ZpnC5X1L05HcifvGpMh8gwIt7mZ2DW3BWLX04TDhdKX1k6 +FVin/nTPxZEaUhFJAAn/YADg/zdLnpRRoj5nb9aeuWAA1TG1ZV/ig3PhBQAAAAAAAAAAAP7jjrVesvd94nsFrp03Zj496k0mgpUa+z2F/FaP1R7omhShXzPEEBcdNBS1 diff --git a/core/src/test/java/bisq/core/btc/TxFeeEstimationServiceTest.java b/core/src/test/java/bisq/core/btc/TxFeeEstimationServiceTest.java index a71fb8237b..a2f00aaec1 100644 --- a/core/src/test/java/bisq/core/btc/TxFeeEstimationServiceTest.java +++ b/core/src/test/java/bisq/core/btc/TxFeeEstimationServiceTest.java @@ -36,106 +36,106 @@ import static org.mockito.Mockito.when; public class TxFeeEstimationServiceTest { @Test - public void testGetEstimatedTxSize_withDefaultTxSize() throws InsufficientMoneyException { + public void testGetEstimatedTxVsize_withDefaultTxVsize() throws InsufficientMoneyException { List outputValues = List.of(Coin.valueOf(2000), Coin.valueOf(3000)); - int initialEstimatedTxSize; - Coin txFeePerByte; + int initialEstimatedTxVsize; + Coin txFeePerVbyte; BtcWalletService btcWalletService = mock(BtcWalletService.class); int result; - int realTxSize; + int realTxVsize; Coin txFee; - initialEstimatedTxSize = 260; - txFeePerByte = Coin.valueOf(10); - realTxSize = 260; + initialEstimatedTxVsize = 175; + txFeePerVbyte = Coin.valueOf(10); + realTxVsize = 175; - txFee = txFeePerByte.multiply(initialEstimatedTxSize); - when(btcWalletService.getEstimatedFeeTxSize(outputValues, txFee)).thenReturn(realTxSize); - result = TxFeeEstimationService.getEstimatedTxSize(outputValues, initialEstimatedTxSize, txFeePerByte, btcWalletService); - assertEquals(260, result); + txFee = txFeePerVbyte.multiply(initialEstimatedTxVsize); + when(btcWalletService.getEstimatedFeeTxVsize(outputValues, txFee)).thenReturn(realTxVsize); + result = TxFeeEstimationService.getEstimatedTxVsize(outputValues, initialEstimatedTxVsize, txFeePerVbyte, btcWalletService); + assertEquals(175, result); } // FIXME @Bernard could you have a look? @Test @Ignore - public void testGetEstimatedTxSize_withLargeTx() throws InsufficientMoneyException { + public void testGetEstimatedTxVsize_withLargeTx() throws InsufficientMoneyException { List outputValues = List.of(Coin.valueOf(2000), Coin.valueOf(3000)); - int initialEstimatedTxSize; - Coin txFeePerByte; + int initialEstimatedTxVsize; + Coin txFeePerVbyte; BtcWalletService btcWalletService = mock(BtcWalletService.class); int result; - int realTxSize; + int realTxVsize; Coin txFee; - initialEstimatedTxSize = 260; - txFeePerByte = Coin.valueOf(10); - realTxSize = 2600; + initialEstimatedTxVsize = 175; + txFeePerVbyte = Coin.valueOf(10); + realTxVsize = 1750; - txFee = txFeePerByte.multiply(initialEstimatedTxSize); - when(btcWalletService.getEstimatedFeeTxSize(outputValues, txFee)).thenReturn(realTxSize); + txFee = txFeePerVbyte.multiply(initialEstimatedTxVsize); + when(btcWalletService.getEstimatedFeeTxVsize(outputValues, txFee)).thenReturn(realTxVsize); - // repeated calls to getEstimatedFeeTxSize do not work (returns 0 at second call in loop which cause test to fail) - result = TxFeeEstimationService.getEstimatedTxSize(outputValues, initialEstimatedTxSize, txFeePerByte, btcWalletService); - assertEquals(2600, result); + // repeated calls to getEstimatedFeeTxVsize do not work (returns 0 at second call in loop which cause test to fail) + result = TxFeeEstimationService.getEstimatedTxVsize(outputValues, initialEstimatedTxVsize, txFeePerVbyte, btcWalletService); + assertEquals(1750, result); } // FIXME @Bernard could you have a look? @Test @Ignore - public void testGetEstimatedTxSize_withSmallTx() throws InsufficientMoneyException { + public void testGetEstimatedTxVsize_withSmallTx() throws InsufficientMoneyException { List outputValues = List.of(Coin.valueOf(2000), Coin.valueOf(3000)); - int initialEstimatedTxSize; - Coin txFeePerByte; + int initialEstimatedTxVsize; + Coin txFeePerVbyte; BtcWalletService btcWalletService = mock(BtcWalletService.class); int result; - int realTxSize; + int realTxVsize; Coin txFee; - initialEstimatedTxSize = 2600; - txFeePerByte = Coin.valueOf(10); - realTxSize = 260; + initialEstimatedTxVsize = 1750; + txFeePerVbyte = Coin.valueOf(10); + realTxVsize = 175; - txFee = txFeePerByte.multiply(initialEstimatedTxSize); - when(btcWalletService.getEstimatedFeeTxSize(outputValues, txFee)).thenReturn(realTxSize); - result = TxFeeEstimationService.getEstimatedTxSize(outputValues, initialEstimatedTxSize, txFeePerByte, btcWalletService); - assertEquals(260, result); + txFee = txFeePerVbyte.multiply(initialEstimatedTxVsize); + when(btcWalletService.getEstimatedFeeTxVsize(outputValues, txFee)).thenReturn(realTxVsize); + result = TxFeeEstimationService.getEstimatedTxVsize(outputValues, initialEstimatedTxVsize, txFeePerVbyte, btcWalletService); + assertEquals(175, result); } @Test public void testIsInTolerance() { int estimatedSize; - int txSize; + int txVsize; double tolerance; boolean result; estimatedSize = 100; - txSize = 100; + txVsize = 100; tolerance = 0.0001; - result = TxFeeEstimationService.isInTolerance(estimatedSize, txSize, tolerance); + result = TxFeeEstimationService.isInTolerance(estimatedSize, txVsize, tolerance); assertTrue(result); estimatedSize = 100; - txSize = 200; + txVsize = 200; tolerance = 0.2; - result = TxFeeEstimationService.isInTolerance(estimatedSize, txSize, tolerance); + result = TxFeeEstimationService.isInTolerance(estimatedSize, txVsize, tolerance); assertFalse(result); estimatedSize = 120; - txSize = 100; + txVsize = 100; tolerance = 0.2; - result = TxFeeEstimationService.isInTolerance(estimatedSize, txSize, tolerance); + result = TxFeeEstimationService.isInTolerance(estimatedSize, txVsize, tolerance); assertTrue(result); estimatedSize = 200; - txSize = 100; + txVsize = 100; tolerance = 1; - result = TxFeeEstimationService.isInTolerance(estimatedSize, txSize, tolerance); + result = TxFeeEstimationService.isInTolerance(estimatedSize, txVsize, tolerance); assertTrue(result); estimatedSize = 201; - txSize = 100; + txVsize = 100; tolerance = 1; - result = TxFeeEstimationService.isInTolerance(estimatedSize, txSize, tolerance); + result = TxFeeEstimationService.isInTolerance(estimatedSize, txVsize, tolerance); assertFalse(result); } } diff --git a/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java b/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java index d5ae649e00..0fcf60daa4 100644 --- a/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java +++ b/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java @@ -1,5 +1,7 @@ package bisq.core.offer; +import bisq.core.trade.TradableList; + import bisq.network.p2p.P2PService; import bisq.network.p2p.peers.PeerManager; @@ -10,11 +12,9 @@ import bisq.common.persistence.PersistenceManager; import java.nio.file.Files; -import java.io.File; -import java.io.IOException; - import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -25,14 +25,18 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; public class OpenOfferManagerTest { - - private CorruptedStorageFileHandler corruptedStorageFileHandler; - private File storageDir; + private PersistenceManager> persistenceManager; @Before public void setUp() throws Exception { - corruptedStorageFileHandler = mock(CorruptedStorageFileHandler.class); - storageDir = Files.createTempDirectory("storage").toFile(); + var corruptedStorageFileHandler = mock(CorruptedStorageFileHandler.class); + var storageDir = Files.createTempDirectory("storage").toFile(); + persistenceManager = new PersistenceManager<>(storageDir, null, corruptedStorageFileHandler); + } + + @After + public void tearDown() { + persistenceManager.shutdown(); } @Test @@ -46,7 +50,7 @@ public class OpenOfferManagerTest { null, null, null, offerBookService, null, null, null, null, null, null, null, null, null, - new PersistenceManager<>(storageDir, null, corruptedStorageFileHandler)); + persistenceManager); AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false); @@ -58,9 +62,7 @@ public class OpenOfferManagerTest { final OpenOffer openOffer = new OpenOffer(make(btcUsdOffer)); - ResultHandler resultHandler = () -> { - startEditOfferSuccessful.set(true); - }; + ResultHandler resultHandler = () -> startEditOfferSuccessful.set(true); manager.editOpenOfferStart(openOffer, resultHandler, null); @@ -71,7 +73,7 @@ public class OpenOfferManagerTest { } @Test - public void testStartEditOfferForDeactivatedOffer() throws IOException { + public void testStartEditOfferForDeactivatedOffer() { P2PService p2PService = mock(P2PService.class); OfferBookService offerBookService = mock(OfferBookService.class); when(p2PService.getPeerManager()).thenReturn(mock(PeerManager.class)); @@ -80,13 +82,11 @@ public class OpenOfferManagerTest { null, null, null, offerBookService, null, null, null, null, null, null, null, null, null, - new PersistenceManager<>(storageDir, null, corruptedStorageFileHandler)); + persistenceManager); AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false); - ResultHandler resultHandler = () -> { - startEditOfferSuccessful.set(true); - }; + ResultHandler resultHandler = () -> startEditOfferSuccessful.set(true); final OpenOffer openOffer = new OpenOffer(make(btcUsdOffer)); openOffer.setState(OpenOffer.State.DEACTIVATED); @@ -107,13 +107,11 @@ public class OpenOfferManagerTest { null, null, null, offerBookService, null, null, null, null, null, null, null, null, null, - new PersistenceManager<>(storageDir, null, corruptedStorageFileHandler)); + persistenceManager); AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false); - ResultHandler resultHandler = () -> { - startEditOfferSuccessful.set(true); - }; + ResultHandler resultHandler = () -> startEditOfferSuccessful.set(true); final OpenOffer openOffer = new OpenOffer(make(btcUsdOffer)); openOffer.setState(OpenOffer.State.DEACTIVATED); diff --git a/core/src/test/java/bisq/core/user/PreferencesTest.java b/core/src/test/java/bisq/core/user/PreferencesTest.java index 87d83bc347..4a7acab39e 100644 --- a/core/src/test/java/bisq/core/user/PreferencesTest.java +++ b/core/src/test/java/bisq/core/user/PreferencesTest.java @@ -94,11 +94,10 @@ public class PreferencesTest { when(payload.getPreferredTradeCurrency()).thenReturn(usd); when(payload.getFiatCurrencies()).thenReturn(fiatCurrencies); - preferences.readPersisted(); - - assertEquals(7, preferences.getFiatCurrenciesAsObservable().size()); - assertTrue(preferences.getFiatCurrenciesAsObservable().contains(usd)); - + preferences.readPersisted(() -> { + assertEquals(7, preferences.getFiatCurrenciesAsObservable().size()); + assertTrue(preferences.getFiatCurrenciesAsObservable().contains(usd)); + }); } @Test @@ -115,9 +114,9 @@ public class PreferencesTest { when(payload.getPreferredTradeCurrency()).thenReturn(new FiatCurrency("USD")); when(payload.getCryptoCurrencies()).thenReturn(cryptoCurrencies); - preferences.readPersisted(); - - assertTrue(preferences.getCryptoCurrenciesAsObservable().contains(dash)); + preferences.readPersisted(() -> { + assertTrue(preferences.getCryptoCurrenciesAsObservable().contains(dash)); + }); } @Test @@ -136,9 +135,8 @@ public class PreferencesTest { when(payload.getPreferredTradeCurrency()).thenReturn(usd); when(payload.getFiatCurrencies()).thenReturn(fiatCurrencies); - preferences.readPersisted(); - - assertEquals("US Dollar (USD)", preferences.getFiatCurrenciesAsObservable().get(0).getNameAndCode()); + preferences.readPersisted(() -> { + assertEquals("US Dollar (USD)", preferences.getFiatCurrenciesAsObservable().get(0).getNameAndCode()); + }); } - } diff --git a/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java b/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java index 6fc717b263..144e299181 100644 --- a/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java +++ b/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java @@ -63,7 +63,8 @@ public class UserPayloadModelVOTest { null, null, null, - false)); + false, + Lists.newArrayList())); vo.setRegisteredArbitrator(ArbitratorTest.getArbitratorMock()); vo.setRegisteredMediator(MediatorTest.getMediatorMock()); diff --git a/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java b/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java index bf6ddc5a8b..fa3c7d6695 100644 --- a/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java +++ b/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java @@ -137,6 +137,7 @@ public class FeeReceiverSelectorTest { null, null, null, - false); + false, + Lists.newArrayList()); } } diff --git a/core/update_translations.sh b/core/update_translations.sh index 4bcef233f3..0ea9070bdb 100755 --- a/core/update_translations.sh +++ b/core/update_translations.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash cd $(dirname $0) -tx pull -l de,es,ja,pt,ru,zh_CN,zh_TW,vi,th_TH,fa,fr,pt_BR +tx pull -l de,es,ja,pt,ru,zh_CN,zh_TW,vi,th_TH,fa,fr,pt_BR,it,cs translations="translations/bisq-desktop.displaystringsproperties" i18n="src/main/resources/i18n" @@ -18,5 +18,7 @@ mv "$translations/th_TH.properties" "$i18n/displayStrings_th.properties" mv "$translations/fa.properties" "$i18n/displayStrings_fa.properties" mv "$translations/fr.properties" "$i18n/displayStrings_fr.properties" mv "$translations/pt_BR.properties" "$i18n/displayStrings_pt-br.properties" +mv "$translations/it.properties" "$i18n/displayStrings_it.properties" +mv "$translations/cs.properties" "$i18n/displayStrings_cs.properties" rm -rf $translations diff --git a/daemon/src/main/java/bisq/daemon/grpc/GrpcOffersService.java b/daemon/src/main/java/bisq/daemon/grpc/GrpcOffersService.java index 2cee16b601..f03155d2f8 100644 --- a/daemon/src/main/java/bisq/daemon/grpc/GrpcOffersService.java +++ b/daemon/src/main/java/bisq/daemon/grpc/GrpcOffersService.java @@ -21,6 +21,8 @@ import bisq.core.api.CoreApi; import bisq.core.api.model.OfferInfo; import bisq.core.offer.Offer; +import bisq.proto.grpc.CancelOfferReply; +import bisq.proto.grpc.CancelOfferRequest; import bisq.proto.grpc.CreateOfferReply; import bisq.proto.grpc.CreateOfferRequest; import bisq.proto.grpc.GetOfferReply; @@ -36,11 +38,12 @@ import io.grpc.stub.StreamObserver; import javax.inject.Inject; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import static bisq.core.api.model.OfferInfo.toOfferInfo; + @Slf4j class GrpcOffersService extends OffersGrpc.OffersImplBase { @@ -72,7 +75,7 @@ class GrpcOffersService extends OffersGrpc.OffersImplBase { public void getOffers(GetOffersRequest req, StreamObserver responseObserver) { List result = coreApi.getOffers(req.getDirection(), req.getCurrencyCode()) - .stream().map(this::toOfferInfo) + .stream().map(OfferInfo::toOfferInfo) .collect(Collectors.toList()); var reply = GetOffersReply.newBuilder() .addAllOffers(result.stream() @@ -114,27 +117,18 @@ class GrpcOffersService extends OffersGrpc.OffersImplBase { } } - // The client cannot see bisq.core.Offer or its fromProto method. - // We use the lighter weight OfferInfo proto wrapper instead, containing just - // enough fields to view and create offers. - private OfferInfo toOfferInfo(Offer offer) { - return new OfferInfo.OfferInfoBuilder() - .withId(offer.getId()) - .withDirection(offer.getDirection().name()) - .withPrice(Objects.requireNonNull(offer.getPrice()).getValue()) - .withUseMarketBasedPrice(offer.isUseMarketBasedPrice()) - .withMarketPriceMargin(offer.getMarketPriceMargin()) - .withAmount(offer.getAmount().value) - .withMinAmount(offer.getMinAmount().value) - .withVolume(Objects.requireNonNull(offer.getVolume()).getValue()) - .withMinVolume(Objects.requireNonNull(offer.getMinVolume()).getValue()) - .withBuyerSecurityDeposit(offer.getBuyerSecurityDeposit().value) - .withPaymentAccountId(offer.getMakerPaymentAccountId()) - .withPaymentMethodId(offer.getPaymentMethod().getId()) - .withPaymentMethodShortName(offer.getPaymentMethod().getShortName()) - .withBaseCurrencyCode(offer.getOfferPayload().getBaseCurrencyCode()) - .withCounterCurrencyCode(offer.getOfferPayload().getCounterCurrencyCode()) - .withDate(offer.getDate().getTime()) - .build(); + @Override + public void cancelOffer(CancelOfferRequest req, + StreamObserver responseObserver) { + try { + coreApi.cancelOffer(req.getId()); + var reply = CancelOfferReply.newBuilder().build(); + responseObserver.onNext(reply); + responseObserver.onCompleted(); + } catch (IllegalStateException | IllegalArgumentException cause) { + var ex = new StatusRuntimeException(Status.UNKNOWN.withDescription(cause.getMessage())); + responseObserver.onError(ex); + throw ex; + } } } diff --git a/daemon/src/main/java/bisq/daemon/grpc/GrpcServer.java b/daemon/src/main/java/bisq/daemon/grpc/GrpcServer.java index 4937e09092..bb9dbebd27 100644 --- a/daemon/src/main/java/bisq/daemon/grpc/GrpcServer.java +++ b/daemon/src/main/java/bisq/daemon/grpc/GrpcServer.java @@ -45,6 +45,7 @@ public class GrpcServer { GrpcPriceService priceService, GrpcVersionService versionService, GrpcGetTradeStatisticsService tradeStatisticsService, + GrpcTradesService tradesService, GrpcWalletsService walletsService) { this.server = ServerBuilder.forPort(config.apiPort) .addService(disputeAgentsService) @@ -52,6 +53,7 @@ public class GrpcServer { .addService(paymentAccountsService) .addService(priceService) .addService(tradeStatisticsService) + .addService(tradesService) .addService(versionService) .addService(walletsService) .intercept(passwordAuthInterceptor) diff --git a/daemon/src/main/java/bisq/daemon/grpc/GrpcTradesService.java b/daemon/src/main/java/bisq/daemon/grpc/GrpcTradesService.java new file mode 100644 index 0000000000..74cd04ead9 --- /dev/null +++ b/daemon/src/main/java/bisq/daemon/grpc/GrpcTradesService.java @@ -0,0 +1,156 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.daemon.grpc; + +import bisq.core.api.CoreApi; +import bisq.core.api.model.TradeInfo; +import bisq.core.trade.Trade; + +import bisq.proto.grpc.ConfirmPaymentReceivedReply; +import bisq.proto.grpc.ConfirmPaymentReceivedRequest; +import bisq.proto.grpc.ConfirmPaymentStartedReply; +import bisq.proto.grpc.ConfirmPaymentStartedRequest; +import bisq.proto.grpc.GetTradeReply; +import bisq.proto.grpc.GetTradeRequest; +import bisq.proto.grpc.KeepFundsReply; +import bisq.proto.grpc.KeepFundsRequest; +import bisq.proto.grpc.TakeOfferReply; +import bisq.proto.grpc.TakeOfferRequest; +import bisq.proto.grpc.TradesGrpc; +import bisq.proto.grpc.WithdrawFundsReply; +import bisq.proto.grpc.WithdrawFundsRequest; + +import io.grpc.Status; +import io.grpc.StatusRuntimeException; +import io.grpc.stub.StreamObserver; + +import javax.inject.Inject; + +import lombok.extern.slf4j.Slf4j; + +import static bisq.core.api.model.TradeInfo.toTradeInfo; + +@Slf4j +class GrpcTradesService extends TradesGrpc.TradesImplBase { + + private final CoreApi coreApi; + + @Inject + public GrpcTradesService(CoreApi coreApi) { + this.coreApi = coreApi; + } + + @Override + public void getTrade(GetTradeRequest req, + StreamObserver responseObserver) { + try { + Trade trade = coreApi.getTrade(req.getTradeId()); + String role = coreApi.getTradeRole(req.getTradeId()); + var reply = GetTradeReply.newBuilder() + .setTrade(toTradeInfo(trade, role).toProtoMessage()) + .build(); + responseObserver.onNext(reply); + responseObserver.onCompleted(); + } catch (IllegalStateException | IllegalArgumentException cause) { + var ex = new StatusRuntimeException(Status.UNKNOWN.withDescription(cause.getMessage())); + responseObserver.onError(ex); + throw ex; + } + } + + @Override + public void takeOffer(TakeOfferRequest req, + StreamObserver responseObserver) { + try { + coreApi.takeOffer(req.getOfferId(), + req.getPaymentAccountId(), + trade -> { + TradeInfo tradeInfo = toTradeInfo(trade); + var reply = TakeOfferReply.newBuilder() + .setTrade(tradeInfo.toProtoMessage()) + .build(); + responseObserver.onNext(reply); + responseObserver.onCompleted(); + }); + } catch (IllegalStateException | IllegalArgumentException cause) { + var ex = new StatusRuntimeException(Status.UNKNOWN.withDescription(cause.getMessage())); + responseObserver.onError(ex); + throw ex; + } + } + + @Override + public void confirmPaymentStarted(ConfirmPaymentStartedRequest req, + StreamObserver responseObserver) { + try { + coreApi.confirmPaymentStarted(req.getTradeId()); + var reply = ConfirmPaymentStartedReply.newBuilder().build(); + responseObserver.onNext(reply); + responseObserver.onCompleted(); + } catch (IllegalStateException | IllegalArgumentException cause) { + var ex = new StatusRuntimeException(Status.UNKNOWN.withDescription(cause.getMessage())); + responseObserver.onError(ex); + throw ex; + } + } + + @Override + public void confirmPaymentReceived(ConfirmPaymentReceivedRequest req, + StreamObserver responseObserver) { + try { + coreApi.confirmPaymentReceived(req.getTradeId()); + var reply = ConfirmPaymentReceivedReply.newBuilder().build(); + responseObserver.onNext(reply); + responseObserver.onCompleted(); + } catch (IllegalStateException | IllegalArgumentException cause) { + var ex = new StatusRuntimeException(Status.UNKNOWN.withDescription(cause.getMessage())); + responseObserver.onError(ex); + throw ex; + } + } + + @Override + public void keepFunds(KeepFundsRequest req, + StreamObserver responseObserver) { + try { + coreApi.keepFunds(req.getTradeId()); + var reply = KeepFundsReply.newBuilder().build(); + responseObserver.onNext(reply); + responseObserver.onCompleted(); + } catch (IllegalStateException | IllegalArgumentException cause) { + var ex = new StatusRuntimeException(Status.UNKNOWN.withDescription(cause.getMessage())); + responseObserver.onError(ex); + throw ex; + } + } + + @Override + public void withdrawFunds(WithdrawFundsRequest req, + StreamObserver responseObserver) { + try { + coreApi.withdrawFunds(req.getTradeId(), req.getAddress()); + var reply = WithdrawFundsReply.newBuilder().build(); + responseObserver.onNext(reply); + responseObserver.onCompleted(); + } catch (IllegalStateException | IllegalArgumentException cause) { + var ex = new StatusRuntimeException(Status.UNKNOWN.withDescription(cause.getMessage())); + responseObserver.onError(ex); + throw ex; + } + } +} diff --git a/desktop/package/linux/Dockerfile b/desktop/package/linux/Dockerfile index 1454a65902..09eabb8c6c 100644 --- a/desktop/package/linux/Dockerfile +++ b/desktop/package/linux/Dockerfile @@ -8,7 +8,7 @@ # pull base image FROM openjdk:8-jdk -ENV version 1.4.2-SNAPSHOT +ENV version 1.5.0-SNAPSHOT RUN apt-get update && apt-get install -y --no-install-recommends openjfx && rm -rf /var/lib/apt/lists/* && apt-get install -y vim fakeroot diff --git a/desktop/package/linux/package.sh b/desktop/package/linux/package.sh index cd0a5ddf36..1eb87853b6 100755 --- a/desktop/package/linux/package.sh +++ b/desktop/package/linux/package.sh @@ -6,7 +6,7 @@ # - Update version below # - Ensure JAVA_HOME below is pointing to OracleJDK 10 directory -version=1.4.2-SNAPSHOT +version=1.5.0-SNAPSHOT version_base=$(echo $version | awk -F'[_-]' '{print $1}') if [ ! -f "$JAVA_HOME/bin/javapackager" ]; then if [ -d "/usr/lib/jvm/jdk-10.0.2" ]; then diff --git a/desktop/package/linux/release.sh b/desktop/package/linux/release.sh index ffe839779d..294c40683a 100755 --- a/desktop/package/linux/release.sh +++ b/desktop/package/linux/release.sh @@ -4,7 +4,7 @@ # Prior to running this script: # - Update version below -version=1.4.2-SNAPSHOT +version=1.5.0-SNAPSHOT base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../.. package_dir=$base_dir/desktop/package release_dir=$base_dir/desktop/release/$version diff --git a/desktop/package/macosx/Info.plist b/desktop/package/macosx/Info.plist index c21a30a1fc..999eb7c82c 100644 --- a/desktop/package/macosx/Info.plist +++ b/desktop/package/macosx/Info.plist @@ -5,10 +5,10 @@ CFBundleVersion - 1.4.2 + 1.5.0 CFBundleShortVersionString - 1.4.2 + 1.5.0 CFBundleExecutable Bisq diff --git a/desktop/package/macosx/copy_dbs.sh b/desktop/package/macosx/copy_dbs.sh index c3d1de7200..a9aaacfa90 100755 --- a/desktop/package/macosx/copy_dbs.sh +++ b/desktop/package/macosx/copy_dbs.sh @@ -2,12 +2,16 @@ cd $(dirname $0)/../../../ +version="1.5.0" + # Set BISQ_DIR as environment var to the path of your locally synced Bisq data directory e.g. BISQ_DIR=~/Library/Application\ Support/Bisq dbDir=$BISQ_DIR/btc_mainnet/db resDir=p2p/src/main/resources -cp "$dbDir/TradeStatistics2Store" "$resDir/TradeStatistics2Store_BTC_MAINNET" +# Only commit new TradeStatistics3Store if you plan to add it to +# https://github.com/bisq-network/bisq/blob/0345c795e2c227d827a1f239a323dda1250f4e69/common/src/main/java/bisq/common/app/Version.java#L40 as well. +cp "$dbDir/TradeStatistics3Store" "$resDir/TradeStatistics3Store_${version}_BTC_MAINNET" cp "$dbDir/AccountAgeWitnessStore" "$resDir/AccountAgeWitnessStore_BTC_MAINNET" cp "$dbDir/DaoStateStore" "$resDir/DaoStateStore_BTC_MAINNET" cp "$dbDir/SignedWitnessStore" "$resDir/SignedWitnessStore_BTC_MAINNET" diff --git a/desktop/package/macosx/create_app.sh b/desktop/package/macosx/create_app.sh index 8809b1baba..5f3e7cc985 100755 --- a/desktop/package/macosx/create_app.sh +++ b/desktop/package/macosx/create_app.sh @@ -6,7 +6,7 @@ mkdir -p deploy set -e -version="1.4.2-SNAPSHOT" +version="1.5.0-SNAPSHOT" cd .. ./gradlew :desktop:build -x test shadowJar diff --git a/desktop/package/macosx/finalize.sh b/desktop/package/macosx/finalize.sh index 8818b9b641..fcefda8402 100755 --- a/desktop/package/macosx/finalize.sh +++ b/desktop/package/macosx/finalize.sh @@ -2,7 +2,7 @@ cd ../../ -version="1.4.2-SNAPSHOT" +version="1.5.0-SNAPSHOT" target_dir="releases/$version" diff --git a/desktop/package/macosx/insert_snapshot_version.sh b/desktop/package/macosx/insert_snapshot_version.sh index 9670cc4468..604e557558 100755 --- a/desktop/package/macosx/insert_snapshot_version.sh +++ b/desktop/package/macosx/insert_snapshot_version.sh @@ -2,7 +2,7 @@ cd $(dirname $0)/../../../ -version=1.4.2 +version=1.5.0 find . -type f \( -name "finalize.sh" \ -o -name "create_app.sh" \ diff --git a/desktop/package/macosx/replace_version_number.sh b/desktop/package/macosx/replace_version_number.sh index 1c24c21690..dd94124526 100755 --- a/desktop/package/macosx/replace_version_number.sh +++ b/desktop/package/macosx/replace_version_number.sh @@ -2,8 +2,8 @@ cd $(dirname $0)/../../../ -oldVersion=1.4.1 -newVersion=1.4.2 +oldVersion=1.4.2 +newVersion=1.5.0 find . -type f \( -name "finalize.sh" \ -o -name "create_app.sh" \ diff --git a/desktop/package/windows/package.bat b/desktop/package/windows/package.bat index a153f658a0..390f279139 100644 --- a/desktop/package/windows/package.bat +++ b/desktop/package/windows/package.bat @@ -11,7 +11,7 @@ @echo off -set version=1.4.2-SNAPSHOT +set version=1.5.0-SNAPSHOT if not exist "%JAVA_HOME%\bin\javapackager.exe" ( if not exist "%ProgramFiles%\Java\jdk-10.0.2" ( echo Javapackager not found. Update JAVA_HOME variable to point to OracleJDK. diff --git a/desktop/package/windows/release.bat b/desktop/package/windows/release.bat index 5a1c49608a..d722ca949b 100644 --- a/desktop/package/windows/release.bat +++ b/desktop/package/windows/release.bat @@ -6,7 +6,7 @@ @echo off -set version=1.4.2-SNAPSHOT +set version=1.5.0-SNAPSHOT set release_dir=%~dp0..\..\..\releases\%version% set package_dir=%~dp0.. diff --git a/desktop/src/main/java/bisq/desktop/Navigation.java b/desktop/src/main/java/bisq/desktop/Navigation.java index adb7300023..cb9da123d7 100644 --- a/desktop/src/main/java/bisq/desktop/Navigation.java +++ b/desktop/src/main/java/bisq/desktop/Navigation.java @@ -79,24 +79,26 @@ public final class Navigation implements PersistedDataHost { } @Override - public void readPersisted() { - NavigationPath persisted = persistenceManager.getPersisted(); - if (persisted != null) { - List> viewClasses = persisted.getPath().stream() - .map(className -> { - try { - return (Class) Class.forName(className).asSubclass(View.class); - } catch (ClassNotFoundException e) { - log.warn("Could not find the viewPath class {}; exception: {}", className, e); - } - return null; - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + List> viewClasses = persisted.getPath().stream() + .map(className -> { + try { + return (Class) Class.forName(className).asSubclass(View.class); + } catch (ClassNotFoundException e) { + log.warn("Could not find the viewPath class {}; exception: {}", className, e); + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); - if (!viewClasses.isEmpty()) - previousPath = new ViewPath(viewClasses); - } + if (!viewClasses.isEmpty()) { + previousPath = new ViewPath(viewClasses); + } + completeHandler.run(); + }, + completeHandler); } @SafeVarargs diff --git a/desktop/src/main/java/bisq/desktop/bisq.css b/desktop/src/main/java/bisq/desktop/bisq.css index 1b213ab900..6dca94dfc1 100644 --- a/desktop/src/main/java/bisq/desktop/bisq.css +++ b/desktop/src/main/java/bisq/desktop/bisq.css @@ -1700,6 +1700,10 @@ textfield */ -fx-font-size: 0.880em; } +#price-chart .axis-tick-mark-text-node, #volume-chart .axis-tick-mark-text-node { + -fx-text-alignment: center; +} + #charts .chart-plot-background, #charts-dao .chart-plot-background { -fx-background-color: -bs-background-color; } @@ -1747,6 +1751,10 @@ textfield */ -fx-alignment: center-left; } +#charts .axisy .axis-label { + -fx-alignment: center; +} + /******************************************************************************************************************** * * * Highlight buttons * @@ -2169,4 +2177,3 @@ textfield */ -fx-stroke: linear-gradient(to bottom, -bs-text-color-transparent, -bs-text-color-transparent-dark) !important; -fx-fill: -bs-background-color !important; } - diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/AmazonGiftCardForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/AmazonGiftCardForm.java new file mode 100644 index 0000000000..32d961ea44 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/AmazonGiftCardForm.java @@ -0,0 +1,130 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.components.paymentmethods; + +import bisq.desktop.components.InputTextField; +import bisq.desktop.util.FormBuilder; +import bisq.desktop.util.Layout; + +import bisq.core.account.witness.AccountAgeWitnessService; +import bisq.core.locale.CurrencyUtil; +import bisq.core.locale.Res; +import bisq.core.locale.TradeCurrency; +import bisq.core.payment.AmazonGiftCardAccount; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.payload.AmazonGiftCardAccountPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.payment.payload.PaymentMethod; +import bisq.core.util.coin.CoinFormatter; +import bisq.core.util.validation.InputValidator; + +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; + +import javafx.collections.FXCollections; + +import lombok.extern.slf4j.Slf4j; + +import static bisq.desktop.util.FormBuilder.addCompactTopLabelTextField; +import static bisq.desktop.util.FormBuilder.addInputTextField; +import static bisq.desktop.util.FormBuilder.addTopLabelTextField; + +@Slf4j +public class AmazonGiftCardForm extends PaymentMethodForm { + private InputTextField accountNrInputTextField; + private final AmazonGiftCardAccount amazonGiftCardAccount; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) { + FormBuilder.addCompactTopLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.email.mobile"), + ((AmazonGiftCardAccountPayload) paymentAccountPayload).getEmailOrMobileNr()); + return gridRow; + } + + public AmazonGiftCardForm(PaymentAccount paymentAccount, + AccountAgeWitnessService accountAgeWitnessService, + InputValidator inputValidator, + GridPane gridPane, + int gridRow, + CoinFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + + this.amazonGiftCardAccount = (AmazonGiftCardAccount) paymentAccount; + } + + public void addTradeCurrency() { + addTradeCurrencyComboBox(); + currencyComboBox.setItems(FXCollections.observableArrayList(CurrencyUtil.getAllAmazonGiftCardCurrencies())); + currencyComboBox.getSelectionModel().select(0); + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + accountNrInputTextField = addInputTextField(gridPane, ++gridRow, Res.get("payment.email.mobile")); + accountNrInputTextField.setValidator(inputValidator); + accountNrInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + amazonGiftCardAccount.setEmailOrMobileNr(newValue); + updateFromInputs(); + }); + + addTradeCurrency(); + + addLimitations(false); + addAccountNameTextFieldWithAutoFillToggleButton(); + } + + + @Override + protected void autoFillNameTextField() { + setAccountNameWithString(accountNrInputTextField.getText()); + } + + @Override + public void addFormForDisplayAccount() { + addFormForAccountNumberDisplayAccount(paymentAccount.getAccountName(), paymentAccount.getPaymentMethod(), + amazonGiftCardAccount.getEmailOrMobileNr(), + paymentAccount.getSingleTradeCurrency()); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && inputValidator.validate(amazonGiftCardAccount.getEmailOrMobileNr()).isValid + && paymentAccount.getTradeCurrencies().size() > 0); + } + + private void addFormForAccountNumberDisplayAccount(String accountName, + PaymentMethod paymentMethod, + String accountNr, + TradeCurrency singleTradeCurrency) { + gridRowFrom = gridRow; + addTopLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), accountName, + Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.paymentMethod"), + Res.get(paymentMethod.getId())); + TextField field = addCompactTopLabelTextField(gridPane, ++gridRow, + Res.get("payment.email.mobile"), accountNr).second; + field.setMouseTransparent(false); + + String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.currency"), nameAndCode); + + addLimitations(true); + } +} diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/AustraliaPayidForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/AustraliaPayidForm.java new file mode 100644 index 0000000000..a1d6337ea8 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/AustraliaPayidForm.java @@ -0,0 +1,122 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.components.paymentmethods; + +import bisq.desktop.components.InputTextField; +import bisq.desktop.util.FormBuilder; +import bisq.desktop.util.Layout; +import bisq.desktop.util.validation.AustraliaPayidValidator; + +import bisq.core.account.witness.AccountAgeWitnessService; +import bisq.core.locale.Res; +import bisq.core.locale.TradeCurrency; +import bisq.core.payment.AustraliaPayid; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.payload.AustraliaPayidPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.util.coin.CoinFormatter; +import bisq.core.util.validation.InputValidator; + +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; + +import static bisq.desktop.util.FormBuilder.addCompactTopLabelTextField; +import static bisq.desktop.util.FormBuilder.addTopLabelTextField; + +public class AustraliaPayidForm extends PaymentMethodForm { + private final AustraliaPayid australiaPayid; + private final AustraliaPayidValidator australiaPayidValidator; + private InputTextField mobileNrInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) { + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.account.owner"), + ((AustraliaPayidPayload) paymentAccountPayload).getBankAccountName()); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.payid"), + ((AustraliaPayidPayload) paymentAccountPayload).getPayid()); + return gridRow; + } + + public AustraliaPayidForm(PaymentAccount paymentAccount, + AccountAgeWitnessService accountAgeWitnessService, + AustraliaPayidValidator australiaPayidValidator, + InputValidator inputValidator, + GridPane gridPane, + int gridRow, + CoinFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.australiaPayid = (AustraliaPayid) paymentAccount; + this.australiaPayidValidator = australiaPayidValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + InputTextField holderNameInputTextField = FormBuilder.addInputTextField(gridPane, ++gridRow, + Res.get("payment.account.owner")); + holderNameInputTextField.setValidator(inputValidator); + holderNameInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + australiaPayid.setBankAccountName(newValue); + updateFromInputs(); + }); + + mobileNrInputTextField = FormBuilder.addInputTextField(gridPane, ++gridRow, Res.get("payment.payid")); + mobileNrInputTextField.setValidator(australiaPayidValidator); + mobileNrInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + australiaPayid.setPayid(newValue); + updateFromInputs(); + }); + + TradeCurrency singleTradeCurrency = australiaPayid.getSingleTradeCurrency(); + String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "null"; + addTopLabelTextField(gridPane, ++gridRow, Res.get("shared.currency"), nameAndCode); + addLimitations(false); + addAccountNameTextFieldWithAutoFillToggleButton(); + } + + @Override + protected void autoFillNameTextField() { + setAccountNameWithString(mobileNrInputTextField.getText()); + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addTopLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), + australiaPayid.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.paymentMethod"), + Res.get(australiaPayid.getPaymentMethod().getId())); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.payid"), + australiaPayid.getPayid()); + TextField field = addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.account.owner"), + australiaPayid.getBankAccountName()).second; + field.setMouseTransparent(false); + TradeCurrency singleTradeCurrency = australiaPayid.getSingleTradeCurrency(); + String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "null"; + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.currency"), nameAndCode); + addLimitations(true); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && australiaPayidValidator.validate(australiaPayid.getPayid()).isValid + && inputValidator.validate(australiaPayid.getBankAccountName()).isValid + && australiaPayid.getTradeCurrencies().size() > 0); + } +} diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/TransferwiseForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/TransferwiseForm.java new file mode 100644 index 0000000000..0d489204d5 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/TransferwiseForm.java @@ -0,0 +1,118 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.components.paymentmethods; + +import bisq.desktop.components.InputTextField; +import bisq.desktop.util.FormBuilder; +import bisq.desktop.util.Layout; +import bisq.desktop.util.validation.TransferwiseValidator; + +import bisq.core.account.witness.AccountAgeWitnessService; +import bisq.core.locale.CurrencyUtil; +import bisq.core.locale.Res; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.TransferwiseAccount; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.payment.payload.TransferwiseAccountPayload; +import bisq.core.util.coin.CoinFormatter; +import bisq.core.util.validation.InputValidator; + +import javafx.scene.control.TextField; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.GridPane; + +import static bisq.desktop.util.FormBuilder.addCompactTopLabelTextField; +import static bisq.desktop.util.FormBuilder.addCompactTopLabelTextFieldWithCopyIcon; +import static bisq.desktop.util.FormBuilder.addTopLabelTextField; + +public class TransferwiseForm extends PaymentMethodForm { + private final TransferwiseAccount account; + private TransferwiseValidator validator; + private InputTextField emailInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, + PaymentAccountPayload paymentAccountPayload) { + addCompactTopLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.email"), + ((TransferwiseAccountPayload) paymentAccountPayload).getEmail()); + return gridRow; + } + + public TransferwiseForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, + TransferwiseValidator validator, InputValidator inputValidator, GridPane gridPane, + int gridRow, CoinFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.account = (TransferwiseAccount) paymentAccount; + this.validator = validator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + emailInputTextField = FormBuilder.addInputTextField(gridPane, ++gridRow, Res.get("payment.email")); + emailInputTextField.setValidator(validator); + emailInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + account.setEmail(newValue.trim()); + updateFromInputs(); + }); + + addCurrenciesGrid(true); + addLimitations(false); + addAccountNameTextFieldWithAutoFillToggleButton(); + } + + private void addCurrenciesGrid(boolean isEditable) { + FlowPane flowPane = FormBuilder.addTopLabelFlowPane(gridPane, ++gridRow, + Res.get("payment.supportedCurrencies"), 20, 20).second; + + if (isEditable) { + flowPane.setId("flow-pane-checkboxes-bg"); + } else { + flowPane.setId("flow-pane-checkboxes-non-editable-bg"); + } + + CurrencyUtil.getAllTransferwiseCurrencies().forEach(currency -> + fillUpFlowPaneWithCurrencies(isEditable, flowPane, currency, account)); + } + + @Override + protected void autoFillNameTextField() { + setAccountNameWithString(emailInputTextField.getText()); + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addTopLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), + account.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.paymentMethod"), + Res.get(account.getPaymentMethod().getId())); + TextField field = addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.email"), + account.getEmail()).second; + field.setMouseTransparent(false); + addLimitations(true); + addCurrenciesGrid(false); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && validator.validate(account.getEmail()).isValid + && account.getTradeCurrencies().size() > 0); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/MainView.java b/desktop/src/main/java/bisq/desktop/main/MainView.java index 2af3ad2db8..55bda988a6 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainView.java +++ b/desktop/src/main/java/bisq/desktop/main/MainView.java @@ -51,7 +51,6 @@ import bisq.core.provider.price.MarketPrice; import bisq.common.BisqException; import bisq.common.Timer; import bisq.common.UserThread; -import bisq.common.app.Version; import bisq.common.util.Tuple2; import bisq.common.util.Utilities; @@ -115,7 +114,6 @@ public class MainView extends InitializableView implements DaoStateMonitoringService.Listener { // If after 30 sec we have not got connected we show "open network settings" button private final static int SHOW_TOR_SETTINGS_DELAY_SEC = 90; - private Label versionLabel; @Setter private Runnable onApplicationStartedHandler; @@ -687,6 +685,8 @@ public class MainView extends InitializableView Label btcInfoLabel = new AutoTooltipLabel(); btcInfoLabel.setId("footer-pane"); btcInfoLabel.textProperty().bind(model.getBtcInfo()); + setLeftAnchor(btcInfoLabel, 10d); + setBottomAnchor(btcInfoLabel, 7d); ProgressBar blockchainSyncIndicator = new JFXProgressBar(-1); blockchainSyncIndicator.setPrefWidth(80); @@ -715,34 +715,32 @@ public class MainView extends InitializableView } }); - HBox blockchainSyncBox = new HBox(); - blockchainSyncBox.setSpacing(10); - blockchainSyncBox.setAlignment(Pos.CENTER); - blockchainSyncBox.getChildren().addAll(btcInfoLabel, blockchainSyncIndicator); - setLeftAnchor(blockchainSyncBox, 10d); - setBottomAnchor(blockchainSyncBox, 7d); - // version - versionLabel = new AutoTooltipLabel(); + Label versionLabel = new AutoTooltipLabel(); versionLabel.setId("footer-pane"); versionLabel.setTextAlignment(TextAlignment.CENTER); versionLabel.setAlignment(Pos.BASELINE_CENTER); - versionLabel.setText("v" + Version.VERSION); + versionLabel.textProperty().bind(model.getCombinedFooterInfo()); root.widthProperty().addListener((ov, oldValue, newValue) -> versionLabel.setLayoutX(((double) newValue - versionLabel.getWidth()) / 2)); - setBottomAnchor(versionLabel, 7d); model.getNewVersionAvailableProperty().addListener((observable, oldValue, newValue) -> { versionLabel.getStyleClass().removeAll("version-new", "version"); if (newValue) { versionLabel.getStyleClass().add("version-new"); versionLabel.setOnMouseClicked(e -> model.onOpenDownloadWindow()); - versionLabel.setText("v" + Version.VERSION + " " + Res.get("mainView.version.update")); } else { versionLabel.getStyleClass().add("version"); versionLabel.setOnMouseClicked(null); - versionLabel.setText("v" + Version.VERSION); } }); + HBox versionBox = new HBox(); + versionBox.setSpacing(10); + versionBox.setAlignment(Pos.CENTER); + versionBox.setAlignment(Pos.BASELINE_CENTER); + versionBox.getChildren().addAll(versionLabel, blockchainSyncIndicator); + setLeftAnchor(versionBox, 10d); + setRightAnchor(versionBox, 10d); + setBottomAnchor(versionBox, 7d); // P2P Network Label p2PNetworkLabel = new AutoTooltipLabel(); @@ -779,7 +777,7 @@ public class MainView extends InitializableView setRightAnchor(vBox, 33d); setBottomAnchor(vBox, 5d); - return new AnchorPane(separator, blockchainSyncBox, versionLabel, vBox, p2PNetworkIcon) {{ + return new AnchorPane(separator, btcInfoLabel, versionBox, vBox, p2PNetworkIcon) {{ setId("footer-pane"); setMinHeight(30); setMaxHeight(30); @@ -811,7 +809,7 @@ public class MainView extends InitializableView this.setToggleGroup(navButtons); this.getStyleClass().add("nav-button"); // Japanese fonts are dense, increase top nav button text size - if (model.getPreferences().getUserLanguage().equals("ja")) { + if (model.getPreferences() != null && "ja".equals(model.getPreferences().getUserLanguage())) { this.getStyleClass().add("nav-button-japanese"); } diff --git a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java index d892c1322c..75c724ec1d 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java @@ -67,6 +67,7 @@ import bisq.network.p2p.P2PService; import bisq.common.Timer; import bisq.common.UserThread; import bisq.common.app.DevEnv; +import bisq.common.app.Version; import bisq.common.config.Config; import bisq.common.file.CorruptedStorageFileHandler; @@ -133,6 +134,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { private final BooleanProperty showAppScreen = new SimpleBooleanProperty(); private final DoubleProperty combinedSyncProgress = new SimpleDoubleProperty(-1); private final BooleanProperty isSplashScreenRemoved = new SimpleBooleanProperty(); + private final StringProperty footerVersionInfo = new SimpleStringProperty(); private Timer checkNumberOfBtcPeersTimer; private Timer checkNumberOfP2pNetworkPeersTimer; @SuppressWarnings("FieldCanBeLocal") @@ -401,6 +403,13 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { } }); + bisqSetup.setDownGradePreventionHandler(lastVersion -> { + new Popup().warning(Res.get("popup.warn.downGradePrevention", lastVersion, Version.VERSION)) + .useShutDownButton() + .hideCloseButton() + .show(); + }); + corruptedStorageFileHandler.getFiles().ifPresent(files -> new Popup() .warning(Res.get("popup.warning.incompatibleDB", files.toString(), config.appDataDir)) .useShutDownButton() @@ -414,6 +423,15 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { daoPresentation.getBsqSyncProgress().addListener((observable, oldValue, newValue) -> updateBtcSyncProgress()); bisqSetup.setFilterWarningHandler(warning -> new Popup().warning(warning).show()); + + this.footerVersionInfo.setValue("v" + Version.VERSION); + this.getNewVersionAvailableProperty().addListener((observable, oldValue, newValue) -> { + if (newValue) { + this.footerVersionInfo.setValue("v" + Version.VERSION + " " + Res.get("mainView.version.update")); + } else { + this.footerVersionInfo.setValue("v" + Version.VERSION); + } + }); } private void showRevolutAccountUpdateWindow(List revolutAccountList) { @@ -596,7 +614,13 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { // Wallet StringProperty getBtcInfo() { final StringProperty combinedInfo = new SimpleStringProperty(); - combinedInfo.bind(Bindings.concat(bisqSetup.getBtcInfo(), " ", daoPresentation.getBsqInfo())); + combinedInfo.bind(bisqSetup.getBtcInfo()); + return combinedInfo; + } + + StringProperty getCombinedFooterInfo() { + final StringProperty combinedInfo = new SimpleStringProperty(); + combinedInfo.bind(Bindings.concat(this.footerVersionInfo, " ", daoPresentation.getBsqInfo())); return combinedInfo; } diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.fxml b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.fxml index 5594f36156..e701e4533b 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.fxml +++ b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.fxml @@ -31,6 +31,6 @@ - + diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java index a3a0088579..d837db01ce 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java +++ b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java @@ -21,6 +21,8 @@ import bisq.desktop.common.view.FxmlView; import bisq.desktop.components.TitledGroupBg; import bisq.desktop.components.paymentmethods.AdvancedCashForm; import bisq.desktop.components.paymentmethods.AliPayForm; +import bisq.desktop.components.paymentmethods.AmazonGiftCardForm; +import bisq.desktop.components.paymentmethods.AustraliaPayidForm; import bisq.desktop.components.paymentmethods.CashDepositForm; import bisq.desktop.components.paymentmethods.ChaseQuickPayForm; import bisq.desktop.components.paymentmethods.ClearXchangeForm; @@ -42,6 +44,7 @@ import bisq.desktop.components.paymentmethods.SepaForm; import bisq.desktop.components.paymentmethods.SepaInstantForm; import bisq.desktop.components.paymentmethods.SpecificBankForm; import bisq.desktop.components.paymentmethods.SwishForm; +import bisq.desktop.components.paymentmethods.TransferwiseForm; import bisq.desktop.components.paymentmethods.USPostalMoneyOrderForm; import bisq.desktop.components.paymentmethods.UpholdForm; import bisq.desktop.components.paymentmethods.WeChatPayForm; @@ -53,6 +56,7 @@ import bisq.desktop.util.GUIUtil; import bisq.desktop.util.Layout; import bisq.desktop.util.validation.AdvancedCashValidator; import bisq.desktop.util.validation.AliPayValidator; +import bisq.desktop.util.validation.AustraliaPayidValidator; import bisq.desktop.util.validation.BICValidator; import bisq.desktop.util.validation.ChaseQuickPayValidator; import bisq.desktop.util.validation.ClearXchangeValidator; @@ -67,6 +71,7 @@ import bisq.desktop.util.validation.PopmoneyValidator; import bisq.desktop.util.validation.PromptPayValidator; import bisq.desktop.util.validation.RevolutValidator; import bisq.desktop.util.validation.SwishValidator; +import bisq.desktop.util.validation.TransferwiseValidator; import bisq.desktop.util.validation.USPostalMoneyOrderValidator; import bisq.desktop.util.validation.UpholdValidator; import bisq.desktop.util.validation.WeChatPayValidator; @@ -74,6 +79,8 @@ import bisq.desktop.util.validation.WeChatPayValidator; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.locale.Res; import bisq.core.offer.OfferRestrictions; +import bisq.core.payment.AmazonGiftCardAccount; +import bisq.core.payment.AustraliaPayid; import bisq.core.payment.CashDepositAccount; import bisq.core.payment.ClearXchangeAccount; import bisq.core.payment.F2FAccount; @@ -137,12 +144,14 @@ public class FiatAccountsView extends PaymentAccountsView paymentMethodComboBox; private PaymentMethodForm paymentMethodForm; @@ -166,12 +175,14 @@ public class FiatAccountsView extends PaymentAccountsView doSaveNewAccount(paymentAccount)) .show(); + } else if (paymentAccount instanceof AustraliaPayid) { + new Popup().information(Res.get("payment.payid.info", currencyName, currencyName)) + .width(900) + .closeButtonText(Res.get("shared.cancel")) + .actionButtonText(Res.get("shared.iConfirm")) + .onAction(() -> doSaveNewAccount(paymentAccount)) + .show(); + } else if (paymentAccount instanceof AmazonGiftCardAccount) { + new Popup().information(Res.get("payment.amazonGiftCard.info", currencyName, currencyName)) + .width(900) + .closeButtonText(Res.get("shared.cancel")) + .actionButtonText(Res.get("shared.iUnderstand")) + .onAction(() -> doSaveNewAccount(paymentAccount)) + .show(); } else { doSaveNewAccount(paymentAccount); } @@ -452,6 +479,8 @@ public class FiatAccountsView extends PaymentAccountsView miningFeeAndTxSize = daoFacade.getLockupTxMiningFeeAndTxSize(lockupAmount, lockupTime, lockupReason, hash); - Coin miningFee = miningFeeAndTxSize.first; - int txSize = miningFeeAndTxSize.second; + Tuple2 miningFeeAndTxVsize = daoFacade.getLockupTxMiningFeeAndTxVsize(lockupAmount, lockupTime, lockupReason, hash); + Coin miningFee = miningFeeAndTxVsize.first; + int txVsize = miningFeeAndTxVsize.second; String duration = FormattingUtils.formatDurationAsWords(lockupTime * 10 * 60 * 1000L, false, false); new Popup().headLine(Res.get("dao.bond.reputation.lockup.headline")) .confirmation(Res.get("dao.bond.reputation.lockup.details", @@ -121,8 +119,8 @@ public class BondingViewUtils { lockupTime, duration, bsqFormatter.formatBTCWithCode(miningFee), - CoinUtil.getFeePerByte(miningFee, txSize), - txSize / 1000d + CoinUtil.getFeePerVbyte(miningFee, txVsize), + txVsize / 1000d )) .actionButtonText(Res.get("shared.yes")) .onAction(() -> publishLockupTx(lockupAmount, lockupTime, lockupReason, hash, resultHandler)) @@ -169,9 +167,9 @@ public class BondingViewUtils { try { if (!DevEnv.isDevMode()) { - Tuple2 miningFeeAndTxSize = daoFacade.getUnlockTxMiningFeeAndTxSize(lockupTxId); - Coin miningFee = miningFeeAndTxSize.first; - int txSize = miningFeeAndTxSize.second; + Tuple2 miningFeeAndTxVsize = daoFacade.getUnlockTxMiningFeeAndTxVsize(lockupTxId); + Coin miningFee = miningFeeAndTxVsize.first; + int txVsize = miningFeeAndTxVsize.second; String duration = FormattingUtils.formatDurationAsWords(lockTime * 10 * 60 * 1000L, false, false); new Popup().headLine(Res.get("dao.bond.reputation.unlock.headline")) .confirmation(Res.get("dao.bond.reputation.unlock.details", @@ -179,8 +177,8 @@ public class BondingViewUtils { lockTime, duration, bsqFormatter.formatBTCWithCode(miningFee), - CoinUtil.getFeePerByte(miningFee, txSize), - txSize / 1000d + CoinUtil.getFeePerVbyte(miningFee, txVsize), + txVsize / 1000d )) .actionButtonText(Res.get("shared.yes")) .onAction(() -> publishUnlockTx(lockupTxId, resultHandler)) diff --git a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java index d873ed60d7..0d95572770 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java @@ -189,10 +189,10 @@ public class AssetFeeView extends ActivatableView implements Bsq try { Transaction transaction = assetService.payFee(selectedAsset, listingFee.value); Coin miningFee = transaction.getFee(); - int txSize = transaction.bitcoinSerialize().length; + int txVsize = transaction.getVsize(); if (!DevEnv.isDevMode()) { - GUIUtil.showBsqFeeInfoPopup(listingFee, miningFee, txSize, bsqFormatter, btcFormatter, + GUIUtil.showBsqFeeInfoPopup(listingFee, miningFee, txVsize, bsqFormatter, btcFormatter, Res.get("dao.burnBsq.assetFee"), () -> doPublishFeeTx(transaction)); } else { doPublishFeeTx(transaction); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java index d9b5d7c281..d1dbc15d75 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java @@ -172,10 +172,10 @@ public class ProofOfBurnView extends ActivatableView implements String preImageAsString = preImageTextField.getText(); Transaction transaction = proofOfBurnService.burn(preImageAsString, amount.value); Coin miningFee = transaction.getFee(); - int txSize = transaction.bitcoinSerialize().length; + int txVsize = transaction.getVsize(); if (!DevEnv.isDevMode()) { - GUIUtil.showBsqFeeInfoPopup(amount, miningFee, txSize, bsqFormatter, btcFormatter, + GUIUtil.showBsqFeeInfoPopup(amount, miningFee, txVsize, bsqFormatter, btcFormatter, Res.get("dao.proofOfBurn.header"), () -> doPublishFeeTx(transaction, preImageAsString)); } else { doPublishFeeTx(transaction, preImageAsString); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/BsqDashboardView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/BsqDashboardView.java index 4e5bea571c..e8444c02f9 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/BsqDashboardView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/BsqDashboardView.java @@ -20,6 +20,7 @@ package bisq.desktop.main.dao.economy.dashboard; import bisq.desktop.common.view.ActivatableView; import bisq.desktop.common.view.FxmlView; import bisq.desktop.components.TextFieldWithIcon; +import bisq.desktop.util.AxisInlierUtils; import bisq.core.dao.DaoFacade; import bisq.core.dao.state.DaoStateListener; @@ -112,8 +113,10 @@ public class BsqDashboardView extends ActivatableView implements private Label marketPriceLabel; private Coin availableAmount; - private int gridRow = 0; + double howManyStdDevsConstituteOutlier = 10; + private Price avg30DayUSDPrice; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, lifecycle @@ -121,10 +124,10 @@ public class BsqDashboardView extends ActivatableView implements @Inject public BsqDashboardView(DaoFacade daoFacade, - TradeStatisticsManager tradeStatisticsManager, - PriceFeedService priceFeedService, - Preferences preferences, - BsqFormatter bsqFormatter) { + TradeStatisticsManager tradeStatisticsManager, + PriceFeedService priceFeedService, + Preferences preferences, + BsqFormatter bsqFormatter) { this.daoFacade = daoFacade; this.tradeStatisticsManager = tradeStatisticsManager; this.priceFeedService = priceFeedService; @@ -134,7 +137,6 @@ public class BsqDashboardView extends ActivatableView implements @Override public void initialize() { - ADJUSTERS.put(DAY, TemporalAdjusters.ofDateAdjuster(d -> d)); createKPIs(); @@ -144,6 +146,7 @@ public class BsqDashboardView extends ActivatableView implements updatePrice(); updateAveragePriceFields(avgPrice90TextField, avgPrice30TextField, false); updateAveragePriceFields(avgUSDPrice90TextField, avgUSDPrice30TextField, true); + updateMarketCap(); }; } @@ -187,6 +190,7 @@ public class BsqDashboardView extends ActivatableView implements updateChartData(); updateAveragePriceFields(avgPrice90TextField, avgPrice30TextField, false); updateAveragePriceFields(avgUSDPrice90TextField, avgUSDPrice30TextField, true); + updateMarketCap(); } @@ -332,14 +336,16 @@ public class BsqDashboardView extends ActivatableView implements Price bsqPrice = optionalBsqPrice.get(); marketPriceLabel.setText(FormattingUtils.formatPrice(bsqPrice) + " BSQ/BTC"); - marketCapTextField.setText(bsqFormatter.formatMarketCap(priceFeedService.getMarketPrice("BSQ"), - priceFeedService.getMarketPrice(preferences.getPreferredTradeCurrency().getCode()), - availableAmount)); - updateChartData(); - } else { marketPriceLabel.setText(Res.get("shared.na")); + } + } + + private void updateMarketCap() { + if (avg30DayUSDPrice != null) { + marketCapTextField.setText(bsqFormatter.formatMarketCap(avg30DayUSDPrice, availableAmount)); + } else { marketCapTextField.setText(Res.get("shared.na")); } } @@ -368,15 +374,24 @@ public class BsqDashboardView extends ActivatableView implements } private long updateAveragePriceField(TextField textField, int days, boolean isUSDField) { + double percentToTrim = Math.max(0, Math.min(49, preferences.getBsqAverageTrimThreshold() * 100)); Date pastXDays = getPastDate(days); - List bsqTradePastXDays = tradeStatisticsManager.getObservableTradeStatisticsSet().stream() + List bsqAllTradePastXDays = tradeStatisticsManager.getObservableTradeStatisticsSet().stream() .filter(e -> e.getCurrency().equals("BSQ")) .filter(e -> e.getDate().after(pastXDays)) .collect(Collectors.toList()); - List usdTradePastXDays = tradeStatisticsManager.getObservableTradeStatisticsSet().stream() + List bsqTradePastXDays = percentToTrim > 0 ? + removeOutliers(bsqAllTradePastXDays, percentToTrim) : + bsqAllTradePastXDays; + + List usdAllTradePastXDays = tradeStatisticsManager.getObservableTradeStatisticsSet().stream() .filter(e -> e.getCurrency().equals("USD")) .filter(e -> e.getDate().after(pastXDays)) .collect(Collectors.toList()); + List usdTradePastXDays = percentToTrim > 0 ? + removeOutliers(usdAllTradePastXDays, percentToTrim) : + usdAllTradePastXDays; + long average = isUSDField ? getUSDAverage(bsqTradePastXDays, usdTradePastXDays) : getBTCAverage(bsqTradePastXDays); Price avgPrice = isUSDField ? Price.valueOf("USD", average) : @@ -384,17 +399,35 @@ public class BsqDashboardView extends ActivatableView implements String avg = FormattingUtils.formatPrice(avgPrice); if (isUSDField) { textField.setText(avg + " USD/BSQ"); + if (days == 30) { + avg30DayUSDPrice = avgPrice; + } } else { textField.setText(avg + " BSQ/BTC"); } return average; } - private long getBTCAverage(List bsqList) { + private List removeOutliers(List list, double percentToTrim) { + List yValues = list.stream() + .filter(TradeStatistics3::isValid) + .map(e -> (double) e.getPrice()) + .collect(Collectors.toList()); + + Tuple2 tuple = AxisInlierUtils.findInlierRange(yValues, percentToTrim, howManyStdDevsConstituteOutlier); + double lowerBound = tuple.first; + double upperBound = tuple.second; + return list.stream() + .filter(e -> e.getPrice() > lowerBound) + .filter(e -> e.getPrice() < upperBound) + .collect(Collectors.toList()); + } + + private long getBTCAverage(List list) { long accumulatedVolume = 0; long accumulatedAmount = 0; - for (TradeStatistics3 item : bsqList) { + for (TradeStatistics3 item : list) { accumulatedVolume += item.getTradeVolume().getValue(); accumulatedAmount += item.getTradeAmount().getValue(); // Amount of BTC traded } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/make/MakeProposalView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/make/MakeProposalView.java index 89372c9393..5b1a467968 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/make/MakeProposalView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/make/MakeProposalView.java @@ -283,7 +283,7 @@ public class MakeProposalView extends ActivatableView implements Proposal proposal = proposalWithTransaction.getProposal(); Transaction transaction = proposalWithTransaction.getTransaction(); Coin miningFee = transaction.getFee(); - int txSize = transaction.bitcoinSerialize().length; + int txVsize = transaction.getVsize(); Coin fee = daoFacade.getProposalFee(daoFacade.getChainHeight()); if (type.equals(ProposalType.BONDED_ROLE)) { @@ -298,13 +298,13 @@ public class MakeProposalView extends ActivatableView implements new Popup().warning(Res.get("dao.proposal.create.missingBsqFundsForBond", bsqFormatter.formatCoinWithCode(missing))) .actionButtonText(Res.get("dao.proposal.create.publish")) - .onAction(() -> showFeeInfoAndPublishMyProposal(proposal, transaction, miningFee, txSize, fee)) + .onAction(() -> showFeeInfoAndPublishMyProposal(proposal, transaction, miningFee, txVsize, fee)) .show(); } else { - showFeeInfoAndPublishMyProposal(proposal, transaction, miningFee, txSize, fee); + showFeeInfoAndPublishMyProposal(proposal, transaction, miningFee, txVsize, fee); } } else { - showFeeInfoAndPublishMyProposal(proposal, transaction, miningFee, txSize, fee); + showFeeInfoAndPublishMyProposal(proposal, transaction, miningFee, txVsize, fee); } } catch (InsufficientMoneyException e) { if (e instanceof InsufficientBsqException) { @@ -340,13 +340,13 @@ public class MakeProposalView extends ActivatableView implements } } - private void showFeeInfoAndPublishMyProposal(Proposal proposal, Transaction transaction, Coin miningFee, int txSize, Coin fee) { + private void showFeeInfoAndPublishMyProposal(Proposal proposal, Transaction transaction, Coin miningFee, int txVsize, Coin fee) { if (!DevEnv.isDevMode()) { Coin btcForIssuance = null; if (proposal instanceof IssuanceProposal) btcForIssuance = ((IssuanceProposal) proposal).getRequestedBsq(); - GUIUtil.showBsqFeeInfoPopup(fee, miningFee, btcForIssuance, txSize, bsqFormatter, btcFormatter, + GUIUtil.showBsqFeeInfoPopup(fee, miningFee, btcForIssuance, txVsize, bsqFormatter, btcFormatter, Res.get("dao.proposal"), () -> doPublishMyProposal(proposal, transaction)); } else { doPublishMyProposal(proposal, transaction); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsListItem.java index 9fd0b1bf07..c086277012 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsListItem.java @@ -49,7 +49,7 @@ import javax.annotation.Nullable; //TODO merge with vote result ProposalListItem public class ProposalsListItem { - enum IconButtonTypes { + enum IconButtonType { REMOVE_PROPOSAL(Res.get("dao.proposal.table.icon.tooltip.removeProposal")), ACCEPT(Res.get("dao.proposal.display.myVote.accepted")), REJECT(Res.get("dao.proposal.display.myVote.rejected")), @@ -57,7 +57,7 @@ public class ProposalsListItem { @Getter private String title; - IconButtonTypes(String title) { + IconButtonType(String title) { this.title = title; } } @@ -127,8 +127,9 @@ public class ProposalsListItem { icon.getStyleClass().addAll("icon", "dao-remove-proposal-icon"); iconButton = new JFXButton("", icon); boolean isMyProposal = daoFacade.isMyProposal(proposal); - if (isMyProposal) - iconButton.setUserData(IconButtonTypes.REMOVE_PROPOSAL); + if (isMyProposal) { + iconButton.setUserData(IconButtonType.REMOVE_PROPOSAL); + } iconButton.setVisible(isMyProposal); iconButton.setManaged(isMyProposal); iconButton.getStyleClass().add("hidden-icon-button"); @@ -147,36 +148,36 @@ public class ProposalsListItem { icon = FormBuilder.getIcon(AwesomeIcon.THUMBS_UP); icon.getStyleClass().addAll("icon", "dao-accepted-icon"); iconButton = new JFXButton("", icon); - iconButton.setUserData(IconButtonTypes.ACCEPT); + iconButton.setUserData(IconButtonType.ACCEPT); } else { icon = FormBuilder.getIcon(AwesomeIcon.THUMBS_DOWN); icon.getStyleClass().addAll("icon", "dao-rejected-icon"); iconButton = new JFXButton("", icon); - iconButton.setUserData(IconButtonTypes.REJECT); + iconButton.setUserData(IconButtonType.REJECT); } } else { icon = FormBuilder.getIcon(AwesomeIcon.MINUS); icon.getStyleClass().addAll("icon", "dao-ignored-icon"); iconButton = new JFXButton("", icon); - iconButton.setUserData(IconButtonTypes.IGNORE); + iconButton.setUserData(IconButtonType.IGNORE); } iconButton.setTooltip(new Tooltip(Res.get("dao.proposal.table.icon.tooltip.changeVote", - ((IconButtonTypes) iconButton.getUserData()).getTitle(), - getNext(((IconButtonTypes) iconButton.getUserData())) + ((IconButtonType) iconButton.getUserData()).getTitle(), + getNext(((IconButtonType) iconButton.getUserData())) ))); iconButton.getStyleClass().add("hidden-icon-button"); iconButton.layout(); } } - private String getNext(IconButtonTypes iconButtonTypes) { - switch (iconButtonTypes) { + private String getNext(IconButtonType iconButtonType) { + switch (iconButtonType) { case ACCEPT: - return IconButtonTypes.REJECT.getTitle(); + return IconButtonType.REJECT.getTitle(); case REJECT: - return IconButtonTypes.IGNORE.getTitle(); + return IconButtonType.IGNORE.getTitle(); default: - return IconButtonTypes.ACCEPT.getTitle(); + return IconButtonType.ACCEPT.getTitle(); } } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java index 6a403d6297..4e18232904 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java @@ -475,12 +475,12 @@ public class ProposalsView extends ActivatableView implements Bs Coin stake = ParsingUtils.parseToCoin(stakeInputTextField.getText(), bsqFormatter); try { // We create a dummy tx to get the miningFee for displaying it at the confirmation popup - Tuple2 miningFeeAndTxSize = daoFacade.getBlindVoteMiningFeeAndTxSize(stake); - Coin miningFee = miningFeeAndTxSize.first; - int txSize = miningFeeAndTxSize.second; + Tuple2 miningFeeAndTxVsize = daoFacade.getBlindVoteMiningFeeAndTxVsize(stake); + Coin miningFee = miningFeeAndTxVsize.first; + int txVsize = miningFeeAndTxVsize.second; Coin blindVoteFee = daoFacade.getBlindVoteFeeForCycle(); if (!DevEnv.isDevMode()) { - GUIUtil.showBsqFeeInfoPopup(blindVoteFee, miningFee, txSize, bsqFormatter, btcFormatter, + GUIUtil.showBsqFeeInfoPopup(blindVoteFee, miningFee, txVsize, bsqFormatter, btcFormatter, Res.get("dao.blindVote"), () -> publishBlindVote(stake)); } else { publishBlindVote(stake); @@ -590,7 +590,11 @@ public class ProposalsView extends ActivatableView implements Bs switch (daoFacade.phaseProperty().get()) { case PROPOSAL: - lastColumn.setText(Res.get("dao.proposal.table.header.remove")); + // We have a bug in removing a proposal which is not trivial to fix (p2p network layer). Until that bug is fixed + // it is better to not show the remove button as it confused users and a removed proposal will reappear with a + // high probability at the vote phase. + //lastColumn.setText(Res.get("dao.proposal.table.header.remove")); + lastColumn.setText(""); break; case BLIND_VOTE: lastColumn.setText(Res.get("dao.proposal.table.header.myVote")); @@ -841,25 +845,36 @@ public class ProposalsView extends ActivatableView implements Bs item.onPhaseChanged(currentPhase); JFXButton iconButton = item.getIconButton(); if (iconButton != null) { + ProposalsListItem.IconButtonType iconButtonType = (ProposalsListItem.IconButtonType) iconButton.getUserData(); iconButton.setOnAction(e -> { selectedItem = item; if (areVoteButtonsVisible) { - if (iconButton.getUserData() == ProposalsListItem.IconButtonTypes.ACCEPT) + if (iconButtonType == ProposalsListItem.IconButtonType.ACCEPT) onReject(); - else if (iconButton.getUserData() == ProposalsListItem.IconButtonTypes.REJECT) + else if (iconButtonType == ProposalsListItem.IconButtonType.REJECT) onIgnore(); - else if (iconButton.getUserData() == ProposalsListItem.IconButtonTypes.IGNORE) + else if (iconButtonType == ProposalsListItem.IconButtonType.IGNORE) onAccept(); } else { - if (iconButton.getUserData() == ProposalsListItem.IconButtonTypes.REMOVE_PROPOSAL) + if (iconButtonType == ProposalsListItem.IconButtonType.REMOVE_PROPOSAL) onRemoveProposal(); } }); - if (!areVoteButtonsVisible && iconButton.getUserData() != ProposalsListItem.IconButtonTypes.REMOVE_PROPOSAL) { + if (!areVoteButtonsVisible && iconButtonType != ProposalsListItem.IconButtonType.REMOVE_PROPOSAL) { iconButton.setMouseTransparent(true); iconButton.setStyle("-fx-cursor: default;"); } + + // We have a bug in removing a proposal which is not trivial to fix (p2p network layer). + // Until that bug is fixed + // it is better to not show the remove button as it confused users and a removed proposal will reappear with a + // high probability at the vote phase. The following lines can be removed once the bug is fixed. + boolean showIcon = iconButtonType != null && + iconButtonType != ProposalsListItem.IconButtonType.REMOVE_PROPOSAL; + iconButton.setVisible(showIcon); + iconButton.setManaged(showIcon); + setGraphic(iconButton); } else { setGraphic(null); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/wallet/send/BsqSendView.java b/desktop/src/main/java/bisq/desktop/main/dao/wallet/send/BsqSendView.java index 0c8a6cd841..917d1290aa 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/wallet/send/BsqSendView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/wallet/send/BsqSendView.java @@ -27,6 +27,7 @@ import bisq.desktop.main.dao.wallet.BsqBalanceUtil; import bisq.desktop.main.funds.FundsView; import bisq.desktop.main.funds.deposit.DepositView; import bisq.desktop.main.overlays.popups.Popup; +import bisq.desktop.main.overlays.windows.WalletPasswordWindow; import bisq.desktop.util.GUIUtil; import bisq.desktop.util.Layout; import bisq.desktop.util.validation.BsqAddressValidator; @@ -53,6 +54,7 @@ import bisq.core.util.validation.BtcAddressValidator; import bisq.network.p2p.P2PService; +import bisq.common.UserThread; import bisq.common.handlers.ResultHandler; import org.bitcoinj.core.Coin; @@ -67,6 +69,8 @@ import javafx.scene.layout.GridPane; import javafx.beans.value.ChangeListener; +import java.util.concurrent.TimeUnit; + import static bisq.desktop.util.FormBuilder.addButtonAfterGroup; import static bisq.desktop.util.FormBuilder.addInputTextField; import static bisq.desktop.util.FormBuilder.addTitledGroupBg; @@ -86,6 +90,7 @@ public class BsqSendView extends ActivatableView implements BsqB private final BtcValidator btcValidator; private final BsqAddressValidator bsqAddressValidator; private final BtcAddressValidator btcAddressValidator; + private final WalletPasswordWindow walletPasswordWindow; private int gridRow = 0; private InputTextField amountInputTextField, btcAmountInputTextField; @@ -113,7 +118,8 @@ public class BsqSendView extends ActivatableView implements BsqB BsqValidator bsqValidator, BtcValidator btcValidator, BsqAddressValidator bsqAddressValidator, - BtcAddressValidator btcAddressValidator) { + BtcAddressValidator btcAddressValidator, + WalletPasswordWindow walletPasswordWindow) { this.bsqWalletService = bsqWalletService; this.btcWalletService = btcWalletService; this.walletsManager = walletsManager; @@ -127,6 +133,7 @@ public class BsqSendView extends ActivatableView implements BsqB this.btcValidator = btcValidator; this.bsqAddressValidator = bsqAddressValidator; this.btcAddressValidator = btcAddressValidator; + this.walletPasswordWindow = walletPasswordWindow; } @Override @@ -243,12 +250,12 @@ public class BsqSendView extends ActivatableView implements BsqB Transaction txWithBtcFee = btcWalletService.completePreparedSendBsqTx(preparedSendTx, true); Transaction signedTx = bsqWalletService.signTx(txWithBtcFee); Coin miningFee = signedTx.getFee(); - int txSize = signedTx.bitcoinSerialize().length; + int txVsize = signedTx.getVsize(); showPublishTxPopup(receiverAmount, txWithBtcFee, TxType.TRANSFER_BSQ, miningFee, - txSize, + txVsize, receiversAddressInputTextField.getText(), bsqFormatter, btcFormatter, @@ -305,12 +312,12 @@ public class BsqSendView extends ActivatableView implements BsqB if (miningFee.getValue() >= receiverAmount.getValue()) GUIUtil.showWantToBurnBTCPopup(miningFee, receiverAmount, btcFormatter); else { - int txSize = signedTx.bitcoinSerialize().length; + int txVsize = signedTx.getVsize(); showPublishTxPopup(receiverAmount, txWithBtcFee, TxType.INVALID, miningFee, - txSize, receiversBtcAddressInputTextField.getText(), + txVsize, receiversBtcAddressInputTextField.getText(), btcFormatter, btcFormatter, () -> { @@ -348,7 +355,7 @@ public class BsqSendView extends ActivatableView implements BsqB Transaction txWithBtcFee, TxType txType, Coin miningFee, - int txSize, String address, + int txVsize, String address, CoinFormatter amountFormatter, // can be BSQ or BTC formatter CoinFormatter feeFormatter, ResultHandler resultHandler) { @@ -357,12 +364,12 @@ public class BsqSendView extends ActivatableView implements BsqB amountFormatter.formatCoinWithCode(receiverAmount), address, feeFormatter.formatCoinWithCode(miningFee), - CoinUtil.getFeePerByte(miningFee, txSize), - txSize / 1000d, + CoinUtil.getFeePerVbyte(miningFee, txVsize), + txVsize / 1000d, amountFormatter.formatCoinWithCode(receiverAmount))) .actionButtonText(Res.get("shared.yes")) .onAction(() -> { - walletsManager.publishAndCommitBsqTx(txWithBtcFee, txType, new TxBroadcaster.Callback() { + doWithdraw(txWithBtcFee, txType, new TxBroadcaster.Callback() { @Override public void onSuccess(Transaction transaction) { log.debug("Successfully sent tx with id {}", txWithBtcFee.getTxId().toString()); @@ -378,5 +385,19 @@ public class BsqSendView extends ActivatableView implements BsqB .closeButtonText(Res.get("shared.cancel")) .show(); } + + private void doWithdraw(Transaction txWithBtcFee, TxType txType, TxBroadcaster.Callback callback) { + if (btcWalletService.isEncrypted()) { + UserThread.runAfter(() -> walletPasswordWindow.onAesKey(aesKey -> + sendFunds(txWithBtcFee, txType, callback)) + .show(), 300, TimeUnit.MILLISECONDS); + } else { + sendFunds(txWithBtcFee, txType, callback); + } + } + + private void sendFunds(Transaction txWithBtcFee, TxType txType, TxBroadcaster.Callback callback) { + walletsManager.publishAndCommitBsqTx(txWithBtcFee, txType, callback); + } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxListItem.java index be22c82fcc..342bdfdd76 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxListItem.java @@ -27,21 +27,23 @@ import bisq.core.dao.state.model.blockchain.TxType; import bisq.core.locale.Res; import bisq.core.util.coin.BsqFormatter; +import org.bitcoinj.core.Address; import org.bitcoinj.core.Coin; +import org.bitcoinj.core.LegacyAddress; import org.bitcoinj.core.Transaction; import org.bitcoinj.core.TransactionOutput; import java.util.Date; -import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import static com.google.common.base.Preconditions.checkNotNull; @Slf4j @EqualsAndHashCode(callSuper = true) -@Data +@Getter class BsqTxListItem extends TxConfidenceListItem { private final DaoFacade daoFacade; private final BsqFormatter bsqFormatter; @@ -51,11 +53,9 @@ class BsqTxListItem extends TxConfidenceListItem { private final String address; private final String direction; - private Coin amount; + private final Coin amount; private boolean received; - private boolean issuanceTx; - BsqTxListItem(Transaction transaction, BsqWalletService bsqWalletService, BtcWalletService btcWalletService, @@ -102,18 +102,24 @@ class BsqTxListItem extends TxConfidenceListItem { WalletService.isOutputScriptConvertibleToAddress(output)) { // We don't support send txs with multiple outputs to multiple receivers, so we can // assume that only one output is not from our own wallets. - sendToAddress = bsqFormatter.getBsqAddressStringFromAddress(WalletService.getAddressFromOutput(output)); - break; + // We ignore segwit outputs + Address addressFromOutput = WalletService.getAddressFromOutput(output); + if (addressFromOutput instanceof LegacyAddress) { + sendToAddress = bsqFormatter.getBsqAddressStringFromAddress((LegacyAddress) addressFromOutput); + break; + } } } // In the case we sent to ourselves (either to BSQ or BTC wallet) we show the first as the other is // usually the change output. String receivedWithAddress = Res.get("shared.na"); - if (sendToAddress != null) { - for (TransactionOutput output : transaction.getOutputs()) { - if (WalletService.isOutputScriptConvertibleToAddress(output)) { - receivedWithAddress = bsqFormatter.getBsqAddressStringFromAddress(WalletService.getAddressFromOutput(output)); + for (TransactionOutput output : transaction.getOutputs()) { + if (WalletService.isOutputScriptConvertibleToAddress(output)) { + Address addressFromOutput = WalletService.getAddressFromOutput(output); + // We ignore segwit outputs + if (addressFromOutput instanceof LegacyAddress) { + receivedWithAddress = bsqFormatter.getBsqAddressStringFromAddress((LegacyAddress) addressFromOutput); break; } } diff --git a/desktop/src/main/java/bisq/desktop/main/funds/withdrawal/WithdrawalView.java b/desktop/src/main/java/bisq/desktop/main/funds/withdrawal/WithdrawalView.java index 898fab36c4..0d1a26fdbc 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/withdrawal/WithdrawalView.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/withdrawal/WithdrawalView.java @@ -121,7 +121,7 @@ public class WithdrawalView extends ActivatableView { @FXML TableColumn addressColumn, balanceColumn, selectColumn; - private RadioButton useAllInputsRadioButton, useCustomInputsRadioButton, feeExcludedRadioButton; + private RadioButton useAllInputsRadioButton, useCustomInputsRadioButton, feeExcludedRadioButton, feeIncludedRadioButton; private Label amountLabel; private TextField amountTextField, withdrawFromTextField, withdrawToTextField, withdrawMemoTextField; @@ -209,18 +209,16 @@ public class WithdrawalView extends ActivatableView { amountTextField = feeTuple3.second; amountTextField.setMinWidth(180); feeExcludedRadioButton = feeTuple3.third; - RadioButton feeIncludedRadioButton = feeTuple3.fourth; + feeIncludedRadioButton = feeTuple3.fourth; withdrawFromTextField = addTopLabelTextField(gridPane, ++rowIndex, Res.get("funds.withdrawal.fromLabel", Res.getBaseCurrencyCode())).second; withdrawToTextField = addTopLabelInputTextField(gridPane, ++rowIndex, Res.get("funds.withdrawal.toLabel", Res.getBaseCurrencyCode())).second; - withdrawToTextField.setMaxWidth(380); withdrawMemoTextField = addTopLabelInputTextField(gridPane, ++rowIndex, Res.get("funds.withdrawal.memoLabel", Res.getBaseCurrencyCode())).second; - withdrawMemoTextField.setMaxWidth(380); final Button withdrawButton = addButton(gridPane, ++rowIndex, Res.get("funds.withdrawal.withdrawButton"), 15); @@ -300,7 +298,7 @@ public class WithdrawalView extends ActivatableView { inputsToggleGroup.selectedToggleProperty().addListener(inputsToggleGroupListener); if (feeToggleGroup.getSelectedToggle() == null) - feeToggleGroup.selectToggle(feeExcludedRadioButton); + feeToggleGroup.selectToggle(feeIncludedRadioButton); if (inputsToggleGroup.getSelectedToggle() == null) inputsToggleGroup.selectToggle(useAllInputsRadioButton); @@ -358,20 +356,20 @@ public class WithdrawalView extends ActivatableView { } if (areInputsValid()) { - int txSize = feeEstimationTransaction.bitcoinSerialize().length; - log.info("Fee for tx with size {}: {} " + Res.getBaseCurrencyCode() + "", txSize, fee.toPlainString()); + int txVsize = feeEstimationTransaction.getVsize(); + log.info("Fee for tx with size {}: {} " + Res.getBaseCurrencyCode() + "", txVsize, fee.toPlainString()); if (receiverAmount.isPositive()) { - double feePerByte = CoinUtil.getFeePerByte(fee, txSize); - double kb = txSize / 1000d; + double feePerVbyte = CoinUtil.getFeePerVbyte(fee, txVsize); + double vkb = txVsize / 1000d; String messageText = Res.get("shared.sendFundsDetailsWithFee", formatter.formatCoinWithCode(sendersAmount), withdrawFromTextField.getText(), withdrawToTextField.getText(), formatter.formatCoinWithCode(fee), - feePerByte, - kb, + feePerVbyte, + vkb, formatter.formatCoinWithCode(receiverAmount)); if (dust.isPositive()) { messageText = Res.get("shared.sendFundsDetailsDust", diff --git a/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartView.java b/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartView.java index 59eccc2563..e79b701f32 100644 --- a/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartView.java @@ -88,6 +88,8 @@ import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; +import java.text.DecimalFormat; + import javafx.util.Callback; import javafx.util.StringConverter; @@ -95,6 +97,7 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Function; +import java.util.stream.Collectors; import static bisq.desktop.util.FormBuilder.addTopLabelAutocompleteComboBox; import static bisq.desktop.util.Layout.INITIAL_WINDOW_HEIGHT; @@ -124,6 +127,7 @@ public class OfferBookChartView extends ActivatableViewAndModel changeListener; private ListChangeListener currencyListItemsListener; + private final double chartDataFactor = 3; private final double initialOfferTableViewHeight = 121; private final double pixelsPerOfferTableRow = (initialOfferTableViewHeight - 30) / 5.0; // initial visible row count=5, header height=30 private final Function offerTableViewHeight = (screenSize) -> { @@ -220,6 +224,7 @@ public class OfferBookChartView extends ActivatableViewAndModel() { int cryptoPrecision = 3; + DecimalFormat df = new DecimalFormat(",###"); @Override public String toString(Number object) { @@ -227,13 +232,12 @@ public class OfferBookChartView extends ActivatableViewAndModel(); seriesSell = new XYChart.Series<>(); @@ -389,10 +392,10 @@ public class OfferBookChartView extends ActivatableViewAndModel o.getXValue().doubleValue()) - .filter(o -> o < buyMinValue * 3) + .filter(o -> o < buyMinValue * chartDataFactor) .max() .orElse(Double.MIN_VALUE); @@ -401,27 +404,28 @@ public class OfferBookChartView extends ActivatableViewAndModel o.getXValue().doubleValue()) - .filter(o -> o > sellMaxValue / 3) + .filter(o -> o > sellMaxValue / chartDataFactor) .min() .orElse(Double.MAX_VALUE); double minValue = Double.min(buyMinValue, sellMinValue); double maxValue = Double.max(buyMaxValue, sellMaxValue); - if (minValue == Double.MAX_VALUE || maxValue == Double.MIN_VALUE) { - xAxis.setAutoRanging(true); - } else { - xAxis.setAutoRanging(false); - xAxis.setLowerBound(minValue); - xAxis.setUpperBound(maxValue); - xAxis.setTickUnit((maxValue - minValue) / 13); + if (minValue == Double.MAX_VALUE || maxValue == Double.MIN_VALUE) { // no filtering + seriesBuy.getData().addAll(model.getBuyData()); + seriesSell.getData().addAll(model.getSellData()); + } else { // apply filtering + seriesBuy.getData().addAll(model.getBuyData().stream() + .filter(o -> o.getXValue().doubleValue() < buyMinValue * 3) + .collect(Collectors.toList())); + seriesSell.getData().addAll(model.getSellData().stream() + .filter(o -> o.getXValue().doubleValue() > sellMaxValue / 3) + .collect(Collectors.toList())); } - seriesBuy.getData().addAll(model.getBuyData()); - seriesSell.getData().addAll(model.getSellData()); areaChart.getData().addAll(List.of(seriesBuy, seriesSell)); } diff --git a/desktop/src/main/java/bisq/desktop/main/market/trades/TradeStatistics3ListItem.java b/desktop/src/main/java/bisq/desktop/main/market/trades/TradeStatistics3ListItem.java new file mode 100644 index 0000000000..80fdcb922f --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/market/trades/TradeStatistics3ListItem.java @@ -0,0 +1,74 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.market.trades; + +import bisq.desktop.util.DisplayUtils; + +import bisq.core.locale.CurrencyUtil; +import bisq.core.locale.Res; +import bisq.core.trade.statistics.TradeStatistics3; +import bisq.core.util.FormattingUtils; +import bisq.core.util.coin.CoinFormatter; + +import lombok.experimental.Delegate; + +import org.jetbrains.annotations.Nullable; + +public class TradeStatistics3ListItem { + @Delegate + private final TradeStatistics3 tradeStatistics3; + private final CoinFormatter coinFormatter; + private final boolean showAllTradeCurrencies; + + public TradeStatistics3ListItem(@Nullable TradeStatistics3 tradeStatistics3, + CoinFormatter coinFormatter, + boolean showAllTradeCurrencies) { + this.tradeStatistics3 = tradeStatistics3; + this.coinFormatter = coinFormatter; + this.showAllTradeCurrencies = showAllTradeCurrencies; + } + + public String getDateString() { + return tradeStatistics3 != null ? DisplayUtils.formatDateTime(tradeStatistics3.getDate()) : ""; + } + + public String getMarket() { + return tradeStatistics3 != null ? CurrencyUtil.getCurrencyPair(tradeStatistics3.getCurrency()) : ""; + } + + public String getPriceString() { + return tradeStatistics3 != null ? FormattingUtils.formatPrice(tradeStatistics3.getTradePrice()) : ""; + } + + public String getVolumeString() { + if (tradeStatistics3 == null) { + return ""; + } + return showAllTradeCurrencies ? + DisplayUtils.formatVolumeWithCode(tradeStatistics3.getTradeVolume()) : + DisplayUtils.formatVolume(tradeStatistics3.getTradeVolume()); + } + + public String getPaymentMethodString() { + return tradeStatistics3 != null ? Res.get(tradeStatistics3.getPaymentMethod()) : ""; + } + + public String getAmountString() { + return tradeStatistics3 != null ? coinFormatter.formatCoin(tradeStatistics3.getTradeAmount(), 4) : ""; + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/market/trades/TradesChartsView.java b/desktop/src/main/java/bisq/desktop/main/market/trades/TradesChartsView.java index fbd035ff82..6ef68f5d1d 100644 --- a/desktop/src/main/java/bisq/desktop/main/market/trades/TradesChartsView.java +++ b/desktop/src/main/java/bisq/desktop/main/market/trades/TradesChartsView.java @@ -45,14 +45,19 @@ import bisq.common.util.Tuple3; import org.bitcoinj.core.Coin; +import com.googlecode.jcsv.writer.CSVEntryConverter; + import javax.inject.Inject; import javax.inject.Named; import com.jfoenix.controls.JFXTabPane; +import javafx.stage.Stage; + import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.control.ComboBox; +import javafx.scene.control.Hyperlink; import javafx.scene.control.Label; import javafx.scene.control.SingleSelectionModel; import javafx.scene.control.Tab; @@ -67,6 +72,8 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; +import javafx.scene.Node; +import javafx.scene.text.Text; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -82,15 +89,19 @@ import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; import javafx.collections.transformation.SortedList; import javafx.util.Callback; import javafx.util.StringConverter; +import java.text.DecimalFormat; + import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; @@ -99,39 +110,74 @@ import static bisq.desktop.util.FormBuilder.getTopLabelWithVBox; @FxmlView public class TradesChartsView extends ActivatableViewAndModel { + private static final int SHOW_ALL = 0; - private final CoinFormatter formatter; + static class CurrencyStringConverter extends StringConverter { + private final ComboBox comboBox; + + CurrencyStringConverter(ComboBox comboBox) { + this.comboBox = comboBox; + } + + @Override + public String toString(CurrencyListItem currencyItem) { + return currencyItem != null ? currencyItem.codeDashNameString() : ""; + } + + @Override + public CurrencyListItem fromString(String query) { + if (comboBox.getItems().isEmpty()) + return null; + if (query.isEmpty()) + return specialShowAllItem(); + return comboBox.getItems().stream(). + filter(currencyItem -> currencyItem.codeDashNameString().equals(query)). + findAny().orElse(null); + } + + private CurrencyListItem specialShowAllItem() { + return comboBox.getItems().get(0); + } + } + + private final CoinFormatter coinFormatter; - private TableView tableView; - private AutocompleteComboBox currencyComboBox; private VolumeChart volumeChart; private CandleStickChart priceChart; - private NumberAxis priceAxisX, priceAxisY, volumeAxisY, volumeAxisX; - private XYChart.Series priceSeries; - private XYChart.Series volumeSeries; + private AutocompleteComboBox currencyComboBox; + private TableView tableView; + private Hyperlink exportLink; + private HBox toolBox; + private Pane rootParent; + private AnchorPane priceChartPane, volumeChartPane; + private HBox footer; + private Label nrOfTradeStatisticsLabel; + private ToggleGroup toggleGroup; + private SingleSelectionModel tabPaneSelectionModel; + + private TableColumn priceColumn, volumeColumn, marketColumn; + private final ObservableList listItems = FXCollections.observableArrayList(); + private final SortedList sortedList = new SortedList<>(listItems); + + private ChangeListener timeUnitChangeListener; private ChangeListener priceAxisYWidthListener; private ChangeListener volumeAxisYWidthListener; - private double priceAxisYWidth; - private double volumeAxisYWidth; - private final StringProperty priceColumnLabel = new SimpleStringProperty(); - private ChangeListener timeUnitChangeListener; - private ToggleGroup toggleGroup; - private final ListChangeListener> itemsChangeListener; - private SortedList sortedList; - private Label nrOfTradeStatisticsLabel; - private ListChangeListener tradeStatisticsByCurrencyListener; private ChangeListener selectedTabIndexListener; - private SingleSelectionModel tabPaneSelectionModel; - private TableColumn priceColumn, volumeColumn, marketColumn; + private ChangeListener parentHeightListener; + private ChangeListener priceColumnLabelListener; + private ListChangeListener> itemsChangeListener; + private ListChangeListener tradeStatisticsByCurrencyListener; + @SuppressWarnings("FieldCanBeLocal") private MonadicBinding currencySelectionBinding; private Subscription currencySelectionSubscriber; - private HBox toolBox; - private ChangeListener parentHeightListener; - private Pane rootParent; - private ChangeListener priceColumnLabelListener; - private AnchorPane priceChartPane, volumeChartPane; - private static final int SHOW_ALL = 0; + + private final StringProperty priceColumnLabel = new SimpleStringProperty(); + private NumberAxis priceAxisX, priceAxisY, volumeAxisY, volumeAxisX; + private XYChart.Series priceSeries; + private XYChart.Series volumeSeries; + private double priceAxisYWidth; + private double volumeAxisYWidth; /////////////////////////////////////////////////////////////////////////////////////////// @@ -140,25 +186,36 @@ public class TradesChartsView extends ActivatableViewAndModel UserThread.execute(this::updateChartData); + this.coinFormatter = coinFormatter; } @Override public void initialize() { root.setAlignment(Pos.CENTER_LEFT); toolBox = getToolBox(); + createCharts(); + createTable(); + footer = new HBox(); + VBox.setVgrow(footer, Priority.ALWAYS); + + Pane spacer = new Pane(); + HBox.setHgrow(spacer, Priority.ALWAYS); + nrOfTradeStatisticsLabel = new AutoTooltipLabel(" "); // set empty string for layout - nrOfTradeStatisticsLabel.setId("num-offers"); - nrOfTradeStatisticsLabel.setPadding(new Insets(-5, 0, -10, 5)); - root.getChildren().addAll(toolBox, priceChartPane, volumeChartPane, tableView, nrOfTradeStatisticsLabel); + nrOfTradeStatisticsLabel.setPadding(new Insets(-2, 0, -10, 12)); + + exportLink = new Hyperlink(Res.get("shared.exportCSV")); + exportLink.setPadding(new Insets(-2, 12, -10, 0)); + + footer.getChildren().addAll(nrOfTradeStatisticsLabel, spacer, exportLink); + + root.getChildren().addAll(toolBox, priceChartPane, volumeChartPane, tableView, footer); timeUnitChangeListener = (observable, oldValue, newValue) -> { if (newValue != null) { @@ -180,46 +237,9 @@ public class TradesChartsView extends ActivatableViewAndModel layout(); priceColumnLabelListener = (o, oldVal, newVal) -> priceColumn.setGraphic(new AutoTooltipLabel(newVal)); - } - @Override - protected void activate() { - // root.getParent() is null at initialize - tabPaneSelectionModel = GUIUtil.getParentOfType(root, JFXTabPane.class).getSelectionModel(); - selectedTabIndexListener = (observable, oldValue, newValue) -> model.setSelectedTabIndex((int) newValue); - model.setSelectedTabIndex(tabPaneSelectionModel.getSelectedIndex()); - tabPaneSelectionModel.selectedIndexProperty().addListener(selectedTabIndexListener); - - currencyComboBox.setConverter(new CurrencyStringConverter(currencyComboBox)); - currencyComboBox.getEditor().getStyleClass().add("combo-box-editor-bold"); - - currencyComboBox.setAutocompleteItems(model.getCurrencyListItems()); - currencyComboBox.setVisibleRowCount(10); - - if (model.showAllTradeCurrenciesProperty.get()) - currencyComboBox.getSelectionModel().select(SHOW_ALL); - else if (model.getSelectedCurrencyListItem().isPresent()) - currencyComboBox.getSelectionModel().select(model.getSelectedCurrencyListItem().get()); - currencyComboBox.getEditor().setText(new CurrencyStringConverter(currencyComboBox).toString(currencyComboBox.getSelectionModel().getSelectedItem())); - - currencyComboBox.setOnChangeConfirmed(e -> { - if (currencyComboBox.getEditor().getText().isEmpty()) - currencyComboBox.getSelectionModel().select(SHOW_ALL); - CurrencyListItem selectedItem = currencyComboBox.getSelectionModel().getSelectedItem(); - if (selectedItem != null) - model.onSetTradeCurrency(selectedItem.tradeCurrency); - }); - - toggleGroup.getToggles().get(model.tickUnit.ordinal()).setSelected(true); - - model.priceItems.addListener(itemsChangeListener); - toggleGroup.selectedToggleProperty().addListener(timeUnitChangeListener); - priceAxisY.widthProperty().addListener(priceAxisYWidthListener); - volumeAxisY.widthProperty().addListener(volumeAxisYWidthListener); - model.tradeStatisticsByCurrency.addListener(tradeStatisticsByCurrencyListener); - - priceAxisY.labelProperty().bind(priceColumnLabel); - priceColumnLabel.addListener(priceColumnLabelListener); + // Need to render on next frame as otherwise there are issues in the chart rendering + itemsChangeListener = c -> UserThread.execute(this::updateChartData); currencySelectionBinding = EasyBind.combine( model.showAllTradeCurrenciesProperty, model.selectedTradeCurrencyProperty, @@ -248,10 +268,53 @@ public class TradesChartsView extends ActivatableViewAndModel model.setSelectedTabIndex((int) newValue); + model.setSelectedTabIndex(tabPaneSelectionModel.getSelectedIndex()); + tabPaneSelectionModel.selectedIndexProperty().addListener(selectedTabIndexListener); + + currencyComboBox.setConverter(new CurrencyStringConverter(currencyComboBox)); + currencyComboBox.getEditor().getStyleClass().add("combo-box-editor-bold"); + + currencyComboBox.setAutocompleteItems(model.getCurrencyListItems()); + currencyComboBox.setVisibleRowCount(10); + + if (model.showAllTradeCurrenciesProperty.get()) + currencyComboBox.getSelectionModel().select(SHOW_ALL); + else if (model.getSelectedCurrencyListItem().isPresent()) + currencyComboBox.getSelectionModel().select(model.getSelectedCurrencyListItem().get()); + currencyComboBox.getEditor().setText(new CurrencyStringConverter(currencyComboBox).toString(currencyComboBox.getSelectionModel().getSelectedItem())); + + currencyComboBox.setOnChangeConfirmed(e -> { + if (currencyComboBox.getEditor().getText().isEmpty()) + currencyComboBox.getSelectionModel().select(SHOW_ALL); + CurrencyListItem selectedItem = currencyComboBox.getSelectionModel().getSelectedItem(); + if (selectedItem != null) { + model.onSetTradeCurrency(selectedItem.tradeCurrency); + fillList(); + } + }); + + toggleGroup.getToggles().get(model.tickUnit.ordinal()).setSelected(true); + + model.priceItems.addListener(itemsChangeListener); + toggleGroup.selectedToggleProperty().addListener(timeUnitChangeListener); + priceAxisY.widthProperty().addListener(priceAxisYWidthListener); + volumeAxisY.widthProperty().addListener(volumeAxisYWidthListener); + model.tradeStatisticsByCurrency.addListener(tradeStatisticsByCurrencyListener); + + priceAxisY.labelProperty().bind(priceColumnLabel); + priceColumnLabel.addListener(priceColumnLabelListener); + + currencySelectionSubscriber = currencySelectionBinding.subscribe((observable, oldValue, newValue) -> { + }); - currencySelectionSubscriber = currencySelectionBinding.subscribe((observable, oldValue, newValue) -> {}); - sortedList = new SortedList<>(model.tradeStatisticsByCurrency); sortedList.comparatorProperty().bind(tableView.comparatorProperty()); tableView.setItems(sortedList); @@ -262,6 +325,8 @@ public class TradesChartsView extends ActivatableViewAndModel exportToCsv()); + UserThread.runAfter(this::updateChartData, 100, TimeUnit.MILLISECONDS); if (root.getParent() instanceof Pane) { @@ -269,6 +334,7 @@ public class TradesChartsView extends ActivatableViewAndModel { - private ComboBox comboBox; - - CurrencyStringConverter(ComboBox comboBox) { - this.comboBox = comboBox; - } - - @Override - public String toString(CurrencyListItem currencyItem) { - return currencyItem != null ? currencyItem.codeDashNameString() : ""; - } - - @Override - public CurrencyListItem fromString(String query) { - if (comboBox.getItems().isEmpty()) - return null; - if (query.isEmpty()) - return specialShowAllItem(); - return comboBox.getItems().stream(). - filter(currencyItem -> currencyItem.codeDashNameString().equals(query)). - findAny().orElse(null); - } - - private CurrencyListItem specialShowAllItem() { - return comboBox.getItems().get(0); } } + private void fillList() { + ObservableList tradeStatistics3ListItems = FXCollections.observableList(model.tradeStatisticsByCurrency.stream() + .map(tradeStatistics3 -> new TradeStatistics3ListItem(tradeStatistics3, + coinFormatter, + model.showAllTradeCurrenciesProperty.get())) + .collect(Collectors.toList())); + listItems.clear(); + listItems.addAll(tradeStatistics3ListItems); + } + + private void exportToCsv() { + ObservableList> tableColumns = tableView.getColumns(); + int reportColumns = tableColumns.size() + 1; + + boolean showAllTradeCurrencies = model.showAllTradeCurrenciesProperty.get(); + CSVEntryConverter headerConverter = transactionsListItem -> { + String[] columns = new String[reportColumns]; + columns[0] = "Epoch time in ms"; + for (int i = 0; i < tableColumns.size(); i++) { + columns[(i + 1)] = ((AutoTooltipLabel) tableColumns.get(i).getGraphic()).getText(); + } + return columns; + }; + + CSVEntryConverter contentConverter; + if (showAllTradeCurrencies) { + contentConverter = item -> { + String[] columns = new String[reportColumns]; + columns[0] = String.valueOf(item.getDateAsLong()); + columns[1] = item.getDateString(); + columns[2] = item.getMarket(); + columns[3] = item.getPriceString(); + columns[4] = item.getAmountString(); + columns[5] = item.getVolumeString(); + columns[6] = item.getPaymentMethodString(); + return columns; + }; + } else { + contentConverter = item -> { + String[] columns = new String[reportColumns]; + columns[0] = String.valueOf(item.getDateAsLong()); + columns[1] = item.getDateString(); + columns[2] = item.getPriceString(); + columns[3] = item.getAmountString(); + columns[4] = item.getVolumeString(); + columns[5] = item.getPaymentMethodString(); + return columns; + }; + } + + String details = showAllTradeCurrencies ? "all-markets" : model.getCurrencyCode(); + GUIUtil.exportCSV("trade-statistics-" + details + ".csv", headerConverter, contentConverter, + new TradeStatistics3ListItem(null, coinFormatter, showAllTradeCurrencies), + sortedList, + (Stage) root.getScene().getWindow()); + } /////////////////////////////////////////////////////////////////////////////////////////// // Chart @@ -332,10 +429,12 @@ public class TradesChartsView extends ActivatableViewAndModel(); priceAxisX = new NumberAxis(0, model.maxTicks + 1, 1); - priceAxisX.setTickUnit(1); - priceAxisX.setMinorTickCount(0); + priceAxisX.setTickUnit(4); + priceAxisX.setMinorTickCount(4); + priceAxisX.setMinorTickVisible(true); priceAxisX.setForceZeroInRange(false); priceAxisX.setTickLabelFormatter(getTimeAxisStringConverter()); + addTickMarkLabelCssClass(priceAxisX, "axis-tick-mark-text-node"); priceAxisY = new NumberAxis(); priceAxisY.setForceZeroInRange(false); @@ -345,11 +444,13 @@ public class TradesChartsView extends ActivatableViewAndModel(); volumeAxisX = new NumberAxis(0, model.maxTicks + 1, 1); - volumeAxisX.setTickUnit(1); - volumeAxisX.setMinorTickCount(0); + volumeAxisX.setTickUnit(4); + volumeAxisX.setMinorTickCount(4); + volumeAxisX.setMinorTickVisible(true); volumeAxisX.setForceZeroInRange(false); volumeAxisX.setTickLabelFormatter(getTimeAxisStringConverter()); + addTickMarkLabelCssClass(volumeAxisX, "axis-tick-mark-text-node"); volumeAxisY = new NumberAxis(); volumeAxisY.setForceZeroInRange(true); @@ -408,7 +511,7 @@ public class TradesChartsView extends ActivatableViewAndModel() { @Override public String toString(Number object) { - return formatter.formatCoin(Coin.valueOf(MathUtils.doubleToLong((double) object))); + return coinFormatter.formatCoin(Coin.valueOf(MathUtils.doubleToLong((double) object))); } @Override @@ -420,7 +523,7 @@ public class TradesChartsView extends ActivatableViewAndModel() { @Override public String toString(Number object) { - return formatter.formatCoinWithCode(Coin.valueOf((long) object)); + return coinFormatter.formatCoinWithCode(Coin.valueOf((long) object)); } @Override @@ -430,8 +533,8 @@ public class TradesChartsView extends ActivatableViewAndModel) c -> { + while (c.next()) { + if (c.wasAdded()) { + for (Node mark : c.getAddedSubList()) { + if (mark instanceof Text) { + mark.getStyleClass().add(cssClass); + } + } + } + } + }); + } /////////////////////////////////////////////////////////////////////////////////////////// // CurrencyComboBox @@ -529,7 +666,10 @@ public class TradesChartsView extends ActivatableViewAndModel(); - tableView.setMinHeight(80); - tableView.setPrefHeight(130); VBox.setVgrow(tableView, Priority.ALWAYS); // date - TableColumn dateColumn = new AutoTooltipTableColumn<>(Res.get("shared.dateTime")) { + TableColumn dateColumn = new AutoTooltipTableColumn<>(Res.get("shared.dateTime")) { { setMinWidth(240); setMaxWidth(240); @@ -560,21 +698,21 @@ public class TradesChartsView extends ActivatableViewAndModel() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final TradeStatistics3 item, boolean empty) { + public void updateItem(final TradeStatistics3ListItem item, boolean empty) { super.updateItem(item, empty); - if (item != null) - setText(DisplayUtils.formatDateTime(item.getDate())); - else + if (item != null) { + setText(item.getDateString()); + } else setText(""); } }; } }); - dateColumn.setComparator(Comparator.comparing(TradeStatistics3::getDate)); + dateColumn.setComparator(Comparator.comparing(TradeStatistics3ListItem::getDate)); tableView.getColumns().add(dateColumn); // market @@ -589,21 +727,21 @@ public class TradesChartsView extends ActivatableViewAndModel() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final TradeStatistics3 item, boolean empty) { + public void updateItem(final TradeStatistics3ListItem item, boolean empty) { super.updateItem(item, empty); if (item != null) - setText(CurrencyUtil.getCurrencyPair(item.getCurrency())); + setText(item.getMarket()); else setText(""); } }; } }); - marketColumn.setComparator(Comparator.comparing(TradeStatistics3::getDate)); + marketColumn.setComparator(Comparator.comparing(TradeStatistics3ListItem::getDate)); tableView.getColumns().add(marketColumn); // price @@ -613,46 +751,46 @@ public class TradesChartsView extends ActivatableViewAndModel() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final TradeStatistics3 item, boolean empty) { + public void updateItem(final TradeStatistics3ListItem item, boolean empty) { super.updateItem(item, empty); if (item != null) - setText(FormattingUtils.formatPrice(item.getTradePrice())); + setText(item.getPriceString()); else setText(""); } }; } }); - priceColumn.setComparator(Comparator.comparing(TradeStatistics3::getTradePrice)); + priceColumn.setComparator(Comparator.comparing(TradeStatistics3ListItem::getTradePrice)); tableView.getColumns().add(priceColumn); // amount - TableColumn amountColumn = new AutoTooltipTableColumn<>(Res.get("shared.amountWithCur", Res.getBaseCurrencyCode())); + TableColumn amountColumn = new AutoTooltipTableColumn<>(Res.get("shared.amountWithCur", Res.getBaseCurrencyCode())); amountColumn.getStyleClass().add("number-column"); amountColumn.setCellValueFactory((tradeStatistics) -> new ReadOnlyObjectWrapper<>(tradeStatistics.getValue())); amountColumn.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final TradeStatistics3 item, boolean empty) { + public void updateItem(final TradeStatistics3ListItem item, boolean empty) { super.updateItem(item, empty); - if (item != null) - setGraphic(new ColoredDecimalPlacesWithZerosText(formatter.formatCoin(item.getTradeAmount(), - 4), GUIUtil.AMOUNT_DECIMALS_WITH_ZEROS)); - else + if (item != null) { + setGraphic(new ColoredDecimalPlacesWithZerosText(item.getAmountString(), + GUIUtil.AMOUNT_DECIMALS_WITH_ZEROS)); + } else setGraphic(null); } }; } }); - amountColumn.setComparator(Comparator.comparing(TradeStatistics3::getTradeAmount)); + amountColumn.setComparator(Comparator.comparing(TradeStatistics3ListItem::getTradeAmount)); tableView.getColumns().add(amountColumn); // volume @@ -662,16 +800,14 @@ public class TradesChartsView extends ActivatableViewAndModel() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final TradeStatistics3 item, boolean empty) { + public void updateItem(final TradeStatistics3ListItem item, boolean empty) { super.updateItem(item, empty); if (item != null) - setText(model.showAllTradeCurrenciesProperty.get() ? - DisplayUtils.formatVolumeWithCode(item.getTradeVolume()) : - DisplayUtils.formatVolume(item.getTradeVolume())); + setText(item.getVolumeString()); else setText(""); } @@ -686,27 +822,27 @@ public class TradesChartsView extends ActivatableViewAndModel paymentMethodColumn = new AutoTooltipTableColumn<>(Res.get("shared.paymentMethod")); + TableColumn paymentMethodColumn = new AutoTooltipTableColumn<>(Res.get("shared.paymentMethod")); paymentMethodColumn.getStyleClass().add("number-column"); paymentMethodColumn.setCellValueFactory((tradeStatistics) -> new ReadOnlyObjectWrapper<>(tradeStatistics.getValue())); paymentMethodColumn.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final TradeStatistics3 item, boolean empty) { + public void updateItem(final TradeStatistics3ListItem item, boolean empty) { super.updateItem(item, empty); if (item != null) - setText(getPaymentMethodLabel(item)); + setText(item.getPaymentMethodString()); else setText(""); } }; } }); - paymentMethodColumn.setComparator(Comparator.comparing(this::getPaymentMethodLabel)); + paymentMethodColumn.setComparator(Comparator.comparing(TradeStatistics3ListItem::getPaymentMethodString)); tableView.getColumns().add(paymentMethodColumn); tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); @@ -717,24 +853,19 @@ public class TradesChartsView extends ActivatableViewAndModel { double available; - if (root.getParent() instanceof Pane) + if (root.getParent() instanceof Pane) { available = ((Pane) root.getParent()).getHeight(); - else + } else { available = root.getHeight(); + } - available = available - volumeChartPane.getHeight() - toolBox.getHeight() - nrOfTradeStatisticsLabel.getHeight() - 75; - if (priceChart.isManaged()) + available = available - volumeChartPane.getHeight() - toolBox.getHeight() - footer.getHeight() - 60; + if (priceChart.isManaged()) { available = available - priceChartPane.getHeight(); - else - available = available + 10; + } tableView.setPrefHeight(available); }, 100, TimeUnit.MILLISECONDS); } diff --git a/desktop/src/main/java/bisq/desktop/main/market/trades/charts/price/CandleStickChart.java b/desktop/src/main/java/bisq/desktop/main/market/trades/charts/price/CandleStickChart.java index 673f501faa..2403ac4fc7 100644 --- a/desktop/src/main/java/bisq/desktop/main/market/trades/charts/price/CandleStickChart.java +++ b/desktop/src/main/java/bisq/desktop/main/market/trades/charts/price/CandleStickChart.java @@ -130,7 +130,7 @@ public class CandleStickChart extends XYChart { double candleWidth = -1; if (getXAxis() instanceof NumberAxis) { NumberAxis xa = (NumberAxis) getXAxis(); - candleWidth = xa.getDisplayPosition(xa.getTickUnit()) * 0.60; // use 90% width between ticks + candleWidth = xa.getDisplayPosition(1) * 0.60; // use 60% width between units } // update candle candle.update(close - y, high - y, low - y, candleWidth); diff --git a/desktop/src/main/java/bisq/desktop/main/market/trades/charts/volume/VolumeChart.java b/desktop/src/main/java/bisq/desktop/main/market/trades/charts/volume/VolumeChart.java index 12e61790b0..d5a0f456da 100644 --- a/desktop/src/main/java/bisq/desktop/main/market/trades/charts/volume/VolumeChart.java +++ b/desktop/src/main/java/bisq/desktop/main/market/trades/charts/volume/VolumeChart.java @@ -65,7 +65,7 @@ public class VolumeChart extends XYChart { double candleWidth = -1; if (getXAxis() instanceof NumberAxis) { NumberAxis xa = (NumberAxis) getXAxis(); - candleWidth = xa.getDisplayPosition(xa.getTickUnit()) * 0.60; // use 90% width between ticks + candleWidth = xa.getDisplayPosition(1) * 0.60; // use 60% width between units } // 97 is visible chart data height if chart height is 140. diff --git a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java index 91506f00a1..01c0bffbe9 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java @@ -129,13 +129,13 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs protected double marketPriceMargin = 0; private Coin txFeeFromFeeService = Coin.ZERO; private boolean marketPriceAvailable; - private int feeTxSize = TxFeeEstimationService.TYPICAL_TX_WITH_1_INPUT_SIZE; + private int feeTxVsize = TxFeeEstimationService.TYPICAL_TX_WITH_1_INPUT_VSIZE; protected boolean allowAmountUpdate = true; private final TradeStatisticsManager tradeStatisticsManager; - private final Predicate> isPositiveAmount = (c) -> c.get() != null && !c.get().isZero(); - private final Predicate> isPositivePrice = (p) -> p.get() != null && !p.get().isZero(); - private final Predicate> isPositiveVolume = (v) -> v.get() != null && !v.get().isZero(); + private final Predicate> isNonZeroAmount = (c) -> c.get() != null && !c.get().isZero(); + private final Predicate> isNonZeroPrice = (p) -> p.get() != null && !p.get().isZero(); + private final Predicate> isNonZeroVolume = (v) -> v.get() != null && !v.get().isZero(); /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, lifecycle @@ -262,7 +262,7 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs // Set the default values (in rare cases if the fee request was not done yet we get the hard coded default values) // But offer creation happens usually after that so we should have already the value from the estimation service. - txFeeFromFeeService = feeService.getTxFee(feeTxSize); + txFeeFromFeeService = feeService.getTxFee(feeTxVsize); calculateVolume(); calculateTotalToPay(); @@ -286,7 +286,7 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs // UI actions /////////////////////////////////////////////////////////////////////////////////////////// - Offer createAndGetOffer() { + protected Offer createAndGetOffer() { return createOfferService.createAndGetOffer(offerId, direction, tradeCurrencyCode.get(), @@ -301,13 +301,13 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs } // This works only if we have already funds in the wallet - public void updateEstimatedFeeAndTxSize() { - Tuple2 estimatedFeeAndTxSize = createOfferService.getEstimatedFeeAndTxSize(amount.get(), + public void updateEstimatedFeeAndTxVsize() { + Tuple2 estimatedFeeAndTxVsize = createOfferService.getEstimatedFeeAndTxVsize(amount.get(), direction, buyerSecurityDeposit.get(), createOfferService.getSellerSecurityDepositAsDouble(buyerSecurityDeposit.get())); - txFeeFromFeeService = estimatedFeeAndTxSize.first; - feeTxSize = estimatedFeeAndTxSize.second; + txFeeFromFeeService = estimatedFeeAndTxVsize.first; + feeTxVsize = estimatedFeeAndTxVsize.second; } void onPlaceOffer(Offer offer, TransactionResultHandler resultHandler) { @@ -439,7 +439,7 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs void requestTxFee(@Nullable Runnable actionHandler) { feeService.requestFees(() -> { - txFeeFromFeeService = feeService.getTxFee(feeTxSize); + txFeeFromFeeService = feeService.getTxFee(feeTxVsize); calculateTotalToPay(); if (actionHandler != null) actionHandler.run(); @@ -517,7 +517,7 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs } void calculateVolume() { - if (isPositivePrice.test(price) && isPositiveAmount.test(amount)) { + if (isNonZeroPrice.test(price) && isNonZeroAmount.test(amount)) { try { Volume volumeByAmount = calculateVolumeForAmount(amount); @@ -533,7 +533,7 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs } void calculateMinVolume() { - if (isPositivePrice.test(price) && isPositiveAmount.test(minAmount)) { + if (isNonZeroPrice.test(price) && isNonZeroAmount.test(minAmount)) { try { Volume volumeByAmount = calculateVolumeForAmount(minAmount); @@ -557,7 +557,7 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs } void calculateAmount() { - if (isPositivePrice.test(price) && isPositiveVolume.test(volume) && allowAmountUpdate) { + if (isNonZeroPrice.test(price) && isNonZeroVolume.test(volume) && allowAmountUpdate) { try { Coin value = DisplayUtils.reduceTo4Decimals(price.get().getAmountByVolume(volume.get()), btcFormatter); if (paymentAccount.isHalCashAccount()) diff --git a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java b/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java index 36718c7ba8..83bd3d9f74 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java @@ -688,7 +688,7 @@ public abstract class MutableOfferViewModel ext } void onShowPayFundsScreen(Runnable actionHandler) { - dataModel.updateEstimatedFeeAndTxSize(); + dataModel.updateEstimatedFeeAndTxVsize(); dataModel.requestTxFee(actionHandler); showPayFundsScreenDisplayed.set(true); updateSpinnerInfo(); diff --git a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookView.java b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookView.java index c913c8e977..a753a8bfd8 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookView.java @@ -376,7 +376,7 @@ public class OfferBookView extends ActivatableViewAndModel { if (!freezeFee) { - txFeePerByteFromFeeService = feeService.getTxFeePerByte(); - txFeeFromFeeService = getTxFeeBySize(feeTxSize); + txFeePerVbyteFromFeeService = feeService.getTxFeePerVbyte(); + txFeeFromFeeService = getTxFeeByVsize(feeTxVsize); calculateTotalToPay(); log.info("Completed requestTxFee: txFeeFromFeeService={}", txFeeFromFeeService); } else { @@ -257,7 +257,7 @@ class TakeOfferDataModel extends OfferDataModel { // We don't want that the fee gets updated anymore after we show the funding screen. void onShowPayFundsScreen() { - estimateTxSize(); + estimateTxVsize(); freezeFee = true; calculateTotalToPay(); } @@ -338,8 +338,8 @@ class TakeOfferDataModel extends OfferDataModel { // leading to a smaller tx and too high fees. Simply updating the fee estimation would lead to changed required funds // and if funds get higher (if tx get larger) the user would get confused (adding small inputs would increase total required funds). // So that would require more thoughts how to deal with all those cases. - public void estimateTxSize() { - int txSize = 0; + public void estimateTxVsize() { + int txVsize = 0; if (btcWalletService.getBalance(Wallet.BalanceType.AVAILABLE).isPositive()) { Coin fundsNeededForTrade = getFundsNeededForTrade(); if (isBuyOffer()) @@ -347,28 +347,28 @@ class TakeOfferDataModel extends OfferDataModel { // As taker we pay 3 times the fee and currently the fee is the same for all 3 txs (trade fee tx, deposit // tx and payout tx). - // We should try to change that in future to have the deposit and payout tx with a fixed fee as the size is + // We should try to change that in future to have the deposit and payout tx with a fixed fee as the vsize is // there more deterministic. // The trade fee tx can be in the worst case very large if there are many inputs so if we take that tx alone // for the fee estimation we would overpay a lot. - // On the other side if we have the best case of a 1 input tx fee tx then it is only 260 bytes but the - // other 2 txs are larger (320 and 380 bytes) and would get a lower fee/byte as intended. + // On the other side if we have the best case of a 1 input tx fee tx then it is only 175 vbytes but the + // other 2 txs are different (233 and 169 vbytes) and may get a lower fee/vbyte as intended. // We apply following model to not overpay too much but be on the safe side as well. // We sum the taker fee tx and the deposit tx together as it can be assumed that both be in the same block and // as they are dependent txs the miner will pick both if the fee in total is good enough. - // We make sure that the fee is sufficient to meet our intended fee/byte for the larger payout tx with 380 bytes. - Tuple2 estimatedFeeAndTxSize = txFeeEstimationService.getEstimatedFeeAndTxSizeForTaker(fundsNeededForTrade, + // We make sure that the fee is sufficient to meet our intended fee/vbyte for the larger deposit tx with 233 vbytes. + Tuple2 estimatedFeeAndTxVsize = txFeeEstimationService.getEstimatedFeeAndTxVsizeForTaker(fundsNeededForTrade, getTakerFee()); - txFeeFromFeeService = estimatedFeeAndTxSize.first; - feeTxSize = estimatedFeeAndTxSize.second; + txFeeFromFeeService = estimatedFeeAndTxVsize.first; + feeTxVsize = estimatedFeeAndTxVsize.second; } else { - feeTxSize = 380; - txFeeFromFeeService = txFeePerByteFromFeeService.multiply(feeTxSize); + feeTxVsize = 233; + txFeeFromFeeService = txFeePerVbyteFromFeeService.multiply(feeTxVsize); log.info("We cannot do the fee estimation because there are no funds in the wallet.\nThis is expected " + "if the user has not funded their wallet yet.\n" + - "In that case we use an estimated tx size of 380 bytes.\n" + - "txFee based on estimated size of {} bytes. feeTxSize = {} bytes. Actual tx size = {} bytes. TxFee is {} ({} sat/byte)", - feeTxSize, feeTxSize, txSize, txFeeFromFeeService.toFriendlyString(), feeService.getTxFeePerByte()); + "In that case we use an estimated tx vsize of 233 vbytes.\n" + + "txFee based on estimated vsize of {} vbytes. feeTxVsize = {} vbytes. Actual tx vsize = {} vbytes. TxFee is {} ({} sat/vbyte)", + feeTxVsize, feeTxVsize, txVsize, txFeeFromFeeService.toFriendlyString(), feeService.getTxFeePerVbyte()); } } @@ -526,16 +526,16 @@ class TakeOfferDataModel extends OfferDataModel { btcWalletService.resetAddressEntriesForOpenOffer(offer.getId()); } - // We use the sum of the size of the trade fee and the deposit tx to get an average. + // We use the sum of the vsize of the trade fee and the deposit tx to get an average. // Miners will take the trade fee tx if the total fee of both dependent txs are good enough. // With that we avoid that we overpay in case that the trade fee has many inputs and we would apply that fee for the // other 2 txs as well. We still might overpay a bit for the payout tx. - private int getAverageSize(int txSize) { - return (txSize + 320) / 2; + private int getAverageVsize(int txVsize) { + return (txVsize + 233) / 2; } - private Coin getTxFeeBySize(int sizeInBytes) { - return txFeePerByteFromFeeService.multiply(getAverageSize(sizeInBytes)); + private Coin getTxFeeByVsize(int vsizeInVbytes) { + return txFeePerVbyteFromFeeService.multiply(getAverageVsize(vsizeInVbytes)); } /* private void setFeeFromFundingTx(Coin fee) { @@ -606,7 +606,7 @@ class TakeOfferDataModel extends OfferDataModel { // Unfortunately we cannot change that to the correct fees as it would break backward compatibility // We still might find a way with offer version or app version checks so lets keep that commented out // code as that shows how it should be. - return txFeeFromFeeService; //feeService.getTxFee(320); + return txFeeFromFeeService; //feeService.getTxFee(233); } private Coin getTxFeeForPayoutTx() { @@ -614,7 +614,7 @@ class TakeOfferDataModel extends OfferDataModel { // Unfortunately we cannot change that to the correct fees as it would break backward compatibility // We still might find a way with offer version or app version checks so lets keep that commented out // code as that shows how it should be. - return txFeeFromFeeService; //feeService.getTxFee(380); + return txFeeFromFeeService; //feeService.getTxFee(169); } public AddressEntry getAddressEntry() { diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/DisputeSummaryWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/DisputeSummaryWindow.java index b3231a4155..48296fcc0c 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/DisputeSummaryWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/DisputeSummaryWindow.java @@ -672,11 +672,11 @@ public class DisputeSummaryWindow extends Overlay { Coin sellerPayoutAmount = disputeResult.getSellerPayoutAmount(); String sellerPayoutAddressString = contract.getSellerPayoutAddressString(); Coin outputAmount = buyerPayoutAmount.add(sellerPayoutAmount); - Tuple2 feeTuple = txFeeEstimationService.getEstimatedFeeAndTxSize(outputAmount, feeService, btcWalletService); + Tuple2 feeTuple = txFeeEstimationService.getEstimatedFeeAndTxVsize(outputAmount, feeService, btcWalletService); Coin fee = feeTuple.first; - Integer txSize = feeTuple.second; - double feePerByte = CoinUtil.getFeePerByte(fee, txSize); - double kb = txSize / 1000d; + Integer txVsize = feeTuple.second; + double feePerVbyte = CoinUtil.getFeePerVbyte(fee, txVsize); + double vkb = txVsize / 1000d; Coin inputAmount = outputAmount.add(fee); String buyerDetails = ""; if (buyerPayoutAmount.isPositive()) { @@ -698,8 +698,8 @@ public class DisputeSummaryWindow extends Overlay { buyerDetails, sellerDetails, formatter.formatCoinWithCode(fee), - feePerByte, - kb)) + feePerVbyte, + vkb)) .actionButtonText(Res.get("shared.yes")) .onAction(() -> { doPayout(buyerPayoutAmount, @@ -788,6 +788,7 @@ public class DisputeSummaryWindow extends Overlay { } } catch (TradeDataValidation.DisputeReplayException exception) { if (disputeManager instanceof MediationManager) { + log.error("Closing of ticket failed as mediator", exception); new Popup().width(900) .warning(exception.getMessage()) .onAction(() -> { @@ -797,6 +798,7 @@ public class DisputeSummaryWindow extends Overlay { .closeButtonText(Res.get("shared.no")) .show(); } else { + log.error("Closing of ticket failed", exception); new Popup().width(900) .warning(exception.getMessage()) .show(); diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/EditCustomExplorerWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/EditCustomExplorerWindow.java new file mode 100644 index 0000000000..44a5336154 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/EditCustomExplorerWindow.java @@ -0,0 +1,199 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.overlays.windows; + +import bisq.desktop.components.AutoTooltipButton; +import bisq.desktop.components.AutoTooltipLabel; +import bisq.desktop.components.InputTextField; +import bisq.desktop.main.overlays.Overlay; +import bisq.desktop.util.Layout; +import bisq.desktop.util.validation.LengthValidator; + +import bisq.core.locale.Res; +import bisq.core.util.validation.UrlInputValidator; + +import bisq.common.util.Tuple2; + +import bisq.core.user.BlockChainExplorer; + +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; + +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.geometry.VPos; + +import javafx.event.EventHandler; + +import javafx.collections.FXCollections; + +import javafx.util.Callback; + +import java.util.ArrayList; + +import static bisq.desktop.util.FormBuilder.*; +import static javafx.beans.binding.Bindings.createBooleanBinding; + +public class EditCustomExplorerWindow extends Overlay { + + private InputTextField nameInputTextField, txUrlInputTextField, addressUrlInputTextField; + private UrlInputValidator urlInputValidator; + private BlockChainExplorer currentExplorer; + private ListView listView; + + public EditCustomExplorerWindow(String coin, + BlockChainExplorer currentExplorer, + ArrayList availableExplorers) { + this.currentExplorer = currentExplorer; + listView = new ListView<>(); + listView.setItems(FXCollections.observableArrayList(availableExplorers)); + headLine = coin + " " + Res.get("settings.preferences.editCustomExplorer.headline"); + } + + public BlockChainExplorer getEditedBlockChainExplorer() { + return new BlockChainExplorer(nameInputTextField.getText(), + txUrlInputTextField.getText(), addressUrlInputTextField.getText()); + } + + public void show() { + + width = 1000; + createGridPane(); + addHeadLine(); + addContent(); + addButtons(); + + urlInputValidator = new UrlInputValidator(); + txUrlInputTextField.setValidator(urlInputValidator); + addressUrlInputTextField.setValidator(urlInputValidator); + nameInputTextField.setValidator(new LengthValidator(1, 50)); + + actionButton.disableProperty().bind(createBooleanBinding(() -> { + String name = nameInputTextField.getText(); + String txUrl = txUrlInputTextField.getText(); + String addressUrl = addressUrlInputTextField.getText(); + + // Otherwise we require that input is valid + return !nameInputTextField.getValidator().validate(name).isValid || + !txUrlInputTextField.getValidator().validate(txUrl).isValid || + !addressUrlInputTextField.getValidator().validate(addressUrl).isValid; + }, + nameInputTextField.textProperty(), txUrlInputTextField.textProperty(), addressUrlInputTextField.textProperty())); + + applyStyles(); + display(); + } + + @Override + protected void createGridPane() { + gridPane = new GridPane(); + gridPane.setHgap(15); + gridPane.setVgap(15); + gridPane.setPadding(new Insets(64, 64, 64, 64)); + gridPane.setPrefWidth(width); + ColumnConstraints columnConstraints1 = new ColumnConstraints(); + ColumnConstraints columnConstraints2 = new ColumnConstraints(); + columnConstraints1.setPercentWidth(45); + columnConstraints2.setPercentWidth(55); + gridPane.getColumnConstraints().addAll(columnConstraints1, columnConstraints2); + } + + private void addContent() { + Label mlm = addMultilineLabel(gridPane, rowIndex++, Res.get("settings.preferences.editCustomExplorer.description"), 0); + GridPane.setColumnSpan(mlm, 2); + GridPane.setMargin(mlm, new Insets(40, 0, 0, 0)); + + Button button = new AutoTooltipButton(">>"); + button.setOnAction(e -> { + BlockChainExplorer blockChainExplorer = listView.getSelectionModel().getSelectedItem(); + if (blockChainExplorer != null) { + nameInputTextField.setText(blockChainExplorer.name); + txUrlInputTextField.setText(blockChainExplorer.txUrl); + addressUrlInputTextField.setText(blockChainExplorer.addressUrl); + } + }); + button.setStyle("-fx-pref-width: 50px; -fx-pref-height: 30; -fx-padding: 3 3 3 3;"); + VBox vBox = new VBox(button); + vBox.setAlignment(Pos.CENTER); + final Tuple2 topLabelWithVBox = getTopLabelWithVBox(Res.get("settings.preferences.editCustomExplorer.available"), listView); + listView.setPrefWidth(300); + HBox hBox = new HBox(topLabelWithVBox.second, vBox); + hBox.setAlignment(Pos.CENTER_LEFT); + hBox.setSpacing(20); + hBox.setMaxHeight(200); + gridPane.add(hBox, 0, rowIndex); + GridPane.setColumnIndex(hBox, 0); + GridPane.setValignment(hBox, VPos.TOP); + GridPane.setMargin(hBox, new Insets(10, 0, 0, 0)); + + listView.setCellFactory(new Callback<>() { + @Override + public ListCell call(ListView list) { + ListCell cell = new ListCell<>() { + final Label label = new AutoTooltipLabel(); + final AnchorPane pane = new AnchorPane(label); + @Override + public void updateItem(final BlockChainExplorer item, boolean empty) { + super.updateItem(item, empty); + if (item != null && !empty) { + label.setText(item.name); + setGraphic(pane); + } else { + setGraphic(null); + } + } + }; + + cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (event.getClickCount() == 2) { + BlockChainExplorer blockChainExplorer = listView.getSelectionModel().getSelectedItem(); + nameInputTextField.setText(blockChainExplorer.name); + txUrlInputTextField.setText(blockChainExplorer.txUrl); + addressUrlInputTextField.setText(blockChainExplorer.addressUrl); + } + } + }); + return cell; + } + }); + + GridPane autoConfirmGridPane = new GridPane(); + autoConfirmGridPane.setPrefHeight(150); + GridPane.setMargin(autoConfirmGridPane, new Insets(10, 0, 0, 0)); + gridPane.add(autoConfirmGridPane, 1, rowIndex); + addTitledGroupBg(autoConfirmGridPane, 0, 6, Res.get("settings.preferences.editCustomExplorer.chosen"), 0); + int localRowIndex = 0; + nameInputTextField = addInputTextField(autoConfirmGridPane, ++localRowIndex, Res.get("settings.preferences.editCustomExplorer.name"), Layout.FIRST_ROW_DISTANCE); + nameInputTextField.setPrefWidth(Layout.INITIAL_WINDOW_WIDTH); + txUrlInputTextField = addInputTextField(autoConfirmGridPane, ++localRowIndex, Res.get("settings.preferences.editCustomExplorer.txUrl")); + addressUrlInputTextField = addInputTextField(autoConfirmGridPane, ++localRowIndex, Res.get("settings.preferences.editCustomExplorer.addressUrl")); + nameInputTextField.setText(currentExplorer.name); + txUrlInputTextField.setText(currentExplorer.txUrl); + addressUrlInputTextField.setText(currentExplorer.addressUrl); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java index 74748a0d82..167c4e6bd9 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java @@ -27,6 +27,7 @@ import bisq.core.filter.FilterManager; import bisq.core.filter.PaymentAccountFilter; import bisq.core.locale.Res; +import bisq.common.UserThread; import bisq.common.app.DevEnv; import bisq.common.config.Config; @@ -161,6 +162,8 @@ public class FilterWindow extends Overlay { Res.get("filterWindow.disableTradeBelowVersion")); InputTextField bannedPrivilegedDevPubKeysTF = addTopLabelInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.bannedPrivilegedDevPubKeys")).second; + InputTextField autoConfExplorersTF = addTopLabelInputTextField(gridPane, ++rowIndex, + Res.get("filterWindow.autoConfExplorers")).second; Filter filter = filterManager.getDevFilter(); if (filter != null) { @@ -178,6 +181,7 @@ public class FilterWindow extends Overlay { setupFieldFromList(priceRelayNodesTF, filter.getPriceRelayNodes()); setupFieldFromList(btcNodesTF, filter.getBtcNodes()); setupFieldFromList(bannedPrivilegedDevPubKeysTF, filter.getBannedPrivilegedDevPubKeys()); + setupFieldFromList(autoConfExplorersTF, filter.getBannedAutoConfExplorers()); preventPublicBtcNetworkCheckBox.setSelected(filter.isPreventPublicBtcNetwork()); disableDaoCheckBox.setSelected(filter.isDisableDao()); @@ -215,16 +219,21 @@ public class FilterWindow extends Overlay { filterManager.getOwnerPubKey(), signerPubKeyAsHex, readAsList(bannedPrivilegedDevPubKeysTF), - disableAutoConfCheckBox.isSelected() + disableAutoConfCheckBox.isSelected(), + readAsList(autoConfExplorersTF) ); // We remove first the old filter + // We delay a bit with adding as it seems that the instant add/remove calls lead to issues that the + // remove msg was rejected (P2P storage should handle it but seems there are edge cases where its not + // working as expected) if (filterManager.canRemoveDevFilter(privKeyString)) { filterManager.removeDevFilter(privKeyString); + UserThread.runAfter(() -> addDevFilter(removeFilterMessageButton, privKeyString, newFilter), + 5); + } else { + addDevFilter(removeFilterMessageButton, privKeyString, newFilter); } - filterManager.addDevFilter(newFilter, privKeyString); - removeFilterMessageButton.setDisable(filterManager.getDevFilter() == null); - hide(); } else { new Popup().warning(Res.get("shared.invalidKey")).onClose(this::blurAgain).show(); } @@ -254,6 +263,12 @@ public class FilterWindow extends Overlay { GridPane.setMargin(hBox, new Insets(10, 0, 0, 0)); } + private void addDevFilter(Button removeFilterMessageButton, String privKeyString, Filter newFilter) { + filterManager.addDevFilter(newFilter, privKeyString); + removeFilterMessageButton.setDisable(filterManager.getDevFilter() == null); + hide(); + } + private void setupFieldFromList(InputTextField field, List values) { if (values != null) field.setText(String.join(", ", values)); diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/ManualPayoutTxWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/ManualPayoutTxWindow.java index 6b89048980..609c526fde 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/ManualPayoutTxWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/ManualPayoutTxWindow.java @@ -40,6 +40,7 @@ import org.bitcoinj.core.Transaction; import javax.inject.Inject; import javafx.scene.Scene; +import javafx.scene.control.CheckBox; import javafx.scene.input.KeyCode; import org.slf4j.Logger; @@ -47,6 +48,7 @@ import org.slf4j.LoggerFactory; import javax.annotation.Nullable; +import static bisq.desktop.util.FormBuilder.addCheckBox; import static bisq.desktop.util.FormBuilder.addInputTextField; // We don't translate here as it is for dev only purpose @@ -116,6 +118,8 @@ public class ManualPayoutTxWindow extends Overlay { InputTextField buyerPubKeyAsHex = addInputTextField(gridPane, ++rowIndex, "buyerPubKeyAsHex"); InputTextField sellerPubKeyAsHex = addInputTextField(gridPane, ++rowIndex, "sellerPubKeyAsHex"); + CheckBox depositTxLegacy = addCheckBox(gridPane, ++rowIndex, "depositTxLegacy"); + // Notes: // Open with alt+g // Priv key is only visible if pw protection is removed (wallet details data (alt+j)) @@ -136,6 +140,9 @@ public class ManualPayoutTxWindow extends Overlay { sellerPubKeyAsHex.setText(""); sellerPrivateKeyAsHex.setText(""); + depositTxLegacy.setAllowIndeterminate(false); + depositTxLegacy.setSelected(false); + actionButtonText("Sign and publish transaction"); TxBroadcaster.Callback callback = new TxBroadcaster.Callback() { @@ -167,6 +174,7 @@ public class ManualPayoutTxWindow extends Overlay { sellerPrivateKeyAsHex.getText(), buyerPubKeyAsHex.getText(), sellerPubKeyAsHex.getText(), + depositTxLegacy.isSelected(), callback); } catch (AddressFormatException | WalletException | TransactionVerificationException e) { log.error(e.toString()); diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModel.java index 8956e028f5..6524e311d1 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModel.java @@ -179,28 +179,32 @@ class EditOfferDataModel extends MutableOfferDataModel { } public void onPublishOffer(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + // editedPayload is a merge of the original offerPayload and newOfferPayload + // fields which are editable are merged in from newOfferPayload (such as payment account details) + // fields which cannot change (most importantly BTC amount) are sourced from the original offerPayload final OfferPayload offerPayload = openOffer.getOffer().getOfferPayload(); + final OfferPayload newOfferPayload = createAndGetOffer().getOfferPayload(); final OfferPayload editedPayload = new OfferPayload(offerPayload.getId(), offerPayload.getDate(), offerPayload.getOwnerNodeAddress(), offerPayload.getPubKeyRing(), offerPayload.getDirection(), - getPrice().get().getValue(), - getMarketPriceMargin(), - isUseMarketBasedPriceValue(), - getAmount().get().getValue(), - getMinAmount().get().getValue(), - offerPayload.getBaseCurrencyCode(), - offerPayload.getCounterCurrencyCode(), + newOfferPayload.getPrice(), + newOfferPayload.getMarketPriceMargin(), + newOfferPayload.isUseMarketBasedPrice(), + offerPayload.getAmount(), + offerPayload.getMinAmount(), + newOfferPayload.getBaseCurrencyCode(), + newOfferPayload.getCounterCurrencyCode(), offerPayload.getArbitratorNodeAddresses(), offerPayload.getMediatorNodeAddresses(), - offerPayload.getPaymentMethodId(), - offerPayload.getMakerPaymentAccountId(), + newOfferPayload.getPaymentMethodId(), + newOfferPayload.getMakerPaymentAccountId(), offerPayload.getOfferFeePaymentTxId(), - offerPayload.getCountryCode(), - offerPayload.getAcceptedCountryCodes(), - offerPayload.getBankId(), - offerPayload.getAcceptedBankIds(), + newOfferPayload.getCountryCode(), + newOfferPayload.getAcceptedCountryCodes(), + newOfferPayload.getBankId(), + newOfferPayload.getAcceptedBankIds(), offerPayload.getVersionNr(), offerPayload.getBlockHeightAtOfferCreation(), offerPayload.getTxFee(), diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java index e769b6fab1..c78b180de6 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java @@ -119,7 +119,6 @@ public class EditOfferView extends MutableOfferView { // To force re-validation of payment account validation onPaymentAccountsComboBoxSelected(); - hidePaymentGroup(); } @Override diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesDataModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesDataModel.java index fa000d8e6f..59f33ef27c 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesDataModel.java @@ -35,6 +35,7 @@ import bisq.core.dao.DaoFacade; import bisq.core.locale.Res; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.support.SupportType; import bisq.core.support.dispute.Dispute; @@ -107,6 +108,7 @@ public class PendingTradesDataModel extends ActivatableDataModel { public final Navigation navigation; public final WalletPasswordWindow walletPasswordWindow; private final NotificationCenter notificationCenter; + private final OfferUtil offerUtil; final ObservableList list = FXCollections.observableArrayList(); private final ListChangeListener tradesListChangeListener; @@ -142,7 +144,8 @@ public class PendingTradesDataModel extends ActivatableDataModel { DaoFacade daoFacade, Navigation navigation, WalletPasswordWindow walletPasswordWindow, - NotificationCenter notificationCenter) { + NotificationCenter notificationCenter, + OfferUtil offerUtil) { this.tradeManager = tradeManager; this.btcWalletService = btcWalletService; this.pubKeyRing = pubKeyRing; @@ -157,6 +160,7 @@ public class PendingTradesDataModel extends ActivatableDataModel { this.navigation = navigation; this.walletPasswordWindow = walletPasswordWindow; this.notificationCenter = notificationCenter; + this.offerUtil = offerUtil; tradesListChangeListener = change -> onListChanged(); notificationCenter.setSelectItemByTradeIdConsumer(this::selectItemByTradeId); @@ -253,7 +257,7 @@ public class PendingTradesDataModel extends ActivatableDataModel { } private boolean isBuyOffer() { - return getOffer() != null && getOffer().getDirection() == OfferPayload.Direction.BUY; + return getOffer() != null && offerUtil.isBuyOffer(getOffer().getDirection()); } boolean isBuyer() { @@ -348,11 +352,6 @@ public class PendingTradesDataModel extends ActivatableDataModel { } } - public String getCurrencyCode() { - return getOffer() != null ? getOffer().getCurrencyCode() : ""; - } - - @Nullable public PaymentAccountPayload getSellersPaymentAccountPayload() { if (getTrade() != null && getTrade().getContract() != null) @@ -555,26 +554,8 @@ public class PendingTradesDataModel extends ActivatableDataModel { } trade.setDisputeState(Trade.DisputeState.MEDIATION_REQUESTED); - disputeManager.sendOpenNewDisputeMessage(dispute, - false, - resultHandler, - (errorMessage, throwable) -> { - if ((throwable instanceof DisputeAlreadyOpenException)) { - errorMessage += "\n\n" + Res.get("portfolio.pending.openAgainDispute.msg"); - new Popup().warning(errorMessage) - .actionButtonText(Res.get("portfolio.pending.openAgainDispute.button")) - .onAction(() -> disputeManager.sendOpenNewDisputeMessage(dispute, - true, - resultHandler, - (e, t) -> { - log.error(e); - })) - .closeButtonText(Res.get("shared.cancel")) - .show(); - } else { - new Popup().warning(errorMessage).show(); - } - }); + sendOpenDisputeMessage(disputeManager, resultHandler, dispute); + tradeManager.requestPersistence(); } else if (useRefundAgent) { resultHandler = () -> navigation.navigateTo(MainView.class, SupportView.class, RefundClientView.class); @@ -643,36 +624,13 @@ public class PendingTradesDataModel extends ActivatableDataModel { dispute.setDonationAddressOfDelayedPayoutTx(donationAddressString.get()); dispute.setDelayedPayoutTxId(delayedPayoutTx.getTxId().toString()); - trade.setDisputeState(Trade.DisputeState.REFUND_REQUESTED); ((DisputeProtocol) tradeManager.getTradeProtocol(trade)).onPublishDelayedPayoutTx(() -> { log.info("DelayedPayoutTx published and message sent to peer"); - disputeManager.sendOpenNewDisputeMessage(dispute, - false, - resultHandler, - (errorMessage, throwable) -> { - if ((throwable instanceof DisputeAlreadyOpenException)) { - errorMessage += "\n\n" + Res.get("portfolio.pending.openAgainDispute.msg"); - new Popup().warning(errorMessage) - .actionButtonText(Res.get("portfolio.pending.openAgainDispute.button")) - .onAction(() -> disputeManager.sendOpenNewDisputeMessage(dispute, - true, - resultHandler, - (e, t) -> { - log.error(e); - })) - .closeButtonText(Res.get("shared.cancel")) - .show(); - } else { - new Popup().warning(errorMessage).show(); - } - }); + sendOpenDisputeMessage(disputeManager, resultHandler, dispute); }, - errorMessage -> { - new Popup().error(errorMessage).show(); - }); - + errorMessage -> new Popup().error(errorMessage).show()); } else { log.warn("Invalid dispute state {}", disputeState.name()); } @@ -694,5 +652,28 @@ public class PendingTradesDataModel extends ActivatableDataModel { public boolean isSignWitnessTrade() { return accountAgeWitnessService.isSignWitnessTrade(selectedTrade); } + + private void sendOpenDisputeMessage(DisputeManager> disputeManager, + ResultHandler resultHandler, + Dispute dispute) { + disputeManager.sendOpenNewDisputeMessage(dispute, + false, + resultHandler, + (errorMessage, throwable) -> { + if ((throwable instanceof DisputeAlreadyOpenException)) { + errorMessage += "\n\n" + Res.get("portfolio.pending.openAgainDispute.msg"); + new Popup().warning(errorMessage) + .actionButtonText(Res.get("portfolio.pending.openAgainDispute.button")) + .onAction(() -> disputeManager.sendOpenNewDisputeMessage(dispute, + true, + resultHandler, + (e, t) -> log.error(e))) + .closeButtonText(Res.get("shared.cancel")) + .show(); + } else { + new Popup().warning(errorMessage).show(); + } + }); + } } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java index a72ab7ab77..0e5fc23a07 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java @@ -471,6 +471,7 @@ public class PendingTradesView extends ActivatableViewAndModel { @@ -595,6 +609,12 @@ public class BuyerStep2View extends TradeStepView { assign + refTextWarn + "\n\n" + fees; + } else if (paymentAccountPayload instanceof AmazonGiftCardAccountPayload) { + message += Res.get("portfolio.pending.step2_buyer.amazonGiftCard", + amount) + + accountDetails + + paymentDetailsForTradePopup + ".\n\n" + + copyPaste; } else { message += Res.get("portfolio.pending.step2_buyer.bank", amount) + accountDetails + @@ -605,6 +625,7 @@ public class BuyerStep2View extends TradeStepView { refTextWarn + "\n\n" + fees; } + String key = "startPayment" + trade.getId(); if (!DevEnv.isDevMode() && DontShowAgainLookup.showAgain(key)) { DontShowAgainLookup.dontShowAgain(key, true); diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java index 55378fd567..a8a1bf026e 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java @@ -205,9 +205,9 @@ public class BuyerStep4View extends TradeStepView { validateWithdrawAddress(); } else if (Restrictions.isAboveDust(receiverAmount)) { CoinFormatter formatter = model.btcFormatter; - int txSize = feeEstimationTransaction.bitcoinSerialize().length; - double feePerByte = CoinUtil.getFeePerByte(fee, txSize); - double kb = txSize / 1000d; + int txVsize = feeEstimationTransaction.getVsize(); + double feePerVbyte = CoinUtil.getFeePerVbyte(fee, txVsize); + double vkb = txVsize / 1000d; String recAmount = formatter.formatCoinWithCode(receiverAmount); new Popup().headLine(Res.get("portfolio.pending.step5_buyer.confirmWithdrawal")) .confirmation(Res.get("shared.sendFundsDetailsWithFee", @@ -215,8 +215,8 @@ public class BuyerStep4View extends TradeStepView { fromAddresses, toAddresses, formatter.formatCoinWithCode(fee), - feePerByte, - kb, + feePerVbyte, + vkb, recAmount)) .actionButtonText(Res.get("shared.yes")) .onAction(() -> doWithdrawal(amount, fee)) diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java index 116e18bf4e..bcae7915db 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java @@ -32,6 +32,7 @@ import bisq.desktop.util.Layout; import bisq.core.locale.Res; import bisq.core.payment.PaymentAccount; import bisq.core.payment.PaymentAccountUtil; +import bisq.core.payment.payload.AmazonGiftCardAccountPayload; import bisq.core.payment.payload.AssetsAccountPayload; import bisq.core.payment.payload.BankAccountPayload; import bisq.core.payment.payload.CashDepositAccountPayload; @@ -378,6 +379,7 @@ public class SellerStep3View extends TradeStepView { message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.name", optionalHolderName.get()); } } + message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.note"); if (model.dataModel.isSignWitnessTrade()) { message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.signer"); @@ -415,7 +417,8 @@ public class SellerStep3View extends TradeStepView { message = Res.get("portfolio.pending.step3_seller.postal", part1, tradeVolumeWithCode, id); } else if (!(paymentAccountPayload instanceof WesternUnionAccountPayload) && !(paymentAccountPayload instanceof HalCashAccountPayload) && - !(paymentAccountPayload instanceof F2FAccountPayload)) { + !(paymentAccountPayload instanceof F2FAccountPayload) && + !(paymentAccountPayload instanceof AmazonGiftCardAccountPayload)) { message = Res.get("portfolio.pending.step3_seller.bank", currencyName, tradeVolumeWithCode, id); } @@ -430,6 +433,8 @@ public class SellerStep3View extends TradeStepView { message = message + Res.get("portfolio.pending.step3_seller.halCash"); else if (paymentAccountPayload instanceof F2FAccountPayload) message = part1; + else if (paymentAccountPayload instanceof AmazonGiftCardAccountPayload) + message = Res.get("portfolio.pending.step3_seller.amazonGiftCard"); Optional optionalHolderName = getOptionalHolderName(); if (optionalHolderName.isPresent()) { diff --git a/desktop/src/main/java/bisq/desktop/main/settings/network/NetworkSettingsView.fxml b/desktop/src/main/java/bisq/desktop/main/settings/network/NetworkSettingsView.fxml index 5b966f0973..eae359dec2 100644 --- a/desktop/src/main/java/bisq/desktop/main/settings/network/NetworkSettingsView.fxml +++ b/desktop/src/main/java/bisq/desktop/main/settings/network/NetworkSettingsView.fxml @@ -94,7 +94,7 @@ - + @@ -159,7 +159,10 @@ - + + + diff --git a/desktop/src/main/java/bisq/desktop/main/settings/network/NetworkSettingsView.java b/desktop/src/main/java/bisq/desktop/main/settings/network/NetworkSettingsView.java index dd1d53be10..d328a91d25 100644 --- a/desktop/src/main/java/bisq/desktop/main/settings/network/NetworkSettingsView.java +++ b/desktop/src/main/java/bisq/desktop/main/settings/network/NetworkSettingsView.java @@ -45,6 +45,8 @@ import bisq.network.p2p.network.Statistic; import bisq.common.ClockWatcher; import bisq.common.UserThread; +import org.bitcoinj.core.PeerGroup; + import javax.inject.Inject; import javafx.fxml.FXML; @@ -86,7 +88,7 @@ public class NetworkSettingsView extends ActivatableView { @FXML InputTextField btcNodesInputTextField; @FXML - TextField onionAddress, sentDataTextField, receivedDataTextField; + TextField onionAddress, sentDataTextField, receivedDataTextField, chainHeightTextField; @FXML Label p2PPeersLabel, bitcoinPeersLabel; @FXML @@ -180,6 +182,7 @@ public class NetworkSettingsView extends ActivatableView { connectionTypeColumn.setGraphic(new AutoTooltipLabel(Res.get("settings.net.connectionTypeColumn"))); sentDataTextField.setPromptText(Res.get("settings.net.sentDataLabel")); receivedDataTextField.setPromptText(Res.get("settings.net.receivedDataLabel")); + chainHeightTextField.setPromptText(Res.get("settings.net.chainHeightLabel")); roundTripTimeColumn.setGraphic(new AutoTooltipLabel(Res.get("settings.net.roundTripTimeColumn"))); sentBytesColumn.setGraphic(new AutoTooltipLabel(Res.get("settings.net.sentBytesColumn"))); receivedBytesColumn.setGraphic(new AutoTooltipLabel(Res.get("settings.net.receivedBytesColumn"))); @@ -487,6 +490,9 @@ public class NetworkSettingsView extends ActivatableView { bitcoinNetworkListItems.setAll(walletsSetup.getPeerGroup().getConnectedPeers().stream() .map(BitcoinNetworkListItem::new) .collect(Collectors.toList())); + chainHeightTextField.textProperty().setValue(Res.get("settings.net.chainHeight", + walletsSetup.chainHeightProperty().get(), + PeerGroup.getMostCommonChainHeight(walletsSetup.connectedPeersProperty().get()))); } } diff --git a/desktop/src/main/java/bisq/desktop/main/settings/preferences/PreferencesView.java b/desktop/src/main/java/bisq/desktop/main/settings/preferences/PreferencesView.java index ef8c695109..ed2ac501d0 100644 --- a/desktop/src/main/java/bisq/desktop/main/settings/preferences/PreferencesView.java +++ b/desktop/src/main/java/bisq/desktop/main/settings/preferences/PreferencesView.java @@ -26,6 +26,7 @@ import bisq.desktop.components.InputTextField; import bisq.desktop.components.PasswordTextField; import bisq.desktop.components.TitledGroupBg; import bisq.desktop.main.overlays.popups.Popup; +import bisq.desktop.main.overlays.windows.EditCustomExplorerWindow; import bisq.desktop.util.GUIUtil; import bisq.desktop.util.ImageUtil; import bisq.desktop.util.Layout; @@ -45,7 +46,6 @@ import bisq.core.locale.LanguageUtil; import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; import bisq.core.provider.fee.FeeService; -import bisq.core.user.BlockChainExplorer; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.ParsingUtils; @@ -57,6 +57,7 @@ import bisq.core.util.validation.RegexValidatorFactory; import bisq.common.UserThread; import bisq.common.app.DevEnv; import bisq.common.config.Config; +import bisq.common.util.Tuple2; import bisq.common.util.Tuple3; import bisq.common.util.Utilities; @@ -73,6 +74,7 @@ import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.control.Separator; +import javafx.scene.control.TextField; import javafx.scene.control.ToggleButton; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; @@ -107,8 +109,7 @@ import static com.google.common.base.Preconditions.checkArgument; @FxmlView public class PreferencesView extends ActivatableViewAndModel { private final CoinFormatter formatter; - private ComboBox blockChainExplorerComboBox; - private ComboBox bsqBlockChainExplorerComboBox; + private TextField btcExplorerTextField, bsqExplorerTextField; private ComboBox userLanguageComboBox; private ComboBox userCountryComboBox; private ComboBox preferredTradeCurrencyComboBox; @@ -138,9 +139,8 @@ public class PreferencesView extends ActivatableViewAndModel fiatCurrenciesComboBox; private ListView cryptoCurrenciesListView; private ComboBox cryptoCurrenciesComboBox; - private Button resetDontShowAgainButton, resyncDaoFromGenesisButton, resyncDaoFromResourcesButton; - private ObservableList blockExplorers; - private ObservableList bsqBlockChainExplorers; + private Button resetDontShowAgainButton, resyncDaoFromGenesisButton, resyncDaoFromResourcesButton, + editCustomBtcExplorer, editCustomBsqExplorer; private ObservableList languageCodes; private ObservableList countries; private ObservableList fiatCurrencies; @@ -148,11 +148,11 @@ public class PreferencesView extends ActivatableViewAndModel cryptoCurrencies; private ObservableList allCryptoCurrencies; private ObservableList tradeCurrencies; - private InputTextField deviationInputTextField; - private ChangeListener deviationListener, ignoreTradersListListener, ignoreDustThresholdListener, + private InputTextField deviationInputTextField, bsqAverageTrimThresholdTextField; + private ChangeListener deviationListener, bsqAverageTrimThresholdListener, ignoreTradersListListener, ignoreDustThresholdListener, rpcUserListener, rpcPwListener, blockNotifyPortListener, autoConfTradeLimitListener, autoConfServiceAddressListener; - private ChangeListener deviationFocusedListener; + private ChangeListener deviationFocusedListener, bsqAverageTrimThresholdFocusedListener; private ChangeListener useCustomFeeCheckboxListener; private ChangeListener transactionFeeChangeListener; private final boolean daoOptionsSet; @@ -194,8 +194,6 @@ public class PreferencesView extends ActivatableViewAndModel btcExp = addTextFieldWithEditButton(root, ++gridRow, Res.get("setting.preferences.explorer")); + btcExplorerTextField = btcExp.first; + editCustomBtcExplorer = btcExp.second; - bsqBlockChainExplorerComboBox = addComboBox(root, ++gridRow, - Res.get("setting.preferences.explorer.bsq")); - bsqBlockChainExplorerComboBox.setButtonCell(GUIUtil.getComboBoxButtonCell(Res.get("setting.preferences.explorer.bsq"), - bsqBlockChainExplorerComboBox, false)); + Tuple2 bsqExp = addTextFieldWithEditButton(root, ++gridRow, Res.get("setting.preferences.explorer.bsq")); + bsqExplorerTextField = bsqExp.first; + editCustomBsqExplorer = bsqExp.second; Tuple3 tuple = addTopLabelInputTextFieldSlideToggleButton(root, ++gridRow, Res.get("setting.preferences.txFee"), Res.get("setting.preferences.useCustomValue")); @@ -274,9 +270,9 @@ public class PreferencesView extends ActivatableViewAndModel { if (oldValue && !newValue) { - String estimatedFee = String.valueOf(feeService.getTxFeePerByte().value); + String estimatedFee = String.valueOf(feeService.getTxFeePerVbyte().value); try { - int withdrawalTxFeePerByte = Integer.parseInt(transactionFeeInputTextField.getText()); - final long minFeePerByte = Config.baseCurrencyNetwork().getDefaultMinFeePerByte(); - if (withdrawalTxFeePerByte < minFeePerByte) { - new Popup().warning(Res.get("setting.preferences.txFeeMin", minFeePerByte)).show(); + int withdrawalTxFeePerVbyte = Integer.parseInt(transactionFeeInputTextField.getText()); + final long minFeePerVbyte = Config.baseCurrencyNetwork().getDefaultMinFeePerVbyte(); + if (withdrawalTxFeePerVbyte < minFeePerVbyte) { + new Popup().warning(Res.get("setting.preferences.txFeeMin", minFeePerVbyte)).show(); transactionFeeInputTextField.setText(estimatedFee); - } else if (withdrawalTxFeePerByte > 5000) { + } else if (withdrawalTxFeePerVbyte > 5000) { new Popup().warning(Res.get("setting.preferences.txFeeTooLarge")).show(); transactionFeeInputTextField.setText(estimatedFee); } else { - preferences.setWithdrawalTxFeeInBytes(withdrawalTxFeePerByte); + preferences.setWithdrawalTxFeeInVbytes(withdrawalTxFeePerVbyte); } } catch (NumberFormatException t) { log.error(t.toString()); @@ -313,12 +309,11 @@ public class PreferencesView extends ActivatableViewAndModel transactionFeeInputTextField.setText(String.valueOf(feeService.getTxFeePerByte().value)); + transactionFeeChangeListener = (observable, oldValue, newValue) -> transactionFeeInputTextField.setText(String.valueOf(feeService.getTxFeePerVbyte().value)); // deviation deviationInputTextField = addInputTextField(root, ++gridRow, Res.get("setting.preferences.deviation")); - deviationListener = (observable, oldValue, newValue) -> { try { double value = ParsingUtils.parsePercentStringToDouble(newValue); @@ -327,16 +322,16 @@ public class PreferencesView extends ActivatableViewAndModel deviationInputTextField.setText(FormattingUtils.formatPercentagePrice(preferences.getMaxPriceDistanceInPercent())), 100, TimeUnit.MILLISECONDS); + UserThread.runAfter(() -> deviationInputTextField.setText(FormattingUtils.formatToPercentWithSymbol(preferences.getMaxPriceDistanceInPercent())), 100, TimeUnit.MILLISECONDS); } } catch (NumberFormatException t) { log.error("Exception at parseDouble deviation: " + t.toString()); - UserThread.runAfter(() -> deviationInputTextField.setText(FormattingUtils.formatPercentagePrice(preferences.getMaxPriceDistanceInPercent())), 100, TimeUnit.MILLISECONDS); + UserThread.runAfter(() -> deviationInputTextField.setText(FormattingUtils.formatToPercentWithSymbol(preferences.getMaxPriceDistanceInPercent())), 100, TimeUnit.MILLISECONDS); } }; deviationFocusedListener = (observable1, oldValue1, newValue1) -> { if (oldValue1 && !newValue1) - UserThread.runAfter(() -> deviationInputTextField.setText(FormattingUtils.formatPercentagePrice(preferences.getMaxPriceDistanceInPercent())), 100, TimeUnit.MILLISECONDS); + UserThread.runAfter(() -> deviationInputTextField.setText(FormattingUtils.formatToPercentWithSymbol(preferences.getMaxPriceDistanceInPercent())), 100, TimeUnit.MILLISECONDS); }; // ignoreTraders @@ -617,7 +612,7 @@ public class PreferencesView extends ActivatableViewAndModel { + try { + double value = ParsingUtils.parsePercentStringToDouble(newValue); + double maxValue = 0.49; + checkArgument(value >= 0, "Input must be positive"); + if (value <= maxValue) { + preferences.setBsqAverageTrimThreshold(value); + } else { + new Popup().warning(Res.get("setting.preferences.deviationToLarge", + maxValue * 100)).show(); + UserThread.runAfter(() -> bsqAverageTrimThresholdTextField.setText(FormattingUtils.formatToPercentWithSymbol( + preferences.getBsqAverageTrimThreshold())), 100, TimeUnit.MILLISECONDS); + } + } catch (NumberFormatException t) { + log.error("Exception: " + t.toString()); + UserThread.runAfter(() -> bsqAverageTrimThresholdTextField.setText(FormattingUtils.formatToPercentWithSymbol( + preferences.getBsqAverageTrimThreshold())), 100, TimeUnit.MILLISECONDS); + } + }; + bsqAverageTrimThresholdFocusedListener = (observable1, oldValue1, newValue1) -> { + if (oldValue1 && !newValue1) + UserThread.runAfter(() -> bsqAverageTrimThresholdTextField.setText(FormattingUtils.formatToPercentWithSymbol( + preferences.getBsqAverageTrimThreshold())), 100, TimeUnit.MILLISECONDS); + }; + + isDaoFullNodeToggleButton = addSlideToggleButton(root, ++gridRow, Res.get("setting.preferences.dao.isDaoFullNode")); rpcUserTextField = addInputTextField(root, ++gridRow, Res.get("setting.preferences.dao.rpcUser")); rpcUserTextField.setVisible(false); @@ -770,11 +795,11 @@ public class PreferencesView extends ActivatableViewAndModel referralIdInputTextField.setText(referralId)); referralIdInputTextField.setPromptText(Res.get("setting.preferences.refererId.prompt"));*/ @@ -831,37 +856,10 @@ public class PreferencesView extends ActivatableViewAndModel() { - @Override - public String toString(BlockChainExplorer blockChainExplorer) { - return blockChainExplorer.name; - } + btcExplorerTextField.setText(preferences.getBlockChainExplorer().name); + bsqExplorerTextField.setText(preferences.getBsqBlockChainExplorer().name); - @Override - public BlockChainExplorer fromString(String string) { - return null; - } - }); - blockChainExplorerComboBox.setOnAction(e -> preferences.setBlockChainExplorer(blockChainExplorerComboBox.getSelectionModel().getSelectedItem())); - - bsqBlockChainExplorerComboBox.setItems(bsqBlockChainExplorers); - bsqBlockChainExplorerComboBox.getSelectionModel().select(preferences.getBsqBlockChainExplorer()); - bsqBlockChainExplorerComboBox.setConverter(new StringConverter<>() { - @Override - public String toString(BlockChainExplorer bsqBlockChainExplorer) { - return bsqBlockChainExplorer.name; - } - - @Override - public BlockChainExplorer fromString(String string) { - return null; - } - }); - bsqBlockChainExplorerComboBox.setOnAction(e -> preferences.setBsqBlockChainExplorer(bsqBlockChainExplorerComboBox.getSelectionModel().getSelectedItem())); - - deviationInputTextField.setText(FormattingUtils.formatPercentagePrice(preferences.getMaxPriceDistanceInPercent())); + deviationInputTextField.setText(FormattingUtils.formatToPercentWithSymbol(preferences.getMaxPriceDistanceInPercent())); deviationInputTextField.textProperty().addListener(deviationListener); deviationInputTextField.focusedProperty().addListener(deviationFocusedListener); @@ -872,10 +870,10 @@ public class PreferencesView extends ActivatableViewAndModel { + preferences.setBlockChainExplorer(urlWindow.getEditedBlockChainExplorer()); + btcExplorerTextField.setText(preferences.getBlockChainExplorer().name); + }) + .closeButtonText(Res.get("shared.cancel")) + .onClose(urlWindow::hide) + .show(); + }); + + editCustomBsqExplorer.setOnAction(e -> { + EditCustomExplorerWindow urlWindow = new EditCustomExplorerWindow("BSQ", + preferences.getBsqBlockChainExplorer(), preferences.getBsqBlockChainExplorers()); + urlWindow + .actionButtonText(Res.get("shared.save")) + .onAction(() -> { + preferences.setBsqBlockChainExplorer(urlWindow.getEditedBlockChainExplorer()); + bsqExplorerTextField.setText(preferences.getBsqBlockChainExplorer().name); + }) + .closeButtonText(Res.get("shared.cancel")) + .onClose(urlWindow::hide) + .show(); + }); + // We use opposite property (useStandbyMode) in preferences to have the default value (false) set as we want it, // so users who update gets set avoidStandbyMode=true (useStandbyMode=false) if (displayStandbyModeFeature) { @@ -950,6 +976,10 @@ public class PreferencesView extends ActivatableViewAndModel findInlierRange( + public static Tuple2 findInlierRange( List yValues, double percentToTrim, double howManyStdDevsConstituteOutlier diff --git a/desktop/src/main/java/bisq/desktop/util/DisplayUtils.java b/desktop/src/main/java/bisq/desktop/util/DisplayUtils.java index 34295b52d6..e85edd16ff 100644 --- a/desktop/src/main/java/bisq/desktop/util/DisplayUtils.java +++ b/desktop/src/main/java/bisq/desktop/util/DisplayUtils.java @@ -21,6 +21,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DurationFormatUtils; import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.math.BigDecimal; import java.math.RoundingMode; @@ -67,6 +68,15 @@ public class DisplayUtils { } } + public static String formatDateAxis(Date date, String format) { + if (date != null) { + SimpleDateFormat dateFormatter = new SimpleDateFormat(format, GlobalSettings.getLocale()); + return dateFormatter.format(date); + } else { + return ""; + } + } + public static String formatAccountAge(long durationMillis) { durationMillis = Math.max(0, durationMillis); String day = Res.get("time.day").toLowerCase(); diff --git a/desktop/src/main/java/bisq/desktop/util/FormBuilder.java b/desktop/src/main/java/bisq/desktop/util/FormBuilder.java index f8061e04f9..f91a4c83ff 100644 --- a/desktop/src/main/java/bisq/desktop/util/FormBuilder.java +++ b/desktop/src/main/java/bisq/desktop/util/FormBuilder.java @@ -338,6 +338,31 @@ public class FormBuilder { return new Tuple3<>(topLabelWithVBox.first, textField, topLabelWithVBox.second); } + public static Tuple2 addTextFieldWithEditButton(GridPane gridPane, int rowIndex, String title) { + TextField textField = new BisqTextField(); + textField.setPromptText(title); + textField.setEditable(false); + textField.setFocusTraversable(false); + textField.setPrefWidth(Layout.INITIAL_WINDOW_WIDTH); + + Button button = new AutoTooltipButton("..."); + button.setStyle("-fx-min-width: 35px; -fx-pref-height: 20; -fx-padding: 3 3 3 3; -fx-border-insets: 5px;"); + button.managedProperty().bind(button.visibleProperty()); + VBox vBoxButton = new VBox(button); + vBoxButton.setAlignment(Pos.CENTER); + HBox hBox2 = new HBox(textField, vBoxButton); + + Label label = getTopLabel(title); + VBox textFieldVbox = getTopLabelVBox(0); + textFieldVbox.getChildren().addAll(label, hBox2); + + gridPane.getChildren().add(textFieldVbox); + GridPane.setRowIndex(textFieldVbox, rowIndex); + GridPane.setMargin(textFieldVbox, new Insets(Layout.FLOATING_LABEL_DISTANCE, 0, 0, 0)); + + return new Tuple2<>(textField, button); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Confirmation Fields /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/desktop/src/main/java/bisq/desktop/util/GUIUtil.java b/desktop/src/main/java/bisq/desktop/util/GUIUtil.java index 1b0c496ab2..0526dee113 100644 --- a/desktop/src/main/java/bisq/desktop/util/GUIUtil.java +++ b/desktop/src/main/java/bisq/desktop/util/GUIUtil.java @@ -194,7 +194,7 @@ public class GUIUtil { public static void showFeeInfoBeforeExecute(Runnable runnable) { String key = "miningFeeInfo"; if (!DevEnv.isDevMode() && DontShowAgainLookup.showAgain(key)) { - new Popup().attention(Res.get("guiUtil.miningFeeInfo", String.valueOf(GUIUtil.feeService.getTxFeePerByte().value))) + new Popup().attention(Res.get("guiUtil.miningFeeInfo", String.valueOf(GUIUtil.feeService.getTxFeePerVbyte().value))) .onClose(runnable) .useIUnderstandButton() .show(); @@ -247,25 +247,24 @@ public class GUIUtil { String directory = Paths.get(path).getParent().toString(); preferences.setDirectoryChooserPath(directory); PersistenceManager persistenceManager = new PersistenceManager<>(new File(directory), persistenceProtoResolver, corruptedStorageFileHandler); - PaymentAccountList persisted = persistenceManager.getPersisted(fileName); - if (persisted != null) { - final StringBuilder msg = new StringBuilder(); - final HashSet paymentAccounts = new HashSet<>(); - persisted.getList().forEach(paymentAccount -> { - final String id = paymentAccount.getId(); - if (user.getPaymentAccount(id) == null) { - paymentAccounts.add(paymentAccount); - msg.append(Res.get("guiUtil.accountExport.tradingAccount", id)); - } else { - msg.append(Res.get("guiUtil.accountImport.noImport", id)); - } - }); - user.addImportedPaymentAccounts(paymentAccounts); - new Popup().feedback(Res.get("guiUtil.accountImport.imported", path, msg)).show(); - - } else { - new Popup().warning(Res.get("guiUtil.accountImport.noAccountsFound", path, fileName)).show(); - } + persistenceManager.readPersisted(fileName, persisted -> { + StringBuilder msg = new StringBuilder(); + HashSet paymentAccounts = new HashSet<>(); + persisted.getList().forEach(paymentAccount -> { + String id = paymentAccount.getId(); + if (user.getPaymentAccount(id) == null) { + paymentAccounts.add(paymentAccount); + msg.append(Res.get("guiUtil.accountExport.tradingAccount", id)); + } else { + msg.append(Res.get("guiUtil.accountImport.noImport", id)); + } + }); + user.addImportedPaymentAccounts(paymentAccounts); + new Popup().feedback(Res.get("guiUtil.accountImport.imported", path, msg)).show(); + }, + () -> { + new Popup().warning(Res.get("guiUtil.accountImport.noAccountsFound", path, fileName)).show(); + }); } else { log.error("The selected file is not the expected file for import. The expected file name is: " + fileName + "."); } @@ -276,7 +275,6 @@ public class GUIUtil { public static void exportCSV(String fileName, CSVEntryConverter headerConverter, CSVEntryConverter contentConverter, T emptyItem, List list, Stage stage) { - FileChooser fileChooser = new FileChooser(); fileChooser.setInitialFileName(fileName); File file = fileChooser.showSaveDialog(stage); @@ -296,7 +294,7 @@ public class GUIUtil { } catch (RuntimeException | IOException e) { e.printStackTrace(); log.error(e.getMessage()); - new Popup().error(Res.get("guiUtil.accountExport.exportFailed", e.getMessage())); + new Popup().error(Res.get("guiUtil.accountExport.exportFailed", e.getMessage())).show(); } } } @@ -758,6 +756,15 @@ public class GUIUtil { return true; } + public static boolean isChainHeightSyncedWithinToleranceOrShowPopup(WalletsSetup walletsSetup) { + if (!walletsSetup.isChainHeightSyncedWithinTolerance()) { + new Popup().information(Res.get("popup.warning.chainNotSynced")).show(); + return false; + } + + return true; + } + public static boolean canCreateOrTakeOfferOrShowPopup(User user, Navigation navigation) { if (!user.hasAcceptedRefundAgents()) { new Popup().warning(Res.get("popup.warning.noArbitratorsAvailable")).show(); @@ -913,7 +920,7 @@ public class GUIUtil { public static void showBsqFeeInfoPopup(Coin fee, Coin miningFee, Coin btcForIssuance, - int txSize, + int txVsize, BsqFormatter bsqFormatter, CoinFormatter btcFormatter, String type, @@ -927,16 +934,16 @@ public class GUIUtil { bsqFormatter.formatBTCWithCode(btcForIssuance), 100, btcFormatter.formatCoinWithCode(miningFee), - CoinUtil.getFeePerByte(miningFee, txSize), - txSize / 1000d, + CoinUtil.getFeePerVbyte(miningFee, txVsize), + txVsize / 1000d, type); } else { confirmationMessage = Res.get("dao.feeTx.confirm.details", StringUtils.capitalize(type), bsqFormatter.formatCoinWithCode(fee), btcFormatter.formatCoinWithCode(miningFee), - CoinUtil.getFeePerByte(miningFee, txSize), - txSize / 1000d, + CoinUtil.getFeePerVbyte(miningFee, txVsize), + txVsize / 1000d, type); } new Popup().headLine(Res.get("dao.feeTx.confirm", type)) @@ -947,10 +954,10 @@ public class GUIUtil { .show(); } - public static void showBsqFeeInfoPopup(Coin fee, Coin miningFee, int txSize, BsqFormatter bsqFormatter, + public static void showBsqFeeInfoPopup(Coin fee, Coin miningFee, int txVsize, BsqFormatter bsqFormatter, CoinFormatter btcFormatter, String type, Runnable actionHandler) { - showBsqFeeInfoPopup(fee, miningFee, null, txSize, bsqFormatter, btcFormatter, type, actionHandler); + showBsqFeeInfoPopup(fee, miningFee, null, txVsize, bsqFormatter, btcFormatter, type, actionHandler); } public static void setFitToRowsForTableView(TableView tableView, @@ -1108,6 +1115,10 @@ public class GUIUtil { } public static MaterialDesignIcon getIconForSignState(AccountAgeWitnessService.SignState state) { + if (state.equals(AccountAgeWitnessService.SignState.PEER_INITIAL)) { + return MaterialDesignIcon.CLOCK; + } + return (state.equals(AccountAgeWitnessService.SignState.ARBITRATOR) || state.equals(AccountAgeWitnessService.SignState.PEER_SIGNER)) ? MaterialDesignIcon.APPROVAL : MaterialDesignIcon.ALERT_CIRCLE_OUTLINE; diff --git a/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidAccountNameValidator.java b/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidAccountNameValidator.java new file mode 100644 index 0000000000..4c6635e85a --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidAccountNameValidator.java @@ -0,0 +1,51 @@ + +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.util.validation; + +import bisq.core.util.validation.InputValidator; +import bisq.core.util.validation.RegexValidator; + +import javax.inject.Inject; + +public final class AustraliaPayidAccountNameValidator extends InputValidator { + @Override + public ValidationResult validate(String input) { + ValidationResult result = super.validate(input); + + if (result.isValid) + result = lengthValidator.validate(input); + if (result.isValid) + result = regexValidator.validate(input); + + return result; + } + + private final LengthValidator lengthValidator; + private final RegexValidator regexValidator; + + @Inject + public AustraliaPayidAccountNameValidator(LengthValidator lengthValidator, RegexValidator regexValidator) { + + lengthValidator.setMinLength(1); + lengthValidator.setMaxLength(40); + this.lengthValidator = lengthValidator; + + this.regexValidator = regexValidator; + } +} diff --git a/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidValidator.java b/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidValidator.java new file mode 100644 index 0000000000..62ddc30cc9 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidValidator.java @@ -0,0 +1,56 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.util.validation; + +import bisq.core.util.validation.InputValidator; + +public final class AustraliaPayidValidator extends InputValidator { + + private final EmailValidator emailValidator; + + /////////////////////////////////////////////////////////////////////////////////////////// + // Public methods + /////////////////////////////////////////////////////////////////////////////////////////// + + public AustraliaPayidValidator() { + emailValidator = new EmailValidator(); + } + + @Override + public ValidationResult validate(String input) { + ValidationResult result = validateIfNotEmpty(input); + if (!result.isValid) { + return result; + } else { + ValidationResult emailResult = emailValidator.validate(input); + if (emailResult.isValid) + return emailResult; + else + return validatePhoneNumber(input); + } + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private methods + /////////////////////////////////////////////////////////////////////////////////////////// + + // TODO not impl yet -> see InteracETransferValidator + private ValidationResult validatePhoneNumber(String input) { + return super.validate(input); + } +} diff --git a/pricenode/src/main/java/bisq/price/spot/providers/Hitbtc.java b/desktop/src/main/java/bisq/desktop/util/validation/TransferwiseValidator.java similarity index 52% rename from pricenode/src/main/java/bisq/price/spot/providers/Hitbtc.java rename to desktop/src/main/java/bisq/desktop/util/validation/TransferwiseValidator.java index cd98cff173..3cc448e63d 100644 --- a/pricenode/src/main/java/bisq/price/spot/providers/Hitbtc.java +++ b/desktop/src/main/java/bisq/desktop/util/validation/TransferwiseValidator.java @@ -15,32 +15,27 @@ * along with Bisq. If not, see . */ -package bisq.price.spot.providers; +package bisq.desktop.util.validation; -import bisq.price.spot.ExchangeRate; -import bisq.price.spot.ExchangeRateProvider; +import bisq.core.util.validation.InputValidator; -import org.knowm.xchange.hitbtc.v2.HitbtcExchange; +import javax.inject.Inject; -import org.springframework.stereotype.Component; +public final class TransferwiseValidator extends InputValidator { + private final EmailValidator emailValidator; -import java.time.Duration; - -import java.util.Set; - -@Component -class Hitbtc extends ExchangeRateProvider { - - public Hitbtc() { - super("HITBTC", "hitbtc", Duration.ofMinutes(1)); + @Inject + public TransferwiseValidator(EmailValidator emailValidator) { + this.emailValidator = emailValidator; } @Override - public Set doGet() { - // Supported fiat: USD - // Supported alts: AEON, BTM, DASH, DCR, DOGE, EMC, ETC, ETH, GRIN, LTC, NAV, - // PART, XMR, XRC, XZC, ZEC, ZEN - return doGet(HitbtcExchange.class); - } + public ValidationResult validate(String input) { + ValidationResult result = super.validate(input); + if (!result.isValid) + return result; + + return emailValidator.validate(input); + } } diff --git a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java index 3b76f7e274..9cd74e457f 100644 --- a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java @@ -229,7 +229,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, null, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, null, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); assertEquals(0, model.maxPlacesForAmount.intValue()); } @@ -243,7 +243,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); model.activate(); @@ -261,7 +261,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); model.activate(); @@ -280,7 +280,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, null, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, null, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); assertEquals(0, model.maxPlacesForVolume.intValue()); } @@ -294,7 +294,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); model.activate(); @@ -312,7 +312,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); model.activate(); @@ -331,7 +331,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, null, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, null, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); assertEquals(0, model.maxPlacesForPrice.intValue()); } @@ -345,7 +345,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); model.activate(); @@ -363,7 +363,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); - final OfferBookViewModel model = new OfferBookViewModel(null, null, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, null, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); assertEquals(0, model.maxPlacesForMarketPriceMargin.intValue()); } @@ -391,7 +391,7 @@ public class OfferBookViewModelTest { item4.getOffer().setPriceFeedService(priceFeedService); offerBookListItems.addAll(item1, item2); - final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, priceFeedService, + final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, priceFeedService, null, null, null, null, coinFormatter, new BsqFormatter()); model.activate(); @@ -412,7 +412,7 @@ public class OfferBookViewModelTest { when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems); when(priceFeedService.getMarketPrice(anyString())).thenReturn(new MarketPrice("USD", 12684.0450, Instant.now().getEpochSecond(), true)); - final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, + final OfferBookViewModel model = new OfferBookViewModel(null, openOfferManager, offerBook, empty, null, null, null, null, null, null, null, coinFormatter, new BsqFormatter()); final OfferBookListItem item = make(btcBuyItem.but( diff --git a/docs/data-stores.md b/docs/data-stores.md index 554efb1588..81bc09f497 100644 --- a/docs/data-stores.md +++ b/docs/data-stores.md @@ -5,5 +5,6 @@ With every release we include the latest snapshot of Mainnet and Testnet data from the P2P network within the client. * Start your Bisq client on Mainnet and Testnet and let it run until it is fully synced. -* Run [copy_dbs.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/copy_dbs.sh) to copy the +* Run [copy_dbs.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/copy_dbs.sh) to copy the required files into the [p2p resources directory](https://github.com/bisq-network/bisq/blob/master/p2p/src/main/resources). +* To add a new trade statistic snapshot just add it to the list of trade statistic snapshots in https://github.com/bisq-network/bisq/blob/0345c795e2c227d827a1f239a323dda1250f4e69/common/src/main/java/bisq/common/app/Version.java#L40 diff --git a/docs/release-process.md b/docs/release-process.md index 46595390ae..a503cbbed8 100644 --- a/docs/release-process.md +++ b/docs/release-process.md @@ -7,11 +7,9 @@ * Webpage (Prepare PR) * Update version number in: * [_config.yml](https://github.com/bisq-network/bisq-website/blob/master/_config.yml) - + * Update currency list in [market_currency_selector.html](https://github.com/bisq-network/bisq-website/blob/master/_includes/market_currency_selector.html) (use [MarketsPrintTool](https://github.com/bisq-network/bisq/blob/master/desktop/src/test/java/bisq/desktop/MarketsPrintTool.java) to create HTML content). - * Update [roadmap](https://github.com/bisq-network/bisq-website/blob/master/roadmap.md) with new release notes. - ### Bisq maintainers, suggestion for writing release notes To be able to create release notes before you make the final release tag, you can temporarily create a local tag and @@ -27,7 +25,7 @@ Write release notes. git shortlog helps a lot, for example: Generate list of authors: git log --format='- %aN' v(current version, e.g. 0.9.3)..v(new version, e.g. 0.9.4) | sort -fiu - + 1. Prepare the release notes with major changes from user perspective. 2. Prepare a short version of the release notes for the in-app update popup @@ -38,7 +36,7 @@ You can use a virtualization solution like [VirtualBox](https://www.virtualbox.o #### VirtualBox recommended configuration Although performance of VMs might vary based on your hardware configuration following setup works pretty well on macOS. -Use VirtualBox < 5.2.22: Using a more recent version makes VMs hardly usable on a MacBook Pro (15-inch, 2016) +Use VirtualBox > 6.1 with following configuration: * System > Motherboard > Base Memory: 2048 MB * System > Processor > Processor(s): 2 CPUs @@ -54,7 +52,7 @@ with following configuration: ##### Linux VM * Ubuntu 16.04.4 64bit -* Recommended virtual disk size: 15 GB +* Recommended virtual disk size: 25 GB ##### macOS VM * macOS X 10.11 (El Capitan) 64bit @@ -74,17 +72,17 @@ with following configuration: #### macOS -1. Make sure all version numbers are updated (update version variables and run [replace_version_number.sh](https://github.com/bisq-network/bisq/blob/master/bisq/desktop/package/macosx/replace_version_number.sh)). +1. Make sure all version numbers are updated (update version variables and run [replace_version_number.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/replace_version_number.sh)). 2. Set environment variable e.g. export BISQ_GPG_USER=manfred@bitsquare.io to ~/.profile file or the like... (one time effort) 3. Update [vmPath variable](https://github.com/bisq-network/bisq/blob/b4b5d0bb12c36afbe1aa6611dd8451378df6db8c/desktop/package/macosx/create_app.sh#L42) if necessary 4. Run [create_app.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/create_app.sh) Build output expected in deploy directory (opened after successful build process): - - 1. `Bisq-${NEW-VERSION}.dmg` macOS signed installer - 2. `Bisq-${NEW-VERSION}.jar` Deterministic fat jar - 3. `Bisq-${NEW-VERSION}.jar.txt` sha256 sum of deterministic fat jar - + + 1. `Bisq-${NEW-VERSION}.dmg` macOS signed installer + 2. `Bisq-${NEW-VERSION}.jar` Deterministic fat jar + 3. `Bisq-${NEW-VERSION}.jar.txt` sha256 sum of deterministic fat jar + The build script also copies over the deterministic fat jar into the shared folders for the other VMs (Windows & Linux). Before building the other binaries install the generated Bisq app on macOS and verify that everything works as expected. @@ -93,8 +91,8 @@ Before building the other binaries install the generated Bisq app on macOS and v * Run `desktop/package/linux/package.sh` from the shared VM folder Build output expected: - - 1. `Bisq-${NEW-VERSION}.deb` package for distributions that derive from Debian + + 1. `Bisq-${NEW-VERSION}.deb` package for distributions that derive from Debian 2. `Bisq-${NEW-VERSION}.rpm` package for distributions that derive from Redhat based distros * Install and run generated package @@ -104,20 +102,20 @@ Build output expected: * Run `desktop/package/windows/package.bat` from the shared VM folder Build output expected: - - 1. `Bisq-${NEW-VERSION}.exe` Windows unsigned installer + + 1. `Bisq-${NEW-VERSION}.exe` Windows unsigned installer 2. `Bisq-${NEW-VERSION}.exe.txt` sha256 sum of installer ### Sign release on macOS -* Run [finalize.sh](https://github.com/bisq-network/bisq/blob/master/bisq/desktop/package/macosx/finalize.sh) +* Run [finalize.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/finalize.sh) Build output expected: - 1. `F379A1C6.asc` Sig key of Manfred Karrer - 2. `5BC5ED73.asc` Sig key of Chris Beams - 3. `29CDFD3B.asc`Sig key of Christoph Atteneder - 4. `signingkey.asc` Fingerprint of key that was used for these builds + 1. `F379A1C6.asc` Sig key of Manfred Karrer + 2. `5BC5ED73.asc` Sig key of Chris Beams + 3. `29CDFD3B.asc`Sig key of Christoph Atteneder + 4. `signingkey.asc` Fingerprint of key that was used for these builds 5. `Bisq-${NEW-VERSION}.jar.txt` Sha256 sum of deterministic fat jar 6. `Bisq-${NEW-VERSION}.dmg` macOS installer 7. `Bisq-${NEW-VERSION}.dmg.asc` Signature for macOS installer @@ -127,23 +125,23 @@ Build output expected: 11. `Bisq-${NEW-VERSION}.rpm.asc` Signature for Redhat based distro package 12. `Bisq-${NEW-VERSION}.exe` Windows installer 13. `Bisq-${NEW-VERSION}.exe.asc` Signature for Windows installer - + * Run a AV scan over all files on the Windows VM where the files got copied over. - + ### Final test - + * Make at least one mainnet test trade with some exotic currency to not interfere with real traders. - + ### Tag and push release to master -If all was successful: +If all was successful: - * commit changes of new version number (update version number for release of e.g. v0.9.4) + * commit changes of new version number (update version number for release of e.g. v1.5.0) * create tag for the release ``` - git tag -s v(new version, e.g. 0.9.4) -m"Release v(new version, e.g. 0.9.4)" + git tag -s v(new version, e.g. 1.5.0) -m"Release v(new version, e.g. 1.5.0)" ``` - * Revert back to SNAPSHOT where necessary (change version variable (e.g. 0.9.4) in shell script [insert_snapshot_version.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/insert_snapshot_version.sh) and run it) and commit these changes. + * Revert back to SNAPSHOT where necessary (change version variable (e.g. 1.5.0) in shell script [insert_snapshot_version.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/insert_snapshot_version.sh) and run it) and commit these changes. * Push all commits to master including the new tag ``` git push --tags origin master @@ -162,7 +160,7 @@ If all was successful: #### Post GitHub release * Apply “A newer version is already available! Please don’t use this version anymore.” to old GitHub releases. * Merge the webpage PR and check if they got deployed properly. - * Start the Alert sender app (CMD + M) remove the old version and send the update message. + * Start the Alert sender app (CMD + M) remove the old version and send the update message. Check the checkbox for update, set the version number (e.g. 0.9.4) and add the short version of the release notes. * After sending the Update message leave it running for about 1 minute to give time for good propagation. * Make a backup of that alert sender app data directory @@ -170,7 +168,7 @@ If all was successful: ### Announce the release * Forum - * Slack (#general channel) + * Keybase (#general channel) * Twitter * Optionally reddit /r/Bisq * Notify @freimair so that he can start updating [the Arch User Repository](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=bisq-git) diff --git a/gradle/witness/gradle-witness.gradle b/gradle/witness/gradle-witness.gradle index 2cfee8250c..ca58c39de1 100644 --- a/gradle/witness/gradle-witness.gradle +++ b/gradle/witness/gradle-witness.gradle @@ -20,10 +20,10 @@ dependencyVerification { 'com.fasterxml.jackson.core:jackson-core:39a74610521d7fb9eb3f437bb8739bbf47f6435be12d17bf954c731a0c6352bb', 'com.fasterxml.jackson.core:jackson-databind:fcf3c2b0c332f5f54604f7e27fa7ee502378a2cc5df6a944bbfae391872c32ff', 'com.github.JesusMcCloud:jtorctl:389d61b1b5a85eb2f23c582c3913ede49f80c9f2b553e4762382c836270e57e5', - 'com.github.bisq-network:bitcoinj:b8b6e4b8010f2b8d4aac7141c0809dea6d102c3ff3c06ceba78c2626d531b0af', - 'com.github.cd2357.netlayer:tor.external:7c70846d36465279c2664f147a0f2d47202c5d67c6a2075225194779c3fbe122', - 'com.github.cd2357.netlayer:tor.native:84b449191d535a3c2187f7f7f3bb9bcb7d1097f07c6bf8c4f2b3331c20107d9a', - 'com.github.cd2357.netlayer:tor:ff92e4a7b59d1b480e0427fcfcf3f82a6fd69be68eec91c6360774d599e3c2e0', + 'com.github.bisq-network.netlayer:tor.external:a3606a592d6b6caa6a2fb7db224eaf43c6874c6730da4815bd37ad686b283dcb', + 'com.github.bisq-network.netlayer:tor.native:b15aba7fe987185037791c7ec7c529cb001b90d723d047d54aab87aceb3b3d45', + 'com.github.bisq-network.netlayer:tor:a974190aa3a031067ccd1dda28a3ae58cad14060792299d86ea38a05fb21afc5', + 'com.github.bisq-network:bitcoinj:2d261e53cd0cb6321119e5a48eb4ee2a852b4b0bbbea9dff837a785f05541bb3', 'com.github.cd2357.tor-binary:tor-binary-geoip:ae27b6aca1a3a50a046eb11e38202b6d21c2fcd2b8643bbeb5ea85e065fbc1be', 'com.github.cd2357.tor-binary:tor-binary-linux32:7b5d6770aa442ef6d235e8a9bfbaa7c62560690f9fe69ff03c7a752eae84f7dc', 'com.github.cd2357.tor-binary:tor-binary-linux64:24111fa35027599a750b0176392dc1e9417d919414396d1b221ac2e707eaba76', diff --git a/inventory/src/main/java/bisq/inventory/InventoryMonitor.java b/inventory/src/main/java/bisq/inventory/InventoryMonitor.java new file mode 100644 index 0000000000..4eacd79991 --- /dev/null +++ b/inventory/src/main/java/bisq/inventory/InventoryMonitor.java @@ -0,0 +1,277 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.inventory; + + +import bisq.core.app.TorSetup; +import bisq.core.network.p2p.inventory.GetInventoryRequestManager; +import bisq.core.network.p2p.inventory.model.Average; +import bisq.core.network.p2p.inventory.model.DeviationSeverity; +import bisq.core.network.p2p.inventory.model.InventoryItem; +import bisq.core.network.p2p.inventory.model.RequestInfo; +import bisq.core.network.p2p.seed.DefaultSeedNodeRepository; +import bisq.core.proto.network.CoreNetworkProtoResolver; + +import bisq.network.p2p.NetworkNodeProvider; +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.network.SetupListener; + +import bisq.common.UserThread; +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.file.JsonFileManager; +import bisq.common.util.Tuple2; +import bisq.common.util.Utilities; + +import java.time.Clock; + +import java.io.File; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.Nullable; + +@Slf4j +public class InventoryMonitor implements SetupListener { + private final Map jsonFileManagerByNodeAddress = new HashMap<>(); + private final Map> requestInfoListByNode = new HashMap<>(); + private final File appDir; + private final boolean useLocalhostForP2P; + private final int intervalSec; + private NetworkNode networkNode; + private GetInventoryRequestManager getInventoryRequestManager; + + private ArrayList seedNodes; + private InventoryWebServer inventoryWebServer; + private int requestCounter = 0; + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + public InventoryMonitor(File appDir, + boolean useLocalhostForP2P, + BaseCurrencyNetwork network, + int intervalSec, + int port) { + this.appDir = appDir; + this.useLocalhostForP2P = useLocalhostForP2P; + this.intervalSec = intervalSec; + + // We get more connectivity issues. Cleaning tor cache files helps usually for those problems. + File torDir = new File(appDir, "tor"); + TorSetup torSetup = new TorSetup(torDir); + torSetup.cleanupTorFiles(() -> { + networkNode = getNetworkNode(torDir); + getInventoryRequestManager = new GetInventoryRequestManager(networkNode); + + // We maintain our own list as we want to monitor also old v2 nodes which are not part of the normal seed + // node list anymore. + String networkName = network.name().toLowerCase(); + String fileName = network.isMainnet() ? "inv_" + networkName : networkName; + DefaultSeedNodeRepository.readSeedNodePropertyFile(fileName) + .ifPresent(bufferedReader -> { + seedNodes = new ArrayList<>(DefaultSeedNodeRepository.getSeedNodeAddressesFromPropertyFile(fileName)); + addJsonFileManagers(seedNodes); + inventoryWebServer = new InventoryWebServer(port, seedNodes, bufferedReader); + networkNode.start(this); + }); + }, log::error); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public void shutDown(Runnable shutDownCompleteHandler) { + networkNode.shutDown(shutDownCompleteHandler); + jsonFileManagerByNodeAddress.values().forEach(JsonFileManager::shutDown); + inventoryWebServer.shutDown(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // SetupListener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onTorNodeReady() { + UserThread.runPeriodically(this::requestFromAllSeeds, intervalSec); + requestFromAllSeeds(); + } + + @Override + public void onHiddenServicePublished() { + } + + @Override + public void onSetupFailed(Throwable throwable) { + } + + @Override + public void onRequestCustomBridges() { + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void requestFromAllSeeds() { + requestCounter++; + seedNodes.forEach(nodeAddress -> { + RequestInfo requestInfo = new RequestInfo(System.currentTimeMillis()); + new Thread(() -> { + Thread.currentThread().setName("request @ " + getShortAddress(nodeAddress, useLocalhostForP2P)); + getInventoryRequestManager.request(nodeAddress, + result -> processResponse(nodeAddress, requestInfo, result, null), + errorMessage -> processResponse(nodeAddress, requestInfo, null, errorMessage)); + }).start(); + }); + } + + private void processResponse(NodeAddress nodeAddress, + RequestInfo requestInfo, + @Nullable Map result, + @Nullable String errorMessage) { + if (errorMessage != null && !errorMessage.isEmpty()) { + log.warn("Error at connection to peer {}: {}", nodeAddress, errorMessage); + requestInfo.setErrorMessage(errorMessage); + } else { + requestInfo.setResponseTime(System.currentTimeMillis()); + } + + boolean ignoreDeviationAtStartup; + if (result != null) { + log.info("nodeAddress={}, result={}", nodeAddress, result.toString()); + + // If seed just started up we ignore the deviation as it can be expected that seed is still syncing + // DAO state/blocks. P2P data should be ready but as we received it from other seeds it is not that + // valuable information either, so we apply the ignore to all data. + if (result.containsKey(InventoryItem.jvmStartTime)) { + String jvmStartTimeString = result.get(InventoryItem.jvmStartTime); + long jvmStartTime = Long.parseLong(jvmStartTimeString); + ignoreDeviationAtStartup = jvmStartTime < TimeUnit.MINUTES.toMillis(2); + } else { + ignoreDeviationAtStartup = false; + } + } else { + ignoreDeviationAtStartup = false; + } + + requestInfoListByNode.putIfAbsent(nodeAddress, new ArrayList<>()); + List requestInfoList = requestInfoListByNode.get(nodeAddress); + + + // We create average of all nodes latest results. It might be that the nodes last result is + // from a previous request as the response has not arrived yet. + //TODO might be not a good idea to use the last result if its not a recent one. a faulty node would distort + // the average calculation. + // As we add at the end our own result the average is excluding our own value + Collection> requestInfoListByNodeValues = requestInfoListByNode.values(); + Set requestInfoSet = requestInfoListByNodeValues.stream() + .filter(list -> !list.isEmpty()) + .map(list -> list.get(list.size() - 1)) + .collect(Collectors.toSet()); + Map averageValues = Average.of(requestInfoSet); + + String daoStateChainHeight = result != null && + result.containsKey(InventoryItem.daoStateChainHeight) ? + result.get(InventoryItem.daoStateChainHeight) : + null; + List.of(InventoryItem.values()).forEach(inventoryItem -> { + String value = result != null ? result.get(inventoryItem) : null; + Tuple2 tuple = inventoryItem.getDeviationAndAverage(averageValues, value); + Double deviation = tuple != null ? tuple.first : null; + Double average = tuple != null ? tuple.second : null; + DeviationSeverity deviationSeverity = ignoreDeviationAtStartup ? DeviationSeverity.IGNORED : + inventoryItem.getDeviationSeverity(deviation, + requestInfoListByNodeValues, + value, + daoStateChainHeight); + int endIndex = Math.max(0, requestInfoList.size() - 1); + int deviationTolerance = inventoryItem.getDeviationTolerance(); + int fromIndex = Math.max(0, endIndex - deviationTolerance); + List lastDeviationSeverityEntries = requestInfoList.subList(fromIndex, endIndex).stream() + .filter(e -> e.getDataMap().containsKey(inventoryItem)) + .map(e -> e.getDataMap().get(inventoryItem).getDeviationSeverity()) + .collect(Collectors.toList()); + long numWarnings = lastDeviationSeverityEntries.stream() + .filter(e -> e == DeviationSeverity.WARN) + .count(); + long numAlerts = lastDeviationSeverityEntries.stream() + .filter(e -> e == DeviationSeverity.ALERT) + .count(); + boolean persistentWarning = numWarnings == deviationTolerance; + boolean persistentAlert = numAlerts == deviationTolerance; + RequestInfo.Data data = new RequestInfo.Data(value, average, deviation, deviationSeverity, persistentWarning, persistentAlert); + requestInfo.getDataMap().put(inventoryItem, data); + }); + + requestInfoList.add(requestInfo); + + inventoryWebServer.onNewRequestInfo(requestInfoListByNode, requestCounter); + + String json = Utilities.objectToJson(requestInfo); + jsonFileManagerByNodeAddress.get(nodeAddress).writeToDisc(json, String.valueOf(requestInfo.getRequestStartTime())); + } + + private void addJsonFileManagers(List seedNodes) { + File jsonDir = new File(appDir, "json"); + if (!jsonDir.exists() && !jsonDir.mkdir()) { + log.warn("make jsonDir failed"); + } + seedNodes.forEach(nodeAddress -> { + JsonFileManager jsonFileManager = new JsonFileManager(new File(jsonDir, getShortAddress(nodeAddress, useLocalhostForP2P))); + jsonFileManagerByNodeAddress.put(nodeAddress, jsonFileManager); + }); + } + + private NetworkNode getNetworkNode(File torDir) { + CoreNetworkProtoResolver networkProtoResolver = new CoreNetworkProtoResolver(Clock.systemDefaultZone()); + return new NetworkNodeProvider(networkProtoResolver, + ArrayList::new, + useLocalhostForP2P, + 9999, + torDir, + null, + "", + -1, + "", + null, + false, + false).get(); + } + + private String getShortAddress(NodeAddress nodeAddress, boolean useLocalhostForP2P) { + return useLocalhostForP2P ? + nodeAddress.getFullAddress().replace(":", "_") : + nodeAddress.getFullAddress().substring(0, 10); + } +} diff --git a/inventory/src/main/java/bisq/inventory/InventoryMonitorMain.java b/inventory/src/main/java/bisq/inventory/InventoryMonitorMain.java new file mode 100644 index 0000000000..9d954c8791 --- /dev/null +++ b/inventory/src/main/java/bisq/inventory/InventoryMonitorMain.java @@ -0,0 +1,127 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.inventory; + + +import bisq.core.locale.Res; + +import bisq.common.UserThread; +import bisq.common.app.AsciiLogo; +import bisq.common.app.Log; +import bisq.common.app.Version; +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.util.Utilities; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; + +import java.nio.file.Paths; + +import java.io.File; + +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; + +import ch.qos.logback.classic.Level; + +import lombok.extern.slf4j.Slf4j; + + + +import sun.misc.Signal; + +@Slf4j +public class InventoryMonitorMain { + + private static InventoryMonitor inventoryMonitor; + private static boolean stopped; + + // prog args for regtest: 10 1 BTC_REGTEST + public static void main(String[] args) { + // Default values + int intervalSec = 120; + boolean useLocalhostForP2P = false; + BaseCurrencyNetwork network = BaseCurrencyNetwork.BTC_MAINNET; + int port = 80; + + if (args.length > 0) { + intervalSec = Integer.parseInt(args[0]); + } + if (args.length > 1) { + useLocalhostForP2P = args[1].equals("1"); + } + if (args.length > 2) { + network = BaseCurrencyNetwork.valueOf(args[2]); + } + if (args.length > 3) { + port = Integer.parseInt(args[3]); + } + + String appName = "bisq-inventory-monitor-" + network; + File appDir = new File(Utilities.getUserDataDir(), appName); + if (!appDir.exists() && !appDir.mkdir()) { + log.warn("make appDir failed"); + } + inventoryMonitor = new InventoryMonitor(appDir, useLocalhostForP2P, network, intervalSec, port); + + setup(network, appDir); + } + + private static void setup(BaseCurrencyNetwork network, File appDir) { + AsciiLogo.showAsciiLogo(); + String logPath = Paths.get(appDir.getPath(), "bisq").toString(); + Log.setup(logPath); + Log.setLevel(Level.INFO); + Version.setBaseCryptoNetworkId(network.ordinal()); + + Res.setup(); // Used for some formatting in the webserver + + // We do not set any capabilities as we don't want to receive any network data beside our response. + // We also do not use capabilities for the request/response messages as we only connect to seeds nodes and + + ThreadFactory threadFactory = new ThreadFactoryBuilder() + .setNameFormat(inventoryMonitor.getClass().getSimpleName()) + .setDaemon(true) + .build(); + UserThread.setExecutor(Executors.newSingleThreadExecutor(threadFactory)); + + Signal.handle(new Signal("INT"), signal -> { + UserThread.execute(InventoryMonitorMain::shutDown); + }); + + Signal.handle(new Signal("TERM"), signal -> { + UserThread.execute(InventoryMonitorMain::shutDown); + }); + keepRunning(); + } + + private static void shutDown() { + stopped = true; + inventoryMonitor.shutDown(() -> { + System.exit(0); + }); + } + + private static void keepRunning() { + while (!stopped) { + try { + Thread.sleep(Long.MAX_VALUE); + } catch (InterruptedException ignore) { + } + } + } +} diff --git a/inventory/src/main/java/bisq/inventory/InventoryWebServer.java b/inventory/src/main/java/bisq/inventory/InventoryWebServer.java new file mode 100644 index 0000000000..e267fed8ce --- /dev/null +++ b/inventory/src/main/java/bisq/inventory/InventoryWebServer.java @@ -0,0 +1,534 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.inventory; + +import bisq.core.network.p2p.inventory.model.DeviationByIntegerDiff; +import bisq.core.network.p2p.inventory.model.DeviationByPercentage; +import bisq.core.network.p2p.inventory.model.DeviationSeverity; +import bisq.core.network.p2p.inventory.model.InventoryItem; +import bisq.core.network.p2p.inventory.model.RequestInfo; +import bisq.core.util.FormattingUtils; + +import bisq.network.p2p.NodeAddress; + +import bisq.common.app.Version; +import bisq.common.util.MathUtils; +import bisq.common.util.Utilities; + +import com.google.common.base.Joiner; + +import java.io.BufferedReader; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; + +import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.Nullable; + + + +import spark.Spark; + +@Slf4j +public class InventoryWebServer { + private final static String CLOSE_TAG = "
"; + private final static String WARNING_ICON = "⚠ "; + private final static String ALERT_ICON = "☠ "; // ⚡ ⚡ + + private final List seedNodes; + private final Map operatorByNodeAddress = new HashMap<>(); + + private String html; + private int requestCounter; + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + public InventoryWebServer(int port, + List seedNodes, + BufferedReader seedNodeFile) { + this.seedNodes = seedNodes; + setupOperatorMap(seedNodeFile); + + Spark.port(port); + Spark.get("/", (req, res) -> { + log.info("Incoming request from: {}", req.userAgent()); + return html == null ? "Starting up..." : html; + }); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public void onNewRequestInfo(Map> requestInfoListByNode, int requestCounter) { + this.requestCounter = requestCounter; + html = generateHtml(requestInfoListByNode); + } + + public void shutDown() { + Spark.stop(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // HTML + /////////////////////////////////////////////////////////////////////////////////////////// + + private String generateHtml(Map> map) { + StringBuilder html = new StringBuilder(); + html.append("" + + "" + + "" + + "

") + .append("Current time: ").append(new Date().toString()).append("
") + .append("Request cycle: ").append(requestCounter).append("
") + .append("Version/commit: ").append(Version.VERSION).append(" / ").append(RequestInfo.COMMIT_HASH).append("
") + .append("") + .append("") + .append("") + .append("") + .append("") + .append("") + .append("").append(""); + + seedNodes.forEach(seedNode -> { + html.append(""); + if (map.containsKey(seedNode) && !map.get(seedNode).isEmpty()) { + List list = map.get(seedNode); + int numRequests = list.size(); + RequestInfo requestInfo = list.get(numRequests - 1); + html.append("") + .append("") + .append("") + .append("") + .append(""); + } else { + html.append("") + .append("") + .append("") + .append("") + .append(""); + } + html.append(""); + }); + + html.append("
Seed node infoRequest infoData inventoryDAO dataNetwork info
").append(getSeedNodeInfo(seedNode, requestInfo)).append("").append(getRequestInfo(seedNode, requestInfo, numRequests, map)).append("").append(getDataInfo(seedNode, requestInfo, map)).append("").append(getDaoInfo(seedNode, requestInfo, map)).append("").append(getNetworkInfo(seedNode, requestInfo, map)).append("").append(getSeedNodeInfo(seedNode, null)).append("").append("n/a").append("").append("n/a").append("").append("n/a").append("").append("n/a").append("
"); + return html.toString(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Sub sections + /////////////////////////////////////////////////////////////////////////////////////////// + + private String getSeedNodeInfo(NodeAddress nodeAddress, + @Nullable RequestInfo requestInfo) { + StringBuilder sb = new StringBuilder(); + + String operator = operatorByNodeAddress.get(nodeAddress.getFullAddress()); + sb.append("Operator: ").append(operator).append("
"); + + String address = nodeAddress.getFullAddress(); + + String filteredSeeds = requestInfo != null ? requestInfo.getValue(InventoryItem.filteredSeeds) : null; + if (filteredSeeds != null && filteredSeeds.contains(address)) { + sb.append(getColorTagByDeviationSeverity(DeviationSeverity.ALERT)).append("Node address: ") + .append(address).append(" (is filtered!)").append(CLOSE_TAG); + } else { + sb.append("Node address: ").append(address).append("
"); + } + + if (requestInfo != null) { + sb.append("Version: ").append(requestInfo.getDisplayValue(InventoryItem.version)).append("
"); + sb.append("Commit hash: ").append(requestInfo.getDisplayValue(InventoryItem.commitHash)).append("
"); + String memory = requestInfo.getValue(InventoryItem.usedMemory); + String memoryString = memory != null ? Utilities.readableFileSize(Long.parseLong(memory)) : "n/a"; + sb.append("Memory used: ") + .append(memoryString) + .append("
"); + + String jvmStartTimeString = requestInfo.getValue(InventoryItem.jvmStartTime); + long jvmStartTime = jvmStartTimeString != null ? Long.parseLong(jvmStartTimeString) : 0; + sb.append("Node started at: ") + .append(new Date(jvmStartTime).toString()) + .append("
"); + + String duration = jvmStartTime > 0 ? + FormattingUtils.formatDurationAsWords(System.currentTimeMillis() - jvmStartTime, + true, true) : + "n/a"; + sb.append("Run duration: ").append(duration).append("
"); + + String filteredSeedNodes = requestInfo.getDisplayValue(InventoryItem.filteredSeeds) + .replace(System.getProperty("line.separator"), "
"); + if (filteredSeedNodes.isEmpty()) { + filteredSeedNodes = "-"; + } + sb.append("Filtered seed nodes: ") + .append(filteredSeedNodes) + .append("
"); + } + + return sb.toString(); + } + + private String getRequestInfo(NodeAddress seedNode, + RequestInfo requestInfo, + int numRequests, + Map> map) { + StringBuilder sb = new StringBuilder(); + + DeviationSeverity deviationSeverity = numRequests == requestCounter ? + DeviationSeverity.OK : + requestCounter - numRequests > 4 ? + DeviationSeverity.ALERT : + DeviationSeverity.WARN; + sb.append("Number of requests: ").append(getColorTagByDeviationSeverity(deviationSeverity)) + .append(numRequests).append(CLOSE_TAG); + + DeviationSeverity rrtDeviationSeverity = DeviationSeverity.OK; + String rrtString = "n/a"; + if (requestInfo.getResponseTime() > 0) { + long rrt = requestInfo.getResponseTime() - requestInfo.getRequestStartTime(); + if (rrt > 20_000) { + rrtDeviationSeverity = DeviationSeverity.ALERT; + } else if (rrt > 10_000) { + rrtDeviationSeverity = DeviationSeverity.WARN; + } + rrtString = MathUtils.roundDouble(rrt / 1000d, 3) + " sec"; + + } + sb.append("Round trip time: ").append(getColorTagByDeviationSeverity(rrtDeviationSeverity)) + .append(rrtString).append(CLOSE_TAG); + + Date requestStartTime = new Date(requestInfo.getRequestStartTime()); + sb.append("Requested at: ").append(requestStartTime).append("
"); + + String responseTime = requestInfo.getResponseTime() > 0 ? + new Date(requestInfo.getResponseTime()).toString() : + "n/a"; + sb.append("Response received at: ").append(responseTime).append("
"); + + sb.append(getErrorMsgLine(seedNode, requestInfo, map)); + return sb.toString(); + } + + private String getDataInfo(NodeAddress seedNode, + RequestInfo requestInfo, + Map> map) { + StringBuilder sb = new StringBuilder(); + + sb.append(getLine(InventoryItem.OfferPayload, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.MailboxStoragePayload, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.TradeStatistics3, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.AccountAgeWitness, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.SignedWitness, seedNode, requestInfo, map)); + + sb.append(getLine(InventoryItem.Alert, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.Filter, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.Mediator, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.RefundAgent, seedNode, requestInfo, map)); + + return sb.toString(); + } + + private String getDaoInfo(NodeAddress seedNode, + RequestInfo requestInfo, + Map> map) { + StringBuilder sb = new StringBuilder(); + + sb.append(getLine("Number of BSQ blocks: ", InventoryItem.numBsqBlocks, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.TempProposalPayload, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.ProposalPayload, seedNode, requestInfo, map)); + sb.append(getLine(InventoryItem.BlindVotePayload, seedNode, requestInfo, map)); + sb.append(getLine("DAO state block height: ", InventoryItem.daoStateChainHeight, seedNode, requestInfo, map)); + + sb.append(getLine("DAO state hash: ", InventoryItem.daoStateHash, seedNode, requestInfo, map)); + + // The hash for proposal changes only at first block of blind vote phase but as we do not want to initialize the + // dao domain we cannot check that. But we also don't need that as we can just compare that all hashes at all + // blocks from all seeds are the same. Same for blindVoteHash. + sb.append(getLine("Proposal state hash: ", InventoryItem.proposalHash, seedNode, requestInfo, map)); + sb.append(getLine("Blind vote state hash: ", InventoryItem.blindVoteHash, seedNode, requestInfo, map)); + + return sb.toString(); + } + + private String getNetworkInfo(NodeAddress seedNode, + RequestInfo requestInfo, + Map> map) { + StringBuilder sb = new StringBuilder(); + + sb.append(getLine("Max. connections: ", + InventoryItem.maxConnections, seedNode, requestInfo, map)); + sb.append(getLine("Number of connections: ", + InventoryItem.numConnections, seedNode, requestInfo, map)); + sb.append(getLine("Peak number of connections: ", + InventoryItem.peakNumConnections, seedNode, requestInfo, map)); + sb.append(getLine("Number of 'All connections lost' events: ", + InventoryItem.numAllConnectionsLostEvents, seedNode, requestInfo, map)); + + sb.append(getLine("Sent messages/sec: ", + InventoryItem.sentMessagesPerSec, seedNode, requestInfo, map, this::getRounded)); + sb.append(getLine("Received messages/sec: ", + InventoryItem.receivedMessagesPerSec, seedNode, requestInfo, map, this::getRounded)); + sb.append(getLine("Sent kB/sec: ", + InventoryItem.sentBytesPerSec, seedNode, requestInfo, map, this::getKbRounded)); + sb.append(getLine("Received kB/sec: ", + InventoryItem.receivedBytesPerSec, seedNode, requestInfo, map, this::getKbRounded)); + sb.append(getLine("Sent data: ", + InventoryItem.sentBytes, seedNode, requestInfo, map, + value -> Utilities.readableFileSize(Long.parseLong(value)))); + sb.append(getLine("Received data: ", + InventoryItem.receivedBytes, seedNode, requestInfo, map, + value -> Utilities.readableFileSize(Long.parseLong(value)))); + return sb.toString(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Utils + /////////////////////////////////////////////////////////////////////////////////////////// + + private String getLine(InventoryItem inventoryItem, + NodeAddress seedNode, + RequestInfo requestInfo, + Map> map) { + return getLine(getTitle(inventoryItem), + inventoryItem, + seedNode, + requestInfo, + map); + } + + private String getLine(String title, + InventoryItem inventoryItem, + NodeAddress seedNode, + RequestInfo requestInfo, + Map> map) { + return getLine(title, + inventoryItem, + seedNode, + requestInfo, + map, + null); + } + + private String getLine(String title, + InventoryItem inventoryItem, + NodeAddress seedNode, + RequestInfo requestInfo, + Map> map, + @Nullable Function formatter) { + String displayValue = requestInfo.getDisplayValue(inventoryItem); + String value = requestInfo.getValue(inventoryItem); + if (formatter != null && value != null) { + displayValue = formatter.apply(value); + } + + String deviationAsPercentString = ""; + DeviationSeverity deviationSeverity = DeviationSeverity.OK; + if (requestInfo.getDataMap().containsKey(inventoryItem)) { + RequestInfo.Data data = requestInfo.getDataMap().get(inventoryItem); + deviationAsPercentString = getDeviationAsPercentString(inventoryItem, data); + deviationSeverity = data.getDeviationSeverity(); + } + + List requestInfoList = map.get(seedNode); + String historicalWarnings = ""; + String historicalAlerts = ""; + List warningsAtRequestNumber = new ArrayList<>(); + List alertsAtRequestNumber = new ArrayList<>(); + if (requestInfoList != null) { + for (int i = 0; i < requestInfoList.size(); i++) { + RequestInfo reqInfo = requestInfoList.get(i); + Map deviationInfoMap = reqInfo.getDataMap(); + if (deviationInfoMap.containsKey(inventoryItem)) { + RequestInfo.Data data = deviationInfoMap.get(inventoryItem); + String deviationAsPercent = getDeviationAsPercentString(inventoryItem, data); + if (data.isPersistentWarning()) { + warningsAtRequestNumber.add((i + 1) + deviationAsPercent); + } else if (data.isPersistentAlert()) { + alertsAtRequestNumber.add((i + 1) + deviationAsPercent); + } + } + } + + if (!warningsAtRequestNumber.isEmpty()) { + historicalWarnings = warningsAtRequestNumber.size() + " repeated warning(s) at request(s) " + + Joiner.on(", ").join(warningsAtRequestNumber); + } + if (!alertsAtRequestNumber.isEmpty()) { + historicalAlerts = alertsAtRequestNumber.size() + " repeated alert(s) at request(s): " + + Joiner.on(", ").join(alertsAtRequestNumber); + } + } + String historicalWarningsHtml = warningsAtRequestNumber.isEmpty() ? "" : + ", " + WARNING_ICON + + warningsAtRequestNumber.size() + ""; + String historicalAlertsHtml = alertsAtRequestNumber.isEmpty() ? "" : + ", " + ALERT_ICON + + alertsAtRequestNumber.size() + ""; + + return title + + getColorTagByDeviationSeverity(deviationSeverity) + + displayValue + + deviationAsPercentString + + historicalWarningsHtml + + historicalAlertsHtml + + CLOSE_TAG; + } + + private String getDeviationAsPercentString(InventoryItem inventoryItem, RequestInfo.Data data) { + Double deviation = data.getDeviation(); + if (deviation == null || deviation == 1) { + return ""; + } + if (inventoryItem.getDeviationType() instanceof DeviationByPercentage) { + return getDeviationInRoundedPercent(deviation); + } else if (inventoryItem.getDeviationType() instanceof DeviationByIntegerDiff) { + // For larger numbers like chain height we need to show all decimals as diff can be very small + return getDeviationInExactPercent(deviation); + } else { + return ""; + } + } + + private String getDeviationInRoundedPercent(double deviation) { + return " (" + MathUtils.roundDouble(100 * deviation, 2) + " %)"; + } + + private String getDeviationInExactPercent(double deviation) { + return " (" + 100 * deviation + " %)"; + } + + private String getColorTagByDeviationSeverity(@Nullable DeviationSeverity deviationSeverity) { + if (deviationSeverity == null) { + return ""; + } + + switch (deviationSeverity) { + case WARN: + return ""; + case ALERT: + return ""; + case IGNORED: + return ""; + case OK: + default: + return ""; + } + } + + private String getTitle(InventoryItem inventoryItem) { + return "Number of " + inventoryItem.getKey() + ": "; + } + + private String getRounded(String value) { + return String.valueOf(MathUtils.roundDouble(Double.parseDouble(value), 2)); + } + + private String getKbRounded(String bytes) { + return String.valueOf(MathUtils.roundDouble(Double.parseDouble(bytes) / 1000, 2)); + } + + private void setupOperatorMap(BufferedReader seedNodeFile) { + seedNodeFile.lines().forEach(line -> { + if (!line.startsWith("#")) { + String[] strings = line.split(" \\(@"); + String node = strings.length > 0 ? strings[0] : "n/a"; + String operator = strings.length > 1 ? strings[1].replace(")", "") : "n/a"; + operatorByNodeAddress.put(node, operator); + } + }); + } + + // We use here a bit diff. model as with other historical data alerts/warnings as we do not store it in the data + // object as we do with normal inventoryItems. So the historical error msg are not available in the json file. + // If we need it we have to move that handling here to the InventoryMonitor and change the data model to support the + // missing data for error messages. + private String getErrorMsgLine(NodeAddress seedNode, + RequestInfo requestInfo, + Map> map) { + String errorMessage = requestInfo.hasError() ? requestInfo.getErrorMessage() : "-"; + List requestInfoList = map.get(seedNode); + List errorsAtRequestNumber = new ArrayList<>(); + String historicalErrorsHtml = ""; + if (requestInfoList != null) { + for (int i = 0; i < requestInfoList.size(); i++) { + RequestInfo requestInfo1 = requestInfoList.get(i); + + // We ignore old errors as at startup timeouts are expected and each node restarts once a day + long duration = System.currentTimeMillis() - requestInfo1.getRequestStartTime(); + if (requestInfo1.getRequestStartTime() > 0 && duration > TimeUnit.HOURS.toMillis(24)) { + continue; + } + + if (requestInfo1.hasError()) { + errorsAtRequestNumber.add((i + 1) + " (" + requestInfo1.getErrorMessage() + ")"); + } + } + + if (!errorsAtRequestNumber.isEmpty()) { + String errorIcon; + String type; + String style; + if (errorsAtRequestNumber.size() > 4) { + errorIcon = ALERT_ICON; + type = "alert"; + style = "alert"; + } else { + errorIcon = WARNING_ICON; + type = "warning"; + style = "warn"; + } + String historicalAlerts = errorsAtRequestNumber.size() + " repeated " + type + "(s) at request(s): " + + Joiner.on(", ").join(errorsAtRequestNumber); + historicalErrorsHtml = errorsAtRequestNumber.isEmpty() ? "" : + ", " + errorIcon + + errorsAtRequestNumber.size() + ""; + } + } + DeviationSeverity deviationSeverity = requestInfo.hasError() ? + errorsAtRequestNumber.size() > 4 ? DeviationSeverity.ALERT : DeviationSeverity.WARN + : DeviationSeverity.OK; + + return "Error message: " + + getColorTagByDeviationSeverity(deviationSeverity) + + errorMessage + + historicalErrorsHtml + + CLOSE_TAG; + } +} diff --git a/inventory/src/main/resources/inv_btc_mainnet.seednodes b/inventory/src/main/resources/inv_btc_mainnet.seednodes new file mode 100644 index 0000000000..71d85b4247 --- /dev/null +++ b/inventory/src/main/resources/inv_btc_mainnet.seednodes @@ -0,0 +1,17 @@ +# nodeaddress.onion:port [(@owner,@backup)] +wizseedscybbttk4bmb2lzvbuk2jtect37lcpva4l3twktmkzemwbead.onion:8000 (@wiz) +wizseed3d376esppbmbjxk2fhk2jg5fpucddrzj2kxtbxbx4vrnwclad.onion:8000 (@wiz) +wizseed7ab2gi3x267xahrp2pkndyrovczezzb46jk6quvguciuyqrid.onion:8000 (@wiz) +sn3emzy56u3mxzsr4geysc52feoq5qt7ja56km6gygwnszkshunn2sid.onion:8000 (@emzy) +sn4emzywye3dhjouv7jig677qepg7fnusjidw74fbwneieruhmi7fuyd.onion:8000 (@emzy) +sn5emzyvxuildv34n6jewfp2zeota4aq63fsl5yyilnvksezr3htveqd.onion:8000 (@emzy) +sn2bisqad7ncazupgbd3dcedqh5ptirgwofw63djwpdtftwhddo75oid.onion:8000 (@miker) +sn3bsq3evqkpshdmc3sbdxafkhfnk7ctop44jsxbxyys5ridsaw5abyd.onion:8000 (@miker) +sn4bsqpc7eb2ntvpsycxbzqt6fre72l4krp2fl5svphfh2eusrqtq3qd.onion:8000 (@miker) +devinv3rhon24gqf5v6ondoqgyrbzyqihzyouzv7ptltsewhfmox2zqd.onion:8000 (@devinbileck) +devinsn2teu33efff62bnvwbxmfgbfjlgqsu3ad4b4fudx3a725eqnyd.onion:8000 (@devinbileck) +devinsn3xuzxhj6pmammrxpydhwwmwp75qkksedo5dn2tlmu7jggo7id.onion:8000 (@devinbileck) +723ljisnynbtdohi.onion:8000 (@emzy) +s67qglwhkgkyvr74.onion:8000 (@emzy) +5quyxpxheyvzmb2d.onion:8000 (@miker) +rm7b56wbrcczpjvl.onion:8000 (@miker) diff --git a/inventory/src/main/resources/logback.xml b/inventory/src/main/resources/logback.xml new file mode 100644 index 0000000000..6b05588a4f --- /dev/null +++ b/inventory/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + %highlight(%d{MMM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{30}: %msg %xEx%n) + + + + + + + + + + + diff --git a/monitor/src/main/java/bisq/monitor/AvailableTor.java b/monitor/src/main/java/bisq/monitor/AvailableTor.java index 650425fca5..0c79ec48e3 100644 --- a/monitor/src/main/java/bisq/monitor/AvailableTor.java +++ b/monitor/src/main/java/bisq/monitor/AvailableTor.java @@ -17,13 +17,15 @@ package bisq.monitor; -import java.io.File; -import org.berndpruenster.netlayer.tor.Tor; import bisq.network.p2p.network.TorMode; +import org.berndpruenster.netlayer.tor.Tor; + +import java.io.File; + /** * This class uses an already defined Tor via Tor.getDefault() - * + * * @author Florian Reimair * */ diff --git a/monitor/src/main/java/bisq/monitor/Metric.java b/monitor/src/main/java/bisq/monitor/Metric.java index df7186f2a0..a54a99e962 100644 --- a/monitor/src/main/java/bisq/monitor/Metric.java +++ b/monitor/src/main/java/bisq/monitor/Metric.java @@ -122,11 +122,11 @@ public abstract class Metric extends Configurable implements Runnable { // execute all the things synchronized (this) { - log.info("{} started", getName()); - execute(); - log.info("{} done", getName()); + log.info("{} started", getName()); + execute(); + log.info("{} done", getName()); } - } catch(Throwable e) { + } catch (Throwable e) { log.error("A metric misbehaved!", e); } } diff --git a/monitor/src/main/java/bisq/monitor/Monitor.java b/monitor/src/main/java/bisq/monitor/Monitor.java index c382b82cf2..ea6b0db361 100644 --- a/monitor/src/main/java/bisq/monitor/Monitor.java +++ b/monitor/src/main/java/bisq/monitor/Monitor.java @@ -81,6 +81,7 @@ public class Monitor { // start Tor Tor.setDefault(new NativeTor(TOR_WORKING_DIR, null, null, false)); + //noinspection deprecation,deprecation,deprecation,deprecation,deprecation,deprecation,deprecation,deprecation Capabilities.app.addAll(Capability.TRADE_STATISTICS, Capability.TRADE_STATISTICS_2, Capability.ACCOUNT_AGE_WITNESS, diff --git a/monitor/src/main/java/bisq/monitor/OnionParser.java b/monitor/src/main/java/bisq/monitor/OnionParser.java index e5a984446f..58f186f068 100644 --- a/monitor/src/main/java/bisq/monitor/OnionParser.java +++ b/monitor/src/main/java/bisq/monitor/OnionParser.java @@ -17,11 +17,11 @@ package bisq.monitor; +import bisq.network.p2p.NodeAddress; + import java.net.MalformedURLException; import java.net.URL; -import bisq.network.p2p.NodeAddress; - /** * Helper for parsing and pretty printing onion addresses. * diff --git a/monitor/src/main/java/bisq/monitor/StatisticsHelper.java b/monitor/src/main/java/bisq/monitor/StatisticsHelper.java index 90064f2278..c73c904ff2 100644 --- a/monitor/src/main/java/bisq/monitor/StatisticsHelper.java +++ b/monitor/src/main/java/bisq/monitor/StatisticsHelper.java @@ -17,6 +17,8 @@ package bisq.monitor; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -31,7 +33,9 @@ import java.util.Map; */ public class StatisticsHelper { - public static Map process(List samples) { + public static Map process(Collection input) { + + List samples = new ArrayList<>(input); // aftermath Collections.sort(samples); diff --git a/monitor/src/main/java/bisq/monitor/ThreadGate.java b/monitor/src/main/java/bisq/monitor/ThreadGate.java index 9055ddf876..60fa1586e3 100644 --- a/monitor/src/main/java/bisq/monitor/ThreadGate.java +++ b/monitor/src/main/java/bisq/monitor/ThreadGate.java @@ -41,7 +41,7 @@ public class ThreadGate { /** * Make everyone wait until the gate is open again. - * + * * @param numberOfLocks how often the gate has to be unlocked until the gate * opens. */ @@ -57,7 +57,7 @@ public class ThreadGate { while (lock.getCount() > 0) try { if (!lock.await(60, TimeUnit.SECONDS)) { - log.warn("timeout occured!"); + log.warn("timeout occurred!"); break; // break the loop } } catch (InterruptedException ignore) { diff --git a/monitor/src/main/java/bisq/monitor/metric/MarketStats.java b/monitor/src/main/java/bisq/monitor/metric/MarketStats.java index f831cafd13..f54c862446 100644 --- a/monitor/src/main/java/bisq/monitor/metric/MarketStats.java +++ b/monitor/src/main/java/bisq/monitor/metric/MarketStats.java @@ -44,14 +44,13 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j public class MarketStats extends Metric { - + private static final String MARKETS_BISQ_NETWORK = "https://markets.bisq.network"; // poor mans JSON parser private final Pattern marketPattern = Pattern.compile("\"market\" ?: ?\"([a-z_]+)\""); private final Pattern amountPattern = Pattern.compile("\"amount\" ?: ?\"([\\d\\.]+)\""); private final Pattern volumePattern = Pattern.compile("\"volume\" ?: ?\"([\\d\\.]+)\""); private final Pattern timestampPattern = Pattern.compile("\"trade_date\" ?: ?([\\d]+)"); - private final String marketApi = "https://markets.bisq.network"; private Long lastRun = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(15)); public MarketStats(Reporter reporter) { @@ -65,12 +64,12 @@ public class MarketStats extends Metric { Map result = new HashMap<>(); // assemble query - Long now = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()); + long now = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()); String query = "/api/trades?format=json&market=all×tamp_from=" + lastRun + "×tamp_to=" + now; lastRun = now; // thought about adding 1 second but what if a trade is done exactly in this one second? // connect - URLConnection connection = new URL(marketApi + query).openConnection(); + URLConnection connection = new URL(MARKETS_BISQ_NETWORK + query).openConnection(); // prepare to receive data BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java b/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java index 0f7e8afb83..8115c1015d 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java @@ -17,13 +17,9 @@ package bisq.monitor.metric; -import bisq.monitor.OnionParser; import bisq.monitor.Reporter; -import bisq.core.account.witness.AccountAgeWitnessStore; import bisq.core.offer.OfferPayload; -import bisq.core.proto.persistable.CorePersistenceProtoResolver; -import bisq.core.trade.statistics.TradeStatistics3Store; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.network.Connection; @@ -32,23 +28,15 @@ import bisq.network.p2p.peers.getdata.messages.PreliminaryGetDataRequest; import bisq.network.p2p.storage.payload.ProtectedStorageEntry; import bisq.network.p2p.storage.payload.ProtectedStoragePayload; -import bisq.common.app.Version; -import bisq.common.config.BaseCurrencyNetwork; -import bisq.common.persistence.PersistenceManager; import bisq.common.proto.network.NetworkEnvelope; -import bisq.common.proto.persistable.PersistableEnvelope; - -import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Properties; +import java.util.Optional; import java.util.Random; import java.util.Set; -import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -63,16 +51,16 @@ import static com.google.common.base.Preconditions.checkNotNull; */ @Slf4j public class P2PMarketStats extends P2PSeedNodeSnapshotBase { - private static final String DATABASE_DIR = "run.dbDir"; - - private final Set hashes = new TreeSet<>(Arrays::compare); - - final Map> versionBucketsPerHost = new ConcurrentHashMap<>(); + final Map> versionBucketsPerHost = new ConcurrentHashMap<>(); + final Map> offerVolumeBucketsPerHost = new ConcurrentHashMap<>(); + final Map>> offerVolumeDistributionBucketsPerHost = new ConcurrentHashMap<>(); + final Map>> offersPerTraderBucketsPerHost = new ConcurrentHashMap<>(); + final Map>> volumePerTraderBucketsPerHost = new ConcurrentHashMap<>(); /** - * Efficient way to count occurrences. + * Efficient way to aggregate numbers. */ - private class Counter { + private static class Aggregator { private long value = 0; synchronized long value() { @@ -82,47 +70,75 @@ public class P2PMarketStats extends P2PSeedNodeSnapshotBase { synchronized void increment() { value++; } + + synchronized void add(long amount) { + value += amount; + } } - private class MyStatistics implements Statistics { - private final Map buckets = new HashMap<>(); - - @Override - public Statistics create() { - return new MyStatistics(); - } - + private abstract static class OfferStatistics extends Statistics { @Override public synchronized void log(Object message) { - - if(message instanceof OfferPayload) { + if (message instanceof OfferPayload) { OfferPayload currentMessage = (OfferPayload) message; // For logging different data types String market = currentMessage.getDirection() + "." + currentMessage.getBaseCurrencyCode() + "_" + currentMessage.getCounterCurrencyCode(); - buckets.putIfAbsent(market, new Counter()); - buckets.get(market).increment(); + process(market, currentMessage); } } - @Override - public Map values() { - return buckets; - } + abstract void process(String market, OfferPayload currentMessage); + } + + private class OfferCountStatistics extends OfferStatistics { @Override - public void reset() { - buckets.clear(); + void process(String market, OfferPayload currentMessage) { + buckets.putIfAbsent(market, new Aggregator()); + buckets.get(market).increment(); } } - private class VersionsStatistics implements Statistics { - private final Map buckets = new HashMap<>(); + private class OfferVolumeStatistics extends OfferStatistics { @Override - public Statistics create() { - return new VersionsStatistics(); + void process(String market, OfferPayload currentMessage) { + buckets.putIfAbsent(market, new Aggregator()); + buckets.get(market).add(currentMessage.getAmount()); } + } + + private class OfferVolumeDistributionStatistics extends OfferStatistics> { + + @Override + void process(String market, OfferPayload currentMessage) { + buckets.putIfAbsent(market, new ArrayList<>()); + buckets.get(market).add(currentMessage.getAmount()); + } + } + + private class OffersPerTraderStatistics extends OfferStatistics> { + + @Override + void process(String market, OfferPayload currentMessage) { + buckets.putIfAbsent(market, new HashMap<>()); + buckets.get(market).putIfAbsent(currentMessage.getOwnerNodeAddress(), new Aggregator()); + buckets.get(market).get(currentMessage.getOwnerNodeAddress()).increment(); + } + } + + private class VolumePerTraderStatistics extends OfferStatistics> { + + @Override + void process(String market, OfferPayload currentMessage) { + buckets.putIfAbsent(market, new HashMap<>()); + buckets.get(market).putIfAbsent(currentMessage.getOwnerNodeAddress(), new Aggregator()); + buckets.get(market).get(currentMessage.getOwnerNodeAddress()).add(currentMessage.getAmount()); + } + } + + private class VersionsStatistics extends Statistics { @Override public void log(Object message) { @@ -132,47 +148,14 @@ public class P2PMarketStats extends P2PSeedNodeSnapshotBase { String version = "v" + currentMessage.getId().substring(currentMessage.getId().lastIndexOf("-") + 1); - buckets.putIfAbsent(version, new Counter()); + buckets.putIfAbsent(version, new Aggregator()); buckets.get(version).increment(); } } - - @Override - public Map values() { - return buckets; - } - - @Override - public void reset() { - buckets.clear(); - } } public P2PMarketStats(Reporter graphiteReporter) { super(graphiteReporter); - - statistics = new MyStatistics(); - } - - @Override - public void configure(Properties properties) { - super.configure(properties); - - if (hashes.isEmpty() && configuration.getProperty(DATABASE_DIR) != null) { - File dir = new File(configuration.getProperty(DATABASE_DIR)); - String networkPostfix = "_" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].toString(); - try { - PersistenceManager persistenceManager = new PersistenceManager<>(dir, new CorePersistenceProtoResolver(null, null), null); - TradeStatistics3Store tradeStatistics3Store = (TradeStatistics3Store) persistenceManager.getPersisted(TradeStatistics3Store.class.getSimpleName() + networkPostfix); - hashes.addAll(tradeStatistics3Store.getMap().keySet().stream().map(byteArray -> byteArray.bytes).collect(Collectors.toList())); - - AccountAgeWitnessStore accountAgeWitnessStore = (AccountAgeWitnessStore) persistenceManager.getPersisted(AccountAgeWitnessStore.class.getSimpleName() + networkPostfix); - hashes.addAll(accountAgeWitnessStore.getMap().keySet().stream().map(byteArray -> byteArray.bytes).collect(Collectors.toList())); - } catch (NullPointerException e) { - // in case there is no store file - log.error("There is no storage file where there should be one: {}", dir.getAbsolutePath()); - } - } } @Override @@ -185,16 +168,65 @@ public class P2PMarketStats extends P2PSeedNodeSnapshotBase { return result; } + protected void createHistogram(List input, String market, Map report) { + int numberOfBins = 5; + + // - get biggest offer + double max = input.stream().max(Long::compareTo).map(value -> value * 1.01).orElse(0.0); + + // - create histogram + input.stream().collect( + Collectors.groupingBy(aLong -> aLong == max ? numberOfBins - 1 : (int) Math.floor(aLong / (max / numberOfBins)), Collectors.counting())). + forEach((integer, integer2) -> report.put(market + ".bin_" + integer, String.valueOf(integer2))); + + report.put(market + ".number_of_bins", String.valueOf(numberOfBins)); + report.put(market + ".max", String.valueOf((int) max)); + } + @Override protected void report() { Map report = new HashMap<>(); - bucketsPerHost.forEach((host, statistics) -> statistics.values().forEach((market, numberOfOffers) -> report.put(OnionParser.prettyPrint(host) + "." + market, String.valueOf(((Counter) numberOfOffers).value())))); + bucketsPerHost.values().stream().findFirst().ifPresent(nodeAddressStatisticsEntry -> nodeAddressStatisticsEntry.values().forEach((market, numberOfOffers) -> report.put(market, String.valueOf(((Aggregator) numberOfOffers).value())))); + reporter.report(report, getName() + ".offerCount"); - reporter.report(report, getName()); + // do offerbook volume statistics + report.clear(); + offerVolumeBucketsPerHost.values().stream().findFirst().ifPresent(aggregatorStatistics -> aggregatorStatistics.values().forEach((market, numberOfOffers) -> report.put(market, String.valueOf(numberOfOffers.value())))); + reporter.report(report, getName() + ".volume"); + + // do the offer vs volume histogram + report.clear(); + // - get a data set + offerVolumeDistributionBucketsPerHost.values().stream().findFirst().ifPresent(listStatistics -> listStatistics.values().forEach((market, offers) -> { + createHistogram(offers, market, report); + })); + reporter.report(report, getName() + ".volume-per-offer-distribution"); + + // do offers per trader + report.clear(); + // - get a data set + offersPerTraderBucketsPerHost.values().stream().findFirst().ifPresent(mapStatistics -> mapStatistics.values().forEach((market, stuff) -> { + List offerPerTrader = stuff.values().stream().map(Aggregator::value).collect(Collectors.toList()); + + createHistogram(offerPerTrader, market, report); + })); + reporter.report(report, getName() + ".traders_by_number_of_offers"); + + // do volume per trader + report.clear(); + // - get a data set + volumePerTraderBucketsPerHost.values().stream().findFirst().ifPresent(mapStatistics -> mapStatistics.values().forEach((market, stuff) -> { + List volumePerTrader = stuff.values().stream().map(Aggregator::value).collect(Collectors.toList()); + + createHistogram(volumePerTrader, market, report); + })); + reporter.report(report, getName() + ".traders_by_volume"); // do version statistics report.clear(); - versionBucketsPerHost.values().stream().findAny().get().values().forEach((version, numberOfOccurrences) -> report.put(version, String.valueOf(numberOfOccurrences.value()))); + Optional> optionalStatistics = versionBucketsPerHost.values().stream().findAny(); + optionalStatistics.ifPresent(aggregatorStatistics -> aggregatorStatistics.values() + .forEach((version, numberOfOccurrences) -> report.put(version, String.valueOf(numberOfOccurrences.value())))); reporter.report(report, "versions"); } @@ -204,8 +236,12 @@ public class P2PMarketStats extends P2PSeedNodeSnapshotBase { if (networkEnvelope instanceof GetDataResponse) { - Statistics result = this.statistics.create(); - VersionsStatistics versions = new VersionsStatistics(); + Statistics offerCount = new OfferCountStatistics(); + Statistics offerVolume = new OfferVolumeStatistics(); + Statistics offerVolumeDistribution = new OfferVolumeDistributionStatistics(); + Statistics offersPerTrader = new OffersPerTraderStatistics(); + Statistics volumePerTrader = new VolumePerTraderStatistics(); + Statistics versions = new VersionsStatistics(); GetDataResponse dataResponse = (GetDataResponse) networkEnvelope; final Set dataSet = dataResponse.getDataSet(); @@ -216,7 +252,11 @@ public class P2PMarketStats extends P2PSeedNodeSnapshotBase { return; } - result.log(protectedStoragePayload); + offerCount.log(protectedStoragePayload); + offerVolume.log(protectedStoragePayload); + offerVolumeDistribution.log(protectedStoragePayload); + offersPerTrader.log(protectedStoragePayload); + volumePerTrader.log(protectedStoragePayload); versions.log(protectedStoragePayload); }); @@ -230,7 +270,11 @@ public class P2PMarketStats extends P2PSeedNodeSnapshotBase { hashes.add(persistableNetworkPayload.getHash()); }); - bucketsPerHost.put(connection.getPeersNodeAddressProperty().getValue(), result); + bucketsPerHost.put(connection.getPeersNodeAddressProperty().getValue(), offerCount); + offerVolumeBucketsPerHost.put(connection.getPeersNodeAddressProperty().getValue(), offerVolume); + offerVolumeDistributionBucketsPerHost.put(connection.getPeersNodeAddressProperty().getValue(), offerVolumeDistribution); + offersPerTraderBucketsPerHost.put(connection.getPeersNodeAddressProperty().getValue(), offersPerTrader); + volumePerTraderBucketsPerHost.put(connection.getPeersNodeAddressProperty().getValue(), volumePerTrader); versionBucketsPerHost.put(connection.getPeersNodeAddressProperty().getValue(), versions); return true; } diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java index 4a231d8da6..8c3eab2e63 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java @@ -91,7 +91,7 @@ public class P2PNetworkLoad extends Metric implements MessageListener, SetupList * History implementation using a {@link LinkedHashMap} and its * {@link LinkedHashMap#removeEldestEntry(Map.Entry)} option. */ - private class FixedSizeHistoryTracker extends LinkedHashMap { + private static class FixedSizeHistoryTracker extends LinkedHashMap { final int historySize; FixedSizeHistoryTracker(int historySize) { @@ -123,7 +123,6 @@ public class P2PNetworkLoad extends Metric implements MessageListener, SetupList hsReady.await(); // boot up P2P node - File storageDir = torHiddenServiceDir; try { Config config = new Config(); CorruptedStorageFileHandler corruptedStorageFileHandler = new CorruptedStorageFileHandler(); @@ -133,10 +132,11 @@ public class P2PNetworkLoad extends Metric implements MessageListener, SetupList networkProtoResolver); DefaultSeedNodeRepository seedNodeRepository = new DefaultSeedNodeRepository(config); PeerManager peerManager = new PeerManager(networkNode, seedNodeRepository, new ClockWatcher(), - new PersistenceManager<>(storageDir, persistenceProtoResolver, corruptedStorageFileHandler), maxConnections); + new PersistenceManager<>(torHiddenServiceDir, persistenceProtoResolver, corruptedStorageFileHandler), maxConnections); // init file storage - peerManager.readPersisted(); + peerManager.readPersisted(() -> { + }); PeerExchangeManager peerExchangeManager = new PeerExchangeManager(networkNode, seedNodeRepository, peerManager); @@ -156,7 +156,7 @@ public class P2PNetworkLoad extends Metric implements MessageListener, SetupList // report Map report = new HashMap<>(); - if(lastRun != 0 && System.currentTimeMillis() - lastRun != 0) { + if (lastRun != 0 && System.currentTimeMillis() - lastRun != 0) { // - normalize to data/minute double perMinuteFactor = 60000.0 / (System.currentTimeMillis() - lastRun); @@ -194,7 +194,7 @@ public class P2PNetworkLoad extends Metric implements MessageListener, SetupList /** * Efficient way to count message occurrences. */ - private class Counter { + private static class Counter { private int value = 1; /** @@ -219,7 +219,7 @@ public class P2PNetworkLoad extends Metric implements MessageListener, SetupList public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { if (networkEnvelope instanceof BroadcastMessage) { try { - if(history.get(networkEnvelope.hashCode()) == null) { + if (history.get(networkEnvelope.hashCode()) == null) { history.put(networkEnvelope.hashCode(), null); buckets.get(networkEnvelope.getClass().getSimpleName()).increment(); } diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PRoundTripTime.java b/monitor/src/main/java/bisq/monitor/metric/P2PRoundTripTime.java index a0c1fc0a96..bef8ad22f5 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PRoundTripTime.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PRoundTripTime.java @@ -40,7 +40,7 @@ import static com.google.common.base.Preconditions.checkNotNull; public class P2PRoundTripTime extends P2PSeedNodeSnapshotBase { private static final String SAMPLE_SIZE = "run.sampleSize"; - private Map sentAt = new HashMap<>(); + private final Map sentAt = new HashMap<>(); private Map measurements = new HashMap<>(); public P2PRoundTripTime(Reporter reporter) { @@ -57,7 +57,7 @@ public class P2PRoundTripTime extends P2PSeedNodeSnapshotBase { public synchronized void log(Object message) { Pong pong = (Pong) message; Long start = sentAt.get(pong.getRequestNonce()); - if(start != null) + if (start != null) samples.add(System.currentTimeMillis() - start); } diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java index 2ca12716f0..3072abea39 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java @@ -20,14 +20,11 @@ package bisq.monitor.metric; import bisq.monitor.OnionParser; import bisq.monitor.Reporter; -import bisq.core.account.witness.AccountAgeWitnessStore; import bisq.core.dao.monitoring.model.StateHash; import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesRequest; import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesRequest; import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesRequest; import bisq.core.dao.monitoring.network.messages.GetStateHashesResponse; -import bisq.core.proto.persistable.CorePersistenceProtoResolver; -import bisq.core.trade.statistics.TradeStatistics3Store; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.network.Connection; @@ -36,18 +33,12 @@ import bisq.network.p2p.peers.getdata.messages.PreliminaryGetDataRequest; import bisq.network.p2p.storage.payload.ProtectedStorageEntry; import bisq.network.p2p.storage.payload.ProtectedStoragePayload; -import bisq.common.app.Version; -import bisq.common.config.BaseCurrencyNetwork; -import bisq.common.persistence.PersistenceManager; import bisq.common.proto.network.NetworkEnvelope; -import bisq.common.proto.persistable.PersistableEnvelope; import java.net.MalformedURLException; import java.nio.ByteBuffer; -import java.io.File; - import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -55,12 +46,9 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Properties; import java.util.Random; import java.util.Set; -import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -80,11 +68,8 @@ import static com.google.common.base.Preconditions.checkNotNull; */ @Slf4j public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { - private static final String DATABASE_DIR = "run.dbDir"; - Statistics statistics; final Map>> bucketsPerHost = new ConcurrentHashMap<>(); - protected final Set hashes = new TreeSet<>(Arrays::compare); private int daostateheight = 594000; private int proposalheight = daostateheight; private int blindvoteheight = daostateheight; @@ -92,14 +77,7 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { /** * Use a counter to do statistics. */ - private class MyStatistics implements Statistics> { - - private final Map> buckets = new HashMap<>(); - - @Override - public Statistics create() { - return new MyStatistics(); - } + private static class MyStatistics extends Statistics> { @Override public synchronized void log(Object message) { @@ -110,43 +88,10 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { buckets.putIfAbsent(className, new HashSet<>()); buckets.get(className).add(message.hashCode()); } - - @Override - public Map> values() { - return buckets; - } - - @Override - public synchronized void reset() { - buckets.clear(); - } } public P2PSeedNodeSnapshot(Reporter reporter) { super(reporter); - - statistics = new MyStatistics(); - } - - @Override - public void configure(Properties properties) { - super.configure(properties); - - if (hashes.isEmpty() && configuration.getProperty(DATABASE_DIR) != null) { - File dir = new File(configuration.getProperty(DATABASE_DIR)); - String networkPostfix = "_" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].toString(); - try { - PersistenceManager persistenceManager = new PersistenceManager<>(dir, new CorePersistenceProtoResolver(null, null), null); - TradeStatistics3Store tradeStatistics3Store = (TradeStatistics3Store) persistenceManager.getPersisted(TradeStatistics3Store.class.getSimpleName() + networkPostfix); - hashes.addAll(tradeStatistics3Store.getMap().keySet().stream().map(byteArray -> byteArray.bytes).collect(Collectors.toList())); - - AccountAgeWitnessStore accountAgeWitnessStore = (AccountAgeWitnessStore) persistenceManager.getPersisted(AccountAgeWitnessStore.class.getSimpleName() + networkPostfix); - hashes.addAll(accountAgeWitnessStore.getMap().keySet().stream().map(byteArray -> byteArray.bytes).collect(Collectors.toList())); - } catch (NullPointerException e) { - // in case there is no store file - log.error("There is no storage file where there should be one: {}", dir.getAbsolutePath()); - } - } } protected List getRequests() { @@ -195,8 +140,8 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { try { report.put(OnionParser.prettyPrint(host) + ".relativeNumberOfMessages." + messageType, String.valueOf(set.size() - referenceValues.get(messageType).size())); - } catch (MalformedURLException | NullPointerException ignore) { - log.error("we should never have gotten here", ignore); + } catch (MalformedURLException | NullPointerException e) { + log.error("we should never have gotten here", e); } }); try { @@ -229,8 +174,12 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { // - process dao data perType.forEach((type, nodeAddressTupleMap) -> { // - find head - int head = (int) nodeAddressTupleMap.values().stream().max(Comparator.comparingLong(Tuple::getHeight)).get().height; - int oldest = (int) nodeAddressTupleMap.values().stream().min(Comparator.comparingLong(Tuple::getHeight)).get().height; + int head = nodeAddressTupleMap.values().stream().max(Comparator.comparingLong(Tuple::getHeight)) + .map(value -> (int) value.height) + .orElse(0); + int oldest = nodeAddressTupleMap.values().stream().min(Comparator.comparingLong(Tuple::getHeight)) + .map(value -> (int) value.height) + .orElse(0); // - update queried height if (type.contains("DaoState")) @@ -253,9 +202,14 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { hitcount.put(hash, 1); }); - List states = hitcount.entrySet().stream().sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())).map(byteBufferIntegerEntry -> byteBufferIntegerEntry.getKey()).collect(Collectors.toList()); hitcount.clear(); - nodeAddressTupleMap.forEach((nodeAddress, tuple) -> daoreport.put(type + "." + OnionParser.prettyPrint(nodeAddress) + ".hash", Integer.toString(Arrays.asList(states.toArray()).indexOf(ByteBuffer.wrap(tuple.hash))))); + + nodeAddressTupleMap.forEach((nodeAddress, tuple) -> + daoreport.put(type + "." + OnionParser.prettyPrint(nodeAddress) + ".hash", + Integer.toString(Arrays.asList(hitcount.entrySet().stream() + .sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())) + .map(Map.Entry::getKey).toArray()).indexOf(ByteBuffer + .wrap(tuple.hash))))); // - report reference head daoreport.put(type + ".referenceHead", Integer.toString(head)); @@ -267,7 +221,7 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { reporter.report(daoreport, "DaoStateSnapshot"); } - private class Tuple { + private static class Tuple { @Getter private final long height; private final byte[] hash; @@ -278,14 +232,7 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { } } - private class DaoStatistics implements Statistics { - - Map buckets = new ConcurrentHashMap<>(); - - @Override - public Statistics create() { - return new DaoStatistics(); - } + private class DaoStatistics extends Statistics { @Override public void log(Object message) { @@ -297,19 +244,9 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { buckets.putIfAbsent(className, new Tuple(last.getHeight(), last.getHash())); } - - @Override - public Map values() { - return buckets; - } - - @Override - public void reset() { - buckets.clear(); - } } - private Map> daoData = new ConcurrentHashMap<>(); + private final Map> daoData = new ConcurrentHashMap<>(); protected boolean treatMessage(NetworkEnvelope networkEnvelope, Connection connection) { checkNotNull(connection.getPeersNodeAddressProperty(), @@ -317,7 +254,7 @@ public class P2PSeedNodeSnapshot extends P2PSeedNodeSnapshotBase { if (networkEnvelope instanceof GetDataResponse) { - Statistics result = this.statistics.create(); + Statistics result = new MyStatistics(); GetDataResponse dataResponse = (GetDataResponse) networkEnvelope; final Set dataSet = dataResponse.getDataSet(); diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshotBase.java b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshotBase.java index b458cfe6e7..fa37505fb5 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshotBase.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshotBase.java @@ -24,7 +24,10 @@ import bisq.monitor.OnionParser; import bisq.monitor.Reporter; import bisq.monitor.ThreadGate; +import bisq.core.account.witness.AccountAgeWitnessStore; import bisq.core.proto.network.CoreNetworkProtoResolver; +import bisq.core.proto.persistable.CorePersistenceProtoResolver; +import bisq.core.trade.statistics.TradeStatistics3Store; import bisq.network.p2p.CloseConnectionMessage; import bisq.network.p2p.NodeAddress; @@ -33,6 +36,9 @@ import bisq.network.p2p.network.MessageListener; import bisq.network.p2p.network.NetworkNode; import bisq.network.p2p.network.TorNetworkNode; +import bisq.common.app.Version; +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.persistence.PersistenceManager; import bisq.common.proto.network.NetworkEnvelope; import com.google.common.util.concurrent.FutureCallback; @@ -42,10 +48,18 @@ import com.google.common.util.concurrent.SettableFuture; import java.time.Clock; +import java.io.File; + import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; @@ -65,30 +79,77 @@ public abstract class P2PSeedNodeSnapshotBase extends Metric implements MessageL private static final String HOSTS = "run.hosts"; private static final String TOR_PROXY_PORT = "run.torProxyPort"; - Statistics statistics; + private static final String DATABASE_DIR = "run.dbDir"; final Map> bucketsPerHost = new ConcurrentHashMap<>(); private final ThreadGate gate = new ThreadGate(); + protected final Set hashes = new TreeSet<>(Arrays::compare); /** * Statistics Interface for use with derived classes. * * @param the value type of the statistics implementation */ - protected interface Statistics { + protected abstract static class Statistics { + protected final Map buckets = new HashMap<>(); - Statistics create(); + abstract void log(Object message); - void log(Object message); + Map values() { + return buckets; + } - Map values(); - - void reset(); + void reset() { + buckets.clear(); + } } public P2PSeedNodeSnapshotBase(Reporter reporter) { super(reporter); } + @Override + public void configure(Properties properties) { + super.configure(properties); + + if (hashes.isEmpty() && configuration.getProperty(DATABASE_DIR) != null) { + File dir = new File(configuration.getProperty(DATABASE_DIR)); + String networkPostfix = "_" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].toString(); + try { + CorePersistenceProtoResolver persistenceProtoResolver = new CorePersistenceProtoResolver(null, null); + + //TODO will not work with historical data... should be refactored to re-use code for reading resource files + TradeStatistics3Store tradeStatistics3Store = new TradeStatistics3Store(); + PersistenceManager tradeStatistics3PersistenceManager = new PersistenceManager<>(dir, + persistenceProtoResolver, null); + tradeStatistics3PersistenceManager.initialize(tradeStatistics3Store, + tradeStatistics3Store.getDefaultStorageFileName() + networkPostfix, + PersistenceManager.Source.NETWORK); + TradeStatistics3Store persistedTradeStatistics3Store = tradeStatistics3PersistenceManager.getPersisted(); + if (persistedTradeStatistics3Store != null) { + tradeStatistics3Store.getMap().putAll(persistedTradeStatistics3Store.getMap()); + } + hashes.addAll(tradeStatistics3Store.getMap().keySet().stream() + .map(byteArray -> byteArray.bytes).collect(Collectors.toSet())); + + AccountAgeWitnessStore accountAgeWitnessStore = new AccountAgeWitnessStore(); + PersistenceManager accountAgeWitnessPersistenceManager = new PersistenceManager<>(dir, + persistenceProtoResolver, null); + accountAgeWitnessPersistenceManager.initialize(accountAgeWitnessStore, + accountAgeWitnessStore.getDefaultStorageFileName() + networkPostfix, + PersistenceManager.Source.NETWORK); + AccountAgeWitnessStore persistedAccountAgeWitnessStore = accountAgeWitnessPersistenceManager.getPersisted(); + if (persistedAccountAgeWitnessStore != null) { + accountAgeWitnessStore.getMap().putAll(persistedAccountAgeWitnessStore.getMap()); + } + hashes.addAll(accountAgeWitnessStore.getMap().keySet().stream() + .map(byteArray -> byteArray.bytes).collect(Collectors.toSet())); + } catch (NullPointerException e) { + // in case there is no store file + log.error("There is no storage file where there should be one: {}", dir.getAbsolutePath()); + } + } + } + @Override protected void execute() { // start the network node @@ -116,32 +177,32 @@ public abstract class P2PSeedNodeSnapshotBase extends Metric implements MessageL for (String current : configuration.getProperty(HOSTS, "").split(",")) { threadList.add(new Thread(() -> { - try { - // parse Url - NodeAddress target = OnionParser.getNodeAddress(current); + try { + // parse Url + NodeAddress target = OnionParser.getNodeAddress(current); - // do the data request - aboutToSend(message); - SettableFuture future = networkNode.sendMessage(target, message); + // do the data request + aboutToSend(message); + SettableFuture future = networkNode.sendMessage(target, message); - Futures.addCallback(future, new FutureCallback<>() { - @Override - public void onSuccess(Connection connection) { - connection.addMessageListener(P2PSeedNodeSnapshotBase.this); - } + Futures.addCallback(future, new FutureCallback<>() { + @Override + public void onSuccess(Connection connection) { + connection.addMessageListener(P2PSeedNodeSnapshotBase.this); + } - @Override - public void onFailure(@NotNull Throwable throwable) { - gate.proceed(); - log.error( - "Sending {} failed. That is expected if the peer is offline.\n\tException={}", message.getClass().getSimpleName(), throwable.getMessage()); - } - }, MoreExecutors.directExecutor()); + @Override + public void onFailure(@NotNull Throwable throwable) { + gate.proceed(); + log.error( + "Sending {} failed. That is expected if the peer is offline.\n\tException={}", message.getClass().getSimpleName(), throwable.getMessage()); + } + }, MoreExecutors.directExecutor()); - } catch (Exception e) { - gate.proceed(); // release the gate on error - e.printStackTrace(); - } + } catch (Exception e) { + gate.proceed(); // release the gate on error + e.printStackTrace(); + } }, current)); } @@ -155,7 +216,8 @@ public abstract class P2PSeedNodeSnapshotBase extends Metric implements MessageL gate.await(); } - protected void aboutToSend(NetworkEnvelope message) { }; + protected void aboutToSend(NetworkEnvelope message) { + } /** * Report all the stuff. Uses the configured reporter directly. diff --git a/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java b/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java index e6df6fa46e..f34dc2d567 100644 --- a/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java +++ b/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java @@ -19,9 +19,8 @@ package bisq.monitor.reporter; import bisq.monitor.Reporter; -import bisq.common.config.BaseCurrencyNetwork; - import bisq.common.app.Version; +import bisq.common.config.BaseCurrencyNetwork; import java.util.HashMap; import java.util.Map; diff --git a/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java b/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java index 406704bc63..dc0334ff40 100644 --- a/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java +++ b/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java @@ -20,11 +20,10 @@ package bisq.monitor.reporter; import bisq.monitor.OnionParser; import bisq.monitor.Reporter; -import bisq.common.config.BaseCurrencyNetwork; - import bisq.network.p2p.NodeAddress; import bisq.common.app.Version; +import bisq.common.config.BaseCurrencyNetwork; import org.berndpruenster.netlayer.tor.TorSocket; @@ -81,7 +80,7 @@ public class GraphiteReporter extends Reporter { String report = "bisq" + (Version.getBaseCurrencyNetwork() != 0 ? "-" + BaseCurrencyNetwork.values()[Version.getBaseCurrencyNetwork()].getNetwork() : "") + (prefix.isEmpty() ? "" : "." + prefix) + (key.isEmpty() ? "" : "." + key) - + " " + value + " " + Long.valueOf(timeInMilliseconds)/1000 + "\n"; + + " " + value + " " + Long.parseLong(timeInMilliseconds) / 1000 + "\n"; try { NodeAddress nodeAddress = OnionParser.getNodeAddress(configuration.getProperty("serviceUrl")); diff --git a/monitor/src/main/resources/logback.xml b/monitor/src/main/resources/logback.xml index 65f307ab1f..28831d6fc3 100644 --- a/monitor/src/main/resources/logback.xml +++ b/monitor/src/main/resources/logback.xml @@ -1,12 +1,12 @@ - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + diff --git a/monitor/src/test/java/bisq/monitor/MonitorInfrastructureTests.java b/monitor/src/test/java/bisq/monitor/MonitorInfrastructureTests.java index 17d0837a5b..5e1fc24830 100644 --- a/monitor/src/test/java/bisq/monitor/MonitorInfrastructureTests.java +++ b/monitor/src/test/java/bisq/monitor/MonitorInfrastructureTests.java @@ -58,7 +58,7 @@ public class MonitorInfrastructureTests { } @ParameterizedTest - @ValueSource(strings = { "empty", "no interval", "typo" }) + @ValueSource(strings = {"empty", "no interval", "typo"}) public void basicConfigurationError(String configuration) { HashMap lut = new HashMap<>(); lut.put("empty", new Properties()); diff --git a/monitor/src/test/java/bisq/monitor/P2PNetworkLoadTests.java b/monitor/src/test/java/bisq/monitor/P2PNetworkLoadTests.java index 2011e69b0e..25a11f976b 100644 --- a/monitor/src/test/java/bisq/monitor/P2PNetworkLoadTests.java +++ b/monitor/src/test/java/bisq/monitor/P2PNetworkLoadTests.java @@ -20,20 +20,21 @@ package bisq.monitor; import bisq.monitor.metric.P2PNetworkLoad; import bisq.monitor.reporter.ConsoleReporter; -import static com.google.common.base.Preconditions.checkNotNull; +import org.berndpruenster.netlayer.tor.NativeTor; +import org.berndpruenster.netlayer.tor.Tor; +import org.berndpruenster.netlayer.tor.TorCtlException; import java.util.Map; import java.util.Properties; -import org.berndpruenster.netlayer.tor.NativeTor; -import org.berndpruenster.netlayer.tor.Tor; -import org.berndpruenster.netlayer.tor.TorCtlException; import org.junit.Assert; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import static com.google.common.base.Preconditions.checkNotNull; + /** * Test the round trip time metric against the hidden service of tor project.org. * diff --git a/monitor/src/test/java/bisq/monitor/P2PRoundTripTimeTests.java b/monitor/src/test/java/bisq/monitor/P2PRoundTripTimeTests.java index bb97659327..a10dde5809 100644 --- a/monitor/src/test/java/bisq/monitor/P2PRoundTripTimeTests.java +++ b/monitor/src/test/java/bisq/monitor/P2PRoundTripTimeTests.java @@ -20,14 +20,13 @@ package bisq.monitor; import bisq.monitor.metric.P2PRoundTripTime; import bisq.monitor.reporter.ConsoleReporter; -import static com.google.common.base.Preconditions.checkNotNull; +import org.berndpruenster.netlayer.tor.NativeTor; +import org.berndpruenster.netlayer.tor.Tor; +import org.berndpruenster.netlayer.tor.TorCtlException; import java.util.Map; import java.util.Properties; -import org.berndpruenster.netlayer.tor.NativeTor; -import org.berndpruenster.netlayer.tor.Tor; -import org.berndpruenster.netlayer.tor.TorCtlException; import org.junit.Assert; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -35,6 +34,8 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import static com.google.common.base.Preconditions.checkNotNull; + /** * Test the round trip time metric against the hidden service of tor project.org. * diff --git a/monitor/src/test/java/bisq/monitor/PriceNodeStatsTests.java b/monitor/src/test/java/bisq/monitor/PriceNodeStatsTests.java index 1024f5c9a0..b424b9878d 100644 --- a/monitor/src/test/java/bisq/monitor/PriceNodeStatsTests.java +++ b/monitor/src/test/java/bisq/monitor/PriceNodeStatsTests.java @@ -25,7 +25,6 @@ import org.berndpruenster.netlayer.tor.TorCtlException; import java.io.File; -import java.util.HashMap; import java.util.Map; import java.util.Properties; diff --git a/p2p/src/main/java/bisq/network/p2p/AckMessage.java b/p2p/src/main/java/bisq/network/p2p/AckMessage.java index af1815e103..fea3fa0a33 100644 --- a/p2p/src/main/java/bisq/network/p2p/AckMessage.java +++ b/p2p/src/main/java/bisq/network/p2p/AckMessage.java @@ -34,6 +34,10 @@ import lombok.extern.slf4j.Slf4j; import javax.annotation.Nullable; +// TODO ExpirablePayload has no effect here as it is either a direct msg or packed into MailboxStoragePayload +// We could extend the TTL by setting the TTL in MailboxStoragePayload from the type of msg which gets into the +// SealedAndSigned data. + // We exclude uid from hashcode and equals to detect duplicate entries of the same AckMessage @EqualsAndHashCode(callSuper = true, exclude = {"uid"}) @Value @@ -145,6 +149,7 @@ public final class AckMessage extends NetworkEnvelope implements MailboxMessage, // API /////////////////////////////////////////////////////////////////////////////////////////// + //TODO has no effect, see comment at class definition @Override public long getTTL() { return TimeUnit.DAYS.toMillis(10); diff --git a/p2p/src/main/java/bisq/network/p2p/DecryptedMessageWithPubKey.java b/p2p/src/main/java/bisq/network/p2p/DecryptedMessageWithPubKey.java index f026a2fcd2..e9e513b7d7 100644 --- a/p2p/src/main/java/bisq/network/p2p/DecryptedMessageWithPubKey.java +++ b/p2p/src/main/java/bisq/network/p2p/DecryptedMessageWithPubKey.java @@ -17,19 +17,48 @@ package bisq.network.p2p; +import bisq.common.crypto.Sig; +import bisq.common.proto.ProtobufferException; import bisq.common.proto.network.NetworkEnvelope; +import bisq.common.proto.network.NetworkProtoResolver; +import bisq.common.proto.persistable.PersistablePayload; + +import com.google.protobuf.ByteString; import java.security.PublicKey; import lombok.Value; @Value -public final class DecryptedMessageWithPubKey { +public final class DecryptedMessageWithPubKey implements PersistablePayload { private final NetworkEnvelope networkEnvelope; - private final PublicKey signaturePubKey; + private final byte[] signaturePubKeyBytes; + transient private final PublicKey signaturePubKey; public DecryptedMessageWithPubKey(NetworkEnvelope networkEnvelope, PublicKey signaturePubKey) { this.networkEnvelope = networkEnvelope; this.signaturePubKey = signaturePubKey; + this.signaturePubKeyBytes = Sig.getPublicKeyBytes(signaturePubKey); + } + + private DecryptedMessageWithPubKey(NetworkEnvelope networkEnvelope, byte[] signaturePubKeyBytes) { + this.networkEnvelope = networkEnvelope; + this.signaturePubKeyBytes = signaturePubKeyBytes; + this.signaturePubKey = Sig.getPublicKeyFromBytes(signaturePubKeyBytes); + } + + @Override + public protobuf.DecryptedMessageWithPubKey toProtoMessage() { + return protobuf.DecryptedMessageWithPubKey.newBuilder() + .setNetworkEnvelope(networkEnvelope.toProtoNetworkEnvelope()) + .setSignaturePubKeyBytes(ByteString.copyFrom(signaturePubKeyBytes)) + .build(); + } + + public static DecryptedMessageWithPubKey fromProto(protobuf.DecryptedMessageWithPubKey proto, + NetworkProtoResolver networkProtoResolver) + throws ProtobufferException { + return new DecryptedMessageWithPubKey(networkProtoResolver.fromProto(proto.getNetworkEnvelope()), + proto.getSignaturePubKeyBytes().toByteArray()); } } diff --git a/p2p/src/main/java/bisq/network/p2p/MailboxItem.java b/p2p/src/main/java/bisq/network/p2p/MailboxItem.java new file mode 100644 index 0000000000..cdf6edf1dc --- /dev/null +++ b/p2p/src/main/java/bisq/network/p2p/MailboxItem.java @@ -0,0 +1,53 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.network.p2p; + +import bisq.network.p2p.storage.payload.ProtectedMailboxStorageEntry; + +import bisq.common.proto.ProtobufferException; +import bisq.common.proto.network.NetworkProtoResolver; +import bisq.common.proto.persistable.PersistablePayload; + +import lombok.Value; + +@Value +public class MailboxItem implements PersistablePayload { + private final ProtectedMailboxStorageEntry protectedMailboxStorageEntry; + private final DecryptedMessageWithPubKey decryptedMessageWithPubKey; + + public MailboxItem(ProtectedMailboxStorageEntry protectedMailboxStorageEntry, + DecryptedMessageWithPubKey decryptedMessageWithPubKey) { + this.protectedMailboxStorageEntry = protectedMailboxStorageEntry; + this.decryptedMessageWithPubKey = decryptedMessageWithPubKey; + } + + @Override + public protobuf.MailboxItem toProtoMessage() { + return protobuf.MailboxItem.newBuilder() + .setProtectedMailboxStorageEntry(protectedMailboxStorageEntry.toProtoMessage()) + .setDecryptedMessageWithPubKey(decryptedMessageWithPubKey.toProtoMessage()) + .build(); + } + + public static MailboxItem fromProto(protobuf.MailboxItem proto, NetworkProtoResolver networkProtoResolver) + throws ProtobufferException { + return new MailboxItem(ProtectedMailboxStorageEntry.fromProto(proto.getProtectedMailboxStorageEntry(), + networkProtoResolver), + DecryptedMessageWithPubKey.fromProto(proto.getDecryptedMessageWithPubKey(), networkProtoResolver)); + } +} diff --git a/p2p/src/main/java/bisq/network/p2p/MailboxMessageList.java b/p2p/src/main/java/bisq/network/p2p/MailboxMessageList.java new file mode 100644 index 0000000000..12e4d7db2f --- /dev/null +++ b/p2p/src/main/java/bisq/network/p2p/MailboxMessageList.java @@ -0,0 +1,76 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.network.p2p; + +import bisq.common.proto.ProtobufferException; +import bisq.common.proto.network.NetworkProtoResolver; +import bisq.common.proto.persistable.PersistableList; + +import com.google.protobuf.Message; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@EqualsAndHashCode(callSuper = true) +public class MailboxMessageList extends PersistableList { + + MailboxMessageList() { + super(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + public MailboxMessageList(List list) { + super(list); + } + + @Override + public Message toProtoMessage() { + return protobuf.PersistableEnvelope.newBuilder() + .setMailboxMessageList(protobuf.MailboxMessageList.newBuilder() + .addAllMailboxItem(getList().stream() + .map(MailboxItem::toProtoMessage) + .collect(Collectors.toList()))) + .build(); + } + + public static MailboxMessageList fromProto(protobuf.MailboxMessageList proto, + NetworkProtoResolver networkProtoResolver) { + return new MailboxMessageList(new ArrayList<>(proto.getMailboxItemList().stream() + .map(e -> { + try { + return MailboxItem.fromProto(e, networkProtoResolver); + } catch (ProtobufferException protobufferException) { + protobufferException.printStackTrace(); + log.error("Error at MailboxItem.fromProto: {}", protobufferException.toString()); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()))); + } +} diff --git a/p2p/src/main/java/bisq/network/p2p/P2PService.java b/p2p/src/main/java/bisq/network/p2p/P2PService.java index 509419bf24..3cb04314dd 100644 --- a/p2p/src/main/java/bisq/network/p2p/P2PService.java +++ b/p2p/src/main/java/bisq/network/p2p/P2PService.java @@ -19,8 +19,6 @@ package bisq.network.p2p; import bisq.network.Socks5ProxyProvider; import bisq.network.crypto.EncryptionService; -import bisq.network.p2p.inventory.GetInventoryRequestHandler; -import bisq.network.p2p.inventory.GetInventoryRequestManager; import bisq.network.p2p.messaging.DecryptedMailboxListener; import bisq.network.p2p.network.CloseConnectionReason; import bisq.network.p2p.network.Connection; @@ -52,6 +50,7 @@ import bisq.common.app.Capability; import bisq.common.crypto.CryptoException; import bisq.common.crypto.KeyRing; import bisq.common.crypto.PubKeyRing; +import bisq.common.persistence.PersistenceManager; import bisq.common.proto.ProtobufferException; import bisq.common.proto.network.NetworkEnvelope; import bisq.common.proto.persistable.PersistedDataHost; @@ -98,7 +97,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import lombok.Getter; -import lombok.Value; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -112,9 +110,8 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis private final SeedNodeRepository seedNodeRepository; private final EncryptionService encryptionService; + private final PersistenceManager persistenceManager; private final KeyRing keyRing; - private final GetInventoryRequestHandler getInventoryRequestHandler; - private final GetInventoryRequestManager getInventoryRequestManager; private final NetworkNode networkNode; private final PeerManager peerManager; @@ -129,8 +126,8 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis private final Set decryptedDirectMessageListeners = new CopyOnWriteArraySet<>(); private final Set decryptedMailboxListeners = new CopyOnWriteArraySet<>(); private final Set p2pServiceListeners = new CopyOnWriteArraySet<>(); - @Getter - private final Map mailboxItemsByUid = new HashMap<>(); + private final MailboxMessageList mailboxMessageList = new MailboxMessageList(); + private final Map> mailboxItemsByUid = new HashMap<>(); private final Set shutDownResultHandlers = new CopyOnWriteArraySet<>(); private final BooleanProperty hiddenServicePublished = new SimpleBooleanProperty(); private final BooleanProperty preliminaryDataReceived = new SimpleBooleanProperty(); @@ -161,9 +158,8 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis SeedNodeRepository seedNodeRepository, Socks5ProxyProvider socks5ProxyProvider, EncryptionService encryptionService, - KeyRing keyRing, - GetInventoryRequestHandler getInventoryRequestHandler, - GetInventoryRequestManager getInventoryRequestManager) { + PersistenceManager persistenceManager, + KeyRing keyRing) { this.networkNode = networkNode; this.peerManager = peerManager; this.p2PDataStorage = p2PDataStorage; @@ -174,9 +170,8 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis this.seedNodeRepository = seedNodeRepository; this.socks5ProxyProvider = socks5ProxyProvider; this.encryptionService = encryptionService; + this.persistenceManager = persistenceManager; this.keyRing = keyRing; - this.getInventoryRequestHandler = getInventoryRequestHandler; - this.getInventoryRequestManager = getInventoryRequestManager; this.networkNode.addConnectionListener(this); this.networkNode.addMessageListener(this); @@ -190,14 +185,31 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis if (newValue) onNetworkReady(); }); + + this.persistenceManager.initialize(mailboxMessageList, PersistenceManager.Source.PRIVATE); } + + /////////////////////////////////////////////////////////////////////////////////////////// + // PersistedDataHost + /////////////////////////////////////////////////////////////////////////////////////////// + @Override - public void readPersisted() { - p2PDataStorage.readPersisted(); - peerManager.readPersisted(); - } + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + persisted.forEach(mailboxItem -> { + DecryptedMessageWithPubKey decryptedMessageWithPubKey = mailboxItem.getDecryptedMessageWithPubKey(); + MailboxMessage mailboxMessage = (MailboxMessage) decryptedMessageWithPubKey.getNetworkEnvelope(); + String uid = mailboxMessage.getUid(); + mailboxItemsByUid.putIfAbsent(uid, new ArrayList<>()); + mailboxItemsByUid.get(uid).add(mailboxItem); + mailboxMessageList.add(mailboxItem); + }); + completeHandler.run(); + }, + completeHandler); + } /////////////////////////////////////////////////////////////////////////////////////////// // API @@ -267,9 +279,6 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis } else { shutDownResultHandlers.forEach(Runnable::run); } - - getInventoryRequestHandler.shutDown(); - getInventoryRequestManager.shutDown(); } @@ -465,7 +474,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis checkArgument(protectedMailboxStorageEntries.size() == 1); var decryptedEntries = new ArrayList<>(getDecryptedEntries(protectedMailboxStorageEntries)); if (decryptedEntries.size() == 1) { - storeMailboxDataAndNotifyListeners(decryptedEntries.get(0)); + processMailboxItem(decryptedEntries.get(0)); } } @@ -484,7 +493,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis Futures.addCallback(future, new FutureCallback<>() { public void onSuccess(Set decryptedMailboxMessageWithEntries) { - UserThread.execute(() -> decryptedMailboxMessageWithEntries.forEach(e -> storeMailboxDataAndNotifyListeners(e))); + UserThread.execute(() -> decryptedMailboxMessageWithEntries.forEach(e -> processMailboxItem(e))); } public void onFailure(@NotNull Throwable throwable) { @@ -520,14 +529,53 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis return null; } - private void storeMailboxDataAndNotifyListeners(MailboxItem mailboxItem) { + private void processMailboxItem(MailboxItem mailboxItem) { DecryptedMessageWithPubKey decryptedMessageWithPubKey = mailboxItem.getDecryptedMessageWithPubKey(); MailboxMessage mailboxMessage = (MailboxMessage) decryptedMessageWithPubKey.getNetworkEnvelope(); + String uid = mailboxMessage.getUid(); + mailboxItemsByUid.putIfAbsent(uid, new ArrayList<>()); + mailboxItemsByUid.get(uid).add(mailboxItem); + mailboxMessageList.add(mailboxItem); + requestPersistence(); + NodeAddress sender = mailboxMessage.getSenderNodeAddress(); - mailboxItemsByUid.put(mailboxMessage.getUid(), mailboxItem); log.info("Received a {} mailbox message with uid {} and senderAddress {}", - mailboxMessage.getClass().getSimpleName(), mailboxMessage.getUid(), sender); + mailboxMessage.getClass().getSimpleName(), uid, sender); decryptedMailboxListeners.forEach(e -> e.onMailboxMessageAdded(decryptedMessageWithPubKey, sender)); + + if (isBootstrapped()) { + // After we notified our listeners we remove the data immediately from the network. + // In case the client has not been ready it need to take it via getMailBoxMessages. + removeMailboxEntryFromNetwork(mailboxItem.getProtectedMailboxStorageEntry()); + } else { + log.info("We are not bootstrapped yet, so we remove later once the message got processed."); + } + } + + private void removeMailboxEntryFromNetwork(ProtectedMailboxStorageEntry protectedMailboxStorageEntry) { + MailboxStoragePayload mailboxStoragePayload = (MailboxStoragePayload) protectedMailboxStorageEntry.getProtectedStoragePayload(); + PublicKey receiversPubKey = protectedMailboxStorageEntry.getReceiversPubKey(); + try { + ProtectedMailboxStorageEntry updatedEntry = p2PDataStorage.getMailboxDataWithSignedSeqNr( + mailboxStoragePayload, + keyRing.getSignatureKeyPair(), + receiversPubKey); + + P2PDataStorage.ByteArray hashOfPayload = p2PDataStorage.get32ByteHashAsByteArray(mailboxStoragePayload); + if (p2PDataStorage.getMap().containsKey(hashOfPayload)) { + boolean result = p2PDataStorage.remove(updatedEntry, networkNode.getNodeAddress()); + if (result) { + log.info("Removed mailboxEntry from network"); + } else { + log.warn("Removing mailboxEntry from network failed"); + } + } else { + log.info("The mailboxEntry was already removed earlier."); + } + } catch (CryptoException e) { + e.printStackTrace(); + log.error("Could not remove ProtectedMailboxStorageEntry from network. Error: {}", e.toString()); + } } @@ -754,57 +802,33 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis } } - public void removeEntryFromMailbox(DecryptedMessageWithPubKey decryptedMessageWithPubKey) { - // We need to delay a bit to avoid that we remove our msg then get it from other peers again and reapply it again. - // If we delay the removal we have better chances that repeated network_messages we got from other peers are already filtered - // at the P2PService layer. - // Though we have to check in the client classes to not apply the same message again as there is no guarantee - // when we would get a message again from the network. - try { - UserThread.runAfter(() -> delayedRemoveEntryFromMailbox(decryptedMessageWithPubKey), 2); - } catch (NetworkNotReadyException t) { - // If we called too early it might throw a NetworkNotReadyException. We will try again - try { - UserThread.runAfter(() -> delayedRemoveEntryFromMailbox(decryptedMessageWithPubKey), 60); - } catch (NetworkNotReadyException ignore) { - log.warn("We tried to call delayedRemoveEntryFromMailbox 60 sec. after we received an " + - "NetworkNotReadyException but it failed again. We give up here."); - } + public void removeMailboxMsg(DecryptedMessageWithPubKey decryptedMessageWithPubKey) { + if (isBootstrapped()) { + // We need to delay a bit to not get a ConcurrentModificationException as we might iterate over + // mailboxItemsByUid while getting called. + UserThread.execute(() -> { + MailboxMessage mailboxMessage = (MailboxMessage) decryptedMessageWithPubKey.getNetworkEnvelope(); + String uid = mailboxMessage.getUid(); + if (mailboxItemsByUid.containsKey(uid)) { + List list = mailboxItemsByUid.get(uid); + // In case we have not been bootstrapped when we tried to remove the message at the time when we + // received the message, we remove it now. + list.forEach(mailboxItem -> { + removeMailboxEntryFromNetwork(mailboxItem.getProtectedMailboxStorageEntry()); + mailboxMessageList.remove(mailboxItem); + }); + mailboxItemsByUid.remove(uid); + requestPersistence(); + } + }); + } else { + // In case the network was not ready yet we try again later + UserThread.runAfter(() -> removeMailboxMsg(decryptedMessageWithPubKey), 30); } } - private void delayedRemoveEntryFromMailbox(DecryptedMessageWithPubKey decryptedMessageWithPubKey) { - if (!isBootstrapped()) { - // We don't throw an NetworkNotReadyException here. - // This case should not happen anyway as we check for isBootstrapped in the callers. - log.warn("You must have bootstrapped before adding data to the P2P network."); - } - - MailboxMessage mailboxMessage = (MailboxMessage) decryptedMessageWithPubKey.getNetworkEnvelope(); - String uid = mailboxMessage.getUid(); - if (mailboxItemsByUid.containsKey(uid)) { - ProtectedMailboxStorageEntry mailboxData = mailboxItemsByUid.get(uid).getProtectedMailboxStorageEntry(); - if (mailboxData != null && mailboxData.getProtectedStoragePayload() instanceof MailboxStoragePayload) { - MailboxStoragePayload expirableMailboxStoragePayload = (MailboxStoragePayload) mailboxData.getProtectedStoragePayload(); - PublicKey receiversPubKey = mailboxData.getReceiversPubKey(); - checkArgument(receiversPubKey.equals(keyRing.getSignatureKeyPair().getPublic()), - "receiversPubKey is not matching with our key. That must not happen."); - try { - ProtectedMailboxStorageEntry protectedMailboxStorageEntry = p2PDataStorage.getMailboxDataWithSignedSeqNr( - expirableMailboxStoragePayload, - keyRing.getSignatureKeyPair(), - receiversPubKey); - p2PDataStorage.remove(protectedMailboxStorageEntry, networkNode.getNodeAddress()); - } catch (CryptoException e) { - log.error("Signing at getDataWithSignedSeqNr failed. That should never happen."); - } - - mailboxItemsByUid.remove(uid); - log.info("Removed successfully decryptedMsgWithPubKey. uid={}", uid); - } - } else { - log.warn("uid for mailbox entry not found in mailboxMap." + "uid={}", uid); - } + private void requestPersistence() { + persistenceManager.requestPersistence(); } @@ -940,15 +964,11 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis .findAny(); } - @Value - public class MailboxItem { - private final ProtectedMailboxStorageEntry protectedMailboxStorageEntry; - private final DecryptedMessageWithPubKey decryptedMessageWithPubKey; - - public MailboxItem(ProtectedMailboxStorageEntry protectedMailboxStorageEntry, - DecryptedMessageWithPubKey decryptedMessageWithPubKey) { - this.protectedMailboxStorageEntry = protectedMailboxStorageEntry; - this.decryptedMessageWithPubKey = decryptedMessageWithPubKey; - } + public Set getMailBoxMessages() { + return mailboxItemsByUid.values().stream() + .filter(list -> !list.isEmpty()) + .map(list -> list.get(0)) + .map(MailboxItem::getDecryptedMessageWithPubKey) + .collect(Collectors.toSet()); } } diff --git a/p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequestHandler.java b/p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequestHandler.java deleted file mode 100644 index 8695e71b37..0000000000 --- a/p2p/src/main/java/bisq/network/p2p/inventory/GetInventoryRequestHandler.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.network.p2p.inventory; - -import bisq.network.p2p.inventory.messages.GetInventoryRequest; -import bisq.network.p2p.inventory.messages.GetInventoryResponse; -import bisq.network.p2p.network.Connection; -import bisq.network.p2p.network.MessageListener; -import bisq.network.p2p.network.NetworkNode; -import bisq.network.p2p.storage.P2PDataStorage; -import bisq.network.p2p.storage.payload.ProtectedStorageEntry; - -import bisq.common.proto.network.NetworkEnvelope; - -import javax.inject.Inject; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class GetInventoryRequestHandler implements MessageListener { - private final NetworkNode networkNode; - private final P2PDataStorage p2PDataStorage; - - @Inject - public GetInventoryRequestHandler(NetworkNode networkNode, P2PDataStorage p2PDataStorage) { - this.networkNode = networkNode; - this.p2PDataStorage = p2PDataStorage; - networkNode.addMessageListener(this); - } - - @Override - public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { - if (networkEnvelope instanceof GetInventoryRequest) { - GetInventoryRequest getInventoryRequest = (GetInventoryRequest) networkEnvelope; - - Map numPayloadsByClassName = new HashMap<>(); - p2PDataStorage.getMapForDataResponse(getInventoryRequest.getVersion()).values().stream() - .map(e -> e.getClass().getSimpleName()) - .forEach(className -> { - numPayloadsByClassName.putIfAbsent(className, 0); - int prev = numPayloadsByClassName.get(className); - numPayloadsByClassName.put(className, prev + 1); - }); - p2PDataStorage.getMap().values().stream() - .map(ProtectedStorageEntry::getProtectedStoragePayload) - .filter(Objects::nonNull) - .map(e -> e.getClass().getSimpleName()) - .forEach(className -> { - numPayloadsByClassName.putIfAbsent(className, 0); - int prev = numPayloadsByClassName.get(className); - numPayloadsByClassName.put(className, prev + 1); - }); - - GetInventoryResponse getInventoryResponse = new GetInventoryResponse(numPayloadsByClassName); - networkNode.sendMessage(connection, getInventoryResponse); - } - } - - public void shutDown() { - networkNode.removeMessageListener(this); - } -} diff --git a/p2p/src/main/java/bisq/network/p2p/network/Connection.java b/p2p/src/main/java/bisq/network/p2p/network/Connection.java index c6d3277ee3..3a03fd0231 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/Connection.java +++ b/p2p/src/main/java/bisq/network/p2p/network/Connection.java @@ -115,6 +115,7 @@ public class Connection implements HasCapabilities, Runnable, MessageListener { /////////////////////////////////////////////////////////////////////////////////////////// @Inject + @Nullable private static Config config; // Leaving some constants package-private for tests to know limits. @@ -249,10 +250,10 @@ public class Connection implements HasCapabilities, Runnable, MessageListener { // Throttle outbound network_messages long now = System.currentTimeMillis(); long elapsed = now - lastSendTimeStamp; - if (elapsed < config.sendMsgThrottleTrigger) { + if (elapsed < getSendMsgThrottleTrigger()) { log.debug("We got 2 sendMessage requests in less than {} ms. We set the thread to sleep " + "for {} ms to avoid flooding our peer. lastSendTimeStamp={}, now={}, elapsed={}, networkEnvelope={}", - config.sendMsgThrottleTrigger, config.sendMsgThrottleSleep, lastSendTimeStamp, now, elapsed, + getSendMsgThrottleTrigger(), getSendMsgThrottleSleep(), lastSendTimeStamp, now, elapsed, networkEnvelope.getClass().getSimpleName()); // check if BundleOfEnvelopes is supported @@ -265,7 +266,7 @@ public class Connection implements HasCapabilities, Runnable, MessageListener { queueOfBundles.add(new BundleOfEnvelopes()); // - and schedule it for sending - lastSendTimeStamp += config.sendMsgThrottleSleep; + lastSendTimeStamp += getSendMsgThrottleSleep(); bundleSender.schedule(() -> { if (!stopped) { @@ -297,7 +298,7 @@ public class Connection implements HasCapabilities, Runnable, MessageListener { return; } - Thread.sleep(config.sendMsgThrottleSleep); + Thread.sleep(getSendMsgThrottleSleep()); } lastSendTimeStamp = now; @@ -372,11 +373,27 @@ public class Connection implements HasCapabilities, Runnable, MessageListener { messageTimeStamps.add(now); // clean list - while (messageTimeStamps.size() > config.msgThrottlePer10Sec) + while (messageTimeStamps.size() > getMsgThrottlePer10Sec()) messageTimeStamps.remove(0); - return violatesThrottleLimit(now, 1, config.msgThrottlePerSec) || - violatesThrottleLimit(now, 10, config.msgThrottlePer10Sec); + return violatesThrottleLimit(now, 1, getMsgThrottlePerSec()) || + violatesThrottleLimit(now, 10, getMsgThrottlePer10Sec()); + } + + private int getMsgThrottlePerSec() { + return config != null ? config.msgThrottlePerSec : 200; + } + + private int getMsgThrottlePer10Sec() { + return config != null ? config.msgThrottlePer10Sec : 1000; + } + + private int getSendMsgThrottleSleep() { + return config != null ? config.sendMsgThrottleSleep : 50; + } + + private int getSendMsgThrottleTrigger() { + return config != null ? config.sendMsgThrottleTrigger : 20; } private boolean violatesThrottleLimit(long now, int seconds, int messageCountLimit) { diff --git a/p2p/src/main/java/bisq/network/p2p/network/ConnectionListener.java b/p2p/src/main/java/bisq/network/p2p/network/ConnectionListener.java index 4e37f9c1f7..1b1891a231 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/ConnectionListener.java +++ b/p2p/src/main/java/bisq/network/p2p/network/ConnectionListener.java @@ -22,5 +22,6 @@ public interface ConnectionListener { void onDisconnect(CloseConnectionReason closeConnectionReason, Connection connection); + //TODO is never called, can be removed void onError(Throwable throwable); } diff --git a/p2p/src/main/java/bisq/network/p2p/network/Statistic.java b/p2p/src/main/java/bisq/network/p2p/network/Statistic.java index 4573b9fae3..a7544238d9 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/Statistic.java +++ b/p2p/src/main/java/bisq/network/p2p/network/Statistic.java @@ -47,7 +47,9 @@ public class Statistic { private final static long startTime = System.currentTimeMillis(); private final static LongProperty totalSentBytes = new SimpleLongProperty(0); + private final static DoubleProperty totalSentBytesPerSec = new SimpleDoubleProperty(0); private final static LongProperty totalReceivedBytes = new SimpleLongProperty(0); + private final static DoubleProperty totalReceivedBytesPerSec = new SimpleDoubleProperty(0); private final static Map totalReceivedMessages = new ConcurrentHashMap<>(); private final static Map totalSentMessages = new ConcurrentHashMap<>(); private final static LongProperty numTotalSentMessages = new SimpleLongProperty(0); @@ -63,6 +65,9 @@ public class Statistic { long passed = (System.currentTimeMillis() - startTime) / 1000; numTotalSentMessagesPerSec.set(((double) numTotalSentMessages.get()) / passed); numTotalReceivedMessagesPerSec.set(((double) numTotalReceivedMessages.get()) / passed); + + totalSentBytesPerSec.set(((double) totalSentBytes.get()) / passed); + totalReceivedBytesPerSec.set(((double) totalReceivedBytes.get()) / passed); }, 1); // We log statistics every minute @@ -87,10 +92,18 @@ public class Statistic { return totalSentBytes; } + public static DoubleProperty totalSentBytesPerSecProperty() { + return totalSentBytesPerSec; + } + public static LongProperty totalReceivedBytesProperty() { return totalReceivedBytes; } + public static DoubleProperty totalReceivedBytesPerSecProperty() { + return totalReceivedBytesPerSec; + } + public static LongProperty numTotalSentMessagesProperty() { return numTotalSentMessages; } diff --git a/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java b/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java index c7d0b9e028..a1aae19bab 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java +++ b/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java @@ -23,7 +23,6 @@ import bisq.network.p2p.Utils; import bisq.common.Timer; import bisq.common.UserThread; import bisq.common.proto.network.NetworkProtoResolver; -import bisq.common.util.Utilities; import org.berndpruenster.netlayer.tor.HiddenServiceSocket; import org.berndpruenster.netlayer.tor.Tor; @@ -82,13 +81,14 @@ public class TorNetworkNode extends NetworkNode { private boolean streamIsolation; private Socks5Proxy socksProxy; + private ListenableFuture torStartupFuture; /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// public TorNetworkNode(int servicePort, NetworkProtoResolver networkProtoResolver, boolean useStreamIsolation, - TorMode torMode) { + TorMode torMode) { super(servicePort, networkProtoResolver); this.torMode = torMode; this.streamIsolation = useStreamIsolation; @@ -153,72 +153,60 @@ public class TorNetworkNode extends NetworkNode { // this one is committed as a thread to the executor BooleanProperty torNetworkNodeShutDown = torNetworkNodeShutDown(); BooleanProperty shutDownTimerTriggered = shutDownTimerTriggered(); - // Need to store allShutDown to not get garbage collected - allShutDown = EasyBind.combine(torNetworkNodeShutDown, networkNodeShutDown, shutDownTimerTriggered, (a, b, c) -> (a && b) || c); + allShutDown = EasyBind.combine(torNetworkNodeShutDown, networkNodeShutDown, shutDownTimerTriggered, + (a, b, c) -> (a && b) || c); allShutDown.subscribe((observable, oldValue, newValue) -> { if (newValue) { shutDownTimeoutTimer.stop(); long ts = System.currentTimeMillis(); - log.debug("Shutdown executorService"); try { MoreExecutors.shutdownAndAwaitTermination(executorService, 500, TimeUnit.MILLISECONDS); - log.debug("Shutdown executorService done after " + (System.currentTimeMillis() - ts) + " ms."); - log.debug("Shutdown completed"); + log.debug("Shutdown executorService done after {} ms.", System.currentTimeMillis() - ts); } catch (Throwable t) { - log.error("Shutdown executorService failed with exception: " + t.getMessage()); + log.error("Shutdown executorService failed with exception: {}", t.getMessage()); t.printStackTrace(); } finally { - try { - if (shutDownCompleteHandler != null) - shutDownCompleteHandler.run(); - } catch (Throwable ignore) { - } + if (shutDownCompleteHandler != null) + shutDownCompleteHandler.run(); } } }); } private BooleanProperty torNetworkNodeShutDown() { - final BooleanProperty done = new SimpleBooleanProperty(); - if (executorService != null) { - executorService.submit(() -> { - Utilities.setThreadName("torNetworkNodeShutDown"); - long ts = System.currentTimeMillis(); - log.debug("Shutdown torNetworkNode"); - try { - /** - * make sure we get tor. - * - there have been situations where tor isn't set yet, which would leave tor running - * - downside is that if tor is not already started, we start it here just to shut it down. However, - * that can only be the case if Bisq gets shutdown even before it reaches step 2/4 at startup. - * The risk seems worth it compared to the risk of not shutting down tor. - */ - tor = Tor.getDefault(); - if (tor != null) - tor.shutdown(); - log.debug("Shutdown torNetworkNode done after " + (System.currentTimeMillis() - ts) + " ms."); - } catch (Throwable e) { - log.error("Shutdown torNetworkNode failed with exception: " + e.getMessage()); - e.printStackTrace(); - } finally { - UserThread.execute(() -> done.set(true)); - } - }); - } else { - done.set(true); + BooleanProperty done = new SimpleBooleanProperty(); + try { + tor = Tor.getDefault(); + if (tor != null) { + log.info("Tor has been created already so we can shut it down."); + tor.shutdown(); + log.info("Tor shut down completed"); + } else { + log.info("Tor has not been created yet. We cancel the torStartupFuture."); + torStartupFuture.cancel(true); + log.info("torStartupFuture cancelled"); + } + } catch (Throwable e) { + log.error("Shutdown torNetworkNode failed with exception: {}", e.getMessage()); + e.printStackTrace(); + + } finally { + // We need to delay as otherwise our listener would not get called if shutdown completes in synchronous manner + UserThread.execute(() -> done.set(true)); } return done; } private BooleanProperty networkNodeShutDown() { - final BooleanProperty done = new SimpleBooleanProperty(); - super.shutDown(() -> done.set(true)); + BooleanProperty done = new SimpleBooleanProperty(); + // We need to delay as otherwise our listener would not get called if shutdown completes in synchronous manner + UserThread.execute(() -> super.shutDown(() -> done.set(true))); return done; } private BooleanProperty shutDownTimerTriggered() { - final BooleanProperty done = new SimpleBooleanProperty(); + BooleanProperty done = new SimpleBooleanProperty(); shutDownTimeoutTimer = UserThread.runAfter(() -> { log.error("A timeout occurred at shutDown"); done.set(true); @@ -255,7 +243,7 @@ public class TorNetworkNode extends NetworkNode { /////////////////////////////////////////////////////////////////////////////////////////// private void createTorAndHiddenService(int localPort, int servicePort) { - ListenableFuture future = executorService.submit(() -> { + torStartupFuture = executorService.submit(() -> { try { // get tor Tor.setDefault(torMode.getTor()); @@ -313,7 +301,7 @@ public class TorNetworkNode extends NetworkNode { return null; }); - Futures.addCallback(future, new FutureCallback() { + Futures.addCallback(torStartupFuture, new FutureCallback() { public void onSuccess(Void ignore) { } diff --git a/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java b/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java index 20af045319..de5acc41b9 100644 --- a/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java +++ b/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java @@ -81,6 +81,7 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost // Age of what we consider connected peers still as live peers private static final long MAX_AGE_LIVE_PEERS = TimeUnit.MINUTES.toMillis(30); private static final boolean PRINT_REPORTED_PEERS_DETAILS = true; + private boolean shutDownRequested; /////////////////////////////////////////////////////////////////////////////////////////// @@ -126,8 +127,12 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost private int maxConnectionsPeer; private int maxConnectionsNonDirect; private int maxConnectionsAbsolute; + @Getter + private int peakNumConnections; @Setter private boolean allowDisconnectSeedNodes; + @Getter + private int numAllConnectionsLostEvents; /////////////////////////////////////////////////////////////////////////////////////////// @@ -172,6 +177,7 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost } public void shutDown() { + shutDownRequested = true; networkNode.removeConnectionListener(this); clockWatcher.removeListener(clockWatcherListener); stopCheckMaxConnectionsTimer(); @@ -183,11 +189,12 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void readPersisted() { - PeerList persisted = persistenceManager.getPersisted(); - if (persisted != null) { - peerList.setAll(persisted.getSet()); - } + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + peerList.setAll(persisted.getSet()); + completeHandler.run(); + }, + completeHandler); } @@ -206,6 +213,9 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost if (lostAllConnections) { lostAllConnections = false; stopped = false; + log.info("\n------------------------------------------------------------\n" + + "Established a new connection from/to {} after all connections lost.\n" + + "------------------------------------------------------------", connection.getPeersNodeAddressOptional()); listeners.forEach(Listener::onNewConnectionAfterAllConnectionsLost); } connection.getPeersNodeAddressOptional() @@ -218,13 +228,25 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost log.info("onDisconnect called: nodeAddress={}, closeConnectionReason={}", connection.getPeersNodeAddressOptional(), closeConnectionReason); handleConnectionFault(connection); + + boolean previousLostAllConnections = lostAllConnections; lostAllConnections = networkNode.getAllConnections().isEmpty(); + if (lostAllConnections) { stopped = true; - log.warn("\n------------------------------------------------------------\n" + - "All connections lost\n" + - "------------------------------------------------------------"); - listeners.forEach(Listener::onAllConnectionsLost); + + if (!shutDownRequested) { + if (!previousLostAllConnections) { + // If we enter to 'All connections lost' we count the event. + numAllConnectionsLostEvents++; + } + + log.warn("\n------------------------------------------------------------\n" + + "All connections lost\n" + + "------------------------------------------------------------"); + + listeners.forEach(Listener::onAllConnectionsLost); + } } maybeRemoveBannedPeer(closeConnectionReason, connection); } @@ -304,6 +326,12 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost } } + public void maybeResetNumAllConnectionsLostEvents() { + if (!networkNode.getAllConnections().isEmpty()) { + numAllConnectionsLostEvents = 0; + } + } + /////////////////////////////////////////////////////////////////////////////////////////// // Peer @@ -442,6 +470,10 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost checkMaxConnectionsTimer = UserThread.runAfter(() -> { stopCheckMaxConnectionsTimer(); if (!stopped) { + Set allConnections = new HashSet<>(networkNode.getAllConnections()); + int size = allConnections.size(); + peakNumConnections = Math.max(peakNumConnections, size); + removeAnonymousPeers(); removeSuperfluousSeedNodes(); removeTooOldReportedPeers(); @@ -458,6 +490,7 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost boolean checkMaxConnections() { Set allConnections = new HashSet<>(networkNode.getAllConnections()); int size = allConnections.size(); + peakNumConnections = Math.max(peakNumConnections, size); log.info("We have {} connections open. Our limit is {}", size, maxConnections); if (size <= maxConnections) { diff --git a/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java b/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java index 6fdf847d49..172cae338f 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java @@ -78,6 +78,12 @@ import javax.inject.Inject; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Maps; +import org.fxmisc.easybind.EasyBind; +import org.fxmisc.easybind.monadic.MonadicBinding; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; + import java.security.KeyPair; import java.security.PublicKey; @@ -143,6 +149,10 @@ public class P2PDataStorage implements MessageListener, ConnectionListener, Pers /// which removes entries after PURGE_AGE_DAYS. private final int maxSequenceNumberMapSizeBeforePurge; + // Don't convert to local variable as it might get GC'ed. + private MonadicBinding readFromResourcesCompleteBinding; + + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// @@ -170,24 +180,64 @@ public class P2PDataStorage implements MessageListener, ConnectionListener, Pers this.persistenceManager.initialize(sequenceNumberMap, PersistenceManager.Source.PRIVATE); } + + /////////////////////////////////////////////////////////////////////////////////////////// + // PersistedDataHost + /////////////////////////////////////////////////////////////////////////////////////////// + @Override - public void readPersisted() { - SequenceNumberMap persisted = persistenceManager.getPersisted(); - if (persisted != null) - sequenceNumberMap.setMap(getPurgedSequenceNumberMap(persisted.getMap())); + public void readPersisted(Runnable completeHandler) { + persistenceManager.readPersisted(persisted -> { + sequenceNumberMap.setMap(getPurgedSequenceNumberMap(persisted.getMap())); + completeHandler.run(); + }, + completeHandler); } - // This method is called at startup in a non-user thread. - // We should not have any threading issues here as the p2p network is just initializing + // Uses synchronous execution on the userThread. Only used by tests. The async methods should be used by app code. + @VisibleForTesting + public void readPersistedSync() { + SequenceNumberMap persisted = persistenceManager.getPersisted(); + if (persisted != null) { + sequenceNumberMap.setMap(getPurgedSequenceNumberMap(persisted.getMap())); + } + } - public synchronized void readFromResources(String postFix) { - appendOnlyDataStoreService.readFromResources(postFix); - protectedDataStoreService.readFromResources(postFix); - resourceDataStoreService.readFromResources(postFix); + // Threading is done on the persistenceManager level + public void readFromResources(String postFix, Runnable completeHandler) { + BooleanProperty appendOnlyDataStoreServiceReady = new SimpleBooleanProperty(); + BooleanProperty protectedDataStoreServiceReady = new SimpleBooleanProperty(); + BooleanProperty resourceDataStoreServiceReady = new SimpleBooleanProperty(); + + appendOnlyDataStoreService.readFromResources(postFix, () -> appendOnlyDataStoreServiceReady.set(true)); + protectedDataStoreService.readFromResources(postFix, () -> { + map.putAll(protectedDataStoreService.getMap()); + protectedDataStoreServiceReady.set(true); + }); + resourceDataStoreService.readFromResources(postFix, () -> resourceDataStoreServiceReady.set(true)); + + readFromResourcesCompleteBinding = EasyBind.combine(appendOnlyDataStoreServiceReady, + protectedDataStoreServiceReady, + resourceDataStoreServiceReady, + (a, b, c) -> a && b && c); + readFromResourcesCompleteBinding.subscribe((observable, oldValue, newValue) -> { + if (newValue) { + completeHandler.run(); + } + }); + } + + // Uses synchronous execution on the userThread. Only used by tests. The async methods should be used by app code. + @VisibleForTesting + public void readFromResourcesSync(String postFix) { + appendOnlyDataStoreService.readFromResourcesSync(postFix); + protectedDataStoreService.readFromResourcesSync(postFix); + resourceDataStoreService.readFromResourcesSync(postFix); map.putAll(protectedDataStoreService.getMap()); } + /////////////////////////////////////////////////////////////////////////////////////////// // RequestData API /////////////////////////////////////////////////////////////////////////////////////////// @@ -466,10 +516,12 @@ public class P2PDataStorage implements MessageListener, ConnectionListener, Pers // Batch processing can cause performance issues, so do all of the removes first, then update the listeners // to let them know about the removes. - toRemoveList.forEach(toRemoveItem -> { - log.debug("We found an expired data entry. We remove the protectedData:\n\t" + - Utilities.toTruncatedString(toRemoveItem.getValue())); - }); + if (log.isDebugEnabled()) { + toRemoveList.forEach(toRemoveItem -> { + log.debug("We found an expired data entry. We remove the protectedData:\n\t{}", + Utilities.toTruncatedString(toRemoveItem.getValue())); + }); + } removeFromMapAndDataStore(toRemoveList); if (sequenceNumberMap.size() > this.maxSequenceNumberMapSizeBeforePurge) { @@ -886,12 +938,14 @@ public class P2PDataStorage implements MessageListener, ConnectionListener, Pers removeFromMapAndDataStore(Collections.singletonList(Maps.immutableEntry(hashOfPayload, protectedStorageEntry))); } - private void removeFromMapAndDataStore( - Collection> entriesToRemoveWithPayloadHash) { + private void removeFromMapAndDataStore(Collection> entriesToRemoveWithPayloadHash) { if (entriesToRemoveWithPayloadHash.isEmpty()) return; + log.info("Remove {} expired data entries", entriesToRemoveWithPayloadHash.size()); + ArrayList entriesForSignal = new ArrayList<>(entriesToRemoveWithPayloadHash.size()); entriesToRemoveWithPayloadHash.forEach(entryToRemoveWithPayloadHash -> { ByteArray hashOfPayload = entryToRemoveWithPayloadHash.getKey(); diff --git a/p2p/src/main/java/bisq/network/p2p/storage/payload/MailboxStoragePayload.java b/p2p/src/main/java/bisq/network/p2p/storage/payload/MailboxStoragePayload.java index a2e3eadd7a..f50a5697a5 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/payload/MailboxStoragePayload.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/payload/MailboxStoragePayload.java @@ -47,6 +47,7 @@ import javax.annotation.Nullable; * That is the typical requirement for a mailbox like system. *

* Typical payloads are trade or dispute network_messages to be stored when the peer is offline. + * Size depends on payload but typical size is 2000-3000 bytes */ @Getter @EqualsAndHashCode @@ -117,6 +118,6 @@ public final class MailboxStoragePayload implements ProtectedStoragePayload, Exp @Override public long getTTL() { - return TimeUnit.DAYS.toMillis(15); + return TimeUnit.DAYS.toMillis(7); } } diff --git a/p2p/src/main/java/bisq/network/p2p/storage/persistence/AppendOnlyDataStoreService.java b/p2p/src/main/java/bisq/network/p2p/storage/persistence/AppendOnlyDataStoreService.java index 916523fcc6..859f09489c 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/persistence/AppendOnlyDataStoreService.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/persistence/AppendOnlyDataStoreService.java @@ -22,9 +22,12 @@ import bisq.network.p2p.storage.payload.PersistableNetworkPayload; import javax.inject.Inject; +import com.google.common.annotations.VisibleForTesting; + import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import lombok.Getter; @@ -51,10 +54,24 @@ public class AppendOnlyDataStoreService { services.add(service); } - public void readFromResources(String postFix) { - services.forEach(service -> service.readFromResources(postFix)); + public void readFromResources(String postFix, Runnable completeHandler) { + AtomicInteger remaining = new AtomicInteger(services.size()); + services.forEach(service -> { + service.readFromResources(postFix, () -> { + if (remaining.decrementAndGet() == 0) { + completeHandler.run(); + } + }); + }); } + // Uses synchronous execution on the userThread. Only used by tests. The async methods should be used by app code. + @VisibleForTesting + public void readFromResourcesSync(String postFix) { + services.forEach(service -> service.readFromResourcesSync(postFix)); + } + + public Map getMap() { return services.stream() .flatMap(service -> service.getMap().entrySet().stream()) diff --git a/p2p/src/main/java/bisq/network/p2p/storage/persistence/HistoricalDataStoreService.java b/p2p/src/main/java/bisq/network/p2p/storage/persistence/HistoricalDataStoreService.java index 2570e37ea9..1eaa34a8bf 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/persistence/HistoricalDataStoreService.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/persistence/HistoricalDataStoreService.java @@ -29,6 +29,7 @@ import java.io.File; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import lombok.extern.slf4j.Slf4j; @@ -145,19 +146,28 @@ public abstract class HistoricalDataStoreService { + log.info("We have created the {} store for the live data and filled it with {} entries from the persisted data.", + getFileName(), getMapOfLiveData().size()); - // Now we add our historical data stores. As they are immutable after created we use an ImmutableMap - ImmutableMap.Builder allHistoricalPayloadsBuilder = ImmutableMap.builder(); - ImmutableMap.Builder> storesByVersionBuilder = ImmutableMap.builder(); - - Version.HISTORICAL_RESOURCE_FILE_VERSION_TAGS.forEach(version -> readHistoricalStoreFromResources(version, postFix, allHistoricalPayloadsBuilder, storesByVersionBuilder)); - - allHistoricalPayloads = allHistoricalPayloadsBuilder.build(); - storesByVersion = storesByVersionBuilder.build(); + // Now we add our historical data stores. + Map allHistoricalPayloads = new HashMap<>(); + Map> storesByVersion = new HashMap<>(); + AtomicInteger numFiles = new AtomicInteger(Version.HISTORICAL_RESOURCE_FILE_VERSION_TAGS.size()); + Version.HISTORICAL_RESOURCE_FILE_VERSION_TAGS.forEach(version -> readHistoricalStoreFromResources(version, + postFix, + allHistoricalPayloads, + storesByVersion, + () -> { + if (numFiles.decrementAndGet() == 0) { + // At last iteration we set the immutable map + this.allHistoricalPayloads = ImmutableMap.copyOf(allHistoricalPayloads); + this.storesByVersion = ImmutableMap.copyOf(storesByVersion); + completeHandler.run(); + } + })); + }); } @@ -167,31 +177,33 @@ public abstract class HistoricalDataStoreService allHistoricalDataBuilder, - ImmutableMap.Builder> storesByVersionBuilder) { + Map allHistoricalPayloads, + Map> storesByVersion, + Runnable completeHandler) { + String fileName = getFileName() + "_" + version; boolean wasCreatedFromResources = makeFileFromResourceFile(fileName, postFix); - // If resource file does not exist we return null. We do not create a new store as it would never get filled. - PersistableNetworkPayloadStore historicalStore = persistenceManager.getPersisted(fileName); - if (historicalStore == null) { - log.warn("Resource file with file name {} does not exits.", fileName); - return; - } - - storesByVersionBuilder.put(version, historicalStore); - allHistoricalDataBuilder.putAll(historicalStore.getMap()); - - if (wasCreatedFromResources) { - pruneStore(historicalStore, version); - } + // If resource file does not exist we do not create a new store as it would never get filled. + persistenceManager.readPersisted(fileName, persisted -> { + storesByVersion.put(version, persisted); + allHistoricalPayloads.putAll(persisted.getMap()); + log.info("We have read from {} {} historical items.", fileName, persisted.getMap().size()); + pruneStore(persisted, version); + completeHandler.run(); + }, + () -> { + log.warn("Resource file with file name {} does not exits.", fileName); + completeHandler.run(); + }); } private void pruneStore(PersistableNetworkPayloadStore historicalStore, String version) { - int preLive = getMapOfLiveData().size(); - getMapOfLiveData().keySet().removeAll(historicalStore.getMap().keySet()); - int postLive = getMapOfLiveData().size(); + Map mapOfLiveData = getMapOfLiveData(); + int preLive = mapOfLiveData.size(); + mapOfLiveData.keySet().removeAll(historicalStore.getMap().keySet()); + int postLive = mapOfLiveData.size(); if (preLive > postLive) { log.info("We pruned data from our live data store which are already contained in the historical data store with version {}. " + "The live map had {} entries before pruning and has {} entries afterwards.", diff --git a/p2p/src/main/java/bisq/network/p2p/storage/persistence/ProtectedDataStoreService.java b/p2p/src/main/java/bisq/network/p2p/storage/persistence/ProtectedDataStoreService.java index 07f07ad732..d79fef5ec4 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/persistence/ProtectedDataStoreService.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/persistence/ProtectedDataStoreService.java @@ -24,9 +24,12 @@ import bisq.common.proto.persistable.PersistableEnvelope; import javax.inject.Inject; +import com.google.common.annotations.VisibleForTesting; + import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -52,8 +55,21 @@ public class ProtectedDataStoreService { services.add(service); } - public void readFromResources(String postFix) { - services.forEach(service -> service.readFromResources(postFix)); + public void readFromResources(String postFix, Runnable completeHandler) { + AtomicInteger remaining = new AtomicInteger(services.size()); + services.forEach(service -> { + service.readFromResources(postFix, () -> { + if (remaining.decrementAndGet() == 0) { + completeHandler.run(); + } + }); + }); + } + + // Uses synchronous execution on the userThread. Only used by tests. The async methods should be used by app code. + @VisibleForTesting + public void readFromResourcesSync(String postFix) { + services.forEach(service -> service.readFromResourcesSync(postFix)); } public Map getMap() { diff --git a/p2p/src/main/java/bisq/network/p2p/storage/persistence/ResourceDataStoreService.java b/p2p/src/main/java/bisq/network/p2p/storage/persistence/ResourceDataStoreService.java index b6002af580..dac03b4034 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/persistence/ResourceDataStoreService.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/persistence/ResourceDataStoreService.java @@ -21,8 +21,11 @@ import bisq.common.proto.persistable.PersistableEnvelope; import javax.inject.Inject; +import com.google.common.annotations.VisibleForTesting; + import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import lombok.extern.slf4j.Slf4j; @@ -42,7 +45,20 @@ public class ResourceDataStoreService { services.add(service); } - public void readFromResources(String postFix) { - services.forEach(service -> service.readFromResources(postFix)); + public void readFromResources(String postFix, Runnable completeHandler) { + AtomicInteger remaining = new AtomicInteger(services.size()); + services.forEach(service -> { + service.readFromResources(postFix, () -> { + if (remaining.decrementAndGet() == 0) { + completeHandler.run(); + } + }); + }); + } + + // Uses synchronous execution on the userThread. Only used by tests. The async methods should be used by app code. + @VisibleForTesting + public void readFromResourcesSync(String postFix) { + services.forEach(service -> service.readFromResourcesSync(postFix)); } } diff --git a/p2p/src/main/java/bisq/network/p2p/storage/persistence/StoreService.java b/p2p/src/main/java/bisq/network/p2p/storage/persistence/StoreService.java index 5d1b57d912..671b924d04 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/persistence/StoreService.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/persistence/StoreService.java @@ -22,10 +22,14 @@ import bisq.common.file.ResourceNotFoundException; import bisq.common.persistence.PersistenceManager; import bisq.common.proto.persistable.PersistableEnvelope; +import com.google.common.annotations.VisibleForTesting; + import java.nio.file.Paths; import java.io.File; +import java.util.function.Consumer; + import lombok.extern.slf4j.Slf4j; /** @@ -76,14 +80,27 @@ public abstract class StoreService { // Protected /////////////////////////////////////////////////////////////////////////////////////////// - protected void readFromResources(String postFix) { + protected void readFromResources(String postFix, Runnable completeHandler) { String fileName = getFileName(); makeFileFromResourceFile(fileName, postFix); try { - readStore(); + readStore(persisted -> completeHandler.run()); } catch (Throwable t) { makeFileFromResourceFile(fileName, postFix); - readStore(); + readStore(persisted -> completeHandler.run()); + } + } + + // Uses synchronous execution on the userThread. Only used by tests. The async methods should be used by app code. + @VisibleForTesting + protected void readFromResourcesSync(String postFix) { + String fileName = getFileName(); + makeFileFromResourceFile(fileName, postFix); + try { + readStoreSync(); + } catch (Throwable t) { + makeFileFromResourceFile(fileName, postFix); + readStoreSync(); } } @@ -112,24 +129,35 @@ public abstract class StoreService { return false; } - protected T getStore(String fileName) { - T store; - T persisted = persistenceManager.getPersisted(fileName); - if (persisted != null) { - store = persisted; - /* int length = store.toProtoMessage().getSerializedSize(); - double size = length > 1_000_000D ? length / 1_000_000D : length / 1_000D; - String unit = length > 1_000_000D ? "MB" : "KB"; - log.info("{}: size of {}: {} {}", this.getClass().getSimpleName(), - persisted.getClass().getSimpleName(), size, unit);*/ - } else { + protected void readStore(String fileName, Consumer consumer) { + persistenceManager.readPersisted(fileName, + consumer, + () -> consumer.accept(createStore())); + } + + protected void readStore(Consumer consumer) { + readStore(getFileName(), + persisted -> { + store = persisted; + initializePersistenceManager(); + consumer.accept(persisted); + }); + } + + // Uses synchronous execution on the userThread. Only used by tests. The async methods should be used by app code. + @VisibleForTesting + protected T getStoreSync(String fileName) { + T store = persistenceManager.getPersisted(fileName); + if (store == null) { store = createStore(); } return store; } - protected void readStore() { - store = getStore(getFileName()); + // Uses synchronous execution on the userThread. Only used by tests. The async methods should be used by app code. + @VisibleForTesting + protected void readStoreSync() { + store = getStoreSync(getFileName()); initializePersistenceManager(); } diff --git a/p2p/src/main/resources/AccountAgeWitnessStore_BTC_MAINNET b/p2p/src/main/resources/AccountAgeWitnessStore_BTC_MAINNET index c1ca4d397f..a9ad8621cc 100644 --- a/p2p/src/main/resources/AccountAgeWitnessStore_BTC_MAINNET +++ b/p2p/src/main/resources/AccountAgeWitnessStore_BTC_MAINNET @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc675fd6911fb133981659742ad5717092bb76e7cfe305efb8dfd6324c46c49a -size 1986580 +oid sha256:86921ed15d886ece795f6400e2835eb7bdb392d87be314f99c122505a6c7bf7e +size 2088756 diff --git a/p2p/src/main/resources/DaoStateStore_BTC_MAINNET b/p2p/src/main/resources/DaoStateStore_BTC_MAINNET index 419e742576..fe7ba0d56e 100644 --- a/p2p/src/main/resources/DaoStateStore_BTC_MAINNET +++ b/p2p/src/main/resources/DaoStateStore_BTC_MAINNET @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ed3827d6a54097f700f4e71700cc3d2596100b95fde9f6d9fba3e42da8be728b -size 89892896 +oid sha256:0417e59cc6a9674956c06cde8c3691926c2277b42ad91510aaaae71256b60ea2 +size 96464108 diff --git a/p2p/src/main/resources/SignedWitnessStore_BTC_MAINNET b/p2p/src/main/resources/SignedWitnessStore_BTC_MAINNET index fe058e7e8d..7e6c877894 100644 --- a/p2p/src/main/resources/SignedWitnessStore_BTC_MAINNET +++ b/p2p/src/main/resources/SignedWitnessStore_BTC_MAINNET @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6db33a2613ff1eaac851a00ae544d3ad23a7fa76b9dc772fda27738e0618e14d -size 4059256 +oid sha256:6c5b7d98da6da5f50dd01e902a7ee1ba578f3e8661206c2576c477ec0c3e169b +size 4564514 diff --git a/p2p/src/main/resources/TradeStatistics3Store_1.5.0_BTC_MAINNET b/p2p/src/main/resources/TradeStatistics3Store_1.5.0_BTC_MAINNET new file mode 100644 index 0000000000..577c0d3e1d --- /dev/null +++ b/p2p/src/main/resources/TradeStatistics3Store_1.5.0_BTC_MAINNET @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76f0e9e13791b9b039c1be0a48f483051a0077b599a065dae30ed4154416fae5 +size 174714 diff --git a/p2p/src/test/java/bisq/network/p2p/MockNode.java b/p2p/src/test/java/bisq/network/p2p/MockNode.java index 2112bcc39b..a583b673a6 100644 --- a/p2p/src/test/java/bisq/network/p2p/MockNode.java +++ b/p2p/src/test/java/bisq/network/p2p/MockNode.java @@ -47,19 +47,21 @@ import static org.mockito.Mockito.when; public class MockNode { @Getter - public NetworkNode networkNode; + private NetworkNode networkNode; @Getter - public PeerManager peerManager; + private PeerManager peerManager; @Getter - public Set connections; + private Set connections; @Getter - public int maxConnections; + private int maxConnections; + @Getter + private PersistenceManager persistenceManager; public MockNode(int maxConnections) throws IOException { this.maxConnections = maxConnections; networkNode = mock(NetworkNode.class); File storageDir = Files.createTempDirectory("storage").toFile(); - PersistenceManager persistenceManager = new PersistenceManager<>(storageDir, mock(PersistenceProtoResolver.class), mock(CorruptedStorageFileHandler.class)); + persistenceManager = new PersistenceManager<>(storageDir, mock(PersistenceProtoResolver.class), mock(CorruptedStorageFileHandler.class)); peerManager = new PeerManager(networkNode, mock(SeedNodeRepository.class), new ClockWatcher(), persistenceManager, maxConnections); connections = new HashSet<>(); when(networkNode.getAllConnections()).thenReturn(connections); diff --git a/p2p/src/test/java/bisq/network/p2p/peers/PeerManagerTest.java b/p2p/src/test/java/bisq/network/p2p/peers/PeerManagerTest.java index d75038293a..928da86ef9 100644 --- a/p2p/src/test/java/bisq/network/p2p/peers/PeerManagerTest.java +++ b/p2p/src/test/java/bisq/network/p2p/peers/PeerManagerTest.java @@ -28,6 +28,7 @@ import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -49,6 +50,11 @@ public class PeerManagerTest { maxConnectionsNonDirect = Math.max(8, (int) Math.round(node.getMaxConnections() * 1.7)); } + @After + public void tearDown() { + node.getPersistenceManager().shutdown(); + } + @Test public void testCheckMaxConnectionsNotExceeded() { for (int i = 0; i < 2; i++) { @@ -58,9 +64,8 @@ public class PeerManagerTest { assertFalse(node.getPeerManager().checkMaxConnections()); - node.getNetworkNode().getAllConnections().forEach(connection -> { - verify(connection, never()).shutDown(eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class)); - }); + node.getNetworkNode().getAllConnections().forEach(connection -> + verify(connection, never()).shutDown(eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class))); } @Test @@ -84,11 +89,10 @@ public class PeerManagerTest { verify(oldestConnection, times(1)).shutDown( eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class)); - inboundSortedPeerConnections.forEach(connection -> { - verify(connection, never()).shutDown( - eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), - isA(Runnable.class)); - }); + inboundSortedPeerConnections.forEach(connection -> + verify(connection, never()).shutDown( + eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), + isA(Runnable.class))); } @Test @@ -100,9 +104,8 @@ public class PeerManagerTest { assertFalse(node.getPeerManager().checkMaxConnections()); - node.getNetworkNode().getAllConnections().forEach(connection -> { - verify(connection, never()).shutDown(eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class)); - }); + node.getNetworkNode().getAllConnections().forEach(connection -> + verify(connection, never()).shutDown(eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class))); } @Test @@ -125,11 +128,10 @@ public class PeerManagerTest { verify(oldestConnection, times(1)).shutDown( eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class)); - sortedPeerConnections.forEach(connection -> { - verify(connection, never()).shutDown( - eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), - isA(Runnable.class)); - }); + sortedPeerConnections.forEach(connection -> + verify(connection, never()).shutDown( + eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), + isA(Runnable.class))); } @Test @@ -141,9 +143,8 @@ public class PeerManagerTest { assertFalse(node.getPeerManager().checkMaxConnections()); - node.getNetworkNode().getAllConnections().forEach(connection -> { - verify(connection, never()).shutDown(eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class)); - }); + node.getNetworkNode().getAllConnections().forEach(connection -> + verify(connection, never()).shutDown(eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class))); } @Test @@ -167,11 +168,10 @@ public class PeerManagerTest { verify(oldestConnection, times(1)).shutDown( eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class)); - sortedPeerConnections.forEach(connection -> { - verify(connection, never()).shutDown( - eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), - isA(Runnable.class)); - }); + sortedPeerConnections.forEach(connection -> + verify(connection, never()).shutDown( + eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), + isA(Runnable.class))); } @Test @@ -183,8 +183,7 @@ public class PeerManagerTest { assertFalse(node.getPeerManager().checkMaxConnections()); - node.getNetworkNode().getAllConnections().forEach(connection -> { - verify(connection, never()).shutDown(eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class)); - }); + node.getNetworkNode().getAllConnections().forEach(connection -> + verify(connection, never()).shutDown(eq(CloseConnectionReason.TOO_MANY_CONNECTIONS_OPEN), isA(Runnable.class))); } } diff --git a/p2p/src/test/java/bisq/network/p2p/storage/TestState.java b/p2p/src/test/java/bisq/network/p2p/storage/TestState.java index b04491ed40..7f2360c774 100644 --- a/p2p/src/test/java/bisq/network/p2p/storage/TestState.java +++ b/p2p/src/test/java/bisq/network/p2p/storage/TestState.java @@ -137,8 +137,8 @@ public class TestState { sequenceNrMapPersistenceManager, clock, MAX_SEQUENCE_NUMBER_MAP_SIZE_BEFORE_PURGE); // Currently TestState only supports reading ProtectedStorageEntries off disk. - p2PDataStorage.readFromResources("unused"); - p2PDataStorage.readPersisted(); + p2PDataStorage.readFromResourcesSync("unused"); + p2PDataStorage.readPersistedSync(); p2PDataStorage.addHashMapChangedListener(hashMapChangedListener); p2PDataStorage.addAppendOnlyDataStoreListener(appendOnlyDataStoreListener); diff --git a/p2p/src/test/java/bisq/network/p2p/storage/mocks/MapStoreServiceFake.java b/p2p/src/test/java/bisq/network/p2p/storage/mocks/MapStoreServiceFake.java index 0f6f661fda..4c2e508a4d 100644 --- a/p2p/src/test/java/bisq/network/p2p/storage/mocks/MapStoreServiceFake.java +++ b/p2p/src/test/java/bisq/network/p2p/storage/mocks/MapStoreServiceFake.java @@ -64,7 +64,7 @@ public class MapStoreServiceFake extends MapStoreService { return true; } - protected void readFromResources(String postFix) { + protected void readFromResourcesSync(String postFix) { // do nothing. This Fake only supports in-memory storage. } diff --git a/pricenode/src/main/java/bisq/price/mining/FeeRateProvider.java b/pricenode/src/main/java/bisq/price/mining/FeeRateProvider.java index b9ecda0d47..36fc30e847 100644 --- a/pricenode/src/main/java/bisq/price/mining/FeeRateProvider.java +++ b/pricenode/src/main/java/bisq/price/mining/FeeRateProvider.java @@ -26,7 +26,7 @@ import java.time.Duration; */ public abstract class FeeRateProvider extends PriceProvider { - public static final long MIN_FEE_RATE = 10; // satoshi/byte + public static final long MIN_FEE_RATE = 10; // satoshi/vbyte public static final long MAX_FEE_RATE = 1000; public FeeRateProvider(Duration refreshInterval) { diff --git a/pricenode/src/main/java/bisq/price/mining/providers/MempoolFeeRateProvider.java b/pricenode/src/main/java/bisq/price/mining/providers/MempoolFeeRateProvider.java index b9944d0383..bb0c66867e 100644 --- a/pricenode/src/main/java/bisq/price/mining/providers/MempoolFeeRateProvider.java +++ b/pricenode/src/main/java/bisq/price/mining/providers/MempoolFeeRateProvider.java @@ -95,7 +95,7 @@ abstract class MempoolFeeRateProvider extends FeeRateProvider { .map(Map.Entry::getValue) .findFirst() .map(r -> { - log.info("Retrieved estimated mining fee of {} sat/byte from {}", r, getMempoolApiHostname()); + log.info("Retrieved estimated mining fee of {} sat/vbyte from {}", r, getMempoolApiHostname()); return r; }) .map(r -> Math.max(r, MIN_FEE_RATE)) diff --git a/proto/src/main/proto/grpc.proto b/proto/src/main/proto/grpc.proto index 1ed87f2085..d9e0a3973d 100644 --- a/proto/src/main/proto/grpc.proto +++ b/proto/src/main/proto/grpc.proto @@ -51,6 +51,8 @@ service Offers { } rpc CreateOffer (CreateOfferRequest) returns (CreateOfferReply) { } + rpc CancelOffer (CancelOfferRequest) returns (CancelOfferReply) { + } } message GetOfferRequest { @@ -85,6 +87,13 @@ message CreateOfferReply { OfferInfo offer = 1; } +message CancelOfferRequest { + string id = 1; +} + +message CancelOfferReply { +} + message OfferInfo { string id = 1; string direction = 2; @@ -96,12 +105,13 @@ message OfferInfo { uint64 volume = 8; uint64 minVolume = 9; uint64 buyerSecurityDeposit = 10; - string paymentAccountId = 11; // only used when creating offer + string paymentAccountId = 11; string paymentMethodId = 12; string paymentMethodShortName = 13; string baseCurrencyCode = 14; string counterCurrencyCode = 15; uint64 date = 16; + string state = 17; } /////////////////////////////////////////////////////////////////////////////////////////// @@ -166,6 +176,98 @@ message GetTradeStatisticsReply { repeated TradeStatistics3 TradeStatistics = 1; } +/////////////////////////////////////////////////////////////////////////////////////////// +// Trades +/////////////////////////////////////////////////////////////////////////////////////////// + +service Trades { + rpc GetTrade (GetTradeRequest) returns (GetTradeReply) { + } + rpc TakeOffer (TakeOfferRequest) returns (TakeOfferReply) { + } + rpc ConfirmPaymentStarted (ConfirmPaymentStartedRequest) returns (ConfirmPaymentStartedReply) { + } + rpc ConfirmPaymentReceived (ConfirmPaymentReceivedRequest) returns (ConfirmPaymentReceivedReply) { + } + rpc KeepFunds (KeepFundsRequest) returns (KeepFundsReply) { + } + rpc WithdrawFunds (WithdrawFundsRequest) returns (WithdrawFundsReply) { + } +} + +message TakeOfferRequest { + string offerId = 1; + string paymentAccountId = 2; +} + +message TakeOfferReply { + TradeInfo trade = 1; +} + +message ConfirmPaymentStartedRequest { + string tradeId = 1; +} + +message ConfirmPaymentStartedReply { +} + +message ConfirmPaymentReceivedRequest { + string tradeId = 1; +} + +message ConfirmPaymentReceivedReply { +} + +message GetTradeRequest { + string tradeId = 1; +} + +message GetTradeReply { + TradeInfo trade = 1; +} + +message KeepFundsRequest { + string tradeId = 1; +} + +message KeepFundsReply { +} + +message WithdrawFundsRequest { + string tradeId = 1; + string address = 2; +} + +message WithdrawFundsReply { +} + +message TradeInfo { + OfferInfo offer = 1; + string tradeId = 2; + string shortId = 3; + uint64 date = 4; + string role = 5; + bool isCurrencyForTakerFeeBtc = 6; + uint64 txFeeAsLong = 7; + uint64 takerFeeAsLong = 8; + string takerFeeTxId = 9; + string depositTxId = 10; + string payoutTxId = 11; + uint64 tradeAmountAsLong = 12; + uint64 tradePrice = 13; + string tradingPeerNodeAddress = 14; + string state = 15; + string phase = 16; + string tradePeriodState = 17; + bool isDepositPublished = 18; + bool isDepositConfirmed = 19; + bool isFiatSent = 20; + bool isFiatReceived = 21; + bool isPayoutPublished = 22; + bool isWithdrawn = 23; + string contractAsJson = 24; +} + /////////////////////////////////////////////////////////////////////////////////////////// // Wallets /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 8323a58c4a..63dea6c6fe 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -147,7 +147,7 @@ message GetInventoryRequest { } message GetInventoryResponse { - map num_payloads_map = 1; + map inventory = 1; } // offer @@ -271,13 +271,15 @@ message DelayedPayoutTxSignatureRequest { string trade_id = 2; NodeAddress sender_node_address = 3; bytes delayed_payout_tx = 4; + bytes delayed_payout_tx_seller_signature = 5; } message DelayedPayoutTxSignatureResponse { string uid = 1; string trade_id = 2; NodeAddress sender_node_address = 3; - bytes delayed_payout_tx_signature = 4; + bytes delayed_payout_tx_buyer_signature = 4; + bytes deposit_tx = 5; } message DepositTxAndDelayedPayoutTxMessage { @@ -292,7 +294,7 @@ message DepositTxMessage { string uid = 1; string trade_id = 2; NodeAddress sender_node_address = 3; - bytes deposit_tx = 4; + bytes deposit_tx_without_witnesses = 4; } message PeerPublishedDelayedPayoutTxMessage { @@ -570,6 +572,20 @@ message DataAndSeqNrPair { int32 sequence_number = 2; } +message MailboxMessageList { + repeated MailboxItem mailbox_item = 1; +} + +message MailboxItem { + ProtectedMailboxStorageEntry protected_mailbox_storage_entry = 1; + DecryptedMessageWithPubKey decrypted_message_with_pub_key = 2; +} + +message DecryptedMessageWithPubKey { + NetworkEnvelope network_envelope = 1; + bytes signature_pub_key_bytes = 2; +} + // misc message PrivateNotificationPayload { @@ -660,6 +676,7 @@ message Filter { string signer_pub_key_as_hex = 22; repeated string bannedPrivilegedDevPubKeys = 23; bool disable_auto_conf = 24; + repeated string banned_auto_conf_explorers = 25; } // Deprecated @@ -931,6 +948,9 @@ message PaymentAccountPayload { AdvancedCashAccountPayload advanced_cash_account_payload = 26; InstantCryptoCurrencyAccountPayload instant_crypto_currency_account_payload = 27; JapanBankAccountPayload japan_bank_account_payload = 28; + TransferwiseAccountPayload Transferwise_account_payload = 29; + AustraliaPayidPayload australia_payid_payload = 30; + AmazonGiftCardAccountPayload amazon_gift_card_account_payload = 31; } map exclude_from_json_data = 15; } @@ -998,6 +1018,11 @@ message JapanBankAccountPayload { string bank_account_number = 7; } +message AustraliaPayidPayload { + string bank_account_name = 1; + string payid = 2; +} + message SpecificBanksAccountPayload { repeated string accepted_banks = 1; } @@ -1033,6 +1058,10 @@ message WesternUnionAccountPayload { string email = 4; } +message AmazonGiftCardAccountPayload { + string email_or_mobile_nr = 1; +} + message SepaAccountPayload { string holder_name = 1; string iban = 2; @@ -1131,6 +1160,10 @@ message AdvancedCashAccountPayload { string account_nr = 1; } +message TransferwiseAccountPayload { + string email = 1; +} + /////////////////////////////////////////////////////////////////////////////////////////// // PersistableEnvelope /////////////////////////////////////////////////////////////////////////////////////////// @@ -1176,6 +1209,7 @@ message PersistableEnvelope { MediationDisputeList mediation_dispute_list = 29; RefundDisputeList refund_dispute_list = 30; TradeStatistics3Store trade_statistics3_store = 31; + MailboxMessageList mailbox_message_list = 32; } } @@ -1534,7 +1568,7 @@ message PreferencesPayload { bool use_tor_for_bitcoin_j = 12; bool show_own_offers_in_offer_book = 13; TradeCurrency preferred_trade_currency = 14; - int64 withdrawal_tx_fee_in_bytes = 15; + int64 withdrawal_tx_fee_in_vbytes = 15; bool use_custom_withdrawal_tx_fee = 16; double max_price_distance_in_percent = 17; string offer_book_chart_screen_currency_code = 18; @@ -1576,6 +1610,7 @@ message PreferencesPayload { int32 css_theme = 54; bool tac_accepted_v120 = 55; repeated AutoConfirmSettings auto_confirm_settings = 56; + double bsq_average_trim_threshold = 57; } message AutoConfirmSettings { diff --git a/relay/src/main/resources/version.txt b/relay/src/main/resources/version.txt index 4c021dbd81..d65536257d 100644 --- a/relay/src/main/resources/version.txt +++ b/relay/src/main/resources/version.txt @@ -1 +1 @@ -1.4.2-SNAPSHOT +1.5.0-SNAPSHOT diff --git a/seednode/bisq.env b/seednode/bisq.env index 18ee8294b5..a6e71b8f6d 100644 --- a/seednode/bisq.env +++ b/seednode/bisq.env @@ -29,7 +29,7 @@ BISQ_BASE_CURRENCY=btc_mainnet # bisq node settings BISQ_NODE_PORT=8000 -BISQ_MAX_CONNECTIONS=40 +BISQ_MAX_CONNECTIONS=20 BISQ_MAX_MEMORY=4000 # set to true for BSQ seednode diff --git a/seednode/src/main/java/bisq/seednode/SeedNode.java b/seednode/src/main/java/bisq/seednode/SeedNode.java index e372defbee..ff2f2609d3 100644 --- a/seednode/src/main/java/bisq/seednode/SeedNode.java +++ b/seednode/src/main/java/bisq/seednode/SeedNode.java @@ -19,6 +19,7 @@ package bisq.seednode; import bisq.core.app.misc.AppSetup; import bisq.core.app.misc.AppSetupWithP2PAndDAO; +import bisq.core.network.p2p.inventory.GetInventoryRequestHandler; import com.google.inject.Injector; @@ -30,6 +31,7 @@ public class SeedNode { @Setter private Injector injector; private AppSetup appSetup; + private GetInventoryRequestHandler getInventoryRequestHandler; public SeedNode() { } @@ -37,5 +39,11 @@ public class SeedNode { public void startApplication() { appSetup = injector.getInstance(AppSetupWithP2PAndDAO.class); appSetup.start(); + + getInventoryRequestHandler = injector.getInstance(GetInventoryRequestHandler.class); + } + + public void shutDown() { + getInventoryRequestHandler.shutDown(); } } diff --git a/seednode/src/main/java/bisq/seednode/SeedNodeMain.java b/seednode/src/main/java/bisq/seednode/SeedNodeMain.java index c02811ce42..bccdb3a368 100644 --- a/seednode/src/main/java/bisq/seednode/SeedNodeMain.java +++ b/seednode/src/main/java/bisq/seednode/SeedNodeMain.java @@ -17,30 +17,36 @@ package bisq.seednode; +import bisq.core.app.TorSetup; import bisq.core.app.misc.ExecutableForAppWithP2p; import bisq.core.app.misc.ModuleForAppWithP2p; import bisq.network.p2p.P2PService; import bisq.network.p2p.P2PServiceListener; +import bisq.network.p2p.peers.PeerManager; +import bisq.common.Timer; import bisq.common.UserThread; import bisq.common.app.AppModule; import bisq.common.app.Capabilities; import bisq.common.app.Capability; +import bisq.common.handlers.ResultHandler; import lombok.extern.slf4j.Slf4j; @Slf4j public class SeedNodeMain extends ExecutableForAppWithP2p { - private static final String VERSION = "1.4.2"; + private static final long CHECK_CONNECTION_LOSS_SEC = 30; + private static final String VERSION = "1.5.0"; private SeedNode seedNode; + private Timer checkConnectionLossTime; public SeedNodeMain() { super("Bisq Seednode", "bisq-seednode", "bisq_seednode", VERSION); } - public static void main(String[] args) throws Exception { - log.info("SeedNode.VERSION: " + VERSION); + public static void main(String[] args) { + System.out.println("SeedNode.VERSION: " + VERSION); new SeedNodeMain().execute(args); } @@ -125,6 +131,7 @@ public class SeedNodeMain extends ExecutableForAppWithP2p { @Override public void onHiddenServicePublished() { startShutDownInterval(SeedNodeMain.this); + UserThread.runAfter(() -> setupConnectionLossCheck(), 60); } @Override @@ -138,4 +145,27 @@ public class SeedNodeMain extends ExecutableForAppWithP2p { } }); } + + private void setupConnectionLossCheck() { + if (checkConnectionLossTime != null) { + return; + } + + checkConnectionLossTime = UserThread.runPeriodically(() -> { + if (injector.getInstance(PeerManager.class).getNumAllConnectionsLostEvents() > 1) { + // Removing cache files help in case the node got flagged from Tor's dos protection + injector.getInstance(TorSetup.class).cleanupTorFiles(() -> { + log.info("Tor directory reset"); + shutDown(this); + }, log::error); + } + }, CHECK_CONNECTION_LOSS_SEC); + + } + + @Override + public void gracefulShutDown(ResultHandler resultHandler) { + seedNode.shutDown(); + super.gracefulShutDown(resultHandler); + } } diff --git a/settings.gradle b/settings.gradle index 45ca599336..1827ef9c4f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,6 +11,7 @@ include 'pricenode' include 'relay' include 'seednode' include 'statsnode' +include 'inventory' include 'apitest' rootProject.name = 'bisq'