我有一个ASP.Net网站,它使用MySQL数据库作为后端。该网站是一个英语电子商务系统,我们正在研究将其翻译成其他五种语言(法语,西班牙语等)的可能性。我们将让人工翻译人员进行翻译 - 我们已经看过自动化服务,但这些服务还不够好。
网站上的静态文本(例如标题,按钮等)可以通过.Net的内置本地化功能(resx文件等)以多种语言轻松提供。
我不太确定如何最好地存储和检索数据库中的多语言内容。例如,有一个包含这些字段的产品表......
标题,摘要,说明和功能文本需要以所有不同语言提供。
以下是我提出的两个选项......
为每种语言创建附加字段 例如,我们可以为所有语言提供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语句。当然,与之前的选项相比,将来添加新语言非常简单。
我非常感谢有关实现这一目标的最佳方法的任何建议!那里有“最佳实践”指导吗?有人曾经这样做过吗?
答案 0 :(得分: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表中没有当前lang的记录)
答案 1 :(得分:2)
仅将新列添加到现有表中并不是一个好主意。在该功能中添加新语言真的很难。查找表要好得多,但我认为你的性能有问题,因为翻译记录的数量。
我认为最好的解决方案是拥有一个共享表:
products: id, categoryid,
和每种语言的相同表格
products_en, products_de: product_id (fk), title, price, description, ...
您只需从共享表中选择并使用您的语言连接表。优点是您可以本地化甚至价格,类别......