[WEB API]如何在Model使用多國語系,使用Resx Manager來方便管理多國語系

本篇會介紹如何在web api使用多國語系,並且善用工具來搜尋或新增自動翻譯。

前言

筆者在之前就有一個專案需要使用多國語系,所以回憶一下並記錄下來,果然當初沒有寫下來,就是硬要花點時間研究一下才能再實做出來,如果今天你要在.net實做多國語系,我們大部份都會實做資源檔來管理,如果要用資源檔的話,那你勢必就要裝上Resx Manager這個工具,千萬別問為什麼,裝上去就對了。

導覽

  1. 安裝Resx Manager,並新增資源檔
  2. Resx Manager的使用方式
  3. 替Model的attribute換成多國語系
  4. 隨著Header的Accept-Language來切換回傳的語系
  5. 結論

安裝Resx Manager,並新增資源檔

一開始當然先得安裝一下囉,請見圖示例了

安裝完之後應該在工具的選單就會看到了

接下來先新增Resources的資料夾,這邊我不透過微軟原本新增多國語系資料夾的方式實做,因為在後來為Model加多國語系的時候會遇到問題,所以跟大部份文章不一樣,我是自行新增的

接著就新增資源檔,預設會是en-us的語系

Resx Manager的使用方式

接著我們就可以打開Resx Manager來操作這些資源檔了

還記得我們剛剛只有加入一支資源檔嗎,現在就透過Resx來自動幫我們新增各種語系的資源檔吧,先切換到Configuration的頁籤

接著回到Main的頁籤,開始新增各種語系的資源檔吧,以此例子我新增了繁中和簡中的語系

接下來我就要開始新增多國語系了,首先新增了建立和刪除和修改的字吧,以我的例子當然最習慣的還是打繁中囉,所以請看一下圖示例吧

而如果我們想要刪除掉這個key的話,如果是原本在資源檔的話,就要在多個資源檔都得去做刪除的動作,如果我們使用Resx的話,只需要如下圖示例,就會自動刪除多個語系的key值了

因為我們的多國語系隨著專案越來越大,破萬個字都有可能,我們也可以透過Resx來很好快速找到相關字詞,筆者先新增了四個字詞做示例,然後我們不管是要用Key去找,或者用任何一個語系去找,是不是已經有建立了相同的字詞,甚至是從網站看到的語系來回查相關字詞是什麼,都可以很方便的搜尋

而Resx還有把Excel匯出或匯入的功能或更多的功能,這邊就留給讀者自行研究囉,不多做說明了。

替Model的attribute換成多國語系

假設我現在的Model定義的如下

public class Company                                        
{                                                           
    public int Id { get; set; } = 1;                        
                                                            
    [Required(ErrorMessage = "{0}必填")]                    
    [DisplayName("公司名稱")]                                
    public string CompanyName { get; set; }                 
    [Required]                                              
    [EmailAddress(ErrorMessage = "{0}只允許輸入Email格式")]  
    [DisplayName("Eamil欄位")]                              
    public string Email { get; set; }                       
}                                                           

那我現在想要把這些都改成多國語系,首先從DisplayName開始吧

接著要把資源檔全部設定為public,不然會無法在Model上使用多國語系,而預設是為Internal的

接著把程式碼改成如下

public class Company                                                         
{                                                                            
    public int Id { get; set; } = 1;                                         
                                                                             
    [Required(ErrorMessage = "{0}必填")]                                     
    [Display(Name ="CompanyName",ResourceType =typeof(Resources.Resource))]  
    public string CompanyName { get; set; }                                  
    [Required]                                                               
    [EmailAddress(ErrorMessage = "{0}只允許輸入Email格式")]                   
    [Display(Name ="Email",ResourceType =typeof(Resources.Resource))]        
    public string Email { get; set; }                                        
}                                                                            

這邊使用postman測試,回傳結果如下

不過我們的error message的部份也需要修改成多國語系,那就繼續新增字詞吧

Model的程式碼則改成如下

    public class Company
    {
        public int Id { get; set; } = 1;

        [Required(ErrorMessageResourceName ="RequiredMessage",ErrorMessageResourceType =typeof(Resources.Resource))]
        [Display(Name ="CompanyName",ResourceType =typeof(Resources.Resource))]
        public string CompanyName { get; set; }
        [Required]
        [EmailAddress(ErrorMessageResourceName ="EmailMessage",ErrorMessageResourceType =typeof(Resources.Resource))]
        [Display(Name ="Email",ResourceType =typeof(Resources.Resource))]
        public string Email { get; set; }
    }

最後結果

隨著Header的Accept-Language來切換回傳的語系

上面雖然都成功了,但是我們卻無法按照用戶端瀏覽器的語系,正確送回相對應的語系,那接下來則看一下我們如何實做這塊吧,其實也非常簡單,只要在web.config的system.web區塊裡面加入下面這行就行了。

 <globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true"/>

接著來看一下結果吧。

結論

其實Resx Manager還有很多功能可以去玩看看,而如果你已經在做多國語系的網頁,但卻還沒安裝此工具的人,快點去安裝吧,而如果有各好的工具的話,再請推坑給筆者啊。