ASP.NET/MySQL:将内容翻译成多种语言
-
08-07-2019 - |
题
我有一个 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, ...
您只需从共享的表格中进行选择,然后使用您的语言加入表格即可。优点是您甚至可以本地化价格、类别……