3

我有一个 ASP.Net 网站,它使用 MySQL 数据库作为后端。该网站是一个英文电子商务系统,我们正在研究将其翻译成大约五种其他语言(法语、西班牙语等)的可能性。我们将让人工翻译人员进行翻译——我们已经研究过自动化服务,但这些还不够好。

网站上的静态文本(例如标题、按钮等)可以通过.Net 的内置本地化功能(resx 文件等)轻松地以多种语言提供。

我不太确定如何最好地在数据库中存储和检索多语言内容。例如,有一个包含这些字段的产品表...

  • 产品 ID(整数)
  • 类别 ID(整数)
  • 标题(varchar)
  • 摘要(varchar)
  • 说明(文字)
  • 特征(文字)

标题、摘要、描述和功能文本需要以所有不同的语言提供。

这是我想出的两个选项...

为每种语言创建附加字段 例如,我们可以为所有语言设置 titleEn、titleFr、titleEs 等,并对所有文本列重复此操作。然后,我们将根据所选语言调整我们的代码以使用适当的字段。这感觉有点hacky,并且还会导致一些非常大的表。此外,如果我们想在将来添加其他语言,添加更多列将非常耗时。

使用查找表 我们可以创建一个具有以下格式的新表...

textId | languageId | content
-------------------------------
10     | EN         | Car
10     | FR         | Voiture
10     | ES         | Coche
11     | EN         | Bike
11     | FR         | Vélo

然后,我们将调整我们的产品表以引用标题、摘要、描述和功能的适当 textId,而不是将文本存储在产品表中。这看起来更优雅,但我想不出一种简单的方法来将这些数据从数据库中取出并放到页面上,而无需使用复杂的 SQL 语句。当然,与以前的选项相比,将来添加新语言会非常简单。

对于实现这一目标的最佳方法的任何建议,我将不胜感激!那里有任何“最佳实践”指导吗?有没有人这样做过?

4

2 回答 2

4

在您的情况下,我建议使用两个表:

Product
-------------------------------
ProductID  |  Price   |  Stock 
-------------------------------
10         |   10     |   15


ProductLoc
-----------------------------------------------
ProductID  | Lang   | Name      |  Description
-----------------------------------------------
 10        |  EN    | Bike      |  Excellent Bike 
 10        |  ES    | Bicicleta |  Excelente bici 

这样你就可以使用:

SELECT * FROM 
Product LEFT JOIN ProductLoc ON Product.ProductID = ProductLoc.ProductID 
                               AND ProductLoc.Lang = @CurrentLang

(左连接以防 ProductLoc 表中没有当前语言的记录)

于 2009-09-17T16:54:35.763 回答
2

仅向现有表添加新列并不是一个好主意。在功能中添加新语言真的很困难。查找表要好得多,但我认为由于翻译记录的数量,您可能会遇到性能问题。

我认为最好的解决方案是有一个共享表:

products: id, categoryid, 

每种语言都有相同的表格

products_en, products_de: product_id (fk), title, price, description, ...

您只需从共享的表格中选择并使用您的语言加入表格。优点是您甚至可以本地化价格、类别、...

于 2009-09-17T11:36:56.613 回答