2011-12-12 14 views
12

próbuję włączyć tag trans i zrobiłem i18n.html szablonu Test:Jak włączyć znacznik {% trans%} w szablonach jinja?

{% trans %}For sale{% endtrans %}--{{message}}--{{decimal_format}} Tu jest mój kod Pythona według 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)) 

nie mogłem zrobić to praca bez django i dlatego pytam, jak stracić tłumaczenie django i pozostać przy webapp2.i18n + jinja zamiast tego.

Była też dyskusja w a thread, w której nie tylko ja twierdzę, że dokumentacja jest nieco niekompletna lub trudna do znalezienia. Czy mógłbyś odpowiedzieć lub skomentować, co jest zalecanym sposobem działania tagu trans i dlaczego muszę dołączyć jinja_environment.install_gettext_translations(django.utils.translation) ?

Kiedy próbuję usunąć moje użycie django, tracę również funkcje webapp2.i18n. Moje pliki ustawień narodowych znajdują się w ustawieniach narodowych/... i conf/locale .. ponieważ pierwsze jest domyślne dla webapp2, a drugie jest domyślne dla tłumaczeń django, więc mogłem naprawdę użyć kilku wskazówek dotyczących najlepszych praktyk, aby pozbyć się zależność django i używanie webapp2 i jinja do renderowania moich lokalizacji.

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 

Dziękuję

+0

Nieudokumentowane rozwiązanie/obejście, które powoduje, że moje tagi trans jinja wor wor k: 'from webapp2_extras import i18n jinja_environment.install_gettext_translations (i18n)' –

+1

Byłoby interesujące wiedzieć, jak znalazłeś to nieudokumentowane rozwiązanie/obejście. – eyquem

+1

dla każdego, kto to czyta, oto aktualny przewodnik, jak to zrobić http://mikeshilkov.wordpress.com/2012/07/26/enable-jinja2-and-i18n-translations-on-google-appengine/ –

Odpowiedz

9

Spójrz na Jinja2 na i18n Extension documentation:

Jeżeli do jakiejkolwiek pomocy, to podczas próby usunięcia Django nie jest komunikat o błędzie. Wywołanie install_gettext_translations zasadniczo ustawia obiekt, przez który Jinja2 wywoła gettext, ngettext, itp., Aby przetłumaczyć ciągi znaków, gdy napotkają znacznik {% trans %}.

Ponieważ te funkcje są zdefiniowane na webapp2.i18n (patrz here), jinja2 z powodzeniem wywoła te funkcje w celu pobrania tłumaczeń, zależnie od Twojego połączenia z numerem set_locale wewnątrz żądania. Nie mam kodu przede mną, ale domyślam się, że gettext i firma zdefiniowana w webapp2.i18n są jedynie proxy, aby zadzwonić pod numer webapp.i18.get_i18n().gettext, co jest magią, która sprawia, że ​​wszystko to działa.

2

Oto przykład pracując dla 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() 

...

W test.jinja.html:

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