跳到主要內容

Asp.Net Core Web 多國語系(一)

微軟內建的多國語系目前分為三種 :

第一種是寫在Controller中的(通常用在商業邏輯判斷之錯誤顯示)

第二種是寫在View中的(通常用於畫面功能顯示以及UI顯示用)

第三種是寫在Data Model的Attribute中, 然後自動顯示在View中(通常用於與資料庫相關之資訊顯示, 如欄位名稱, 資料輸入之格式錯誤訊息)

我先來嘗試寫第一種 - Controller :

首先我先建立一個 Asp.Net Core 的 MVC 專案 NetCore (程式碼下載, 如果想從無到有自己動手一步一步做, 可以參考微軟官網範例MvcMovie, 我的專案就是從這小改來的, 只是將資料庫從LocalDB小改成InMemoryDB而已)

第二步打開Startup.cs, 並在下圖位置新增程式碼

services.AddLocalization(options => options.ResourcesPath = "Resources");

第三步新增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), 如下圖 :

接著執行此專案, 看 Movies 的網頁 (我的電腦網址是 https://localhost:44310/Movies, 每個人的Port 會不同), 結果如下 :
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 的部分變成:
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

留言

這個網誌中的熱門文章

Excel VBA (二) : 自訂函數之自動加總(續)

繼續上篇的 Excel VBA (一) : 自訂函數之自動加總 來修改程式 加總時如果要將非數字的全部濾掉, 我利用 TypeName 這個函數來完成, 再將Excel的C欄資料除了文字型別以外, 加上日期以及布林型別, 測試結果如下 Function 我的加總(加總區域 As Range) As Double Dim data As Variant 我的加總 = 0 For Each data In 加總區域 If TypeName(data.Value) = "Double" Then 我的加總 = 我的加總 + data End If Next End Function 如果我現在很懶, 懶得選擇加總區域, 讓它自動將它上方的資料自動加總起來, 例如在A10中輸入自訂函數, 則會自動將A1到A9的儲存格都加總起來, 我的懶人程式如下 : Function 我的加總2() As Double Dim 目前儲存格 As Range Dim 目前列 As Integer Dim i As Integer Set 目前儲存格 = Application.Caller 目前列 = 目前儲存格.Row 我的加總2 = 0 For i = 1 To 目前列 - 1 Set 目前儲存格 = 目前儲存格.Offset(-1, 0) If TypeName(目前儲存格.Value) = "Double" Then 我的加總2 = 我的加總2 + 目前儲存格 End If Next End Function Application.Caller : 會取得函數計算的儲存格, 它的行跟列可以透過Column跟Row來取得 ( 參考文章 ) 加總則是從同欄的第一列開始加, 一直加到輸入的前一列, 也就是 Application.Caller.Row - 1 offset(-1,0) : 則表示要位移的位置, -1 表示垂直往上一格, 0 表示水平維持不變 我在A10輸入自

Excel VBA (一) : 自訂函數之自動加總

最近幫忙別人解決 Excel 的資料處理問題, 順便將一些使用心得做一下筆記 當我開啟Excel時, 預設是沒有 開發人員 的功能(如下圖的紅框) 要開啟就要點擊Excel選單的 檔案 (如上圖的黃框) 再點擊 選項 (如下圖的紅框) 再點擊 自訂功能區 (如下圖的紅框) 再將 開發人員 的功能打開即可(如下圖的紅框) 開啟開發人員中的 Visual Basic (如下圖的紅框)就會開啟VBA的功能視窗了 我先嘗試最簡單的程式, 看看是否成功(如下圖) Function 我的加總() As Double     我的加總 = 100 End Function 再去Excel的工作表1中, 在任一儲存格中輸入"=我的加總()", 測試是否會顯示 "100"(如下圖), 結果成功了, 代表Excel VBA中函數與變數名稱都是可以用中文 再來就是真正開始寫程式了, 如果真正要寫的完整會要寫很多例外處理, 這邊只做簡單的版本, 請大家見諒喔!以下是我完成的程式碼 Function 我的加總(加總區域 As Range) As Double     Dim data As Variant     我的加總 = 0     For Each data In 加總區域         我的加總 = 我的加總 + data     Next End Function 在Excel中輸入如下圖的資料來測試 繼續在B8儲存格中點選 "插入函數fx" (如下圖) 出現Excel的函數視窗後, 函數類別選擇 "使用者定義" 會出現 "我的加總" 函數, 按下確定後選擇A1..A5的加總區域, 結果顯示15, 代表程式初步測試OK! 再來我將 B5 故意留空白, 也讓它加總看看, 手動將B8的 "A1:A5" 改成 "A1:B5" 結果顯示29(成功)! 再來是C1我故意輸入文字 "A", 讓它加總看看, 手動將B8的 "A1:B5" 改成 "A1:C5", 結果顯示 "#VALUE!", 如果要改

Excel VBA (三) : 自訂函數參數的另一種用途

如果有用自訂函數來完成工作的人, 可能會發現有的自訂函數當你改變要計算區域的值時, 結果會跟著改變, 有的則不會跟著變, 如 Excel VBA (一) : 自訂函數之自動加總 會跟著變, 而 Excel VBA (二) : 自訂函數之自動加總(續) 則不會改變, 而這個答案就是參數 如果想要計算範圍內, 只要資料有異動, 則會自動更新計算結果, 就必須將該範圍納入自訂函數的參數( 參考微軟的文章 ), 參數裡的儲存格, 不論多少, 都是Excel監控的對象, 就如同 Excel 中的標準函數, 我只要輸入範圍, 那就會自動更新, 如果沒參數或是輸入資料而已, 如 SIN(100) 就不會有自動更新的功能, 因為沒監控對象 !! 如下圖中A欄黃色儲存格輸入的是 我的加總2() 無參數函數, 而橘色儲存格輸入的是 我的加總(A1:A9) 有參數函數, A欄的結果都是15, 我再將A欄複製到B欄後, 結果當然也是15,但是當我將B1儲存格從1改成2之後, 黃色無參數的結果沒變, 而橘色有參數的結果自動變成16了, 這是有參數的好處 測試時間: 2020年07月29日 測試環境: Windows 10 家用版, Excel 2019 家用版