mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2026-01-22 15:35:12 +01:00
@@ -39,7 +39,6 @@ namespace BTCPayServer.Client.Models
|
||||
public string NotificationUrl { get; set; } = null;
|
||||
public string RedirectUrl { get; set; } = null;
|
||||
public bool? RedirectAutomatically { get; set; } = null;
|
||||
public bool? RequiresRefundEmail { get; set; } = null;
|
||||
public bool? Archived { get; set; } = null;
|
||||
public string FormId { get; set; } = null;
|
||||
public string EmbeddedCSS { get; set; } = null;
|
||||
|
||||
@@ -83,9 +83,7 @@ namespace BTCPayServer.Client.Models
|
||||
public string RedirectURL { get; set; }
|
||||
|
||||
public bool? RedirectAutomatically { get; set; }
|
||||
public bool? RequiresRefundEmail { get; set; } = null;
|
||||
public string DefaultLanguage { get; set; }
|
||||
public CheckoutType? CheckoutType { get; set; }
|
||||
public bool? LazyPaymentMethods { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ namespace BTCPayServer.Client.Models
|
||||
public string Description { get; set; }
|
||||
public string EmbeddedCSS { get; set; }
|
||||
public bool? RedirectAutomatically { get; set; }
|
||||
public bool? RequiresRefundEmail { get; set; }
|
||||
}
|
||||
|
||||
public class CrowdfundAppData : AppDataBase
|
||||
|
||||
@@ -36,11 +36,6 @@ namespace BTCPayServer.Client.Models
|
||||
public double PaymentTolerance { get; set; } = 0;
|
||||
public bool AnyoneCanCreateInvoice { get; set; }
|
||||
public string DefaultCurrency { get; set; }
|
||||
public bool RequiresRefundEmail { get; set; }
|
||||
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
|
||||
public CheckoutType? CheckoutType { get; set; }
|
||||
|
||||
public bool LightningAmountInSatoshi { get; set; }
|
||||
public bool LightningPrivateRouteHints { get; set; }
|
||||
@@ -61,10 +56,6 @@ namespace BTCPayServer.Client.Models
|
||||
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
|
||||
public string DefaultLang { get; set; } = "en";
|
||||
|
||||
public string CustomLogo { get; set; }
|
||||
|
||||
public string CustomCSS { get; set; }
|
||||
|
||||
public string HtmlTitle { get; set; }
|
||||
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
@@ -94,12 +85,6 @@ namespace BTCPayServer.Client.Models
|
||||
public IDictionary<string, JToken> AdditionalData { get; set; }
|
||||
}
|
||||
|
||||
public enum CheckoutType
|
||||
{
|
||||
V1,
|
||||
V2
|
||||
}
|
||||
|
||||
public enum NetworkFeeMode
|
||||
{
|
||||
MultiplePaymentsOnly,
|
||||
|
||||
@@ -67,7 +67,10 @@ namespace BTCPayServer.Data
|
||||
"archived",
|
||||
"isUnderPaid",
|
||||
"requiresRefundEmail",
|
||||
"invoiceTime"
|
||||
"invoiceTime",
|
||||
"checkoutType",
|
||||
"customLogo",
|
||||
"customCSS"
|
||||
};
|
||||
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
@@ -134,7 +137,7 @@ namespace BTCPayServer.Data
|
||||
blob.Move(["productInformation", prop.Name], ["metadata", prop.Name]);
|
||||
}
|
||||
blob.Move(["orderId"], ["metadata", "orderId"]);
|
||||
foreach (string prop in new string[] { "posData", "checkoutType", "defaultLanguage", "notificationEmail", "notificationURL", "storeSupportUrl", "redirectURL" })
|
||||
foreach (string prop in new string[] { "posData", "defaultLanguage", "notificationEmail", "notificationURL", "storeSupportUrl", "redirectURL" })
|
||||
{
|
||||
blob.RemoveIfNull(prop);
|
||||
}
|
||||
|
||||
@@ -430,61 +430,6 @@ namespace BTCPayServer.Tests
|
||||
Assert.Equal(TimeSpan.FromDays(5.0), pp.BOLT11Expiration);
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
[Trait("Altcoins", "Altcoins")]
|
||||
[Trait("Lightning", "Lightning")]
|
||||
[Trait("Integration", "Integration")]
|
||||
public async Task CanUsePaymentMethodDropdown()
|
||||
{
|
||||
using (var s = CreateSeleniumTester())
|
||||
{
|
||||
s.Server.ActivateLTC();
|
||||
s.Server.ActivateLightning();
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser(true);
|
||||
s.CreateNewStore();
|
||||
s.AddDerivationScheme("BTC");
|
||||
s.EnableCheckout(Client.Models.CheckoutType.V1);
|
||||
//check that there is no dropdown since only one payment method is set
|
||||
var invoiceId = s.CreateInvoice(10, "USD", "a@g.com");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.FindElement(By.ClassName("payment__currencies_noborder"));
|
||||
s.GoToHome();
|
||||
s.GoToStore();
|
||||
s.AddDerivationScheme("LTC");
|
||||
s.AddLightningNode(LightningConnectionType.CLightning);
|
||||
//there should be three now
|
||||
invoiceId = s.CreateInvoice(10, "USD", "a@g.com");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
var currencyDropdownButton = s.Driver.FindElement(By.ClassName("payment__currencies"));
|
||||
Assert.Contains("Bitcoin", currencyDropdownButton.Text);
|
||||
currencyDropdownButton.Click();
|
||||
IEnumerable<IWebElement> elements = null;
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
elements = s.Driver.FindElement(By.ClassName("vex-content")).FindElements(By.ClassName("vexmenuitem"));
|
||||
Assert.Equal(3, elements.Count());
|
||||
elements.Single(element => element.Text.Contains("Litecoin")).Click();
|
||||
});
|
||||
currencyDropdownButton = s.Driver.FindElement(By.ClassName("payment__currencies"));
|
||||
Assert.Contains("Litecoin", currencyDropdownButton.Text);
|
||||
currencyDropdownButton.Click();
|
||||
|
||||
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
elements = s.Driver.FindElement(By.ClassName("vex-content")).FindElements(By.ClassName("vexmenuitem"));
|
||||
elements.Single(element => element.Text.Contains("Lightning")).Click();
|
||||
});
|
||||
|
||||
currencyDropdownButton = s.Driver.FindElement(By.ClassName("payment__currencies"));
|
||||
Assert.Contains("Lightning", currencyDropdownButton.Text);
|
||||
|
||||
s.Driver.Quit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
[Trait("Integration", "Integration")]
|
||||
[Trait("Altcoins", "Altcoins")]
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<PackageReference Include="Newtonsoft.Json.Schema" Version="3.0.15" />
|
||||
<PackageReference Include="Selenium.Support" Version="4.1.1" />
|
||||
<PackageReference Include="Selenium.WebDriver" Version="4.1.1" />
|
||||
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="121.0.6167.8500" />
|
||||
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="123.0.6312.8600" />
|
||||
<PackageReference Include="xunit" Version="2.6.6" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using BTCPayServer.Client.Models;
|
||||
using BTCPayServer.Payments;
|
||||
using BTCPayServer.Tests.Logging;
|
||||
using BTCPayServer.Views.Stores;
|
||||
using NBitcoin;
|
||||
using OpenQA.Selenium;
|
||||
using OpenQA.Selenium.Support.UI;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
@@ -21,208 +20,443 @@ namespace BTCPayServer.Tests
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
public async Task CanHandleRefundEmailForm()
|
||||
[Trait("Lightning", "Lightning")]
|
||||
public async Task CanConfigureCheckout()
|
||||
{
|
||||
using var s = CreateSeleniumTester();
|
||||
s.Server.ActivateLightning();
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser();
|
||||
s.RegisterNewUser(true);
|
||||
s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.AddDerivationScheme();
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
s.Driver.FindElement(By.Id("RequiresRefundEmail")).Click();
|
||||
s.AddLightningNode();
|
||||
// Use non-legacy derivation scheme
|
||||
s.AddDerivationScheme("BTC", "tpubDD79XF4pzhmPSJ9AyUay9YbXAeD1c6nkUqC32pnKARJH6Ja5hGUfGc76V82ahXpsKqN6UcSGXMkzR34aZq4W23C6DAdZFaVrzWqzj24F8BC");
|
||||
|
||||
// Configure store url
|
||||
var storeUrl = "https://satoshisteaks.com/";
|
||||
var supportUrl = "https://support.satoshisteaks.com/{InvoiceId}/";
|
||||
s.GoToStore();
|
||||
s.Driver.FindElement(By.Id("StoreWebsite")).SendKeys(storeUrl);
|
||||
s.Driver.FindElement(By.Id("Save")).Click();
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
var emailAlreadyThereInvoiceId = s.CreateInvoice(100, "USD", "a@g.com");
|
||||
s.GoToInvoiceCheckout(emailAlreadyThereInvoiceId);
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
s.GoToHome();
|
||||
s.CreateInvoice();
|
||||
s.Driver.FindElement(By.ClassName("invoice-checkout-link")).Click();
|
||||
Assert.NotEmpty(s.Driver.FindElements(By.Id("checkoutCtrl")));
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
s.Driver.WaitForAndClick(By.Id("Presets"));
|
||||
s.Driver.WaitForAndClick(By.Id("Presets_InStore"));
|
||||
Assert.True(s.Driver.SetCheckbox(By.Id("ShowPayInWalletButton"), true));
|
||||
s.Driver.FindElement(By.Id("SupportUrl")).SendKeys(supportUrl);
|
||||
s.Driver.FindElement(By.Id("Save")).SendKeys(Keys.Enter);
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
Assert.True(s.Driver.FindElement(By.Id("emailAddressFormInput")).Displayed);
|
||||
s.Driver.FindElement(By.Id("emailAddressFormInput")).SendKeys("xxx");
|
||||
s.Driver.FindElement(By.Id("emailAddressForm")).FindElement(By.CssSelector("button.action-button"))
|
||||
.Click();
|
||||
var formInput = s.Driver.FindElement(By.Id("emailAddressFormInput"));
|
||||
|
||||
Assert.True(formInput.Displayed);
|
||||
Assert.Contains("form-input-invalid", formInput.GetAttribute("class"));
|
||||
formInput = s.Driver.FindElement(By.Id("emailAddressFormInput"));
|
||||
formInput.SendKeys("@g.com");
|
||||
var actionButton = s.Driver.FindElement(By.Id("emailAddressForm")).FindElement(By.CssSelector("button.action-button"));
|
||||
actionButton.Click();
|
||||
try // Sometimes the click only take the focus, without actually really clicking on it...
|
||||
{
|
||||
actionButton.Click();
|
||||
}
|
||||
catch { }
|
||||
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
s.Driver.Navigate().Refresh();
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
public async Task CanHandleRefundEmailForm2()
|
||||
{
|
||||
using var s = CreateSeleniumTester();
|
||||
// Prepare user account and store
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser();
|
||||
s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.AddDerivationScheme();
|
||||
|
||||
// Now create an invoice that requires a refund email
|
||||
var invoice = s.CreateInvoice(100, "USD", "", null, true);
|
||||
s.GoToInvoiceCheckout(invoice);
|
||||
|
||||
var emailInput = s.Driver.FindElement(By.Id("emailAddressFormInput"));
|
||||
Assert.True(emailInput.Displayed);
|
||||
|
||||
emailInput.SendKeys("a@g.com");
|
||||
|
||||
var actionButton = s.Driver.FindElement(By.Id("emailAddressForm")).FindElement(By.CssSelector("button.action-button"));
|
||||
actionButton.Click();
|
||||
try // Sometimes the click only take the focus, without actually really clicking on it...
|
||||
{
|
||||
actionButton.Click();
|
||||
}
|
||||
catch { }
|
||||
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
s.Driver.Navigate().Refresh();
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
|
||||
s.GoToHome();
|
||||
|
||||
// Now create an invoice that doesn't require a refund email
|
||||
s.CreateInvoice(100, "USD", "", null, false);
|
||||
s.Driver.FindElement(By.ClassName("invoice-checkout-link")).Click();
|
||||
Assert.NotEmpty(s.Driver.FindElements(By.Id("checkoutCtrl")));
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
s.Driver.Navigate().Refresh();
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
|
||||
s.GoToHome();
|
||||
|
||||
// Now create an invoice that requires refund email but already has one set, email input shouldn't show up
|
||||
s.CreateInvoice(100, "USD", "a@g.com", null, true);
|
||||
s.Driver.FindElement(By.ClassName("invoice-checkout-link")).Click();
|
||||
Assert.NotEmpty(s.Driver.FindElements(By.Id("checkoutCtrl")));
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
s.Driver.Navigate().Refresh();
|
||||
s.Driver.AssertElementNotFound(By.Id("emailAddressFormInput"));
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
public async Task CanUseLanguageDropdown()
|
||||
{
|
||||
using var s = CreateSeleniumTester();
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser();
|
||||
s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.AddDerivationScheme();
|
||||
|
||||
var invoiceId = s.CreateInvoice();
|
||||
// Top up/zero amount invoices
|
||||
var invoiceId = s.CreateInvoice(amount: null);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
Assert.True(s.Driver.FindElement(By.Id("DefaultLang")).FindElements(By.TagName("option")).Count > 1);
|
||||
var payWithTextEnglish = s.Driver.FindElement(By.Id("pay-with-text")).Text;
|
||||
Assert.Equal(2, s.Driver.FindElements(By.CssSelector(".payment-method")).Count);
|
||||
Assert.Contains("Bitcoin", s.Driver.FindElement(By.CssSelector(".payment-method.active")).Text);
|
||||
Assert.Contains("LNURL", s.Driver.FindElement(By.CssSelector(".payment-method:nth-child(2)")).Text);
|
||||
var qrValue = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-qr-value");
|
||||
var clipboard = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-clipboard");
|
||||
var payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
var address = s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text;
|
||||
Assert.StartsWith("bcrt", s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text);
|
||||
Assert.DoesNotContain("lightning=", payUrl);
|
||||
Assert.Equal($"bitcoin:{address}", payUrl);
|
||||
Assert.Equal($"bitcoin:{address}", clipboard);
|
||||
Assert.Equal($"bitcoin:{address.ToUpperInvariant()}", qrValue);
|
||||
s.Driver.ElementDoesNotExist(By.Id("Lightning_BTC-CHAIN"));
|
||||
|
||||
var prettyDropdown = s.Driver.FindElement(By.Id("prettydropdown-DefaultLang"));
|
||||
prettyDropdown.Click();
|
||||
await Task.Delay(200);
|
||||
prettyDropdown.FindElement(By.CssSelector("[data-value=\"da-DK\"]")).Click();
|
||||
await Task.Delay(1000);
|
||||
Assert.NotEqual(payWithTextEnglish, s.Driver.FindElement(By.Id("pay-with-text")).Text);
|
||||
s.Driver.Navigate().GoToUrl(s.Driver.Url + "?lang=da-DK");
|
||||
// Details should show exchange rate
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalPrice"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalFiat"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-AmountDue"));
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("sat/byte", s.Driver.FindElement(By.Id("PaymentDetails-RecommendedFee")).Text);
|
||||
|
||||
Assert.NotEqual(payWithTextEnglish, s.Driver.FindElement(By.Id("pay-with-text")).Text);
|
||||
// Switch to LNURL
|
||||
s.Driver.FindElement(By.CssSelector(".payment-method:nth-child(2)")).Click();
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.StartsWith("lightning:lnurl", payUrl);
|
||||
Assert.StartsWith("lnurl", s.Driver.WaitForElement(By.CssSelector("#Lightning_BTC-CHAIN .truncate-center-start")).Text);
|
||||
s.Driver.ElementDoesNotExist(By.Id("Address_BTC-CHAIN"));
|
||||
});
|
||||
|
||||
s.Driver.Quit();
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
[Trait("Lightning", "Lightning")]
|
||||
public async Task CanSetDefaultPaymentMethod()
|
||||
{
|
||||
using var s = CreateSeleniumTester();
|
||||
s.Server.ActivateLightning();
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser(true);
|
||||
s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.AddLightningNode();
|
||||
s.AddDerivationScheme();
|
||||
|
||||
var invoiceId = s.CreateInvoice(defaultPaymentMethod: "BTC-LN");
|
||||
// Default payment method
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice(21000, "SATS", defaultPaymentMethod: "BTC-LN");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
Assert.Equal("Lightning", s.Driver.FindElement(By.ClassName("payment__currencies")).Text);
|
||||
s.Driver.Quit();
|
||||
}
|
||||
Assert.Equal(2, s.Driver.FindElements(By.CssSelector(".payment-method")).Count);
|
||||
Assert.Contains("Lightning", s.Driver.WaitForElement(By.CssSelector(".payment-method.active")).Text);
|
||||
Assert.Contains("Bitcoin", s.Driver.WaitForElement(By.CssSelector(".payment-method")).Text);
|
||||
qrValue = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-qr-value");
|
||||
clipboard = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-clipboard");
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
address = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-LN .truncate-center-start")).Text;
|
||||
Assert.Equal($"lightning:{address}", payUrl);
|
||||
Assert.Equal($"lightning:{address}", clipboard);
|
||||
Assert.Equal($"lightning:{address.ToUpperInvariant()}", qrValue);
|
||||
s.Driver.ElementDoesNotExist(By.Id("Address_BTC-CHAIN"));
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
[Trait("Lightning", "Lightning")]
|
||||
public async Task CanUseLightningSatsFeature()
|
||||
{
|
||||
using var s = CreateSeleniumTester();
|
||||
s.Server.ActivateLightning();
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser(true);
|
||||
s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.AddLightningNode();
|
||||
// Lightning amount in sats
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("AmountDue")).Text);
|
||||
s.GoToHome();
|
||||
s.GoToLightningSettings();
|
||||
s.Driver.SetCheckbox(By.Id("LightningAmountInSatoshi"), true);
|
||||
s.Driver.FindElement(By.Id("save")).Click();
|
||||
Assert.Contains("BTC Lightning settings successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
var invoiceId = s.CreateInvoice(10, "USD", "a@g.com");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.ClassName("buyerTotalLine")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("AmountDue")).Text);
|
||||
|
||||
// Details should not show exchange rate
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-ExchangeRate"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalFiat"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-RecommendedFee"));
|
||||
Assert.Contains("21 000 sats", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("21 000 sats", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// Expire
|
||||
var expirySeconds = s.Driver.FindElement(By.Id("ExpirySeconds"));
|
||||
expirySeconds.Clear();
|
||||
expirySeconds.SendKeys("3");
|
||||
s.Driver.FindElement(By.Id("Expire")).Click();
|
||||
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.Contains("This invoice will expire in", paymentInfo.Text);
|
||||
Assert.DoesNotContain("Please send", paymentInfo.Text);
|
||||
});
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var expiredSection = s.Driver.FindElement(By.Id("unpaid"));
|
||||
Assert.True(expiredSection.Displayed);
|
||||
Assert.Contains("Invoice Expired", expiredSection.Text);
|
||||
Assert.Contains("resubmit a payment", expiredSection.Text);
|
||||
Assert.DoesNotContain("This invoice expired with partial payment", expiredSection.Text);
|
||||
});
|
||||
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ContactLink")));
|
||||
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ReceiptLink")));
|
||||
Assert.Equal(storeUrl, s.Driver.FindElement(By.Id("StoreLink")).GetAttribute("href"));
|
||||
|
||||
// Expire paid partial
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice(2100, "EUR");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
await Task.Delay(200);
|
||||
address = s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text;
|
||||
var amountFraction = "0.00001";
|
||||
await s.Server.ExplorerNode.SendToAddressAsync(BitcoinAddress.Create(address, Network.RegTest),
|
||||
Money.Parse(amountFraction));
|
||||
await s.Server.ExplorerNode.GenerateAsync(1);
|
||||
|
||||
expirySeconds = s.Driver.FindElement(By.Id("ExpirySeconds"));
|
||||
expirySeconds.Clear();
|
||||
expirySeconds.SendKeys("3");
|
||||
s.Driver.FindElement(By.Id("Expire")).Click();
|
||||
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.Contains("The invoice hasn't been paid in full.", paymentInfo.Text);
|
||||
Assert.Contains("Please send", paymentInfo.Text);
|
||||
});
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var expiredSection = s.Driver.FindElement(By.Id("unpaid"));
|
||||
Assert.True(expiredSection.Displayed);
|
||||
Assert.Contains("Invoice Expired", expiredSection.Text);
|
||||
Assert.Contains("This invoice expired with partial payment", expiredSection.Text);
|
||||
Assert.DoesNotContain("resubmit a payment", expiredSection.Text);
|
||||
});
|
||||
var contactLink = s.Driver.FindElement(By.Id("ContactLink"));
|
||||
Assert.Equal("Contact us", contactLink.Text);
|
||||
Assert.Matches(supportUrl.Replace("{InvoiceId}", invoiceId), contactLink.GetAttribute("href"));
|
||||
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ReceiptLink")));
|
||||
Assert.Equal(storeUrl, s.Driver.FindElement(By.Id("StoreLink")).GetAttribute("href"));
|
||||
|
||||
// Test payment
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice();
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
|
||||
// Details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
var details = s.Driver.FindElement(By.CssSelector(".payment-details"));
|
||||
Assert.Contains("Total Price", details.Text);
|
||||
Assert.Contains("Total Fiat", details.Text);
|
||||
Assert.Contains("Exchange Rate", details.Text);
|
||||
Assert.Contains("Amount Due", details.Text);
|
||||
Assert.Contains("Recommended Fee", details.Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// Pay partial amount
|
||||
await Task.Delay(200);
|
||||
s.Driver.FindElement(By.Id("test-payment-amount")).Clear();
|
||||
s.Driver.FindElement(By.Id("test-payment-amount")).SendKeys("0.00001");
|
||||
|
||||
// Fake Pay
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
s.Driver.FindElement(By.Id("FakePayment")).Click();
|
||||
s.Driver.FindElement(By.Id("mine-block")).Click();
|
||||
var paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.Contains("The invoice hasn't been paid in full", paymentInfo.Text);
|
||||
Assert.Contains("Please send", paymentInfo.Text);
|
||||
});
|
||||
|
||||
s.Driver.Navigate().Refresh();
|
||||
|
||||
// Pay full amount
|
||||
s.PayInvoice();
|
||||
|
||||
// Processing
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var processingSection = s.Driver.WaitForElement(By.Id("processing"));
|
||||
Assert.True(processingSection.Displayed);
|
||||
Assert.Contains("Payment Received", processingSection.Text);
|
||||
Assert.Contains("Your payment has been received and is now processing", processingSection.Text);
|
||||
});
|
||||
s.Driver.FindElement(By.Id("confetti"));
|
||||
|
||||
// Mine
|
||||
s.MineBlockOnInvoiceCheckout();
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
Assert.Contains("Mined 1 block",
|
||||
s.Driver.WaitForElement(By.Id("CheatSuccessMessage")).Text);
|
||||
});
|
||||
|
||||
// Settled
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var settledSection = s.Driver.WaitForElement(By.Id("settled"));
|
||||
Assert.True(settledSection.Displayed);
|
||||
Assert.Contains("Invoice Paid", settledSection.Text);
|
||||
});
|
||||
s.Driver.FindElement(By.Id("confetti"));
|
||||
s.Driver.FindElement(By.Id("ReceiptLink"));
|
||||
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ContactLink")));
|
||||
Assert.Equal(storeUrl, s.Driver.FindElement(By.Id("StoreLink")).GetAttribute("href"));
|
||||
|
||||
// BIP21
|
||||
s.GoToHome();
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
s.Driver.SetCheckbox(By.Id("OnChainWithLnInvoiceFallback"), true);
|
||||
s.Driver.SetCheckbox(By.Id("LightningAmountInSatoshi"), false);
|
||||
s.Driver.FindElement(By.Id("Save")).Click();
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
invoiceId = s.CreateInvoice();
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
Assert.Empty(s.Driver.FindElements(By.CssSelector(".payment-method")));
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("AmountDue")).Text);
|
||||
qrValue = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-qr-value");
|
||||
clipboard = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-clipboard");
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
var copyAddressOnchain = s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text;
|
||||
var copyAddressLightning = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-CHAIN .truncate-center-start")).Text;
|
||||
Assert.StartsWith($"bitcoin:{copyAddressOnchain}?amount=", payUrl);
|
||||
Assert.Contains("?amount=", payUrl);
|
||||
Assert.Contains("&lightning=", payUrl);
|
||||
Assert.StartsWith("bcrt", copyAddressOnchain);
|
||||
Assert.StartsWith("lnbcrt", copyAddressLightning);
|
||||
Assert.StartsWith($"bitcoin:{copyAddressOnchain.ToUpperInvariant()}?amount=", qrValue);
|
||||
Assert.Contains("&lightning=LNBCRT", qrValue);
|
||||
Assert.Contains("&lightning=lnbcrt", clipboard);
|
||||
Assert.Equal(clipboard, payUrl);
|
||||
|
||||
// Check details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
Assert.Contains("1 BTC = ", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// Switch to amount displayed in sats
|
||||
s.GoToHome();
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
s.Driver.SetCheckbox(By.Id("LightningAmountInSatoshi"), true);
|
||||
s.Driver.FindElement(By.Id("Save")).Click();
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("AmountDue")).Text);
|
||||
|
||||
// Check details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
Assert.Contains("1 sat = ", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// BIP21 with LN as default payment method
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice(defaultPaymentMethod: "BTC-LN");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
Assert.Empty(s.Driver.FindElements(By.CssSelector(".payment-method")));
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.StartsWith("bitcoin:", payUrl);
|
||||
Assert.Contains("&lightning=lnbcrt", payUrl);
|
||||
|
||||
// Check details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
Assert.Contains("1 sat = ", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// Ensure LNURL is enabled
|
||||
s.GoToHome();
|
||||
s.GoToLightningSettings();
|
||||
Assert.True(s.Driver.FindElement(By.Id("LNURLEnabled")).Selected);
|
||||
|
||||
// BIP21 with top-up invoice
|
||||
invoiceId = s.CreateInvoice(amount: null);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
Assert.Empty(s.Driver.FindElements(By.CssSelector(".payment-method")));
|
||||
qrValue = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-qr-value");
|
||||
clipboard = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-clipboard");
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
copyAddressOnchain = s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text;
|
||||
copyAddressLightning = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-CHAIN .truncate-center-start")).Text;
|
||||
Assert.StartsWith($"bitcoin:{copyAddressOnchain}", payUrl);
|
||||
Assert.Contains("?lightning=lnurl", payUrl);
|
||||
Assert.DoesNotContain("amount=", payUrl);
|
||||
Assert.StartsWith("bcrt", copyAddressOnchain);
|
||||
Assert.StartsWith("lnurl", copyAddressLightning);
|
||||
Assert.StartsWith($"bitcoin:{copyAddressOnchain.ToUpperInvariant()}?lightning=LNURL", qrValue);
|
||||
Assert.Contains($"bitcoin:{copyAddressOnchain}?lightning=lnurl", clipboard);
|
||||
Assert.Equal(clipboard, payUrl);
|
||||
|
||||
// Check details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
Assert.Contains("1 sat = ", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalFiat"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-AmountDue"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalPrice"));
|
||||
|
||||
// Expiry message should not show amount for top-up invoice
|
||||
expirySeconds = s.Driver.FindElement(By.Id("ExpirySeconds"));
|
||||
expirySeconds.Clear();
|
||||
expirySeconds.SendKeys("5");
|
||||
s.Driver.FindElement(By.Id("Expire")).Click();
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.Contains("This invoice will expire in", paymentInfo.Text);
|
||||
Assert.Contains("00:0", paymentInfo.Text);
|
||||
Assert.DoesNotContain("Please send", paymentInfo.Text);
|
||||
});
|
||||
|
||||
// Configure countdown timer
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice();
|
||||
s.GoToHome();
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
var displayExpirationTimer = s.Driver.FindElement(By.Id("DisplayExpirationTimer"));
|
||||
Assert.Equal("5", displayExpirationTimer.GetAttribute("value"));
|
||||
displayExpirationTimer.Clear();
|
||||
displayExpirationTimer.SendKeys("10");
|
||||
s.Driver.FindElement(By.Id("Save")).Click();
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
var paymentInfo = s.Driver.FindElement(By.Id("PaymentInfo"));
|
||||
Assert.False(paymentInfo.Displayed);
|
||||
Assert.DoesNotContain("This invoice will expire in", paymentInfo.Text);
|
||||
|
||||
expirySeconds = s.Driver.FindElement(By.Id("ExpirySeconds"));
|
||||
expirySeconds.Clear();
|
||||
expirySeconds.SendKeys("599");
|
||||
s.Driver.FindElement(By.Id("Expire")).Click();
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.True(paymentInfo.Displayed);
|
||||
Assert.Contains("This invoice will expire in", paymentInfo.Text);
|
||||
Assert.Contains("09:5", paymentInfo.Text);
|
||||
});
|
||||
|
||||
// Disable LNURL again
|
||||
s.GoToHome();
|
||||
s.GoToLightningSettings();
|
||||
s.Driver.SetCheckbox(By.Id("LNURLEnabled"), false);
|
||||
s.Driver.ScrollTo(By.Id("save"));
|
||||
s.Driver.FindElement(By.Id("save")).Click();
|
||||
Assert.Contains("BTC Lightning settings successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
// Test:
|
||||
// - NFC/LNURL-W available with just Lightning
|
||||
// - BIP21 works correctly even though Lightning is default payment method
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice(defaultPaymentMethod: "BTC-LN");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
Assert.Empty(s.Driver.FindElements(By.CssSelector(".payment-method")));
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.StartsWith("bitcoin:", payUrl);
|
||||
Assert.Contains("&lightning=lnbcrt", payUrl);
|
||||
|
||||
// Language Switch
|
||||
var languageSelect = new SelectElement(s.Driver.FindElement(By.Id("DefaultLang")));
|
||||
Assert.Equal("English", languageSelect.SelectedOption.Text);
|
||||
Assert.Equal("View Details", s.Driver.FindElement(By.Id("DetailsToggle")).Text);
|
||||
Assert.DoesNotContain("lang=", s.Driver.Url);
|
||||
languageSelect.SelectByText("Deutsch");
|
||||
Assert.Equal("Details anzeigen", s.Driver.FindElement(By.Id("DetailsToggle")).Text);
|
||||
Assert.Contains("lang=de", s.Driver.Url);
|
||||
|
||||
s.Driver.Navigate().Refresh();
|
||||
languageSelect = new SelectElement(s.Driver.WaitForElement(By.Id("DefaultLang")));
|
||||
Assert.Equal("Deutsch", languageSelect.SelectedOption.Text);
|
||||
Assert.Equal("Details anzeigen", s.Driver.FindElement(By.Id("DetailsToggle")).Text);
|
||||
languageSelect.SelectByText("English");
|
||||
Assert.Equal("View Details", s.Driver.FindElement(By.Id("DetailsToggle")).Text);
|
||||
Assert.Contains("lang=en", s.Driver.Url);
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
public async Task CanUseJSModal()
|
||||
public async Task CanUseCheckoutAsModal()
|
||||
{
|
||||
using var s = CreateSeleniumTester();
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser();
|
||||
s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.GoToStore();
|
||||
s.AddDerivationScheme();
|
||||
var invoiceId = s.CreateInvoice(0.001m, "BTC", "a@x.com");
|
||||
var invoice = await s.Server.PayTester.InvoiceRepository.GetInvoice(invoiceId);
|
||||
s.Driver.Navigate()
|
||||
.GoToUrl(new Uri(s.ServerUri, $"tests/index.html?invoice={invoiceId}"));
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
Assert.True(s.Driver.FindElement(By.Name("btcpay")).Displayed);
|
||||
});
|
||||
s.Driver.WaitUntilAvailable(By.Name("btcpay"));
|
||||
|
||||
var frameElement = s.Driver.FindElement(By.Name("btcpay"));
|
||||
Assert.True(frameElement.Displayed);
|
||||
var iframe = s.Driver.SwitchTo().Frame(frameElement);
|
||||
iframe.WaitUntilAvailable(By.Id("Checkout"));
|
||||
|
||||
await s.Server.ExplorerNode.SendToAddressAsync(BitcoinAddress.Create(invoice
|
||||
.GetPaymentPrompt(PaymentTypes.CHAIN.GetPaymentMethodId("BTC"))
|
||||
.Destination, Network.RegTest),
|
||||
new Money(0.001m, MoneyUnit.BTC));
|
||||
|
||||
IWebElement closebutton = null;
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var frameElement = s.Driver.FindElement(By.Name("btcpay"));
|
||||
var iframe = s.Driver.SwitchTo().Frame(frameElement);
|
||||
closebutton = iframe.FindElement(By.ClassName("close-action"));
|
||||
Assert.True(closebutton.Displayed);
|
||||
var closeButton = iframe.FindElement(By.Id("close"));
|
||||
Assert.True(closeButton.Displayed);
|
||||
closeButton.Click();
|
||||
});
|
||||
closebutton.Click();
|
||||
s.Driver.AssertElementNotFound(By.Name("btcpay"));
|
||||
Assert.Equal(s.Driver.Url,
|
||||
new Uri(s.ServerUri, $"tests/index.html?invoice={invoiceId}").ToString());
|
||||
|
||||
@@ -1,480 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using BTCPayServer.Payments;
|
||||
using BTCPayServer.Views.Stores;
|
||||
using NBitcoin;
|
||||
using OpenQA.Selenium;
|
||||
using OpenQA.Selenium.Support.UI;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace BTCPayServer.Tests
|
||||
{
|
||||
[Trait("Selenium", "Selenium")]
|
||||
[Collection(nameof(NonParallelizableCollectionDefinition))]
|
||||
public class CheckoutV2Tests : UnitTestBase
|
||||
{
|
||||
private const int TestTimeout = TestUtils.TestTimeout;
|
||||
|
||||
public CheckoutV2Tests(ITestOutputHelper helper) : base(helper)
|
||||
{
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
[Trait("Lightning", "Lightning")]
|
||||
public async Task CanConfigureCheckout()
|
||||
{
|
||||
using var s = CreateSeleniumTester();
|
||||
s.Server.ActivateLightning();
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser(true);
|
||||
s.CreateNewStore();
|
||||
s.AddLightningNode();
|
||||
// Use non-legacy derivation scheme
|
||||
s.AddDerivationScheme("BTC", "tpubDD79XF4pzhmPSJ9AyUay9YbXAeD1c6nkUqC32pnKARJH6Ja5hGUfGc76V82ahXpsKqN6UcSGXMkzR34aZq4W23C6DAdZFaVrzWqzj24F8BC");
|
||||
|
||||
// Configure store url
|
||||
var storeUrl = "https://satoshisteaks.com/";
|
||||
var supportUrl = "https://support.satoshisteaks.com/{InvoiceId}/";
|
||||
s.GoToStore();
|
||||
s.Driver.FindElement(By.Id("StoreWebsite")).SendKeys(storeUrl);
|
||||
s.Driver.FindElement(By.Id("Save")).Click();
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
s.Driver.WaitForAndClick(By.Id("Presets"));
|
||||
s.Driver.WaitForAndClick(By.Id("Presets_InStore"));
|
||||
Assert.True(s.Driver.SetCheckbox(By.Id("ShowPayInWalletButton"), true));
|
||||
s.Driver.FindElement(By.Id("SupportUrl")).SendKeys(supportUrl);
|
||||
s.Driver.FindElement(By.Id("Save")).SendKeys(Keys.Enter);
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
// Top up/zero amount invoices
|
||||
var invoiceId = s.CreateInvoice(amount: null);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
|
||||
// Ensure we are seeing Checkout v2
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
Assert.Equal(2, s.Driver.FindElements(By.CssSelector(".payment-method")).Count);
|
||||
Assert.Contains("Bitcoin", s.Driver.FindElement(By.CssSelector(".payment-method.active")).Text);
|
||||
Assert.Contains("LNURL", s.Driver.FindElement(By.CssSelector(".payment-method:nth-child(2)")).Text);
|
||||
var qrValue = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-qr-value");
|
||||
var clipboard = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-clipboard");
|
||||
var payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
var address = s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text;
|
||||
Assert.StartsWith("bcrt", s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text);
|
||||
Assert.DoesNotContain("lightning=", payUrl);
|
||||
Assert.Equal($"bitcoin:{address}", payUrl);
|
||||
Assert.Equal($"bitcoin:{address}", clipboard);
|
||||
Assert.Equal($"bitcoin:{address.ToUpperInvariant()}", qrValue);
|
||||
s.Driver.ElementDoesNotExist(By.Id("Lightning_BTC-CHAIN"));
|
||||
|
||||
// Details should show exchange rate
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalPrice"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalFiat"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-AmountDue"));
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("sat/byte", s.Driver.FindElement(By.Id("PaymentDetails-RecommendedFee")).Text);
|
||||
|
||||
// Switch to LNURL
|
||||
s.Driver.FindElement(By.CssSelector(".payment-method:nth-child(2)")).Click();
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.StartsWith("lightning:lnurl", payUrl);
|
||||
Assert.StartsWith("lnurl", s.Driver.WaitForElement(By.CssSelector("#Lightning_BTC-CHAIN .truncate-center-start")).Text);
|
||||
s.Driver.ElementDoesNotExist(By.Id("Address_BTC-CHAIN"));
|
||||
});
|
||||
|
||||
// Default payment method
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice(21000, "SATS", defaultPaymentMethod: "BTC-LN");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
Assert.Equal(2, s.Driver.FindElements(By.CssSelector(".payment-method")).Count);
|
||||
Assert.Contains("Lightning", s.Driver.WaitForElement(By.CssSelector(".payment-method.active")).Text);
|
||||
Assert.Contains("Bitcoin", s.Driver.WaitForElement(By.CssSelector(".payment-method")).Text);
|
||||
qrValue = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-qr-value");
|
||||
clipboard = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-clipboard");
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
address = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-LN .truncate-center-start")).Text;
|
||||
Assert.Equal($"lightning:{address}", payUrl);
|
||||
Assert.Equal($"lightning:{address}", clipboard);
|
||||
Assert.Equal($"lightning:{address.ToUpperInvariant()}", qrValue);
|
||||
s.Driver.ElementDoesNotExist(By.Id("Address_BTC-CHAIN"));
|
||||
|
||||
// Lightning amount in sats
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("AmountDue")).Text);
|
||||
s.GoToHome();
|
||||
s.GoToLightningSettings();
|
||||
s.Driver.SetCheckbox(By.Id("LightningAmountInSatoshi"), true);
|
||||
s.Driver.FindElement(By.Id("save")).Click();
|
||||
Assert.Contains("BTC Lightning settings successfully updated", s.FindAlertMessage().Text);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("AmountDue")).Text);
|
||||
|
||||
// Details should not show exchange rate
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-ExchangeRate"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalFiat"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-RecommendedFee"));
|
||||
Assert.Contains("21 000 sats", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("21 000 sats", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// Expire
|
||||
var expirySeconds = s.Driver.FindElement(By.Id("ExpirySeconds"));
|
||||
expirySeconds.Clear();
|
||||
expirySeconds.SendKeys("3");
|
||||
s.Driver.FindElement(By.Id("Expire")).Click();
|
||||
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.Contains("This invoice will expire in", paymentInfo.Text);
|
||||
Assert.DoesNotContain("Please send", paymentInfo.Text);
|
||||
});
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var expiredSection = s.Driver.FindElement(By.Id("unpaid"));
|
||||
Assert.True(expiredSection.Displayed);
|
||||
Assert.Contains("Invoice Expired", expiredSection.Text);
|
||||
Assert.Contains("resubmit a payment", expiredSection.Text);
|
||||
Assert.DoesNotContain("This invoice expired with partial payment", expiredSection.Text);
|
||||
});
|
||||
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ContactLink")));
|
||||
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ReceiptLink")));
|
||||
Assert.Equal(storeUrl, s.Driver.FindElement(By.Id("StoreLink")).GetAttribute("href"));
|
||||
|
||||
// Expire paid partial
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice(2100, "EUR");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
|
||||
await Task.Delay(200);
|
||||
address = s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text;
|
||||
var amountFraction = "0.00001";
|
||||
await s.Server.ExplorerNode.SendToAddressAsync(BitcoinAddress.Create(address, Network.RegTest),
|
||||
Money.Parse(amountFraction));
|
||||
await s.Server.ExplorerNode.GenerateAsync(1);
|
||||
|
||||
expirySeconds = s.Driver.FindElement(By.Id("ExpirySeconds"));
|
||||
expirySeconds.Clear();
|
||||
expirySeconds.SendKeys("3");
|
||||
s.Driver.FindElement(By.Id("Expire")).Click();
|
||||
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.Contains("The invoice hasn't been paid in full.", paymentInfo.Text);
|
||||
Assert.Contains("Please send", paymentInfo.Text);
|
||||
});
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var expiredSection = s.Driver.FindElement(By.Id("unpaid"));
|
||||
Assert.True(expiredSection.Displayed);
|
||||
Assert.Contains("Invoice Expired", expiredSection.Text);
|
||||
Assert.Contains("This invoice expired with partial payment", expiredSection.Text);
|
||||
Assert.DoesNotContain("resubmit a payment", expiredSection.Text);
|
||||
});
|
||||
var contactLink = s.Driver.FindElement(By.Id("ContactLink"));
|
||||
Assert.Equal("Contact us", contactLink.Text);
|
||||
Assert.Matches(supportUrl.Replace("{InvoiceId}", invoiceId), contactLink.GetAttribute("href"));
|
||||
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ReceiptLink")));
|
||||
Assert.Equal(storeUrl, s.Driver.FindElement(By.Id("StoreLink")).GetAttribute("href"));
|
||||
|
||||
// Test payment
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice();
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
|
||||
// Details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
var details = s.Driver.FindElement(By.CssSelector(".payment-details"));
|
||||
Assert.Contains("Total Price", details.Text);
|
||||
Assert.Contains("Total Fiat", details.Text);
|
||||
Assert.Contains("Exchange Rate", details.Text);
|
||||
Assert.Contains("Amount Due", details.Text);
|
||||
Assert.Contains("Recommended Fee", details.Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// Pay partial amount
|
||||
await Task.Delay(200);
|
||||
s.Driver.FindElement(By.Id("test-payment-amount")).Clear();
|
||||
s.Driver.FindElement(By.Id("test-payment-amount")).SendKeys("0.00001");
|
||||
|
||||
// Fake Pay
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
s.Driver.FindElement(By.Id("FakePayment")).Click();
|
||||
s.Driver.FindElement(By.Id("mine-block")).Click();
|
||||
var paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.Contains("The invoice hasn't been paid in full", paymentInfo.Text);
|
||||
Assert.Contains("Please send", paymentInfo.Text);
|
||||
});
|
||||
|
||||
s.Driver.Navigate().Refresh();
|
||||
|
||||
// Pay full amount
|
||||
s.PayInvoice();
|
||||
|
||||
// Processing
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var processingSection = s.Driver.WaitForElement(By.Id("processing"));
|
||||
Assert.True(processingSection.Displayed);
|
||||
Assert.Contains("Payment Received", processingSection.Text);
|
||||
Assert.Contains("Your payment has been received and is now processing", processingSection.Text);
|
||||
});
|
||||
s.Driver.FindElement(By.Id("confetti"));
|
||||
|
||||
// Mine
|
||||
s.MineBlockOnInvoiceCheckout();
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
Assert.Contains("Mined 1 block",
|
||||
s.Driver.WaitForElement(By.Id("CheatSuccessMessage")).Text);
|
||||
});
|
||||
|
||||
// Settled
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var settledSection = s.Driver.WaitForElement(By.Id("settled"));
|
||||
Assert.True(settledSection.Displayed);
|
||||
Assert.Contains("Invoice Paid", settledSection.Text);
|
||||
});
|
||||
s.Driver.FindElement(By.Id("confetti"));
|
||||
s.Driver.FindElement(By.Id("ReceiptLink"));
|
||||
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ContactLink")));
|
||||
Assert.Equal(storeUrl, s.Driver.FindElement(By.Id("StoreLink")).GetAttribute("href"));
|
||||
|
||||
// BIP21
|
||||
s.GoToHome();
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
s.Driver.SetCheckbox(By.Id("OnChainWithLnInvoiceFallback"), true);
|
||||
s.Driver.SetCheckbox(By.Id("LightningAmountInSatoshi"), false);
|
||||
s.Driver.FindElement(By.Id("Save")).Click();
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
invoiceId = s.CreateInvoice();
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
Assert.Empty(s.Driver.FindElements(By.CssSelector(".payment-method")));
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("AmountDue")).Text);
|
||||
qrValue = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-qr-value");
|
||||
clipboard = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-clipboard");
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
var copyAddressOnchain = s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text;
|
||||
var copyAddressLightning = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-CHAIN .truncate-center-start")).Text;
|
||||
Assert.StartsWith($"bitcoin:{copyAddressOnchain}?amount=", payUrl);
|
||||
Assert.Contains("?amount=", payUrl);
|
||||
Assert.Contains("&lightning=", payUrl);
|
||||
Assert.StartsWith("bcrt", copyAddressOnchain);
|
||||
Assert.StartsWith("lnbcrt", copyAddressLightning);
|
||||
Assert.StartsWith($"bitcoin:{copyAddressOnchain.ToUpperInvariant()}?amount=", qrValue);
|
||||
Assert.Contains("&lightning=LNBCRT", qrValue);
|
||||
Assert.Contains("&lightning=lnbcrt", clipboard);
|
||||
Assert.Equal(clipboard, payUrl);
|
||||
|
||||
// Check details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
Assert.Contains("1 BTC = ", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("BTC", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// Switch to amount displayed in sats
|
||||
s.GoToHome();
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
s.Driver.SetCheckbox(By.Id("LightningAmountInSatoshi"), true);
|
||||
s.Driver.FindElement(By.Id("Save")).Click();
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("AmountDue")).Text);
|
||||
|
||||
// Check details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
Assert.Contains("1 sat = ", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// BIP21 with LN as default payment method
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice(defaultPaymentMethod: "BTC-LN");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
Assert.Empty(s.Driver.FindElements(By.CssSelector(".payment-method")));
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.StartsWith("bitcoin:", payUrl);
|
||||
Assert.Contains("&lightning=lnbcrt", payUrl);
|
||||
|
||||
// Check details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
Assert.Contains("1 sat = ", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("PaymentDetails-AmountDue")).Text);
|
||||
Assert.Contains("sats", s.Driver.FindElement(By.Id("PaymentDetails-TotalPrice")).Text);
|
||||
|
||||
// Ensure LNURL is enabled
|
||||
s.GoToHome();
|
||||
s.GoToLightningSettings();
|
||||
Assert.True(s.Driver.FindElement(By.Id("LNURLEnabled")).Selected);
|
||||
|
||||
// BIP21 with top-up invoice
|
||||
invoiceId = s.CreateInvoice(amount: null);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
Assert.Empty(s.Driver.FindElements(By.CssSelector(".payment-method")));
|
||||
qrValue = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-qr-value");
|
||||
clipboard = s.Driver.FindElement(By.CssSelector(".qr-container")).GetAttribute("data-clipboard");
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
copyAddressOnchain = s.Driver.FindElement(By.CssSelector("#Address_BTC-CHAIN .truncate-center-start")).Text;
|
||||
copyAddressLightning = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-CHAIN .truncate-center-start")).Text;
|
||||
Assert.StartsWith($"bitcoin:{copyAddressOnchain}", payUrl);
|
||||
Assert.Contains("?lightning=lnurl", payUrl);
|
||||
Assert.DoesNotContain("amount=", payUrl);
|
||||
Assert.StartsWith("bcrt", copyAddressOnchain);
|
||||
Assert.StartsWith("lnurl", copyAddressLightning);
|
||||
Assert.StartsWith($"bitcoin:{copyAddressOnchain.ToUpperInvariant()}?lightning=LNURL", qrValue);
|
||||
Assert.Contains($"bitcoin:{copyAddressOnchain}?lightning=lnurl", clipboard);
|
||||
Assert.Equal(clipboard, payUrl);
|
||||
|
||||
// Check details
|
||||
s.Driver.ToggleCollapse("PaymentDetails");
|
||||
Assert.Contains("1 sat = ", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
Assert.Contains("$", s.Driver.FindElement(By.Id("PaymentDetails-ExchangeRate")).Text);
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalFiat"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-AmountDue"));
|
||||
s.Driver.ElementDoesNotExist(By.Id("PaymentDetails-TotalPrice"));
|
||||
|
||||
// Expiry message should not show amount for top-up invoice
|
||||
expirySeconds = s.Driver.FindElement(By.Id("ExpirySeconds"));
|
||||
expirySeconds.Clear();
|
||||
expirySeconds.SendKeys("5");
|
||||
s.Driver.FindElement(By.Id("Expire")).Click();
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.Contains("This invoice will expire in", paymentInfo.Text);
|
||||
Assert.Contains("00:0", paymentInfo.Text);
|
||||
Assert.DoesNotContain("Please send", paymentInfo.Text);
|
||||
});
|
||||
|
||||
// Configure countdown timer
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice();
|
||||
s.GoToHome();
|
||||
s.GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
var displayExpirationTimer = s.Driver.FindElement(By.Id("DisplayExpirationTimer"));
|
||||
Assert.Equal("5", displayExpirationTimer.GetAttribute("value"));
|
||||
displayExpirationTimer.Clear();
|
||||
displayExpirationTimer.SendKeys("10");
|
||||
s.Driver.FindElement(By.Id("Save")).Click();
|
||||
Assert.Contains("Store successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
var paymentInfo = s.Driver.FindElement(By.Id("PaymentInfo"));
|
||||
Assert.False(paymentInfo.Displayed);
|
||||
Assert.DoesNotContain("This invoice will expire in", paymentInfo.Text);
|
||||
|
||||
expirySeconds = s.Driver.FindElement(By.Id("ExpirySeconds"));
|
||||
expirySeconds.Clear();
|
||||
expirySeconds.SendKeys("599");
|
||||
s.Driver.FindElement(By.Id("Expire")).Click();
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
|
||||
Assert.True(paymentInfo.Displayed);
|
||||
Assert.Contains("This invoice will expire in", paymentInfo.Text);
|
||||
Assert.Contains("09:5", paymentInfo.Text);
|
||||
});
|
||||
|
||||
// Disable LNURL again
|
||||
s.GoToHome();
|
||||
s.GoToLightningSettings();
|
||||
s.Driver.SetCheckbox(By.Id("LNURLEnabled"), false);
|
||||
s.Driver.ScrollTo(By.Id("save"));
|
||||
s.Driver.FindElement(By.Id("save")).Click();
|
||||
Assert.Contains("BTC Lightning settings successfully updated", s.FindAlertMessage().Text);
|
||||
|
||||
// Test:
|
||||
// - NFC/LNURL-W available with just Lightning
|
||||
// - BIP21 works correctly even though Lightning is default payment method
|
||||
s.GoToHome();
|
||||
invoiceId = s.CreateInvoice(defaultPaymentMethod: "BTC-LN");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
Assert.Empty(s.Driver.FindElements(By.CssSelector(".payment-method")));
|
||||
payUrl = s.Driver.FindElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.StartsWith("bitcoin:", payUrl);
|
||||
Assert.Contains("&lightning=lnbcrt", payUrl);
|
||||
|
||||
// Language Switch
|
||||
var languageSelect = new SelectElement(s.Driver.FindElement(By.Id("DefaultLang")));
|
||||
Assert.Equal("English", languageSelect.SelectedOption.Text);
|
||||
Assert.Equal("View Details", s.Driver.FindElement(By.Id("DetailsToggle")).Text);
|
||||
Assert.DoesNotContain("lang=", s.Driver.Url);
|
||||
languageSelect.SelectByText("Deutsch");
|
||||
Assert.Equal("Details anzeigen", s.Driver.FindElement(By.Id("DetailsToggle")).Text);
|
||||
Assert.Contains("lang=de", s.Driver.Url);
|
||||
|
||||
s.Driver.Navigate().Refresh();
|
||||
languageSelect = new SelectElement(s.Driver.WaitForElement(By.Id("DefaultLang")));
|
||||
Assert.Equal("Deutsch", languageSelect.SelectedOption.Text);
|
||||
Assert.Equal("Details anzeigen", s.Driver.FindElement(By.Id("DetailsToggle")).Text);
|
||||
languageSelect.SelectByText("English");
|
||||
Assert.Equal("View Details", s.Driver.FindElement(By.Id("DetailsToggle")).Text);
|
||||
Assert.Contains("lang=en", s.Driver.Url);
|
||||
}
|
||||
|
||||
[Fact(Timeout = TestTimeout)]
|
||||
public async Task CanUseCheckoutAsModal()
|
||||
{
|
||||
using var s = CreateSeleniumTester();
|
||||
await s.StartAsync();
|
||||
s.GoToRegister();
|
||||
s.RegisterNewUser();
|
||||
s.CreateNewStore();
|
||||
s.GoToStore();
|
||||
s.AddDerivationScheme();
|
||||
var invoiceId = s.CreateInvoice(0.001m, "BTC", "a@x.com");
|
||||
var invoice = await s.Server.PayTester.InvoiceRepository.GetInvoice(invoiceId);
|
||||
s.Driver.Navigate()
|
||||
.GoToUrl(new Uri(s.ServerUri, $"tests/index.html?invoice={invoiceId}"));
|
||||
s.Driver.WaitUntilAvailable(By.Name("btcpay"));
|
||||
|
||||
var frameElement = s.Driver.FindElement(By.Name("btcpay"));
|
||||
Assert.True(frameElement.Displayed);
|
||||
var iframe = s.Driver.SwitchTo().Frame(frameElement);
|
||||
iframe.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
|
||||
await s.Server.ExplorerNode.SendToAddressAsync(BitcoinAddress.Create(invoice
|
||||
.GetPaymentPrompt(PaymentTypes.CHAIN.GetPaymentMethodId("BTC"))
|
||||
.Destination, Network.RegTest),
|
||||
new Money(0.001m, MoneyUnit.BTC));
|
||||
|
||||
TestUtils.Eventually(() =>
|
||||
{
|
||||
var closeButton = iframe.FindElement(By.Id("close"));
|
||||
Assert.True(closeButton.Displayed);
|
||||
closeButton.Click();
|
||||
});
|
||||
s.Driver.AssertElementNotFound(By.Name("btcpay"));
|
||||
Assert.Equal(s.Driver.Url,
|
||||
new Uri(s.ServerUri, $"tests/index.html?invoice={invoiceId}").ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1366,7 +1366,6 @@ namespace BTCPayServer.Tests
|
||||
//create store
|
||||
var newStore = await client.CreateStore(new CreateStoreRequest { Name = "A" });
|
||||
Assert.Equal("A", newStore.Name);
|
||||
Assert.Equal(CheckoutType.V2, newStore.CheckoutType);
|
||||
|
||||
//update store
|
||||
Assert.Empty(newStore.PaymentMethodCriteria);
|
||||
@@ -1374,7 +1373,6 @@ namespace BTCPayServer.Tests
|
||||
var updatedStore = await client.UpdateStore(newStore.Id, new UpdateStoreRequest
|
||||
{
|
||||
Name = "B",
|
||||
CheckoutType = CheckoutType.V1,
|
||||
PaymentMethodCriteria = new List<PaymentMethodCriteriaData>
|
||||
{
|
||||
new()
|
||||
@@ -1387,7 +1385,6 @@ namespace BTCPayServer.Tests
|
||||
}
|
||||
});
|
||||
Assert.Equal("B", updatedStore.Name);
|
||||
Assert.Equal(CheckoutType.V1, updatedStore.CheckoutType);
|
||||
var s = (await client.GetStore(newStore.Id));
|
||||
Assert.Equal("B", s.Name);
|
||||
var pmc = Assert.Single(s.PaymentMethodCriteria);
|
||||
@@ -2197,13 +2194,11 @@ namespace BTCPayServer.Tests
|
||||
Metadata = JObject.Parse($"{{\"itemCode\": \"testitem\", \"orderId\": \"{origOrderId}\"}}"),
|
||||
Checkout = new CreateInvoiceRequest.CheckoutOptions()
|
||||
{
|
||||
RedirectAutomatically = true,
|
||||
RequiresRefundEmail = true,
|
||||
RedirectAutomatically = true
|
||||
},
|
||||
AdditionalSearchTerms = new string[] { "Banana" }
|
||||
});
|
||||
Assert.True(newInvoice.Checkout.RedirectAutomatically);
|
||||
Assert.True(newInvoice.Checkout.RequiresRefundEmail);
|
||||
Assert.Equal(user.StoreId, newInvoice.StoreId);
|
||||
//list
|
||||
var invoices = await viewOnly.GetInvoices(user.StoreId);
|
||||
|
||||
@@ -250,12 +250,11 @@ namespace BTCPayServer.Tests
|
||||
await s.StartAsync();
|
||||
s.RegisterNewUser(true);
|
||||
var receiver = s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.GenerateWallet("BTC", "", true, true, ScriptPubKeyType.Segwit);
|
||||
s.GenerateWallet("BTC", "", true, true);
|
||||
var receiverWalletId = new WalletId(receiver.storeId, "BTC");
|
||||
|
||||
var sender = s.CreateNewStore();
|
||||
s.GenerateWallet("BTC", "", true, true, ScriptPubKeyType.Segwit);
|
||||
s.GenerateWallet("BTC", "", true, true);
|
||||
var senderWalletId = new WalletId(sender.storeId, "BTC");
|
||||
|
||||
await s.Server.ExplorerNode.GenerateAsync(1);
|
||||
@@ -264,8 +263,7 @@ namespace BTCPayServer.Tests
|
||||
|
||||
var invoiceId = s.CreateInvoice(receiver.storeId, null, "BTC");
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
var bip21 = s.Driver.FindElement(By.ClassName("payment__details__instruction__open-wallet__btn"))
|
||||
.GetAttribute("href");
|
||||
var bip21 = s.Driver.WaitForElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.Contains($"{PayjoinClient.BIP21EndpointKey}=", bip21);
|
||||
s.GoToWallet(senderWalletId, WalletsNavPages.Send);
|
||||
s.Driver.FindElement(By.Id("bip21parse")).Click();
|
||||
@@ -305,15 +303,13 @@ namespace BTCPayServer.Tests
|
||||
{
|
||||
var cryptoCode = "BTC";
|
||||
var receiver = s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.GenerateWallet(cryptoCode, "", true, true, format);
|
||||
var receiverWalletId = new WalletId(receiver.storeId, cryptoCode);
|
||||
|
||||
//payjoin is enabled by default.
|
||||
var invoiceId = s.CreateInvoice(receiver.storeId);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
var bip21 = s.Driver.WaitForElement(By.ClassName("payment__details__instruction__open-wallet__btn"))
|
||||
.GetAttribute("href");
|
||||
var bip21 = s.Driver.WaitForElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.Contains($"{PayjoinClient.BIP21EndpointKey}=", bip21);
|
||||
|
||||
s.GoToStore(receiver.storeId);
|
||||
@@ -328,8 +324,7 @@ namespace BTCPayServer.Tests
|
||||
|
||||
invoiceId = s.CreateInvoice(receiver.storeId);
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
bip21 = s.Driver.WaitForElement(By.ClassName("payment__details__instruction__open-wallet__btn"))
|
||||
.GetAttribute("href");
|
||||
bip21 = s.Driver.WaitForElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.Contains($"{PayjoinClient.BIP21EndpointKey}=", bip21);
|
||||
|
||||
s.GoToWallet(senderWalletId, WalletsNavPages.Send);
|
||||
@@ -362,8 +357,7 @@ namespace BTCPayServer.Tests
|
||||
//let's do it all again, except now the receiver has funds and is able to payjoin
|
||||
invoiceId = s.CreateInvoice();
|
||||
s.GoToInvoiceCheckout(invoiceId);
|
||||
bip21 = s.Driver.WaitForElement(By.ClassName("payment__details__instruction__open-wallet__btn"))
|
||||
.GetAttribute("href");
|
||||
bip21 = s.Driver.WaitForElement(By.Id("PayInWallet")).GetAttribute("href");
|
||||
Assert.Contains($"{PayjoinClient.BIP21EndpointKey}", bip21);
|
||||
|
||||
s.GoToWallet(senderWalletId, WalletsNavPages.Send);
|
||||
@@ -380,7 +374,7 @@ namespace BTCPayServer.Tests
|
||||
s.Driver.FindElement(By.CssSelector("button[value=payjoin]")).Click();
|
||||
return Task.CompletedTask;
|
||||
});
|
||||
s.FindAlertMessage(StatusMessageModel.StatusSeverity.Success);
|
||||
s.FindAlertMessage();
|
||||
var handler = s.Server.PayTester.GetService<PaymentMethodHandlerDictionary>().GetBitcoinHandler("BTC");
|
||||
await TestUtils.EventuallyAsync(async () =>
|
||||
{
|
||||
|
||||
@@ -109,7 +109,7 @@ namespace BTCPayServer.Tests
|
||||
|
||||
public void MineBlockOnInvoiceCheckout()
|
||||
{
|
||||
retry:
|
||||
retry:
|
||||
try
|
||||
{
|
||||
Driver.FindElement(By.CssSelector("#mine-block button")).Click();
|
||||
@@ -206,23 +206,6 @@ namespace BTCPayServer.Tests
|
||||
StoreId = storeId;
|
||||
return (name, storeId);
|
||||
}
|
||||
public void EnableCheckout(CheckoutType checkoutType, bool bip21 = false)
|
||||
{
|
||||
GoToStore(StoreNavPages.CheckoutAppearance);
|
||||
if (checkoutType == CheckoutType.V2)
|
||||
{
|
||||
Driver.SetCheckbox(By.Id("UseClassicCheckout"), false);
|
||||
Driver.WaitForElement(By.Id("OnChainWithLnInvoiceFallback"));
|
||||
Driver.SetCheckbox(By.Id("OnChainWithLnInvoiceFallback"), bip21);
|
||||
}
|
||||
else
|
||||
{
|
||||
Driver.SetCheckbox(By.Id("UseClassicCheckout"), true);
|
||||
}
|
||||
Driver.FindElement(By.Id("Save")).SendKeys(Keys.Enter);
|
||||
Assert.Contains("Store successfully updated", FindAlertMessage().Text);
|
||||
Assert.True(Driver.FindElement(By.Id("UseClassicCheckout")).Selected);
|
||||
}
|
||||
|
||||
public Mnemonic GenerateWallet(string cryptoCode = "BTC", string seed = "", bool? importkeys = null, bool isHotWallet = false, ScriptPubKeyType format = ScriptPubKeyType.Segwit)
|
||||
{
|
||||
@@ -407,7 +390,8 @@ namespace BTCPayServer.Tests
|
||||
|
||||
public void Logout()
|
||||
{
|
||||
if (!Driver.PageSource.Contains("id=\"Nav-Logout\"")) GoToUrl("/account");
|
||||
if (!Driver.PageSource.Contains("id=\"Nav-Logout\""))
|
||||
GoToUrl("/account");
|
||||
Driver.FindElement(By.Id("Nav-Account")).Click();
|
||||
Driver.FindElement(By.Id("Nav-Logout")).Click();
|
||||
}
|
||||
@@ -484,6 +468,7 @@ namespace BTCPayServer.Tests
|
||||
Driver.FindElement(By.Id("StoreNav-Invoices")).Click();
|
||||
Driver.FindElement(By.Id($"invoice-checkout-{invoiceId}")).Click();
|
||||
CheckForJSErrors();
|
||||
Driver.WaitUntilAvailable(By.Id("Checkout"));
|
||||
}
|
||||
|
||||
public void GoToInvoice(string id)
|
||||
@@ -523,11 +508,10 @@ namespace BTCPayServer.Tests
|
||||
string currency = "USD",
|
||||
string refundEmail = "",
|
||||
string defaultPaymentMethod = null,
|
||||
bool? requiresRefundEmail = null,
|
||||
StatusMessageModel.StatusSeverity expectedSeverity = StatusMessageModel.StatusSeverity.Success
|
||||
)
|
||||
{
|
||||
return CreateInvoice(null, amount, currency, refundEmail, defaultPaymentMethod, requiresRefundEmail, expectedSeverity);
|
||||
return CreateInvoice(null, amount, currency, refundEmail, defaultPaymentMethod, expectedSeverity);
|
||||
}
|
||||
|
||||
public string CreateInvoice(
|
||||
@@ -536,7 +520,6 @@ namespace BTCPayServer.Tests
|
||||
string currency = "USD",
|
||||
string refundEmail = "",
|
||||
string defaultPaymentMethod = null,
|
||||
bool? requiresRefundEmail = null,
|
||||
StatusMessageModel.StatusSeverity expectedSeverity = StatusMessageModel.StatusSeverity.Success
|
||||
)
|
||||
{
|
||||
@@ -551,8 +534,6 @@ namespace BTCPayServer.Tests
|
||||
Driver.FindElement(By.Id("BuyerEmail")).SendKeys(refundEmail);
|
||||
if (defaultPaymentMethod is not null)
|
||||
new SelectElement(Driver.FindElement(By.Name("DefaultPaymentMethod"))).SelectByValue(defaultPaymentMethod);
|
||||
if (requiresRefundEmail is bool)
|
||||
new SelectElement(Driver.FindElement(By.Name("RequiresRefundEmail"))).SelectByValue(requiresRefundEmail == true ? "1" : "2");
|
||||
Driver.FindElement(By.Id("Create")).Click();
|
||||
|
||||
var statusElement = FindAlertMessage(expectedSeverity);
|
||||
@@ -666,7 +647,8 @@ retry:
|
||||
|
||||
public (string appName, string appId) CreateApp(string type, string name = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(name)) name = $"{type}-{Guid.NewGuid().ToString()[..14]}";
|
||||
if (string.IsNullOrEmpty(name))
|
||||
name = $"{type}-{Guid.NewGuid().ToString()[..14]}";
|
||||
Driver.FindElement(By.Id($"StoreNav-Create{type}")).Click();
|
||||
Driver.FindElement(By.Name("AppName")).SendKeys(name);
|
||||
Driver.FindElement(By.Id("Create")).Click();
|
||||
|
||||
@@ -1301,7 +1301,7 @@ namespace BTCPayServer.Tests
|
||||
var frameElement = s.Driver.FindElement(By.Name("btcpay"));
|
||||
Assert.True(frameElement.Displayed);
|
||||
var iframe = s.Driver.SwitchTo().Frame(frameElement);
|
||||
iframe.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
iframe.WaitUntilAvailable(By.Id("Checkout"));
|
||||
|
||||
var closeButton = iframe.FindElement(By.Id("close"));
|
||||
Assert.True(closeButton.Displayed);
|
||||
@@ -1456,7 +1456,7 @@ namespace BTCPayServer.Tests
|
||||
var frameElement = s.Driver.FindElement(By.Name("btcpay"));
|
||||
Assert.True(frameElement.Displayed);
|
||||
var iframe = s.Driver.SwitchTo().Frame(frameElement);
|
||||
iframe.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
iframe.WaitUntilAvailable(By.Id("Checkout"));
|
||||
|
||||
IWebElement closebutton = null;
|
||||
TestUtils.Eventually(() =>
|
||||
@@ -1498,7 +1498,7 @@ namespace BTCPayServer.Tests
|
||||
var frameElement = s.Driver.FindElement(By.Name("btcpay"));
|
||||
Assert.True(frameElement.Displayed);
|
||||
var iframe = s.Driver.SwitchTo().Frame(frameElement);
|
||||
iframe.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
iframe.WaitUntilAvailable(By.Id("Checkout"));
|
||||
|
||||
// Pay full amount
|
||||
s.PayInvoice();
|
||||
@@ -2607,7 +2607,7 @@ namespace BTCPayServer.Tests
|
||||
|
||||
// Pay
|
||||
s.Driver.FindElement(By.Id("pay-button")).Click();
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout"));
|
||||
s.Driver.FindElement(By.Id("DetailsToggle")).Click();
|
||||
s.Driver.WaitForElement(By.Id("PaymentDetails-TotalFiat"));
|
||||
Assert.Contains("1 222,21 €", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
@@ -2662,7 +2662,7 @@ namespace BTCPayServer.Tests
|
||||
|
||||
// Pay
|
||||
s.Driver.FindElement(By.Id("pay-button")).Click();
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout"));
|
||||
s.Driver.FindElement(By.Id("DetailsToggle")).Click();
|
||||
s.Driver.WaitForElement(By.Id("PaymentDetails-TotalFiat"));
|
||||
Assert.Contains("4,23 €", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
@@ -2822,7 +2822,7 @@ namespace BTCPayServer.Tests
|
||||
|
||||
// Check values on checkout page
|
||||
s.Driver.FindElement(By.Id("CartSubmit")).Click();
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout-v2"));
|
||||
s.Driver.WaitUntilAvailable(By.Id("Checkout"));
|
||||
s.Driver.FindElement(By.Id("DetailsToggle")).Click();
|
||||
s.Driver.WaitForElement(By.Id("PaymentDetails-TotalFiat"));
|
||||
Assert.Contains("9,90 €", s.Driver.FindElement(By.Id("PaymentDetails-TotalFiat")).Text);
|
||||
@@ -2899,7 +2899,6 @@ namespace BTCPayServer.Tests
|
||||
new[] { s.Server.MerchantLnd.Client });
|
||||
s.RegisterNewUser(true);
|
||||
(_, string storeId) = s.CreateNewStore();
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
var network = s.Server.NetworkProvider.GetNetwork<BTCPayNetwork>(cryptoCode).NBitcoinNetwork;
|
||||
s.AddLightningNode(LightningConnectionType.CLightning, false);
|
||||
s.GoToLightningSettings();
|
||||
@@ -2911,8 +2910,7 @@ namespace BTCPayServer.Tests
|
||||
// Topup Invoice test
|
||||
var i = s.CreateInvoice(storeId, null, cryptoCode);
|
||||
s.GoToInvoiceCheckout(i);
|
||||
s.Driver.WaitForElement(By.Id("copy-tab")).Click();
|
||||
var lnurl = s.Driver.FindElement(By.CssSelector("input.checkoutTextbox")).GetAttribute("value");
|
||||
var lnurl = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-LNURL .truncate-center-start")).Text;
|
||||
var parsed = LNURL.LNURL.Parse(lnurl, out var tag);
|
||||
var fetchedReuqest =
|
||||
Assert.IsType<LNURL.LNURLPayRequest>(await LNURL.LNURL.FetchInformation(parsed, new HttpClient()));
|
||||
@@ -2948,11 +2946,9 @@ namespace BTCPayServer.Tests
|
||||
s.GoToStore(storeId);
|
||||
i = s.CreateInvoice(storeId, 0.0000001m, cryptoCode);
|
||||
s.GoToInvoiceCheckout(i);
|
||||
s.Driver.FindElement(By.ClassName("payment__currencies_noborder")).Click();
|
||||
// BOLT11 is also displayed for standard invoice (not LNURL, even if it is available)
|
||||
s.Driver.WaitForElement(By.Id("copy-tab")).Click();
|
||||
var bolt11 = s.Driver.FindElement(By.CssSelector("input.checkoutTextbox")).GetAttribute("value");
|
||||
Lightning.BOLT11PaymentRequest.Parse(bolt11, s.Server.ExplorerNode.Network);
|
||||
var bolt11 = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-LN .truncate-center-start")).Text;
|
||||
BOLT11PaymentRequest.Parse(bolt11, s.Server.ExplorerNode.Network);
|
||||
var invoiceId = s.Driver.Url.Split('/').Last();
|
||||
using (var resp = await s.Server.PayTester.HttpClient.GetAsync("BTC/lnurl/pay/i/" + invoiceId))
|
||||
{
|
||||
@@ -2978,7 +2974,7 @@ namespace BTCPayServer.Tests
|
||||
network, new HttpClient());
|
||||
lnurlResponse2 = await fetchedReuqest.SendRequest(new LightMoney(0.0000001m, LightMoneyUnit.BTC),
|
||||
network, new HttpClient());
|
||||
//invoice amounts do no change so the paymnet request is not regenerated
|
||||
//invoice amounts do no change so the payment request is not regenerated
|
||||
Assert.Equal(lnurlResponse.Pr, lnurlResponse2.Pr);
|
||||
await s.Server.CustomerLightningD.Pay(lnurlResponse.Pr);
|
||||
Assert.Equal(new LightMoney(0.0000001m, LightMoneyUnit.BTC),
|
||||
@@ -2987,12 +2983,10 @@ namespace BTCPayServer.Tests
|
||||
|
||||
i = s.CreateInvoice(storeId, 0.000001m, cryptoCode);
|
||||
s.GoToInvoiceCheckout(i);
|
||||
s.Driver.FindElement(By.ClassName("payment__currencies_noborder"));
|
||||
|
||||
s.GoToStore(storeId);
|
||||
i = s.CreateInvoice(storeId, null, cryptoCode);
|
||||
s.GoToInvoiceCheckout(i);
|
||||
s.Driver.FindElement(By.ClassName("payment__currencies_noborder"));
|
||||
|
||||
s.GoToHome();
|
||||
s.GoToLightningSettings();
|
||||
@@ -3006,15 +3000,12 @@ namespace BTCPayServer.Tests
|
||||
|
||||
i = s.CreateInvoice(storeId, null, cryptoCode);
|
||||
s.GoToInvoiceCheckout(i);
|
||||
s.Driver.FindElement(By.ClassName("payment__currencies_noborder"));
|
||||
s.Driver.WaitForElement(By.Id("copy-tab")).Click();
|
||||
lnurl = s.Driver.FindElement(By.CssSelector("input.checkoutTextbox")).GetAttribute("value");
|
||||
lnurl = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-LNURL .truncate-center-start")).Text;
|
||||
Assert.StartsWith("lnurlp", lnurl);
|
||||
LNURL.LNURL.Parse(lnurl, out tag);
|
||||
|
||||
s.GoToHome();
|
||||
s.CreateNewStore(false);
|
||||
s.EnableCheckout(CheckoutType.V1);
|
||||
s.AddLightningNode(LightningConnectionType.LndREST, false);
|
||||
s.GoToLightningSettings();
|
||||
s.Driver.SetCheckbox(By.Id("LNURLEnabled"), true);
|
||||
@@ -3022,8 +3013,7 @@ namespace BTCPayServer.Tests
|
||||
Assert.Contains($"{cryptoCode} Lightning settings successfully updated", s.FindAlertMessage().Text);
|
||||
var invForPP = s.CreateInvoice(null, cryptoCode);
|
||||
s.GoToInvoiceCheckout(invForPP);
|
||||
s.Driver.WaitForElement(By.Id("copy-tab")).Click();
|
||||
lnurl = s.Driver.FindElement(By.CssSelector("input.checkoutTextbox")).GetAttribute("value");
|
||||
lnurl = s.Driver.FindElement(By.CssSelector("#Lightning_BTC-LNURL .truncate-center-start")).Text;
|
||||
LNURL.LNURL.Parse(lnurl, out tag);
|
||||
|
||||
// Check that pull payment has lightning option
|
||||
|
||||
@@ -522,15 +522,7 @@ retry:
|
||||
{
|
||||
var fullPath = Path.Combine(GetFolder(folder), $"{lang}.json");
|
||||
var proj = "o:btcpayserver:p:btcpayserver";
|
||||
string resource;
|
||||
if (folder == TranslationFolder.CheckoutV1)
|
||||
{
|
||||
resource = $"{proj}:r:enjson";
|
||||
}
|
||||
else // file == v2
|
||||
{
|
||||
resource = $"{proj}:r:checkout-v2";
|
||||
}
|
||||
var resource = $"{proj}:r:checkout-v2";
|
||||
var words = new Dictionary<string, string>();
|
||||
if (File.Exists(fullPath))
|
||||
{
|
||||
|
||||
@@ -157,7 +157,6 @@ namespace BTCPayServer.Controllers
|
||||
entity.RedirectURLTemplate = invoice.RedirectURL ?? store.StoreWebsite;
|
||||
entity.RedirectAutomatically =
|
||||
invoice.RedirectAutomatically.GetValueOrDefault(storeBlob.RedirectAutomatically);
|
||||
entity.RequiresRefundEmail = invoice.RequiresRefundEmail;
|
||||
entity.SpeedPolicy = ParseSpeedPolicy(invoice.TransactionSpeed, store.SpeedPolicy);
|
||||
|
||||
IPaymentFilter excludeFilter = null;
|
||||
@@ -185,7 +184,6 @@ namespace BTCPayServer.Controllers
|
||||
{
|
||||
entity.DefaultPaymentMethod = defaultPaymentMethod;
|
||||
}
|
||||
entity.RequiresRefundEmail = invoice.RequiresRefundEmail;
|
||||
|
||||
return await _InvoiceController.CreateInvoiceCoreRaw(entity, store, excludeFilter, null, cancellationToken, entityManipulator);
|
||||
}
|
||||
|
||||
@@ -142,19 +142,6 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
return Ok(ToPointOfSaleModel(app));
|
||||
}
|
||||
|
||||
private RequiresRefundEmail? BoolToRequiresRefundEmail(bool? requiresRefundEmail)
|
||||
{
|
||||
switch (requiresRefundEmail)
|
||||
{
|
||||
case true:
|
||||
return RequiresRefundEmail.On;
|
||||
case false:
|
||||
return RequiresRefundEmail.Off;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet("~/api/v1/apps")]
|
||||
[Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
|
||||
public async Task<IActionResult> GetAllApps()
|
||||
@@ -291,7 +278,6 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
Description = request.Description,
|
||||
EmbeddedCSS = request.EmbeddedCSS,
|
||||
RedirectAutomatically = request.RedirectAutomatically,
|
||||
RequiresRefundEmail = BoolToRequiresRefundEmail(request.RequiresRefundEmail) ?? RequiresRefundEmail.InheritFromStore,
|
||||
FormId = request.FormId
|
||||
};
|
||||
}
|
||||
@@ -361,7 +347,6 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
Description = settings.Description,
|
||||
EmbeddedCSS = settings.EmbeddedCSS,
|
||||
RedirectAutomatically = settings.RedirectAutomatically ?? false,
|
||||
RequiresRefundEmail = settings.RequiresRefundEmail == RequiresRefundEmail.InheritFromStore ? null : settings.RequiresRefundEmail == RequiresRefundEmail.On,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -671,8 +671,6 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
SpeedPolicy = entity.SpeedPolicy,
|
||||
DefaultLanguage = entity.DefaultLanguage,
|
||||
RedirectAutomatically = entity.RedirectAutomatically,
|
||||
RequiresRefundEmail = entity.RequiresRefundEmail,
|
||||
CheckoutType = entity.CheckoutType,
|
||||
RedirectURL = entity.RedirectURLTemplate
|
||||
},
|
||||
Receipt = entity.ReceiptOptions
|
||||
|
||||
@@ -132,8 +132,6 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
//we do not include PaymentMethodCriteria because moving the CurrencyValueJsonConverter to the Client csproj is hard and requires a refactor (#1571 & #1572)
|
||||
NetworkFeeMode = storeBlob.NetworkFeeMode,
|
||||
DefaultCurrency = storeBlob.DefaultCurrency,
|
||||
RequiresRefundEmail = storeBlob.RequiresRefundEmail,
|
||||
CheckoutType = storeBlob.CheckoutType,
|
||||
Receipt = InvoiceDataBase.ReceiptOptions.Merge(storeBlob.ReceiptOptions, null),
|
||||
LightningAmountInSatoshi = storeBlob.LightningAmountInSatoshi,
|
||||
LightningPrivateRouteHints = storeBlob.LightningPrivateRouteHints,
|
||||
@@ -146,8 +144,6 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
MonitoringExpiration = storeBlob.MonitoringExpiration,
|
||||
InvoiceExpiration = storeBlob.InvoiceExpiration,
|
||||
DisplayExpirationTimer = storeBlob.DisplayExpirationTimer,
|
||||
CustomLogo = storeBlob.CustomLogo,
|
||||
CustomCSS = storeBlob.CustomCSS,
|
||||
HtmlTitle = storeBlob.HtmlTitle,
|
||||
AnyoneCanCreateInvoice = storeBlob.AnyoneCanInvoice,
|
||||
LightningDescriptionTemplate = storeBlob.LightningDescriptionTemplate,
|
||||
@@ -184,7 +180,6 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
//we do not include OnChainMinValue and LightningMaxValue because moving the CurrencyValueJsonConverter to the Client csproj is hard and requires a refactor (#1571 & #1572)
|
||||
blob.NetworkFeeMode = restModel.NetworkFeeMode;
|
||||
blob.DefaultCurrency = restModel.DefaultCurrency;
|
||||
blob.RequiresRefundEmail = restModel.RequiresRefundEmail;
|
||||
blob.ReceiptOptions = InvoiceDataBase.ReceiptOptions.Merge(restModel.Receipt, null);
|
||||
blob.LightningAmountInSatoshi = restModel.LightningAmountInSatoshi;
|
||||
blob.LightningPrivateRouteHints = restModel.LightningPrivateRouteHints;
|
||||
@@ -198,15 +193,11 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
blob.MonitoringExpiration = restModel.MonitoringExpiration;
|
||||
blob.InvoiceExpiration = restModel.InvoiceExpiration;
|
||||
blob.DisplayExpirationTimer = restModel.DisplayExpirationTimer;
|
||||
blob.CustomLogo = restModel.CustomLogo;
|
||||
blob.CustomCSS = restModel.CustomCSS;
|
||||
blob.HtmlTitle = restModel.HtmlTitle;
|
||||
blob.AnyoneCanInvoice = restModel.AnyoneCanCreateInvoice;
|
||||
blob.LightningDescriptionTemplate = restModel.LightningDescriptionTemplate;
|
||||
blob.PaymentTolerance = restModel.PaymentTolerance;
|
||||
blob.PayJoinEnabled = restModel.PayJoinEnabled;
|
||||
if (restModel.CheckoutType.HasValue)
|
||||
blob.CheckoutType = restModel.CheckoutType.Value;
|
||||
if (restModel.AutoDetectLanguage.HasValue)
|
||||
blob.AutoDetectLanguage = restModel.AutoDetectLanguage.Value;
|
||||
if (restModel.ShowPayInWalletButton.HasValue)
|
||||
@@ -228,7 +219,6 @@ namespace BTCPayServer.Controllers.Greenfield
|
||||
},
|
||||
PaymentMethod = PaymentMethodId.Parse(criteria.PaymentMethod)
|
||||
}).ToList() ?? new List<PaymentMethodCriteria>();
|
||||
blob.NormalizeToRelativeLinks(Request);
|
||||
model.SetStoreBlob(blob);
|
||||
}
|
||||
|
||||
|
||||
@@ -108,9 +108,7 @@ namespace BTCPayServer.Controllers
|
||||
public IActionResult GetTranslations(string resource, string lang)
|
||||
{
|
||||
string path;
|
||||
if (resource == "checkout-v1")
|
||||
path = "locales";
|
||||
else if (resource == "checkout-v2")
|
||||
if (resource.StartsWith("checkout"))
|
||||
path = "locales/checkout";
|
||||
else
|
||||
return NotFound();
|
||||
|
||||
@@ -687,8 +687,7 @@ namespace BTCPayServer.Controllers
|
||||
if (view == "modal")
|
||||
model.IsModal = true;
|
||||
|
||||
var viewName = model.CheckoutType == CheckoutType.V2 ? "CheckoutV2" : nameof(Checkout);
|
||||
return View(viewName, model);
|
||||
return View(model);
|
||||
}
|
||||
|
||||
[HttpGet("invoice-noscript")]
|
||||
@@ -876,9 +875,6 @@ namespace BTCPayServer.Controllers
|
||||
ShowPayInWalletButton = storeBlob.ShowPayInWalletButton,
|
||||
ShowStoreHeader = storeBlob.ShowStoreHeader,
|
||||
StoreBranding = new StoreBrandingViewModel(storeBlob),
|
||||
CustomCSSLink = storeBlob.CustomCSS,
|
||||
CustomLogoLink = storeBlob.CustomLogo,
|
||||
CheckoutType = invoice.CheckoutType ?? storeBlob.CheckoutType,
|
||||
HtmlTitle = storeBlob.HtmlTitle ?? "BTCPay Invoice",
|
||||
CelebratePayment = storeBlob.CelebratePayment,
|
||||
OnChainWithLnInvoiceFallback = storeBlob.OnChainWithLnInvoiceFallback,
|
||||
@@ -890,7 +886,6 @@ namespace BTCPayServer.Controllers
|
||||
OrderAmount = accounting.ShowMoney(accounting.TotalDue - accounting.PaymentMethodFee),
|
||||
IsUnsetTopUp = invoice.IsUnsetTopUp(),
|
||||
CustomerEmail = invoice.Metadata.BuyerEmail,
|
||||
RequiresRefundEmail = invoice.RequiresRefundEmail ?? storeBlob.RequiresRefundEmail,
|
||||
ExpirationSeconds = Math.Max(0, (int)(invoice.ExpirationTime - DateTimeOffset.UtcNow).TotalSeconds),
|
||||
DisplayExpirationTimer = (int)storeBlob.DisplayExpirationTimer.TotalSeconds,
|
||||
MaxTimeSeconds = (int)(invoice.ExpirationTime - invoice.InvoiceTime).TotalSeconds,
|
||||
@@ -969,10 +964,10 @@ namespace BTCPayServer.Controllers
|
||||
if (storeBlob.PlaySoundOnPayment)
|
||||
{
|
||||
model.PaymentSoundUrl = string.IsNullOrEmpty(storeBlob.SoundFileId)
|
||||
? string.Concat(Request.GetAbsoluteRootUri().ToString(), "checkout-v2/payment.mp3")
|
||||
? string.Concat(Request.GetAbsoluteRootUri().ToString(), "checkout/payment.mp3")
|
||||
: await _fileService.GetFileUrl(Request.GetAbsoluteRootUri(), storeBlob.SoundFileId);
|
||||
model.ErrorSoundUrl = string.Concat(Request.GetAbsoluteRootUri().ToString(), "checkout-v2/error.mp3");
|
||||
model.NfcReadSoundUrl = string.Concat(Request.GetAbsoluteRootUri().ToString(), "checkout-v2/nfcread.mp3");
|
||||
model.ErrorSoundUrl = string.Concat(Request.GetAbsoluteRootUri().ToString(), "checkout/error.mp3");
|
||||
model.NfcReadSoundUrl = string.Concat(Request.GetAbsoluteRootUri().ToString(), "checkout/nfcread.mp3");
|
||||
}
|
||||
|
||||
var expiration = TimeSpan.FromSeconds(model.ExpirationSeconds);
|
||||
@@ -1198,7 +1193,6 @@ namespace BTCPayServer.Controllers
|
||||
{
|
||||
StoreId = model.StoreId,
|
||||
Currency = storeBlob.DefaultCurrency,
|
||||
CheckoutType = storeBlob.CheckoutType,
|
||||
AvailablePaymentMethods = GetPaymentMethodsSelectList(store)
|
||||
};
|
||||
|
||||
@@ -1218,7 +1212,6 @@ namespace BTCPayServer.Controllers
|
||||
}
|
||||
|
||||
var storeBlob = store.GetStoreBlob();
|
||||
model.CheckoutType = storeBlob.CheckoutType;
|
||||
model.AvailablePaymentMethods = GetPaymentMethodsSelectList(store);
|
||||
|
||||
JObject? metadataObj = null;
|
||||
@@ -1265,9 +1258,6 @@ namespace BTCPayServer.Controllers
|
||||
{
|
||||
RedirectURL = store.StoreWebsite,
|
||||
DefaultPaymentMethod = model.DefaultPaymentMethod,
|
||||
RequiresRefundEmail = model.RequiresRefundEmail == RequiresRefundEmail.InheritFromStore
|
||||
? storeBlob.RequiresRefundEmail
|
||||
: model.RequiresRefundEmail == RequiresRefundEmail.On,
|
||||
PaymentMethods = model.SupportedTransactionCurrencies?.ToArray()
|
||||
},
|
||||
}, store, HttpContext.Request.GetAbsoluteRoot(),
|
||||
|
||||
@@ -182,8 +182,6 @@ namespace BTCPayServer.Controllers
|
||||
entity.DefaultPaymentMethod = paymentMethodId;
|
||||
}
|
||||
entity.RedirectAutomatically = invoice.Checkout.RedirectAutomatically ?? storeBlob.RedirectAutomatically;
|
||||
entity.CheckoutType = invoice.Checkout.CheckoutType;
|
||||
entity.RequiresRefundEmail = invoice.Checkout.RequiresRefundEmail;
|
||||
entity.LazyPaymentMethods = invoice.Checkout.LazyPaymentMethods ?? storeBlob.LazyPaymentMethods;
|
||||
IPaymentFilter? excludeFilter = null;
|
||||
if (invoice.Checkout.PaymentMethods != null)
|
||||
@@ -195,7 +193,6 @@ namespace BTCPayServer.Controllers
|
||||
}
|
||||
entity.PaymentTolerance = invoice.Checkout.PaymentTolerance ?? storeBlob.PaymentTolerance;
|
||||
entity.RedirectURLTemplate = invoice.Checkout.RedirectURL?.Trim();
|
||||
entity.RequiresRefundEmail = invoice.Checkout.RequiresRefundEmail;
|
||||
if (additionalTags != null)
|
||||
entity.InternalTags.AddRange(additionalTags);
|
||||
return await CreateInvoiceCoreRaw(entity, store, excludeFilter, invoice.AdditionalSearchTerms, cancellationToken, entityManipulator);
|
||||
|
||||
@@ -246,18 +246,14 @@ public partial class UIStoresController
|
||||
};
|
||||
}).ToList();
|
||||
|
||||
vm.UseClassicCheckout = storeBlob.CheckoutType == Client.Models.CheckoutType.V1;
|
||||
vm.CelebratePayment = storeBlob.CelebratePayment;
|
||||
vm.PlaySoundOnPayment = storeBlob.PlaySoundOnPayment;
|
||||
vm.OnChainWithLnInvoiceFallback = storeBlob.OnChainWithLnInvoiceFallback;
|
||||
vm.ShowPayInWalletButton = storeBlob.ShowPayInWalletButton;
|
||||
vm.ShowStoreHeader = storeBlob.ShowStoreHeader;
|
||||
vm.LightningAmountInSatoshi = storeBlob.LightningAmountInSatoshi;
|
||||
vm.RequiresRefundEmail = storeBlob.RequiresRefundEmail;
|
||||
vm.LazyPaymentMethods = storeBlob.LazyPaymentMethods;
|
||||
vm.RedirectAutomatically = storeBlob.RedirectAutomatically;
|
||||
vm.CustomCSS = storeBlob.CustomCSS;
|
||||
vm.CustomLogo = storeBlob.CustomLogo;
|
||||
vm.SoundFileId = storeBlob.SoundFileId;
|
||||
vm.HtmlTitle = storeBlob.HtmlTitle;
|
||||
vm.SupportUrl = storeBlob.StoreSupportUrl;
|
||||
@@ -386,23 +382,18 @@ public partial class UIStoresController
|
||||
|
||||
blob.ShowPayInWalletButton = model.ShowPayInWalletButton;
|
||||
blob.ShowStoreHeader = model.ShowStoreHeader;
|
||||
blob.CheckoutType = model.UseClassicCheckout ? Client.Models.CheckoutType.V1 : Client.Models.CheckoutType.V2;
|
||||
blob.CelebratePayment = model.CelebratePayment;
|
||||
blob.PlaySoundOnPayment = model.PlaySoundOnPayment;
|
||||
blob.OnChainWithLnInvoiceFallback = model.OnChainWithLnInvoiceFallback;
|
||||
blob.LightningAmountInSatoshi = model.LightningAmountInSatoshi;
|
||||
blob.RequiresRefundEmail = model.RequiresRefundEmail;
|
||||
blob.LazyPaymentMethods = model.LazyPaymentMethods;
|
||||
blob.RedirectAutomatically = model.RedirectAutomatically;
|
||||
blob.ReceiptOptions = model.ReceiptOptions.ToDTO();
|
||||
blob.CustomLogo = model.CustomLogo;
|
||||
blob.CustomCSS = model.CustomCSS;
|
||||
blob.HtmlTitle = string.IsNullOrWhiteSpace(model.HtmlTitle) ? null : model.HtmlTitle;
|
||||
blob.StoreSupportUrl = string.IsNullOrWhiteSpace(model.SupportUrl) ? null : model.SupportUrl.IsValidEmail() ? $"mailto:{model.SupportUrl}" : model.SupportUrl;
|
||||
blob.DisplayExpirationTimer = TimeSpan.FromMinutes(model.DisplayExpirationTimer);
|
||||
blob.AutoDetectLanguage = model.AutoDetectLanguage;
|
||||
blob.DefaultLang = model.DefaultLang;
|
||||
blob.NormalizeToRelativeLinks(Request);
|
||||
if (CurrentStore.SetStoreBlob(blob))
|
||||
{
|
||||
needUpdate = true;
|
||||
|
||||
@@ -33,17 +33,11 @@ namespace BTCPayServer.Data
|
||||
RecommendedFeeBlockTarget = 1;
|
||||
PaymentMethodCriteria = new List<PaymentMethodCriteria>();
|
||||
ReceiptOptions = InvoiceDataBase.ReceiptOptions.CreateDefault();
|
||||
CheckoutType = CheckoutType.V2;
|
||||
}
|
||||
|
||||
[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
|
||||
public NetworkFeeMode NetworkFeeMode { get; set; }
|
||||
|
||||
[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
|
||||
[DefaultValue(CheckoutType.V2)]
|
||||
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
||||
public CheckoutType CheckoutType { get; set; }
|
||||
public bool RequiresRefundEmail { get; set; }
|
||||
public bool LightningAmountInSatoshi { get; set; }
|
||||
public bool LightningPrivateRouteHints { get; set; }
|
||||
public bool OnChainWithLnInvoiceFallback { get; set; }
|
||||
@@ -112,8 +106,6 @@ namespace BTCPayServer.Data
|
||||
public string PreferredExchange { get; set; }
|
||||
|
||||
public List<PaymentMethodCriteria> PaymentMethodCriteria { get; set; }
|
||||
public string CustomCSS { get; set; }
|
||||
public string CustomLogo { get; set; }
|
||||
public string HtmlTitle { get; set; }
|
||||
|
||||
public bool AutoDetectLanguage { get; set; }
|
||||
@@ -274,30 +266,6 @@ namespace BTCPayServer.Data
|
||||
ExcludedPaymentMethods = methods.ToArray();
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
}
|
||||
|
||||
// Replace absolute URL with relative to avoid this issue: https://github.com/btcpayserver/btcpayserver/discussions/4195
|
||||
public void NormalizeToRelativeLinks(HttpRequest request)
|
||||
{
|
||||
var schemeAndHost = $"{request.Scheme}://{request.Host.ToString()}/";
|
||||
this.CustomLogo = EnsureRelativeLinks(this.CustomLogo, schemeAndHost);
|
||||
this.CustomCSS = EnsureRelativeLinks(this.CustomCSS, schemeAndHost);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Make a link relative if possible
|
||||
/// </summary>
|
||||
/// <param name="value">Example: https://mystore.com/toto.png</param>
|
||||
/// <param name="schemeAndHost">Example: https://mystore.com/</param>
|
||||
/// <returns>/toto.png</returns>
|
||||
private string EnsureRelativeLinks(string value, string schemeAndHost)
|
||||
{
|
||||
if (value is null)
|
||||
return null;
|
||||
value = value.Trim();
|
||||
if (value.StartsWith(schemeAndHost, StringComparison.OrdinalIgnoreCase))
|
||||
return value.Substring(schemeAndHost.Length - 1);
|
||||
return value;
|
||||
}
|
||||
}
|
||||
public class PaymentMethodCriteria
|
||||
{
|
||||
|
||||
@@ -79,8 +79,6 @@ namespace BTCPayServer.Models
|
||||
|
||||
[JsonProperty(PropertyName = "redirectAutomatically", DefaultValueHandling = DefaultValueHandling.Ignore)]
|
||||
public bool? RedirectAutomatically { get; set; }
|
||||
[JsonProperty(PropertyName = "requiresRefundEmail", DefaultValueHandling = DefaultValueHandling.Ignore)]
|
||||
public bool? RequiresRefundEmail { get; set; }
|
||||
|
||||
//Bitpay compatibility: create invoice in btcpay uses this instead of supportedTransactionCurrencies
|
||||
[JsonProperty(PropertyName = "paymentCurrencies", DefaultValueHandling = DefaultValueHandling.Ignore)]
|
||||
|
||||
@@ -268,8 +268,6 @@ namespace BTCPayServer.Models
|
||||
public Dictionary<string, InvoiceCryptoInfo.InvoicePaymentUrls> PaymentCodes { get; set; }
|
||||
[JsonProperty("buyer")]
|
||||
public JObject Buyer { get; set; }
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
public CheckoutType? CheckoutType { get; set; }
|
||||
}
|
||||
public class Flags
|
||||
{
|
||||
|
||||
@@ -82,13 +82,5 @@ namespace BTCPayServer.Models.InvoicingModels
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
[DisplayName("Require Refund Email")]
|
||||
public RequiresRefundEmail RequiresRefundEmail
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public CheckoutType CheckoutType { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,6 @@ namespace BTCPayServer.Models.InvoicingModels
|
||||
public bool Displayed { get; set; }
|
||||
}
|
||||
public StoreBrandingViewModel StoreBranding { get; set; }
|
||||
public string CustomCSSLink { get; set; }
|
||||
public string CustomLogoLink { get; set; }
|
||||
public string PaymentSoundUrl { get; set; }
|
||||
public string NfcReadSoundUrl { get; set; }
|
||||
public string ErrorSoundUrl { get; set; }
|
||||
@@ -38,7 +36,6 @@ namespace BTCPayServer.Models.InvoicingModels
|
||||
public string BtcAddress { get; set; }
|
||||
public string BtcDue { get; set; }
|
||||
public string CustomerEmail { get; set; }
|
||||
public bool RequiresRefundEmail { get; set; }
|
||||
public bool ShowRecommendedFee { get; set; }
|
||||
public decimal FeeRate { get; set; }
|
||||
public int ExpirationSeconds { get; set; }
|
||||
@@ -73,7 +70,6 @@ namespace BTCPayServer.Models.InvoicingModels
|
||||
public bool Activated { get; set; }
|
||||
public string InvoiceCurrency { get; set; }
|
||||
public string ReceiptLink { get; set; }
|
||||
public CheckoutType CheckoutType { get; set; }
|
||||
public int? RequiredConfirmations { get; set; }
|
||||
public long? ReceivedConfirmations { get; set; }
|
||||
|
||||
|
||||
@@ -39,18 +39,12 @@ namespace BTCPayServer.Models.StoreViewModels
|
||||
[Display(Name = "Default payment method on checkout")]
|
||||
public string DefaultPaymentMethod { get; set; }
|
||||
|
||||
[Display(Name = "Use the classic checkout")]
|
||||
public bool UseClassicCheckout { get; set; }
|
||||
|
||||
[Display(Name = "Celebrate payment with confetti")]
|
||||
public bool CelebratePayment { get; set; }
|
||||
|
||||
[Display(Name = "Enable sounds on checkout page")]
|
||||
public bool PlaySoundOnPayment { get; set; }
|
||||
|
||||
[Display(Name = "Requires a refund email")]
|
||||
public bool RequiresRefundEmail { get; set; }
|
||||
|
||||
[Display(Name = "Only enable the payment method after user explicitly chooses it")]
|
||||
public bool LazyPaymentMethods { get; set; }
|
||||
|
||||
@@ -63,12 +57,6 @@ namespace BTCPayServer.Models.StoreViewModels
|
||||
[Display(Name = "Default language on checkout")]
|
||||
public string DefaultLang { get; set; }
|
||||
|
||||
[Display(Name = "Link to a custom CSS stylesheet")]
|
||||
public string CustomCSS { get; set; }
|
||||
|
||||
[Display(Name = "Link to a custom logo")]
|
||||
public string CustomLogo { get; set; }
|
||||
|
||||
[Display(Name = "Custom sound file for successful payment")]
|
||||
public IFormFile SoundFile { get; set; }
|
||||
public string SoundFileId { get; set; }
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace BTCPayServer.Payments.Bitcoin
|
||||
|
||||
public void RegisterViews(PaymentMethodViewContext context)
|
||||
{
|
||||
context.RegisterCheckoutUI(new CheckoutUIPaymentMethodSettings()
|
||||
context.RegisterCheckoutUI(new CheckoutUIPaymentMethodSettings
|
||||
{
|
||||
ExtensionPartial = "Bitcoin/BitcoinLikeMethodCheckout",
|
||||
CheckoutBodyVueComponentName = "BitcoinLikeMethodCheckout",
|
||||
|
||||
@@ -19,12 +19,8 @@ namespace BTCPayServer.Plugins.NFC
|
||||
"checkout-end"));
|
||||
applicationBuilder.AddSingleton<IUIExtension>(new UIExtension("NFC/LNURLNFCPostContent",
|
||||
"checkout-lightning-post-content"));
|
||||
applicationBuilder.AddSingleton<IUIExtension>(new UIExtension("NFC/CheckoutEnd",
|
||||
"checkout-v2-end"));
|
||||
applicationBuilder.AddSingleton<IUIExtension>(new UIExtension("NFC/LNURLNFCPostContent-v2",
|
||||
"checkout-v2-lightning-post-content"));
|
||||
applicationBuilder.AddSingleton<IUIExtension>(new UIExtension("NFC/LNURLNFCPostContent-v2",
|
||||
"checkout-v2-bitcoin-post-content"));
|
||||
applicationBuilder.AddSingleton<IUIExtension>(new UIExtension("NFC/LNURLNFCPostContent",
|
||||
"checkout-bitcoin-post-content"));
|
||||
base.Execute(applicationBuilder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,7 +126,6 @@ namespace BTCPayServer.Plugins.PointOfSale.Controllers
|
||||
AppId = appId,
|
||||
StoreId = store.Id,
|
||||
Description = settings.Description,
|
||||
RequiresRefundEmail = settings.RequiresRefundEmail
|
||||
});
|
||||
}
|
||||
|
||||
@@ -150,7 +149,6 @@ namespace BTCPayServer.Plugins.PointOfSale.Controllers
|
||||
string choiceKey = null,
|
||||
string posData = null,
|
||||
string formResponse = null,
|
||||
RequiresRefundEmail requiresRefundEmail = RequiresRefundEmail.InheritFromStore,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var app = await _appService.GetApp(appId, PointOfSaleAppType.AppType);
|
||||
@@ -337,9 +335,6 @@ namespace BTCPayServer.Plugins.PointOfSale.Controllers
|
||||
RedirectURL = !string.IsNullOrEmpty(redirectUrl) ? redirectUrl
|
||||
: !string.IsNullOrEmpty(settings.RedirectUrl) ? settings.RedirectUrl
|
||||
: Request.GetAbsoluteUri(Url.Action(nameof(ViewPointOfSale), "UIPointOfSale", new { appId, viewType })),
|
||||
RequiresRefundEmail = requiresRefundEmail == RequiresRefundEmail.InheritFromStore
|
||||
? storeBlob.RequiresRefundEmail
|
||||
: requiresRefundEmail == RequiresRefundEmail.On,
|
||||
PaymentMethods = paymentMethods?.Where(p => p.Value.Enabled).Select(p => p.Key).ToArray()
|
||||
},
|
||||
AdditionalSearchTerms = new [] { AppService.GetAppSearchTerm(app) }
|
||||
|
||||
@@ -108,8 +108,6 @@ namespace BTCPayServer.Plugins.PointOfSale.Models
|
||||
public int[] CustomTipPercentages { get; set; }
|
||||
public string Description { get; set; }
|
||||
public SelectList AllCategories { get; set; }
|
||||
[Display(Name = "Custom CSS Code")]
|
||||
public RequiresRefundEmail RequiresRefundEmail { get; set; } = RequiresRefundEmail.InheritFromStore;
|
||||
public string StoreId { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ namespace BTCPayServer.Services.Altcoins.Monero.Payments
|
||||
|
||||
public CheckoutUIPaymentMethodSettings GetCheckoutUISettings()
|
||||
{
|
||||
return new CheckoutUIPaymentMethodSettings()
|
||||
return new CheckoutUIPaymentMethodSettings
|
||||
{
|
||||
ExtensionPartial = "Bitcoin/BitcoinLikeMethodCheckout",
|
||||
CheckoutBodyVueComponentName = "BitcoinLikeMethodCheckout",
|
||||
|
||||
@@ -105,7 +105,7 @@ namespace BTCPayServer.Services.Altcoins.Zcash.Payments
|
||||
|
||||
public CheckoutUIPaymentMethodSettings GetCheckoutUISettings()
|
||||
{
|
||||
return new CheckoutUIPaymentMethodSettings()
|
||||
return new CheckoutUIPaymentMethodSettings
|
||||
{
|
||||
ExtensionPartial = "Bitcoin/BitcoinLikeMethodCheckout",
|
||||
CheckoutBodyVueComponentName = "BitcoinLikeMethodCheckout",
|
||||
|
||||
@@ -24,14 +24,4 @@ namespace BTCPayServer.Services.Apps
|
||||
{
|
||||
Task<IEnumerable<ItemStats>> GetItemStats(AppData appData, InvoiceEntity[] invoiceEntities);
|
||||
}
|
||||
|
||||
public enum RequiresRefundEmail
|
||||
{
|
||||
[Display(Name = "Inherit from store settings")]
|
||||
InheritFromStore,
|
||||
[Display(Name = "On")]
|
||||
On,
|
||||
[Display(Name = "Off")]
|
||||
Off
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,6 @@ namespace BTCPayServer.Services.Apps
|
||||
ShowSearch = true;
|
||||
ShowCategories = true;
|
||||
EnableTips = false;
|
||||
RequiresRefundEmail = RequiresRefundEmail.InheritFromStore;
|
||||
}
|
||||
public string Title { get; set; }
|
||||
public string Currency { get; set; }
|
||||
@@ -93,7 +92,6 @@ namespace BTCPayServer.Services.Apps
|
||||
public bool ShowSearch { get; set; } = true;
|
||||
public bool ShowCategories { get; set; } = true;
|
||||
public bool EnableTips { get; set; }
|
||||
public RequiresRefundEmail RequiresRefundEmail { get; set; }
|
||||
|
||||
public string FormId { get; set; } = null;
|
||||
|
||||
|
||||
@@ -459,8 +459,6 @@ namespace BTCPayServer.Services.Invoices
|
||||
return GetPayments(accountedOnly).Where(p => p.Currency == currency).ToList();
|
||||
}
|
||||
#pragma warning restore CS0618
|
||||
[JsonProperty]
|
||||
public bool? RequiresRefundEmail { get; set; }
|
||||
|
||||
[JsonProperty]
|
||||
public string StoreSupportUrl { get; set; }
|
||||
@@ -521,9 +519,6 @@ namespace BTCPayServer.Services.Invoices
|
||||
[JsonProperty]
|
||||
public InvoiceDataBase.ReceiptOptions ReceiptOptions { get; set; }
|
||||
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
[JsonProperty]
|
||||
public CheckoutType? CheckoutType { get; set; }
|
||||
[JsonProperty]
|
||||
public bool LazyPaymentMethods { get; set; }
|
||||
|
||||
@@ -638,7 +633,6 @@ namespace BTCPayServer.Services.Invoices
|
||||
dto.TaxIncluded = Metadata.TaxIncluded ?? 0m;
|
||||
dto.Price = Price;
|
||||
dto.Currency = Currency;
|
||||
dto.CheckoutType = CheckoutType;
|
||||
dto.Buyer = new JObject();
|
||||
dto.Buyer.Add(new JProperty("name", Metadata.BuyerName));
|
||||
dto.Buyer.Add(new JProperty("address1", Metadata.BuyerAddress1));
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace BTCPayServer.Services
|
||||
{
|
||||
_logger = logger;
|
||||
var path = environment.WebRootPath;
|
||||
path = Path.Combine(path, "locales");
|
||||
path = Path.Combine(path, "locales", "checkout");
|
||||
var files = Directory.GetFiles(path, "*.json");
|
||||
var result = new List<Language>();
|
||||
foreach (var file in files)
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
@using BTCPayServer.BIP78.Sender
|
||||
@using BTCPayServer.Components.TruncateCenter
|
||||
@using BTCPayServer.Abstractions.TagHelpers
|
||||
@model BTCPayServer.Models.InvoicingModels.PaymentModel
|
||||
|
||||
<template id="bitcoin-method-checkout-template">
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new {location = "checkout-v2-bitcoin-pre-content", model = Model})
|
||||
<div class="payment-box">
|
||||
<div v-if="model.invoiceBitcoinUrlQR" class="qr-container" :data-qr-value="model.invoiceBitcoinUrlQR" :data-clipboard="model.invoiceBitcoinUrl" data-clipboard-confirm-element="#Address_@Model.PaymentMethodId [data-clipboard]">
|
||||
<div>
|
||||
<qrcode :value="model.invoiceBitcoinUrlQR" tag="div" :options="qrOptions" />
|
||||
</div>
|
||||
<img class="qr-icon" :src="model.cryptoImage" :alt="model.paymentMethodName"/>
|
||||
</div>
|
||||
<div v-if="model.btcAddress" class="input-group mt-3">
|
||||
<div class="form-floating" id="Address_@Model.PaymentMethodId">
|
||||
<vc:truncate-center text="model.btcAddress" is-vue="true" padding="15" elastic="true" classes="form-control-plaintext" />
|
||||
<label v-t="{ path: 'address', args: { paymentMethod: model.paymentMethodName }}"></label>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="lightning" class="input-group mt-3">
|
||||
<div class="form-floating" id="Lightning_@Model.PaymentMethodId">
|
||||
<vc:truncate-center text="lightning" is-vue="true" padding="15" elastic="true" classes="form-control-plaintext" />
|
||||
<label v-t="'lightning'"></label>
|
||||
</div>
|
||||
</div>
|
||||
<a v-if="model.invoiceBitcoinUrl && model.showPayInWalletButton" class="btn btn-primary rounded-pill w-100 mt-4" id="PayInWallet" target="_blank"
|
||||
:href="model.invoiceBitcoinUrl" :title="$t(hasPayjoin ? 'BIP21 payment link with PayJoin support' : 'BIP21 payment link')" v-t="'pay_in_wallet'"></a>
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new {location = "checkout-v2-bitcoin-post-content", model = Model})
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
Vue.component('BitcoinLikeMethodCheckout', {
|
||||
props: ['model', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
|
||||
template: "#bitcoin-method-checkout-template",
|
||||
components: {
|
||||
qrcode: VueQrcode
|
||||
},
|
||||
data () {
|
||||
// currentTab is needed for backwards-compatibility with old plugin versions
|
||||
return { currentTab: undefined };
|
||||
},
|
||||
computed: {
|
||||
hasPayjoin () {
|
||||
return this.model.invoiceBitcoinUrl.indexOf('@PayjoinClient.BIP21EndpointKey=') !== -1;
|
||||
},
|
||||
lightning () {
|
||||
const match = this.model.invoiceBitcoinUrl.match(/[&?]lightning=(.*)&?/i);
|
||||
return match ? match[1].toLowerCase() : null;
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -1,169 +1,54 @@
|
||||
@using BTCPayServer.BIP78.Sender
|
||||
@using NBitcoin
|
||||
@using BTCPayServer.Components.TruncateCenter
|
||||
@using BTCPayServer.Abstractions.TagHelpers
|
||||
@model BTCPayServer.Models.InvoicingModels.PaymentModel
|
||||
@inject BTCPayNetworkProvider BTCPayNetworkProvider
|
||||
|
||||
<script type="text/x-template" id="bitcoin-method-checkout-template">
|
||||
<div>
|
||||
<div class="bp-views">
|
||||
<div class="bp-view payment scan" id="scan" v-bind:class="{ 'active': currentTab == 'scan'}">
|
||||
<div class="payment__scan">
|
||||
<img v-bind:src="srvModel.cryptoImage" class="qr_currency_icon" v-if="scanDisplayQr"/>
|
||||
<qrcode v-bind:value="scanDisplayQr" :options="{ width: 256, margin: 1, color: {dark:'#000', light:'#f5f5f7'} }" tag="svg" v-if="scanDisplayQr"></qrcode>
|
||||
<div class="payment__spinner qr_currency_icon" style="padding-right: 20px;">
|
||||
@await Html.PartialAsync("~/Views/UIInvoice/Checkout-Spinner.cshtml")
|
||||
</div>
|
||||
</div>
|
||||
<div class="payment__details__instruction__open-wallet" v-if="srvModel.invoiceBitcoinUrl && srvModel.showPayInWalletButton">
|
||||
<a class="payment__details__instruction__open-wallet__btn action-button" target="_blank" v-bind:href="srvModel.invoiceBitcoinUrl">
|
||||
<span>{{$t("Open in wallet")}}</span>
|
||||
</a>
|
||||
</div>
|
||||
<template id="bitcoin-method-checkout-template">
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new {location = "checkout-bitcoin-pre-content", model = Model})
|
||||
<div class="payment-box">
|
||||
<div v-if="model.invoiceBitcoinUrlQR" class="qr-container" :data-qr-value="model.invoiceBitcoinUrlQR" :data-clipboard="model.invoiceBitcoinUrl" data-clipboard-confirm-element="#Address_@Model.PaymentMethodId [data-clipboard]">
|
||||
<div>
|
||||
<qrcode :value="model.invoiceBitcoinUrlQR" tag="div" :options="qrOptions" />
|
||||
</div>
|
||||
<div class="bp-view payment manual-flow" id="copy" v-bind:class="{ 'active': currentTab == 'copy'}">
|
||||
<div class="manual__step-two__instructions" v-if="!srvModel.isUnsetTopUp">
|
||||
<span v-html="$t('CompletePay_Body', srvModel)"></span>
|
||||
</div>
|
||||
<div class="copyLabelPopup">
|
||||
<span>{{$t("Copied")}}</span>
|
||||
</div>
|
||||
<nav class="copyBox">
|
||||
<div class="copySectionBox bottomBorder" v-if="!srvModel.isUnsetTopUp">
|
||||
<label>{{$t("Amount")}}</label>
|
||||
<div class="copyAmountText copy-cursor _copySpan">
|
||||
<span>{{srvModel.btcDue}}</span> {{ srvModel.cryptoCode }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="separatorGem"></div>
|
||||
<div class="copySectionBox bottomBorder">
|
||||
<label>{{$t("Address")}}</label>
|
||||
<div class="inputWithIcon _copyInput">
|
||||
<input type="text" class="checkoutTextbox" v-bind:value="srvModel.btcAddress" readonly="readonly"/>
|
||||
<img v-bind:src="srvModel.cryptoImage"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="separatorGem" v-if="srvModel.invoiceBitcoinUrl"></div>
|
||||
<div class="copySectionBox" v-if="srvModel.invoiceBitcoinUrl" :title="$t(hasPayjoin? 'BIP21 payment link' : 'BIP21 payment link with PayJoin support') " >
|
||||
<label v-if="srvModel.invoiceBitcoinUrl">{{$t(hasPayjoin? 'Payment link' : 'Payment link with PayJoin support')}}</label>
|
||||
<label v-else>{{$t('Payment link')}}</label>
|
||||
<div class="inputWithIcon _copyInput">
|
||||
<input type="text" class="checkoutTextbox" v-bind:value="srvModel.invoiceBitcoinUrl" readonly="readonly"/>
|
||||
<img v-bind:src="srvModel.cryptoImage" v-if="hasPayjoin"/>
|
||||
<i class="fa fa-user-secret" v-else/>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<img class="qr-icon" :src="model.cryptoImage" :alt="model.paymentMethodName"/>
|
||||
</div>
|
||||
<div v-if="model.btcAddress" class="input-group mt-3">
|
||||
<div class="form-floating" id="Address_@Model.PaymentMethodId">
|
||||
<vc:truncate-center text="model.btcAddress" is-vue="true" padding="15" elastic="true" classes="form-control-plaintext" />
|
||||
<label v-t="{ path: 'address', args: { paymentMethod: model.paymentMethodName }}"></label>
|
||||
</div>
|
||||
@await Component.InvokeAsync("UiExtensionPoint" , new { location="checkout-bitcoin-post-content", model = Model})
|
||||
</div>
|
||||
@if (Model.ShowRecommendedFee) {
|
||||
<div id="recommended-fee" class="recommended-fee" v-bind:class="{ hide: !srvModel.feeRate }">
|
||||
<span v-html="$t('Recommended_Fee', srvModel)"></span>
|
||||
<div v-if="lightning" class="input-group mt-3">
|
||||
<div class="form-floating" id="Lightning_@Model.PaymentMethodId">
|
||||
<vc:truncate-center text="lightning" is-vue="true" padding="15" elastic="true" classes="form-control-plaintext" />
|
||||
<label v-t="'lightning'"></label>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/x-template" id="bitcoin-method-checkout-header-template">
|
||||
<div class="payment-tabs">
|
||||
<div class="payment-tabs__tab " id="scan-tab" v-on:click="switchTab('scan')" v-bind:class="{ 'active': currentTab == 'scan'}" >
|
||||
<span>{{$t("Scan")}}</span>
|
||||
</div>
|
||||
<div class="payment-tabs__tab" id="copy-tab" v-on:click="switchTab('copy')" v-bind:class="{ 'active': currentTab == 'copy'}" >
|
||||
<span>{{$t("Copy")}}</span>
|
||||
</div>
|
||||
@await Component.InvokeAsync("UiExtensionPoint" , new { location="checkout-bitcoin-post-tabs", model = Model})
|
||||
<a v-if="model.invoiceBitcoinUrl && model.showPayInWalletButton" class="btn btn-primary rounded-pill w-100 mt-4" id="PayInWallet" target="_blank"
|
||||
:href="model.invoiceBitcoinUrl" :title="$t(hasPayjoin ? 'BIP21 payment link with PayJoin support' : 'BIP21 payment link')" v-t="'pay_in_wallet'"></a>
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new {location = "checkout-bitcoin-post-content", model = Model})
|
||||
</div>
|
||||
</script>
|
||||
</template>
|
||||
|
||||
<script type="text/javascript">
|
||||
Vue.component('BitcoinLikeMethodCheckout',
|
||||
{
|
||||
props: ['srvModel', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
|
||||
template: "#bitcoin-method-checkout-template",
|
||||
components: {
|
||||
qrcode: VueQrcode
|
||||
},
|
||||
data: function() {
|
||||
return {
|
||||
currentTab: "scan"
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
hasPayjoin: function(){
|
||||
return this.srvModel.invoiceBitcoinUrl.indexOf('@PayjoinClient.BIP21EndpointKey=') === -1;
|
||||
},
|
||||
scanDisplayQr: function() {
|
||||
return this.srvModel.invoiceBitcoinUrlQR;
|
||||
}
|
||||
},
|
||||
mounted: function() {
|
||||
var self = this;
|
||||
eventBus.$on("tab-switched",
|
||||
function(tab) {
|
||||
self.currentTab = tab;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Vue.component('BitcoinLikeMethodCheckoutHeader', {
|
||||
props: ['srvModel', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
|
||||
template: "#bitcoin-method-checkout-header-template",
|
||||
data: function() {
|
||||
return {
|
||||
currentTab: "scan"
|
||||
};
|
||||
<script>
|
||||
Vue.component('BitcoinLikeMethodCheckout', {
|
||||
props: ['model', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
|
||||
template: "#bitcoin-method-checkout-template",
|
||||
components: {
|
||||
qrcode: VueQrcode
|
||||
},
|
||||
methods: {
|
||||
switchTab: function(tab) {
|
||||
this.currentTab = tab;
|
||||
eventBus.$emit("tab-switched", tab);
|
||||
data () {
|
||||
// currentTab is needed for backwards-compatibility with old plugin versions
|
||||
return { currentTab: undefined };
|
||||
},
|
||||
computed: {
|
||||
hasPayjoin () {
|
||||
return this.model.invoiceBitcoinUrl.indexOf('@PayjoinClient.BIP21EndpointKey=') !== -1;
|
||||
},
|
||||
lightning () {
|
||||
const match = this.model.invoiceBitcoinUrl.match(/[&?]lightning=(.*)&?/i);
|
||||
return match ? match[1].toLowerCase() : null;
|
||||
}
|
||||
}
|
||||
});
|
||||
$(document).ready(function() {
|
||||
// Clipboard Copy
|
||||
var copySpan = new ClipboardJS('._copySpan', {
|
||||
target: function(trigger) {
|
||||
return copyElement(trigger, 0, 65).firstChild;
|
||||
}
|
||||
});
|
||||
var copyInput = new ClipboardJS('._copyInput', {
|
||||
target: function(trigger) {
|
||||
return copyElement(trigger, 4, 65).firstChild;
|
||||
}
|
||||
});
|
||||
|
||||
function copyElement(trigger, popupLeftModifier, popupTopModifier) {
|
||||
var elm = $(trigger);
|
||||
var position = elm.offset();
|
||||
position.top -= popupLeftModifier + $(window).scrollTop();
|
||||
position.left += (elm.width() / 2) - popupTopModifier;
|
||||
$(".copyLabelPopup").css(position).addClass("copied");
|
||||
elm.removeClass("copy-cursor").addClass("clipboardCopied");
|
||||
setTimeout(clearSelection, 100);
|
||||
setTimeout(function() {
|
||||
elm.removeClass("clipboardCopied").addClass("copy-cursor");
|
||||
$(".copyLabelPopup").removeClass("copied");
|
||||
},
|
||||
1000);
|
||||
return trigger;
|
||||
}
|
||||
|
||||
function clearSelection() {
|
||||
if (window.getSelection) {
|
||||
window.getSelection().removeAllRanges();
|
||||
} else if (document.selection) {
|
||||
document.selection.empty();
|
||||
}
|
||||
}
|
||||
// Disable enter key
|
||||
$(document).keypress(
|
||||
function(event) {
|
||||
if (event.which === '13') {
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
@model BTCPayServer.Models.InvoicingModels.PaymentModel
|
||||
|
||||
<template id="lightning-method-checkout-template">
|
||||
<div class="payment-box">
|
||||
@await Component.InvokeAsync("UiExtensionPoint" , new { location="checkout-v2-lightning-pre-content", model = Model})
|
||||
<div v-if="model.invoiceBitcoinUrlQR" class="qr-container" :data-qr-value="model.invoiceBitcoinUrlQR" :data-clipboard="model.invoiceBitcoinUrl" data-clipboard-confirm-element="#Lightning_@Model.PaymentMethodId [data-clipboard]">
|
||||
<div>
|
||||
<qrcode :value="model.invoiceBitcoinUrlQR" tag="div" :options="qrOptions" />
|
||||
</div>
|
||||
<img class="qr-icon" :src="model.cryptoImage" :alt="model.paymentMethodName"/>
|
||||
</div>
|
||||
<div v-if="model.btcAddress" class="input-group mt-3">
|
||||
<div class="form-floating" id="Lightning_@Model.PaymentMethodId">
|
||||
<vc:truncate-center text="model.btcAddress" is-vue="true" padding="15" elastic="true" classes="form-control-plaintext" />
|
||||
<label v-t="'lightning'"></label>
|
||||
</div>
|
||||
</div>
|
||||
<a v-if="model.invoiceBitcoinUrl && model.showPayInWalletButton" class="btn btn-primary rounded-pill w-100 mt-4" id="PayInWallet" target="_blank"
|
||||
:href="model.invoiceBitcoinUrl" v-t="'pay_in_wallet'"></a>
|
||||
<div v-if="!model.invoiceBitcoinUrl && !model.btcAddress" class="alert alert-danger">This payment method is not available when using an insecure connection. Please use HTTPS or Tor.</div>
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new {location = "checkout-v2-lightning-post-content", model = Model})
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
Vue.component('LightningLikeMethodCheckout', {
|
||||
props: ['model', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
|
||||
template: "#lightning-method-checkout-template",
|
||||
components: {
|
||||
qrcode: VueQrcode
|
||||
},
|
||||
data () {
|
||||
// currentTab is needed for backwards-compatibility with old plugin versions
|
||||
return { currentTab: undefined };
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -1,178 +1,37 @@
|
||||
@model BTCPayServer.Models.InvoicingModels.PaymentModel
|
||||
<script type="text/x-template" id="lightning-method-checkout-template">
|
||||
<div>
|
||||
<div class="bp-view payment scan" id="scan" v-bind:class="{ 'active': currentTab == 'scan'}">
|
||||
<div v-if="!srvModel.invoiceBitcoinUrl && !srvModel.btcAddress" class="alert alert-danger">This payment method is not available when using an insecure connection. Please use HTTPS or Tor.</div>
|
||||
<div class="wrapBtnGroup" v-bind:class="{ invisible: !scanDisplayQr }">
|
||||
<div class="btnGroupLnd"
|
||||
v-if="srvModel.peerInfo" >
|
||||
<button
|
||||
v-on:click="toggleLightningData('bolt11')"
|
||||
v-bind:class="{ active: currentLightningDisplay === 'bolt11' }"
|
||||
v-bind:title="$t(srvModel.paymentMethodId.endsWith('LNURLPAY')? 'LNURL': 'BOLT 11 Invoice')">
|
||||
{{$t(srvModel.paymentMethodId.endsWith('LNURLPAY')? "LNURL": "BOLT 11 Invoice")}}
|
||||
</button>
|
||||
<button
|
||||
v-on:click="toggleLightningData('node')"
|
||||
v-bind:class="{ active: currentLightningDisplay === 'node' }"
|
||||
v-bind:title="$t('Node Info')">
|
||||
{{$t("Node Info")}}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<template id="lightning-method-checkout-template">
|
||||
<div class="payment-box">
|
||||
@await Component.InvokeAsync("UiExtensionPoint" , new { location="checkout-lightning-pre-content", model = Model})
|
||||
<div v-if="model.invoiceBitcoinUrlQR" class="qr-container" :data-qr-value="model.invoiceBitcoinUrlQR" :data-clipboard="model.invoiceBitcoinUrl" data-clipboard-confirm-element="#Lightning_@Model.PaymentMethodId [data-clipboard]">
|
||||
<div>
|
||||
<qrcode :value="model.invoiceBitcoinUrlQR" tag="div" :options="qrOptions" />
|
||||
</div>
|
||||
<div class="payment__scan">
|
||||
<img v-bind:src="srvModel.cryptoImage" class="qr_currency_icon" v-if="scanDisplayQr"/>
|
||||
<qrcode v-bind:value="scanDisplayQr" :options="{ width: 256, margin: 1, color: {dark:'#000', light:'#f5f5f7'} }" tag="svg" v-if="scanDisplayQr"></qrcode>
|
||||
<div class="payment__spinner qr_currency_icon" style="padding-right: 20px;">
|
||||
@await Html.PartialAsync("~/Views/UIInvoice/Checkout-Spinner.cshtml")
|
||||
</div>
|
||||
</div>
|
||||
<div class="payment__details__instruction__open-wallet" v-if="srvModel.invoiceBitcoinUrl && srvModel.showPayInWalletButton">
|
||||
<a class="payment__details__instruction__open-wallet__btn action-button" target="_blank" v-bind:href="srvModel.invoiceBitcoinUrl">
|
||||
<span>{{$t("Open in wallet")}}</span>
|
||||
</a>
|
||||
<img class="qr-icon" :src="model.cryptoImage" :alt="model.paymentMethodName"/>
|
||||
</div>
|
||||
<div v-if="model.btcAddress" class="input-group mt-3">
|
||||
<div class="form-floating" id="Lightning_@Model.PaymentMethodId">
|
||||
<vc:truncate-center text="model.btcAddress" is-vue="true" padding="15" elastic="true" classes="form-control-plaintext" />
|
||||
<label v-t="'lightning'"></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bp-view payment manual-flow" id="copy" v-bind:class="{ 'active': currentTab == 'copy'}">
|
||||
<div v-if="!srvModel.invoiceBitcoinUrl && !srvModel.btcAddress" class="alert alert-danger">This payment method is not available when using an insecure connection. Please use HTTPS or Tor.</div>
|
||||
<template v-else>
|
||||
<div class="manual__step-two__instructions">
|
||||
<span v-html="$t('CompletePay_Body', srvModel)"></span>
|
||||
</div>
|
||||
<div class="copyLabelPopup">
|
||||
<span>{{$t("Copied")}}</span>
|
||||
</div>
|
||||
<nav class="copyBox">
|
||||
<div class="copySectionBox bottomBorder">
|
||||
<label>{{$t(srvModel.paymentMethodId.endsWith('LNURLPAY')? "LNURL": "BOLT 11 Invoice")}}</label>
|
||||
<div class="inputWithIcon _copyInput">
|
||||
<input type="text" class="checkoutTextbox" v-bind:value="srvModel.btcAddress" readonly="readonly"/>
|
||||
<img v-bind:src="srvModel.cryptoImage"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="separatorGem" v-if="srvModel.peerInfo" ></div>
|
||||
<div class="copySectionBox" v-if="srvModel.peerInfo">
|
||||
<label>{{$t("Node Info")}}</label>
|
||||
<div class="inputWithIcon _copyInput">
|
||||
<input type="text" class="checkoutTextbox" v-bind:value="srvModel.peerInfo" readonly="readonly"/>
|
||||
<img v-bind:src="srvModel.cryptoImage"/>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</template>
|
||||
</div>
|
||||
@await Component.InvokeAsync("UiExtensionPoint" , new { location="checkout-lightning-post-content", model = Model})
|
||||
<a v-if="model.invoiceBitcoinUrl && model.showPayInWalletButton" class="btn btn-primary rounded-pill w-100 mt-4" id="PayInWallet" target="_blank"
|
||||
:href="model.invoiceBitcoinUrl" v-t="'pay_in_wallet'"></a>
|
||||
<div v-if="!model.invoiceBitcoinUrl && !model.btcAddress" class="alert alert-danger">This payment method is not available when using an insecure connection. Please use HTTPS or Tor.</div>
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new {location = "checkout-lightning-post-content", model = Model})
|
||||
</div>
|
||||
</script>
|
||||
</template>
|
||||
|
||||
<script type="text/x-template" id="lightning-method-checkout-header-template">
|
||||
<div class="payment-tabs">
|
||||
<div class="payment-tabs__tab " id="scan-tab" v-on:click="switchTab('scan')" v-bind:class="{ 'active': currentTab == 'scan'}" >
|
||||
<span>{{$t("Scan")}}</span>
|
||||
</div>
|
||||
<div class="payment-tabs__tab" id="copy-tab" v-on:click="switchTab('copy')" v-bind:class="{ 'active': currentTab == 'copy'}" >
|
||||
<span>{{$t("Copy")}}</span>
|
||||
</div>
|
||||
@await Component.InvokeAsync("UiExtensionPoint" , new { location="checkout-lightning-post-tabs", model = Model})
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
Vue.component('LightningLikeMethodCheckout',
|
||||
{
|
||||
props: ['srvModel', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
|
||||
template: "#lightning-method-checkout-template",
|
||||
components: {
|
||||
qrcode: VueQrcode
|
||||
},
|
||||
data: function() {
|
||||
return {
|
||||
currentLightningDisplay: "bolt11",
|
||||
selectedThirdPartyProcessor: "",
|
||||
currentTab: "scan"
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
scanDisplayQr: function() {
|
||||
if (this.currentLightningDisplay === "node") {
|
||||
return this.srvModel.peerInfo;
|
||||
}
|
||||
return this.srvModel.invoiceBitcoinUrlQR;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
toggleLightningData: function(display) {
|
||||
this.currentLightningDisplay = display;
|
||||
}
|
||||
},
|
||||
mounted: function() {
|
||||
var self = this;
|
||||
eventBus.$on("tab-switched",
|
||||
function(tab) {
|
||||
self.currentTab = tab;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Vue.component('LightningLikeMethodCheckoutHeader', {
|
||||
props: ["srvModel"],
|
||||
template: "#lightning-method-checkout-header-template",
|
||||
data: function() {
|
||||
return {
|
||||
currentTab: "scan"
|
||||
};
|
||||
<script>
|
||||
Vue.component('LightningLikeMethodCheckout', {
|
||||
props: ['model', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
|
||||
template: "#lightning-method-checkout-template",
|
||||
components: {
|
||||
qrcode: VueQrcode
|
||||
},
|
||||
methods: {
|
||||
switchTab: function(tab) {
|
||||
this.currentTab = tab;
|
||||
eventBus.$emit("tab-switched", tab);
|
||||
}
|
||||
data () {
|
||||
// currentTab is needed for backwards-compatibility with old plugin versions
|
||||
return { currentTab: undefined };
|
||||
}
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
// Clipboard Copy
|
||||
var copySpan = new ClipboardJS('._copySpan', {
|
||||
target: function(trigger) {
|
||||
return copyElement(trigger, 0, 65).firstChild;
|
||||
}
|
||||
});
|
||||
var copyInput = new ClipboardJS('._copyInput', {
|
||||
target: function(trigger) {
|
||||
return copyElement(trigger, 4, 65).firstChild;
|
||||
}
|
||||
});
|
||||
|
||||
function copyElement(trigger, popupLeftModifier, popupTopModifier) {
|
||||
var elm = $(trigger);
|
||||
var position = elm.offset();
|
||||
position.top -= popupLeftModifier + $(window).scrollTop();
|
||||
position.left += (elm.width() / 2) - popupTopModifier;
|
||||
$(".copyLabelPopup").css(position).addClass("copied");
|
||||
elm.removeClass("copy-cursor").addClass("clipboardCopied");
|
||||
setTimeout(clearSelection, 100);
|
||||
setTimeout(function() {
|
||||
elm.removeClass("clipboardCopied").addClass("copy-cursor");
|
||||
$(".copyLabelPopup").removeClass("copied");
|
||||
},
|
||||
1000);
|
||||
return trigger;
|
||||
}
|
||||
|
||||
function clearSelection() {
|
||||
if (window.getSelection) {
|
||||
window.getSelection().removeAllRanges();
|
||||
} else if (document.selection) {
|
||||
document.selection.empty();
|
||||
}
|
||||
}
|
||||
// Disable enter key
|
||||
$(document).keypress(
|
||||
function(event) {
|
||||
if (event.which === '13') {
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,21 +1,8 @@
|
||||
<template id="lnurl-withdraw-template">
|
||||
<div v-if="display" class="mt-4" id="NFC">
|
||||
<div v-if="nfcErrorMessage" class="alert alert-danger" v-text="nfcErrorMessage"></div>
|
||||
<template v-if="isV2">
|
||||
<button class="btn btn-secondary rounded-pill w-100" type="button" id="PayByNFC"
|
||||
:disabled="nfcScanning || submitting" v-on:click="handleClick">{{btnText}}</button>
|
||||
</template>
|
||||
<template v-else>
|
||||
<bp-loading-button>
|
||||
<button class="action-button" style="margin: 0 45px;width:calc(100% - 90px) !important" :disabled="nfcScanning || submitting" v-on:click="handleClick" id="PayByNFC"
|
||||
:class="{ 'action-button': nfcSupported, 'btn btn-text w-100': !nfcSupported }">
|
||||
<span class="button-text">{{btnText}}</span>
|
||||
<div class="loader-wrapper">
|
||||
@await Html.PartialAsync("~/Views/UIInvoice/Checkout-Spinner.cshtml")
|
||||
</div>
|
||||
</button>
|
||||
</bp-loading-button>
|
||||
</template>
|
||||
<button class="btn btn-secondary rounded-pill w-100" type="button" id="PayByNFC"
|
||||
:disabled="nfcScanning || submitting" v-on:click="handleClick">{{btnText}}</button>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
@@ -23,7 +10,6 @@ Vue.component("lnurl-withdraw-checkout", {
|
||||
template: "#lnurl-withdraw-template",
|
||||
props: {
|
||||
model: Object,
|
||||
isV2: Boolean,
|
||||
nfcSupported: Boolean,
|
||||
nfcScanning: Boolean,
|
||||
nfcErrorMessage: String
|
||||
@@ -54,14 +40,14 @@ Vue.component("lnurl-withdraw-checkout", {
|
||||
btnText () {
|
||||
if (this.nfcSupported) {
|
||||
if (this.submitting) {
|
||||
return this.isV2 ? this.$t('submitting_nfc') : 'Submitting NFC …'
|
||||
return this.$t('submitting_nfc')
|
||||
} else if (this.nfcScanning) {
|
||||
return this.isV2 ? this.$t('scanning_nfc') : 'Scanning NFC …'
|
||||
return this.$t('scanning_nfc')
|
||||
} else {
|
||||
return this.isV2 ? this.$t('pay_by_nfc') : 'Pay by NFC'
|
||||
return this.$t('pay_by_nfc')
|
||||
}
|
||||
} else {
|
||||
return this.isV2 ? this.$t('pay_by_lnurl') : 'Pay by LNURL-Withdraw'
|
||||
return this.$t('pay_by_lnurl')
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<lnurl-withdraw-checkout :model="model" :is-v2="true" :nfc-supported="nfcSupported" :nfc-scanning="nfcScanning" :nfc-error-message="nfcErrorMessage" v-on="$listeners" />
|
||||
@@ -1 +1 @@
|
||||
<lnurl-withdraw-checkout :model="srvModel" :nfc-supported="nfcSupported" :nfc-scanning="nfcScanning" :nfc-error-message="nfcErrorMessage" v-on="$listeners" />
|
||||
<lnurl-withdraw-checkout :model="model" :nfc-supported="nfcSupported" :nfc-scanning="nfcScanning" :nfc-error-message="nfcErrorMessage" v-on="$listeners" />
|
||||
|
||||
@@ -68,7 +68,6 @@
|
||||
@if (inStock)
|
||||
{
|
||||
<form method="post" asp-action="ViewPointOfSale" asp-route-appId="@Model.AppId" asp-antiforgery="false" autocomplete="off">
|
||||
<input type="hidden" name="requiresRefundEmail" value="@Model.RequiresRefundEmail.ToString()" />
|
||||
<input type="hidden" name="choiceKey" value="@item.Id" />
|
||||
@if (item.PriceType == ViewPointOfSaleViewModel.ItemPriceType.Minimum)
|
||||
{
|
||||
@@ -94,7 +93,6 @@
|
||||
</div>
|
||||
<div class="card-footer bg-transparent border-0 pb-3">
|
||||
<form method="post" asp-action="ViewPointOfSale" asp-route-appId="@Model.AppId" asp-antiforgery="false" autocomplete="off">
|
||||
<input type="hidden" name="requiresRefundEmail" value="@Model.RequiresRefundEmail.ToString()" />
|
||||
<div class="input-group mb-2">
|
||||
<span class="input-group-text">@Model.CurrencySymbol</span>
|
||||
<input class="form-control" type="number" min="0" step="@Model.Step" name="amount" placeholder="Amount" required>
|
||||
|
||||
@@ -1,248 +0,0 @@
|
||||
@model PaymentModel
|
||||
@{
|
||||
var displayedPaymentMethods = Model.AvailableCryptos.Where(a => a.Displayed).ToList();
|
||||
}
|
||||
<div class="top-header">
|
||||
<div class="header">
|
||||
@if (!string.IsNullOrEmpty(Model.CustomLogoLink))
|
||||
{
|
||||
<div class="header__icon">
|
||||
<img class="header__icon__img" src="@Model.CustomLogoLink" height="40" asp-append-version="true">
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="header__iconcentered">
|
||||
<img class="header__iconcentered__img">
|
||||
</div>
|
||||
}
|
||||
<div class="close-icon close-action" v-on:click="close">
|
||||
✖
|
||||
</div>
|
||||
</div>
|
||||
<div class="timer-row" v-bind:class="{ 'expiring-soon': expiringSoon }">
|
||||
<div class="timer-row__progress-bar" v-bind:style="{ 'width': expirationPercentage+ '%' }"></div>
|
||||
<div class="timer-row__spinner" v-if="!invoiceUnpayable && !invoicePaid">
|
||||
@await Html.PartialAsync("~/Views/UIInvoice/Checkout-Spinner.cshtml")
|
||||
</div>
|
||||
<div class="timer-row__message">
|
||||
<span v-if="invoiceUnpayable">
|
||||
{{$t("Invoice expired")}}
|
||||
</span>
|
||||
<span v-else-if="expiringSoon">
|
||||
{{$t("Invoice expiring soon...")}}
|
||||
</span>
|
||||
<span v-else>
|
||||
{{$t("Awaiting Payment...")}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="timer-row__time-left">{{timerText}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="order-details">
|
||||
<div class="currency-selection">
|
||||
<div class="single-item-order__left">
|
||||
<div style="font-weight: 600;" id="pay-with-text">
|
||||
{{$t("Pay with")}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="single-item-order__right">
|
||||
@if (displayedPaymentMethods.Count > 1)
|
||||
{
|
||||
<div class="paywithRowRight cursorPointer" v-on:click="openPaymentMethodDialog">
|
||||
<span class="payment__currencies " v-show="!changingCurrencies">
|
||||
<img v-bind:src="srvModel.cryptoImage" />
|
||||
<span>{{srvModel.paymentMethodName}}</span>
|
||||
<span class="clickable_indicator fa fa-angle-right"></span>
|
||||
</span>
|
||||
</div>
|
||||
<div id="vexPopupDialog">
|
||||
<ul class="vexmenu">
|
||||
@foreach (var crypto in displayedPaymentMethods)
|
||||
{
|
||||
<li class="vexmenuitem">
|
||||
<a href="@crypto.Link" class="payment-method" data-payment-method="@crypto.PaymentMethodId" rel="noreferrer noopener">
|
||||
<img alt="@crypto.PaymentMethodName" src="@crypto.CryptoImage" asp-append-version="true" />
|
||||
@crypto.PaymentMethodName
|
||||
</a>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="payment__currencies_noborder">
|
||||
<img v-bind:src="srvModel.cryptoImage" />
|
||||
<span>{{srvModel.paymentMethodName}}</span>
|
||||
<span v-show="srvModel.isLightning">⚡</span>
|
||||
</div>
|
||||
}
|
||||
<div class="payment__spinner" v-show="changingCurrencies || loading">
|
||||
@await Html.PartialAsync("~/Views/UIInvoice/Checkout-Spinner.cshtml")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="single-item-order buyerTotalLine" v-on:click="toggleLineItems" v-bind:class="{ 'expanded': lineItemsExpanded}">
|
||||
<div class="single-item-order__left">
|
||||
<div class="single-item-order__left__name">
|
||||
{{ srvModel.storeName }}
|
||||
</div>
|
||||
<div class="single-item-order__left__description">
|
||||
{{ srvModel.itemDesc }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="single-item-order__right">
|
||||
<div class="single-item-order__right__btc-price" v-if="srvModel.status === 'paid' && !srvModel.isUnsetTopUp">
|
||||
<span>{{ srvModel.btcPaid }} {{ srvModel.cryptoCode }}</span>
|
||||
</div>
|
||||
<div class="single-item-order__right__btc-price" v-if="srvModel.status !== 'paid' && !srvModel.isUnsetTopUp && parseFloat(srvModel.btcDue) > 0">
|
||||
<span>{{ srvModel.btcDue }} {{ srvModel.cryptoCode }}</span>
|
||||
</div>
|
||||
<div class="single-item-order__right__ex-rate" v-if="srvModel.orderAmountFiat && srvModel.cryptoCode">
|
||||
<span v-if="srvModel.cryptoCode === 'sats'">1 sat = {{ srvModel.rate }}</span>
|
||||
<span v-else>1 {{ srvModel.cryptoCode }} = {{ srvModel.rate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<span class="fa fa-angle-double-down" v-if="!srvModel.isUnsetTopUp"></span>
|
||||
<span class="fa fa-angle-double-up" v-if="!srvModel.isUnsetTopUp"></span>
|
||||
</div>
|
||||
<line-items v-if="!srvModel.isUnsetTopUp">
|
||||
<div class="extraPayment" v-if="srvModel.status === 'new' && srvModel.txCount > 1">
|
||||
{{$t("NotPaid_ExtraTransaction")}}
|
||||
</div>
|
||||
<div class="line-items" v-bind:class="{ 'expanded': lineItemsExpanded}">
|
||||
<div class="line-items__item">
|
||||
<div class="line-items__item__label">{{$t("Order Amount")}}</div>
|
||||
<div class="line-items__item__value">{{srvModel.orderAmount}} {{ srvModel.cryptoCode }}</div>
|
||||
</div>
|
||||
<div class="line-items__item line-items_fiatvalue" v-if="srvModel.orderAmountFiat">
|
||||
<div class="line-items__item__label"> </div>
|
||||
<div class="line-items__item__value single-item-order__right__ex-rate">
|
||||
{{srvModel.orderAmountFiat}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="line-items__item" v-show="srvModel.isMultiCurrency || srvModel.txCountForFee > 0">
|
||||
<div class="line-items__item__label">
|
||||
<span>{{$t("Network Cost")}}</span>
|
||||
</div>
|
||||
<div class="line-items__item__value">
|
||||
<span v-if="srvModel.isMultiCurrency">
|
||||
{{ srvModel.networkFee }} {{ srvModel.cryptoCode }}
|
||||
</span>
|
||||
<span v-else-if="srvModel.txCountForFee > 0">
|
||||
{{$t("txCount", {count: srvModel.txCount})}} x {{ srvModel.networkFee }} {{ srvModel.cryptoCode }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="line-items__item">
|
||||
<div class="line-items__item__label">
|
||||
<span>{{$t("Already Paid")}}</span>
|
||||
</div>
|
||||
<div class="line-items__item__value">-{{srvModel.btcPaid }} {{ srvModel.cryptoCode }}</div>
|
||||
</div>
|
||||
<div class="line-items__item line-items__item--total" v-show="parseFloat(srvModel.btcDue) > 0">
|
||||
<div class="line-items__item__label">{{$t("Due")}}</div>
|
||||
<div class="line-items__item__value">{{srvModel.btcDue}} {{ srvModel.cryptoCode }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</line-items>
|
||||
<component v-if="srvModel.uiSettings && srvModel.uiSettings.checkoutHeaderVueComponentName && srvModel.activated"
|
||||
v-bind:srv-model="srvModel"
|
||||
v-bind:is="srvModel.uiSettings.checkoutHeaderVueComponentName">
|
||||
</component>
|
||||
</div>
|
||||
|
||||
<div class="payment-box" v-bind:class="{ 'with-recommended-fee': showRecommendedFee && !showEmailForm }">
|
||||
<div class="bp-view enter-contact-email" id="emailAddressView" v-bind:class="{ 'active': showEmailForm}">
|
||||
<form class="manual__step-one refund-address-form contact-email-form" id="emailAddressForm" name="emailAddressForm" novalidate="" v-on:submit.prevent="onEmailSubmit">
|
||||
<div class="manual__step-one__header">
|
||||
<span>{{$t("Contact and Refund Email")}}</span>
|
||||
</div>
|
||||
<div class="manual__step-one__instructions">
|
||||
<span class="initial-label" v-show="!emailAddressInputInvalid">
|
||||
<span>{{$t("Contact_Body")}}</span>
|
||||
</span>
|
||||
<span class="submission-error-label" v-show="emailAddressInputInvalid">{{$t("Please enter a valid email address")}}</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input class="bp-input email-input"
|
||||
v-bind:class="{ 'ng-pristine ng-submitted ng-touched': !emailAddressInputDirty, 'ng-invalid form-input-invalid': emailAddressInputInvalid }" id="emailAddressFormInput"
|
||||
v-bind:placeholder="$t('Your email')" type="email" v-model="emailAddressInput"
|
||||
v-on:change="onEmailChange">
|
||||
<bp-loading-button>
|
||||
<button type="submit" class="action-button" style="margin-top: 15px;" v-bind:disabled="emailAddressFormSubmitting" v-bind:class="{ 'loading': emailAddressFormSubmitting }">
|
||||
<span class="button-text">{{$t("Continue")}}</span>
|
||||
<div class="loader-wrapper">
|
||||
@await Html.PartialAsync("~/Views/UIInvoice/Checkout-Spinner.cshtml")
|
||||
</div>
|
||||
</button>
|
||||
</bp-loading-button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div v-if="showPaymentUI">
|
||||
<component v-if="srvModel.uiSettings && srvModel.uiSettings.checkoutBodyVueComponentName && srvModel.activated"
|
||||
:is="srvModel.uiSettings.checkoutBodyVueComponentName"
|
||||
:srv-model="srvModel"
|
||||
:nfc-scanning="nfc.scanning"
|
||||
:nfc-supported="nfc.supported"
|
||||
:nfc-error-message="nfc.errorMessage"
|
||||
v-on:start-nfc-scan="startNFCScan"
|
||||
v-on:handle-nfc-data="handleNFCData"
|
||||
v-on:handle-nfc-error="handleNFCError"
|
||||
v-on:handle-nfc-result="handleNFCResult" />
|
||||
</div>
|
||||
<div class="bp-view" id="paid" v-bind:class="{ 'active': invoicePaid && !showEmailForm}">
|
||||
<div class="status-block">
|
||||
<div class="success-block">
|
||||
<div class="status-icon">
|
||||
<div class="status-icon__wrapper">
|
||||
<div class="inner-wrapper">
|
||||
<div class="status-icon__wrapper__icon">
|
||||
<img src="~/imlegacy/checkmark.svg" asp-append-version="true">
|
||||
</div>
|
||||
<div class="status-icon__wrapper__outline"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="success-message">{{$t("This invoice has been paid")}}</div>
|
||||
<a v-if="srvModel.receiptLink" class="action-button" :href="srvModel.receiptLink" :target="isModal ? '_top' : null" v-html="$t('View receipt')" id="receipt-btn"></a>
|
||||
<a v-if="storeLink" class="action-button" :href="storeLink" :target="isModal ? '_top' : null" v-html="$t('Return to StoreName', srvModel)"></a>
|
||||
<button v-else-if="isModal" class="action-button close-action" v-on:click="close" v-html="$t('Close')"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-wrapper refund-address-form-container" id="refund-overpayment-button">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bp-view expired" id="expired" v-bind:class="{ 'active': invoiceUnpayable}">
|
||||
<div>
|
||||
<div class="expired__body" style="margin-bottom: 20px;">
|
||||
<div class="expired__header">{{$t("What happened?")}}</div>
|
||||
<div class="expired__text" v-html="$t('InvoiceExpired_Body_1', {storeName: srvModel.storeName, maxTimeMinutes: @Model.MaxTimeMinutes})">
|
||||
</div>
|
||||
<div class="expired__text">
|
||||
{{$t("InvoiceExpired_Body_2")}}
|
||||
</div>
|
||||
<div class="expired__text">
|
||||
{{$t("InvoiceExpired_Body_3")}}
|
||||
</div>
|
||||
<div class="expired__text expired__text__smaller" style="overflow-wrap:break-word">
|
||||
<span class="expired__text__bullet">{{$t("Invoice ID")}}</span>:
|
||||
{{srvModel.invoiceId}}
|
||||
<br />
|
||||
<span class="expired__text__bullet">{{$t("Order ID")}}</span>:
|
||||
{{srvModel.orderId}}
|
||||
</div>
|
||||
</div>
|
||||
<a class="action-button" :href="storeLink" v-show="storeLink">
|
||||
<span v-html="$t('Return to StoreName', srvModel)"></span>
|
||||
</a>
|
||||
<button class="action-button close-action" v-show="isModal" v-on:click="close">
|
||||
<span v-html="$t('Close')"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,498 +1,326 @@
|
||||
@inject BTCPayServer.Services.LanguageService langService
|
||||
@inject BTCPayServer.Services.BTCPayServerEnvironment env
|
||||
@using BTCPayServer.Services
|
||||
@using BTCPayServer.Abstractions.Contracts
|
||||
@inject LanguageService LangService
|
||||
@inject BTCPayServerEnvironment Env
|
||||
@inject IEnumerable<IUIExtension> UiExtensions
|
||||
@inject PaymentMethodHandlerDictionary PaymentMethodHandlerDictionary
|
||||
@inject BTCPayServer.Security.ContentSecurityPolicies Csp
|
||||
@model PaymentModel
|
||||
@{
|
||||
Layout = null;
|
||||
ViewData["Title"] = Model.HtmlTitle;
|
||||
ViewData["StoreBranding"] = Model.StoreBranding;
|
||||
Csp.UnsafeEval();
|
||||
var hasPaymentPlugins = UiExtensions.Any(extension => extension.Location == "checkout-payment-method");
|
||||
var displayedPaymentMethods = Model.AvailableCryptos.Where(c => c.Displayed).ToList();
|
||||
}
|
||||
@functions {
|
||||
private string ToJsValue(object value)
|
||||
{
|
||||
return Safe.Json(value).ToString()?.Replace("\"", "'");
|
||||
}
|
||||
}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html lang="@Model.DefaultLang" class="@(Model.IsModal ? "checkout-modal" : "")"@(Env.IsDeveloping ? " data-devenv" : "")>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<META NAME="robots" CONTENT="noindex,nofollow">
|
||||
<title>@Model.HtmlTitle</title>
|
||||
<link href="~/vendor/font-awesome/css/font-awesome.css" asp-append-version="true" rel="stylesheet" />
|
||||
<link href="~/vendor/vex/css/vex.css" asp-append-version="true" rel="stylesheet" />
|
||||
<link href="~/main/fonts/Roboto.css" asp-append-version="true" rel="stylesheet" />
|
||||
<link href="~/main/fonts/RobotoMono.css" asp-append-version="true" rel="stylesheet" />
|
||||
<link href="~/checkout/css/default.css" asp-append-version="true" rel="stylesheet" />
|
||||
<link href="~/checkout/css/vex-extrastyles.css" asp-append-version="true" rel="stylesheet" />
|
||||
<link href="~/checkout/css/vex-theme-btcpay.css" asp-append-version="true" rel="stylesheet" />
|
||||
<link href="~/vendor/jquery-prettydropdowns/prettydropdowns.css" asp-append-version="true" rel="stylesheet" />
|
||||
|
||||
<script>
|
||||
var initialSrvModel = @Safe.Json(Model);
|
||||
<partial name="LayoutHead"/>
|
||||
<meta name="robots" content="noindex,nofollow">
|
||||
<link href="~/checkout/checkout.css" asp-append-version="true" rel="stylesheet" />
|
||||
@if (!string.IsNullOrEmpty(Model.PaymentSoundUrl))
|
||||
{
|
||||
<link rel="preload" href="@Model.PaymentSoundUrl" as="audio" />
|
||||
}
|
||||
@if (!string.IsNullOrEmpty(Model.NfcReadSoundUrl))
|
||||
{
|
||||
<link rel="preload" href="@Model.NfcReadSoundUrl" as="audio" />
|
||||
}
|
||||
@if (!string.IsNullOrEmpty(Model.ErrorSoundUrl))
|
||||
{
|
||||
<link rel="preload" href="@Model.ErrorSoundUrl" as="audio" />
|
||||
}
|
||||
</head>
|
||||
<body class="min-vh-100">
|
||||
<div id="Checkout" class="public-page-wrap" v-cloak>
|
||||
@if (Model.ShowStoreHeader)
|
||||
{
|
||||
<partial name="_StoreHeader" model="(Model.StoreName, Model.StoreBranding)" />
|
||||
}
|
||||
<main class="tile">
|
||||
<nav v-if="isModal">
|
||||
<button type="button" v-if="isModal" id="close" v-on:click="close">
|
||||
<vc:icon symbol="close"/>
|
||||
</button>
|
||||
</nav>
|
||||
<section id="payment" v-if="isActive">
|
||||
<div class="d-flex justify-content-center mt-1 text-center">
|
||||
@if (Model.IsUnsetTopUp)
|
||||
{
|
||||
<h2 id="AmountDue" v-t="'any_amount'"></h2>
|
||||
}
|
||||
else
|
||||
{
|
||||
<h2 id="AmountDue" v-text="`${srvModel.btcDue} ${srvModel.cryptoCode}`" :data-clipboard="srvModel.btcDue" data-clipboard-hover :data-amount-due="srvModel.btcDue">@Model.BtcDue @Model.CryptoCode</h2>
|
||||
}
|
||||
</div>
|
||||
<div id="PaymentInfo" class="info mt-3 mb-2" v-collapsible="showInfo">
|
||||
<div>
|
||||
<div class="timer" v-if="showTimer">
|
||||
<span class="spinner-border spinner-border-sm" role="status"><span class="visually-hidden"></span></span>
|
||||
<span v-t="'expiry_info'"></span> <span class="expiryTime">{{timeText}}</span>
|
||||
</div>
|
||||
<div class="payment-due" v-if="showPaymentDueInfo">
|
||||
<vc:icon symbol="info" />
|
||||
<span v-t="'partial_payment_info'"></span>
|
||||
</div>
|
||||
<div v-if="showPaymentDueInfo" v-html="replaceNewlines($t('still_due', { amount: `${srvModel.btcDue} ${srvModel.cryptoCode}` }))"></div>
|
||||
</div>
|
||||
</div>
|
||||
<button id="DetailsToggle" class="d-flex align-items-center gap-1 btn btn-link payment-details-button mb-2" type="button" :aria-expanded="displayPaymentDetails ? 'true' : 'false'" v-on:click="displayPaymentDetails = !displayPaymentDetails">
|
||||
<span class="fw-semibold" v-t="'view_details'"></span>
|
||||
<vc:icon symbol="caret-down" />
|
||||
</button>
|
||||
<div id="PaymentDetails" class="payment-details" v-collapsible="displayPaymentDetails">
|
||||
<payment-details
|
||||
:srv-model="srvModel"
|
||||
:is-active="isActive"
|
||||
:order-amount="orderAmount"
|
||||
:btc-paid="btcPaid"
|
||||
:btc-due="btcDue"
|
||||
:show-recommended-fee="showRecommendedFee"
|
||||
class="pb-4" />
|
||||
</div>
|
||||
@if (displayedPaymentMethods.Count > 1 || hasPaymentPlugins)
|
||||
{
|
||||
<div class="mt-3 mb-2">
|
||||
<h6 class="text-center mb-3" v-t="'pay_with'"></h6>
|
||||
<div class="btcpay-pills d-flex flex-wrap align-items-center justify-content-center gap-2 pb-2">
|
||||
@foreach (var crypto in displayedPaymentMethods)
|
||||
{
|
||||
<a asp-action="Checkout" asp-route-invoiceId="@Model.InvoiceId" asp-route-paymentMethodId="@crypto.PaymentMethodId"
|
||||
class="btcpay-pill m-0 payment-method"
|
||||
:class="{ active: pmId === @ToJsValue(crypto.PaymentMethodId) }"
|
||||
v-on:click.prevent="changePaymentMethod(@ToJsValue(crypto.PaymentMethodId))">
|
||||
@crypto.PaymentMethodName
|
||||
</a>
|
||||
}
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new { location = "checkout-payment-method", model = Model })
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<component v-if="paymentMethodComponent" :is="paymentMethodComponent"
|
||||
:model="srvModel"
|
||||
:nfc-scanning="nfc.scanning"
|
||||
:nfc-supported="nfc.supported"
|
||||
:nfc-error-message="nfc.errorMessage"
|
||||
v-on:start-nfc-scan="startNFCScan"
|
||||
v-on:handle-nfc-data="handleNFCData"
|
||||
v-on:handle-nfc-error="handleNFCError"
|
||||
v-on:handle-nfc-result="handleNFCResult" />
|
||||
</section>
|
||||
<section id="result" v-else>
|
||||
<div v-if="isProcessing" id="processing" key="processing">
|
||||
<div class="top">
|
||||
<span class="icn">
|
||||
<div id="confetti" v-if="srvModel.celebratePayment" v-on:click="celebratePayment(5000)"></div>
|
||||
<vc:icon symbol="payment-sent" />
|
||||
</span>
|
||||
<h4 v-t="'payment_received'" class="mb-4"></h4>
|
||||
<p class="text-center" v-t="'payment_received_body'"></p>
|
||||
<p class="text-center" v-if="srvModel.receivedConfirmations !== null && srvModel.requiredConfirmations" v-t="{ path: 'payment_received_confirmations', args: { cryptoCode: realCryptoCode, receivedConfirmations: srvModel.receivedConfirmations, requiredConfirmations: srvModel.requiredConfirmations } }"></p>
|
||||
<div id="PaymentDetails" class="payment-details">
|
||||
<dl class="mb-0">
|
||||
<div>
|
||||
<dt v-t="'invoice_id'"></dt>
|
||||
<dd v-text="srvModel.invoiceId" :data-clipboard="srvModel.invoiceId" :data-clipboard-confirm="$t('copy_confirm')"></dd>
|
||||
</div>
|
||||
<div v-if="srvModel.orderId">
|
||||
<dt v-t="'order_id'"></dt>
|
||||
<dd v-text="srvModel.orderId" :data-clipboard="srvModel.orderId" :data-clipboard-confirm="$t('copy_confirm')"></dd>
|
||||
</div>
|
||||
</dl>
|
||||
<payment-details
|
||||
:srv-model="srvModel"
|
||||
:is-active="isActive"
|
||||
:order-amount="orderAmount"
|
||||
:btc-paid="btcPaid"
|
||||
:btc-due="btcDue"
|
||||
:show-recommended-fee="showRecommendedFee"
|
||||
v-collapsible="displayPaymentDetails" />
|
||||
</div>
|
||||
<button class="d-flex align-items-center gap-1 btn btn-link payment-details-button" type="button" :aria-expanded="displayPaymentDetails ? 'true' : 'false'" v-on:click="displayPaymentDetails = !displayPaymentDetails">
|
||||
<span class="fw-semibold" v-t="'view_details'"></span>
|
||||
<vc:icon symbol="caret-down" />
|
||||
</button>
|
||||
</div>
|
||||
<div class="buttons mt-3" v-if="storeLink || isModal">
|
||||
<a v-if="storeLink" class="btn btn-secondary rounded-pill w-100" :href="storeLink" :target="isModal ? '_top' : null" v-html="$t('return_to_store', { storeName: srvModel.storeName })" id="StoreLink"></a>
|
||||
<button v-else-if="isModal" class="btn btn-secondary rounded-pill w-100" v-on:click="close" v-t="'Close'"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="isSettled" id="settled" key="settled">
|
||||
<div class="top">
|
||||
<span class="icn">
|
||||
<div id="confetti" v-if="srvModel.celebratePayment" v-on:click="celebratePayment(5000)"></div>
|
||||
<vc:icon symbol="payment-complete" />
|
||||
</span>
|
||||
<h4 v-t="'invoice_paid'"></h4>
|
||||
<div id="PaymentDetails" class="payment-details">
|
||||
<dl class="mb-0">
|
||||
<div>
|
||||
<dt v-t="'invoice_id'"></dt>
|
||||
<dd v-text="srvModel.invoiceId" :data-clipboard="srvModel.invoiceId" data-clipboard-hover="start"></dd>
|
||||
</div>
|
||||
<div v-if="srvModel.orderId">
|
||||
<dt v-t="'order_id'"></dt>
|
||||
<dd v-text="srvModel.orderId" :data-clipboard="srvModel.orderId" data-clipboard-hover="start"></dd>
|
||||
</div>
|
||||
</dl>
|
||||
<payment-details
|
||||
:srv-model="srvModel"
|
||||
:is-active="isActive"
|
||||
:order-amount="orderAmount"
|
||||
:btc-paid="btcPaid"
|
||||
:btc-due="btcDue"
|
||||
:show-recommended-fee="showRecommendedFee"
|
||||
class="mb-5" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="buttons" v-if="srvModel.receiptLink || storeLink || isModal">
|
||||
<a v-if="srvModel.receiptLink" class="btn btn-primary rounded-pill w-100" :href="srvModel.receiptLink" :target="isModal ? '_top' : null" v-t="'view_receipt'" id="ReceiptLink"></a>
|
||||
<a v-if="storeLink" class="btn btn-secondary rounded-pill w-100" :href="storeLink" :target="isModal ? '_top' : null" v-html="$t('return_to_store', { storeName: srvModel.storeName })" id="StoreLink"></a>
|
||||
<button v-else-if="isModal" class="btn btn-secondary rounded-pill w-100" v-on:click="close" v-t="'Close'"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="isInvalid" id="unpaid" key="unpaid">
|
||||
<div class="top">
|
||||
<span class="icn">
|
||||
<vc:icon symbol="invoice-expired" />
|
||||
</span>
|
||||
<h4 v-t="'invoice_expired'"></h4>
|
||||
<div id="PaymentDetails" class="payment-details">
|
||||
<dl class="mb-0">
|
||||
<div>
|
||||
<dt v-t="'invoice_id'"></dt>
|
||||
<dd v-text="srvModel.invoiceId" :data-clipboard="srvModel.invoiceId" data-clipboard-hover="start"></dd>
|
||||
</div>
|
||||
<div v-if="srvModel.orderId">
|
||||
<dt v-t="'order_id'"></dt>
|
||||
<dd v-text="srvModel.orderId" :data-clipboard="srvModel.orderId" data-clipboard-hover="start"></dd>
|
||||
</div>
|
||||
</dl>
|
||||
<payment-details
|
||||
:srv-model="srvModel"
|
||||
:is-active="isActive"
|
||||
:order-amount="orderAmount"
|
||||
:btc-paid="btcPaid"
|
||||
:btc-due="btcDue"
|
||||
:show-recommended-fee="showRecommendedFee"
|
||||
v-collapsible="displayPaymentDetails" />
|
||||
</div>
|
||||
<button class="d-flex align-items-center gap-1 btn btn-link payment-details-button" type="button" :aria-expanded="displayPaymentDetails ? 'true' : 'false'" v-on:click="displayPaymentDetails = !displayPaymentDetails">
|
||||
<span class="fw-semibold" v-t="'view_details'"></span>
|
||||
<vc:icon symbol="caret-down" />
|
||||
</button>
|
||||
<p class="text-center mt-3" v-html="replaceNewlines($t(isPaidPartial ? 'invoice_paidpartial_body' : 'invoice_expired_body', { storeName: srvModel.storeName, minutes: srvModel.maxTimeMinutes }))"></p>
|
||||
</div>
|
||||
<div class="buttons" v-if="(isPaidPartial && srvModel.storeSupportUrl) || storeLink || isModal">
|
||||
<a v-if="isPaidPartial && srvModel.storeSupportUrl" class="btn btn-primary rounded-pill w-100" :href="srvModel.storeSupportUrl" v-t="'contact_us'" id="ContactLink"></a>
|
||||
<a v-if="storeLink" class="btn btn-primary rounded-pill w-100" :href="storeLink" :target="isModal ? '_top' : null" v-html="$t('return_to_store', { storeName: srvModel.storeName })" id="StoreLink"></a>
|
||||
<button v-else-if="isModal" class="btn btn-primary rounded-pill w-100" v-on:click="close" v-t="'Close'"></button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
@if (Env.CheatMode)
|
||||
{
|
||||
<checkout-cheating invoice-id="@Model.InvoiceId" :btc-due="btcDue" :is-settled="isSettled" :is-processing="isProcessing" :payment-method-id="pmId" :crypto-code="srvModel.cryptoCode"></checkout-cheating>
|
||||
}
|
||||
<footer class="store-footer">
|
||||
<a class="store-powered-by" href="https://btcpayserver.org" target="_blank" rel="noreferrer noopener">
|
||||
{{$t("powered_by")}} <partial name="_StoreFooterLogo" />
|
||||
</a>
|
||||
<select asp-for="DefaultLang" asp-items="@LangService.GetLanguageSelectListItems()" class="form-select" v-on:change="changeLanguage"></select>
|
||||
</footer>
|
||||
</div>
|
||||
<noscript>
|
||||
<div class="p-5 text-center">
|
||||
<h2>Javascript is currently disabled in your browser.</h2>
|
||||
<h5>Please enable Javascript and refresh this page for the best experience.</h5>
|
||||
<p>
|
||||
Alternatively, click below to continue to our
|
||||
<a asp-action="CheckoutNoScript" asp-route-invoiceId="@Model.InvoiceId">HTML-only invoice</a>.
|
||||
</p>
|
||||
</div>
|
||||
</noscript>
|
||||
<script type="text/x-template" id="payment-details">
|
||||
<dl>
|
||||
<div v-if="orderAmount > 0" id="PaymentDetails-TotalPrice" key="TotalPrice">
|
||||
<dt v-t="'total_price'"></dt>
|
||||
<dd :data-clipboard="srvModel.orderAmount" data-clipboard-hover="start">{{srvModel.orderAmount}} {{ srvModel.cryptoCode }}</dd>
|
||||
</div>
|
||||
<div v-if="orderAmount > 0 && srvModel.orderAmountFiat" id="PaymentDetails-TotalFiat" key="TotalFiat">
|
||||
<dt v-t="'total_fiat'"></dt>
|
||||
<dd :data-clipboard="srvModel.orderAmountFiat" data-clipboard-hover="start">{{srvModel.orderAmountFiat}}</dd>
|
||||
</div>
|
||||
<div v-if="srvModel.rate && srvModel.cryptoCode" id="PaymentDetails-ExchangeRate" key="ExchangeRate">
|
||||
<dt v-t="'exchange_rate'"></dt>
|
||||
<dd :data-clipboard="srvModel.rate" data-clipboard-hover="start">
|
||||
<template v-if="srvModel.cryptoCode === 'sats'">1 sat = {{ srvModel.rate }}</template>
|
||||
<template v-else>1 {{ srvModel.cryptoCode }} = {{ srvModel.rate }}</template>
|
||||
</dd>
|
||||
</div>
|
||||
<div v-if="srvModel.networkFee" id="PaymentDetails-NetworkCost" key="NetworkCost">
|
||||
<dt v-t="'network_cost'"></dt>
|
||||
<dd :data-clipboard="srvModel.networkFee" data-clipboard-hover="start">
|
||||
<div v-if="srvModel.txCountForFee > 0" v-t="{ path: 'tx_count', args: { count: srvModel.txCount } }"></div>
|
||||
<div v-text="`${srvModel.networkFee} ${srvModel.cryptoCode}`"></div>
|
||||
</dd>
|
||||
</div>
|
||||
<div v-if="btcPaid > 0" id="PaymentDetails-AmountPaid" key="AmountPaid">
|
||||
<dt v-t="'amount_paid'"></dt>
|
||||
<dd :data-clipboard="srvModel.btcPaid" data-clipboard-hover="start" v-text="`${srvModel.btcPaid} ${srvModel.cryptoCode}`"></dd>
|
||||
</div>
|
||||
<div v-if="btcDue > 0" id="PaymentDetails-AmountDue" key="AmountDue">
|
||||
<dt v-t="'amount_due'"></dt>
|
||||
<dd :data-clipboard="srvModel.btcDue" data-clipboard-hover="start" v-text="`${srvModel.btcDue} ${srvModel.cryptoCode}`"></dd>
|
||||
</div>
|
||||
<div v-if="showRecommendedFee" id="PaymentDetails-RecommendedFee" key="RecommendedFee">
|
||||
<dt v-t="'recommended_fee'"></dt>
|
||||
<dd :data-clipboard="srvModel.feeRate" data-clipboard-hover="start" v-t="{ path: 'fee_rate', args: { feeRate: srvModel.feeRate } }"></dd>
|
||||
</div>
|
||||
</dl>
|
||||
</script>
|
||||
<script src="~/vendor/jquery/jquery.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/bootstrap/bootstrap.bundle.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/clipboard.js/clipboard.js" asp-append-version="true"></script>
|
||||
<script>
|
||||
const i18nUrl = @Safe.Json($"{Model.RootPath}misc/translations/checkout/{{{{lng}}}}?v={Env.Version}");
|
||||
const statusUrl = @Safe.Json(Url.Action("GetStatus", new { invoiceId = Model.InvoiceId }));
|
||||
const statusWsUrl = @Safe.Json(Url.Action("GetStatusWebSocket", new { invoiceId = Model.InvoiceId }));
|
||||
const availableLanguages = @Safe.Json(LangService.GetLanguages().Select(language => language.Code));
|
||||
const initialSrvModel = @Safe.Json(Model);
|
||||
const qrOptions = { margin: 0, type: 'svg', color: { dark: '#000', light: '#fff' } };
|
||||
window.exports = {};
|
||||
</script>
|
||||
@if (Model.CelebratePayment)
|
||||
{
|
||||
<script src="~/vendor/dom-confetti/dom-confetti.min.js" asp-append-version="true"></script>
|
||||
}
|
||||
<script src="~/vendor/vuejs/vue.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/vue-qrcode/vue-qrcode.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/i18next/i18next.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/i18next/i18nextHttpBackend.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/i18next/vue-i18next.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/jquery-prettydropdowns/jquery.prettydropdowns.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/vex/js/vex.combined.min.js" asp-append-version="true"></script>
|
||||
<script src="~/js/copy-to-clipboard.js" asp-append-version="true"></script>
|
||||
<script src="~/js/vue-utils.js" asp-append-version="true"></script>
|
||||
<script src="~/main/utils.js" asp-append-version="true"></script>
|
||||
<script src="~/checkout/js/checkout.js" asp-append-version="true"></script>
|
||||
<script src="~/checkout/js/querystring.js" asp-append-version="true"></script>
|
||||
|
||||
<script>vex.defaultOptions.className = 'vex-theme-btcpay'</script>
|
||||
|
||||
@if (!string.IsNullOrEmpty(Model.CustomCSSLink))
|
||||
<script src="~/checkout/checkout.js" asp-append-version="true"></script>
|
||||
@if (Env.CheatMode)
|
||||
{
|
||||
<link href="@Model.CustomCSSLink" rel="stylesheet" asp-append-version="true"/>
|
||||
<partial name="Checkout-Cheating" model="@Model" />
|
||||
}
|
||||
|
||||
@if (Model.IsModal)
|
||||
{
|
||||
<style type="text/css">
|
||||
body {
|
||||
background: rgba(25, 25, 25, 0.9);
|
||||
}
|
||||
|
||||
.close-icon {
|
||||
display: flex;
|
||||
}
|
||||
</style>
|
||||
}
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<div style="padding:2em;text-align:center;">
|
||||
<h2>Javascript is currently disabled in your browser.</h2>
|
||||
<h5>Please enable Javascript and refresh this page for the best experience.</h5>
|
||||
|
||||
<p>Alternatively, click below to continue to our HTML-only invoice.</p>
|
||||
|
||||
<a asp-action="CheckoutNoScript" asp-route-invoiceId="@Model.InvoiceId" style="text-decoration:underline;color:blue">
|
||||
Continue to javascript-disabled invoice >
|
||||
</a>
|
||||
</div>
|
||||
</noscript>
|
||||
|
||||
<!--[if lte IE 8]>
|
||||
<div style="padding:2em;text-align:center;">
|
||||
<form asp-action="CheckoutNoScript" method="GET">
|
||||
<button style="text-decoration: underline; color: blue">Continue to legacy browser compatible invoice page
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
<![endif]-->
|
||||
|
||||
<invoice>
|
||||
<div class="no-bounce" id="checkoutCtrl" v-cloak>
|
||||
<div class="modal page" style="min-height:100vh">
|
||||
<div class="modal-dialog open opened" role="document" v-bind:class="{ 'expired': invoiceUnpayable, 'paid': invoicePaid, 'enter-purchaser-email': showEmailForm}">
|
||||
<div class="modal-content long">
|
||||
<div class="content">
|
||||
<div class="invoice">
|
||||
<partial name="Checkout-Body" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 10px; text-align: center;">
|
||||
@* Not working because of nsSeparator: false, keySeparator: false,
|
||||
{{$t("nested.lang")}} >>
|
||||
*@
|
||||
|
||||
<select asp-for="DefaultLang"
|
||||
class="cmblang reverse invisible"
|
||||
asp-items="@langService.GetLanguageSelectListItems()"></select>
|
||||
|
||||
<script>
|
||||
$(function () {
|
||||
// REVIEW: don't use initDropdown method but rather directly initialize select whenever you are using it
|
||||
$("#DefaultLang").val(startingLanguage);
|
||||
var languageSelectorPrettyDropdown = initDropdown("#DefaultLang");
|
||||
|
||||
languageSelectorPrettyDropdown.change(function () {
|
||||
changeLanguage(languageSelectorPrettyDropdown.val());
|
||||
});
|
||||
|
||||
languageSelectorPrettyDropdown.keypress(function (event) {
|
||||
if (event.keyCode == 13) {
|
||||
languageSelectorPrettyDropdown.click();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function initDropdown(selector) {
|
||||
return $(selector).prettyDropdown({
|
||||
classic: true,
|
||||
height: 32,
|
||||
reverse: true,
|
||||
hoverIntent: -1
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
<div class="powered__by__btcpayserver">
|
||||
Powered by <a target="_blank" href="https://github.com/btcpayserver/btcpayserver" rel="noreferrer noopener">BTCPay Server</a>
|
||||
</div>
|
||||
@if (env.CheatMode)
|
||||
{
|
||||
<partial name="Checkout-Testing" />
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</invoice>
|
||||
<script>
|
||||
var availableLanguages = @Safe.Json(langService.GetLanguages().Select((language) => language.Code));
|
||||
var defaultLang = @Safe.Json(Model.DefaultLang);
|
||||
var fallbackLanguage = "en";
|
||||
startingLanguage = computeStartingLanguage();
|
||||
i18next
|
||||
.use(window.i18nextHttpBackend)
|
||||
.init({
|
||||
backend: {
|
||||
loadPath: @Safe.Json($"{Model.RootPath}misc/translations/checkout-v1/{{{{lng}}}}?v={env.Version}")
|
||||
},
|
||||
lng: startingLanguage,
|
||||
fallbackLng: fallbackLanguage,
|
||||
nsSeparator: false,
|
||||
keySeparator: false
|
||||
});
|
||||
|
||||
function computeStartingLanguage() {
|
||||
if (urlParams.lang && isLanguageAvailable(urlParams.lang)) {
|
||||
return urlParams.lang;
|
||||
}
|
||||
else if (isLanguageAvailable(defaultLang)) {
|
||||
return defaultLang;
|
||||
} else {
|
||||
return fallbackLanguage;
|
||||
}
|
||||
}
|
||||
|
||||
function changeLanguage(lang) {
|
||||
if (isLanguageAvailable(lang)) {
|
||||
i18next.changeLanguage(lang);
|
||||
}
|
||||
}
|
||||
|
||||
function isLanguageAvailable(languageCode) {
|
||||
return availableLanguages.indexOf(languageCode) >= 0;
|
||||
}
|
||||
|
||||
var i18n = new VueI18next(i18next);
|
||||
Vue.config.ignoredElements = [
|
||||
'line-items',
|
||||
'low-fee-timeline',
|
||||
// Ignoring custom HTML5 elements, eg: bp-spinner
|
||||
/^bp-/
|
||||
];
|
||||
var eventBus = new Vue();
|
||||
var checkoutCtrl = new Vue({
|
||||
i18n: i18n,
|
||||
el: '#checkoutCtrl',
|
||||
data: {
|
||||
srvModel: initialSrvModel,
|
||||
end: new Date(),
|
||||
expirationPercentage: 0,
|
||||
timerText: "@Model.TimeLeft",
|
||||
emailAddressInput: "",
|
||||
emailAddressInputDirty: false,
|
||||
emailAddressInputInvalid: false,
|
||||
emailAddressFormSubmitting: false,
|
||||
lineItemsExpanded: false,
|
||||
changingCurrencies: false,
|
||||
loading: true,
|
||||
isModal: initialSrvModel.isModal,
|
||||
nfc: {
|
||||
supported: 'NDEFReader' in window,
|
||||
scanning: false,
|
||||
submitting: false,
|
||||
errorMessage: null,
|
||||
permissionGranted: false,
|
||||
readerAbortController: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
expiringSoon: function(){
|
||||
return this.expirationPercentage >= 75 && !this.invoiceUnpayable && !this.invoicePaid;
|
||||
},
|
||||
showPaymentUI: function(){
|
||||
return !this.showEmailForm && !this.invoiceUnpayable && !this.invoicePaid;
|
||||
},
|
||||
showEmailForm: function(){
|
||||
return this.srvModel.requiresRefundEmail && (!this.srvModel.customerEmail || !this.validateEmail(this.srvModel.customerEmail)) && !this.invoiceUnpayable;
|
||||
},
|
||||
showRecommendedFee: function(){
|
||||
return this.srvModel.showRecommendedFee && this.srvModel.feeRate != 0;
|
||||
},
|
||||
invoiceUnpayable: function(){
|
||||
return ["expired", "invalid"].indexOf(this.srvModel.status) >= 0;
|
||||
},
|
||||
invoicePaid: function(){
|
||||
return ["complete", "confirmed", "paid"].indexOf(this.srvModel.status) >= 0;
|
||||
},
|
||||
storeLink () {
|
||||
return this.srvModel.merchantRefLink && this.srvModel.merchantRefLink !== this.srvModel.receiptLink
|
||||
? this.srvModel.merchantRefLink
|
||||
: null;
|
||||
}
|
||||
},
|
||||
mounted: async function(){
|
||||
this.startProgressTimer();
|
||||
this.listenIn();
|
||||
this.onDataCallback(this.srvModel);
|
||||
if (this.srvModel.status === "new" && this.srvModel.txCount > 1) {
|
||||
this.onlyExpandLineItems();
|
||||
}
|
||||
window.parent.postMessage("loaded", "*");
|
||||
jQuery("invoice").fadeOut(0).fadeIn(300);
|
||||
window.closePaymentMethodDialog = this.closePaymentMethodDialog.bind(this);
|
||||
this.loading = false;
|
||||
if (this.nfc.supported) {
|
||||
this.setupNFC();
|
||||
}
|
||||
},
|
||||
beforeDestroy () {
|
||||
if (this.nfc.readerAbortController) {
|
||||
this.nfc.readerAbortController.abort()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onlyExpandLineItems: function() {
|
||||
if (!this.lineItemsExpanded) {
|
||||
this.toggleLineItems();
|
||||
}},
|
||||
toggleLineItems: function() {
|
||||
this.lineItemsExpanded ? $("line-items").slideUp() : $("line-items").slideDown();
|
||||
this.lineItemsExpanded = !this.lineItemsExpanded;
|
||||
},
|
||||
openPaymentMethodDialog: function() {
|
||||
var content = $("#vexPopupDialog").html();
|
||||
vex.open({
|
||||
unsafeContent: content
|
||||
});
|
||||
},
|
||||
closePaymentMethodDialog: function(currencyId) {
|
||||
vex.closeAll();
|
||||
this.changeCurrency(currencyId);
|
||||
},
|
||||
changeCurrency: function (currency) {
|
||||
if (currency !== null && this.srvModel.paymentMethodId !== currency) {
|
||||
this.changingCurrencies = true;
|
||||
this.srvModel.paymentMethodId = currency;
|
||||
this.fetchData();
|
||||
this.closePaymentMethodDialog(null);
|
||||
}
|
||||
},
|
||||
close: function(){
|
||||
$("invoice").fadeOut(300, function () {
|
||||
window.parent.postMessage("close", "*");
|
||||
});
|
||||
},
|
||||
validateEmail: function (email) {
|
||||
var re = /^(([^<>()\[\]\\.,;:\s@@"]+(\.[^<>()\[\]\\.,;:\s@@"]+)*)|(".+"))@@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||
return re.test(email);
|
||||
},
|
||||
startProgressTimer: function(){
|
||||
var timeLeftS = this.endDate? (this.endDate.getTime() - new Date().getTime())/1000 : this.srvModel.expirationSeconds;
|
||||
this.expirationPercentage = 100 - ((timeLeftS / this.srvModel.maxTimeSeconds) * 100);
|
||||
this.timerText = this.updateTimerText(timeLeftS);
|
||||
if( this.expirationPercentage < 100 && (this.srvModel.status === "paidPartial" || this.srvModel.status === "new")){
|
||||
setTimeout(this.startProgressTimer, 500);
|
||||
}
|
||||
},
|
||||
updateTimerText: function (timer) {
|
||||
if (timer >= 0) {
|
||||
var minutes = parseInt(timer / 60, 10);
|
||||
minutes = minutes < 10 ? "0" + minutes : minutes;
|
||||
var seconds = parseInt(timer % 60, 10);
|
||||
seconds = seconds < 10 ? "0" + seconds : seconds;
|
||||
return minutes + ":" + seconds;
|
||||
} else {
|
||||
return "00:00";
|
||||
}
|
||||
},
|
||||
listenIn: function(){
|
||||
var self = this;
|
||||
var socket = null;
|
||||
var supportsWebSockets = 'WebSocket' in window && window.WebSocket.CLOSING === 2;
|
||||
if (supportsWebSockets) {
|
||||
var loc = window.location, ws_uri;
|
||||
if (loc.protocol === "https:") {
|
||||
ws_uri = "wss:";
|
||||
} else {
|
||||
ws_uri = "ws:";
|
||||
}
|
||||
ws_uri += "//" + loc.host;
|
||||
ws_uri += loc.pathname + "/status/ws?invoiceId=" + this.srvModel.invoiceId;
|
||||
|
||||
try {
|
||||
socket = new WebSocket(ws_uri);
|
||||
socket.onmessage = function (e) {
|
||||
if (e.data === "ping")
|
||||
return;
|
||||
self.fetchData();
|
||||
};
|
||||
socket.onerror = function (e) {
|
||||
console.error("Error while connecting to websocket for invoice notifications (callback)");
|
||||
};
|
||||
}
|
||||
catch (e) {
|
||||
console.error("Error while connecting to websocket for invoice notifications");
|
||||
}
|
||||
}
|
||||
var self = this;
|
||||
function watcher(){
|
||||
setTimeout(function(){
|
||||
if (socket === null || socket.readyState !== 1) {
|
||||
self.fetchData();
|
||||
}
|
||||
watcher();
|
||||
}, 2000);
|
||||
}
|
||||
watcher();
|
||||
},
|
||||
fetchData: function(){
|
||||
var self = this;
|
||||
$.ajax({
|
||||
url: window.location.pathname + "/status?invoiceId=" + this.srvModel.invoiceId + "&paymentMethodId=" + this.srvModel.paymentMethodId,
|
||||
type: "GET",
|
||||
cache: false
|
||||
})
|
||||
.done(function (data) {
|
||||
self.onDataCallback.bind(self)(data);
|
||||
})
|
||||
},
|
||||
onDataCallback : function(jsonData){
|
||||
if (this.srvModel.status !== jsonData.status) {
|
||||
window.parent.postMessage({ "invoiceId": this.srvModel.invoiceId, "status": jsonData.status }, "*");
|
||||
}
|
||||
if (jsonData.paymentMethodId === this.srvModel.paymentMethodId) {
|
||||
this.changingCurrencies = false;
|
||||
}
|
||||
// expand line items to show details on amount due for multi-transaction payment
|
||||
if (this.srvModel.txCount === 1 && jsonData.txCount > 1) {
|
||||
this.onlyExpandLineItems();
|
||||
}
|
||||
var newEnd = new Date();
|
||||
newEnd.setSeconds(newEnd.getSeconds()+ jsonData.expirationSeconds);
|
||||
this.endDate = newEnd;
|
||||
// updating ui
|
||||
this.srvModel = jsonData;
|
||||
|
||||
eventBus.$emit("data-fetched", this.srvModel);
|
||||
if (this.invoicePaid && jsonData.redirectAutomatically && jsonData.merchantRefLink) {
|
||||
this.loading = true;
|
||||
setTimeout(function () {
|
||||
if (this.isModal && window.top.location == jsonData.merchantRefLink){
|
||||
this.close();
|
||||
} else {
|
||||
window.top.location = jsonData.merchantRefLink;
|
||||
}
|
||||
}.bind(this), 2000);
|
||||
}
|
||||
},
|
||||
onEmailChange: function(){
|
||||
this.emailAddressInputDirty = true;
|
||||
this.emailAddressInputInvalid = false;
|
||||
},
|
||||
onEmailSubmit : function(){
|
||||
var self = this;
|
||||
if (this.validateEmail(this.emailAddressInput)) {
|
||||
this.emailAddressFormSubmitting = true;
|
||||
// Push the email to a server, once the reception is confirmed move on
|
||||
$.ajax({
|
||||
url: window.location.pathname + "/UpdateCustomer?invoiceId=" +this.srvModel.invoiceId,
|
||||
type: "POST",
|
||||
data: JSON.stringify({ Email: this.emailAddressInput }),
|
||||
contentType: "application/json; charset=utf-8"
|
||||
})
|
||||
.done(function () {
|
||||
self.srvModel.customerEmail = self.emailAddressInput;
|
||||
}).always(function () {
|
||||
self.emailAddressFormSubmitting = false;
|
||||
});
|
||||
} else {
|
||||
this.emailAddressInputInvalid = true;
|
||||
}
|
||||
},
|
||||
async setupNFC () {
|
||||
try {
|
||||
this.$set(this.nfc, 'permissionGranted', navigator.permissions && (await navigator.permissions.query({ name: 'nfc' })).state === 'granted');
|
||||
} catch (e) {}
|
||||
if (this.nfc.permissionGranted) {
|
||||
await this.startNFCScan();
|
||||
}
|
||||
},
|
||||
async startNFCScan () {
|
||||
if (this.nfc.scanning) return;
|
||||
this.$set(this.nfc, 'scanning', true);
|
||||
try {
|
||||
const inModal = window.self !== window.top;
|
||||
const ndef = inModal ? new NDEFReaderWrapper() : new NDEFReader();
|
||||
this.nfc.readerAbortController = new AbortController()
|
||||
this.nfc.readerAbortController.signal.onabort = () => {
|
||||
this.$set(this.nfc, 'scanning', false);
|
||||
};
|
||||
|
||||
await ndef.scan({ signal: this.nfc.readerAbortController.signal })
|
||||
ndef.onreadingerror = () => this.reportNfcError('Could not read NFC tag')
|
||||
ndef.onreading = async ({ message }) => {
|
||||
const record = message.records[0]
|
||||
const textDecoder = new TextDecoder('utf-8')
|
||||
const decoded = textDecoder.decode(record.data)
|
||||
this.$emit('read-nfc-data', decoded)
|
||||
}
|
||||
|
||||
if (inModal) {
|
||||
// receive messages from iframe
|
||||
window.addEventListener('message', async event => {
|
||||
// deny messages from other origins
|
||||
if (event.origin !== window.location.origin) return
|
||||
|
||||
const { action, data } = event.data
|
||||
switch (action) {
|
||||
case 'nfc:data':
|
||||
this.$emit('read-nfc-data', data)
|
||||
break;
|
||||
case 'nfc:error':
|
||||
this.handleNFCError('Could not read NFC tag')
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// we came here, so the user must have allowed NFC access
|
||||
this.$set(this.nfc, 'permissionGranted', true);
|
||||
} catch (error) {
|
||||
this.handleNFCError(`NFC scan failed: ${error}`);
|
||||
}
|
||||
},
|
||||
handleNFCData() { // child component reports it is handling the data
|
||||
this.$set(this.nfc, 'errorMessage', null);
|
||||
this.$set(this.nfc, 'successMessage', null);
|
||||
this.$set(this.nfc, 'submitting', true);
|
||||
},
|
||||
handleNFCResult(message) { // child component reports result for handling the data
|
||||
this.$set(this.nfc, 'submitting', false);
|
||||
this.$set(this.nfc, 'successMessage', message);
|
||||
},
|
||||
handleNFCError(message) { // internal or via child component reporting failure of handling the data
|
||||
this.$set(this.nfc, 'submitting', false);
|
||||
this.$set(this.nfc, 'errorMessage', message);
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@foreach (var extensionPartial in Model.ExtensionPartials)
|
||||
{
|
||||
{
|
||||
<partial name="@extensionPartial" model="@Model" />
|
||||
}
|
||||
}
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new { location = "checkout-payment", model = Model })
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new { location = "checkout-end", model = Model })
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,326 +0,0 @@
|
||||
@using BTCPayServer.Services
|
||||
@using BTCPayServer.Abstractions.Contracts
|
||||
@inject LanguageService LangService
|
||||
@inject BTCPayServerEnvironment Env
|
||||
@inject IEnumerable<IUIExtension> UiExtensions
|
||||
@inject PaymentMethodHandlerDictionary PaymentMethodHandlerDictionary
|
||||
@inject BTCPayServer.Security.ContentSecurityPolicies Csp
|
||||
@model PaymentModel
|
||||
@{
|
||||
Layout = null;
|
||||
ViewData["Title"] = Model.HtmlTitle;
|
||||
ViewData["StoreBranding"] = Model.StoreBranding;
|
||||
Csp.UnsafeEval();
|
||||
var hasPaymentPlugins = UiExtensions.Any(extension => extension.Location == "checkout-payment-method");
|
||||
var displayedPaymentMethods = Model.AvailableCryptos.Where(c => c.Displayed).ToList();
|
||||
}
|
||||
@functions {
|
||||
private string ToJsValue(object value)
|
||||
{
|
||||
return Safe.Json(value).ToString()?.Replace("\"", "'");
|
||||
}
|
||||
}
|
||||
<!DOCTYPE html>
|
||||
<html lang="@Model.DefaultLang" class="@(Model.IsModal ? "checkout-modal" : "")"@(Env.IsDeveloping ? " data-devenv" : "")>
|
||||
<head>
|
||||
<partial name="LayoutHead"/>
|
||||
<meta name="robots" content="noindex,nofollow">
|
||||
<link href="~/checkout-v2/checkout.css" asp-append-version="true" rel="stylesheet" />
|
||||
@if (!string.IsNullOrEmpty(Model.PaymentSoundUrl))
|
||||
{
|
||||
<link rel="preload" href="@Model.PaymentSoundUrl" as="audio" />
|
||||
}
|
||||
@if (!string.IsNullOrEmpty(Model.NfcReadSoundUrl))
|
||||
{
|
||||
<link rel="preload" href="@Model.NfcReadSoundUrl" as="audio" />
|
||||
}
|
||||
@if (!string.IsNullOrEmpty(Model.ErrorSoundUrl))
|
||||
{
|
||||
<link rel="preload" href="@Model.ErrorSoundUrl" as="audio" />
|
||||
}
|
||||
</head>
|
||||
<body class="min-vh-100">
|
||||
<div id="Checkout-v2" class="public-page-wrap" v-cloak>
|
||||
@if (Model.ShowStoreHeader)
|
||||
{
|
||||
<partial name="_StoreHeader" model="(Model.StoreName, Model.StoreBranding)" />
|
||||
}
|
||||
<main class="tile">
|
||||
<nav v-if="isModal">
|
||||
<button type="button" v-if="isModal" id="close" v-on:click="close">
|
||||
<vc:icon symbol="close"/>
|
||||
</button>
|
||||
</nav>
|
||||
<section id="payment" v-if="isActive">
|
||||
<div class="d-flex justify-content-center mt-1 text-center">
|
||||
@if (Model.IsUnsetTopUp)
|
||||
{
|
||||
<h2 id="AmountDue" v-t="'any_amount'"></h2>
|
||||
}
|
||||
else
|
||||
{
|
||||
<h2 id="AmountDue" v-text="`${srvModel.btcDue} ${srvModel.cryptoCode}`" :data-clipboard="srvModel.btcDue" data-clipboard-hover :data-amount-due="srvModel.btcDue">@Model.BtcDue @Model.CryptoCode</h2>
|
||||
}
|
||||
</div>
|
||||
<div id="PaymentInfo" class="info mt-3 mb-2" v-collapsible="showInfo">
|
||||
<div>
|
||||
<div class="timer" v-if="showTimer">
|
||||
<span class="spinner-border spinner-border-sm" role="status"><span class="visually-hidden"></span></span>
|
||||
<span v-t="'expiry_info'"></span> <span class="expiryTime">{{timeText}}</span>
|
||||
</div>
|
||||
<div class="payment-due" v-if="showPaymentDueInfo">
|
||||
<vc:icon symbol="info" />
|
||||
<span v-t="'partial_payment_info'"></span>
|
||||
</div>
|
||||
<div v-if="showPaymentDueInfo" v-html="replaceNewlines($t('still_due', { amount: `${srvModel.btcDue} ${srvModel.cryptoCode}` }))"></div>
|
||||
</div>
|
||||
</div>
|
||||
<button id="DetailsToggle" class="d-flex align-items-center gap-1 btn btn-link payment-details-button mb-2" type="button" :aria-expanded="displayPaymentDetails ? 'true' : 'false'" v-on:click="displayPaymentDetails = !displayPaymentDetails">
|
||||
<span class="fw-semibold" v-t="'view_details'"></span>
|
||||
<vc:icon symbol="caret-down" />
|
||||
</button>
|
||||
<div id="PaymentDetails" class="payment-details" v-collapsible="displayPaymentDetails">
|
||||
<payment-details
|
||||
:srv-model="srvModel"
|
||||
:is-active="isActive"
|
||||
:order-amount="orderAmount"
|
||||
:btc-paid="btcPaid"
|
||||
:btc-due="btcDue"
|
||||
:show-recommended-fee="showRecommendedFee"
|
||||
class="pb-4" />
|
||||
</div>
|
||||
@if (displayedPaymentMethods.Count > 1 || hasPaymentPlugins)
|
||||
{
|
||||
<div class="mt-3 mb-2">
|
||||
<h6 class="text-center mb-3" v-t="'pay_with'"></h6>
|
||||
<div class="btcpay-pills d-flex flex-wrap align-items-center justify-content-center gap-2 pb-2">
|
||||
@foreach (var crypto in displayedPaymentMethods)
|
||||
{
|
||||
<a asp-action="Checkout" asp-route-invoiceId="@Model.InvoiceId" asp-route-paymentMethodId="@crypto.PaymentMethodId"
|
||||
class="btcpay-pill m-0 payment-method"
|
||||
:class="{ active: pmId === @ToJsValue(crypto.PaymentMethodId) }"
|
||||
v-on:click.prevent="changePaymentMethod(@ToJsValue(crypto.PaymentMethodId))">
|
||||
@crypto.PaymentMethodName
|
||||
</a>
|
||||
}
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new { location = "checkout-payment-method", model = Model })
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<component v-if="paymentMethodComponent" :is="paymentMethodComponent"
|
||||
:model="srvModel"
|
||||
:nfc-scanning="nfc.scanning"
|
||||
:nfc-supported="nfc.supported"
|
||||
:nfc-error-message="nfc.errorMessage"
|
||||
v-on:start-nfc-scan="startNFCScan"
|
||||
v-on:handle-nfc-data="handleNFCData"
|
||||
v-on:handle-nfc-error="handleNFCError"
|
||||
v-on:handle-nfc-result="handleNFCResult" />
|
||||
</section>
|
||||
<section id="result" v-else>
|
||||
<div v-if="isProcessing" id="processing" key="processing">
|
||||
<div class="top">
|
||||
<span class="icn">
|
||||
<div id="confetti" v-if="srvModel.celebratePayment" v-on:click="celebratePayment(5000)"></div>
|
||||
<vc:icon symbol="payment-sent" />
|
||||
</span>
|
||||
<h4 v-t="'payment_received'" class="mb-4"></h4>
|
||||
<p class="text-center" v-t="'payment_received_body'"></p>
|
||||
<p class="text-center" v-if="srvModel.receivedConfirmations !== null && srvModel.requiredConfirmations" v-t="{ path: 'payment_received_confirmations', args: { cryptoCode: realCryptoCode, receivedConfirmations: srvModel.receivedConfirmations, requiredConfirmations: srvModel.requiredConfirmations } }"></p>
|
||||
<div id="PaymentDetails" class="payment-details">
|
||||
<dl class="mb-0">
|
||||
<div>
|
||||
<dt v-t="'invoice_id'"></dt>
|
||||
<dd v-text="srvModel.invoiceId" :data-clipboard="srvModel.invoiceId" :data-clipboard-confirm="$t('copy_confirm')"></dd>
|
||||
</div>
|
||||
<div v-if="srvModel.orderId">
|
||||
<dt v-t="'order_id'"></dt>
|
||||
<dd v-text="srvModel.orderId" :data-clipboard="srvModel.orderId" :data-clipboard-confirm="$t('copy_confirm')"></dd>
|
||||
</div>
|
||||
</dl>
|
||||
<payment-details
|
||||
:srv-model="srvModel"
|
||||
:is-active="isActive"
|
||||
:order-amount="orderAmount"
|
||||
:btc-paid="btcPaid"
|
||||
:btc-due="btcDue"
|
||||
:show-recommended-fee="showRecommendedFee"
|
||||
v-collapsible="displayPaymentDetails" />
|
||||
</div>
|
||||
<button class="d-flex align-items-center gap-1 btn btn-link payment-details-button" type="button" :aria-expanded="displayPaymentDetails ? 'true' : 'false'" v-on:click="displayPaymentDetails = !displayPaymentDetails">
|
||||
<span class="fw-semibold" v-t="'view_details'"></span>
|
||||
<vc:icon symbol="caret-down" />
|
||||
</button>
|
||||
</div>
|
||||
<div class="buttons mt-3" v-if="storeLink || isModal">
|
||||
<a v-if="storeLink" class="btn btn-secondary rounded-pill w-100" :href="storeLink" :target="isModal ? '_top' : null" v-html="$t('return_to_store', { storeName: srvModel.storeName })" id="StoreLink"></a>
|
||||
<button v-else-if="isModal" class="btn btn-secondary rounded-pill w-100" v-on:click="close" v-t="'Close'"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="isSettled" id="settled" key="settled">
|
||||
<div class="top">
|
||||
<span class="icn">
|
||||
<div id="confetti" v-if="srvModel.celebratePayment" v-on:click="celebratePayment(5000)"></div>
|
||||
<vc:icon symbol="payment-complete" />
|
||||
</span>
|
||||
<h4 v-t="'invoice_paid'"></h4>
|
||||
<div id="PaymentDetails" class="payment-details">
|
||||
<dl class="mb-0">
|
||||
<div>
|
||||
<dt v-t="'invoice_id'"></dt>
|
||||
<dd v-text="srvModel.invoiceId" :data-clipboard="srvModel.invoiceId" data-clipboard-hover="start"></dd>
|
||||
</div>
|
||||
<div v-if="srvModel.orderId">
|
||||
<dt v-t="'order_id'"></dt>
|
||||
<dd v-text="srvModel.orderId" :data-clipboard="srvModel.orderId" data-clipboard-hover="start"></dd>
|
||||
</div>
|
||||
</dl>
|
||||
<payment-details
|
||||
:srv-model="srvModel"
|
||||
:is-active="isActive"
|
||||
:order-amount="orderAmount"
|
||||
:btc-paid="btcPaid"
|
||||
:btc-due="btcDue"
|
||||
:show-recommended-fee="showRecommendedFee"
|
||||
class="mb-5" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="buttons" v-if="srvModel.receiptLink || storeLink || isModal">
|
||||
<a v-if="srvModel.receiptLink" class="btn btn-primary rounded-pill w-100" :href="srvModel.receiptLink" :target="isModal ? '_top' : null" v-t="'view_receipt'" id="ReceiptLink"></a>
|
||||
<a v-if="storeLink" class="btn btn-secondary rounded-pill w-100" :href="storeLink" :target="isModal ? '_top' : null" v-html="$t('return_to_store', { storeName: srvModel.storeName })" id="StoreLink"></a>
|
||||
<button v-else-if="isModal" class="btn btn-secondary rounded-pill w-100" v-on:click="close" v-t="'Close'"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="isInvalid" id="unpaid" key="unpaid">
|
||||
<div class="top">
|
||||
<span class="icn">
|
||||
<vc:icon symbol="invoice-expired" />
|
||||
</span>
|
||||
<h4 v-t="'invoice_expired'"></h4>
|
||||
<div id="PaymentDetails" class="payment-details">
|
||||
<dl class="mb-0">
|
||||
<div>
|
||||
<dt v-t="'invoice_id'"></dt>
|
||||
<dd v-text="srvModel.invoiceId" :data-clipboard="srvModel.invoiceId" data-clipboard-hover="start"></dd>
|
||||
</div>
|
||||
<div v-if="srvModel.orderId">
|
||||
<dt v-t="'order_id'"></dt>
|
||||
<dd v-text="srvModel.orderId" :data-clipboard="srvModel.orderId" data-clipboard-hover="start"></dd>
|
||||
</div>
|
||||
</dl>
|
||||
<payment-details
|
||||
:srv-model="srvModel"
|
||||
:is-active="isActive"
|
||||
:order-amount="orderAmount"
|
||||
:btc-paid="btcPaid"
|
||||
:btc-due="btcDue"
|
||||
:show-recommended-fee="showRecommendedFee"
|
||||
v-collapsible="displayPaymentDetails" />
|
||||
</div>
|
||||
<button class="d-flex align-items-center gap-1 btn btn-link payment-details-button" type="button" :aria-expanded="displayPaymentDetails ? 'true' : 'false'" v-on:click="displayPaymentDetails = !displayPaymentDetails">
|
||||
<span class="fw-semibold" v-t="'view_details'"></span>
|
||||
<vc:icon symbol="caret-down" />
|
||||
</button>
|
||||
<p class="text-center mt-3" v-html="replaceNewlines($t(isPaidPartial ? 'invoice_paidpartial_body' : 'invoice_expired_body', { storeName: srvModel.storeName, minutes: srvModel.maxTimeMinutes }))"></p>
|
||||
</div>
|
||||
<div class="buttons" v-if="(isPaidPartial && srvModel.storeSupportUrl) || storeLink || isModal">
|
||||
<a v-if="isPaidPartial && srvModel.storeSupportUrl" class="btn btn-primary rounded-pill w-100" :href="srvModel.storeSupportUrl" v-t="'contact_us'" id="ContactLink"></a>
|
||||
<a v-if="storeLink" class="btn btn-primary rounded-pill w-100" :href="storeLink" :target="isModal ? '_top' : null" v-html="$t('return_to_store', { storeName: srvModel.storeName })" id="StoreLink"></a>
|
||||
<button v-else-if="isModal" class="btn btn-primary rounded-pill w-100" v-on:click="close" v-t="'Close'"></button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
@if (Env.CheatMode)
|
||||
{
|
||||
<checkout-cheating invoice-id="@Model.InvoiceId" :btc-due="btcDue" :is-settled="isSettled" :is-processing="isProcessing" :payment-method-id="pmId" :crypto-code="srvModel.cryptoCode"></checkout-cheating>
|
||||
}
|
||||
<footer class="store-footer">
|
||||
<a class="store-powered-by" href="https://btcpayserver.org" target="_blank" rel="noreferrer noopener">
|
||||
{{$t("powered_by")}} <partial name="_StoreFooterLogo" />
|
||||
</a>
|
||||
<select asp-for="DefaultLang" asp-items="@LangService.GetLanguageSelectListItems()" class="form-select" v-on:change="changeLanguage"></select>
|
||||
</footer>
|
||||
</div>
|
||||
<noscript>
|
||||
<div class="p-5 text-center">
|
||||
<h2>Javascript is currently disabled in your browser.</h2>
|
||||
<h5>Please enable Javascript and refresh this page for the best experience.</h5>
|
||||
<p>
|
||||
Alternatively, click below to continue to our
|
||||
<a asp-action="CheckoutNoScript" asp-route-invoiceId="@Model.InvoiceId">HTML-only invoice</a>.
|
||||
</p>
|
||||
</div>
|
||||
</noscript>
|
||||
<script type="text/x-template" id="payment-details">
|
||||
<dl>
|
||||
<div v-if="orderAmount > 0" id="PaymentDetails-TotalPrice" key="TotalPrice">
|
||||
<dt v-t="'total_price'"></dt>
|
||||
<dd :data-clipboard="srvModel.orderAmount" data-clipboard-hover="start">{{srvModel.orderAmount}} {{ srvModel.cryptoCode }}</dd>
|
||||
</div>
|
||||
<div v-if="orderAmount > 0 && srvModel.orderAmountFiat" id="PaymentDetails-TotalFiat" key="TotalFiat">
|
||||
<dt v-t="'total_fiat'"></dt>
|
||||
<dd :data-clipboard="srvModel.orderAmountFiat" data-clipboard-hover="start">{{srvModel.orderAmountFiat}}</dd>
|
||||
</div>
|
||||
<div v-if="srvModel.rate && srvModel.cryptoCode" id="PaymentDetails-ExchangeRate" key="ExchangeRate">
|
||||
<dt v-t="'exchange_rate'"></dt>
|
||||
<dd :data-clipboard="srvModel.rate" data-clipboard-hover="start">
|
||||
<template v-if="srvModel.cryptoCode === 'sats'">1 sat = {{ srvModel.rate }}</template>
|
||||
<template v-else>1 {{ srvModel.cryptoCode }} = {{ srvModel.rate }}</template>
|
||||
</dd>
|
||||
</div>
|
||||
<div v-if="srvModel.networkFee" id="PaymentDetails-NetworkCost" key="NetworkCost">
|
||||
<dt v-t="'network_cost'"></dt>
|
||||
<dd :data-clipboard="srvModel.networkFee" data-clipboard-hover="start">
|
||||
<div v-if="srvModel.txCountForFee > 0" v-t="{ path: 'tx_count', args: { count: srvModel.txCount } }"></div>
|
||||
<div v-text="`${srvModel.networkFee} ${srvModel.cryptoCode}`"></div>
|
||||
</dd>
|
||||
</div>
|
||||
<div v-if="btcPaid > 0" id="PaymentDetails-AmountPaid" key="AmountPaid">
|
||||
<dt v-t="'amount_paid'"></dt>
|
||||
<dd :data-clipboard="srvModel.btcPaid" data-clipboard-hover="start" v-text="`${srvModel.btcPaid} ${srvModel.cryptoCode}`"></dd>
|
||||
</div>
|
||||
<div v-if="btcDue > 0" id="PaymentDetails-AmountDue" key="AmountDue">
|
||||
<dt v-t="'amount_due'"></dt>
|
||||
<dd :data-clipboard="srvModel.btcDue" data-clipboard-hover="start" v-text="`${srvModel.btcDue} ${srvModel.cryptoCode}`"></dd>
|
||||
</div>
|
||||
<div v-if="showRecommendedFee" id="PaymentDetails-RecommendedFee" key="RecommendedFee">
|
||||
<dt v-t="'recommended_fee'"></dt>
|
||||
<dd :data-clipboard="srvModel.feeRate" data-clipboard-hover="start" v-t="{ path: 'fee_rate', args: { feeRate: srvModel.feeRate } }"></dd>
|
||||
</div>
|
||||
</dl>
|
||||
</script>
|
||||
<script>
|
||||
const i18nUrl = @Safe.Json($"{Model.RootPath}misc/translations/checkout-v2/{{{{lng}}}}?v={Env.Version}");
|
||||
const statusUrl = @Safe.Json(Url.Action("GetStatus", new { invoiceId = Model.InvoiceId }));
|
||||
const statusWsUrl = @Safe.Json(Url.Action("GetStatusWebSocket", new { invoiceId = Model.InvoiceId }));
|
||||
const availableLanguages = @Safe.Json(LangService.GetLanguages().Select(language => language.Code));
|
||||
const initialSrvModel = @Safe.Json(Model);
|
||||
const qrOptions = { margin: 0, type: 'svg', color: { dark: '#000', light: '#fff' } };
|
||||
window.exports = {};
|
||||
</script>
|
||||
@if (Model.CelebratePayment)
|
||||
{
|
||||
<script src="~/vendor/dom-confetti/dom-confetti.min.js" asp-append-version="true"></script>
|
||||
}
|
||||
<script src="~/vendor/vuejs/vue.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/vue-qrcode/vue-qrcode.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/i18next/i18next.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/i18next/i18nextHttpBackend.min.js" asp-append-version="true"></script>
|
||||
<script src="~/vendor/i18next/vue-i18next.js" asp-append-version="true"></script>
|
||||
<script src="~/js/copy-to-clipboard.js" asp-append-version="true"></script>
|
||||
<script src="~/js/vue-utils.js" asp-append-version="true"></script>
|
||||
<script src="~/main/utils.js" asp-append-version="true"></script>
|
||||
<script src="~/checkout-v2/checkout.js" asp-append-version="true"></script>
|
||||
@if (Env.CheatMode)
|
||||
{
|
||||
<partial name="Checkout-Cheating" model="@Model" />
|
||||
}
|
||||
@foreach (var extensionPartial in Model.ExtensionPartials)
|
||||
{
|
||||
<partial name="@extensionPartial-v2" model="@Model" />
|
||||
}
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new { location = "checkout-payment", model = Model })
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new { location = "checkout-v2-end", model = Model })
|
||||
</body>
|
||||
</html>
|
||||
@@ -91,11 +91,6 @@
|
||||
<input asp-for="BuyerEmail" class="form-control"/>
|
||||
<span asp-validation-for="BuyerEmail" class="text-danger"></span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label asp-for="RequiresRefundEmail" class="form-label"></label>
|
||||
<select asp-for="RequiresRefundEmail" asp-items="@Html.GetEnumSelectList<RequiresRefundEmail>()" class="form-select w-auto"></select>
|
||||
<span asp-validation-for="RequiresRefundEmail" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<h4 class="mt-5 mb-2">Additional Options</h4>
|
||||
<div class="form-group">
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
: ''
|
||||
});
|
||||
delegate('click', '#Presets_InStore', e => {
|
||||
$("#UseClassicCheckout").prop('checked', false);
|
||||
$("#CheckoutV2Settings").addClass('show');
|
||||
$("#ClassicCheckoutSettings").removeClass('show');
|
||||
$("#CheckNFC").removeClass('d-none');
|
||||
@@ -31,7 +30,6 @@
|
||||
$("#ShowStoreHeader").prop('checked', false);
|
||||
});
|
||||
delegate('click', '#Presets_Online', e => {
|
||||
$("#UseClassicCheckout").prop('checked', false);
|
||||
$("#CheckoutV2Settings").addClass('show');
|
||||
$("#ClassicCheckoutSettings").removeClass('show');
|
||||
$("#CheckNFC").addClass('d-none');
|
||||
@@ -118,15 +116,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</h3>
|
||||
<div class="d-flex align-items-center mb-3">
|
||||
<input asp-for="UseClassicCheckout" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target=".checkout-settings" aria-expanded="@(Model.UseClassicCheckout)" aria-controls="CheckoutV2Settings" />
|
||||
<label asp-for="UseClassicCheckout" class="form-check-label"></label>
|
||||
<span asp-validation-for="UseClassicCheckout" class="text-danger"></span>
|
||||
</div>
|
||||
<div id="CheckNFC" class="form-group d-none">
|
||||
<button type="button" class="btn btn-outline-secondary">Check if NFC is supported and enabled on this device</button>
|
||||
</div>
|
||||
<div class="checkout-settings collapse @(Model.UseClassicCheckout ? "" : "show")" id="CheckoutV2Settings">
|
||||
<div class="checkout-settings collapse show" id="CheckoutV2Settings">
|
||||
<div class="form-group">
|
||||
<label asp-for="DisplayExpirationTimer" class="form-label"></label>
|
||||
<div class="input-group">
|
||||
@@ -163,7 +156,7 @@
|
||||
<input asp-for="SoundFile" type="file" class="form-control flex-grow">
|
||||
@{
|
||||
var soundUrl = string.IsNullOrEmpty(Model.SoundFileId)
|
||||
? string.Concat(Context.Request.GetAbsoluteRootUri().ToString(), "checkout-v2/payment.mp3")
|
||||
? string.Concat(Context.Request.GetAbsoluteRootUri().ToString(), "checkout/payment.mp3")
|
||||
: await FileService.GetFileUrl(Context.Request.GetAbsoluteRootUri(), Model.SoundFileId);
|
||||
}
|
||||
<audio controls src="@soundUrl" style="height:2.1rem;max-width:10.5rem;"></audio>
|
||||
@@ -198,35 +191,6 @@
|
||||
<input asp-for="LightningAmountInSatoshi" type="checkbox" class="btcpay-toggle me-3" />
|
||||
<label asp-for="LightningAmountInSatoshi" class="form-check-label"></label>
|
||||
</div>
|
||||
<div class="checkout-settings collapse @(Model.UseClassicCheckout ? "show" : "")" id="ClassicCheckoutSettings">
|
||||
<div class="d-flex mb-3">
|
||||
<input asp-for="RequiresRefundEmail" type="checkbox" class="btcpay-toggle me-3" />
|
||||
<label asp-for="RequiresRefundEmail" class="form-check-label"></label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label asp-for="CustomLogo" class="form-label"></label>
|
||||
<a href="https://docs.btcpayserver.org/Development/Theme/#checkout-page-themes" target="_blank" rel="noreferrer noopener">
|
||||
<vc:icon symbol="info" />
|
||||
</a>
|
||||
<input asp-for="CustomLogo" class="form-control" />
|
||||
<span asp-validation-for="CustomLogo" class="text-danger"></span>
|
||||
</div>
|
||||
<div class="form-group mb-0">
|
||||
<label asp-for="CustomCSS" class="form-label"></label>
|
||||
<a href="https://docs.btcpayserver.org/Development/Theme/#checkout-page-themes" target="_blank" rel="noreferrer noopener">
|
||||
<vc:icon symbol="info" />
|
||||
</a>
|
||||
<input asp-for="CustomCSS" class="form-control" />
|
||||
<span asp-validation-for="CustomCSS" class="text-danger"></span>
|
||||
<div class="form-text">
|
||||
Bundled Themes:
|
||||
<a href="#" class="setTheme" data-theme="default">Default</a> |
|
||||
<a href="#" class="setTheme" data-theme="dark">Dark</a> |
|
||||
<a href="#" class="setTheme" data-theme="legacy">Legacy</a>
|
||||
</div>
|
||||
@await Component.InvokeAsync("UiExtensionPoint", new {location = "invoice-checkout-theme-options", model = Model})
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group d-flex align-items-center">
|
||||
<input asp-for="AutoDetectLanguage" type="checkbox" class="btcpay-toggle me-3" />
|
||||
<div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#Checkout-v2 {
|
||||
#Checkout {
|
||||
--wrap-max-width: 400px;
|
||||
}
|
||||
body {
|
||||
@@ -178,7 +178,7 @@ section dl > div dd {
|
||||
|
||||
@media (max-width: 400px) {
|
||||
/* Pull it up if there's no store header */
|
||||
#Checkout-v2 > main.tile:first-child {
|
||||
#Checkout > main.tile:first-child {
|
||||
margin-top: calc(var(--wrap-padding-vertical) * -1);
|
||||
}
|
||||
}
|
||||
@@ -77,7 +77,7 @@ const PaymentDetails = {
|
||||
function initApp() {
|
||||
return new Vue({
|
||||
i18n,
|
||||
el: '#Checkout-v2',
|
||||
el: '#Checkout',
|
||||
components: {
|
||||
'payment-details': PaymentDetails,
|
||||
},
|
||||
@@ -1,21 +0,0 @@
|
||||
<svg width="111" height="48" viewBox="0 0 111 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0)">
|
||||
<path d="M2.81211 48.0007C2.06629 48.0007 1.35102 47.7041 0.823647 47.1761C0.296274 46.6481 0 45.9321 0 45.1854V2.82062C0 2.07397 0.296274 1.3579 0.823647 0.829936C1.35102 0.301975 2.06629 0.00537109 2.81211 0.00537109C3.55792 0.00537109 4.27319 0.301975 4.80057 0.829936C5.32794 1.3579 5.62421 2.07397 5.62421 2.82062V45.1854C5.62421 45.9321 5.32794 46.6481 4.80057 47.1761C4.27319 47.7041 3.55792 48.0007 2.81211 48.0007V48.0007Z" fill="#CEDC21"/>
|
||||
<path d="M2.81669 48.0001C2.17885 47.9987 1.56046 47.7802 1.063 47.3805C0.565543 46.9809 0.21858 46.4238 0.0790592 45.8007C-0.0604611 45.1776 0.0157515 44.5255 0.295186 43.9515C0.574621 43.3775 1.04068 42.9157 1.61686 42.6418L18.5739 34.5855L1.14817 21.7385C0.838355 21.5244 0.574632 21.2502 0.372641 20.9322C0.170651 20.6142 0.0345062 20.2587 -0.0277224 19.887C-0.089951 19.5153 -0.0769956 19.1349 0.0103757 18.7683C0.0977471 18.4017 0.257754 18.0564 0.480912 17.7529C0.704071 17.4494 0.985837 17.1938 1.3095 17.0013C1.63317 16.8088 1.99214 16.6833 2.36515 16.6323C2.73815 16.5813 3.11758 16.6058 3.48095 16.7044C3.84432 16.8029 4.18423 16.9735 4.48052 17.206L25.6838 32.8447C26.0749 33.134 26.3845 33.5198 26.5821 33.9646C26.7798 34.4094 26.8589 34.8979 26.8117 35.3824C26.7645 35.867 26.5926 36.331 26.3127 36.7291C26.0329 37.1273 25.6547 37.446 25.2151 37.6541L4.02121 47.728C3.64533 47.9084 3.23355 48.0015 2.81669 48.0001V48.0001Z" fill="#51B13E"/>
|
||||
<path d="M2.8174 31.3474C2.22516 31.3474 1.64803 31.1603 1.16829 30.8126C0.688553 30.4649 0.330701 29.9745 0.145758 29.4113C-0.0391852 28.848 -0.0417771 28.2407 0.13835 27.6759C0.318478 27.1111 0.672129 26.6176 1.14888 26.2659L18.5652 13.4049L1.61757 5.36263C1.28336 5.20458 0.983517 4.98218 0.735164 4.70812C0.486811 4.43406 0.294808 4.11372 0.170119 3.76538C0.0454307 3.41704 -0.00950367 3.04752 0.00845496 2.67792C0.0264136 2.30833 0.116912 1.94589 0.274784 1.61131C0.432656 1.27673 0.654811 0.97655 0.928562 0.727919C1.20231 0.479288 1.5223 0.287072 1.87025 0.162243C2.21821 0.0374154 2.58731 -0.0175804 2.95649 0.000398262C3.32568 0.018377 3.68771 0.108979 4.02192 0.267027L25.2252 10.3409C25.6648 10.5491 26.043 10.8678 26.3228 11.2659C26.6027 11.664 26.7746 12.128 26.8218 12.6126C26.869 13.0971 26.7899 13.5856 26.5922 14.0304C26.3945 14.4752 26.085 14.861 25.6939 15.1503L4.48123 30.7984C3.99915 31.1541 3.41625 31.3464 2.8174 31.3474Z" fill="#CEDC21"/>
|
||||
<path d="M5.62427 18.0459V29.9544L13.6903 24.0048L5.62427 18.0459Z" fill="#1E7A44"/>
|
||||
<path d="M5.62421 13.0532H0V26.7776H5.62421V13.0532Z" fill="white"/>
|
||||
<path d="M5.62421 2.82062C5.62421 2.07397 5.32794 1.3579 4.80057 0.829936C4.27319 0.301975 3.55792 0.00537109 2.81211 0.00537109C2.06629 0.00537109 1.35102 0.301975 0.823647 0.829936C0.296274 1.3579 0 2.07397 0 2.82062V38.274H5.62421V2.82062Z" fill="#CEDC21"/>
|
||||
<path d="M42.8238 23.6621C44.6235 24.1735 45.6359 25.8064 45.6359 27.8521C45.6359 31.0474 43.6908 32.5442 41.0334 32.5442H34.9592V15.4697H40.3163C42.9222 15.4697 44.9422 16.7131 44.9422 19.9554C44.9422 21.5882 44.2673 23.0991 42.8238 23.6621ZM40.3397 23.2445C42.2613 23.2445 43.8221 22.5642 43.8221 19.9319C43.8221 17.2996 42.2145 16.5677 40.2647 16.5677H36.1028V23.2586L40.3397 23.2445ZM40.949 31.4134C42.8941 31.4134 44.4548 30.3906 44.4548 27.8521C44.4548 25.1213 42.6785 24.2955 40.4616 24.2955H36.1028V31.4134H40.949Z" fill="black"/>
|
||||
<path d="M57.0202 15.4697V16.5161H52.3334V32.5348H51.1898V16.5161H46.5029V15.4697H57.0202Z" fill="black"/>
|
||||
<path d="M65.0299 15.2256C67.931 15.2256 70.5604 16.6895 71.3899 20.1757H70.2932C69.5152 17.3229 67.2233 16.2719 65.0065 16.2719C60.9898 16.2719 58.8714 19.5564 58.8714 23.9998C58.8714 28.6919 60.9898 31.6807 65.0299 31.6807C67.4202 31.6807 69.5621 30.6062 70.3916 27.4578H71.4837C71.2279 28.9736 70.4342 30.3459 69.2485 31.3226C68.0628 32.2993 66.5648 32.8147 65.0299 32.774C60.479 32.774 57.7512 29.4098 57.7512 23.9951C57.7512 18.8103 60.6243 15.2256 65.0299 15.2256Z" fill="black"/>
|
||||
<path d="M80.0561 15.4697C83.0041 15.4697 85.146 17.3935 85.146 21.1002C85.146 24.6099 83.0041 26.7307 80.0561 26.7307H75.5755V32.5114H74.4553V15.4697H80.0561ZM80.0561 25.6328C82.2261 25.6328 84.0024 24.2252 84.0024 21.1002C84.0024 17.9753 82.2964 16.5442 80.0561 16.5442H75.5755V25.6328H80.0561Z" fill="black"/>
|
||||
<path d="M85.3428 32.5349V32.3894L92.134 15.4229H92.6496L99.3705 32.3894V32.5349H98.166L96.2444 27.6082H88.483L86.5614 32.5349H85.3428ZM92.373 17.4451L88.872 26.5431H95.8601L92.373 17.4451Z" fill="black"/>
|
||||
<path d="M109.475 15.4697H110.694V15.6386L105.384 25.4404V32.5348H104.217V25.4404L98.8831 15.6152V15.4697H100.125L102.436 19.8099L104.779 24.319L107.123 19.8099L109.475 15.4697Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0">
|
||||
<path d="M0 0H110.694V48H0V0Z" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,21 +0,0 @@
|
||||
<svg width="111" height="48" viewBox="0 0 111 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0)">
|
||||
<path d="M2.81211 48.0007C2.06629 48.0007 1.35102 47.7041 0.823647 47.1761C0.296274 46.6481 0 45.9321 0 45.1854V2.82062C0 2.07397 0.296274 1.3579 0.823647 0.829936C1.35102 0.301975 2.06629 0.00537109 2.81211 0.00537109C3.55792 0.00537109 4.27319 0.301975 4.80057 0.829936C5.32794 1.3579 5.62421 2.07397 5.62421 2.82062V45.1854C5.62421 45.9321 5.32794 46.6481 4.80057 47.1761C4.27319 47.7041 3.55792 48.0007 2.81211 48.0007V48.0007Z" fill="#CEDC21"/>
|
||||
<path d="M2.81669 48.0001C2.17885 47.9987 1.56046 47.7802 1.063 47.3805C0.565543 46.9809 0.21858 46.4238 0.0790592 45.8007C-0.0604611 45.1776 0.0157515 44.5255 0.295186 43.9515C0.574621 43.3775 1.04068 42.9157 1.61686 42.6418L18.5739 34.5855L1.14817 21.7385C0.838355 21.5244 0.574632 21.2502 0.372641 20.9322C0.170651 20.6142 0.0345062 20.2587 -0.0277224 19.887C-0.089951 19.5153 -0.0769956 19.1349 0.0103757 18.7683C0.0977471 18.4017 0.257754 18.0564 0.480912 17.7529C0.704071 17.4494 0.985837 17.1938 1.3095 17.0013C1.63317 16.8088 1.99214 16.6833 2.36515 16.6323C2.73815 16.5813 3.11758 16.6058 3.48095 16.7044C3.84432 16.8029 4.18423 16.9735 4.48052 17.206L25.6838 32.8447C26.0749 33.134 26.3845 33.5198 26.5821 33.9646C26.7798 34.4094 26.8589 34.8979 26.8117 35.3824C26.7645 35.867 26.5926 36.331 26.3127 36.7291C26.0329 37.1273 25.6547 37.446 25.2151 37.6541L4.02121 47.728C3.64533 47.9084 3.23355 48.0015 2.81669 48.0001V48.0001Z" fill="#51B13E"/>
|
||||
<path d="M2.8174 31.3474C2.22516 31.3474 1.64803 31.1603 1.16829 30.8126C0.688553 30.4649 0.330701 29.9745 0.145758 29.4113C-0.0391852 28.848 -0.0417771 28.2407 0.13835 27.6759C0.318478 27.1111 0.672129 26.6176 1.14888 26.2659L18.5652 13.4049L1.61757 5.36263C1.28336 5.20458 0.983517 4.98218 0.735164 4.70812C0.486811 4.43406 0.294808 4.11372 0.170119 3.76538C0.0454307 3.41704 -0.00950367 3.04752 0.00845496 2.67792C0.0264136 2.30833 0.116912 1.94589 0.274784 1.61131C0.432656 1.27673 0.654811 0.97655 0.928562 0.727919C1.20231 0.479288 1.5223 0.287072 1.87025 0.162243C2.21821 0.0374154 2.58731 -0.0175804 2.95649 0.000398262C3.32568 0.018377 3.68771 0.108979 4.02192 0.267027L25.2252 10.3409C25.6648 10.5491 26.043 10.8678 26.3228 11.2659C26.6027 11.664 26.7746 12.128 26.8218 12.6126C26.869 13.0971 26.7899 13.5856 26.5922 14.0304C26.3945 14.4752 26.085 14.861 25.6939 15.1503L4.48123 30.7984C3.99915 31.1541 3.41625 31.3464 2.8174 31.3474Z" fill="#CEDC21"/>
|
||||
<path d="M5.62427 18.0459V29.9544L13.6903 24.0048L5.62427 18.0459Z" fill="#1E7A44"/>
|
||||
<path d="M5.62421 13.0532H0V26.7776H5.62421V13.0532Z" fill="white"/>
|
||||
<path d="M5.62421 2.82062C5.62421 2.07397 5.32794 1.3579 4.80057 0.829936C4.27319 0.301975 3.55792 0.00537109 2.81211 0.00537109C2.06629 0.00537109 1.35102 0.301975 0.823647 0.829936C0.296274 1.3579 0 2.07397 0 2.82062V38.274H5.62421V2.82062Z" fill="#CEDC21"/>
|
||||
<path d="M42.8238 23.6621C44.6235 24.1735 45.6359 25.8064 45.6359 27.8521C45.6359 31.0474 43.6908 32.5442 41.0334 32.5442H34.9592V15.4697H40.3163C42.9222 15.4697 44.9422 16.7131 44.9422 19.9554C44.9422 21.5882 44.2673 23.0991 42.8238 23.6621ZM40.3397 23.2445C42.2613 23.2445 43.8221 22.5642 43.8221 19.9319C43.8221 17.2996 42.2145 16.5677 40.2647 16.5677H36.1028V23.2586L40.3397 23.2445ZM40.949 31.4134C42.8941 31.4134 44.4548 30.3906 44.4548 27.8521C44.4548 25.1213 42.6785 24.2955 40.4616 24.2955H36.1028V31.4134H40.949Z" fill="white"/>
|
||||
<path d="M57.0202 15.4697V16.5161H52.3334V32.5348H51.1898V16.5161H46.5029V15.4697H57.0202Z" fill="white"/>
|
||||
<path d="M65.0299 15.2256C67.931 15.2256 70.5604 16.6895 71.3899 20.1757H70.2932C69.5152 17.3229 67.2233 16.2719 65.0065 16.2719C60.9898 16.2719 58.8714 19.5564 58.8714 23.9998C58.8714 28.6919 60.9898 31.6807 65.0299 31.6807C67.4202 31.6807 69.5621 30.6062 70.3916 27.4578H71.4837C71.2279 28.9736 70.4342 30.3459 69.2485 31.3226C68.0628 32.2993 66.5648 32.8147 65.0299 32.774C60.479 32.774 57.7512 29.4098 57.7512 23.9951C57.7512 18.8103 60.6243 15.2256 65.0299 15.2256Z" fill="white"/>
|
||||
<path d="M80.0561 15.4697C83.0041 15.4697 85.146 17.3935 85.146 21.1002C85.146 24.6099 83.0041 26.7307 80.0561 26.7307H75.5755V32.5114H74.4553V15.4697H80.0561ZM80.0561 25.6328C82.2261 25.6328 84.0024 24.2252 84.0024 21.1002C84.0024 17.9753 82.2964 16.5442 80.0561 16.5442H75.5755V25.6328H80.0561Z" fill="white"/>
|
||||
<path d="M85.3428 32.5349V32.3894L92.134 15.4229H92.6496L99.3705 32.3894V32.5349H98.166L96.2444 27.6082H88.483L86.5614 32.5349H85.3428ZM92.373 17.4451L88.872 26.5431H95.8601L92.373 17.4451Z" fill="white"/>
|
||||
<path d="M109.475 15.4697H110.694V15.6386L105.384 25.4404V32.5348H104.217V25.4404L98.8831 15.6152V15.4697H100.125L102.436 19.8099L104.779 24.319L107.123 19.8099L109.475 15.4697Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0">
|
||||
<path d="M0 0H110.694V48H0V0Z" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
@@ -1,135 +0,0 @@
|
||||
/* based on https://github.com/btcpayserver/btcpayserver-doc/blob/master/Theme.md#blockstream */
|
||||
|
||||
html {
|
||||
background-color: #353535;
|
||||
}
|
||||
|
||||
.modal.page {
|
||||
background-color: #353535;
|
||||
}
|
||||
|
||||
/* centering for new default design */
|
||||
.top-header .header__iconcentered {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
position: relative;
|
||||
width: 100px;
|
||||
height: 50px;
|
||||
margin: 10px auto 0px;
|
||||
}
|
||||
|
||||
.header__iconcentered__img {
|
||||
display: block;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
background: url(dark-logo.svg) no-repeat;
|
||||
background-size: 92.5px 40px;
|
||||
width: 92.5px;
|
||||
height: 40px;
|
||||
padding-left: 92.5px; /* Must be equal to width */
|
||||
}
|
||||
/* eof */
|
||||
|
||||
.top-header {
|
||||
background-color: #292929;
|
||||
}
|
||||
|
||||
.invoice {
|
||||
background-color: #333333; /* messes up bottom border radius */
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-content {
|
||||
color: #fff;
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-content .vexmenuitem {
|
||||
border-bottom-color: #8f979e;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-content .vexmenuitem:hover {
|
||||
background-color: #292929;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-content a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.expired__body,
|
||||
.success-message {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
line-items .line-items__item {
|
||||
color: #8D8D8F;
|
||||
}
|
||||
|
||||
.currency-selection {
|
||||
background-color: #292929;
|
||||
border-bottom: 1px solid #565d6e;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.payment__currencies {
|
||||
background-color: #191919;
|
||||
}
|
||||
|
||||
.payment__currencies:hover {
|
||||
background-color: #111316;
|
||||
}
|
||||
|
||||
line-items {
|
||||
background-color: #292929;
|
||||
color: #565d6e !important;
|
||||
border-top: 1px solid #565d6e !important;
|
||||
}
|
||||
|
||||
.buyerTotalLine {
|
||||
border-top: 1px solid #202224;
|
||||
background-color: #292929;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.payment-tabs {
|
||||
background-color: #292929;
|
||||
color: #fff;
|
||||
border-top: 1px solid #565d6e;
|
||||
}
|
||||
|
||||
.payment-tabs__tab.active {
|
||||
background-color: #333333;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
|
||||
canvas {
|
||||
border: 5px solid #fff;
|
||||
}
|
||||
|
||||
#prettydropdown-DefaultLang ul {
|
||||
color: #818a91 !important;
|
||||
background-color: #191919;
|
||||
}
|
||||
|
||||
#prettydropdown-DefaultLang ul.active li:hover {
|
||||
color: #fff !important;
|
||||
background-color: #111316;
|
||||
}
|
||||
|
||||
.manual__step-one__header {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.manual__step-one__instructions {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
|
||||
.content-faded, .manual__step-one__instructions, .manual__step-two__instructions {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
|
||||
.recommended-fee {
|
||||
color: #fff;
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.4 KiB |
File diff suppressed because it is too large
Load Diff
@@ -1,80 +0,0 @@
|
||||
.vexmenu {
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.vexmenuitem {
|
||||
display: block;
|
||||
float: none;
|
||||
line-height: inherit;
|
||||
position: relative;
|
||||
list-style: none;
|
||||
cursor: pointer;
|
||||
padding: 5px;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.vexmenuitem a {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.vexmenuitem a span {
|
||||
float: right;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
.vexmenuitem a img {
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.vexmenuitem:hover {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
.vexmenuitem:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
#vexPopupDialog {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.paywithRowRight {
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
.cursorPointer {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.payment__currencies {
|
||||
font-size: 13px;
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 5px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.payment__currencies_noborder {
|
||||
font-size: 13px;
|
||||
border-radius: 5px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.payment__currencies img , .payment__currencies_noborder img{
|
||||
margin-top: -3px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.payment__currencies:hover .clickable_underline {
|
||||
border-bottom: 1px dotted black;
|
||||
}
|
||||
|
||||
.payment__currencies:hover {
|
||||
border: 1px solid #5c6373;
|
||||
background: #f8f8f8;
|
||||
}
|
||||
|
||||
.clickable_indicator {
|
||||
color: #5c6373;
|
||||
}
|
||||
@@ -1,204 +0,0 @@
|
||||
@-webkit-keyframes vex-flyin {
|
||||
0% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-40px);
|
||||
transform: translateY(-40px);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes vex-flyin {
|
||||
0% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-40px);
|
||||
transform: translateY(-40px);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes vex-flyout {
|
||||
0% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-40px);
|
||||
transform: translateY(-40px);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes vex-flyout {
|
||||
0% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-40px);
|
||||
transform: translateY(-40px);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes vex-pulse {
|
||||
0% {
|
||||
box-shadow: inset 0 0 0 300px transparent;
|
||||
}
|
||||
|
||||
70% {
|
||||
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: inset 0 0 0 300px transparent;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes vex-pulse {
|
||||
0% {
|
||||
box-shadow: inset 0 0 0 300px transparent;
|
||||
}
|
||||
|
||||
70% {
|
||||
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: inset 0 0 0 300px transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay {
|
||||
padding-top: 160px;
|
||||
padding-bottom: 160px;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay.vex-closing .vex-content {
|
||||
-webkit-animation: vex-flyout .5s forwards;
|
||||
animation: vex-flyout .5s forwards;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-content {
|
||||
-webkit-animation: vex-flyin .5s;
|
||||
animation: vex-flyin .5s;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-content {
|
||||
border-radius: 5px;
|
||||
background: #ffffff;
|
||||
color: #444;
|
||||
padding: 5px;
|
||||
position: relative;
|
||||
margin: 0 auto;
|
||||
max-width: 100%;
|
||||
width: 300px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-content h1, .vex.vex-theme-btcpay .vex-content h2, .vex.vex-theme-btcpay .vex-content h3, .vex.vex-theme-btcpay .vex-content h4, .vex.vex-theme-btcpay .vex-content h5, .vex.vex-theme-btcpay .vex-content h6, .vex.vex-theme-btcpay .vex-content p, .vex.vex-theme-btcpay .vex-content ul, .vex.vex-theme-btcpay .vex-content li {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-close {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-message {
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input select, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="week"] {
|
||||
border-radius: 3px;
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
padding: .25em .67em;
|
||||
border: 0;
|
||||
font-family: inherit;
|
||||
font-weight: inherit;
|
||||
font-size: inherit;
|
||||
min-height: 2.5em;
|
||||
margin: 0 0 .25em;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input select:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-input input[type="week"]:focus {
|
||||
box-shadow: inset 0 0 0 2px #8dbdf1;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-buttons {
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-form .vex-dialog-buttons:after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-button {
|
||||
border-radius: 3px;
|
||||
border: 0;
|
||||
float: right;
|
||||
margin: 0 0 0 .5em;
|
||||
font-family: inherit;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: .1em;
|
||||
font-size: .8em;
|
||||
line-height: 1em;
|
||||
padding: .75em 2em;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-button.vex-last {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-button:focus {
|
||||
-webkit-animation: vex-pulse 1.1s infinite;
|
||||
animation: vex-pulse 1.1s infinite;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
@media (max-width: 568px) {
|
||||
.vex.vex-theme-btcpay .vex-dialog-button:focus {
|
||||
-webkit-animation: none;
|
||||
animation: none;
|
||||
}
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-button.vex-dialog-button-primary {
|
||||
background: #3288e6;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.vex.vex-theme-btcpay .vex-dialog-button.vex-dialog-button-secondary {
|
||||
background: #e0e0e0;
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.vex-loading-spinner.vex-theme-btcpay {
|
||||
box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
|
||||
border-radius: 100%;
|
||||
background: #f0f0f0;
|
||||
border: .2em solid transparent;
|
||||
border-top-color: #bbb;
|
||||
top: -1.1em;
|
||||
bottom: auto;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
class NDEFReaderWrapper {
|
||||
constructor() {
|
||||
this.onreading = null;
|
||||
this.onreadingerror = null;
|
||||
}
|
||||
|
||||
async scan(opts) {
|
||||
if (opts && opts.signal){
|
||||
opts.signal.addEventListener('abort', () => {
|
||||
window.parent.postMessage('nfc:abort', '*');
|
||||
});
|
||||
}
|
||||
window.parent.postMessage('nfc:startScan', '*');
|
||||
}
|
||||
}
|
||||
|
||||
delegate('click', '.payment-method', e => {
|
||||
const el = e.target.closest('.payment-method')
|
||||
closePaymentMethodDialog(el.dataset.paymentMethod);
|
||||
return false;
|
||||
})
|
||||
@@ -1,12 +0,0 @@
|
||||
const urlParams = {};
|
||||
(window.onpopstate = function () {
|
||||
let match,
|
||||
pl = /\+/g, // Regex for replacing addition symbol with a space
|
||||
search = /([^&=]+)=?([^&]*)/g,
|
||||
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
|
||||
query = window.location.search.substring(1);
|
||||
|
||||
while (match = search.exec(query)) {
|
||||
urlParams[decode(match[1])] = decode(match[2]);
|
||||
}
|
||||
})();
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "am-ET",
|
||||
"currentLanguage": "አማርኛ",
|
||||
"lang": "ቋንቋ",
|
||||
"Awaiting Payment...": "በመጠባበቅ ላይ ያለ ክፍያ ",
|
||||
"Pay with": "ይክፈሉ",
|
||||
"Contact and Refund Email": "ለማነጋገር እና ገንዘብ ተመላሽ ኢሜል",
|
||||
"Contact_Body": "እባክዎ ከዚህ በታች የኢሜይል አድራሻ ያቅርቡ. ክፍያዎ ላይ ችግር ካለ በዚህ አድራሻ ላይ እናገኝዎታለን.",
|
||||
"Your email": "የእርስዎ ኢሜይል",
|
||||
"Continue": "ይቀጥሉ",
|
||||
"Please enter a valid email address": "እባክዎ ልክ የሆነ የኢሜይል አድራሻ ያስገቡ",
|
||||
"Order Amount": "የትዕዛዝ መጠን",
|
||||
"Network Cost": "የአውታረ መረብ ወጪ",
|
||||
"Already Paid": "አስቀድሞ ተከፍሏል",
|
||||
"Due": "የሚከፈል",
|
||||
"Scan": "ቃኝ",
|
||||
"Copy": "ቅጂ",
|
||||
"Conversion": "ልወጣ",
|
||||
"Open in wallet": "ውስጣዊ wallet ይክፈቱ",
|
||||
"CompletePay_Body": "ክፍያዎን ለማጠናቀቅ እባክዎ {{btcDue}} {{cryptoCode}} ከዚህ በታች ባለው አድራሻ ይላኩ",
|
||||
"Amount": "መጠን",
|
||||
"Address": "አድራሻ",
|
||||
"Copied": "ተቀድቷል",
|
||||
"ConversionTab_BodyTop": "ከሌሎች ነጋዴዎች በቀጥታ የሚደግፉ altcoin በመጠቀም {{btcDue}} {{cryptoCode}} መክፈል ይችላሉ",
|
||||
"ConversionTab_BodyDesc": "ይህ አገልግሎት በ 3 ኛ ወገን ይቀርባል. እባክዎን ምን ያህል አገልግሎት ሰጪዎች ገንዘቡን እንደሚልኩ መቆጣጠር አለመቻላችንን ያስታውሱ. ደረሰኝ የተቆረጠለት ገንዘብ ከተቀበለ በኋላ ብቻ ነው {{cryptoCode}} Blockchain.",
|
||||
"ConversionTab_CalculateAmount_Error": "እንደገና ሞክር",
|
||||
"ConversionTab_LoadCurrencies_Error": "እንደገና ሞክር",
|
||||
"ConversionTab_Lightning": "ለ Lightning አውታረ መረብ ክፍያዎች ምንም የልወጣ አቅራቢዎች አይገኙም.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "እባክዎ የሚቀየር አንድ ምንዛሬ ይምረጡ",
|
||||
"Invoice expiring soon...": "ይህ ደረሰኝ በቅርቡ ጊዜው ያልፍበታል",
|
||||
"Invoice expired": "ደረሰኝ ጊዜው አልፎበታል",
|
||||
"What happened?": "ምን ተፈጠረ?",
|
||||
"InvoiceExpired_Body_1": "ይህ ደረሰኝ ጊዜው አልፎበታል. ደረሰኝ ለ {{maxTimeMinutes}} ደቂቃ ብቻ ነው የሚሰራው.\nክፍያዎን እንደገና ለማስገባት የሚፈልጉ ከሆነ ወደ {{storeName}} መመለስ ይችላሉ.",
|
||||
"InvoiceExpired_Body_2": "ክፍያ ለመላክ ከሞከሩ, ገና በአውታረ መረቡ ተቀባይነት አላገኘም. ገንዘብዎን ገና አልተቀበልንም.",
|
||||
"InvoiceExpired_Body_3": "በኋላ ላይ ከደረሰን, የተመላሽ ገንዘብን ለማዘጋጀት ትዕዛዝዎን እንሰራለን ወይም እርስዎን ያነጋግሩን",
|
||||
"Invoice ID": "ደረሰኝ መታወቂያ",
|
||||
"Order ID": "የትዕዛዝ መታወቂያ",
|
||||
"Return to StoreName": "ወደ {{storeName}}",
|
||||
"This invoice has been paid": "ይህ ደረሰኝ ተከፍሏል",
|
||||
"This invoice has been archived": "ይህ ደረሰኝ ተመዝግቧል",
|
||||
"Archived_Body": "እባክዎ ለማዘዝ ለሽርሽር መረጃ ወይም ለእርዳታ ያነጋግሩ",
|
||||
"BOLT 11 Invoice": "BOLT 11 ክፍያ መጠየቂያ",
|
||||
"Node Info": "Node መረጃ",
|
||||
"txCount": "{{count}} ግብይት",
|
||||
"txCount_plural": "{{count}} ግብይቶች",
|
||||
"Pay with CoinSwitch": "በ CoinSwitch ይክፈሉ",
|
||||
"Pay with Changelly": "በ Changelly ይክፈሉ",
|
||||
"Close": "ዝጋ",
|
||||
"NotPaid_ExtraTransaction": "ደረሰኙ ሙሉ በሙሉ አልተከፈለውም. እባክዎ የገንዘብ መጠን ለመሸፈን ሌላ ግብይት ይላኩ",
|
||||
"Recommended_Fee": "የሚመከር ክፍያ ፦ {{feeRate}} sat/byte",
|
||||
"View receipt": "ማጥያት ይመስል"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "ar",
|
||||
"currentLanguage": "العربية",
|
||||
"lang": "اللغة",
|
||||
"Awaiting Payment...": "في انتظار الدفع...",
|
||||
"Pay with": "ادفع عن طريق",
|
||||
"Contact and Refund Email": "البريد الإلكتروني الخاص بالتواصل & إعادة المال",
|
||||
"Contact_Body": "من فضلك ادخل بريدك الإلكتروني ادناه. سوف نتواصل معك علي هذا البريد في حال حدوث مشاكل مع معاملتك.",
|
||||
"Your email": "بريدك الإلكتروني",
|
||||
"Continue": "استمرار",
|
||||
"Please enter a valid email address": "ادخل بريد الكتروني صحيح من فضلك",
|
||||
"Order Amount": "المبلغ المطلوب",
|
||||
"Network Cost": "عمولة الشبكة",
|
||||
"Already Paid": "تم دفعه",
|
||||
"Due": "المستحق",
|
||||
"Scan": "مسح",
|
||||
"Copy": "نسخ",
|
||||
"Conversion": "تبديل",
|
||||
"Open in wallet": "الفتح في المحفظة",
|
||||
"CompletePay_Body": "لإكمال التحويل, من فضلك ارسل {{btcDue}} {{cryptoCode}} للعنوان ادناه.",
|
||||
"Amount": "المبلع",
|
||||
"Address": "العنوان",
|
||||
"Copied": "تم النسخ",
|
||||
"ConversionTab_BodyTop": "تستطيع دفع {{btcDue}} {{cryptoCode}} بإستخدام عملات اخري غير التي يقبلها التاجر.",
|
||||
"ConversionTab_BodyDesc": "هذه الخدمة موفرة عن طريق طرف ثالث. يجب ان تضع في الإعتبار اننا غير مسؤلين عن كيف سيحول موفر الخدمة الأموال. الأموال ستكون ظاهر فقط في حين استلامها علي شبكة {{cryptoCode}}.",
|
||||
"ConversionTab_CalculateAmount_Error": "اعد المحاولة",
|
||||
"ConversionTab_LoadCurrencies_Error": "اعد المحاولة",
|
||||
"ConversionTab_Lightning": "لا يوجد خدمة دفع بديلة لتحويلات Lightning.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "من فضلك اختر عملة للتبديل منها",
|
||||
"Invoice expiring soon...": "المعاملة تنتهي صلاحيتها قريبا...",
|
||||
"Invoice expired": "المعاملة انتهت صلاحيتها",
|
||||
"What happened?": "ماذا حدث؟",
|
||||
"InvoiceExpired_Body_1": "هذه المعاملة انتهت صلاحيتها المعاملة صالحة فقط ل {{maxTimeMinutes}} دقيقة. \nتستطيع الرجوع الي {{storeName}} اذا كنت تريد عمل معاملة جديدة.",
|
||||
"InvoiceExpired_Body_2": "اذا كنت قد حاولت ارسال عملات, فهي لم تقبل بعد من خلال الشبكة. نحن لم نستلم بعد عملاتك.",
|
||||
"InvoiceExpired_Body_3": "إذا استلمناها في وقت اخر ، فسوف نكمل عمليتك او سنتواصل معك لترتيب اجراءات اعادة الأموال...",
|
||||
"Invoice ID": "معرف المعاملة",
|
||||
"Order ID": "معرف الطلب",
|
||||
"Return to StoreName": "الرجوع الي {{storeName}}",
|
||||
"This invoice has been paid": "تم الدفع بنجاح",
|
||||
"This invoice has been archived": "تمت ارشفة هذه المعاملة",
|
||||
"Archived_Body": "من فضلك تحدث مع البائع للمعلومات بخصوص المعاملة او المساعدة",
|
||||
"BOLT 11 Invoice": "BOLT 11 معاملة",
|
||||
"Node Info": "معلومات العقدة",
|
||||
"txCount": "{{count}} تحويلة",
|
||||
"txCount_plural": "{{count}} تحويلات",
|
||||
"Pay with CoinSwitch": "ادفع عن طريق خدمة CoinSwitch",
|
||||
"Pay with Changelly": "ادفع عن طريق خدمة Changelly",
|
||||
"Close": "اغلاق",
|
||||
"NotPaid_ExtraTransaction": "لم يتم دفع الفاتورة بشكل كامل. من فضلك ارسل تحويلة اخري تغطي الثمن المتبقي.",
|
||||
"Recommended_Fee": "العمولة المنصوح بها: {{feeRate}} sat/byte",
|
||||
"View receipt": "عرض الإيصال"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "az",
|
||||
"currentLanguage": "Azərbaycanca",
|
||||
"lang": "Dil",
|
||||
"Awaiting Payment...": "Ödəniş gözlənilir...",
|
||||
"Pay with": "Ödənilir:",
|
||||
"Contact and Refund Email": "Əlaqə və geri ödəmə e-poçtu",
|
||||
"Contact_Body": "Lütfən aşağıda e-poçt ünvanını qeyd edin. Ödəmə ilə bağlı problem yaransa biz göstərilən e-poçt vasitəsilə sizinlə əlaqə saxlayacağıq.",
|
||||
"Your email": "E-poçt",
|
||||
"Continue": "İrəli",
|
||||
"Please enter a valid email address": "Lütfən düzgün e-poçt ünvanı daxil edin",
|
||||
"Order Amount": "Sifariş məbləği",
|
||||
"Network Cost": "Şəbəkə dəyəri",
|
||||
"Already Paid": "Artıq ödənilib",
|
||||
"Due": "Ödənilməlidir",
|
||||
"Scan": "Skan et",
|
||||
"Copy": "Kopyala",
|
||||
"Conversion": "Konvertasiya",
|
||||
"Open in wallet": "Cüzdanda aç",
|
||||
"CompletePay_Body": "Ödənişi tamamlamaq üçün lütfən {{btcDue}} {{cryptoCode}} məbləğini aşağıdakı ünvana göndərin.",
|
||||
"Amount": "Məbləğ",
|
||||
"Address": "Ünvan",
|
||||
"Copied": "Kopyalandı",
|
||||
"ConversionTab_BodyTop": "Siz bu {{btcDue}} {{cryptoCode}} məbləği satıcının birbaşa dəstəkləmədiyi altkoinlər vasitəsilə ödəyə bilərsiniz. ",
|
||||
"ConversionTab_BodyDesc": "Bu xidmət üçüncü tərəf vasitəsilə göstərilir. Unutmayın ki, təchizatçının sizin vəsaiti hansı formada köçürdüyünə biz nəzarət etmirik. Faktura {{cryptoCode}} vəsaitinin blokçeyn tərəfindən qəbul edildiyi zaman ödənilmiş olaraq işarələnəcək. ",
|
||||
"ConversionTab_CalculateAmount_Error": "Təkrar et",
|
||||
"ConversionTab_LoadCurrencies_Error": "Təkrar et",
|
||||
"ConversionTab_Lightning": "Lightning Network ödəmələri üçün konvertasiya təchizatçıları mövcud deyil.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Lütfən konvertasiya üçün valyutanı seçin",
|
||||
"Invoice expiring soon...": "Faktura müddəti tezliklə bitəcək...",
|
||||
"Invoice expired": "Fakturanın müddəti bitmişdir",
|
||||
"What happened?": "Nə baş verib?",
|
||||
"InvoiceExpired_Body_1": "Bu fakturanın müddəti bitdi. Faktura yalnız {{maxTimeMinutes}} dəqiqə ərzində etibarlıdır. \nÖdənişinizi yenidən həyata keçirmək istəyirsinizsə {{storeName}} xidmətinə qayıda bilərsiniz.",
|
||||
"InvoiceExpired_Body_2": "Ödəməni həyata keçirmisinizsə tranzaksiya hələ ki, şəbəkə tərəfindən qəbul edilməyib. Biz hələ ki, sizin ödəmənizi almamışıq.",
|
||||
"InvoiceExpired_Body_3": "Əgər vəsaiti sonradan qəbul etsək ya sifarişinizi təsdiqləyəcəyik ya da geri ödəmə üçün sizinlə əlaqə saxlayacağıq.",
|
||||
"Invoice ID": "Faktura №",
|
||||
"Order ID": "Sifariş №",
|
||||
"Return to StoreName": "{{storeName}} xidmətinə qayıt",
|
||||
"This invoice has been paid": "Faktura ödənilmişdir",
|
||||
"This invoice has been archived": "Faktura arxivlənmişdir",
|
||||
"Archived_Body": "Lütfən sifariş haqqında məlumat və ya yardım almaq üçün mağaza ilə əlaqə saxlayın",
|
||||
"BOLT 11 Invoice": "BOLT 11 Faktura",
|
||||
"Node Info": "Nod məlumatı",
|
||||
"txCount": "{{count}} tranzaksiya",
|
||||
"txCount_plural": "{{count}} tranzaksiyalar",
|
||||
"Pay with CoinSwitch": "CoinSwitch vasitəsilə ödə",
|
||||
"Pay with Changelly": "Changelly vasitəsilə ödə",
|
||||
"Close": "Qapat",
|
||||
"NotPaid_ExtraTransaction": "Faktura tam ödənilməyib. Lütfən məbləği tam ödəmək üçün daha bir tranzaksiya həyata keçirin.",
|
||||
"Recommended_Fee": "Tövsiyə edilən komissiya: {{feeRate}} sat/byte",
|
||||
"View receipt": "Qəbzə bax"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "bg-BG",
|
||||
"currentLanguage": "български",
|
||||
"lang": "Език",
|
||||
"Awaiting Payment...": "Очаква се платеж...",
|
||||
"Pay with": "Плати с",
|
||||
"Contact and Refund Email": "Електронна поща за обратна връзка и възстановяване на сметка",
|
||||
"Contact_Body": "Моля представете вашата електронна поща. Ако има проблем със заплащането ще се свържем с вас чрез имейл.",
|
||||
"Your email": "Вашата електронна поща",
|
||||
"Continue": "Продължи",
|
||||
"Please enter a valid email address": "Моля представете валидна електронна поща",
|
||||
"Order Amount": "Обща сума",
|
||||
"Network Cost": "Тарифа на мрежата",
|
||||
"Already Paid": "Платено е",
|
||||
"Due": "Дължимо",
|
||||
"Scan": "Сканирай",
|
||||
"Copy": "Копирай",
|
||||
"Conversion": "Превръщане",
|
||||
"Open in wallet": "Отвори в портфейл",
|
||||
"CompletePay_Body": "За да платите вашата сметка, моля пратете {{btcDue}} {{cryptoCode}} до следния адрес.",
|
||||
"Amount": "Сума",
|
||||
"Address": "Адрес",
|
||||
"Copied": "Копирано",
|
||||
"ConversionTab_BodyTop": "Може да платите {{btcDue}} {{cryptoCode}} използвайки криптовалути различни от тези, които търговеца директно приема. ",
|
||||
"ConversionTab_BodyDesc": "Този сервиз за предлага от трето лице. Моля дръжте в предвид, че ние нямаме контрол как доставчикът препраща вашите средства. Фактурата ще бъде маркирана като платена само, когато средствата са получени на {{cryptoCode}} блок веригата.",
|
||||
"ConversionTab_CalculateAmount_Error": "Опитай отново",
|
||||
"ConversionTab_LoadCurrencies_Error": "Опитай отново",
|
||||
"ConversionTab_Lightning": "Няма доставчици на обменни бюра на разположение за плащане по Lightning Network. ",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Моля изберете валута, от която да обмените.",
|
||||
"Invoice expiring soon...": "Срокът на фактурата изтича скоро...",
|
||||
"Invoice expired": "Фактурата е с изтекъл срок. ",
|
||||
"What happened?": "Какво стана?",
|
||||
"InvoiceExpired_Body_1": "Фактурата е с изтекъл срок. Фактурата е валидна за срок от {{maxTimeMinutes}} минути. Може да се върнете обратно до {{storeName}} ако желаете отново да се опитате да платите. ",
|
||||
"InvoiceExpired_Body_2": "Все още не сме получили вашите средства. \n\nАко сте се пробвали да платите, крипто мрежата все още не е приела вашите средства.",
|
||||
"InvoiceExpired_Body_3": "Ако получим вашите средства по късно, или ще обработим вашата поръчка, или ще се свържем с вас да ви върнем средствата.",
|
||||
"Invoice ID": "Номер на фактура",
|
||||
"Order ID": "Номер на поръчка",
|
||||
"Return to StoreName": "Обратно до {{storeName}}",
|
||||
"This invoice has been paid": "Тази фактура е платена",
|
||||
"This invoice has been archived": "Тази фактура е архивирана",
|
||||
"Archived_Body": "Моля свържете се с магазина за информация или помощ",
|
||||
"BOLT 11 Invoice": "BOLT 11 Фактура",
|
||||
"Node Info": "Инфо на възела",
|
||||
"txCount": "{{count}} транзакция",
|
||||
"txCount_plural": "{{count}} транзакции",
|
||||
"Pay with CoinSwitch": "Плати с CoinSwitch",
|
||||
"Pay with Changelly": "Плати с Changelly",
|
||||
"Close": "Затвори",
|
||||
"NotPaid_ExtraTransaction": "Фактурата не а платена изцяло. Моля пратете остатъка в допълнителна транзакция. ",
|
||||
"Recommended_Fee": "Препоръчена тарифа: {{feeRate}} сат/байт (sat/byte)",
|
||||
"View receipt": "Преглед на касовата бележка."
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "bs-BA",
|
||||
"currentLanguage": "Bosanski",
|
||||
"lang": "Jezik",
|
||||
"Awaiting Payment...": "Čekam uplatu...",
|
||||
"Pay with": "Plati sa",
|
||||
"Contact and Refund Email": "Kontakt i email za refundaciju",
|
||||
"Contact_Body": "Ispod upišite vašu email adresu. Kontaktiraćemo vas na ovoj adresi u slučaju problema sa vašom uplatom.",
|
||||
"Your email": "Vaš email",
|
||||
"Continue": "Nastavi",
|
||||
"Please enter a valid email address": "Upišite validnu email adresu",
|
||||
"Order Amount": "Količina narudžbi",
|
||||
"Network Cost": "Cijena mreže",
|
||||
"Already Paid": "Već plaćeno",
|
||||
"Due": "Dužan",
|
||||
"Scan": "Skeniraj",
|
||||
"Copy": "Kopiraj",
|
||||
"Conversion": "Konverzija",
|
||||
"Open in wallet": "Otvori u novčaniku",
|
||||
"CompletePay_Body": "Da bi završili vašu uplatu, pošaljite {{btcDue}} {{cryptoCode}} na adresu koja je prikazan ispod.",
|
||||
"Amount": "Količina",
|
||||
"Address": "Adresa",
|
||||
"Copied": "Kopirano",
|
||||
"ConversionTab_BodyTop": "Možete uplatiti {{btcDue}} {{cryptoCode}} koristeći altcoine koji nisu prikazani kao prodržani od strane prodavača.",
|
||||
"ConversionTab_BodyDesc": "Koristite servis 3. strane. Molimo vas da imate na umu da mi nemamo kontrolu kako drugi provajderi proslijeđuju vaša sredstva. Predračun će biti markiran kao plaćen nakon što su sredstva primljena na {{cryptoCode}} Blockchain.",
|
||||
"ConversionTab_CalculateAmount_Error": "Ponovi",
|
||||
"ConversionTab_LoadCurrencies_Error": "Ponovi",
|
||||
"ConversionTab_Lightning": "Nepostojeći provider plaćanja za Lightning mrežu.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Izaberite valutu koju mjenjate",
|
||||
"Invoice expiring soon...": "Predračun ističe uskoro...",
|
||||
"Invoice expired": "Predračun istekao",
|
||||
"What happened?": "Šta se desilo?",
|
||||
"InvoiceExpired_Body_1": "Ovaj predračun je istekao. Predračun je validan {{maxTimeMinutes}} minutes. \nMožete vratiti {{storeName}} ukoliko želite da ponovite vašu narudžbu.",
|
||||
"InvoiceExpired_Body_2": "Poslali ste uplatu koja još nije prihvaćena u mreži. Sredstva još nisu zaprimljena.",
|
||||
"InvoiceExpired_Body_3": "Ukoliko zaprimimo kasnije, procesuiraćemo vašu narudžbu ili vas kontaktirati za refundaciju...",
|
||||
"Invoice ID": "Broj predračuna",
|
||||
"Order ID": "Broj računa",
|
||||
"Return to StoreName": "Vrati na {{storeName}}",
|
||||
"This invoice has been paid": "Predračun je plaćen",
|
||||
"This invoice has been archived": "Predračun je arhiviran",
|
||||
"Archived_Body": "Kontaktirajte trgovinu za informaciju o produktu",
|
||||
"BOLT 11 Invoice": "BOLT 11 Predračun",
|
||||
"Node Info": "Node info",
|
||||
"txCount": "{{count}} transakcija",
|
||||
"txCount_plural": "{{count}} transakcija",
|
||||
"Pay with CoinSwitch": "Plati sa CoinSwitch",
|
||||
"Pay with Changelly": "Plati sa Changelly",
|
||||
"Close": "Zatvori",
|
||||
"NotPaid_ExtraTransaction": "Račun nije plaćen u cijelosti. Pošaljite još jednu transakciju kako biste pokrili iznos koji dospijeva.",
|
||||
"Recommended_Fee": "Preporučena naknada: {{feeRate}} sat / bajt",
|
||||
"View receipt": "Pogledajte račun"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "ca-ES",
|
||||
"currentLanguage": "Català",
|
||||
"lang": "Llengua",
|
||||
"Awaiting Payment...": "Esperant el pagament...",
|
||||
"Pay with": "Paga amb",
|
||||
"Contact and Refund Email": "Correu electrònic de contacte i reemborsament",
|
||||
"Contact_Body": "Si us plau, indiqueu una adreça de correu electrònic a sota. Us contactarem a aquesta adreça si hi ha algún problema amb el vostre pagament. ",
|
||||
"Your email": "El vostre e-mail",
|
||||
"Continue": "Continuar",
|
||||
"Please enter a valid email address": "Si us plau, introduiu una adreça de correu electrònica vàlida",
|
||||
"Order Amount": "Import de la comanda",
|
||||
"Network Cost": "Cost de Xarxa",
|
||||
"Already Paid": "Ja pagada",
|
||||
"Due": "Degut",
|
||||
"Scan": "Escaneja",
|
||||
"Copy": "Copia",
|
||||
"Conversion": "Conversió",
|
||||
"Open in wallet": "Obre a la cartera",
|
||||
"CompletePay_Body": "Per completar el pagament, si us plau, envieu {{btcDue}} {{cryptoCode}} a l'adreça a sota.",
|
||||
"Amount": "Import",
|
||||
"Address": "Adreça",
|
||||
"Copied": "Copiat",
|
||||
"ConversionTab_BodyTop": "Podeu pagar {{btcDue}} {{cryptoCode}} utilitzant criptomonedes alternatives altres que les que el comerciant suporta.",
|
||||
"ConversionTab_BodyDesc": "Aquest servei el proveeix un tercer. Si us plau, teniu en ment que no tenim control sobre com reenviaran el proveidors els fons. Els rebuts seran marcats com a pagats una vegada els fons seran rebuts al Blockchain de {{cryptoCode}} .",
|
||||
"ConversionTab_CalculateAmount_Error": "Torna a intentar",
|
||||
"ConversionTab_LoadCurrencies_Error": "Torna a intentar",
|
||||
"ConversionTab_Lightning": "No es disposen de proveidors de conversió per als pagaments a la Xarxa Lightning.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Si us plau, seleccioneu una divisa per a traduïr l'import",
|
||||
"Invoice expiring soon...": "La factura expira aviat...",
|
||||
"Invoice expired": "La factura ha expirat",
|
||||
"What happened?": "Què ha passat?",
|
||||
"InvoiceExpired_Body_1": "Aquesta factura ha expirat. La factura serà vàlida durant {{maxTimeMinutes}} minutes. Podeu tornar a {{storeName}} si desitjau reinicialitzar el pagament.",
|
||||
"InvoiceExpired_Body_2": "Si heu intentat enviar un pagament, aquest no ha estat acceptat encara per la xarxa. Encara no hem rebut els vostres fons.",
|
||||
"InvoiceExpired_Body_3": "Si els rebem posteriorment, processarem la vostra comanda o us contactarem per acordar una devol·lució.",
|
||||
"Invoice ID": "Núm. de factura",
|
||||
"Order ID": "Núm. de Ordre",
|
||||
"Return to StoreName": "Torna a {{storeName}}",
|
||||
"This invoice has been paid": "La factura s'ha pagat",
|
||||
"This invoice has been archived": "La factura ha sigut arxivada",
|
||||
"Archived_Body": "Si us plau, contacteu la botiga per informació sobre comandes o assitència",
|
||||
"BOLT 11 Invoice": "Factura BOLT11",
|
||||
"Node Info": "Informació del node",
|
||||
"txCount": "{{count}} transaccions",
|
||||
"txCount_plural": "{{count}} transaccions",
|
||||
"Pay with CoinSwitch": "Pagueu amb CoinSwitch",
|
||||
"Pay with Changelly": "Pagueu amb Changelly",
|
||||
"Close": "Tancar",
|
||||
"NotPaid_ExtraTransaction": "La factura no ha estat pagada completament. Si us plau, envieu una altra transacció per cobrir l'import pendent.",
|
||||
"Recommended_Fee": "Tarifa recomanada: {{feeRate}} sat/byte",
|
||||
"View receipt": "Veure el rebut"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "cs-CZ",
|
||||
"currentLanguage": "Česky",
|
||||
"lang": "Jazyk",
|
||||
"Awaiting Payment...": "Očekávám platbu...",
|
||||
"Pay with": "Zaplatit pomocí",
|
||||
"Contact and Refund Email": "Kontaktní email",
|
||||
"Contact_Body": "Prosímte poskytněte vaši emailovou adresu. Kontaktujeme vás v případě, že se objeví problému s vaší platbou.",
|
||||
"Your email": "Váš email",
|
||||
"Continue": "Pokračovat",
|
||||
"Please enter a valid email address": "Prosíme vložte platnou emailovou adresu",
|
||||
"Order Amount": "Cena objednávky",
|
||||
"Network Cost": "Síťové náklady",
|
||||
"Already Paid": "Již zaplaceno",
|
||||
"Due": "Zbývá",
|
||||
"Scan": "Skenovat",
|
||||
"Copy": "Kopírovat",
|
||||
"Conversion": "Konverze",
|
||||
"Open in wallet": "Otevřít v peněžence",
|
||||
"CompletePay_Body": "K dokončení platby, prosíme pošlete {{btcDue}} {{cryptoCode}} na adresu níže.",
|
||||
"Amount": "Částka",
|
||||
"Address": "Adresa",
|
||||
"Copied": "Zkopírováno",
|
||||
"ConversionTab_BodyTop": "Můžete zaplatit {{btcDue}} {{cryptoCode}} i pomocí altcoinů které přímo nepodporuje obchodník.",
|
||||
"ConversionTab_BodyDesc": "Tato služba je poskytována třetí stranou. Prosíme mějte na paměti, že nemáme žádnou kontrolu nad tím, jak poskytovatelé budou nakládat s vašimi prostředky. Faktura bude označena jako zaplacena, pouze když jsou prostředky obdrženy v {{cryptoCode}} Blockchainu.",
|
||||
"ConversionTab_CalculateAmount_Error": "Opakovat",
|
||||
"ConversionTab_LoadCurrencies_Error": "Opakovat",
|
||||
"ConversionTab_Lightning": "Pro platby Lightning Network nejsou dostupní žádní poskytovatelé konverzí.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Prosím zvolte měnu, ze které chcete převést",
|
||||
"Invoice expiring soon...": "Faktura brzy vyprší...",
|
||||
"Invoice expired": "Faktura vypršela",
|
||||
"What happened?": "Co se stalo?",
|
||||
"InvoiceExpired_Body_1": "Tato faktura již vypršela. Faktura je platná pouze {{maxTimeMinutes}} minut. \nMůžete se vrátit do {{storeName}}, pokud chcete svojí objednávku založit znovu.",
|
||||
"InvoiceExpired_Body_2": "Pokud jste se pokoušeli poslat platbu, nebyla zatím zaznamenána v Bitcoinové síti. Zatím jsme neobdrželi vaše prostředky.",
|
||||
"InvoiceExpired_Body_3": "Pokud ji obdržíme později, buď vaši objednávku zpracujeme, nebo vás kontaktujeme a dohodneme se na vrácení peněz...",
|
||||
"Invoice ID": "ID Faktury",
|
||||
"Order ID": "ID Objednávky",
|
||||
"Return to StoreName": "Vrátit se na {{storeName}}",
|
||||
"This invoice has been paid": "Faktura byla zaplacena",
|
||||
"This invoice has been archived": "Tato faktura byla archivována",
|
||||
"Archived_Body": "Prosíme kontaktujte prodejce pro informace o objednávce a případnou pomoc",
|
||||
"BOLT 11 Invoice": "BOLT 11 Faktura",
|
||||
"Node Info": "Info o uzlu",
|
||||
"txCount": "{{count}} transakce",
|
||||
"txCount_plural": "{{count}} transakcí",
|
||||
"Pay with CoinSwitch": "Zaplatit přes CoinSwitch",
|
||||
"Pay with Changelly": "Zaplatit přes Changelly",
|
||||
"Close": "Zavřít",
|
||||
"NotPaid_ExtraTransaction": "Faktura nebyla uhrazena v plné výši. Zašlete prosím další transakci na úhradu dlužné částky.",
|
||||
"Recommended_Fee": "Doporučený poplatek: {{feeRate}} sat/bajt",
|
||||
"View receipt": "Zobrazit účtenku"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "da-DK",
|
||||
"currentLanguage": "Dansk",
|
||||
"lang": "Sprog",
|
||||
"Awaiting Payment...": "Afventer betaling...",
|
||||
"Pay with": "Betal med",
|
||||
"Contact and Refund Email": "Kontakt og Tilbagebetalings Email",
|
||||
"Contact_Body": "Angiv venligst en email adresse herunder. Vi kontakter dig på denne email, hvis der er et problem med din betaling.",
|
||||
"Your email": "Din email",
|
||||
"Continue": "Forsæt",
|
||||
"Please enter a valid email address": "Indtast venglist en gyldig email adresse",
|
||||
"Order Amount": "Bestillingsbeløb",
|
||||
"Network Cost": "Netværks gebyr",
|
||||
"Already Paid": "Allerede betalt",
|
||||
"Due": "Manglende betaling",
|
||||
"Scan": "Skan",
|
||||
"Copy": "Kopier",
|
||||
"Conversion": "Konvertering",
|
||||
"Open in wallet": "Åben i wallet",
|
||||
"CompletePay_Body": "For at færdiggøre din betaling, send venglist {{btcDue}} {{cryptoCode}} til addressen herunder.",
|
||||
"Amount": "Beløb",
|
||||
"Address": "Adresse",
|
||||
"Copied": "Kopieret",
|
||||
"ConversionTab_BodyTop": "Du kan betale {{btcDue}} {{cryptoCode}} med andre altcoins end dem sælgeren understøtter. ",
|
||||
"ConversionTab_BodyDesc": "Denne service er stillet til rådighed af 3. Partnere. Vær venligst opmærksom på, at vi ikke har kontrol over, hvordan udbydere vil videresende dine midler. Fakturaen vil kun blive markeret betalt, når der er modtaget midler på {{cryptoCode}} Blockchain.",
|
||||
"ConversionTab_CalculateAmount_Error": "Genprøv",
|
||||
"ConversionTab_LoadCurrencies_Error": "Genprøv",
|
||||
"ConversionTab_Lightning": "Ingen konversions partnere tilgængelig for Lightning Network betalinger.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Vælg venligst en valuta at konvertere fra",
|
||||
"Invoice expiring soon...": "Fakturaen udløber snart...",
|
||||
"Invoice expired": "Fakturaen er udløbet",
|
||||
"What happened?": "Hvad skete der?",
|
||||
"InvoiceExpired_Body_1": "Fakturaen er udløbet. En faktura er kun gyldig i {{maxTime Minutes}} minutter. \nDu kan vende tilbage til {{butiknavn}}, hvis du gerne vil sende din betaling igen.",
|
||||
"InvoiceExpired_Body_2": "Hvis du har forsøgt at sende en betaling, er den endnu ikke accepteret af netværket. Vi har endnu ikke modtaget dine midler.",
|
||||
"InvoiceExpired_Body_3": "Hvis vi modtager den på et senere tidspunkt, vil vi enten behandle din ordre eller kontakte dig for at aftale refundering...",
|
||||
"Invoice ID": "Faktura ID",
|
||||
"Order ID": "Ordre ID",
|
||||
"Return to StoreName": "Returner til {{storeName}}",
|
||||
"This invoice has been paid": "Denne faktura er blevet betalt",
|
||||
"This invoice has been archived": "Denne faktura er blevet arkiveret",
|
||||
"Archived_Body": "Kontakt venligt butikken for ordre information eller assistance",
|
||||
"BOLT 11 Invoice": "BOLT 11 Faktura",
|
||||
"Node Info": "Node Information",
|
||||
"txCount": "{{count}} transaktion",
|
||||
"txCount_plural": "{{count}} transaktioner",
|
||||
"Pay with CoinSwitch": "Betal med CoinSwitch",
|
||||
"Pay with Changelly": "Betal med Changelly",
|
||||
"Close": "Luk",
|
||||
"NotPaid_ExtraTransaction": "Fakturaen er ikke fuldt ud betalt. Venligst send endnu en transaktion for at dække for den manglende mængde.",
|
||||
"Recommended_Fee": "Anbefalt gebyr: {{feeRate}} sat/byte",
|
||||
"View receipt": "Se kvittering"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "de-DE",
|
||||
"currentLanguage": "Deutsch",
|
||||
"lang": "Sprache",
|
||||
"Awaiting Payment...": "Warten auf Zahlung...",
|
||||
"Pay with": "Bezahlen mit",
|
||||
"Contact and Refund Email": "Kontakt und Rückerstattungs E-Mail",
|
||||
"Contact_Body": "Bitte geben Sie unten eine E-Mail-Adresse an. Wir werden Sie unter dieser Adresse kontaktieren, falls ein Problem mit Ihrer Zahlung vorliegt.",
|
||||
"Your email": "Ihre E-Mail",
|
||||
"Continue": "Fortsetzen",
|
||||
"Please enter a valid email address": "Bitte geben Sie eine gültige E-Mail-Adresse ein",
|
||||
"Order Amount": "Bestellbetrag",
|
||||
"Network Cost": "Netzwerkkosten",
|
||||
"Already Paid": "Bereits bezahlt",
|
||||
"Due": "Fällig",
|
||||
"Scan": "Scannen",
|
||||
"Copy": "Kopieren",
|
||||
"Conversion": "Umrechnung",
|
||||
"Open in wallet": "In der Wallet öffnen",
|
||||
"CompletePay_Body": "Um Ihre Zahlung abzuschließen, senden Sie bitte {{btcDue}} {{cryptoCode}} an die unten angegebene Adresse.",
|
||||
"Amount": "Menge",
|
||||
"Address": "Adresse",
|
||||
"Copied": "Kopiert",
|
||||
"ConversionTab_BodyTop": "Sie können {{btcDue}} {{cryptoCode}} mit Altcoins bezahlen, die nicht direkt vom Händler unterstützt werden.",
|
||||
"ConversionTab_BodyDesc": "Dieser Service wird von Drittanbietern bereitgestellt. Bitte beachten Sie, dass wir keine Kontrolle darüber haben, wie die Anbieter Ihre Gelder weiterleiten. Die Rechnung wird erst als bezahlt markiert, wenn das Geld auf der {{cryptoCode}} Blockchain eingegangen ist.",
|
||||
"ConversionTab_CalculateAmount_Error": "Wiederholen",
|
||||
"ConversionTab_LoadCurrencies_Error": "Wiederholen",
|
||||
"ConversionTab_Lightning": "Für Lightning Netzwerk-Zahlungen sind keine Umrechnungsanbieter verfügbar.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Bitte eine Ausgangswährung zum Geldwechsel auswählen",
|
||||
"Invoice expiring soon...": "Die Rechnung läuft bald ab...",
|
||||
"Invoice expired": "Die Rechnung ist abgelaufen",
|
||||
"What happened?": "Was ist passiert?",
|
||||
"InvoiceExpired_Body_1": "Diese Rechnung ist abgelaufen. Eine Rechnung ist nur für {{maxTimeMinutes}} Minuten gültig. \nSie können zu {{storeName}} zurückkehren, wenn Sie Ihre Zahlung erneut senden möchten.",
|
||||
"InvoiceExpired_Body_2": "Wenn Sie versucht haben, eine Zahlung zu senden, wurde sie vom Netzwerk noch nicht akzeptiert. Wir haben Ihre Gelder noch nicht erhalten.",
|
||||
"InvoiceExpired_Body_3": "Sollten Ihre Gelder zu einem späteren Zeitpunkt ankommen, werden wir entweder Ihren Auftrag bearbeiten oder Sie bezüglich der Rückerstattung kontaktieren...",
|
||||
"Invoice ID": "Rechnungs ID",
|
||||
"Order ID": "Auftrags ID",
|
||||
"Return to StoreName": "Zurück zu {{storeName}}",
|
||||
"This invoice has been paid": "Diese Rechnung wurde bezahlt",
|
||||
"This invoice has been archived": "Diese Rechnung wurde archiviert",
|
||||
"Archived_Body": "Bitte kontaktieren Sie den Shop für Bestellinformationen oder Hilfe",
|
||||
"BOLT 11 Invoice": "BOLT 11 Rechnung",
|
||||
"Node Info": "Netzwerkknoten Info",
|
||||
"txCount": "{{count}} Transaktion",
|
||||
"txCount_plural": "{{count}} Transaktionen",
|
||||
"Pay with CoinSwitch": "Zahlen mit CoinSwitch",
|
||||
"Pay with Changelly": "Zahlen mit Changelly",
|
||||
"Close": "Schließen",
|
||||
"NotPaid_ExtraTransaction": "Die Rechnung wurde nicht vollständig bezahlt. Bitte senden Sie den fehlenden Betrag, um die Rechnung zu begleichen.",
|
||||
"Recommended_Fee": "Empfohlene Netzwerk Gebührenrate: {{feeRate}} sat/byte",
|
||||
"View receipt": "Quittung anzeigen"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "el-GR",
|
||||
"currentLanguage": "Ελληνικά",
|
||||
"lang": "Γλώσσα",
|
||||
"Awaiting Payment...": "Αναμονή πληρωμής...",
|
||||
"Pay with": "Πληρώστε με",
|
||||
"Contact and Refund Email": "Email επικοινωνίας & επιστροφής πληρωμής",
|
||||
"Contact_Body": "Παρακαλούμε εισάγετε το email σας παρακάτω. Θα επικοινωνήσουμε μαζί σας σε αυτή τη διεύθυνση ηλεκτρονικής αλληλογραφίας εάν προκύψει κάποιο θέμα με την πληρωμή σας.",
|
||||
"Your email": "Το email σας",
|
||||
"Continue": "Συνέχεια",
|
||||
"Please enter a valid email address": "Παρακαλούμε εισάγετε μια έγκυρη διεύθυνση email",
|
||||
"Order Amount": "Ποσό παραγγελίας",
|
||||
"Network Cost": "Κόστος δικτύου",
|
||||
"Already Paid": "Πληρώθηκαν ήδη",
|
||||
"Due": "Οφειλόμενα",
|
||||
"Scan": "Σάρωση",
|
||||
"Copy": "Αντιγραφή",
|
||||
"Conversion": "Μετατροπή",
|
||||
"Open in wallet": "Άνοιγμα στο πορτοφόλι",
|
||||
"CompletePay_Body": "Για να ολοκληρωθεί η πληρωμή σας, παρακαλούμε στείλετε {{btcDue}} {{cryptoCode}} στην παρακάτω διεύθυνση.",
|
||||
"Amount": "Ποσό",
|
||||
"Address": "Διεύθυνση",
|
||||
"Copied": "Αντιγράφηκε",
|
||||
"ConversionTab_BodyTop": "Μπορείτε να πληρώσετε {{btcDue}} {{cryptoCode}} χρησιμοποιώντας άλλα κρυπτονομίσματα εκτός απο αυτά που υποστηρίζονται απευθείας απο τον έμπορο.",
|
||||
"ConversionTab_BodyDesc": "Αυτή η υπηρεσία παρέχεται από 3ο μέρος. Παρακαλούμε έχετε υπόψιν σας πως δεν έχουμε κανένα απολύτως έλεγχο στο πώς οι πάροχοι πληρωμών θα προωθήσουν την πληρωμή σας. Το παραστατικό πληρωμής θα καταχωρηθεί ως πληρωμένο μόνο όταν τα νομίσματα εμφανιστούν στη Blockchain του {{cryptoCode}}.",
|
||||
"ConversionTab_CalculateAmount_Error": "Δοκιμάστε πάλι",
|
||||
"ConversionTab_LoadCurrencies_Error": "Δοκιμάστε πάλι",
|
||||
"ConversionTab_Lightning": "Δεν υπάρχουν διαθέσιμοι πάροχοι πληρωμών για πληρωμές στο Lightning Network.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Παρακαλούμε επιλέξτε ένα νόμισμα απο το οποίο θα γίνει η μετατροπή",
|
||||
"Invoice expiring soon...": "Το παραστατικό πληρωμής θα λήξει σύντομα...",
|
||||
"Invoice expired": "Το παραστατικό πληρωμής έληξε",
|
||||
"What happened?": "Τι συνέβη;",
|
||||
"InvoiceExpired_Body_1": "Το παρών παραστατικό πληρωμής έχει λήξει. Ένα παραστατικό πληρωμής ισχύει μόνο για {{maxTimeMinutes}} λεπτά.\nΜπορείτε να επιστρέψετε στο {{storeName}} εάν θα θέλατε να υποβάλετε ξανά την πληρωμή σας.",
|
||||
"InvoiceExpired_Body_2": "Εάν επιχειρήσατε να στείλετε την πληρωμή σας, αυτή ακόμη δεν έχει γίνει αποδεκτή απο το δίκτυο. Δέν έχουμε λάβει ακόμη την πληρωμή σας.",
|
||||
"InvoiceExpired_Body_3": "Εάν την λάβουμε αργότερα, είτε θα εκτέλεσουμε την παραγγελία σας ή θα επικοινωνήσουμε μαζί σας για να οργανώσουμε την επιστροφή των χρημάτων σας...",
|
||||
"Invoice ID": "ID παραστατικού πληρωμής",
|
||||
"Order ID": "ID παραγγελίας",
|
||||
"Return to StoreName": "Επιστροφή στο {{storeName}}",
|
||||
"This invoice has been paid": "Αυτό το παραστατικό έχει πληρωθεί",
|
||||
"This invoice has been archived": "Αυτό το παραστατικό έχει αρχειοθετηθεί",
|
||||
"Archived_Body": "Παρακαλούμε επικοινωνήστε με το κατάστημα για πληροφορίες σχετικά με την παραγγελία ή εάν χρειάζεστε βοήθεια",
|
||||
"BOLT 11 Invoice": "Παραστατικό BOLT 11",
|
||||
"Node Info": "Πληροφορίες κόμβου",
|
||||
"txCount": "{{count}} συναλλαγή",
|
||||
"txCount_plural": "{{count}} συναλλαγών",
|
||||
"Pay with CoinSwitch": "Πληρώστε με CoinSwitch",
|
||||
"Pay with Changelly": "Πληρώστε με Changelly",
|
||||
"Close": "Κλείσιμο",
|
||||
"NotPaid_ExtraTransaction": "Το τιμολόγιο δεν έχει πληρωθεί πλήρως. Στείλτε άλλη συναλλαγή για να καλύψετε το οφειλόμενο ποσό.",
|
||||
"Recommended_Fee": "Προτεινόμενη χρέωση δικτύου: {{feeRate}} sat/byte",
|
||||
"View receipt": "Προβολή απόδειξης"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "en",
|
||||
"currentLanguage": "English",
|
||||
"lang": "Language",
|
||||
"Awaiting Payment...": "Awaiting Payment...",
|
||||
"Pay with": "Pay with",
|
||||
"Contact and Refund Email": "Contact & Refund Email",
|
||||
"Contact_Body": "Please provide an email address below. We’ll contact you at this address if there is an issue with your payment.",
|
||||
"Your email": "Your email",
|
||||
"Continue": "Continue",
|
||||
"Please enter a valid email address": "Please enter a valid email address",
|
||||
"Order Amount": "Order Amount",
|
||||
"Network Cost": "Network Cost",
|
||||
"Already Paid": "Already Paid",
|
||||
"Due": "Due",
|
||||
"Scan": "Scan",
|
||||
"Copy": "Copy",
|
||||
"Conversion": "Conversion",
|
||||
"Open in wallet": "Open in wallet",
|
||||
"CompletePay_Body": "To complete your payment, please send {{btcDue}} {{cryptoCode}} to the address below.",
|
||||
"Amount": "Amount",
|
||||
"Address": "Address",
|
||||
"Copied": "Copied",
|
||||
"ConversionTab_BodyTop": "You can pay {{btcDue}} {{cryptoCode}} using altcoins other than the ones merchant directly supports.",
|
||||
"ConversionTab_BodyDesc": "This service is provided by 3rd party. Please keep in mind that we have no control over how providers will forward your funds. Invoice will only be marked paid once funds are received on {{cryptoCode}} Blockchain.",
|
||||
"ConversionTab_CalculateAmount_Error": "Retry",
|
||||
"ConversionTab_LoadCurrencies_Error": "Retry",
|
||||
"ConversionTab_Lightning": "No conversion providers available for Lightning Network payments.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Please select a currency to convert from",
|
||||
"Invoice expiring soon...": "Invoice expiring soon...",
|
||||
"Invoice expired": "Invoice expired",
|
||||
"What happened?": "What happened?",
|
||||
"InvoiceExpired_Body_1": "This invoice has expired. An invoice is only valid for {{maxTimeMinutes}} minutes. \nYou can return to {{storeName}} if you would like to submit your payment again.",
|
||||
"InvoiceExpired_Body_2": "If you tried to send a payment, it has not yet been accepted by the network. We have not yet received your funds.",
|
||||
"InvoiceExpired_Body_3": "If we receive it at a later point, we will either process your order or contact you to make refund arrangements...",
|
||||
"Invoice ID": "Invoice ID",
|
||||
"Order ID": "Order ID",
|
||||
"Return to StoreName": "Return to {{storeName}}",
|
||||
"This invoice has been paid": "This invoice has been paid",
|
||||
"This invoice has been archived": "This invoice has been archived",
|
||||
"Archived_Body": "Please contact the store for order information or assistance",
|
||||
"BOLT 11 Invoice": "BOLT 11 Invoice",
|
||||
"Node Info": "Node Info",
|
||||
"txCount": "{{count}} transaction",
|
||||
"txCount_plural": "{{count}} transactions",
|
||||
"Pay with CoinSwitch": "Pay with CoinSwitch",
|
||||
"Pay with Changelly": "Pay with Changelly",
|
||||
"Close": "Close",
|
||||
"NotPaid_ExtraTransaction": "The invoice hasn't been paid in full. Please send another transaction to cover amount Due.",
|
||||
"Recommended_Fee": "Recommended fee: {{feeRate}} sat/byte",
|
||||
"View receipt": "View receipt"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "es-ES",
|
||||
"currentLanguage": "Español",
|
||||
"lang": "Idioma",
|
||||
"Awaiting Payment...": "Esperando el pago...",
|
||||
"Pay with": "Pagar con",
|
||||
"Contact and Refund Email": "Contacto y correo electrónico de reembolso",
|
||||
"Contact_Body": "Por favor indica una dirección de correo electrónico. Nos pondremos en contacto contigo en esta dirección si hay algún problema con tu pago.",
|
||||
"Your email": "Tu correo electrónico",
|
||||
"Continue": "Continuar",
|
||||
"Please enter a valid email address": "Por favor ingresa un correo electrónico válido",
|
||||
"Order Amount": "Total del pedido",
|
||||
"Network Cost": "Costo de la red",
|
||||
"Already Paid": "Ya has pagado",
|
||||
"Due": "Faltante",
|
||||
"Scan": "Escanear",
|
||||
"Copy": "Copiar",
|
||||
"Conversion": "Conversión",
|
||||
"Open in wallet": "Abrir en la billetera",
|
||||
"CompletePay_Body": "Para completar tu pago, envía exactamente {{btcDue}} {{cryptoCode}} a la siguiente dirección:",
|
||||
"Amount": "Cantidad",
|
||||
"Address": "Dirección",
|
||||
"Copied": "Copiado",
|
||||
"ConversionTab_BodyTop": "Puedes pagar {{btcDue}} {{cryptoCode}} usando altcoins que no soportamos directamente.",
|
||||
"ConversionTab_BodyDesc": "Este servicio es prestado por terceros. Ten en cuenta que no tenemos control sobre el reenvío de tus fondos. La factura solo se marcará como pagada una vez se reciban los fondos en la cadena de bloques de {{cryptoCode}}.",
|
||||
"ConversionTab_CalculateAmount_Error": "Reintentar",
|
||||
"ConversionTab_LoadCurrencies_Error": "Reintentar",
|
||||
"ConversionTab_Lightning": "No hay proveedores de conversión disponibles para los pagos con Lightning Network.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Selecciona la moneda a convertir",
|
||||
"Invoice expiring soon...": "La factura expira pronto...",
|
||||
"Invoice expired": "La factura expiró",
|
||||
"What happened?": "¿Qué sucedió?",
|
||||
"InvoiceExpired_Body_1": "Esta factura ha expirado. Una factura solo es válida por {{maxTimeMinutes}} minutos. \nPuedes regresar a {{storeName}} si deseas volver a enviar tu pago.",
|
||||
"InvoiceExpired_Body_2": "Si intentaste enviar un pago, aún no ha sido aceptado por la red. Todavía no hemos recibido tus fondos.",
|
||||
"InvoiceExpired_Body_3": "Si recibimos el pago despues, procesaremos tu orden o te contactaremos para un reembolso...",
|
||||
"Invoice ID": "ID de la factura",
|
||||
"Order ID": "ID del pedido",
|
||||
"Return to StoreName": "Regresar a {{storeName}}",
|
||||
"This invoice has been paid": "Esta factura ha sido pagada",
|
||||
"This invoice has been archived": "Esta factura ha sido archivada",
|
||||
"Archived_Body": "Por favor, comunícate con la tienda para obtener información de tu pedido o asistencia",
|
||||
"BOLT 11 Invoice": "Factura BOLT 11",
|
||||
"Node Info": "Información del nodo",
|
||||
"txCount": "{{count}} transacción",
|
||||
"txCount_plural": "{{count}} transacciones",
|
||||
"Pay with CoinSwitch": "Pagar con CoinSwitch",
|
||||
"Pay with Changelly": "Pagar con Changelly",
|
||||
"Close": "Cerrar",
|
||||
"NotPaid_ExtraTransaction": "La factura no ha sido pagada en su totalidad. Por favor envía otra transacción para cubrir el monto faltante.",
|
||||
"Recommended_Fee": "Comisión recomendada: {{feeRate}} sat/byte",
|
||||
"View receipt": "Ver recibo"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "fa",
|
||||
"currentLanguage": "فارسی",
|
||||
"lang": "زبان",
|
||||
"Awaiting Payment...": "منتظر پرداخت...",
|
||||
"Pay with": "پرداخت با",
|
||||
"Contact and Refund Email": "ایمیل جهت باز پرداخت و ارتباط",
|
||||
"Contact_Body": "لطفا ایمیلی در اختیار قرار دهید. در صورت بروز مشکل در پرداخت ما توسط این آدرس با شما ارتباط برقرار خواهیم کرد.",
|
||||
"Your email": "ایمیل شما",
|
||||
"Continue": "ادامه",
|
||||
"Please enter a valid email address": "لطفا یک آدرس ایمیل معتبر وارد کنید",
|
||||
"Order Amount": "مقدار سفارش",
|
||||
"Network Cost": "هزینه شبکه",
|
||||
"Already Paid": "پرداخت شده",
|
||||
"Due": "کارمزد",
|
||||
"Scan": "اسکن",
|
||||
"Copy": "کپی",
|
||||
"Conversion": "تبدیل",
|
||||
"Open in wallet": "در کیف پول باز کن",
|
||||
"CompletePay_Body": "جهت تکمیل فرایند , لطفا مقدار {{btcDue}} {{cryptoCode}} را به آدرس زیر ارسال کنید.",
|
||||
"Amount": "مقدار",
|
||||
"Address": "آدرس",
|
||||
"Copied": "کپی شده",
|
||||
"ConversionTab_BodyTop": "شما جهت پرداخت {{btcDue}} {{cryptoCode}} می توانید از آلت کوین ها بجای ارز متداول پذیرنده استفاده کنید.",
|
||||
"ConversionTab_BodyDesc": "این سرویس توسط شخص سوم فراهم شده است. لطفا در نظر داشته باشید ما کنترلی در نحوه ارسال پول شما توسط آنها را نداریم. زمانی که ما {{cryptoCode}} در بلاکچین دریافت کنیم درخواست شما پرداخته شده محسوب می شود.",
|
||||
"ConversionTab_CalculateAmount_Error": "تلاش مجدد",
|
||||
"ConversionTab_LoadCurrencies_Error": "تلاش مجدد",
|
||||
"ConversionTab_Lightning": "در شبکه لایتنینگ جهت انجام تبدیل سرویس دهنده ای موجود نیست.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "لطفا ارزی را برای تبدیل از آن انتخاب کنید",
|
||||
"Invoice expiring soon...": "درخواست بزودی منقضی می شود...",
|
||||
"Invoice expired": "درخواست منقضی شد",
|
||||
"What happened?": "چه اتفاقی افتاد؟",
|
||||
"InvoiceExpired_Body_1": "این درخواست منقضی شده است. یک درخواست فقط برای {{maxTimeMinutes}} دقیقه اعتبار دارد. \nشما می توانید برگردید به {{storeName}} اگر می خواهید پرداخت خود را دوباره انجام دهید.",
|
||||
"InvoiceExpired_Body_2": "اگر شما در تلاش ارسال مبلغی هستید , که توسط شبکه قبول نشده باشه. پس ما هنوز پول شما را دریافت نکرده ایم.",
|
||||
"InvoiceExpired_Body_3": "اگر بعدا دریافتش کردیم , عملیات باز پرداخت سفارش شما انجام می شود و یا جهت عودت مبلغ با شما هماهنگ می شویم...",
|
||||
"Invoice ID": "کد درخواست",
|
||||
"Order ID": "کد سفارش",
|
||||
"Return to StoreName": "بر گشت به {{storeName}}",
|
||||
"This invoice has been paid": "این درخواست پرداخت شده",
|
||||
"This invoice has been archived": "این درخواست آرشیو شده",
|
||||
"Archived_Body": "برای رسیدگی یا اطلاع از سفارش خود لطفا با فروشگاه تماس بگیرید",
|
||||
"BOLT 11 Invoice": "درخواست BOLT 11",
|
||||
"Node Info": "اطلاعات نود",
|
||||
"txCount": "تراکنش {{count}}",
|
||||
"txCount_plural": "تراکنشها {{count}}",
|
||||
"Pay with CoinSwitch": "پرداخت با CoinSwitch",
|
||||
"Pay with Changelly": "پرداخت با Changelly",
|
||||
"Close": "بستن",
|
||||
"NotPaid_ExtraTransaction": "درخواست بصورت کامل پرداخت نشده. لطفا ما به التفاوت را با تراکنشی دیگر ارسال کنید.",
|
||||
"Recommended_Fee": "کارمزد پیشنهادی : {{feeRate}} sat/byte",
|
||||
"View receipt": "مشاهده رسید"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "fi-FI",
|
||||
"currentLanguage": "Suomi",
|
||||
"lang": "Kieli",
|
||||
"Awaiting Payment...": "Odotaa maksua...",
|
||||
"Pay with": "Maksa käyttämällä",
|
||||
"Contact and Refund Email": "Sähköpostiosoite yhteydenottoa ja maksupalautusta varten",
|
||||
"Contact_Body": "Lisää sähköpostiosoite alla olevaan kenttään. Olemme yhteydessä tähän osoitteeseen mahdollisissa maksuun liittyvissä ongelmatapauksissa.",
|
||||
"Your email": "Sähköpostiosoitteesi",
|
||||
"Continue": "Jatka",
|
||||
"Please enter a valid email address": "Lisää voimassaoleva sähköpostiosoite",
|
||||
"Order Amount": "Tilauksen määrä",
|
||||
"Network Cost": "Verkon kustannukset",
|
||||
"Already Paid": "Jo maksettu",
|
||||
"Due": "Eräpäivä",
|
||||
"Scan": "Skannaa",
|
||||
"Copy": "Kopioi",
|
||||
"Conversion": "Vaihtokurssi",
|
||||
"Open in wallet": "Avaa lompakossa",
|
||||
"CompletePay_Body": "Viimeistelläksesi maksusi, lähetä {{btcDue}} {{cryptoCode}} allaolevaan osoitteeseen.",
|
||||
"Amount": "Summa",
|
||||
"Address": "Osoite",
|
||||
"Copied": "Kopioitu",
|
||||
"ConversionTab_BodyTop": "Voit maksaa {{btcDue}} {{cryptoCode}} käyttämällä vaihtoehtoisia kryptovaluuttoja, joita palveluntarjoasi ei suoraan hyväksy.",
|
||||
"ConversionTab_BodyDesc": "Tämän palvelun tarjoaa 3:s osapuoli. Huomioithan, että emme pysty kontrolloimaan miten nämä palveluntarjoajat käsittelevät varojasi. Lasku merkitään maksetuksi, vasta kun varat on vastaanotettu {{cryptoCode}} lohkoketjussa.",
|
||||
"ConversionTab_CalculateAmount_Error": "Yritä uudelleen",
|
||||
"ConversionTab_LoadCurrencies_Error": "Yritä uudelleen",
|
||||
"ConversionTab_Lightning": "Vaihtokurssin suorittajia ei ole saatavilla Lightning -verkon maksuille.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Valitse valuutta josta vaihto suoritetaan",
|
||||
"Invoice expiring soon...": "Lasku vanhenee pian...",
|
||||
"Invoice expired": "Lasku on vanhentunut",
|
||||
"What happened?": "Mitä tapahtui?",
|
||||
"InvoiceExpired_Body_1": "Lasku on vanhentunut. Lasku on ainoastaan voimassa {{maxTimeMinutes}} minuuttia.\nVoit palata takaisin {{storeName}} jos haluat lähettää maksusi uudelleen.",
|
||||
"InvoiceExpired_Body_2": "Jos olet yrittänyt lähettää maksun, sitä ei ole vielä hyväksytty verkossa. Emme ole vielä vastaanottaneet maksuasi.",
|
||||
"InvoiceExpired_Body_3": "Jos saamme sen myöhemmässä vaiheessa, me joko käsittelemme tilauksen tai otamme sinuun yhteyttä tehdäksemme hyvitysjärjestelyt...",
|
||||
"Invoice ID": "Laskun tunniste",
|
||||
"Order ID": "Tilauksen tunniste",
|
||||
"Return to StoreName": "Palaa takaisin {{storeName}}",
|
||||
"This invoice has been paid": "Tämä lasku on maksettu",
|
||||
"This invoice has been archived": "Tämä lasku on tallennettu arkistoon",
|
||||
"Archived_Body": "Ota yhteyttä myymälään saadaksesi tilaustietoja tai apua",
|
||||
"BOLT 11 Invoice": "BOLT 11 -lasku",
|
||||
"Node Info": "Solmun tiedot",
|
||||
"txCount": "{{count}} siirto",
|
||||
"txCount_plural": "{{count}} siirrot",
|
||||
"Pay with CoinSwitch": "Maksa käyttäen CoinSwitch:iä",
|
||||
"Pay with Changelly": "Maksa käyttäen Changelly:ä",
|
||||
"Close": "Sulje",
|
||||
"NotPaid_ExtraTransaction": "Laskua ei ole maksettu kokonaan. Lähetä uusi maksu erääntyvän summan kattamiseksi.",
|
||||
"Recommended_Fee": "Suositeltu siirtomaksu: {{feeRate}} sat/tavu",
|
||||
"View receipt": "Näytä kuitti"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "fr-FR",
|
||||
"currentLanguage": "Français",
|
||||
"lang": "Langue",
|
||||
"Awaiting Payment...": "En attente du paiement...",
|
||||
"Pay with": "Payer avec",
|
||||
"Contact and Refund Email": "Adresse de contact et de remboursement",
|
||||
"Contact_Body": "Merci de renseigner l’adresse email ci-dessous. Nous vous contacterons à cette adresse si il y a un problème avec votre paiement.",
|
||||
"Your email": "Votre email",
|
||||
"Continue": "Continuer",
|
||||
"Please enter a valid email address": "Merci de saisir une addrese email valide",
|
||||
"Order Amount": "Montant de la commande",
|
||||
"Network Cost": "Coût réseau",
|
||||
"Already Paid": "Déjà payé",
|
||||
"Due": "Reste à payer",
|
||||
"Scan": "Scanner",
|
||||
"Copy": "Copier",
|
||||
"Conversion": "Convertir",
|
||||
"Open in wallet": "Ouvrir le portefeuille",
|
||||
"CompletePay_Body": "Pour terminer le paiement, merci d’envoyer {{btcDue}} {{cryptoCode}} à l'adresse ci-dessous.",
|
||||
"Amount": "Montant",
|
||||
"Address": "Adresse",
|
||||
"Copied": "Copié",
|
||||
"ConversionTab_BodyTop": "Vous pouvez payer {{btcDue}} {{cryptoCode}} en utilisant d’autres crypto-monnaies alternatives non supportées directement par le marchand.",
|
||||
"ConversionTab_BodyDesc": "Ce service est fourni par un tiers. Nous n’avons aucun contrôle sur la façon dont seront traités vos fonds. La facture sera considérée payée seulement quand les fonds seront reçus sur la blockchain {{ cryptoCode }}.",
|
||||
"ConversionTab_CalculateAmount_Error": "Recommencer",
|
||||
"ConversionTab_LoadCurrencies_Error": "Recommencer",
|
||||
"ConversionTab_Lightning": "Le service de conversion n’est pas disponible pour les paiements sur le Lightning Network.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Merci de sélectionner la monnaie que vous voulez convertir",
|
||||
"Invoice expiring soon...": "La facture va bientôt expirer...",
|
||||
"Invoice expired": "Facture expirée",
|
||||
"What happened?": "Que s'est-il passé ?",
|
||||
"InvoiceExpired_Body_1": "La facture a expiré. Une facture est valide seulement {{maxTimeMinutes}} minutes. \nSi vous voulez soumettre à nouveau votre paiement, vous pouvez revenir sur {{storeName}} .",
|
||||
"InvoiceExpired_Body_2": "Si vous avez envoyé un paiement, ce dernier n'a pas encore été inscrit dans la blockchain. Nous n'avons pas reçu vos fonds.",
|
||||
"InvoiceExpired_Body_3": "Si nous recevons votre paiement plus tard, nous traiterons votre commande ou nous vous contacterons pour le remboursement.",
|
||||
"Invoice ID": "Numéro de facture",
|
||||
"Order ID": "Numéro de commande",
|
||||
"Return to StoreName": "Retourner sur {{storeName}}",
|
||||
"This invoice has been paid": "Cette facture a été payée",
|
||||
"This invoice has been archived": "Cette facture a été archivée",
|
||||
"Archived_Body": "Merci de contacter le marchand pour obtenir de l'aide ou des informations sur cette commande",
|
||||
"BOLT 11 Invoice": "Facture BOLT 11",
|
||||
"Node Info": "Informations sur le nœud",
|
||||
"txCount": "{{count}} transaction",
|
||||
"txCount_plural": "{{count}} transactions",
|
||||
"Pay with CoinSwitch": "Payer avec CoinSwitch",
|
||||
"Pay with Changelly": "Payer avec Changelly",
|
||||
"Close": "Fermer",
|
||||
"NotPaid_ExtraTransaction": "La facture n’a pas été réglée dans sa totalité. Veuillez envoyer une autre transaction pour la compléter.",
|
||||
"Recommended_Fee": "Frais recommandés: {{feeRate}} sat/byte",
|
||||
"View receipt": "Voir le reçu"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "he",
|
||||
"currentLanguage": "עברית",
|
||||
"lang": "שפה",
|
||||
"Awaiting Payment...": "ממתין לתשלום...",
|
||||
"Pay with": "תשלום עם",
|
||||
"Contact and Refund Email": "דוא\"ל ליצירת קשר והחזר",
|
||||
"Contact_Body": "נא להזין כתובת דוא\"ל למטה. אנו ניצור אתך קשר בכתובת זו במקרה של בעיה עם התשלום שלך.",
|
||||
"Your email": "הדוא\"ל שלך",
|
||||
"Continue": "המשך",
|
||||
"Please enter a valid email address": "נא להזין כתובת דוא\"ל תקינה",
|
||||
"Order Amount": "סכום הזמנה",
|
||||
"Network Cost": "עלות רשת",
|
||||
"Already Paid": "כבר שולם",
|
||||
"Due": "חוב",
|
||||
"Scan": "סריקה",
|
||||
"Copy": "העתקה",
|
||||
"Conversion": "המרה",
|
||||
"Open in wallet": "פתיחת ארנק",
|
||||
"CompletePay_Body": "להשלמת התשלום, נא לשלוח {{btcDue}} {{cryptoCode}} לכתובת למטה.",
|
||||
"Amount": "סכום",
|
||||
"Address": "כתובת",
|
||||
"Copied": "הועתק",
|
||||
"ConversionTab_BodyTop": "ניתן לשלם {{cryptoCode}} {{btcDue}} בעזרת שיטקוינים אחרים מאלו שהמוכר/ת מקבל/ת ישירות.",
|
||||
"ConversionTab_BodyDesc": "שירות זה מסופק על ידי צד שלישי. זכרו שאין לנו שליטה על איך ספקים יעבירו את הכסף שלכם. החשבונית תסומן כשולמה כאשר הכספים מתקבלים על שרשרת הבלוקים של {{cryptocode}}.",
|
||||
"ConversionTab_CalculateAmount_Error": "נסו שוב",
|
||||
"ConversionTab_LoadCurrencies_Error": "נסו שוב",
|
||||
"ConversionTab_Lightning": "לא זמינים ספקי המרה לתשלומים לרשת הברק.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "נא לבחור מטבע להמיר",
|
||||
"Invoice expiring soon...": "חשבונית תפוג תוקף בקרוב...",
|
||||
"Invoice expired": "חשבונית פגה תוקף",
|
||||
"What happened?": "מה קרה?",
|
||||
"InvoiceExpired_Body_1": "חשבונית זו פגה תוקף. חשבונית תקפה רק למשך {{maxTimeMinutes}} דקות.\nניתן לחזור אל {{storeName}} אם ברצונך לשלוח את תשלומך שוב.",
|
||||
"InvoiceExpired_Body_2": "אם ניסית לשלוח תשלום, הוא תרם התקבל על ידי הרשת. עדיין לא קיבלנו את הכספים שלך.",
|
||||
"InvoiceExpired_Body_3": "אם נקבל זאת במועד מאוחר יותר, אנחנו נטפל בהזמנתך, או לחלופין ניצור אתך קשר להסדרת החזר...",
|
||||
"Invoice ID": "מספר חשבונית",
|
||||
"Order ID": "מספר הזמנה",
|
||||
"Return to StoreName": "חזרה אל {{storeName}}",
|
||||
"This invoice has been paid": "החשבונית שולמה",
|
||||
"This invoice has been archived": "חשבונית זו נגנזה",
|
||||
"Archived_Body": "נא לפנות לחנות למידע על הזמנה או סיוע",
|
||||
"BOLT 11 Invoice": "חשבונית BOLT 11",
|
||||
"Node Info": "מידע צומת",
|
||||
"txCount": "{{count}} פעולה",
|
||||
"txCount_plural": "{{count}} פעולות",
|
||||
"Pay with CoinSwitch": "תשלום עם CoinSwitch",
|
||||
"Pay with Changelly": "תשלום עם Changelly",
|
||||
"Close": "סגירה",
|
||||
"NotPaid_ExtraTransaction": "החשבונית לא שולמה במלואה. נא לשלוח תשלום נוסף לכיסוי סכום החוב.",
|
||||
"Recommended_Fee": "עמלה מומלצת: {{feeRate}} סאט/בית",
|
||||
"View receipt": "הצג קבלה"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "hi",
|
||||
"currentLanguage": "हिंदी",
|
||||
"lang": "भाषा",
|
||||
"Awaiting Payment...": "भुगतान की प्रतीक्षा कर रहे हैं…",
|
||||
"Pay with": "आप कैसे भुगतान करना चाहते है",
|
||||
"Contact and Refund Email": "संपर्क और धनवापसी ईमेल",
|
||||
"Contact_Body": "कृपया नीचे एक ईमेल पता प्रदान करें। यदि आपके भुगतान में कोई समस्या होती है तो हम इस पते पर आपसे संपर्क करेंगे।",
|
||||
"Your email": "आपका ईमेल",
|
||||
"Continue": "आगे",
|
||||
"Please enter a valid email address": "कृपया एक वैध ईमेल पता प्रदान करें",
|
||||
"Order Amount": "ऑर्डर की राशि",
|
||||
"Network Cost": "नेटवर्क ख़र्च",
|
||||
"Already Paid": "भुगतान किया जा चुका है",
|
||||
"Due": "देय",
|
||||
"Scan": "स्कैन करें",
|
||||
"Copy": "कॉपी करें",
|
||||
"Conversion": "रूपांतरण",
|
||||
"Open in wallet": "वॉलेट खोलें",
|
||||
"CompletePay_Body": "अपना भुगतान पूरा करने के लिए, कृपया नीचे दिए गए पते पर {{btcDue}} {{cryptoCode}} भेजें.",
|
||||
"Amount": "राशि",
|
||||
"Address": "चालान नंबर",
|
||||
"Copied": "कॉपी किया गया",
|
||||
"ConversionTab_BodyTop": "आप मर्चेंट द्वारा सीधे समर्थित भुगतान विकल्पों के मुकाबले {{btcDue}} {{cryptoCode}} का भुगतान altcoins के द्वारा भी कर सकते हैं।.",
|
||||
"ConversionTab_BodyDesc": "यह सेवा तीसरी पार्टी द्वारा प्रदान की जाती है। कृपया ध्यान रखें कि प्रदाता आपके धन को कैसे आगे बढ़ाएंगे इस पर हमारा कोई नियंत्रण नहीं है। केवल {{cryptoCode}} ब्लॉकचेन पर धन प्राप्त होने के बाद ही चालान का भुगतान माना जाएगा।.",
|
||||
"ConversionTab_CalculateAmount_Error": "पुनः प्रयास करें",
|
||||
"ConversionTab_LoadCurrencies_Error": "पुनः प्रयास करें",
|
||||
"ConversionTab_Lightning": "लाइटनिंग नेटवर्क भुगतान के लिए कोई मुद्रा परिवर्तन प्रदाता उपलब्ध नहीं है।",
|
||||
"ConversionTab_CurrencyList_Select_Option": "कृपया परिवर्तित करने के लिए एक मुद्रा चुनें",
|
||||
"Invoice expiring soon...": "चालान जल्द ही समाप्त हो जाएगा...",
|
||||
"Invoice expired": "चालान की समय सीमा समाप्त हो चुकी",
|
||||
"What happened?": "क्या हुआ?",
|
||||
"InvoiceExpired_Body_1": "इस चालान की समय सीमा समाप्त हो चुकी। कोई भी चालान केवल {{maxTimeMinutes}} मिनटों के लिए वैध रहता है। \nयदि आप अपना भुगतान फिर से करना चाहते हैं तो आप {{storeName}} पर वापस जा सकते हैं।",
|
||||
"InvoiceExpired_Body_2": "यदि आपने भुगतान भेजने का प्रयास किया है, तो इसे अभी तक नेटवर्क द्वारा स्वीकार नहीं किया गया है। हमें अभी तक आपकी राशि प्राप्त नहीं हुई है।",
|
||||
"InvoiceExpired_Body_3": "यदि हम इसे बाद में प्राप्त करते हैं, तो हम आपके ऑर्डर की प्रक्रिया करेंगे या धनवापसी की व्यवस्था करने के लिए आपसे संपर्क करेंगे ...",
|
||||
"Invoice ID": "चालान नंबर",
|
||||
"Order ID": "आर्डर नंबर",
|
||||
"Return to StoreName": "{{storeName}} पर वापस जाएं",
|
||||
"This invoice has been paid": "इस चालान का भुगतान हो चुका है",
|
||||
"This invoice has been archived": "यह चालान संग्रहीत कर दिया गया है",
|
||||
"Archived_Body": "ऑर्डर जानकारी या सहायता के लिए स्टोर से संपर्क करें",
|
||||
"BOLT 11 Invoice": "BOLT 11 चालान",
|
||||
"Node Info": "नोड जानकारी",
|
||||
"txCount": "{{count}} लेनदेन",
|
||||
"txCount_plural": "{{count}} लेनदेनों",
|
||||
"Pay with CoinSwitch": "CoinSwitch द्वारा भुगतान करें",
|
||||
"Pay with Changelly": "Changelly द्वारा भुगतान करें",
|
||||
"Close": "बंद करे",
|
||||
"NotPaid_ExtraTransaction": "चालान का पूरा भुगतान नहीं किया गया है। कृपया चालान राशि पूरी करें।",
|
||||
"Recommended_Fee": "अनुशंसित शुल्क: {{शुल्क दर}} सैट/बाइट ",
|
||||
"View receipt": "रसीद देखें"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "hr-HR",
|
||||
"currentLanguage": "Hrvatski",
|
||||
"lang": "Croatian",
|
||||
"Awaiting Payment...": "Čekamo uplatu...",
|
||||
"Pay with": "Plati sa",
|
||||
"Contact and Refund Email": "E-mail za kontakt i povrat sredstava",
|
||||
"Contact_Body": "Molimo upišite Vašu e-mail adresu. Kontaktirat ćemo Vas ukoliko bude potrebe.",
|
||||
"Your email": "Vaš e-mail",
|
||||
"Continue": "Dalje",
|
||||
"Please enter a valid email address": "Molimo unesite ispravnu e-mail adresu",
|
||||
"Order Amount": "Količina",
|
||||
"Network Cost": "Trošak mreže",
|
||||
"Already Paid": "Već plaćeno",
|
||||
"Due": "Rok",
|
||||
"Scan": "Skeniraj",
|
||||
"Copy": "Kopiraj",
|
||||
"Conversion": "Pretvori",
|
||||
"Open in wallet": "Otvori u novčaniku",
|
||||
"CompletePay_Body": "Kako bi završili uplatu pošaljite {{btcDue}} {{cryptoCode}} na navedenu adresu",
|
||||
"Amount": "Iznos",
|
||||
"Address": "Adresa",
|
||||
"Copied": "Kopirano",
|
||||
"ConversionTab_BodyTop": "Možete platiti {{btcDue}} {{cryptoCode}} pomoću altcoina koje prodavač ne podržava.",
|
||||
"ConversionTab_BodyDesc": "Ovu usluga pruža treća strana. Vodite računa da nemamo kontroli nad načinom kako će Vam davatelji usluge proslijediti sredstva. Vodite računa da je račun plaćen tek kada su primljena sredstva na {{cryptoCode}} Blockchainu.",
|
||||
"ConversionTab_CalculateAmount_Error": "Ponovi",
|
||||
"ConversionTab_LoadCurrencies_Error": "Ponovi",
|
||||
"ConversionTab_Lightning": "Ne postoji treća strana koja bi konvertirala Lightning Network uplate.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Odaberite valutu koju želite pretvoriti",
|
||||
"Invoice expiring soon...": "Račun uskoro ističe...",
|
||||
"Invoice expired": "Račun je istekao",
|
||||
"What happened?": "Što se dogodilo",
|
||||
"InvoiceExpired_Body_1": "Račun je istekao i nije više valjan. Račun vrijedi samo {{maxTimeMinutes}} minuta. \nMožete se vratiti na {{storeName}}, gdje možete ponovo inicirati plaćanje.",
|
||||
"InvoiceExpired_Body_2": "Ako ste pokušali poslati uplatu, ista nije registrirana na Blockchainu. Nismo još zaprimili Vašu uplatu.",
|
||||
"InvoiceExpired_Body_3": "Ako ga primimo u kasnijem trenutku, obradit ćemo vašu narudžbu ili ćemo vas kontaktirati radi dogovora oko povrata novca...",
|
||||
"Invoice ID": "Broj računa",
|
||||
"Order ID": "Broj narudžbe",
|
||||
"Return to StoreName": "Vrati se na {{storeName}}",
|
||||
"This invoice has been paid": "Račun je plaćen",
|
||||
"This invoice has been archived": "Račun je arhiviran",
|
||||
"Archived_Body": "Kontaktirajte dućan za detalje oko narudžbe ili pomoć",
|
||||
"BOLT 11 Invoice": "BOLT 11 račun",
|
||||
"Node Info": "Informacije o čvoru",
|
||||
"txCount": "{{count}} transakcija",
|
||||
"txCount_plural": "{{count}} transakcije",
|
||||
"Pay with CoinSwitch": "Platite putem CoinSwitch-a",
|
||||
"Pay with Changelly": "Platite putem Changelly-ja",
|
||||
"Close": "Zatvori",
|
||||
"NotPaid_ExtraTransaction": "Račun nije u potpunosti plaćen. Molimo pošaljite novu transakciju kako bi pokrili iznos koji je preostao.",
|
||||
"Recommended_Fee": "Preporučena naknada: {{feeRate}} sat/bajt",
|
||||
"View receipt": "Pregledajte račun"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "hu-HU",
|
||||
"currentLanguage": "Magyar",
|
||||
"lang": "Nyelv",
|
||||
"Awaiting Payment...": "A fizetés még folyamatban...",
|
||||
"Pay with": "Fizetési mód kiválasztása",
|
||||
"Contact and Refund Email": "e-mail cím kapcsolattartáshoz és visszautaláshoz",
|
||||
"Contact_Body": "Kérjük adja meg az e-mail címét. Abban az esetben ha felmerülne valami a fizetése kapcsán, ezen az e-mail címen fogjuk értesíteni.",
|
||||
"Your email": "e-mail címe",
|
||||
"Continue": "Tovább",
|
||||
"Please enter a valid email address": "Kérjük adjon meg egy érvényes e-mail címet",
|
||||
"Order Amount": "Rendelés összege",
|
||||
"Network Cost": "Hálozat költsége",
|
||||
"Already Paid": "Már befizetve",
|
||||
"Due": "Fennálló összeg",
|
||||
"Scan": "Szkennelés",
|
||||
"Copy": "Másolás",
|
||||
"Conversion": "Átváltás",
|
||||
"Open in wallet": "Nyisd ki a pénztárcában",
|
||||
"CompletePay_Body": "A fizetés végrehajtásához, kérjük küldjön {{btcDue}} {{cryptoCode}} az alábbi címre.",
|
||||
"Amount": "Összeg",
|
||||
"Address": "Cím",
|
||||
"Copied": "Másolva",
|
||||
"ConversionTab_BodyTop": "Fizethet {{btcDue}} {{cryptoCode}} olyan altcoin-okkal melyeket a kereskedő nem támogat közvetlenlül.",
|
||||
"ConversionTab_BodyDesc": "Ezt a szolgáltatást harmadik fél nyújtja. Kérjük figyelembe venni, hogy nem áll módunkban befolyásolni a szolgáltatók hogyan fogják továbbítani a pénzét. A számla csak akkor lesz fizetettként jelölve, miután a tranzakciója megérkezett a {{cryptoCode}} Blockchain-re. ",
|
||||
"ConversionTab_CalculateAmount_Error": "Próbáld újra",
|
||||
"ConversionTab_LoadCurrencies_Error": "Próbáld újra",
|
||||
"ConversionTab_Lightning": "A Lightning Network tranzakciók támogatására átváltási szolgáltató nem található",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Valuta kiválasztása a konvertáláshoz",
|
||||
"Invoice expiring soon...": "A számla rövidesen le fog járni...",
|
||||
"Invoice expired": "A számla lejárt",
|
||||
"What happened?": "Mi történt?",
|
||||
"InvoiceExpired_Body_1": "Ez a számla lejárt. A számla csak {{maxTimeMinutes}} percig érvényes. \nHa a fizetést újra szeretné indítani, visszaléphet a(z) {{storeName}} boltba ",
|
||||
"InvoiceExpired_Body_2": "Abban az esetben ha fizetni próbált, a hálozát nem fogadta el a tanzakciót. Befizetése még nem érkezett meg.",
|
||||
"InvoiceExpired_Body_3": "Ha a tranzakciója később érkezne meg hozzánk, megbízását feldolgozzuk, vagy a visszautalás megbeszélése érdekében, kapcsolatba lépünk Önnel... ",
|
||||
"Invoice ID": "Számla azonosító",
|
||||
"Order ID": "Megbízás azonosítója",
|
||||
"Return to StoreName": "Vissza a(z) {{storeName}} boltba",
|
||||
"This invoice has been paid": "A számla kifizetve",
|
||||
"This invoice has been archived": "A számla archiválva",
|
||||
"Archived_Body": "Rendelési információkhoz vagy ha támogatásra szorul, kérjük lépjen kapcsolatba az eladóval",
|
||||
"BOLT 11 Invoice": "BOLT 11 számla",
|
||||
"Node Info": "Node információ",
|
||||
"txCount": "{{count}} tranzakció",
|
||||
"txCount_plural": "{{count}} tranzakció",
|
||||
"Pay with CoinSwitch": "Fizess CoinSwitch-csel",
|
||||
"Pay with Changelly": "Fizess Changelly-vel",
|
||||
"Close": "Bezár",
|
||||
"NotPaid_ExtraTransaction": "Az számla nincs teljesen kifizetve. Kérjük, küldjön egy újabb tranzakciót az esedékes összeg kifizetésére.",
|
||||
"Recommended_Fee": "Javasolt díj: {{feeRate}} sat/bájt",
|
||||
"View receipt": "Nyugtát megtekintése"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "hy",
|
||||
"currentLanguage": "Հայերեն",
|
||||
"lang": "Լեզու",
|
||||
"Awaiting Payment...": "Վճարման սպասում․․․",
|
||||
"Pay with": "Վճարման եղանակ ",
|
||||
"Contact and Refund Email": "Կոնտակտային էլ․ փոստ ",
|
||||
"Contact_Body": "Խնդրում ենք ստորև տրամադրել էլ․ փոստի հասցե։ Մենք կապ կհաստատենք Ձեզ հետ այս հասցեով, եթե Ձեր վճարման հետ կապված խնդիր առաջանա։ ",
|
||||
"Your email": "Ձեր էլ․ փոստը",
|
||||
"Continue": "Շարունակել ",
|
||||
"Please enter a valid email address": "Խնդրում ենք մուտքագրել վավեր էլ․ փոստի հասցե ",
|
||||
"Order Amount": "Պատվերի գումարը ",
|
||||
"Network Cost": "Ցանցի արժեքը",
|
||||
"Already Paid": "Արդեն վճարված է",
|
||||
"Due": "Վճարման ենթակա է",
|
||||
"Scan": "Սկանավորել ",
|
||||
"Copy": "Պատճենել",
|
||||
"Conversion": "Փոխարկում",
|
||||
"Open in wallet": "Բացել դրամապանակը",
|
||||
"CompletePay_Body": "Ձեր վճարումն ավարտելու համար խնդրում ենք ուղարկել {{btcDue}} {{cryptoCode}} ստորև նշված հասցեին:",
|
||||
"Amount": "Գումար",
|
||||
"Address": "Հասցե",
|
||||
"Copied": "Պատճենված է ",
|
||||
"ConversionTab_BodyTop": "Դուք կարող եք վճարել {{btcDue}} {{cryptoCode}} օգտագործելով altcoin ՝ ոչ միայն նրանք, որոնք խանութը ընդունում է։",
|
||||
"ConversionTab_BodyDesc": "Այս ծառայությունը մատուցվում է 3-րդ կողմից: Խնդրում ենք նկատի ունենալ, որ մենք վերահսկողություն չունենք, թե ինչպես են մատակարարները փոխանցում ձեր միջոցները: Հաշիվը կհամարվի վճարված միայն {{cryptoCode}} Blockchain -ում միջոցները ստանալուց։",
|
||||
"ConversionTab_CalculateAmount_Error": "Կրկին փորձել ",
|
||||
"ConversionTab_LoadCurrencies_Error": "Կրկին փորձել ",
|
||||
"ConversionTab_Lightning": "Փոխարկման մատակարարներ առկա չեն Lightning Network-ի վճարումների համար:",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Խնդրում ենք ընտրել արժույթ, որից փոխարկել",
|
||||
"Invoice expiring soon...": "Հաշիվի ժամկետը շուտով լրանում է․․․",
|
||||
"Invoice expired": "Հաշիվի ժամկետը լրացել է ",
|
||||
"What happened?": "Ի՞նչ է պատահել",
|
||||
"InvoiceExpired_Body_1": "Այս հաշվի ժամկետը լրացել է: Հաշիվը վավեր է միայն {{maxTime Minutes}} րոպեի ընթացքում: Կարող եք վերադառնալ {{storeName}}, եթե ցանկանում եք կրկին կատարել ձեր վճարումը:",
|
||||
"InvoiceExpired_Body_2": "Եթե փորձել եք վճար ուղարկել, ապա այն դեռ չի ընդունվել ցանցի կողմից: Մենք դեռ չենք ստացել ձեր դրամական միջոցները:",
|
||||
"InvoiceExpired_Body_3": "Եթե այն ավելի ուշ ստանանք, մենք կմշակենք ձեր պատվերը կամ կկապվենք ձեզ հետ՝ փոխհատուցման պայմանավորվածություններ ձեռք բերելու համար․․․",
|
||||
"Invoice ID": "Հաշվի ID",
|
||||
"Order ID": "Պատվերի ID",
|
||||
"Return to StoreName": "Վերադառնալ {{storeName}}",
|
||||
"This invoice has been paid": "Այս հաշիվը վճարվել է",
|
||||
"This invoice has been archived": "Այս հաշիվը արխիվացվել է",
|
||||
"Archived_Body": "Պատվերի վերաբերյալ տեղեկատվության կամ օգնության համար խնդրում ենք կապվել խանութի հետ",
|
||||
"BOLT 11 Invoice": "BOLT 11 հաշիվ",
|
||||
"Node Info": "Node -ի մասին տեղեկատվություն",
|
||||
"txCount": "{{count}} գործարք",
|
||||
"txCount_plural": "{{count}} գործարքներ",
|
||||
"Pay with CoinSwitch": "Վճարել CoinSwitch-ով",
|
||||
"Pay with Changelly": "Վճարել Changelly-ով",
|
||||
"Close": "Փակել",
|
||||
"NotPaid_ExtraTransaction": "Հաշիվը ամբողջությամբ չի վճարվել: Խնդրում ենք ուղարկել մեկ այլ գործարք՝ մնացած գումարը վճարելու համար:",
|
||||
"Recommended_Fee": "Առաջարկվող վճար: {{feeRate}} sat/byte",
|
||||
"View receipt": "Հաշիվը դիտել"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "id",
|
||||
"currentLanguage": "Bahasa Indonesia",
|
||||
"lang": "Bahasa",
|
||||
"Awaiting Payment...": "Menunggu pembayaran...",
|
||||
"Pay with": "Metode pembayaran",
|
||||
"Contact and Refund Email": "Email untuk kontak dan pengembalian dana anda",
|
||||
"Contact_Body": "Dimohon untuk menyertakan alamat email anda dibawah ini. Kami akan menghubungi anda jika ada kendala dengan pembayaran anda.",
|
||||
"Your email": "Alamat email anda",
|
||||
"Continue": "Lanjutkan",
|
||||
"Please enter a valid email address": "Sertakan alamat email anda yang sah",
|
||||
"Order Amount": "Jumlah pesanan",
|
||||
"Network Cost": "Biaya jaringan",
|
||||
"Already Paid": "Sudah dibayarkan",
|
||||
"Due": "Jatuh tempo",
|
||||
"Scan": "Memindai",
|
||||
"Copy": "Salinan",
|
||||
"Conversion": "Konversi",
|
||||
"Open in wallet": "Membuka dompet",
|
||||
"CompletePay_Body": "Untuk menyelesaikan pembayaran anda, dimohon untuk mengirimkan {{btcDue}} {{cryptoCode}} ke alamat dibawah ini.",
|
||||
"Amount": "Jumlah",
|
||||
"Address": "Alamat",
|
||||
"Copied": "Disalin",
|
||||
"ConversionTab_BodyTop": "Anda dapat membayar {{btcDue}} {{cryptoCode}} menggunakan altcoin selain yang didukung langsung oleh merchant.",
|
||||
"ConversionTab_BodyDesc": "Layanan ini disediakan oleh pihak ke-3. Harap diingat bahwa kami tidak memiliki kendali atas bagaimana penyedia layanan akan meneruskan dana Anda. Tagihan anda hanya akan ditandai dibayar setelah dana diterima di {{cryptoCode}} Blockchain.",
|
||||
"ConversionTab_CalculateAmount_Error": "Mencoba kembali",
|
||||
"ConversionTab_LoadCurrencies_Error": "Mencoba kembali",
|
||||
"ConversionTab_Lightning": "Tidak ada penyedia konversi yang tersedia untuk pembayaran Lightning Network. ",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Silakan pilih mata uang yang akan dikonversi",
|
||||
"Invoice expiring soon...": "Tagihan anda akan berakhir sebentar lagi...",
|
||||
"Invoice expired": "Tagihan kadaluarsa",
|
||||
"What happened?": "Apa yang terjadi?",
|
||||
"InvoiceExpired_Body_1": "Tagihan ini telah kedaluwarsa.Tagihan hanya berlaku selama {{maxTimeMinutes}} menit.\nAnda dapat kembali ke {{storeName}} jika Anda ingin melakukan pembayaran lagi.",
|
||||
"InvoiceExpired_Body_2": "Jika Anda mencoba mengirimkan pembayaran, dan belum diterima oleh jaringan kami. Kami belum menerima dana Anda.",
|
||||
"InvoiceExpired_Body_3": "Jika kami menerimanya di kemudian hari, kami akan memproses pesanan Anda atau menghubungi Anda untuk membuat pengaturan pengembalian dana anda...",
|
||||
"Invoice ID": "Nomor tagihan",
|
||||
"Order ID": "Nomor pesanan",
|
||||
"Return to StoreName": "Dikembalikan ke {{storeName}}",
|
||||
"This invoice has been paid": "Tagihan ini sudah dibayar",
|
||||
"This invoice has been archived": "Tagihan ini sudah disimpan",
|
||||
"Archived_Body": "Silakan hubungi toko untuk informasi pesanan atau bantuan",
|
||||
"BOLT 11 Invoice": "Tagihan BOLT 11",
|
||||
"Node Info": "Info Node",
|
||||
"txCount": "{{count}} transaksi",
|
||||
"txCount_plural": "{{count}} transaksi",
|
||||
"Pay with CoinSwitch": "Bayar dengan CoinSwitch",
|
||||
"Pay with Changelly": "Bayar dengan Changelly",
|
||||
"Close": "Tutup",
|
||||
"NotPaid_ExtraTransaction": "Tagihan ini belum dibayarkan sepenuhnya. Dimohon untuk membayarkan sisa pembayaran anda.",
|
||||
"Recommended_Fee": "Biaya yang disarankan: {{feeRate}} sat/byte",
|
||||
"View receipt": "Lihat tanda terima"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "is-IS",
|
||||
"currentLanguage": "Íslenska",
|
||||
"lang": "Tungumál",
|
||||
"Awaiting Payment...": "Bíð eftir greiðslu...",
|
||||
"Pay with": "Borga með",
|
||||
"Contact and Refund Email": "Netfang",
|
||||
"Contact_Body": "Við munum hafa samband við þig á þessu netfangi ef það er vandamál með greiðsluna þína.",
|
||||
"Your email": "Þitt netfang",
|
||||
"Continue": "Áfram",
|
||||
"Please enter a valid email address": "Þú verður að nota gilt netfang",
|
||||
"Order Amount": "Upphæð",
|
||||
"Network Cost": "Auka gjöld",
|
||||
"Already Paid": "Nú þegar greitt",
|
||||
"Due": "Gjalddagi",
|
||||
"Scan": "Skanna",
|
||||
"Copy": "Afrita",
|
||||
"Conversion": "Umbreyting",
|
||||
"Open in wallet": "Opna með veski",
|
||||
"CompletePay_Body": "Til að klára greiðsluna skaltu senda {{btcDue}} {{cryptoCode}} á lykilinn fyrir neðan.",
|
||||
"Amount": "Magn",
|
||||
"Address": "Lykill",
|
||||
"Copied": "Afritað",
|
||||
"ConversionTab_BodyTop": "Þú getur borgað {{btcDue}} {{cryptoCode}} með altcoins.",
|
||||
"ConversionTab_BodyDesc": "Þessi þjónusta er veitt af þriðja aðila. Mundu að við höfum ekki stjórn á því hvað þeir gera við peningana. Reikningurinn verður aðeins móttekinn þegar {{cryptoCode}} greiðslan hefur verið staðfest á netinu.",
|
||||
"ConversionTab_CalculateAmount_Error": "reyndu aftur",
|
||||
"ConversionTab_LoadCurrencies_Error": "reyndu aftur",
|
||||
"ConversionTab_Lightning": "Engir viðskiptaveitendur eru í boði fyrir Lightning Network greiðslur.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "veldu gjaldmiðil til að breyta frá",
|
||||
"Invoice expiring soon...": "Reikningurinn rennur út fljótlega...",
|
||||
"Invoice expired": "Reikningurinn er útrunnin",
|
||||
"What happened?": "Hvað gerðist?",
|
||||
"InvoiceExpired_Body_1": "Þessi reikningur er útrunnin. Reikningurinn er aðeins gildur í {{maxTimeMinutes}} mínútur. \nÞú getur farið aftur á {{storeName}} ef þú vilt reyna aftur.",
|
||||
"InvoiceExpired_Body_2": "Ef þú reyndir að senda greiðslu, þá hefur hún ekki verið samþykkt.",
|
||||
"InvoiceExpired_Body_3": "Ef greiðslan fæst of seint munum við annað hvort afgreiða pöntunina eða hafa samband við þig varðandi endurgreiðslu...",
|
||||
"Invoice ID": "Innheimtu ID",
|
||||
"Order ID": "Pöntun ID",
|
||||
"Return to StoreName": "Fara aftur á {{storeName}}",
|
||||
"This invoice has been paid": "Þetta hefur verið greitt",
|
||||
"This invoice has been archived": "Þessi reikningur hefur verið gerður ógildur",
|
||||
"Archived_Body": "Vinsamlegast hafðu samband fyrir upplýsingar eða aðstoð",
|
||||
"BOLT 11 Invoice": "BOLT 11 Reikningur",
|
||||
"Node Info": "Nótu upplýsingar",
|
||||
"txCount": "{{count}} reikningur",
|
||||
"txCount_plural": "{{count}} reikningar",
|
||||
"Pay with CoinSwitch": "Borga með Coinswitch",
|
||||
"Pay with Changelly": "Borga með Changelly",
|
||||
"Close": "Loka",
|
||||
"NotPaid_ExtraTransaction": "Reikningurinn hefur ekki verið greiddur að fullu. Vinsamlegast greiddu restina.",
|
||||
"Recommended_Fee": "Ráðlögð þóknun: {{feeRate}} sat/bæti",
|
||||
"View receipt": "Skoða kvittun"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "it-IT",
|
||||
"currentLanguage": "Italiano",
|
||||
"lang": "Lingua",
|
||||
"Awaiting Payment...": "In attesa del Pagamento...",
|
||||
"Pay with": "Paga con",
|
||||
"Contact and Refund Email": "Email di Contatto e Rimborso",
|
||||
"Contact_Body": "Inserisci un indirizzo email qui sotto. Ti contatteremo a questo indirizzo in caso di problemi con il pagamento.",
|
||||
"Your email": "La tua email",
|
||||
"Continue": "Continua",
|
||||
"Please enter a valid email address": "Inserisci un indirizzo email valido",
|
||||
"Order Amount": "Importo dell'Ordine",
|
||||
"Network Cost": "Costi di Rete",
|
||||
"Already Paid": "Già pagato",
|
||||
"Due": "Dovuto",
|
||||
"Scan": "Scansiona",
|
||||
"Copy": "Copia",
|
||||
"Conversion": "Conversione",
|
||||
"Open in wallet": "Apri nel portafoglio",
|
||||
"CompletePay_Body": "Per completare il pagamento, inviare {{btcDue}} {{cryptoCode}} all'indirizzo riportato di seguito.",
|
||||
"Amount": "Importo",
|
||||
"Address": "Indirizzo",
|
||||
"Copied": "Copiato",
|
||||
"ConversionTab_BodyTop": "Puoi pagare {{btcDue}} {{cryptoCode}} usando altcoin diverse da quelle che il commerciante supporta direttamente.",
|
||||
"ConversionTab_BodyDesc": "Questo servizio è fornito da 3° parti. Ricorda che non abbiamo alcun controllo su come tali parti inoltreranno i tuoi fondi. La fattura verrà contrassegnata come pagata solo dopo aver ricevuto i fondi sulla {{cryptoCode}} Blockchain.",
|
||||
"ConversionTab_CalculateAmount_Error": "Riprova",
|
||||
"ConversionTab_LoadCurrencies_Error": "Riprova",
|
||||
"ConversionTab_Lightning": "Nessun fornitore di conversione disponibile per i pagamenti Lightning Network.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Seleziona una valuta da convertire",
|
||||
"Invoice expiring soon...": "Fattura in scadenza a breve...",
|
||||
"Invoice expired": "Fattura scaduta",
|
||||
"What happened?": "Cosa è successo?",
|
||||
"InvoiceExpired_Body_1": "Questa fattura è scaduta. Una fattura è valida solo per {{maxTimeMinutes}} minuti. \nPuoi tornare a {{storeName}} se desideri inviare nuovamente il pagamento.",
|
||||
"InvoiceExpired_Body_2": "Se hai provato ad inviare un pagamento, non è ancora stato accettato dalla rete. Non abbiamo ancora ricevuto i tuoi fondi.",
|
||||
"InvoiceExpired_Body_3": "Se lo riceviamo in un secondo momento, processeremo comunque il tuo ordine o ti contatteremo per rimborsarti...",
|
||||
"Invoice ID": "Numero della Fattura",
|
||||
"Order ID": "Numero dell'Ordine",
|
||||
"Return to StoreName": "Ritorna a {{storeName}}",
|
||||
"This invoice has been paid": "La fattura è stata pagata",
|
||||
"This invoice has been archived": "Questa fattura è stata archiviata",
|
||||
"Archived_Body": "Contatta il negozio per informazioni sull'ordine o per assistenza",
|
||||
"BOLT 11 Invoice": "Fattura BOLT 11",
|
||||
"Node Info": "Informazioni sul Nodo",
|
||||
"txCount": "{{count}} transazione",
|
||||
"txCount_plural": "{{count}} transazioni",
|
||||
"Pay with CoinSwitch": "Paga con CoinSwitch",
|
||||
"Pay with Changelly": "Paga con Changelly",
|
||||
"Close": "Chiudi",
|
||||
"NotPaid_ExtraTransaction": "La fattura non è stata pagata per intero. Per favore effettua una nuova transazione per coprire l'importo dovuto.",
|
||||
"Recommended_Fee": "Fee raccomandate: {{feeRate}} sat/byte",
|
||||
"View receipt": "Visualizza ricevuta"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "ja-JP",
|
||||
"currentLanguage": "日本語",
|
||||
"lang": "言語",
|
||||
"Awaiting Payment...": "お支払いをお待ちしております…",
|
||||
"Pay with": "お支払い方法",
|
||||
"Contact and Refund Email": "問題発生時の連絡先",
|
||||
"Contact_Body": "決済において、何らかの問題が発生した場合こちらのメールアドレスに対して連絡を差し上げることもございますので、ご記入お願い致します。",
|
||||
"Your email": "ご自分のメールアドレス",
|
||||
"Continue": "続ける",
|
||||
"Please enter a valid email address": "有効なメールアドレスをご記入ください",
|
||||
"Order Amount": "注文金額",
|
||||
"Network Cost": "ネットワーク手数料",
|
||||
"Already Paid": "支払い済み金額",
|
||||
"Due": "未払い金額",
|
||||
"Scan": "スキャン",
|
||||
"Copy": "コピー",
|
||||
"Conversion": "変換",
|
||||
"Open in wallet": "ウォレットで開く",
|
||||
"CompletePay_Body": "決済をするために、下記のアドレスに {{btcDue}} {{cryptoCode}} をお送りください",
|
||||
"Amount": "金額",
|
||||
"Address": "アドレス",
|
||||
"Copied": "コピーしました",
|
||||
"ConversionTab_BodyTop": "代わりに、お店が受け付けていなくても {{btcDue}} {{cryptoCode}} での支払いもできます。",
|
||||
"ConversionTab_BodyDesc": "ただし、この変換は第三者サービスによるものですので、お店が受け付けている通貨で着金するまでの間の処理に関しては何の保証もいたしません。変換後に受付中の通貨 ({{cryptoCode}}) がお店に着金してから支払い済みとなりますのでご了承ください。",
|
||||
"ConversionTab_CalculateAmount_Error": "リトライ",
|
||||
"ConversionTab_LoadCurrencies_Error": "リトライ",
|
||||
"ConversionTab_Lightning": "ライトニングのペイメントでは現在変換サービスが存在しないためご利用いただけません。ご了承ください。",
|
||||
"ConversionTab_CurrencyList_Select_Option": "変換する通貨を選択してください",
|
||||
"Invoice expiring soon...": "お支払いの期限が迫っています...",
|
||||
"Invoice expired": "お支払いの期限が切れました",
|
||||
"What happened?": "え!?ナニコレ!?",
|
||||
"InvoiceExpired_Body_1": "当件のお支払いの有効期限が過ぎてしまいました。最大 {{maxTimeMinutes}} 分以内に支払うことが義務付けられています。 \nまだお支払いのご希望の場合 {{storeName}} に一旦戻っていただき、もう一度お支払いの手続きを最初からやり直してみてください。",
|
||||
"InvoiceExpired_Body_2": "送金手続きを完了したつもりでも、ネットワークにて取り込まれて処理されるまでは決済となりません。現時点ではまだ着金しておりません。",
|
||||
"InvoiceExpired_Body_3": "後日着金を確認した場合、ご注文をそのまま処理させていただくか、払い戻しの為に連絡させていただく場合がございます...",
|
||||
"Invoice ID": "お支払い ID",
|
||||
"Order ID": "ご注文 ID",
|
||||
"Return to StoreName": "{{storeName}} に戻る",
|
||||
"This invoice has been paid": "お支払いが完了しました",
|
||||
"This invoice has been archived": "お支払いをアーカイブしました",
|
||||
"Archived_Body": "ご注文に関わる詳細などでお困りの場合はお店の担当窓口へお問い合わせください",
|
||||
"BOLT 11 Invoice": "お支払いコード",
|
||||
"Node Info": "接続情報",
|
||||
"txCount": "取引 {{count}} 個",
|
||||
"txCount_plural": "取引 {{count}} 個",
|
||||
"Pay with CoinSwitch": "CoinSwitchでのお支払い",
|
||||
"Pay with Changelly": "Changellyでのお支払い",
|
||||
"Close": "閉じる",
|
||||
"NotPaid_ExtraTransaction": "請求金額の全額が支払われていません。未払い分の別のトランザクションをお送りください。",
|
||||
"Recommended_Fee": "推奨手数料: {{feeRate}} sat/byte",
|
||||
"View receipt": "領収書へ"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "ka",
|
||||
"currentLanguage": "ქართული",
|
||||
"lang": "ენა",
|
||||
"Awaiting Payment...": "მიმდინარეობს გადახდის მიმართვა...",
|
||||
"Pay with": "გადაიხადე",
|
||||
"Contact and Refund Email": "კონტაქტი და უკან დაბრუნების ელ-ფოსტა",
|
||||
"Contact_Body": "გთხოვთ ქვემოთ მიუთითოთ ელ-ფოსტა. თუ გადახდისას შეცდომა გვაქვს, ჩვენ თქვენს ამ ელ-ფოსტაზე დავუკავშირდებით.",
|
||||
"Your email": "თქვენი ელ-ფოსტა",
|
||||
"Continue": "გაგრძელება",
|
||||
"Please enter a valid email address": "გთხოვთ, შეიყვანოთ ვალიდური ელ-ფოსტა",
|
||||
"Order Amount": "შეკვეთის თანხა",
|
||||
"Network Cost": "ქსელის ხარჯი",
|
||||
"Already Paid": "უკვე გადახდავით",
|
||||
"Due": "სრული თანხა",
|
||||
"Scan": "სკანირება",
|
||||
"Copy": "ასლიათ",
|
||||
"Conversion": "კონვერტაცია",
|
||||
"Open in wallet": "გახსნა საფულების აპლიკაციაში",
|
||||
"CompletePay_Body": "გთხოვთ სრული გადახდათანახლებულისთვის, გადაურთოთ {{btcDue}} {{cryptoCode}} არსებულ მისამართზე, რომელიც ქვემოთაა მითითებული.",
|
||||
"Amount": "თანხა",
|
||||
"Address": "მისამართი",
|
||||
"Copied": "ასლიათ",
|
||||
"ConversionTab_BodyTop": "შეგიძლიათ {{btcDue}} {{cryptoCode}} გადაიხადოთ სხვა ალტკოინებით, გარკვეული არამედან მწარმოებელმა მხარეთაა მხარეობს.",
|
||||
"ConversionTab_BodyDesc": "ეს მომსახურება გამოსაძახებელია სამეთვალი მხარეებისგან. გთხოვთ, გაითვალისწინეთ, რომ ჩვენ ვერ ვაქტივებთ ამ მომსახურების მსგავსად, ასევე, არ ვართ შემუშავებელი თქვენს ფონდების მიღებაში. ინვოისი მხოლოდ მიიღებს გადახდილ სტატუსს, როცა თქვენს ფონდებს მივიღებთ {{cryptoCode}} Blockchain-ზე.",
|
||||
"ConversionTab_CalculateAmount_Error": "ხელახლა ცდათ",
|
||||
"ConversionTab_LoadCurrencies_Error": "ხელახლა ცდათ",
|
||||
"ConversionTab_Lightning": "არ არის კონვერტაციის მწარმოებელი ლაითნინგ ქსელზე გადასახადებისთვის.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "გთხოვთ, აირჩიეთ ვალუტა, რომელიც გსურთ კონვერტაცია",
|
||||
"Invoice expiring soon...": "ინვოისის ვადა ახლანდელივე დაიბრუნება...",
|
||||
"Invoice expired": "ინვოისის ვადა გავიდა",
|
||||
"What happened?": "რატომ მოხდა ეს?",
|
||||
"InvoiceExpired_Body_1": "ეს ინვოისის ვადა გავიდა. ინვოისი ვალიდურია {{maxTimeMinutes}} წუთისთვის. თუ გსურთ, შეძენის დასრულებისთანავე {{storeName}} -ში დაბრუნებით დაგვიბრუნდით.",
|
||||
"InvoiceExpired_Body_2": "თუ ცდილობთ გადახდას გააგზავნოთ, მაგრამ ეს ჯქვიადად არ მივაღწია ქსელის მიერ დამოწმება. ჩვენ ჯერჯერობით არ ვიღებთ თქვენს ფონდებს.",
|
||||
"InvoiceExpired_Body_3": "თუ შემდეგი დროისთვის გავიდანაც მივიღებთ თქვენს ფონდებს, ჩვენ თქვენს შეკვეთას გავაგზავნთ ან დაგვიკონტაქტებთ უკან დაბრუნების განხილვისთვის...",
|
||||
"Invoice ID": "ინვოისის ID",
|
||||
"Order ID": "შეკვეთის ID",
|
||||
"Return to StoreName": "დაბრუნება {{storeName}} -ზე",
|
||||
"This invoice has been paid": "ეს ინვოისი გადახდულია",
|
||||
"This invoice has been archived": "ეს ინვოისი არქივზე გადაიარა",
|
||||
"Archived_Body": "გთხოვთ, დაითვალისწინეთ {{storeName}} -ს შეკვეთის ინფორმაციის მიღებისას ან დახმარებისთვის",
|
||||
"BOLT 11 Invoice": "BOLT 11 ინვოისი",
|
||||
"Node Info": "ნოუდის ინფორმაცია",
|
||||
"txCount": "{{count}} ტრანზაქცია",
|
||||
"txCount_plural": "{{count}} ტრანზაქციები",
|
||||
"Pay with CoinSwitch": "გადაიხადეთ CoinSwitch-ით",
|
||||
"Pay with Changelly": "გადაიხადეთ Changelly-ით",
|
||||
"Close": "დახურვა",
|
||||
"NotPaid_ExtraTransaction": "ინვოისი არ არის სრულად გადახდული. გთხოვთ, გააგზავნეთ სხვა ტრანზაქცია რომ დაგარიცხათ დაფარვის რეკვიზიტები.",
|
||||
"Recommended_Fee": "რჩევანილი ხანგრძლივობა: {{feeRate}} sat/byte",
|
||||
"View receipt": "მიღების ნახვა"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "kk-KZ",
|
||||
"currentLanguage": "қазақ",
|
||||
"lang": "Тіл",
|
||||
"Awaiting Payment...": "Күтіп тұрған төлем…",
|
||||
"Pay with": "Төлеу",
|
||||
"Contact and Refund Email": "Байланыс және ақша қайтару үшін арналған электрондық пошта",
|
||||
"Contact_Body": "Электрондық пошта мекенжайыңызды төменде көрсетуіңізді сұраймыз. Төлеміңіз туралы мәселе болса, біз сізге осы мекенжайыңыз арқылы хабарласамыз.",
|
||||
"Your email": "Сіздің электрондық пошта мекенжайыңыз",
|
||||
"Continue": "Жалғастыру",
|
||||
"Please enter a valid email address": "Қолданыстағы электрондық пошта мекенжайыңызды еңгізуін сұраймыз",
|
||||
"Order Amount": "Тапсырыс саны",
|
||||
"Network Cost": "Желі бағасы",
|
||||
"Already Paid": "Төленген",
|
||||
"Due": "Жалпы сома",
|
||||
"Scan": "Сканерлеу",
|
||||
"Copy": "Көшіру",
|
||||
"Conversion": "Айырбастау",
|
||||
"Open in wallet": "Әмиянда ашу",
|
||||
"CompletePay_Body": "Төлеміңізді аяқтау үшін төмендегі мекенжайға {{btcDue}} {{cryptoCode}} жіберуіңізді сұраймыз",
|
||||
"Amount": "Сан",
|
||||
"Address": "Мекенжай",
|
||||
"Copied": "Көшірілді",
|
||||
"ConversionTab_BodyTop": "Сатушы тікелей қолдау көрсетуден тыс кезде сіз altcoins көмегімен {{btcDue}} {{cryptoCode}} төлеуіңізге болады.",
|
||||
"ConversionTab_BodyDesc": "Бұл қызмет үшінші тараптан қамтамасыз етіледі. Сіздің ақшаңызды провайдерлер сізге қалай жеткізетінін біз бақылауға алмайтынымызды есте сақтауыңызды сұраймыз. Шот тек қана {{cryptoCode}} Blockchain жүйесі қаражаттырылған соң көрсетіледі.",
|
||||
"ConversionTab_CalculateAmount_Error": "Қайталау",
|
||||
"ConversionTab_LoadCurrencies_Error": "Қайта өту",
|
||||
"ConversionTab_Lightning": "Lightning Төлемдерді айырбастау жеткізушілер байланыстан тыс жерде",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Өңдеу үшін валюта таңдаңыз",
|
||||
"Invoice expiring soon...": "Шот-фактура жақын арада аяқталады…",
|
||||
"Invoice expired": "Шот-фактураның мерзімі аяқталды",
|
||||
"What happened?": "Не жағдай болды?",
|
||||
"InvoiceExpired_Body_1": "Бұл шот-фактураның мерзімі аяқталды. Шот-фактура {{maxTimeMinutes}} минуттарға жарамды. \nТөлеміңізді қайтадан жібергіңіз келсе {{storeName}} ға оралуға болады.",
|
||||
"InvoiceExpired_Body_2": "Егер сіз төлемді жіберуге тырыссқан болсаңыз, ол әлі желімен қабылданған жоқ. Біз сіздің қаражатыңызды әлі алған жоқпыз.",
|
||||
"InvoiceExpired_Body_3": "Егер біз оны кейінгі уақытта алсақ, біз сіздің тапсырысыңызды өңдеуге алу немесе төлік келісімдерін жасау үшін сізбен хабарласамыз...",
|
||||
"Invoice ID": "Шот анықтамасы",
|
||||
"Order ID": "Тапсырыс нөмірі",
|
||||
"Return to StoreName": "{{storeName}} оралу",
|
||||
"This invoice has been paid": "Бұл шот төленген",
|
||||
"This invoice has been archived": "Бұл шот мұрағатталған",
|
||||
"Archived_Body": "Тапсырыс туралы ақпарат немесе көмек үшін дүкенге хабарласуыңызды сұраймыз",
|
||||
"BOLT 11 Invoice": "BOLT 11 Шот-фактура",
|
||||
"Node Info": "Node анықтамасы",
|
||||
"txCount": "{{count}} Транзакция",
|
||||
"txCount_plural": "{{count}} Транзакциялар",
|
||||
"Pay with CoinSwitch": "CoinSwitch арқылы төлеу",
|
||||
"Pay with Changelly": "Changelly арқылы төлеу",
|
||||
"Close": "Жабу",
|
||||
"NotPaid_ExtraTransaction": "Төлбөр толық төленбеген. Төлік керек соманы камтиту үшін басқа іс-шараларды жіберіңіз.",
|
||||
"Recommended_Fee": "Ұсынылған алдын-ала төлем: {{feeRate}} сат/байт",
|
||||
"View receipt": "Төлем түсімін көру"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "ko",
|
||||
"currentLanguage": "한국어",
|
||||
"lang": "언어",
|
||||
"Awaiting Payment...": "지불 대기 중...",
|
||||
"Pay with": "결제 수단:",
|
||||
"Contact and Refund Email": "연락 및 환불 이메일",
|
||||
"Contact_Body": "아래에 이메일 주소를 입력해주세요. 결제에 문제가 있을 경우 이 주소로 연락드리겠습니다.",
|
||||
"Your email": "자신의 이메일",
|
||||
"Continue": "계속하기",
|
||||
"Please enter a valid email address": "유효한 이메일 주소를 입력해주세요",
|
||||
"Order Amount": "총 주문 금액",
|
||||
"Network Cost": "네트워크 수수료",
|
||||
"Already Paid": "지불 완료",
|
||||
"Due": "지불 대기 중",
|
||||
"Scan": "스캔",
|
||||
"Copy": "복사",
|
||||
"Conversion": "환율",
|
||||
"Open in wallet": "지갑에서 열기",
|
||||
"CompletePay_Body": "결제를 완료하려면 아래 주소로 {{btcDue}} {{cryptoCode}}을(를) 송금해주세요.",
|
||||
"Amount": "금액",
|
||||
"Address": "주소",
|
||||
"Copied": "복사 완료",
|
||||
"ConversionTab_BodyTop": "상점에서 직접 지원하는 알트코인 이외의 다른 알트코인으로 {{cryptoCode}} {{btcDue}}를 결제하실 수 있습니다.",
|
||||
"ConversionTab_BodyDesc": "본 서비스는 제 3자로부터 제공되며, 고객님의 자금이 어떻게 전달될지에 대한 통제권이 없음을 유념해주시기 바랍니다. 자금이 {{cryptoCode}} 블록체인에 입금된 경우에만 송금이 완료되었다고 인식됩니다.",
|
||||
"ConversionTab_CalculateAmount_Error": "다시 시도",
|
||||
"ConversionTab_LoadCurrencies_Error": "다시 시도",
|
||||
"ConversionTab_Lightning": "라이트닝 네트워크 결제에 대한 환전 제공업체가 없습니다.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "환전할 화폐를 선택하세요",
|
||||
"Invoice expiring soon...": "인보이스가 곧 만료 됨...",
|
||||
"Invoice expired": "인보이스 만료",
|
||||
"What happened?": "무슨 일인가요?",
|
||||
"InvoiceExpired_Body_1": "이 청구서는 만료되었습니다. 청구서는 {{maxTimeMinutes}}분 동안만 유효합니다. 결제를 다시 제출하려면 {{storeName}}으로 돌아갈 수 있습니다.",
|
||||
"InvoiceExpired_Body_2": "결제를 시도하셨다면, 아직 네트워크에서 승인되지 않았습니다. 아직 자금을 받지 못했습니다.",
|
||||
"InvoiceExpired_Body_3": "나중에 자금을 받게 된다면, 주문을 처리하거나 환불 조치를 위해 연락드릴 것입니다.",
|
||||
"Invoice ID": "인보이스 ID",
|
||||
"Order ID": "주문 ID",
|
||||
"Return to StoreName": "{{storeName}}으로 돌아가기",
|
||||
"This invoice has been paid": "이 인보이스는 지불 완료됐습니다",
|
||||
"This invoice has been archived": "이 청구서는 보관되었습니다",
|
||||
"Archived_Body": "주문 정보나 도움이 필요하시면 상점에 문의해주세요",
|
||||
"BOLT 11 Invoice": "BOLT 11 인보이스",
|
||||
"Node Info": "노드 정보",
|
||||
"txCount": "{{count}} 거래",
|
||||
"txCount_plural": "{{count}} 거래",
|
||||
"Pay with CoinSwitch": "CoinSwitch를 이용해 지불하기",
|
||||
"Pay with Changelly": "Changelly를 이용해 지불하기",
|
||||
"Close": "닫기",
|
||||
"NotPaid_ExtraTransaction": "청구서가 완전히 지불되지 않았습니다. 남은 금액을 결제하기 위해 다른 거래를 보내주십시오.",
|
||||
"Recommended_Fee": "추천하는 수수료: {{feeRate}} sat/byte",
|
||||
"View receipt": "영수증 보기"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "lv",
|
||||
"currentLanguage": "Latviešu",
|
||||
"lang": "Valoda",
|
||||
"Awaiting Payment...": "Maksājuma gaidīšana...",
|
||||
"Pay with": "Maksāt ar",
|
||||
"Contact and Refund Email": "E-pasts saziņai un atmaksai",
|
||||
"Contact_Body": "Lūdzu norādiet e-pasta adresi zemāk. Tā ir nepieciešama lai sazinātos ar Jums, ja maksājuma laikā radīsies kāda aizķeršanās.",
|
||||
"Your email": "Jūsu e-pasts",
|
||||
"Continue": "Turpināt",
|
||||
"Please enter a valid email address": "Lūdzu ievadiet korektu e-pasta adresi",
|
||||
"Order Amount": "Kopēja summa",
|
||||
"Network Cost": "Tīkla komisija",
|
||||
"Already Paid": "Samaksāts",
|
||||
"Due": "Jāsamaksā",
|
||||
"Scan": "Skenēt",
|
||||
"Copy": "Kopēt",
|
||||
"Conversion": "Konvertācija",
|
||||
"Open in wallet": "Atvērt ar maku",
|
||||
"CompletePay_Body": "Lai pabeigtu maksājumu, lūdzu nosūtiet {{btcDue}} {{cryptoCode}} uz zemāk noradītu adresi",
|
||||
"Amount": "Kopā",
|
||||
"Address": "Adrese",
|
||||
"Copied": "Nokopēts",
|
||||
"ConversionTab_BodyTop": "Jūs varat samaksāt {{btcDue}} {{cryptoCode}} izmantojot altkoinus, kuri netiek atbalstīt ar tiešo maksājumu saņēmējam",
|
||||
"ConversionTab_BodyDesc": "Šo pakalpojumu nodrošina starpnieks. Ņemiet vērā, kā mēs nekādā veidā nekontrolējam maksājuma norisi. Rēķins tiks atzīmēts kā samaksāts tikai tad, kad līdzekļi būs saņemti {{cryptoCode}} blokķēdē.",
|
||||
"ConversionTab_CalculateAmount_Error": "Atkārtot",
|
||||
"ConversionTab_LoadCurrencies_Error": "Atkārtot",
|
||||
"ConversionTab_Lightning": "Konvertācijas provaideri Lightning Network maksājumiem nav pieejami.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Lūdzu izvēlēties valūtu no kuras veikt konvertāciju",
|
||||
"Invoice expiring soon...": "Rēķina apmaksas laiks drīz beigsies",
|
||||
"Invoice expired": "Rēķina apmaksas laiks ir beidzies",
|
||||
"What happened?": "Kas notika?",
|
||||
"InvoiceExpired_Body_1": "Rēķina apmaksas laiks ir beidzies. Rēķins derīgs apmaksai tikai {{maxTimeMinutes}} minūtes.\nJūs varat atgriezties uz {{storeName}} jā vēlāties atkārtot maksājumu.",
|
||||
"InvoiceExpired_Body_2": "Ja Jūs veicat maksājumu, tas pagaidām nav akceptēts tīklā. Mēs joprojām neesam saņēmuši maksājumu.",
|
||||
"InvoiceExpired_Body_3": "Jā mēs saņemsim maksājumu vēlāk, rēķina izpilde turpināsies vai arī mēs sazināsimies ar Jums lai veiktu atmaksu.",
|
||||
"Invoice ID": "Rēķina ID",
|
||||
"Order ID": "Pasūtījuma ID",
|
||||
"Return to StoreName": "Atgriezties {{storeName}}",
|
||||
"This invoice has been paid": "Maksājums izpildīts",
|
||||
"This invoice has been archived": "Šis maksājums saglabāts arhīvā",
|
||||
"Archived_Body": "Lūdzam sazināties ar pakalpojuma sniedzēju lai saņemtu informāciju par pasūtījumu vai atbalsta saņemšanai",
|
||||
"BOLT 11 Invoice": "BOLT 11 uzdevums",
|
||||
"Node Info": "Nodes informācija",
|
||||
"txCount": "{{count}} transakcija",
|
||||
"txCount_plural": "{{count}} transakcijas",
|
||||
"Pay with CoinSwitch": "Maksāt ar CoinSwitch",
|
||||
"Pay with Changelly": "Maksāt ar Changelly",
|
||||
"Close": "Aizvērt",
|
||||
"NotPaid_ExtraTransaction": "Pēkšņi nav samaksāts pilnībā. Lūdzu, nosūtiet citu darījumu, lai segtu jāsamaksa summu.",
|
||||
"Recommended_Fee": "Rekomendējamā maksa: {{feeRate}} sat/baitā",
|
||||
"View receipt": "Skatīt kvīti"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "nl-NL",
|
||||
"currentLanguage": "Nederlands",
|
||||
"lang": "Taal",
|
||||
"Awaiting Payment...": "Wacht op betaling...",
|
||||
"Pay with": "Betaal met",
|
||||
"Contact and Refund Email": "E-mailadres voor opvolging en terugbetaling",
|
||||
"Contact_Body": "Laat hieronder uw e-mailadres achter. We nemen contact met u op mochten er problemen zijn met uw betaling.",
|
||||
"Your email": "Uw e-mailadres",
|
||||
"Continue": "Verder",
|
||||
"Please enter a valid email address": "Vul een geldig e-mailadres in",
|
||||
"Order Amount": "Bedrag van uw bestelling",
|
||||
"Network Cost": "Netwerkkosten",
|
||||
"Already Paid": "Reeds betaald",
|
||||
"Due": "Verschuldigd",
|
||||
"Scan": "Scannen",
|
||||
"Copy": "Kopiëren",
|
||||
"Conversion": "Omzetting",
|
||||
"Open in wallet": "Wallet openen",
|
||||
"CompletePay_Body": "Om de betaling af te ronden, stuur alstublieft {{btcDue}} {{cryptoCode}} naar het hieronder vermelde adres.",
|
||||
"Amount": "Bedrag",
|
||||
"Address": "Adres",
|
||||
"Copied": "Gekopieerd",
|
||||
"ConversionTab_BodyTop": "U kunt altcoins gebruiken die niet ondersteund zijn door de verkoper, om {{btcDue}} {{cryptoCode}} te betalen.",
|
||||
"ConversionTab_BodyDesc": "Deze dienst wordt door een 3e partij geleverd. Wij hebben daardoor geen zicht op uw fondsen. De factuur wordt pas als betaald beschouwd, wanneer de fondsen door de {{ cryptoCode }} blockchain aanvaard zijn.",
|
||||
"ConversionTab_CalculateAmount_Error": "Opnieuw proberen",
|
||||
"ConversionTab_LoadCurrencies_Error": "Opnieuw proberen",
|
||||
"ConversionTab_Lightning": "Geen conversie leverancier beschikbaar voor de betalingen op het Lightning Network",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Selecteer een valuta om te converteren",
|
||||
"Invoice expiring soon...": "Factuur verloopt binnenkort...",
|
||||
"Invoice expired": "Factuur vervallen",
|
||||
"What happened?": "Wat is er gebeurd?",
|
||||
"InvoiceExpired_Body_1": "De factuur is vervallen. Een factuur is slechts geldig voor {{maxTimeMinutes}} minuten. \nU kan teruggaan naar {{storeName}} als u de betaling opnieuw wil proberen.",
|
||||
"InvoiceExpired_Body_2": "Als u een betaling uitvoerde, dan werd deze nog niet bevestigd door het netwerk. We hebben uw betaling nog niet ontvangen.",
|
||||
"InvoiceExpired_Body_3": "Als we uw betaling later ontvangen, zullen we uw order verwerken of nemen we contact op om een terugbetaling te regelen...",
|
||||
"Invoice ID": "Factuurnummer",
|
||||
"Order ID": "Ordernummer",
|
||||
"Return to StoreName": "Terug naar {{storeName}}",
|
||||
"This invoice has been paid": "Deze factuur is betaald",
|
||||
"This invoice has been archived": "Deze factuur is gearchiveerd",
|
||||
"Archived_Body": "Bedankt om de winkel te contacteren voor bijstand met of informatie over deze bestelling",
|
||||
"BOLT 11 Invoice": "BOLT 11 Factuur",
|
||||
"Node Info": "Knoop informatie",
|
||||
"txCount": "{{count}} transactie",
|
||||
"txCount_plural": "{{count}} transacties",
|
||||
"Pay with CoinSwitch": "Betalen met CoinSwitch",
|
||||
"Pay with Changelly": "Betalen met Changelly",
|
||||
"Close": "Sluiten",
|
||||
"NotPaid_ExtraTransaction": "Het factuur is niet volledig betaald. Stuur nog een transactie om het resterende bedrag te betalen.",
|
||||
"Recommended_Fee": "Aanbevolen vergoeding: {{feeRate}} sat/byte",
|
||||
"View receipt": "Bekijk bon"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "no",
|
||||
"currentLanguage": "Norsk",
|
||||
"lang": "Språk",
|
||||
"Awaiting Payment...": "Venter på betaling...",
|
||||
"Pay with": "Betal med",
|
||||
"Contact and Refund Email": "Kontakt og tilbakebetalings e-post",
|
||||
"Contact_Body": " Skriv inn en e-postadresse nedenfor. Vi kommer til å kontakte deg på denne adressen hvis det er noe feil med betalingen din",
|
||||
"Your email": "Din e-post",
|
||||
"Continue": "Fortsett",
|
||||
"Please enter a valid email address": "Skriv inn en gyldig e-postadresse",
|
||||
"Order Amount": "Ordrebeløp",
|
||||
"Network Cost": "Nettverksavgift",
|
||||
"Already Paid": "Allerede betalt",
|
||||
"Due": "Skylder",
|
||||
"Scan": "Skanne",
|
||||
"Copy": "Kopier",
|
||||
"Conversion": "Konvertert",
|
||||
"Open in wallet": "Åpne i lommebok",
|
||||
"CompletePay_Body": "For å fullføre betalingen, send {{btcDue}} {{cryptoCode}} til adressen nedenfor.",
|
||||
"Amount": "Beløp",
|
||||
"Address": "Adresse",
|
||||
"Copied": "Kopiert",
|
||||
"ConversionTab_BodyTop": "Du kan betale {{btcDue}} {{cryptoCode}} med andre altcoins enn det selgeren støtter direkte.",
|
||||
"ConversionTab_BodyDesc": "Denne tjenesten håndteres av tredjepartstilbydere.\nHusk at vi har ingen kontroll over hvordan tilbyderene vil sende deg dine penger. Fakturaen blir ikke markert betalt før pengene har blitt mottatt på blokkkjeden til {{cryptoCode}}.",
|
||||
"ConversionTab_CalculateAmount_Error": "Prøv igjen",
|
||||
"ConversionTab_LoadCurrencies_Error": "Prøv igjen",
|
||||
"ConversionTab_Lightning": "Ingen vekslere er tilgjengelige for Lighting Network betalinger.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Velg en valuta å konvertere fra",
|
||||
"Invoice expiring soon...": "Faktura utløper snart...",
|
||||
"Invoice expired": "Faktura utløpt",
|
||||
"What happened?": "Hva skjedde?",
|
||||
"InvoiceExpired_Body_1": "Denne fakturaen har utløpt. En faktura er bare gyldig i {{maxTimeMinutes}} minutter.\nDu kan returnere til {{storeName}} hvis du vil prøve å betale igjen.",
|
||||
"InvoiceExpired_Body_2": "Hvis du har prøvd å betale, så har den enda ikke blitt akseptert av nettverket. Vi har enda ikke mottatt din betaling.",
|
||||
"InvoiceExpired_Body_3": "Hvis vi mottar den senere så kommer vi til å prosessere din ordre eller kontakte deg for tilbakebetaling.",
|
||||
"Invoice ID": "Faktura ID",
|
||||
"Order ID": "Ordre ID",
|
||||
"Return to StoreName": "Returner til {{storeName}}",
|
||||
"This invoice has been paid": "Denne fakturaen har allerede blitt betalt",
|
||||
"This invoice has been archived": "Denne fakturaen har blitt arkivert",
|
||||
"Archived_Body": "Kontakt butikken for informasjon om ordre eller assistanse",
|
||||
"BOLT 11 Invoice": "BOLT 11 faktura",
|
||||
"Node Info": "Node info",
|
||||
"txCount": "{{count}} transaksjon",
|
||||
"txCount_plural": "{{count}} transaksjoner",
|
||||
"Pay with CoinSwitch": "Betal med CoinSwitch",
|
||||
"Pay with Changelly": "Betal med Changelly",
|
||||
"Close": "Lukk",
|
||||
"NotPaid_ExtraTransaction": "Denne fakturaen har ikke blitt betalt fullt ut. Send en ny transaksjon med resten av beløpet.",
|
||||
"Recommended_Fee": "Anbefalt avgift: {{feeRate}} sat/byte",
|
||||
"View receipt": "Vis kvittering"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "np-NP",
|
||||
"currentLanguage": "नेपाली",
|
||||
"lang": "भाषा",
|
||||
"Awaiting Payment...": "भुक्तानी पर्खँदै...",
|
||||
"Pay with": "तिर्नुहोस्",
|
||||
"Contact and Refund Email": "सम्पर्क र फिर्ता इमेल",
|
||||
"Contact_Body": "कृपया तल ईमेल ठेगाना प्रदान गर्नुहोस्। तपाईंको भुक्तानीको साथमा समस्या छ भने हामी यो ठेगानामा सम्पर्क गर्नेछौं",
|
||||
"Your email": "तिम्रो इमेल",
|
||||
"Continue": "जारी राख्नुहोस्",
|
||||
"Please enter a valid email address": "कृपया वैध ईमेल ठेगाना प्रविष्ट गर्नुहोस्",
|
||||
"Order Amount": "अर्डर रकम",
|
||||
"Network Cost": "नेटवर्क लागत",
|
||||
"Already Paid": "तिरिसकेको",
|
||||
"Due": "बाँकी",
|
||||
"Scan": "स्क्यान गर्नुहोस्",
|
||||
"Copy": "कापी",
|
||||
"Conversion": "रूपान्तरण",
|
||||
"Open in wallet": "वालेटमा खोल्नुहोस्",
|
||||
"CompletePay_Body": "आफ्नो भुक्तानी पूरा गर्न, कृपया तल ठेगानामा {{btcDue}} {{cryptoCode}} पठाउनुहोस्",
|
||||
"Amount": "राशि",
|
||||
"Address": "ठेगाना",
|
||||
"Copied": "प्रतिलिपि गरियो",
|
||||
"ConversionTab_BodyTop": "तपाईं एक व्यापारी को सीधा समर्थन भन्दा Altcoins अन्य को उपयोग को {{btcDue}} {{cryptoCode}} भुगतान गर्न सक्छन्",
|
||||
"ConversionTab_BodyDesc": "यो सेवा तेस्रो पार्टी द्वारा प्रदान गरिएको छ। कृपया ध्यान राख्नुहोस् कि हामीसँग कुनै नियन्त्रण छैन कि कसरी प्रदायकहरूले तपाईंको रकम अगाडि बढ्नेछन्। रकम प्राप्त {{cryptoCode}} Blockchain भएको बेलामा इनभ्वाइस मात्र भुक्तानी चिन्ह लगाइनेछ",
|
||||
"ConversionTab_CalculateAmount_Error": "कृपया मलाई अनुवाद गर्न चाहनुभएका वाक्यहरू दिनुहोस्",
|
||||
"ConversionTab_LoadCurrencies_Error": "कृपया मलाई अनुवाद गर्न चाहिनुभएका वाक्यहरू दिनुहोस्",
|
||||
"ConversionTab_Lightning": "Lightning Network भुक्तानीको लागि कुनै परिवर्तन प्रदायकहरू उपलब्ध छैनन्",
|
||||
"ConversionTab_CurrencyList_Select_Option": "कृपया जुनसुकै मुद्रा छान्नुहोस् जुनबाट रुपन्तरण गर्नु पर्नेछ",
|
||||
"Invoice expiring soon...": "चलानीको म्याद सकियो",
|
||||
"Invoice expired": "इनभ्वाइस समाप्त भयो",
|
||||
"What happened?": "के भयो",
|
||||
"InvoiceExpired_Body_1": "यो चलानी समाप्त भएको छ। इनभ्वाइस {{maxTimeMinutes}} मिनेटको लागि मात्र वैध छ। \nतपाइँ आफ्नो भुक्तानी पुन: पेश गर्न चाहानुहुन्छ यदि तपाइँ {{ storeName }} भुक्तानी पठाउन प्रयास गर्नुभयो भने।",
|
||||
"InvoiceExpired_Body_2": "भने यो अझै नेटवर्कद्वारा स्वीकार गरिएको छैन। हामीले अझै सम्म तपाईंको रकम प्राप्त गरेका छैनौ।",
|
||||
"InvoiceExpired_Body_3": "यदि हामी पछी तपाईंद्वारा प्राप्त गरेको पैसा भुक्तानीको लागि छोडिएको छैन, तपाईंको अर्डर प्रसेस गरिनेछ वा रिफण्ड व्यवस्था गर्नको लागि तपाईंसँग सम्पर्क गर्नेछ।",
|
||||
"Invoice ID": "चलानी आईडी",
|
||||
"Order ID": "अर्डर आईडी",
|
||||
"Return to StoreName": "यसलाई फर्काउनुहोस् {{storeName}}",
|
||||
"This invoice has been paid": "इनभ्वाइस भुक्तानी गरिएको छ",
|
||||
"This invoice has been archived": "इनभ्वाइस संग्रहीत गरिएको छ",
|
||||
"Archived_Body": "कृपया स्टोर जानकारी वा सहयोगको लागि स्टोरलाई सम्पर्क गर्नुहोस्",
|
||||
"BOLT 11 Invoice": "BOLT 11 इनभ्वाइस",
|
||||
"Node Info": "नोड जानकारी",
|
||||
"txCount": "{{count}} लेनदेन",
|
||||
"txCount_plural": "{{count}} लेनदेन",
|
||||
"Pay with CoinSwitch": "कोइनस्विच बाट भुक्तान गर्नुहोस्",
|
||||
"Pay with Changelly": "चेन्जेली बाट भुक्तान गर्नुहोस्",
|
||||
"Close": "बन्द गर्नुहोस्",
|
||||
"NotPaid_ExtraTransaction": "बिल पूर्ण रुपमा भुक्तान गरिएको छैन। कृपया बकाया रकम भुक्त गर्न अर्को लेखा बुझाउनुहोस्।",
|
||||
"Recommended_Fee": "सिफारिस गरिएका शुल्क: {{feeRate}} स्याट/बाइट्",
|
||||
"View receipt": "बुझाई हेर्नुहोस्"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "pl",
|
||||
"currentLanguage": "Polski",
|
||||
"lang": "Język",
|
||||
"Awaiting Payment...": "Oczekiwanie na płatność...",
|
||||
"Pay with": "Płać z",
|
||||
"Contact and Refund Email": "Email do kontaktu i reklamacji",
|
||||
"Contact_Body": "Proszę podać adres email poniżej. Jeżeli będzie problem z płatnością użyjemy go do kontaktu.",
|
||||
"Your email": "Twój email",
|
||||
"Continue": "Dalej",
|
||||
"Please enter a valid email address": "Proszę podać prawidłowy adres email",
|
||||
"Order Amount": "Kwota zamówienia",
|
||||
"Network Cost": "Koszt sieci",
|
||||
"Already Paid": "Już zapłacone",
|
||||
"Due": "Razem",
|
||||
"Scan": "Skan",
|
||||
"Copy": "Kopia",
|
||||
"Conversion": "Konwersja",
|
||||
"Open in wallet": "Otwórz w porfelu",
|
||||
"CompletePay_Body": "Aby dokonać płatności proszę wysłać {{btcDue}} {{cryptoCode}} na adres podany niżej.",
|
||||
"Amount": "Kwota",
|
||||
"Address": "Adres",
|
||||
"Copied": "Skopiowano",
|
||||
"ConversionTab_BodyTop": "Możesz zapłacić {{btcDue}} {{cryptoCode}} używając altcoina innego niż ten, który akceptuje bezpośrednio sprzedawca.",
|
||||
"ConversionTab_BodyDesc": "Ten serwis prowadzony jest przez 3-cią stronę. Proszę pamiętać, że nie mamy kontroli nad tym jak dostawcy przekażą twoje fundusze. Płatność będzie uznana za opłaconą, tylko gdy otrzymane zostaną poprzez {{cryptoCode}}",
|
||||
"ConversionTab_CalculateAmount_Error": "Ponów",
|
||||
"ConversionTab_LoadCurrencies_Error": "Ponów",
|
||||
"ConversionTab_Lightning": "Brak dostawcy kowertującego dla płatności Lightning Network",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Wybierz walutę która będzie konwertowana",
|
||||
"Invoice expiring soon...": "Płatność wkrótce wygaśnie...",
|
||||
"Invoice expired": "Płatność wygasła",
|
||||
"What happened?": "Co się stało?",
|
||||
"InvoiceExpired_Body_1": "Płatność wygasła. Płatność jest prawidłowa przez {{maxTimeMinutes}} minut. Jeśli chcesz wysłaść płatność ponownie wróć do {{storeName}}.",
|
||||
"InvoiceExpired_Body_2": "Jeżeli próbowałeś wysłać płatność to nie została ona zaakcepowana przez sieć. Nie otrzymaliśmy jeszcze twoich funduszy.",
|
||||
"InvoiceExpired_Body_3": "Jeśli otrzymamy go w późniejszym terminie, wykonamy transakcję lub skontaktujemy się z tobą aby uzgodnić zwrot",
|
||||
"Invoice ID": "ID faktury",
|
||||
"Order ID": "ID zamówienia",
|
||||
"Return to StoreName": "Wróć do {{storeName}}",
|
||||
"This invoice has been paid": "Płatność wykonana",
|
||||
"This invoice has been archived": "Płatność została zarchiwizowana",
|
||||
"Archived_Body": "Proszę skontaktować się ze sprzedawcą w celu uzyskania informacji lub wsparcia",
|
||||
"BOLT 11 Invoice": "Płatność BOLT 11",
|
||||
"Node Info": "Informacja o węźle",
|
||||
"txCount": "{{count}} transakcja",
|
||||
"txCount_plural": "{{count}} transakcji",
|
||||
"Pay with CoinSwitch": "Zapłać z CoinSwitch",
|
||||
"Pay with Changelly": "Zapłać z Changelly",
|
||||
"Close": "Zamknij",
|
||||
"NotPaid_ExtraTransaction": "Faktura nie została w pełni opłacona. Proszę wyślij dodatkową transakcje z resztą brakujących środków.",
|
||||
"Recommended_Fee": "Zalecana opłata transakcyjna: {{feeRate}} sat/bajt",
|
||||
"View receipt": "Pokaż rachunek"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "pt-BR",
|
||||
"currentLanguage": "Português (Brasil)",
|
||||
"lang": "Idioma",
|
||||
"Awaiting Payment...": "Aguardando pagamento...",
|
||||
"Pay with": "Pagar com",
|
||||
"Contact and Refund Email": "E-mail de contato para reembolso",
|
||||
"Contact_Body": "Preencha seu e-mail abaixo. Nós entraremos em contato caso ocorra algum problema com o pagamento.",
|
||||
"Your email": "Seu e-mail",
|
||||
"Continue": "Continuar",
|
||||
"Please enter a valid email address": "Insira um e-mail válido",
|
||||
"Order Amount": "Valor do pedido",
|
||||
"Network Cost": "Taxa da rede",
|
||||
"Already Paid": "Já foi pago",
|
||||
"Due": "Devido",
|
||||
"Scan": "Escanear",
|
||||
"Copy": "Copiar",
|
||||
"Conversion": "Converter",
|
||||
"Open in wallet": "Abrir na carteira",
|
||||
"CompletePay_Body": "Para completar seu pagamento, por favor envie {{btcDue}} {{cryptoCode}} para o endereço abaixo.",
|
||||
"Amount": "Quantia",
|
||||
"Address": "Endereço",
|
||||
"Copied": "Copiado",
|
||||
"ConversionTab_BodyTop": "Você pode pagar {{btcDue}} {{cryptoCode}} utilizando outras altcoins além das que a loja aceita diretamente.",
|
||||
"ConversionTab_BodyDesc": "Esse serviço é oferecido por terceiros. Por favor, tenha em mente que não temos nenhum controle sobre como seus fundos serão utilizados. A fatura apenas será marcada como paga quando os fundos forem recebidos na Blockchain {{cryptoCode}}.",
|
||||
"ConversionTab_CalculateAmount_Error": "Tentar novamente",
|
||||
"ConversionTab_LoadCurrencies_Error": "Tentar novamente",
|
||||
"ConversionTab_Lightning": "Não há provedores de conversão disponíveis para pagamentos via Lightning Network.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Selecione a moeda para converter",
|
||||
"Invoice expiring soon...": "A fatura está expirando...",
|
||||
"Invoice expired": "Fatura expirada",
|
||||
"What happened?": "O que aconteceu?",
|
||||
"InvoiceExpired_Body_1": "Esta fatura expirou. Uma fatura é válida por apenas {{maxTimeMinutes}} minutos. \nVocê pode voltar para {{storeName}} se quiser tentar enviar o pagamento novamente.",
|
||||
"InvoiceExpired_Body_2": "Se você tentou enviar um pagamento, ele ainda não foi aceito pela rede. Nós ainda não recebemos o valor enviado.",
|
||||
"InvoiceExpired_Body_3": "Se recebermos mais tarde, vamos processar o pedido ou entrar em contato para combinar o reembolso...",
|
||||
"Invoice ID": "Nº da Fatura",
|
||||
"Order ID": "Nº do Pedido",
|
||||
"Return to StoreName": "Voltar para {{storeName}}",
|
||||
"This invoice has been paid": "Esta fatura foi paga",
|
||||
"This invoice has been archived": "Esta fatura foi arquivada",
|
||||
"Archived_Body": "Entre em contato com o estabelecimento para informações e suporte",
|
||||
"BOLT 11 Invoice": "Fatura BOLT 11",
|
||||
"Node Info": "Informação do nó",
|
||||
"txCount": "{{count}} transação",
|
||||
"txCount_plural": "{{count}} transações",
|
||||
"Pay with CoinSwitch": "Pagar com CoinSwitch",
|
||||
"Pay with Changelly": "Pagar com Changelly",
|
||||
"Close": "Fechar",
|
||||
"NotPaid_ExtraTransaction": "A fatura não foi paga integralmente. Envie outra transação para cobrir o valor devido.",
|
||||
"Recommended_Fee": "Taxa recomendada: {{feeRate}} sat/byte",
|
||||
"View receipt": "Ver recibo"
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
"NOTICE_WARN": "THIS CODE HAS BEEN AUTOMATICALLY GENERATED FROM TRANSIFEX, IF YOU WISH TO HELP TRANSLATION COME ON THE SLACK https://chat.btcpayserver.org/ TO REQUEST PERMISSION TO https://www.transifex.com/btcpayserver/btcpayserver/",
|
||||
"code": "pt-PT",
|
||||
"currentLanguage": "Portuguese",
|
||||
"lang": "Idioma",
|
||||
"Awaiting Payment...": "A Aguardar Pagamento...",
|
||||
"Pay with": "Pague com",
|
||||
"Contact and Refund Email": "E-mail de Contacto e Reembolso",
|
||||
"Contact_Body": "Por favor indique um e-mail abaixo. Entraremos em contacto para este endereço se ocorrer algum problema com o seu pagamento.",
|
||||
"Your email": "O seu e-mail",
|
||||
"Continue": "Continuar",
|
||||
"Please enter a valid email address": "Por favor introduza um e-mail válido",
|
||||
"Order Amount": "Valor da Encomenda",
|
||||
"Network Cost": "Custo da Rede",
|
||||
"Already Paid": "Já Pago",
|
||||
"Due": "Devido",
|
||||
"Scan": "Digitalizar",
|
||||
"Copy": "Copiar",
|
||||
"Conversion": "Conversão",
|
||||
"Open in wallet": "Abrir na carteira",
|
||||
"CompletePay_Body": "Para completar o seu pagamento, por favor envie {{btcDue}} {{cryptoCode}} para o endereço abaixo.",
|
||||
"Amount": "Quantia",
|
||||
"Address": "Endereço",
|
||||
"Copied": "Copiado",
|
||||
"ConversionTab_BodyTop": "Pode pagar {{btcDue}} {{cryptoCode}} utilizando outras altcoins além das que a loja aceita diretamente.",
|
||||
"ConversionTab_BodyDesc": "Este serviço é oferecido por terceiros. Por favor tenha em mente que não temos qualquer controlo sobre como os seus fundos serão utilizados. A fatura será marcada como paga apenas quando os fundos forem recebidos na Blockchain {{cryptoCode}}.",
|
||||
"ConversionTab_CalculateAmount_Error": "Tentar de novo",
|
||||
"ConversionTab_LoadCurrencies_Error": "Tentar de novo",
|
||||
"ConversionTab_Lightning": "Não há fornecedores de conversão disponíveis para pagamentos via Lightning Network.",
|
||||
"ConversionTab_CurrencyList_Select_Option": "Por favor selecione uma moeda da qual converter",
|
||||
"Invoice expiring soon...": "A fatura está a expirar...",
|
||||
"Invoice expired": "Fatura expirada",
|
||||
"What happened?": "O que aconteceu?",
|
||||
"InvoiceExpired_Body_1": "Esta fatura expirou. Uma fatura é válida durante {{maxTimeMinutes}} minutos. \nPode voltar para {{storeName}} se quiser enviar o seu pagamento novamente.",
|
||||
"InvoiceExpired_Body_2": "Se tentou enviar um pagamento, ele ainda não foi aceite pela rede Bitcoin. Nós ainda não recebemos o valor enviado.",
|
||||
"InvoiceExpired_Body_3": "Se o recebermos mais tarde, processaremos o seu pedido ou entraremos em contacto para o reembolsar ...",
|
||||
"Invoice ID": "Nº da Fatura",
|
||||
"Order ID": "Nº da Encomenda",
|
||||
"Return to StoreName": "Voltar para {{storeName}}",
|
||||
"This invoice has been paid": "Esta fatura foi paga",
|
||||
"This invoice has been archived": "Esta fatura foi arquivada",
|
||||
"Archived_Body": "Por favor, entre em contacto com o vendedor para informações e suporte",
|
||||
"BOLT 11 Invoice": "Fatura BOLT 11",
|
||||
"Node Info": "Informação do Nó",
|
||||
"txCount": "{{count}} transação",
|
||||
"txCount_plural": "{{count}} transações",
|
||||
"Pay with CoinSwitch": "Pagar com CoinSwitch",
|
||||
"Pay with Changelly": "Pagar com Changelly",
|
||||
"Close": "Fechar",
|
||||
"NotPaid_ExtraTransaction": "A fatura não foi paga na totalidade. Por favor, faça outra transação para cobrir o valor em falta.",
|
||||
"Recommended_Fee": "Taxa recomendada: {{feeRate}} sat/byte",
|
||||
"View receipt": "Ver recibo"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user