Inno Setupでプリプロセッサディレクティブを使用してメッセージに.islファイルを使用できますか?

Nov 20 2020

変数を定義しました:

#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}か?

回答

1 MartinPrikryl Nov 20 2020 at 15:49

カスタム情報を挿入する必要がある場合は、次のように.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を起動せずに、プリプロセッサで完全にこれを実装することが可能であるFileOpenFileReadStringChange、および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、動作するはずです。しかし、それは混乱です。