Многоязычность в Smarty

vitalyk

Новичок
Многоязычность в Smarty

Все кто знаком с Struts наверное знают такую штуку как например <bean:message> и соответсвующие ему файлы пропертиес разных языков

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

вопрос!

как в смарти реализовать подобное

есть ли готовое решение - что то я покапался и не нашел...
 

AmdY

Пью пиво
Команда форума
PHP:
    $smarty->register_block('tr', 'sTranslate');

    function sTranslate($params, $content, &$smarty, &$repeat) {
        if (empty($params['lang'])) {
            $params['lang'] = 'en';
        }
        return translateFoonction($content, $params['lang']);
    }
Код:
<h1>{tr lang='ru'}text  text{/tr}</h1>
 

vitalyk

Новичок
мля!!! №а в доках я это пропустил мимо глаз )) спасибо за наводку

-~{}~ 18.07.07 20:41:

Mr_Max спасибо - я думал об этом но пропертисы эти как я понял связаны с страницей а не языком а значит остаються не изменяемые и различны только у разных страницы

либо в начале страницы надо будет выбирать {config_load file="lang.conf"} в зависмости от переменной языка
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
либо в начале страницы надо будет выбирать {config_load file="lang.conf"} в зависмости от переменной языка
Это уже дело вкуса. Можно, например
для текущей страницы загружать языковой конфиг для данной страницы меняя при этом section для выбраного языка.

Вариантов много

В случае Вам решать как удобно будет.
 

AmdY

Пью пиво
Команда форума
Mr_Max, дествительно неплохой вариант, только он плохо подходит для большого количества фраз. мне нравится испоьзовать gettext для перевода и конструкции _("translate it");
 

AmdY

Пью пиво
Команда форума
почитай про gettext, а я использую зендовский класс.
 

AmdY

Пью пиво
Команда форума
не буду давать ссылки на то, что можно найти поиском в официальном мане, я веру в Человека
 

d1m

Новичок
А если в скрутке Smarty + Gettext я сделал вот такую конструкцию:

some.tpl
...
<li id="n-about"><a href={url url="/about"}>[[О нас]]</a></li>
...

Вот как натравить на такое xgettext? А именно чтоб он выхватил строки [[text to be translated]]
 

AmdY

Пью пиво
Команда форума
буферизация вывода, и регулярные preg_replace_callback.
если религия не позволяет
{tr lang='ru'}text text{/tr}
 

d1m

Новичок
Не поверите, но у меня также используется preg_replace_callback!

Вопрос был именно в том, как (пускай и на Вашу конструкцию) натравить xgettext?

Я понимаю, что можно заменять постфильтром такие фразы и заносить их в скомпилированные шаблоны как <?=_("text to be translated")?> , я пока так и сделал, но потом надо побродить по всему сайту чтоб создался кеш и уже на кеш натравливать xgettext.

И попробуйте сами изменить религию и Вы увидите, что набрать [[ значительно проще и быстрее чем {tr lang='en'} ;)
 

AmdY

Пью пиво
Команда форума
d1m, согласен, что проще, но это уже шаблонизатор в шаблонизаторе получается
а вот быстрее, это ещё вопрос.
 

d1m

Новичок
отнюдь. Вводим в смарти еще один фильтр и все. А эффект-то тот же - xgettext не скушает ни первое ни второе =(
 

AmdY

Пью пиво
Команда форума
заметь, постфильтр, т.е. прогоняется весь шаблон ещё один дополнительный раз.
не вникал, как парсится шаблон в смарти, но предпологаю, что ищется {....}, затем берётся его внутренности и выбирается нужная функция, т.е. один проход.
постфильтр ждёт пока всё остальное уже отработает и заново парсит шаблон.
если я прав, то разница существенная.
 

d1m

Новичок
Насколько я понял, сначала выполняется префильтр, потом выполняется постфильтр. Вне зависимости от желания. И файлики получаются в результате разные:

%%C4^C40^C4084457%%block.content.tpl
%%C4^C40^C4084457%%block.content.tpl.php

последний - уже откомпилированный шаблон. Выглядят примерно так внутри:

131
a:4:{s:8:"template";a:1:{s:17:"block.content.tpl";b:1;}s:9:"timestamp";i:1184864211;s:7:"expires";i:-1;s:13:"cache_serials";a:0:{}}<!-- BEGIN #block -->
and here is block's content: <i>hello, world (from block)!</i>
<!-- END #block -->


и


<?php /* Smarty version 2.6.16, created on 2007-07-19 19:56:51
compiled from block.content.tpl */ ?>
<!-- BEGIN #block -->
<?php echo _("and here is block's content:");?> <i><?php echo $this->_tpl_vars['message']; ?>
</i>
<!-- END #block -->
 

AmdY

Пью пиво
Команда форума
ты немного не прав, выполняются постфильтры, сразу один, затем другой и т.д. каждый постфильтр должен работать с уже обработаным шаблоном.
например, сразу используешь фильтр для чистки кода, а затем преобразуешь html в pdf.
 

d1m

Новичок
Понял, спасибо.

Но суть в том, как выдирать строки для gettext'а?
 

vitalyk

Новичок
Попробовал с conf файлами - более понятно и доступно и придумать сложно - так что я выбираю этот вариант - очень похож по идее на struts-bean
 
Сверху