Добавление возможности перевода строк в JavaScript порождает ряд проблем:
Код на JavaScript не имеет доступа к реализации gettext.
Код на JavaScript не имеет доступа к .po или .mo файлам. Они должны быть предоставлены сервером.
Каталоги с переводами для JavaScript должны быть малы насколько это возможно.
Django предоставляет интегрированное решения для этих проблем. Оно передаёт переводы в JavaScript, таким образом вы можете использовать gettext в JavaScript.
Основным решением для этих проблем является представление
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 аналогично предыдущим примерам.
| Пред. | Уровень выше | След. |
| Использование переводов в ваших проектах | Начало | Замечание для тех, кто уже работал с gettext |
0 комментариев | Оставьте комментарий