Reputation: 53
I created the resource file for localization. while page loading, it set the current culture info but changing the language from drop down list, it's not changing.
Here is my code,
Localization.razor:
@page "/"
@using System.Globalization
@using Microsoft.AspNetCore.Localization
@inject IStringLocalizer<Localization> localizer
<h3>@localizer["Title"]</h3>
@localizer["Content"]
<select @onchange="OnSelected">
<option>Select...</option>
<option value="en">English</option>
<option value="de">German</option>
</select>
@code {
private void OnSelected(ChangeEventArgs e)
{
// Code
}
}
What needs to write in OnSelected event for changing selected language?
Thanks in advance.
MainLayout.razor:
@inherits LayoutComponentBase
@inject NavigationManager NavigationManager
<div class="sidebar">
<NavMenu />
</div>
<div class="main">
<div class="top-row px-4">
<select @onchange="OnSelected">
<option value="en">English</option>
<option value="de">German</option>
</select>
</div>
<div class="content px-4">
@Body
</div>
</div>
@code {
private void OnSelected(ChangeEventArgs e)
{
var selectedCulture = e.Value.ToString();
CultureInfo.CurrentUICulture =
CultureInfo.GetCultures(CultureTypes.AllCultures)
.First(c => c.Name == selectedCulture);
}
}
Localization.razor:
@page "/"
@inject IStringLocalizer<Localization> localizer
<h3>@localizer["Title"]</h3>
@localizer["Content"]
Program.cs:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Startup.cs:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddLocalization(options => { options.ResourcesPath = "Resources"; });
var supportedCultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("de") };
services.Configure<RequestLocalizationOptions>(options =>
{
options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("de");
options.SupportedUICultures = supportedCultures;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRequestLocalization(app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
app.UseRouting();
app.ApplicationServices
.UseBootstrapProviders()
.UseFontAwesomeIcons();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
}
Upvotes: 1
Views: 3004
Reputation: 17444
You need to set the current culture :
@page "/"
@using System.Globalization
@using Microsoft.AspNetCore.Localization
@inject IStringLocalizer<Localization> localizer
<h3>@localizer["Title"]</h3>
@localizer["Content"]
<select @onchange="OnSelected">
<option>Select...</option>
<option value="en">English</option>
<option value="de">German</option>
</select>
@code {
private void OnSelected(ChangeEventArgs e)
{
// Code
var selectedCulture = e.Value.ToString();
CultureInfo.CurrentCulture = CultureInfo.GetCultures(CultureTypes.AllCultures)
.First(c => c.Name == selectedCulture);
}
}
Upvotes: 2