Prise en charge complète du préprocesseur dans les fichiers de langue Inno Setup (isl)

Nov 23 2020

J'utilise trois langues avec mon installateur et pour le moment je fais tous les remplacements dans mon script. Voici un exemple:

[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» для продовження, або «Скасувати» для виходу. 

J'ai beaucoup de messages remplacés dans le script. Je voudrais savoir quel est le moyen le plus efficace de transférer tous ces remplacements dans les .islfichiers en tenant compte du fait que j'ai des directives de préprocesseur {#...}utilisées. Je pourrais utiliser FmtMessage(...), mais cela signifie que je devrais inclure FmtMessage(...)pour chaque message.

Réponses

1 MartinPrikryl Nov 23 2020 at 12:17

Vérifiez d'abord, si certaines des solutions les moins invasives ne couvrent pas vos besoins:
Puis-je utiliser des fichiers .isl pour les messages avec des directives de préprocesseur dans Inno Setup?


Si vous souhaitez une prise en charge complète du préprocesseur dans les fichiers .isl, vous pouvez les transmettre via le préprocesseur Inno Setup:

  • Supprimez le fichier d'inclusion commun ( defines.iss) avec toutes les définitions de variables (et du code de support):

    // Definitions
    #define AppVersion "1.2.3"
    // more definitions ...
    
    // Support code
    #define PreprocessedTranslationFile GetEnv("TEMP") + "\lang.isl"
    #define SavePreprocessedTranslation() SaveToFile(PreprocessedTranslationFile)
    
  • Incluez ce fichier au début de votre .iss et de tous vos .isl:

    #include "defines.iss"
    
  • Appelez SavePreprocessedTranslationà la fin de tous vos .isl:

    #expr SavePreprocessedTranslation()
    
  • Effectuez l'appel du préprocesseur isccsur les fichiers .isl modifiés. Cela échouera bien sûr, car le .isl n'est pas un .iss valide, mais la partie préprocesseur de isccdevrait terminer et créer le fichier .isl prétraité.

    #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]
    
  • Et utilisez les fichiers .isl prétraités dans la [Languages]section.

    [Languages]
    Name: "en"; MessagesFile: {#PreprocessLanguage("Default.isl")}
    Name: "nl"; MessagesFile: {#PreprocessLanguage("Dutch.isl")}
    

Si vous rencontrez des problèmes, définissez DebugPreprocessLanguagesur 1pour afficher la sortie du préprocesseur .isl.

Vous pouvez même améliorer le processus en faisant en sorte que le préprocesseur ajoute automatiquement les #include "defines.iss"et #expr SavePreprocessedTranslation()aux .isl avant d'appeler le iscc.