日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

深入研究.NET Core的本地化机制

發布時間:2023/12/4 asp.net 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入研究.NET Core的本地化机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

在.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添加本地化服務。

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

在這個方法中,我們指定了文件夾Resources作為存放翻譯文件的目錄。

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

然后我們需要在 Configure方法中添加本地化中間件。

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參數指定了默認的語言文化,即用戶不指定任何文化時的默認語言文化

  • SupportedCultures和?SupportedUICultures是指定當前應用支持的所有語言文化

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

添加資源文件

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

  • 首先我們創建一個Resources文件夾,這就是我們在前面?Startup類中配置的目錄名。

  • 然后我們在Resource文件夾中添加一個資源文件,并命名為Controllers.HomeController.zh-CN.resx。

  • 在這個資源文件中,添加一個字段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: 當只指定culture或ui-culture參數時,ASP.NET Core會自動將culture和ui-culture設置成一樣的。即?culture=zh-CN等同于?culture=zh-CN&ui-culture=zh-CN

    Cookie

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

    .AspNetCore.Culture的值格式如下

    c=zh-CN|uic=zh-CN c=zh-CN uic=zh-CN

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

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

    然后我們訪問/Home/Hello, "你好"也被正確的輸出了

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

    請求頭

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

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

    這里我們使用Postman來測試一下,我們設置Accept-Language為zh-CN, zh;q=0.9, 結果如下

    如何在View中使用本地化

    除了Controller, 我們更多的是在View中使用本地化。 如果希望在View中使用本地化,首先需要在 Startup類的 ConfigureServices方法中啟用View本地化。

    public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix); }

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

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

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

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

    HomeController

    public IActionResult Hello() { //return Content(_localizer["Hello"]); return View(); }

    Hello.cshtml

    @{ ViewData["Title"] = "Hello"; } <h2>Good Bye</h2>

    然后我們創建如下圖的目錄結構, 并創建資源文件Hello.zh-CN.resx, 并添加GoodBye字段,其值為"再見"

    使用ViewLocalizer

    ViewLocalizer類可以幫助我們在Razor視圖中使用本地化文本。現在我們來修改Hello.cshtml, 在文件添加本地化引用,并注入一個ViewLocalizer對象

    @using Microsoft.AspNetCore.Mvc.Localization @inject IViewLocalizer Localizer @{ ViewData["Title"] = "Hello"; } <h2>@Localizer["GoodBye"]</h2>

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

    最終效果

    現在我們運行程序并訪問/Home/Hello, 結果如下

    然后我們繼續訪問/Home/Hello?ui-culture=zh-CN, 結果如下

    本地化字符串讀取成功

    本篇源代碼 https://github.com/lamondlu/aspnetcore_localizationsample

    總結

    以上是生活随笔為你收集整理的深入研究.NET Core的本地化机制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。