如何使用 Symfony a2lix knp doctrine behaviours translatable 检索 "sub entity" 的翻译

How to retrieve translation of a "sub entity" using Symfony a2lix knp doctrine behaviors translatable

我是 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()
        ;        
}

我不知道这是否是个好习惯,但它对我有用。当我更改 url :

时,我在我的 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))

当我尝试呈现 Article 的记录时,我从未检索到我的类别名称的翻译,但检索到标题和描述。

我也看过(https://github.com/KnpLabs/DoctrineBehaviors#guess-the-current-locale),但我不是很明白。这是一种始终传递语言环境的方法吗?

我做错了什么?

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

如有任何帮助,我们将不胜感激。非常感谢

KNP 有自己的方法来猜测当前区域设置,只需访问当前请求范围即可。如果您想提取特定区域设置的记录,整个 "passing locale" 东西很有用。

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

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

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

    return '';
}

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

  1. $this->translate()->getName() - 此行查找您的翻译实体(在本例中为 CategoryTranslation)并调用方法 getName()。然后,我们要么 return 翻译的类别名称,要么如果没有添加翻译则为空字符串。

最后,这是您在 Twig 模板中访问类别名称的方法:

自从我们定义了辅助方法后,就不再需要在您的模板中访问 .translations。您可以简单地调用:

{{ category.name }}

希望你明白了。

你也可以用这个

{{ category.translate.name }}