日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用gettext技術(shù)為ASP.NET網(wǎng)站實現(xiàn)國際化支持

不知道有多少人對這個題目感興趣,因為最近在做一個網(wǎng)站玩玩,有點閑心給網(wǎng)站加了國際化支持。雖然ASP.NET已經(jīng)有ResourceManager這個類,并且有標簽實現(xiàn)國際化的支持了,但是它的問題是,ResourceManager對每一個需要翻譯的句子都要求有一個鍵(Key):

成都創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元靈川做網(wǎng)站,已為上家服務(wù),為靈川各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

1. 要先創(chuàng)建一個.resx文件,在Visual Studio里,有一個工具編輯這個.resx文件。

2. 對每一個需要翻譯的句子,添加一個鍵值對。

3. 然后在代碼里,使用ResourceManager或者<%#這個標簽,通過定義好的鍵來告訴ASP.NET在運行的時候查找正確的翻譯文本。

太麻煩了,不知道大家有什么其它好的方法,我使用的方法是從unix gettext那邊借用過來的理念。

理念

Gettext的理念很簡單,文本翻譯嗎,說白了就是把一句話翻譯成另外一句話嘛,這個要翻譯的句子,本身就可以當做檢索要用的關(guān)鍵字,何必要再新建一個另外的關(guān)鍵字呢?gettext的方式很簡單:

1. 在源代碼里,你可以編寫一個特殊的函數(shù)執(zhí)行翻譯,這個函數(shù)只接受一個參數(shù),就是要翻譯的文本。

2. 使用一個輔助程序xgettext掃描源代碼的文本,將所有待翻譯的文本都找出來,保存到一個文件里,一般來說,這個文件叫做po文件。

3. 因為ASP.NET程序不支持po文件,再使用一個輔助程序msgfmt將po文件轉(zhuǎn)換成ASP.NET支持的.resources文件。這個方法的優(yōu)點在于:

1. 你在編寫程序的時候,不用為需要翻譯的句子,定義一個新的關(guān)鍵字——這個關(guān)鍵字一般都比較難理解,也不好取名。在維護代碼的時候很麻煩——因為你需要不停地在.resx編輯器和cs文件之間切換。

2. 不知道怎么搞的,很難找到可以編輯.resx文件的工具,而gettext生成的po文件是普通的文本文件,而且格式非常簡單。這樣在翻譯的時候,就很方便了。

做法

比如寫了一個ASP.NET MVC程序,當然窗體(Web Form)形式的程序理念也是一樣的,

1. 寫一個控制器和視圖頁的基類,里面都有一個執(zhí)行翻譯的函數(shù)T:

 
 
 
  1. public class G18nController : Controller  
  2. {  
  3. public CultureInfo Culture { get; set; }  
  4. public string T(string message)  
  5. {  
  6. var obj = HttpContext.GetGlobalResourceObject("website", message, Culture);  
  7. var translated = obj == null ? null : obj.ToString();  
  8. if (string.IsNullOrEmpty(translated))  
  9. return message;  
  10. else 
  11. return translated;  
  12. }  
  13. }  
  14. public abstract class G18nWebViewPage : WebViewPage  
  15. {  
  16. public CultureInfo Culture { get; set; }  
  17. public string T(string message)  
  18. {  
  19. var obj = HttpContext.GetGlobalResourceObject("website", message, Culture);  
  20. var translated = obj == null ? null : obj.ToString();  
  21. if (string.IsNullOrEmpty(translated))  
  22. return message;  
  23. else 
  24. return translated;  
  25. }  
  26. }  
  27.  

上面的Culture屬性,可以從Request.Headers["Accept-Language"]屬性取得。

2. 在代碼里,針對每個要翻譯的句子,直接調(diào)用這個T函數(shù)好了:

 
 
 
  1. throw new ArgumentException(string.Format(T("找不到ID為{0}的項目!"), id)); 

3. 程序?qū)懞煤?,要開始翻譯,調(diào)用gettext程序?qū)⑺幸g的句子找出來,保存到指定的po文件里。可以在http://gnuwin32.sourceforge.net/packages/gettext.htm這個網(wǎng)頁下載gettext。

但是悲劇的是,gettext好像要求主語言是英文,對中文字符串支持的不是很好。所以我就用C#自己寫了一個gettext,你可以在本文的附件里下載它,命令的格式是:

Zgettext -k T -i 源代碼路徑名 -o 輸出的po文件名

Zgettext -k T -f 源代碼路徑列表文件 -o 輸出的po文件名

比如:

Zgettext -k T -i AccountController.cs -o test.po

4. 生成的po文件格式其實非常簡單易懂:

 
 
 
  1. #: C:\workspace\Views\Role\Edit.cshtml:9  
  2. msgid "管理用戶組" 
  3. msgstr "" 
  4. #: C:\workspace\Views\Role\Edit.cshtml:23  
  5. msgid "用戶組[{0}]的權(quán)限" 
  6. msgstr "" 

Msgid就是要翻譯的句子,msgstr就是翻譯好的句子。

5. 完成翻譯后,使用一個輔助程序msgfmt將翻譯好的po文件轉(zhuǎn)換成ASP.NET支持的格式。因為原始的gettext程序包里的msgfmt.exe好像不能生成ASP.NET識別的.resources文件,所以 我也寫了一個msgfmt程序完成這個工作——在本文的附件里可以下載到,命令格式是:

Msgfmt -o 輸出的resource文件路徑 -i 輸入的po文件路徑

例如:

Msgfmt -o website.en-US.resources -i website.po

注意:輸出的resource文件名,必須與你在***步里,使用HttpContext.GetGlobalResourceObject函數(shù)的***個參數(shù)相同。

6. 我寫了一個小的批處理,將3、4、5步結(jié)合在一起執(zhí)行:

 
 
 
  1. pushd src  
  2. del /F source.lst  
  3. dir /s /b src\*.cs >> source.lst  
  4. dir /s /b src\*.cshtml >> source.lst  
  5. tools\zgettext\zgettext\bin\Debug\zgettext.exe -k T -f source.lst -o glob\website.po  
  6. tools\zgettext\msgfmt\bin\Debug\msgfmt.exe -o src\App_GlobalResources\website.resources -i glob\ website.po  
  7. popd  

希望對你有點幫助。

【編輯推薦】

  1. C#改寫WM_GETTEXT處理例程
  2. PHP Smarty通過gettext加強國際化的總結(jié)
  3. 使用gettext實現(xiàn)PHP的國際化編程
  4. gettext不安全臨時文件文件刪除漏洞

網(wǎng)站欄目:使用gettext技術(shù)為ASP.NET網(wǎng)站實現(xiàn)國際化支持
地址分享:http://www.5511xx.com/article/coodsso.html