基于Gettext的asp.net网站多语言解决方案
点击次数:24 次 发布日期:2008-11-26 11:05:53 作者:源代码网
|
源代码网推荐 源代码网推荐 很不喜欢.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 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
