方法: アプリケーションをローカライズする
このチュートリアルでは、LocBaml ツールを使用してローカライズされたアプリケーションを作成する方法について説明します。
手記
LocBaml ツールは、運用環境に対応したアプリケーションではありません。 これは、ローカライズ API の一部を使用するサンプルとして提供され、ローカライズ ツールを記述する方法を示しています。
概要
この記事では、アプリケーションをローカライズするための段階的なアプローチについて説明します。 まず、翻訳されるテキストを抽出できるように、アプリケーションを準備します。 テキストが翻訳されたら、翻訳されたテキストを元のアプリケーションの新しいコピーにマージします。
サンプル アプリケーションを作成する
この手順では、ローカライズ用にアプリを準備します。 Windows Presentation Foundation (WPF) のサンプルでは、この説明のコード例に使用する HelloApp サンプルが提供されています。 このサンプルを使用する場合は、LocBaml ツール サンプルから Extensible Application Markup Language (XAML) ファイルをダウンロードします。
ローカライズを開始する時点までアプリケーションを開発します。
MSBuild がメイン アセンブリとサテライト アセンブリ (.resources.dll 拡張子を持つファイル) を生成してニュートラル言語リソースを格納するように、プロジェクト ファイルで開発言語を指定します。 HelloApp サンプルのプロジェクト ファイルは HelloApp.csproj です。 そのファイルには、開発言語が次のように識別されます。
<UICulture>en-US</UICulture>
UID を XAML ファイルに追加します。 Uid は、ファイルへの変更を追跡し、翻訳する必要がある項目を識別するために使用されます。 Uid をファイルに追加するには、プロジェクト ファイルで
updateuid
を実行します。msbuild -t:updateuid helloapp.csproj
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 サンプルにあります。 LocBaml ツール サンプルから C# ファイルをダウンロードします。
コマンド ラインからプロジェクト ファイル (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
{ファイルディレクトリ]出力ファイル名。 culture
または-cul
{culture]出力アセンブリのロケール。 translation
または-trans
{translation.csv}翻訳またはローカライズされたファイル。 asmpath
または-asmpath
{ファイルディレクトリ]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 不問に付す FALSE FALSE #Text1;#Text2 HelloApp.g.en-US.resources:window1.baml Text1:System.Windows.Controls.TextBlock.$Content なし TRUE TRUE ハローワールド HelloApp.g.en-US.resources:window1.baml Stack1:System.Windows.Controls.StackPanel.$Content None TRUE TRUE さよならワールド コメント フィールドのすべての値が空であることに注意してください。フィールドに値がない場合は空です。 また、最初の行の項目は読み取りも変更もできず、Category 値として "Ignore" を持ち、値がローカライズ不可能であることを示します。
解析されたファイル (特に大きなファイル) 内のローカライズ可能なアイテムの検出を容易にするために、カテゴリ、
読みやすさ 、および変更可能性してアイテムを並べ替えたりフィルター処理したりできます。 たとえば、読み取り不可能な値と変更不可能な値を除外できます。
ローカライズ可能なコンテンツを翻訳する
抽出されたコンテンツを翻訳するために使用できる任意のツールを使用します。 これを行う良い方法は、リソースを .csv ファイルに書き込んで Microsoft Excel で表示し、最後の列 (値) に翻訳を変更することです。
LocBaml を使用して新しい .resources.dll ファイルを生成する
LocBaml で HelloApp.resources.dll 解析によって識別されたコンテンツは翻訳されており、元のアプリケーションにマージし直す必要があります。 generate
または -g
オプションを使用して、新しい .resources.dll ファイルを生成します。
新しい 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 にインストールする必要があります。 これは、バイナリ XAML (BAML) を読み取るときに、ローカライズ API が依存アセンブリにアクセスできる必要があるために必要です。
メイン アセンブリが署名されている場合は、生成されたリソース DLL を読み込むためにも署名する必要があります。
ローカライズされたリソース DLL のバージョンは、メイン アセンブリと同期する必要があります。
関連項目
- WPF のグローバリゼーション
- 自動レイアウトの使用の概要
.NET Desktop feedback