[Moscow.pm] Как делать сайт на нескольких языках с template toolkit

Ruslan Zakirov ruslan.zakirov на gmail.com
Чт Ноя 19 05:49:24 PST 2009


2009/11/19 Dmitry E. Oboukhov <unera на debian.org>:
>>> но тут возникает одна небольшая
>>> трабла: не для всех форматов файлов есть экстракторы строк. то есть
>>> какой-либо XML или C запросто, а с html+TT я что-то искал искал и не
>>> нашел ничего приличного.
>
> ИБ> Я наткнулся на Locale::Maketext::Extract
> ИБ> http://search.cpan.org/~drtech/Locale-Maketext-Lexicon-0.77/lib/Locale/Maketext/Extract.pm
> ИБ> он умеет вытаскивать строки из template toolkit и из самого перла. В
> ИБ> tt он вытаскивает из tt строки, которые типа в таком формате:
> ИБ> {{{
> ИБ> [% | l(arg1,argn) %]string[% END %]
> ИБ> [% 'string' | l(arg1,argn) %]
> ИБ> [% l('string',arg1,argn) %]
> ИБ> }}}
>
> ИБ> Я поигрался, действительно вытаскивает (только пока не понятно, как
> ИБ> написать фильтр l).
> ИБ> Не эксперементировал с этим модулем?

Это клевый модуль. И это не фильтр, а функция l (маленькая буква Эль).
Простая до безобразия:

our $lang_handle = detect_language();
sub detect_language { return MyApp::I18N->get_handle() }
sub l { return $lang_handle( @_ ) }


> Я думаю что идея вытаскивать строки на автоопределении - заведомо
> порочная по своей сути.
> строки надо маркировать для перевода. потому что далеко не все строки
> нужно переводить.

Ничего порочного в ней нет, вытаскиваются только те строки, которые
нужно переводить.

Например из шаблонов вытаскивается l("string", ...), а из либ
->loc("string", ...). Еще можно маркировать хеши или константы:

my @a = qw(...); # loc_qw

my %h = (
   xxx => "yyy", # loc_pair
   xxx => "yyy", # loc_left
   xxx => "yyy", # loc_right
);

И так далее. Потом экстрактором все это дело выбирается и получаем
шаблон для перевода всего приложения.

-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm