Как локализовать веб-приложения на TurboGears
Макс ИщенкоОпубликовано 6.04.2006 в Python, Статьи, Учеба
Это обзорный пост, пытающийся охватить (вкратце) все элементы веб-приложения.
Как я уже писал, главное правило разработки в контексте локализованных приложений: сквозное использование Unicode внутри программы и перекодировка для общения с внешним миром.
Хранение данных в SQLObject
Хранением данных в TurboGears обычно занимается SQLObject. Эта библиотека имеет специальный тип UnicodeCol, который обеспечивает прозрачное кодирование/декодирование юникод-данных из Python в базу данных и назад.
К сожалению, такое автоматическое кодирование поддерживается только в конструкторе и при прямом доступе к атрибутам. Если необходимо, скажем, создать SQL WHERE, в котором используется наш UnicodeCol, придется “ручками” кодировать юникод-строку в кодировку БД (например, utf-8).
Вообще, SQLObject имеет и другие, более системные проблемы. В последние время часть пользователей TurboGears мигрирует на SQLAlchemy, как (во многом) более прогрессивную технологию. Поживем - увидим.
Представление в Kid-шаблонах
Для создания динамических веб-страниц по умолчанию используется Kid, который требует чтобы все входные параметры-строки были юникодными. На выходе тоже получается юникод, но TurboGears автоматически кодирует его, используя параметр конфигурации kid.encoding (по умолчанию это опять же utf-8) и проставляя правильный Content-Type. Таким образом, броузер получает поток utf-8 с правильным заголовком.
Единственное, на что стоит обратить внимание: кодировка исходного файла-шаблона (.kid). Как для любого XML-файла кодировка задается в заголовке - проследите чтобы содержимое ему соответствовало. В противному случае Kid “радует” очень странным сообщением об ошибке.
Программирование веб-форм
Наверное, ни одно веб-приложение не обходится без динамической составляющей: разбор данных из веб-форм/запроса, заполнение веб-форм для (повторного) показа, валидация данных.
Здесь тоже сделано по максимуму: все входные параметры автоматически преобразуются в юникод, так что даже делать ничего не нужно. Если для заполнения форм вы используете Kid, то эти юникодные строки будут корректно вставлены в шаблон. Если такое автоматическое преобразование отключить, тогда для каждого строкового входного параметра стоит использовать валидатор UnicodeString из turbogears.validators.
Локализация
За локализации представления валюты, форматов дат и календаря отвечает отдельный модуль turbogears.i18n.format. Фактически, это интерфейс к встроенной базе данных, которая хранит всю необходимую информацию по всем доступным локалям (я насчитал их аж 221).
Перевод интерфейса
Механизм используется типичный для OSS-мира, gettext: все строки, подлежащие локализации оформляются в _(”таком вот виде”). При помощи специальной программы (консольной tg-admin i18n или веб-модуля CatWalk) все такие строки собираются в .pot-файл из которого автоматически создаются (и обновляются) файлы перевода.
Есть отдельный механизм для локализации содержимого Kid-шаблонов, но он неидеален.
Python, SQLObject, TurboGears, локализация
Понравилась статья? Подпишись на обновления по RSS/E-mail


Если бы все было так просто, то это был бы рай.
Вот мой опыт разработки:
При попытках установить куку с unicode-симовлами - все приложение уходило в ступор.
После долгих дней споров в рассылках оказалось, что моя версия Python (Slackware 10.2), собрана очень дивным образом и такая вещь как setdefaultencoding() - отсутствует напрочь.
Помог вандализм: но после него у меня перестали вылетать и Zope и все остальное “барахло”
в site.py
установил кодировку по умалочанию UTF-8 - и после этого счастье.
Такое решение может вызвать бурю возмущения, но когда пишешь проэкты для своего же хостинга, то такой способ очень приемлем.