全球化架构
时间:2020-03-05 18:43:25 来源:igfitidea点击:
我需要将电子商务解决方案的产品存储在数据库中。每个产品都应具有描述性信息,例如名称,描述等。
我需要将任何产品本地化为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"];
有谁有更好的解决方案?
解决方案
回答
Rob Conery的MVC Storefront网络广播系列有一个有关此问题的视频(他在5:30左右进入数据库)。他存储文化列表,然后有一个用于非本地化数据的Product表和一个用于本地化文本的ProductCultureDetail表。
回答
资源文件
回答
我们应该将当前语言存储在某个位置(例如,以单例形式)和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; } }
回答
这基本上是我们使用Microsoft Commerce Server 2002所采用的方法。是的,索引视图将提高性能。