2011-12-12 29 views
12

que intenta habilitar la etiqueta trans y he hecho una plantilla de prueba i18n.html:¿Cómo habilitar la etiqueta {% trans%} para las plantillas de jinja?

{% trans %}For sale{% endtrans %}--{{message}}--{{decimal_format}} Aquí está mi código Python de acuerdo con la manpages:

from webapp2_extras import i18n as multilingua 
import jinja2 
from webapp2_extras.i18n import lazy_gettext as gettext 
from webapp2_extras.i18n import lazy_gettext as _ 
from jinja2 import Environment, FileSystemLoader 
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), 
         extensions=['jinja2.ext.i18n']) 

# The code below seems wrong since it is django but it was the only way I could make the page load 

jinja_environment.install_gettext_translations(django.utils.translation) 

class HelloWorldHandler(webapp2.RequestHandler): 
    def get(self): 
     # Set the requested locale. 
     locale = self.request.GET.get('locale', 'pt') 
     multilingua.get_i18n().set_locale(locale) 
     message = multilingua.gettext('For sale') 
     #django.utils.translation.activate('pt') 
     template = jinja_environment.get_template('templates/i18n.html') 
    decimal_format = multilingua.I18n(self.request).format_decimal(1000) 
     self.response.out.write(template.render(message=message, decimal_format=decimal_format)) 

no pude hacer que funcione sin django y por lo tanto, pregunto cómo perder la traducción de django y quedarse con webapp2.i18n + jinja en su lugar.

Hubo también una discusión en a thread donde no soy el único que dice que la documentación es algo incompleta o difícil de encontrar. ¿Podría responder o comentar cuál es la forma recomendada de hacer que la etiqueta trans funcione y por qué debo incluir jinja_environment.install_gettext_translations(django.utils.translation) ?

Cuando intento eliminar el uso de django también pierdo las funciones de webapp2.i18n. Mis archivos de configuración regional están en locale/... y conf/locale ... ya que el primero es el predeterminado para webapp2 y el segundo es el predeterminado para las traducciones de django, así que realmente podría usar algunas pautas para mejores prácticas aquí para deshacerse de las dependencias de django y usan webapp2 y jinja para renderizar mis localizaciones.

Si a ningún tipo de ayuda, que ha recibido un mensaje de error al intentar quitar Django:

self.response.out.write(template.render(message=message, decimal_format=decimal_format)) 
    File "/media/Lexar/montao/montaoproject/jinja2/environment.py", line 894, in render 
    return self.environment.handle_exception(exc_info, True) 
    File "/media/Lexar/montao/montaoproject/templates/i18n.html", line 2, in top-level template code 
    {{ _('For sale') }}--{{message}}--{{decimal_format}} 
UndefinedError: 'gettext' is undefined 

Gracias

+0

Solución/solución no documentada que hace que mis etiquetas jinja trans wor k: 'from webapp2_extras import i18n jinja_environment.install_gettext_translations (i18n)' –

+1

Sería interesante saber cómo encontraste esta solución/solución no documentada. – eyquem

+1

a cualquiera que lea esto, aquí hay una guía actualizada sobre cómo hacer esto http://mikeshilkov.wordpress.com/2012/07/26/enable-jinja2-and-i18n-translations-on-google-appengine/ –

Respuesta

9

Tome un vistazo a Jinja2 de i18n Extension documentation. Llamar al install_gettext_translations básicamente establece el objeto a través del cual Jinja2 llamará a gettext, ngettext, etc., para traducir cadenas cuando encuentre una etiqueta {% trans %}.

Dado que esas funciones están definidas en webapp2.i18n (ver here), Jinja2 llamará con éxito esas funciones para recuperar traducciones, dependiendo de su llamada a set_locale en el interior de la solicitud. No tengo el código en frente mío, pero supongo que gettext y la compañía definida en webapp2.i18n son meramente representantes para llamar al webapp.i18.get_i18n().gettext, que es la magia que hace que todo esto funcione.

2

Aquí es un ejemplo de trabajo de Django + Jinja2:

from jinja2 import PackageLoader, Environment 
from django.utils import translation 

...

jinja_environment = Environment(loader=PackageLoader('website', 'templates'), 
           extensions=['jinja2.ext.i18n']) 

jinja_environment.install_gettext_translations(translation) 

template = jinja_environment.get_template('test.jinja.html') 

page_next_app_table = template.render() 

...

En test.jinja.html:

<html> 
<b> {{ _("Traslate This") }}:</b> 
</html> 
Cuestiones relacionadas