asp.net core 多语言,asp.net mvc 多语言

  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

asp.net core 多语言,asp.net mvc 多语言