Pakowanie i wdrażanie zasobów w aplikacjach platformy .NET

Aplikacje korzystają z usługi Resource Manager programu .NET Framework reprezentowanej przez klasę ResourceManager w celu pobrania zlokalizowanych zasobów. Usługa Resource Manager zakłada, że model piasty i szprych jest używany do tworzenia pakietów i wdrażania zasobów. Piasta jest głównym zestawem zawierającym nielokalizowalny kod wykonywalny i zasoby dla pojedynczej kultury nazywanej kulturą neutralną lub domyślną. Kultura domyślna to kultura rezerwowa dla aplikacji; jest to kultura, której zasoby są używane, jeśli nie można odnaleźć zlokalizowanych zasobów. Każda szprycha łączy się z zestawem satelitarnym zawierającym zasoby dla jednej kultury, ale nie zawiera żadnego kodu.

Ten model ma kilka zalet:

  • Zasoby dla nowych kultur można dodawać przyrostowo po wdrożeniu aplikacji. Ponieważ kolejne opracowywanie zasobów specyficznych dla kultury może wymagać znacznego czasu, pozwala to najpierw zwolnić główną aplikację i dostarczyć zasoby specyficzne dla kultury w późniejszym terminie.
  • Zestawy satelitarne aplikacji można aktualizować i zmieniać bez konieczności ponownego komplikowania aplikacji.
  • Aplikacja musi załadować tylko te zestawy satelitarne, które zawierają zasoby potrzebne do określonej kultury. Może to znacznie zmniejszyć wykorzystanie zasobów systemowych.

Jednak istnieją również wady tego modelu:

  • Musisz zarządzać wieloma zestawami zasobów.
  • Początkowy koszt testowania aplikacji wzrasta, ponieważ należy przetestować kilka konfiguracji. Należy pamiętać, że w dłuższej perspektywie testowanie jednej aplikacji podstawowej z kilkoma satelitami będzie łatwiejsze i tańsze niż testowanie i utrzymywanie kilku równoległych wersji międzynarodowych.

Konwencje nazewnictwa zasobów

Podczas tworzenia pakietów zasobów aplikacji należy je nazwać przy użyciu konwencji nazewnictwa zasobów, których oczekuje środowisko uruchomieniowe języka wspólnego. Środowisko uruchomieniowe identyfikuje zasób według jego nazwy kultury. Każda kultura ma unikatową nazwę, która jest zwykle kombinacją dwuliterowej, małej nazwy kultury skojarzonej z językiem i, jeśli jest to wymagane, dwuliterowej nazwy podkultury skojarzonej z krajem lub regionem. Nazwa podkultury jest zgodna z nazwą kultury oddzieloną kreską (-). Przykłady obejmują ja-JP dla japońskich, jak mówiono w Japonii, en-US dla języka angielskiego, jak mówiono w Stany Zjednoczone, de-DE dla Niemiec, lub de-AT dla niemiec, jak mówiono w Austrii. Zobacz kolumnę Tag języka na liście nazw języków/regionów obsługiwanych przez system Windows. Nazwy kultur są zgodne ze standardem zdefiniowanym przez BCP 47.

Uwaga

Istnieją pewne wyjątki dla nazw kultur dwuliterowych, takich jak zh-Hans chiński (uproszczony).

Aby uzyskać więcej informacji, zobacz Tworzenie plików zasobów i Tworzenie zestawów satelickich.

Proces rezerwowy zasobu

Model piasty i szprych do tworzenia pakietów i wdrażania zasobów używa procesu rezerwowego do lokalizowania odpowiednich zasobów. Jeśli aplikacja żąda zlokalizowanego zasobu, który jest niedostępny, środowisko uruchomieniowe języka wspólnego wyszukuje hierarchię kultur dla odpowiedniego zasobu rezerwowego, który najlepiej pasuje do żądania aplikacji użytkownika i zgłasza wyjątek tylko w ostateczności. Na każdym poziomie hierarchii, jeśli zostanie znaleziony odpowiedni zasób, środowisko uruchomieniowe używa go. Jeśli zasób nie zostanie znaleziony, wyszukiwanie będzie kontynuowane na następnym poziomie.

Aby zwiększyć wydajność wyszukiwania, zastosuj NeutralResourcesLanguageAttribute atrybut do zestawu głównego i przekaż mu nazwę neutralnego języka, który będzie współdziałać z głównym zestawem.

Proces rezerwowy zasobów programu .NET Framework

Proces rezerwowy zasobów programu .NET Framework obejmuje następujące kroki:

Napiwek

Możesz użyć <elementu konfiguracji relativeBindForResources> , aby zoptymalizować proces rezerwowy zasobu i proces, za pomocą którego sondy środowiska uruchomieniowego dla zestawów zasobów. Aby uzyskać więcej informacji, zobacz Optymalizowanie procesu rezerwowego zasobu.

  1. Środowisko uruchomieniowe najpierw sprawdza globalną pamięć podręczną zestawów dla zestawu zgodnego z żądaną kulturą aplikacji.

    Globalna pamięć podręczna zestawów może przechowywać zestawy zasobów współużytkowane przez wiele aplikacji. Pozwala to na uwzględnienie określonych zestawów zasobów w strukturze katalogów każdej tworzonej aplikacji. Jeśli środowisko uruchomieniowe znajdzie odwołanie do zestawu, przeszukuje zestaw dla żądanego zasobu. Jeśli znajdzie wpis w zestawie, używa żądanego zasobu. Jeśli nie znajdzie wpisu, kontynuuje wyszukiwanie.

  2. Środowisko uruchomieniowe następnie sprawdza katalog aktualnie wykonywanego zestawu dla podkatalogu zgodnego z żądaną kulturą. Jeśli znajdzie podkatalog, wyszukuje ten podkatalog dla prawidłowego zestawu satelitarnego dla żądanej kultury. Następnie środowisko uruchomieniowe przeszukuje zestaw satelitarny dla żądanego zasobu. Jeśli znajdzie zasób w zestawie, używa go. Jeśli zasób nie zostanie odnaleźć, kontynuuje wyszukiwanie.

  3. Środowisko uruchomieniowe następnie wysyła zapytanie do Instalatora Windows, aby określić, czy zestaw satelitarny ma być zainstalowany na żądanie. Jeśli tak, obsługuje instalację, ładuje zestaw i wyszukuje go lub żądany zasób. Jeśli znajdzie zasób w zestawie, używa go. Jeśli zasób nie zostanie odnaleźć, kontynuuje wyszukiwanie.

  4. Środowisko uruchomieniowe AppDomain.AssemblyResolve zgłasza zdarzenie, aby wskazać, że nie może odnaleźć zestawu satelitarnego. Jeśli zdecydujesz się obsłużyć zdarzenie, program obsługi zdarzeń może zwrócić odwołanie do zestawu satelitarnego, którego zasoby będą używane do wyszukiwania. W przeciwnym razie program obsługi zdarzeń zwraca i null kontynuuje wyszukiwanie.

  5. Środowisko uruchomieniowe ponownie przeszukuje globalną pamięć podręczną zestawów, tym razem dla nadrzędnego zestawu żądanej kultury. Jeśli zestaw nadrzędny istnieje w globalnej pamięci podręcznej zestawów, środowisko uruchomieniowe wyszukuje zestaw dla żądanego zasobu.

    Kultura nadrzędna jest definiowana jako odpowiednia kultura rezerwowa. Rozważmy rodziców jako kandydatów rezerwowych, ponieważ podanie dowolnego zasobu jest preferowane do zgłaszania wyjątku. Ten proces umożliwia również ponowne użycie zasobów. Należy uwzględnić określony zasób na poziomie nadrzędnym tylko wtedy, gdy kultura podrzędna nie musi lokalizować żądanego zasobu. Jeśli na przykład dostarczasz zestawy satelitarne dla en (neutralnego języka angielskiego), en-GB (angielski jako mówiony w Wielkiej Brytanii) i en-US (angielski jak mówiony w Stany Zjednoczone), satelita en będzie zawierać wspólną terminologię, a en-GB satelity i en-US mogą zapewnić przesłonięcia tylko dla tych terminów, które się różnią.

  6. Środowisko uruchomieniowe następnie sprawdza katalog aktualnie wykonywanego zestawu, aby sprawdzić, czy zawiera katalog nadrzędny. Jeśli katalog nadrzędny istnieje, środowisko uruchomieniowe wyszukuje katalog prawidłowego zestawu satelitarnego dla kultury nadrzędnej. Jeśli znajdzie zestaw, środowisko uruchomieniowe wyszukuje zestaw dla żądanego zasobu. Jeśli znajdzie zasób, użyje go. Jeśli zasób nie zostanie odnaleźć, kontynuuje wyszukiwanie.

  7. Środowisko uruchomieniowe następnie wysyła zapytanie do Instalatora Windows, aby określić, czy nadrzędny zestaw satelitarny ma być zainstalowany na żądanie. Jeśli tak, obsługuje instalację, ładuje zestaw i wyszukuje go lub żądany zasób. Jeśli znajdzie zasób w zestawie, używa go. Jeśli zasób nie zostanie odnaleźć, kontynuuje wyszukiwanie.

  8. Środowisko uruchomieniowe zgłasza AppDomain.AssemblyResolve zdarzenie, aby wskazać, że nie może znaleźć odpowiedniego zasobu rezerwowego. Jeśli zdecydujesz się obsłużyć zdarzenie, program obsługi zdarzeń może zwrócić odwołanie do zestawu satelitarnego, którego zasoby będą używane do wyszukiwania. W przeciwnym razie program obsługi zdarzeń zwraca i null kontynuuje wyszukiwanie.

  9. Środowisko uruchomieniowe następnie wyszukuje zestawy nadrzędne, tak jak w poprzednich trzech krokach, przez wiele potencjalnych poziomów. Każda kultura ma tylko jeden element nadrzędny, który jest zdefiniowany przez CultureInfo.Parent właściwość , ale element nadrzędny może mieć własny element nadrzędny. Wyszukiwanie kultur nadrzędnych zatrzymuje się, gdy właściwość kultury Parent zwraca CultureInfo.InvariantCulturewartość ; dla rezerwowego zasobu niezmienna kultura nie jest uznawana za kulturę nadrzędną ani kulturę, która może mieć zasoby.

  10. Jeśli pierwotnie określona kultura i przeszukano wszystkie elementy nadrzędne, a zasób nadal nie zostanie znaleziony, zostanie użyty zasób domyślnej kultury (rezerwowej). Zazwyczaj zasoby kultury domyślnej są uwzględniane w głównym zestawie aplikacji. Można jednak określić wartość Satellite dla Location właściwości atrybutu NeutralResourcesLanguageAttribute , aby wskazać, że ostateczna rezerwowa lokalizacja zasobów jest zestawem satelitarnym, a nie głównym zestawem.

    Uwaga

    Zasób domyślny to jedyny zasób, który można skompilować przy użyciu głównego zestawu. Jeśli nie określisz zestawu satelitarnego przy użyciu atrybutu NeutralResourcesLanguageAttribute , jest to ostateczny rezerwowy (końcowy element nadrzędny). W związku z tym zalecamy zawsze dołączanie domyślnego zestawu zasobów do głównego zestawu. Pomaga to zapobiec zgłaszaniu wyjątków. W tym domyślnym zasobie plik zapewnia rezerwowy dla wszystkich zasobów i upewnij się, że co najmniej jeden zasób jest zawsze obecny dla użytkownika, nawet jeśli nie jest on specyficzny kulturowo.

  11. Jeśli na koniec środowisko uruchomieniowe nie znajdzie zasobu dla kultury domyślnej (rezerwowej), zgłaszany jest wyjątek lub MissingSatelliteAssemblyException wskazujący, MissingManifestResourceException że nie można odnaleźć zasobu.

Załóżmy na przykład, że aplikacja żąda zasobu zlokalizowanego dla języka hiszpańskiego (Meksyk) ( es-MX kultury). Środowisko uruchomieniowe najpierw przeszukuje globalną pamięć podręczną zestawów dla zestawu zgodnego es-MXz elementem , ale go nie znajdzie. Następnie środowisko uruchomieniowe przeszukuje katalog aktualnie wykonującego zestaw dla es-MX katalogu. W przeciwnym razie środowisko uruchomieniowe ponownie przeszukuje globalną pamięć podręczną zestawów dla zestawu nadrzędnego, który odzwierciedla odpowiednią kulturę rezerwową — w tym przypadku es (hiszpański). Jeśli zestaw nadrzędny nie zostanie znaleziony, środowisko uruchomieniowe przeszukuje wszystkie potencjalne poziomy zestawów nadrzędnych dla es-MX kultury, dopóki nie znajdzie odpowiedniego zasobu. Jeśli zasób nie zostanie znaleziony, środowisko uruchomieniowe używa zasobu dla kultury domyślnej.

Optymalizowanie procesu rezerwowego zasobów programu .NET Framework

W następujących warunkach można zoptymalizować proces, za pomocą którego środowisko uruchomieniowe wyszukuje zasoby w zestawach satelitarnych:

  • Zestawy satelitarne są wdrażane w tej samej lokalizacji co zestaw kodu. Jeśli zestaw kodu jest zainstalowany w globalnej pamięci podręcznej zestawów, zestawy satelitarne są również instalowane w globalnej pamięci podręcznej zestawów. Jeśli zestaw kodu jest zainstalowany w katalogu, zestawy satelitarne są instalowane w folderach specyficznych dla kultury tego katalogu.

  • Zestawy satelitarne nie są instalowane na żądanie.

  • Kod aplikacji nie obsługuje AppDomain.AssemblyResolve zdarzenia.

Sondę można zoptymalizować pod kątem zestawów satelickich, włączając <element relativeBindForResources> i ustawiając jego enabled atrybut na true w pliku konfiguracji aplikacji, jak pokazano w poniższym przykładzie.

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

Zoptymalizowana sonda dla zestawów satelitarnych jest funkcją zgody. Oznacza to, że środowisko uruchomieniowe wykonuje kroki opisane w procesie rezerwowym zasobu, chyba że <element relativeBindForResources> znajduje się w pliku konfiguracji aplikacji, a jego enabled atrybut jest ustawiony na true wartość . W takim przypadku proces sondowania zestawu satelitarnego jest modyfikowany w następujący sposób:

  • Środowisko uruchomieniowe używa lokalizacji nadrzędnego zestawu kodu do sondowania zestawu satelitarnego. Jeśli zestaw nadrzędny jest zainstalowany w globalnej pamięci podręcznej zestawów, sondy środowiska uruchomieniowego w pamięci podręcznej, ale nie w katalogu aplikacji. Jeśli zestaw nadrzędny jest zainstalowany w katalogu aplikacji, sondy środowiska uruchomieniowego w katalogu aplikacji, ale nie w globalnej pamięci podręcznej zestawów.

  • Środowisko uruchomieniowe nie wysyła zapytań do Instalatora Windows pod kątem instalacji zestawów satelickich na żądanie.

  • Jeśli sonda dla określonego zestawu zasobów zakończy się niepowodzeniem, środowisko uruchomieniowe nie zgłosi AppDomain.AssemblyResolve zdarzenia.

Proces rezerwowy zasobów platformy .NET Core

Proces rezerwowy zasobów platformy .NET Core obejmuje następujące kroki:

  1. Środowisko uruchomieniowe próbuje załadować zestaw satelitarny dla żądanej kultury.

    • Sprawdza katalog aktualnie wykonywanego zestawu dla podkatalogu zgodnego z żądaną kulturą. Jeśli znajdzie podkatalog, wyszukuje ten podkatalog dla prawidłowego zestawu satelitarnego dla żądanej kultury i ładuje go.

      Uwaga

      W systemach operacyjnych z systemami plików uwzględniającymi wielkość liter (tj. Linux i macOS) w podkatalogu nazwy kultury uwzględniana jest wielkość liter. Nazwa podkatalogu musi dokładnie odpowiadać wielkości liter CultureInfo.Name (na przykład es lub es-MX).

      Uwaga

      Jeśli programista wyprowadził niestandardowy kontekst ładowania zestawu z AssemblyLoadContextprogramu , sytuacja jest skomplikowana. Jeśli zestaw wykonujący został załadowany do kontekstu niestandardowego, środowisko uruchomieniowe ładuje zestaw satelitarny do kontekstu niestandardowego. Szczegóły są poza zakresem tego dokumentu. Zobacz: AssemblyLoadContext.

    • Jeśli zestaw satelitarny nie został znaleziony, zgłasza zdarzenie, aby wskazać, AssemblyLoadContextAssemblyLoadContext.Resolving że nie jest w stanie znaleźć zestawu satelitarnego. Jeśli zdecydujesz się obsłużyć zdarzenie, program obsługi zdarzeń może załadować i zwrócić odwołanie do zestawu satelitarnego.

    • Jeśli zestaw satelitarny nadal nie został znaleziony, assemblyLoadContext powoduje, że element AppDomain wyzwoli AppDomain.AssemblyResolve zdarzenie wskazujące, że nie może odnaleźć zestawu satelitarnego. Jeśli zdecydujesz się obsłużyć zdarzenie, program obsługi zdarzeń może załadować i zwrócić odwołanie do zestawu satelitarnego.

  2. Jeśli zostanie znaleziony zestaw satelitarny, środowisko uruchomieniowe wyszukuje go dla żądanego zasobu. Jeśli znajdzie zasób w zestawie, używa go. Jeśli zasób nie zostanie odnaleźć, kontynuuje wyszukiwanie.

    Uwaga

    Aby znaleźć zasób w zestawie satelitarnym, środowisko uruchomieniowe wyszukuje plik zasobu żądany przez ResourceManager element dla bieżącego CultureInfo.Nameelementu . W pliku zasobu wyszukuje żądaną nazwę zasobu. Jeśli jeden z tych nie zostanie znaleziony, zasób jest traktowany jako nie znaleziono.

  3. Środowisko uruchomieniowe następnie przeszukuje zestawy kultury nadrzędnej za pomocą wielu potencjalnych poziomów, za każdym razem powtarzając kroki 1 i 2.

    Kultura nadrzędna jest definiowana jako odpowiednia kultura rezerwowa. Rozważmy rodziców jako kandydatów rezerwowych, ponieważ podanie dowolnego zasobu jest preferowane do zgłaszania wyjątku. Ten proces umożliwia również ponowne użycie zasobów. Należy uwzględnić określony zasób na poziomie nadrzędnym tylko wtedy, gdy kultura podrzędna nie musi lokalizować żądanego zasobu. Jeśli na przykład dostarczasz zestawy satelitarne dla en (neutralnego języka angielskiego), en-GB (angielski jako mówiony w Wielkiej Brytanii) i en-US (angielski jak mówiony w Stany Zjednoczone), satelita en zawiera wspólną terminologię, a en-GB satelity i en-US udostępniają przesłonięcia tylko dla tych terminów, które się różnią.

    Każda kultura ma tylko jeden element nadrzędny, który jest zdefiniowany przez CultureInfo.Parent właściwość , ale element nadrzędny może mieć własny element nadrzędny. Wyszukiwanie kultur nadrzędnych zatrzymuje się, gdy właściwość kultury Parent zwraca wartość CultureInfo.InvariantCulture. W przypadku rezerwowego zasobu niezmienna kultura nie jest uznawana za kulturę nadrzędną ani kulturę, która może mieć zasoby.

  4. Jeśli pierwotnie określona kultura i przeszukano wszystkie elementy nadrzędne, a zasób nadal nie zostanie znaleziony, zostanie użyty zasób domyślnej kultury (rezerwowej). Zazwyczaj zasoby kultury domyślnej są uwzględniane w głównym zestawie aplikacji. Można jednak określić wartość Satellite dla Location właściwości, aby wskazać, że ostateczna rezerwowa lokalizacja zasobów jest zestawem satelitarnym, a nie głównym zestawem.

    Uwaga

    Zasób domyślny to jedyny zasób, który można skompilować przy użyciu głównego zestawu. Jeśli nie określisz zestawu satelitarnego przy użyciu atrybutu NeutralResourcesLanguageAttribute , jest to ostateczny rezerwowy (końcowy element nadrzędny). W związku z tym zalecamy zawsze dołączanie domyślnego zestawu zasobów do głównego zestawu. Pomaga to zapobiec zgłaszaniu wyjątków. Dołączając domyślny plik zasobów, należy podać rezerwę dla wszystkich zasobów i upewnić się, że co najmniej jeden zasób jest zawsze obecny dla użytkownika, nawet jeśli nie jest on specyficzny kulturowo.

  5. Jeśli na koniec środowisko uruchomieniowe nie znajdzie pliku zasobu dla kultury domyślnej (rezerwowej), zgłaszany jest wyjątek lub MissingSatelliteAssemblyException wskazujący, MissingManifestResourceException że nie można odnaleźć zasobu. Jeśli plik zasobu zostanie znaleziony, ale żądany zasób nie jest obecny, żądanie zwraca wartość null.

Ostateczny powrót do zestawu satelitarnego

Opcjonalnie można usunąć zasoby z głównego zestawu i określić, że środowisko uruchomieniowe powinno załadować ostateczne zasoby rezerwowe z zestawu satelitarnego odpowiadającego konkretnej kulturze. Aby kontrolować proces powrotu, należy użyć konstruktora NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) i podać wartość parametru UltimateResourceFallbackLocation , który określa, czy usługa Resource Manager powinna wyodrębnić zasoby rezerwowe z głównego zestawu, czy z zestawu satelitarnego.

Poniższy przykład programu .NET Framework używa atrybutu NeutralResourcesLanguageAttribute do przechowywania rezerwowych zasobów aplikacji w zestawie satelitarnym dla języka francuskiego (fr). W przykładzie istnieją dwa pliki zasobów oparte na tekście, które definiują pojedynczy zasób ciągu o nazwie Greeting. Pierwszy, resources.fr.txt, zawiera zasób języka francuskiego.

Greeting=Bon jour!

Drugi, zasoby,ru.txt, zawiera zasób języka rosyjskiego.

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

Te dwa pliki są kompilowane do plików resources przez uruchomienie generatora plików zasobów (resgen.exe) z wiersza polecenia. W przypadku zasobu języka francuskiego polecenie to:

resgen.exe resources.fr.txt

W przypadku zasobu języka rosyjskiego polecenie to:

resgen.exe resources.ru.txt

Pliki resources są osadzone w bibliotekach linków dynamicznych, uruchamiając program Assembly Linker (al.exe) z wiersza polecenia dla zasobu języka francuskiego w następujący sposób:

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

i dla zasobu języka rosyjskiego w następujący sposób:

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

Kod źródłowy aplikacji znajduje się w pliku o nazwie Example1.cs lub Example1.vb. Zawiera atrybut wskazujący NeutralResourcesLanguageAttribute , że domyślny zasób aplikacji znajduje się w podkatalogu fr. Tworzy wystąpienie usługi Resource Manager, pobiera wartość Greeting zasobu i wyświetla go w konsoli.

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

Następnie można skompilować kod źródłowy języka C# z poziomu wiersza polecenia w następujący sposób:

csc Example1.cs

Polecenie kompilatora języka Visual Basic jest bardzo podobne:

vbc Example1.vb

Ponieważ nie ma żadnych zasobów osadzonych w zestawie głównym, nie trzeba kompilować przy użyciu przełącznika /resource .

Po uruchomieniu przykładu z systemu, którego język jest inny niż rosyjski, wyświetla następujące dane wyjściowe:

Bon jour!

Sugerowana alternatywa pakowania

Ograniczenia czasowe lub budżetowe mogą uniemożliwić utworzenie zestawu zasobów dla każdej podkultury obsługiwanej przez aplikację. Zamiast tego można utworzyć pojedynczy zestaw satelitarny dla kultury nadrzędnej, której mogą używać wszystkie powiązane podkultury. Można na przykład podać pojedynczy angielski zestaw satelitarny (en), który jest pobierany przez użytkowników, którzy żądają zasobów języka angielskiego specyficznego dla regionu, oraz pojedynczy niemiecki zestaw satelitarny (de) dla użytkowników, którzy żądają zasobów niemieckich specyficznych dla regionu. Na przykład prośby o język niemiecki w Niemczech (de-DE), Austrii (de-AT) i Szwajcarii (de-CH) wróciłyby do niemieckiego zgromadzenia satelitarnego (de). Domyślne zasoby to ostateczna rezerwa i dlatego powinny być zasobami, które będą żądane przez większość użytkowników aplikacji, więc starannie wybierz te zasoby. Takie podejście wdraża zasoby, które są mniej specyficzne dla kultury, ale może znacznie zmniejszyć koszty lokalizacji aplikacji.

Zobacz też