Inno Setup言語ファイル(isl)での完全なプリプロセッササポート
私はインストーラーで3つの言語を使用しており、現時点ではスクリプト内ですべてのオーバーライドを行っています。次に例を示します。
[Messages]
en.SetupWindowTitle=Setup - %1 {#AppVersion}
ru.SetupWindowTitle=Установка - %1 {#AppVersion}
ua.SetupWindowTitle=Встановлення - %1 {#AppVersion}
en.SetupAppRunningError=Setup has detected that {#SetupSetting('VersionInfoOriginalFileName')} is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit.
ru.SetupAppRunningError=Обнаружен запущенный экземпляр {#SetupSetting('VersionInfoOriginalFileName')}.%n%nПожалуйста, закройте все экземпляры приложения, затем нажмите «OK», чтобы продолжить, или «Отмена», чтобы выйти.
ua.SetupAppRunningError=Виявлено запущений екземпляр {#SetupSetting('VersionInfoOriginalFileName')}.%n%nБудь ласка, закрийте всі копії програми та натисніть «OK» для продовження, або «Скасувати» для виходу.
[CustomMessages]
en.AppRunningError=Setup has detected that {#AppExeName} is currently running.%n%nPlease, close the {#AppExeName} application, then click «OK» to continue or «Cancel» to exit.
ru.AppRunningError=В памяти находится {#AppExeName}.%n%nЗавершите работу {#AppExeName} и нажмите «OK», чтобы продолжить, или «Отмена», чтобы выйти.
ua.AppRunningError=В пам'яті знаходиться {#AppExeName}.%n%nЗавершіть роботу {#AppExeName} та натисніть «OK» для продовження, або «Скасувати» для виходу.
スクリプト内でオーバーライドされたメッセージがたくさんあります。.isl
プリプロセッサディレクティブを{#...}
使用していることを考慮して、これらすべてのオーバーライドをファイルに転送する最も効果的な方法を知りたいです。を使用することもできますがFmtMessage(...)
、それFmtMessage(...)
はすべてのメッセージに含める必要があることを意味します。
回答
最初に、侵襲性の低いソリューションのいくつかがニーズをカバーできない可能性があるかどうかを確認し
ます。InnoSetupでプリプロセッサディレクティブを使用してメッセージに.islファイルを使用できますか?
.islファイルで完全なプリプロセッササポートが必要な場合は、実際のInnoSetupプリプロセッサに渡すことができます。
defines.iss
すべての変数定義(およびいくつかのサポートコード)を含む一般的なインクルードファイル()を除外します。// Definitions #define AppVersion "1.2.3" // more definitions ... // Support code #define PreprocessedTranslationFile GetEnv("TEMP") + "\lang.isl" #define SavePreprocessedTranslation() SaveToFile(PreprocessedTranslationFile)
.issとすべての.islの先頭にそのファイルを含めます。
#include "defines.iss"
SavePreprocessedTranslation
すべての.islの最後に電話してください:#expr SavePreprocessedTranslation()
iscc
変更された.islファイルに対してプリプロセッサ呼び出しを行います。.islは有効な.issではないため、もちろん失敗しますが、のプリプロセッサ部分がiscc
完了し、前処理された.islファイルを作成する必要があります。#define DebugPreprocessLanguage 0 #define PreprocessLanguage(Path) \ Local[0] = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe", \ DeleteFileNow(PreprocessedTranslationFile), \ Local[1] = DebugPreprocessLanguage ? SourcePath + "\islpreprocess.log" : "nul", \ Local[2] = "/C """"" + Local[0] + """ """ + Path + """ " + \ ">> " + Local[1] + " 2>&1 """, \ Exec("cmd", Local[2], SourcePath, , SW_HIDE), \ (FileExists(PreprocessedTranslationFile) || \ Error(Path + " failed to preprocess")), \ Local[3] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \ CopyFile(PreprocessedTranslationFile, Local[3]), \ DeleteFileNow(PreprocessedTranslationFile), \ Local[3]
そして、
[Languages]
セクションで前処理された.islファイルを使用します。[Languages] Name: "en"; MessagesFile: {#PreprocessLanguage("Default.isl")} Name: "nl"; MessagesFile: {#PreprocessLanguage("Dutch.isl")}
問題がある場合は、.islプリプロセッサの出力を表示DebugPreprocessLanguage
する1
ように設定します。
を呼び出す前に、プリプロセッサに#include "defines.iss"
と#expr SavePreprocessedTranslation()
を.islに自動的に追加させることで、プロセスを改善することもできiscc
ます。