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>

操作確認

查詢字串

您可以透過在網址的查詢字串中指定區域性代碼來切換顯示語言。 格式為「區域性」< 區域性代碼 >。 如果要與 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 或添加(或直接鍵入)查詢字串。