Sdílet prostřednictvím


Zabalení a nasazení prostředků v aplikacích .NET

Aplikace spoléhají na Správce prostředků rozhraní .NET Framework reprezentované ResourceManager třídou k načtení lokalizovaných prostředků. Resource Manager předpokládá, že se k balení a nasazení prostředků používá centrální model s propojením jednotlivých uzlů. Centrum je hlavní sestavení, které obsahuje nelokalizovatelný spustitelný kód a prostředky pro jednu jazykovou verzi, označované jako neutrální nebo výchozí jazyková verze. Výchozí jazyková verze je záložní jazyková verze aplikace; je to jazyková verze, jejíž prostředky se používají, pokud lokalizované prostředky nelze najít. Každý paprsek se připojuje k satelitní sestavě, která obsahuje prostředky pro jednu geografickou kulturu, ale neobsahuje žádný kód.

Tento model má několik výhod:

  • Po nasazení aplikace můžete postupně přidávat prostředky pro nové kulturní aspekty. Vzhledem k tomu, že následný vývoj prostředků specifických pro jazykovou verzi může vyžadovat značné množství času, můžete nejprve vydat hlavní aplikaci a dodávat prostředky specifické pro jazykovou verzi později.
  • Můžete aktualizovat a změnit satelitní sestavení aplikace bez opětovného zkompilování aplikace.
  • Aplikace musí načíst pouze satelitní sestavení, která obsahují prostředky potřebné pro konkrétní kulturní zastoupení. To může výrazně snížit využití systémových prostředků.

Tento model má ale také nevýhody:

  • Musíte spravovat více sad prostředků.
  • Počáteční náklady na testování aplikace se zvyšují, protože je nutné otestovat několik konfigurací. Mějte na paměti, že v dlouhodobém horizontu bude jednodušší a levnější testovat jednu základní aplikaci s několika satelity, než testovat a udržovat několik paralelních mezinárodních verzí.

Zásady vytváření názvů prostředků

Když zabalíte prostředky aplikace, musíte je pojmenovat pomocí konvencí pojmenování prostředků, které modul CLR (Common Language Runtime) očekává. Modul runtime identifikuje prostředek podle názvu kultury. Každé kultuře je dán jedinečný název, což je obvykle kombinace dvoupísmenného názvu kultury, který je spojen s jazykem, a pokud je to potřeba, dvoupísmenného názvu subkultury spojeného se zemí nebo oblastí. Název subkultury následuje po názvu kultury, odděleném pomlčkou (-). Mezi příklady patří ja-JP pro japonštinu, jak se mluví v Japonsku, en-US pro angličtinu, jak se mluví ve Spojených státech, de-DE pro němčinu, jak mluví v Německu, nebo de-AT pro němčinu, jak mluví v Rakousku. Podívejte se na sloupec Značka jazyka v seznamu názvů jazyků a oblastí podporovaných systémem Windows. Názvy kulturních verzí se řídí standardem definovaným BCP 47.

Poznámka:

Některé výjimky existují pro dvoupísmenné názvy kultur, například zh-Hans pro čínštinu (zjednodušená).

Další informace si přečtěte v Vytvoření souborů prostředků a Vytvoření satelitních sestavení.

Záložní proces prostředku

Model hub-and-spoke pro balení a nasazení (distribuci) prostředků používá záložní proces k vyhledání vhodných prostředků. Pokud aplikace požaduje lokalizovaný prostředek, který není k dispozici, modul CLR (Common Language Runtime) vyhledá v hierarchii jazykových verzí odpovídající záložní prostředek, který nejvíce odpovídá požadavku aplikace uživatele, a vyvolá výjimku pouze jako poslední možnost. Pokud se najde vhodný prostředek, modul runtime ho použije na každé úrovni hierarchie. Pokud není zdroj nalezen, hledání pokračuje na další úrovni.

Pokud chcete zlepšit výkon vyhledávání, použijte NeutralResourcesLanguageAttribute atribut na hlavní sestavení a předejte ho název neutrálního jazyka, který bude fungovat s hlavním sestavením.

Proces záložního využití zdrojů rozhraní .NET Framework

Proces náhradního prostředku rozhraní .NET Framework zahrnuje následující kroky:

Návod

Je možné, že budete moct použít <element konfigurace relativeBindForResources> k optimalizaci procesu záložních prostředků a procesu zjišťování sestavení prostředků, který modul runtime používá. Další informace naleznete v tématu Optimalizace procesu přepadu prostředků.

  1. Runtime nejprve zkontroluje globální mezipaměť sestavení pro sestavení, které odpovídá požadovanému kulturnímu nastavení vaší aplikace.

    Mezipaměť globálních sestavení může ukládat sestavy prostředků sdílené mnoha aplikacemi. To vás osvobozuje od nutnosti zahrnovat konkrétní sady prostředků do adresářové struktury každé aplikace, kterou vytvoříte. Pokud modul runtime najde odkaz na sestavení, vyhledá v sestavení požadovaný prostředek. Pokud najde položku v sestavení, použije požadovaný prostředek. Pokud položku nenajde, bude pokračovat v hledání.

  2. Modul runtime dále zkontroluje adresář aktuálně spuštěného sestavení pro podadresář, který odpovídá požadované jazykové verzi. Pokud najde podadresář, hledá v něm platné satelitní sestavení pro požadovanou jazykovou verzi nebo kulturní prostředí. Modul runtime pak prohledá satelitní sestavení požadovaného prostředku. Pokud prostředek najde v sestavení, použije ho. Pokud nenajde prostředek, pokračuje ve vyhledávání.

  3. Modul runtime dále dotazuje Instalační službu systému Windows, aby určila, zda je satelitní sestavení nainstalováno na vyžádání. Pokud ano, postará se o instalaci, načte sestavení a vyhledá jeho nebo požadovaný prostředek. Pokud prostředek najde v sestavení, použije ho. Pokud nenajde prostředek, pokračuje ve vyhledávání.

  4. Modul runtime vyvolá událost AppDomain.AssemblyResolve, která oznamuje, že nemůže najít satelitní sestavení. Pokud se rozhodnete zpracovat událost, může obslužná rutina události vrátit odkaz na satelitní sestavení, jehož prostředky budou použity pro vyhledávání. V opačném případě se obslužná rutina události vrátí null a hledání pokračuje.

  5. Modul runtime příště znovu prohledá globální mezipaměť sestavení, tentokrát pro nadřazené sestavení požadované jazykové verze. Pokud nadřazené sestavení existuje v globální mezipaměti sestavení, modul runtime prohledá sestavení požadovaného prostředku.

    Nadřazená kultura je definována jako vhodná záložní možnost. Zvažte rodiče jako náhradní kandidáty, protože poskytnutí jakéhokoli prostředku je lepší než vyvolání výjimky. Tento proces také umožňuje opakovaně používat prostředky. Konkrétní prostředek byste měli zahrnout na nadřazené úrovni pouze v případě, že podřízená jazyková verze nepotřebuje lokalizovat požadovaný prostředek. Pokud například dodáte satelitní sestavení pro en (neutrální angličtinu), en-GB (angličtinu, jak se mluví ve Spojeném království) a en-US (angličtinu, jak se mluví ve Spojených státech), satelit en by obsahoval společnou terminologii, a satelity en-GB a en-US by mohly poskytovat úpravy pouze pro ty výrazy, které se liší.

  6. Modul runtime dále zkontroluje adresář aktuálně spuštěného sestavení a zjistí, jestli obsahuje nadřazený adresář. Pokud existuje nadřazený adresář, modul runtime vyhledá v adresáři platné satelitní sestavení pro nadřazenou kulturu. Pokud najde sestavení, modul runtime v sestavení vyhledá požadovaný prostředek. Pokud prostředek najde, použije ho. Pokud nenajde prostředek, pokračuje ve vyhledávání.

  7. Modul runtime dále dotazuje Instalační službu systému Windows, aby určila, zda má být nadřazené satelitní sestavení nainstalováno na vyžádání. Pokud ano, postará se o instalaci, načte sestavení a vyhledá jeho nebo požadovaný prostředek. Pokud prostředek najde v sestavení, použije ho. Pokud nenajde prostředek, pokračuje ve vyhledávání.

  8. Modul runtime vyvolá událost AppDomain.AssemblyResolve, aby oznámil, že nemůže najít vhodný záložní prostředek. Pokud se rozhodnete zpracovat událost, může obslužná rutina události vrátit odkaz na satelitní sestavení, jehož prostředky budou použity pro vyhledávání. V opačném případě se obslužná rutina události vrátí null a hledání pokračuje.

  9. Modul runtime dále prohledá nadřazená sestavení, stejně jako v předchozích třech krocích, prostřednictvím mnoha potenciálních úrovní. Každá kulturní varianta má pouze jednoho nadřazeného, který je definován vlastností CultureInfo.Parent, ale nadřazený může mít svého vlastního nadřazeného. Hledání nadřazených kultur se zastaví, když vlastnost kultury Parent vrátí CultureInfo.InvariantCulture; pro náhradní prostředky se invariantní kultura nepovažuje za nadřazenou kulturu ani za kulturu, která může obsahovat prostředky.

  10. Pokud je původně zadána konkrétní kultura a byly prohledány všechny nadřazené kultury, ale prostředek stále není nalezen, použije se prostředek pro výchozí (záložní) kulturu. Obvykle jsou prostředky pro výchozí kulturu zahrnuty do hlavního sestavení aplikace. Můžete však zadat hodnotu Satellite vlastnosti LocationNeutralResourcesLanguageAttribute atributu, která označuje, že konečným záložním umístěním pro prostředky je satelitní sestavení, nikoli hlavní sestavení.

    Poznámka:

    Výchozí prostředek je jediný prostředek, který lze zkompilovat pomocí hlavního sestavení. Pokud pomocí atributu NeutralResourcesLanguageAttribute nezadáte satelitní sestavení, je to poslední možnost (konečný předek). Proto doporučujeme, abyste do hlavního sestavení vždy zahrnuli výchozí sadu prostředků. To pomáhá zabránit vyvolání výjimek. Když zahrnete výchozí soubor prostředků, poskytnete záložní řešení pro všechny prostředky a zajistíte, aby uživatel měl vždy k dispozici alespoň jeden prostředek, i když není specifický pro danou kulturu.

  11. A konečně, pokud modul runtime nenajde prostředek pro výchozí (záložní) jazykovou verzi, se vyvolá výjimka MissingManifestResourceException nebo MissingSatelliteAssemblyException, což naznačuje, že prostředek nebyl nalezen.

Předpokládejme například, že aplikace požaduje prostředek lokalizovaný pro španělštinu (Mexiko) (kulturní es-MX verzi). Modul runtime nejprve prohledá globální mezipaměť sestavení kvůli nalezení sestavení, které odpovídá es-MX, ale nenajde ho. Modul runtime pak hledá ve složce aktuálně spuštěného sestavení adresář es-MX. Pokud se to nepodaří, modul runtime znovu vyhledá globální mezipaměť sestavení pro nadřazené sestavení, které odráží příslušnou záložní jazykovou verzi – v tomto případě es (španělština). Pokud nadřazené sestavení není nalezeno, běhové prostředí vyhledá všechny možné úrovně nadřazených sestavení pro danou kulturu, dokud nenalezne odpovídající prostředek. Pokud se prostředek nenajde, modul runtime použije prostředek pro výchozí kulturu.

Optimalizace záložního procesu prostředků rozhraní .NET Framework

Za následujících podmínek můžete optimalizovat proces, podle kterého modul runtime hledá prostředky v satelitních sestaveních:

  • Satelitní sestavení jsou nasazena ve stejném umístění jako sestavení kódu. Pokud je sestavení kódu nainstalováno v globálním úložišti sestavení, satelitní sestavení jsou také nainstalována v globálním úložišti sestavení. Pokud je sestavení kódu nainstalováno v adresáři, satelitní sestavení jsou nainstalována ve složkách specifických pro danou kulturu tohoto adresáře.

  • Satelitní sestavení nejsou nainstalovaná na vyžádání.

  • Kód aplikace nezpracuje AppDomain.AssemblyResolve událost.

Sondu pro satelitní sestavení můžete optimalizovat zahrnutím elementu <relativeBindForResources> a nastavením jeho enabled atributu v true konfiguračním souboru aplikace, jak je znázorněno v následujícím příkladu.

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

Optimalizovaná sonda pro satelitní sestavy je funkce umožňující aktivaci. To znamená, že modul runtime se řídí kroky zdokumentované v záložním procesu prostředku , pokud <není v konfiguračním souboru aplikace k dispozici relativeBindForResources> element a jeho enabled atribut je nastaven na true. V takovém případě se proces vyhledávání satelitního sestavení upraví následovně:

  • Běhové prostředí používá umístění hlavního sestavení k vyhledání satelitního sestavení. Pokud je nadřazené sestavení nainstalováno v globální mezipaměti sestavení, modul runtime kontroluje mezipaměť, ale ne adresář aplikace. Pokud je nadřazené sestavení nainstalováno v adresáři aplikace, runtime kontroluje adresář aplikace, ale ne globální mezipaměť sestavení.

  • Modul runtime se nedotazuje instalační služby Windows Installer na instalaci satelitních sestavení na vyžádání.

  • Pokud selže sonda specifického sestavení prostředků, modul runtime nevyvolá událost AppDomain.AssemblyResolve.

Proces záložního prostředku .NET Core

Proces náhradního prostředku .NET Core zahrnuje následující kroky:

  1. Modul runtime se pokusí načíst satelitní sestavení pro požadovanou jazykovou verzi kultury.

    • Zkontroluje adresář aktuálně běžícího sestavení pro podadresář, který odpovídá požadované kultuře. Pokud najde podadresář, ve vyhledá v tomto podadresáři platné satelitní sestavení pro požadovanou jazykovou verzi a načte ho.

      Poznámka:

      V operačních systémech s citlivostí na velikost písmen (jako jsou Linux a macOS) je hledání podadresářů podle názvů kultur citlivé na velikost písmen. Název podadresáře se musí přesně shodovat s písmenem CultureInfo.Name (napříklades).es-MX

      Poznámka:

      Pokud programátor odvodil vlastní kontext načítání sestavení z AssemblyLoadContext, situace se komplikuje. Pokud bylo spouštěcí sestavení načteno do vlastního kontextu, běhové prostředí načte satelitní sestavení do vlastního kontextu. Podrobnosti jsou mimo rozsah tohoto dokumentu. Viz AssemblyLoadContext.

    • Pokud nebylo nalezeno satelitní sestavení, AssemblyLoadContext vyvolá událost AssemblyLoadContext.Resolving a indikuje, že nelze najít satelitní sestavení. Pokud se rozhodnete zpracovat událost, obslužná rutina může načíst a vrátit odkaz na satelitní sestavení.

    • Pokud stále nebylo nalezeno satelitní sestavení, způsobí AssemblyLoadContext, že AppDomain vyvolá událost AppDomain.AssemblyResolve, která signalizuje, že nebylo možné najít satelitní sestavení. Pokud se rozhodnete zpracovat událost, obslužná rutina může načíst a vrátit odkaz na satelitní sestavení.

  2. Pokud se najde satelitní sestavení, modul runtime v něm vyhledá požadovaný prostředek. Pokud prostředek najde v sestavení, použije ho. Pokud nenajde prostředek, pokračuje ve vyhledávání.

    Poznámka:

    Pokud chcete najít prostředek v rámci satelitního sestavení, modul runtime vyhledá soubor prostředků požadovaný ResourceManager pro aktuální CultureInfo.Name. V souboru prostředků hledá požadovaný název prostředku. Pokud se některý z těchto prostředků nenajde, prostředek se považuje za nenalezeno.

  3. Modul runtime dále prohledá sestavení rodičovské kultury prostřednictvím různých úrovní a opakovaně opakuje kroky 1 a 2.

    Nadřazená kultura je definována jako vhodná záložní kultura. Zvažte rodiče jako náhradní kandidáty, protože poskytnutí jakéhokoli prostředku je lepší než vyvolání výjimky. Tento proces také umožňuje opakovaně používat prostředky. Konkrétní prostředek byste měli zahrnout na nadřazené úrovni pouze v případě, že podřízená jazyková verze nepotřebuje lokalizovat požadovaný prostředek. Pokud například zadáte satelitní sestavení pro en (neutrální angličtinu), en-GB (angličtinu tak, jak se mluví ve Spojeném království) a en-US (angličtina, jak se mluví ve Spojených státech), en satelit obsahuje společnou terminologii, a en-GB a en-US satelity poskytují úpravy pouze těch termínů, které se liší.

    Každá kulturní varianta má pouze jednoho nadřazeného, který je definován vlastností CultureInfo.Parent, ale nadřazený může mít svého vlastního nadřazeného. Hledání nadřazených kulturních verzí se zastaví, když vlastnost kulturní verze Parent vrátí CultureInfo.InvariantCulture. U náhradního zdroje není invariantní jazyk považován za nadřazený jazyk ani jazyk, který může mít zdroje.

  4. Pokud je původně zadána konkrétní kultura a byly prohledány všechny nadřazené kultury, ale prostředek stále není nalezen, použije se prostředek pro výchozí (záložní) kulturu. Obvykle jsou prostředky pro výchozí kulturu zahrnuty do hlavního sestavení aplikace. Můžete však zadat hodnotu Satellite vlastnosti Location , která určuje, že konečným záložním umístěním pro prostředky je satelitní sestavení místo hlavního sestavení.

    Poznámka:

    Výchozí prostředek je jediný prostředek, který lze zkompilovat pomocí hlavního sestavení. Pokud pomocí atributu NeutralResourcesLanguageAttribute nezadáte satelitní sestavení, je to poslední možnost (konečný předek). Proto doporučujeme, abyste do hlavního sestavení vždy zahrnuli výchozí sadu prostředků. To pomáhá zabránit vyvolání výjimek. Zahrnutím výchozího souboru prostředků zajistíte zálohu pro všechny prostředky a zajistíte, že bude mít uživatel vždy k dispozici alespoň jeden prostředek, i když není specifický pro kulturální prostředí.

  5. A konečně, pokud modul runtime nenajde soubor prostředků pro výchozí (záložní) jazykovou verzi, je vyvolána MissingManifestResourceException nebo MissingSatelliteAssemblyException výjimka, která oznamuje, že prostředek nebyl nalezen. Pokud je nalezen soubor prostředku, ale požadovaný prostředek není k dispozici, vrátí požadavek null.

Nejzazší záložní na satelitní sestavu

Volitelně můžete odebrat prostředky z hlavního sestavení a určit, že modul runtime by měl načíst konečné prostředky ze satelitního sestavení odpovídajícího konkrétní kultuře. Chcete-li řídit záložní proces, použijte NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) konstruktor a zadejte hodnotu parametru UltimateResourceFallbackLocation , který určuje, zda Resource Manager má extrahovat záložní prostředky z hlavního sestavení nebo ze satelitního sestavení.

Následující příklad rozhraní .NET Framework používá NeutralResourcesLanguageAttribute atribut k uložení záložních prostředků aplikace do satelitního sestavení pro francouzštinu (fr). Příklad obsahuje dva textové soubory zdrojů, které definují jeden řetězcový prostředek s názvem Greeting. První resources.fr.txtobsahuje francouzský jazykový zdroj.

Greeting=Bon jour!

Druhý zdroj, s názvem "prostředkyru.txt", obsahuje zdroj v ruském jazyce.

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

Tyto dva soubory se kompilují do souborů .resources spuštěním Resource File Generatoru (resgen.exe) z příkazového řádku. Pro francouzský jazykový zdroj je příkaz:

resgen.exe resources.fr.txt

Pro prostředek ruského jazyka je příkaz následující:

resgen.exe resources.ru.txt

Soubory .resources jsou vloženy do dynamických knihoven spuštěním Assembly Linker (al.exe) z příkazového řádku pro francouzský jazykový prostředek následujícím způsobem:

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

a pro zdroj pro ruský jazyk následujícím způsobem:

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

Zdrojový kód aplikace se nachází v souboru s názvem Example1.cs nebo Example1.vb. Obsahuje atribut, NeutralResourcesLanguageAttribute který označuje, že výchozí prostředek aplikace je v podadresáři fr. Vytvoří instanci Resource Manageru, načte hodnotu Greeting prostředku a zobrazí ji v konzole.

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

Zdrojový kód jazyka C# pak můžete zkompilovat z příkazového řádku následujícím způsobem:

csc Example1.cs

Příkaz kompilátoru jazyka Visual Basic je velmi podobný:

vbc Example1.vb

Vzhledem k tomu, že v hlavním sestavení nejsou vloženy žádné zdroje, není nutné kompilovat pomocí přepínače /resource.

Když spustíte příklad ze systému, jehož jazyk je cokoli jiného než ruština, zobrazí následující výstup:

Bon jour!

Navrhovaná alternativní balení

Časová nebo rozpočtová omezení vám můžou bránit v vytváření sady prostředků pro každou subkultuře, kterou vaše aplikace podporuje. Místo toho můžete vytvořit jedno satelitní sestavení pro nadřazenou jazykovou verzi, které mohou používat všechny související podřízené jazykové verze. Můžete například zadat jedno anglické satelitní sestavení (en), které načte uživatelé, kteří požadují anglické prostředky specifické pro jednotlivé oblasti, a jedno německé satelitní sestavení (de) pro uživatele, kteří požadují německé prostředky specifické pro jednotlivé oblasti. Například žádosti o němčinu, jak se mluví v Německu (de-DE), Rakousku (de-AT) a Švýcarsku (de-CH), by se měly vrátit k německému satelitnímu modulu (de). Výchozí prostředky jsou posledním náhradním prostředkům, a proto by měly být prostředky, které budou vyžadovat většina uživatelů vaší aplikace, proto tyto prostředky pečlivě vyberte. Tento přístup nasazuje prostředky, které jsou méně specifické kulturně, ale může výrazně snížit náklady na lokalizaci vaší aplikace.

Viz také