如何在Symfony2的Twig中使用多个没有域的翻译文件?
在我正在进行的Symfony2项目中,翻译是多个域文件中的文件,如如何在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 %} 实际上我不需要这个项目中的域。所有的翻译都是一个大领域的一部分。因此
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' %}