Существует ли Translatable Behavior для Doctrine с хранением переводов в json типе?

Да, существует 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.