如何在Symfony2的Twig中使用多个没有域的翻译文件?

如何在Symfony2的Twig中使用多个没有域的翻译文件?,symfony,twig,translation,Symfony,Twig,Translation,在我正在进行的Symfony2项目中,翻译是多个域文件中的文件,如 foo.en_GB.xlf bar.en_GB.xlf buz.en_GB.xlf ... foo.de_DE.xlf bar.de_DE.xlf buz.de_DE.xlf ... foo.fr_FR.xlf ... 因此,在细枝文件中,我必须定义域,例如: {% trans from 'my_domain' %}my_key{% endtrans %} 实际上我不需要这个项目中的域。所有的翻译都是一个大领域的一部分。因此

在我正在进行的Symfony2项目中,翻译是多个域文件中的文件,如

foo.en_GB.xlf
bar.en_GB.xlf
buz.en_GB.xlf
...
foo.de_DE.xlf
bar.de_DE.xlf
buz.de_DE.xlf
...
foo.fr_FR.xlf
...
因此,在细枝文件中,我必须定义域,例如:

{% trans from 'my_domain' %}my_key{% endtrans %}
实际上我不需要这个项目中的域。所有的翻译都是一个大领域的一部分。因此,我希望(1)使用多个翻译文件,(2)同时不关心域,以便

{% trans %}my_key{% endtrans %}
应适用于任何
/…/translations/*.xlf
文件中翻译的
my_key


如何在Symfony2中使用多个翻译文件,而不在细枝模板中使用域?

这可以通过在不中断任何内容的情况下创建自定义加载程序来实现,您只需使用不同的文件扩展名:

namespace AppBundle\Translation\Loader;

use Symfony\Component\Translation\Loader\XliffFileLoader;

class FooFileLoader extends XliffFileLoader
{
    /**
     * {@inheritdoc}
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        // ignoring $domain var and pass 'messages' instead
        return parent::load($resource, $locale, 'messages');
    }
}
:

稍后,您必须将所有文件命名为:

bar.en_GB.foo
baz.en_GB.foo
bar.de_DE.foo
baz.de_DE.foo
...

扩展名为
.foo
的所有翻译文件都将合并并包含在
消息
域中。

您可以使用单个标记为整个细枝模板设置翻译域:

{% trans_default_domain 'app' %}

谢谢你的回答!我还没有扩展
XliffFileLoader
,而是对其进行了更改(仅用于测试!),并在
$domain='messages'的开头添加了它。但它不起作用。你试过你的解决方案吗?它对您有效吗?我想它只适用于一个翻译文件(每种语言),该文件调用
消息。{locale}.{alias}
。但是我们不需要扩展默认的文件加载程序。是的,我已经尝试了我的解决方案,它适用于扩展名为
.foo
的所有翻译文件。使用我的SE fork复制它并获取
翻译加载程序
分支;)它起作用了!问题是,为什么我用
$domain='messages'检查XliffFileLoader#load(…)
(请参阅我的)中的code>不起作用(实际上,这是您使用新服务和继承的正确方式所做的),是缓存。再次感谢您!
{% trans_default_domain 'app' %}