场景:很多网站,app,等互联网应用,面向国际业务,需要支持多种语言。
方案一
调用第三方翻译API,如,百度翻译,谷歌翻译,有道翻译等等。在渲染页面或这响应接口之前调用api将内容翻译成目标语言,然后在展示。
缺点:依赖第三方服务,延迟高。
方案二
单表冗余字段设计,比如content字段,增加content_en content_fr …
适应于2个语种,字段少的情况。例如,只有content字段需要多语言,而且只有两种语种。
缺点:
- 导致单表字段超出数据库设计规范,字段数会翻倍。
- varchar和char类型 具有 65,535 字节的最大行大小限制,text字段也有容量限制
- 缺少扩展性,维护的时候还需要增加表字段
方案三
单字段存储json,字段类型设为longText ;
场景:适合短文本少量语种,一旦超出文本限制,就不适用了,例如:长篇富文本多语言支持这类需求。
laravel ORM增加语言支持 扩展包 spatie/laravel-translatable 使用json方式存储
需要对多语言字段内容,增加唯一性验证时,使用 codezero-be/laravel-unique-translation
方案四
全表文本都需要翻译的情况,增加语言类型字段
language | name | content |
zh-CN | 名称 | 内容 |
en | name | content |
全表只有几个文本字段的情况,增加语言翻译扩展表
场景:扩展表设计适合,多语种,长文本存储
主表结构存储,不需要翻译文本的字段,附表结构参考上表格,增加关联id
laravel ORM增加语言支持 扩展包 Astrotomic/laravel-translatable 使用该方式实现 文档地址
参考