Динамический контент с PHP и Smarty - PullRequest
1 голос
/ 25 мая 2009

Я использую Smarty и использую соответствующие переменные {#VAR#} config_load для реализации локализации. Это прекрасно работает, пока содержимое находится в шаблонах, но не удается, как только мне нужно добавить динамический контент в файл TPL, то есть с:

{if isset($var) }
    {foreach from=$var item=line}
        {$line}<br>
    {/foreach}
{/if}

Обратите внимание, что каждая запись в $ var обычно содержит одну запись {#VAR#} - они не переведены (пользователь увидит {#VAR#}).

Как правильно реализовать локализацию в этом случае?


Решение

В итоге я заменил {$line}<br> в приведенном выше коде на:

{eval var=$line}

Это помогло мне.

Ответы [ 3 ]

2 голосов
/ 09 июля 2009

замечательным подходом, который я видел, было использование модификаторов для переводов. это позволяет переводить динамический контент.

весь код - это просто пример, не будет работать, просто чтобы дать вам идею

допустим,

твой тпл

{"Hello word! How are you %s?"|translate:"Gabriel"}


{$myvar|translate:"Gabriel"}

ваш модификатор

function smarty_modifier_translate($content, $args) {
  $lang = Env::getLanguage();
  return vsprintf($lang->getTranslation($content), $args);

}
1 голос
/ 26 мая 2009

Вы, наверное, ищете что-то вроде {eval}

Взгляните на {eval} документацию.

В вашей ситуации вы можете попробовать это:

example.php

<?php
  (...)
  $var = array("{#OK#}", "{#CANCEL#}");
  $smarty->assign('var', $var);
  $smarty->display('example.tpl');
?>

example.config

OK = Okay
CANCEL = Nevermind

example.tpl

{config_load file='example.config'}

<h1>Template stuff</h1>

{if isset($var) }
  {foreach from=$var item=line}
    {eval var=$line}<br>
  {/foreach}
{/if}

Надеюсь, это поможет! :)

0 голосов
/ 27 мая 2009

Как вы, наверное, заметили, smarty анализирует ваш шаблон в php-коде и сохраняет его в каталоге templates_c. Это делает эту библиотеку очень быстрой. То, что вы собираетесь выполнить, потребует разбора полностью нового шаблона каждый раз при выполнении зацикленного кода. Это сделает ваше приложение очень медленным.

Я бы предложил не хранить сообщения в константах, а хранить их в шаблонах, например.

{assign var='lang' value='en'}
{if isset($var) }
    {foreach from=$var item=line}
        {include file="$lang/$line.tpl"}<br>
    {/foreach}
{/if}
...