14.国际化和本地化

予早 2024-10-05 11:38:01
Categories: Tags:

国际化和本地化

国际化, Internationalization, I18N
本地化,Localization, L10N

可以使用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()