Да, существует Translatable Behavior для Doctrine, который позволяет хранить переводы в json типе. Одна из популярных реализаций Translatable Behavior для Symfony и Doctrine - библиотека "TranslatableBundle".
TranslatableBundle предоставляет удобные инструменты для работы с переводимыми сущностями в Symfony. Эта библиотека добавляет новый тип поля "json_translation" для хранения переводов в формате JSON. За счет использования JSON как типа хранения, мы можем гибко добавлять и удалять переводы, а также легко манипулировать ими.
Для начала работы с TranslatableBundle, установите его в вашем проекте через composer:
composer require prezent/doctrine-translatable-bundle
Затем включите TranslatableBundle в настройках Symfony:
// config/bundles.php return [ // ... PrezentDoctrineTranslatableBundlePrezentDoctrineTranslatableBundle::class => ['all' => true], ];
Далее, укажите вашим переводимым сущностям, что они должны использовать Translatable Behavior:
// src/Entity/Article.php use DoctrineORMMapping as ORM; use GedmoMappingAnnotation as Gedmo; use PrezentDoctrineTranslatableAnnotation as Prezent; use SymfonyComponentSerializerAnnotationGroups; /** * @ORMEntity * @PrezentTranslatable */ class Article { /** * @ORMId * @ORMGeneratedValue * @ORMColumn(type="integer") * @Groups({"read"}) */ private $id; /** * @ORMColumn(type="json_translation") * @GedmoTranslatable * @Groups({"read"}) */ private $titleTranslations; /** * @PrezentLocale */ private $currentLocale; // ... }
В данном примере мы добавили поле "titleTranslations" с типом "json_translation", которое будет хранить переводы заголовков статьи. Также мы добавили аннотацию "@PrezentLocale" для указания текущей локали.
Теперь в вашем контроллере или сервисе, вы можете использовать TranslatableManager для управления переводами:
// src/Controller/ArticleController.php use PrezentDoctrineTranslatableTranslatableManager; class ArticleController extends AbstractController { /** * @Route("/articles/{id}", name="article_show") */ public function show(Article $article, TranslatableManager $translatableManager) { // Получение текущей локали $locale = $translatableManager->setLocale('en'); // Получение заголовка статьи на текущей локали $title = $article->translate($locale)->getTitle(); // ... return $this->render('article/show.html.twig', [ 'article' => $article, 'title' => $title, ]); } }
В данном примере мы использовали TranslatableManager для получения заголовка статьи на текущей локали. Также можно использовать TranslatableManager для добавления, удаления и обновления переводов.
TranslatableBundle предоставляет мощные возможности для работы с переводами в Symfony и Doctrine, включая поддержку хранения переводов в json типе. Это удобный инструмент для создания мультиязычных приложений на Symfony.