Multilingual Models

 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
60
61
62
63
64
from django.db import models
from django.utils import translation
from django.utils.translation import gettext_lazy as _

class XFieldList(list):
    """ List for field names.
    Changes "*_" to specific field names for the current language,
    i.e.
    "sort_order" => "sort_order"
    "title_" => "title", "title_de", or "title_es"
    "__str__" => "__str__"
    """
    def __init__(self, sequence=[]):
        self.sequence = sequence
    def __iter__(self):
        return iter(self._get_list())
    def __getitem__(self, k):
        return self._get_list()[k]
    def __nonzero__(self):
        return bool(self.sequence)
    def __len__(self):
        return len(self.sequence)
    def __str__(self):
        return str(self._get_list())
    def __repr__(self):
        return repr(self._get_list())
    def _get_list(self):
        language = translation.get_language()[:2]
        result = []
        for item in self.sequence:
            if item[:1]=="-":
                order = "-"
                item = item[1:]
            else:
                order = ""
            if item[:2] == "__" or item[-1:] != "_":
                result.append(order + item)
            else:
                if language == "en":
                    result.append(order + item[:-1])
                else:
                    result.append(order + item + language)
        return result

class TranslatableContent(models.Model):
    title = models.CharField(_("Title"), maxlength=255)
    title_de = models.CharField(_("Title (DE)"), maxlength=255, blank=True)
    title_lt = models.CharField(_("Title (LT)"), maxlength=255, blank=True)
    content = models.TextField(_("Content"))
    content_de = models.TextField(_("Content (DE)"), blank=True)
    content_lt = models.TextField(_("Content (LT)"), blank=True)
    is_published = models.BooleanField(_("Published"))
    class Admin:
        list_display = XFieldList(['title_', 'content_', 'is_published'])
    class Meta:
        verbose_name = _("translatable content")
        verbose_name_plural = _("translatable content")
        ordering = XFieldList(['title_', 'is_published'])
    def __str__(self):
        return self.get_title()
    def get_title(self, language=None):
        return getattr(self, "title_%s" % (language or translation.get_language()[:2]), "") or self.title
    def get_content(self, language=None):
        return getattr(self, "content_%s" % (language or translation.get_language()[:2]), "") or self.content

More like this

  1. i18n base model for translatable content by foxbunny 4 years, 10 months ago
  2. Modeli18n by pavl 2 years, 11 months ago
  3. Ignore HTTP Accept-Language headers by fonso 6 years ago
  4. Dynamically insert or append a value to an admin option, e.g. list_display or list_filter by frankban 1 year, 8 months ago
  5. Per-site vary cache on language by fneumann 5 years, 7 months ago

Comments

Fil (on April 19, 2007):

All the lines

return getattr(self, "title_%s" % language or translation.get_language()[:2], "") or self.title

should be

return getattr(self, "title_%s" % (language or translation.get_language()[:2]), "") or self.title

Notice the missing ( and ) between the language or translation part.

#

Archatas (on May 15, 2007):

Yes, Fil, you are right!

#

(Forgotten your password?)