StofDoctrineExtensionsBundle Переводимый

Я создаю приложение Symfony 2 на двух языках, в которых реализован Trans дув от StofDoctrineExtensionsBundle. Переводчики составляют другую таблицу 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

А затем отправьте верхний код. Какое решение лучше всего подходит для такого рода приложений?

1 ответ

Решение

Тексты "таблицы перевода" (те, которые находятся в правильной сущности) - это тексты из вашей локали по умолчанию. Так что обычно это "en" (или правильнее должно быть en_US или en_GB).

если вы хотите, чтобы ваш перевод был русским по умолчанию ("ru" или лучше "ru_RU"), вы должны установить локаль по умолчанию как таковую.

Переводы (и записи в вашей таблице ext_translations) являются записями для переводов, отличных от локали по умолчанию.

Чтобы установить локаль по умолчанию, перейдите к parameters.yml.dist и установите

parameters:
    [...]
    locale: de

Бежать php composer.phar install перенести его в ваши параметры. Вы можете, конечно, отредактировать его непосредственно в файле parameters.yml, но после обновления / установки композитора он может быть снова перезаписан.

изменить (для комментария): Если у вас есть проблемы с CRUD (или, скорее всего, U), вы всегда должны убедиться, что у вас загружен правильный объект. Переводимое расширение всегда зависит от локали, заданной вами внутри сущности. Чтобы загрузить нужный объект с текстом, который вы хотите редактировать, вы должны сделать следующее при загрузке

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

Это вы бы сделали, если хотите редактировать тексты, отличные от языка по умолчанию. При сохранении вы все равно должны убедиться, что правильно установили языковой стандарт в вашей сущности (как упомянуто вами выше).

edit # 2: https://gist.github.com/Koalabaerchen/8ed60894cdbbdcd42f3c Это пример набора параметров _locale внутри сеанса пользователя (если он не существует). Протестировано с Symfony 2.7.7 и ниже

Если вы хотите переключить _locale пользовательского сеанса (чтобы получить другие переводы), вам просто нужно создать действие контроллера, которое устанавливает атрибут сеанса _locale, чтобы другой язык "магически" загружался переводимым комплектом.

Другие вопросы по тегам