.NET Core多語言

ASP.NET Core中提供了一些本地化服務和中間件,可將網站本地化爲不一樣的語言文化。html

ASP.NET Core中咱們可使用Microsoft.AspNetCore.Localization庫來實現本地化。app

.NET Core 2.0以上版本Microsoft.AspNetCore.Localization已經包含在了Microsoft.AspNetCore.All中,因此咱們並不須要手動引入其餘的類庫。函數

建立一個MVC網站工具

爲了測試ASP.NET Core的本地化,咱們首先在Visual Studio 2017中建立一個MVC項目LocalizationSample測試

配置Startup網站

ASP.NET Core中,若是但願啓動本地化,首先須要在Startup類的ConfigureServices方法中使用services.AddLocalization添加本地化服務。ui

 

public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(o =>
{
o.ResourcesPath = "Resources";
});
 
services.AddMvc();
}

 

 

 

在這個方法中,咱們指定了文件夾Resources做爲存放翻譯文件的目錄。spa

注:若是不指定存放翻譯文件的目錄, ASP.NET Core會默認從網站根目錄下讀取。翻譯

而後咱們須要在Configure方法中添加本地化中間件。3d

 

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
 
IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("zh-CN"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
 
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}

 

 

 

  • app.UseRequestLocalization必須放置app.UseMvc以前
  • DefaultRequestCulture參數指定了默認的語言文化,即用戶不指定任何文化時的默認語言文化
  • SupportedCulturesSupportedUICultures是指定當前應用支持的全部語言文化

SupportedCultures指定的是數字和日期格式SupportedUICultures指定的翻譯文件

添加資源文件

下面咱們嘗試添加一個資源文件

  1. 首先咱們建立一個Resources文件夾,這就是咱們在前面Startup類中配置的目錄名。
  2. 而後咱們在Resource文件夾中添加一個資源文件,並命名爲Controllers.HomeController.zh-CN.resx
  3. 在這個資源文件中,添加一個字段Hello, 並設置其值爲"你好"

Controller中獲取本地化字符串

如今咱們打開默認生成的HomeController, 清空裏面全部的action, 並添加一個新的action, 代碼以下:

 

public class HomeController : Controller
{
public HomeController()
{
 
}
 
public IActionResult Hello()
{
return Content("Hello");
}
}

 

 

 

啓動項目以後訪問/Home/Hello, 結果以下

下面咱們修改HomeController的代碼, 來引入本地化字符串訪問器

 

public class HomeController : Controller
{
private readonly IStringLocalizer<HomeController> _localizer;
 
public HomeController(IStringLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
 
public IActionResult Hello()
{
return Content(_localizer["Hello"]);
}
}

 

 

 

代碼解釋

  • IStringLocalizer是一個本地化字符串訪問器的泛型接口,這裏咱們經過依賴注入的方式在HomeController的構造函數中將其注入
  • 咱們能夠經過IStringLocalizer的屬性訪問器獲取到對應字段在不一樣語言下的文本。

最終效果

如今咱們啓動程序, 從新訪問/Home/Hello, 結果以下

你會發現結果沒有變化,這是由於默認咱們設置的語言文化是en-US, 可是咱們以前沒有添加en-US的資源文件,因此程序就直接將訪問的字段名輸出了。

如今咱們修改URL, 訪問/Home/Hello?ui-culture=zh-CN, 結果以下

咱們指望的"你好"被正確輸出了,這說明ASP.NET Core默認支持在Url中以culture參數的形式設置當前網站使用的語言文化。

資源文件命名

爲何咱們以前添加了一個名爲Controllers.HomeController.zh-CN.resx的資源文件,本地化字符串訪問器IStringLocalizer就能定位到這個文件並讀取其中的字段屬性呢?

這是由ASP.NET Core資源文件的命名約定決定的。

ASP.NET Core資源文件的名稱由2部分組成:

  • 去掉程序集名稱的完整類名
  • 語言文化名稱

之前面的例子爲例:
咱們建立了一個本地化字符串訪問器接口,它的泛型類型是HomeController, 其完整類名是LocalizationSample.Controllers.HomeController, 當前程序集的名稱是LocalizationSample, 因此去掉程序集名稱以後,剩餘部分是Controllers.HomeController。當咱們設置culture參數是zh-CN, ASP.NET Core查找的資源文件名是Controllers.HomeController.zh-CN.resx, 這正是咱們前面添加的中文語言文化資源文件名。

若是你不喜歡這種方式,ASP.NET Core還提供了另一種資源文件的組織方式

你能夠Resources目錄下建立如下目錄結構

  • Resources
    • Controllers
      • HomeController.zh-CN.resx

本地化字符串訪問器也能自動定位到這個文件。

默認的語言文化提供器

ASP.NET Core的本地化中間件默認支持3種語言文化提供器

  • URL中的查詢字符串
  • Cookie
  • 請求頭

URL中的查詢字符串

ASP.NET Core會從URL中的culture參數中獲取當前應用使用的語言文化,這就是前面例子中,"你好"能正確輸出的緣由

除了指定ui-culture參數,你還可使用culture參數指定當前格式化時間,數字等所使用的語言文化。

 

?culture=zh-CN&ui-culture=zh-CN
 
?culture=zh-CN
 
?ui-culture=zh-CN

 

 

 

Tips: 當只指定cultureui-culture參數時,ASP.NET Core會自動將cultureui-culture設置成同樣的。即?culture=zh-CN等同於?culture=zh-CN&ui-culture=zh-CN

Cookie

ASP.NET Core中還支持使用Cookie的方式設置當前應用使用的語言文化。默認使用的Cookie名稱是.AspNetCore.Culture

.AspNetCore.Culture的值格式以下

  1. c=zh-CN|uic=zh-CN
  2.  
  3. c=zh-CN
  4.  
  5. uic=zh-CN

其中c表示culture, uic表示ui-culture

下面咱們使用Chrome的開發者工具, 爲當前網頁添加語言文化Cookie

而後咱們訪問/Home/Hello, "你好"也被正確的輸出了

這說明ASP.NET CoreCookie中讀取到了語言文化配置

請求頭

除了URL查詢字符串和Cookie, ASP.NET Core還支持在請求頭中指定語言文化。請求頭中語言文化字段名稱是 Accept-Language

Accept-Language的文檔,參見https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept-Language

這裏咱們使用Postman來測試一下,咱們設置Accept-Languagezh-CN, zh;q=0.9, 結果以下

如何在View中使用本地化

除了Controller, 咱們更多的是在View中使用本地化。
若是但願在View中使用本地化,首先須要在Startup類的ConfigureServices方法中啓用View本地化。

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddMvc()
  4. .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
  5. }

這裏LanguageViewLocationExpanderFormat支持2種方式,這個和前面Controller的本地化文件名稱約定相似

  • Suffix, /Resources/Home/Hello.zh-CN.resx
  • Path, /Resources/Home/zh-CN/Hello.resx

下面咱們修改HomeController的代碼,Hello方法將返回一個View

HomeController

  1. public IActionResult Hello()
  2. {
  3. //return Content(_localizer["Hello"]);
  4. return View();
  5. }

Hello.cshtml

  1.  
  2. @{
  3. ViewData["Title"] = "Hello";
  4. }
  5.  
  6. <h2>Good Bye</h2>
  7.  

而後咱們建立以下圖的目錄結構, 並建立資源文件Hello.zh-CN.resx, 並添加GoodBye字段,其值爲"再見"

使用ViewLocalizer

ViewLocalizer類能夠幫助咱們在Razor視圖中使用本地化文本。如今咱們來修改Hello.cshtml, 在文件添加本地化引用,並注入一個ViewLocalizer對象

  1. @using Microsoft.AspNetCore.Mvc.Localization
  2.  
  3. @inject IViewLocalizer Localizer
  4. @{
  5. ViewData["Title"] = "Hello";
  6. }
  7.  
  8. <h2>@Localizer["GoodBye"]</h2>
  1.  

    這裏咱們使用ViewLocalizer讀取了本地化文本,它的用法和IStringLocalier同樣,都是經過屬性訪問器訪問對應字段的本地化文本。

    最終效果

    如今咱們運行程序並訪問/Home/Hello, 結果以下

    而後咱們繼續訪問/Home/Hello?ui-culture=zh-CN, 結果以下

    本地化字符串讀取成功

相關文章
相關標籤/搜索