犬者
“说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”

【电脑】基于Gettext的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

54115|asp.net|gettext|多语言
问天 @3/31/2007 5:50:06 PM
View blogs in this category:电脑


swing 在 5/23/2008 8:31:16 PM 说:

这个折腾了我一天还没搞定,请楼主帮忙-。-
我下载的是gettext for win32直接在windows上安装,装完后bin目录下就有msgfmt.exe等小工具使用,我用vs2005命令窗口运行msgfmt来编译po文件总是失败,提示有:1 -lib选项的目录bin/lib不存在,2:找不到元数据GNU.gettext,3:找不到msgfmt自动生成的临时文件resset.cs。

请楼主抽空帮帮忙,多谢。。方便的话加下我Q:7652079


Wuvist 在 5/22/2008 10:28:06 PM 说:

楼下的,我使用的是gettext-tools 0.13.1。

你是否还有安装gettext-runtime跟GNU libiconv?
无名氏 在 5/22/2008 6:39:49 PM 说:

我在使用msgfmt将.po文件编译成.dll时总是出现“找不到元数据GUN.Gettext”的编译失败提示,我用的是Gettext0.14.4,请教您是哪里出问题了?万分感谢。
netatrs 在 5/1/2008 3:02:22 PM 说:

可以发份代码吗 biao_zeng@126.com 谢谢哦
突然很想知道问天血型的犬里 在 4/2/2007 2:35:18 PM 说:

看标题就没懂……
dreamangel 在 4/2/2007 4:10:04 AM 说:

偶网络方面不太在行,所以拜一下了…………
犬句 在 4/1/2007 12:43:11 PM 说:

有看没懂...
在 3/31/2007 8:53:49 PM 说:

说实话。。。
我其实是很佩服问天大人的~
一直都好强悍哦~
因为你写的文章大部分偶都是完全不明白的。。。
是我太肤浅了啦~
rex 在 3/31/2007 6:21:32 PM 说:

厉害

Please leave your comment here

 
  名字:
  主页:
  内容:
 

   


Navigation
Blogwind
犬者首页
Contact


个人档案


“说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”



Categories
死结(27)
电脑(177)
心情(181)
天影(25)
乱弹(211)
博客(82)
音乐(18)
饕餮(30)
读书(20)
电影(28)
网摘(5)
希望(37)
汕头(10)
经济(8)
苹果(19)
跋涉(7)



Archive
2008年11月
2008年10月
2008年9月
2008年8月
2008年7月
2008年6月
2008年5月
2008年4月
2008年3月
2008年2月
2008年1月
2007年12月
2007年11月
2007年10月
2007年9月
2007年8月
2007年7月
2007年6月
2007年5月
2007年4月
2007年3月
2007年2月
2007年1月
2006年12月
2006年11月
2006年10月
2006年9月
2006年8月
2006年7月
2006年6月
2006年5月
2006年4月
2006年3月
2006年2月
2006年1月
2005年12月
2005年11月
2005年10月
2005年9月
2005年8月
2005年7月
2005年6月
2005年5月
2005年4月
2005年3月
2005年2月
2005年1月
2004年12月
2004年11月
2004年10月
2004年9月
2004年8月
2004年7月
2004年6月
2004年5月
2004年4月
2004年3月
2004年2月
2004年1月
2003年12月



My Links
5G
bloglines
时尚摄影师奇科的博客
颜如玉
最爱卫斯理

RSS 2.0

Username:
Password:
 Remember me