Login

Language aware template loader

Author:
rmt
Posted:
April 7, 2009
Language:
Python
Version:
1.0
Tags:
template i18n
Score:
2 (after 2 ratings)

If you try to load a template named filename.LANG.html it will try to load filename.de.html first, then filename.html afterwards (assuming that German is the currently selected language).

Usage: Put in a file named langtemplateloader.py under your project, and replace django's default filesystem loader with this in the TEMPLATE_LOADERS section of settings.py:

TEMPLATE_LOADERS = ( 'myproject.langtemplateloader.load_template_source',

'django.template.loaders.filesystem.load_template_source',

'django.template.loaders.app_directories.load_template_source',
 'django.template.loaders.eggs.load_template_source',

)

 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
55
56
57
58
59
"""
Wrapper for loading templates from the filesystem.
"""

from django.conf import settings
from django.template import TemplateDoesNotExist
from django.utils._os import safe_join
from django.utils import translation

def get_template_sources(template_name, template_dirs=None):
    """
    Returns the absolute paths to "template_name", when appended to each
    directory in "template_dirs". Any paths that don't lie inside one of the
    template dirs are excluded from the result set, for security reasons.
    """
    if not template_dirs:
        template_dirs = settings.TEMPLATE_DIRS
    for template_dir in template_dirs:
        try:
            yield safe_join(template_dir, template_name)
        except UnicodeDecodeError:
            # The template dir name was a bytestring that wasn't valid UTF-8.
            raise
        except ValueError:
            # The joined path was located outside of this particular
            # template_dir (it might be inside another one, so this isn't
            # fatal).
            pass

def _load_template_source(template_name, template_dirs=None):
    tried = []
    for filepath in get_template_sources(template_name, template_dirs):
        try:
            return (open(filepath).read().decode(settings.FILE_CHARSET),
                    filepath)
        except IOError:
            tried.append(filepath)
    if tried:
        error_msg = "Tried %s" % tried
    else:
        error_msg = "Your TEMPLATE_DIRS setting is empty. " + \
            "Change it to point to at least one template directory."
    raise TemplateDoesNotExist, error_msg

def load_template_source(template_name, template_dirs=None):
    """Assuming the current language is German.
    If template_name is index.LANG.html, try index.de.html then index.html
    """
    if ".LANG." in template_name:
        lang = translation.get_language()
        try:
            t = template_name.replace(".LANG.", "." + lang + ".")
            res = _load_template_source(t, template_dirs)
            return res
        except TemplateDoesNotExist: 
            t = template_name.replace(".LANG.", ".")
            return _load_template_source(t, template_dirs)
    return _load_template_source(template_name, template_dirs)
load_template_source.is_usable = True

More like this

  1. Show template names in markup by jaywhy13 2 years, 8 months ago
  2. Language-aware template inclusion by bartTC 6 years ago
  3. Django 1.2+ template loader for Jinja2 by SimonSapin 4 years, 8 months ago
  4. Dynamic Template Loader by jgeewax 6 years, 8 months ago
  5. yandex maps templatetag by coolchevy 2 years, 9 months ago

Comments

Please login first before commenting.