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, чтобы другой язык "магически" загружался переводимым комплектом.