Inno Setup 언어 파일 (isl)에서 전체 전 처리기 지원

Nov 23 2020

설치 프로그램에서 세 가지 언어를 사용하며 현재 스크립트 내에서 모든 재정의를 수행하고 있습니다. 예를 들면 다음과 같습니다.

[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

먼저 덜 침습적 인 솔루션 중 일부가 귀하의 요구를 충족하지 못할 수 있는지 확인하십시오.
Inno Setup에서 전 처리기 지시문이있는 메시지에 .isl 파일을 사용할 수 있습니까?


.isl 파일에서 완전한 전처리기를 지원하려면 실제 Inno Setup 전처리기를 통해 전달할 수 있습니다.

  • 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")}
    

당신은 문제가있는 경우, 세트 DebugPreprocessLanguage하는 1의 .isl 처리기 출력을 볼 수 있습니다.

당신은 전처리를 추가함으로써 프로세스를 개선 할 수 #include "defines.iss"#expr SavePreprocessedTranslation()를 호출하기 전에의 .isl의 자동 iscc.