基本环境:VS2019+EF6,根据https://www.cnblogs.com/lidaying5/p/12756661.html进行多语言设置,添加资源文件,语言切换按钮,添加资源文件键值对Email,PropertyValueRequired等
验证信息实现多语言主要分为两部分:
1.Modal字段名实现多语言
2.错误信息实现多语言
1.modal字段实现多语言
Display特性可以指定资源文件和对应的键,遗憾的是这样会引发一个报错,因为默认创建的资源文件不是公共的
Cannot retrieve property 'Name' because localization failed. Type 'Resources.Resource' is not public or does not contain a public static string property with the name 'Email
有人说修改资源文件属性可以解决这个问题,但是我试过并不行,网上解决方法:
要解决这个问题,只要右键点击资源文件,在其的属性中将 Custom Tool 从 GlobalResourceProxyGenerator 改为 PublicResXFileCodeGenerator ,然后将 Build Action 改为 Embedded Resource,最后要给 Custom Tool Namespace 起个名字用作这个资源的名字空间,在原文中说可以不要,但在本人使用中发现还是要的,要不然在代码中无法引用资源文件。
原文:http://cs1125.lofter.com/post/13bf89_471235
public class LoginUser { [Display(Name ="Email" ,ResourceType = typeof(Resources.Resource))] public string Email { get; set;} [Required] public string Password { get; set; } public bool? RememberMe { get; set; } }
第一种方法不行,网上找了第二种方法,通过自定义Displayed属性实现字段多语言显示 https://www.cnblogs.com/whtydn/p/5305798.html
public class LocalizedDisplayName : DisplayNameAttribute { private string _defaultName = "" ; public Type ResourceType { get ; set ; } public string ResourceName { get ; set ; } public LocalizedDisplayName ( string defaultName ) { _defaultName = defaultName ; } public override string DisplayName { get { PropertyInfo p = ResourceType . GetProperty ( ResourceName ) ; if ( p != null ) { return p . GetValue ( null , null ) . ToString ( ) ; } else { return _defaultName ; } } } }
[ LocalizedDisplayName ( "姓名" , ResourceName = "Name" , ResourceType = typeof ( Resources . Admin ) ) ] [ Required ( ) ] Public string Name { get ; set ; }
但是PropertyInfo p = ResourceType . GetProperty ( ResourceName ) ; 并不能获取到对应的属性,网上查了资料大概意思是反射不支持内部属性
既然不能用反射,索性把反射去掉直接调用资源文件好了,读取本地资源要加try...catch 否则添加带视图控制器时会出错(下图3),大概是添加时编译器试图去获取资源文件了, 修改后代码如下
public class LocalizedDisplayName : DisplayNameAttribute
{
private string _ResourceName = "";
public LocalizedDisplayName(string ResourceName) { _ResourceName = ResourceName; }
public override string DisplayName
{
get
{
try
{
var value = Resources.Resource.ResourceManager.GetString(_ResourceName);
if (!string.IsNullOrEmpty(value))
{
return value;
}
else
{
return _ResourceName;
}
}
catch (Exception ex)
{
return _ResourceName;
}
}
}
}
public class LoginUser { [Required( ErrorMessageResourceName = "PropertyValueRequired", ErrorMessageResourceType =typeof(Resources.Resource))] [LocalizedDisplayName("Email")] public string Email { get; set;} [Required] public string Password { get; set; } public bool? RememberMe { get; set; } }
切换中英文,成功显示
字段的多语言显示实现。
2.错误信息的多语言
这个就更加容易实现了,比如Requierd特性都有ErrorMessageResourceName ,ErrorMessageResourceType 两个属性,只要指定资源文件和资源文件键值就可以了,资源文件可以使用{0} is required!形式添加错误信息,显示时会替换对应的字段名
[Required( ErrorMessageResourceName = "PropertyValueRequired", ErrorMessageResourceType =typeof(Resources.Resource))]