Python通過gettext模組支援國際化(i18n),可以實現程式的多語言介面的支援,下面是我的多語言支援實現:
1. 在python安裝目錄下的./Tools/i18n/(windows下例 D:\Program Files\Python25\Tools\i18n)目錄中找到pygettext.py運行之,產生翻譯檔案模版messages.pot,內容大概是這個樣子:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2007-01-24 15:05+China Standard Time\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n" "Generated-By: pygettext.py 1.5\n"
|
改之,charset=gb2312 Content-Transfer-Encoding: utf8如下:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2007-01-18 09:55+China Standard Time\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=gb2312\n" "Content-Transfer-Encoding: utf8\n" "Generated-By: pygettext.py 1.5\n"
|
那個msgid” ” 和msgstr” “不要動
好,翻譯檔案已經建立了,儲存之,檔案名稱改為lang.po.
2. 建立翻譯檔案路徑,在主檔案目錄下建立中文翻譯路徑 ./locale/cn/LC_MESSAGES/(windows下例D:\ python-prj\src\locale\cn\LC_MESSAGES,其中src目錄是源檔案主目錄),英文翻譯路徑 ./locale/en/LC_MESSAGES/(windows下例D:\ python-prj\src\locale\en\LC_MESSAGES,其中src目錄是源檔案主目錄)
3. 在主檔案中引入gettext模組:
# -*- coding: utf-8 -*- #!/usr/bin/env python import gettext gettext.install('lang', './locale', unicode=False) gettext.translation('lang', './locale', languages=['cn']).install(True)
|
第四行中lang是翻譯檔案主名, ./locale是存放翻譯檔案的路徑,第三個參數是是否使用unicode,第五行languages參數指定要使用的語言存放的子目錄,這裡cn表示使用./locale/cn/LC_MESSAGES/路徑下的翻譯檔案.
注意: # -*- coding: utf-8 -*- 一定要寫在前兩行,寫第三行都不會生效
4. 處理要翻譯的字串,例:
print “Hello world!” print “Python is a good Language.”
|
改之:
print _(“Hello world!”) print _(“Python is a good Language.”)
|
5. 編寫並產生翻譯檔案,開啟步驟1中編輯過的lang.po檔案添加翻譯文字,形成如下內容:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2007-01-18 09:55+China Standard Time\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=gb2312\n" "Content-Transfer-Encoding: utf8\n" "Generated-By: pygettext.py 1.5\n"
msgid " Hello world!" msgstr "世界你好!"
msgid " Python is a good Language." msgstr "Python 是門好語言."
|
儲存之,運行./Tools/i18n/目錄下的msgfmt.py,Linux下命令為: python msgfmt.py lang.po(widows下的話,將lang.po檔案拷貝到./Tools/i18n/目錄下,運行命令列視窗,到改目錄下鍵入:msgfmt.py lang.po),產生lang.mo,將該檔案拷貝至./locale/cn/LC_MESSAGES/目錄下,將步驟1產生的lang.po檔案直接產生lang.mo檔案拷貝到./locale/en/LC_MESSAGES/目錄下,好了一切都準備好了,命令列下運行你的主檔案,看看兩個print命令是不是輸出了世界你好! Python 是門好語言.,如果將主檔案第五行languages參數置為en,則輸出是Hello world! Python is a good Language.,因為en目錄下lang.mo檔案未做任何的翻譯,預設字串不被替換.
上述實現的方法用在介面編程上可以實現中英文介面的切換,需要作個設定檔選擇中/英文;或者在主檔案開始時先擷取作業系統本地語言然後根據擷取結果再設定中/英文,這樣就可以實現軟體語言自適應;如果想實現軟體語言線上切換,對於python來說就比較困難了,需要在軟體中加入介面重新整理機制,不推薦,可以在切換中/英文設定後軟體下一次啟動生效(軟體如Ulipad).
Note:
.調用python安裝目錄的 Tools/i18n/pygettext.py抽取所需翻譯的模板
>>> pygettext.py path/to/yourfile.py
將產生一個名為messages.pot的檔案
2.產生模板檔案後,修改這個模板檔案,其中的msgid為索引值,對應你程式裡寫的文本,如:_("New File"),而msgstr為翻譯後的值。還有就是注意修改檔案頭部分Content-Type的charset為合適的編碼,比如utf8
3.編寫好模板後,把副檔名修改為.po,運行Tools/i18n/msgfmt.py,產生二進位的資源檔
>>> msgfmt.py messages.po
將產生一個名為messages.mo的檔案
4.把這個mo檔案放在正確的位置.
比如你在程式中是這樣寫的:
gettext.install('i18ntest', './locale', unicode=True)
gettext.translation('i18ntest', './locale', languages=['cn']).install(True)
那麼你的程式目錄下需要存在./local/cn/LC_MESSAGES/i18ntest.mo
這樣程式啟動時就會讀取這個資源檔,替換對應的文本,實現國際化了。
注意:如果使用utf格式儲存,po檔案不能有BOM頭。cn目錄是所對應的語言,LC_MESSAGES目錄是gettext.py裡要求的,mo檔案必須和所定義的域同名,見
gettext.py的mofile = os.path.join(localedir, lang, 'LC_MESSAGES', '%s.mo' % domain)