• <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

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

            創(chuàng)建PO文件

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

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

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

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

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

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

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

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

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

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

            將得到的test.pot另存為test.po文件,然后進(jìn)行翻譯編輯,在這過程中文件需要使用utf-8編碼。將對應(yīng)的英文翻譯成中文,將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這些文件都是文本文件,主要供翻譯者使用。為了使程序在運(yùn)行時(shí)能獲取相關(guān)的翻譯的內(nèi)容,要進(jìn)行所謂的編譯過程,將文本文件轉(zhuǎn)換為二進(jìn)制文件.mo。這里用了gettext工具集中的另一程序msgfmt。

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

            因?yàn)閣indows下沒有像linux像有公共存儲.mo文件的目錄,保持平臺的遷移性,在應(yīng)用程序本地目錄下新建locale目錄,用來存放編譯過的.mo文件,然后將test.mo移動(dòng)至locale目錄。在完成這些步驟后,就轉(zhuǎn)入代碼方面的更改了。

            wxPython代碼更改

            原先的代碼只需要做小改動(dòng):

            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搜索這個(gè)目錄,尋找匹配的.mo文件。接著創(chuàng)建wx.Locale對象,將其初始化為簡體中文,這將對應(yīng)于zh_CN。最后將wx.GetTranslation做了一全局映射,這樣你在其他類中,比如示例中TestFrame也能使用_('xx')調(diào)用。這樣wxPython的i18n工作就完成了,下面是翻譯前后的界面截圖。

            wxpython

            一些有益的討論

            .mo文件的查找目錄

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

            wxzh

            因?yàn)槿笔?mo文件,但又指定wx.LANGUAGE_CHINESE,wxPython運(yùn)行時(shí)使用了wxstd.mo文件。wxstd.mo有許多預(yù)編譯好的常見字符串的對應(yīng)關(guān)系,它隨wxPython發(fā)布,在wx/locale下有許多語言版本的wxstd.mo。

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

            在示例程序中,將test.mo放在locale\zh_CN\LC_MESSAGES或者locale\zh\LC_MESSAGES同樣是可行的。但是如果使用wx.LANGUAGE_CHINESE指定,則zh_CN目錄將不可行,因?yàn)樗皇翘鼗夸洠负嗴w中文,而zh目錄同樣適用。

            工具鏈再討論

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

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

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

            <2008年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            欧美综合天天夜夜久久| 99久久国产综合精品网成人影院| 久久久久一区二区三区| 亚洲AV无码1区2区久久| 亚洲一本综合久久| 99久久国产综合精品网成人影院| 国产精品欧美久久久久天天影视 | 99精品国产99久久久久久97| 久久精品久久久久观看99水蜜桃| 久久久无码一区二区三区 | 日本精品久久久中文字幕| 97久久精品人人澡人人爽| 国产69精品久久久久APP下载| 精品午夜久久福利大片| 欧美亚洲国产精品久久高清| 99久久99久久久精品齐齐| 亚洲欧美日韩久久精品第一区| 精品国际久久久久999波多野| 欧美日韩久久中文字幕| 久久线看观看精品香蕉国产| 波多野结衣久久| 久久精品视屏| 狠狠久久综合伊人不卡| 2021精品国产综合久久| 久久大香萑太香蕉av| 99久久99久久精品国产| 91久久婷婷国产综合精品青草| 久久性精品| 性做久久久久久久久浪潮| 人妻中文久久久久| 久久久久综合中文字幕| 欧美精品一区二区精品久久| 久久亚洲日韩精品一区二区三区| 久久伊人五月丁香狠狠色| 久久国产精品免费一区二区三区| 久久久无码精品亚洲日韩蜜臀浪潮 | 国产精品美女久久久免费| 国内精品久久久久影院免费| 狠狠色婷婷久久一区二区三区| 漂亮人妻被中出中文字幕久久 | 中文字幕久久久久人妻|