Как локализовать веб-приложения на TurboGears

💡 Усі статті, обговорення, новини про Python — в одному місці. Приєднуйтесь до 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-шаблонов, но он неидеален.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn



1 коментар

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

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

Підписатись на коментарі