如何在T4模板中使用resx资源文件
本文关键字:resx 资源 源文件 T4 | 更新日期: 2023-09-27 18:08:19
我不知道如何在(.tt) T4模板中包含资源文件(.resx)。
我试过了…导入命名空间
<#@ import namespace="T4TemplateResources.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模板中通常不是强制性的
下面是一个从资源文件创建枚举的工作代码。
确保fileName
和filePath
设置正确的值
<#@ 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的资源,您可以这样做:
- 在资源编辑器中设置资源的访问修饰符为"Public"。
- 确保项目成功构建。t4模板只能访问输出程序集-所以检查它是否为最新的。
- 在T4模板中引用输出程序集(您可以在这里使用Visual Studio宏):
<#@ assembly name="$(TargetDir)'outputfile.ext" #>
- 导入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类中学到的
希望对大家有所帮助