出售域名 11365.com.cn
有需要请联系 16826375@qq.com
在手机上浏览
在手机上浏览

.net资源文本实现多语言

发布日期:2022-03-13

一、创建一个资源项目

注意要把资源设置成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