首页 > 解决方案 > 如何从 Symfony4 中的数据库加载翻译?

问题描述

根据这篇 symfony 文档文章,应该可以加载您自己的翻译格式。所以我试图从数据库中加载它们。

但无论我试图使这项工作。它只是没有。

使用数据库加载器是正确的方法还是我应该做其他事情来从数据库加载翻译?

App\Translation\Loader\DatabaseLoader.php:

namespace App\Translation\Loader;

use App\Entity\Translation;
use App\Domain\TranslationManagerInterface;
use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\MessageCatalogue;

/**
 * Database Loader
 */
class DatabaseLoader implements LoaderInterface
{
    /**
     * Translation Manager
     *
     * @var TranslationManagerInterface
     */
    private $_translationManager;

    /**
     * Constructor
     *
     * @param TranslationManagerInterface $translationManager
     */
    public function __construct(TranslationManagerInterface $translationManager)
    {
        $this->_translationManager = $translationManager;
    }

    /**
     * {@inheritDoc}
     */
    public function load($resource, $locale, $domain = 'general')
    {
        $translations = $this->_translationManager->findByLocaleAndDomain($locale, $domain);

        $catalogue = new MessageCatalogue($locale);

        /* @var Translation $translation */
        foreach($translations as $translation)
        {
            $catalogue->set(
                $translation->getToken(),
                $translation->getContent(),
                $translation->getDomain()()
            );
        }
    }
}

配置/服务.yaml:

# database loader
    translation.loader.database:
        class: 'App\Translation\Loader\DatabaseLoader'
        arguments: [ 'App\Domain\TranslationManager' ]
        tags:
            - { name: translation.loader, alias: database, priority: 100 }

我什至尝试使用内核请求上的事件侦听器手动将加载程序添加到翻译器。我不想使用完整的捆绑包,因为我已经是一个充满翻译的数据库

标签: symfonyinternationalizationtranslation

解决方案


用 Symfony 4.2.4 测试也许这个答案来的有点晚,但我想帮助其他和我一样绝望的有同样问题的访问者。

  1. 您的类 DatabaseLoader 中有一个小错误。您必须在函数 load() 中返回 $catalogue 。

    public function load($resource, $locale, $domain = 'general')
    {
        $translations = $this->_translationManager->findByLocaleAndDomain($locale, $domain);
    
        $catalogue = new MessageCatalogue($locale);
    
        /* @var Translation $translation */
        foreach($translations as $translation)
        {
            $catalogue->set(
                $translation->getToken(),
                $translation->getContent(),
                $translation->getDomain()()
            );
        }
    
        // you must return $catalogue here
        return $catalogue;
    }
    
  2. 您必须创建“假”翻译文件才能触发加载程序。见这里: https ://stackoverflow.com/a/33300593/6709953

    示例:对于翻译域“messages”和语言环境“en”,必须有一个空文件translations/messages.en.database

    (小提示:在config/services.yaml中设置了“alias:database”,意思是翻译文件的后缀必须是.database)

  3. 如果文件夹translation/中存在旧的竞争翻译文件,您必须删除它们。因此,例如,如果还有文件translations/messages.en.yaml,则必须将其删除。


推荐阅读