Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,gettext:如何为模块级和类级变量获取正确的语言环境?_Python_Gettext - Fatal编程技术网

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

Python,gettext:如何为模块级和类级变量获取正确的语言环境?,python,gettext,Python,Gettext,当我将gettext用于模块级和类级变量时,我遇到了一些麻烦 首先,在导入时,我使用默认区域设置并安装它。 之后,当我通过解析设置启动项目时,我会得到特定的区域设置,并使用gettext.translation.install设置正确的区域设置。所有这些都可以很好地工作,但在我的代码中,所有模块级和类级变量都使用默认语言环境进行翻译,而不是正确的 例如,我有这样的项目: ├── foo.py ├── i18t │   └── __init__.py ├── __init__.py └── run

当我将gettext用于模块级和类级变量时,我遇到了一些麻烦

首先,在导入时,我使用默认区域设置并安装它。 之后,当我通过解析设置启动项目时,我会得到特定的区域设置,并使用
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
命令中。在my
setup.cfg
中,它看起来像:

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

我不确定这是否是一个好的解决方案,但它确实有效。

我认为N_u函数应该是
返回RuntimeTranslatedString(message)。data
@LeHoaiDuc感谢您的评论,但实际上不应该是这样。如果您遵循
UserString
文档的链接,您会发现它通过访问
data
属性与普通python字符串一样工作。因此,您可以像普通字符串一样使用它,而无需直接访问
.data