系统支持的语言是有类:Language表示;

多语言资源对应的类为:LocalizedProperty;

当先选择某种语言存储在类中:GenericAttribute;

多语言可以导出为XML文件,当然也支持导出。

IWorkContext及其实体类WebWorkContext为当前运行上下文;用户的登录信息以及一些上下文环境设置都保存在此类中。

具体包括:当前用户信息:CurrentCustomer;当前用户Cookie;货币;语言;税的类型;供应商等;

展现多语言资源的方式有几种:

一、在自定义类WebViewPage<TModel>中放置了方法:T(),通过此方法,网页在展现时获取对应语言的文字。

其实T只是一个代理,代理的定义为:

[csharp] view plain copy
  1. namespace Nop.Web.Framework.Localization
  2. {
  3. public delegate LocalizedString Localizer(string text, params object[] args);
  4. }

此代理返回值类型为LocalizedString,此类继承接口IHtmlString,以保证能正确显示本地化的文字资源。

IHtmlString的定义为:

[csharp] view plain copy
  1. // 摘要:
  2. //     表示不应再次进行编码的 HTML 编码的字符串。
  3. public interface IHtmlString
  4. {
  5. // 摘要:
  6. //     返回 HTML 编码的字符串。
  7. //
  8. // 返回结果:
  9. //     HTML 编码的字符串。
  10. string ToHtmlString();
  11. }

二、通过扩展HtmlHelper

类HtmlExtensions扩展了HtmlHelper类,

主要是对一些控件的封装,并支持多语言。

方法 LocalizedEditor<T, TLocalizedModelLocal>是对Telerik的TabStrip控件的封装(也就是多页签控件---Tab控件),的。系统同时支持有多种语言时,多为每种语言显示一个页签,当然仅当需要时才这么做。这里面用到了接口ILocalizedModel和接口ILocalizedModelLocal。接口ILocalizedModel用来标示某Model类支持这种多语言显示,其中里面包括多种语言数据列表Locales,实现接口ILocalizedModelLocal的类就是特定一种语言的数据。LocalizedEditor方法就是根据这些接口的配合实现了支持多种语言页签了。Admin项目使用此方法,Web项目没有使用。

[csharp] view plain copy
  1. public static HelperResult LocalizedEditor<T, TLocalizedModelLocal>(this HtmlHelper<T> helper, string name,
  2. Func<int, HelperResult> localizedTemplate,
  3. Func<T, HelperResult> standardTemplate)
  4. where T : ILocalizedModel<TLocalizedModelLocal>
  5. where TLocalizedModelLocal : ILocalizedModelLocal
  6. {
  7. return new HelperResult(writer =>
  8. {
  9. if (helper.ViewData.Model.Locales.Count > 1)
  10. {
  11. var tabStrip = helper.Telerik().TabStrip().Name(name).Items(x =>
  12. {
  13. x.Add().Text("Standard").Content(standardTemplate(helper.ViewData.Model).ToHtmlString()).Selected(true);
  14. for (int i = 0; i < helper.ViewData.Model.Locales.Count; i++)
  15. {
  16. var locale = helper.ViewData.Model.Locales[i];
  17. var language = EngineContext.Current.Resolve<ILanguageService>().GetLanguageById(locale.LanguageId);
  18. x.Add().Text(language.Name)
  19. .Content(localizedTemplate
  20. (i).
  21. ToHtmlString
  22. ())
  23. .ImageUrl("~/Content/images/flags/" + language.FlagImageFileName);
  24. }
  25. }).ToHtmlString();
  26. writer.Write(tabStrip);
  27. }
  28. else
  29. {
  30. standardTemplate(helper.ViewData.Model).WriteTo(writer);
  31. }
  32. });
  33. }

扩展方法NopLabelFor<TModel, TValue>是另外一种多语言实现方式。

此方法主要是根据特性DisplayNameAttribute的子类NopResourceDisplayName实现对属性名称的描述。此特性是对Model属性的修饰,以指定属性的名称。

例如类AddNewsCommentModel的属性用NopResourceDisplayName特性指定:

[csharp] view plain copy
  1. namespace Nop.Web.Models.News
  2. {
  3. public partial class AddNewsCommentModel : BaseNopModel
  4. {
  5. [NopResourceDisplayName("News.Comments.CommentTitle")]
  6. [AllowHtml]
  7. public string CommentTitle { get; set; }
  8. [NopResourceDisplayName("News.Comments.CommentText")]
  9. [AllowHtml]
  10. public string CommentText { get; set; }
  11. public bool DisplayCaptcha { get; set; }
  12. }
  13. }

HtmlHelper的扩展方法NopLabelFor的实现如下:

[csharp] view plain copy
  1. public static MvcHtmlString NopLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, bool displayHint = true)
  2. {
  3. var result = new StringBuilder();
  4. var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
  5. var hintResource = string.Empty;
  6. object value = null;
  7. if (metadata.AdditionalValues.TryGetValue("NopResourceDisplayName", out value))
  8. {
  9. var resourceDisplayName = value as NopResourceDisplayName;
  10. if (resourceDisplayName != null && displayHint)
  11. {
  12. var langId = EngineContext.Current.Resolve<IWorkContext>().WorkingLanguage.Id;
  13. hintResource =
  14. EngineContext.Current.Resolve<ILocalizationService>()
  15. .GetResource(resourceDisplayName.ResourceKey + ".Hint", langId);
  16. result.Append(helper.Hint(hintResource).ToHtmlString());
  17. }
  18. }
  19. result.Append(helper.LabelFor(expression, new { title = hintResource }));
  20. return MvcHtmlString.Create(result.ToString());
  21. }

NopCommerce架构分析之八------多语言相关推荐

  1. NopCommerce架构分析-依赖注入

    先说ASP.NET Core的运行原理 在Nop.Web中有一个Startup.cs文件,对ASP.NET Core程序而言,Startup.cs是必须的.ASP.NET Core在程序启动时会从as ...

  2. SAP UI5 初学者教程之八 - 多语言的支持试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  3. android摄像头框架,FS_S5PC100平台上Android Camera架构分析

    1. Android-Camera架构分析 Android的camera系统架构自上而下分别为应用层-框架层-硬件抽象层-linux驱动层.层与层之间通过Binder.回调函数或者系统调用联系. 我们 ...

  4. Log4j2架构分析与实战

    为什么80%的码农都做不了架构师?>>>    1 系列目录 2种日志接口框架,4种日志实现框架 jdk-logging.log4j.logback日志介绍及原理 jcl与jul.l ...

  5. SLG手游Java服务器的设计与开发——架构分析

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  6. 从上到下的系统架构分析方法 - Intel PMU

    来源:内核月谈 layout: Top-down Microarchitecture Analysis Method 原文链接 1,https://www.intel.com/content/dam/ ...

  7. 微服务架构通讯模式架构分析

    微服务架构通讯模式架构分析) 目录 概 述 小结 参考资料和推荐阅读 LD is tigger forever,CG are not brothers forever, throw the pot a ...

  8. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释

    b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释 我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括w ...

  9. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释 继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更 ...

最新文章

  1. 基于TransformerFusion的单目场景重构
  2. echop红包发放规则添加
  3. 除了Postman之外,居然还有个Postwoman...
  4. 缩小数据文件尺寸报ORA-03297的处理办法
  5. 伺服电机常用参数设置_6个步骤教你如何快速调试伺服电机
  6. (一)初识java ---我的第一个java程序
  7. leetcode 493. 翻转对(分治算法)
  8. 【转载保存】cookie在登录时的使用
  9. oracle 10g rac 包root.sh报错,案例:Oracle Rac root.sh报错 Failed to create keys in the OLR
  10. bootstrap 复选框及单选按钮
  11. 修改高通IPQ4019/4018的flash的分区
  12. 计算机啊如何进入代码编写界面,一段程序代码写完以后是如何转换成有操作界面的软件的?...
  13. 检错纠错码(奇偶校验码 CRC循环冗余校验码 海明码)
  14. 91地图坐标系矫正教程
  15. 听说昨天朋友圈炸开了锅???
  16. 狗狗自带餐具能有多可爱
  17. web前端开发面试都喜欢问什么
  18. 数据分析案例-基于PCA主成分分析法对葡萄酒数据进行分析
  19. C语言——对文件的输入输出
  20. directx 9.0c sdk api介绍

热门文章

  1. Could not load file or assembly 'System.Web.Extensions
  2. View4.5测试参考文档7--View Administrator安装、配置、创建桌面池
  3. 数学建模入门例题python_[Python与数学建模-入门使用]-2Python基础知识
  4. iOS进阶之底层原理-isa与对象
  5. 人机接口设备攻击(HID Attack)
  6. php 5.2.17 mysql_Apache 2.2.15 整合php 5.2.17 Mysql-5.5.8
  7. java redis多主多备_java 集成Redis 一主多从
  8. ajax results,jQuery Ajax results in undefined
  9. 初步探索创伤性脑损伤后平衡功能障碍的神经机制
  10. 脑机接口成唯一沟通方式,渐冻症晚期父亲终向4岁儿子表达爱意