這一次要講的是 Localization,不幸的是 Generator 沒有考慮到 Localization 問題,所以由 Generator 產生出來的代碼,並不包含這部份,但這卻是一個很好的機會讓我去了解 Generator 與 monorail 底下的機制。
Castle官方網站上已經有介紹該怎麼 Localization:Resources and Localization,但不幸的是,他使用 Visual Studio.Net 作為範例,Visual Studio.Net 已經掩蓋了所有細節。
在研究官方文件與相關文件之後,以下是我的步驟。
首先,你要先在 app/controllers 加上:
[Resource("textres", "ToDo.categories")]
這表示在 view(template) 那兒使用 $textres 就可以存取資源檔的內容。
所以在 app/views/categories/list.vm 裡,就可以把必要的字串改用$textres.字串名稱替代掉,這裡我就不列出整個 list.vm 了,只列出幾行:
<!--略--> $HtmlHelper.LinkTo( $textres.AddNewCategory, "categories", "new") <!--略--> $HtmlHelper.LinkTo( $textres.View, "categories", "view", $category.Id) <!--略--> $HtmlHelper.LinkTo( $textres.Edit, "categories", "edit", $category.Id) <!--略--> $AjaxHelper.LinkToRemote( $textres.Delete, "delete.aspx", $DictHelper.CreateDict("with='id=$category.Id'", "condition=confirm('Delete?')", "onsuccess=new Effect.Fade('category$category.Id')")) <!--略-->
然後我選擇在 app/ 下建立一個 resources 目錄,用來放置資源檔:
;Filename: categories.txt ;Language: en-US View=View Edit=Edit Delete=Delete AddNewCategory=Add a new Category
;Filename: categories.zh-tw.txt ;Language: zh-tw View=檢視 Edit=編輯 Delete=刪除 AddNewCategory=加新類別
這裡要特別注意,把文字檔的編碼存為 unicode 或是 utf-8,否則會有亂碼出現。
最後修改 default.build,以便把資源檔編譯進去,這裡我也只列出關鍵的幾行:
<!--略--> <target name="build" description="Compile all source files"> <mkdir dir="${dir.bin}" /> <copy flatten="true" todir="${dir.bin}"> <fileset> <include name="${dir.lib.castle}/**" /> <include name="${dir.lib.npgsql}/**" /> <include name="${dir.lib.mysql}/**" /> <include name="${dir.lib.migrator}/**" /> <include name="${dir.lib.nunit}/nunit.framework.dll" /> </fileset> </copy> <resgen todir="${dir.src.app}/resources/"> <resources> <include name="${dir.src.app}/resources/*.txt" /> </resources> </resgen> <csc target="library" output="${dir.bin}/${project::get-name()}.dll"> <sources> <include name="${dir.config}/Boot.cs" /> <include name="${dir.src.app}/**/*.cs" /> <include name="${dir.src.test}/**/*.cs" /> <include name="${dir.migrations}/**/*.cs" /> </sources> <resources basedir="." prefix="ToDo"> <include name="${dir.src.app}/resources/*.resources"/> </resources> <references basedir="${dir.bin}"> <include name="System.Web.dll" /> <!--略-->
最重要的就是 resgen 這個區塊與 csc 裡面的 resources 區塊,resgen 是把文字檔轉換為 .resources 資源檔,而 csc 裡面的 resources 則是表示要把產生出來的 .resources 編譯進去。
好了,該修改的都修改了,接下來就是重新建立,輸入 nant 就會自動重新編譯。
有點美中不足的是,下面顯示頁次的部份仍然是英文,這是因為這些字串被寫死在 ScaffoldHelper.cs 裡面,我想下次再來修改這部份。
後記:
- csc resources 所指定的 prefix 與 [Resource(“textres”, “ToDo.categories”)] 的第二個參數息息相關,不妨修改來試試看。
- 網站文件有提到 LocalizationFilter 的部份,但是用了卻不行,有待繼續研究。