Pełna obsługa preprocesorów w plikach językowych Inno Setup (isl)
Używam trzech języków z moim instalatorem i w tej chwili wykonuję wszystkie nadpisania w moim skrypcie. Oto przykład:
[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» для продовження, або «Скасувати» для виходу.
Mam wiele wiadomości nadpisanych w skrypcie. Chciałbym wiedzieć, jaki jest najskuteczniejszy sposób przeniesienia wszystkich tych nadpisań do .isl
plików, biorąc pod uwagę, że mam {#...}
używane dyrektywy preprocesora . Mógłbym użyć FmtMessage(...)
, ale to oznacza, że musiałbym dołączyć FmtMessage(...)
do każdej wiadomości.
Odpowiedzi
Najpierw sprawdź, czy niektóre z mniej inwazyjnych rozwiązań mogą nie zaspokoić twoich potrzeb:
Czy mogę używać plików .isl do wiadomości z dyrektywami preprocesora w Inno Setup?
Jeśli chcesz mieć pełną obsługę preprocesora w plikach .isl, możesz przekazać je przez rzeczywisty preprocesor Inno Setup:
Uwzględnij wspólne pliki include file (
defines.iss
) ze wszystkimi definicjami zmiennych (i częścią kodu pomocniczego):// Definitions #define AppVersion "1.2.3" // more definitions ... // Support code #define PreprocessedTranslationFile GetEnv("TEMP") + "\lang.isl" #define SavePreprocessedTranslation() SaveToFile(PreprocessedTranslationFile)
Dołącz ten plik na początku pliku .iss i wszystkich plików .isl:
#include "defines.iss"
Zadzwoń
SavePreprocessedTranslation
pod koniec wszystkich swoich .isl:#expr SavePreprocessedTranslation()
Wykonaj wywołanie preprocesora
iscc
dla zmodyfikowanych plików .isl. Oczywiście nie powiedzie się, ponieważ .isl nie jest prawidłowym plikiem .iss, ale część preprocesoraiscc
powinna zakończyć i utworzyć wstępnie przetworzony plik .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]
I użyj wstępnie przetworzonych plików .isl w
[Languages]
sekcji.[Languages] Name: "en"; MessagesFile: {#PreprocessLanguage("Default.isl")} Name: "nl"; MessagesFile: {#PreprocessLanguage("Dutch.isl")}
Jeśli masz problemy, zestaw DebugPreprocessLanguage
do 1
zobaczyć wyjście .isl preprocesora.
Możesz nawet ulepszyć ten proces, sprawiając, że preprocesor automatycznie dodaje #include "defines.iss"
i #expr SavePreprocessedTranslation()
do .isl przed wywołaniem iscc
.