T4 (Text Template Transformation Toolkit) 可以幫忙訂出 template 並用程式輔助來產生程式碼或文件(比方說不同語言的定義檔)。
使用 T4 之前可以先去下載 T4 Toolbox,安裝之後在 Visual studio 增加新項目時就可以看到有 "T4 Toolbox" 的分類,有 Generator、Script、Template 三種可選
首先定義template檔案,在這邊用System.Xml去讀取 resource file,同時 include SaveOutput.tt 做輸出用。
<#@ template language="C#" debug="True" #> <#@ include file="SaveOutput.tt" #> <#@ include file="T4Toolbox.tt" #> <#@ assembly name="System.Xml" #> <#@ import namespace="System.Xml" #> <# // <copyright file="i18n_js.tt" company="Onelab"> // Copyright © Onelab. All Rights Reserved. // </copyright> string[] files = System.IO.Directory.GetFiles(this.Host.ResolvePath("..\\App_GlobalResources")); string outputFileLang = ""; foreach (string f in files) { if (f.Substring(f.Length-4) != "resx"){ continue; } XmlDocument xd = new XmlDocument(); xd.Load(f); if (f.LastIndexOf("Resource") + 8 == f.LastIndexOf(".")) { outputFileLang = "en-Us"; } else { outputFileLang = f.Substring(f.LastIndexOf("Resource") + 9, f.LastIndexOf(".") - f.LastIndexOf("Resource") - 9); } foreach (XmlNode node in xd.SelectNodes("//data")) { try { #> <#=node.Attributes[0].Value#> = <#=node.SelectNodes("value")[0].InnerXml#>; <# } catch { } } SaveOutput("lang\\" + outputFileLang + ".js"); } #>
另外定義 SaveOutput function於另一個檔案SaveOutput.tt中
<#@ import namespace="System.IO" #> <#+ void SaveOutput(string outputFileName) { string templateDirectory = Path.GetDirectoryName(Host.TemplateFile); string outputFilePath = Path.Combine(templateDirectory, outputFileName); File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString()); this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length); } #>
當resource file變動後,必須要執行"Run Custom Tool"才會更新輸出的檔案內容。
Other resources: Oleg Sych's article