i18n Django国际化和数据库对象

dol*_*a33 5 django django-models internationalization

我正在从事双语项目(es/en); 对于这个项目,我选择使用django的i18n国际化系统(我开始后悔......)

今天的问题如下:
对于某些模型,我的数据库存储信息,如descriptiones_description,或english_common_namespanish_common_name (这些是我的对象的属性,并且在许多情况下使用,不仅用于页面翻译问题).

样本模型可以定义为:

def MyModel(models.Model):
    name = ...
    type = ...
    authors = ...
    contributors = ...
    ...
    ...
    description = models.TextField(max_length = 800, blank=True)
    es_description = models.TextField(max_length = 800, blank=True)
    ...
    english_common_name = models.CharField('name', max_length=80, unique=True)
    spanish_common_name = models.CharField('nombre', max_length=80, unique=True)
    ...
Run Code Online (Sandbox Code Playgroud)




假设我想根据lang用户选择的语言在模板中检索此信息.

例如,在我的模板的某个地方,我可以有类似的东西

<h1>{{name}}</h1>
<h3>{{english_common_name}}</h3>
<p>{{description}}</p>
<p>{% trans "Contributors" %}: {{contributors}}</p>
Run Code Online (Sandbox Code Playgroud)

我怎么能叫{{spanish_common_name}}代替{{english_common_name}}{{es_description}}代替{{description}}如果页面语言设置为'es'


我绝对拒绝做类似的事情

<p>{% ifequal lang 'es' %}{{descrpition}}{% else %}{{es_description}}{% endifequal %}</p>
Run Code Online (Sandbox Code Playgroud)


如果我尝试在视图中管理它...我不想定义这样的get_translated_content函数

def get_translated_content(en_content,es_content,lang):
    if lang is 'es':
        return es_content
    else:
        return en_content

...
# MyView
...
    return render_to_response(...,
                              {'object': my_object,
                               'object_common_name': get_translated_content(english_common_name, spanish_common_name, lang),
                               'object_description': get_translated_content(description, es_description, lang), 
                                ... ,})
Run Code Online (Sandbox Code Playgroud)

在简单的情况下,这可能会起作用(仍然是一个可怕的解决方案),但在更复杂的情况下,我将被迫返回字典,这些字典是原始MyModel对象的本地化副本(如果在视图中我必须使用大量不同的实例相同的模型,我将被迫生成这些词典的biiiig列表).



请告诉我,有一种很好的逻辑方法可以根据页面的语言访问db对象字段!



编辑:在阅读到目前为止收到的答案后,我想我应该在我的问题中添加一个" 保留数据库结构(几乎)不变 "的条款.

Nat*_*han 5

你真的应该使用django-multilingual之类的东西(如果你使用的是Django 1.2,请参阅Django 1.2兼容分支).

为您的示例(基于文档)

from django.db import models
from django.utils.translation import ugettext_lazy as _
from multilingual.translation import TranslationModel

class MyModel(models.Model):
    name = ...
    type = ...
    authors = ...
    contributors = ...
    ...
    ...
    class Translation(TranslationModel):
        description = models.TextField(max_length = 800, blank=True)
        ...
        common_name = models.CharField(_(u'name'), max_length=80, unique=True)
        ...
Run Code Online (Sandbox Code Playgroud)

访问可翻译的字段

my_model = MyModel.objects.get(id=1)
my_model.description # the description in the current language
my_model.common_name # the common name in the current language
my_model.name # the name
Run Code Online (Sandbox Code Playgroud)

当前的语言与django检测它的方式相同.