WiX チュートリアル (日本語訳)

Lesson 2 ユーザー・インタフェイス

前回のレッスンでは、インストールしたいファイルをどのように記述するかを学びました。そして、ある製品が既にインストール済みであるかどうかをインストーラが自動的に判断するロジックについて、いくつかの簡単な実装方法を見ました。しかし、それら全ては、よくあるユーザー・インタフェイスを伴わずに実行され、ユーザーにインストールについて何も言う機会を与えないものでした。ということで、ユーザー・インタフェイスがこの回で取り扱う主題になります。

Windows Installer は(既に見た簡単な進捗ダイアログと、ポップ・アップしてユーザーにいろんなエラーを通知するメッセージ・ボックスを除いて)内蔵されたユーザー・インタフェイスを持っていません。インストーラ・パッケージは自分自身のユーザー・インタフェイスを定義してコンパイルし、自分の .msi ファイルに入れて持って回らなければなりません。このため、ファイルのサイズは多少大きくなります(典型的なユーザー・インタフェイスを持った .msi ファイルは、内部に持つアイコンや他のグラフィカルな要素のサイズにも左右されますが、最小でも 300 KB をちょっと下回る程度のサイズになってしまいます)。しかし、サイズと引き替えに、考えられる限りのどんな要求に対してでも、カスタマイズして対応することが可能になっています。

完全なユーザー・インタフェイスを自力で開発することを始めるのは、あまり面白いことではないでしょう。幸いなことに、そんなことをする必要はありません。WiX ツールセットには、標準のユーザー・インタフェイス・ライブラリである WixUI が付属しています。このユーザー・インタフェイスは MSI SDK の作成済みインタフェイスに基づいたものです(MSI SDK は、Microsoft のビジュアル・プログラミング環境に付属していますが、単体として自由にダウンロードすることも可能です)。このライブラリが標準的なインストーラ・パッケージの完全なユーザー・インタフェイスを提供してくれます。その中には、使用許諾契約、顧客情報、標準/カスタム/完全のセットアップ・タイプ、インストール先フォルダの変更、必要なディスク容量の計算、変更/修復/削除およびロールバックなど、標準的なウィザード・ページが全て含まれています。唯一の違いは — 個性を演出するために — 基調色が青でなく赤になっていることです。しかし、それをカスタマイズしたい場合は、二~三のビットマップとアイコンを修正するだけで済みます。

2.1 最初のステップ

前のサンプルを素敵なユーザー・インタフェイスで拡張しましょう。しかし、詳細に踏み込む前に、SampleWixUI をダウンロードし、コンパイルして走らせて、どんなことが出来るか、だいたいの感じをつかんで下さい。次のコマンドでビルドして下さい(リンカのコマンドの新しい引数については、後で説明します)。

† 訳註:SampleWixUI の日本語版は Sample-2-1-WixUI.zip です。

candle.exe SampleWixUI.wxs
light.exe -ext WixUIExtension SampleWixUI.wixobj

カスタム・インストールを選んで、インストール先のフォルダを変更してみて下さい。インストールが完了したら、インストーラ・パッケージをもう一度実行してみて下さい。すると、今度はプログラムの変更または削除が出来ます(同じことは「プログラムの追加と削除」[変更]を選んだ時にも出来ます)。

どうやってこれだけの機能を獲得できたのかを見ていきましょう。最初の部分は前と同じです — 結局のところ、インストールしようとしているのは同じ製品、同じファイル、同じコンポーネント、同じ機能です。

<?xml version='1.0' encoding='utf-8'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>

  <Product Name='ほげ 1.0'
           Id='YOURGUID-86C7-4D14-AEC0-86416A69ABDE'
           UpgradeCode='YOURGUID-7349-453F-94F6-BCB5110BA4FD'
           Language='1041' Codepage='932'
           Version='1.0.0' Manufacturer='ぴよソフト'>

    <Package Id='*' Keywords='インストーラ'
             Description="ぴよソフト's ほげ 1.0 インストーラ"
             Comments='ほげはぴよソフトの登録商標です。'
             Manufacturer='ぴよソフト' InstallerVersion='100'
             Languages='1041' Compressed='yes' SummaryCodepage='932' />

      ...

      <Directory Id="DesktopFolder" Name="Desktop" />
    </Directory>

ここまでは、目新しいものは何もありません。次に来るセグメントの構造も見慣れたものですが、二~三、新しい属性が追加されています。

    <Feature Id='Complete' Title='ほげ 1.0'
             Description='完全パッケージ。' Display='expand'
             Level='1' ConfigurableDirectory='INSTALLDIR'>
      <Feature Id='MainProgram' Title='プログラム'
               Description='メインの実行ファイル。' Level='1'>
        <ComponentRef Id='MainExecutable' />
        <ComponentRef Id='HelperLibrary' />
        <ComponentRef Id='ProgramMenuDir' />
      </Feature>

      <Feature Id='Documentation' Title='説明書'
               Description='取扱説明書。' Level='1000'>
        <ComponentRef Id='Manual' />
      </Feature>
    </Feature>

今回はユーザー・インタフェイスを持っている訳ですから、ユーザーに対して、どういう機能の選択肢があるかを知らせるために、何かを表示しなくてはなりません。そのために、人間が読むことが出来る何らかの記述が必要になります。コンパイルされたインストーラ・パッケージをもう一度開始してカスタム・セットアップまで進めば、各種の UI テキストがどこにどんな形で現れるかを見ることが出来ます。

Title 属性の内容が、ダイアログの左側のツリービューの項目に使われています。そして、ツリーの中の項目をクリックすると、右側の四角形の中に Description のテキストが現れます。Display 属性(選択可能な値は collapse, expand および hidden です)は、指定されたツリーの部分が初期状態では折り畳まれて表示される(collapse)か、展開されて表示される(expand)か、それとも全く表示されない(hidden)かを決定します。

Level 属性を使うと、どの機能がインストールされるかを決めることが可能になります。普通のシナリオでは、ユーザーに、Typical, Complete および Custom という三つの選択肢を提供します。後の二つは単純です(Complete は全てをインストールし、Custom はユーザーが全てを細部まで指定できるようにします)が、Typical については、どの機能がそれに属するかを私たちが決めなければなりません。あるいは、必要なら、選択肢の数を増やすことも可能です。インストーラは、実行時に、1 以上 32,767 以下の任意の値を取る INSTALLLEVEL という作成済みのプロパティを使用します。そして各機能は、そのレベルが 0 ではなく、かつ、INSTALLLEVEL の現在の値を越えない場合にインストールされます。

WiX のユーザー・インタフェイスでは、この INSTALLLEVELTypical が選ばれると 3 に設定し、Complete が選ばれると 1,000 に設定します(この第二の数値はかなり恣意的なものです。使用可能な数値なら何でも良かったのです)。このため、Typical に含めたくない機能は、このレベルでマークしなければなりません。Typical(標準)インストールの場合は INSTALLLEVEL が 3 になりますので、1 以上 3 以下のレベルを持つ機能だけがインストールされ、それを越えるレベルのものは — Level=1000 の機能も含めて — 放っておかれます。

そして最後に、一番重要な部分が、ConfigurableDirectory です。この属性の値として INSTALLDIR を参照していますが、これは、数行前の一番内側の Directory タグで、インストール先として指定したディレクトリです。こうすることによって、私たちが元来意図していたインストール先をユーザーが変更出来るようにしている訳です。この属性を使用しないようにすれば、ユーザーは前と同じようにいろいろな機能を有効にしたり無効にしたりする事は出来ますが、インストール先ディレクトリは変更することが出来なくなります。

2.2 カスタムの設定

カスタムのツリービューの各項目には、コンテキスト・メニューが結び付けられていて、ユーザーはどの機能をどのようにインストールするかを決めることが出来ます。メニュー項目の既定値は以下の通りです。

Feature のいろんな属性を使うと、これらの項目のいくつかを削除したり修正したりして、その機能にとって意味のあるものだけを残すことが出来ます。基本的には、五つの選択肢が有り得ます。すなわち、(1) 機能をローカルのハード・ドライブにインストールする、(2) インストール・メディアから起動する、(3) ネットワークから起動する、(4) 要求に応じてインストールする(機能はユーザーが初めて使おうとした時にインストールされます。これは比較的新しいオペレーティング・システムでしかサポートされていません)、そして、(5) 全くインストールしない、の五つです。

属性と値 説明
AllowAdvertise='no' 「この機能は必要になったときにインストールされます」 がコンテキスト・メニューから削除されます。ユーザーはこの機能を必要に応じてインストールすることが出来ません。
AllowAdvertise='yes' 「この機能は必要になったときにインストールされます」 がコンテキスト・メニューに出現します。ユーザーはこの機能を必要に応じてインストールすることが出来ます。
AllowAdvertise='system' オペレーティング・システムがサポートしている場合にだけ、「この機能は必要になったときにインストールされます」 がコンテキスト・メニューに出現して、ユーザーが必要に応じてこの機能をインストールすることが出来るようになります。
InstallDefault='local' 「この機能(とすべてのサブ機能)はローカルのハード・ドライブにインストールされます」 がコンテキスト・メニューに出現します。
InstallDefault='source' 「ローカルのハード・ドライブにインストールされます」という元の項目の代りに、「この機能(とすべてのサブ機能)は CD から実行するようにインストールされます」 がコンテキスト・メニューに出現します。
InstallDefault='followParent' 実際の状態(localsource か)は、親の機能の設定に従います。
Absent='allow' 「この機能はインストールされません」 がコンテキスト・メニューに出現します。ユーザーはこの機能をインストールするかしないかを決めることが出来ます。
Absent='disallow' 「この機能はインストールされません」 がコンテキスト・メニューから削除されます。この機能は常に必要とされ、ユーザーはこの機能のインストールを拒否することが出来ません。

* Windows Installer にバグがあるようです。機能の中にファイルが含まれていないと、上記で概観した属性を使って削除しようとしても、この項目がコンテキスト・メニューに出現してしまいます。そういう場合は、その機能に(中にファイルを含まない)空っぽのコンポーネントを追加して下さい。

2.3 UI の魔法

ここからが本当のマジックです。WixUI は、どの程度まで高機能なユーザー・インタフェイスを求めるかに応じて、五つの異なるウィザードを提供してくれます。

フル・セットのユーザー・インタフェイスを使用するために必要な事は、ソースに二行を追加して、WixUI インタフェイス・ライブラリをプロジェクトに含めることだけです。

    <UIRef Id="WixUI_Mondo" />
    <UIRef Id="WixUI_ErrorProgressText" />

最初の参照によって適切なユーザー・インタフェイス・ライブラリが読み込まれます。しかし、このライブラリは、言語ファイルにあるローカライズされたエラーとアクションのテキスト(英語の場合は、修正されたテキスト)を自動的に使う訳ではありません。二番目の参照を追加しない場合、インストーラ・パッケージはわずかに小さくなって、Windows Installer の内部にある組み込みのメッセージを使うようになります。

* WixUI_InstallDir のダイアログ・セットを使う場合は、ソースのどこかで、下記のように、追加のプロパティを提供しなければなりません。

<Property Id="WIXUI_INSTALLDIR" Value="TOP_LEVEL_DIR" />

そして、最後に、これまでのサンプルと全く同じように、ソースの記述を終了します。

    <Icon Id="Hoge10.exe" SourceFile="HogeAppl10.exe" />
  </Product>
</Wix>

ユーザー・インタフェイスの変種のすべては、共通のコンパイル済みライブラリに入っています。私たちは、既に述べたようにコマンド・ライン・スイッチを使って、この拡張ライブラリに対してリンクするだけで良いのです。統合開発環境の中で作業をしている場合は、同じ効果を得るために、このライブラリに対する参照を追加する必要があります。

candle.exe SampleWixUI.wxs
light.exe -ext WixUIExtension SampleWixUI.wixobj

ユーザー・インタフェイスの外観のいくつかは、代替のファイルを指定するだけでカスタマイズすることが出来ます。既定のファイルはツールセットの中にありますが、代替のビットマップ、アイコン、ライセンス文書を自分で作ることが可能です。全部でなく、特定のファイルだけを置き換えることも出来ます。ファイルのパスは変数に保持されていますので、コマンド・ラインで指定することも、直接ソースに書くことも出来ます。

  <WixVariable Id="WixUILicenseRtf" Value="path\License.rtf" />
  <WixVariable Id="WixUIBannerBmp" Value="path\banner.bmp" />
  <WixVariable Id="WixUIDialogBmp" Value="path\dialog.bmp" />
  <WixVariable Id="WixUIExclamationIco" Value="path\exclamation.ico" />
  <WixVariable Id="WixUIInfoIco" Value="path\information.ico" />
  <WixVariable Id="WixUINewIco" Value="path\new.ico" />
  <WixVariable Id="WixUIUpIco" Value="path\up.ico" />

これらの意味と詳細は以下の通りです。

カスタマイズするファイルのID 説明
WixUIBannerBmp 493 × 58 ピクセル。このビットマップは、最初のページを除く全てのページの上部に表示されます。
WixUIDialogBmp 493 × 312 ピクセル。このビットマップは、インストーラの最初のページに表示されます。
WixUIExclamationIco 感嘆符アイコン
WixUIInfoIco 情報サイン・アイコン
WixUINewIco 「新しいフォルダ」アイコン
WixUIUpIco 「一つ上のフォルダ」アイコン
WixUILicenseRtf なるべくなら、ワードパッドのような単純なエディタを使って作成して下さい。どうしてもワードのような必要以上に複雑なアプリケーションを使いたい場合は、せめて最終版はワードパッドで保存し直すことを検討して下さい。その方が、RTF ファイルがシンプルで小さくなります。

† 訳註:原文では、WixUIBannerBmp のサイズは 500 × 63 ピクセル、WixUIDialogBmp のサイズは 500 × 314 ピクセルと記述されています。それらは、WiX 2 時代のライブラリが内蔵していたビットマップのサイズに基づくものです。上記の表には、WiX 3 のライブラリが内蔵しているビットマップのピクセル・サイズを記しました。

ただし、これらのビットマップのサイズは、絶対にそうでなければならない、というものではありません。8.7 法律用語 の末尾にあるビットマップについての記述および訳註を参照してください。

2.4 アナタハ 英語ヲ 話シマスカ?

現在の所、WiX でサポートされているのは下記の言語です(他の言語の状態については、地域化(ローカライゼーション)プロジェクトのページ を参照してください)。Product および Package の両方のタグで、言語とコードページの両方を正しく指定するように気をつけて下さい。言語の設定が正しくないと、インストーラの基本言語とは異なる、予期しない言語のエラー・メッセージがポップ・アップすることがあります。また、コードページが正しくないと、アクセント記号付き文字や非欧文文字がまったく表示されないことがあります。

言語 状態 カルチャ(言語-) 地域化ファイル 言語 コードページ
中国語(繁体字) 完了 zh-tw WixUI_zh-tw.wxl
1028 950
チェコ語 リリース済み cs-sz   1029 1250
デンマーク語 完了 da-dk WixUI_da-dk.wxl 1030 1252
オランダ語 リリース済み nl-nl   1043 1252
英語 リリース済み en-us WixUI_en-us.wxl * 1033 1252
フランス語 リリース済み fr-fr   1036 1252
ドイツ語 リリース済み de-de WixExt_de-de.wxl * 1031 1252
ハンガリー語 リリース済み hu-hu WixUI_hu-hu.wxl * 1038 1250
イタリア語 リリース済み it-it   1040 1252
日本語 リリース済み ja-jp   1041 932
ポーランド語 リリース済み pl-pl   1045 1250
ロシア語 リリース済み ru-ru   1049 1251
スペイン語 リリース済み es-es   3082 1252
ウクライナ語 リリース済み uk-ua   1058 1251

* いくつかの言語については、リリース・パッケージの地域化ファイルの代りとして、もっと洗練された自然な言い回しの理解しやすい翻訳を同時に提供しています。これらの翻訳は、Microsoft がインストールで使っている通常の表現とはいくつかの点で異なっていますが、私たちの個人的な見解では、リリース版よりも単純で分りやすい言葉を使っています。それらを調べてみて、インストール・パッケージにどちらを使うかを決めるのは、完全にあなたの自由です。

リリース済みの言語は、コンパイルされて WixUI 拡張ライブラリに入っています。これらを使う場合は、カルチャ名を指定するだけ済みます。統合環境を使っている場合は、プロジェクトのプロパティ・ダイアログに「カルチャ」欄がありますので、そこでカルチャ名を指定できます。カンマで区切って複数のカルチャ識別子を指定すると、その全部について、個別のインストーラが作成されます。

candle.exe SampleWixUI.wxs
light.exe -ext WixUIExtension -cultures:fr-fr SampleWixUI.wixobj

完了状態の言語(リリースへの承認待ちののもの)や、代替の言語ファイル(上記のテーブルからダウンロードしたものや、あなた自身が作ったもの)は、コマンド・ラインで直接に指定することが出来ます。統合環境では、ソース・ファイルの中に .wxl ファイルを含めるだけで、適切なインストーラが自動的に作成されます。

candle.exe SampleWixUI.wxs
light.exe -ext WixUIExtension -loc path/WixUI_hu-hu.wxl
          -out SampleWixUI.msi SampleWixUI.wixobj

† 訳註:残念ながら、リリース版の日本語地域化ファイルの品質はあまり良くありません。不明瞭な表現や不自然な言い回しが多く、中には明らかに誤訳と思われるものあります。代替版(WixUI_Alt_ja-jp.zip)を参考に供しますので、ご自由にお使い下さい。この代替版の作成については、「オープンソース Win32ビルド & 和訳 ( http://cml.s10.xrea.com/ )」の管理人である H さんのご協力を頂きました。

2.5 チェーンの新しい環

WixUI インタフェイス・ライブラリは、通常のセットアップ・シナリオのほとんどを扱うことが出来ますが、ときには修正や追加が必要になることもあります。そういう場合に対処するためには、WiX ソース・コード もダウンロードしなければなりません。と言うのは、いくつかのソース・ファイルを覗き見する必要があるからです。

サンプル SampleWixUIAddDlgでは、WixUI_Mondo ライブラリを修正して、ユーザーに登録情報(名前、組織、シリアル番号)を入力してもらうダイアログを追加します。新しいダイアログは、「使用許諾契約」ダイアログと「セットアップ・タイプ」ダイアログの間に出現します。

† 訳註:SampleWixUIAddDlg の日本語版は Sample-2-5-WixUIAddDlg.zip です。

これを実現するためには、この新しいダイアログを記述する UserRegistrationDlg.wxs という新しいファイルを提供しなければなりません。既存のダイアログから始めて、それを修正しても構いませんし、一から自分で書いても構いません。後のレッスンで、ダイアログの作成方法と、WiX のさまざまなインタフェイス要素の使い方を説明しますが、ここでは、いくつかの注意点を述べるにとどめます。

<?xml version='1.0' encoding='utf-8'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>

新しいダイアログは独立した断片(fragment)として記述しなければなりません。

  <Fragment>
    <UI>
      <Dialog Id="UserRegistrationDlg"
              Width="370" Height="270"
              Title="[ProductName] [Setup]" NoMinimize="yes">
        <Control Id="NameLabel" Type="Text"
                 X="45" Y="73" Width="100" Height="15"
                 TabSkip="no" Text="ユーザー名(&amp;U):" />
        <Control Id="NameEdit" Type="Edit"
                 X="45" Y="85" Width="220" Height="18"
                 Property="USERNAME" Text="{80}" />
        <Control Id="OrganizationLabel" Type="Text"
                 X="45" Y="110" Width="100" Height="15"
                 TabSkip="no" Text="会社名(&amp;O):" />
        <Control Id="OrganizationEdit" Type="Edit"
                 X="45" Y="122" Width="220" Height="18"
                 Property="COMPANYNAME" Text="{80}" />
        <Control Id="CDKeyLabel" Type="Text"
                 X="45" Y="147" Width="50" Height="10"
                 TabSkip="no">
          <Text>CD キー(&amp;K)</Text>
        </Control>
        <Control Id="CDKeyEdit" Type="MaskedEdit"
                 X="45" Y="159" Width="250" Height="16"
                 Property="PIDKEY" Text="[PIDTemplate]" />

このダイアログが、元の一連のダイアログの中に挿入されます。このダイアログに先行するダイアログと後続するダイアログを指定しなければなりません。先行するのは「使用許諾契約」、後続するのは「セットアップ・タイプ」です。WixUI_Mondo のソース・ファイル、ダウンロードしたソース・パッケージの src\ext\UIExtension\wixlib\WixUI_Mondo.wxs を見ると、これらのダイアログの実際の識別子を知ることが出来ます。名前は、LicenseAgreementDlgSetupTypeDlg です。従って、この新しいダイアログから、これら前後のダイアログを参照するように、以下のように記述します。

        <Control Id="Back" Type="PushButton"
                 X="180" Y="243" Width="56" Height="17"
                 Text="戻る(&amp;B)">
          <Publish Event="NewDialog"
                   Value="LicenseAgreementDlg">1</Publish>
        </Control>
        <Control Id="Next" Type="PushButton"
                 X="236" Y="243" Width="56" Height="17"
                 Default="yes" Text="次へ(&amp;N)">
          <Publish Event="ValidateProductID"
                   Value="0">1</Publish>
          <Publish Event="SpawnWaitDialog"
                   Value="WaitForCostingDlg">CostingComplete = 1</Publish>
          <Publish Event="NewDialog"
                   Value="SetupTypeDlg">ProductID</Publish>
        </Control>
        <Control Id="Cancel" Type="PushButton"
                 X="304" Y="243" Width="56" Height="17"
                 Cancel="yes" Text="キャンセル">
          <Publish Event="SpawnDialog"
                   Value="CancelDlg">1</Publish>
        </Control>
        <Control Id="BannerBitmap" Type="Bitmap"
                 X="0" Y="0" Width="370" Height="44"
                 TabSkip="no" Text="WixUI_Bmp_Banner" />
        <Control Id="Description" Type="Text"
                 X="25" Y="23" Width="280" Height="15"
                 Transparent="yes" NoPrefix="yes">
          <Text>あなたのユーザー情報を入力して下さい。</Text>
        </Control>
        <Control Id="BottomLine" Type="Line"
                 X="0" Y="234" Width="370" Height="0" />
        <Control Id="Title" Type="Text"
                 X="15" Y="6" Width="200" Height="15"
                 Transparent="yes" NoPrefix="yes">
          <Text>{\WixUI_Font_Title}ユーザー情報</Text>
        </Control>
        <Control Id="BannerLine" Type="Line"
                 X="0" Y="44" Width="370" Height="0" />
      </Dialog>
    </UI>
  </Fragment>
</Wix>

新しいダイアログを元のユーザー・インタフェイスに組み込むことはかなり簡単です。前にやったように単純に WixUI_Mondo を参照する代りに、UI タグで私たち自身のインタフェイスを作成します。と言っても、WixUI_Mondo の大部分は依然として使いたい訳ですから、まず最初に UIRef を使って WixUI_Mondo を呼び出してから、修正部分を追加します。最初に、新しい UserRegistrationDlg ダイアログを参照します。

次に、残っている二つのリンクを定義しなければなりません。元の WixUI_Mondo では、「使用許諾契約」ダイアログは「セットアップ・タイプ」ダイアログを後続するものとして指し示していました。その逆も同様です。今や新しいダイアログが両者の間に挿入されている訳ですから、元のダイアログの「次へ」および「戻る」のリンクをそれに合わせて修正しなければなりません。簡単な方法は、WixUI_Mondo.wxs から関連する Publish タグをコピーしてきて、他は何も変えずに、Value 属性を修正して新しいダイアログを指し示すようにする、という方法です。

    <UI Id="MyWixUI_Mondo">
      <UIRef Id="WixUI_Mondo" />
      <UIRef Id="WixUI_ErrorProgressText" />

      <DialogRef Id="UserRegistrationDlg" />

      <Publish Dialog="LicenseAgreementDlg" Control="Next"
              Event="NewDialog" Value="UserRegistrationDlg"
              Order="3">
        LicenseAccepted = "1"
      </Publish>
      <Publish Dialog="SetupTypeDlg" Control="Back"
              Event="NewDialog" Value="UserRegistrationDlg">
        1
      </Publish>
    </UI>

メインのソース・ファイルは、私たちが参照したプロパティを定義しなければなりません。マスク・エディット・コントロールは、いろんな文字を使って、どんな内容がどのようにコントロールに表示されるか、どんな種類の入力をコントロールが受け入れるか、そして、データを受け取るプロパティに割り当てられる最終的なデータがどのような書式で整形されるか、という事を決定します。

    <Property Id="PIDTemplate"><![CDATA[12345<### ###>@@@@@]]></Property>

これで全てです。これで、修正されたインストーラを下記のコマンドによってビルドすることが出来ます。

candle.exe SampleWixUIAddDlg.wxs UserRegistrationDlg.wxs
light.exe -ext WixUIExtension -out SampleWixUIAddDlg.msi
          SampleWixUIAddDlg.wixobj UserRegistrationDlg.wixobj

2.6 地域化を考える

私たち独自のダイアログを WixUI に追加したら、同じように地域化(ローカライズ)もしたいですね。そのためにかかる余分の手間は、それほど大きくはありません。メインのソース・ファイルは同じままです。修正しなければならないのは、UserRegistrationDlg.wxs の中の新しいダイアログだけです。固定されたテキストの代りに、地域化できる文字列参照を使います。

  <Fragment>
    ...
      <Dialog Id="UserRegistrationDlg" Width="370" Height="270"
              Title="!(loc.UserRegistrationDlg_Title)" NoMinimize="yes">
        <Control Id="NameLabel" Type="Text"
                 X="45" Y="73" Width="100" Height="15"
                 TabSkip="no" Text="!(loc.UserRegistrationDlg_UserName)" />
        <Control Id="OrganizationLabel" Type="Text"
                 X="45" Y="110" Width="100" Height="15"
                 TabSkip="no" Text="!(loc.UserRegistrationDlg_Organization)" />
    ...
  </Fragment>
</Wix>

次に、これらの文字列の一覧を記載した地域化ファイルを適切なカルチャで作成します。ここでは、そのファイルを UserRegistrationDlg.fr-fr.wxl と呼ぶことにしましょう(ファイル名はあなた次第ですが、拡張子 .wxl は固定されています)。WixLocalization タグの中で、カルチャとコードページを指定しなければいけません。地域化したい他の言語についても、同様な複製を作って下さい。

<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="fr-fr" Codepage="1252"
                 xmlns="http://schemas.microsoft.com/wix/2006/localization">
  <String Id="UserRegistrationDlg_Title" Overridable="yes">???</String>
  <String Id="UserRegistrationDlg_UserName" Overridable="yes">???</String>
  <String Id="UserRegistrationDlg_Organization" Overridable="yes">???</String>
  ...
</WixLocalization>

サンプル・ソース(SampleWixUIAddDlgLoc)からインストーラをビルドするためには、地域化ファイルも参照する必要があります。統合環境では、地域化ファイルは、プロジェクトに含めるだけで、自動的に使用されるようになります。

candle.exe SampleWixUIAddDlgLoc.wxs UserRegistrationDlg.wxs
light.exe -ext WixUIExtension -cultures:fr-fr
          -loc UserRegistrationDlg.fr-fr.wxl
          -out SampleWixUIAddDlgLoc.msi
          SampleWixUIAddDlgLoc.wixobj UserRegistrationDlg.wixobj

† 訳註:SampleWixUIAddDlgLoc の日本語版を Sample-2-6-WixUIAddDlgLoc.zip として用意しました。これまでメインのソースに埋め込んでいた日本語のテキストも地域化ファイルに分離しています。そのため、コマンド・ラインで指定しなければならない地域化ファイルの数が、上記のコマンド・ラインの例より増えています。

なお、日本語版のサンプルで示しているように、GUID も地域化ファイルの中で定義する事が出来ますが、その場合は GUID をブレース(波括弧 {})で囲む必要があります。

Copyright © 2004-2012, Gábor DEÁK JAHN, Tramontána
何よりもコメントと寄稿を歓迎します。
日本語翻訳 Copyright © 2010, 2013, Nobuo Kihara, softark
読みやすくて正確な翻訳を目指しましたが、解釈の誤りと技術的な間違いが含まれていないという保証は出来ません。間違いの指摘や修正案の提示を歓迎します。github のリポジトリ ( https://github.com/softark/wix-j ) をご利用下さい。