PHP和&amp ;;动态内容Smarty的

时间:2009-05-25 15:34:35

标签: php localization smarty

我正在使用Smarty并利用config_load各自的{#VAR#}变量来实现本地化。只要内容在模板中,这就完美无缺,但只要我在TPL文件中添加动态内容就会失败,即:

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

请注意$ var中的每个条目通常包含一个{#VAR#}条目 - 它们未翻译(用户将看到{#VAR#})。

在这种情况下实施本地化的正确方法是什么?


的解决方案

我最后只用以下代码替换{$line}<br>

{eval var=$line}

这对我有用。

3 个答案:

答案 0 :(得分:2)

我见过的一个很好的方法就是使用修饰符进行翻译。这允许您翻译动态内容。

所有代码只是一个例子,不会工作,只是为了给你一个想法

让我们说

你的tpl

{"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 :(得分:1)

您可能正在寻找类似{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}

希望有所帮助! :)

答案 2 :(得分:0)

您可能已经注意到smarty将您的模板解析为php代码并将其存储在templates_c目录中。它使这个库运行得非常快。您将要完成的任务是每次执行循环代码时都需要解析一个完整的新模板。这会使您的应用程序变得非常慢。

我建议不要在constatnts中存储消息,而是将其存储在模板中,例如

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