Megosztás a következőn keresztül:


Erőforrások csomagolása és üzembe helyezése .NET-alkalmazásokban

Az alkalmazások az osztály által képviselt .NET-keretrendszer Resource Managerre támaszkodnak a ResourceManager honosított erőforrások lekéréséhez. A Resource Manager feltételezi, hogy egy küllős és egy központos modell használható az erőforrások csomagolására és üzembe helyezésére. A központ a fő szerelvény, amely tartalmazza a nem lokálható végrehajtható kódot és az egyetlen kultúrához tartozó erőforrásokat, az úgynevezett semleges vagy alapértelmezett kultúrát. Az alapértelmezett kultúra az alkalmazás tartalék kultúrája; ez az a kultúra, amelynek erőforrásait akkor használja a rendszer, ha a honosított erőforrások nem találhatók. Minden küllő egy olyan műholdas szerelvényhez csatlakozik, amely egyetlen kultúra erőforrásait tartalmazza, de nem tartalmaz kódot.

Ennek a modellnek számos előnye van:

  • Az alkalmazás üzembe helyezése után növekményesen adhat hozzá erőforrásokat az új kultúrákhoz. Mivel a kultúraspecifikus erőforrások későbbi fejlesztése jelentős időt igényelhet, ez lehetővé teszi a fő alkalmazás kiadását, és később a kultúraspecifikus erőforrásokat.
  • Az alkalmazás műholdszerelvényeit az alkalmazás újrafordítása nélkül frissítheti és módosíthatja.
  • Egy alkalmazásnak csak azokat a műholdas szerelvényeket kell betöltenie, amelyek tartalmazzák az adott kultúrához szükséges erőforrásokat. Ez jelentősen csökkentheti a rendszererőforrások használatát.

Ennek a modellnek azonban hátrányai is vannak:

  • Több erőforráskészletet kell kezelnie.
  • Az alkalmazások tesztelésének kezdeti költsége nő, mivel több konfigurációt kell tesztelnie. Vegye figyelembe, hogy hosszú távon egyszerűbb és olcsóbb lesz egy magalkalmazás tesztelése több műholdon, mint több párhuzamos nemzetközi verzió tesztelése és karbantartása.

Erőforrás-elnevezési konvenciók

Amikor az alkalmazás erőforrásait csomagolja, el kell neveznie őket a közös nyelvi futtatókörnyezet által elvárt erőforrás-elnevezési konvenciók használatával. A futtatókörnyezet az erőforrást a kulturális környezet neve alapján azonosítja. Minden kultúra egyedi nevet kap, amely általában egy nyelvhez társított kétbetűs kisbetűs kulturális név és szükség esetén egy országhoz vagy régióhoz társított kétbetűs, nagybetűs szubkultúranév kombinációja. A szubkultúra neve a kultúra nevét követi, kötőjellel (-) elválasztva. Ilyen például a Japánban beszélt ja-JP, a Egyesült Államok-ban beszélt angolhoz az EN-US, a németországi némethez de-DE, ausztriában beszélt némethez pedig de-AT. A Windows által támogatott nyelv/régiónevek listájában tekintse meg a Nyelvi címke oszlopot. A kulturális nevek a BCP 47 által meghatározott szabványt követik.

Feljegyzés

Vannak kivételek a kétbetűs kulturális nevek, például zh-Hans a kínai (egyszerűsített) esetében.

További információ: Erőforrásfájlok létrehozása és műholdas szerelvények létrehozása.

Az erőforrás-tartalék folyamat

Az erőforrások csomagolására és üzembe helyezésére szolgáló küllős modell tartalék eljárással keresi meg a megfelelő erőforrásokat. Ha egy alkalmazás olyan honosított erőforrást kér, amely nem érhető el, a közös nyelvi futtatókörnyezet a kultúrák hierarchiájában keres egy megfelelő tartalék erőforrást, amely a leginkább megfelel a felhasználó alkalmazásának kérésének, és kivételt csak végső megoldásként jelez. A hierarchia minden szintjén, ha talál egy megfelelő erőforrást, a futtatókörnyezet használja azt. Ha az erőforrás nem található, a keresés a következő szinten folytatódik.

A keresési teljesítmény javítása érdekében alkalmazza az attribútumot a NeutralResourcesLanguageAttribute főszerelvényre, és adja meg annak a semleges nyelvnek a nevét, amely a főszerelvényen fog működni.

.NET-keretrendszer erőforrás-tartalék folyamat

Az .NET-keretrendszer erőforrás-visszavételi folyamat a következő lépéseket foglalja magában:

Tipp.

Előfordulhat, hogy a <relativeBindForResources konfigurációs> elem használatával optimalizálhatja az erőforrás-tartalék folyamatot és azt a folyamatot, amellyel a futtatókörnyezet mintavételezi az erőforrás-szerelvényeket. További információ: Az erőforrás-visszavételi folyamat optimalizálása.

  1. A futtatókörnyezet először ellenőrzi a globális szerelvény gyorsítótárát egy olyan szerelvénynél, amely megfelel az alkalmazás kért kultúrájának.

    A globális szerelvénygyorsítótár számos alkalmazás által megosztott erőforrás-szerelvényeket tárolhat. Ez megszabadítja attól, hogy minden létrehozott alkalmazás címtárstruktúrájában bizonyos erőforráskészleteket kell tartalmaznia. Ha a futtatókörnyezet a szerelvényre mutató hivatkozást talál, megkeresi a szerelvényben a kért erőforrást. Ha megtalálja a bejegyzést a szerelvényben, a kért erőforrást használja. Ha nem találja a bejegyzést, folytatja a keresést.

  2. A futtatókörnyezet ezután ellenőrzi a jelenleg végrehajtó szerelvény könyvtárát egy olyan alkönyvtárban, amely megfelel a kért kultúrának. Ha megtalálja az alkönyvtárat, az adott alkönyvtárban keres egy érvényes műholdas szerelvényt a kért kultúrához. A futtatókörnyezet ezután megkeresi a kért erőforrást a műholdas szerelvényben. Ha megtalálja az erőforrást a szerelvényben, azt használja. Ha nem találja az erőforrást, folytatja a keresést.

  3. A következő futtatókörnyezet lekérdezi a Windows Installert annak megállapításához, hogy a műholdas szerelvényt igény szerint kell-e telepíteni. Ha igen, kezeli a telepítést, betölti a szerelvényt, és megkeresi azt vagy a kért erőforrást. Ha megtalálja az erőforrást a szerelvényben, azt használja. Ha nem találja az erőforrást, folytatja a keresést.

  4. A futtatókörnyezet jelzi az AppDomain.AssemblyResolve eseményt, hogy nem találja a műholdas szerelvényt. Ha úgy dönt, hogy kezeli az eseményt, az eseménykezelő hivatkozhat arra a műholdas szerelvényre, amelynek erőforrásai a kereséshez lesznek felhasználva. Ellenkező esetben az eseménykezelő visszatér null , és a keresés folytatódik.

  5. A futtatókörnyezet következő lépése ismét a globális szerelvény gyorsítótárában keres, ezúttal a kért kultúra szülőszerelvényére. Ha a szülőszerelvény megtalálható a globális szerelvény-gyorsítótárban, a futtatókörnyezet megkeresi a szerelvényt a kért erőforráshoz.

    A szülőkultúra a megfelelő tartalék kultúra. Tekintsük a szülőket tartalékjelöltnek, mert ha bármilyen erőforrást megadunk, akkor érdemes kivételt tenni. Ez a folyamat lehetővé teszi az erőforrások újrafelhasználását is. Egy adott erőforrást csak akkor szabad a szülőszinten megadni, ha a gyermekkultúrának nem kell honosítania a kért erőforrást. Ha például a (semleges angol), (az Egyesült Királyságban beszélt angol) en-GB és (az Egyesült Államok angol nyelvű) műholdas szerelvényeket en adna meg, a en műhold a közös terminológiát tartalmazza, és en-US a en-GB műholdak csak az eltérő kifejezések felülbírálását biztosítanák en-US .

  6. A futtatókörnyezet ezután ellenőrzi az aktuálisan végrehajtó szerelvény könyvtárát, és ellenőrzi, hogy tartalmaz-e szülőkönyvtárat. Ha létezik szülőkönyvtár, a futtatókörnyezet egy érvényes műholdas szerelvényt keres a könyvtárban a szülőkultúra számára. Ha megtalálja a szerelvényt, a futtatókörnyezet megkeresi a szerelvényt a kért erőforrásra. Ha megtalálja az erőforrást, azt használja. Ha nem találja az erőforrást, folytatja a keresést.

  7. A következő futtatókörnyezet lekérdezi a Windows Installert annak megállapításához, hogy a szülő műholdas szerelvényt igény szerint kell-e telepíteni. Ha igen, kezeli a telepítést, betölti a szerelvényt, és megkeresi azt vagy a kért erőforrást. Ha megtalálja az erőforrást a szerelvényben, azt használja. Ha nem találja az erőforrást, folytatja a keresést.

  8. A futtatókörnyezet az eseményt úgy emeli AppDomain.AssemblyResolve ki, hogy nem talál megfelelő tartalék erőforrást. Ha úgy dönt, hogy kezeli az eseményt, az eseménykezelő hivatkozhat arra a műholdas szerelvényre, amelynek erőforrásai a kereséshez lesznek felhasználva. Ellenkező esetben az eseménykezelő visszatér null , és a keresés folytatódik.

  9. A futtatókörnyezet következő lépése a szülőszerelvényekben keres, ahogy az előző három lépésben is, számos lehetséges szinten. Minden kultúrának csak egy szülője van, amelyet a CultureInfo.Parent tulajdonság határoz meg, de egy szülőnek lehet saját szülője. A szülőkultúrák keresése leáll, amikor egy kultúra tulajdonsága Parent visszatér; az erőforrás-visszavétel esetében az invariáns CultureInfo.InvariantCulturekultúra nem tekinthető szülőkultúrának vagy olyan kultúrának, amely rendelkezhet erőforrásokkal.

  10. Ha az eredetileg megadott kultúra és az összes szülő keresése megtörtént, és az erőforrás továbbra sem található, a rendszer az alapértelmezett (tartalék) kultúra erőforrását használja. Az alapértelmezett kultúra erőforrásai általában a fő alkalmazásszerelvény részét képezik. Megadhatja azonban az Location attribútum tulajdonságának SatelliteNeutralResourcesLanguageAttribute értékét, amely azt jelzi, hogy az erőforrások végső tartalék helye nem a főszerelvény, hanem egy műholdas szerelvény.

    Feljegyzés

    Az alapértelmezett erőforrás az egyetlen olyan erőforrás, amely a főszerelvénysel fordítható le. Ha nem ad meg egy műholdas szerelvényt az NeutralResourcesLanguageAttribute attribútum használatával, az a végső tartalék (végső szülő). Ezért azt javasoljuk, hogy mindig adjon meg egy alapértelmezett erőforráskészletet a főszerelvényben. Ez segít megakadályozni, hogy kivételeket dobjon ki. Az alapértelmezett erőforrás beleszámításával a fájl minden erőforráshoz tartalékot biztosít, és biztosítja, hogy legalább egy erőforrás mindig jelen legyen a felhasználó számára, még akkor is, ha az nem kulturálisan specifikus.

  11. Végül, ha a futtatókörnyezet nem talál erőforrást egy alapértelmezett (tartalék) kultúrához, a rendszer kivételt MissingManifestResourceException vagy MissingSatelliteAssemblyException kivételt jelez, amely azt jelzi, hogy az erőforrás nem található.

Tegyük fel például, hogy az alkalmazás spanyol (Mexikó) (a kultúra) számára honosított erőforrást es-MX kér. A futtatókörnyezet először megkeresi a globális szerelvény gyorsítótárát az egyező es-MXszerelvényben, de nem találja. A futtatókörnyezet ezután megkeresi a jelenleg végrehajtó szerelvény könyvtárát egy es-MX címtárban. Ennek hiányában a futtatókörnyezet újra megkeresi a globális szerelvény gyorsítótárát egy szülőszerelvényben, amely a megfelelő tartalék kultúrát tükrözi – ebben az esetben es (spanyol). Ha a szülőszerelvény nem található, a futtatókörnyezet a szülőszerelvények összes lehetséges szintjét megkeresi a es-MX kultúrában, amíg meg nem talál egy megfelelő erőforrást. Ha nem található erőforrás, a futtatókörnyezet az alapértelmezett kultúrához használja az erőforrást.

Az .NET-keretrendszer erőforrás-tartalékfolyamat optimalizálása

A következő feltételek mellett optimalizálhatja azt a folyamatot, amellyel a futtatókörnyezet erőforrásokat keres a műholdas szerelvényekben:

  • A műholdas szerelvények a kódszerelvényével azonos helyen vannak üzembe helyezve. Ha a kódszerelvény telepítve van a globális szerelvénygyorsítótárban, a műholdas szerelvények is telepítve vannak a globális szerelvény-gyorsítótárban. Ha a kódszerelvény egy könyvtárban van telepítve, a műholdas szerelvények a könyvtár kultúraspecifikus mappáiba lesznek telepítve.

  • A műholdas szerelvények nincsenek igény szerint telepítve.

  • Az alkalmazáskód nem kezeli az eseményt AppDomain.AssemblyResolve .

A mintavételt úgy optimalizálhatja a műholdas szerelvényekhez, hogy a relatívBindForResources elemet felvesz<>, és az attribútumot az alkalmazáskonfigurációs fájlba állítjaenabled, ahogyan az az alábbi példában látható.true

<configuration>
   <runtime>
      <relativeBindForResources enabled="true" />
   </runtime>
</configuration>

A műholdas szerelvényekhez optimalizált mintavétel egy opt-in funkció. Ez azt jelzi, hogy a futtatókörnyezet az erőforrás-tartalékfolyamatban dokumentált lépéseket követi, kivéve, ha a <relativeBindForResources> elem szerepel az alkalmazás konfigurációs fájljában, és az attribútuma enabled a következőre truevan állítva. Ebben az esetben a műholdas szerelvény próbafolyamata a következőképpen módosul:

  • A futtatókörnyezet a szülőkód-szerelvény helyét használja a műholdas szerelvény mintavételéhez. Ha a szülőszerelvény telepítve van a globális szerelvény-gyorsítótárban, a futtatókörnyezet a gyorsítótárban mintavételez, de nem az alkalmazás könyvtárában. Ha a szülőszerelvény egy alkalmazáskönyvtárban van telepítve, a futtatókörnyezet az alkalmazáskönyvtárban mintavételez, de nem a globális szerelvény-gyorsítótárban.

  • A futtatókörnyezet nem kérdezi le a Windows Installert a műholdas szerelvények igény szerinti telepítésére.

  • Ha egy adott erőforrás-szerelvény mintavétele sikertelen, a futtatókörnyezet nem indítja el az eseményt AppDomain.AssemblyResolve .

.NET Core-erőforrás-tartalék folyamat

A .NET Core-erőforrás-visszavételi folyamat a következő lépéseket foglalja magában:

  1. A futtatókörnyezet megpróbál betölteni egy műholdas szerelvényt a kért kultúrához.

    • Ellenőrzi a jelenleg végrehajtó szerelvény könyvtárát egy olyan alkönyvtárban, amely megfelel a kért kultúrának. Ha megtalálja az alkönyvtárat, az adott alkönyvtárban keres egy érvényes műholdas szerelvényt a kért kultúrához, és betölti azt.

      Feljegyzés

      A kis- és nagybetűkre érzékeny fájlrendszerekkel (linuxos és macOS) rendelkező operációs rendszereken a kulturális név alkönyvtárának keresése megkülönbözteti a kis- és nagybetűk megkülönbözteti a fájlokat. Az alkönyvtár nevének pontosan meg kell egyeznie a CultureInfo.Name (például vagyes-MX) esetével. es

      Feljegyzés

      Ha a programozó egyéni szerelvénybetöltési környezetet AssemblyLoadContexthozott létre, a helyzet bonyolult. Ha a végrehajtó szerelvény be lett töltve az egyéni környezetbe, a futtatókörnyezet betölti a műholdas szerelvényt az egyéni környezetbe. A részletek nem tartoznak a dokumentum hatókörébe. Lásd: AssemblyLoadContext.

    • Ha nem található műholdszerelvény, az AssemblyLoadContext esemény azt AssemblyLoadContext.Resolving jelzi, hogy nem találja a műholdas szerelvényt. Ha úgy dönt, hogy kezeli az eseményt, az eseménykezelő betöltheti és visszaküldheti a műholdas szerelvényre mutató hivatkozást.

    • Ha továbbra sem található műholdas szerelvény, a AssemblyLoadContext hatására az AppDomain eseményt vált ki AppDomain.AssemblyResolve , amely azt jelzi, hogy nem találja a műholdas szerelvényt. Ha úgy dönt, hogy kezeli az eseményt, az eseménykezelő betöltheti és visszaküldheti a műholdas szerelvényre mutató hivatkozást.

  2. Ha műholdas szerelvényt talál, a futtatókörnyezet megkeresi a kért erőforrást. Ha megtalálja az erőforrást a szerelvényben, azt használja. Ha nem találja az erőforrást, folytatja a keresést.

    Feljegyzés

    Ha erőforrást szeretne keresni a műholdas szerelvényen belül, a futtatókörnyezet megkeresi az aktuálishoz CultureInfo.Namekért ResourceManager erőforrásfájlt. Az erőforrásfájlban megkeresi a kért erőforrásnevet. Ha egyik sem található, az erőforrás nem találhatóként lesz kezelve.

  3. A futtatókörnyezet következő lépése a szülőkultúra több lehetséges szinten is végigfut, és minden alkalommal megismételi az 1. és a 2. lépést.

    A szülőkultúra megfelelő tartalék kultúraként van definiálva. Tekintsük a szülőket tartalékjelöltnek, mert ha bármilyen erőforrást megadunk, akkor érdemes kivételt tenni. Ez a folyamat lehetővé teszi az erőforrások újrafelhasználását is. Egy adott erőforrást csak akkor szabad a szülőszinten megadni, ha a gyermekkultúrának nem kell honosítania a kért erőforrást. Ha például a (semleges angol), (az Egyesült Királyságban beszélt angol) en-GB és (az Egyesült Államok beszélt angol nyelvű) műholdas szerelvényeket en ad meg, a en műhold tartalmazza a közös terminológiát, és en-US a en-GB műholdak csak azokat a kifejezéseket felülbírálják, amelyek eltérnek en-US .

    Minden kultúrának csak egy szülője van, amelyet a CultureInfo.Parent tulajdonság határoz meg, de egy szülőnek lehet saját szülője. A szülőkultúrák keresése leáll, amikor egy kultúra tulajdonsága Parent visszatér CultureInfo.InvariantCulture. Erőforrás-tartalék esetén az invariáns kultúra nem tekinthető szülőkultúrának vagy olyan kultúrának, amely rendelkezhet erőforrásokkal.

  4. Ha az eredetileg megadott kultúra és az összes szülő keresése megtörtént, és az erőforrás továbbra sem található, a rendszer az alapértelmezett (tartalék) kultúra erőforrását használja. Az alapértelmezett kultúra erőforrásai általában a fő alkalmazásszerelvény részét képezik. Megadhatja azonban a Location tulajdonság értékétSatellite, amely azt jelzi, hogy az erőforrások végső tartalék helye nem a főszerelvény, hanem egy műholdas szerelvény.

    Feljegyzés

    Az alapértelmezett erőforrás az egyetlen olyan erőforrás, amely a főszerelvénysel fordítható le. Ha nem ad meg egy műholdas szerelvényt az NeutralResourcesLanguageAttribute attribútum használatával, az a végső tartalék (végső szülő). Ezért azt javasoljuk, hogy mindig adjon meg egy alapértelmezett erőforráskészletet a főszerelvényben. Ez segít megakadályozni, hogy kivételeket dobjon ki. Az alapértelmezett erőforrásfájlokkal tartalékot biztosít az összes erőforráshoz, és gondoskodik arról, hogy legalább egy erőforrás mindig jelen legyen a felhasználó számára, még akkor is, ha az nem kulturálisan specifikus.

  5. Végül, ha a futtatókörnyezet nem talál erőforrásfájlt egy alapértelmezett (tartalék) kultúrához, a rendszer kivételt MissingManifestResourceException vagy MissingSatelliteAssemblyException kivételt jelez, amely azt jelzi, hogy az erőforrás nem található. Ha az erőforrásfájl megtalálható, de a kért erőforrás nem jelenik meg, a kérés visszaadja null.

Végső tartalék a műholdas szerelvényre

Igény szerint eltávolíthat erőforrásokat a főszerelvényből, és megadhatja, hogy a futtatókörnyezet betöltse a végső tartalék erőforrásokat egy adott kultúrának megfelelő műholdas szerelvényből. A tartalék folyamat szabályozásához használja a NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) konstruktort, és adjon meg egy értéket a UltimateResourceFallbackLocation paraméterhez, amely meghatározza, hogy a Resource Managernek ki kell-e nyernie a tartalék erőforrásokat a fő szerelvényből vagy egy műholdas szerelvényből.

Az alábbi .NET-keretrendszer példa az NeutralResourcesLanguageAttribute attribútum használatával tárolja az alkalmazás tartalék erőforrásait egy francia (fr) nyelvű műholdas szerelvényben. A példában két szöveges erőforrásfájl található, amelyek egyetlen sztring típusú erőforrást határoznak meg Greeting. Az első, resources.fr.txt egy francia nyelvű erőforrást tartalmaz.

Greeting=Bon jour!

A második, ru.txt nevű erőforrás egy orosz nyelvű erőforrást tartalmaz.

Greeting=Добрый день

Ez a két fájl .resources fájlokba lesz lefordítva a resource file generator (resgen.exe) parancssorból való futtatásával. A francia nyelvi erőforrás esetében a parancs a következő:

resgen.exe resources.fr.txt

Az orosz nyelvi erőforrás esetében a parancs a következő:

resgen.exe resources.ru.txt

A .resources-fájlok dinamikus csatolási kódtárakba vannak beágyazva, ha az Assembly Linker (al.exe) parancsot futtatják a francia nyelvű erőforrás parancssorából az alábbiak szerint:

al /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dll

és az orosz nyelvi erőforrás esetében az alábbiak szerint:

al /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dll

Az alkalmazás forráskódja egy Example1.cs vagy Example1.vb nevű fájlban található. Tartalmazza az NeutralResourcesLanguageAttribute attribútumot, amely jelzi, hogy az alapértelmezett alkalmazáserőforrás az fr alkönyvtárban van. Példányosítja a Resource Managert, lekéri az Greeting erőforrás értékét, és megjeleníti azt a konzolon.

using System;
using System.Reflection;
using System.Resources;

[assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)]

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("resources",
                                               typeof(Example).Assembly);
      string greeting = rm.GetString("Greeting");
      Console.WriteLine(greeting);
   }
}
Imports System.Reflection
Imports System.Resources

<Assembly: NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)>
Module Example
    Public Sub Main()
        Dim rm As New ResourceManager("resources", GetType(Example).Assembly)
        Dim greeting As String = rm.GetString("Greeting")
        Console.WriteLine(greeting)
    End Sub
End Module

Ezután a következő módon fordíthatja le a C#-forráskódot a parancssorból:

csc Example1.cs

A Visual Basic fordító parancsa nagyon hasonló:

vbc Example1.vb

Mivel nincsenek beágyazva erőforrások a főszerelvénybe, a kapcsolóval nem kell fordítást /resource végeznie.

Amikor egy olyan rendszerből futtatja a példát, amelynek a nyelve nem orosz, a következő kimenetet jeleníti meg:

Bon jour!

Javasolt csomagolási alternatíva

Az idő- vagy költségvetési korlátozások megakadályozhatják, hogy erőforrásokat hozzon létre minden olyan szubkultúrához, amelyet az alkalmazás támogat. Ehelyett létrehozhat egyetlen műholdas szerelvényt egy szülőkultúrához, amelyet az összes kapcsolódó szubkultúrák használhatnak. Megadhat például egy angol műholdas szerelvényt (en), amelyet a régióspecifikus angol erőforrásokat kérő felhasználók kérnek le, és egyetlen német műholdas szerelvényt (de) azoknak a felhasználóknak, akik régióspecifikus német erőforrásokat kérnek le. A németországi (de-DE), ausztriai (de-AT) és svájci (de-CH) német nyelvű kérelmek például vissza fognak esni a német műholdszerelvényhez (de). Az alapértelmezett erőforrások a végső tartalékok, ezért az alkalmazás felhasználóinak többsége által igényelt erőforrásoknak kell lenniük, ezért gondosan válassza ki ezeket az erőforrásokat. Ez a megközelítés kevésbé kulturálisan specifikus erőforrásokat helyez üzembe, de jelentősen csökkentheti az alkalmazás honosítási költségeit.

Lásd még