python - 在 python 和 gettext 中切换翻译

标签 python internationalization gettext

我有以下代码,它应该在两个英文文本之间显示两行英文文本和一行罗马尼亚文文本,但它只显示英文文本(翻译切换不起作用):

主要.py:

#! /usr/bin/env python2.7

import gettext
gettext.install('messages', '../i18n', unicode=True)

import card

if __name__ == '__main__':
    x = card.Rank()
    print x.j, x.a, x.q, x.k

    ro = gettext.translation('messages', localedir='../i18n', languages=['ro'])
    ro.install()

    print x.j, x.a, x.q, x.k

    en = gettext.translation('messages', localedir='../i18n', languages=['en'])
    en.install()

    print x.j, x.a, x.q, x.k

卡片.py
class Suit(object):
    clubs = _('Clubs'),
    diamonds = _('Diamonds'),
    hearts = _('Hearts'),
    spades = _('Spades')


class Rank(object):
    j = _('Jack')
    q = _('Queen')
    k = _('King')
    a = _('Ace')


class Card(object):
    # ...

我的目录结构如下:
.
├── i18n
│   ├── en
│   │   └── LC_MESSAGES
│   │       └── messages.mo
│   ├── en.po
│   ├── en_US.po
│   ├── ro
│   │   └── LC_MESSAGES
│   │       └── messages.mo
│   ├── ro.po
│   └── ro.pot
├── Makefile
├── README.md
└── src
    ├── card.py
    ├── card.pyc
    ├── deck.py
    └── main.py

我用过 xgettextmsgfmt生成 .po.mo文件。

问题是,如果我只加载一种语言,文本会被翻译(在显示任何输出之前,我必须这样做作为唯一的事情)。
#! /usr/bin/env python2.7
import gettext

if __name__ == '__main__':
    ro = gettext.translation('messages', localedir='../i18n', languages=['ro'])
    ro.install()

    import card
    x = card.Rank()
    print x.j, x.a, x.q, x.k

但是,如果我想即时更改语言,则不会翻译上述第一个代码片段的输出。

我做错了什么?我从文档中理解错了什么?

最佳答案

gettext.install() 所做的就是将 _() 函数定义为翻译文本的东西。在你的第一个例子中,你做 x = card.Rank()在您的 ro.install() 调用之前 - 所以这是唯一一次 j = _('Jack')被调用,_() 将其翻译成默认英文。随后,_() 被重新定义为罗马尼亚语 - 但它再也不会被调用,因此永远不会被重新翻译。

我希望这会奏效:

#! /usr/bin/env python2.7

import gettext
gettext.install('messages', '../i18n', unicode=True)

import card

if __name__ == '__main__':
    x = card.Rank()
    print x.j, x.a, x.q, x.k

    ro = gettext.translation('messages', localedir='../i18n', languages=['ro'])
    ro.install()

    x = card.Rank()
    print x.j, x.a, x.q, x.k

    en = gettext.translation('messages', localedir='../i18n', languages=['en'])
    en.install()

    x = card.Rank()
    print x.j, x.a, x.q, x.k

关于python - 在 python 和 gettext 中切换翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946017/

相关文章:

python - "import ... as .."触发属性错误

php - 如何在 htaccess Apache 中将/en/file.php 翻译成 file.php?lang=en

python - 如何从 Python 脚本中运行 Scrapy

python - 到 Flask 的环回访问 token

ruby-on-rails - Rails 可选/:locale route

php - 如何强制 gettext 独立于当前语言翻译特定语言?

javascript - 从 JavaScript 中使用 xgettext 提取译者评论(在 Python 模式下)

php ngettext 多个变量

python - CMake 后在 PyCharm 中找不到模块 cv2 (OpenCV)

php - 组合两个都实现 __() 国际化函数的 PHP 框架