Строковые ресурсы, наиболее часто используемые для локализации WinRT приложений, хранятся в файлах с расширением .resx. Для них есть очень удобный функционал — они могут быть сгенерированные в виде класса со строго типизированными методами, для того, что бы вы могли обратиться к ресурсам из кода.
В WinRT мы используем .resw файлы и по какой-то, удивительной для меня, причине нет автоматического генератора кода для них. К счастью в Visual Studio есть встроенный генератор в виде шаблонов T4. Для использования создайте новый «Text Template» и добавляем его в Visual Studio. Назовем его, например, Strings.tt. Теперь вы можете вставить следующий код.
Этот шаблон ищет файл с именем «en\Resources.resw». Вы можете изменить эти параметры, изменив шаблон на 14-ой линии. Не имеет значения, на каком языке вы создаете файл; для каждого языка будет свой ключ.
<#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ assembly name="System.Xml" #> <#@ assembly name="System.Xml.Linq" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text.RegularExpressions" #> <#@ import namespace="System.Xml.Linq" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="Microsoft.CSharp" #> <#@ output extension=".cs" #> <# var inputFilePath = @"en\Resources.resw"; var provider = new CSharpCodeProvider(); string className = CreateClassName(provider); SetCurrentDirectory(); if (File.Exists(inputFilePath)) { #> //------------------------------------------------------------------------------ // // This code was generated by a resource generator. // //------------------------------------------------------------------------------ using System; using Windows.ApplicationModel.Resources; namespace <#= GetNamespace() #> { public static class <#= className #> { public static ResourceLoader ResourceLoader { get; private set; } static <#= className #>() { ResourceLoader = new ResourceLoader(); } public static string Get(string resource) { return ResourceLoader.GetString(resource); } public static string Format(string resource, params object[] args) { return String.Format(ResourceLoader.GetString(resource), args); } <# foreach (string name in GetResourceKeys(inputFilePath)) { #> public static string <#= BuildPropertyName(provider, name) #> { get { return ResourceLoader.GetString("<#= BuildResourceString(name) #>"); } } <# } #> } } <# } else { throw new FileNotFoundException(String.Format("Unable to find Resource file: {0}", inputFilePath)); } #> <#+ private string BuildPropertyName(CSharpCodeProvider provider, string name) { return provider.CreateEscapedIdentifier(Regex.Replace(name, @"\[.+\]|\.", String.Empty)); } private string BuildResourceString(string name) { return name.Replace(".", "/"); } private void SetCurrentDirectory() { Directory.SetCurrentDirectory(Host.ResolvePath("")); } private string CreateClassName(CSharpCodeProvider provider) { return provider.CreateEscapedIdentifier(Path.GetFileNameWithoutExtension(Host.TemplateFile)); } private string GetNamespace() { return Host.ResolveParameterValue("directiveId", "namespaceDirectiveProcessor", "namespaceHint"); } private static IEnumerable GetResourceKeys(string filePath) { var doc = XDocument.Load(filePath); return doc.Root.Elements("data").Select(e => e.Attribute("name").Value); } #>
У вас останется лишь одна проблема — шаблон сам автоматически не регенерируется и каждый раз, когда вы будете изменять файл, будет необходимо обновить строго типизированный класс. Просто щелкните правой кнопкой на файле и выберите «Run Custom Tool».
Ссылка на источник: Creating strongly typed WinRT resources
Добавить комментарий