Заигрался с 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, то в дистрибутиве можно найти утилитыbin/make-messages.py – дабы не создавать всю эту иерархию директорий и файлов, можно запустить данную утилиту (внимание, для успешного запуска её нужно хапускать из родительской дирректории проекта < projectname >, или директории приложения < appname >). Например, для создания «ru» локали необходимо выполнить след. комманду
make-messages.py -l ru
после выполнения будут созданы необходимые директории и пустой файл django.po
bin/compile-messages.py – компилирует django.po, в результате чего получаем django.mo
В качестве замечания отмечу, что для той-же стандартной админки необходимо чтобы имелся словарь (< LANGUAGE_CODE > которого указан в настройках вашего проекта) с соответсвующим наполнением. Иначе говоря, если в ловаре не будет переводов для админки – админка работать не будет. Как вариант разрешения этой проблемы – писать свой словарь в продолжении дефолтного словаря из дистрибутива фреймворка.
Теперь немного об инструментарии, с помощью которого можно немного упростить себе жизнь.
Eclipse-плагин для редактирования .po файлов
GTEd
URL для установки: http://gted.sourceforge.net/update
утилита 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 ""
можно тоже взять за основу.
Вот в принципе и все, что я хотел сказать по данному поводу :)