Django,如何在多语言网站中创建后备语言? [英] Django, how to create a fallback language in a multilingual website?

查看:89
本文介绍了Django,如何在多语言网站中创建后备语言?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为多语言网站构建数据库模型。这是 models.py

I am trying to build a database model for a multilingual website. This is 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

当我想用英语检索地区时,请执行以下操作:

When I want to retrieve regions in english I do this:

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)

不过,我想用英语作为一种后备语言。因此,如果数据库中没有针对某种语言的某个区域的数据,那么我的程序应该能够选择英语文字。

However, I would like to have english as a "fallback" language. So, in case there is no data in the database for a certain region for a certain language then my program should be able to pick literals in English.

我想要这样,因为大多数情况下,所有基于拉丁语的语言(尤其是地区)中的文字都是相同的。因此,我将数据输入量降至最低。

I want it like this because most of the times literals are the same in all latin-based languages (especially regions). So I reduce data entry to the minimum.

有可能吗?怎么样?

推荐答案

您可以后备语言并获得第一。

You can chain fallback language and get first.

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 ) )

这篇关于Django,如何在多语言网站中创建后备语言?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆