Вам необходимо создать два необходимых файла сущности, сначала EntityName, второе - EntityNameTranslation. Посмотрите пример ниже.
Категория Entity
Bundle документа: https://github.com/KnpLabs/DoctrineBehaviors
<?php
namespace BundleName\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
/**
* @ORM\Entity
*/
class Category
{
use ORMBehaviors\Translatable\Translatable;
/**
* @ORM\Column(type="string", length=255)
*/
protected $someFieldYouDoNotNeedToTranslate;
// or do it with PropertyAccessor that ships with Symfony SE
// if your methods don't take any required arguments
public function __call($method, $arguments)
{
return \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessor()->getValue($this->translate(), $method);
}
}
CategoryTranslation Entity
<?php
namespace BundleName\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
/**
* @ORM\Entity
*/
class CategoryTranslation
{
use ORMBehaviors\Translatable\Translation;
/**
* @ORM\Column(type="string", length=255)
*/
protected $name;
/**
* @ORM\Column(type="string", length=255)
*/
protected $description;
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @param string
* @return null
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @param string
* @return null
*/
public function setDescription($description)
{
$this->description = $description;
}
}
Установка и Упорно
<?php
$category = new Category;
$category->translate('fr')->setName('Chaussures');
$category->translate('en')->setName('Shoes');
$em->persist($category);
// In order to persist new translations, call mergeNewTranslations method, before flush
$category->mergeNewTranslations();
$category->translate('en')->getName();
Перевод в форме
Bundle документа: https://github.com/a2lix/TranslationFormBundle
Пример: https://github.com/emsiemhong/CPF/tree/master/NGS/src/NGS/ContentBundle
<?php
namespace NGS\ContentBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use NGS\ContentBundle\Entity\Article;
class ArticleType extends AbstractType
{
private $translator;
public function __construct(TranslatorInterface $translator) {
$this->translator = $translator;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('translations', 'a2lix_translations', array (
'locales' => array('en', 'km'),
'required_locales' => array('en'),
'label' => false,
'fields' => array(
'title' => array (
'field_type' => 'text',
'label' => $this->translator->trans('title')
),
'description' => array (
'field_type' => 'ckeditor',
'label' => $this->translator->trans('description')
)
),
))
->add('type', 'choice', array(
'choices' => array(
Article::ABOUT_TYPE => $this->translator->trans('about'),
Article::SERVICE_TYPE => $this->translator->trans('service'),
Article::HOME_TYPE => $this->translator->trans('home')
)
))
->add('picture', 'file', array(
'required' => false
))
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'NGS\ContentBundle\Entity\Article'
));
}
/**
* @return string
*/
public function getName()
{
return 'ngs_contentbundle_articles';
}
}
Получение
{% block content %}
/*
Because we use the magic function so we don't need specify the language so it will get the current local language
//the magic function
public function __call($method, $arguments)
*/
<span>{{ category.getName }}</span>
<span>{{ category.getDescription }}</span>
{% endblock %}
Вы уже видели [расширение gedmo Translitable doctrine] (https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/translatable.md)? – Matteo
выглядит интересным, даст ему попробовать – diggersworld
Проверьте интеграцию сонаты также в нижней части документации – Matteo