• Авторизация


Немного о интернационализации проектов Django 23-06-2008 15:21 к комментариям - к полной версии - понравилось!


Заигрался с Django, и задумался о написание небольшого проектика, а именно  легковесного блог-движка. Буквально с описания первой модели, в голове  пролетела, вероятно, эфемерная идея о возможности интернационализации данного проекта. Ненадолго погрузился в документацию по Django и нашел немного  полезной (жальчто не исчерпывающей) информации.
Оказывается, разработчики уже давно позаботились об этом, и, как положено, сделали всё за нас – Джанго имеет всё необходимое! Описание можно найти тут
Описывать что есть gettext не буду. Опишу лишь как с этим работать в Джанго на простейших примерах.
На подготовительном этапе необходимо убедится что в настройках проекта  (settings.py) стоит необходимый LANGUAGE_CODE (для данного примера это "ru-RU") и установлено USE_I18N = True

< projectname >/< appname >/models.py:

from django.db import models

from django.utils.translation import gettext as _

class Post(models.Model):

    title = models.CharField(_("title"))
    decsription =models.TextField(_("description"),null=True)
    content =models.TextField(_("content"),null=True)

Достаточно типичный пример :). В данном примере необходимо обратить внимание лишь на

from django.utils.translation import gettext as _
и конструкции, типа
_("title")

Первое – подключение функции gettext, второе – её использование. Теперь,
по идее, при добавлении/редактировании Post через админку Django, поля title, description, content должны быть озаглавлены по русски – лишь в том случае, если в словаре имеются соответствующие записи.


Где найти словарь? Как добавить в него записи?


По умолчанию, словарь можно найти в директории conf/locale/ru/LC_MESSAGES/ установленного Django. Там находится всего два файла: django.po и django.mo

django.po – текстовый файл. Для интереса посмотрите его содержание, думаю будет все понятно.
django.mo – компилированный django.po (тот самый файл, с которым работает сам  gettext). При редактировании содержимого словаря, чтобы изменения вступили в силу,необходимо будет его заново компилировать.
Также существует альтернативный вариант расположения словаря (данный вариант более удобен):
< projectname >/locale/< LANGUAGE_CODE >/LC_MESSAGES
или
< projectname >/< appname >/locale/< LANGUAGE_CODE >/LC_MESSAGES
с аналогичным содержанием
Если вы скачивали Django из svn, то в дистрибутиве можно найти утилиты
  1. bin/make-messages.py – дабы не создавать всю эту иерархию директорий и файлов, можно запустить данную утилиту (внимание, для успешного запуска её нужно хапускать из родительской дирректории проекта < projectname >, или директории приложения < appname >). Например, для создания «ru» локали необходимо выполнить след. комманду
    make-messages.py -l ru
    после выполнения будут созданы необходимые директории и пустой файл django.po

  2. bin/compile-messages.py – компилирует django.po, в результате чего получаем django.mo

В качестве замечания отмечу, что для той-же стандартной админки необходимо чтобы имелся словарь (< LANGUAGE_CODE > которого указан в настройках вашего проекта) с соответсвующим наполнением. Иначе говоря, если в ловаре не будет переводов для админки – админка работать не будет. Как вариант разрешения этой проблемы – писать свой словарь в продолжении дефолтного словаря из дистрибутива фреймворка.
Теперь немного об инструментарии, с помощью которого можно немного упростить себе жизнь.

  1. Eclipse-плагин для редактирования .po файлов
    GTEd
    URL для установки: http://gted.sourceforge.net/update

  2. утилита xgettext
    На основе исходного файла генерирует шаблон для переводчика. Например, при выполнении (для примера, представленного выше)
    xgettext models.py –output=django.po
    мы получим:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR < EMAIL@ADDRESS >, YEAR.
#
#, fuzzy
msgid ""
msgstr ""

"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-06-23 16:17+0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME < EMAIL@ADDRESS >\n"
"Language-Team: LANGUAGE < LL@li.org >\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: test.py:6
msgid "title"
msgstr ""

#: test.py:7
msgid "description"
msgstr ""

#: test.py:8
msgid "content"
msgstr ""

можно тоже взять за основу.

Вот в принципе и все, что я хотел сказать по данному поводу :)

Сообщение добавлено через MovableType API

вверх^ к полной версии понравилось! в evernote
Комментарии (5):
09-06-2009-18:12 удалить
Спасибо за инфу.
Вообще-то в документации поджанге 1.0 пишут, чтос моделями лучше использовать ugettext_lazy вместо gettext http://docs.djangoproject.com/en/dev/topics/i18n/#lazy-translation
28-08-2009-06:01 удалить
здесь Лик Стража Смерти
слабонервным делать нечего
в глаза не смотреть !
Сильнейший гипноз
30-09-2009-00:05 удалить
И чего? Джанго зато не умеет локализацию через админку менять.. а это такой базовый функционал, что им стыдно должно быть
01-10-2009-17:50 удалить
здесь Лик Стража Смерти
слабонервным делать нечего
в глаза не смотреть !
Сильнейший гипноз
04-10-2009-06:33 удалить
здесь Лик Стража Смерти
слабонервным делать нечего
в глаза не смотреть !
Сильнейший гипноз


Комментарии (5): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Немного о интернационализации проектов Django | frac - My notepad ... | Лента друзей frac / Полная версия Добавить в друзья Страницы: раньше»