微軟內建的多國語系目前分為三種 :
第一種是寫在Controller中的(通常用在商業邏輯判斷之錯誤顯示)
第二種是寫在View中的(通常用於畫面功能顯示以及UI顯示用)
第三種是寫在Data Model的Attribute中, 然後自動顯示在View中(通常用於與資料庫相關之資訊顯示, 如欄位名稱, 資料輸入之格式錯誤訊息)
我先來嘗試寫第一種 - Controller :
首先我先建立一個 Asp.Net Core 的 MVC 專案 NetCore (程式碼下載, 如果想從無到有自己動手一步一步做, 可以參考微軟官網範例MvcMovie, 我的專案就是從這小改來的, 只是將資料庫從LocalDB小改成InMemoryDB而已)
第二步打開Startup.cs, 並在下圖位置新增程式碼
第三步新增Resources資料夾, 並新增兩個資源檔案 "Controllers.MoviesController.resx" 和 "Controllers.MoviesController.en-US.resx" 如下圖 :
Controllers.MoviesController.resx檔案的內容如下(檔案名稱沒包含語系表示是預設語系):Controllers.MoviesController.en-US.resx檔案的內容如下(en-US表示英語系):以上表示系統是英語語系, "Hello" 會轉換成 "Hello(en-US,Movies)" 來顯示, 正常應該是轉換成 "Hello" 就好, 我多顯示其他文字只是用來知道這個 "Hello" 是由哪個語系檔案轉換來的而已非英語系的 "Hello" 則會轉換成 "Hello(Default,Movies)" 來顯示, 表示是從預設檔案而來
以上第二以及第三兩個步驟是多國語系的共通步驟, 過來才是 Controller 的部分
第四步驟則是打開 MoviesController.cs 檔案, 改成 :
private readonly MvcMovieContext _context; private readonly IStringLocalizer<moviescontroller> _localizer; // 新增的部分 public MoviesController(MvcMovieContext context, IStringLocalizer<moviescontroller> localizer) // 修改的部分 { _context = context; _localizer = localizer; // 新增的部分 } // GET: Movies public async Task<iactionresult> Index() { // 新增的部分 ViewBag.msg = $"CurrentCulture : {CultureInfo.CurrentCulture.Name}" + $"CurrentUICulture : {CultureInfo.CurrentUICulture.Name}" + $"Hello : {_localizer["Hello"]}" + $"Today : {DateTime.Now}"; return View(await _context.Movie.ToListAsync()); }
以上的 _localizer["Hello"] 會將 "Hello" 轉換成對應的語系文字
而 DateTime.Now 也會自動轉換成對應的語系時間格式
第五步開啟 View\Movies\Index.cshtml 檔案
加入一行 @Html.Raw(ViewBag.msg), 如下圖 :
CurrentCulture : zh-TW (繁體中文)
CurrentUICulture : zh-TW (繁體中文)
Hello : Hello(Default,Movies) (因為沒有繁體語系所以用預設顯示)(由_localizer["Hello"]而來)
Today : 2021/03/07 23:31:22 (繁體語系之日期顯示)
CurrentCulture :用來決定語系的日期、數值、貨幣格式,比較和排序(資料可以參考 : 多國語系 - 了解文化特性)
CurrentUICulture : 文字的語系
如果我在Resources路徑下加入 Controllers.MoviesController.zh-TW.resx 檔案(zh-TW表示繁體中文), 內容如下 :
Hello : 哈囉(zh-TW,Movies)
第六步
目前都只是判斷本機的語言系統, 並未依照使用者瀏覽器的語系來顯示, 而且無法隨時切換語系,
要做到這個功能, 就必須修改 Startup.cs 這個檔案
在ConfigureServices副程式中新增下列程式碼 :
services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { "en-US", "zh-TW" }; // 要支援的語系 options .AddSupportedCultures(supportedCultures) // 讓日期、貨幣格式支援語系 .AddSupportedUICultures(supportedCultures); // 讓文字支援語系 });
在Configure副程式中新增下列程式碼 :
app.UseRequestLocalization();
再執行專案, 試著在 URL 後面加上 ?culture=en-us (如 : https://localhost:44310/Movies?culture=en-us), 結果如下 :
多國語系的 Controller 部分就完成了
執行環境 : Windows 10 專業版 20H2, 19042.804
工具 : Visual Studio 2019 16.8.5
.Net 版本 : 5.01
留言
張貼留言