|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)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-rblogwind-lzh-CHS-d.blogwind.po
--csharp是指定输入为.net的dll……呃……必要指定这点,是由于它还能够输入为java/tcl/qt有几个.netresource文件等格局……关于.net的撑持是厥后新加的……假如报错,断定你利用的是0.13.1版大概更新的Gettext库……
-rblogwind是指dll的资本称号为blogwind
-lzh-CHS则是语系
最初的则是待编译的po文件名了……
----------------------------------------
Gettext有C#的"wrapper"……源码在GnuWin32内里就有……它这个wrapper……wrap的是.net的System.Resources类……使它切合Gettext找不到翻译便前往原文的做法罢了……特地再弄定一下资本缓存之类的……一共也就几百行代码……
不外,它这个版本仿佛是为桌面程序计划的……要在网页中利用,还必要做点小修正……它读取那些msgfmt天生的dll时,利用的是:Assembly.LoadFrom(.....)
这意味着它每次只是读一个dll……关于单一用户的桌面程序来讲,每次利用一种言语是一般……但是,关于网站来讲,偶必要同时供应不必的言语界面给分歧的用户……以是……必要改成Assembly.LoadAssembly(.....)
------------------------------------------
嗯,到了最初,即是挪用了……注重,上面呈现的代码都是偶本人写的……人人完整没有需要照偶的体例做……
ImportsGNU.Gettext
PublicClasslh
lh=languageHelper
PublicSharedcatalogAsGettextResourceManager
PublicSharedSubinit(ByValnameAsString,ByValdictpathAsString)
catalog=NewGettextResourceManager(name,dictpath)
EndSub
EndClass
在Global.asax的ApplicationStart中挪用一下:
lh.initcate("blogwind",Server.MapPath("langs"))
恩,如许子,它便会往网站根目次下langs目次寻觅它必要的各类言语dll了……固然,blogwind这个类名和langs这个目次能够随便改成其余……
开始偶写到的谁人ph.g(..)函数实际上是:
PublicFunctiong(ByValwordAsString)AsString
DimcuAsNewSystem.Globalization.CultureInfo(langs.getLangString(Me.lang))
Returnlh.catalog.GetString(word,cu)
EndFunction
ph是pagehelper……呃……我晓得,我起类名很标准……总之,我在pagehelper内里还本人保留了以后扫瞄者的言语信息放在langs/pagehelper内里……经由过程:
DimcuAsNewSystem.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中的那行修正详细是在那里等成绩,就请不要来问偶了……
不过你如果学.net的话,你就不要选os了,这课比较底层的。你可以旁听数据库加上软件构件和中间件。(webservices和面向服务的课也应该听一听) |
|