WPF のグローバリゼーションとローカリゼーションの概要
製品の可用性を 1 つの言語のみに制限すると、潜在的な顧客ベースは、世界の 75 億人の人口の一部に制限されます。 アプリケーションが世界中の対象ユーザーに到達するようにしたい場合、製品のコスト効率の高いローカライズは、より多くの顧客にリーチするための最良かつ最も経済的な方法の 1 つです。
この概要では、Windows Presentation Foundation (WPF) でのグローバリゼーションとローカライズについて説明します。 グローバリゼーションは、複数の場所で実行されるアプリケーションの設計と開発です。 たとえば、グローバリゼーションでは、異なるカルチャのユーザーのローカライズされたユーザー インターフェイスと地域データがサポートされます。 WPF には、自動レイアウト、サテライト アセンブリ、ローカライズされた属性やコメントなど、グローバル化されたデザイン機能が用意されています。
ローカリゼーションは、アプリケーションがサポートする特定のカルチャのローカライズされたバージョンへのアプリケーション リソースの変換です。 WPF でローカライズする場合は、System.Windows.Markup.Localizer 名前空間の API を使用します。 これらの API は、LocBaml ツール サンプル コマンドライン ツールの機能を提供します。 LocBaml をビルドして使用する方法については、「アプリケーション
警告
LocBaml ツールは、.NET Framework プロジェクトの WPF でのみ機能し、.NET 用 WPF では機能しません。
WPF でのグローバリゼーションとローカライズのベスト プラクティス
WPF に組み込まれているグローバリゼーションとローカリゼーション機能を最大限に活用するには、このセクションで提供する UI 設計とローカライズ関連のヒントに従います。
WPF UI デザインのベスト プラクティス
WPF ベースの UI を設計するときは、次のベスト プラクティスを実装することを検討してください。
XAML で UI を記述する。コードで UI を作成することは避けてください。 XAML を使用して UI を作成する場合は、組み込みのローカライズ API を使用して UI を公開します。
絶対位置と固定サイズを使用してコンテンツをレイアウトしないようにします。代わりに、相対サイズ設定または自動サイズ設定を使用してください。
SizeToContent を使用し、幅と高さを
Auto
に設定したままにします。Canvas を使用して UI をレイアウトしないでください。
Gridのサイズ共有機能を使用してください。
ローカライズされたテキストは多くの場合、より多くの領域を必要とするため、余白に余分なスペースを指定します。 余分なスペースを使用すると、文字がオーバーハングする可能性があります。
クリッピングを回避するために、TextBlock で TextWrapping を有効にします。
xml:lang
属性を設定します。 この属性は、特定の要素とその子要素のカルチャを記述します。 このプロパティの値は、WPF のいくつかの機能の動作を変更します。 たとえば、ハイフネーション、スペル チェック、番号の置換、複雑なスクリプトの整形、フォント フォールバックの動作を変更します。 XAMLでのxml:lang 処理の設定の詳細については、「WPF の グローバリゼーション」を参照してください。 カスタマイズされた複合フォントを作成して、さまざまな言語で使用されるフォントをより適切に制御できます。 既定では、WPF は Windows\Fonts ディレクトリで GlobalUserInterface.composite フォントを使用します。
右から左の形式でテキストを表示するカルチャにローカライズできるナビゲーション アプリケーションを作成する場合は、ページが NavigationWindowから FlowDirection を継承しないように、すべてのページの FlowDirection を明示的に設定します。
ブラウザーの外部でホストされるスタンドアロン ナビゲーション アプリケーションを作成する場合は、最初のアプリケーションの StartupUri をページではなく NavigationWindow に設定します (たとえば、
<Application StartupUri="NavigationWindow.xaml">
)。 この設計により、ウィンドウとナビゲーション バーの FlowDirection を変更できます。 詳細と例については、「グローバリゼーション ホームページのサンプル」を参照してください。
WPF ローカライズのベスト プラクティス
WPF ベースのアプリケーションをローカライズする場合は、次のベスト プラクティスを実装することを検討してください。
ローカライズ コメントを使用して、ローカライザーに追加のコンテキストを提供します。
ローカライズ属性を使用して、要素の Uid プロパティを選択的に省略するのではなく、ローカライズを制御します。 詳細については、「ローカリゼーション属性とコメント」を参照してください。
msbuild -t:updateuid
と-t:checkuid
を使用して、XAML Uid プロパティを追加および確認します。 Uid プロパティを使用して、開発とローカライズの間の変更を追跡します。 Uid プロパティは、新しい開発の変更をローカライズするのに役立ちます。 Uid プロパティを UI に手動で追加する場合、通常、タスクは面倒で精度が低くなります。ローカライズを開始した後 Uid プロパティを編集または変更しないでください。
重複する Uid プロパティは使用しないでください (copy-and-paste コマンドを使用する場合は、このヒントを覚えておいてください)。
AssemblyInfo.* で
UltimateResourceFallback
の場所を設定して、フォールバックに適した言語 (たとえば、[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
) を指定します。プロジェクト ファイルで
<UICulture>
タグを省略してメイン アセンブリにソース言語を含める場合は、サテライトの代わりにUltimateResourceFallback
の場所をメイン アセンブリとして設定します (たとえば、[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
)。
WPF アプリケーションをローカライズする
WPF アプリケーションをローカライズする場合は、いくつかのオプションがあります。 たとえば、アプリケーション内のローカライズ可能なリソースを XML ファイルにバインドしたり、ローカライズ可能なテキストを resx テーブルに格納したり、ローカライザーで XAML ファイルを使用したりすることができます。 このセクションでは、XAML の BAML 形式を使用するローカライズ ワークフローについて説明します。これには、いくつかの利点があります。
ビルド後にローカライズできます。
以前のバージョンの BAML 形式の XAML からのローカライズを使用して、XAML の BAML 形式の新しいバージョンに更新して、開発と同時にローカライズすることができます。
元のソース要素とセマンティクスはコンパイル時に検証できます。これは、XAML の BAML 形式が XAML のコンパイル済み形式であるためです。
ローカライズ ビルド プロセス
WPF アプリケーションを開発する場合、ローカライズのビルド プロセスは次のようになります。
開発者は WPF アプリケーションを作成してグローバル化します。 開発者はプロジェクト ファイルで
<UICulture>en-US</UICulture>
を設定し、アプリケーションのコンパイル時に言語に依存しないメイン アセンブリが生成されるようにします。 このアセンブリには、ローカライズ可能なすべてのリソースを含むサテライト .resources.dll ファイルがあります。 必要に応じて、ローカライズ API でメイン アセンブリからの抽出がサポートされるため、ソース言語をメイン アセンブリに保持できます。ファイルがビルドにコンパイルされると、XAML は XAML の BAML 形式に変換されます。 文化的に中立的な
MyDialog.exe
と、文化的に依存する (英語)MyDialog.resources.dll
ファイルが英語を話すお客様にリリースされます。
ローカライズ ワークフロー
ローカライズ プロセスは、ローカライズされていない MyDialog.resources.dll
ファイルがビルドされた後に開始されます。 元の XAML の UI 要素とプロパティは、System.Windows.Markup.Localizerの API を使用して、XAML の BAML 形式からキーと値のペアに抽出されます。 ローカライザーは、キーと値のペアを使用してアプリケーションをローカライズします。 ローカライズが完了した後、新しい値から新しい .resource.dll を生成できます。
キーと値のペアのキーは、元の XAML で開発者によって配置される x:Uid
値です。 これらの x:Uid
値を使用すると、API はローカライズ中に開発者とローカライザーの間で発生した変更を追跡およびマージできます。 たとえば、ローカライザーのローカライズが開始された後に開発者が UI を変更した場合、最小限の翻訳作業が失われるように、開発の変更を既に完了したローカライズ作業とマージできます。
次の図は、XAML の BAML 形式に基づく一般的なローカライズ ワークフローを示しています。 この図では、開発者が英語でアプリケーションを記述することを前提としています。 開発者は WPF アプリケーションを作成してグローバル化します。 開発者が <UICulture>en-US</UICulture>
設定するプロジェクト ファイルでは、ビルド時に言語に依存しないメイン アセンブリが、ローカライズ可能なすべてのリソースを含むサテライト .resources.dll で生成されます。 または、WPF ローカライズ API がメイン アセンブリからの抽出をサポートしているため、ソース言語をメイン アセンブリに保持することもできます。 ビルド プロセスの後、XAML は BAML にコンパイルされます。 文化的に中立的な MyDialog.exe.resources.dll は、英語を話す顧客に出荷されます。
WPF ローカライズの例
このセクションには、WPF アプリケーションをビルドおよびローカライズする方法を理解するのに役立つローカライズされたアプリケーションの例が含まれています。
[実行] ダイアログ ボックスの例
次の図は、実行 ダイアログ ボックスのサンプルの出力を示しています。
英語:
ドイツ語:
グローバル実行ダイアログ ボックスのデザイン
次の例では、WPF と XAML を使用して の実行 ダイアログ ボックスを生成します。 このダイアログ ボックスは、Microsoft Windows の [スタート] メニューから使用できる [実行] ダイアログ ボックスと同じです。
グローバル ダイアログ ボックスを作成するためのいくつかのハイライトは次のとおりです。
自動レイアウト
Window1.xaml の :
<Window SizeToContent="WidthAndHeight">
前の Window プロパティは、コンテンツのサイズに応じてウィンドウのサイズを自動的に変更します。 このプロパティは、ローカライズ後にサイズが大きくなるコンテンツをウィンドウが切り捨てないようにします。また、ローカライズ後にコンテンツのサイズが小さくなると、不要な領域も削除されます。
<Grid x:Uid="Grid_1">
WPF ローカライズ API が正しく機能するためには、Uid プロパティが必要です。
ユーザー インターフェイス (UI) の開発とローカライズの間の変更を追跡するために、WPF ローカライズ API によって使用されます。 Uid プロパティを使用すると、新しいバージョンの UI を以前のローカライズの UI とマージできます。 コマンド シェルで msbuild -t:updateuid RunDialog.csproj
を実行して、Uid プロパティを追加します。 これは、Uid プロパティを手動で追加する場合、通常は時間がかかり、精度が低いため、推奨される方法です。 msbuild -t:checkuid RunDialog.csproj
を実行すると、Uid プロパティが正しく設定されていることを確認できます。
UI は、Grid コントロールを使用して構成されます。これは、WPF の自動レイアウトを利用するための便利なコントロールです。 ダイアログ ボックスは 3 つの行と 5 つの列に分割されることに注意してください。 行と列の定義の 1 つに固定サイズがありません。そのため、各セルに配置される UI 要素は、ローカライズ時のサイズの増減に適応できます。
<Grid.ColumnDefinitions>
<ColumnDefinition x:Uid="ColumnDefinition_1" />
<ColumnDefinition x:Uid="ColumnDefinition_2" />
「開く」ラベルと、ComboBoxが配置された最初の2つの列は、UIの全幅の10%を使用します。
<ColumnDefinition x:Uid="ColumnDefinition_3" SharedSizeGroup="Buttons" />
<ColumnDefinition x:Uid="ColumnDefinition_4" SharedSizeGroup="Buttons" />
<ColumnDefinition x:Uid="ColumnDefinition_5" SharedSizeGroup="Buttons" />
</Grid.ColumnDefinitions>
この例では、Gridの共有サイズ設定機能を使用しています。 最後の 3 つの列は、同じ SharedSizeGroupに配置することでこれを利用します。 プロパティの名前から予想されるように、これにより、列は同じサイズを共有できます。 そのため、「Browse...」をより長い文字列の「Durchsuchen...」にローカライズすると、すべてのボタンが幅を広げて調整され、「OK」ボタンが小さく、「Durchsuchen...」ボタンが不釣り合いに大きくなることがありません。
xml:lang
xml:lang="en-US"
XAML の xml:lang Handling UI のルート要素に配置されていることに注目してください。 このプロパティは、特定の要素とその子のカルチャを記述します。 この値は WPF のいくつかの機能で使用され、ローカライズ時に適切に変更する必要があります。 この値は、ハイフネーションとスペル チェックの単語に使用する言語辞書を変更します。 また、数字の表示や、フォント フォールバック システムが使用するフォントの選択方法にも影響します。 最後に、このプロパティは、数値の表示方法と、複雑なスクリプトで記述されたテキストの整形方法に影響します。 既定値は "en-US" です。
サテライト リソース アセンブリ を構築する
.csproj の :
.csproj
ファイルを編集し、無条件の <PropertyGroup>
に次のタグを追加します。
<UICulture>en-US</UICulture>
UICulture
値が追加されていることに注意してください。 en-USなどの有効な CultureInfo 値に設定すると、プロジェクトをビルドすると、ローカライズ可能なすべてのリソースを含むサテライト アセンブリが生成されます。
<Resource Include="RunIcon.JPG">
<Localizable>False</Localizable>
</Resource>
RunIcon.JPG
は、すべてのカルチャで同じように表示されるため、ローカライズする必要はありません。 Localizable
は false
に設定され、サテライト アセンブリの代わりに言語に依存しないメイン アセンブリに残ります。 すべてのコンパイル不可能なリソースの既定値は Localizable
から true
に設定されます。
実行ダイアログ のローカライズ
解析
アプリケーションをビルドした後、ローカライズの最初の手順は、サテライト アセンブリからローカライズ可能なリソースを解析することです。 このトピックでは、LocBaml ツールのサンプルにあるサンプル LocBaml ツール
警告
LocBaml ツールは、.NET Framework プロジェクトの WPF でのみ機能し、.NET 用 WPF では機能しません。
ローカライズ
Unicode をサポートする任意の CSV エディターを使用して、このファイルを編集します。 ローカライズ カテゴリが "None" のすべてのエントリをフィルターで除外します。 次のエントリが表示されます。
リソース キー | ローカライズ カテゴリ | 価値 |
---|---|---|
Button_1:System.Windows.Controls.Button.$Content | ボタン | わかりました |
Button_2:System.Windows.Controls.Button.$Content | ボタン | キャンセル |
Button_3:System.Windows.Controls.Button.$Content | ボタン | ブラウズ。。。 |
ComboBox_1:System.Windows.Controls.ComboBox.$Content | ComboBox | |
TextBlock_1:System.Windows.Controls.TextBlock.$Content | テキスト | プログラム、フォルダー、ドキュメント、またはインターネット リソースの名前を入力すると、Windows によって開かれます。 |
TextBlock_2:System.Windows.Controls.TextBlock.$Content | テキスト | 開く: |
Window_1:System.Windows.Window.Title | タイトル | 走る |
アプリケーションをドイツ語にローカライズするには、次の翻訳が必要です。
リソース キー | ローカライズ カテゴリ | 価値 |
---|---|---|
Button_1:System.Windows.Controls.Button.$Content | ボタン | わかりました |
Button_2:System.Windows.Controls.Button.$Content | ボタン | Abbrechen |
Button_3:System.Windows.Controls.Button.$Content | ボタン | Durchsuchen... |
ComboBox_1:System.Windows.Controls.ComboBox.$Content | ComboBox | |
TextBlock_1:System.Windows.Controls.TextBlock.$Content | テキスト | Geben Sie den Namen eines Programms, Ordners, Dokuments oder einer Internetresource a. |
TextBlock_2:System.Windows.Controls.TextBlock.$Content | テキスト | 開く |
Window_1:System.Windows.Window.Title | タイトル | 走る |
の生成
ローカライズの最後の手順では、新しくローカライズされたサテライト アセンブリを作成します。 これを行うには、次の LocBaml コマンドを使用します。
/generate RunDialog.resources.dll /trans:RunDialog.resources.dllを LocBaml.exe します。CSV /out: . /cul:de-DE
ドイツ語の Windows では、この resources.dll がメイン アセンブリの横にある de-DE フォルダーに配置されている場合、このリソースは、en-US フォルダー内のフォルダーではなく自動的に読み込まれます。 これをテストするドイツ語版の Windows がない場合は、使用している Windows のカルチャ (たとえば、en-US
) にカルチャを設定し、元のリソース DLL を置き換えます。
サテライト リソースの読み込み
MyDialog.exe | en-US\MyDialog.resources.dll | de-DE\MyDialog.resources.dll |
---|---|---|
コード | 元の英語 BAML | ローカライズされた BAML |
文化的に中立的なリソース | 英語のその他のリソース | ドイツ語にローカライズされたその他のリソース |
.NET では、アプリケーションの Thread.CurrentUICultureに基づいて、読み込むサテライト リソース アセンブリが自動的に選択されます。 この設定は、お使いの Windows OS のカルチャを基準にしています。 ドイツ語の Windows を使用している場合は、de-DE\MyDialog.resources.dll ファイルが読み込まれます。 英語の Windows を使用している場合は、en-US\MyDialog.resources.dll ファイルが読み込まれます。 プロジェクトの AssemblyInfo ファイルで NeutralResourcesLanguage
属性を指定することで、アプリケーションの最終的なフォールバック リソースを設定できます。 たとえば、次のように指定します。
[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
de-DE\MyDialog.resources.dll または de\MyDialog.resources.dllのいずれのファイルも使用できない場合、en-US\MyDialog.resources.dll ファイルはドイツ語の Windows で使用されます。
Microsoft サウジアラビア ホームページ
次の図は、英語とアラビア語のホームページを示しています。 これらのグラフィックスを生成する完全なサンプルについては、「グローバリゼーション ホームページのサンプル
英語:
アラビア語:
グローバル Microsoft ホーム ページの設計
この Microsoft サウジアラビア Web サイトのモックアップは、RightToLeft 言語用に提供されるグローバリゼーション機能を示しています。 ヘブライ語やアラビア語などの言語には右から左への読み取り順序があるため、UI のレイアウトは、多くの場合、英語などの左から右の言語とは全く異なる方法でレイアウトする必要があります。 左から右の言語から右から左へ、またはその逆にローカライズすることは非常に困難な場合があります。 WPF は、このようなローカライズをはるかに簡単にするように設計されています。
フローダイレクション
Homepage.xaml:
<Page x:Uid="Page_1" x:Class="MicrosoftSaudiArabiaHomepage.Homepage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
FlowDirection="LeftToRight"
Localization.Comments="FlowDirection(This FlowDirection controls the actual content of the homepage)"
xml:lang="en-US">
Pageの FlowDirection プロパティに注目してください。 このプロパティを RightToLeft に変更すると、Page とその子要素の FlowDirection が変更され、この UI のレイアウトがアラビア語のユーザーが期待するように右から左に反転されます。 任意の要素に明示的な FlowDirection を指定することで、継承動作をオーバーライドできます。 FlowDirection プロパティは、任意の FrameworkElement またはドキュメント関連の要素で使用でき、LeftToRightの暗黙的な値を持っています。
ルート FlowDirection が変更されると、背景のグラデーション ブラシも正しく反転することを確認します。
FlowDirection="LeftToRight"
FlowDirection="RightToLeft"
パネルとコントロールの固定寸法を使用しないようにする
Homepage.xaml を見てみましょう。上部 DockPanelの UI 全体に対して指定された固定の幅と高さを除いて、他の固定ディメンションがないことに注意してください。 固定の寸法を使用せず、ソーステキストよりも長いローカライズされたテキストがクリッピングされないようにします。 WPF のパネルとコントロールは、含まれているコンテンツに基づいて自動的にサイズ変更されます。 ほとんどのコントロールには、より多くのコントロール (MinWidth="20" など) に設定できる最小および最大のディメンションもあります。 Gridでは、"*" (たとえば、Width="0.25*"
) を使用して相対的な幅と高さを設定したり、セル サイズ共有機能を使用したりすることもできます。
ローカライズ コメント
コンテンツがあいまいで翻訳が難しい場合が多い場合があります。 開発者またはデザイナーには、ローカライズ コメントを通じてローカライズ担当者に追加のコンテキストとコメントを提供する機能があります。 たとえば、以下の Localization.Comments では、文字 '|' の使用法が明確になります。
<TextBlock
x:Uid="TextBlock_2"
DockPanel.Dock="Right"
Foreground="White"
Margin="5,0,5,0"
Localization.Comments="$Content(This character is used as a decorative rule.)">
|
</TextBlock>
このコメントはTextBlock_1のコンテンツに関連付けられます。LocBaml ツールの場合は (アプリケーションのローカライズ
リソース キー | カテゴリ | 読みやすい | 変更可能 | コメント | 価値 |
---|---|---|---|---|---|
TextBlock_1:System.Windows.Controls.TextBlock.$Content | テキスト | 正しい | 真 | この文字は装飾ルールとして使用されます。 | | |
コメントは、次の構文を使用して、任意の要素のコンテンツまたはプロパティに配置できます。
<TextBlock
x:Uid="TextBlock_1"
DockPanel.Dock="Right"
Foreground="White"
Margin="5,0,5,0"
Localization.Comments="$Content(This is a comment on the TextBlock's content.)
Margin(This is a comment on the TextBlock's Margin property.)">
|
</TextBlock>
ローカライズ属性
多くの場合、開発者またはローカリゼーション マネージャーは、ローカライザーが読み取りおよび変更できる内容を制御する必要があります。 たとえば、ローカライズ担当者に会社の名前や法的な言葉を翻訳させたくない場合があります。 WPF には、要素のコンテンツまたはプロパティの読みやすさ、変更可能性、およびカテゴリを設定できる属性が用意されています。この属性を使用すると、ローカライズ ツールを使用して要素をロック、非表示、または並べ替えることができます。 詳細については、Attributesを参照してください。 このサンプルの目的上、LocBaml ツールは、これらの属性の値を出力するだけです。 WPF コントロールはすべて、これらの属性の既定値を持ちますが、オーバーライドできます。 たとえば、次の例では、TextBlock_1
の既定のローカライズ属性をオーバーライドし、コンテンツを読み取り可能に設定しますが、ローカライザーでは変更できません。
<TextBlock
x:Uid="TextBlock_1"
Localization.Attributes=
"$Content(Readable Unmodifiable)">
Microsoft Corporation
</TextBlock>
WPF では、読みやすさと変更可能性の属性に加えて、一般的な UI カテゴリ (LocalizationCategory) の列挙を提供します。これは、ローカライザーにより多くのコンテキストを提供するために使用できます。 プラットフォーム コントロールの WPF の既定のカテゴリは、XAML でもオーバーライドできます。
<TextBlock x:Uid="TextBlock_2">
<TextBlock.ToolTip>
<TextBlock
x:Uid="TextBlock_3"
Localization.Attributes=
"$Content(ToolTip Readable Unmodifiable)">
Microsoft Corporation
</TextBlock>
</TextBlock.ToolTip>
Windows Vista
</TextBlock>
WPF が提供する既定のローカライズ属性は、コードを使用してオーバーライドすることもできるため、カスタム コントロールの適切な既定値を正しく設定できます。 例えば:
[Localizability(Readability = Readability.Readable, Modifiability=Modifiability.Unmodifiable, LocalizationCategory.None)]
public class CorporateLogo : TextBlock
{
// ...
}
XAML で設定されたインスタンスごとの属性は、カスタム コントロールのコードで設定された値よりも優先されます。 属性とコメントの詳細については、「ローカリゼーション属性とコメント」を参照してください。
フォント フォールバックおよび複合フォント
指定したコードポイント範囲をサポートしていないフォントを指定すると、WPF は、Windows\Fonts ディレクトリにあるグローバル ユーザー インターフェイス.compositefont を使用して行うフォントに自動的にフォールバックします。 複合フォントは他のフォントと同様に機能し、要素の FontFamily
(たとえば、FontFamily="Global User Interface"
) を設定することで明示的に使用できます。 独自の複合フォントを作成し、特定のコードポイント範囲と言語に使用するフォントを指定することで、独自のフォント フォールバック設定を指定できます。
複合フォントの詳細については、「FontFamily」を参照してください。
Microsoft ホームページ のローカライズ
実行ダイアログの例と同じ手順に従って、このアプリケーションをローカライズできます。 アラビア語用のローカライズされた .csv ファイルは、グローバリゼーション ホームページのサンプルで入手できます。
.NET Desktop feedback