Office ソリューションのグローバリゼーションとローカリゼーション
更新 : 2007 年 11 月
Microsoft Office ソリューションのグローバリゼーションとローカリゼーションは、ほとんどの点で Visual Studio を使用して他の種類のソリューションを作成する場合と同じです。概要については、「アプリケーションのグローバライズとローカライズ」を参照してください。グローバリゼーションとローカリゼーションの情報は、MSDN Web ページ (Globalization and Localization Issues for Solutions Created with Microsoft Visual Studio Tools for the Microsoft Office System) でも参照できます。
文書テキストのローカライズ
プロジェクト内の文書、テンプレート、またはブックには、アセンブリや他のマネージ リソースとは別にローカライズが必要な静的テキストが含まれている場合もあります。それを行う簡単な方法は、文書のコピーを作成し、Microsoft Office Word または Microsoft Office Excel を使用してこのテキストを翻訳することです。どの文書も同じアセンブリにリンクできるため、コードを変更しなくても、このプロセスを実行できます。
この場合でも、文書のテキストを操作するコードがテキストの言語と一致していることを確認する必要があります。さらに、ブックマーク、名前付き範囲、および他の表示フィールドが、Office ドキュメントの再設定に対応していることを確認する必要もあります。この再設定は、異なる文法やテキストの長さに合わせて調整する場合に必要となります。含まれるテキストが比較的少ないドキュメント テンプレートの場合は、テキストをリソース ファイルに保存して実行時に読み込む方法も考えられます。
テキストの方向
Excel では、テキストが右から左へ表記されるようにワークシートのプロパティを設定できます。デザイナに配置したホスト コントロールまたは RightToLeft プロパティがあるコントロールは、このような設定を実行時に自動的に満たします。Word 文書の場合、テキストの配置を変更できるだけで、双方向テキストの設定はないので、コントロールをこの設定に割り当てることはできません。代わりに、テキストの配置を各コントロールに設定する必要があります。テキストが右から左へ表記されるようにすべてのコントロールを設定するコードを書くことはできます。
カルチャの変更
カスタマイズ コードは、一般的に、Word または Excel のメイン UI スレッドを共有するため、スレッドのカルチャに何らかの変更を行うと、そのスレッドで実行されているすべてのプログラムに影響します。つまり、その変更はカスタマイズしているコードにとどまりません。
Windows フォーム コントロールは、Visual Studio Tools for Office アドインがホスト アプリケーションによって起動される前に初期化されます。このような場合は、UI コントロールを設定する前にカルチャを変更する必要があります。
Language Pack のインストール
Windows で英語以外を設定している場合は、Visual Studio Tools for Office Language Pack をインストールして、Windows と同じ言語で Visual Studio Tools for Office ランタイム メッセージを表示できます。エンド ユーザーは、Windows で英語以外を設定してソリューションを実行する場合、Windows と同じ言語でランタイム メッセージを表示するためのこの Language Pack が必要です。Visual Studio Tools for Office Language Pack は、Microsoft ダウンロード センター からダウンロードできます。
さらに、ClickOnce メッセージ用に、再頒布可能な .NET Framework Language Pack が必要です。.NET Framework Language Pack は、Microsoft ダウンロード センター から利用できます。
地域設定と Excel COM 呼び出し
マネージ クライアントが COM オブジェクトのメソッドを呼び出して、カルチャ固有の情報を渡す必要がある場合、現在のスレッド ロケールに一致する CurrentCulture (ロケール) が使用されます。現在のスレッド ロケールは、既定でユーザーの地域設定から継承されます。ただし、Excel オブジェクト モデルの呼び出しを行うと、Visual Studio Tools for Office は、カルチャによって変化することのないロケール識別子 (LCID) を自動的に渡します。日付や通貨など、ロケールに依存する書式設定を持つすべてのデータは、Microsoft Office Excel に渡したり、Visual Studio Tools for Office プロジェクトのコードからデータを読み込んだりする前に、英語 (米国) のデータ書式 (LCID 1033) を使用して書式設定する必要があります。詳細については、「さまざまな地域設定を使用した Excel のデータの書式設定」を参照してください。
この動作は、ExcelLocale1033Attribute 属性によって制御されます。ExcelLocale1033Attribute を false に設定すると、現在のスレッドの LCID を使用してデータを渡すように動作を変更できます。その後、Excel とマネージ コード間の対話を処理する独自のコードを作成できます。詳細については、「方法 : リフレクションを使用して Excel 内のリテラル文字列を領域保護する」を参照してください。
データの格納に関する考慮事項
データが正しく解釈および表示されるようにするには、アプリケーションが Excel ワークシートの数式などのデータを厳密に型指定されたオブジェクトではなくハードコーディングされた文字列リテラルで格納する場合に、問題が発生する可能性があることも考慮する必要があります。カルチャによって変化しないまたは英語 (U.S.) (LCID 値が en-US) のスタイルを想定して書式設定されているデータを使用する必要があります。
リテラル文字列を使用するアプリケーション
可能性がある値は、ハードコーディングされた、英語 (U.S.) 形式で書かれた日付リテラルや、ローカライズされた関数名を含む Excel ワークシートの式などです。また、"1,000" などの数値を含むハードコーディングされた文字列がこれに該当する場合もあります。一部のカルチャでは、この数値は "1000" と解釈されますが、それ以外のカルチャでは "1.0" を意味します。誤った形式で数値を計算したり比較したりすると、結果が不適切なデータになることがあります。
Excel では、文字列の解釈は文字列と共に渡された LCID に従って行われます。これは、文字列の書式と、渡された LCID が対応しない場合に問題になることがあります。Visual Studio Tools for Office では、すべてのデータを渡すときに LCID 1033 (en-US) が使用されます。Excel は、地域設定と Excel ユーザー インターフェイス言語に従ってデータを表示します。VBA (Visual Basic for Applications) は、文字列を en-US として書式設定し、ほとんどの場合、LCID として 0 (ニュートラル言語) を渡します。たとえば、次の VBA コードは、現在のユーザーのロケール設定に従って、2004 年 5 月 12 日を正しい形式の値で表示します。
'VBA
Application.ActiveCell.Value2 = "05/12/04"
同じコードを Visual Studio Tools for Office ソリューションで使用し、COM 相互運用機能を通じて Excel に渡すと、データの書式を en-US スタイルに設定した場合と同じ結果が得られます。
たとえば、次のコードを使用したとします。
Me.Range("A1").Value2 = "05/12/04"
this.Range["A1", missing].Value2 = "05/12/04";
できるだけリテラル文字列ではなく厳密に型指定されたデータを使用してください。たとえば、日付をリテラル文字列ではなく Double として格納し、操作時に DateTime オブジェクトに変換します。
次のコード例では、ユーザーがセル A5 に入力した日付を取得して Double として格納し、それを DateTime オブジェクトに変換してセル A7 に表示します。セル A7 には、日付を表示する書式が設定されている必要があります。
Private Sub ConvertDate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles ConvertDate.Click
Try
Dim dbl As Double = Me.Range("A5").Value2
Dim dt As System.DateTime = System.DateTime.FromOADate(dbl)
Me.Range("A7").Value2 = dt
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
private void ConvertDate_Click(object sender, EventArgs e)
{
try
{
double dbl = (double)(this.Range["A5", missing].Value2);
System.DateTime dt = System.DateTime.FromOADate(dbl);
this.Range["A7", missing].Value2 = dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Excel ワークシート関数
ほとんどの場合、どの言語のバージョンの Excel でも、ワークシート関数の名前は内部で変換されます。ただし、言語や COM 相互運用機能に問題が発生する可能性があるため、コード内では英語の関数名のみを使用することを強くお勧めします。
外部データを使用するアプリケーション
レガシ システムからエクスポートされたコンマ区切り値を含むファイル (CSV ファイル) などの外部データを開いたり使用したりするコードは、ファイルが en-US 以外の形式でエクスポートされる場合に影響を受けることもあります。データベースへのアクセスは、すべての値がバイナリ形式なので、影響を受けないと考えられます。ただし、データベースで日付が文字列として保存されていたり、バイナリ形式を使用しない操作が実行されたりする場合は、この限りではありません。また、Excel のデータを使用して SQL クエリを作成する場合、使用する関数によってはデータを en-US 形式にする必要があります。
参照
処理手順
方法 : Office Multilingual User Interface を使用する
概念
さまざまな地域設定を使用した Excel のデータの書式設定