Получение строк перевода для шаблонов 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

Другие вопросы по тегам