NopCommerce架构分析之八------多语言
系统支持的语言是有类:Language表示;
多语言资源对应的类为:LocalizedProperty;
当先选择某种语言存储在类中:GenericAttribute;
多语言可以导出为XML文件,当然也支持导出。
IWorkContext及其实体类WebWorkContext为当前运行上下文;用户的登录信息以及一些上下文环境设置都保存在此类中。
具体包括:当前用户信息:CurrentCustomer;当前用户Cookie;货币;语言;税的类型;供应商等;
展现多语言资源的方式有几种:
一、在自定义类WebViewPage<TModel>中放置了方法:T(),通过此方法,网页在展现时获取对应语言的文字。
其实T只是一个代理,代理的定义为:
- namespace Nop.Web.Framework.Localization
- {
- public delegate LocalizedString Localizer(string text, params object[] args);
- }
此代理返回值类型为LocalizedString,此类继承接口IHtmlString,以保证能正确显示本地化的文字资源。
IHtmlString的定义为:
- // 摘要:
- // 表示不应再次进行编码的 HTML 编码的字符串。
- public interface IHtmlString
- {
- // 摘要:
- // 返回 HTML 编码的字符串。
- //
- // 返回结果:
- // HTML 编码的字符串。
- string ToHtmlString();
- }
二、通过扩展HtmlHelper
类HtmlExtensions扩展了HtmlHelper类,
主要是对一些控件的封装,并支持多语言。
方法 LocalizedEditor<T, TLocalizedModelLocal>是对Telerik的TabStrip控件的封装(也就是多页签控件---Tab控件),的。系统同时支持有多种语言时,多为每种语言显示一个页签,当然仅当需要时才这么做。这里面用到了接口ILocalizedModel和接口ILocalizedModelLocal。接口ILocalizedModel用来标示某Model类支持这种多语言显示,其中里面包括多种语言数据列表Locales,实现接口ILocalizedModelLocal的类就是特定一种语言的数据。LocalizedEditor方法就是根据这些接口的配合实现了支持多种语言页签了。Admin项目使用此方法,Web项目没有使用。
- public static HelperResult LocalizedEditor<T, TLocalizedModelLocal>(this HtmlHelper<T> helper, string name,
- Func<int, HelperResult> localizedTemplate,
- Func<T, HelperResult> standardTemplate)
- where T : ILocalizedModel<TLocalizedModelLocal>
- where TLocalizedModelLocal : ILocalizedModelLocal
- {
- return new HelperResult(writer =>
- {
- if (helper.ViewData.Model.Locales.Count > 1)
- {
- var tabStrip = helper.Telerik().TabStrip().Name(name).Items(x =>
- {
- x.Add().Text("Standard").Content(standardTemplate(helper.ViewData.Model).ToHtmlString()).Selected(true);
- for (int i = 0; i < helper.ViewData.Model.Locales.Count; i++)
- {
- var locale = helper.ViewData.Model.Locales[i];
- var language = EngineContext.Current.Resolve<ILanguageService>().GetLanguageById(locale.LanguageId);
- x.Add().Text(language.Name)
- .Content(localizedTemplate
- (i).
- ToHtmlString
- ())
- .ImageUrl("~/Content/images/flags/" + language.FlagImageFileName);
- }
- }).ToHtmlString();
- writer.Write(tabStrip);
- }
- else
- {
- standardTemplate(helper.ViewData.Model).WriteTo(writer);
- }
- });
- }
扩展方法NopLabelFor<TModel, TValue>是另外一种多语言实现方式。
此方法主要是根据特性DisplayNameAttribute的子类NopResourceDisplayName实现对属性名称的描述。此特性是对Model属性的修饰,以指定属性的名称。
例如类AddNewsCommentModel的属性用NopResourceDisplayName特性指定:
- namespace Nop.Web.Models.News
- {
- public partial class AddNewsCommentModel : BaseNopModel
- {
- [NopResourceDisplayName("News.Comments.CommentTitle")]
- [AllowHtml]
- public string CommentTitle { get; set; }
- [NopResourceDisplayName("News.Comments.CommentText")]
- [AllowHtml]
- public string CommentText { get; set; }
- public bool DisplayCaptcha { get; set; }
- }
- }
HtmlHelper的扩展方法NopLabelFor的实现如下:
- public static MvcHtmlString NopLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, bool displayHint = true)
- {
- var result = new StringBuilder();
- var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
- var hintResource = string.Empty;
- object value = null;
- if (metadata.AdditionalValues.TryGetValue("NopResourceDisplayName", out value))
- {
- var resourceDisplayName = value as NopResourceDisplayName;
- if (resourceDisplayName != null && displayHint)
- {
- var langId = EngineContext.Current.Resolve<IWorkContext>().WorkingLanguage.Id;
- hintResource =
- EngineContext.Current.Resolve<ILocalizationService>()
- .GetResource(resourceDisplayName.ResourceKey + ".Hint", langId);
- result.Append(helper.Hint(hintResource).ToHtmlString());
- }
- }
- result.Append(helper.LabelFor(expression, new { title = hintResource }));
- return MvcHtmlString.Create(result.ToString());
- }
NopCommerce架构分析之八------多语言相关推荐
- NopCommerce架构分析-依赖注入
先说ASP.NET Core的运行原理 在Nop.Web中有一个Startup.cs文件,对ASP.NET Core程序而言,Startup.cs是必须的.ASP.NET Core在程序启动时会从as ...
- SAP UI5 初学者教程之八 - 多语言的支持试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...
- android摄像头框架,FS_S5PC100平台上Android Camera架构分析
1. Android-Camera架构分析 Android的camera系统架构自上而下分别为应用层-框架层-硬件抽象层-linux驱动层.层与层之间通过Binder.回调函数或者系统调用联系. 我们 ...
- Log4j2架构分析与实战
为什么80%的码农都做不了架构师?>>> 1 系列目录 2种日志接口框架,4种日志实现框架 jdk-logging.log4j.logback日志介绍及原理 jcl与jul.l ...
- SLG手游Java服务器的设计与开发——架构分析
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- 从上到下的系统架构分析方法 - Intel PMU
来源:内核月谈 layout: Top-down Microarchitecture Analysis Method 原文链接 1,https://www.intel.com/content/dam/ ...
- 微服务架构通讯模式架构分析
微服务架构通讯模式架构分析) 目录 概 述 小结 参考资料和推荐阅读 LD is tigger forever,CG are not brothers forever, throw the pot a ...
- b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释
b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释 我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括w ...
- b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释
b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释 继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更 ...
最新文章
- 基于TransformerFusion的单目场景重构
- echop红包发放规则添加
- 除了Postman之外,居然还有个Postwoman...
- 缩小数据文件尺寸报ORA-03297的处理办法
- 伺服电机常用参数设置_6个步骤教你如何快速调试伺服电机
- (一)初识java ---我的第一个java程序
- leetcode 493. 翻转对(分治算法)
- 【转载保存】cookie在登录时的使用
- oracle 10g rac 包root.sh报错,案例:Oracle Rac root.sh报错 Failed to create keys in the OLR
- bootstrap 复选框及单选按钮
- 修改高通IPQ4019/4018的flash的分区
- 计算机啊如何进入代码编写界面,一段程序代码写完以后是如何转换成有操作界面的软件的?...
- 检错纠错码(奇偶校验码 CRC循环冗余校验码 海明码)
- 91地图坐标系矫正教程
- 听说昨天朋友圈炸开了锅???
- 狗狗自带餐具能有多可爱
- web前端开发面试都喜欢问什么
- 数据分析案例-基于PCA主成分分析法对葡萄酒数据进行分析
- C语言——对文件的输入输出
- directx 9.0c sdk api介绍
热门文章
- Could not load file or assembly 'System.Web.Extensions
- View4.5测试参考文档7--View Administrator安装、配置、创建桌面池
- 数学建模入门例题python_[Python与数学建模-入门使用]-2Python基础知识
- iOS进阶之底层原理-isa与对象
- 人机接口设备攻击(HID Attack)
- php 5.2.17 mysql_Apache 2.2.15 整合php 5.2.17 Mysql-5.5.8
- java redis多主多备_java 集成Redis 一主多从
- ajax results,jQuery Ajax results in undefined
- 初步探索创伤性脑损伤后平衡功能障碍的神经机制
- 脑机接口成唯一沟通方式,渐冻症晚期父亲终向4岁儿子表达爱意