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

[ 이 문서는 Windows 런타임 앱을 작성하는 Windows 8.x 및 Windows Phone 8.x 개발자를 대상으로 합니다. Windows 10용으로 개발하는 경우에는 최신 설명서를 참조하세요.]

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

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

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

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

예제:

파일 이름:

Strings/en-US/Errors.resjson

태그에서 참조:

<span data-win-res="{textContent: '/Errors/AlreadyRegistered'}"></span>

코드에서 참조:

WinJS.Resources.getString('/Errors/AlreadyRegistered');

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

라이브러리 및 컨트롤에서 문자열 로드

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

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

예제:

var rating = new WinJS.UI.RatingsControl(el, {label: 'Please Rate', image: 'images/star.png'});

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

var control = new Control(el, {commands: [
    {label: R.getString('Reply')}, 
    {label: R.getString('ReplyAll')
    ]});

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

ClassLibraryOrAssemblyName**/ResourceFileName/**StringName

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


var resources = Windows.ApplicationModel.Resources;
var RL = new resources.ResourceLoader('ContosoControl/Resources');
RL.getString('loadingStr'); // which came from ContosoControl's Resources

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

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

프레임워크 패키지는 절대 리소스 식별자 URI를 사용하여 고유한 리소스에 액세스할 수 있습니다.

ms-resource URI에 대한 자세한 내용은 URI 스키마를 참조합니다.

JavaScript 컨트롤에서 문자열 로드

기본 문자열을 제공하는 JavaScript 컨트롤은 WinJS.Resources.getString을 사용하여 고유한 문자열을 검색해야 합니다.

웹 컨텍스트에 **ms-app-web:**을(를) 사용하여 로드된 HTML 문서는 Windows 런타임 API에 액세스할 수 없습니다. 따라서 JavaScript 코드에서 WinJS.Resources.getString을(를) 사용하도록 작성된 JavaScript 컨트롤을 포함합니다. 웹 컨텍스트에서 WinJS.Resources.getString은(는) 전역 문자열 개체의 속성으로 지정된 ID를 검색하는 것으로 되돌아갑니다.

var strings = { 'String1' : 'Hello' };
WinJS.Resources.getString('String1');

또한 WinJS.Resources.getString을 다시 정의하여 다른 위치에서 리소스를 가져올 수 있습니다.

WinJS.Resources.getString = function(id){
    return getStringFromOtherService(id);
}

앱 매니페스트에서 문자열 로드

매니페스트에 표시할 수 있는 모든 문자열과 로고를 지역화할 수 있습니다. 배율 및 고대비 모드에 맞게 로고를 조정할 수도 있습니다. 문자열 참조는 하드 코드된 문자열의 위치에 추가될 수 있습니다. 이는 ms-resource: 구성표에 지정된 URI를 매니페스트 데이터에 배치하여 그렇게 할 수 있습니다(주로 appxmanifest를 편집하기 위한 Visual Studio 탭 UI에서 수행됨). 예를 들어, ms-resource:String1은(는) Resources.resw 리소스 파일 내에 String1(으)로 불리는 문자열을 참조하는 반면, ms-resource:/ManifestStrings/Shortname은(는) ManifestStrings.resw 리소스 파일 내에 Shortname(으)로 불리는 문자열을 참조합니다.

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

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

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

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

var rcns = Windows.ApplicationModel.Resources.Core;

var context = new rcns.ResourceContext(); // deliberately not using getForCurrentView()
context.languages = new Array('fr-fr');
var resourceMap = rcns.ResourceManager.current.mainResourceMap.getSubtree('Resources');
var str = resourceMap.getValue('string1', context).ValueAsString;

사용할 수 있는 또 다른 기술은 ResourceContext.GetForCurrentView을(를) 호출하기 전에 ResourceContext.SetGlobalQualifierContext을(를) 호출하는 것입니다. 언어 시나리오의 경우 새 값으로 language 한정자를 설정합니다. 이렇게 할 경우 차이점은 한정자 및 컨텍스트 변경이 단일 GetValue 호출 시 사용을 위해 생성한 특정 ResourceContext에 뿐만 아니라 이제는 모든 리소스 조회에 적용된다는 것입니다. ApplicationLanguages.PrimaryLanguageOverride을(를) 참조하세요.

이벤트 및 컨텍스트 변경

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

JavaScript에서 이러한 이벤트를 수신 대기하는 가장 간단한 방법은 addEventListener 메서드를 통하는 것입니다.

WinJS.Resources.addEventListener('contextchanged', refresh, false);

이벤트를 검색한 후 앱에서 문서를 다시 처리할 수 있으므로 올바른 리소스가 로드될 수 있습니다.

function refresh(){
    WinJS.Resources.processAll(); // Refetch string resources.
}

리소스를 다시 처리하면 새 리소스가 요소의 속성에 직접 적용되므로 리소스 내 데이터 바인딩 값이 다시 설정될 수 있습니다. 리소스에 데이터 바인딩 슬롯이 있으면 리소스를 다시 처리할 경우 다시 바인딩합니다.

관련 항목

Windows.ApplicationModel.Resources.ResourceLoader

Windows.ApplicationModel.Resources.Core.ResourceContext

Windows.ApplicationModel.Resources.Core.ResourceManager

Windows.ApplicationModel.Resources.Core.ResourceMap

Windows.Globalization.ApplicationPreferences.PrimaryLanguageOverride

WinJS.Resources.getString

컨텍스트별 기능 및 제한

한정자를 사용하여 리소스 이름을 지정하는 방법

앱 리소스 및 지역화