Получение строк перевода для шаблонов jinja2, интегрированных с django 1.x?
Я могу использовать шаблоны jinj2 с django через render_to_response, определенный как ниже
из настроек импорта django.conf из django.core.exceptions import ImproperlyConfigured из django.http импортировать HttpResponse из django.template import TemplateDoesNotExist, Context из django.utils импортный перевод из цепочки импорта itertools из jinja2 импортируйте FileSystemLoader, Среду из узлов импорта jinja2 из jinja2.ext Расширение импорта из настроек импорта django.conf импортировать jinja_filters как jf отслеживание импорта из django.utils.translation импортировать gettext, ngettext Класс DjangoTranslator(объект): def __init__(self): self.gettext = gettext self.ngettext = ngettext Класс DjangoEnvironment(Среда): def get_translator(self, context): вернуть DjangoTranslator() template_dirs = getattr(настройки,'TEMPLATE_DIRS') default_mimetype = getattr(настройки, 'DEFAULT_CONTENT_TYPE') global_exts = getattr(настройки, 'JINJA_EXTENSIONS', ()) env = DjangoEnvironment(autoescape=False, loader=FileSystemLoader(template_dirs, encoding="utf-8"), extensions=global_exts) env.filters.update({'myescape':jf.myescape}) if 'jinja2.ext.i18n' в global_exts: env.install_gettext_translations(перевод) def render_to_response (имя файла, context={}, context_instance=Context({}), mimetype=default_mimetype): template = env.get_template(имя файла) для d в context_instance.dicts: context.update(д) context.update({'Настройки': Настройки}) rendered = template.render(**context) вернуть HttpResponse(отображается, mimetype=mimetype)
но не может заставить django извлекать строки перевода для шаблонов jinja2.
Кажется, что строки ниже в django/utils/translation/trans_real.py позволяют команде makemessages анализировать шаблоны django для i18n через templatize@trans_real.py
inline_re = re.compile(r"""^\s* trans \ s + ((?:". *? ") | (?: '. *?')) \ s *" "") block_re = re.compile(r"""^\s* blocktrans (?: \ s + | $)" "") endblock_re = re.compile(r"""^\s* endblocktrans $" "") множественное число = re.compile (r " "" ^ \ s * множественное число $""") constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""")
Есть ли более приятный способ, чем модифицировать makemessages.py, переписывая регулярные выражения тегов перевода для локального использования в шаблонах jinja2 для извлечения строк перевода?
2 ответа
Небольшая модификация сделала это для меня. Базовый рецепт выглядит следующим образом, вам может понадобиться добавить / изменить еще несколько, чтобы соответствовать вашим потребностям.
$ ~> cp $ DJANGO_PATH / utils / translation / myproject / utils / -a
и внесите изменения, указанные ниже:
$ ~> diff $ DJANGO_PATH / utils / translation / trans_real.py myproject / utils / translation / trans_real.py -u --- utils / translation / trans_real.py ср 20 янв. 05:07:46 2010 +++ myproject/utils/translation/trans_real.py ср 20 янв. 04:51:39 2010 @@ -435,6 +435,9 @@ endblock_re = re.compile(r"""^\s*endblocktrans$""") множественное число = re.compile (r "" "^ \ s * множественное число $" "") constant_re = re.compile (r "" "_ \ (((?:". *? ") | (?: '. *?')) \)" "") + jinja_block_re = re.compile (r "" "^ \ s * trans (?: \ s + | $)" "") + jinja_endblock_re = re.compile (r "" "^ \ s * endtrans $" "") def templatize (src): """ @@ -451,7 +454,7 @@ для т в Lexer(src, нет).tokenize(): если intrans: if t.token_type == TOKEN_BLOCK: - endbmatch = endblock_re.match(t.contents) + endbmatch = jinja_endblock_re.match(t.contents) множественное соответствие = множественное_значение (содержание) если endbmatch: если нет: @@ -485,7 +488,7 @@ еще: if t.token_type == TOKEN_BLOCK: imatch = inline_re.match(t.contents) - bmatch = block_re.match(t.contents) + bmatch = jinja_block_re.match(t.contents) cmatches = constant_re.findall(t.contents) если совпадение: g = imatch.group (1) $ ~> cp $ DJANGO_PATH / core / management / commands /makemessages.py myproject / myapp / management / commands / $ ~ / myproject /> diff $ DJANGO_PATH / core / management / commands /makemessages.py main / management / commands /makemessages.py -u --- /usr/lib/python2.5/site-packages/django/core/management/commands/makemessages.py Ср 20 января, 05:08:37 2010 +++ main/management/ команды /makemessages.py ср 20 янв. 05:28:41 2010 @@ -56,7 +56,7 @@ еще: settings.configure (USE_I18N = True) - из django.utils.translation импортировать шаблонизировать + из myproject.utils.translation импортировать шаблонизировать if os.path.isdir(os.path.join('conf', 'locale')): localedir = os.path.abspath(os.path.join('conf', 'locale'))
затем вызов make сообщения следующим образом делает трюк
$ ~/myproject/ > ./manage.py mymakemessages -l $LANGUAGE -e .jinja -v 2
мои шаблоны названы как templ_name.jinja, вам нужно заменить.jinja в приведенной выше команде на любое расширение, которое вы используете для имен ваших шаблонов.
Я добавил поддержку этого в Coffin, основываясь на этом подходе:
http://github.com/miracle2k/coffin/commit/ba1a8a510b05074731d383e0dc1f7c21c67ff728