我在「多語系網站建置計畫」這一篇文章裡面已經介紹過多語系網站的建置方法。在這裡我要介紹的則是個別資源檔的讀取和修改的方法。為什麼需要去修改資源檔?不是從 VS2005 就可以直接編輯了嗎?是的,但是如果你要讓客戶自己編輯資源檔的內容,怎麼辦?難道你會安裝 VS2005 給客戶使用嗎...
我在「多語系網站建置計畫」這一篇文章裡面已經介紹過多語系網站的建置方法。在這裡我要介紹的則是個別資源檔的讀取和修改的方法。為什麼需要去修改資源檔?不是從 VS2005 就可以直接編輯了嗎?
是的,但是如果你要讓客戶自己編輯資源檔的內容,怎麼辦?難道你會安裝 VS2005 給客戶使用嗎?
在我的構想中,我希望製作一個網頁,讓客戶可以同時編輯包括正體中文、簡體中文和英文,甚至日文等資源檔,而且這些資源檔都必須能輸入 HTML 碼。可以想見,要達成這些功能,你非自行處理資源檔的讀寫不可。
幸好在 ASP.NET 中處理資源檔的讀寫甚至巡覽,都簡單的出乎想像之外。
如果你把 .resx 資源檔用 NotePad 讀出來,你一開始可能會覺得有點陌生。不過如果你把前面一長串註解拿掉之後,你就會發現它只是個很簡單的 XML 檔案。因此,我們就使用標準的 XML 處理方式(通通交給 DataSet)來處理就可以了。
讀取資源檔的程式如下:
Protected Sub BindGrid()
Dim ds As New DataSet
ds.ReadXml(MapPath("~/App_GlobalResources/AppResource.resx")) '指定讀取某個資源檔
GridView1.DataSource = ds.Tables("data")
GridView1.DataBind()
End Sub
修改並寫入資源檔的程式如下:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ds As New DataSet
ds.ReadXml(MapPath("~/App_GlobalResources/AppResource.resx"))
ds.Tables(0).Rows(1)(0) = TextBox1.Text '指定修改某一欄某一列
ds.WriteXml(MapPath("~/App_GlobalResources/AppResource.resx"))
BindGrid()
End Sub
要能正確的寫入資源檔,你必須給予 Network Service 或 ASPNET 對 App_GlobalResources 資料夾適當的權限。
此外,經由程式寫入的資源檔,如果和原始的資源檔比較起來,它的內容只能使用「面目全非」來形容,因為其排列已經完全不一樣了。不過令人高興的是,DataSet 物件顯然可以正確無誤的保留資源檔內不可缺少的 resheader 資料(這是資源檔的識別資訊,少了這個資訊,就變成普通的 XML 檔案而已,而不是資源檔了),所以它的內容格式雖然已經和原來不同了,但是應用在多語系網頁依然是沒有問題的。