Login

Language aware template loader

Author:
rmt
Posted:
April 7, 2009
Language:
Python
Version:
1.0
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. csrf test by zukosdead 3 weeks, 6 days ago
  2. find even number by Rajeev529 9 months, 1 week ago
  3. Form field with fixed value by roam 10 months ago
  4. New Snippet! by Antoliny0919 10 months ago
  5. Add Toggle Switch Widget to Django Forms by OgliariNatan 1 year ago

Comments

Please login first before commenting.