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

时间:2012-03-09 18:07:00

标签: symfony twig

这是我打印侧边栏项目的宏。每个title atttribute都会在'tip.' ~ route中构建messages.it.yml项目。

即使 trans项目不存在 Twig也始终返回传递给trans过滤器的字符串。例如:

tip:
    dashboard: Dashboard

模板:

{% _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 %}

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

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

<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>

4 个答案:

答案 0 :(得分:9)

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

{% if "#{var}.something"|trans != "#{var}.something" %}

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

我已经分析了您的问题,并查看了Symfony2中使用的默认转换程序。

它使用方法trans(),它实现为this

对于您来说,最好的解决方法是重新定义此方法,以便在您预期时返回false。

长话短说:

  1. 编写实现TranslatorInterface并扩展的类 翻译

  2. 重新定义方法trans()

  3. 将您的班级定义为translator服务(它将替换 与你的默认翻译)

  4. 就是这样

    我希望它有所帮助;)

答案 3 :(得分:0)

尝试分配字符串'nav'。 〜路由到变量,然后转换变量。