這篇文章不討論多語言的方案,只是介紹使用資源文件(.resx)解決多語言的一個自動化工具。
T4模板
T4模板不用太多介紹了,博客園里面搜T4就有很多文章介紹。
.resx資源文件
在VS中添加一個資源文件,默認會自動生成一個支持強類型的資源文件類,比如,添加Resources.resx,並有一個字符串資源:
那么默認的代碼生成器會生成一個強類型的資源訪問方式Resources.FileNotExisted供你使用:
throw new Exception(Resources.FileNotExisted, fileName);
這樣當我們需要某個字符串資源的時候就先要在resx文件里面添加一個key-value項之后才能使用。之前在博客園看到一篇文章(不好意思,找不到文章鏈接了)用類似如下的方式來使用資源文件:
throw new Exception(Resources.Resource("文件{0}不存在", fileName));
我也不記得他的文章是怎么把這個字符串資源轉換成.resx文件的,不過我還記得我當時第一個念頭就是使用T4模板來自動生成.resx文件,這就是自動生成的.resx文件:
對於其他語言的resx文件,只需要翻譯Value列就可以了:
這種方式實際就是直接將你需要使用的文本信息(比如提示信息,錯誤信息等)作為.resx文件的Key值,Resources.Resouce的代碼就是根據這個key值去獲取多語言的Value值:
internal static string Resource(string name, params object[] args){string text;
try
{text = string.Format(ResourceManager.GetString(name, Culture), args);
}catch
{text = string.Format(name, args);
}return text;
}
如何使用
你可以去項目的網址下載所有的T4模板文件,然后在項目中包含這些T4 include文件並添加一個.tt文件,修改成如下內容:
<#@ template debug="true" hostSpecific="true" #><#@ include file="Resources.CS.ttinclude" #><#@
output extension=".cs"#><#
VSHost vsHost = new VSHost(this);string[] langs = new string[]{"en"};GenResx(vsHost, langs);#>
其中langs指定你需要的除母語外的其他語言,這樣就可以生成對應語言的.resx文件。
另外一種更簡單的辦法就是使用NuGet的來安裝:
install-package ResxGenViaT4
安裝完成后會在你的當前的項目添加一個Resources文件夾,並且增加以下文件:
其中.resx文件是根據源代碼中的Resources.Resource自動生成的,這些文件可以使用VS的默認資源編輯器進行編輯修改的。
Resources.Resource可以如下方式使用:
Resources.Resource("提示信息");
Resources.Resource("錯誤信息:{0}", err);
//可以包含引號
Resources.Resource("提示\"信息\"");
Resources.Resource(@"提示""信息""");
系統要求
需要使用Visual Studio 2010以及安裝Visual Studio 2010 SDK。
使用注意事項及問題
1. Resources.Resource中的信息必須在一行中寫完,不能分行:
Resources.Resource(@"Abc
123");
2.只支持C#
3.所有使用了這種方式的文件必須保存后才能自動生成完整
4.如果修改了某條信息,老信息已經沒有任何地方使用了,.resx文件中的仍將保留該條信息,只是將該條注釋修改成!!!!!!NOT EXSITED!!!!!!,沒有刪除的原因是對於其他語言的版本可能此條修改並不會影響到原翻譯,那么保留下來可以手工拷貝到新的信息對應位置,然后再人工刪除。
5.只支持字符串資源
6.注釋中的Resources.Resource也會被抓取出來
優缺點
優點就是可以直接使用母語。
缺點就是對於表達相同意思的信息,不同的人(同一個人不同時間)寫出來的信息可能不一樣,這樣就增加了冗余。
歡迎提出修改意見。