覆盖TranslationsCacheWarmer服务

时间:2015-08-07 21:20:50

标签: symfony

我的应用程序包含许多不同语言的翻译资源。由于这个原因,预热过程需要很长时间。

我只支持用几种语言翻译我的网站,所以我想避免为我不支持的所有语言生成目录。

我做了什么:

我覆盖了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

1 个答案:

答案 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));
    }
}

这对我有用,我还可以应用其他优化,例如删除加载器等。