Django, как создать резервный язык на многоязычном веб-сайте?

Вопрос:

Я пытаюсь создать модель базы данных для многоязычного веб-сайта. Это models.py:

class Language(models.Model):
name = models.CharField(max_length=2)

def __unicode__(self):
return self.name

class TranslationText(models.Model):
content = models.TextField()
language = models.ForeignKey(Language)
remark = models.CharField(max_length=40, blank=True, default='')

def __unicode__(self):
return '('+self.language.name+' : ' + self.remark + ') ' + self.content[:30]

class i18nText(models.Model):
translation = models.ManyToManyField(TranslationText, related_name='i18n_txt')
remark = models.CharField(max_length=40, blank=True, default='')

def __unicode__(self):
return self.remark

class Region(models.Model):
name = models.ForeignKey(i18nText, related_name='region_name')
remark = models.CharField(max_length=32, default='', blank=False)

def __unicode__(self):
return self.remark

Когда я хочу получать регионы на английском языке, я делаю это:

regs = TranslationText.objects.filter(language__name='en').exclude(i18n_txt__region_name=None).values_list('content', flat=True)

То же самое, если я хочу получить на немецком языке:

regs = TranslationText.objects.filter(language__name='de').exclude(i18n_txt__region_name=None).values_list('content', flat=True)

Тем не менее, я хотел бы иметь английский как “резервный” язык. Итак, если в базе данных нет данных для определенного региона для определенного языка, тогда моя программа должна иметь возможность выбирать литералы на английском языке.

Я хочу, чтобы это было так, потому что в большинстве случаев литералы одинаковы во всех латинских языках (особенно в регионах). Поэтому я сокращаю ввод данных до минимума.

Возможно ли это вообще? Как?

Лучший ответ:

Вы можете цепи базового языка и получить первый.

from itertools import chain

def myTrans(content, language_name):

    regs_lang = ( TranslationText
        .objects
        .filter(language__name=language_name, content = content)
        .exclude(i18n_txt__region_name=None)
        .values_list('content', flat=True) )

    regs_en = ( TranslationText
        .objects
        .filter(language__name='en', content = content)
        .exclude(i18n_txt__region_name=None)
        .values_list('content', flat=True) )

    return next( chain( regs_lang, regs_en ) )

Оцените статью
TechArks.Ru
Добавить комментарий