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

Sergey Juchkov juchkov на gmail.com
Вт Ноя 17 22:56:50 PST 2009


Привет,

   практически правильно. Распишу подробнее:

1. Шаблон страницы:
{{{
<b>Привет, [% system.login %]</b>
}}}

2. Статический текст тут: Привет
- расчет на то, что все что отдает код - уже  переведено как надо
(изначально и шла речь про перевод шаблонов, а не выдачи кода)

3. Меняем на переменную (названия понятно какие угодно, абы с теми что
идут из кода не пересекались):
{{{
<b>[% main.text.hello %] [% system.login %]</b>
}}}

4. Заводим где-нибудь (подпапка например или как удобно) сколько
угодно файлов с переводами - один язык - один файл:
- ru.tt
{{{
[%
main.text.hello = "Привет";
main.text.bye= "Пока";
%]
}}}
- cs.tt
{{{
[%
main.text.hello = "Ahoj";
main.text.bye= "ahoj";
%]
}}}
- en.tt
{{{
[%
main.text.hello = "Hello";
main.text.bye= "Bye";
%]
}}}

-- структура названия - пофиг, абы в ней содержался код языка, который
ты выдаешь из кода
-- генерация, перегенерация в/из .po делается 1-2 простыми до
невозможности скриптами из "основного" языкового файла  (например
основным считать будешь русский)

5. В шаблонах добавляешь в начале:
{{{
[% PROCESS "lang/${site_lang}.tt"; %]
}}}
- тут у меня подкаталог 'lang'
- site_lang переменная из кода содержащая в себе код языка (en|ru|cs)

6. профит

Тем кто... Японский, арабский и пр языки с "нестандартным для нас
стилем письма" и так и так потребуют нового шаблона. Но это вовсе не
значит что нельзя будет использовать эту же единую схему переводов.

С JS я не заморачивался, просто того, что выдается пользователю
алертами у меня не так много и я засунул это прямо в код шаблона (не
будем о том что "хорошо бы сделать отдельно"). Но тот же способ что ты
описал должен действовать и для них.

Кому не лень - померяйте сколько будет занимать по времени генерация
страницы с подстановкой переводов из .po и сколько та же самая
страница в случае тупой компиляции ТТ шаблона. Я не измерял, но мне
интересно.



2009/11/17 Иван Бессарабов <ivan на bessarabov.ru>:
> Сергей, я не очень понял твой ответ (все отдельные слова понятны, но
> далеко не все предложения ясны и плюс весь смысл я не уловил), если ты
> не потив, поуточняю.
>
> Т.е. у меня есть (сейчас) элементарный темплейт:
> {{{
> <b>Привет, [% system.login %]</b>
> }}}
>
> Дальше продолжил писать в цитировании.
>
> 16 ноября 2009 г. 12:51 пользователь Sergey Juchkov <juchkov на gmail.com> написал:
>> Весь статический текст дизайна - в переменные TT
>
> Я правильно понимаю, что в моем случае "статический текст дизайна" -
> это строка "hello"?
> Я не силен в терминологии, судя по документации
> http://template-toolkit.org/docs/manual/Variables.html "Переменная TT"
> - это та структура, которая я передаю шаблонизатору.
>
> Т.е. ты имел в виду, что я должен буду писать что-то вроде:
> {{{
> <b>[% lang.ru.hello %] [% system.login %]</b>
> }}}
>
> А в lang.ru.hello у меня будет находится "Привет,", так?
>
>> Сами перемменные определять в языковом ТТ шаблоне
>> И соответственно инклюдить нужный шаблон
>
> Слушай, как здорово. Пока писал вопросы, кажется во все разобрался, о
> чем ты говорил =)
> Т.е. ты хочешь сказать (пожалуйста меня поправь, если я тебя как-то не
> так понял), что вот эти вот переменные можно определять не в перле, а
> в других шаблонах, т.е. у меня будут вот такие 2 шаблона:
> index.tt:
> {{{
> [% PROCESS lang.ru.tt %]
> <b>[% lang.ru.hello %] [% system.login %]</b>
> }}}
>
> и lang.ru.tt:
> {{{
> [% lang.ru.hello = "Привет," %]
> }}}
>
> Класс! Очень здорово и красиво. Особенно нравится то, что не нужно
> заморачиватся с базой.
> Буду читать и размашлять, как бы получше решить мою задачу, но пока
> твое решение мне очень нравится (плюс, естсетсвенно я буду вот эти
> файлы с переводом создавать из .po gettext-а)
>
> Вот как интересно получилось, изначально не понимал твою письмо, а
> после вдумчивого прочтения и задавания вопросов, вроде бы все понял (и
> даже вроде бы все понял правильно =)
>
>> JS - теоритически так же перегенерять,
> Т.е. ты говоришь вот про то, что в html подключаю 2 js файла, вроде таких:
>
> js/lang.ru.js
> {{{
> var langRu = new Array();
> langRu['mememe'] = "мемеме";
> }}}
>
> js/script.js
> {{{
> function changeText() {
>        var element = document.getElementById("message");
>        element.innerHTML=langRu['mememe'];
> }
> }}}
>
> Правильно я тебя понял?
>
>> но идеальнее всего избавиться
>> от текстов в нем вообще
>
> Так.. А вот тут я сколько не обдумывал, все равно не понимаю. Как
> правильно избавлятся от текста в js?
>
> Сергей, спасибо за ответ, вроде потихонечку начинает вырисовыватся
> схема, как я все сделаю.
>
>>> Вообще, хотелось бы, чтобы и js и perl использовал одну и ту же базу
>>> строк (следить за одной системой всегда проще чем за нескольким), но
>>> при этом хочется, чтобы наличие этой базы не сильно усложняло систему
>>> и не сильно замедляло ее работу.
>>>
>>> Вот я и подобрался к вопросу: как вы считаете. как лучше всего решать
>>> эту задачу?
>>>
>>> PS слава богу у меня задача очень простая, у меня нет там фраз типа "у
>>> вас 18 яблок", так что мучатся с сопряжением слов с числительными мне
>>> не нужно.
>>>
>>> --
>>> bessarabov
>>> --
>>> Moscow.pm mailing list
>>> moscow-pm на pm.org | http://moscow.pm.org
>>>
>>
>>
>>
>> --
>> Sergey Juchkov
>> http://juchkov.com
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>
>
>
> --
> bessarabov
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Sergey Juchkov
http://juchkov.com


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