forked from cdleary/coffin
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added a custom makemessages command (wrapping the original) that supp…
…orts string extraction from Jinja2's {% trans %} tags.
- Loading branch information
Showing
4 changed files
with
58 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
"""Jinja2's i18n functionality is not exactly the same as Django's. | ||
In particular, the tags names and their syntax are different: | ||
1. The Django ``trans`` tag is replaced by a _() global. | ||
2. The Django ``blocktrans`` tag is called ``trans``. | ||
(1) isn't an issue, since the whole ``makemessages`` process is based on | ||
converting the template tags to ``_()`` calls. However, (2) means that | ||
those Jinja2 ``trans`` tags will not be picked up my Django's | ||
``makemessage`` command. | ||
There aren't any nice solutions here. While Jinja2's i18n extension does | ||
come with extraction capabilities built in, the code behind ``makemessages`` | ||
unfortunately isn't extensible, so we can: | ||
* Duplicate the command + code behind it. | ||
* Offer a separate command for Jinja2 extraction. | ||
* Try to get Django to offer hooks into makemessages(). | ||
* Monkey-patch. | ||
We are currently doing that last thing. It turns out there we are lucky | ||
for once: It's simply a matter of extending two regular expressions. | ||
Credit for the approach goes to: | ||
http://stackoverflow.com/questions/2090717/getting-translation-strings-for-jinja2-templates-integrated-with-django-1-x | ||
""" | ||
|
||
import re | ||
from django.core.management.commands import makemessages | ||
from django.utils.translation import trans_real | ||
|
||
|
||
class Command(makemessages.Command): | ||
|
||
def handle(self, *args, **options): | ||
old_endblock_re = trans_real.endblock_re | ||
old_block_re = trans_real.block_re | ||
# Extend the regular expressions that are used to detect | ||
# translation blocks with an "OR jinja-syntax" clause. | ||
trans_real.endblock_re = re.compile( | ||
trans_real.endblock_re.pattern + '|' + r"""^\s*endtrans$""") | ||
trans_real.block_re = re.compile( | ||
trans_real.block_re.pattern + '|' + r"""^\s*trans(?:\s+|$)""") | ||
|
||
try: | ||
super(Command, self).handle(*args, **options) | ||
finally: | ||
trans_real.endblock_re = old_endblock_re | ||
trans_real.block_re = old_block_re |