首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 压缩工具
基于gettext的asp.net网站多语言解决方案 _asp.net技巧
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

很久以前就想写这篇blog,系统的介绍一下偶是如何使用Gettext给blogwind做多语言界面的……

很不喜欢.net内置的多语言解决方案……因为,它使用xml……编辑xml是一件很痛苦的事情……我也不想给每个页面弄一堆resouce文件……光看着这些资源文件我就很晕……

偶是从Django里面知道有Gettext这套在开源软件中广为使用的程序多语言解决方案的……

最喜欢它的地方是它默认直接使用英文原文作为字符串的键值……而不是像.net默认的那样,给所有的字符串加上一个编号……而当翻译不存在的时候,.net是会抛出异常,而Gettext是会返回原文……这样子,我可以部分给网站制作一个语言版本……而不需要一步到位……

--------------------------------------------

Gettext的翻译文件为.po文件……其实就是纯文本文件……其内容类似:

#: D:/web/blogwind/default.aspx:87
msgid "Loading..."
msgstr "读取中..."

第一行代表偶需要翻译的字符串在程序中的位置……msgid则是需要翻译的字符……msgstr则是翻译的结果……很简单……

偶在做网站的时候,把所有需要翻译的字符串都使用一个函数包涵起来……比方说:
    ph.g("编写网志")

然后,自己写了个小python程序去搜索偶网页程序中所有的 ph.g("XXXXX"),并生成/更新现有的po文件……

可以用的PoEdit来编辑po文件……非常方便……因为注释中可以放待翻译的字符串在源程序中的位置,偶翻译的时候还随时可以查阅源程序,看看究竟是在什么地方用到这个词句……以保证遇到一词多译时能够选择正确的一个翻译……

编辑完po文件之后,便需要使用Gettext包中msgfmt这个小程序把po文件直接编译为.net使用的资源dll……命令类似:

msgfmt --csharp -r blogwind -l zh-CHS -d . blogwind.po

--csharp 是指定输出为.net的dll……呃……需要指定这点,是因为它还可以输出为java / tcl /qt有几个.net resource文件等格式……对于.net的支持是后来新加的……如果报错,确定你使用的是0.13.1版或者更新的Gettext库……

-r blogwind 是指dll的资源名称为blogwind

-l zh-CHS 则是语系

最后的则是待编译的po文件名了……


----------------------------------------

Gettext有C#的"wrapper"……源码在GnuWin32里面就有……它这个wrapper……wrap的是.net的System.Resources类……使它符合Gettext找不到翻译便返回原文的做法而已……顺便再搞定一下资源缓存之类的……一共也就几百行代码……

不过,它这个版本似乎是为桌面程序设计的……要在网页中使用,还需要做点小修改……它读取那些msgfmt生成的dll时,使用的是:Assembly.LoadFrom(.....)

这意味着它每次只是读一个dll……对于单一用户的桌面程序来说,每次使用一种语言是正常……可是,对于网站来说,偶需要同时提供不用的语言界面给不同的用户……所以……需要改成Assembly.LoadAssembly(.....)


------------------------------------------

嗯,到了最后,便是调用了……注意,下面出现的代码都是偶自己写的……大家完全没有必要照偶的方式做……

Imports GNU.Gettext

Public Class lh
  lh = language Helper
  Public Shared catalog As GettextResourceManager

  Public Shared Sub init(ByVal name As String, ByVal dictpath As String)
    catalog = New GettextResourceManager(name, dictpath)
  End Sub
End Class

在Global.asax的Application Start中调用一下:
        lh.initcate("blogwind", Server.MapPath("langs"))

恩,这样子,它便会去网站根目录下langs目录寻找它需要的各种语言dll了……当然,blogwind这个类名以及langs这个目录可以随意改成别的……

最先偶写到的那个ph.g(..)函数其实是:
  Public Function g(ByVal word As String) As String
    Dim cu As New System.Globalization.CultureInfo(langs.getLangString(Me.lang))
    Return lh.catalog.GetString(word, cu)
  End Function

ph是pagehelper……呃……我知道,我起类名很规范……总之,我在pagehelper里面还自己保存了当前浏览者的语言信息放在langs / pagehelper里面……通过:
    Dim cu As New System.Globalization.CultureInfo(langs.getLangString(Me.lang))
来获得相应的CultureInfo,再传给Gettext……

比方说,语系是zh-CHS,待寻找翻译的word是“编写网志”,Gettext便会去webroot/langs/zh-CHS目录中寻找blogwind.resources.dll这文件……找到了,便Load它,再寻找"编写网志"等等……

因为这些翻译的dll是动态读取的……

其实完全可以做到让程序在app_start中自动去遍历langs中的子目录,看看都有哪些语系……然后自动生成一个菜单在网页中供用户选择……以后添加语言,其实就简单到往这个目录中建立目录扔dll了……程序本身,丝毫不需要做任何修改……


-----------------

当然,上面说的,仅仅是最简单的字符串翻译……网页中还有图片……语言相关的css等等细节……而且,实际上,我在使用Gettext的时候还自己写了个小python程序(几十行的样子)去生成/维护po文件……若po文件不能自动生成、维护更新的话,管理起来是很麻烦的……

上面的说明也是非常简略的……仅仅只是说明要给asp.net网站提供多语言界面……除了使用官方鼓吹的资源文件方式外,还可以有别的选择……而对于Gettext这个选择,偶觉得更加优雅些而已…… www.blogwind.com 的多语言界面,便是使用上述的方式实现的……

至于哪里下载Gettext以及msgfmt等工具,wrapper中的那行修改具体是在哪里等问题,就请不要来问偶了……

这里,有偶修改重新编译过后的版本:
http://www.cnblogs.com/Files/wuvist/GetText.zip


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·web打印的另类方法-ASP教程,打印相关
·Java简单类型进行精确浮点数运算-JSP教程,Java技巧及代码
·使用JAVAMAIL发邮件的一个例子-JSP教程,邮件相关
·中国移动本地传输网建设方案初探
·传输系统中的时钟同步技术
·JSP学习经验总结(转)-JSP教程,Jsp/Servlet
·WEB打印,去页眉和页脚-ASP教程,打印相关
·Native XML数据库技术详解-.NET教程,XML应用
·jsp生成html--readtemplates-JSP教程,Jsp/Servlet
·下拉框反回选定的文字 (修改页面经常用到)-ASP教程,ASP应用
最新文章
·在xp中如何使用windows vista屏保_windows xp
·photoshop调色:cmyk模式处理单色调特效_photoshop教程
·视频分享网站视频广告发展面临的问题_营销推广
·难以置信,这样的网站每月盈利上千万_营销推广
·大站做百度主题推广 小站做google adsense_网赚技巧
·方兴东:保留alexa插件才能给站长带来快乐_站长访谈
·网友天下ceo叶灵:欢迎大家看web2.0笑话_站长访谈
·我们应该如何运营网站_站长心得
·网站从业者还要更加务实才能赚钱_站长心得
·炼成高级网络编辑的三大原则_站长心得
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭