prims47 / translate-bundle
Symfony2 Prims47TranslateBundle
dev-master
2014-05-21 09:33 UTC
Requires
- php: >=5.3.3
- doctrine/orm: ~2.2,>=2.2.3
- gedmo/doctrine-extensions: 2.3.*@dev
- symfony/symfony: >=2.2
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);