我有下面的代码,应该显示两行英文文本和一行罗马尼亚文本之间的两个英文文本,但它只显示英文文本(翻译切换不起作用):
主.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
但是,如果我想动态地更改语言,那么上面给出的第一个代码片段所生成的输出将不会被翻译。
我做错什么了?我从医生那里听错了什么?
翻译通常面向最终用户,而不是开发人员。因此,请将字符串保留为代码中的文字,并仅在显示它们时进行翻译:
。。。
请注意,字符串提取工具将无法再找到这些字符串,除非您在代码中的某个位置使用u()调用它们。
如果不想手动将字符串添加到翻译文件中,可以向模块中添加以下内容:
或者这个:
install()所做的只是将函数定义为可以翻译文本的东西。在第一个示例中,您在ro.install()调用之前执行
x = card.Rank()
,因此只有在调用j = _('Jack')
时,才会将其转换为默认英语。随后,_u()被重新定义为罗马尼亚语-但它再也不会被调用,因此再也不会被重传。我希望这能奏效:
完全有效!
是的,字符串文本必须在您的代码中的某个位置。
字符串文本不必位于显示文本的同一模块中。把字符串文本放在同一个模块中对眼睛来说并不好看(不是OOP)。
使用py v2.7/gtk v2.24.10/gettext 0.18.1成功测试
免责声明 在让gettext为您的python应用程序工作之前,不要尝试这样做。包括能够随时更改语言环境。这些都是不小的壮举。这将消除99%的困惑。要么成功要么失败。我是说成功!
相关问题 更多 >
编程相关推荐