网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > ASP.net > 正文

使用gettext技术为ASP.NET网站实现国际化支持

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/01/06

不知道有多少人对这个题目感兴趣,因为最近在做一个网站玩玩,有点闲心给网站加了国际化支持。虽然ASP.NET已经有ResourceManager这个类,并且有标签实现国际化的支持了,但是它的问题是,ResourceManager对每一个需要翻译的句子都要求有一个键(Key):

1. 要先创建一个.resx文件,在Visual Studio里,有一个工具编辑这个.resx文件。

2. 对每一个需要翻译的句子,添加一个键值对。

3. 然后在代码里,使用ResourceManager或者<%#这个标签,通过定义好的键来告诉ASP.NET在运行的时候查找正确的翻译文本。

太麻烦了,不知道大家有什么其它好的方法,我使用的方法是从unix gettext那边借用过来的理念。

理念

Gettext的理念很简单,文本翻译吗,说白了就是把一句话翻译成另外一句话嘛,这个要翻译的句子,本身就可以当做检索要用的关键字,何必要再新建一个另外的关键字呢?gettext的方式很简单:

1. 在源代码里,你可以编写一个特殊的函数执行翻译,这个函数只接受一个参数,就是要翻译的文本。

2. 使用一个辅助程序xgettext扫描源代码的文本,将所有待翻译的文本都找出来,保存到一个文件里,一般来说,这个文件叫做po文件。

3. 因为ASP.NET程序不支持po文件,再使用一个辅助程序msgfmt将po文件转换成ASP.NET支持的.resources文件。这个方法的优点在于:

1. 你在编写程序的时候,不用为需要翻译的句子,定义一个新的关键字——这个关键字一般都比较难理解,也不好取名。在维护代码的时候很麻烦——因为你需要不停地在.resx编辑器和cs文件之间切换。

2. 不知道怎么搞的,很难找到可以编辑.resx文件的工具,而gettext生成的po文件是普通的文本文件,而且格式非常简单。这样在翻译的时候,就很方便了。

做法

比如写了一个ASP.NET MVC程序,当然窗体(Web Form)形式的程序理念也是一样的,

1. 写一个控制器和视图页的基类,里面都有一个执行翻译的函数T:

  1. public class G18nController : Controller  
  2. {  
  3. public CultureInfo Culture { getset; }  
  4. public string T(string message)  
  5. {  
  6. var obj = HttpContext.GetGlobalResourceObject("website", message, Culture);  
  7. var translated = obj == null ? null : obj.ToString();  
  8. if (string.IsNullOrEmpty(translated))  
  9. return message;  
  10. else 
  11. return translated;  
  12. }  
  13. }  
  14. public abstract class G18nWebViewPage<U> : WebViewPage<U>  
  15. {  
  16. public CultureInfo Culture { getset; }  
  17. public string T(string message)  
  18. {  
  19. var obj = HttpContext.GetGlobalResourceObject("website", message, Culture);  
  20. var translated = obj == null ? null : obj.ToString();  
  21. if (string.IsNullOrEmpty(translated))  
  22. return message;  
  23. else 
  24. return translated;  
  25. }  
  26. }  
  27.  

上面的Culture属性,可以从Request.Headers["Accept-Language"]属性取得。

2. 在代码里,针对每个要翻译的句子,直接调用这个T函数好了:

  1. throw new ArgumentException(string.Format(T("找不到ID为{0}的项目!"), id)); 

3. 程序写好后,要开始翻译,调用gettext程序将

  • 上一篇资讯: 浅入浅出 Server Push
  • 网学推荐

    免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号