Поделиться через


Создание и извлечение ресурсов в приложениях для Магазина Windows

В операционной системе Windows 8 появилась новая модель ресурсов для приложений Магазина Windows, которая заменяет привычную для настольных приложений .NET Framework модель "звезда". В этом разделе обсуждается эта новая модель ресурсов и описывается порядок создания, развертывания и получения ресурсов в приложениях Магазина Windows.

Ресурсы в приложениях Магазина Windows

В настольных приложениях .NET Framework для упаковки и развертывания ресурсов используется модель "звезда". Как правило, ресурсы для нейтрального языка и региональных параметров приложения ("язык и региональные параметры", используемые при отсутствии локализованных ресурсов) встраиваются в основной исполняемый файл приложения. Локализованные ресурсы для каждого дополнительного языка и региональных параметров, встраиваются в отдельную вспомогательную сборке, которая содержит только ресурсы без исполняемого кода.

В приложениях Магазина Windows, напротив, используют единый файл ресурсов. Этот файл называется файлом индекса ресурсов пакета (PRI) и содержит ресурсы для всех языков, региональных параметров и коэффициентов масштабирования.

Важно!

Правила резервного переключения ресурсов определяют, какие ресурсы будут загружаться, если не найдены ресурсы для конкретного языка и региональных параметров или текущего языка и региональных параметров.

В настольных приложения для создания ресурсов можно использовать текстовые файлы или XML-файлы (с расширением RESX). Для компиляции этих файлов в двоичные файлы ресурсов (с расширением RESOURCES служит Генератор файлов ресурсов (Resgen.exe). Чтобы встроить ресурсы нейтрального языка и региональных параметров в основную сборку приложения, воспользуйтесь компилятором, а чтобы встроить остальные локализованные ресурсы во вспомогательные сборки, воспользуйтесь компоновщиком сборок (AL.exe). После этого можно получать отдельные ресурсы с помощью класса System.Resources.ResourceManager или выполнять перебор ресурсов с помощью класса ResourceReader.

В приложениях Магазина Windows для создания ресурсов используются RESW-файлы. Несмотря на разницу в расширениях, формат файла RESW идентичен формату файла RESX, за тем исключением, что RESW-файлы могут содержать только строки и пути к файлам. В Visual Studio можно создавать и изменять ресурсы с помощью редакторов ресурсов. Во время компиляции все RESW-файлы приложения упаковываются в один PRI-файл программой MakePRI и включаются в пакет развертывания приложения. Во время выполнения доступ к ресурсам приложения обеспечивается классом Windows.ApplicationModel.Resources.ResourceLoader и типами в пространстве имен Windows.ApplicationModel.Resources.Core.

Важно!

Хотя Генератор файлов ресурсов (Resgen.exe) в основном используется в настольных приложениях, его также можно использовать и для декомпиляции вспомогательных сборок в RESW-файлы, которые затем будут компилироваться в PRI-файл.

Предупреждение

Хотя класс System.Resources.ResourceManager включен в Приложения .NET для Магазина Windows, использовать его не рекомендуется. Используйте ResourceManager только в библиотеках, которые разрабатываются в виде проектов Переносимая библиотека классов и которые предназначены для нескольких платформ.

Создание файлов ресурсов

Редакторы ресурсов Visual Studio являются наиболее простым и удобным способом создания RESW-файлов. Эти редакторы содержат пользовательский интерфейс, который скрывает исходный XML-формат RESW-файла. Использование Visual Studio для создания и редактирования файлов ресурсов имеет два основных преимущества:

  • отпадает необходимость создания файлов ресурсов вручную и контроля правильности XML-формата;

  • редактор также обеспечивает использование программы MakePRI для компиляции ресурсов, их упаковки в PRI-файлы и включения в пакеты развертывания приложений.

В настольных приложениях для указания нейтрального языка и региональных параметров использовался атрибут NeutralResourcesLanguageAttribute. В приложениях Магазина Windows этот атрибут не учитывается при создании PRI-файлов и при извлечении ресурсов с помощью класса Windows ResourceLoader.

В приложениях Магазина Windows имена локализованных файлов ресурсов задаются путем создания папки для хранения ресурсов и изображений определенного поддерживаемого языка и региональных параметров. Затем ресурсы можно задавать с помощью имен языков и региональных параметров (например, "ru-ru"), за которыми следует имя ресурса по умолчанию и расширение файла ресурсов (например, "ru-ru\Resources.resw").

Развертывание файлов ресурсов

В Visual Studio все параметры развертывания файлов ресурсов в приложениях обрабатываются в рамках проектов Visual Studio. Visual Studio автоматически создает файл конфигурации для всех ресурсов, которые являются частью проекта, с помощью средства MakePRI включает ресурсы в один PRI-файл и помещает PRI-файл в пакет развертывания приложения.

Поскольку все ресурсы включаются в один PRI-файл, а не в набор отдельных файлов, изменение существующего файла ресурсов или добавление поддержки нового локализованного языка и региональных параметров предполагает повторное построение и распространение всего приложения.

Извлечение ресурсов из файлов ресурсов

Чтобы извлечь ресурсы в приложении Магазина Windows, необходимо создать объект Среда выполнения Windows Windows.ApplicationModel.Resources.ResourceLoader или объект одного из типов в пространстве имен Windows.ApplicationModel.Resources.Core. Хотя класс .NET Framework System.Resources.ResourceManager поддерживается в Магазина Windows, использовать его не рекомендуется. Используйте ResourceManager только при разработке проектов Переносимая библиотека классов, предназначенных для нескольких платформ. В следующей таблице перечислены члены ResourceManager и их простые эквиваленты в классе Windows.ApplicationModel.Resources.ResourceLoader или типы в пространстве имен Windows.ApplicationModel.Resources.Core.

Член ResourceManager

Эквивалентный член ResourceLoader или другого типа Среда выполнения Windows

ResourceManager.GetString(String)

Windows.ApplicationModel.Resources.ResourceLoader.GetString(String)

ResourceManager.GetString(String, CultureInfo)

Windows.ApplicationModel.Resources.Core.ResourceMap.GetValue(String, ResourceContext)

ResourceManager.ResourceManager(String, Assembly)

Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader()

-или-

Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader(String)

Простой пример "Hello World"

Ниже приведен простой пример приложения Магазина Windows, в котором отображаются локализованные строки. Его нейтральный язык и региональные параметры — "Русский (Россия)", но оно также включает ресурсы для языков "Английский (США)" и "Французский (Франция)". Если запустить приложение в системе, в которой установлен текущий язык и региональные параметры "Английский (США)", то появится приветствие на английском языке; в противном случае будет показано русское приветствие по умолчанию. Наконец, независимо от текущего языка и региональных параметров, приложение использует объекты Windows.ApplicationModel.Resources.Core.ResourceContext и Windows.ApplicationModel.Resources.Core.ResourceMap для отображения приветствия на французском языке.

Для отображения текста в элементе управления TextBlock необходимо добавить в файл BlankPage.xaml следующий тег <TextBlock>:

    <Grid Background="{StaticResource PageBackgroundBrush}"> <TextBlock x:Name="outputBlock" /> </Grid>

Затем код приложения вызывается из конструктора класса BlankPage следующим образом:

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Example.Run(outputBlock)
End Sub
public BlankPage()
{

    InitializeComponent();
    Example.Run(outputBlock);
}

Пример требует создания следующих ресурсов:

  • русский языковой ресурс с именем "Greeting" и значением "Привет!". Строка должна быть добавлена в файл ресурсов Resources.resw на корневом уровне проекта;

  • английский языковой ресурс с именем "Greeting" и значением "Hi there!". Для создания файла ресурсов добавьте в проект папку с именем en-US, а затем добавьте в нее файл ресурсов с именем Resources.resw;

  • французский языковой ресурс с именем "Greeting" и значением "Bonjour!". Для создания файла ресурсов добавьте в проект папку с именем fr-FR, а затем добавьте в нее файл ресурсов с именем Resources.resw.

В следующем примере показаны соответствующие локализованные строки в элементе управления TextBlock.

Imports System.Globalization
Imports Windows.ApplicationModel.Resources
Imports Windows.ApplicationModel.Resources.Core
Imports Windows.UI.Xaml.Controls

Public Class Example
    Public Shared Sub Run(outputBlock As Windows.UI.Xaml.Controls.TextBlock)
        outputBlock.Text += String.Format("{1}The current culture is {0}.{1}",
                                          CultureInfo.CurrentCulture.Name, vbCrLf)
        Dim rl As ResourceLoader = New ResourceLoader()

        ' Display greeting using the resources of the current culture.
        Dim greeting As String = rl.GetString("Greeting")
        outputBlock.Text += String.Format("{0}{1}",
                                          If(String.IsNullOrEmpty(greeting), "Здрауствуйте", greeting),
                                          vbCrLf)

        ' Display greeting using fr-FR resources.
        Dim ctx As ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext()
        ctx.Languages = {"fr-FR"}

        Dim rmap As ResourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources")
        Dim newGreeting As String = rmap.GetValue("Greeting", ctx).ToString()

        outputBlock.Text += String.Format("{1}{1}Culture of Current Context: {0}{1}",
                                          ctx.Languages(0), vbCrLf)
        outputBlock.Text += String.Format("{0}{1}", If(String.IsNullOrEmpty(newGreeting),
                                                       greeting, newGreeting), vbCrLf)
    End Sub
End Class
using System;
using System.Globalization;
using Windows.ApplicationModel.Resources;
using Windows.ApplicationModel.Resources.Core;
using Windows.UI.Xaml.Controls;

public class Example
{
    public static void Run(Windows.UI.Xaml.Controls.TextBlock outputBlock)
    {
        outputBlock.Text += String.Format("\nThe current culture is {0}.\n", CultureInfo.CurrentCulture.Name);
        ResourceLoader rl = new ResourceLoader();

        // Display greeting using the resources of the current culture.
        string greeting = rl.GetString("Greeting");
        outputBlock.Text += String.Format("{0}\n", String.IsNullOrEmpty(greeting) ? "Здрауствуйте" :  greeting);


        // Display greeting using fr-FR resources.
        ResourceContext ctx = new Windows.ApplicationModel.Resources.Core.ResourceContext();
        ctx.Languages =  new string[] { "fr-FR" } ;

        ResourceMap rmap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
        string newGreeting = rmap.GetValue("Greeting", ctx).ToString();

        outputBlock.Text += String.Format("\n\nCulture of Current Context: {0}\n", ctx.Languages[0]);
        outputBlock.Text += String.Format("{0}\n", String.IsNullOrEmpty(newGreeting) ? greeting : newGreeting);

    }
}

После компиляции и запуска приложения будет выведен текст следующего вида (для системы с языком и региональными параметрами "Английский (США)"):

The current culture is en-US. Hi there! Culture of Current Context: fr-FR Bonjour!

См. также

Ссылки

Редакторы ресурсов Visual Studio

Основные понятия

Ресурсы в приложениях для настольных систем