我正在寻找一种在gettext中请求翻译字符串时动态设置语言的方法 . 我会解释原因:
我有一个多线程机器人,可以通过多个服务器上的文本响应用户,因此需要使用不同的语言进行回复 . gettext的documentation指出,要在运行时更改语言环境,您应该执行以下操作:
import gettext # first, import gettext
lang1 = gettext.translation('myapplication', languages=['en']) # Load every translations
lang2 = gettext.translation('myapplication', languages=['fr'])
lang3 = gettext.translation('myapplication', languages=['de'])
# start by using language1
lang1.install()
# ... time goes by, user selects language 2
lang2.install()
# ... more time goes by, user selects language 3
lang3.install()
但是,这不适用于我的情况,因为机器人是多线程的:
想象一下,以下两个片段同时运行:
import time
import gettext
lang1 = gettext.translation('myapplication', languages=['fr'])
lang1.install()
message(_("Loading a dummy task")) # This should be in french, and it will
time.sleep(10)
message(_("Finished loading")) # This should be in french too, but it wont :'(
和
import time
import gettext
lang = gettext.translation('myapplication', languages=['en'])
time.sleep(3) # Not requested on the same time
lang.install()
message(_("Loading a dummy task")) # This should be in english, and it will
time.sleep(10)
message(_("Finished loading")) # This should be in english too, and it will
您可以看到消息有时会在错误的语言环境中翻译 . 但是,如果我能做 _("string", lang="FR")
这样的事情,问题就会消失!
我错过了什么,或者我使用错误的模块来完成任务......我正在使用python3
3 回答
以下示例直接使用
translation
,如o11c's answer所示,以允许使用线程:Output:
如果我对
gettext
了解更多,我会发布这个答案 . 我正在为那些真正想继续使用_()
的人留下我以前的答案 .以下简单示例显示了如何为每个转换程序使用单独的进程:
输出如下所示:
当我尝试使用线程时,我只有一个英文翻译 . 您可以在每个进程中创建单独的线程来处理连接 . 您可能不希望为每个连接创建新进程 .
我花了一点时间来编写一个使用系统上所有可用语言环境的脚本,并尝试在其中打印一条众所周知的消息 . 请注意,"all locales"仅包括编码更改,但无论如何都会被Python否定,并且大量翻译不完整,因此请使用回退 .
显然,您还必须对
xgettext
(或等效物)的使用进行适当的更改,以便您使用实际代码来识别翻译功能 .