asp.net mvc 国际化(2) 解决问题

解决上一篇提出的剩下的问题

 

前端国际化. 通过js语言包解决.

准备好js语言包. 在模板页中使用如下代码

<script src='http://www.cnblogs.com/Scripts/grid.locale-<%=System.Threading.Thread.CurrentThread.CurrentCulture.Name %>.js' type="text/javascript"></script>
注意语言包的命名
 
后台输出的提示语言等的国际化.(比如说”该用户名不存在”)

简单方法: 将该语句直接写入全局资源文件再用资源类进行访问

复杂一点: 将语句汇总成xml文件, 封装起来提供使用.

1. 增加全局资源文件

2. 在全局资源文件夹下增加XML文件如下

<?xml version="1.0" encoding="utf-8" ?>
<root>
    <Text key="UsernameExist" zh-CN="用户名已经存在" en-US="username is already exist!"></Text>
</root>

3. 提供访问类

//枚举类
        public static class ResponseKey {
            public static const string UsernameExist = "UsernameExist";
        }
 
        private static XElement root = XElement.Parse(ResponseIntel.ResponseIntelXml);
        private static string CacheKey = "ResponseIntelXML";
        public static string Lang(string key) {
            if (HttpContext.Current.Cache.Get(CacheKey + key) == null)
            {
                var nodes = (from el in root.Elements("Text")
                             where el.Attribute("key").Value == key
                             select el).First();
                string ret = nodes.Attribute(System.Threading.Thread.CurrentThread.CurrentCulture.Name).Value;
                //System.Web.Caching.CacheDependency dependency = new System.Web.Caching.CacheDependency(
                //    HttpContext.Current.Server.MapPath("~/App_GlobalResources/ResponseIntelXml.xml"));
                HttpContext.Current.Cache[CacheKey + key] = ret;
                return ret;
            }
            else
                return (string)HttpContext.Current.Cache.Get(CacheKey + key);
        }

 

 

4. 访问

         Common.RespAlertIntel_.Lang(Common.RespAlertIntel_.ResponseKey.UsernameExist)
ASP.NET MVC自定义验证提示信息国际化

1. 新建一个全局资源文件. 增加一个key/value为  LoginModel_Username:’用户名不能为空’

2. 在该model的特性代入类似如下

[Required(ErrorMessageResourceType=typeof(资源类名), ErrorMessageResourceName="LoginModel_Username")]
        [DisplayName("用户名")]
        public string UserName { get; set; }
状态枚举的国际化.(比如说”正常”,”停止”等状态)

使用了Attribute特性

//特性类和枚举
[AttributeUsage(AttributeTargets.All,AllowMultiple=true)]
        public class LanguageAttribute : Attribute {
            public LanguageAttribute(string languageKey, string languageValue)
            {
                LanguageKey = languageKey; LanguageValue = languageValue;
            }
            public string LanguageKey { get; set; }
            public string LanguageValue { get; set; }
        }
        public enum State { 
            [Language("zh-CN","错误了")]
            [Language("en-US", "Error!!!")]
            Error=0,
            [Language("zh-CN", "成功了也")]
            [Language("en-US", "YES!!!")]
            OK=1
        }

 

 

       //核心处理方法
       public string getStr(State state) {
            var attr = state.GetType().GetField(state.ToString()).GetCustomAttributes(false);
            string ret = "";
            foreach (var item in attr)
            {
                var lang=((LanguageAttribute)item);
                if (System.Threading.Thread.CurrentThread.CurrentCulture.Name.ToLower() == lang.LanguageKey.ToLower()) {
                    ret = lang.LanguageValue;
                    break;
                }
            }
            return ret;
        }

测试.

 

            Response.Write("多语言<br>现在是中文<br>");
            Response.Write(getStr(State.Error)); Response.Write(getStr(State.OK));
            Response.Write("多语言<br>现在是Ying文<br>");
            System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
            Response.Write(getStr(State.Error)); Response.Write(getStr(State.OK));

  

public static class GetEnumDescribeExt
    {
        private static ConcurrentDictionary<string, string> dic = new ConcurrentDictionary<string, string>();

        public static string GetEnumDescribe(this Enum value)
        {   
            bool nameInstend = true;
            Type type = value.GetType();
            string name = Enum.GetName(type, value);

            var key = type.FullName + "." + name;

            if (dic.ContainsKey(key))
                return dic[key];
            else {

                if (name == null)
                {
                    return null;
                }
                FieldInfo field = type.GetField(name);
                DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                if (attribute == null && nameInstend == true)
                {
                    return name;
                }
                string result = attribute == null ? null : attribute.Description;

                dic[key] = result;

                return result;
            }
        }
    }

 

数据库文本等的国际化
新建资源表
SELECT [crId]
      ,[CultureResourceCode]
      ,[CultureName]
      ,[ResourceName]
      ,[Status]
  FROM [Boss].[dbo].[CultureResource]
GO
crid, 自增字段, 主键
CultureResourceCode: 资源键
CultureName: asp.net程序当前线程的语言区域值
ResourceName: 资源值
status: 状态是否启用(0,1)
 
在需要用到文本的各个字段都加上CultureResourceCode外键即可

转载于:https://www.cnblogs.com/jianjialin/archive/2011/06/22/2087438.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值