全球化架构

4
我需要在数据库中存储电子商务解决方案的产品。每个产品都应该有描述性信息,例如名称、描述等。
我需要将任何产品本地化到x种语言。
到目前为止,我所做的是使任何应该本地化的列为nvarchar(MAX),然后我存储像这样的XML字符串:
<cultures>
    <culture code="en-us">Super fast laptop</culture>
    <culture code="da-dk">Super hurtig bærbar</culture>
</cultures>

当我从数据库中加载数据到我的业务逻辑对象时,我会将XML字符串解析为一个Dictionary<string, string>,其中键是区域/语言代码。

因此,当我想要显示产品的名称时,我会这样做:

lblName.Text = product.Name["en-us"];

有没有更好的解决方案?

4个回答

2
你应该将当前语言存储在某个地方(例如单例中),并且在 product.Name 属性中使用语言设置来获取正确的字符串。这样,你只需要为每个字段编写一次特定于语言的代码,而不必在使用该字段的任何地方都考虑语言。
例如,假设你的单例是定义在 Localizer 类中的,它存储一个与当前语言对应的枚举:
public class Product
{
  private idType id;
  public string Name
  {
    get
    {
      return Localizer.Instance.GetLocalString(id, "Name");
    }
  }
}

GetLocalString大致如下:
  public string GetLocalString(idType objectId, string fieldName)
  {
    switch (_currentLanguage)
    {
      case Language.English:
        // db access code to retrieve your string, may need to include the table
        // the object is in (e.g. "Products" "Orders" etc.)
        db.GetValue(objectId, fieldName, "en-us");
        break;
    }
  }

1

Rob Conery的MVC Storefront Webcast系列涉及此问题的视频(他在5:30左右开始介绍数据库)。他存储了一组文化,并且有一个Product表用于非本地化数据和一个ProductCultureDetail表用于本地化文本。


将“Culture”保留在表名中是个好主意,这样可以区分表的内容为本地化数据而不是其他内容。 - y0mbo

1

资源文件


最佳解决方案,最糟糕的答案 :) - Ropstah

0

这基本上是我们在 Microsoft Commerce Server 2002 中采取的方法。是的,索引视图将有助于提高性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接