我必须实现自己的翻译加载器。我使用过教程: http://blog.elendev.com/development/php/symfony/use-a-database-as-translation-provider-in-symfony-2/ 实现我自己的翻译加载器。
我的代码没有任何错误,但我的Loader的加载功能永远不会被执行。
有没有办法告诉symfony应该执行哪个翻译?
config.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;
}}
有什么想法吗?
干杯 蒂莫
答案 0 :(得分:6)
Aldo已经回答了这个问题,但只是为了让它成为官方答案并帮助其他人:
来自Symfony Dependency Injection Tags: "translation.loader"
[...]如果您正在从数据库加载翻译,您仍然需要一个资源文件,但它可能是空白的,或者包含有关从数据库加载这些资源的一些信息。该文件是触发自定义加载器上的加载方法的关键。
因此,您需要在翻译文件夹<domain>.<locale>.<loader-alias>
中创建app/Resources/translations/
格式的文件。
在您的情况下,对于英语,一个文件将是app/Resources/translations/messages.en.db
。
答案 1 :(得分:0)
http://blog.elendev.com/page/3/#post-26或http://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));
}
}