<#@ template debug="true" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ assembly name="System.Windows.Forms" #> <#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #> <#@ assembly name="EnvDTE" #> <#@ assembly name="EnvDTE80" #> <#@ import namespace="System" #> <#@ import namespace="System.Collections" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Resources" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Text.RegularExpressions" #> <#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #> <#@ import namespace="EnvDTE" #> <#@ import namespace="EnvDTE80" #> <# var hostServiceProvider = (IServiceProvider)Host; var dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE)); var templateProjectItem = dte.Solution.FindProjectItem(Host.TemplateFile); var projectDirectory = Path.GetDirectoryName(templateProjectItem.ContainingProject.FullName); var ttDirectory = Path.Combine(projectDirectory, "Properties"); var projectName = Path.GetFileName(projectDirectory.TrimEnd('/')); foreach (var resxFile in Directory.EnumerateFiles(projectDirectory, "*.resx", SearchOption.AllDirectories)) { var fileName = Path.GetFileNameWithoutExtension(resxFile); var parameterMatcher = new Regex(@"\{([a-z]\w+)\}"); var resourceStrings = new List(); using (var resxReader = new ResXResourceReader(resxFile)) { resxReader.UseResXDataNodes = true; foreach (DictionaryEntry entry in resxReader) { var node = (ResXDataNode)entry.Value; var value = (string)node.GetValue((System.ComponentModel.Design.ITypeResolutionService)null); var arguments = parameterMatcher .Matches(value) .Cast() .Select(m => m.Groups[1].Value) .Distinct() .ToList(); resourceStrings.Add( new ResourceData { Name = node.Name, Value = value, Arguments = arguments }); } } GenerationEnvironment.AppendFormat( @"// namespace {0} {{ using System.Globalization; using System.Reflection; using System.Resources; internal static class {1} {{ private static readonly ResourceManager _resourceManager = new ResourceManager(""{0}.{1}"", typeof({1}).GetTypeInfo().Assembly); ", projectName, fileName); foreach (var resourceString in resourceStrings) { GenerationEnvironment.AppendLine(); GenerationEnvironment.AppendFormat(@" /// ").AppendLine(); foreach (var line in resourceString.Value.Split(new[] { Environment.NewLine }, StringSplitOptions.None)) { GenerationEnvironment.AppendFormat(" /// {0}", line.Replace("<", "<").Replace(">", ">")) .AppendLine(); } GenerationEnvironment.AppendFormat( @" /// internal static string {0}{1} {{ ", resourceString.Name, resourceString.Arguments.Count > 0 ? resourceString.Parameters : string.Empty); if (resourceString.Arguments.Count == 0) { GenerationEnvironment.AppendFormat( @" get {{ return GetString(""{0}""); }}", resourceString.Name); } else { GenerationEnvironment.AppendFormat( @" return string.Format(CultureInfo.CurrentCulture, GetString(""{0}"", {2}), {1});", resourceString.Name, resourceString.FormatArguments, resourceString.ArgumentNames); } GenerationEnvironment.AppendLine().Append( @" }").AppendLine(); } GenerationEnvironment.Append(@" private static string GetString(string name, params string[] argumentNames) { var value = _resourceManager.GetString(name); System.Diagnostics.Debug.Assert(value != null); for (var i = 0; i < argumentNames.Length; i++) { value = value.Replace(""{"" + argumentNames[i] + ""}"", ""{"" + i + ""}""); } return value; } } } "); var outputPath = Path.Combine(ttDirectory, fileName + ".Designer.cs"); File.WriteAllText(outputPath, GenerationEnvironment.ToString()); GenerationEnvironment.Length = 0; var resxProjectItem = dte.Solution.FindProjectItem(resxFile); resxProjectItem.ProjectItems.AddFromFile(outputPath); } #> <#+ private class ResourceData { public string Name { get; set; } public string Value { get; set; } public List Arguments { get; set; } public string FormatArguments { get { return string.Join(", ", Arguments); } } public string ArgumentNames { get { return string.Join(", ", Arguments.Select(a => "\"" + a + "\"")); } } public string Parameters { get { return "(" + string.Join(", ", Arguments.Select(a => "object " + a)) + ")"; } } } #>