MRM의 한정자
리소스 인덱서(및 MRT 런타임)는 "한정자"를 사용하여 지정된 리소스 후보를 사용해야 하는 컨텍스트를 결정합니다. 모든 리소스에는 이름과 하나 이상의 후보(또는 값)가 있으며 각 후보는 0개 이상의 한정자를 가릅니다. 리소스 이름 지정에 대한 자세한 내용은 MRM의 리소스 이름을 참조 하세요.
예를 들어 세 가지 지역화에 대해 세 가지 다른 후보가 있는 greeting이라는 문자열 리소스가 있을 수 있습니다.
- 영어의 경우 "Hello" 텍스트
- 독일어의 경우 텍스트 "할로"입니다.
- 한국어의 경우 "안녕하세요"라는 텍스트
이러한 후보는 올바른 언어 한정자를 사용하여 인덱서에 추가되며 MRT가 런타임에 사용할 후보를 알 수 있도록 PRI 파일에 저장됩니다. 예를 들어 인덱서에 다음 세 문자열을 추가하려면 다음을 사용할 수 있습니다.
HRESULT hr{};
hr = MrmIndexString(indexer, L"ms-resource:///strings/greeting", L"Hello", L"language-en");
hr |= MrmIndexString(indexer, L"ms-resource:///strings/greeting", L"Hallo", L"language-de");
hr |= MrmIndexString(indexer, L"ms-resource:///strings/greeting", L"안녕하세요", L"language-ko");
if (FAILED(hr)) { /* error handling */ }
언어는 가능한 한정자 중 하나일 뿐입니다. 다른 일반적인 한정자는 크기 조정(다른 해상도에서 이미지를 지정하기 위한 경우) 또는 대비(다른 대비 설정의 경우)를 포함합니다. 전체 한정자 목록은 ResourceContext.QualifierValues 항목에 나열됩니다.
한정자의 "짧은" 형식(예: "언어" 대신 "lang")은 MRM API에서 지원되지 않습니다. 긴 형식을 사용해야 합니다. 그럼에도 불구하고 파일 경로에서 한정자를 유추하는 MrmIndexFileAutoQualifiers 및 MrmIndexResourceContainerAutoQualifiers 함수는 짧은 형식을 지원합니다.
한정자는 형식 name-value
의 문자열(예: language-en
또는 scale-200
)으로 지정됩니다.
(이 값언어에 대한 한정자는 하이픈(예: en-us
)을 포함 할 수 있습니다.) 이름과 값은 모두 대/소문자를 구분하지 않으므로 LANGUAGE-EN-US
, Language-En-Us
및 language-en-us
은 모두 동일합니다.
동일한 한정자가 있지만 값이 다른 동일한 리소스에 대해 두 후보를 지정하는 것은 오류입니다. 아쉽게도 이 오류는 리소스가 인덱서에 추가될 때(예: MrmIndexString을 호출할 때) 표시되지 않지만 PRI 파일이 생성될 때 생성은 ERROR_MRM_DUPLICATE_ENTRY 반환하지만 문제를 일으킨 리소스를 표시하지 않습니다.
예를 들어 이 코드 조각은 중복 후보를 추가할 때 성공하지만 PRI 생성 중에 나중에 실패합니다.
// Add "color = red". Returns S_OK, since all arguments are valid.
hr = MrmIndexString(indexer, L"ms-resource:///strings/color", L"red", L"language-en");
// Add "color = blue". Returns S_OK, since all arguments are valid (in isolation).
hr = MrmIndexString(indexer, L"ms-resource:///strings/color", L"blue", L"language-en");
// Fails with ERROR_MRM_DUPLICATE_ENTRY since there are two English candidates for "strings/color"
// ("red" and "blue").
hr = MrmCreateResourceFile(indexer, MrmPackagingModeStandaloneFile, MrmPackagingOptionsNone, fileName);
정확히 동일한 후보가 두 번 추가된 경우(예: 위의 코드에서 두 번째 호출이 "파란색"을 사용하는 대신 "빨간색"을 반복하는 경우) 중복이 무시되고 오류가 생성되지 않습니다.
한정자 목록
리소스 후보는 둘 이상의 한정자를 가질 수 있습니다. 예를 들어 이미지 파일에는 크기 조정(100%, 200% 등) 및 대비(표준 또는 높음)를 기반으로 하는 후보가 필요할 수 있습니다. 이미지에 텍스트가 포함된 경우 언어에 따라 정규화해야 할 수도 있습니다.
여러 한정자는 밑줄로 구분된 단일 문자열로 지정됩니다. 예를 들어 200% 크기 조정된 고대비 이미지 후보는 한정자 contrast-high_scale-200
를 사용합니다. 목록에 한정자를 지정하는 순서는 중요하지 않습니다. MRT에는 각 한정자(예: 언어가 크기 조정이 더 중요함)에 대한 중요도의 기본 제공 순서가 있습니다.
한정자 목록에서 한정자를 반복하는 것은 오류가 아니지만(값이 다른 경우에도) 첫 번째를 제외한 모든 항목이 무시됩니다.
-
language-en_language-en
(영어, 독일어 지정 - 유효 언어는 영어) -
language-en_language-de
(영어, 독일어 지정 - 유효 언어는 영어) -
language-de_language-en
(독일어, 영어 지정 - 유효 언어는 독일어)
위에서 설명한 것처럼 한정자가 같지만 값이 다른 두 개의 리소스 후보를 추가하는 것은 오류입니다. 이는 한정자 목록의 한정자 순서에 관계없이 수행됩니다.
중립 후보
인덱서에 리소스 후보를 추가할 때 emptry 문자열(또는 null 포인터)을 한정자로 지정하여 후보가 "중립"이며 모든 컨텍스트와 일치할 수 있음을 나타낼 수 있습니다. 예를 들어 앱 이름은 일반적으로 지역화되지 않으므로 시작 메뉴 표시된 앱의 이름은 중립적인 후보가 될 수 있습니다(크기 조정 또는 대비와 같은 다른 항목에 의존하지 않음). 원하는 경우 특정 후보 외에 중립 후보를 사용할 수 있습니다.
예시:
// The name of the app is the same, regardless of language, scale, etc.
hr = MrmIndexString(indexer, L"ms-resource:///strings/AppName", L"Contoso Widgets", nullptr);
// The name of the publisher is always "Contoso Inc." except in Australia, where it is "Contoso PTY LTD".
hr = MrmIndexString(indexer, L"ms-resource:///strings/AppPublisher", L"Contoso Inc.", nullptr);
hr = MrmIndexString(indexer, L"ms-resource:///strings/AppPublisher", L"Contoso PTY LTD", L"homeregion-au");
기본 한정자
구성 파일을 만들거나(MrmCreateConfig... 함수 중 하나를 통해) 리소스 인덱서(MrmCreateResourceIndexer... 함수 중 하나를 통해)를 만들 때 defaultQualifier는 더 나은 일치 항목을 찾을 수 없는 경우 사용할 리소스 후보를 나타내는 한정자(예: 언어)입니다. 예를 들어 앱에 영어와 프랑스어로 된 리소스가 있지만 언어가 일본어로 설정된 시스템에서 실행되는 경우 PRI 파일을 만들 때 "기본 한정자"로 지정된 언어가 사용됩니다. 또한 기본 한정자는 AutoSplit 패키징을 사용할 때 기본 PRI 파일을 만드는 데 사용해야 하는 언어와 크기를 결정합니다(자세한 내용은 MrmPackagingMode 참조).
모든 리소스 에는 기본 한정자(또는 중립 후보)로 지정된 후보가 있어야 합니다 . 그렇지 않으면 최상의 일치 항목이 없는 경우 대체될 항목이 없습니다. 대체 후보를 제공하지 못하는 것은 오류로 간주되지 않지만 (인덱서는 빈 문자열 후보를 생성합니다) 사용자 환경이나 애플리케이션 버그가 저하될 수 있습니다.