Inno Setup-Selector de idioma con estilos VCL
inno-setup pascalscript (2)
Debe volver a compilar Inno Setup desde la source .
Encuentre este código en el archivo
Main.pas
y mueva esta sección después de
CodeRunner
e
InitializeSetup
.
{ Show "Select Language" dialog if necessary }
if ShowLanguageDialog and (Entries[seLanguage].Count > 1) and
not InitSilent and not InitVerySilent then begin
if not AskForLanguage then
Abort;
end;
¿Hay alguna forma de usar el selector de idioma (Inno Setup) con VCL Styles? ¿Cómo?
El cuadro de diálogo "Seleccionar idioma de configuración" aparece antes de
que
se llame a la
función de evento
InitializeSetup
.
Por lo tanto, no puede cargar la máscara para el diálogo.
Como solución alternativa, puede implementar su propio cuadro de diálogo "idioma" y mostrarlo desde
InitializeSetup
.
De esta manera, el cuadro de diálogo personalizado será desollado.
Una vez que un usuario selecciona un idioma, reinicia el instalador con el
/LANG
para cargar el idioma seleccionado.
Asegúrese de deshabilitar el diálogo de idioma estándar configurando
ShowLanguageDialog
en
no
.
[Setup]
ShowLanguageDialog=no
[Files]
Source: "skin.vsf"; Flags: dontcopy
Source: "VclStyles.dll"; Flags: dontcopy
[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl"
Name: "cs"; MessagesFile: "compiler:Languages/Czech.isl"
[Code]
procedure LoadVCLStyle(VClStyleFile: String);
external ''LoadVCLStyleW@files:VclStyles.dll stdcall setuponly'';
procedure UnLoadVCLStyles;
external ''UnLoadVCLStyles@files:VclStyles.dll stdcall setuponly'';
function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
external ''[email protected] stdcall'';
procedure SelectLanguage();
var
LanguageForm: TSetupForm;
CancelButton: TNewButton;
OKButton: TNewButton;
LangCombo: TNewComboBox;
SelectLabel: TNewStaticText;
Languages: TStrings;
Params: string;
Instance: THandle;
P, I: Integer;
S, L: string;
begin
Languages := TStringList.Create();
Languages.Add(''en=English'');
Languages.Add(''cs=''+#$010C+''e''+#$0161+''tina'');
LanguageForm := CreateCustomForm;
LanguageForm.Caption := SetupMessage(msgSelectLanguageTitle);
LanguageForm.ClientWidth := ScaleX(297);
LanguageForm.ClientHeight := ScaleY(125);
LanguageForm.BorderStyle := bsDialog;
#if Ver < 0x06000000
LanguageForm.Center;
#endif
CancelButton := TNewButton.Create(LanguageForm);
CancelButton.Parent := LanguageForm;
CancelButton.Top := ScaleY(93);
CancelButton.Width := ScaleY(75);
CancelButton.Left := LanguageForm.ClientWidth - CancelButton.Width - ScaleX(16);
CancelButton.Height := ScaleY(23);
CancelButton.TabOrder := 3;
CancelButton.ModalResult := mrCancel;
CancelButton.Caption := SetupMessage(msgButtonCancel);
OKButton := TNewButton.Create(LanguageForm);
OKButton.Parent := LanguageForm;
OKButton.Top := CancelButton.Top;
OKButton.Width := CancelButton.Width;
OKButton.Left := CancelButton.Left - OKButton.Width - ScaleX(8);
OKButton.Height := CancelButton.Height;
OKButton.Caption := SetupMessage(msgButtonOK);
OKButton.Default := True
OKButton.ModalResult := mrOK;
OKButton.TabOrder := 2;
LangCombo := TNewComboBox.Create(LanguageForm);
LangCombo.Parent := LanguageForm;
LangCombo.Left := ScaleX(16);
LangCombo.Top := ScaleY(56);
LangCombo.Width := LanguageForm.ClientWidth - ScaleX(16) * 2;
LangCombo.Height := ScaleY(21);
LangCombo.Style := csDropDownList;
LangCombo.DropDownCount := 16;
LangCombo.TabOrder := 1;
SelectLabel := TNewStaticText.Create(LanguageForm);
SelectLabel.Parent := LanguageForm;
SelectLabel.Left := LangCombo.Left;
SelectLabel.Top := ScaleY(8);
SelectLabel.Width := LangCombo.Width;
SelectLabel.Height := ScaleY(39);
SelectLabel.AutoSize := False
SelectLabel.Caption := SetupMessage(msgSelectLanguageLabel);
SelectLabel.TabOrder := 0;
SelectLabel.WordWrap := True;
for I := 0 to Languages.Count - 1 do
begin
P := Pos(''='', Languages.Strings[I]);
L := Copy(Languages.Strings[I], 0, P - 1);
S := Copy(Languages.Strings[I], P + 1, Length(Languages.Strings[I]) - P);
LangCombo.Items.Add(S);
if L = ActiveLanguage then
LangCombo.ItemIndex := I;
end;
if LanguageForm.ShowModal = mrOK then
begin
{ Collect current instance parameters }
for I := 1 to ParamCount do
begin
S := ParamStr(I);
{ Unique log file name for the elevated instance }
if CompareText(Copy(S, 1, 5), ''/LOG='') = 0 then
begin
S := S + ''-localized'';
end;
{ Do not pass our /SL5 switch }
if CompareText(Copy(S, 1, 5), ''/SL5='') <> 0 then
begin
Params := Params + AddQuotes(S) + '' '';
end;
end;
L := Languages.Strings[LangCombo.ItemIndex];
P := Pos(''='', L);
L := Copy(L, 0, P-1);
{ ... and add selected language }
Params := Params + ''/LANG='' + L;
Instance := ShellExecute(0, '''', ExpandConstant(''{srcexe}''), Params, '''', SW_SHOW);
if Instance <= 32 then
begin
MsgBox(
Format(''Running installer with selected language failed. Code: %d'', [Instance]),
mbError, MB_OK);
end;
end;
end;
function InitializeSetup(): Boolean;
var
Language: string;
begin
ExtractTemporaryFile(''skin.vsf'');
LoadVCLStyle(ExpandConstant(''{tmp}/skin.vsf''));
Result := True;
Language := ExpandConstant(''{param:LANG}'');
if Language = '''' then
begin
Log(''No language specified, showing language dialog'');
SelectLanguage();
Result := False;
Exit;
end
else
begin
Log(''Language specified, proceeding with installation'');
end;
end;
procedure DeinitializeSetup();
begin
UnLoadVCLStyles;
end;
El código de reinicio del instalador se basa en la elevación de los privilegios de solicitud del instalador de Make Inno Setup solo cuando es necesario .