使用密钥进行symfony翻译

时间:2014-08-12 09:42:06

标签: symfony translation multilingual

如果我想翻译symfony中的内容,我将使用书中描述的翻译器:

$translated = $this->get('translator')->trans('Symfony2 is great');

但是,如果此翻译已存在于数据库中,我该如何访问它?

db看起来像

ID | locale | type   | field            | content
 1 |   en   | message| staff.delete     | delete this user?

我必须告诉翻译他在哪里可以获得翻译信息。你能帮我一个好的教程还是耍弄技巧?

1 个答案:

答案 0 :(得分:4)

根据文档,您需要注册服务才能从其他来源(如数据库

)加载翻译
  

您还可以将翻译存储在数据库或任何其他存储中   提供实现LoaderInterface接口的自定义类。   有关详细信息,请参阅translation.loader标记。Reference

我做了什么,我有一个我的翻译实体所在的翻译包所以我在config.yml中注册了一个服务并通过了doctrine manager @doctrine.orm.entity_manager以便从实体获取数据

services:

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

DBLoader班级中,我从文档translation.loader

中提到的数据库和集合中提取了翻译

My Loader课程

namespace YourNamespace\TranslationBundle\Loader;

use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\MessageCatalogue;
use Doctrine\ORM\EntityManager;

class DBLoader implements LoaderInterface{
    private $transaltionRepository;
    private $languageRepository;

    /**
     * @param EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager){

        $this->transaltionRepository = $entityManager->getRepository("YourNamespaceTranslationBundle:LanguageTranslation");
        $this->languageRepository = $entityManager->getRepository("YourNamespaceTranslationBundle:Language");
    }

    function load($resource, $locale, $domain = 'messages'){
        //Load on the db for the specified local

        $language = $this->languageRepository->findOneBy( array('locale' => $locale));

        $translations = $this->transaltionRepository->getTranslations($language, $domain);

        $catalogue = new MessageCatalogue($locale);


        /**@var $translation YourNamespace\TranslationBundle\Entity\LanguageTranslation */
        foreach($translations as $translation){
            $catalogue->set($translation->getLanguageToken(), $translation->getTranslation(), $domain);
        }        
        return $catalogue;
    }
}
  

注意:每次创建新的翻译资源(或安装捆绑包)   包括翻译资源),请务必清除缓存   Symfony可以发现新的翻译资源:   php app / console cache:clear