python國際化(i18n)和中英文切換


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM