基于Doctrine 2可翻译扩展的多语言描述规整与校验需求
多语言描述数据规整方案(基于Doctrine Translatable扩展)
依赖与实体定义
使用Translatable behavior extension for Doctrine 2实现多语言字段管理,核心实体类代码如下:
class Fiche { #[ORM\Id] #[ORM\GeneratedValue(strategy: 'IDENTITY')] #[ORM\Column] private ?int $id = null; /** * Used locale to override Translation listener`s locale * this is not a mapped field of entity metadata, just a simple property */ #[Gedmo\Locale] private $locale; #[ORM\Column(type: Types::TEXT, nullable: true)] #[Gedmo\Translatable] private ?string $descriptionCourte = null; #[ORM\Column(type: Types::TEXT, nullable: true)] #[Gedmo\Translatable] private ?string $descriptionLongue = null; // 其他属性与方法 }
现存数据问题
当前待处理的6个对象存在以下描述数据不规整问题:
- 描述缺失:存在仅短描述、仅长描述、两者都有或都无的情况
- 内容重复:短描述移除末尾可能存在的
...后,与长描述内容完全重复 - 翻译覆盖不全:短描述前200字符与长描述一致,但短描述拥有长描述未覆盖的语言翻译
规整目标
- 保留最多有效信息(优先保留长描述)
- 长描述无对应语言翻译时,复用短描述的对应翻译
- 法语(fr)描述存储到
file表对应字段,其他语言翻译存入ext_translations表
具体处理逻辑
1. 描述缺失场景处理
- 两者都无:保持原状态
- 仅存短描述:将短描述内容同步至长描述,短描述可保留原内容(作为精简展示用)
- 仅存长描述:短描述保持空值(避免无意义的重复截取)
2. 内容重复场景处理
- 若短描述移除末尾
...后与长描述完全一致:将短描述置空,仅保留长描述 - 若短描述与长描述内容存在差异(含翻译版本差异):保留两者内容
3. 翻译覆盖不全场景处理
- 保留长描述的所有现有语言翻译
- 遍历短描述的所有语言翻译,若长描述无对应语言的翻译,将短描述的该翻译赋值给长描述
- 短描述若仅为长描述的前200字符,可置空以避免SEO重复;若短描述有独特内容,则保留
数据库存储规则
- 法语(fr)的
descriptionCourte和descriptionLongue直接写入file表的对应字段 - 非法语的翻译内容,通过Doctrine Translatable扩展自动存入
ext_translations表,对应translatable_type为Fiche,translatable_field为对应描述字段名
内容的提问来源于stack exchange,提问作者Camel4488
相关产品推荐
相关产品推荐

