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

news/2024/5/9 15:17:32/文章来源:https://blog.csdn.net/weixin_30297281/article/details/95137009

思路大概是这样的,将翻译成不同语言的词句以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/bright-lin/archive/2013/02/20/MVC_MutiLanguage.html

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

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

相关文章

阿里云系列——3.企业网站备案步骤---2018-1-4

网站部署之~阿里云系列汇总 http://www.cnblogs.com/dunitian/p/4958462.html 个人网站备案&#xff1a;http://www.cnblogs.com/dunitian/p/4958268.html 先说企业的域名实名认证&#xff1a;一张图就ok了 说下步骤&#xff0c;其实和个人差不多&#xff0c;简单过下吧 1.填写…

react + node + express + ant + mongodb 的简洁兼时尚的博客网站

前言 此项目是用于构建博客网站的&#xff0c;由三部分组成&#xff0c;包含前台展示、管理后台和后端。 此项目是基于 react node express ant mongodb 的&#xff0c;项目已经开源&#xff0c;项目地址在 github 上&#xff0c;喜欢的&#xff0c;欢迎给个 star 。 项目地…

ASP.NET网站部署问题集

这几天为了给客户演示我们的项目&#xff0c;发现原来程度在开发环境和部署环境中还不太一样&#xff0c;原本在开发环境中程度运行的好好的&#xff0c;而部署后装在服务器则可能产生不少的错误。因此记录下所遇到的问题&#xff0c;方便以后查询同时也希望能帮遇到相关问题的…

大型网站系统架构演化之路

大型网站系统架构演化之路 前言 一个成熟的大型网站&#xff08;如淘宝、天猫、腾讯等&#xff09;的系统架构并不是一开始设计时就具备完整的高性能、高可用、高伸缩等特性的&#xff0c;它是随着用户量的增加&#xff0c;业务功能 的 扩展逐渐演变完善的&#xff0c;在这个过…

接入高防之后网站问题需要排查的有哪些?

接入高防之后&#xff0c;为了保证业务最大程度的稳定&#xff0c;确认问题所在&#xff0c;墨者安全建议在切换本地的测试。本地测试步骤为&#xff1a;a.首先修改本地hosts文件&#xff0c;使本地对于被防护站点的请求经过高防&#xff0c;以Windows操作系统为例&#xff1a;…

利用jsonp抓取某网站数据详细示例

一、使用chrome浏览器自带web开发工具(F12,也可以使用fildder等工具)&#xff0c;找到请求的地址 这里的request url 就是我们需要请求的地址 然后点击response会发现返回的数据格式&#xff0c; 二、 新建html页面,代码如下 <!DOCTYPE html> <html> <head>&…

Ajax_实现动态网站的技术、php语法、php接口、前端渲染和后端渲染

1、实现动态网站的技术&#xff08;后端语言&#xff09; php、java&#xff08;jsp和php语言差不多&#xff09;、.net、Nodejs、python。。。 最简单的是学php 2、php基本语法  js中 js代码用script包起来&#xff0c;php中用<?php ?>包起来后&#xff0c;可以放…

《Linux就该这么学》第10章 使用Apache服务部署静态网站

《Linux就该这么学》! 学习网址&#xff1a;https://www.linuxprobe.com/ 灰常不错的网站和学习课程~~~! 第10章 使用Apache服务部署静态网站 网站服务&#xff1a;通过浏览器访问服务器&#xff0c;传送10.1 网站服务程序 目前能够提供Web网络服务的程序有IIS、Nginx和Apache等…

今天分享几个牛逼的网站,不知道你用过没?

点击蓝色字关注我们&#xff01;一个正在努力变强的公众号今天给各位小伙伴推荐几个我经常使用的网站&#xff0c;这些网站可以节省大家许多的时间&#xff0c;增大大家的工作效率。&#xff08;也没给我广告费&#xff0c;纯属分享&#xff09;1 Iconfonthttps://www.iconfont…

收藏!这段时间又发现了几个提高效率的网站!

前面写过一篇推荐网站的文章(今天分享几个牛逼的网站&#xff0c;不知道你用过没&#xff1f;)&#xff0c;感觉反响还不错。这段时间又发现了几个比较牛逼的网站&#xff0c;分享给大家&#xff0c;让大家的工作效率更高。马可菠萝https://www.macbl.com/前段时间用上了MAC系统…

自己如何开发一个B站视频下载网站?

点击上方“Python进击者”&#xff0c;关注我&#xff01;坚持初心&#xff0c;坚持原创前言hello&#xff0c;各位小伙伴&#xff0c;这是公众号改名后的第一篇原创。不管改不改名&#xff0c;我都是会坚持初心&#xff0c;记录技术&#xff0c;不搞虚的&#xff0c;希望大家能…

那些X音无水印视频下载网站怎么实现的?

点击上方“Python进击者”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达前言看到很多朋友都在用网上一些某音无水印下载&#xff0c;作为程序员&#xff0c;咱们自己来整一个。今天咱们来说说某音无水印下载的思路&#xff0c;没有为什么&#xff0c;直接往…

我收藏夹里五个贼好用的网站分享给你了

点击上方“Python进击者”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达前言各位小伙伴大家好&#xff0c;今天又来分享一波自己收藏的超好用的网站&#xff0c;之前写过两期实用网站分享&#xff0c;感觉反馈都不错。今天抽空再来跟大家分享一波&#xff0…

五个吊炸天的网站

点击上方“Python进击者”&#xff0c;选择“星标”公众号超级无敌干货推送给你&#xff01;&#xff01;Python进击者第185篇原创文章前言 大家好&#xff0c;我是Kuls。 很久没来给大家分享一些牛逼的网站了&#xff0c;今天来给大家推荐一波。如果之前的好站分享没看过&…

其他工具网站收集

Unsplash.it – 图片占位符&#xff0c;支持个性化 Unsplash.it 是一个使用漂亮的图像作为占位符的工具。只要把你的图像尺寸&#xff08;宽与高&#xff09;放到网址后面的参数中&#xff0c;你会得到一个占位符。你可以很容易地得到一个随机图像或者是一个模糊图像。也支持获…

利用网站上传漏洞使用一句话木马控制服务器

一句话木马 常用于php、asp、aspx php <?php echo shell_exec($_GET[cmd]);?> asp <%execute(request("value"))%> aspx <% Page Language"Jscript"%> <%eval(Request.Item["value"])%> jsp 无回显执行系统命令 <%…

网站服务器购买配置选购方案

云服务器 的配置选择&#xff0c;和网站或应用的类型、访问量、数据量大小、程序质量等因素有关&#xff0c;建议和您的网站或应用的开发技术人员沟通&#xff0c;选择最适合您的配置。 如果您没有技术人员可提供建议&#xff0c;可以参考我们的建议进行配置选择。网站初始阶段…

惊爆:Alexa 全球排名网站即将关闭

作者 | 辛晓亮近日&#xff0c;亚马逊宣布&#xff0c;计划于明年 5 月份关其全球网站排名网站 Alexa。目前 Alexa 已经停止付费服务的新用户注册&#xff0c;现有付费用户可以使用到 2022 年 5 月 1 日。Alexa 在官方公告中称“25 年前&#xff0c;我们创立了 Alexa Internet&…

大型网站技术架构(六)网站的伸缩性架构

2019独角兽企业重金招聘Python工程师标准>>> 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能&#xff0c;通过不断地向集群中添加服务器来增强整个集群的处理能力。“伸”即网站的规模和服务器的规模总是在不断扩大。 1、网站架构的伸缩性设计 网站的…

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

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