我的应用程序包含许多不同语言的翻译资源。由于这个原因,预热过程需要很长时间。
我只支持用几种语言翻译我的网站,所以我想避免为我不支持的所有语言生成目录。
我做了什么:
我覆盖了TranslationsCacheWarmer以使用我自己的翻译器。这是一个自定义转换器,用于修饰默认转换器,但会覆盖预热方法,只覆盖属于我支持的语言环境的文件。
问题是默认的加热器仍会为所有语言环境生成文件。
这是包含自定义翻译器的代码:https://gist.github.com/marcosdsanchez/e8e2cd19031a2fbcd894
以下是我如何定义服务:
<service id="web.translation.public_languages_translator" class="X\Translation\PublicLanguagesTranslator" public="false">
<argument type="service" id="translator.default" />
<argument type="collection">%chess.translation.public_languages%</argument>
</service>
<service id="translation.warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\TranslationsCacheWarmer" public="false">
<argument type="service" id="web.translation.public_languages_translator" />
<tag name="kernel.cache_warmer" />
</service>
我正在使用symfony 2.7.3
答案 0 :(得分:0)
我最终做了不同的事情以获得相同的结果。我没有尝试创建自定义CacheWarmer,而是创建了一个编译器传递并修改了'options'参数的定义。在这个编译器传递中,我删除了所有没有语言环境或语言代码的文件。
代码:
<?php
namespace X\DependencyInjection\Compiler;
use X\Entity\I18nLanguage;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class TranslatorCompilerPass implements CompilerPassInterface
{
/**
* You can modify the container here before it is dumped to PHP code.
*
* @param ContainerBuilder $container
*
* @api
*/
public function process(ContainerBuilder $container)
{
$definition = $container->getDefinition('translator.default');
$options = $definition->getArgument(3);
$keys = array_keys($options['resource_files']);
$locales = I18nLanguage::PUBLIC_LOCALES;
$langCodes = array();
foreach (I18nLanguage::PUBLIC_LOCALES as $locale) {
$langCodes[] = substr($locale, 0, strpos($locale, '_'));
}
$localesAndLangCodes = array_merge($locales, $langCodes);
foreach ($keys as $key) {
if (!in_array($key, $localesAndLangCodes, true)) {
unset($options['resource_files'][$key]);
}
}
$arguments = $definition->getArguments();
$definition->setArguments(array($arguments[0], $arguments[1], $arguments[2], $options));
}
}
这对我有用,我还可以应用其他优化,例如删除加载器等。