Su"/>

关于C#:全球化架构

关于C#:全球化架构

Globalization architecture

我需要将电子商务解决方案的产品存储在数据库中。 每个产品应具有描述性信息,例如名称,描述等。

我需要将任何产品本地化为x种语言。

到目前为止,我所做的是使任何应本地化的列和nvarchar(MAX),然后我存储一个XML字符串,如下所示:

1
2
3
4
<cultures>
    <culture code="en-us">Super fast laptop</culture>
    <culture code="da-dk">Super hurtig b?rbar</culture>
</cultures>

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

因此,当我想显示产品名称时,请执行以下操作:

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

有谁有更好的解决方案?


您应该将当前语言存储在某个位置(例如,以单例形式)和product中。Name属性使用语言设置来获取正确的字符串。 这样,您只需要为每个字段编写一次特定于语言的代码,而不必考虑使用该字段的任何地方的语言。

例如,假设您的单例是在Localizer类中定义的,该类存储与当前语言相对应的枚举:

1
2
3
4
5
6
7
8
9
10
11
public class Product
{
  private idType id;
  public string Name
  {
    get
    {
      return Localizer.Instance.GetLocalString(id,"Name");
    }
  }
}

GetLocalString看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
  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;
    }
  }

资源文件


Rob Conery的MVC Storefront网络广播系列有一个有关此问题的视频(他在5:30左右进入数据库)。 他存储文化列表,然后有一个用于非本地化数据的Product表和一个用于本地化文本的ProductCultureDetail表。


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


推荐阅读