dol*_*a33 5 django django-models internationalization
我正在从事双语项目(es/en); 对于这个项目,我选择使用django的i18n国际化系统(我开始后悔......)
今天的问题如下:
对于某些模型,我的数据库存储信息,如description和es_description,或english_common_name和spanish_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对象字段!
编辑:在阅读到目前为止收到的答案后,我想我应该在我的问题中添加一个" 保留数据库结构(几乎)不变 "的条款.
你真的应该使用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检测它的方式相同.
| 归档时间: |
|
| 查看次数: |
3846 次 |
| 最近记录: |