使用Symfony我意识到您可以创建翻译文件,在其中为不同语言等指定文本。这适用于表单标签和应用程序中的其他静态文本。
我想知道的是如何通过动态内容实现国际化。例如,如果您的Product
实体具有description
字段。管理员可以通过后端更改此文本。
那么如何实现动态文本的国际替代方案呢?
答案 0 :(得分:1)
您需要创建两个必要的实体文件,第一个是EntityName,第二个是EntityNameTranslation。请看下面的例子。
类别实体
捆绑文件: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();
表格翻译
捆绑文件: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 %}