StofDoctrineExtensionsBundle 可翻译

StofDoctrineExtensionsBundle Translatable

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

这是我将用来翻译的 table (Objects table):

这里是tableext_translations(ext_translationstable):

当我运行由于某种原因将代码保存在ext_translationstable中的翻译。

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

创建时它在 object table 中写入标题,但稍后更新时它仅更新 ext_translations table。

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

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

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

并在提交时更改参数本地:

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

然后提交上面的代码。此类应用程序的最佳解决方案是什么?

"non translation table" 文本(正确实体中的文本)是来自您的默认语言环境的文本。所以通常它是"en"(或者更恰当地说应该是en_US或en_GB)。

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

翻译(以及您 ext_translations table 的条目)是非默认语言环境翻译的条目。

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

parameters:
    [...]
    locale: de

运行 php composer.phar install 将其传输到您的 parameters.yml。您当然可以直接在 parameters.yml 中编辑它,但是在作曲家 update/install

之后它可能会再次被覆盖

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

$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 会话属性的控制器操作,以便 transla 加载其他语言 "magically" table 捆绑。