언어: HTML | XAML

문자열 리소스를 로드하는 방법(XAML)

Applies to Windows and Windows Phone

리소스 파일, 라이브러리, 컨트롤, Windows 스토어 앱 패키지 및 매니페스트 등의 개체에서 문자열 리소스를 로드할 수 있습니다.

리소스 파일에서 문자열 로드.

문자열 리소스는 리소스 파일에서 작성되고 리소스 식별자를 사용하여 참조됩니다. 문자열 리소스를 로드하는 방법에 대한 기본적인 설명은 빠른 시작: 문자열 리소스 사용을 참조하세요.

대부분의 응용 프로그램은 하나의 기본 리소스 파일(<language>/Resources.resw)만 필요로 하며, 상대 경로('String1')를 사용하여 리소스를 참조할 수 있습니다. 그러나 일부 응용 프로그램에서는 구성 요소를 구분하기 위해 리소스를 여러 리소스 파일로 분리하는 것이 적절합니다.

예제:

파일 이름:

Strings/en-US/Errors.resw


<TextBlock x:Uid="/Errors/AlreadyRegistered"></TextBlock>



var res =  Windows.ApplicationModel.ResourceLoader('Errors');
res.GetString('AlreadyRegistered');

리소스 식별자의 형식은 /ResourceFileName/StringName입니다. 리소스 파일 이름에는 확장명이나 폴더 경로가 포함되지 않습니다. 따라서 모든 리소스 파일 이름은 구성 요소 또는 프로젝트에서 고유해야 합니다.

라이브러리, 컨트롤 또는 SDK(소프트웨어 개발 키트)에서 문자열 로드.

앱에 구성 요소가 여러 개 있거나 앱이 .NET 휴대용 라이브러리, 클래스 라이브러리, 컨트롤 라이브러리 같은 라이브러리에 종속되는 경우도 있습니다.

가능하면 컨트롤 및 SDK에서 리소스 수를 줄이고 앱을 통해 리소스를 제공해야 합니다. 라이브러리에서 리소스를 제공해야 하는 경우 앱이 이러한 리소스를 입력으로 바꿀 수 있도록 해야 합니다. 라이브러리와 라이브러리를 사용 중인 앱의 지역화 범위가 다른 경우에 이렇게 해야 할 수 있습니다.

컨트롤에는 지정된 대로 정확하게 전달된 사용자 지정 문자열이 표시되어야 하며 가능한 경우 앱에서 지역화를 처리하도록 해야 합니다.

문자열 리소스와 마찬가지로 구성 요소 또는 라이브러리 파일은 일반적으로 빌드 중에 포함되는 패키지의 하위 폴더에 추가됩니다. 이 파일의 리소스 식별자의 형식은 일반적으로 다음과 같습니다.

ClassLibrarySDKOrAssemblyName/ResourceFileName/StringName

프로그래밍 방식으로 라이브러리에서 리소스에 대한 자체의 ResourceLoader를 가져올 수도 있습니다. 예를 들어 다음 코드는 라이브러리 또는 SDK에서 고유한 리소스 파일에 대한 ResourceLoader를 가져오는 방법을 보여 줍니다.


ResourceLoader R = new Windows.ApplicationModel.Resources.ResourceLoader("ContosoControl/Resources");
R.getString("loadingStr"); // which came from ContosoControl's Resources.resw


다른 패키지에서 문자열 로드.

각 Windows 스토어 앱 패키지의 리소스는 현재 ResourceManager에서 액세스 가능한 개별 최상위 ResourceMap을 통해 개별적으로 관리 및 액세스됩니다. 각 패키지에서 다양한 구성 요소가 고유한 ResourceMap Subtree를 가질 수 있습니다.

프레임워크 패키지는 절대 리소스 식별자 URI를 사용하여 고유한 리소스에 액세스할 수 있습니다. ms-resource URI에 대한 자세한 내용은 ms-resource, ms-appx URI를 참조하세요.

Windows 스토어 앱 매니페스트에서 문자열 로드.

매니페스트에 표시할 수 있는 모든 문자열과 로고를 지역화할 수 있습니다. 배율 및 고대비 모드에 맞게 로고를 조정할 수도 있습니다. 매니페스트에 ms-resource: scheme-specified URI를 배치하여 하드 코드된 문자열 대신 문자열 참조를 추가할 수 있습니다. 예를 들면 다음과 같습니다.


<DisplayName>ms-resource:String1</DisplayName>

Resources.resw 또는 Resources.resjson 리소스 파일에서 String1 문자열을 참조하고,


ShortName="ms-resource:/ManifestStrings/Shortname"

ManifestStrings.resw/.resjson 리소스 파일에서 Shortname 문자열을 참조합니다.

특정 언어 또는 컨텍스트에 대한 문자열 로드.

ResourceManager에서 가져온 개체인 기본 ResourceContext는 리소스가 일치하는 현재 상태를 나타냅니다. ResourceContext는 현재 사용자와 컴퓨터의 다양한 한정자 값을 모두 포함합니다. 각 한정자를 다시 정의할 수 있지만 그렇게 하지 않는 것이 좋습니다. 대부분의 한정자는 시스템 데이터 공급자이며, 별도의 API(즉, PrimaryLanguageOverride)를 통해 변경하는 것이 좋은 경우도 있고 변경되지 않은 상태로 유지하는 것이 좋은 경우도 있습니다.

Windows.ApplicationModel.Resources.Core.ResourceManager.current.defaultContext;

다양한 한정자와 해당 데이터 공급자에 대한 자세한 내용은 한정자를 사용하여 리소스 이름을 지정하는 방법을 참조하세요.

ResourceManager는 리소스 조회가 수행되는 기본 컨텍스트 개체를 유지 관리합니다. 앱이 리소스를 로드할 때 언어, 배율 또는 기타 컨텍스트 한정자에 대해 명시하는 것이 좋은 경우도 있습니다. 예를 들면, 앱을 사용하여 도구 설명 또는 오류 메시지에 대한 대체 언어를 선택할 수 있습니다. 조회에서 선택되는 리소스에 영향을 주도록 명시적으로 재정의된 고유한 컨텍스트 개체를 지정할 수 있습니다. 명시적 컨텍스트를 지정하려면


using Windows.ApplicationModel.Resources.Core;

var context = new ResourceContext();
context.languages = new List<String>();
context.languages.Add("en-us");

var resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
var str = resourceMap.GetValue("scenario3Message", context);

이벤트 및 컨텍스트 변경.

시스템이 변경될 때 Windows 스토어 앱이 계속 실행 중일 수 있으며, 이로 인해 다른 한정자 집합이 사용됩니다. 이러한 변경의 한 가지 예는 사용자가 고대비를 켤 때입니다. 시스템이 다양하게 변경되면 ResourceContext 개체에 대한 이벤트가 호출됩니다.

XAML을 사용하는 앱에서 표시된 페이지를 새 리소스로 업데이트하는 프로세스는 이러한 이벤트의 처리기가 종종 UI 스레드가 아닌 다른 스레드에서 호출되기 때문에 복잡해집니다. 다음의 부분 샘플은 변경 이벤트를 수신하고 주 페이지에서 텍스트를 업데이트하는 방법을 보여 줍니다. 다음에 유의하세요.

  • MainPage 생성자에서 이벤트 처리기 qualifiers_MapChanged는 리소스 한정자가 변경될 때 호출되도록 설정됩니다.
  • 이벤트 처리기 qualifiers_MapChanged는 해당 스레드에서 UpdateTextBlocks 메서드가 호출되도록 합니다.
  • UpdateTextBlocks 메서드는 해당하는 새 리소스 문자열을 로드하고 주 페이지의 텍스트 블록을 업데이트합니다.

public sealed partial class MainPage : SampleApp.Common.LayoutAwarePage
{
    public MainPage()
    {
        this.InitializeComponent();

        // Listen for event when the resource qualifiers change.
        var qualifiers = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.DefaultContext.QualifierValues;
        qualifiers.MapChanged += new MapChangedEventHandler<string, string>(qualifiers_MapChanged);
    }

    // Event handler for change in resource qualifiers.
    private async void qualifiers_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)
    {
        var d = GreetingHello.Dispatcher;
        if (d.HasThreadAccess)
        {
            UpdateTextBlocks();
        }
        else
        {
            await d.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => UpdateTextBlocks());
        }
    }

    // Update text blocks on the main page.
    private void UpdateTextBlocks()
    {
        // Replace the Text properties of text blocks on the main page with the appropriate resource strings.
        var resourceLoader = new Windows.ApplicationModel.Resources.ResourceLoader();
        Greeting.Text = resourceLoader.GetString("Greeting");
        Farewell.Text = resourceLoader.GetString("Farewell");
    }
    ...
}

관련 항목

Windows.ApplicationModel.Resources.ResourceLoader
Windows.ApplicationModel.Resources.Core.ResourceContext
Windows.ApplicationModel.Resources.Core.ResourceManager
Windows.ApplicationModel.Resources.Core.ResourceMap
Windows.Globalization.ApplicationPreferences.PrimaryLanguageOverride
컨텍스트별 기능 및 제한
한정자를 사용하여 리소스 이름을 지정하는 방법
C# 또는 Visual Basic으로 작성한 Windows 런타임 앱용 로드맵

 

 

표시:
© 2015 Microsoft