在ABP官网http://www.aspnetboilerplate.com/创建一个Multi Page Web Application项目并打开,在Web项目下可以找到一个Controllers/LayoutController.cs,里面有代码如下:

  1. [ChildActionOnly]
  2. public PartialViewResult LanguageSelection()
  3. {
  4. var model = new LanguageSelectionViewModel
  5. {
  6. CurrentLanguage = _localizationManager.CurrentLanguage,
  7. Languages = _localizationManager.GetAllLanguages()
  8. };
  9.  
  10. return PartialView("_LanguageSelection", model);
  11. }

对,这段控制器代码对应于视图Views/Layout/_LanguageSelection.cshtml,用于页面右上角的语言切换:

控制器传给视图一个LanguageSelectionViewModel对象,用于展示当前默认使用的语言和下拉菜单中支持的语言。

观察上面的代码,就知道LanguageSelectionViewModel对象里的信息其实都是从LocalizationManager传递过来的。查看ABP的源码,信息的源头又可以追溯到ILocalizationConfiguration,原来,语言实际配置的代码放在Web项目的App_Start/某某WebModule.cs的PreInitialize方法里:

  1. public override void PreInitialize()
  2. {
  3. //Add/remove languages for your application
  4. Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true));
  5. Configuration.Localization.Languages.Add(new LanguageInfo("tr", "Türkçe", "famfamfam-flag-tr"));
  6. Configuration.Localization.Languages.Add(new LanguageInfo("zh-CN", "简体中文", "famfamfam-flag-cn"));
  7.  
  8. ...
  9. }

LanguageInfo构造函数的第三个参数为图标名,从_LanguageSelection视图可以看到:

  1. <li><a href="/AbpLocalization/ChangeCulture?cultureName=@(language.Name)&returnUrl=@(Request.Url)"><i class="@language.Icon"></i> @language.DisplayName</a></li>

原来在这里使用了一组famfamfam国旗图标,官网:http://www.famfamfam.com/lab/icons/flags/

查看Web项目下的Content/flags/famfamfam-flags.css可以看到对这些国旗图标的定义:

  1. [class^="famfamfam-flag"] {
  2. display: inline-block;
  3. width: 16px;
  4. height: 11px;
  5. line-height: 11px;
  6. /* vertical-align: text-top; */
  7. background-image: url("famfamfam-flags.png");
  8. background-position: 0 0;
  9. background-repeat: no-repeat;
  10. }
  11.  
  12. .famfamfam-flag-zw { background-position: 0px 0px; width: 16px; height: 11px; }
  13. .famfamfam-flag-zm { background-position: -16px 0px; width: 16px; height: 11px; }
  14. .famfamfam-flag-za { background-position: 0px -11px; width: 16px; height: 11px; }
  15. .famfamfam-flag-yt { background-position: -16px -11px; width: 16px; height: 11px; }
  16. .famfamfam-flag-ye { background-position: -32px 0px; width: 16px; height: 11px; }
  17. .famfamfam-flag-ws { background-position: -32px -11px; width: 16px; height: 11px; }
  18. .famfamfam-flag-wf { background-position: 0px -22px; width: 16px; height: 11px; }
  19. ...

图标文件:

当我们切换语言时,提交的链接大概是这样的:

http://localhost:61754/AbpLocalization/ChangeCulture?cultureName=en&returnUrl=http://localhost:61754/

问题是,ChangeCulture控制器在哪?

查看ABP源码,可以找到Abp.Web.Mvc.Controllers.Localization.AbpLocalizationController类:

  1. public class AbpLocalizationController : AbpController
  2. {
  3. [DisableAuditing]
  4. public virtual ActionResult ChangeCulture(string cultureName, string returnUrl = "")
  5. {
  6. if (!GlobalizationHelper.IsValidCultureCode(cultureName))
  7. {
  8. throw new AbpException("Unknown language: " + cultureName + ". It must be a valid culture!");
  9. }
  10.  
  11. Response.Cookies.Add(new HttpCookie("Abp.Localization.CultureName", cultureName) { Expires = Clock.Now.AddYears() });
  12.  
  13. if (Request.IsAjaxRequest())
  14. {
  15. return Json(new MvcAjaxResponse(), JsonRequestBehavior.AllowGet);
  16. }
  17.  
  18. if (!string.IsNullOrWhiteSpace(returnUrl))
  19. {
  20. return Redirect(returnUrl);
  21. }
  22.  
  23. return Redirect(Request.ApplicationPath);
  24. }
  25. }

一目了然,ABP把“当前所使用的语言”记录在cookies里了。

再回头翻查LocalizationManager类里定义的GetCurrentLanguage方法:

  1. private LanguageInfo GetCurrentLanguage()
  2. {
  3. if (_configuration.Languages.IsNullOrEmpty())
  4. {
  5. throw new AbpException("No language defined in this application. Define languages on startup configuration.");
  6. }
  7.  
  8. var currentCultureName = Thread.CurrentThread.CurrentUICulture.Name;
  9.  
  10. //Try to find exact match
  11. var currentLanguage = _configuration.Languages.FirstOrDefault(l => l.Name == currentCultureName);
  12. if (currentLanguage != null)
  13. {
  14. return currentLanguage;
  15. }
  16.  
  17. //Try to find best match
  18. currentLanguage = _configuration.Languages.FirstOrDefault(l => currentCultureName.StartsWith(l.Name));
  19. if (currentLanguage != null)
  20. {
  21. return currentLanguage;
  22. }
  23.  
  24. //Try to find default language
  25. currentLanguage = _configuration.Languages.FirstOrDefault(l => l.IsDefault);
  26. if (currentLanguage != null)
  27. {
  28. return currentLanguage;
  29. }
  30.  
  31. //Get first one
  32. return _configuration.Languages[];
  33. }

上面代码并没发现读取cookies的操作,再翻到ABP源码的Abp.Web.AbpWebApplication类,原来放到了Application_BeginRequest方法里读取:

  1. protected virtual void Application_BeginRequest(object sender, EventArgs e)
  2. {
  3. var langCookie = Request.Cookies["Abp.Localization.CultureName"];
  4. if (langCookie != null && GlobalizationHelper.IsValidCultureCode(langCookie.Value))
  5. {
  6. Thread.CurrentThread.CurrentCulture = new CultureInfo(langCookie.Value);
  7. Thread.CurrentThread.CurrentUICulture = new CultureInfo(langCookie.Value);
  8. }
  9. }

ABP的语言切换的更多相关文章

  1. ASP.NET MVC5多语言切换快速实现方案

    功能 实现动态切换语言,Demo做了三种语言库可以切换,包括资源文件的定义,实体对象属性设置,后台代码Controller,IAuthorizationFilter,HtmlHelper的实现,做法比 ...

  2. DataGrid 列头实现国际化语言切换

    <DataGrid> <DataGrid.Columns> <DataGridTextColumn Binding="{x:Null}" Width= ...

  3. Android app应用多语言切换功能实现

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...

  4. iOS 语言切换、本地化,国际化

    什么是本地化处理? 本地化处理就是我们的应用程序有可能发布到世界的很多国家去,因为每个国家应用的语言是不一样的,所以我们要把我们的应用程序的语言要进行本地化处理一下. 本地化处理需要处理那些文件? ( ...

  5. 【转】Android 语言切换过程分析

    最近在看一个bug,系统切换语言后,本来退到后台的音乐,会在通知栏上显示通知.为了解决这个bug,我学习了下android的语言切换流程,也参考了大量其他人的资料.(主要参考了http://blog. ...

  6. android 语言切换过程分析

    android 语言切换过程分析 2014-02-27 18:13 1207人阅读 评论(0) 收藏 举报 语言切换android语言切换android改变语言 最近在看一个bug,系统切换语言后,本 ...

  7. QT实现多语言切换

    功能需求: 网盘客户端要能够实现多国语言的切换,第一版要支持中.英文的切换.在实现过程中感觉QT对多国语言的支持还是很不错的,制作多语言包很方便,切换的逻辑也很简单.下面就来看一下QT中如何制作多语言 ...

  8. Android 应用内多语言切换

    最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果用户在 App 内进行了语言设置,那么就使用用户设置的语言.当然,你会发现,App 的 ...

  9. bootstrap table 插件多语言切换

    在bootstrap中的bootstrap table 插件在多语言切换的审核,只需要如下操作 引入bootstrap-table-locale-all.js文件 $('#Grid').bootstr ...

随机推荐

  1. Android中editText使用报错

    在activity_main.xml文件中添加了editText控件 <EditText        android:id="@+id/edit_text"        ...

  2. 关键字sizeof---常年被人误认为函数

    sizeof 是关键字不是函数, sample: int  i=0; A)  sizeof(int);  B) sizeof(i);  C)sizeof  int;   D)sizeof  i; C) ...

  3. Java基础常见英语词汇

    Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的                             ['prəʊɡræmɪŋ]编程 OO: object ...

  4. 为eclipse添加tomcat插件(eclipse tomcat plugin)

    打开站点:http://marketplace.eclipse.org/content/eclipse-tomcat-plugin 把Install拖到打开的eclipse的工作区中,即可下载安装. ...

  5. javascript检查移动设备是否支持重力方向感应

    javascript如何检查移动设备,如手机平台是否支持重力或者方向感应. 可以使用html5提供的重力和方向感应接口来判断. html5 中针对高端手机提供了重力感应和重力加速的接口,开发可以利用这 ...

  6. mysql 常用基础

    登录命令 -h远程IP地址 -u用户名 -p密码 -P端口 mysql -h127.0.0.1 -uroot -p21313 -P3306 新建用户 insert into mysql.user(Ho ...

  7. 安装Linux系统Fedora 23

    搭建了一个Linux(Fedora 23)环境,用于学习.实验. [TOC] 1 安装Fedora 以前一直只会光盘安装,刻录了好多个版本的distros,用完即弃在一旁.很浪费. 此次学会了在Lin ...

  8. jquery动态删除html代码

    1.remove() remove()方法移除被选元素,包括所有的文本和子节点. 语法:$(selector).remove() 当我们想将元素自身移除时我们用 .remove(),同时也会移除元素内 ...

  9. LDAP与SSH

    一般情况下,客户端配置好之后,ssh是可以直接用的,若不能,则需手动配置 1:vim /etc/ssh/sshd_config 把UsePAM改成yes 2:在vim /etc/pam.d/sshd添 ...

  10. lucene写索引出现锁文件的原因之一

    lucene正常情况目录下的文件 有三个文件. segments.gen segments_a08, 还有一个类似 _uw.cfs名字的东西. 当然,不一定都一样, 但肯定是这三个. 如果出现了很多文 ...