Dela via


Kvalificerare i MRM

Resursindexeraren (och MRT-körningen) använder "kvalificerare" för att fastställa de kontexter där en viss resurskandidat ska användas. Varje resurs har ett namn och en eller flera kandidater (eller värden) och varje kandidat har noll eller fler kvalificerare. Mer information om namngivning av resurser finns i Resursnamn i MRM.

Det kan till exempel finnas en strängresurs med namnet hälsning med tre olika kandidater för tre olika lokaliseringar:

  • För engelska är texten "Hello"
  • För tyska är texten "Hallo"
  • För koreanska texten "안녕하세요"

Dessa kandidater läggs till i indexeraren med rätt språkkvalificerare och de lagras i PRI-filen så att MRT vet vilken som ska användas vid körning. Om du till exempel vill lägga till dessa tre strängar i en indexerare kan du använda:

    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 */ }

Language är bara en av de möjliga kvalen. andra vanliga kvalificerare är Scale (för att ange bilder med olika upplösningar) eller Contrast (för olika kontrastinställningar). En fullständig lista över kvalificerare visas i avsnittet ResourceContext.QualifierValues.

Observera att den "korta" formen av kvalificerarna (t.ex. "lang" i stället för "språk") inte stöds av MRM-API:erna. du måste använda det långa formuläret. Funktionerna MrmIndexFileAutoQualifiers och MrmIndexResourceContainerAutoQualifiers som härleder kvalificerare från filsökvägar stöder dock de korta formulären.

Kvalificerare anges som strängar i formuläret name-value, till exempel language-en eller scale-200. (Värdena för en Language-kvalificerare kan också innehålla bindestreck, till exempel en-us.) Både namnet och värdet är skiftlägesokänsliga, så LANGUAGE-EN-US, Language-En-Usoch language-en-us är alla likvärdiga.

Observera att det är ett fel att ange två kandidater för samma resurs med samma kvalificerare men olika värden. Tyvärr visas inte det här felet när resurser läggs till i indexeraren (t.ex. när du anropar MrmIndexString) men vid den tidpunkt då PRI-filen genereras kommer genereringen att returnera ERROR_MRM_DUPLICATE_ENTRY men ger ingen indikation på vilken resurs som orsakade problemet.

Det här kodfragmentet lyckas till exempel när du lägger till en duplicerad kandidat, men misslyckas senare under PRI-genereringen:

// 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);

Om exakt samma kandidat läggs till två gånger (t.ex. i koden ovan, om det andra anropet upprepas "rött" i stället för att använda "blå") ignoreras dubbletten och inget fel genereras.

Kvalificerarlistor

Resurskandidater kan ha fler än en kvalificerare. Bildfiler kan till exempel behöva kandidater baserat på både Skala (100%, 200%osv.) och Contrast (standard eller hög). Om bilden innehåller text kan den också behöva kvalificeras baserat på Language.

Flera kvalificerare anges i en enda sträng, avgränsade med understreck. En bildkandidat för högkontrast vid 200% skalad använder till exempel contrast-high_scale-200. Den ordning i vilken kvalificerare anges i listan spelar ingen roll; MRT har en inbyggd prioritetsordning för varje kvalificerare (t.ex. Language är viktigare än Skala).

Även om det inte är ett fel att upprepa en kvalificerare i en kvalificerarlista (även med olika värden), ignoreras alla utom den första.

  • language-en_language-en (ange engelska två gånger – effektivt språk är engelska)
  • language-en_language-de (ange engelska sedan tyska - effektivt språk är engelska)
  • language-de_language-en (ange tyska sedan engelska - effektivt språk är tyska)

Som nämnts ovan är det ett fel att lägga till två resurskandidater med samma kvalificerare men olika värden. Detta gäller oavsett ordningen på kvalificeringarna i en kvallista.

Neutrala kandidater

När du lägger till resurskandidater i indexeraren kan du ange en emptry-sträng (eller nullpekare) som kvalificerare för att indikera att kandidaten är "neutral" och kan matcha alla kontexter. Namnet på appen som visas på Start-menyn kan till exempel vara en neutral kandidat eftersom appnamn vanligtvis inte är lokaliserade (och de är inte beroende av andra saker som Skala eller Kontrast). Neutrala kandidater kan användas utöver specifika kandidater, om så önskas.

Till exempel:

// 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"); 

Standardkval

När du skapar en konfigurationsfil (via en av MrmCreateConfig... funktioner) eller skapar en resursindexerare (via en av MrmCreateResourceIndexer... funktioner) är defaultQualifiers kvalificerare (till exempel språk) som anger vilka resurskandidater som ska användas om inga bättre matchningar kan hittas. Om en app till exempel har resurser på engelska och franska, men den körs på systemet med språket inställt på japanska, används det språk som anges som "standardkvalificerare" när PRI-filen skapades. Standardkvalificerarna avgör också vilket språk och vilken skala som ska användas för att skapa pri-huvudfilen när du använder AutoSplit-paketering (se MrmPackagingMode för mer information).

Observera att alla resurser bör ha en kandidat angiven med standardkvalificerarna (eller en neutral kandidat), annars skulle det inte finnas något att falla tillbaka till om det inte fanns någon bästa matchning. Observera att det inte går att ange en reservkandidat inte anses vara ett fel (indexeraren genererar en tom strängkandidat åt dig) men det kan leda till en dålig användarupplevelse eller programbuggar.