2017-07-03 4 views
1

Ich habe einige Probleme, wenn ich Gettext für Modul-und Klassen-Level-Variablen verwenden.Python, gettext: Wie bekomme ich richtige Locale für Variablen auf Modul- und Klassenebene?

Zunächst benutze ich zum Zeitpunkt des Imports mein Standardgebietsschema und installiere es. Danach erhalte ich ein spezifisches Gebietsschema, wenn ich mein Projekt starte, indem ich die Einstellungen analysiere und verwende gettext.translation.install für das richtige Gebietsschema. Alles funktioniert gut, aber in meinem Code bleiben alle Variablen auf Modul- und Klassenebene mit Standard-Gebietsschema übersetzt, nicht richtig.

Zum Beispiel habe ich Projekt wie folgt aus:

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

i18t/__init__.py enthält:

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:

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) 

ich ausführen run.py und ich erhalte foo.foo mit Standard-Gebietsschema und bar mit rechten locale übersetzt. Ich weiß, dass foo.foo run _ (gettext) nur einmal, wenn ich das Modul importieren, aber ich muss richtig übersetzte Zeichenfolge erhalten. Welcher bessere Weg, es zu tun?

Antwort

0

Problem dieses Falles ist der Wunsch, die Laufzeitfunktion für Strings zu verwenden, die nur einmal in der Importzeit ausgewertet wurden. Ich denke, es ist besser, das nicht zu tun.

Aber ich löste dieses Problem mit wie strangartige Objekt mit in speaklater package oder UserSting Objekt erben und eigene gettext Funktion machen:

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) 

In Ihrem Code können Sie es wie _ (gettext) verwenden können:

from .i18n import N_ 

foo = N_('Bar') 

Vergessen Sie nicht, fügen Sie es Ihrem extract_message Befehl hinzu. In meinem setup.cfg sieht es so aus:

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

Ich bin nicht sicher, dass dies die gute Lösung ist, aber es funktioniert.

Verwandte Themen