基于语言文件的asp.net全球化解决方案
2006-11-05 14:32
671 查看
方案描述
本方案采用一种语言一个资源文件的方法,能够有效提高资源文件的可维护性。而VS.NET提供的一个WebForm一个资源文件的方案,无法满足统一维护的需要。
实现步骤
1. 准备资源文件
资源文件通常有.resx和.resources两种,前者是xml文件,后者是二进制文件。本方案中采用.resources作为资源文件,因此需要一个第三方提供的资源编辑器对资源文件进行编辑,我使用的是Resourcer,反正只要能编辑资源文件并且保存为.resources文件的软件都可以。在资源文件中添加一些string资源,通常情况下,只会用到string资源,有些项目可能需要全球化的图片资源,原理里一样的,本文就不涉及了。
资源文件的命名是有规定,该方案中,我把所有的资源文件名设为business.[culture].resources,其中business这个名字可以改,可以改成任何一个你喜欢的名字,[culture]部分必须使用.net允许的文化缩写,如zh-cn、ja-jp、en-us等。
2. 把资源文件放入项目
为了方便管理,我把所有的资源文件放在网站的一级目录Resources中。由于读取资源文件时要用到资源文件的物理位置,建议把Resources目录直接放在wwwroot下,否则会因为路径问题而变得很麻烦。
3. 增加默认语言设置
在web.config中加入<add key="cultureName" value="zh-cn" />,表明默认情况下使用zh-cn作为默认语言文化。
4. 通过Session设置当前语言
我们用一个Session变量——Session["cultureName"]来告诉每一个页面应该使用哪种语言进行初始化。当Session["cultureName"]==null时,表明该变量未设置过,就直接用默认语言文化,即web.config中的设置值。
如果用户想改变当前的界面语言,只需要设置Session["cultureName"]为指定的文化缩写即可。
全球化资源辅助管理类
通过这个类你不需要了解ResourceManager的使用方法,就可以完成全球化的初始化和资源读取工作。该类初始化时需要传入一个Page对象,该对象将用于获得Session变量值。一般情况下,大家只需要用该类的GetString()方法就可以了。
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 全球化资源辅助管理类
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
public class ResourceHelper
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private ResourceManager _rm=null;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private Page _page=null;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public ResourceHelper(Page page)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
_page=page;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
PrepareResource();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 获得当前文化,从Session["cultureName"]取
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
protected CultureInfo GetCurrentCulture
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
get
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if(_page.Session["cultureName"]!=null)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return CultureInfo.CreateSpecificCulture(_page.Session["cultureName"].ToString());
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
else //如果Session未设置,则直接从web.config中读取默认设置
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return CultureInfo.CreateSpecificCulture(System.Configuration.ConfigurationSettings.AppSettings["cultureName"]);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 初始化资源管理
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public void PrepareResource()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
_rm = ResourceManager.CreateFileBasedResourceManager("business",_page.Server.MapPath("resources")+System.IO.Path.DirectorySeparatorChar,null);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 获得资源指针
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
protected ResourceManager resource
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
get
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if(_rm==null)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
PrepareResource();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return _rm;
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
/**//// <summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// 获得资源字符串
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// <param name="ResourceID">资源ID</param>
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
/// <returns></returns>
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string GetString(string ResourceID)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.cnblogs.com/Images/dot.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return this.resource.GetString(ResourceID,this.GetCurrentCulture);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
为了方便大家学习,做了个Demo给大家参考
关于Demo的一些说明:
1. 本演示在WindowsXP Professional+VS.NET2003环境下调试通过
2. 演示中提供了三种语言的资源文件:business.zh-cn.resources, business.en-us.resources,business.ja-jp.resources
它们都放在Resources目录下,每个资源文件中有001_01、001_02、001_03三个string资源,分别表示用户名、密码、生日。
3. 通过选择下拉式列表中的语言,然后按“确定”按钮,可以完成语言切换
Feedback
# re: 基于语言文件的asp.net全球化解决方案 回复
2005-07-11 21:24 by workjie老大,题目不要那么大啊。 呵呵
这种应用还是很多朋友采用的方式,没有什么特别啊?
而且我遇到过在切换的时候,偶尔有时会没有办法读取到指定的语言文件!
和资源xml文件有关,每次重新复制一下就 OK
# re: 基于语言文件的asp.net全球化解决方案 回复
2005-07-12 09:57 by Tony Qu那你觉得这篇文章叫啥名字比较好?我主要是写给新手看的。
# re: 基于语言文件的asp.net全球化解决方案 回复
2005-07-16 09:16 by no。4写的不错。不过但是对于我这种新手来说还是有点看不懂啊
# re: 基于语言文件的asp.net全球化解决方案 回复
2005-07-24 11:59 by guoweidong感觉这样做,真的比较烦。
# re: 基于语言文件的asp.net全球化解决方案 回复
2005-11-28 13:45 by chenxiao這樣做已經算是簡單的了,在asp.net 2.0中,已經有更好的解決方案提供。要你自己動手做的東西不多,但是系統做的東西可是真多啊。
# re: 基于语言文件的asp.net全球化解决方案 回复
2005-11-29 06:09 by Tony Qu@chenxiao
看过VS2005的本地化方法之后,感到微软在软件易用性方面做得太强了,这方面有待中国程序员好好学习
# re: 基于语言文件的asp.net全球化解决方案 回复
2006-10-08 18:02 by xx[匿名]想请教一个问题:如果要使资源文件过于庞大,那么在加载到内存中的时候过于频繁,会不会直接影响了网站的效率?
相比之下,是不是微软的一个页面一个资源文件的做法会不会更贴合实际?因为那样会比较节省呢?
# re: 基于语言文件的asp.net全球化解决方案 回复
2006-10-08 18:03 by xx[匿名]好几百页的字符串表达式都必须要用几个资源文件来表示,我觉得会不会太。。。。。。。大叻。。。
# re: 基于语言文件的asp.net全球化解决方案 回复
2006-10-11 07:39 by Tony Qu可以使用基于数据库资源存储方案,语言文件的方案通常仅支持并发数小于50IP的
# re: 基于语言文件的asp.net全球化解决方案 回复
2006-11-04 13:30 by Gavin.W.Lai感谢,今天TEAM LEADER 就叫我做一个这样的DEMO给它看了,
我是新手,谢谢你的DEMO.我可以参考着做了.
再次感谢.
相关文章推荐
- 基于语言文件的asp.net全球化解决方案
- 基于语言文件的asp.net全球化解决方案
- 基于语言文件的asp.net全球化解决方案
- 基于语言文件的asp.net全球化解决方案
- 基于Gettext的asp.net网站多语言解决方案
- 基于Gettext的asp.net网站多语言解决方案
- 基于jQuery和Flash的多文件上传插件uploadify在asp.net下session丢失解决方案
- 基于jQuery和Flash的多文件上传插件uploadify在asp.net下session丢失解决方案
- 基于ASP.NET实现全球化
- Asp.Net网站部署-上传文件限制解决方案
- asp.net模态窗口下载文件解决方案
- ASP.NET MVC 3 Razor 多国语言参考解决方案 补充二
- ASP.Net 类库引用文件路径问题及解决方案
- ASP.NET MVC下基于异常处理的完整解决方案
- asp.net 2.0 多语言网站的解决方案
- Asp.Net 上传大文件专题 解决方案终极篇(原项目是“我不是圣人”写的)
- ASP.net下大文件上传的解决方案及WebbUpload组件源码
- win7 asp.net下 CS0016: 未能写入输出文件 解决方案
- ASP.NET MVC 多语言解决方案
- (转)win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案