翻译动态内容的设计模式?

时间:2014-10-09 07:06:04

标签: serialization localization internationalization

我想存储用户提供的内容的翻译。

我见过一些应用程序在每个语言环境中存储单独的翻译记录,但是 我想通过序列化翻译将所有翻译存储在记录中,我的意思是

$post_title=serialize(['en_US'=>$enUS['title'], 'fr_FR'=>$frFR['title']]);
$post_content=serialize(['en_US'=>$enUS['conttent'], 'fr_FR'=>$frFR['conttent']);


$sql="INSERT INTO `posts` (`title`, `content`) VALUES(:post_title, :post_content)"

这是一种不好的做法吗?

1 个答案:

答案 0 :(得分:1)

假设(从您的INSERT查询中)您正在使用关系数据库,它可能被认为是一种不好的做法,因为:

  • 时间和内存开销:要以任何语言加载帖子,您必须查询$post_title$post_content这些是所有语言的序列化数据因此,您的数据库查询结果将具有更大的内存占用。然后你必须反序列化字段以获得所需语言的内容,如果前端设计不需要它,这也意味着额外的周期和不必要的开销;即,您没有同时以所有可用语言显示帖子。

  • Concurrency :如果两位翻译人员将同一帖子的翻译更新为同时 ,该怎么办?

  • 打破不透明度:正如其中一条评论中所提到的,在这种情况下,序列化的另一个问题是破坏数据库接口提供的预期抽象和封装。在处理本地化数据时,这可能不是一个大问题,但如果您的DBMS为您提供列级权限,那么序列化一列中的所有内容将阻止您使用该功能。

  • 数据建模不一致:在这种情况下使用序列化,概念数据模型(具有多种语言的发布内容的网站)最终变得不连贯使用逻辑数据模型($post_content不是发布内容所需的语言)。简单地说,通过查看数据模型,我们不能说多语言网站会使用这些表格。

  • i18n问题:在一列中将各种语言混合为序列化值限制了对内容使用多种编码的可能性;例如在Shift-JIS中保留日语,在Latin1中保留德语,在UTF8中保留其他所有内容。此外,它还可以在不对数据进行反序列化的情况下更加难以检查mojibake或其他编码问题。

如果出现以下情况,可以认为这是一个很好的解决方法:

  • 一起显示所有语言:...您永远不会单独显示翻译,而且它们会一起显示或编辑。
  • 保留旧数据模型:...您希望将数据保持原有模型不变。人们不必改变现有的数据模型来为多语言内容让路。这有助于国际化遗留软件,而不会过多地干扰数据模型和处理数据库迁移。