一、创建一个资源项目
注意要把资源设置成public,不然别的项目无法访问
在各语言包里添加对应的key,如
<data name="Age">
<value>资源里的年龄</value>
</data>
二、扩展DisplayAttribute
实现功能:当资源有对应的key时,读资源的Name,否则显示默认的Name
这样的好处是兼容了从数据库生成来的Name
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Resources;
using ResourceTest.Locale;
namespace ResourceTest.Models
{
public class DisplayExtAttribute : DisplayNameAttribute
{
/// <summary>
/// 默认的名字
/// </summary>
public string Name { get; set; }
/// <summary>
/// 资源的Key,如果语言包有这个Key,优先使用
/// </summary>
public string ResName { get; set; }
/// <summary>
/// 是否读取资源,默认True
/// </summary>
public bool IsReadRes { get; set; } = true;
public DisplayExtAttribute() { }
public DisplayExtAttribute(string _name, string _resName, bool _isReadRes = true)
{
this.Name = _name;
this.ResName = _resName;
this.IsReadRes = _isReadRes;
}
public override string DisplayName
{
get
{
//会读取默认的语言包,加个开关防止读资源
if (IsReadRes)
{
var route = System.Web.HttpContext.Current.Request.RequestContext.RouteData;
if (!string.IsNullOrEmpty(ResName))
{
var lang = ""; //从系统中读当前语种
if (route != null && route.Values.Keys.Contains("lang"))
{
lang = route.Values["lang"].ToString();
}
//CultureInfo culture=new CultureInfo("en_US"); //英文
ResourceManager rm = new ResourceManager("ResourceTest.Locale.Resource", typeof(Resource).Assembly);
var resDisplayName = string.IsNullOrEmpty(lang)
? rm.GetString(ResName)
: rm.GetString(ResName, new CultureInfo(lang));
if (!string.IsNullOrEmpty(resDisplayName))
return resDisplayName;
}
}
return Name;
}
}
}
}
三、运用特性
namespace ResourceTest.Models
{
public class Person
{
[Display(Name = "姓名")]
public string Name { get; set; }
[DisplayExt("年龄", "Age")]
public int Age { get; set; }
}
}
在cshtml会显示不会语种的资源文本
@model ResourceTest.Models.Person
@using ResourceTest.Locale;
......
@Html.LabelFor(model=>model.Name):@Model.Name <br/>
@Html.LabelFor(model=>model.Age):@Model.Age <br/>
直接读取资源文件:@Resource.Age<br/>
点击 下载 DEMO