0

我正在用两种语言构建 Symfony 2 应用程序,我已经实现了 StofDoctrineExtensionsBundle 的 Translatable。Translatable 使其他表 ext_translations 并存储翻译。

这是我将用来翻译的表(对象表):

在此处输入图像描述

这是 ext_translations 表(ext_translations 表):

在此处输入图像描述

当我出于某种原因在 ext_translations 表中运行代码以保存翻译时。

    $entity = $em->getRepository('ObjectsBundle:Object')->find(1);
    $entity->setTitle('my title in ru');
    $entity->setTranslatableLocale('ru'); // change locale
    $em->persist($entity);
    $em->flush();

创建时它在对象表中写入标题,但稍后更新它只更新 ext_translations 表。

如何在 symfony 2 中使用两种语言处理更新和创建?

我是否需要复制这些输入并将它们存储在一次提交中。例如在对象表中我有标题我需要有:

<input type="text" name="title_bg">
<input type="text" name="title_en">

当它们被提交时,更改参数 local:

 $entity->setTranslatableLocale('ru'); -- or what lang parameter we have

然后提交上面的代码。这种应用的最佳解决方案是什么?

4

1 回答 1

1

“非翻译表”文本(正确实体中的文本)是默认语言环境中的文本。所以通常它是“en”(或者更准确地说应该是 en_US 或 en_GB)。

如果你想让你的翻译默认为俄语(“ru”或更好的“ru_RU”),你应该将你的默认语言环境设置为这样。

翻译(和您的 ext_translations 表的条目)是非默认语言环境翻译的条目。

要设置默认语言环境,请转到 parameters.yml.dist 并设置

parameters:
    [...]
    locale: de

运行php composer.phar install以将其传输到您的 parameters.yml 中。您当然可以直接在 parameters.yml 中对其进行编辑,但是在作曲家更新/安装后它可能会再次被覆盖

编辑(用于评论):如果您对 CRUD(或很可能是 U)有问题,您始终必须确保加载了正确的实体。可翻译扩展始终依赖于您在实体中设置的语言环境。要使用要编辑的文本加载正确的实体,您必须在加载时执行以下操作

$entity = $em->getRepository('ObjectsBundle:Object')->find(1);
$entity->setTranslatableLocale('ru'); // change locale
$em->refresh($entity);

如果您想编辑非默认语言文本,您会这样做。在保存时,您仍然必须确保在您的实体中正确设置语言环境(如您上面提到的)。

编辑#2: https ://gist.github.com/Koalabaerchen/8ed60894cdbbdcd42f3c 这是用户会话中的 _locale 参数集示例(如果不存在)。使用 Symfony 2.7.7 及更低版本测试

如果您想切换用户会话的 _locale(以获取其他翻译),您只需创建一个设置 _locale 会话属性的控制器操作,以便可翻译包“神奇地”加载其他语言。

于 2015-11-24T16:25:46.780 回答