2017年11月15日水曜日

WiX toolset msi ダイアログ多国語対応 

以前のブログでWiX toolsetによる多国語対応msiの作り方について書いたが、インストーラの主要なメッセージの表示が日本語化されても、細かなダイアログのメッセージが英語のままであった。

WiX tooksetの以下の場所に多国語メッセージ定義ファイルがある。
C:\Program Files (x86)\WiX Toolset v3.11\SDK\wixui

これに含まれる WixUI_ja-jp.wxl で日本語メッセージが設定されているが、これが適用されない項目がある。

ここに同様の件でのQ&Aがあった。
WIX: Statuses while rolling back uninstall are not localized in French

これによるとActionに対応するローカライズテキストがデフォルトでは設定されていないようで、Product.wxsに次のような追加を行うと、日本語メッセージが適用されるようになる。

この Q&A では String の Id を別のものに置き換え、言語別 wxl でメッセージを書き換えているが、WiX規定のものであれば次の要領で日本語を適用できる。

 <UI>
    <ProgressText Action="RemoveShortcuts" Template="!(loc.ProgressTextRemoveShortcutsTemplate)">
            !(loc.ProgressTextRemoveShortcuts)
    </ProgressText>
</UI>


これにより Action="RemoveShortcuts” に ja-JP では WixUI_ja-jp.wxl の ProgressTextRemoveShortcuts が適用されるようになる。

 WixUI_ja-jp.wxl では次のように設定されている。

<String Id="ProgressTextRemoveShortcuts" Overridable="yes">ショートカットを削除しています</String>
<String Id="ProgressTextRemoveShortcutsTemplate" Overridable="yes">ショートカット: [1]</String>

ProgressText の Template がなくてもエラーにはならないが、メッセージが表示されなくなるかもしれないので設定しておいたほうがよいだろう。ただし、メッセージによっては Template が設定されいないものがあり、その場合は Template は不要で、設定したが対応するStringがないとエラーになる。

Actionに対応するものは以上で置き換わるが、これだけでは日本語化されないものもある。
たとえば、”Please wait while Windows configures MyApp"があるが、これはWiX toolset で次のように設定されている。



ErrorProgressText.wxs
    <Error Id="20">!(loc.Error20)</Error>

WixUI_en-us.wxl
    <String Id="Error20" Overridable="yes">Please wait while Windows configures [ProductName]</String>

このようなものについては Product.wxsの UI タグに次のように設定を追加する。

 <UI>
    <Error Id="20">!(loc.Error20)</Error>
</UI>

以下 UI タグの設定例。気付いたところだけ対応したもの。また、Actionについては上記Q&Aに含まれていたものを入れてあるので、msiによっては不要なものもある。

<UI>
    <ProgressText Action="FileCost">!(loc.ProgressTextFileCost)</ProgressText>
    <ProgressText Action="InstallFiles" Template="!(loc.ProgressTextInstallFilesTemplate)">!(loc.ProgressTextInstallFiles)</ProgressText>            
    <ProgressText Action="CreateShortcuts" Template="!(loc.ProgressTextCreateShortcutsTemplate)">!(loc.ProgressTextCreateShortcuts)</ProgressText>
    <ProgressText Action="WriteRegistryValues" Template="!(loc.ProgressTextWriteRegistryValuesTemplate)">!(loc.ProgressTextWriteRegistryValues)</ProgressText>
    <ProgressText Action="RegisterUser" Template="!(loc.ProgressTextRegisterUserTemplate)">!(loc.ProgressTextRegisterUser)</ProgressText>
    <ProgressText Action="RegisterProduct" Template="!(loc.ProgressTextRegisterProductTemplate)">!(loc.ProgressTextRegisterProduct)</ProgressText>
    <ProgressText Action="PublishFeatures" Template="!(loc.ProgressTextPublishFeaturesTemplate)">!(loc.ProgressTextPublishFeatures)</ProgressText>
    <ProgressText Action="PublishProduct">!(loc.ProgressTextPublishProduct)</ProgressText>
    <ProgressText Action="RemoveFiles" Template="!(loc.ProgressTextRemoveFilesTemplate)">!(loc.ProgressTextRemoveFiles)</ProgressText>
    <ProgressText Action="RemoveExistingProducts" Template="!(loc.ProgressTextRemoveExistingProductsTemplate)">!(loc.ProgressTextRemoveExistingProducts)</ProgressText>
    <ProgressText Action="RemoveShortcuts" Template="!(loc.ProgressTextRemoveShortcutsTemplate)">!(loc.ProgressTextRemoveShortcuts)</ProgressText>
    <ProgressText Action="Rollback" Template="!(loc.ProgressTextRollbackTemplate)">!(loc.ProgressTextRollback)</ProgressText>
    <ProgressText Action="RollbackCleanup" Template="!(loc.ProgressTextRollbackCleanupTemplate)">!(loc.ProgressTextRollbackCleanup)</ProgressText>
    <Error Id="16">!(loc.Error16)</Error>
    <Error Id="20">!(loc.Error20)</Error>
    <Error Id="21">!(loc.Error21)</Error>
</UI>

でも、これって ErrorProgressText.wxs の一部ですね。ということで、ErrorProgressText.wxs の UI タグの中身をすっかり Product.wxs にコピーしてみた。特に問題はなさそうだ。違いはというと ErrorProgressText.wxs は wixlib のビルド時に適用され、Product.wxs はmsiビルド時に適用されているということだと思う。

関連ブログ

0 件のコメント: