如何检查Twig/Symfony2中是否存在翻译项?

gre*_*emo 7 symfony twig

这是我打印侧边栏项目的宏.每个titleatttribute都是在构建中查找'tip.' ~ route项目messages.it.yml.

即使trans项不存在, Twig也总是返回传递给transfilter 的字符串.例如:

tip:
    dashboard: Dashboard
Run Code Online (Sandbox Code Playgroud)

模板:

{% _self.sideitem('dashboard', 'home') %} // <a title="Dashboard">...
{% _self.sideitem('fail', 'home') %}      // <a title="tip.fail">...

{% macro sideitem(route, icon) %}
    {% set active = (route == app.request.get('_route')) %}
    {% set icon = icon ? 'icon-' ~ icon ~ (active ? ' icon-white' : '') : '' %}

    <li class="{{ active ? 'active' : '' }}">
        <a href="{{ path(route) }}" title="{{ ('tip.' ~ route)|trans }}">
            <i class="{{ icon }}"></i> {{ ('nav.' ~ route)|trans }}
        </a>
    </li>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

如何在实际打印之前检查转换项是否存在?

编辑:一个残酷的解决方法可能是(代码未测试):

<li class="{{ active ? 'active' : '' }}">
    {% set look    = ('tip.' ~ route) %}
    {% set foreign = look|trans %}
    {% set has     = not(look == foreign) %}

    <a href="{{ path(route) }}" {{ not has ? '' : 'title="' ~ foreign ~ '"'  }} >
        <i class="{{ icon }}"></i> {{ ('nav.' ~ route)|trans }}
    </a>
 </li>
Run Code Online (Sandbox Code Playgroud)

小智 9

我想出的解决方案就是这个:

{% if "#{var}.something"|trans != "#{var}.something" %}
Run Code Online (Sandbox Code Playgroud)

这只是检查翻译密钥的结果是否与翻译密钥本身不同.如果某个键没有翻译,则"trans"过滤器将返回翻译键.

  • 这仅在使用键而不是默认参考语言时才是正确的。 (2认同)

小智 5

您可以使用 twig 扩展名来确认翻译是否存在。

$locale = $translator->getLocale();
$catalogue = $translator->getCatalogue($locale);
$id = 'bank_transaction_history.transfer.' . $resultCode;
if ($catalogue->defines($id)) {
    return $translator->trans($id);
}
Run Code Online (Sandbox Code Playgroud)

  • +1 这可能比此处列出的其他方法更好,因为这不会触发探查器的翻译错误。请注意,您不需要“$locale = $translator-&gt;getLocale();”行。`getCatalog()` 方法的参数可以保持为空,在这种情况下该方法使用实例的区域设置... (2认同)

Max*_*cki -1

尝试分配字符串“nav”。~ 路由到变量,然后翻译变量。