Looks up for a template based on the template-name plus the current users language code. Loads the template and renders it with the current context.
Example::
{% langinclude "foo/some_include.html" %}
Based on the users LANGUAGE_CODE, assumed we have 'de', it tries to render the template 'foo/some_include.html.de'. If that doesn't exists, it renders the template 'foo/some_include.html'. This is the default behavior of the include-Tag.
Basically this is a shortcut for the following code, just with a fallback for the default template::
{% ifequal LANGUAGE_CODE "de" %}
{% include "foo/some_include.html.de" %}
{% else %}
{% include "foo/some_include.html" %}
{% endifequal %}
Ein deutscher Weblogeintrag mit Beschreibung
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | from django.template import Library, Node
from django.template import TemplateSyntaxError, TemplateDoesNotExist, Variable
from django.template.loader_tags import IncludeNode
from django.template.loader import get_template
from django.conf import settings
register = Library()
class ConstantLanguageIncludeNode(Node):
def __init__(self, template_path):
self.template_path = template_path
def render(self, context):
try:
t = get_template('%s.%s' % (self.template_path, context['LANGUAGE_CODE']))
except TemplateDoesNotExist, KeyError:
t = get_template(self.template_path)
except:
if settings.TEMPLATE_DEBUG:
raise
return ''
return t.render(context)
def do_language_include(parser, token):
"""
Looks up for a template based on the template-name plus the current users language code.
Loads the template and renders it with the current context.
Example::
{% langinclude "foo/some_include.html" %}
Based on the users LANGUAGE_CODE, assumed we have 'de', it tries to render the
template 'foo/some_include.html.de'. If that doesn't exists, it renders the
template 'foo/some_include.html'. This is the default behavior of the include-Tag.
Basically this is a shortcut for the following code, just with a fallback for the
default template::
{% ifequal LANGUAGE_CODE "de" %}
{% include "foo/some_include.html.de" %}
{% else %}
{% include "foo/some_include.html" %}
{% endifequal %}
"""
bits = token.contents.split()
if len(bits) != 2:
raise TemplateSyntaxError, "%r tag takes one argument: the name of the template to be included" % bits[0]
path = bits[1]
if path[0] in ('"', "'") and path[-1] == path[0]:
return ConstantLanguageIncludeNode(path[1:-1])
return IncludeNode(bits[1])
register.tag('langinclude', do_language_include)
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 3 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 6 months ago
Comments
I like this, but it kills file-type detection on most editors.
What would something like mytemplate_de.html w/ failover to mytemplate.html look like? Probably have to mess with template_loaders, right?
#
Justin, I was aware of this but a template name like "mytemplate_de.html" means, that you must use .html as the extension. Or it must replace the language before the last dot ... but what is, if there is no dot?
In most editors it is just one shortcut to set highlighting to html but feel free to extend it. ;)
#
if there is no dot:
#
Sorry...
#
Please login first before commenting.