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

        [ChildActionOnly]
public PartialViewResult LanguageSelection()
{
var model = new LanguageSelectionViewModel
{
CurrentLanguage = _localizationManager.CurrentLanguage,
Languages = _localizationManager.GetAllLanguages()
}; return PartialView("_LanguageSelection", model);
}

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

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

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

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

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

 <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可以看到对这些国旗图标的定义:

[class^="famfamfam-flag"] {
display: inline-block;
width: 16px;
height: 11px;
line-height: 11px;
/* vertical-align: text-top; */
background-image: url("famfamfam-flags.png");
background-position: 0 0;
background-repeat: no-repeat;
} .famfamfam-flag-zw { background-position: 0px 0px; width: 16px; height: 11px; }
.famfamfam-flag-zm { background-position: -16px 0px; width: 16px; height: 11px; }
.famfamfam-flag-za { background-position: 0px -11px; width: 16px; height: 11px; }
.famfamfam-flag-yt { background-position: -16px -11px; width: 16px; height: 11px; }
.famfamfam-flag-ye { background-position: -32px 0px; width: 16px; height: 11px; }
.famfamfam-flag-ws { background-position: -32px -11px; width: 16px; height: 11px; }
.famfamfam-flag-wf { background-position: 0px -22px; width: 16px; height: 11px; }
...

图标文件:

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

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

问题是,ChangeCulture控制器在哪?

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

    public class AbpLocalizationController : AbpController
{
[DisableAuditing]
public virtual ActionResult ChangeCulture(string cultureName, string returnUrl = "")
{
if (!GlobalizationHelper.IsValidCultureCode(cultureName))
{
throw new AbpException("Unknown language: " + cultureName + ". It must be a valid culture!");
} Response.Cookies.Add(new HttpCookie("Abp.Localization.CultureName", cultureName) { Expires = Clock.Now.AddYears() }); if (Request.IsAjaxRequest())
{
return Json(new MvcAjaxResponse(), JsonRequestBehavior.AllowGet);
} if (!string.IsNullOrWhiteSpace(returnUrl))
{
return Redirect(returnUrl);
} return Redirect(Request.ApplicationPath);
}
}

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

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

       private LanguageInfo GetCurrentLanguage()
{
if (_configuration.Languages.IsNullOrEmpty())
{
throw new AbpException("No language defined in this application. Define languages on startup configuration.");
} var currentCultureName = Thread.CurrentThread.CurrentUICulture.Name; //Try to find exact match
var currentLanguage = _configuration.Languages.FirstOrDefault(l => l.Name == currentCultureName);
if (currentLanguage != null)
{
return currentLanguage;
} //Try to find best match
currentLanguage = _configuration.Languages.FirstOrDefault(l => currentCultureName.StartsWith(l.Name));
if (currentLanguage != null)
{
return currentLanguage;
} //Try to find default language
currentLanguage = _configuration.Languages.FirstOrDefault(l => l.IsDefault);
if (currentLanguage != null)
{
return currentLanguage;
} //Get first one
return _configuration.Languages[];
}

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

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

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. High Memory in the Linux Kernel

    This is enabled via the PAE (Physical Address Extension) extension of the PentiumPro processors. PAE ...

  2. ubuntu 14.4 中文语言包安装问题

    1.安装前,请选择更新源,在系统设定 system setting 里,选择software and updates 里,选择中国的源,用于快速更新语言包 2.在language support里选择 ...

  3. sasscore22

    1.setting 如果不需要支持ie6,7,请在引入setting文件之前,设置$lte7:false;. $lte7: true !default  表示的是是否兼容it6/7 2.css3 是一 ...

  4. 实现SQL Server 2008 Reporting Services匿名访问报表有两种方法

    一.通过修改SQL Server 2008的配置文件,去掉Windows的验证. 1.首先我们找到SQL安装目录下的两个Web.config配置文件,默认安装目录分别是(C:\Program File ...

  5. 带名称空间的xml数据查询

    <gpx xmlns="http://www.topografix.com/GPX/1/1" creator="MapSource 6.5" versio ...

  6. SystemC简介

    SystemC是一种基于C++语言的用于系统设计的计算机语言,是用C++编写的一组库和宏.它是为了提高电子系统设计效率而逐渐发展起来的产物.IEEE于2005年12月批准了IEEE1666-2005标 ...

  7. jQuery multiselect的使用

    1,下载插件 https://github.com/ehynds/jquery-ui-multiselect-widget

  8. input输入框怎么禁止粘贴

    <input type="text" value="" onpaste="return false;" /> 原文出处:http ...

  9. vim安装不上

    前阵子,刚安装Ubuntu时,安装vim的问题,现在些出来分享一下.apt-get install vim正在读取软件包列表... 完成正在分析软件包的依赖关系树正在读取状态信息... 完成有一些软件 ...

  10. robotframework ride安装

    之前在python3.3.5的环境下一直无法找到匹配的wxPython版本,只能再装了一个python2.7,后面在2.7的环境下重新安装了robotframework和ride,结果还是无法启动ri ...