【问题标题】:Globalization architecture全球化架构
【发布时间】:2010-09-06 21:55:51
【问题描述】:

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

我需要将任何产品本地化为 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&lt;string, string&gt;,其中的关键是文化/语言代码。

所以当我想显示产品名称时,我会这样做:

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

谁有更好的解决方案?

【问题讨论】:

    标签: c# architecture localization globalization


    【解决方案1】:

    您应该将当前语言存储在某处(例如,在 singleton 中)并在 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;
        }
      }
    

    【讨论】:

      【解决方案2】:

      Rob Conery 的 MVC Storefront 网络广播系列有 a video on this issue(他在 5:30 左右到达数据库)。他存储了一个文化列表,然后有一个用于非本地化数据的 Product 表和一个用于本地化文本的 ProductCultureDetail 表。

      【讨论】:

      • 最好在表名中保留“文化”,以便将表的内容区分为本地化数据而不是其他数据。
      【解决方案3】:

      资源文件

      【讨论】:

      • 最好的解决方案,最差的答案:)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 2010-11-18
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多