Can set store default language

This commit is contained in:
nicolas.dorier 2018-03-23 17:27:48 +09:00
parent e51f3dd1ae
commit 7d17bf7f2a
11 changed files with 105 additions and 33 deletions

View file

@ -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()

View file

@ -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;

View file

@ -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

View file

@ -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>();

View file

@ -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; }

View file

@ -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;
}
} }
} }

View file

@ -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/"
} }

View 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"),
};
}
}
}

View file

@ -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);

View file

@ -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>

View file

@ -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>