国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

基于Gettext的asp.net網(wǎng)站多語言解決方案

2019-11-18 16:36:14
字體:
供稿:網(wǎng)友

很久以前就想寫這篇blog,系統(tǒng)的介紹一下偶是如何使用Gettext給blogwind做多語言界面的……

很不喜歡.net內(nèi)置的多語言解決方案……因為,它使用xml……編輯xml是一件很痛苦的事情……我也不想給每個頁面弄一堆resouce文件……光看著這些資源文件我就很暈……

偶是從Django里面知道有Gettext這套在開源軟件中廣為使用的程序多語言解決方案的……

最喜歡它的地方是它默認直接使用英文原文作為字符串的鍵值……而不是像.net默認的那樣,給所有的字符串加上一個編號……而當翻譯不存在的時候,.net是會拋出異常,而Gettext是會返回原文……這樣子,我可以部分給網(wǎng)站制作一個語言版本……而不需要一步到位……

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

Gettext的翻譯文件為.po文件……其實就是純文本文件……其內(nèi)容類似:

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

第一行代表偶需要翻譯的字符串在程序中的位置……msgid則是需要翻譯的字符……msgstr則是翻譯的結果……很簡單……

偶在做網(wǎng)站的時候,把所有需要翻譯的字符串都使用一個函數(shù)包涵起來……比方說:
    ph.g("編寫網(wǎng)志")

然后,自己寫了個小python程序去搜索偶網(wǎng)頁程序中所有的 ph.g("XXXXX"),并生成/更新現(xiàn)有的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找不到翻譯便返回原文的做法而已……順便再搞定一下資源緩存之類的……一共也就幾百行代碼……

不過,它這個版本似乎是為桌面程序設計的……要在網(wǎng)頁中使用,還需要做點小修改……它讀取那些msgfmt生成的dll時,使用的是:Assembly.LoadFrom(.....)

這意味著它每次只是讀一個dll……對于單一用戶的桌面程序來說,每次使用一種語言是正常……可是,對于網(wǎng)站來說,偶需要同時提供不用的語言界面給不同的用戶……所以……需要改成Assembly.LoadAssembly(.....)


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

嗯,到了最后,便是調(diào)用了……注意,下面出現(xiàn)的代碼都是偶自己寫的……大家完全沒有必要照偶的方式做……

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中調(diào)用一下:
        lh.initcate("blogwind", Server.MapPath("langs"))

恩,這樣子,它便會去網(wǎng)站根目錄下langs目錄尋找它需要的各種語言dll了……當然,blogwind這個類名以及l(fā)angs這個目錄可以隨意改成別的……

最先偶寫到的那個ph.g(..)函數(shù)其實是:
  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……呃……我知道,我起類名很規(guī)范……總之,我在pagehelper里面還自己保存了當前瀏覽者的語言信息放在langs / pagehelper里面……通過:
    Dim cu As New System.Globalization.CultureInfo(langs.getLangString(Me.lang))
來獲得相應的CultureInfo,再傳給Gettext……

比方說,語系是zh-CHS,待尋找翻譯的word是“編寫網(wǎng)志”,Gettext便會去webroot/langs/zh-CHS目錄中尋找blogwind.resources.dll這文件……找到了,便Load它,再尋找"編寫網(wǎng)志"等等……

因為這些翻譯的dll是動態(tài)讀取的……

其實完全可以做到讓程序在app_start中自動去遍歷langs中的子目錄,看看都有哪些語系……然后自動生成一個菜單在網(wǎng)頁中供用戶選擇……以后添加語言,其實就簡單到往這個目錄中建立目錄扔dll了……程序本身,絲毫不需要做任何修改……


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

當然,上面說的,僅僅是最簡單的字符串翻譯……網(wǎng)頁中還有圖片……語言相關的CSS等等細節(jié)……而且,實際上,我在使用Gettext的時候還自己寫了個小python程序(幾十行的樣子)去生成/維護po文件……若po文件不能自動生成、維護更新的話,管理起來是很麻煩的……

上面的說明也是非常簡略的……僅僅只是說明要給asp.net網(wǎng)站提供多語言界面……除了使用官方鼓吹的資源文件方式外,還可以有別的選擇……而對于Gettext這個選擇,偶覺得更加優(yōu)雅些而已…… www.blogwind.com 的多語言界面,便是使用上述的方式實現(xiàn)的……

至于哪里下載Gettext以及msgfmt等工具,wrapper中的那行修改具體是在哪里等問題,就請不要來問偶了……

這里,有偶修改重新編譯過后的版本:
http://m.survivalescaperooms.com/Files/wuvist/GetText.zip


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐平市| 清镇市| 富蕴县| 巴彦淖尔市| 太谷县| 鞍山市| 榆中县| 香格里拉县| 天峻县| 五华县| 安新县| 和硕县| 西藏| 东宁县| 铜川市| 灵丘县| 乌鲁木齐市| 临城县| 郎溪县| 花莲市| 连山| 苏尼特左旗| 涪陵区| 阿城市| 定西市| 措美县| 柳江县| 石柱| 喀喇沁旗| 连江县| 开鲁县| 巴林右旗| 云安县| 宜城市| 宁武县| 河池市| 玉树县| 洛隆县| 宣汉县| 昌都县| 石狮市|