Я работаю в двуязычном проекте (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)
...
Допустим, я хочу получить эту информацию в моем шаблоне в соответствии с lang
, язык, выбранный пользователем.
Например, в каком-то месте моего шаблона у меня может быть что-то вроде
<h1>{{name}}</h1>
<h3>{{english_common_name}}</h3>
<p>{{description}}</p>
<p>{% trans "Contributors" %}: {{contributors}}</p>
Как я могу позвонить {{spanish_common_name}}
вместо {{english_common_name}}
или {{es_description}}
вместо {{description}}
, если для языка страницы установлено значение 'es'
?
Я абсолютно отказываюсь делать что-то вроде
<p>{% ifequal lang 'es' %}{{descrpition}}{% else %}{{es_description}}{% endifequal %}</p>
И если я попытаюсь управлять этим в представлениях ... Я не хочу определять 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),
... ,})
Это может работать (все еще ужасное решение) в простых ситуациях, но в более сложных случаях я был бы вынужден возвращать словари, которые являются локализованными копиями исходного MyModel
объекта (и если в представлении мне приходится использовать множество различных экземпляровта же модель, я был бы вынужден сгенерировать biiiig список этих словарей).
Пожалуйста, скажите мне, что есть хороший, логичный способ доступа к объектным полям БД в соответствии с языком страницы, пожалуйста!
Редактировать: после прочтения полученных ответов, я думаю, что я должен добавить к своему вопросу ", оставив структуру базы данных (почти) без изменений ".