Blazor 服务器应用程序中的全球化和本地化
Globalization and Localization in Blazor Server App
如何在 Blazor Server App 中进行全球化和本地化?
无法在 Blazor Server App 中找到全球化和本地化的工作示例,
我已经创建了一个我自己的。这是代码示例。复制并测试...
创建文件夹并将其命名为 Resources
将以下资源文件(.resx
)添加到文件夹中
Pages.Index.resx
: 添加字符串 Greetings 到 Name 列和 Hello!到
值列
Pages.Index.fr.resx
: 添加字符串 Greetings 到 Name 列和 Bonjour!
到值列
Pages.Index.de.resx
:将字符串 Greetings 添加到 Name 列和 Hallo
到值列
将名为 CultureSelector.razor 的组件添加到共享文件夹:
CultureSelector.razor
@using System.Globalization
@inject NavigationManager NavigationManager
@using System.Threading
<div>@SelectedCulture</div>
<select value="@SelectedCulture" @onchange="OnSelected">
@foreach (var culture in Cultures)
{
<option value="@culture.Value">@culture.Caption</option>
}
</select>
@code {
private void OnSelected(ChangeEventArgs e)
{
var culture = (string)e.Value;
var uri = new Uri(NavigationManager.Uri)
.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var query = $"?culture={Uri.EscapeDataString(culture)}&" +
$"redirectUri={Uri.EscapeDataString(uri)}";
NavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true);
}
public string SelectedCulture { get; set; } = Thread.CurrentThread.CurrentUICulture.Name;
public class CultureData
{
public string Caption { get; set; }
public string Value { get; set; }
}
public List<CultureData> Cultures { get; set; } = new List<CultureData>()
{
new CultureData() { Caption = "English", Value = "en-US" },
new CultureData() { Caption = "French", Value = "fr-FR" },
new CultureData() { Caption = "German", Value = "de-DE" },
};
}
像这样在 MainLayout 中实例化 CultureSelector 组件:
@inherits LayoutComponentBase
@using System.Linq;
@using System.Reflection
@using Microsoft.AspNetCore.Components
<div class="sidebar">
<NavMenu />
</div>
<div class="main">
<div class="top-row px-4">
<CultureSelector></CultureSelector>
<a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>
<div class="content px-4">
@Body
</div>
</div>
用法(Index.razor)
@page "/"
@using Microsoft.Extensions.Localization
@inject Microsoft.Extensions.Localization.IStringLocalizer<Index> localizer
<h1>@localizer["Greetings"].Value</h1>
@code{ }
Startrup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath =
"Resources");
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddControllers();
services.Configure<RequestLocalizationOptions>(options =>
{
// define the list of cultures your app will support
var supportedCultures = new List<CultureInfo>()
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR"),
new CultureInfo("de-DE")
};
// set the default culture
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseRequestLocalization(
app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>
().Value);
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// enable controllers for the culture controller
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
添加控制器 class 到 Controllers 文件夹(如果存在。如果不添加一个)
将其命名为 CultureController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace <Put here the namespace of your app>.Controllers
{
[Route("[controller]/[action]")]
public class CultureController : Controller
{
public IActionResult SetCulture(string culture, string redirectUri)
{
if (culture != null)
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(culture)));
}
return LocalRedirect(redirectUri);
}
public IActionResult ResetCulture(string redirectUri)
{
HttpContext.Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
return LocalRedirect(redirectUri);
}
}
}
如何在 Blazor Server App 中进行全球化和本地化?
无法在 Blazor Server App 中找到全球化和本地化的工作示例, 我已经创建了一个我自己的。这是代码示例。复制并测试...
创建文件夹并将其命名为 Resources
将以下资源文件(
.resx
)添加到文件夹中Pages.Index.resx
: 添加字符串 Greetings 到 Name 列和 Hello!到 值列Pages.Index.fr.resx
: 添加字符串 Greetings 到 Name 列和 Bonjour! 到值列Pages.Index.de.resx
:将字符串 Greetings 添加到 Name 列和 Hallo 到值列将名为 CultureSelector.razor 的组件添加到共享文件夹:
CultureSelector.razor
@using System.Globalization
@inject NavigationManager NavigationManager
@using System.Threading
<div>@SelectedCulture</div>
<select value="@SelectedCulture" @onchange="OnSelected">
@foreach (var culture in Cultures)
{
<option value="@culture.Value">@culture.Caption</option>
}
</select>
@code {
private void OnSelected(ChangeEventArgs e)
{
var culture = (string)e.Value;
var uri = new Uri(NavigationManager.Uri)
.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var query = $"?culture={Uri.EscapeDataString(culture)}&" +
$"redirectUri={Uri.EscapeDataString(uri)}";
NavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true);
}
public string SelectedCulture { get; set; } = Thread.CurrentThread.CurrentUICulture.Name;
public class CultureData
{
public string Caption { get; set; }
public string Value { get; set; }
}
public List<CultureData> Cultures { get; set; } = new List<CultureData>()
{
new CultureData() { Caption = "English", Value = "en-US" },
new CultureData() { Caption = "French", Value = "fr-FR" },
new CultureData() { Caption = "German", Value = "de-DE" },
};
}
像这样在 MainLayout 中实例化 CultureSelector 组件:
@inherits LayoutComponentBase
@using System.Linq;
@using System.Reflection
@using Microsoft.AspNetCore.Components
<div class="sidebar">
<NavMenu />
</div>
<div class="main">
<div class="top-row px-4">
<CultureSelector></CultureSelector>
<a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>
<div class="content px-4">
@Body
</div>
</div>
用法(Index.razor)
@page "/"
@using Microsoft.Extensions.Localization
@inject Microsoft.Extensions.Localization.IStringLocalizer<Index> localizer
<h1>@localizer["Greetings"].Value</h1>
@code{ }
Startrup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath =
"Resources");
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddControllers();
services.Configure<RequestLocalizationOptions>(options =>
{
// define the list of cultures your app will support
var supportedCultures = new List<CultureInfo>()
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR"),
new CultureInfo("de-DE")
};
// set the default culture
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseRequestLocalization(
app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>
().Value);
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// enable controllers for the culture controller
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
添加控制器 class 到 Controllers 文件夹(如果存在。如果不添加一个) 将其命名为 CultureController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace <Put here the namespace of your app>.Controllers
{
[Route("[controller]/[action]")]
public class CultureController : Controller
{
public IActionResult SetCulture(string culture, string redirectUri)
{
if (culture != null)
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(culture)));
}
return LocalRedirect(redirectUri);
}
public IActionResult ResetCulture(string redirectUri)
{
HttpContext.Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
return LocalRedirect(redirectUri);
}
}
}