.NET MVC 多语言网站

通过浏览器语言首选项改变MVC的语言,通过浏览器语言选项,修改脚本语言。

一、添加资源文件

1、添加App_GlobalResources文件夹。

2、添加默认的资源文件和对应的语言码资源文件。如zh-cn代表中国大陆,en-us代表美制英语。详情:http://www.lingoes.cn/zh/translator/langcode.htm

3、将资源文件设置成public。新建时默认是internal,这样不能被访问。

右键点击资源文件,在其的属性中将自定义工具(Custom Tool) 从资源代理生成器(GlobalResourceProxyGenerator) 改为 公共文件(PublicResXFileCodeGenerator),然后将生成操作从内容改为嵌入的资源。

4、在web.config中添加语言选项。这样就会根据浏览器语言首选项,判断要使用的资源。

    <!--根据浏览器的语言首选项,决定语言项-->

<globalization uiCulture="auto" culture="auto" enableClientBasedCulture="true" />

5、在对应的文件中添加键值对。

二、View+Control+Model的普通文字多语言

1、view

2、control

3、model

//[Required(ErrorMessage = "密码不能为空")]

 [Required(ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "PasswordNotNull")]

三、DisplayName的多语言化。重写DisplayName方法

  public class LocalDisplayName : DisplayNameAttribute

    {

        private string _defaultName = "";

        public Type ResourceType { get; set; }
public string ResourceName { get; set; } public LocalDisplayName(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;
}
}
}
}

model使用:

 [LocalDisplayName("发布时间", ResourceName = "PublishDateTime", ResourceType = typeof(Resource))]

四、脚本多语言

原始方法:

我的方法是在引用一个公用的脚本文件,由该文件通过当前语言引入对应的语言资源脚本。如果当前浏览区语言没有没有对应的资源脚本,就引入默认的资源脚本。

1、通过浏览器语言引入对应的语言资源脚本。

//将所有的语言资源脚本文件名罗列再次,用&分割

var languageresources = "en-us&zh-cn"

//根据当前浏览器语言验证语言脚本是否存在,如果在则加载,则加载默认的zh-cn.js

var thislanguagere = navigator.language.toLowerCase();

var script = document.getElementsByTagName('HEAD').item(0);

script = document.createElement("script");

script.type = "text/javascript";

var language = languageresources.split("&")

var flag = false;

for (var item in language) {

    if (thislanguagere == language[item]) {

        var flag = true;

        script.src = "/Scripts/controls/" + thislanguagere + ".js";

        document.body.appendChild(script);

    }

}

if (flag == false) {

    script.src = "/Scripts/controls/zh-cn.js";

    document.body.appendChild(script);

}

2、对应资源脚本写法。设置键值对

3、具体页面脚本使用,引用。需要先引用判断语言脚本。

更新方法:

1、采用jquery.i18n.properties-1.0.9.js提供的方法:

(1)、jQuery.i18n.properties() 用法:引入对应的资源文件

 jQuery.i18n.properties({ 

    name:'strings',// 资源文件名称

    path:'bundle/',// 资源文件所在目录路径

    mode:'both',// 模式:变量或 Map 

    language:'pt_PT',// 对应的语言

    cache:false, 

    encoding: 'UTF-8', 

    callback: function() {// 回调方法

    } 

 });

(2)、jQuery.i18n.prop(key)

该方法以 map 的方式使用资源文件中的值,其中 key 指的是资源文件中的 key。当 key 指定的值含有占位符时,可以使用 jQuery.i18n.prop(key,var1,var2 … ) 的形式,其中 var1,var2 …对各占位符依次进行替换。例如资源文件中有“msg_hello= 您好 {0},今天是 {1}。”的键值对,则我们可以采用“jQuery.i18n.prop( ‘ msg_hello ’ , ’小明’ , ’星期一’ );”的形式使用 msg_hello。

(3)、jQuery.i18n.browserLang() 用于获取浏览浏览器的语言信息,这里不再单独介绍。

2、文档结构:其中strings是随便起到,后缀的en-us代表当前浏览器语言项。没有后缀代表默认语言。

声明变量写法:

3、在具体脚本内的写法:

function loadProperties() {

    jQuery.i18n.properties({// 加载资浏览器语言对应的资源文件

        name: 'strings', // 资源文件名称

        path: '/Scripts/controls/', // 资源文件路径

        mode: 'map', // 用 Map 的方式使用资源文件中的值

        callback: function () {//加载成功后设置显示内容

        }

    });

}

$(function () {

    loadProperties();//引入资源文件

    //忘记密码的点击事件

    $("#hex-forgotpassword").click(function () {

        if ($("#UserName").val() == "") {

            //alert("请在登陆框输入用户名,再点击找回密码!");

            alert($.i18n.prop('forgotpasswordnotusername'));

        }

        else {

            //var msg = "您确认要找回密码吗?您的密码将发送到您的邮箱!";

            var msg = $.i18n.prop('forgotpassword');

            if (confirm(msg) == true) {

                $.ajax({

                    type: "Get",

                    url: '/Account/ForgetPassword',

                    data: "userName=" + $("#UserName").val(),

                    success: function (msg) {

                        alert(msg);

                    }

                });

            } else {

                return false;

            }

        }

    });

    //用户名文本框获得焦点

    $('#UserName').focus();

})

另附:可修改的多语言,即通过语言超链接修改当前语言项。

1、在Global.asax文件中:

   protected void Application_AcquireRequestState(Object sender, EventArgs e)

        {

            Authentication.AttachAuthTicketByUrl<WebAuthentication>(Context);

            //多语言 可切换

            if (HttpContext.Current.Session != null)

            {

                System.Globalization.CultureInfo ci = (System.Globalization.CultureInfo)this.Session["CurrentLanguage"];

                if (ci == null)

                {

                    ci = new System.Globalization.CultureInfo("zh-cn");

                    this.Session["CurrentLanguage"] = ci;

                }

                System.Threading.Thread.CurrentThread.CurrentUICulture = ci;

                System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(ci.Name);

            }

        }

2、在control中:

        public ActionResult ChangeLanguage(string language)

        {

            Session["CurrentLanguage"] =new System.Globalization.CultureInfo(language);

            return Redirect("Login");

        }

3、在页面中:

@Html.ActionLink("English", "ChangeLanguage", "Account", new { language = "en-us" }, new { @class = "hex-a" })

@Html.ActionLink("Chinese", "ChangeLanguage", "Account", new { language = "zh-cn" }, new { @class = "hex-a" })

参考资料:

.NET MVC 2 多语言网站的实现:

http://blog.163.com/xu_shuhao/blog/static/52577487201092402610920/

关于在mvc4中多语言建站的实例:

http://www.cnblogs.com/Joans/archive/2012/08/16/2640473.html

使用 jQuery.i18n.properties 实现 Web 前端的国际化:

https://www.ibm.com/developerworks/cn/web/1305_hezj_jqueryi18n/

ASP.Net MVC多语言的更多相关文章

  1. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

  2. ASP.NET MVC 多语言方案

    前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生了邮箱事件,我竟然忘了给邮箱密 ...

  3. ASP.NET MVC 多语言实现——URL路由

    考虑实现一个完整的基于asp.net mvc的多语言解决方案,从路由到model再到view最后到数据库设计(先挖好坑,后面看能填多少). 我所见过的多语言做得最好的网站莫过于微软的msdn了,就先从 ...

  4. ASP.net MVC 多语言处理

    MVC多语言处理主要分两部分,一部分是Razor视图中的文字标签内容切换, 另一部分是javascript文件中的文标签内容切换.  这里分这两部分来说. View视图中的比较好做, 思路是使用资源文 ...

  5. ASP.NET MVC多语言 仿微软网站效果(转)

    本文转自: https://blog.csdn.net/Cooldiok/article/details/7831351 2017年10月22日 21:31:22 Cooldiok 微软作为ASP.N ...

  6. ASP.NET MVC多语言 仿微软网站效果

    文章转载自:https://blog.csdn.net/cooldiok/article/details/78313513 微软作为ASP.NET的创造者,它对于官网的结构设计肯定有值得我们借鉴和参考 ...

  7. ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发

    说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...

  8. 转:ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发

    说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...

  9. ASP.NET MVC 多语言解决方案

    1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...

随机推荐

  1. Web开发中B/S架构和C/S架构的区别

    在web开发中有两种基本架构,即C/S架构和B/S架构那么这两种架构有什么区别呢?那么就一起来看看吧. C/S架构图: B/S架构图: C/S架构是 浏览/服务器端的交互,是早期的一种分布式架构,在该 ...

  2. CSS的再一次深入(更新中···)

    全面我们学了6个选择器,今天再来学习两个选择器,分别是通配符选择器和并集选择器: 1.通配符选择器: *{ } 表示body里所有的标签都被选中 2.并集选择器: 选中的标签之间用逗号隔开,表示这几个 ...

  3. Golang中使用kafka

    golang中比较好用的kafka client有 sarama confluent-kafka-go go_kafka_client optiopay-kafka siesta 其中 sarama的 ...

  4. MySql 语句收集

    目录 =与:=区别 序列号: 分组: 子查询分组: 同数据库表数据迁移 存储过程 参考: =与:=区别 = 只有在set和update时才是和:=一样,赋值的作用,其它都是等于的作用.鉴于此,用变量实 ...

  5. Smartmontools硬盘检测工具

    安装: 下载 命令使用: 查看驱动器信息: $ smartctl -i D: smartctl 6.6 2017-11-05 r4594 [x86_64-w64-mingw32-w10-b17134] ...

  6. E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

    出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁不可用.而导致资源被锁的原因,可能是上次安装时没正常完成,而导致出现此状况. 解决方法:输入以下命令 sudo rm /var/cache/ ...

  7. Mysql数据类型、约束、存储引擎

    一.数据类型 整数类型 默认有符号的 设置为无符号 1.create table t2(age tinyint unsigned); 2.建表后用alter修改 tinyint[(m)] [unsig ...

  8. WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(核心)

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或 ...

  9. Android 使alertDialog.builder不会点击外面和按返回键消失

    这个问题之前一直困扰我,我的需求就是点击对话框外面和按返回键对话框不会消失,按返回键还好解决,拦截下返回键就OK了. 但是点击外面不好解决.之前有人说模态对话框,我看了一会,觉得不是我想要的效果.po ...

  10. error LNK2019-无法解析的外部符号 _main-该符号在函数 ___tmainCRTStartup 中被引用

    问题分析: 因为Win32 console Application的入口函数是Main(),而Win32 Application的入口函数才是WinMain() 解决方案: 右键项目,打开[属性]页, ...