【问题标题】:Yii: How to work with translate Yii::t() and hyperlinksYii:如何使用翻译 Yii::t() 和超链接
【发布时间】:2019-08-26 18:59:54
【问题描述】:

我的代码中有很多类似的行:

echo Yii::t('forms','Would you like to create a new item?');

例如,我想在“创建新项目”周围进行超链接。

以下是我考虑过的一些替代方案:

  1. 将 URL 拆分为 2 个翻译后的字符串,由超链接包围:

    echo Yii::t('forms','Would you like to').' <a href="/new_item">'.Yii::t('forms','create a new item').'</a>?';
    
  2. 使用占位符,如 Yii 文档中所述(http://www.yiiframework.com/doc/guide/1.1/en/topics.i18n 虽然没有给出明确的示例超链接):

    echo Yii::t('forms','Would you like to {url}create a new item',array('{url}'=>"<a href='/new_item'>")).'</a>?';
    

可能有更简单的方法可以做到这一点,但我一直无法找到首选方法...构建包含 URL 的翻译字符串的最佳方法是什么?

【问题讨论】:

    标签: yii


    【解决方案1】:

    我向你推荐这个解决方案:

    echo Yii::t(
        'forms', 
        'Would you like to {link:create}create a new item{/link}?',
        array(
            '{link:create}'=>'<a href="/new_item">',
            '{/link}'=>'</a>',
        )
    );
    

    好处是如果你想把idclassonclick 和更多的东西放在a 标签中,你可以做到。所以翻译字符串是清晰的。
    注意{link:create}中的create只是一个理想的指向超链接字符串的字符串。

    另一个高级示例:

    echo Yii::t(
        'forms', 
        'Would you like to {link:create}create a new item{/link}? And you can {link:delete}delete the item{/link}.',
        array(
            '{link:create}'=>'<a href="/new_item" class="button">',
            '{link:delete}'=>'<a href="#" id="item-21" onclick="delete(21);">',
            '{/link}'=>'</a>',
        )
    );
    

    【讨论】:

      【解决方案2】:

      链接可能有不同的位置(开头、中间或结尾)和翻译字符串中的标签,具体取决于目标语言。因此,您应该只对 url 使用占位符:

      echo Yii::t(
        'forms', 
        'Would you like to <a href="{url}">create a new item</a>?', 
        array('{url}' => '/new_item')
      );
      

      【讨论】:

      • 那么,我的翻译数组中的字符串是否会是:'Would you like to create a new item?'换句话说,&lt;a href=""&gt;&lt;/a&gt; 是否都会被 Yii:t() 函数剥离?
      • @ews2001 不,它们不会被剥离。您还必须在翻译中包含&lt;a href=... 部分
      • 例如“你想创建一个新项目吗?' => 'هل تريد أن تنشئ نوع جديد ?'。提示:我发现通过检查 yii 框架核心翻译消息文件来学习类似的翻译技巧非常有用。
      • @Nimir 是的,完全正确。不同的语言可能对链接的位置和文本有非常不同的需求,因此这是实现极大灵活性的唯一方法
      • array('{url}' => '/new_item') 必须是 array('url' => '/new_item')
      【解决方案3】:

      如果您有动态 uri,请使用以下内容:

      echo Yii::t(
          'forms',
          'Would you like to <a href=":url">create a new item?</a>',
          array(':url'=>'/new_item')
      );
      

      或者:

      echo Yii::t(
          'forms',
          'Would you like to <a href="/new_item">create a new item?</a>',
      );
      

      或者如果你想传递除了url之外的其他动态属性,使用如下:

      echo Yii::t(
          'forms',
          'Would you like to <a :linkAttr>create a new item?</a>',
          array('linkAttr'=>'href="/new_item" id="link-id" class="link-class"')
      );
      

      【讨论】:

      • 我没有建议,因为你不能将idclassonclick 特定于一个主题放入a 标记中。我建议你使用这个解决方案:stackoverflow.com/a/22379436/1407491
      • 好吧,如果你只关心 url,你可能会选择我的解决方案,但如果你想传递其他属性,比你提到的更简单的方法是:echo Yii::t('forms', 'Would you like to &lt;a :linkAttr&gt;create a new item?&lt;/a&gt;', array('linkAttr'=&gt;'href="/new_item" id="link-id" class="link-class"'));
      【解决方案4】:

      我认为这是一个更好的解决方案:

      echo Yii::t(
          'forms',
          'Would you like to {action}?'
          [
              'action' => Html::a(
                  Yii::t('forms', 'create a new item'),
                  ['controller/action']
              )
          ]
      );
      

      此解决方案的好处

      • 您可以使用帮助程序来生成您的链接
      • 您可以在不修改翻译的情况下修改您的 html 代码
      • 做翻译的人不需要知道任何关于 html 的知识,也不会弄乱 html 代码。

      【讨论】:

      • 这种方法也有缺点 - 将一个短语分成两个单独的翻译字符串会使翻译变得更加困难。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多