Puis-je utiliser des fichiers .isl pour les messages avec des directives de préprocesseur dans Inno Setup?
J'ai défini une variable:
#define AppVersion "5.0"
Il y a beaucoup de messages standard du Default.isl
fichier remplacés dans la section `[Messages] de mon script. Voici un exemple:
[Messages]
en.WelcomeLabel1=Welcome to [name] {#AppVersion} Setup program. This program will install [name] {#AppVersion} on your computer.
en.SelectDirDesc=Where should [name] {#AppVersion} be installed?
en.SelectDirLabel3=Setup will install [name] {#AppVersion} into the following folder.
Je n'aime pas le fait que tous ces messages résident dans mon script et j'aimerais les transférer dans le .isl
fichier correspondant . Le problème est que je ne peux pas utiliser {#AppVersion}
à l'intérieur du .isl
fichier car il est interprété comme un simple texte. Existe-t-il un moyen de remplacer ces messages dans le .isl
fichier en tenant compte du fait qu'ils contiennent {#AppVersion}
?
Réponses
Pour ce cas précis, le nom et la version de l'application, il existe une solution simple:
comment réécrire des messages prédéfinis pour WelcomePage dans différentes langues dans Inno Setup?Si vous avez besoin d'injecter une petite quantité d'autres informations, voir ci-dessous.
Pour une solution ultime, voir Prise en charge complète du préprocesseur dans les fichiers de langue Inno Setup (isl)
Notez que tout cela serait exagéré pour les messages personnalisés. Pour ceux-ci, il existe des solutions plus simples: Comment puis-je utiliser des fichiers de langue avec des messages personnalisés avec des constantes de préprocesseur?
Si vous avez besoin d'injecter des informations personnalisées, vous pouvez prétraiter les fichiers .isl comme ceci:
#define Token1 "value1"
#define Token2 "value2"
#define PreprocessLanguage(Path) \
Local[0] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \
Local[1] = \
"-ExecutionPolicy Bypass -Command """ + \
"$contents = Get-Content '" + CompilerPath + "\" + Path + "'; " + \ "$contents = $contents -replace '[token1]', '" + Token1 +"'; " + \ "$contents = $contents -replace '[token2]', '" + Token2 +"'; " + \ "Set-Content -Path '" + Local[0] + "' -Value $contents;" + \
"""", \
Exec("powershell.exe", Local[1], , , SW_HIDE), \
Local[0]
[Languages]
Name: "en"; MessagesFile: {#PreprocessLanguage("Default.isl")}
Name: "nl"; MessagesFile: {#PreprocessLanguage("Languages\Dutch.isl")}
L'exemple ci-dessus remplace toutes les occurrences de [token1]
et [token2]
par des valeurs de Token1
et de Token2
variables de préprocesseur.
En théorie, il est possible de mettre en œuvre cette pleinement dans le préprocesseur sans invoquer PowerShell, avec l' utilisation de FileOpen, FileRead, StringChangeet SaveStringToFilefonctions.
#define Token1 "value1"
#define Token2 "value2"
#define PreprocessLanguageLines(Handle, OutPath) \
!FileEof(Handle) ? \
Local[0] = FileRead(Handle), \
Local[0] = StringChange(Local[0], "[token1]", Token1), \
Local[0] = StringChange(Local[0], "[token1]", Token2), \
SaveStringToFile(OutPath, Local[0] + NewLine, 1, 0), \
PreprocessLanguageLines(Handle, OutPath) \
: ""
#define PreprocessLanguage(Path) \
Local[0] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \
SaveStringToFile(Local[0], "", 0, 0), \
Local[1] = FileOpen(CompilerPath + "\" + Path), \
PreprocessLanguageLines(Local[1], Local[0]), \
FileClose(Local[1]), \
Local[0]
Mais avec l'approche fonctionnelle simple, vous atteindrez la limite de récursivité du préprocesseur car les fichiers de langue ont trop de lignes. Cela peut être résolu en lisant plusieurs lignes par récursivité, mais c'est un hack.
Avec l'utilisation du #sub
, cela devrait fonctionner. Mais c'est un gâchis.