'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.



Solution 1:[1]

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";   

Solution 2:[2]

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:

Solution 3:[3]

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
  if not (ExpandConstant('{param:LANG}') = '') then Result := True;
end;

function IsActiveLang: Boolean;
begin
  if (LangArray[LangCombo.ItemIndex] = ActiveLanguage) then Result := True;
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
  if (PageID = wpWelcome) and IsSetLang then Result := True;
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.

Solution 4:[4]

In df.pivot when index parameter is not passed df.index is used as default. Hence, the output.

index: str or object or a list of str, optional

  • Column to use to make new frame’s index. If None, uses existing index.

To get the desired output. You'd have to create a new index column like below.

df.assign(idx=df.index // 2).pivot(
    index="idx", columns="name", values="returnattribute"
)

# name Customer Code        Customer Name
# idx                                    
# 0          CGLOSPA    Customer One Name
# 1          COTHABA    Customer Two Name
# 2          CGLOADS  Customer Three Name
# 3       CAPRCANBRA   Customer Four Name
# 4          COTHAMO   Customer Five Name

Since every two rows represent one data point. You can reshape the data and build the required dataframe.

reshaped = df['returnattribute'].to_numpy().reshape(-1, 2)
# array([['Customer One Name', 'CGLOSPA'],
#        ['Customer Two Name', 'COTHABA'],
#        ['Customer Three Name', 'CGLOADS'],
#        ['Customer Four Name', 'CAPRCANBRA'],
#        ['Customer Five Name', 'COTHAMO']], dtype=object)

col_names = pd.unique(df.name)
# array(['Customer Name', 'Customer Code'], dtype=object)

out = pd.DataFrame(reshaped, columns=col_names)

#          Customer Name Customer Code
# 0    Customer One Name       CGLOSPA
# 1    Customer Two Name       COTHABA
# 2  Customer Three Name       CGLOADS
# 3   Customer Four Name    CAPRCANBRA
# 4   Customer Five Name       COTHAMO

# we can reorder the columns using reindex.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Martin Prikryl
Solution 2
Solution 3
Solution 4