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

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

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

  • 产品 ID(整数)
  • 类别ID (int)
  • 标题(varchar)
  • 摘要(varchar)
  • 描述(文字)
  • 特点(文字)

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

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

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

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

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

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

我将非常感谢任何关于实现这一目标的最佳方法的建议!是否有任何“最佳实践”指导?以前有人这样做过吗?

有帮助吗?

解决方案

对于您的情况,我建议使用两个表:

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 表中没有当前 lang 的记录)

其他提示

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

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

products: id, categoryid, 

每种语言都有相同的表格

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

您只需从共享的表格中进行选择,然后使用您的语言加入表格即可。优点是您甚至可以本地化价格、类别……

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top