Python,gettext:如何为模块和类级变量获取正确的语言环境?

2024-10-03 17:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用gettext作为模块级和类级变量时遇到了一些问题。在

首先,在导入时,我使用默认的语言环境并安装它。 之后,当我开始我的项目时,我通过解析设置获得特定的语言环境,并使用gettext.translation.install来设置正确的语言环境。所有的工作都很好,但是在我的代码中,所有模块和类级别的变量都使用默认的语言环境进行翻译,这是不对的。在

例如,我有这样的项目:

├── foo.py
├── i18t
│   └── __init__.py
├── __init__.py
└── run.py

i18t/__init__.py包含:

^{pr2}$

__init__.py

from i18n import DEFAULT_LANGUAGE, install_language

install_language(DEFAULT_LANGUAGE)

foo.py

foo = _('Bar')

run.py

from i18t import install_language
import foo


def main():
    ...
    read config and get right locale
    ...
    install_language(right_locale)
    bar = _('Bazz')
    print(foo.foo)
    print(bar)

我执行run.py,然后用默认的语言环境翻译foo.foo,用正确的语言环境翻译bar。 我知道在导入模块时,foo.foo只运行_(gettext)一次,但我需要得到正确的翻译字符串。 哪种方法更好?在


Tags: 模块install项目runfrompyimport语言
1条回答
网友
1楼 · 发布于 2024-10-03 17:28:07

这种情况下的问题是希望对在导入时只计算一次的字符串使用运行时函数gettext。我想最好不要这样做。在

但是我通过使用类似于in speaklater package或继承对象UserSting的类似字符串的对象解决了这个问题,并创建了自己的gettext函数:

from collections import UserString


class RuntimeTranslatedString(UserString):

    def __init__(self, message):
        self._data = message

    @property
    def data(self):
        return _(self._data)


def N_(message):
    return RuntimeTranslatedString(message)

在代码中,可以像_(gettext)一样使用它:

^{pr2}$

别忘了把它添加到你的extract_message命令中。在我的setup.cfg中,它看起来像:

[extract_messages]
output_file = my-package/i18n/locale/translation.pot
keywords = _ N_

我不确定这是否是一个好的解决办法,但它是有效的。在

相关问题 更多 >