2013-07-08 56 views

回答

4

你可以使用下面的T4模板來自動生成你的resw文件的C#封裝。這意味着您無需使用魔法字符串資源鍵清理代碼以訪問C#中的翻譯 - 那麼您知道您的所有密鑰在編譯時都是有效的,而不是運行時。該模板生成以下代碼:

<#@ template debug="false" hostspecific="true" language="C#" #> 
<#@ assembly name="System.Core" #> 
<#@ assembly name="System.Xml" #> 
<#@ assembly name="System.Xml.Linq" #> 
<#@ assembly name="EnvDTE" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Xml.Linq" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="Microsoft.CSharp" #> 
<#@ import namespace="EnvDTE" #> 
<#@ output extension=".cs" #> 
<# 
    DTE env = GetVSEnvironment(); 
    var inputFilePath = @"en-GB\Resources.resw"; 
    var provider = new CSharpCodeProvider(); 
    string className = CreateClassName(provider); 

    SetCurrentDirectory(); 
    if (File.Exists(inputFilePath)) { 
#> 
//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated by a resource generator. 
// </auto-generated> 
//------------------------------------------------------------------------------ 
using Windows.ApplicationModel.Resources; 

namespace <#= GetNamespace() #> { 
    internal static class <#= className #> { 
     public static ResourceLoader ResourceLoader { get; private set; } 

     static <#= className #>() { 
      ResourceLoader = new ResourceLoader(); 
     } 
<# 
     foreach (string name in GetResourceKeys(inputFilePath)) { 
#> 
     public static string <#= provider.CreateEscapedIdentifier(name.Replace(".Text", String.Empty).Replace(".Content", String.Empty).Replace(".FlowDirection", string.Empty)) #> { 
      get { return ResourceLoader.GetString("<#= name.Replace(".Text", "/Text").Replace(".Content", "/Content").Replace(".FlowDirection", "/FlowDirection") #>"); } 
     } 
<# 
     } 
#> 
    } 
} 
<# 
    } else { 
     throw new FileNotFoundException(String.Format("Unable to find Resource file: {0}", inputFilePath)); 
    } 
#> 
<#+ 
    private DTE GetVSEnvironment() { 
     DTE env = null; 
     var provider = Host as IServiceProvider; 
     if (provider != null) { 
      env = provider.GetService(typeof(DTE)) as DTE; 
     } 

     if (env == null) { 
      throw new InvalidOperationException("Template must be executed from Visual Studio"); 
     } 

     return env; 
    } 

    private void SetCurrentDirectory() { 
     Directory.SetCurrentDirectory(Host.ResolvePath("")); 
    } 

    private string CreateClassName(CSharpCodeProvider provider) { 
     string name = Path.GetFileNameWithoutExtension(Host.TemplateFile); 
     return provider.CreateEscapedIdentifier(name); 
    } 

    private string GetNamespace() { 
     return Host.ResolveParameterValue("directiveId", "namespaceDirectiveProcessor", "namespaceHint"); 
    } 

    private static IEnumerable<string> GetResourceKeys(string filePath) { 
     XDocument doc = XDocument.Load(filePath); 
     var rootElement = doc.Root.Elements().SingleOrDefault(x => x.Name == "root"); 
     if (rootElement == null) 
     { 
      throw new InvalidOperationException("No root element was found"); 
     } 
     var dataElements = rootElement.Elements("data").ToList(); 
     var resourceKeys = dataElements.Select(e => e.Attribute("name").Value).ToList(); 
     return resourceKeys; 
    } 
#> 

internal static class Translation 
{ 
    public static ResourceLoader ResourceLoader { get; private set; } 

    static Translation() 
    { 
     ResourceLoader = new ResourceLoader(); 
    } 

    public static string MyFirstString 
    { 
     get { return ResourceLoader.GetString("MyFirstString/Text"); } 
    } 
} 

這是通過下面的T4模板生成

相關問題