Pull to refresh

Comments 12

Мне кажется, что без подробного рассмотрения багов с utf8 и dbi статья очень неполная. А баги совершенно неожиданные вылезают порой.
добавил в статью информацию по базам данных
чтобы не заморачиваться с кодировками, проще из настроек View::HTML кодировку убрать, чтобы шаблоны были as is (см. Template::Provider.pm#ENCODING)
и настроить
    'Plugin::I18N' => {
        maketext_options => {
            Decode => 0,
            Encoding => 'UTF-8',
        }
    }

и как вариант, в качестве файла локализации использовать .pm файл, например
package MyApp::I18N::ru;
use utf8;
use base 'MyApp::I18N';
our %Lexicon = (
    site_title => 'название сайта',
    ....
);
1


соответсвенно сделать чтобы коннект с базой тоже был в unicode (sqlite_unicode|mysql_enable_utf8 => 1 в connect_info и т.п. в зависимости от драйвера DBI)

для склонения числительных удобно использовать Lingua::RU::Numeric::Declension,
для разных падежных форм: Lingua::RU::Inflect

вывод локализованных дат, например:
DateTime->now->set(locale => $c->language)->strftime("%e %B")


p.s. TT конечно классика, но советую посмотреть Text::Xslate или даже Template::Semantic (для полной абстракции html-шаблонов от кода)
Я достаточно поздно узнал о параметре mysql_enable_utf8, аналогично для pg. Указывается в конфиге Model::DB в разделе connect_info как положительный. Это и есть пилюля от багов и глюков с utf8 после которой не требуется никаких костылей. Это действительно стоило включить в статью.
Функцию enc() я привел как пример, т.к. dbi ещё много чего поддерживает. Тем более enc() полезна, если например вложить список поддерживаемых языков в конфиг проекта для организации выбора языка пользователем аля wikipedia, но это тема для другой статьи.
UFO just landed and posted this here
все три оставшихся разработчика уже включают по умолчанию =)
Один из них (pg) уже даже готов этот параметр объявить deprecated. Для MySQL mysql_enable_utf8 экспериментальный, так что лучше не стоит делать что-то дефолтом, если не было раньше.
имхо лучше сразу разобраться с кодировкой данных через конфиги компонентов и использование прагмы «use utf8» (если юникод строки встречается прямо в коде контроллеров и т.п.)
так, чтобы всё было прозрачно и без использования в проекте костылей вроде предлагаемого «enс»
Беда начинается когда приходится взаимодействовать с внешними программами, типа баз данных или web сервисов. Корень зла — наличие перловых строк и юникодных строк, в разных версиях ещё и по разному обрабатывающихся.
Взаимодействие с внешними источниками оформляется как модель в которой всё и должно приводится к общему виду в зависимости от специфики внешних источников. В частности, для реляционных БД это уже сделано в виде флагов в конфиге драйверов DBI, хотя может быть достаточно $dbh->do(«set names utf8») для pg/mysql и правильной настройки самой БД. Для других случаев — Encode, perluniintro
в общем чаще всего корень зла — незнание )
Подскажите, пожалуйста, а что делается, если нужно локализовать большой объем текста?
хранить текст в разных вариантах языка в бд или файлах
Sign up to leave a comment.

Articles