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

11
这是我的打印侧边栏项目的宏。每个title属性都是通过在messages.it.yml中查找'tip.' ~ route项目来构建的。
即使翻译项不存在,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 %}

我该如何在打印一个trans item之前检查它是否存在?
编辑:一个暴力的解决方法可能是(代码未经过测试):
<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>

1
本地没有这样的选项。一种可能性是检查 ('nav.' ~ route)|trans 的输出是否与 ('nav.' ~ route) 相同。 - Florian Klein
4个回答

15
我想到的解决方案是这样的:
{% if "#{var}.something"|trans != "#{var}.something" %}

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


2
只有在使用键而不是默认参考语言时才是正确的。 - COil

7

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

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

2
+1 这可能比其他列在这里的方法更可取,因为它不会触发分析器的翻译错误。请注意,您不需要 $locale = $translator->getLocale(); 这一行。getCatalog() 方法的参数可以保持为空,这种情况下该方法使用实例的语言环境... - ClemC
1
还修复了“翻译存在于另一个语言环境中,因此 |trans 将默认使用该另一个语言环境”的问题。 - Alain Tiemblo

1

我已经分析了您的问题并查看了在Symfony2中使用的默认翻译器。

它使用方法trans(), 类似于this

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

长话短说:

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

  2. 在那里重新定义trans()方法

  3. 将服务定义为具有您的Class的translator(它将替换 默认的翻译器)

就是这样

希望能帮助到您;)


-1
尝试将字符串“nav.” ~ route分配给变量,然后翻译该变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接