定制 pms-nz/object-translation-bundle 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

pms-nz/object-translation-bundle

Composer 安装命令:

composer require pms-nz/object-translation-bundle

包简介

Translate entities using Doctrine listeners

README 文档

README

This bundle, based on symfonycasts\object-translation-bundle, provides a simple way to translate Doctrine entities in Symfony applications.

The major changes are:

  • The translations are done automatically through Doctrine event listeners. There is no need to use a translate method.
  • Translation fallbacks for a locale can be chained. For example 'es' -> 'it' -> 'en'.

Installation

Install the bundle via Composer:

composer require pms-nz/object-translation-bundle

Enable the bundle in your config/bundles.php file:

Note

This step is not required if you are using Symfony Flex.

return [
    // ...
    ObjectTranslationBundle::class => ['all' => true],
];

Create the translation entity in your app:

Note

You may give your class a name other than "Translation".

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use PmsNz\ObjectTranslationBundle\Model\AbstractTranslation;

#[ORM\Entity]
class Translation extends AbstractTranslation
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    public int $id;
}

Configure the entity in your config/packages/object_translation.yaml file:

Note

If your translation entity has another class name, use that.

pms-nz_object_translation:
    translation_class: App\Entity\Translation

Create and run the migration to add the translation table:

symfony console make:migration
symfony console doctrine:migrations:migrate

Marking Entities as Translatable

To mark an entity as translatable, use the Translatable attribute on the entity class and the TranslatableProperty attribute on the fields you want to translate.

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use PmsNz\ObjectTranslationBundle\Mapping\Translatable;
use PmsNz\ObjectTranslationBundle\Mapping\TranslatableProperty;

#[ORM\Entity]
#[Translatable('product')]
class Product
{
    // ...

    #[ORM\Column(type: 'string', length: 255)]
    #[TranslatableProperty]
    public string $name;

    #[ORM\Column(type: 'text')]
    #[TranslatableProperty]
    public string $description;
}

Usage

The translator listens to Doctrine events and automatically translates when a translatable entity is loaded.

Managing Translations

The database table that extends ĀbstractTranslation has the following structure:

  • id: Primary key (added by you)
  • object_type: The alias defined in the Translatable attribute (e.g., product)
  • object_id: The ID of the translated entity
  • locale: The locale of the translation (e.g., fr)
  • field: The entity property name being translated (e.g., description)
  • value: The translated value

Each row represents a single property translation for a specific entity in a specific locale.

You can manage these translations yourself but two console commands are provided to help:

object-translation:export

`` This command exports all entity translations, in your default locale, to a CSV file.

symfony console object-translation:export translations.csv

This will create a translations.csv file at the root of your project with the following structure:

type,id,field,value

You can then take this file to translation service for translation. Be sure to keep the type, id, and field columns intact. The value column is what needs to be translated into the desired language.

You may also add a --locale argument. In this case extra columns will be added according to the fallbacks for the value provided for the --locale argument.

For instance, if the fallbacks for the 'es' locale is as follows:

pms-nz_object_translation:
    translation_class: App\Entity\Translation
    fallbacks:
        es: [it, fr]

The column headers will be

type,id,field,value,en,fr,it,es

with the fr, it and es columns providing the translations given in the translation_class for the fr, it and es locales respectively.

Translation Caching

For performance, translations are cached. By default, they use your cache.app pool and have no expiration time. This can be configured:

pms-nz_object_translation:
    cache:
        pool: 'cache.object_translation' # a custom pool name
        ttl: 3600 # expire after one hour

Translation Tags

If your cache pool supports cache tagging, tags are added to the cache keys. Two keys are added:

  • object-translation: All translations are tagged with this key.
  • object-translation-{type}: Where {type} is the translatable alias (e.g., product).

You can invalidate these tags by using the cache:pool:invalidate-tags command:

# invalidate all object translation caches
symfony console cache:pool:invalidate-tags object-translation

# invalidate only the translation cache for "product" entities
symfony console cache:pool:invalidate-tags object-translation-product

Translation Fallback Chains

This logic allows you to support regional dialects or specific user groups without duplicating your entire translation library.

When using a base language (e.g., Spanish) across different groups, you can store only the unique variations rather than the entire language set. This is achieved by "chaining" the translation lookup:

  1. Specific Variant: The system first looks for the translation in the group-specific language (e.g., es-gp1).
  2. Next Language: If the translation is missing, it falls back to the next language (es) in the chain. This step is repeated until a translation is found.
  3. Default Value: If no translation is found in the chain, the system reverts to the global default language.

Example Chain: 'es-gp1' -> 'es' -> Default

pms-nz_object_translation:
    fallbacks:
        es-dl1: [es]
        es-gp1: [es-dl1, es]

Note that these fallbacks are indexed by the locale which begins the fallback chain.

Full Default Configuration

pms-nz_object_translation:

    # The class name of your Translation entity.
    translation_class:    ~ # Required, Example: App\Entity\Translation

    # Cache settings for object translations.
    cache:
        enabled:              true

        # The cache pool to use for storing object translations.
        pool:                 null

        # The time-to-live for cached translations, in seconds. null for no expiration.
        ttl:                  null

    # Fallbacks for object translations.
    fallbacks:

        # Prototype
        name:                 ~

pms-nz/object-translation-bundle 适用场景与选型建议

pms-nz/object-translation-bundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 10 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 01 月 01 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 pms-nz/object-translation-bundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 pms-nz/object-translation-bundle 我们能提供哪些服务?
定制开发 / 二次开发

基于 pms-nz/object-translation-bundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 10
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 28
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-01-01