다음을 통해 공유


Windows 스토어 앱에서 리소스 만들기 및 검색

Windows 8 운영 체제에서는 .NET Framework 데스크톱 앱에 일반적인 허브 및 스포크 모델을 대체하는 Windows 스토어 앱의 새로운 리소스 모델이 도입되었습니다.이 항목에서는 이 새로운 리소스 모델에 대해 설명하고 Windows 스토어 앱에서 리소스를 만들고 배포하고 검색하는 방법을 살펴봅니다.

Windows 스토어 앱의 리소스

.NET Framework 데스크톱 앱은 리소스를 패키지하고 배포하기 위한 허브 및 스포크 모델을 사용합니다.일반적으로 앱의 중립 문화권(지역화된 리소스를 사용할 수 없는 경우 리소스가 사용되는 문화권)에 대한 리소스는 앱의 주 실행 파일에 포함됩니다.각 추가 문화권에 대한 지역화된 리소스는 실행 코드 없이 리소스만 포함된 독립 실행형 위성 어셈블리에 포함됩니다.

이와 대조적으로 Windows 스토어 앱은 단일 리소스 파일을 사용합니다.이 파일은 PRI(패키지 리소스 인덱스) 파일이라고 하며 모든 언어, 문화권 및 배율에 대한 리소스를 저장합니다.

중요

리소스 대체 규칙에 따라 특정 문화권이나 현재 문화권에 대한 지역화된 리소스를 찾을 수 없는 경우 로드되는 리소스가 결정됩니다.

데스크톱 앱에서 텍스트 파일이나 XML(.resx) 파일을 사용하여 리소스를 만들 수 있습니다.리소스 파일 생성기(Resgen.exe)는 이러한 파일을 이진 리소스(.resources) 파일로 컴파일하는 데 사용됩니다.컴파일러를 사용하여 중립 문화권의 리소스를 주 앱 어셈블리에 포함하고 어셈블리 링커(AL.exe)를 사용하여 다른 모든 지역화된 리소스를 위성 어셈블리에 포함합니다.그런 다음 System.Resources.ResourceManager 클래스를 사용하여 개별 리소스를 검색하거나 ResourceReader 클래스를 사용하여 리소스를 열거할 수 있습니다.

Windows 스토어 앱에서는 .resw 파일을 사용하여 리소스를 만듭니다.파일 확장명이 다르지만 .resw 파일에 문자열과 파일 경로만 포함될 수 있다는 점을 제외하고 .resw 파일 형식은 .resx 파일 형식과 동일합니다.Visual Studio 리소스 편집기를 사용하여 리소스를 만들고 편집할 수 있습니다.컴파일 타임에 앱의 모든 .resw 파일은 MakePRI 유틸리티에 의해 단일 PRI 파일로 패키지되고 앱의 배포 패키지에 포함됩니다.런타임에 Windows.ApplicationModel.Resources.ResourceLoader 클래스와 Windows.ApplicationModel.Resources.Core 네임스페이스의 형식은 앱 리소스에 대한 액세스를 제공합니다.

중요

리소스 파일 생성기(Resgen.exe)가 데스크톱 앱에서 주로 사용되지만 이 도구를 사용하여 위성 어셈블리를 .resw 파일로 디컴파일할 수도 있습니다. 이 .resw 파일은 PRI 파일로 컴파일될 수 있습니다.

경고

System.Resources.ResourceManager 클래스가 Windows 스토어 앱용 .NET에 포함되어 있지만 이 클래스는 사용하지 않는 것이 좋습니다.이식 가능한 클래스 라이브러리 프로젝트로 개발되고 여러 플랫폼을 대상으로 하는 라이브러리에서만 ResourceManager를 사용하세요.

리소스 파일 만들기

Visual Studio의 리소스 편집기를 사용하면 .resw 파일을 가장 쉽고 편리하게 만들 수 있습니다.이러한 편집기는 .resw 파일의 기본 XML 파일 형식을 숨기는 사용자 인터페이스를 제공합니다.Visual Studio를 사용하여 리소스 파일을 만들고 편집하는 경우 다음과 같은 두 가지 주요 이점이 있습니다.

  • 리소스 파일을 수동으로 만들고 XML 형식이 유효한지 확인할 필요가 없습니다.

  • MakePRI 유틸리티를 사용하여 리소스를 컴파일하고 PRI 파일에 넣어 앱의 배포 패키지에 포함하는 프로세스가 처리됩니다.

데스크톱 앱에서는 NeutralResourcesLanguageAttribute 특성을 사용하여 앱의 중립 문화권을 정의합니다.Windows 스토어 앱에서 이 특성은 PRI 파일이 만들어질 때와 Windows ResourceLoader 클래스가 리소스를 추출하는 데 사용될 때 무시됩니다.

Windows 스토어 앱에서는 지원되는 문화권의 리소스와 이미지를 저장하기 위해 폴더를 만들어 지역화된 리소스 파일의 이름을 지정합니다.그러면 문화권 이름(예: "ko-kr") 뒤에 기본 리소스 이름과 리소스 파일 확장명을 사용하여(예: "ko-kr\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.ResourceContextWindows.ApplicationModel.Resources.Core.ResourceMap 개체를 사용하여 프랑스어로 인사말을 표시합니다.

TextBlock 컨트롤에 출력을 표시하려면 예제에서 다음 <TextBlock> 태그를 BlankPage.xaml에 추가해야 합니다.

    <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라는 리소스 파일에 추가되어야 합니다.

  • 값이 "Hi there!"인 "Greeting"이라는 영어 리소스.리소스 파일을 만들려면 en-US라는 폴더를 프로젝트에 추가한 다음 Resources.resw라는 리소스 파일을 폴더에 추가합니다.

  • 값이 "Bonjour!"인 "Greeting"이라는 프랑스어 리소스.리소스 파일을 만들려면 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);

    }
}

응용 프로그램을 컴파일하고 실행하면 문화권이 en-US인 시스템에 다음과 같은 출력이 표시됩니다.

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

참고 항목

참조

Visual Studio 리소스 편집기

개념

데스크톱 응용 프로그램의 리소스