3

我必须实现自己的翻译加载器。我使用了以下教程: http ://blog.elendev.com/development/php/symfony/use-a-database-as-translation-provider-in-symfony-2/ 来实现我自己的翻译加载器。

我的代码没有收到任何错误,但是我的 Loader 的加载函数永远不会被执行。

有没有办法告诉 symfony 应该执行哪个翻译?

配置.yml

    translation.loader.db:
    class: Mysk\TranslationBundle\Services\DBLoader
    arguments: ["@doctrine.orm.entity_manager"]
    tags:
        - { name: translation.loader, alias: db}

DBLoader.php

class DBLoader implements LoaderInterface {

private $transaltionRepository;
private $languageRepository;

/**
 * @param EntityManager $entityManager
 */
public function __construct(EntityManager $entityManager){
    $this->transaltionRepository = $entityManager->getRepository("MyskTranslationBundle:LanguageTranslation");
    $this->languageRepository = $entityManager->getRepository("MyskTranslationBundle:Language");
    echo "yeah";
}

function load($resource, $locale, $domain = 'messages'){
    die();
    //Load on the db for the specified local
    $language = $this->languageRepository->getLanguage($locale);
    $translations = $this->transaltionRepository->getTranslations($language, $domain);
    $catalogue = new MessageCatalogue($locale);

    foreach($translations as $translation){
        $catalogue->set($translation->getLanguageToken()->getToken(), $translation->getTranslation(), $domain);
    }

    return $catalogue;
}}

有任何想法吗?

干杯蒂莫

4

2 回答 2

9

奥尔多已经回答了这个问题,但只是为了使其成为官方答案并帮助他人:

你需要创建一个“假”翻译文件来触发你的加载器

来自Symfony 依赖注入 标签:“translation.loader”

[...] 如果您从数据库加载翻译,您仍然需要一个资源文件,但它可能是空白的,或者包含一些关于从数据库加载这些资源的信息。该文件是触发自定义加载程序上的加载方法的关键。

所以你需要<domain>.<locale>.<loader-alias>在你的翻译文件夹中创建表格文件app/Resources/translations/

在你的情况下,一个文件是app/Resources/translations/messages.en.db英文的。

于 2015-10-23T10:52:39.627 回答
0

http://blog.elendev.com/page/3/#post-26http://blog.elendev.com/development/php/symfony/use-a-database-as-translation-provider-in-symfony -2/ 这里的另一个问题是示例中没有 LanguageRepository 类。你可以使用这个例子。

<?php
namespace TranslationBundle\Repository;
use Doctrine\ORM\EntityRepository;
class LanguageRepository extends EntityRepository
{
    public function getLanguage($locale)
    {
        return $this->findOneBy(array('locale' => $locale));
    }
}
于 2017-06-19T14:55:49.120 回答