如何在T4模板中使用resx资源文件

本文关键字:resx 资源 源文件 T4 | 更新日期: 2023-09-27 18:08:19

我不知道如何在(.tt) T4模板中包含资源文件(.resx)。

我试过了…导入命名空间

<#@ import namespace="T4TemplateResources.resx" #>

还包括

如何在T4模板中使用resx资源文件

Nico的解决方案需要你的解决方案来构建。

还有另一种方法,不需要通过读取原始resx文件来编译解决方案。

    var fileName = "CustomResource.resx";
    var filePath = Path.Combine(Path.GetDirectoryName(this.Host.ResolvePath("")), "WindowsFormsApplication1", fileName);
    var reader = new ResXResourceReader(filePath);
    var values = reader.Cast<DictionaryEntry>().ToDictionary(x => x.Key, y => y.Value);
    // this is how you would acces the resources
    var value = values["entry"];

你应该意识到这个方法缺少设计时检查,如果资源不存在,你没有得到本地化的值,因为你只是读取一个文件。这两者在T4模板中通常不是强制性的

下面是一个从资源文件创建枚举的工作代码。

确保fileNamefilePath设置正确的值

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.Resources" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.ComponentModel.Design" #>
<#
    var nameSpace = "WindowsFormsApplication1";
    var enumName = "CustomEnum";
    var fileName = "CustomResource.resx";
    var filePath = Path.Combine(Path.GetDirectoryName(this.Host.ResolvePath("")), "WindowsFormsApplication10", fileName);
    using (var reader = new ResXResourceReader(filePath))
    {
        reader.UseResXDataNodes = true;
#>
namespace <#=nameSpace#>
{
    public enum <#=enumName#>
    {
        Undefined,
        <#  foreach(DictionaryEntry entry in reader) { 
            var name = entry.Key;
            var node = (ResXDataNode)entry.Value;
            var value = node.GetValue((ITypeResolutionService) null);
            var comment = node.Comment;
            var summary = value;
            if (!String.IsNullOrEmpty(comment)) summary += " - " + comment;
        #>
        /// <summary>
        /// <#= summary #>
        /// </summary>
        <#= name #>,
        <# } #>
    }
}

<#
    }
#>

从资源(.resx)中读取并使用资源的JSON结果创建JS文件的示例T4模板代码:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="$(TargetPath)" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Resources" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".js" #>
<# 
    var path = Path.GetDirectoryName(Host.TemplateFile);
    var resourceNames = new string[1]
    {
        "Resources"
    };
#>
var $.Resources = {
<# foreach ( var name in resourceNames ) {
    var localeFile = Host.ResolvePath(path + "''" + name + ".resx");
    ResXResourceSet jpResxSet = new ResXResourceSet(localeFile);
#>
<# foreach (DictionaryEntry item in jpResxSet) { #>
    '<#=item.Key.ToString()#>' : '<#= ("" + item.Value).Replace("'r'n", string.Empty).Replace("'", "'''")#>',
<# } #>
<# } #>
};

Jochen van Wylick:使用T4基于.resx文件本地化JavaScript资源

如果您想从T4模板中访问.resx-File的资源,您可以这样做:

  1. 在资源编辑器中设置资源的访问修饰符为"Public"。
  2. 确保项目成功构建。t4模板只能访问输出程序集-所以检查它是否为最新的。
  3. 在T4模板中引用输出程序集(您可以在这里使用Visual Studio宏):<#@ assembly name="$(TargetDir)'outputfile.ext" #>
  4. 导入T4模板中ResourceFile的命名空间<#@ import namespace="MyNamespace" #>

您可以像往常一样访问资源:

<# var theResource = Resource1.TheResource; #>

如果您使用的是VS2010 SP1及以上版本,则有一种更简单的方法可以在不编译项目的情况下完成此操作,通过使用

<#@ assembly name="$(TargetPath)" #>
<#@ import namespace="Your.Namespace.Properties" #>

原样复制第一行,并在第二行使用Resource文件所在的名称空间然后像c#

那样访问资源字符串
Resources.ResourceManager.GetString("SomeKey");

var key = Resources.SomeKey;

我是从T4模板中的Use类中学到的

希望对大家有所帮助