ABP的语言切换
在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的语言切换的更多相关文章
- ASP.NET MVC5多语言切换快速实现方案
功能 实现动态切换语言,Demo做了三种语言库可以切换,包括资源文件的定义,实体对象属性设置,后台代码Controller,IAuthorizationFilter,HtmlHelper的实现,做法比 ...
- DataGrid 列头实现国际化语言切换
<DataGrid> <DataGrid.Columns> <DataGridTextColumn Binding="{x:Null}" Width= ...
- Android app应用多语言切换功能实现
最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...
- iOS 语言切换、本地化,国际化
什么是本地化处理? 本地化处理就是我们的应用程序有可能发布到世界的很多国家去,因为每个国家应用的语言是不一样的,所以我们要把我们的应用程序的语言要进行本地化处理一下. 本地化处理需要处理那些文件? ( ...
- 【转】Android 语言切换过程分析
最近在看一个bug,系统切换语言后,本来退到后台的音乐,会在通知栏上显示通知.为了解决这个bug,我学习了下android的语言切换流程,也参考了大量其他人的资料.(主要参考了http://blog. ...
- android 语言切换过程分析
android 语言切换过程分析 2014-02-27 18:13 1207人阅读 评论(0) 收藏 举报 语言切换android语言切换android改变语言 最近在看一个bug,系统切换语言后,本 ...
- QT实现多语言切换
功能需求: 网盘客户端要能够实现多国语言的切换,第一版要支持中.英文的切换.在实现过程中感觉QT对多国语言的支持还是很不错的,制作多语言包很方便,切换的逻辑也很简单.下面就来看一下QT中如何制作多语言 ...
- Android 应用内多语言切换
最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果用户在 App 内进行了语言设置,那么就使用用户设置的语言.当然,你会发现,App 的 ...
- bootstrap table 插件多语言切换
在bootstrap中的bootstrap table 插件在多语言切换的审核,只需要如下操作 引入bootstrap-table-locale-all.js文件 $('#Grid').bootstr ...
随机推荐
- jquery文件上传
http://www.jb51.net/Special/799.htm http://www.oschina.net/project/tag/356/jquery-file-upload
- win10 自动亮度关闭无效问题
升级win10后,发现系统的关闭自动亮度功能无效了,怎么调整都没有效果,百度把,服务也关了,电源管理也关了,自己的显卡节电设置也关了,最后摸索,只要把电池状态下,和通电状态下的屏幕亮度都调整到50%以 ...
- javascript知识点总结----Function定义
---恢复内容开始--- 函数Function: 函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法,函数名实际上是一个指向函数的指针,不会与某个函数绑定 ...
- jenkins调度selenium脚本不打开浏览器解决办法
原文地址: http://blog.csdn.net/achang21/article/details/45096003 The web browser doesn't show while run ...
- Java线程问题分析定位
Java线程问题分析定位 分析步骤: 1.使用top命令查看系统资源占用情况,发现Java进程占用大量CPU资源,PID为11572: 2.显示进程详细列表命令:ps -mp 11572 -o THR ...
- jQuery Mobile的基本使用
本人是软件开发的初学者,总结了一点点日常所学,记录在此,主要目的是鼓励自己坚持学习,怕有一天忘记了,还能复习曾经学过的知识点. 如有大神路过为我指点迷津,纠正改错更是感激不尽,但请不要喷我这个菜鸟!谢 ...
- VSS记住用户名和密码
计算机-属性-高级系统设置-环境变量 新建两个环境变量如下: SSUSER(VSS的用户名) SSPWD(VSS的密码)
- 查询阻塞的sql
WITH ProcessCTE(blocked) AS ( SELECT blocked FROM sys.sysprocesses WHERE blocked>0 union SELECT s ...
- 签名 cd
http://blog.sina.com.cn/s/blog_618199e60101uc7w.html
- Apache伪静态在网站目录没有反斜杠后自动添加反斜杠
第一步:确认网站开启REWRITE规则 一般有两种情况: i.apache安装的时候已经包含rewrite功能 ii.后续配置的时候新添加mod_rewrite.so.这种情况需要在httpd.con ...