prims47/translate-bundle

Symfony2 Prims47TranslateBundle

dev-master 2014-05-21 09:33 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:39:24 UTC


README

此包为Symfony2提供翻译数据库解决方案。

第一步:安装

使用composer管理依赖并下载Prims47TranslateBundle

"require": {
    "php": ">=5.3.3",
    "symfony/symfony": ">=2.2",
    "doctrine/orm": "~2.2,>=2.2.3",
    "doctrine/doctrine-bundle": "~1.2",
    // ...
    "prims47/translate-bundle": "dev-master"
}

启用Prims47TranslateBundle

<?php
// app/AppKernel.php
public function registerBundles()
{
    return array(
        // ...
        // Then add Prims47TranslateBundle
        new Prims47\Bundle\TranslateBundle\Prims47TranslateBundle(),
        // ...
    );
}

配置Prims47TranslateBundle

配置您的区域设置参数

# app/parameters.yml
parameters:
    # ...
    locale: en_FR # Or "de_DE"; "fr_FR" ...
    # ...

映射

# app/config/config.yml
doctrine:
    dbal:
    # your dbal config here

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true
        # only these lines are added additionally 
        mappings:
            translatable:
                type: annotation
                alias: Gedmo
                prefix: Gedmo\Translatable\Entity
                # make sure vendor library location is correct
                dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"

之后,运行 php app/console doctrine:mapping:info

更多详情,请查看Gedmo 文档

Doctrine扩展监听器服务

# app/config/config.yml
services:
    extension.listener:
            class: Prims47\Bundle\TranslateBundle\Listener\DoctrineExtensionListener
            calls:
                - [ setContainer, [ @service_container ] ]
            tags:
                # translatable sets locale after router processing
                - { name: kernel.event_listener, event: kernel.request, method: onLateKernelRequest, priority: -10 }

    # Doctrine Extension listeners to handle behaviors
    gedmo.listener.translatable:
        class: Gedmo\Translatable\TranslatableListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
        calls:
            - [ setAnnotationReader, [ @annotation_reader ] ]
            - [ setDefaultLocale, [ "%locale%" ] ]
            - [ setTranslationFallback, [ true ] ]

可翻译实体示例

<?php

namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Translatable\Translatable;

/**
 * Post
 */
class Post implements Translatable
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @Gedmo\Locale
     */
    private $locale;

    /**
     * @Gedmo\Translatable
     *
     * @var string
     */
    private $title;

    /**
     * @Gedmo\Translatable
     *
     * @var string
     */
    private $content;

    
    public function setId($id)
    {
        $this->id = $id;
    }
    
    public function getId()
    {
        return $this->id;
    }

    public function setTitle($title)
    {
        $this->title = $title;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setContent($content)
    {
        $this->content = $content;
    }

    public function getContent()
    {
        return $this->content;
    }

    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
    }
}

XML映射示例

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
    <entity repository-class="Acme\DemoBundle\Entity\PostRepository" name="Acme\DemoBundle\Entity\Post">
        
        <!-- Don't forget xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping" -->
        
        <id name="id" type="integer" column="id">
            <generator strategy="AUTO"/>
        </id>

        <field name="title"   column="title"   type="string" length="255">
            <gedmo:translatable/>
        </field>
        <field name="content" column="content" type="text">
            <gedmo:translatable/>
        </field>

        <gedmo:translation entity="Gedmo\Translatable\Entity\Translation" locale="locale"/>

    </entity>
</doctrine-mapping>

之后,运行 php app/console doctrine:schema:update --force

基本用法示例

目前全局区域设置用于翻译在您的参数.yml中(例如en_US),它已在DoctrineExtensionListener中设置。

步骤0:创建您的管理器

在开始翻译之前,我们必须创建一个管理器

<?php

namespace Acme\DemoBundle\Entity;

use Prims47\Bundle\TranslateBundle\Doctrine\Common\BaseManager;

class PostManager extends BaseManager
{
    /**
     * Find all post by locale.
     *
     * @return array
     */
    public function findAll()
    {
        return $this->getRepository()->findAll();
    }
    
    /**
     * Find Post by id.
     *
     * @param integer $id
     *
     * @return mixed|null|object
     */
    public function find($id)
    {
        return $this->getRepository()->find($id);
    }
}

之后,您必须声明此管理器为服务。

<!-- Acme/DemoBundle/Resources/config/services.xml -->
<?xml version="1.0" ?>

<container xmlns="https://symfony.com.cn/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://symfony.com.cn/schema/dic/services https://symfony.com.cn/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="acme.demo.post.manager" class="Acme\DemoBundle\Entity\PostManager">
            <argument type="service" id="doctrine.orm.default_entity_manager" />
            <argument>Acme\DemoBundle\Entity\Post</argument> <!-- Your entity -->
            <call method="setRepositoryLocale">
                <argument type="service" id="service_container" /> <!-- You must call this method for declare your locale dynamically -->
            </call>
        </service>
    </services>
</container>

步骤1:适配您的存储库

<?php

namespace Acme\DemoBundle\Entity;

use Prims47\Bundle\TranslateBundle\Doctrine\ORM\EntityRepository;

/**
 * PostRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class PostRepository extends EntityRepository
{
    /**
     * Find all post by locale.
     *
     * @return array
     */
    public function findAll()
    {
        $qb = $this->createQueryBuilder('p');

        return $this->getResult($qb);
    }
    
    /**
     * Find Post by id.
     *
     * @param integer $id
     *
     * @return mixed|null|object
     */
    public function find($id)
    {
        $qb = $this->createQueryBuilder('p');
        $qb->where('p.id = :id');
        $qb->setParameter('id', $id);

        return $this->getOneOrNullResult($qb);
    }
}

步骤1:基本用法

保存带其翻译的帖子

<?php

/** @var PostManager $postManager */
$postManager = $this->get('acme.demo.post.manager');

$post = new Post();
$post->setTitle('My first title in english');
$post->setContent('My first content in english');

$postManager->save($post, true);

$post = $postManager->find(1);

让我们更新我们的帖子在不同区域

<?php
/** @var PostManager $postManager */
$postManager = $this->get('acme.demo.post.manager');

$post = $postManager->find(1);

$post->setTitle('Mon premier titre en français');
$post->setContent('Mon premier contenu en français');
$post->setTranslatableLocale('fr_FR');

$postManager->save($post, true);

现在更改您的区域设置参数

有两种方法。

  • 在参数.yml中更改您的区域设置
  • 或在会话中添加区域值
<?php

$session = $this->get('session');
$session->set('_locale', 'fr_FR');

/** @var PostManager $postManager */
$postManager = $this->get('acme.demo.post.manager');

$post = $postManager->find(1);