ASP.NET 核心 MVC 的内置功能进行多语言切换显示

更新页 :
页面创建日期 :

环境

Visual Studio
  • Visual Studio 2019
ASP.NET酷
  • 3.0
  • 3.1

入门

ASP.NET Core MVC 的本地化功能在多语言之间切换和显示。

为翻译的文本创建资源文件

创建文件夹以保存管理文本的资源文件 (Resx)。 地方可以是任何地方,但保持根直。 此路径还会影响其后设置。

右键单击项目并选择"添加"和"新建文件夹"。

image

将文件夹名称保留为"资源"。 此文件夹名称可以任意设置,但您可以在以下设置中指定此文件夹名称。

image

然后创建资源文件以输入每种语言的文本。

右键单击"资源"文件夹并选择"添加"和"新建项目"。

image

选择资源文件 (.resx)。 文件名可以是任意的,但应与以后指定的名称匹配。 在这里,我们假设"共享资源.resx"。

image

创建 .resx 文件后,双击该文件以将其打开,然后键入要标识文本的名称以及要实际显示的文本。 如果该语言不存在,则 SharedResource.resx 文件将使用该文件。 在这里,我输入日语。 如果要默认为其他语言(如英语),请键入该语言。

在这里,我们输入了"Hello"和"好"作为示例。 请注意,区分大小写。

image

继续为其他语言创建资源文件。 若要标识语言,请指定文件名,如SharedResource.< 区域性代码 >.resx。 区域性代码可以是 ISO 639 和 ISO 3166 的一个或两个组合。 由于支持的代码可能会不时更改,因此 Microsoft 网站上的"文化信息"类可能会更改。 页面等。

这一次,我们将准备en(英语)和es(西班牙语)。 日语是默认的,因此不提供。

image

在每个文件中,输入翻译的文本,并在所有文件上统一键。

image

image

然后,您将拥有仅定义类的文件。 这将创建与刚刚创建的资源文件相同的名称。

实际上,代码文件本身的名称并不重要,因为只需匹配其中的类名称,但保持相同的内容,以便于理解。 您可以在任何可以编写代码的文件夹。

image

将命名空间作为项目的根目录,并创建空类。

namespace LocalizationText
{
  // クラス名は作成した .resx のファイル名と同じにする必要がある
  public class SharedResource { }
}

修复每个程序

Startup.cs

修复Startup.cs。 在配置服务方法中,如下所示:

服务。 AddMvc()。 使用 AddView 本地化方法,视图和控制器端都翻译了文本。 我确认我可以得到,但 正如官方网站上也这样。 使用 AddLocalization 方法没有问题。

选项。 资源路径指定包含 Resx 文件的文件夹的路径。 如果同时指定两者,则服务。 AddMvc()。 AddView 本地化方法优先。

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews();

  // Resx ファイルのあるフォルダを指定する。
  // コントローラー側でしか使用しないならこちらでもよい。AddViewLocalization を使用するならこちらはなくても動作する。
  //services.AddLocalization(options => options.ResourcesPath = "Resources");

  services.AddMvc()
    // ローカライズに必要。Resx ファイルのフォルダパスを指定
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts => { opts.ResourcesPath = "Resources"; });
}

然后修改Startup.cs的配置方法。 如果只加载资源文件,则不需要它。 允许用户从任意位置指定语言所需的代码。

此处ASP.NET Core MVC 中内置了标准功能。 以下代码根据用户环境在"查询字符串"、"cookie"和"接受语言 HTTP 标头"中编写 您可以使用任何语言在显示语言之间切换。 稍后我们将找到实际操作方法。

现在,在数组中指定可切换语言。 我指定默认语言 ja,但这次我没有创建 ja 文件。 如果指定了 en、es 以外的语言,则使用 SharedResource.resx。

您可以将 UI 与任何其他支持的语言分开,但这样做没有多大好处。 指定相同的语言。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  if (env.IsDevelopment())
  {
    // 省略
  }

  // 標準の機能で切り替えたい言語を定義します。
  var supportedCultures = new[]
  {
    new CultureInfo("ja"),
    new CultureInfo("en"),
    new CultureInfo("es"),
  };

  // 標準の言語切り替え機能を有効にします。対応しているのは「クエリ文字列」「Cookie」「Accept-Language HTTP ヘッダー」です。
  app.UseRequestLocalization(new RequestLocalizationOptions
  {
    DefaultRequestCulture = new RequestCulture("ja"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
  });

  app.UseHttpsRedirection();
  app.UseStaticFiles();

  // 省略
}

控制器_HomeController.cs

控制器_HomeController.cs文件。 若要获取控制器端的本地化语言,请在构造函数中接受 IStringLocalizer。 SharedResource 必须与以前创建的资源文件与类具有相同的名称。 通过将在资源文件中输入的键字符串传递给接收的本地化器的 indekusa 来传递文本 可以检索。 获取哪些语言的文本取决于请求的文化。

顺便说一下,除了 IStringLocalizer 之外,还有一个 IHtmlLocalizer,您可以按原样获取 HTML。

public class HomeController : Controller
{
  private readonly ILogger<HomeController> _logger;
  private readonly IStringLocalizer<SharedResource> _localizer;

  // DI でローカライザーを取得します。
  public HomeController(ILogger<HomeController> logger, IStringLocalizer<SharedResource> localizer)
  {
    _logger = logger;
    _localizer = localizer;
  }

  public IActionResult Index()
  {
    // ローカライザーを使用して設定されている言語のリソースファイルからテキストを取得します。
    ViewData["Message"] = _localizer["Goodbye"];

    return View();
  }

  // 省略
}

查看\_ViewImports.cshtml

Views__ViewImports.cshtml文件。 若要在视图端使用本地化器,必须注入 IHtmlLocalizer。 现在,如果你描述如下,这是确定。 SharedResource 还必须与以前创建的资源文件和类具有相同的名称。

由于 IHtmlLocalizer 位于 Microsoft.AspNetCore.Mvc.Localization 命名空间中,因此也定义了 using。

如果本地化器仅在特定位置使用,则只需在单独的视图文件中包括以下代码。 _ViewImports.cshtml 文件将自动用于所有视图文件。

@using LocalizationText
@using LocalizationText.Models
@using Microsoft.AspNetCore.Mvc.Localization
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@* ビュー側でローカライザーを使用できるように定義します *@
@inject IHtmlLocalizer<SharedResource> Localizer

Views_Home_Index.cshtml

Views_Home_Index.cshtml文件。 显示控制器端检索的文本和直接在视图端检索的文本。 视图侧的本地化器还会在解码器中指定键字符串以获取文本。

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

@* ローカライザーから取得したテキストを表示します。 *@
<p>@Localizer["Hello"]</p>
<p>@ViewData["Message"]</p>

操作确认

查询字符串

您可以通过在 URL 的查询字符串中指定区域性代码来切换显示语言。 格式为"区域性"< 区域性代码 >。 如果要与 UI 分开,则区域性代码 >&ui 区域性 < 区域性代码 >

如果未指定,则如下所示: 如果未指定,则使用 SharedResource.resx。 (实际上,另一个判断被应用...)

image

指定 "区域性_en"的模式。 显示语言为英语。

image

指定区域性_es的模式。 显示语言为西班牙语。

image

指定区域性_ja的模式。 最初使用 SharedResource.ja.resx 文件。 共享资源.resx,因为它不存在。

image

尝试指定不存在的语言。 共享资源.resx,因为没有相应的文件。

image

Cookie

Cookie 允许您切换显示语言。 通常,它来自服务器端,但这次我们将尝试使用浏览器功能直接注册 Cookie。

每个 Web 浏览器都有开发人员工具,因此使用该工具注册 Cookie。 在下图中,Edge 按 F12 以显示开发人员工具。

相应的 Cookie 的名称为。 成为 AspNetCore.区域性,并指定语言的值是 以 c< 文化代码 > _uic< 文化代码 >格式输入。 对于 Cookie,还必须输入 UI 端的代码。 注册 Cookie 后,请刷新 Web 浏览器页面并刷新它。 Cookie 将发送到服务器,因此服务器将检索指定的语言。

在下图中,输入 c_en_uic_en以显示英语。

image

c_es_uic_es显示西班牙语。

image

接受语言 HTTP 标头

接受语言 HTTP 标头检查从 Web 浏览器请求到服务器的标头信息 这是一个功能,在语言之间切换,以适应它。

Web 浏览器设置允许您发送任何接受语言,但默认情况下,它符合操作系统的语言设置。 接受语言现在发送。 (实际发送取决于操作系统和 Web 浏览器。 Web 浏览器已初始化为操作系统语言,但可能是正确的)

因此,例如,在英语环境中的操作系统的 Web 浏览器中打开页面会发送 en 信息,因此自动 选择 SharedResource.en.resx 以显示英语。

image

如果尝试指定查询字符串中不存在的语言,则应使用 SharedResource.resx。 en 出现在 Accept 语言中,因为它存在。

image

如果在查询字符串中指定 ja,则显示日语,因为查询字符串优先。

image

总结

在这里,我们尝试以最简单的方式实现多语言切换。 若要根据用户环境切换语言,请使用"接受语言"HTTP 标头作为默认显示语言。 如果用户选择任何语言,则可能需要添加 Cookie 或添加(或直接键入)查询字符串。