【问题标题】:ASP.Net / MySQL : Translating content into several languagesASP.Net / MySQL:将内容翻译成多种语言
【发布时间】:2010-11-29 02:58:54
【问题描述】:

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

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

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

  • productId (int)
  • categoryId (int)
  • 标题(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 语句的情况下将这些数据从数据库中取出并放到页面上。当然,与以前的选项相比,将来添加新语言会非常简单。

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

【问题讨论】:

    标签: asp.net mysql localization translation multilingual


    【解决方案1】:

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

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

    products: id, categoryid, 
    

    每种语言都有相同的表格

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

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

    【讨论】:

    • 我不确定这是否比添加其他列好得多?大约有 20 个表格需要翻译,所以这将增加到大约 120 个表格,包含五种语言。
    • 感谢您的建议,我并不是忘恩负义,我只是确定这不是最好的解决方案。
    • 没关系。我认为没有“最佳解决方案”。一切都有一些优点/缺点。在这里,您将获得比查找解决方案更好的性能。如果您需要更多的表列并且您不会有很多记录,则查找解决方案很好。表的数量不是问题,您可以有一个脚本,它将为每个表添加新列。如果您将有 20 个可翻译列和 1m 条记录,则查找速度会很慢。但是使用它并没有错。
    【解决方案2】:

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

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

    【讨论】:

    • 好主意,我认为这会很好。非常感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多