日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開(kāi)發(fā)ASP.NET → 實(shí)現(xiàn)ASP.NET網(wǎng)站國(guó)際化支持的gettext技術(shù)

      實(shí)現(xiàn)ASP.NET網(wǎng)站國(guó)際化支持的gettext技術(shù)

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2011/4/21 21:58:15字體大小:A-A+

      作者:西西點(diǎn)擊:70次評(píng)論:4次標(biāo)簽: gettext

      • 類(lèi)型:系統(tǒng)其它大。2.2M語(yǔ)言:中文 評(píng)分:10.0
      • 標(biāo)簽:
      立即下載

      不知道有多少人對(duì)這個(gè)題目感興趣,因?yàn)樽罱谧鲆粋(gè)網(wǎng)站玩玩,有點(diǎn)閑心給網(wǎng)站加了國(guó)際化支持。雖然ASP.NET已經(jīng)有ResourceManager這個(gè)類(lèi),并且有標(biāo)簽實(shí)現(xiàn)國(guó)際化的支持了,但是它的問(wèn)題是,ResourceManager對(duì)每一個(gè)需要翻譯的句子都要求有一個(gè)鍵(Key):

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

      2. 對(duì)每一個(gè)需要翻譯的句子,添加一個(gè)鍵值對(duì)。

      3. 然后在代碼里,使用ResourceManager或者<%#這個(gè)標(biāo)簽,通過(guò)定義好的鍵來(lái)告訴ASP.NET在運(yùn)行的時(shí)候查找正確的翻譯文本。

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

      理念

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

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

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

      3. 因?yàn)锳SP.NET程序不支持po文件,再使用一個(gè)輔助程序msgfmt將po文件轉(zhuǎn)換成ASP.NET支持的.resources文件。

      這個(gè)方法的優(yōu)點(diǎn)在于:

      1. 你在編寫(xiě)程序的時(shí)候,不用為需要翻譯的句子,定義一個(gè)新的關(guān)鍵字——這個(gè)關(guān)鍵字一般都比較難理解,也不好取名。在維護(hù)代碼的時(shí)候很麻煩——因?yàn)槟阈枰煌5卦?resx編輯器和cs文件之間切換。

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

      做法

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

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

      public class G18nController : Controller

      {
      public CultureInfo Culture { get; set; }

      public string T(string message)

      {

      var obj = HttpContext.GetGlobalResourceObject("website", message, Culture);

      var translated = obj == null ? null : obj.ToString();

      if (string.IsNullOrEmpty(translated))

      return message;

      else

      return translated;

      }

      }


      public abstract class G18nWebViewPage<U> : WebViewPage<U>

      {

      public CultureInfo Culture { get; set; }



      public string T(string message)

      {

      var obj = HttpContext.GetGlobalResourceObject("website", message, Culture);

      var translated = obj == null ? null : obj.ToString();

      if (string.IsNullOrEmpty(translated))

      return message;

      else

      return translated;

      }

      }

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

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

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

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

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

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

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

      比如:

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

      4. 生成的po文件格式其實(shí)非常簡(jiǎn)單易懂:

      1. #: C:\workspace\Views\Role\Edit.cshtml:9

      2. msgid "管理用戶(hù)組"

      3. msgstr ""

      4.

      5. #: C:\workspace\Views\Role\Edit.cshtml:23

      6. msgid "用戶(hù)組[{0}]的權(quán)限"

      7. msgstr ""


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

      5. 完成翻譯后,使用一個(gè)輔助程序msgfmt將翻譯好的po文件轉(zhuǎn)換成ASP.NET支持的格式。因?yàn)樵嫉膅ettext程序包里的msgfmt.exe好像不能生成ASP.NET識(shí)別的.resources文件,所以 我也寫(xiě)了一個(gè)msgfmt程序完成這個(gè)工作——在本文的附件里可以下載到,命令格式是:


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

      例如:

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


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

      6. 我寫(xiě)了一個(gè)小的批處理,將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

      希望對(duì)你有點(diǎn)幫助。

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門(mén)評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(4)

        昵稱(chēng):
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)