From baac20ced07513019e698c4e2a64bb6c245edab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 5 Sep 2020 20:23:41 +0300 Subject: [PATCH] Implemented POC for the language switch. --- .../BlazorClientHttpMessageHandler.cs | 42 ++++++++++++ .../MyProjectNameBlazorModule.cs | 12 ++++ .../Shared/LanguageSwitch.razor | 67 +++++++++++++++++++ .../Shared/MainLayout.razor | 3 +- 4 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/BlazorClientHttpMessageHandler.cs create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/LanguageSwitch.razor diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/BlazorClientHttpMessageHandler.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/BlazorClientHttpMessageHandler.cs new file mode 100644 index 0000000000..8c96325b6d --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/BlazorClientHttpMessageHandler.cs @@ -0,0 +1,42 @@ +using System; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.JSInterop; +using Volo.Abp.DependencyInjection; + +namespace MyCompanyName.MyProjectName.Blazor +{ + public class BlazorClientHttpMessageHandler : DelegatingHandler, ITransientDependency + { + private readonly IJSRuntime _jsRuntime; + + public BlazorClientHttpMessageHandler(IJSRuntime jsRuntime) + { + _jsRuntime = jsRuntime; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + await SetLanguageAsync(request, cancellationToken); + + return await base.SendAsync(request, cancellationToken); + } + + private async Task SetLanguageAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var selectedLanguage = await _jsRuntime.InvokeAsync( + "localStorage.getItem", + cancellationToken, + "Abp.SelectedLanguage" + ); + + if (!selectedLanguage.IsNullOrWhiteSpace()) + { + request.Headers.AcceptLanguage.Clear(); + request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(selectedLanguage)); + } + } + } +} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs index 996c8a4925..fa3dcd8d51 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp; using Volo.Abp.AspNetCore.Components.WebAssembly; using Volo.Abp.Autofac; +using Volo.Abp.Http.Client; using Volo.Abp.Http.Client.IdentityModel.WebAssembly; using Volo.Abp.Identity.Blazor; using Volo.Abp.Modularity; @@ -24,6 +25,17 @@ namespace MyCompanyName.MyProjectName.Blazor )] public class MyProjectNameBlazorModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.ProxyClientBuildActions.Add((_, builder) => + { + builder.AddHttpMessageHandler(); + }); + }); + } + public override void ConfigureServices(ServiceConfigurationContext context) { var environment = context.Services.GetSingletonInstance(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/LanguageSwitch.razor b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/LanguageSwitch.razor new file mode 100644 index 0000000000..05c14e0a3f --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/LanguageSwitch.razor @@ -0,0 +1,67 @@ +@using Volo.Abp.Localization +@using System.Globalization +@inject ILanguageProvider LanguageProvider +@inject IJSRuntime JsRuntime +@if (_languages != null && _languages.Count > 1) +{ + + + @_currentLanguage.DisplayName + + + @foreach (var language in _languages) + { + if (language == _currentLanguage) + { + continue; + } + + @language.DisplayName + } + + +} +@code { + private IReadOnlyList _languages; + private LanguageInfo _currentLanguage; + + protected override async Task OnInitializedAsync() + { + var selectedLanguageName = await JsRuntime.InvokeAsync( + "localStorage.getItem", + "Abp.SelectedLanguage" + ); + + _languages = await LanguageProvider.GetLanguagesAsync(); + + if (!_languages.Any()) + { + return; + } + + if (!selectedLanguageName.IsNullOrWhiteSpace()) + { + _currentLanguage = _languages.FirstOrDefault(l => l.UiCultureName == selectedLanguageName); + } + + if (_currentLanguage == null) + { + _currentLanguage = _languages.FirstOrDefault(l => l.UiCultureName == CultureInfo.CurrentUICulture.Name); + } + + if (_currentLanguage == null) + { + _currentLanguage = _languages.FirstOrDefault(); + } + } + + private async Task ChangeLanguageAsync(LanguageInfo language) + { + await JsRuntime.InvokeVoidAsync( + "localStorage.setItem", + "Abp.SelectedLanguage", language.UiCultureName + ); + + await JsRuntime.InvokeVoidAsync("location.reload"); + } +} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/MainLayout.razor b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/MainLayout.razor index fafa2f55f1..b01e17ddcd 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/MainLayout.razor +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/MainLayout.razor @@ -6,7 +6,8 @@
- + + About