Udostępnij przez


Lokalizowanie ciągów w interfejsie użytkownika i manifeście pakietu aplikacji

Więcej informacji na temat wartości dodanej lokalizowania aplikacji można znaleźć w rozdziale Globalizacja i lokalizacja.

Jeśli chcesz, aby aplikacja obsługiwała różne języki wyświetlania i masz ciągi tekstowe w swoim kodzie, znaczniku XAML lub manifeście pakietu aplikacji, przenieś te ciągi do pliku zasobów (.resw). Następnie możesz utworzyć przetłumaczoną kopię tego pliku zasobów dla każdego języka obsługiwanego przez aplikację.

Literały ciągów zakodowanych na stałe mogą pojawiać się w kodzie imperatywnym lub w znacznikach XAML, na przykład jako właściwość Text obiektu TextBlock. Mogą one również być wyświetlane w pliku źródłowym manifestu pakietu aplikacji (pliku Package.appxmanifest), na przykład jako wartość pola Display name na karcie Application projektanta manifestu programu Visual Studio. Przenieś te ciągi do pliku zasobów (resw) i zastąp zakodowane na stałe literały ciągu w aplikacji i w manifeście odwołaniami do identyfikatorów zasobów.

W przeciwieństwie do zasobów graficznych, gdzie w pliku zasobu znajduje się tylko jeden element graficzny, wiele zasobów tekstowych znajduje się w pliku zasobu tekstowego. Plik zasobów stringów to plik zasobów typu .resw, który zazwyczaj tworzysz w katalogu \Strings w swoim projekcie. Aby dowiedzieć się, jak używać kwalifikatorów w nazwach plików zasobów (.resw), zobacz sekcję Dostosowywanie zasobów pod kątem języka, skalowania i innych kwalifikatorów.

Przechowywanie ciągów w pliku zasobów

  1. Ustaw domyślny język aplikacji.

    1. Po otwarciu rozwiązania w programie Visual Studio otwórz Package.appxmanifest.
    2. Na karcie Aplikacja upewnij się, że język domyślny jest odpowiednio ustawiony (na przykład "en" lub "en-US"). W pozostałych krokach przyjęto założenie, że dla języka domyślnego ustawiono wartość "en-US".

    Uwaga / Notatka

     Co najmniej należy podać zasoby ciągów zlokalizowane dla tego języka domyślnego. Są to zasoby, które zostaną załadowane, jeśli nie można znaleźć lepszego dopasowania dla preferowanego języka użytkownika lub ustawień języka wyświetlania.

  2. Utwórz plik zasobów (resw) dla języka domyślnego.

    1. W węźle projektu utwórz nowy folder i nadaj mu nazwę Strings.
    2. W obszarze Stringsutwórz nowy podfolder i nadaj mu nazwę en-US.
    3. W obszarze en-USutwórz nowy plik zasobów (resw) (w obszarze typów plików XAML w oknie dialogowym Dodawanie nowego elementu ) i upewnij się, że ma on nazwę Resources.resw.

    Uwaga / Notatka

    Jeśli masz pliki zasobów platformy .NET (resx), które chcesz portować, zobacz Przenoszenie kodu XAML i interfejsu użytkownika.

  3. Otwórz Resources.resw i dodaj te zasoby tekstowe.

    Strings/en-US/Resources.resw

    Zrzut ekranu przedstawiający tabelę dodawania zasobu w pliku Strings > E N U S > Resources.resw.

    W tym przykładzie "Greeting" to identyfikator zasobu tekstowego, do którego można odwoływać się w znacznikach, jak pokażemy. Dla identyfikatora "Greeting" jest przypisany ciąg do właściwości Text, a także jest przypisany ciąg do właściwości Width. "Greeting.Text" to przykład identyfikatora właściwości, ponieważ odpowiada właściwości elementu interfejsu użytkownika. Możesz również dodać "Greeting.Foreground" w kolumnie Nazwa i ustawić wartość na "Czerwony". Identyfikator "Pożegnanie" jest prostym identyfikatorem zasobu tekstowego; nie ma właściwości podrzędnych i można go załadować z kodu imperatywnego, jak pokażemy. Kolumna Komentarz jest dobrym miejscem, aby podać wszelkie specjalne instrukcje dla tłumaczy.

    W tym przykładzie, ponieważ mamy prosty wpis identyfikatora zasobu ciągu o nazwie "Pożegnanie", nie możemy również mieć identyfikatorów właściwości na podstawie tego samego identyfikatora. Dlatego dodanie elementu "Farewell.Text" spowodowałoby błąd zduplikowanego wpisu podczas kompilowania Resources.resw.

    Identyfikatory zasobów są bez uwzględniania wielkości liter i muszą być unikatowe dla pliku zasobu. Pamiętaj, aby użyć znaczących identyfikatorów zasobów w celu zapewnienia dodatkowego kontekstu dla tłumaczy. Nie zmieniaj identyfikatorów zasobów po wysłaniu zasobów tekstowych do tłumaczenia. Zespoły lokalizacyjne używają identyfikatora zasobu do śledzenia dodatków, usuwania i aktualizacji w zasobach. Zmiany identyfikatorów zasobów — nazywane również "przesunięciem identyfikatorów zasobów" — wymagają przetłumaczenie ciągów, ponieważ będą wyświetlane tak, jakby ciągi zostały usunięte, a inne zostały dodane.

Zapoznaj się z identyfikatorem zasobu ciągu z języka XAML

Aby skojarzyć kontrolkę lub inny element w znaczniku z identyfikatorem zasobu ciągu, należy użyć dyrektywy x:Uid.

<TextBlock x:Uid="Greeting"/>

W czasie wykonywania \Strings\en-US\Resources.resw jest załadowany (ponieważ obecnie jest to jedyny plik zasobów w projekcie). Dyrektywa x:Uid w TextBlock powoduje wyszukiwanie identyfikatorów właściwości w Resources.resw zawierających ciąg identyfikatora zasobu "Greeting". Znaleziono identyfikatory właściwości "Greeting.Text" i "Greeting.Width", a ich wartości są przypisywane do TextBlock, przesłaniając wartości ustawione lokalnie w znaczniku. Wartość "Greeting.Foreground" byłaby również zastosowana, gdybyś ją dodał. Jednak tylko identyfikatory właściwości są używane do ustawiania właściwości na elementach znaczników XAML, więc ustawienie x:Uid na "Pożegnanie" na tym TextBlock nie miałoby wpływu. Resources.resw zawiera identyfikator zasobu ciągu "Pożegnanie", ale nie zawiera żadnych identyfikatorów właściwości.

Podczas przypisywania identyfikatora zasobu ciągu do elementu XAML upewnij się, że wszystkie identyfikatory właściwości dla tego identyfikatora są odpowiednie dla elementu XAML. Na przykład, jeśli ustawisz x:Uid="Greeting" na TextBlock, wartość "Greeting.Text" zostanie rozpoznana, ponieważ typ TextBlock posiada właściwość Text. Jeśli jednak ustawisz x:Uid="Greeting" na przycisku , to "Greeting.Text" spowoduje błąd czasu wykonywania, ponieważ typ przycisku nie ma właściwości Text. Jednym z rozwiązań w tym przypadku jest utworzenie identyfikatora właściwości o nazwie "ButtonGreeting.Content" i ustawienie x:Uid="ButtonGreeting" na Button.

Zamiast ustawiać szerokość z pliku zasobów, prawdopodobnie chcesz zezwolić kontrolkom na dynamiczne dopasowanie rozmiaru do zawartości.

Uwaga W przypadku dołączonych właściwościpotrzebna jest specjalna składnia w kolumnie Nazwa pliku .resw. Na przykład, aby ustawić wartość dla właściwości AutomationProperties.Name dołączonej do identyfikatora "Greeting", to należy wprowadzić w kolumnie Nazwa.

Greeting.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name

Odwołaj się do identyfikatora zasobu tekstowego w kodzie

Zasób ciągu można jawnie załadować na podstawie prostego identyfikatora zasobu ciągu.

Uwaga / Notatka

Jeśli masz wywołanie dowolnej metody GetForCurrentView, która może być wykonywana w wątku w tle lub wątku roboczym, zabezpiecz to wywołanie, stosując test if (Windows.UI.Core.CoreWindow.GetForCurrentThread() != null). Wywołanie GetForCurrentView z wątku w tle/procesu roboczego powoduje wyjątek „<typename> nie może być tworzona w wątkach, które nie mają obiektu CoreWindow.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Farewell");
auto resourceLoader{ Windows::ApplicationModel::Resources::ResourceLoader::GetForCurrentView() };
myXAMLTextBlockElement().Text(resourceLoader.GetString(L"Farewell"));
auto resourceLoader = Windows::ApplicationModel::Resources::ResourceLoader::GetForCurrentView();
this->myXAMLTextBlockElement->Text = resourceLoader->GetString("Farewell");

Tego samego kodu można użyć z poziomu biblioteki klas platformy UWP (.NET Native) lub projektu składnika środowiska uruchomieniowego systemu Windows platformy UWP (.NET Native). W czasie wykonywania są ładowane zasoby aplikacji hostujące bibliotekę. Zalecamy, aby biblioteka ładuje zasoby z aplikacji, która ją hostuje, ponieważ aplikacja prawdopodobnie będzie miała większy stopień lokalizacji. Jeśli biblioteka musi dostarczyć zasoby, powinna ona nadać aplikacji hostingowej opcję zastąpienia tych zasobów jako danych wejściowych.

Jeśli nazwa zasobu jest segmentowana (zawiera znaki "."), zastąp kropki znakami ukośnika ("/") w nazwie zasobu. Identyfikatory właściwości, przykładowo, zawierają kropki; dlatego trzeba dokonać tego zastąpienia, aby załadować jeden z tych elementów z kodu.

this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Fare/Well"); // <data name="Fare.Well" ...> ...

Jeśli masz wątpliwości, możesz użyć MakePri.exe, aby zrzucić plik PRI aplikacji. Każdy zasób uri jest wyświetlany w wyeksportowanym pliku.

<ResourceMapSubtree name="Fare"><NamedResource name="Well" uri="ms-resource://<GUID>/Resources/Fare/Well">...

Odwołaj się do identyfikatora zasobu ciągu tekstowego z manifestu pakietu aplikacji.

Manifest pakietu aplikacji jest plikiem Package.appxmanifest w projekcie. Zawiera metadane dotyczące aplikacji, takie jak jej nazwa, opis i możliwości. Ciągi w manifeście można lokalizować przy użyciu pliku zasobów (resw) i odwoływania się do identyfikatorów zasobów ciągu w manifeście.

  1. Otwórz plik źródłowy manifestu pakietu Twojej aplikacji (plik Package.appxmanifest), w którym domyślnie Display name Twojej aplikacji jest wyrażany jako literał ciągu.

    Zrzut ekranu pliku Package.appxmanifest przedstawiający kartę Aplikacja, gdzie nazwa wyświetlana jest ustawiona na Adventure Works Cycles.

  2. Aby utworzyć zlokalizowaną wersję tego ciągu, otwórz Resources.resw i wprowadź nowy zasób ciągu o nazwie "AppDisplayName" i wartości "Adventure Works Cycles".

  3. Zastąp literał ciągu nazwy wyświetlanej odwołaniem do właśnie utworzonego identyfikatora zasobu ciągu ("AppDisplayName"). W tym celu użyjesz schematu identyfikatora URI ms-resource (uniform Resource Identifier).

    Zrzut ekranu pliku Package.appxmanifest przedstawiający kartę Aplikacja z nazwą wyświetlaną ustawioną na M S resource App Display Name.

  4. Powtórz ten proces dla każdego ciągu w manifeście, który chcesz zlokalizować. Na przykład krótka nazwa aplikacji (którą można skonfigurować do wyświetlania na kafelku aplikacji w menu Start). Aby uzyskać listę wszystkich elementów w manifeście pakietu aplikacji, które można lokalizować, zobacz Lokalizowalne elementy manifestu.

Lokalizowanie zasobów ciągów

Następnym krokiem jest utworzenie przetłumaczonej kopii pliku zasobów (resw) dla każdego języka obsługiwanego przez aplikację. Następnie możesz przetłumaczyć ciągi w tych plikach.

  1. Utwórz kopię pliku zasobów (resw) dla innego języka.

    1. W obszarze "Ciągi" utwórz nowy podfolder i nadaj mu nazwę "de-DE" dla Deutsch (Deutschland).
      Uwaga Jako nazwę folderu można użyć dowolnego tagu językowego BCP-47. Zobacz , jak dostosować zasoby pod kątem języka, skalowania i innych kwalifikatorów, oraz, aby uzyskać szczegółowe informacje na temat kwalifikatora języka i listy typowych tagów języka.
    2. Utwórz kopię Strings/en-US/Resources.resw w folderze Strings/de-DE .
  2. Przetłumacz ciągi.

    1. Otwórz Strings/de-DE/Resources.resw i przetłumacz wartości w kolumnie Wartość. Nie musisz tłumaczyć komentarzy.

    Strings/de-DE/Resources.resw

    dodaj zasób, niemiecki

Jeśli chcesz, możesz powtórzyć kroki 1 i 2 dla kolejnego języka.

Strings/fr-FR/Resources.resw

dodaj zasób, francuski

Przetestuj aplikację

Przetestuj aplikację pod kątem domyślnego języka wyświetlania. Następnie możesz zmienić język wyświetlania w obszarze Ustawienia>Czas i język>Region i język>Języki i ponownie przetestować aplikację. Spójrz na ciągi w interfejsie użytkownika oraz w powłoce, takie jak pasek tytułowy (czyli nazwa wyświetlana) i krótka nazwa na kafelkach.

Nuta Jeśli nazwa folderu jest zgodna z ustawieniem języka wyświetlania, zostanie załadowany plik zasobów w tym folderze. W przeciwnym razie rozpoczyna się proces wycofania, kończąc na zasobach domyślnego języka aplikacji.

Uwzględnianie ciągów w wielu plikach zasobów

Możesz zachować wszystkie ciągi w jednym pliku zasobów (resw) lub można je uwzględnić w wielu plikach zasobów. Na przykład możesz zachować komunikaty o błędach w jednym pliku zasobów, ciągach manifestu pakietu aplikacji w innym i ciągach interfejsu użytkownika w jednej trzeciej. W takim przypadku struktura folderów będzie wyglądać następująco.

Zrzut ekranu panelu Rozwiązania pokazujący folder Adventure Works Cycles > Strings z niemieckimi, amerykańskimi angielskimi i francuskimi folderami i plikami ustawień regionalnych.

Aby skonkretyzować odwołanie identyfikatora zasobu ciągu znaków do określonego pliku, wystarczy dodać /<resources-file-name>/ przed identyfikatorem. W poniższym przykładzie znaczników przyjęto założenie, że ErrorMessages.resw zawiera zasób o nazwie "PasswordTooWeak.Text" i którego wartość opisuje błąd.

<TextBlock x:Uid="/ErrorMessages/PasswordTooWeak"/>

Musisz tylko dodać /<resources-file-name>/ przed identyfikatorem zasobu ciągu w plikach Resources Files innych niżResources.resw. Dzieje się tak dlatego, że "Resources.resw" jest domyślną nazwą pliku, więc uznawana jest, jeśli pominie się nazwę pliku (tak jak w poprzednich przykładach w tym temacie).

W poniższym przykładzie kodu przyjęto założenie, że ErrorMessages.resw zawiera zasób, którego nazwa to "NiezgodneHasła" i którego wartość opisuje błąd.

Uwaga / Notatka

Jeśli masz wywołanie dowolnej metody GetForCurrentView, która może być wykonywana w wątku w tle lub wątku roboczym, zabezpiecz to wywołanie, stosując test if (Windows.UI.Core.CoreWindow.GetForCurrentThread() != null). Wywołanie GetForCurrentView z wątku w tle/procesu roboczego powoduje wyjątek „<typename> nie może być tworzona w wątkach, które nie mają obiektu CoreWindow.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("ErrorMessages");
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("MismatchedPasswords");
auto resourceLoader{ Windows::ApplicationModel::Resources::ResourceLoader::GetForCurrentView(L"ErrorMessages") };
myXAMLTextBlockElement().Text(resourceLoader.GetString(L"MismatchedPasswords"));
auto resourceLoader = Windows::ApplicationModel::Resources::ResourceLoader::GetForCurrentView("ErrorMessages");
this->myXAMLTextBlockElement->Text = resourceLoader->GetString("MismatchedPasswords");

Jeśli chcesz przenieść zasób "AppDisplayName" z Resources.resw i do ManifestResources.resw, w manifeście pakietu aplikacji zmienisz ms-resource:AppDisplayName na ms-resource:/ManifestResources/AppDisplayName.

Jeśli nazwa pliku zasobu jest segmentowana (zawiera znaki "."), pozostaw kropki w nazwie, gdy się do niej odwołujesz. Nie zastępować kropek ukośnikami ("/"), tak jak w przypadku nazwy zasobu.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("Err.Msgs");

Jeśli masz wątpliwości, możesz użyć MakePri.exe, aby zrzucić plik PRI aplikacji. Każdy zasób uri jest wyświetlany w wyeksportowanym pliku.

<ResourceMapSubtree name="Err.Msgs"><NamedResource name="MismatchedPasswords" uri="ms-resource://<GUID>/Err.Msgs/MismatchedPasswords">...

Załaduj ciąg dla określonego języka lub innego kontekstu

Domyślny ResourceContext (uzyskany z ResourceContext.GetForCurrentView) zawiera wartość kwalifikatora dla każdej nazwy kwalifikatora, która reprezentuje domyślny kontekst środowiska uruchomieniowego (innymi słowy ustawienia bieżącego użytkownika i maszyny). Pliki zasobów (.resw) są dopasowywane — na podstawie kwalifikatorów w nazwach — do wartości kwalifikatorów w danym kontekście środowiska uruchomieniowego.

Czasami jednak aplikacja ma przesłonić ustawienia systemowe i jawnie określać język, skalę lub inną wartość kwalifikatora do użycia podczas wyszukiwania pasującego pliku zasobów do załadowania. Możesz na przykład chcieć, aby użytkownicy mogli wybrać alternatywny język etykietek narzędzi lub komunikatów o błędach.

Można to zrobić, tworząc nowy ResourceContext (zamiast używać domyślnego), nadpisując jego wartości, a następnie używając go w wyszukiwaniach ciągów.

var resourceContext = new Windows.ApplicationModel.Resources.Core.ResourceContext(); // not using ResourceContext.GetForCurrentView
resourceContext.QualifierValues["Language"] = "de-DE";
var resourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
this.myXAMLTextBlockElement.Text = resourceMap.GetValue("Farewell", resourceContext).ValueAsString;

Użycie QualifierValues jak w powyższym przykładzie kodu działa dla dowolnego kwalifikatora. W szczególnym przypadku języka możesz zamiast tego zrobić to.

resourceContext.Languages = new string[] { "de-DE" };

W przypadku tego samego efektu na poziomie globalnym można zastąpić wartości kwalifikatora w domyślnym ResourceContext. Zamiast tego zalecamy wywołanie ResourceContext.SetGlobalQualifierValue. Wartości ustawia się raz za pomocą wywołania SetGlobalQualifierValue, a następnie te wartości będą stosowane w domyślnym ResourceContext za każdym razem, gdy jest on używany do wyszukiwania.

Windows.ApplicationModel.Resources.Core.ResourceContext.SetGlobalQualifierValue("Language", "de-DE");
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Farewell");

Niektóre kwalifikatory mają systemowego dostawcę danych. Zamiast wywoływać SetGlobalQualifierValue, można dostosować dostawcę za pomocą jego własnego interfejsu API. Na przykład ten kod pokazuje, jak ustawić parametr PrimaryLanguageOverride.

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "de-DE";

Aktualizowanie ciągów w odpowiedzi na zdarzenia zmiany wartości kwalifikatora

Uruchomiona aplikacja może reagować na zmiany w ustawieniach systemu, które mają wpływ na wartości kwalifikatora w domyślnym ResourceContext. Dowolne z tych ustawień systemowych wywołuje zdarzenie MapChanged w ResourceContext.QualifierValues.

W odpowiedzi na to zdarzenie można ponownie załadować łańcuchy znaków z domyślnego ResourceContext.

public MainPage()
{
    this.InitializeComponent();

    ...

    // Subscribe to the event that's raised when a qualifier value changes.
    var qualifierValues = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues;
    qualifierValues.MapChanged += new Windows.Foundation.Collections.MapChangedEventHandler<string, string>(QualifierValues_MapChanged);
}

private async void QualifierValues_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)
{
    var dispatcher = this.myXAMLTextBlockElement.Dispatcher;
    if (dispatcher.HasThreadAccess)
    {
        this.RefreshUIText();
    }
    else
    {
        await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => this.RefreshUIText());
    }
}

private void RefreshUIText()
{
    var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
    this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Farewell");
}

Ładowanie ciągów z biblioteki klas platformy UWP lub składnika środowiska uruchomieniowego systemu Windows platformy UWP

Zasoby ciągów przywoływanych biblioteki klas platformy UWP (.NET Native) lub składnika środowiska uruchomieniowego systemu Windows platformy UWP (.NET Native) są zwykle dodawane do podfolderu pakietu, w którym są uwzględniane podczas procesu kompilacji. Identyfikator zasobu takiego ciągu zwykle przyjmuje formę LibraryName/ResourcesFileName/ResourceIdentifier.

Biblioteka może pobrać moduł ResourceLoader dla własnych zasobów. Na przykład poniższy kod ilustruje, w jaki sposób biblioteka lub aplikacja, która odwołuje się do niej, może uzyskać element ResourceLoader dla zasobów ciągów biblioteki.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("ContosoControl/Resources");
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("exampleResourceName");

W przypadku składnika środowiska uruchomieniowego systemu Windows platformy UWP (.NET Native), jeśli domyślna przestrzeń nazw jest segmentowana (zawiera znaki "."), użyj kropek w nazwie mapy zasobów.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("Contoso.Control/Resources");

Nie musisz tego robić w przypadku biblioteki klas UWP (.NET Native). Jeśli masz wątpliwości, możesz określić MakePri.exe opcje wiersza polecenia zrzutu składnika lub pliku PRI biblioteki. Każdy zasób uri jest wyświetlany w wyeksportowanym pliku.

<NamedResource name="exampleResourceName" uri="ms-resource://Contoso.Control/Contoso.Control/ReswFileName/exampleResourceName">...

Ładowanie ciągów z innych pakietów

Zasoby pakietu aplikacji są zarządzane i uzyskiwane poprzez pakiet ResourceMap najwyższego poziomu , które są dostępne z aktualnego ResourceManager . W każdym pakiecie różne składniki mogą mieć własne poddrzewa ResourceMap, do których można uzyskać dostęp za pośrednictwem elementu ResourceMap.GetSubtree.

Pakiet framework może uzyskać dostęp do własnych zasobów przy użyciu bezwzględnego identyfikatora URI zasobów. Zobacz także schematy URI.

Ładowanie ciągów znaków w aplikacjach rozpakowanych

Od wersji 1903 systemu Windows (aktualizacja z maja 2019 r.), aplikacje rozpakowane mogą również korzystać z systemu zarządzania zasobami.

Utwórz kontrolki/biblioteki użytkownika platformy UWP i przechowuj wszystkie ciągi w pliku zasobów. Następnie można odwołać się do identyfikatora zasobu ciągu z języka XAML, odwołać się do identyfikatora zasobu ciągu z kodu lub załadować ciągi z biblioteki klas platformy UWP lub składnika środowiska uruchomieniowego systemu Windows platformy UWP.

Aby użyć zasobów w aplikacjach rozpakowanych, należy wykonać kilka czynności:

  1. Użyj GetForViewIndependentUse zamiast GetForCurrentView podczas rozpoznawania zasobów z kodu, ponieważ nie ma bieżącego widoku w nieopakowanych scenariuszach. Następujący wyjątek występuje, jeśli wywołasz GetForCurrentView w scenariuszach rozpakowanych: Nie można tworzyć kontekstów zasobów w wątkach, które nie posiadają CoreWindow.

  2. Użyj MakePri.exe, aby ręcznie wygenerować plik resources.pri aplikacji.

    • Uruchom makepri new /pr <PROJECTROOT> /cf <PRICONFIG> /of resources.pri

    • <PRICONFIG> musi pominąć sekcję "<packaging>", aby wszystkie zasoby zostały połączone w jednym pliku resources.pri. Jeśli używasz domyślnego pliku konfiguracji MakePri.exe utworzonego przez createconfig, należy usunąć sekcję "<pakowania>" ręcznie po jej utworzeniu.

    • <PRICONFIG> musi zawierać wszystkie właściwe indeksatory wymagane, aby połączyć wszystkie zasoby w projekcie w jeden plik resources.pri. Domyślny plik konfiguracji MakePri.exe utworzony przez createconfig zawiera wszystkie indeksatory.

    • Jeśli nie używasz domyślnej konfiguracji, upewnij się, że indeksator PRI jest włączony (sprawdź domyślną konfigurację, aby dowiedzieć się, jak to zrobić), aby scalić PRI znalezione w odwołaniach do projektów platformy UWP, odwołaniach NuGet i innych, które znajdują się w katalogu głównym projektu.

      Uwaga / Notatka

      Pominięcie /IndexNameoraz brak manifestu aplikacji w projekcie powodują, że przestrzeń nazw IndexName/root pliku PRI jest automatycznie ustawiana na Application, co środowisko uruchomieniowe rozpoznaje w przypadku aplikacji rozpakowanych (usuwa to wcześniejszą silną zależność od identyfikatora pakietu). Podczas określania identyfikatorów URI zasobów, jeśli pominiesz główną przestrzeń nazw, odwołanie ms-resource:/// zinterpretuje to jako Application jako główną przestrzeń nazw dla aplikacji rozpakowanych (lub możesz jawnie określić Application, jak w ms-resource://Application/).

  3. Skopiuj plik PRI do katalogu wyjściowego kompilacji .exe

  4. Uruchamianie .exe

    Uwaga / Notatka

    System zarządzania zasobami używa języka wyświetlania systemu, a nie listy preferowanych języków użytkownika podczas rozpoznawania zasobów na podstawie języka w aplikacjach rozpakowanych. Lista preferowanych języków użytkownika jest używana tylko dla aplikacji platformy UWP.

Ważne

Należy ręcznie skompilować pliki PRI za każdym razem, gdy zasoby są modyfikowane. Zalecamy użycie skryptu po kompilacji, który obsługuje polecenie MakePri.exe i kopiuje dane wyjściowe resources.pri do katalogu .exe.

Ważne interfejsy API