Culture Assigner
This section describes how to add a culture assigner selection dropdown.
Add IOptions<RequestLozalizationOptions> service.
services.Configure<RequestLocalizationOptions>(options =>
{
options.AddSupportedCultures("en", "fi", "sv");
options.AddSupportedUICultures("en", "fi", "sv");
options.SetDefaultCulture("en");
options.FallBackToParentCultures = true;
options.FallBackToParentUICultures = true;
});
Add .UseRequestLocalization to 'app'.
RequestLocalizationOptions localizationOptions = app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(localizationOptions);
Add Models/CultureAssignmentModel.cs
namespace samples.asp.Models;
using System.Globalization;
/// <summary>Culture assignment model</summary>
public record CultureAssignmentModel(CultureInfo CurrentUICulture, IList<CultureInfo> SupportedCultures);
Add Pages/Components/CultureAssignment/default.cshtml.
@using System.Globalization
@model samples.asp.Models.CultureAssignmentModel
<form id="culture-assignment">
<select name="culture" onchange="this.parentElement.submit();">
@foreach (CultureInfo culture in Model.SupportedCultures)
{
<option value="@culture.Name" selected="@(Model!.CurrentUICulture.Name == culture.Name)">@culture.DisplayName</option>
}
</select>
</form>
Add Pages/ViewComponents/CultureAssignmentViewComponent.cs.
namespace samples.asp.ViewComponents;
using System.Globalization;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using samples.asp.Models;
/// <summary></summary>
public class CultureAssignmentViewComponent : ViewComponent
{
/// <summary>Options</summary>
IOptions<RequestLocalizationOptions> localizationOptions;
/// <summary>Create component</summary>
public CultureAssignmentViewComponent(IOptions<RequestLocalizationOptions> localizationOptions)
{
// Assert not null
ArgumentNullException.ThrowIfNull(localizationOptions);
this.localizationOptions = localizationOptions;
}
/// <summary>Assign culture</summary>
public IViewComponentResult Invoke()
{
// Get culture feature with assigned culture
IRequestCultureFeature cultureFeature = HttpContext.Features.Get<IRequestCultureFeature>()!;
// Create model with culture assignment record
CultureAssignmentModel model = new CultureAssignmentModel(
CurrentUICulture: cultureFeature.RequestCulture.UICulture,
SupportedCultures: localizationOptions.Value.SupportedUICultures?.ToArray() ?? Array.Empty<CultureInfo>()
);
// Return partial view
return View(model);
}
}
Add @addTagHelper *, samples.asp to Pages/_ViewImports.cshtml.
@using samples.asp
@using samples.asp.Models
@namespace samples.asp.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, samples.asp
Add <vc:culture-assignment/> to Pages/Shared/_Layout.cshtml.
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">samples.asp</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
</div>
<vc:culture-assignment/>
</div>