【问题标题】:Dynamic content with PHP & Smarty使用 PHP 和 Smarty 的动态内容
【发布时间】:2012-12-25 09:11:17
【问题描述】:

我正在使用 Smarty 并利用 config_load 各自的 {#VAR#} 变量来实现本地化。只要内容在模板中,它就可以很好地工作,但是一旦我必须在 TPL 文件中添加动态内容,即使用:

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

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

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


解决方案

我最终只将上面代码中的 {$line}&lt;br&gt; 替换为:

{eval var=$line}

这对我有用。

【问题讨论】:

    标签: php localization smarty


    【解决方案1】:

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

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

    让我们说

    你的目标

    {"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);
    
    }
    

    【讨论】:

    【解决方案2】:

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

    希望对您有所帮助! :)

    【讨论】:

      【解决方案3】:

      您可能已经注意到 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}
      

      【讨论】:

      • Tkx霸主!您对性能提出了很好的看法。我正在使用此动态输出向用户显示适当的错误消息。您上面描述的解决方案需要为每个 $var 内容提供一个模板文件 - 没有更优雅的解决方案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2012-04-06
      相关资源
      最近更新 更多