如何在Symfony2中禁用标准翻译加载程序



我在Symfony2中使用自定义存储进行翻译,但我想确保翻译只能从我的存储中加载,而不能从其他源(如Yaml文件)加载。如何禁用标准加载程序?在我的自定义Translator类中,我有以下代码:

   /**
     * {@inheritdoc}
     */
    protected function loadCatalogue($locale)
    {
        $this->initializeCatalogue($locale);
    }
    /**
     * {@inheritdoc}
     */
    protected function initializeCatalogue($locale)
    {
        $this->addLoader('storageLoader', $this->container->get('my.translation.loader'));
        $this->addResource('storageLoader', $this->container->get('storage.getter'), $locale);
        parent::initializeCatalogue($locale);
    }

但在parent::initializeCatalogue($locale);中,它加载所有标准加载程序。我发现了这篇文章,我如何让家伙只删除缓存文件,以确保翻译只从数据库中获得,或者我错过了什么?

您缺少了一些在应用程序中禁用标准翻译加载程序的功能。

注册服务

将您的自定义翻译加载程序添加到您的服务中(记得用自己的类替换类):

services:
    my.translation.loader.dbext:
        class: YouAppCommonBundleServicesMyTranslationLoader
        arguments: [@doctrine.orm.entity_manager]
        tags:
            - { name: translation.loader, alias: dbext}

dbext-是虚假消息文件的扩展(请随意更改)。当symfony试图加载具有这种扩展名的文件时,加载器将被您的类所取代。

创建虚假消息文件

最后一步是按照sf2文档中的方式创建那些虚假的messages.en.dbext、messages.fr.dbext和其他messages.*.dbext文件:

如果你从数据库加载翻译,你仍然需要资源文件,但它可能是空白的,也可能包含一点关于从数据库加载那些资源的信息。文件是在自定义加载程序上触发加载方法的关键。

在这种情况下,这应该会对你有所帮助。

编辑:

如果您在服务注册中没有使用YAML,您可以使用XML

<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <services>
        <service
            id="my.translation.loader.dbext"
            class="YouAppCommonBundleServicesMyTranslationLoader">
            <tag name="translation.loader" alias="dbext" />
        </service>
    </services>
</container>

或PHP

$container
    ->register('my.translation.loader.dbext', 'YouAppCommonBundleServicesMyTranslationLoader')
    ->addTag('translation.loader', array('alias' => 'dbext'))
;

最新更新