前言
这段时间在研究多语言的实现,就找了NopCommerce这个开源项目来研究了一下,并把自己对这个项目的粗浅认识与大家分享一下。
挺碰巧的是昨天收到了NopCommerce 3.90 发布测试版的邮件:
不啰嗦了,开始正题了!
其实对于Nop的多语言,最主要的元素有下面两个:
WebWorkContext(IWorkContext的实现类)
LocalizationService(ILocalizationService的实现类)
其他相关的元素可以说都是在这两个的基础上体现价值的。
下面先来介绍一下WebWorkContext的WorkingLanguage属性,这个是贯穿整个应用的,所以必须要先从这个讲起。
WorkingLanguage
WebWorkContext中对多语言来说最为重要的一个属性就是WorkingLanguage,它决定了我们当前浏览页面所采用的是那种语言。
每次打开一个页面,包括切换语言时,都是读取这个WorkingLanguage的值。当然在读的时候,也做了不少操作:
从当前上下文中的_cachedLanguage变量是否有值,有就直接读取了这个值。
从GenericAttribute表中查询当前用户的语言ID,这张表中的字段Key对应的值是LanguageId时,就表明是某个用户当前正在使用的语言ID。
从Language表中查询出语言信息(当前店铺->当前店铺默认->当前店铺的第一个->所有语言的第一个)
查询语言表时,首先查出店铺支持的所有语言,然后找到当前用户正在使用的语言ID,根据这两个条件组合得到的Language实体就是当前的WorkingLanguage。
如果说这两个条件的组合拿不到相应的语言实体,就会根据当前Store的默认语言ID(如下图所示)去找。