Создание и извлечение ресурсов в приложениях для Магазина 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 |
---|---|
Windows.ApplicationModel.Resources.ResourceLoader.GetString(String) |
|
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