inno-setup pascalscript

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 .