asp.net core 多语言,asp.net mvc 多语言
因为要用资源,所以很自然的就想到了应用程序_全球资源,但是分离的项目怎么使用它呢?为了这个,我还对着谷歌(搜索引擎名)搜了很多资料,不幸的是,没有结果。我也在论坛里,群里发贴子,但是高手们都无暇以顾,或是觉得这个问题太过于简单,不屑于回答这等初级的问题。
有什么想法,最好去试一下,不成功就当实践了。幸好我试了一把,要不然,现在都还纠结于这个问题。
新建一项目,这个项目里只放资源文件,如UI.res (Public),UI.zh-CN.res(没有生成代码),就像在网项目里建应用程序_全球资源一样,只不过,这里的资源是放在一个单独的项目里的。
看看要实现的效果如何:
第一步:添加途径
{ lang }/{ controller }/{ action }/{ id }
在Global.asax,RegisterRoutes方法里,你可以自己加些东西,比如:
路线。地图路线(
Lang ,
{ lang }/{ controller }/{ action }/{ id } ,
新建{
lang=en ,
控制器=首页,
动作=索引,
//lang=UrlParameter .可选的,
id=UrlParameter .可选择的
但是这样做,接着你会发现要怎么取这个语言啊?用全球的的应用程序_开始请求截取?可以是可以,但是欠妥啊。
看这里,MVC请求生命周期
当一个ASP。会员管理系统应用程序提出请求,为了响应请求,包含一些请求执行流程步骤!在ASP。会员管理系统应用程序超文本传送协议(Hyper Text Transport Protocol的缩写)请求
和超文本传送协议(Hyper Text Transport Protocol的缩写)响应过程中,主要包含8个步骤:
1)可路由表(路由表)的创建
2)UrlRoutingModule请求拦截
3)路由引擎确定途径
4)路由处理器创建相关的接口实例
5)IHttpHandler实例确定控制器(控制器)
6)控制器执行
7)一个视图引擎创建
8) 视图呈现
这里,要用到第四步。把上面的代码改成如下,并放路线。地图路线前面:
路线。添加(新路线(
{ lang }/{ controller }/{ action }/{ id } ,
新RouteValueDictionary(新{
lang=en-US ,
控制器=首页,
动作=索引,
id=UrlParameter .可选择的
}),
新的MultiLangRouteHandler()
注意这个多层路由器
多层路由器类:
公共类MultiLangRouteHandler:MvcRouteHandler {
受保护的重写IHttpHandler GetHttpHandler(请求上下文请求上下文){
字符串lang=requestContext .RouteData。值[lang].ToString();
//线程当前线程。当前文化=新文化信息(lang);
线程当前线程。CurrentUICulture=新文化信息(lang);
//返回新的mv Chandler(请求上下文);
返回基地GetHttpHandler(请求上下文);
}
第二步,给个入口
,在视角里或掌握里加上:
差异
%
字符串控制器=ViewContext .控制器。价值提供者。getvalue(控制器)。原始值。tostring();
字符串action=ViewContext .控制器。价值提供者。getvalue( action )。原始值。tostring();
%
%=Html .ActionLink(中文,操作,控制器,new { lang=zh-CN },null)%
%=Html .ActionLink(English ,action,controller,new {lang=en-US},null) %
/div
只需要这一个方这样写,其它的地方都不需要加{lang=zh-CN}这样的东西,MVC会自动得到当前的郎,并写到Html .方法里。另外,那个空是必须的,要不然,生成的全球资源定位器(统一资源定位器)不正确。
第三步,界面上普通文字的多语言
%=Html .ActionLink(AsNum .MvcWeb。Lang.UI.LABEL_LOGIN,登录,用户)%
div %=AsNum .MVC web。郎。ui。标签_图库%/div
这里的阿斯努姆. MvcWeb.lang.UI就是前面所说的那个资源。
第四步,显示名称的多语言化
在模型里,你可能这样写:
[必需]
[显示名称(用户名)]
[脚手架列(假)]
公共字符串用户名{
得到
设置;
然后,你在视角里这样写:
%=Html .LabelFor(l=l.User.UserName) %
它就会显示一个用户名,但是怎么让随当前的当前文化变化而变化呢?
当然,你可以用%=AsNum .MvcWeb。Lang.UI.LABEL_GALLERY %这样的写法来写,但是这样写就显的你太不牛B了,有点业余。
你也许会试着用显示名称(语言。用户名)这样的写法,但是编译不通过:
属性实参必须是属性形参类型的常量表达式、的类型表达式或数组创建表达式
因为属性不接受这样的参数。
我们定义个类本地化显示名称,继承显示名称:
公共类本地化显示名称:显示名称属性{
private string _ default name=
公共类型资源类型{
得到
设置;
}
公共字符串资源名称{
得到
设置;
}
公共本地化显示名称(字符串默认名称){
_ defaultName=defaultName
}
公共覆盖字符串显示名称{
获取{
PropertyInfo p=资源类型GetProperty(ResourceName);
如果(p!=空)
返回p.GetValue(null,null).ToString();
其他
return _默认值名称
}
}
}
然后改一下型号:
[必需]
//[显示名称(用户名)]
[LocalizedDisplayName(用户名,ResourceName=用户名称,ResourceType=typeof(Lang .UI))]
[StringLengthRange(2,20,true,错误消息资源名称= MSG _ USER _ NAME _ LEN ,错误消息资源类型=类型(Lang .验证))]
[脚手架列(假)]
公共字符串用户名{
得到
设置;
}
第五步,验证消息(验证)的多语言化
如上面的:
[StringLengthRange(2,20,true,错误消息资源名称= MSG _ USER _ NAME _ LEN ,错误消息资源类型=类型(Lang .验证))]
指定错误消息资源名称和错误消息资源类型就可以了,不过,好像这两个不能同时和错误消息同时存在,我试了,同时存在的话,这个确认不会执行。
第六步,客户端的验证消息(Javascript验证)的多语言化
如果不知道怎么实现自定义验证属性的客户端验证,可以参考:
手动音量调节添加自定义客户端验证java描述语言支持
一,从验证属性里派生一个类:
公共密封类StringLengthRangeAttribute:验证属性
b,从DataAnnotationsModelValidator里派生一个类:
公共类StringLengthRangeValidator:DataAnnotationsModelValidator StringLengthRangeAttribute {
c,注册,在应用程序_启动里加:
DataAnnotationsModelValidatorProvider .注册适配器(类型为(StringLengthRangeAttribute),类型为(StringLengthRangeValidator));
DataAnnotationsModelValidator派生类:
公共类StringLengthRangeValidator:DataAnnotationsModelValidator StringLengthRange {
私有int最大值,最小值
私有布尔修剪
私有字符串错误信息
公共StringLengthRangeValidator(模型元数据,控制器上下文ctx,StringLengthRange属性)
:base(metaData,ctx,att) {
max=att .最大
min=att .福建话
修剪=属性。修剪;
errMsg=base .属性。FormatErrorMessage(“”)?att .错误消息;
}
公共重写IEnumerable ModelClientValidationRule GetClientValidationRules(){
ModelClientValidationRule rule=new ModelClientValidationRule {
ErrorMessage=errMsg,
验证类型=“字符串长度范围”
};
规则106 . validation parameters。Add(min ,min);
规则106 . validation parameters。Add(max ,max);
规则106 . validation parameters。Add(trim ,trim);
返回new[]{ rule };
}
}
注意
errMsg=base .属性。FormatErrorMessage(“”)?att .错误消息;
这个基地.属性。格式错误消息(“”)其实就是要取错误消息字符串,但是它又是保护的。
公共密封的类字符串长度范围:验证属性{
公共重写字符串格式错误消息(字符串名称){
返回ErrorMessageString?错误消息;
//返回错误消息
}
好了,至此,基本上所有的元素都支持多语言化了。
源码下载:
http://test.dajiaozi.com/other/AsNum.MvcWeb.rar
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。