Создание строго типизированных ресурсов WinRT

Строковые ресурсы, наиболее часто используемые для локализации 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

Реклама
Tagged with: , , ,
Опубликовано в Development, Windows 8.1

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

%d такие блоггеры, как: