umanit / translation-bundle
管理 Doctrine 翻译
Requires
- php: >=8.0
- doctrine/doctrine-bundle: >=1.6
- doctrine/orm: >=2.9
- ramsey/uuid: >=3.7
- symfony/framework-bundle: ^4.4|^5.2|^6.0
- symfony/property-access: ^4.4|^5.2|^6.0
- symfony/security-bundle: ^4.4|^5.2|^6.0
- symfony/yaml: ^4.4|^5.2|^6.0
- twig/twig: >=2.7
Requires (Dev)
- jakub-onderka/php-parallel-lint: ^1.0
- phpunit/phpunit: >=6.5
- symfony/phpunit-bridge: ^4.4|^5.2|^6.0
This package is auto-updated.
Last update: 2024-09-19 10:03:55 UTC
README
此包旨在简化 Doctrine 实体翻译。与大多数翻译库不同,每个翻译都存储在源实体的同一表中。
特性
- 在不更改现有实体的情况下添加翻译
- 翻译字段存储在同一表中(无需昂贵的连接)
- 支持继承实体
- 处理不仅仅是文本字段
- 与 Sonata 和 EasyAdmin 集成
- 自动填充翻译关系
安装
composer require umanit/translation-bundle
如果未自动完成,请将包注册到您的 app/AppKernel.php
。
new Umanit\TranslationBundle\UmanitTranslationBundle(),
配置您的可用区域设置和可选的默认值
umanit_translation: locales: [en, fr, ja] default_locale: en
就这样!
与 Sonata Admin 集成
您需要将额外的样式表和 JavaScript 添加到您的管理界面中
sonata_admin: assets: extra_stylesheets: - 'bundles/umanittranslation/css/admin-sonata.css' extra_javascripts: - 'bundles/umanittranslation/js/admin-filters.js'
用法
使您的实体可翻译
实现 Umanit\TranslationBundle\Doctrine\TranslatableInterface
并在您想要使其可翻译的实体上使用特质 Umanit\TranslationBundle\Doctrine\ModelTranslatableTrait
。
<?php namespace App\Entity\Content; use Doctrine\ORM\Mapping as ORM; use Umanit\TranslationBundle\Doctrine\Model\TranslatableInterface; use Umanit\TranslationBundle\Doctrine\Model\TranslatableTrait; /** * HomePage * * @ORM\Table(name="page") */ class Page implements TranslatableInterface { use TranslatableTrait; }
翻译您的实体
使用服务 umanit_translation.translator.entity_translator
将源实体翻译为目标语言。
$translatedEntity = $this->get('umanit_translation.translator.entity_translator')->translate($entity, 'fr');
使用 Sonata 或 EasyAdmin,$translatedEntity
将被持久化,启动:两个都会将您重定向到编辑表单。
除非使用 EmptyOnTranslate
属性指定,否则源实体的每个属性都将克隆到一个新实体中。
选项
通常,您不希望将实体的所有字段都克隆出来。一些应该在整个翻译中共享,而其他则应该在新的翻译中为空。为此提供了两个特殊属性。
SharedAmongstTranslations
使用此属性将使字段值在所有翻译中相同:如果您更新任何翻译中的此字段,其他所有翻译都将同步。如果属性是可翻译实体的关系,它将将正确的翻译关联到每种语言。
注意: 目前不支持使用 SharedAmongstTranslations
与 ManyToMany
关联。
<?php namespace App\Entity\Content; use Doctrine\ORM\Mapping as ORM; use Umanit\TranslationBundle\Doctrine\Model\TranslatableInterface; use Umanit\TranslationBundle\Doctrine\Model\TranslatableTrait; use Umanit\TranslationBundle\Doctrine\Attribute\SharedAmongstTranslations; #[ORM\Table(name: "page")] class Page implements TranslatableInterface { use TranslatableTrait; #[ORM\ManyToOne(targetEntity: "Application\Sonata\MediaBundle\Entity\Media", cascade: {"persist"})] #[ORM\JoinColumn(name: "video_id", referencedColumnName: "id")] #[SharedAmongstTranslations] protected Application\Sonata\MediaBundle\Entity\Media $video; }
EmptyOnTranslate
此属性将在创建新翻译时清空字段。
<?php namespace App\Entity\Content; use Doctrine\ORM\Mapping as ORM; use Umanit\TranslationBundle\Doctrine\Model\TranslatableInterface; use Umanit\TranslationBundle\Doctrine\Model\TranslatableTrait; use Umanit\TranslationBundle\Doctrine\Attribute\EmptyOnTranslate; #[ORM\Table(name: "page")] class Page implements TranslatableInterface { use TranslatableTrait; // ... #[ORM\ManyToOne(targetEntity: "Application\Sonata\MediaBundle\Entity\Media", cascade: {"persist"})] #[ORM\JoinColumn(name: "image_id", referencedColumnName: "id")] #[EmptyOnTranslate] protected Application\Sonata\MediaBundle\Entity\Media $image; }
过滤您的内容
要从当前区域设置的数据库中获取您的内容,您通常会做类似 $repository->findByLocale($request->getLocale())
的事情。
或者,您可以使用提供的过滤器,该过滤器将自动根据当前区域设置过滤任何可翻译实体,每次您查询 ORM。这样,您只需简单地做 $repository->findAll()
而不是前面的例子。
将其添加到您的 config.yml
文件中
# Doctrine Configuration doctrine: orm: filters: # ... umanit_translation_locale_filter: class: 'Umanit\TranslationBundle\Doctrine\Filter\LocaleFilter' enabled: true
(可选) 禁用特定防火墙的过滤器
通常,您需要管理您的内容。为此,您可以通过配置 disabled_firewalls 选项来禁用过滤器。
umanit_translation: # ... disabled_firewalls: ['admin']
高级用法
您可以在翻译前后使用 Umanit\TranslationBundle\Event\TranslateEvent
修改要翻译或已翻译的实体
TranslateEvent::PRE_TRANSLATE
在开始翻译属性之前调用。新的翻译刚刚实例化,具有正确的oid
和locale
TranslateEvent::POST_TRANSLATE
在保存翻译后调用
与行政包集成
Sonata
如果您使用它,此包将自动在 SonataAdmin 中添加翻译小部件。
list
视图中将添加两个列locale
和translations
。- 在“
list
”视图中的“edit
”按钮会显示一个下拉菜单,用于选择要编辑的语言。 - 在“
edit
”视图的标签菜单中,将有一个条目用于翻译编辑内容。
如果您想为管理员定义一个默认区域设置,请配置“default_locale
”。
umanit_translation: # ... default_locale: en
然后管理员将只显示“list
”视图中的英文内容。
EasyAdmin 4
- 让您的控制器继承 EasyAdmin 中的“
AbstractCrudController
”而不是“AbstractTranslatableCRUDController
”。这将- 在索引视图中添加“
TUUID
”和“locale
”作为列,以及用链接替换编辑操作,以便翻译到或编辑特定区域设置 - 在编辑视图中添加一个带有链接到其他区域设置的翻译下拉菜单(已翻译或未翻译)
- 在索引视图中添加“
该组件不会自动应用过滤器,仅显示默认区域设置(如果存在)中已翻译的对象。然而,过滤器已激活,可以手动触发以显示所需区域设置的现有对象。
与 DoctrineSingletonBundle 集成
该组件将自动与 Doctrine Singleton Bundle 一起工作。如果您的单例实现了 TranslatableInterface,则可以按区域设置获取一个实例。