UI とアプリ パッケージ マニフェスト内の文字列をローカライズするLocalize strings in your UI and app package manifest

アプリのローカライズの価値提案の詳細については、「グローバリゼーションとローカライズ」をご覧ください。For more info about the value proposition of localizing your app, see Globalization and localization.

アプリで複数の表示言語をサポートする必要があり、コード、XAML マークアップ、アプリ パッケージ マニフェスト内に文字列リテラルが含まれている場合は、その文字列をリソース ファイル (.resw) に移動します。If you want your app to support different display languages, and you have string literals in your code or XAML markup or app package manifest, then move those strings into a Resources File (.resw). アプリでサポートする各言語用に、このリソース ファイルを翻訳したコピーを作成することができます。You can then make a translated copy of that Resources File for each language that your app supports.

ハードコードされた文字列リテラルは、命令型コードや XAML マークアップに (たとえば、TextBlockText プロパティとして)表示できます。Hardcoded string literals can appear in imperative code or in XAML markup, for example as the Text property of a TextBlock. また、アプリ パッケージ マニフェスト ソース ファイル (Package.appxmanifest ファイル) に (たとえば、Visual Studio マニフェスト デザイナーの [アプリケーション] タブで表示名の値として) 表示することもできます。They can also appear in your app package manifest source file (the Package.appxmanifest file), for example as the value for Display name on the Application tab of the Visual Studio Manifest Designer. これらの文字列をリソース ファイル (.resw) に移動し、アプリやリソース内のハードコードされた文字列リテラルをリソース識別子への参照に置き換えます。Move these strings into a Resources File (.resw), and replace the hardcoded string literals in your app and in your manifest with references to resource identifiers.

画像リソース ファイルに画像リソースが 1 つだけ含まれている画像リソースとは異なり、文字列リソース ファイルには複数の文字列リソースが含まれています。Unlike image resources, where only one image resource is contained in an image resource file, multiple string resources are contained in a string resource file. 文字列リソース ファイルはリソース ファイル (.resw) であり、通常、この種類のリソース ファイルはプロジェクトの \Strings フォルダー内に作成します。A string resource file is a Resources File (.resw), and you typically create this kind of resource file in a \Strings folder in your project. リソース ファイル (.resw) の名前に修飾子を使用する方法の詳細については、「言語、スケール、その他の修飾子用にリソースを調整する」をご覧ください。For background on how to use qualifiers in the names of your Resources Files (.resw), see Tailor your resources for language, scale, and other qualifiers.

文字列リソース ファイルに保存します。Store strings in a resources file

  1. アプリの既定の言語を設定します。Set your app's default language.

    1. Visual Studio でソリューションを開いた状態で、Package.appxmanifest を開きます。With your solution open in Visual Studio, open Package.appxmanifest.
    2. [アプリケーション] タブで、既定の言語が適切に設定されている ("en"や "en-us" など) ことを確認します。On the Application tab, confirm that the Default language is set appropriately (for example, "en" or "en-US"). 残りの手順では、既定の言語を "en-US" に設定していることを前提としています。The remaining steps will assume that you have set the default language to "en-US".
       には、少なくともこの既定の言語のローカライズされた文字列リソースを提供する必要があります。Note At a minimum, you need to provide string resources localized for this default language. これらは、ユーザーの優先する言語や表示言語の設定に一致するものが見つからない場合に読み込まれるリソースです。Those are the resources that will be loaded if no better match can be found for the user's preferred language or display language settings.
  2. 既定の言語のリソース ファイル (.resw) を作成します。Create a Resources File (.resw) for the default language.

    1. プロジェクト ノードで、新しいフォルダーを作成し、"Strings" という名前を付けます。Under your project node, create a new folder and name it "Strings".
    2. Strings で、新しいサブフォルダーを作成し、"en-US" という名前を付けます。Under Strings, create a new sub-folder and name it "en-US".
    3. en-US で、新しいリソース ファイル (.resw) を作成し、その名前が "Resources.resw" になっていることを確認します。Under en-US, create a new Resources File (.resw) and confirm that it is named "Resources.resw".
       .NET リソース ファイル (.resx) ポートにする場合を参照してください。移植 XAML と UIします。Note If you have .NET Resources Files (.resx) that you want to port, see Porting XAML and UI.
  3. Resources.resw を開き、次の文字列リソースを追加します。Open Resources.resw and add these string resources.

    Strings/en-US/Resources.resw

    リソースの追加 (英語)

    この例では、"Greeting" が、マークアップから参照できる文字列リソース識別子です。In this example, "Greeting" is a string resource identifier that you can refer to from your markup, as we'll show. 識別子 "Greeting" について、Text プロパティの文字列が提供され、Width プロパティの文字列が提供されています。For the identifier "Greeting", a string is provided for a Text property, and a string is provided for a Width property. "Greeting.Text" は、UI 要素のプロパティに対応しているため、プロパティ識別子の例です。"Greeting.Text" is an example of a property identifier because it corresponds to a property of a UI element. また、たとえば、[名前] 列で "Greeting.Foreground" を追加し、その値を "Red" に設定することもできます。You could also, for example, add "Greeting.Foreground" in the Name column, and set its Value to "Red". "Farewell" 識別子は、単純な文字列リソース識別子です。サブプロパティを持たず、後で説明するように、命令型コードから読み込むことができます。The "Farewell" identifier is a simple string resource identifier; it has no sub-properties and it can be loaded from imperative code, as we'll show. [コメント] 列は、翻訳者に特別な指示を提供するのに適しています。The Comment column is a good place to provide any special instructions to translators.

    この例では、"Farewell" という名前の単純な文字列リソース識別子エントリがあるため、同じ識別子に基づくプロパティ識別子指定することはできません。In this example, since we have a simple string resource identifier entry named "Farewell", we cannot also have property identifiers based on that same identifier. そのため、"Farewell.Text" を追加すると、Resources.resw をビルドするときに、重複したエントリのエラーが出力されます。So, adding "Farewell.Text" would cause a Duplicate Entry error when building Resources.resw.

    リソース識別子は大文字と小文字が区別されません。リソース識別子は、リソース ファイルごとに一意でなければなりません。Resource identifiers are case insensitive, and must be unique per resource file. 翻訳者に付加的なコンテキストを提供するために、必ず意味のあるリソース識別子を使ってください。Be sure to use meaningful resource identifiers to provide additional context for translators. また、文字列リソースが翻訳に回された後は、リソース識別子を変更しないでください。And don't change the resource identifiers after the string resources are sent for translation. ローカライズ チームは、リソース識別子を使ってリソース内の追加、削除、更新を追跡します。Localization teams use the resource identifier to track additions, deletions, and updates in the resources. リソース識別子で変更—「リソース識別子シフト」であるとも呼ばれます—文字列が削除されたものとして表示されるため、数値を文字列とその他のユーザーを追加が必要です。Changes in resource identifiers—which is also known as "resource identifiers shift"—require strings to be retranslated, because it will appear as though strings were deleted and others added.

XAML から文字列リソースの識別子を参照してください。Refer to a string resource identifier from XAML

x:Uid ディレクティブを使用して、マークアップ内のコントロールやその他の要素を文字列リソース識別子に関連付けます。You use an x:Uid directive to associate a control or other element in your markup with a string resource identifier.

<TextBlock x:Uid="Greeting"/>

実行時に、\Strings\en-US\Resources.resw が読み込まれます (現時点では、プロジェクト内の唯一のリソース ファイルであるためです)。At run-time, \Strings\en-US\Resources.resw is loaded (since right now that's the only Resources File in the project). TextBlockx:Uid ディレクティブによって、参照が実行され、Resources.resw 内の "Greeting" 文字列リソース識別子を含むプロパティ識別子が見つかります。The x:Uid directive on the TextBlock causes a lookup to take place, to find property identifiers inside Resources.resw that contain the string resource identifier "Greeting". "Greeting.Text" および "Greeting.Width" プロパティ識別子が見つかり、その値が TextBlock に適用され、マークアップでローカルに設定されている値がオーバーライドされます。The "Greeting.Text" and "Greeting.Width" property identifiers are found and their values are applied to the TextBlock, overriding any values set locally in the markup. "Greeting.Foreground" 値を追加していた場合は、この値も適用されます。The "Greeting.Foreground" value would be applied, too, if you'd added that. ただし、XAML マークアップ要素でプロパティを設定するための使用されるのはプロパティ識別子のみであるため、この TextBlock で x:Uid を "Farewell" に設定しても効果はありません。But only property identifiers are used to set properties on XAML markup elements, so setting x:Uid to "Farewell" on this TextBlock would have no effect. Resources.resw 文字列 リソース識別子「別れ」が含まれますが、そのプロパティの識別子を含んでいません。Resources.resw does contain the string resource identifier "Farewell", but it contains no property identifiers for it.

XAML 要素に文字列リソース識別子を割り当てるときには、その識別子のすべてのプロパティ識別子が XAML 要素で適切であることを確認します。When assigning a string resource identifier to a XAML element, be certain that all the property identifiers for that identifier are appropriate for the XAML element. たとえば、TextBlockx:Uid="Greeting" を設定する場合、TextBlock型は Text プロパティを持つため、"Greeting.Text" は解決されます。For example, if you set x:Uid="Greeting" on a TextBlock then "Greeting.Text" will resolve because the TextBlock type has a Text property. Buttonx:Uid="Greeting" を設定する場合、Button 型には Text プロパティがないため、"Greeting.Text" によって実行時エラーが発生します。But if you set x:Uid="Greeting" on a Button then "Greeting.Text" will cause a run-time error because the Button type does not have a Text property. その場合の解決策の 1 つは、"ButtonGreeting.Content" という名前のプロパティ識別子を作成し、Buttonx:Uid="ButtonGreeting" を設定することです。One solution for that case is to author a property identifier named "ButtonGreeting.Content", and set x:Uid="ButtonGreeting" on the Button.

リソース ファイルから Width を設定する代わりに、コンテンツに合わせてコントロールのサイズを動的に変更できるようにすることが必要になる場合があります。Instead of setting Width from a Resources File, you'll probably want to allow controls to dynamically size to content.

 の添付プロパティ、.resw ファイルの名前 列で特別な構文を作成する必要があります。Note For attached properties, you need a special syntax in the Name column of a .resw file. たとえば、"Greeting" 識別子用に AutomationProperties.Name 添付プロパティの値を設定するには、これが [名前] 列に入力する内容です。For example, to set a value for the AutomationProperties.Name attached property for the "Greeting" identifier, this is what you would enter in the Name column.

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

コードから文字列リソース識別子を参照するRefer to a string resource identifier from code

単純な文字列リソース識別子に基づいて、文字列リソースを明示的に読み込むことができます。You can explicitly load a string resource based on a simple string resource identifier.

注意

バックグラウンド/ワーカー スレッドで実行された可能性のある任意の GetForCurrentView メソッドの呼び出しがある場合、if (Windows.UI.Core.CoreWindow.GetForCurrentThread() != null) テストでその呼び出しを保護します。If you have a call to any GetForCurrentView method that might be executed on a background/worker thread, then guard that call with an if (Windows.UI.Core.CoreWindow.GetForCurrentThread() != null) test. バックグラウンド/ワーカー スレッドから GetForCurrentView を呼び出すと、" <typename> が CoreWindow のないスレッドで作成されない可能性がある" という例外が発生します。Calling GetForCurrentView from a background/worker thread results in the exception "<typename> may not be created on threads that do not have a 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");

クラス ライブラリ (ユニバーサル Windows) またはWindows ランタイム ライブラリ (ユニバーサル Windows) プロジェクト内からこの同じコードを使用することができます。You can use this same code from within a Class Library (Universal Windows) or a Windows Runtime Library (Universal Windows) project. 実行時に、ライブラリをホストしているアプリのリソースが読み込まれます。At runtime, the resources of the app that's hosting the library are loaded. アプリはローカライズの度合いが大きくなる可能性があるため、ライブラリでは、ライブラリをホストしているアプリからリソースを読み込むことをお勧めします。We recommend that a library loads resources from the app that hosts it, since the app is likely to have a greater degree of localization. ライブラリがリソースを提供する必要がある場合、ライブラリをホストしているアプリがそれらのリソースを入力に置き換えられるようにするオプションを提供する必要があります。If a library does need to provide resources then it should give its hosting app the option to replace those resources as an input.

リソース名がセグメント化された場合 (が含まれています"."文字)、し、置換がドット フォワード スラッシュ (「/」) でリソース名の文字。If a resource name is segmented (it contains "." characters), then replace dots with forward slash ("/") characters in the resource name. プロパティの識別子にはたとえば、ドット; が含まれています。そのためのコードからは 1 つを読み込むためにこのブロックを実行する必要があります。Property identifiers, for example, contain dots; so you'd need to do this substition in order to load one of those from code.

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

不明なを使用できる場合MakePri.exeアプリの PRI ファイルをダンプします。If in doubt, you can use MakePri.exe to dump your app's PRI file. 各リソースのuriダンプ ファイルに表示されます。Each resource's uri is shown in the dumped file.

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

アプリ パッケージ マニフェストから文字列リソース識別子を参照するRefer to a string resource identifier from your app package manifest

  1. アプリ パッケージのマニフェストのソース ファイルを開きます (、Package.appxmanifestファイル) で既定のアプリのDisplay nameはリテラル文字列として表されます。Open your app package manifest source file (the Package.appxmanifest file), in which by default your app's Display name is expressed as a string literal.

    リソースの追加 (英語)

  2. この文字列のローカライズ可能なバージョンを作成するには、Resources.resw を開き、"AppDisplayName"という名前で、"Adventure Works Cycles" という値の新しい文字列リソースを追加します。To make a localizable version of this string, open Resources.resw and add a new string resource with the name "AppDisplayName" and the value "Adventure Works Cycles".

  3. 表示名の文字列リテラルを、作成した文字列リソース識別子 ("AppDisplayName") への参照に置き換えます。Replace the Display name string literal with a reference to the string resource identifier that you just created ("AppDisplayName"). これを行うには、ms-resource URI (Uniform Resource Identifier) スキームを使用します。You use the ms-resource URI (Uniform Resource Identifier) scheme to do this.

    リソースの追加 (英語)

  4. マニフェスト内のローカライズする各文字列について、この手順を繰り返します。Repeat this process for each string in your manifest that you want to localize. たとえば、アプリの短い名前 (スタート画面でアプリのタイルに表示されるように構成できる) です。For example, your app's Short name (which you can configure to appear on your app's tile on Start). アプリ パッケージ マニフェスト内で、ローカライズできるすべての項目の一覧については、「マニフェストのローカライズ可能な項目」をご覧ください。For a list of all items in the app package manifest that you can localize, see Localizable manifest items.

文字列リソースをローカライズするLocalize the string resources

  1. 別の言語用にリソース ファイル (.resw) のコピーを作成します。Make a copy of your Resources File (.resw) for another language.

    1. "Strings" の下に新しいサブフォルダーを作成し、Deutsch (Deutschland) を表す "de-DE" という名前を付けます。Under "Strings", create a new sub-folder and name it "de-DE" for Deutsch (Deutschland).
       、フォルダー名のいずれかを使用できるbcp-47 言語タグします。Note For the folder name, you can use any BCP-47 language tag. 言語修飾子の詳しい情報と共通の言語タグの一覧は、「言語、スケール、その他の修飾子用にリソースを調整する」をご覧ください。See Tailor your resources for language, scale, and other qualifiers for details on the language qualifier and a list of common language tags.
    2. Strings/de-DE フォルダー内に Strings/en-US/Resources.resw のコピーを作成します。Make a copy of Strings/en-US/Resources.resw in the Strings/de-DE folder.
  2. 文字列に変換します。Translate the strings.

    1. Strings/de-DE/Resources.resw を開き、[値] 列の値を翻訳します。Open Strings/de-DE/Resources.resw and translate the values in the Value column. コメントを翻訳する必要はありません。You don't need to translate the comments.

    Strings/de-DE/Resources.resw

    リソースを追加する (ドイツ語)

必要に応じて、他の言語について手順 1. と 2. を繰り返すことができます。If you like, you can repeat steps 1 and 2 for a further language.

Strings/fr-FR/Resources.resw

リソースを追加する (フランス語)

アプリのテストTest your app

既定の表示言語に対してアプリをテストします。Test the app for your default display language. [設定] > [時刻と言語] > [地域と言語] > [言語] で表示言語を変更し、アプリを再テストできます。You can then change the display language in Settings > Time & Language > Region & language > Languages and re-test your app. 文字列、UI とシェルを見て (、タイトル バーなど—表示名である—とタイルの短い名前)。Look at strings in your UI and also in the shell (for example, your title bar—which is your Display name—and the Short name on your tiles).

表示言語の設定に一致するフォルダー名が見つかった場合、そのフォルダー内のリソース ファイルが読み込まれます。Note If a folder name can be found that matches the display language setting, then the Resources File inside that folder is loaded. それ以外の場合、フォールバックが行われ、最終的にはアプリの既定の言語用のリソースになります。Otherwise, fallback takes place, ending with the resources for your app's default language.

文字列を複数のリソース ファイルにファクタリングするFactoring strings into multiple Resources Files

1 つのリソース ファイル (resw) にすべての文字列を保持することも、複数のリソース ファイルに文字列をファクタリングすることもできます。You can keep all of your strings in a single Resources File (resw), or you can factor them across multiple Resources Files. たとえば、エラー メッセージを 1 つのリソース ファイルに、アプリ パッケージ マニフェストの文字列を別のリソース ファイルに、UI の文字列を第 3 のリソース ファイルに保持することができます。For example, you might want to keep your error messages in one Resources File, your app package manifest strings in another, and your UI strings in a third. この場合、フォルダー構造は次のようになります。This is what your folder structure would look like in that case.

リソースの追加 (英語)

文字列リソース識別子の参照を特定のファイルに限定する場合は、識別子の前に /<resources-file-name>/ を追加するだけです。To scope a string resource identifier reference to a particular file, you just add /<resources-file-name>/ before the identifier. 次のマークアップの例では、ErrorMessages.resw にリソースが含まれており、その名前が "PasswordTooWeak.Text" であり、その値がエラーの説明であることを想定しています。The markup example below assumes that ErrorMessages.resw contains a resource whose name is "PasswordTooWeak.Text" and whose value describes the error.

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

追加するだけで済みます/<resources-file-name>/リソース ファイルの文字列リソースの識別子の前に以外Resources.reswします。You only need to add /<resources-file-name>/ before the string resource identifier for Resources Files other than Resources.resw. これは、"Resources.resw" が既定のファイル名であり、(このトピックの前の例で行ったように) ファイル名を省略した場合に既定のファイル名が想定されるためです。That's because "Resources.resw" is the default file name, so that's what's assumed if you omit a file name (as we did in the earlier examples in this topic).

次のコードの例では、ErrorMessages.resw にリソースが含まれており、その名前が "MismatchedPasswords" であり、その値がエラーの説明であることを想定しています。The code example below assumes that ErrorMessages.resw contains a resource whose name is "MismatchedPasswords" and whose value describes the error.

注意

バックグラウンド/ワーカー スレッドで実行された可能性のある任意の GetForCurrentView メソッドの呼び出しがある場合、if (Windows.UI.Core.CoreWindow.GetForCurrentThread() != null) テストでその呼び出しを保護します。If you have a call to any GetForCurrentView method that might be executed on a background/worker thread, then guard that call with an if (Windows.UI.Core.CoreWindow.GetForCurrentThread() != null) test. バックグラウンド/ワーカー スレッドから GetForCurrentView を呼び出すと、" <typename> が CoreWindow のないスレッドで作成されない可能性がある" という例外が発生します。Calling GetForCurrentView from a background/worker thread results in the exception "<typename> may not be created on threads that do not have a 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");

"AppDisplayName" リソースを Resources.resw から ManifestResources.resw に移動する場合は、アプリ パッケージ マニフェストで ms-resource:AppDisplayNamems-resource:/ManifestResources/AppDisplayName に変更します。If you were to move your "AppDisplayName" resource out of Resources.resw and into ManifestResources.resw, then in your app package manifest you would change ms-resource:AppDisplayName to ms-resource:/ManifestResources/AppDisplayName.

リソース ファイル名がセグメント化された場合 (が含まれています"."文字) を参照するとき、名前にドットを終了します。If a resource file name is segmented (it contains "." characters), then leave the dots in the name when you reference it. しないフォワード スラッシュ (「/」) でリソース名の場合と同様の文字、ドットを置換します。Don't replace dots with forward slash ("/") characters, like you would for a resource name.

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

不明なを使用できる場合MakePri.exeアプリの PRI ファイルをダンプします。If in doubt, you can use MakePri.exe to dump your app's PRI file. 各リソースのuriダンプ ファイルに表示されます。Each resource's uri is shown in the dumped file.

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

特定の言語または他のコンテキスト用の文字列を読み込むLoad a string for a specific language or other context

既定の ResourceContext (ResourceContext.GetForCurrentView から取得された) には、既定の実行時コンテキスト (つまり、現在のユーザーとコンピューターの設定) を表す、各修飾子名の修飾子の値が含まれています。The default ResourceContext (obtained from ResourceContext.GetForCurrentView) contains a qualifier value for each qualifier name, representing the default runtime context (in other words, the settings for the current user and machine). リソース ファイル (.resw) が一致する—、名前に修飾子に基づいて—ランタイム コンテキストでの修飾子の値と比較します。Resources Files (.resw) are matched—based on the qualifiers in their names—against the qualifier values in that runtime context.

ただし、アプリでシステム設定を上書きし、読み込むリソース ファイルを検索するときに使用する言語、スケール、その他の修飾子の値を明示的に指定することが必要になる場合があります。But there might be times when you want your app to override the system settings and be explicit about the language, scale, or other qualifier value to use when looking for a matching Resources File to load. たとえば、ユーザーがヒントやエラー メッセージに別の言語を選ぶことができるように設定できます。For example, you might want your users to be able to select an alternative language for tooltips or error messages.

そのためには、(既定のものを使用する代わりに) 新しい ResourceContext を作成し、その値をオーバーライドして、文字列検索でそのコンテキスト オブジェクトを使用します。You can do that by constructing a new ResourceContext (instead of using the default one), overriding its values, and then using that context object in your string lookups.

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;

上記のコード例で示した QualifierValues の使用方法は、任意の修飾子についても適用できます。Using QualifierValues as in the code example above works for any qualifier. 言語の特殊な場合には、代わりに次のようにすることができます。For the special case of Language, you can alternatively do this instead.

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

グローバル レベルで同じ効果を実現するために、既定の ResourceContext で修飾子の値を上書きすることができますFor the same effect at a global level, you can override the qualifier values in the default ResourceContext. ただし、その代わりに、ResourceContext.SetGlobalQualifierValue を呼び出すことをお勧めします。But instead we advise you to call ResourceContext.SetGlobalQualifierValue. SetGlobalQualifierValue の呼び出しで一度値を設定すると、ResourceContext を検索に使用するたびに、これらの値が既定の ResourceContext で有効になります。You set values one time with a call to SetGlobalQualifierValue and then those values are in effect on the default ResourceContext each time you use it for lookups.

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

一部の修飾子には、システム データ プロバイダーがあります。Some qualifiers have a system data provider. したがって、SetGlobalQualifierValue を呼び出す代わりに、プロバイダー独自の API によってプロバイダーを調整できます。So, instead of calling SetGlobalQualifierValue you could instead adjust the provider through its own API. たとえば、次のコードは、PrimaryLanguageOverride を設定する方法を示しています。For example, this code shows how to set PrimaryLanguageOverride.

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

修飾子の値の変更イベントへの応答で文字列を更新するUpdating strings in response to qualifier value change events

実行中のアプリは、既定の ResourceContext で修飾子の値に影響を与えるシステム設定の変更に応答できます。Your running app can respond to changes in system settings that affect the qualifier values in the default ResourceContext. これらのシステム設定のいずれかが、ResourceContext.QualifierValuesMapChanged イベントを呼び出します。Any of these system settings invokes the MapChanged event on ResourceContext.QualifierValues.

このイベントへの応答で、既定の ResourceContext から文字列を再読み込みすることができます。In response to this event, you can reload your strings from the default 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");
}

クラス ライブラリまたは Windows ランタイム ライブラリから文字列を読み込むLoad strings from a Class Library or a Windows Runtime Library

参照されているクラス ライブラリ (ユニバーサル Windows) または Windows ランタイム ライブラリ (ユニバーサル Windows) の文字列リソースは、通常、構築プロセス中にそれらが含まれているパッケージのサブフォルダーに追加されます。The string resources of a referenced Class Library (Universal Windows) or Windows Runtime Library (Universal Windows) are typically added into a subfolder of the package in which they're included during the build process. このような文字列のリソース識別子は、通常、LibraryName/ResourcesFileName/ResourceIdentifier という形式になります。The resource identifier of such a string usually takes the form LibraryName/ResourcesFileName/ResourceIdentifier.

ライブラリは、独自のリソースについて、ResourceLoader を取得できます。A library can get a ResourceLoader for its own resources. たとえば、次のコードでは、ライブラリまたはそれを参照するアプリのいずれかが、ResourceLoader のライブラリの文字列リソースを取得する方法を示しています。For example, the following code illustrates how either a library or an app that references it can get a ResourceLoader for the library's string resources.

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

Windows ランタイム ライブラリ (ユニバーサル Windows)、既定の名前空間がセグメント化された場合 (が含まれています"."文字)、リソース マップ名にドットを使用します。For a Windows Runtime Library (Universal Windows), if the default namespace is segmented (it contains "." characters), then use dots in the resource map name.

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

クラス ライブラリ (ユニバーサル Windows) に対応する必要はありません。You don't need to do that for a Class Library (Universal Windows). 不明なを指定できる場合MakePri.exe のコマンド ライン オプションコンポーネントまたはライブラリの PRI ファイルにダンプします。If in doubt, you can specify MakePri.exe command line options to dump your component or library's PRI file. 各リソースのuriダンプ ファイルに表示されます。Each resource's uri is shown in the dumped file.

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

他のパッケージから文字列を読み込むLoading strings from other packages

リソースのアプリケーション パッケージの管理し、パッケージの経由でアクセスを所有して最上位 ResourceMap 現在からアクセス可能である ResourceManager.The resources for an app package are managed and accessed through the package's own top-level ResourceMap that's accessible from the current ResourceManager. 各パッケージ内では、さまざまなコンポーネントが経由でアクセスできる、独自の ResourceMap サブツリーを持つことができます ResourceMap.GetSubtreeします。Within each package, various components can have their own ResourceMap subtrees, which you can access via ResourceMap.GetSubtree.

フレームワーク パッケージは、絶対リソース識別子 URI を使って独自のリソースにアクセスできます。A framework package can access its own resources with an absolute resource identifier URI. URI スキーム」もご覧ください。Also see URI schemes.

パッケージ化されたアプリケーションで文字列を読み込むLoading strings in non-packaged applications

Windows バージョン 1903 (2019 の更新の可能性があります) の時点にパッケージ化されたアプリケーションは、リソース管理システムにも活用できます。As of Windows Version 1903 (May 2019 Update), non-packaged applications can also leverage the Resource Management System.

だけ、UWP ユーザー コントロールとライブラリを作成し、リソース ファイル内の任意の文字列を格納します。Just create your UWP user controls/libraries and store any strings in a resources file. できますXAML から文字列リソースの識別子を参照してくださいコードから文字列リソースの識別子を参照してください、またはクラス ライブラリまたは Windows ランタイム ライブラリから文字列を読み込む.You can then refer to a string resource identifier from XAML, refer to a string resource identifier from code, or load strings from a Class Library or a Windows Runtime Library.

パッケージ化されたアプリケーションでリソースを使用するには、いくつかの点を行う必要があります。To use resources in non-packaged applications, you should do a few things:

  1. 使用GetForViewIndependentUseの代わりにGetForCurrentViewがコードからリソースを解決するときにない現在のビューにパッケージ化されたシナリオでします。Use GetForViewIndependentUse instead of GetForCurrentView when resolving resources from code as there is no current view in non-packaged scenarios. 呼び出す場合、次の例外が発生したGetForCurrentViewにパッケージ化されたシナリオで。リソースのコンテキストは可能性があります、CoreWindow がないスレッドでは作成されません。The following exception occurs if you call GetForCurrentView in non-packaged scenarios: Resource Contexts may not be created on threads that do not have a CoreWindow.
  2. 使用MakePri.exeを手動でアプリの resources.pri ファイルを生成します。Use MakePri.exe to manually generate your app's resources.pri file.
    • makepri new /pr <PROJECTROOT> /cf <PRICONFIG> /of resources.priを実行します。Run makepri new /pr <PROJECTROOT> /cf <PRICONFIG> /of resources.pri
    • <PRICONFIG>省略する必要があります、"<パッケージ>"セクションのすべてのリソースは単一 resources.pri ファイルにバンドルされています。The <PRICONFIG> must omit the "<packaging>" section so that all resources are bundled in a single resources.pri file. 既定値を使用して場合MakePri.exe 構成ファイルによって作成されたcreateconfigを削除する必要がある、"<パッケージ>"手動で作成した後のセクションします。If using the default MakePri.exe configuration file created by createconfig, you need to delete the "<packaging>" section manually after it is created.
    • <PRICONFIG>プロジェクト内のすべてのリソースを 1 つ resources.pri ファイルにマージするために必要なすべての関連するインデクサーを含める必要があります。The <PRICONFIG> must contain all relevant indexers required to merge all resources in your project into a single resources.pri file. 既定のMakePri.exe 構成ファイルによって作成されたcreateconfigすべてのインデクサーが含まれています。The default MakePri.exe configuration file created by createconfig includes all indexers.
    • 既定の構成を使用しない場合は、PRI インデクサーが有効になっていることを確認してください (これを行う方法の既定の構成を確認してください)、プロジェクトのルート内にある UWP プロジェクトの参照、NuGet 参照、およびから見つかった PRIs をマージします。If you don’t use the default config, make sure the PRI indexer is enabled (review the default config for how to do this) to merge PRIs found from UWP project references, NuGet references, and so on, that are located within the project root.

      注意

      省略して/IndexName、アプリケーション マニフェストがないプロジェクトによって、PRI ファイルの IndexName/ルート名前空間は自動的に設定し、アプリケーションにパッケージ化されたアプリのランタイムを理解しています (これを削除します、以前ハードの依存パッケージ ID)。By omitting /IndexName, and by the project not having an app manifest, the IndexName/root namespace of the PRI file is automatically set to Application, which the runtime understands for non-packaged apps (this removes the previous hard dependency on package ID). リソース Uri を指定するときに ms リソース:///ルート名前空間を省略する参照を推測アプリケーションにパッケージ化されたアプリのルート名前空間として (または指定できますアプリケーションとして明示的にで ms-resource://Application/)。When specifying resource URIs, ms-resource:/// references that omit the root namespace infer Application as the root namespace for non-packaged apps (or you can specify Application explicitly as in ms-resource://Application/).

  3. PRI ファイルを .exe のビルド出力ディレクトリにコピーします。Copy the PRI file to the build output directory of the .exe
  4. .Exe を実行します。Run the .exe

    注意

    リソース管理システムは、アプリのパッケージ化以外の言語に基づいてリソースを解決するときに、ユーザーの好みの言語一覧ではなく、システムの表示言語を使用します。The Resource Management System uses the system display language rather than the user preferred language list when resolving resources based on language in non-packaged apps. ユーザーの好みの言語の一覧は、UWP アプリにのみ使用されます。The user preferred language list is only used for UWP apps.

重要

PRI ファイルは、リソースが変更されるたびに手動でリビルドする必要があります。You must manually rebuild PRI files whenever resources are modified. 処理するビルド後のスクリプトを使用することをお勧めします。、 MakePri.exeコマンド、.exe ディレクトリに resources.pri 出力をコピーします。We recommend using a post-build script that handles the MakePri.exe command and copies the resources.pri output to the .exe directory.

重要な APIImportant APIs