转载-支持中英文多语言浏览的MVC网站实例

news/2024/5/12 20:49:23/文章来源:https://blog.csdn.net/weixin_30951231/article/details/96192498

思路大概是这样的,将翻译成不同语言的词句以xml键值对的格式分别存在不同文件夹下,扩展MVC HtmlHelper, 在扩展方法里根据用户当前访问Action所在的路径以及当前所选的语言类型读取语言文件夹下的xml文件,再通过HtmlHelper传过来的key获取对应的value。若找不到,则将key自动添加到相应的文件里面。切换语言时将所选的语言类型保存在Session,再Redirect。

写一个静态类LangHelper,用以操作语言文件。本例中,将中文、英文语言文件分别保存在网站根目录下Resources下的zh-cn和en文件夹里面,文件类型为res。为防止每次访问都去读取操作那些语言文件,我声明一个Dictionary静态变量,用来保存访问过的语言文件里的key\value,在下次(别的用户)访问时先从已保存在服务器内存的静态字典中读取。这样就加快了访问速度。

View Code
复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Web;namespace Utility
{public static class LangHelper{//全局静态变量private static Dictionary<string, LanguageInfo> Languages = new Dictionary<string, LanguageInfo>();public static string GetLangString(string key, string langType){if (String.IsNullOrEmpty(key))throw new ArgumentException("key can not be null!", "key");if (String.IsNullOrEmpty(langType))throw new ArgumentException("language type can not be null!", langType);string filename = "common";langType = langType.ToLower();LanguageInfo info = GetLanguageInfo(langType, filename);//默认先到通用的语言文件里去找if (info.LanguageDictionary.ContainsKey(key.ToLower()))return info.LanguageDictionary[key.ToLower()];else{string filePath = HttpContext.Current.Request.FilePath;if (filePath == HttpContext.Current.Request.ApplicationPath){info.AddKey(key, key);//添加到通用语言文件return key;}else{if (filePath[0] == '/') filePath = filePath.Substring(1, filePath.Length - 1);string[] words = filePath.Split(new char[] { '/' });filename = String.Format("{0}", words[0]);//当前Controller所在的文件夹名字,也即语言文件的名字info = GetLanguageInfo(langType, filename);if (info.LanguageDictionary.ContainsKey(key.ToLower()))return info.LanguageDictionary[key.ToLower()];else{info.AddKey(key, key);return key;}}}}private static LanguageInfo GetLanguageInfo(string langType, string filename){string cacheKey = String.Format("{0}{1}", langType, filename);LanguageInfo info = null;if (Languages.ContainsKey(cacheKey))info = Languages[cacheKey];else{info = new LanguageInfo(langType, filename);if (filename != "common") Languages.Clear();Languages[cacheKey] = info;}return info;}}public class LanguageInfo{public string LanguageCode { get; set; }public string ResourceFile { get; set; }public XElement RootElement { get; private set; }public Dictionary<string, string> LanguageDictionary { get; private set; }public LanguageInfo(string languageCode, string resourceFile){this.LanguageCode = languageCode;this.ResourceFile = HttpContext.Current.Server.MapPath(String.Format("~/Resources/{0}/{1}.res",languageCode, resourceFile));this.LanguageDictionary = this.BuildLanguageDictionary();}/// <summary>/// 读取XML文件构建语言字典/// </summary>/// <returns></returns>public Dictionary<string, string> BuildLanguageDictionary(){Dictionary<string, string> dic = new Dictionary<string, string>();if (System.IO.File.Exists(ResourceFile))RootElement = XElement.Load(ResourceFile);else{RootElement = new XElement("language");}IEnumerable<XElement> adds = RootElement.Elements();foreach (XElement add in adds){string k = add.Attribute("key").Value;string v = add.Attribute("value").Value;dic[k.ToLower()] = v;}return dic;}public void SaveKey(string key, string value){if (String.IsNullOrEmpty(key) || string.IsNullOrEmpty(value)) return;XElement e = RootElement.Elements().Where(a => a.Attribute("key").Value.ToLower() == key.ToLower()).FirstOrDefault();if (e == null) return;e.SetAttributeValue("value", value);RootElement.Save(ResourceFile);}/// <summary>/// 向语言文件添加键值对/// </summary>/// <param name="key"></param>/// <param name="value"></param>public void AddKey(string key, string value){XElement newel = new XElement("add");newel.SetAttributeValue("key", key);newel.SetAttributeValue("value", key);RootElement.Add(newel);try{RootElement.Save(ResourceFile);}catch (Exception e){}LanguageDictionary[key.ToLower()] = value;}public void RemoveKey(string key){if (String.IsNullOrEmpty(key)) return;XElement e = RootElement.Elements().Where(a => a.Attribute("key").Value.ToLower() == key.ToLower()).FirstOrDefault();if (e == null) return;e.Remove();RootElement.Save(ResourceFile);}}
}
复制代码

GlobalizeUtil 类用来控制当前用户选择的语言类型

View Code
复制代码
public class GlobalizeUtil{ public static string GetCurrentLanguage(){            object lang = HttpContext.Current.Session["language"];if (lang == null)return "zh-cn";elsereturn lang.ToString();            }public static void SetCurrentLanguage(string langCode){HttpContext.Current.Session["language"] = langCode;}}
复制代码

扩展MVC HtmlHelper,方便在View中调用。扩展方法名为String,需要一个string类型参数,此参数即为key,当语言文件中不存在此key时,将此key直接作为value输出,并保存在语言文件中。

View Code
复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using System.Web;
using System.Web.Mvc;
using System.Xml.Linq;
namespace Utility
{public static class Extensions{/// <summary>/// 在Mvc View中调用/// </summary>/// <param name="htmlHelper"></param>/// <param name="key"></param>/// <returns></returns>public static string String(this HtmlHelper htmlHelper, string key){return htmlHelper.Encode(GetLangString(key));}/// <summary>/// 在C#代码中使用/// </summary>/// <param name="key"></param>/// <returns></returns>public static string LangString(string key){return GetLangString(key);}private static string GetLangString(string key){            string langType = GlobalizeUtil.GetCurrentLanguage();return LangHelper.GetLangString(key, langType);} } }
复制代码

在View中的使用如: Html.String("Username"),在common.res语言文件里面就会添加一条 <add key="Username" value="Username" />记录,将zh-cn文件夹下的common.res里这条记录的value改为"用户名",则当用户在中英文之间切换时就会按不同语言显示。

效果图一:

效果图二:

不知有没有更好的方法,欢迎指教!

转载于:https://www.cnblogs.com/xybs/archive/2013/02/20/2919688.html

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

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

相关文章

js实现倒计时 类似团购网站

一、demo与效果展示 为节约时间&#xff0c;我就直接套用了企鹅团的界面作为demo的背景。因为是倒计时&#xff0c;所以需要一个固定的时间&#xff0c;为了n年后&#xff0c;某位仁兄打开demo页面依然在倒计时&#xff0c;所以我把倒计时时间设成了2050年7月30日中午12点整&am…

阿里云+Ubuntu+LAMP+WordPress搭建个人博客网站

首发于个人网站http://139.196.86.184&#xff08;域名备案中&#xff09;&#xff0c;转载注明作者与出处&#xff0c;谢谢。 搭个人网站一般有两种选择&#xff1a; GitHub Pages Hexo / jekyl服务器 WordPress / Typecho之前试过1&#xff0c;现在试试2&#xff0c;个人选…

python使用requests和beautifusoup模块爬取学校网站的就业中心信息,并发送至自己的邮箱...

2019独角兽企业重金招聘Python工程师标准>>> 最近有一件非常难过以及无限悲伤的事情发生了&#xff0c;那就是Firebug停止更新和维护了&#xff01;&#xff01; Firebug作为一款前端调试工具&#xff0c;同时也是我接触的第一款前端工具&#xff08;虽然我仅使用它…

基于Vue+Vuex+iView的电子商城网站

MALL-VUE 这是一个基于VUE VUEX iView做的一个电商网站前端项目, 附带前后端分离实现版本(在forMallServer分支)&#xff0c;欢迎fork或star项目地址: https://github.com/PowerDos/Mall-Vue 项目预览地址(demo)&#xff1a; https://powerdos.github.io/Mall-Vue/index.html…

网站服务器2核4核怎么选,云服务器2核和4核的区别

云服务器2核和4核的区别 内容精选换一换云服务器创建完成后&#xff0c;数据盘需要初始化后才能使用。当使用弹性伸缩为伸缩组增加数量较多的云服务器时&#xff0c;您就需要逐一手动初始化数据盘&#xff0c;将会占用较长时间。本节为您介绍通过脚本自动化完成初始化磁盘的操作…

开通个人博客啦,附上Vultr+WordPress建站全面指南

历时一个月&#xff0c;终于搭起个人博客&#xff0c;并且将以前的文章都迁移到新的网站了&#xff0c;其中还经历了迁移wordpress的问题&#xff0c;网上虽然关于wordpress的问题解答有很多&#xff0c;但是有些不适用&#xff0c;也不全面&#xff0c;这里我将记录下建站的点…

打包Asp.Net 网站成为一个exe 方便快捷的进行客户演示

2019独角兽企业重金招聘Python工程师标准>>> 在Asp时代有一个NetBox 产品可以把整个Asp网站AllInOne的打包成一个exe&#xff0c;在没有IIS的情况下可以单独运行这个exe来开启整个网站。在Asp.Net 下一直没有类似的产品出现&#xff0c;可能是IIS已经非常的强大了&a…

你应该知道的关于SEO和Javascript的6个事实

你应该知道的关于SEO和Javascript的6个事实 了解JavaScript的基础知识已成为SEO专家的一项重要技能&#xff0c;尽管到目前为止&#xff0c;这两个学科之间的关系一直存在争议。 关于SEO和JavaScript的关键问题是发现搜索引擎机器人是否可以正确地感知网站内容并实际评估用户体…

加速,加速,再加速:来自Google的网站加速技巧大全

困扰许多网站所有者很久的一个问题是网站访问速度总是那么慢。想购买独立带宽&#xff0c;预算不允许&#xff0c;想购买CDN加速&#xff0c;价格又太贵。那有没有经济实惠的解决办法呢&#xff1f;从目前的大环境来分析&#xff0c;我们也只有通过技术手段来解决这个问题了。 …

28.分析采集美团网站信息-3

28.分析采集美团网站信息-3 今天又捋一下思路&#xff0c;在兼职&#xff0c;也没时间去坐下来仔细思考分析问题&#xff1a;1.首先获取分类&#xff0c;比如先获取美食&#xff0c;再划分其分类&#xff0c;分类里有火锅、蛋糕、小吃快餐等等后面都显示了共有多少个搜索结果。…

Asp.net压缩网站中的文件

为了说明自定义虚拟路径&#xff0c;这里弄个示例&#xff0c;仅仅用一个压缩包存放一个网站的多个文件。 这个东西是要需要通过实现3个抽象类来实现&#xff1a; System.Web.Hosting.VirtualPathProvider&#xff1b;System.Web.Hosting.VirtualDirectory&#xff1b;System.W…

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样&#xff0c;你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

网站的SEO以及它和站长工具的之间秘密(转)

博客迁移没有注意 URL 地址的变化&#xff0c;导致百度和 google 这两只爬虫引擎短时间内找不到路。近段时间研究了下国内最大搜索引擎百度和国际最大搜索引擎google的站长工具&#xff0c;说下感受。 百度的站长工具地址&#xff1a;http://zhanzhang.baidu.com/dashboard/ind…

大型网站技术架构(八)网站的安全架构

2019独角兽企业重金招聘Python工程师标准>>> 从互联网诞生起&#xff0c;安全威胁就一直伴随着网站的发展&#xff0c;各种Web攻击和信息泄露也从未停止。常见的攻击手段有XSS攻击、SQL注入、CSRF、Session劫持等。 1、XSS攻击 XSS攻击即跨站点脚本攻击&#xff08;…

Nodejs建站笔记-注册登录流程的简单实现

1. 使用Backbone实现前端hash路由 登录注册页面如下&#xff1a; 初步设想将注册和登录作为两个不同的url实现&#xff0c;但登录和注册功能的差距只有form表单部分&#xff0c;用两个url实现显然开销过大&#xff0c;所以最终方案为使用hash作为前端路由&#xff0c;根据url的…

搜索引擎优化(SEO)解决方案

搜索引擎优化&#xff08;SEO&#xff09;解决方案 在此之前&#xff0c;希望大家能重新审视搜索引擎&#xff0c;通俗来讲就是我们日常所用的百度、谷歌、搜狗、雅虎等。磨刀不误砍柴工&#xff0c;知己知彼&#xff0c;百战不殆&#xff01; 一、搜索引擎是什么&#xff1f; …

关于大型网站技术演进的思考(一)--存储的瓶颈(1)

转自&#xff1a;http://www.cnblogs.com/sharpxiajun/p/4237704.html 前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训&#xff0c;两天12个小时信息量非常大&#xff0c;知识的广度和难度也非常大&#xff0c;培训完后我很难完整理出全部听到的知识&a…

怎样高效利用PPT模板网站找到适合自己的PPT模板

我相信许多人喜欢在需要制作PPT时制作PPT。虽然我已经学到了很多PPT制作技巧&#xff0c;但我也收集了很多图片&#xff0c;图标&#xff0c;PPT模板等&#xff0c;但是当我真正使用它时&#xff0c;我仍然不知道该怎么做&#xff0c;然后我只是用了模板直接&#xff0c;节省时…

电子商务网站比较常用的缓存策略架构

缓存是分布式系统中的重要组件&#xff0c;主要解决高并发&#xff0c;大数据场景下&#xff0c;热点数据访问的性能问题。提供高性能的数据快速访问。 这次主要是分享下自己觉得比较通用的一个缓存策略的架构方案,也是比较 容易理解的.欢迎吐槽. 有更牛逼的也欢迎大家说下: 缓…

Cookie注入靶场:模拟公司网站

靶场 这是一个靶场的样子 随意点击一个连接&#xff0c;发现是有id号的&#xff0c;但是id前面有shownews.asp这个东西。这个就是典型的Cookie注入标志 Cookie注入标志 有着如同.asp?idxxx的url通常我们先去掉前面的?idxxx 看它是否显示正常&#xff0c;如果不正常&#x…