Как включить тег {% trans%} для шаблонов jinja? - PullRequest
15 голосов
/ 12 декабря 2011

Я пытаюсь включить тег trans, и я создал тестовый шаблон i18n.html:

{% trans %}For sale{% endtrans %}--{{message}}--{{decimal_format}} Вот мой код Python в соответствии с 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))

Я не мог заставить его работать без django, и поэтому я спрашиваю, как потерять перевод django и остаться вместо него с webapp2.i18n + jinja.

Была также дискуссия в ветке , где я не единственный, кто сказал, что документация несколько неполная или ее трудно найти. Не могли бы вы ответить или прокомментировать, какой рекомендуемый способ заставить работать тэг trans и почему я должен включить jinja_environment.install_gettext_translations(django.utils.translation)

Когда я пытаюсь прекратить использование django, я также теряю функции webapp2.i18n. Мои файлы локалей находятся как в locale / ..., так и в conf / locale .., так как первый - по умолчанию для webapp2, а второй - по умолчанию для переводов django, поэтому я мог бы действительно использовать некоторые рекомендации для лучшей практики, чтобы избавиться от зависимости django и используйте webapp2 и jinja для рендеринга моих локализаций.

Если что-то поможет, я получил сообщение об ошибке при попытке удалить 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

Спасибо

Ответы [ 2 ]

10 голосов
/ 11 января 2012

Ознакомьтесь с документацией i18n Jinja2 . Вызов install_gettext_translations в основном устанавливает объект, через который Jinja2 будет вызывать gettext, ngettext и т. Д., Чтобы переводить строки, когда он встречает тег {% trans %}.

Поскольку эти функции определены в webapp2.i18n (см. здесь ), jinja2 успешно вызовет эти функции для получения переводов, в зависимости от вашего вызова set_locale внутри запроса. У меня нет кода передо мной, но я бы предположил, что gettext и компания, определенная в webapp2.i18n, являются просто прокси для вызова webapp.i18.get_i18n().gettext, что является магией, которая делает всю эту работу.

5 голосов
/ 19 мая 2015

Вот рабочий пример для 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()

...

В test.jinja.html:

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