C# 全球化架构

C# 全球化架构,c#,architecture,localization,globalization,C#,Architecture,Localization,Globalization,我需要将电子商务解决方案的产品存储在数据库中。每个产品都应该有描述性信息,如名称、说明等 我需要将任何产品本地化为x多种语言 到目前为止,我所做的是制作任何应该本地化的列,并nvarchar(MAX),然后存储如下XML字符串: <cultures> <culture code="en-us">Super fast laptop</culture> <culture code="da-dk">Super hurtig bærbar&

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

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

到目前为止,我所做的是制作任何应该本地化的列,并
nvarchar(MAX)
,然后存储如下XML字符串:

<cultures>
    <culture code="en-us">Super fast laptop</culture>
    <culture code="da-dk">Super hurtig bærbar</culture>
</cultures>

有谁有更好的解决方案吗?

Rob Connery的MVC店面网络广播系列(他在5:30左右访问数据库)。他存储一个区域性列表,然后有一个用于非本地化数据的Product表和一个用于本地化文本的ProductCultureDetail表。

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

例如,假设您的单例是在存储与当前语言对应的枚举的本地化器类中定义的:

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;
    }
  }

这基本上就是我们对MicrosoftCommerceServer2002采取的方法。是的,索引视图将有助于提高性能。

最好在表名中保留“区域性”,以便将表的内容区分为本地化数据而不是其他内容。最佳解决方案,最差答案:)
  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;
    }
  }