Макет приложения Django: Интернационализация - PullRequest
1 голос
/ 08 августа 2011

Каков наилучший способ хранения языковых констант в проекте django?

Например, мы знаем, что для перевода нам нужно сделать:

from django.utils.translation import gettext_lazy as _

class MyThing(models.Model):
    name = models.CharField(help_text=_('This is the help text'))

Если у нас много вариантов, мы можем использовать словарь так:

from django.utils.translation import gettext_lazy as _
MYTRANSLATION = { 
    'term1':_('term1'), 
    'term2':_('term2'),
    ...
}

Итак, мой вопрос: где хранить словарь с языковыми константами ... Прямо в представлении, в модели, в отдельном файле в папке приложения, в корневой папке проекта и т. Д. ... Как лучше всего? А где вы храните свои языковые консистенции?

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Я думаю, это действительно зависит.Если у вас есть большой общедоступный сайт, который вы хотите перевести на N языков, то они не постоянны и потребуют обновлений от выделенных переводчиков при каждом изменении содержимого.Для такого проекта, gettext совершенно не подходит, потому что gettext трудно использовать нетехническим лицам.Сайт также потребует перекомпиляции и повторного развертывания, чтобы обновить переводы, которые являются основными нарушителями, если содержание часто меняется.gettext работает для настольных приложений (вроде как, для переводчиков он все еще важен), но не для веб-сайтов.

Вместо этого используйте https://github.com/ojii/django-nani. Создайте таблицу для хранения всех переводимых строк вВаши шаблоны:

class I18NString(TranslatableModel):
    key = models.SlugField(unique = True)
    translations = TranslatedFields(
        text = models.TextField(),
    )

Для каждого необходимого фрагмента текста добавьте его в виде строки в I18NString.Например, вы можете добавить строку с ключом «short-введение-text» и добавить туда английские и немецкие версии вводных текстов.

Затем для каждой загрузки страницы загрузите все переводы для текущего языка.:

# For performance, memcached should be used.   
strings = I18NString.objects.language(request.COUNTRY_CODE).all()
trans = dict((s.key, s.text) for s in strings)

Передать словарь транс в шаблон и отобразить переведенные строки:

{{ trans.short-introduction-text }}
0 голосов
/ 08 августа 2011

Где строки на самом деле используются. Не делайте отдельного комментария, содержащего переводы - это уродливо, разрушает контекст (xgettext не сможет указывать на файлы, в которых используются строки) и в основном дублирует функциональность механизма i18n без причины.

# yes:
def view(request):
    return HttpResponse(_(u'something something'))

# no:
translations = { 'something something': _(u'something something') }
def view(request):
    return HttpResponse(translations['something something'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...