我有以下代码,它应该在两个英文文本之间显示两行英文文本和一行罗马尼亚文本,但它只显示英文文本(翻译切换不起作用):在Python和gettext中切换翻译
main.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
card.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
我用xgettext
和msgfmt
生成.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
但是,如果我想动态更改语言,上面显示的第一个代码段所做的输出将不会被翻译。
我在做什么错了?我从文档中了解了什么错误?
不,它仍然不起作用。所有的信息都是英文的。 – Paul 2013-02-19 14:31:42
是的,因为代码中的翻译是在类加载期间完成的,因为_()函数不是在构造函数中调用的,而是作为类定义的一部分。在这个答案中给出的解释是正确的,但是这个例子忽略了那个细节 – 02strich 2014-07-18 13:59:18