php - 使用 mysql/PHP 进行本地化

标签 php mysql localization

我目前正在使用 PHP 和 MySQL 构建一个多语言网站,并且想知道关于我的数据模型的最佳本地化方法是什么。每个表都包含需要翻译成多种语言的字段(例如 namedescription....)。

第一个想法是为每种语言创建一个字段(例如 name_enname_dename_fr)并从 PHP 中检索适当的字段使用变量(例如 $entry['name_' . LANGUAGE])。虽然它可行,但我认为这种方法有很多缺点:
- 你需要每个字段出现的次数与你的语言一样多(记住你可以有 en-US、en-CA、en-GB...)
-如果你添加或删除语言,你需要相应地修改数据库结构
-如果您有未翻译的字段,它们仍然会为每个看起来不是很优化的条目创建

第二个想法是创建一个翻译表,可用于存储数据库中任何表的任何字段的翻译:

----------------
translation
----------------
id  INT
table_name VARCHAR
field_name VARCHAR
value VARCHAR
language_id VARCHAR

table_namefield_name 将允许识别翻译的是哪个表和哪个字段,而 language_id 将指示翻译的语言为了。这个想法是创建模型,根据用户选择的语言,将可翻译字段(例如 namedescription)的值替换为相应的翻译。

您能看出这种方法的缺点吗?您有什么建议要提出吗?

谢谢。

最佳答案

主要缺点是您通过将表名和字段名等元数据存储为应用程序数据来破坏关系模型。您的查询会太丑陋且无效。

另一个缺点是您只能使用一种数据类型的可翻译数据。您的表结构将定义

value VARCHAR(255)

这意味着您将始终在 VARCHAR(255) 中存储需要较小字段的数据。如果你想让它更通用来存储大文本,你需要定义它

value TEXT

更糟糕的是。

流行的模型如下。对于每个实体,您定义不依赖于语言的字段和依赖于语言的字段,并始终创建 2 个表。例如:

products
--------
id
price
status
picture

products_translations
--------
product_id
language_id
name VARCHAR(100)
description TEXT

这是正确的关系方法。当然,它也有缺点,主要是您总是会连接 2 个表来获取项目,并且添加/更新数据变得有点复杂。

关于php - 使用 mysql/PHP 进行本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7783302/

相关文章:

php - 如果日期早于日期则显示错误

php - 在 Postgres-DB 中存储/读取文件

mysql - sql查询只更新第一个匹配项

html - 如何从servlet重定向到新页面

localization - 为什么 msgmerge 将我的一些翻译标记为模糊?

ios - 特定价格等级的本地 App Store 货币是否可变?

xaml - 本地化 x :String

php - SF3 文件夹结构中的 DDD

php - 通过 PHP 将 CSV 导出到 MySQL

php - preg_replace : converting line breaks into paragraphs