Reputation: 2936
I can use jinj2 templates with django via render_to_response defined as below
from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.http import HttpResponse from django.template import TemplateDoesNotExist, Context from django.utils import translation from itertools import chain from jinja2 import FileSystemLoader, Environment from jinja2 import nodes from jinja2.ext import Extension from django.conf import settings import jinja_filters as jf import traceback from django.utils.translation import gettext, ngettext class DjangoTranslator(object): def __init__(self): self.gettext = gettext self.ngettext = ngettext class DjangoEnvironment(Environment): def get_translator(self, context): return DjangoTranslator() template_dirs = getattr(settings,'TEMPLATE_DIRS') default_mimetype = getattr(settings, 'DEFAULT_CONTENT_TYPE') global_exts = getattr(settings, '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' in global_exts: env.install_gettext_translations(translation) def render_to_response(filename, context={}, context_instance=Context({}), mimetype=default_mimetype): template = env.get_template(filename) for d in context_instance.dicts: context.update(d) context.update({'settings':settings}) rendered = template.render(**context) return HttpResponse(rendered, mimetype=mimetype)
but cannot make django extract translation strings for jinja2 templates.
seems that the lines below in django/utils/translation/trans_real.py make it possible for makemessages command to parse django templates for i18n via 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$""") plural_re = re.compile(r"""^\s*plural$""") constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""")
is there a nicer way than modifying the makemessages.py by rewriting translation tags regexes for local use on jinja2 templates to extract translation strings?
Upvotes: 3
Views: 3249
Reputation: 32047
I've added support for this to Coffin, based on this approach:
http://github.com/miracle2k/coffin/commit/ba1a8a510b05074731d383e0dc1f7c21c67ff728
Upvotes: 1
Reputation: 2936
A little modification made it for me.. Base recipe is as follows, you might need to add/modify some more to fit your needs.
$ ~ > cp $DJANGO_PATH/utils/translation/ myproject/utils/ -a
and make the modifications given below:
$ ~ > diff $DJANGO_PATH/utils/translation/trans_real.py myproject/utils/translation/trans_real.py -u --- utils/translation/trans_real.py Wed Jan 20 05:07:46 2010 +++ myproject/utils/translation/trans_real.py Wed Jan 20 04:51:39 2010 @@ -435,6 +435,9 @@ endblock_re = re.compile(r"""^\s*endblocktrans$""") plural_re = re.compile(r"""^\s*plural$""") 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 @@ for t in Lexer(src, None).tokenize(): if intrans: if t.token_type == TOKEN_BLOCK: - endbmatch = endblock_re.match(t.contents) + endbmatch = jinja_endblock_re.match(t.contents) pluralmatch = plural_re.match(t.contents) if endbmatch: if inplural: @@ -485,7 +488,7 @@ else: 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) if imatch: 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 Wed Jan 20 05:08:37 2010 +++ main/management/commands/makemessages.py Wed Jan 20 05:28:41 2010 @@ -56,7 +56,7 @@ else: settings.configure(USE_I18N = True) - from django.utils.translation import templatize + from myproject.utils.translation import templatize if os.path.isdir(os.path.join('conf', 'locale')): localedir = os.path.abspath(os.path.join('conf', 'locale'))
then calling make messages as follows does the trick
$ ~/myproject/ > ./manage.py mymakemessages -l $LANGUAGE -e .jinja -v 2
my templates are named as templ_name.jinja, you'll need to replace .jinja in the command above with whatever extension you use for your template names.
Upvotes: 2