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

news/2024/5/21 0:15:01/文章来源:https://blog.csdn.net/weixin_34235457/article/details/92636687

 

文章转载自:https://blog.csdn.net/cooldiok/article/details/78313513

微软作为ASP.NET的创造者,它对于官网的结构设计肯定有值得我们借鉴和参考的地方

本项目是基于VS2017 pro开发的,将从你已经创建了一个MVC项目开始介绍: 
流程图 
这里写图片描述

1.创建语言文件 


创建App_GlobalResources文件夹 


这里写图片描述

 

创建Language文件夹 


这里写图片描述

 

创建资源文件 


这里写图片描述

 

这些操作做完后,目录结构应该是以下这样的 


这里写图片描述

我们打开每个资源文件,在里面添加一条TiTle数据 
这里写图片描述

 

我推荐使用ResXManager来管理语言文件

ResxManager:资源文件编辑工具,这个工具可以在一个界面中编辑所有语言的内容。  可以新增、删除key。 注意:如果是新建的Resx,一定要有一个key之后才可以编辑。

下载地址:

单独程序:http://resxmanager.com/

vs插件:  https://marketplace.visualstudio.com/items?itemName=TomEnglert.ResXManager

 

比如我已经创建了中文、英语、日语这三个语言文件,我如果要做修改的话就需要每个文件轮流修改,使用ResX Manager就能直接同时修改这三个语言文件,它还提供语言翻译功能。具体使用方法与此文无关,就不再赘述了。 


这里写图片描述

 

2.创建一个过滤器 


这里写图片描述

 1 namespace MvcEdu.Filters
 2 {
 3     public class LocalizationAttribute : ActionFilterAttribute
 4     {
 5         public override void OnActionExecuting(ActionExecutingContext filterContext)
 6         {
 7 
 8             bool isSkipLocalization = filterContext.ActionDescriptor.IsDefined(typeof(WithoutLocalizationAttribute), inherit: true) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(WithoutLocalizationAttribute), inherit: true);
 9 
10             if (!isSkipLocalization)
11             {
12                 if (filterContext.RouteData.Values["lang"] != null && !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
13                 {
14                     ///从路由数据(url)里设置语言
15                     var lang = filterContext.RouteData.Values["lang"].ToString();
16                     Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
17                 }
18                 else
19                 {
20                     ///从cookie里读取语言设置
21                     var cookie = filterContext.HttpContext.Request.Cookies["Localization.CurrentUICulture"];
22                     var langHeader = string.Empty;
23                     if (cookie != null && cookie.Value != "")
24                     {
25                         ///根据cookie设置语言
26                         langHeader = cookie.Value;
27                         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
28                     }
29                     else
30                     {
31                         ///如果读取cookie失败则设置默认语言
32                         langHeader = filterContext.HttpContext.Request.UserLanguages[0];
33                         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
34                     }
35                     ///把语言值设置到路由值里
36                     filterContext.RouteData.Values["lang"] = langHeader;
37                     //如果url中不包含语言设置则重定向到包含语言值设置的url里
38                     string ReturnUrl = $"/{filterContext.RouteData.Values["lang"]}/{filterContext.RouteData.Values["controller"]}/{filterContext.RouteData.Values["action"]}";
39                     filterContext.Result = new RedirectResult(ReturnUrl);
40                 }
41 
42                 /// 把设置保存进cookie
43                 HttpCookie _cookie = new HttpCookie("Localization.CurrentUICulture", Thread.CurrentThread.CurrentUICulture.Name);
44                 _cookie.Expires = DateTime.Now.AddYears(1);
45                 filterContext.HttpContext.Response.SetCookie(_cookie);
46 
47                 base.OnActionExecuting(filterContext);
48             }
49 
50         }
51     }
52 
53     public class WithoutLocalizationAttribute : Attribute
54     {
55     }
56 }

 

 

 

 

3.配置路由文件 


我这边因为只有三个语言文件,所以我对于语言项的输入做了限制。

 

 1 namespace MvcEdu
 2 {
 3     public class RouteConfig
 4     {
 5         public static void RegisterRoutes(RouteCollection routes)
 6         {
 7             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 8 
 9             routes.MapRoute(
10               name: "Localization", // 路由名称
11               url: "{lang}/{controller}/{action}/{id}", // 带有参数的 URL\
12               constraints: new { lang = "zh-CN|en-US|ja-JP" }, //限制可输入的语言项
13               defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }//参数默认值
14             );
15 
16             routes.MapRoute(
17                 name: "Default",
18                 url: "{controller}/{action}/{id}",
19                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
20             );
21         }
22     }
23 }

 

 

4.修改HomeController.cs文件,添加修改语言函数

 

 1 namespace MvcEdu.Controllers
 2 {
 3     [Localization] //HomeController里的函数都要走Localization过滤器
 4     public class HomeController : Controller
 5     {
 6         public ActionResult Index()
 7         {
 8             ViewBag.Title = Resources.Language.Title;//页面中的Title值取语言文件里的Title值
 9             return View();
10         }
11 
12         public ActionResult About()
13         {
14             ViewBag.Title = Resources.Language.Title;//页面中的Title值取语言文件里的Title值
15             ViewBag.Message = "Your application description page.";
16 
17             return View();
18         }
19 
20         public ActionResult Contact()
21         {
22             ViewBag.Title = Resources.Language.Title;//页面中的Title值取语言文件里的Title值
23             ViewBag.Message = "Your contact page.";
24 
25             return View();
26         }
27         [WithoutLocalization]//这个函数不走Localization过滤器
28         public ActionResult ChangeLanguage(String NewLang, String ReturnUrl)
29         {
30             if (!ReturnUrl.EndsWith("/"))
31             {
32                 ReturnUrl += "/";
33             }
34             //use NewLang replace old lang,include input judgment
35             if (!string.IsNullOrEmpty(ReturnUrl) && ReturnUrl.Length > 3 && ReturnUrl.StartsWith("/") && ReturnUrl.IndexOf("/", 1) > 0 && new string[] { "zh-CN", "en-US","ja-JP" }.Contains(ReturnUrl.Substring(1, ReturnUrl.IndexOf("/", 1) - 1)))
36             {
37                 ReturnUrl = $"/{NewLang}{ReturnUrl.Substring(ReturnUrl.IndexOf("/", 1))}";
38             }
39             else
40             {
41                 ReturnUrl = $"/{NewLang}{ReturnUrl}";
42             }
43             return Redirect(ReturnUrl);//redirect to new url
44         }
45     }
46 }

 

 

 

注意:我在使用vs2015 express for web时,出现了使用Resources.Language时智能提示没出现Title的情况,此时去找一下Language.designer.cs里有无以下代码,如果没有的话则以后添加键值对的时候你们都要在此手动添加,或者把Language文件夹建在Controllers的同级目录下然后再新建资源文件等操作也能解决该问题。

 

        /// <summary>///  查找类似 标题 的本地化字符串。/// </summary>internal static string Title {get {return ResourceManager.GetString("Title", resourceCulture);}}

 

 

5.修改母版页,添加了修改语言的link

 

 1            <div class="navbar-collapse collapse">
 2                 <ul class="nav navbar-nav">
 3                     <li>@Html.ActionLink("主页", "Index", "Home")</li>
 4                     <li>@Html.ActionLink("关于", "About", "Home")</li>
 5                     <li>@Html.ActionLink("联系方式", "Contact", "Home")</li>
 6                     @*以下是添加的内容*@
 7                     <li>@Html.ActionLink("en-US", "ChangeLanguage", "Home",new { NewLang = "en-US",ReturnUrl=Request.RawUrl},new { @class="testclass"})</li>
 8                     <li>@Html.ActionLink("zh-CN", "ChangeLanguage", "Home", new { NewLang = "zh-CN", ReturnUrl = Request.RawUrl }, new { @class = "testclass" })</li>
 9                     <li>@Html.ActionLink("ja-JP", "ChangeLanguage", "Home", new { NewLang = "ja-JP", ReturnUrl = Request.RawUrl }, new { @class = "testclass" })</li>
10                 </ul>
11             </div>

 

 

 

6.Views/Home的三个页面我都加了显示ViewBag.Title值的代码

 

<h2>@ViewBag.Title.</h2>

 

 

7.现在我们来运行,看一下效果 


首次登录的时候因为url是localhost:50062/,没有语言项,所以读取浏览器默认语言“zh-CN”,然后重定向。 


这里写图片描述

 

以下是点击导航栏的en-US和ja-JP时的情况 


这里写图片描述

这里写图片描述

 

8.如果用户直接输入http://localhost:50062/Home/Index/ 
程序会重定向到http://localhost:50062/cookie里保存的语言项OR浏览器默认语言/Home/Index/

基本做到了和MSDN效果一样。

本文参考了:

http://www.cnblogs.com/zoro-zero/p/6674442.html 
http://www.cnblogs.com/CameronWu/p/5709442.html

转载于:https://www.cnblogs.com/riddly/p/9298058.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_711993.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018程序员必备的4大网站推荐(代码、编程、SQL等)

科技时代&#xff0c;程序员是一个热门行业&#xff0c;也是一个高薪行业&#xff0c;很多人很羡慕程序员&#xff0c;其实作为一名合格的程序员&#xff0c;要不断的提升自己&#xff0c;因为科技也在不断进步&#xff0c;所以&#xff0c;接下来小编分享5个程序员必备网站&am…

python如何爬取网站所有目录_用python爬虫爬取网站的章节目录及其网址

认识爬虫 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索…

最大的脚本网站_网站页面性能优化注意事项

为了更好地提升用户的浏览体验&#xff0c;《移动落地页体验白皮书4.0》中规定&#xff1a;页面的首屏内容应在1.5秒内加载完成。百度搜索对用户行为的研究表明&#xff0c;页面首屏的加载时间在1.5秒以内的页面&#xff0c;会带给用户流畅快捷的极速体验。近期发现有部分站点移…

基于django的视频点播网站开发-step10-后台评论管理功能...

本讲中&#xff0c;我们会讲到评论管理功能&#xff0c;数据库中的每一条是来自用户的评价&#xff0c;因此后台中的评论管理只有评论列表和评论删除功能&#xff0c;没有增加评论和编辑评论。 照例我们先添加评论管理的相关路由 path(comment_list/, views.CommentListView.as…

这个机器学习论文大众评审网站,要让每篇arXiv论文都得到讨论

圆栗子 发自 凹非寺 量子位 出品 | 公众号 QbitAI研究机器学习的人类们&#xff0c;通常喜欢把研究成果发上ArXiv。不过&#xff0c;ArXiv上面没有讨论板&#xff0c;公开讨论场所多集中在Reddit和推特上。而社交平台又无法提供纯粹的学术环境&#xff0c;讨论过程中很容易歪楼…

不要在网站上无限滚动!

人们在浏览网站的时候是喜欢用“无限滚动”&#xff0c;还是喜欢点击“阅读更多”或“查看更多”?无限滚动消除了分页的需要——分页是将数字内容分离到不同页面的过程。但这种方式真的好吗&#xff1f;作者 | Monish reddy译者 | 风车云马&#xff0c;责编 | 屠敏出品 | CSDN…

SEO技巧--代码优化

SEO技巧 一、搜索引擎工作原理 当我们在输入框中输入关键词&#xff0c;点击搜索或查询时&#xff0c;然后得到结果。深究其背后的故事&#xff0c;搜索引擎做了很多事情。 在搜索引擎网站&#xff0c;比如百度&#xff0c;在其后台有一个非常庞大的数据库&#xff0c;里面存储…

php网站用框架与不用的区别,做前端网页是不是必须要用网页框架

做前端网页是不是必须要用网页框架2017-09-15做前端网页是不是必须要用网页框架&#xff1f;个人感觉这分为两种情况&#xff0c;一种是能力超强&#xff0c;时间够用的情况&#xff0c;另外一种就是用前端网页框架&#xff0c;可以节约开发时间和减少工作量&#xff0c;这可以…

5个资源满满的网站,都是百度找不到的好资源,30T的硬盘瞬间爆满

日常最让人心烦的事莫过于在百度上找不到自己想要的资源了&#xff0c;如果不急可以慢慢找那还行&#xff0c;但是如果是非常急&#xff0c;现在就要用的话&#xff0c;真的瞬间就想砸了电脑。找不到自己想要的资源&#xff0c;配置再高的电脑也没用。其实&#xff0c;既然在百…

想快速了解AI各领域的前沿研究成果?可以来这个网站看看 | 资源

乾明 发自 凹非寺 量子位 报道 | 公众号 QbitAI想了解AI各领域的前沿研究成果吗&#xff1f;现在&#xff0c;只需要点几下鼠标就行了。近日&#xff0c;一个名为StateOfTheArt.ai的网站在NeurIPS大会期间上线&#xff0c;收罗了人工智能各个领域的前沿研究成果。并按照领域、任…

PC比电脑好玩的秘密是什么?答案就是因为有这些神奇的网站!

五花八门小工具合集http://www.nicetool.net/ 该网站真的很“乱”&#xff01;因为里面的小功能真的很多&#xff01;无论是Gif制作、证件照换底色、还是搞笑的王思聪微博生成&#xff0c;它都能让你得心意手&#xff01; 根据你的星座推荐电影https://magicmoviesorter.com/ 如…

傅立叶变换还能画简笔画?谷歌工程师开发的这个试玩网站火了| 附资源

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI无论是处理声音和图像信号&#xff0c;都必须用到傅立叶变换。其实除了这些“正经”用途&#xff0c;它还能做一些有意思的事情。最近&#xff0c;一位名叫Jez Swanson的谷歌工程师自己写了篇博客&#xff0c;教你用傅立叶变换画出…

程序员去交友网站找女友,结果意外了...

1024程序员节&#xff08;今天是活动最后一天&#xff09;&#xff0c;CSDN旗下的码书商店为程序员放个“价”&#xff0c;全场所有书籍8折&#xff0c;电子产品可以拥有大额优惠券&#xff0c;购买前可加文末客服微信领取优惠券哦&#xff01;卫衣原价249元&#xff0c;1024专…

刷新一次,生成一张逼真假脸:用英伟达StyleGAN做的网站,生出了灵异事件

栗子 岳排槐 假装发自 凹非寺量子位 出品 | 公众号 QbitAI一个新网站在国外火了。玩法很简单&#xff0c;每次刷新这个网站的页面&#xff0c;都能出现一张人脸。大多数情况下&#xff0c;都是一张眉目清晰、面含微笑的和善人脸。比如这样&#xff1a;不过&#xff0c;这个网站…

为了治好你的脸盲,这家表情包网站开源了一个明星识别器丨GitHub

郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI小鲜肉太多&#xff0c;让人分不清&#xff0c;需要AI替我识别&#xff0c;这又是谁家的爱豆。现在&#xff0c;有一家公司来拯救脸盲了&#xff0c;不是你熟悉的硅谷/后厂村大公司&#xff0c;而是一家动图表情包网站&#xff…

大型网站技术架构(四)网站的高性能架构

2019独角兽企业重金招聘Python工程师标准>>> 网站性能是客观的指标&#xff0c;可以具体体现到响应时间、吞吐量、并发数、性能计数器等技术指标。 1、性能测试指标 1.1 响应时间 指应用执行一个操作需要的时间&#xff0c;指从发出请求到最后收到响应数据所需要的时…

只需三种手段,将传统的网站的性能提高 24%!

对于技术人而言&#xff0c;性能优化是一个亘古不变的话题。而随着框架、语言、库等工具的不断演进&#xff0c;传统的优化手段是否仍然适用&#xff1f;在创新的环境之下&#xff0c;又有哪些较为捷径的优化手段&#xff1f;在本文中&#xff0c;作者将以一年前的网站为测试对…

SCPPO(十一):网站发布中的问题锦集—ReportViewer版本问题

强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainbed.net/zhanghan 【前言】 在小编的上篇博文《SCPPO:网站发布中的问题锦集—手动发布网站》中卖了个关子—遇到的问题&#xff08;4&#xff09;—部署过程中引用DLL与服务器不一致问题解决。当然在网站发布出…

SCPPO(十):网站发布中的问题锦集—手动发布网站

【前言】 现在做的项目是个维护性的项目&#xff0c;我们是第三期的末尾&#xff0c;最近正忙着验收。当然在验收前会有些功能需要修改&#xff0c;另外也会有新的需求需要实现&#xff1b;再加之最近有企业核对数据等等&#xff0c;所以网站的发布变成主要的工作之一。当然自己…

阿里云个人网站免费绑定SSL证书(超详细图文教程)

前言 一年前搭建了个人网站&#xff0c;由于个人小程序绑定必须需要绑定HTTPS&#xff0c;于是乎绑定了SSL证书&#xff0c;最近阿里云一直在提醒SSL证书一年到期&#xff0c;提示续费&#xff1b;SSL证书续费几千&#xff0c;于是乎查找方案&#xff0c;阿里云提供个人免费SSL…