umanit/translation-bundle

管理 Doctrine 翻译

3.0.2 2024-01-19 08:28 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

使用此属性将使字段值在所有翻译中相同:如果您更新任何翻译中的此字段,其他所有翻译都将同步。如果属性是可翻译实体的关系,它将将正确的翻译关联到每种语言。

注意: 目前不支持使用 SharedAmongstTranslationsManyToMany 关联。

<?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 在开始翻译属性之前调用。新的翻译刚刚实例化,具有正确的 oidlocale
  • TranslateEvent::POST_TRANSLATE 在保存翻译后调用

与行政包集成

Sonata

如果您使用它,此包将自动在 SonataAdmin 中添加翻译小部件。

  • list 视图中将添加两个列 localetranslations
  • 在“list”视图中的“edit”按钮会显示一个下拉菜单,用于选择要编辑的语言。
  • 在“edit”视图的标签菜单中,将有一个条目用于翻译编辑内容。

如果您想为管理员定义一个默认区域设置,请配置“default_locale”。

umanit_translation:
  # ...
  default_locale: en

然后管理员将只显示“list”视图中的英文内容。

EasyAdmin 4

  • 让您的控制器继承 EasyAdmin 中的“AbstractCrudController”而不是“AbstractTranslatableCRUDController”。这将
    • 在索引视图中添加“TUUID”和“locale”作为列,以及用链接替换编辑操作,以便翻译到或编辑特定区域设置
    • 在编辑视图中添加一个带有链接到其他区域设置的翻译下拉菜单(已翻译或未翻译)

该组件不会自动应用过滤器,仅显示默认区域设置(如果存在)中已翻译的对象。然而,过滤器已激活,可以手动触发以显示所需区域设置的现有对象。

与 DoctrineSingletonBundle 集成

该组件将自动与 Doctrine Singleton Bundle 一起工作。如果您的单例实现了 TranslatableInterface,则可以按区域设置获取一个实例。