数据库内容多语言方案

场景:很多网站,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

方案四

全表文本都需要翻译的情况,增加语言类型字段

languagenamecontent
zh-CN名称内容
ennamecontent

全表只有几个文本字段的情况,增加语言翻译扩展表

场景:扩展表设计适合,多语种,长文本存储

主表结构存储,不需要翻译文本的字段,附表结构参考上表格,增加关联id

laravel ORM增加语言支持 扩展包 Astrotomic/laravel-translatable 使用该方式实现 文档地址

参考

如何为 Eloquent 添加多语言支持

网址多语言设计

 MySQL TEXT 字段的限制