nercury/translation-editor-bundle

翻译编辑表单。定义一个表单类型来编辑本地化对象的翻译。

v0.1.4 2015-11-23 09:04 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:37:07 UTC


README

这是一个翻译编辑表单。

Translation editor example

使用数组

示例数据

$data = array(
    'translations' => array(
        array(
            'lang' => 'lt',
            'name' => 'Produktas',
            'description' => 'Produkto aprašymas'
        ),
        array(
            'lang' => 'en',
            'name' => 'Product',
            'description' => 'Product description',
        ),
    ),
);

表单需要您为内部项创建一个表单类型,在本例中名为 "TestType"

class TestType extends \Symfony\Component\Form\AbstractType
{
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('description');
    }

    public function getName()
    {
        return 'translation_item_form';
    }
}

表单类型以类似集合的方式实现。使用 "type" 指定内部表单类型。使用 "locale_field_name" 来重写区域字段名称(默认为 "lang")。

$formBuilder = $this->createFormBuilder($data);
$formBuilder->add('translations', 'translations', array(
    'type' => new TestType(),
    'locale_field_name' => '[lang]',
    'locales' => array('lt', 'en', 'ru'),
));

使用集合和实体

表单类型还可以与在此或类似表结构中定义的数据库翻译一起使用


| product    |        | product_translation |
| id         | ------ | product_id          |
                      | lang                |
                      | name (localised)    |

它遵循旧 Doctrine1 行为的相同风格。

主要产品实体必须有一个 Doctrine 集合的翻译,以及 "getTranslations()" 方法,并且您应该使用其名称构建表单。

它将在 Doctrine 类元数据中找到其他内容。

表单主题

您可以通过重写 "fields.html.twig" 文件来重写表单主题。

JavaScript

@NercuryTranslationEditorBundle/Resources/public/js/translations_form.js

示例

示例 Doctrine 实体

namespace Example\AcmeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="acme")
 */
class Acme
{
	/**
     * @var \Doctrine\Common\Collections\ArrayCollection|AcmeTranslation[]
     *
     * @ORM\OneToMany(
     *      targetEntity="Example\AcmeBundle\Entity\AcmeTranslation", 
     *      mappedBy="acme", 
     *      cascade={"persist", "remove"}
     * )
     */
    private $translations;
}

namespace Example\AcmeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="acme_translations")
 */
class AcmeTranslation
{
	/**
     * @var Acme $acme
     *
     * @ORM\ManyToOne(targetEntity="Example\AcmeBundle\Entity\Acme", inversedBy="translations")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(
     *       name="acme_id", 
     *       referencedColumnName="id", 
     *       onDelete="CASCADE", 
     *       nullable=false
     *   )
     * })
     */
    private $acme;

	/**
     * @var string $lang
     *
     * @ORM\Column(name="lang", type="string", length=31, nullable=false)
     */
    private $lang;

    /**
     * @var string $title
     *
     * @ORM\Column(name="title", type="string", length=255, nullable=false)
     */
    private $title;

    /**
     * @var string $description
     *
     * @ORM\Column(name="description", type="text", nullable=true)
     */
    private $description;
}