2016-11-02 3 views
1

J'ai une application de pyramide qui utilise une usine de traduction ainsi définie:Pyramide combinée avec la fonction jinja2 install_gettext_translations?

from pyramid.i18n import get_localizer, TranslationStringFactory 
from pyramid.threadlocal import get_current_request 


def add_renderer_globals(event): 
    request = event.get('request') 
    if request is None: 
     request = get_current_request() 
    event['_'] = request.translate 
    event['localizer'] = request.localizer 

tsf = TranslationStringFactory('climmob3') 

def add_localizer(event): 
    request = event.request 
    localizer = get_localizer(request) 

    def auto_translate(string): 
     return localizer.translate(tsf(string)) 
    request.localizer = localizer 
    request.translate = auto_translate 

Il fonctionne fonction bien, mais un autre endroit que j'utilise jinja2 rendre() pour rendre de petits morceaux de code réutilisable (snippets) comme extension jinja2:

from jinja2 import Environment 
jinjaEnv = Environment(extensions=['jinja2.ext.i18n']) 

output = template.render(snippetVars=kw,renderer='snippet') 

le problème est que lorsque j'utilise la fonction de traduction '_' dans le code du modèle je reçois:

UndefinedError: 'gettext' is undefined

J'ai vu des messages que j'ai peut-être besoin d'utiliser jinjaEnv.install_gettext_translations() mais je n'arrive pas à le faire fonctionner. J'ai essayé:

jinjaEnv.install_gettext_translations(pyramid.il8n) 
jinjaEnv.install_gettext_translations(tsf) 

Comment puis-je intégrer jinjaEnv.install_gettext_translations() avec mon usine de traduction de la pyramide?

Répondre

1

En fonction de votre cas, vous pouvez utiliser pyramid_jinja2 ou vous inspirer. Il crée un GetTextWrapper https://github.com/Pylons/pyramid_jinja2/blob/28944ce627745691ccd1603c56251e038aadd892/pyramid_jinja2/i18n.py qui fait son chemin dans les options passées lors de la création de l'environnement https://github.com/Pylons/pyramid_jinja2/blob/28944ce627745691ccd1603c56251e038aadd892/pyramid_jinja2/settings.py#L133 https://github.com/Pylons/pyramid_jinja2/blob/28944ce627745691ccd1603c56251e038aadd892/pyramid_jinja2/__init__.py#L394 https://github.com/Pylons/pyramid_jinja2/blob/28944ce627745691ccd1603c56251e038aadd892/pyramid_jinja2/__init__.py#L404-L405

L'emballage est nécessaire parce que le radiophare changera chaque demande, en fonction des paramètres régionaux de l'utilisateur.

Ou vous pouvez transmettre les arguments gettext et ngettext directement lors du rendu. Dans votre cas, il ressemblerait à quelque chose comme:

localizer = request.localizer 

def gt(message): 
    return localizer.translate(message, domain='your-domain') 

def ngt(singular, plural, n): 
    return localizer.pluralize(singular, plural, n, domain='your-domain') 

output = template.render(
    snippetVars=kw, 
    renderer='snippet', 
    gettext=gt, 
    ngettext=ngt, 
    )