方法: アプリケーションをローカライズする
このチュートリアルでは、LocBaml ツールを使用して、ローカライズされたアプリケーションを作成する方法について説明します。
注意
LocBaml ツールは、実稼働可能なアプリケーションではありません。 それはローカリゼーション API の一部を使用するサンプルとして提供されており、ローカリゼーション ツールを記述する方法を例示します。
概要
この記事では、アプリケーションのローカリゼーションの手順を段階を追って示します。 最初に、翻訳されるテキストを抽出できるようにアプリケーションを準備します。 テキストの翻訳後、翻訳されたテキストを元のアプリケーションの新しいコピーにマージします。
サンプル アプリケーションを作成する
このステップでは、ローカリゼーション用のアプリを準備します。 Windows Presentation Foundation (WPF) のサンプルでは、この説明のコード サンプルで使用される HelloApp のサンプルが提供されています。 このサンプルを使用する場合は、Extensible Application Markup Language (XAML) のファイルを LocBaml ツール サンプルのページからダウンロードします。
ローカリゼーションを開始するポイントまで、アプリケーションを開発します。
MSBuild でメイン アセンブリとサテライト アセンブリ (.resources.dll の拡張子が付いたファイル) が生成され、ニュートラルな言語リソースを含めるように、プロジェクト ファイルの開発言語を指定します。 HelloApp サンプルのプロジェクト ファイルは HelloApp.csproj です。 このファイルに、以下のように特定される開発言語があります。
<UICulture>en-US</UICulture>
XAML のファイルに UID を追加します。 UID は、ファイルへの変更を追跡して、翻訳する必要がある項目を識別するために使用されます。 UID をファイルに追加するには、プロジェクト ファイルで
updateuid
を実行します。msbuild -t:updateuid helloapp.csproj
不足している UID または重複する UID がないことを確認するには、次のように
checkuid
を実行します。msbuild -t:checkuid helloapp.csproj
updateuid
を実行すると、ファイルに UID が含まれているはずです。 たとえば、HelloApp の Pane1.xaml ファイルに、次のブロックがあるはずです。<StackPanel x:Uid="StackPanel_1"> <TextBlock x:Uid="TextBlock_1">Hello World</TextBlock> <TextBlock x:Uid="TextBlock_2">Goodbye World</TextBlock> </StackPanel>
ニュートラル言語リソースのサテライト アセンブリを作成する
ニュートラル言語リソースのサテライト アセンブリを生成するようにアプリケーションを構成した後、アプリケーションをビルドします。 これにより、メイン アプリケーション アセンブリだけでなく、ローカリゼーションで LocBaml が必要とするニュートラル言語リソースのサテライト アセンブリが生成されます。
アプリケーションをビルドするには
次のように HelloApp をコンパイルして、ダイナミックリンク ライブラリ (DLL) を作成します。
msbuild helloapp.csproj
新規作成されたメインのアプリケーション アセンブリ HelloApp.exe は、次のフォルダーに作成されます。C:\HelloApp\Bin\Debug
新規作成されたニュートラル言語リソースのサテライト アセンブリ HelloApp.resources.dll は次のフォルダーに作成されます。C:\HelloApp\Bin\Debug\en-US
LocBaml ツールをビルドする
LocBaml のビルドに必要なすべてのファイルは WPF サンプルに配置されています。 C# のファイルを LocBaml ツール サンプルのページからダウンロードします。
ツールをビルドするには、コマンド ラインでプロジェクト ファイル (locbaml.csproj) を実行します。
msbuild locbaml.csproj
Bin\Release ディレクトリに移動して、新しく作成された実行可能ファイル (locbaml.exe) を探します。 例:C:\LocBaml\Bin\Release\locbaml.exe
LocBaml を実行するときに指定できるオプションは、次のとおりです。
オプション 説明 parse
または-p
Baml、リソース、または DLL ファイルを解析して、.csv または .txt ファイルを生成します。 generate
または-g
翻訳されたファイルを使用して、ローカライズされたバイナリ ファイルを生成します。 out
または-o
{filedirectory]出力ファイル名。 culture
または-cul
{culture]出力アセンブリのロケール。 translation
または-trans
{translation.csv]翻訳またはローカライズされたファイル。 asmpath
または-asmpath
{filedirectory]XAML コードにカスタム コントロールが含まれている場合、カスタム コントロール アセンブリに asmpath
を指定する必要があります。nologo
ロゴまたは著作権情報は表示されません。 verbose
詳細モードの情報が表示されます。 注意
このツールを実行しているときにオプションの一覧が必要な場合は、
LocBaml.exe
を入力してから Enter キーを押します。
LocBaml を使用してファイルを解析する
LocBaml ツールが作成されたので、これを使用して HelloApp.resources.dll を解析し、ローカライズするテキスト コンテンツを抽出できる状態になりました。
LocBaml.exe を、メインのアプリケーション アセンブリが作成された、アプリケーションの bin \debug フォルダーにコピーします。
サテライト アセンブリ ファイルを解析して、.csv ファイルとして出力を格納するには、次のコマンドを使用します。
LocBaml.exe /parse HelloApp.resources.dll /out:Hello.csv
注意
入力ファイル HelloApp.resources.dll が LocBaml.exe と同じディレクトリに存在しない場合は、いずれかのファイルを移動して両方のファイルが同じディレクトリにあるようにします。
LocBaml を実行してファイルを解析する際、出力はコンマ区切り (.csv ファイル) またはタブ区切り (.txt ファイル) された 7 つのフィールドで構成されます。 HelloApp.resources.dll の解析済みの .csv ファイルを次に示します。
解析された .csv ファイル HelloApp.g.en-US.resources:window1.baml,Stack1:System.Windows.Controls.StackPanel.$Content,Ignore,FALSE, FALSE,,#Text1;#Text2; HelloApp.g.en-US.resources:window1.baml,Text1:System.Windows.Controls.TextBlock.$Content,None,TRUE, TRUE,,Hello World HelloApp.g.en-US.resources:window1.baml,Text2:System.Windows.Controls.TextBlock.$Content,None,TRUE, TRUE,,Goodbye World 7 つのフィールドは、次のとおりです。
BAML 名。 ソース言語のサテライト アセンブリに関する BAML リソースの名前。
リソース キー。 ローカライズされたリソースの識別子。
カテゴリ。 値の型です。 「ローカリゼーション属性とコメント」を参照してください。
読みやすさ。 ローカライザーによって値が読み取れるかどうか。 「ローカリゼーション属性とコメント」を参照してください。
変更可能性。 ローカライザーによって値が変更できるかどうか。 「ローカリゼーション属性とコメント」を参照してください。
コメント。 値をローカライズする方法を決定するための値の追加の説明。 「ローカリゼーション属性とコメント」を参照してください。
値。 目的のカルチャに翻訳するテキストの値。
次の表は、.csv ファイルの区切り記号付きの値にこれらのフィールドをマップする方法を示しています。
BAML 名 リソース キー カテゴリ 読みやすさ 変更可能性 コメント [値] HelloApp.g.en-US.resources:window1.baml Stack1:System.Windows.Controls.StackPanel.$Content Ignore false false #Text1;#Text2 HelloApp.g.en-US.resources:window1.baml Stack1:System.Windows.Controls.StackPanel.$Content None true true Hello World HelloApp.g.en-US.resources:window1.baml Stack1:System.Windows.Controls.StackPanel.$Content None true true Goodbye World [コメント] フィールドのすべての値に値が含まれていないことに注意してください。フィールドに値がない場合、フィールドは空です。 また、最初の行の項目は、読み取り可能でも変更可能でもありませんが、 [カテゴリ] の値として "Ignore" が含まれていることにも注意してください。これらはすべて、値がローカライズ可能ではないことを示します。
解析済みのファイルでローカライズ可能な項目の検出を容易にするためには、項目をカテゴリ、読みやすさ、および変更可能性で並べ替えるかフィルター処理します。 たとえば、読み取りも変更もできない値をフィルター処理することができます。
ローカライズ可能なコンテンツを翻訳する
抽出されたコンテンツを翻訳するために使用可能な任意のツールを使用します。 これを行う良い方法は、リソースを .csv ファイルに記述し、それらを Microsoft Excel に表示して、翻訳の変更内容を最後の列 (値) にすることです。
LocBaml を使用して新しい .resources.dll ファイルを生成する
LocBaml で HelloApp.resources.dll を解析して識別されたコンテンツは翻訳済みであり、元のアプリケーションにマージする必要があります。 新しい .resources.dll ファイルを生成するには、generate
または -g
オプションを使用します。
新しい HelloApp.resources.dll ファイルを生成するには、次の構文を使用します。 カルチャを en-US (/cul:en-US) としてマークします。
LocBaml.exe /generate HelloApp.resources.dll /trans:Hello.csv /out:c:\ /cul:en-US
注意
入力ファイル Hello.csv が実行可能ファイル LocBaml.exe と同じディレクトリに存在しない場合は、いずれかのファイルを移動して、両方のファイルが同じディレクトリにあるようにします。
C:\HelloApp\Bin\Debug\en-US\HelloApp.resources.dll ディレクトリにある古い HelloApp.resources.dll ファイルを新規作成した HelloApp.resources.dll ファイルに置き換えます。
ここで "Hello World" と "Goodbye World" をアプリケーション内で翻訳する必要があります。
別のカルチャに翻訳するには、翻訳先の言語のカルチャを使用します。 フランス語 (カナダ) に翻訳する方法の例を次に示します。
LocBaml.exe /generate HelloApp.resources.dll /trans:Hellofr-CA.csv /out:c:\ /cul:fr-CA
メイン アプリケーション アセンブリと同じアセンブリで、新しいサテライト アセンブリを格納するために、新しいカルチャ固有のフォルダーを作成します。 フランス語 (カナダ) のフォルダーは "fr-CA" となります。
新しいフォルダーに生成されたサテライト アセンブリをコピーします。
新しいサテライト アセンブリをテストするには、アプリケーションが実行するカルチャを変更する必要があります。 2 つの方法のいずれかでこれを行うことができます。
オペレーティング システムの地域設定を変更する。
アプリケーションで、次のコードを App.xaml.cs に追加します。
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SDKSample.App" x:Uid="Application_1" StartupUri="Window1.xaml"> </Application>
using System.Windows; using System.Globalization; using System.Threading; namespace SDKSample { public partial class App : Application { public App() { // Change culture under which this application runs CultureInfo ci = new CultureInfo("fr-CA"); Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; } } }
Imports System.Windows Imports System.Globalization Imports System.Threading Namespace SDKSample Partial Public Class App Inherits Application Public Sub New() ' Change culture under which this application runs Dim ci As New CultureInfo("fr-CA") Thread.CurrentThread.CurrentCulture = ci Thread.CurrentThread.CurrentUICulture = ci End Sub End Class End Namespace
LocBaml を使用するためのヒント
カスタム コントロールを定義するすべての依存アセンブリを LocBaml のローカル ディレクトリにコピーするか、GAC にインストールする必要があります。 ローカリゼーション API は、バイナリ XAML (BAML) を読み取るときに、依存アセンブリにアクセスできる必要があるため、これが必要になります。
メインのアセンブリが署名済みの場合は、生成されたリソース DLL も読み込むために署名されている必要があります。
ローカライズされたリソースの DLL は、メインのアセンブリと同期する必要があります。
関連項目
.NET Desktop feedback