Inno Setup言語ファイル(isl)での完全なプリプロセッササポート

Nov 23 2020

私はインストーラーで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(...)はすべてのメッセージに含める必要があることを意味します。

回答

1 MartinPrikryl Nov 23 2020 at 12:17

最初に、侵襲性の低いソリューションのいくつかがニーズをカバーできない可能性があるかどうかを確認し
ます。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ます。