国际化和本地化
国际化, Internationalization, I18N
本地化,Localization, L10N
.pot文件:portable object template,.po文件模板,文本文件,可由.pot文件创建.po文件.po文件:portable object,可移植对象,文本文件,记录翻译信息.mo文件,machine object,二进制文件,由msgfmt工具将.po文件编译为.mo文件
可以使用https://poedit.net/工具将`.po`文件编译为`.mo`文件,本质上还是调用`msgfmt`工具。
locales
en_US
LC_MESSAGES
messages.mo
messages.po
fr_FR
LC_MESSAGES
messages.mo
messages.po
zh_CN
LC_MESSAGES
messages.mo
messages.po
i18n.py
locales/en_US/LC_MESSAGES/messages.po
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language: en_US\n"
msgid "你好,世界!"
msgstr "Hello, World!"
msgid "予早技术博客"
msgstr "yuzao technology blog"
locales/fr_FR/LC_MESSAGES/messages.po
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language: fr_FR\n"
msgid "你好,世界!"
msgstr "Bonjour, le Monde!"
msgid "予早技术博客"
msgstr "blog technique yuzao"
locales/zh_CN/LC_MESSAGES/messages.po
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language: zh_CN\n"
msgid "你好,世界!"
msgstr "你好,世界!"
msgid "予早技术博客"
msgstr "予早技术博客"
# i18n.py
import builtins
import gettext
def main():
# 初始化本地化
# _为国际化处理时的约定方式,与具体语言无关,本质是调用翻译函数gettext
# Python中调用install函数时会以builtins.__dict__['_'] = self.gettext的方式进行转换
gettext.translation('messages', localedir='locales', languages=['fr_FR']).install()
print(_("你好,世界!")) # Bonjour, le Monde!
gettext.translation('messages', localedir='locales', languages=['en_US']).install()
print(_("予早技术博客")) # yuzao technology blog
print(_("予早")) # 予早
# 为避免Python中_的使用,可以指明为内置模块
print(builtins._("予早技术博客")) # yuzao technology blog
if __name__ == "__main__":
main()