Inno Setupでプリプロセッサディレクティブを使用してメッセージに.islファイルを使用できますか?
変数を定義しました:
#define AppVersion "5.0"
Default.isl
スクリプトの `[Messages]セクションで上書きされたファイルからの標準メッセージがたくさんあります。次に例を示します。
[Messages]
en.WelcomeLabel1=Welcome to [name] {#AppVersion} Setup program. This program will install [name] {#AppVersion} on your computer.
en.SelectDirDesc=Where should [name] {#AppVersion} be installed?
en.SelectDirLabel3=Setup will install [name] {#AppVersion} into the following folder.
これらのメッセージがすべてスクリプトに含まれているのは気に入らないので、対応する.isl
ファイルに転送したいと思います。問題は{#AppVersion}
、.isl
ファイルが単純なテキストとして解釈されるため、ファイル内で使用できないことです。.isl
それらが含まれていることを考慮に入れて、ファイル内のそれらのメッセージをオーバーライドする方法はあります{#AppVersion}
か?
回答
この特定のケース、アプリケーション名とバージョンには、簡単な解決策があり
ます。InnoSetupでWelcomePageの事前定義されたメッセージをさまざまな言語で書き換えるにはどうすればよいですか?他の少量の情報を挿入する必要がある場合は、以下を参照してください。
究極の解決策については、Inno Setup言語ファイル(isl)の完全なプリプロセッササポートを参照してください。
これはすべて、カスタムメッセージにとってやり過ぎになることに注意してください。それらのために、より簡単な解決策があります:プリプロセッサ定数を持つカスタムメッセージで言語ファイルを使用するにはどうすればよいですか?
カスタム情報を挿入する必要がある場合は、次のように.islファイルを前処理できます。
#define Token1 "value1"
#define Token2 "value2"
#define PreprocessLanguage(Path) \
Local[0] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \
Local[1] = \
"-ExecutionPolicy Bypass -Command """ + \
"$contents = Get-Content '" + CompilerPath + "\" + Path + "'; " + \
"$contents = $contents -replace '[token1]', '" + Token1 +"'; " + \
"$contents = $contents -replace '[token2]', '" + Token2 +"'; " + \
"Set-Content -Path '" + Local[0] + "' -Value $contents;" + \
"""", \
Exec("powershell.exe", Local[1], , , SW_HIDE), \
Local[0]
[Languages]
Name: "en"; MessagesFile: {#PreprocessLanguage("Default.isl")}
Name: "nl"; MessagesFile: {#PreprocessLanguage("Languages\Dutch.isl")}
上記の例では、[token1]
およびのすべてのオカレンス[token2]
をToken1
およびToken2
プリプロセッサ変数の値に置き換えています。
理論的には、を使用して、PowerShellを起動せずに、プリプロセッサで完全にこれを実装することが可能であるFileOpen
、 FileRead
、StringChange
、およびSaveStringToFile
機能。
#define Token1 "value1"
#define Token2 "value2"
#define PreprocessLanguageLines(Handle, OutPath) \
!FileEof(Handle) ? \
Local[0] = FileRead(Handle), \
Local[0] = StringChange(Local[0], "[token1]", Token1), \
Local[0] = StringChange(Local[0], "[token1]", Token2), \
SaveStringToFile(OutPath, Local[0] + NewLine, 1, 0), \
PreprocessLanguageLines(Handle, OutPath) \
: ""
#define PreprocessLanguage(Path) \
Local[0] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \
SaveStringToFile(Local[0], "", 0, 0), \
Local[1] = FileOpen(CompilerPath + "\" + Path), \
PreprocessLanguageLines(Local[1], Local[0]), \
FileClose(Local[1]), \
Local[0]
しかし、単純な機能的アプローチでは、言語ファイルの行数が多すぎるため、プリプロセッサの再帰制限に達します。再帰ごとに複数の行を読み取ることで解決できますが、それはハックです。
を使用すると#sub
、動作するはずです。しかし、それは混乱です。