2015-09-15 3 views
0

С Symfony я знаю, что вы можете создавать файлы переводов, в которых вы указываете текст для разных языков и т. Д. Это отлично подходит для ярлыков форм и другого статического текста в приложении.Переводы Symfony по динамическому контенту

Что мне интересно, так это то, как можно добиться интернационализации с помощью динамического контента. Например, если у вас есть объект Product с полем description. Администратор может изменить этот текст в фоновом режиме.

Итак, как бы вы реализовали международные альтернативы для динамического текста?

+0

Вы уже видели [расширение gedmo Translitable doctrine] (https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/translatable.md)? – Matteo

+0

выглядит интересным, даст ему попробовать – diggersworld

+0

Проверьте интеграцию сонаты также в нижней части документации – Matteo

ответ

1

Вам необходимо создать два необходимых файла сущности, сначала 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 %} 
Смежные вопросы