ASP.NET Core Blazor 全球化和本地化ASP.NET Core Blazor globalization and localization

本文内容

作者:Luke LathamDaniel Roth

Razor 组件可供位于不同区域、使用不同语言的用户使用。以下 .NET 全球化和本地化方案可用:

  • .NET 资源系统
  • 特定于区域性的数字和日期格式

当前支持有限的 ASP.NET Core 本地化方案:

  • Blazor 应用中支持 IStringLocalizer<>
  • IHtmlLocalizer<>IViewLocalizer<> 和数据注释本地化是 ASP.NET Core MVC 方案,在 Blazor 应用中不受支持 。

有关详细信息,请参阅 ASP.NET Core 全球化和本地化

全球化Globalization

Blazor@bind 功能基于用户的当前区域性执行格式并分析值以进行显示。

可从 System.Globalization.CultureInfo.CurrentCulture 属性访问当前区域性。

CultureInfo.InvariantCulture 用于以下字段类型 (<input type="{TYPE}" />):

  • date
  • number

上述字段类型:

  • 使用其基于浏览器的相应格式规则进行显示。
  • 不能包含自由格式的文本。
  • 基于浏览器的实现提供用户交互特性。

以下字段类型具有特定的格式要求且当前不受 Blazor 支持,因为所有主流浏览器均不支持它们:

  • datetime-local
  • month
  • week

@bind 支持 @bind:culture 参数,以提供用于分析值并设置值格式的 System.Globalization.CultureInfo使用 datenumber 字段类型时,不建议指定区域性。datenumber 具有可提供所需区域性的内置 Blazor 支持。

本地化Localization

Blazor 服务器应用使用本地化中间件进行本地化。中间件为从应用请求资源的用户选择相应的区域性。

可使用以下方法之一设置区域性:

有关更多信息和示例,请参见ASP.NET Core 全球化和本地化

为国际化配置链接器 (Blazor WebAssembly)Configure the linker for internationalization (Blazor WebAssembly)

默认情况下,Blazor 对于 Blazor WebAssembly 应用的链接器配置会去除国际化信息(显式请求的区域设置除外)。有关控制链接器行为的详细信息和指南,请参阅 配置 ASP.NET Core Blazor 链接器

CookieCookies

本地化区域性 cookie 可以保留用户的区域性。该 cookie 是通过应用主机页 (Pages/Host.cshtml.cs) 的 OnGet 方法创建的 。本地化中间件会在后续请求上读取 cookie,以设置用户的区域性。

使用 cookie 可确保 WebSocket 连接可以正确地传播区域性。如果本地化方案基于 URL 路径或查询字符串,则该方案可能无法与 Websocket 协同使用,因而无法保留区域性。因此,建议的方式是使用本地化区域性 cookie。

如果在本地化 cookie 中保留了区域性,则可以使用任意方法来分配区域性。如果该应用已经为服务器端 ASP.NET Core 建立了本地化方案,请继续使用应用的现有本地化基础结构,并在应用方案中设置本地化区域性 cookie。

下面的示例演示如何在可由本地化中间件读取的 cookie 中设置当前区域性。在 Blazor 服务器应用中创建包含以下内容的 Pages/Host.cshtml.cs 文件 :

  1. public class HostModel : PageModel
  2. {
  3. public void OnGet()
  4. {
  5. HttpContext.Response.Cookies.Append(
  6. CookieRequestCultureProvider.DefaultCookieName,
  7. CookieRequestCultureProvider.MakeCookieValue(
  8. new RequestCulture(
  9. CultureInfo.CurrentCulture,
  10. CultureInfo.CurrentUICulture)));
  11. }
  12. }

本地化由应用按以下事件顺序进行处理:

  • 浏览器向应用发送初始 HTTP 请求。
  • 本地化中间件分配区域性。
  • _Host.cshtml.cs 中的 OnGet 方法将区域性作为响应的一部分保留在 cookie 中 。
  • 浏览器打开 WebSocket 连接以创建交互式 Blazor 服务器会话。
  • 本地化中间件读取 cookie 并分配区域性。
  • Blazor 服务器会话以正确的区域性开始。

提供用于选择区域性的 UIProvide UI to choose the culture

若要提供支持用户选择区域性的 UI,建议使用基于重定向的方法 。此过程类似于用户尝试访问安全资源时在 web 应用中发生的情况 — 用户重定向到登录页,然后重定向回原始资源。

应用通过重定向到控制器来保留用户的所选区域性。控制器将用户选择的区域性设置为 cookie,然后将用户重定向回原始 URI。

在服务器上创建一个 HTTP 终结点,以在 cookie 中设置用户的所选区域性,并执行重定向回原始 URI:

  1. [Route("[controller]/[action]")]
  2. public class CultureController : Controller
  3. {
  4. public IActionResult SetCulture(string culture, string redirectUri)
  5. {
  6. if (culture != null)
  7. {
  8. HttpContext.Response.Cookies.Append(
  9. CookieRequestCultureProvider.DefaultCookieName,
  10. CookieRequestCultureProvider.MakeCookieValue(
  11. new RequestCulture(culture)));
  12. }
  13. return LocalRedirect(redirectUri);
  14. }
  15. }

警告

使用 LocalRedirect 操作结果以阻止开放式重定向攻击。有关详细信息,请参阅 防止在 ASP.NET Core 中的打开重定向攻击

以下组件显示了一个示例,说明如何在用户选择区域性时执行初始重定向:

  1. @inject NavigationManager NavigationManager
  2. <h3>Select your language</h3>
  3. <select @onchange="OnSelected">
  4. <option>Select...</option>
  5. <option value="en-US">English</option>
  6. <option value="fr-FR">Français</option>
  7. </select>
  8. @code {
  9. private void OnSelected(ChangeEventArgs e)
  10. {
  11. var culture = (string)e.Value;
  12. var uri = new Uri(NavigationManager.Uri())
  13. .GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
  14. var query = $"?culture={Uri.EscapeDataString(culture)}&" +
  15. $"redirectUri={Uri.EscapeDataString(uri)}";
  16. NavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true);
  17. }
  18. }

其他资源Additional resources