mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2025-03-03 17:36:59 +01:00
Can set store default language
This commit is contained in:
parent
e51f3dd1ae
commit
7d17bf7f2a
11 changed files with 105 additions and 33 deletions
|
@ -201,7 +201,7 @@ namespace BTCPayServer.Controllers
|
||||||
var paymentMethodDetails = paymentMethod.GetPaymentMethodDetails();
|
var paymentMethodDetails = paymentMethod.GetPaymentMethodDetails();
|
||||||
var dto = invoice.EntityToDTO(_NetworkProvider);
|
var dto = invoice.EntityToDTO(_NetworkProvider);
|
||||||
var cryptoInfo = dto.CryptoInfo.First(o => o.GetpaymentMethodId() == paymentMethodId);
|
var cryptoInfo = dto.CryptoInfo.First(o => o.GetpaymentMethodId() == paymentMethodId);
|
||||||
|
var storeBlob = store.GetStoreBlob();
|
||||||
var currency = invoice.ProductInformation.Currency;
|
var currency = invoice.ProductInformation.Currency;
|
||||||
var accounting = paymentMethod.Calculate();
|
var accounting = paymentMethod.Calculate();
|
||||||
var model = new PaymentModel()
|
var model = new PaymentModel()
|
||||||
|
@ -211,6 +211,7 @@ namespace BTCPayServer.Controllers
|
||||||
ServerUrl = HttpContext.Request.GetAbsoluteRoot(),
|
ServerUrl = HttpContext.Request.GetAbsoluteRoot(),
|
||||||
OrderId = invoice.OrderId,
|
OrderId = invoice.OrderId,
|
||||||
InvoiceId = invoice.Id,
|
InvoiceId = invoice.Id,
|
||||||
|
DefaultLang = storeBlob.DefaultLang ?? "en",
|
||||||
BtcAddress = paymentMethodDetails.GetPaymentDestination(),
|
BtcAddress = paymentMethodDetails.GetPaymentDestination(),
|
||||||
OrderAmount = (accounting.TotalDue - accounting.NetworkFee).ToString(),
|
OrderAmount = (accounting.TotalDue - accounting.NetworkFee).ToString(),
|
||||||
BtcDue = accounting.Due.ToString(),
|
BtcDue = accounting.Due.ToString(),
|
||||||
|
@ -233,7 +234,7 @@ namespace BTCPayServer.Controllers
|
||||||
Status = invoice.Status,
|
Status = invoice.Status,
|
||||||
CryptoImage = "/" + GetImage(paymentMethodId, network),
|
CryptoImage = "/" + GetImage(paymentMethodId, network),
|
||||||
NetworkFeeDescription = $"{accounting.TxRequired} transaction{(accounting.TxRequired > 1 ? "s" : "")} x {paymentMethodDetails.GetTxFee()} {network.CryptoCode}",
|
NetworkFeeDescription = $"{accounting.TxRequired} transaction{(accounting.TxRequired > 1 ? "s" : "")} x {paymentMethodDetails.GetTxFee()} {network.CryptoCode}",
|
||||||
AllowCoinConversion = store.GetStoreBlob().AllowCoinConversion,
|
AllowCoinConversion = storeBlob.AllowCoinConversion,
|
||||||
AvailableCryptos = invoice.GetPaymentMethods(_NetworkProvider)
|
AvailableCryptos = invoice.GetPaymentMethods(_NetworkProvider)
|
||||||
.Where(i => i.Network != null)
|
.Where(i => i.Network != null)
|
||||||
.Select(kv => new PaymentModel.AvailableCrypto()
|
.Select(kv => new PaymentModel.AvailableCrypto()
|
||||||
|
|
|
@ -46,12 +46,14 @@ namespace BTCPayServer.Controllers
|
||||||
BTCPayNetworkProvider networkProvider,
|
BTCPayNetworkProvider networkProvider,
|
||||||
ExplorerClientProvider explorerProvider,
|
ExplorerClientProvider explorerProvider,
|
||||||
IFeeProviderFactory feeRateProvider,
|
IFeeProviderFactory feeRateProvider,
|
||||||
|
LanguageService langService,
|
||||||
IHostingEnvironment env)
|
IHostingEnvironment env)
|
||||||
{
|
{
|
||||||
_Dashboard = dashboard;
|
_Dashboard = dashboard;
|
||||||
_Repo = repo;
|
_Repo = repo;
|
||||||
_TokenRepository = tokenRepo;
|
_TokenRepository = tokenRepo;
|
||||||
_UserManager = userManager;
|
_UserManager = userManager;
|
||||||
|
_LangService = langService;
|
||||||
_TokenController = tokenController;
|
_TokenController = tokenController;
|
||||||
_WalletProvider = walletProvider;
|
_WalletProvider = walletProvider;
|
||||||
_Env = env;
|
_Env = env;
|
||||||
|
@ -76,6 +78,7 @@ namespace BTCPayServer.Controllers
|
||||||
StoreRepository _Repo;
|
StoreRepository _Repo;
|
||||||
TokenRepository _TokenRepository;
|
TokenRepository _TokenRepository;
|
||||||
UserManager<ApplicationUser> _UserManager;
|
UserManager<ApplicationUser> _UserManager;
|
||||||
|
private LanguageService _LangService;
|
||||||
IHostingEnvironment _Env;
|
IHostingEnvironment _Env;
|
||||||
|
|
||||||
[TempData]
|
[TempData]
|
||||||
|
@ -193,6 +196,7 @@ namespace BTCPayServer.Controllers
|
||||||
vm.Id = store.Id;
|
vm.Id = store.Id;
|
||||||
vm.StoreName = store.StoreName;
|
vm.StoreName = store.StoreName;
|
||||||
vm.SetCryptoCurrencies(_ExplorerProvider, store.GetDefaultCrypto());
|
vm.SetCryptoCurrencies(_ExplorerProvider, store.GetDefaultCrypto());
|
||||||
|
vm.SetLanguages(_LangService, storeBlob.DefaultLang);
|
||||||
vm.StoreWebsite = store.StoreWebsite;
|
vm.StoreWebsite = store.StoreWebsite;
|
||||||
vm.NetworkFee = !storeBlob.NetworkFeeDisabled;
|
vm.NetworkFee = !storeBlob.NetworkFeeDisabled;
|
||||||
vm.SpeedPolicy = store.SpeedPolicy;
|
vm.SpeedPolicy = store.SpeedPolicy;
|
||||||
|
@ -205,6 +209,7 @@ namespace BTCPayServer.Controllers
|
||||||
vm.AllowCoinConversion = storeBlob.AllowCoinConversion;
|
vm.AllowCoinConversion = storeBlob.AllowCoinConversion;
|
||||||
return View(vm);
|
return View(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void AddPaymentMethods(StoreData store, StoreViewModel vm)
|
private void AddPaymentMethods(StoreData store, StoreViewModel vm)
|
||||||
{
|
{
|
||||||
|
@ -243,6 +248,7 @@ namespace BTCPayServer.Controllers
|
||||||
[Route("{storeId}")]
|
[Route("{storeId}")]
|
||||||
public async Task<IActionResult> UpdateStore(string storeId, StoreViewModel model)
|
public async Task<IActionResult> UpdateStore(string storeId, StoreViewModel model)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!ModelState.IsValid)
|
if (!ModelState.IsValid)
|
||||||
{
|
{
|
||||||
return View(model);
|
return View(model);
|
||||||
|
@ -277,11 +283,13 @@ namespace BTCPayServer.Controllers
|
||||||
store.SetDefaultCrypto(model.DefaultCryptoCurrency);
|
store.SetDefaultCrypto(model.DefaultCryptoCurrency);
|
||||||
}
|
}
|
||||||
model.SetCryptoCurrencies(_ExplorerProvider, model.DefaultCryptoCurrency);
|
model.SetCryptoCurrencies(_ExplorerProvider, model.DefaultCryptoCurrency);
|
||||||
|
model.SetLanguages(_LangService, model.DefaultLang);
|
||||||
|
|
||||||
var blob = store.GetStoreBlob();
|
var blob = store.GetStoreBlob();
|
||||||
blob.NetworkFeeDisabled = !model.NetworkFee;
|
blob.NetworkFeeDisabled = !model.NetworkFee;
|
||||||
blob.MonitoringExpiration = model.MonitoringExpiration;
|
blob.MonitoringExpiration = model.MonitoringExpiration;
|
||||||
blob.InvoiceExpiration = model.InvoiceExpiration;
|
blob.InvoiceExpiration = model.InvoiceExpiration;
|
||||||
|
blob.DefaultLang = model.DefaultLang;
|
||||||
|
|
||||||
bool newExchange = blob.PreferredExchange != model.PreferredExchange;
|
bool newExchange = blob.PreferredExchange != model.PreferredExchange;
|
||||||
blob.PreferredExchange = model.PreferredExchange;
|
blob.PreferredExchange = model.PreferredExchange;
|
||||||
|
|
|
@ -217,6 +217,7 @@ namespace BTCPayServer.Data
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
public string DefaultLang { get; set; }
|
||||||
[DefaultValue(60)]
|
[DefaultValue(60)]
|
||||||
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
||||||
public int MonitoringExpiration
|
public int MonitoringExpiration
|
||||||
|
|
|
@ -134,6 +134,7 @@ namespace BTCPayServer.Hosting
|
||||||
return opts.NetworkProvider;
|
return opts.NetworkProvider;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
services.TryAddSingleton<LanguageService>();
|
||||||
services.TryAddSingleton<NBXplorerDashboard>();
|
services.TryAddSingleton<NBXplorerDashboard>();
|
||||||
services.TryAddSingleton<StoreRepository>();
|
services.TryAddSingleton<StoreRepository>();
|
||||||
services.TryAddSingleton<BTCPayWalletProvider>();
|
services.TryAddSingleton<BTCPayWalletProvider>();
|
||||||
|
|
|
@ -13,6 +13,8 @@ namespace BTCPayServer.Models.InvoicingModels
|
||||||
public string CryptoImage { get; set; }
|
public string CryptoImage { get; set; }
|
||||||
public string Link { get; set; }
|
public string Link { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string DefaultLang { get; set; }
|
||||||
public List<AvailableCrypto> AvailableCryptos { get; set; } = new List<AvailableCrypto>();
|
public List<AvailableCrypto> AvailableCryptos { get; set; } = new List<AvailableCrypto>();
|
||||||
public string CryptoCode { get; set; }
|
public string CryptoCode { get; set; }
|
||||||
public string ServerUrl { get; set; }
|
public string ServerUrl { get; set; }
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using BTCPayServer.Services.Invoices;
|
using BTCPayServer.Services;
|
||||||
|
using BTCPayServer.Services.Invoices;
|
||||||
using BTCPayServer.Validations;
|
using BTCPayServer.Validations;
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
using System;
|
using System;
|
||||||
|
@ -105,9 +106,12 @@ namespace BTCPayServer.Models.StoreViewModels
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
public SelectList CryptoCurrencies { get; set; }
|
public SelectList CryptoCurrencies { get; set; }
|
||||||
|
public SelectList Languages { get; set; }
|
||||||
|
|
||||||
[Display(Name = "Default crypto currency on checkout")]
|
[Display(Name = "Default crypto currency on checkout")]
|
||||||
public string DefaultCryptoCurrency { get; set; }
|
public string DefaultCryptoCurrency { get; set; }
|
||||||
|
[Display(Name = "Default language on checkout")]
|
||||||
|
public string DefaultLang { get; set; }
|
||||||
|
|
||||||
public class LightningNode
|
public class LightningNode
|
||||||
{
|
{
|
||||||
|
@ -122,9 +126,18 @@ namespace BTCPayServer.Models.StoreViewModels
|
||||||
public void SetCryptoCurrencies(ExplorerClientProvider explorerProvider, string defaultCrypto)
|
public void SetCryptoCurrencies(ExplorerClientProvider explorerProvider, string defaultCrypto)
|
||||||
{
|
{
|
||||||
var choices = explorerProvider.GetAll().Select(o => new Format() { Name = o.Item1.CryptoCode, Value = o.Item1.CryptoCode }).ToArray();
|
var choices = explorerProvider.GetAll().Select(o => new Format() { Name = o.Item1.CryptoCode, Value = o.Item1.CryptoCode }).ToArray();
|
||||||
var chosen = choices.FirstOrDefault(f => f.Name == defaultCrypto) ?? choices.FirstOrDefault();
|
var chosen = choices.FirstOrDefault(f => f.Value == defaultCrypto) ?? choices.FirstOrDefault();
|
||||||
CryptoCurrencies = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen);
|
CryptoCurrencies = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen);
|
||||||
DefaultCryptoCurrency = chosen.Name;
|
DefaultCryptoCurrency = chosen.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetLanguages(LanguageService langService, string defaultLang)
|
||||||
|
{
|
||||||
|
defaultLang = defaultLang ?? "en-US";
|
||||||
|
var choices = langService.GetLanguages().Select(o => new Format() { Name = o.DisplayName, Value = o.Code }).ToArray();
|
||||||
|
var chosen = choices.FirstOrDefault(f => f.Value == defaultLang) ?? choices.FirstOrDefault();
|
||||||
|
Languages = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen);
|
||||||
|
DefaultLang = chosen.Value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development",
|
"ASPNETCORE_ENVIRONMENT": "Development",
|
||||||
"BTCPAY_CHAINS": "btc,ltc",
|
"BTCPAY_CHAINS": "btc,ltc",
|
||||||
"BTCPAY_BTCLIGHTNING": "http://api-token:foiewnccewuify@127.0.0.1:54938/",
|
"BTCPAY_BTCLIGHTNING": "http://api-token:foiewnccewuify@127.0.0.1:54938/",
|
||||||
"BTCPAY_POSTGRES": "User ID=postgres;Host=127.0.0.1;Port=39372;Database=btcpayserver"
|
"BTCPAY_POSTGRES": "User ID=postgres;Host=127.0.0.1;Port=39372;Database=btcpayserver",
|
||||||
|
"BTCPAY_BUNDLEJSCSS": "false"
|
||||||
},
|
},
|
||||||
"applicationUrl": "http://127.0.0.1:14142/"
|
"applicationUrl": "http://127.0.0.1:14142/"
|
||||||
}
|
}
|
||||||
|
|
32
BTCPayServer/Services/LanguageService.cs
Normal file
32
BTCPayServer/Services/LanguageService.cs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace BTCPayServer.Services
|
||||||
|
{
|
||||||
|
public class Language
|
||||||
|
{
|
||||||
|
public Language(string code, string displayName)
|
||||||
|
{
|
||||||
|
DisplayName = displayName;
|
||||||
|
Code = code;
|
||||||
|
}
|
||||||
|
public string Code { get; set; }
|
||||||
|
public string DisplayName { get; set; }
|
||||||
|
}
|
||||||
|
public class LanguageService
|
||||||
|
{
|
||||||
|
public Language[] GetLanguages()
|
||||||
|
{
|
||||||
|
return new[]
|
||||||
|
{
|
||||||
|
new Language("en-US", "English"),
|
||||||
|
new Language("de-DE", "Deutsch"),
|
||||||
|
new Language("ja-JP", "日本語"),
|
||||||
|
new Language("fr-FR", "Français"),
|
||||||
|
new Language("es-ES", "Spanish"),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
@addTagHelper *, Meziantou.AspNetCore.BundleTagHelpers
|
@addTagHelper *, Meziantou.AspNetCore.BundleTagHelpers
|
||||||
|
@inject BTCPayServer.Services.LanguageService langService
|
||||||
@model PaymentModel
|
@model PaymentModel
|
||||||
@{
|
@{
|
||||||
Layout = null;
|
Layout = null;
|
||||||
|
@ -59,16 +60,18 @@
|
||||||
{{$t("nested.lang")}} >>
|
{{$t("nested.lang")}} >>
|
||||||
*@
|
*@
|
||||||
<select class="cmblang reverse invisible" onchange="changeLanguage($(this).val())">
|
<select class="cmblang reverse invisible" onchange="changeLanguage($(this).val())">
|
||||||
<option value="en-US">English</option>
|
@foreach(var lang in langService.GetLanguages())
|
||||||
<option value="de-DE">Deutsch</option>
|
{
|
||||||
<option value="ja-JP">日本語</option>
|
<option value="@lang.Code">@lang.DisplayName</option>
|
||||||
<option value="fr-FR">Français</option>
|
}
|
||||||
<option value="es-ES">Spanish</option>
|
|
||||||
</select>
|
</select>
|
||||||
<script>
|
<script>
|
||||||
$(function () {
|
$(function () {
|
||||||
|
var storeDefaultLang = '@Model.DefaultLang';
|
||||||
if (urlParams.lang) {
|
if (urlParams.lang) {
|
||||||
$(".cmblang").val(urlParams.lang);
|
$(".cmblang").val(urlParams.lang);
|
||||||
|
} else if (storeDefaultLang) {
|
||||||
|
$(".cmblang").val(storeDefaultLang);
|
||||||
}
|
}
|
||||||
|
|
||||||
$('select').prettyDropdown({
|
$('select').prettyDropdown({
|
||||||
|
@ -85,9 +88,11 @@
|
||||||
</div>
|
</div>
|
||||||
</invoice>
|
</invoice>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
var storeDefaultLang = '@Model.DefaultLang';
|
||||||
|
var storeDefaultLangGlobal = storeDefaultLang.split("-")[0];
|
||||||
// initialization
|
// initialization
|
||||||
i18next.init({
|
i18next.init({
|
||||||
lng: 'en',
|
lng: storeDefaultLangGlobal,
|
||||||
fallbackLng: 'en',
|
fallbackLng: 'en',
|
||||||
nsSeparator: false,
|
nsSeparator: false,
|
||||||
keySeparator: false,
|
keySeparator: false,
|
||||||
|
@ -107,6 +112,9 @@
|
||||||
if (urlParams.lang) {
|
if (urlParams.lang) {
|
||||||
changeLanguage(urlParams.lang);
|
changeLanguage(urlParams.lang);
|
||||||
}
|
}
|
||||||
|
else if (storeDefaultLang) {
|
||||||
|
changeLanguage(storeDefaultLang);
|
||||||
|
}
|
||||||
|
|
||||||
const i18n = new VueI18next(i18next);
|
const i18n = new VueI18next(i18next);
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,10 @@
|
||||||
<label asp-for="DefaultCryptoCurrency"></label>
|
<label asp-for="DefaultCryptoCurrency"></label>
|
||||||
<select asp-for="DefaultCryptoCurrency" asp-items="Model.CryptoCurrencies" class="form-control"></select>
|
<select asp-for="DefaultCryptoCurrency" asp-items="Model.CryptoCurrencies" class="form-control"></select>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="DefaultLang"></label>
|
||||||
|
<select asp-for="DefaultLang" asp-items="Model.Languages" class="form-control"></select>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="NetworkFee"></label>
|
<label asp-for="NetworkFee"></label>
|
||||||
<input asp-for="NetworkFee" type="checkbox" class="form-check" />
|
<input asp-for="NetworkFee" type="checkbox" class="form-check" />
|
||||||
|
@ -89,20 +93,20 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach (var scheme in Model.DerivationSchemes)
|
@foreach(var scheme in Model.DerivationSchemes)
|
||||||
{
|
{
|
||||||
<tr>
|
<tr>
|
||||||
<td>@scheme.Crypto</td>
|
<td>@scheme.Crypto</td>
|
||||||
<td style="max-width:300px;overflow:hidden;">@scheme.Value</td>
|
<td style="max-width:300px;overflow:hidden;">@scheme.Value</td>
|
||||||
<td style="text-align:right">
|
<td style="text-align:right">
|
||||||
@if(!string.IsNullOrWhiteSpace(scheme.Value))
|
@if(!string.IsNullOrWhiteSpace(scheme.Value))
|
||||||
{
|
{
|
||||||
<a asp-action="Wallet" asp-route-cryptoCode="@scheme.Crypto">Wallet</a><span> - </span>
|
<a asp-action="Wallet" asp-route-cryptoCode="@scheme.Crypto">Wallet</a><span> - </span>
|
||||||
}
|
}
|
||||||
<a asp-action="AddDerivationScheme" asp-route-cryptoCode="@scheme.Crypto">Modify</a>
|
<a asp-action="AddDerivationScheme" asp-route-cryptoCode="@scheme.Crypto">Modify</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
@ -125,14 +129,14 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach (var scheme in Model.LightningNodes)
|
@foreach(var scheme in Model.LightningNodes)
|
||||||
{
|
{
|
||||||
<tr>
|
<tr>
|
||||||
<td>@scheme.CryptoCode</td>
|
<td>@scheme.CryptoCode</td>
|
||||||
<td>@scheme.Address</td>
|
<td>@scheme.Address</td>
|
||||||
<td style="text-align:right"><a asp-action="AddLightningNode" asp-route-cryptoCode="@scheme.CryptoCode">Modify</a></td>
|
<td style="text-align:right"><a asp-action="AddLightningNode" asp-route-cryptoCode="@scheme.CryptoCode">Modify</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
<th>Website</th>
|
<th>Website</th>
|
||||||
|
<th>On-Chain balances</th>
|
||||||
<th style="text-align:right">Actions</th>
|
<th style="text-align:right">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
Loading…
Add table
Reference in a new issue