如何检索"子实体的翻译"使用Symfony a2lix knp doctrine行为可翻译

时间:2015-04-13 11:44:44

标签: symfony doctrine-orm translation behavior a2lix-translation

我是symfo的新手,但我需要翻译我网站的内容。

我使用的是a2lix(最新版本)和KNP教条行为(可翻译)。

我们说我有2个实体(例如文章和类别)。

与文档(https://github.com/KnpLabs/DoctrineBehaviors)中的翻译一样,我使用了2个类别(Category和CategoryTranslation)。 要检索我的类别的翻译,我使用带有区域设置的查询。我得到了Request $ request($ locale = $ request-> getLocale();)的语言环境。这是我的控制器和我的存储库中的查询的示例。

控制器

public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $locale = $request->getLocale();

        $entities = $em->getRepository('AcmeBundle:Category')->findAllByLocale($locale);

        return $this->render('CTCArtworkBundle:Backend/Artwork:index.html.twig', array(
            'entities' => $entities,
        ));
    }

存储库 我正在尝试检索语言环境的信息。

public function findAllByLocale($locale){

        return $this->createQueryBuilder('a')
                   ->join('a.translations', 'aTrans')
                   ->where('aTrans.locale = :locale')
                   ->setParameter("locale", $locale)
                   ->addSelect('aTrans')
                   ->getQuery()
                   ->getResult()
        ;        
}

我不知道这是不是一个好习惯,但它对我有用。当我更改网址时,我在我的Twig模板中检索fr / en类别:

<tr>
    <th>Category</th>
    <td>{{ category.translations|First.name }}</td>
</tr>

我的问题

对于我的文章的翻译,我也这样做。我有3个属性 - 标题 - 描述 - 类别(我使用a2lix_translatedEntity(http://a2lix.fr/bundles/translation-form/#bundle-additional))

当我尝试渲染文章的记录时,我从不检索我的类别名称的翻译,但是标题和描述的翻译。

我也读到了(https://github.com/KnpLabs/DoctrineBehaviors#guess-the-current-locale),但我并不理解。这是一种总是传递语言环境的方法吗?

我做错了什么?

我被阻止了,找不到任何文件来解决我的问题。对不起我的英文; - )

任何帮助都会非常感激。非常感谢

2 个答案:

答案 0 :(得分:1)

KNP有自己的方式来猜测当前的语言环境,只需访问当前的请求范围即可。如果要为特定区域设置提取记录,整个“传递区域设置”很有用。

现在,您的类别翻译。由于您没有包含您的实体,我将尝试向您展示一些访问您的翻译的示例。

在您的类别实体中,假设您有一个属性名称,它将返回您的类别名称。然后,您可以定义一个简单的帮助器方法,该方法将按当前语言环境返回该名称:

public function getName() {
    if( $name == $this->translate()->getName() ) {
        return $name;
    }

    return '';
}

那么,我们在这做了什么?

  1. $ this-&gt; translate() - &gt; getName() - 此行查找您的翻译实体(在本例中为CategoryTranslation)并调用方法 getName() 。然后,我们要么返回已翻译的类别名称,要么在没有添加翻译的情况下返回空字符串。
  2. 最后,您可以在枝条模板中访问类别名称:

    由于我们定义了辅助方法,因此不再需要在模板中访问 .translations 。您只需致电:

    {{ category.name }}
    

    希望你明白了。

答案 1 :(得分:0)

你也可以使用这个

{{ category.translate.name }}