动态内容的 Symfony 翻译

标签 symfony dynamic internationalization

使用 Symfony,我知道您可以创建翻译文件,在其中指定不同语言等的文本。这对于表单标签和应用程序中的其他静态文本非常有用。

但我想知道如何通过动态内容实现国际化。例如,如果您有一个带有 description 字段的 Product 实体。管理员可以通过后端更改此文本。

那么您将如何实现动态文本的国际替代方案?

最佳答案

您需要创建两个必要的实体文件,第一个是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);
    }
}

类别翻译实体

<?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 %}

关于动态内容的 Symfony 翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32583444/

相关文章:

node.js - 如何在 express 中动态呈现/加载页面?

string - Qt tr国际化不适用于主要功能吗?

symfony - 将 SwiftMailer 注入(inject) symfony2 服务

javascript - Symfony2 Bundles 资源文件丢失

symfony - 如何在 Symfony 中使用 assetic 查看 Assets 并自动安装和转储 Assets

c++ - 错误 C2229 : class 'VectorRemake<T>' has an illegal zero-sized array

快速通用和动态方法调度

php - 如何在 PHP 中生成多语言内容 Pdf

java - 在运行时刷新 Swing 元素的语言

php - 将基本模板变量覆盖到另一个包 {Symfony 3 TWIG} 的子模板