Browse Source

Implemented POC for the language switch.

pull/5399/head
Halil İbrahim Kalkan 6 years ago
parent
commit
baac20ced0
  1. 42
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/BlazorClientHttpMessageHandler.cs
  2. 12
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs
  3. 67
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/LanguageSwitch.razor
  4. 3
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/MainLayout.razor

42
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<HttpResponseMessage> 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<string>(
"localStorage.getItem",
cancellationToken,
"Abp.SelectedLanguage"
);
if (!selectedLanguage.IsNullOrWhiteSpace())
{
request.Headers.AcceptLanguage.Clear();
request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(selectedLanguage));
}
}
}
}

12
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<AbpHttpClientBuilderOptions>(options =>
{
options.ProxyClientBuildActions.Add((_, builder) =>
{
builder.AddHttpMessageHandler<BlazorClientHttpMessageHandler>();
});
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
var environment = context.Services.GetSingletonInstance<IWebAssemblyHostEnvironment>();

67
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)
{
<Dropdown>
<DropdownToggle Color="Color.None">
@_currentLanguage.DisplayName
</DropdownToggle>
<DropdownMenu>
@foreach (var language in _languages)
{
if (language == _currentLanguage)
{
continue;
}
<DropdownItem Clicked="() => ChangeLanguageAsync(language)">@language.DisplayName</DropdownItem>
}
</DropdownMenu>
</Dropdown>
}
@code {
private IReadOnlyList<LanguageInfo> _languages;
private LanguageInfo _currentLanguage;
protected override async Task OnInitializedAsync()
{
var selectedLanguageName = await JsRuntime.InvokeAsync<string>(
"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");
}
}

3
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Shared/MainLayout.razor

@ -6,7 +6,8 @@
<div class="main">
<div class="top-row px-4 auth">
<LoginDisplay />
<LanguageSwitch/>
<LoginDisplay/>
<a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>

Loading…
Cancel
Save