Python,gettext:如何为模块级和类级变量获取正确的语言环境?
当我将gettext用于模块级和类级变量时,我遇到了一些麻烦 首先,在导入时,我使用默认区域设置并安装它。 之后,当我通过解析设置启动项目时,我会得到特定的区域设置,并使用Python,gettext:如何为模块级和类级变量获取正确的语言环境?,python,gettext,Python,Gettext,当我将gettext用于模块级和类级变量时,我遇到了一些麻烦 首先,在导入时,我使用默认区域设置并安装它。 之后,当我通过解析设置启动项目时,我会得到特定的区域设置,并使用gettext.translation.install设置正确的区域设置。所有这些都可以很好地工作,但在我的代码中,所有模块级和类级变量都使用默认语言环境进行翻译,而不是正确的 例如,我有这样的项目: ├── foo.py ├── i18t │ └── __init__.py ├── __init__.py └── run
gettext.translation.install
设置正确的区域设置。所有这些都可以很好地工作,但在我的代码中,所有模块级和类级变量都使用默认语言环境进行翻译,而不是正确的
例如,我有这样的项目:
├── foo.py
├── i18t
│ └── __init__.py
├── __init__.py
└── run.py
i18t/\uuuu init\uuuuu.py
包含:
import gettext
from os import path
SUPPORTED_LANGUAGES = ('en', 'fr')
DEFAULT_LANGUAGE = SUPPORTED_LANGUAGES[0]
locale_path = path.abspath(path.join(path.dirname(__file__), 'locale'))
TRANSLATIONS = {
lang: gettext.translation(
'domain',
locale_path,
languages=[lang]
) for lang in SUPPORTED_LANGUAGES
}
def install_language(language):
lang = TRANSLATIONS.get(language)
if lang is None:
lang = TRANSLATIONS[DEFAULT_LANGUAGE]
lang.install()
\uuuu init\uuuuu.py
:
from i18n import DEFAULT_LANGUAGE, install_language
install_language(DEFAULT_LANGUAGE)
foo = _('Bar')
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)
foo.py
:
from i18n import DEFAULT_LANGUAGE, install_language
install_language(DEFAULT_LANGUAGE)
foo = _('Bar')
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
:
from i18n import DEFAULT_LANGUAGE, install_language
install_language(DEFAULT_LANGUAGE)
foo = _('Bar')
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),但我需要得到正确的翻译字符串。
哪种方法更好呢?本例的问题是希望对在导入时只计算一次的字符串使用运行时函数
gettext
。我认为最好不要这样做
但我解决了这个问题,使用了类似字符串的对象,比如in或inherit对象,并创建了自己的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)
在您的代码中,您可以像\uu
(gettext)一样使用它:
不要忘记将其添加到您的extract\u message
命令中。在mysetup.cfg
中,它看起来像:
[extract_messages]
output_file = my-package/i18n/locale/translation.pot
keywords = _ N_
我不确定这是否是一个好的解决方案,但它确实有效。我认为N_u函数应该是
返回RuntimeTranslatedString(message)。data
@LeHoaiDuc感谢您的评论,但实际上不应该是这样。如果您遵循UserString
文档的链接,您会发现它通过访问data
属性与普通python字符串一样工作。因此,您可以像普通字符串一样使用它,而无需直接访问.data
。