Volle Präprozessorunterstützung in Inno Setup-Sprachdateien (isl)
Ich verwende mit meinem Installationsprogramm drei Sprachen und mache im Moment alle Überschreibungen in meinem Skript. Hier ist ein Beispiel:
[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» для продовження, або «Скасувати» для виходу.
Ich habe viele Nachrichten im Skript überschrieben. Ich möchte wissen, wie ich all diese Überschreibungen am effektivsten in die .isl
Dateien übertragen kann, wenn ich die Präprozessor-Direktiven {#...}
verwende. Ich könnte verwenden FmtMessage(...)
, aber das bedeutet, dass ich FmtMessage(...)
für jede einzelne Nachricht einschließen müsste .
Antworten
Überprüfen Sie zunächst, ob einige der weniger invasiven Lösungen möglicherweise nicht Ihren Anforderungen entsprechen:
Kann ich in Inno Setup .isl-Dateien für die Nachrichten mit Präprozessoranweisungen verwenden?
Wenn Sie eine vollständige Präprozessorunterstützung in .isl-Dateien wünschen, können Sie diese über den eigentlichen Inno Setup-Präprozessor weiterleiten:
Berücksichtigen Sie die gemeinsame Include-Datei (
defines.iss
) mit allen Variablendefinitionen (und einigen Unterstützungscodes):// Definitions #define AppVersion "1.2.3" // more definitions ... // Support code #define PreprocessedTranslationFile GetEnv("TEMP") + "\lang.isl" #define SavePreprocessedTranslation() SaveToFile(PreprocessedTranslationFile)
Fügen Sie diese Datei am Anfang Ihrer .iss und aller Ihrer .isl ein:
#include "defines.iss"
Rufen Sie
SavePreprocessedTranslation
am Ende aller Ihrer .isl's an:#expr SavePreprocessedTranslation()
iscc
Führen Sie den Präprozessoraufruf für die geänderten .isl-Dateien durch. Es wird natürlich fehlschlagen, da die .isl keine gültige .iss ist, aber der Präprozessor-Teil voniscc
sollte die vorverarbeitete .isl-Datei vervollständigen und erstellen.#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]
Und verwenden Sie die vorverarbeiteten .isl-Dateien im
[Languages]
Abschnitt.[Languages] Name: "en"; MessagesFile: {#PreprocessLanguage("Default.isl")} Name: "nl"; MessagesFile: {#PreprocessLanguage("Dutch.isl")}
Wenn Sie Probleme haben, setzen Sie DebugPreprocessLanguage
auf , 1
um zu sehen , die .isl Präprozessorausgabe.
Sie können den Prozess sogar verbessern, indem Sie den Präprozessor dazu bringen, das #include "defines.iss"
und #expr SavePreprocessedTranslation()
automatisch zu den .isls hinzuzufügen, bevor Sie das aufrufen iscc
.