From f23e2a3ec4f3fb0b822762f505df4971a06eca9b Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Fri, 9 Nov 2018 08:48:38 +0100 Subject: [PATCH] async i18n and json translation format (#369) * start working on loading locales async and as json * finish off langs and UI * fix path * fix tests --- .../Controllers/InvoiceController.UI.cs | 2 +- .../CheckoutExperienceViewModel.cs | 2 +- BTCPayServer/Services/LanguageService.cs | 71 ++++--- .../Views/Invoice/Checkout-Body.cshtml | 2 +- BTCPayServer/Views/Invoice/Checkout.cshtml | 64 ++---- BTCPayServer/bundleconfig.json | 1 + .../js/langs/cs.js => locales/cs.json} | 22 +- .../js/langs/de.js => locales/de.json} | 22 +- .../js/langs/en.js => locales/en.json} | 23 +- .../js/langs/es.js => locales/es.json} | 19 +- .../js/langs/fr.js => locales/fr.json} | 22 +- .../js/langs/hr.js => locales/hr.json} | 20 +- .../js/langs/is.js => locales/is.json} | 22 +- .../js/langs/it.js => locales/it.json} | 22 +- .../js/langs/ja.js => locales/ja.json} | 22 +- .../js/langs/kk.js => locales/kk.json} | 22 +- .../js/langs/nl.js => locales/nl.json} | 22 +- .../js/langs/np.js => locales/np.json} | 22 +- .../js/langs/pt.js => locales/pt.json} | 22 +- .../js/langs/pt_BR.js => locales/pt_BR.json} | 22 +- .../js/langs/ru.js => locales/ru.json} | 22 +- .../js/langs/uk.js => locales/uk.json} | 22 +- .../js/langs/vi.js => locales/vi.json} | 22 +- .../js/langs/zh_SP.js => locales/zh_SP.json} | 22 +- .../vendor/i18next/i18nextXHRBackend.js | 198 ++++++++++++++++++ 25 files changed, 379 insertions(+), 353 deletions(-) rename BTCPayServer/wwwroot/{checkout/js/langs/cs.js => locales/cs.json} (87%) rename BTCPayServer/wwwroot/{checkout/js/langs/de.js => locales/de.json} (87%) rename BTCPayServer/wwwroot/{checkout/js/langs/en.js => locales/en.json} (87%) rename BTCPayServer/wwwroot/{checkout/js/langs/es.js => locales/es.json} (92%) rename BTCPayServer/wwwroot/{checkout/js/langs/fr.js => locales/fr.json} (87%) rename BTCPayServer/wwwroot/{checkout/js/langs/hr.js => locales/hr.json} (86%) rename BTCPayServer/wwwroot/{checkout/js/langs/is.js => locales/is.json} (89%) rename BTCPayServer/wwwroot/{checkout/js/langs/it.js => locales/it.json} (87%) rename BTCPayServer/wwwroot/{checkout/js/langs/ja.js => locales/ja.json} (92%) rename BTCPayServer/wwwroot/{checkout/js/langs/kk.js => locales/kk.json} (90%) rename BTCPayServer/wwwroot/{checkout/js/langs/nl.js => locales/nl.json} (87%) rename BTCPayServer/wwwroot/{checkout/js/langs/np.js => locales/np.json} (89%) rename BTCPayServer/wwwroot/{checkout/js/langs/pt.js => locales/pt.json} (87%) rename BTCPayServer/wwwroot/{checkout/js/langs/pt_BR.js => locales/pt_BR.json} (87%) rename BTCPayServer/wwwroot/{checkout/js/langs/ru.js => locales/ru.json} (90%) rename BTCPayServer/wwwroot/{checkout/js/langs/uk.js => locales/uk.json} (90%) rename BTCPayServer/wwwroot/{checkout/js/langs/vi.js => locales/vi.json} (90%) rename BTCPayServer/wwwroot/{checkout/js/langs/zh_SP.js => locales/zh_SP.json} (87%) create mode 100644 BTCPayServer/wwwroot/vendor/i18next/i18nextXHRBackend.js diff --git a/BTCPayServer/Controllers/InvoiceController.UI.cs b/BTCPayServer/Controllers/InvoiceController.UI.cs index d29269307..820bc115f 100644 --- a/BTCPayServer/Controllers/InvoiceController.UI.cs +++ b/BTCPayServer/Controllers/InvoiceController.UI.cs @@ -270,7 +270,7 @@ namespace BTCPayServer.Controllers ServerUrl = HttpContext.Request.GetAbsoluteRoot(), OrderId = invoice.OrderId, InvoiceId = invoice.Id, - DefaultLang = storeBlob.DefaultLang ?? "en-US", + DefaultLang = storeBlob.DefaultLang ?? "en", HtmlTitle = storeBlob.HtmlTitle ?? "BTCPay Invoice", CustomCSSLink = storeBlob.CustomCSS?.AbsoluteUri, CustomLogoLink = storeBlob.CustomLogo?.AbsoluteUri, diff --git a/BTCPayServer/Models/StoreViewModels/CheckoutExperienceViewModel.cs b/BTCPayServer/Models/StoreViewModels/CheckoutExperienceViewModel.cs index a77cccd0c..ba211cd07 100644 --- a/BTCPayServer/Models/StoreViewModels/CheckoutExperienceViewModel.cs +++ b/BTCPayServer/Models/StoreViewModels/CheckoutExperienceViewModel.cs @@ -58,7 +58,7 @@ namespace BTCPayServer.Models.StoreViewModels public void SetLanguages(LanguageService langService, string defaultLang) { - defaultLang = defaultLang ?? "en-US"; + defaultLang = defaultLang ?? "en"; 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); diff --git a/BTCPayServer/Services/LanguageService.cs b/BTCPayServer/Services/LanguageService.cs index b82872e7b..17dae1601 100644 --- a/BTCPayServer/Services/LanguageService.cs +++ b/BTCPayServer/Services/LanguageService.cs @@ -1,7 +1,11 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; +using System.IO; using System.Linq; -using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting.Internal; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; namespace BTCPayServer.Services { @@ -12,34 +16,53 @@ namespace BTCPayServer.Services DisplayName = displayName; Code = code; } + + [JsonProperty("code")] public string Code { get; set; } + [JsonProperty("currentLanguage")] public string DisplayName { get; set; } } + public class LanguageService { + private readonly Language[] _languages; + + public LanguageService(IHostingEnvironment environment) + { + var path = (environment as HostingEnvironment)?.WebRootPath; + if (string.IsNullOrEmpty(path)) + { + //test environment + path = Path.Combine(TryGetSolutionDirectoryInfo().FullName,"BTCPayServer", "wwwroot"); + } + path = Path.Combine(path, "locales"); + var files = Directory.GetFiles(path, "*.json"); + var result = new List(); + foreach (var file in files) + { + using (var stream = new StreamReader(file)) + { + var json = stream.ReadToEnd(); + result.Add(JObject.Parse(json).ToObject()); + } + } + + _languages = result.ToArray(); + } + + private static DirectoryInfo TryGetSolutionDirectoryInfo(string currentPath = null) + { + var directory = new DirectoryInfo( + currentPath ?? Directory.GetCurrentDirectory()); + while (directory != null && !directory.GetFiles("*.sln").Any()) + { + directory = directory.Parent; + } + return directory; + } 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"), - new Language("pt-PT", "Portuguese"), - new Language("pt-BR", "Portuguese (Brazil)"), - new Language("nl-NL", "Dutch"), - new Language("np-NP", "नेपाली"), - new Language("cs-CZ", "Česky"), - new Language("is-IS", "Íslenska"), - new Language("hr-HR", "Croatian"), - new Language("it-IT", "Italiano"), - new Language("kk-KZ", "Қазақша"), - new Language("ru-RU", "русский"), - new Language("uk-UA", "Українська"), - new Language("vi-VN", "Tiếng Việt"), - new Language("zh-SP", "中文(简体)"), - }; + return _languages; } } } diff --git a/BTCPayServer/Views/Invoice/Checkout-Body.cshtml b/BTCPayServer/Views/Invoice/Checkout-Body.cshtml index 40bf5ab4b..03c2d2cf6 100644 --- a/BTCPayServer/Views/Invoice/Checkout-Body.cshtml +++ b/BTCPayServer/Views/Invoice/Checkout-Body.cshtml @@ -288,7 +288,7 @@ :disabled="isLoading" v-on:change="onCurrencyChange($event)" ref="changellyCurrenciesDropdown"> - +