Хостинг Django от «Джино»
Table of contents

Переводы и JavaScript

Добавление возможности перевода строк в JavaScript порождает ряд проблем:

  • Код на JavaScript не имеет доступа к реализации gettext.

  • Код на JavaScript не имеет доступа к .po или .mo файлам. Они должны быть предоставлены сервером.

  • Каталоги с переводами для JavaScript должны быть малы насколько это возможно.

Django предоставляет интегрированное решения для этих проблем. Оно передаёт переводы в JavaScript, таким образом вы можете использовать gettext в JavaScript.

Представление javascript_catalog

Основным решением для этих проблем является представление javascript_catalog(), которое создаёт библиотеку кода JavaScript с функциями, имитирующими поведение интерфейса gettext, и с массивом переведённых строк. Эти строки получаются из приложения, проекта или ядра Django, в соответствии с тем, что вы определили в info_dict или в URL.

Вы можете использовать это так:

js_info_dict = {
    'packages': ('your.app.package',),
}

urlpatterns = patterns('',
    (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
)

Каждая строка в packages должна быть в формате, аналогичном параметру INSTALLED_APPS, и должна ссылаться на пакет, который содержит каталог locale. Если вы укажите несколько пакетов, все эти каталоги будут объединены в единый. Это полезно когда работаете с JavaScript, который использует строки из разных приложений.

Вы можете создать представление динамически, указав пакеты в схеме URL:

urlpatterns = patterns('',
    (r'^jsi18n/(?P<packages>\S+?)/$, 'django.views.i18n.javascript_catalog'),
)

Учитывая это, вы указываете пакеты в виде списка их имён, разделённых знаками + в URL. Это особенно полезно, если ваши страницы используют код из разных приложений, которые часто меняются и у вас нет желания помещать переводы в единый большой файл. С точки зрения безопасности эти значеним могут быть только в django.conf или в любом пакете указанном в параметре INSTALLED_APPS.

Использование каталога с переводами

Для использования каталога просто подключите динамически генерируемый скрипт:

<script type="text/javascript" src="/path/to/jsi18n/"></script>

Этим способом пользуется административный сайт для получения каталога с переводами от сервера. После загрузки каталога ваш JavaScript код может использовать стандартный интерфейс gettext:

document.write(gettext('this is to be translated'));

Есть даже интерфейс ngettext и функция интерполяции строк:

d = {
    count: 10
};
s = interpolate(ngettext('this is %(count)s object', 'this are %(count)s objects', d.count), d);

Функция interpolate() поддерживает как позиционную интерполяцию, так и именованную. Таким образом предыдущий код может быть переписан так:

s = interpolate(ngettext('this is %s object', 'this are %s objects', 11), [11]);

Синтаксис интерполяции позаимствован из Python. Вы не должны злоупотреблять интерполяцией, это всё ещё JavaScript, так что код будет повторять подстановки с помощью регулярного выражения. Это не так быстро как строковая интерполяция в Python, так что не используйте это лишний раз.

Создание каталога

Создание и обновление каталогов с переводами происходит аналогично другим видам каталогов. Единственное отличие в том, что следует указывать параметр -d djangojs:

make-messages.py -d djangojs -l de

Эта команда создаёт или обновляет каталог с переводами для JavaScript кода для немецкого языка. После обновления каталогов, просто выполните compile-messages.py аналогично предыдущим примерам.


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5