2017-07-03 4 views
1

モジュールレベルやクラスレベルの変数にgettextを使用すると、いくつか問題が発生します。Python、gettext:モジュールレベルとクラスレベルの変数の正しいロケールを取得する方法は?

まず、インポート時に私はデフォルトのロケールを使用してインストールします。 設定を解析してプロジェクトを開始するときに特定のロケールを取得した後、適切なロケールにgettext.translation.installを使用します。すべて正常に動作しますが、私のコードでは、すべてのモジュールレベルとクラスレベルの変数は、正しくはなくデフォルトのロケールで翻訳されたままです。

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

i18t/__init__.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() 

__init__.py

from i18n import DEFAULT_LANGUAGE, install_language 

install_language(DEFAULT_LANGUAGE) 

foo.py

例えば

私はこのようなプロジェクトを持っています210

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を実行し、私は右のロケールをデフォルトのロケールとbarfoo.fooを翻訳します。 私はモジュールをインポートするときにfoo.foo_(gettext)を実行することを知っていますが、正しく翻訳された文字列を取得する必要があります。 これを行うには良い方法はありますか?

答えて

0

このケースの問題は、インポート時に一度だけ評価された文字列にランタイム関数gettextを使用することです。私はこれをしないほうがいいと思う。

しかし、私はspeaklater packageに似た文字列のようなオブジェクトを使用するか、オブジェクトUserStingを継承し、独自のgettext機能を作ると、この問題は解決さ:あなたは_(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) 

を:

from .i18n import N_ 

foo = N_('Bar') 

extract_messageコマンドに忘れずに追加してください。私setup.cfgそれがどのように見えるでは:

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

私は、これは良い解決策であることはよく分からないが、それは動作します。

関連する問題