我有以下代码,它应该在两个英文文本之间显示两行英文文本和一行罗马尼亚文文本,但它只显示英文文本(翻译切换不起作用):
主要.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
我用过
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
但是,如果我想即时更改语言,则不会翻译上述第一个代码片段的输出。
我做错了什么?我从文档中理解错了什么?
最佳答案
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/