如果我想翻译symfony中的内容,我将使用书中描述的翻译器:
$translated = $this->get('translator')->trans('Symfony2 is great');
但是,如果此翻译已存在于数据库中,我该如何访问它?
db看起来像
ID | locale | type | field | content
1 | en | message| staff.delete | delete this user?
我必须告诉翻译他在哪里可以获得翻译信息。你能帮我一个好的教程还是耍弄技巧?
答案 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