All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
使用javascript检测浏览器的相关特性_JavaScript技术_编程技术
SQL,Server,2008-新位置感知数据类型_mssql学习_编程技术
信吗?令你的网站获得任意google,pr值的方法_php资料_编程技术
数据库死锁导致网站站点访问不了之解决方案_[SQL,Server教程]
ASP.NET中数据校验部分的封装与应用_.net资料_编程技术
C#应用:读取指定盘符的硬盘序列号_[Asp.Net教程]
动态网页制作PHP之看实例学正则表达式_php资料_编程技术
PHP使用者注意:PHP4.3.10以下版本出现严重漏洞_[PHP教程]
交易失败[MSSQL],SQL,Server,不存在或访问被拒绝。_mssql学习_编程技术
理解C#,3.0新特性之Extension方法浅议_.net资料_编程技术
Reading number is top 10 pictures
Exquisite decoration is not paying too much1
The real super beauty15
中国文革时期的色情图片2
Catch prostitution woman in China
身材野火台灣美女2
Absolutely shocked. National geographic 50 animal photographys10
Discharge accidentally Actresses by the breast4
南昌铁路局宜春车务段攸县车站铁路职工福利房被开发商侵占
可爱的狗熊们
西游日记1
Download software ranking
Professional killers2 data package
linux初级教程
传奇私服架设教程
XML+Web+Service开发教程
Sora aoi 120 minutes
打鸟视频
Call Of Duty2
Red cliff
Kung fu panda - the secret of the teacher
c#程序设计案例教程
delv published in(发表于) 2014/1/16 9:32:25 Edit(编辑)
基于Gettext的asp.net网站多语言解决方案_[Asp.Net教程]

基于Gettext的asp.net网站多语言解决方案_[Asp.Net教程]

基于Gettext的asp.net网站多语言解决方案_[Asp.Net教程]

很久以前就想写这篇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


来源:cnblogs







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.