inno setup - इनो सेटअप-वीसीएल स्टाइल्स के साथ भाषा चयनकर्ता




inno-setup pascalscript (2)

"सेटअप भाषा चुनें" डायलॉग को InitializeSetup इवेंट फ़ंक्शन को कॉल करने से पहले प्रदर्शित करता है। इसलिए आप संवाद के लिए त्वचा को लोड नहीं कर सकते।

एक वर्कअराउंड के रूप में, आप अपनी खुद की "भाषा" संवाद को लागू कर सकते हैं, और InitializeSetup से प्रदर्शित InitializeSetup । इस तरह से कस्टम डायलॉग को चमकाया जाएगा। जब कोई उपयोगकर्ता किसी भाषा का चयन करता है, तो आप चयनित भाषा को लोड करने के लिए /LANG स्विच के साथ इंस्टॉलर को पुनः आरंभ करते हैं।

सुनिश्चित करें कि आप ShowLanguageDialog को 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 '[email protected]:VclStyles.dll stdcall setuponly';
procedure UnLoadVCLStyles;
  external '[email protected]: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;

इंस्टॉलर री-लॉन्च कोड मेक इनो सेटअप इंस्टॉलर के अनुरोध पर आधारित है जो केवल जरूरत पड़ने पर विशेषाधिकार बढ़ाता है ।

क्या वीसीएल स्टाइल्स के साथ भाषा चयनकर्ता (इनो सेटअप) का उपयोग करने का कोई तरीका है? कैसे?


आपको इनो सेटअप को source से पुनः स्थापित करने की आवश्यकता है।

इस कोड को Main.pas फ़ाइल में खोजें और CodeRunner और InitializeSetup बाद इस अनुभाग को स्थानांतरित 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;