• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 24,  comments - 62,  trackbacks - 0

            應用程序國際化,在開源世界里常以i18n被提及,i18n是Internationalization的簡寫,正好18個字母。在wxPython程序進行i18n,如果字符串是編碼在源文件中時,完全可按照python程序的i18n的方法,即使用gexttext和locale模塊。而wxPython程序在使用XRC文件做為界面資源時,則應使用wx.Locale模塊,它封裝了區域化相關的操作。i18n,或者國際化實際上涉及到語言習慣,數字格式等等類別的內容。這里只介紹語言多國化,將一個簡單的英文程序轉換為中文,涉及到源文件,可從這里下載。

            創建PO文件

            PO文件是Portable Object文件的簡稱,它包含需要翻譯的字符串。我們需要從源文件進行提取。首先,對源文件test.py編輯,標識代碼里需要翻譯的字符串內容。我們使用_("xx")的方法,這種形式可能在許多開源源代碼中見識過。

            #加載菜單欄
            menubar = rc.LoadMenuBar('IDR_MENU')

            這里的IDR_MENU是資源標識ID,不需要翻譯,因此不做改變,而下面的代碼:

            info.SetVersion('1.0')
            info.SetDescription('XRC i18n Demo')

            'XRC i18n Demo'是描述性的文本,需要進行翻譯,將需要處理為

            info.SetVersion('1.0')
            info.SetDescription(_('XRC i18n Demo'))

            接著需要生成.pot(Portable Object Template),這是po的模板文件。在將來程序可能配置成其他語種,其他語言的po文件都從它而來。為了創建這文件,需要用到GNU gettext工具集中的xgettext。向xgettext傳入些必要的信息,來創建.pot文件。

            >xgetttext --output=test.pot test.py

            我們將wxPython界面以XRC文件保存了,那里同樣有要翻譯的字符串需要提取。用XRCed工具將XRC生成python代碼,勾選上'Generate gettext strings'項即可。將源文件和XRC生成的test_xrc.py文件一起處理,生成一個test.pot。

            >xgettext --output=test.pot test.py test_xrc.py

            將得到的test.pot另存為test.po文件,然后進行翻譯編輯,在這過程中文件需要使用utf-8編碼。將對應的英文翻譯成中文,將charset更改為utf-8。

            "Content-Type: text/plain; charset=utf-8\n"
            "Content-Transfer-Encoding: 8bit\n"
            
            #: test.py:19
            msgid "XRC i18n Demo"
            msgstr "XRC 國際化示例"
            ...

            .pot和.po這些文件都是文本文件,主要供翻譯者使用。為了使程序在運行時能獲取相關的翻譯的內容,要進行所謂的編譯過程,將文本文件轉換為二進制文件.mo。這里用了gettext工具集中的另一程序msgfmt。

            > msgfmt --output=test.mo test.po

            因為windows下沒有像linux像有公共存儲.mo文件的目錄,保持平臺的遷移性,在應用程序本地目錄下新建locale目錄,用來存放編譯過的.mo文件,然后將test.mo移動至locale目錄。在完成這些步驟后,就轉入代碼方面的更改了。

            wxPython代碼更改

            原先的代碼只需要做小改動:

            def OnInit(self):
                wx.Locale.AddCatalogLookupPathPrefix('locale')
                self.locale = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED)
                self.locale.AddCatalog('test')
                import __builtin__
                __builtin__.__dict__['_'] = wx.GetTranslation

            首先,增加了新的目錄文件路徑,這將使wxPython搜索這個目錄,尋找匹配的.mo文件。接著創建wx.Locale對象,將其初始化為簡體中文,這將對應于zh_CN。最后將wx.GetTranslation做了一全局映射,這樣你在其他類中,比如示例中TestFrame也能使用_('xx')調用。這樣wxPython的i18n工作就完成了,下面是翻譯前后的界面截圖。

            wxpython

            一些有益的討論

            .mo文件的查找目錄

            如果你將locale目錄下的test.mo文件刪除掉,然后將test.py中的wx.LANGUAGE_CHINESE_SIMPLIFIED改為wx.LANGUAGE_CHINESE,重新運行程序看看。發現界面變成了如下的繁體中文,但是菜單'檔案'下的Exit還是英文。

            wxzh

            因為缺失.mo文件,但又指定wx.LANGUAGE_CHINESE,wxPython運行時使用了wxstd.mo文件。wxstd.mo有許多預編譯好的常見字符串的對應關系,它隨wxPython發布,在wx/locale下有許多語言版本的wxstd.mo。

            對于wxPython會對待查目錄"DIR"來搜索.mo文件,查找它下面的這些目錄,(DIR/LANG/LC_MESSAGES;DIR/LANG;DIR),對于哪些是待查目錄,各個系統下又有不同,在所有的平臺上,LC_PATH環境變量指定的目錄將成為待查目錄,在Linux下/share/locale, /usr/share/locale, /usr/lib/locale, /usr/locale /share/locale以及當前目錄將是待查目錄。在上面我們已經用過AddCatalogLookupPathPrefix()函數,其作用就是增加自己的待查目錄。

            在示例程序中,將test.mo放在locale\zh_CN\LC_MESSAGES或者locale\zh\LC_MESSAGES同樣是可行的。但是如果使用wx.LANGUAGE_CHINESE指定,則zh_CN目錄將不可行,因為它只是特化目錄,指簡體中文,而zh目錄同樣適用。

            工具鏈再討論

            gettext進行國際化是開源社區的主流方案,它也提供了許多實用工具供使用。上面提到了xgettext,msgfmt,還有msginit.exe,它將根據.pot文件創建新的.po文件,然后初始化一些元信息,像作者信息,項目,以及編碼等,當然也可像上面的手工編輯。msgmerge.exe將兩個.po文件進行合并。除了使用GNU Gettext工具集,也可使用隨python發布的tool\i18n目錄下pygettext.py和msgfmt.py,它們等同于上述的兩個工具。

            對于編輯.po文件,可以嘗試一下Poedit,它提供了圖形化的編輯環境,其他功能我就不清楚了。

            posted on 2008-07-15 20:21 len 閱讀(2213) 評論(0)  編輯 收藏 引用 所屬分類: 程序開發

            <2008年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久本道综合久久伊人| 久久精品国产亚洲av麻豆小说| 久久久精品免费国产四虎| 色综合久久综精品| 无夜精品久久久久久| 欧美丰满熟妇BBB久久久| 精品一区二区久久| 久久久久国产精品人妻| 国产精品久久久久影视不卡| 久久亚洲高清综合| 波多野结衣中文字幕久久| 性做久久久久久久久久久| 99久久超碰中文字幕伊人| 久久久久国产一级毛片高清板| 新狼窝色AV性久久久久久| 国产成人久久精品麻豆一区| 午夜精品久久久久久99热| 久久激情五月丁香伊人| 精品免费tv久久久久久久| 久久人妻无码中文字幕| 久久综合亚洲色HEZYO国产| 伊人久久大香线蕉精品| 麻豆AV一区二区三区久久| 久久亚洲中文字幕精品一区| 99久久免费只有精品国产| 99国产精品久久久久久久成人热| 久久精品国产99国产精品亚洲| 久久久噜噜噜久久中文字幕色伊伊| 精品熟女少妇av免费久久| 亚洲中文字幕久久精品无码APP| 午夜精品久久影院蜜桃| 日日狠狠久久偷偷色综合96蜜桃| 国产成人AV综合久久| 青青热久久综合网伊人| 91久久精品无码一区二区毛片| 97久久国产亚洲精品超碰热| 精品久久久久久无码中文字幕一区 | 久久五月精品中文字幕| 久久综合给合综合久久| 亚洲伊人久久综合中文成人网| 久久精品国产男包|