Как включить тег {% trans%} для шаблонов jinja?
Я пытаюсь включить тег 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 tag и почему я должен включить jinja_environment.install_gettext_translations(django.utils.translation)
Когда я пытаюсь удалить мое использование django, я также теряю функции webapp2.i18n. Мои файлы локали находятся как в locale/..., так и в conf/locale.. поскольку первый является значением по умолчанию для webapp2, а второй является значением по умолчанию для переводов django, поэтому я мог бы действительно использовать некоторые рекомендации для лучшей практики здесь, чтобы избавиться от django dependecies и использовать 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
Спасибо
Ответы
Ответ 1
Взгляните на Jinja2 i18n Документация по расширению. Вызов install_gettext_translations
в основном устанавливает объект, через который Jinja2 вызовет gettext, ngettext и т.д., Чтобы перевести строки, когда он встречает тег {% trans %}
.
Так как эти функции определены на webapp2.i18n
(см. здесь), jinja2 будет успешно вызывать эти функции для получения переводов, в зависимости от вашего вызова до set_locale
внутри запроса. У меня нет кода передо мной, но я бы предположил, что gettext
и компания, определенная в webapp2.i18n
, являются просто прокси-серверами для вызова webapp.i18.get_i18n().gettext
, что является магией, которая заставляет все это работать.
Ответ 2
Вот рабочий пример для 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>