Change the setup language while setup is running (Inno Setup)

How to add the choice of language to the first page, as it is shown in the video?

http://screencast.com/t/SDI5VN67LFL

enter image description here

Thank you all in advance for your help.

Upvotes: 0

Views: 1391

Answers (3)

yonni
yonni

Reputation: 352

Based on the code in this answer, it does what you wanted:

[Setup]
DisableWelcomePage=False
ShowLanguageDialog=no
{...}

[Languages]
Name: "English"; MessagesFile: "compiler:Default.isl"
Name: "French"; MessagesFile: "compiler:Languages\French.isl"
Name: "German"; MessagesFile: "compiler:Languages\German.isl"
Name: "Spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
//Add languages as you like ...
{...}

[Code]
var
  LangCombo: TNewComboBox;
  SelectLangLabel: TNewStaticText;
  LangArray: Array of String;
  IsConfirm: Boolean;

function ShellExecute(hwnd: HWND; lpOperation, lpFile, lpParameters, lpDirectory: String; nShowCmd: Integer): THandle;
external '[email protected] stdcall';

function IsSetLang: Boolean;
begin
  Result := (ExpandConstant('{param:LANG}') = '');
end;

function IsActiveLang: Boolean;
begin
  Result := (LangArray[LangCombo.ItemIndex] = ActiveLanguage);
end;

function ActiveLang: Integer;
var
  I: Integer;
begin
  for I := 0 to (GetArrayLength(LangArray) - 1) do
  begin
    if (LangArray[I] = ActiveLanguage) then Result := I;
  end;
end;

procedure InitializeWizard;
begin
  IsConfirm := True;

  LangCombo := TNewComboBox.Create(WizardForm);
  LangCombo.Parent := WizardForm.WelcomePage;
  LangCombo.Top := WizardForm.Bevel.Top - LangCombo.Height - ScaleY(55);
  LangCombo.Left := WizardForm.WelcomeLabel1.Left;
  LangCombo.Width := WizardForm.WelcomeLabel1.Width;
  LangCombo.Style := csDropDownList;

  SelectLangLabel := TNewStaticText.Create(WizardForm);
  SelectLangLabel.Parent := WizardForm.WelcomePage;
  SelectLangLabel.Top := LangCombo.Top - SelectLangLabel.Height - ScaleY(8);
  SelectLangLabel.Left := LangCombo.Left;
  SelectLangLabel.Caption := SetupMessage(msgSelectLanguageLabel);

  LangCombo.Items.Add('English'); //ItemIndex: 0 - English
  LangCombo.Items.Add('Français'); //ItemIndex: 1 - French
  LangCombo.Items.Add('Deutsch'); //ItemIndex: 2 - German
  LangCombo.Items.Add('Español'); //ItemIndex: 3 - Spanish
  //Add languages as you like, but make sure the order matches the order of the languages in the array.

  SetArrayLength(LangArray,LangCombo.Items.Count);

  LangArray[0] := 'English'; //=ItemIndex: 0
  LangArray[1] := 'French'; //=ItemIndex: 1
  LangArray[2] := 'German'; //=ItemIndex: 2
  LangArray[3] := 'Spanish'; //=ItemIndex: 3
  //Add languages as you like, but make sure the order matches the order of the languages in the combobox.

  LangCombo.ItemIndex := ActiveLang; //set default language as active language
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ResultCode: THandle;
begin
  Result := True;
  if (CurPageID = wpWelcome) and not IsActiveLang then
  begin
    Result := False;
    IsConfirm := False;
    ResultCode := ShellExecute(0,'',ExpandConstant('{srcexe}'),'/LANG='+LangArray[LangCombo.ItemIndex],'',SW_SHOW);
    if ResultCode <= 32 then MsgBox(Format('Running installer with the selected language failed. Code: %d',[ResultCode]), mbCriticalError, MB_OK);
    WizardForm.Close;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := (PageID = wpWelcome) and IsSetLang;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Cancel := True;
  Confirm := IsConfirm;
end;

combobox of languages in WelcomePage

This code demonstrates how to create a language combobox on the WelcomePage, but can of course be replaced with any other or custom page.

Upvotes: 0

Martin Prikryl
Martin Prikryl

Reputation: 202118

You cannot change the language on Inno Setup installer while it is running. The installer on the video must be using some custom build of Inno Setup.

But you can re-start the installer with a new language. See these related questions:

Upvotes: 0

CAD Developer
CAD Developer

Reputation: 1697

Try this:

[Setup]
ShowLanguageDialog=yes
ShowUndisplayableLanguages=yes

[Languages]
Name: "cz"; MessagesFile: "compiler:Languages\Czech.isl";   
Name: "de"; MessagesFile: "compiler:Languages\German.isl";  
Name: "en"; MessagesFile: "compiler:Default.isl";   

Upvotes: 0

Related Questions