Вопрос Как сделать кнопку смены языка в инсталляторе?

ExPlayer

Старожил
Доброго времени суток! Хотелось бы узнать, как можно добавить кнопку смены языка в самом инсталляторе, т.е. чтобы у человека нажавшего на эту кнопку поменялся бы язык к примеру с русского на английский (т.е. название всех лейблов, текстов и название кнопок)?
 
Код:
[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
ShowLanguageDialog=auto

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Default.isl

[CustomMessages]
; Русский
rusButtonBack=< &Назад
rusButtonNext=&Далее >
rusButtonCancel=Отмена
rusSetupWindowTitle=Установка — %1
rusWelcomeLabel1=Вас приветствует Мастер установки %1
rusWelcomeLabel2=Программа установит %1, версия %2 на Ваш компьютер.%n%nРекомендуется закрыть все прочие приложения перед тем, как продолжить.%n%nНажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

; English
engButtonBack=< &Back
engButtonNext=&Next >
engButtonCancel=Cancel
engSetupWindowTitle=Setup — %1
engWelcomeLabel1=Welcome to the %1 Setup Wizard
engWelcomeLabel2=This will install %1 version %2 on your computer.%n%nIt is recommended that you close all other applications before continuing.%n%nClick Next to continue, or Cancel to exit Setup.

[Code]
var
  lang: String;
  langBtn: TButton;

procedure ChangeLang();
begin
  WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
  WizardForm.NextButton.Caption:= CustomMessage(lang+'ButtonNext');
  WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
  WizardForm.Caption:= FmtMessage(CustomMessage(lang+'SetupWindowTitle'), ['{#SetupSetting('AppName')}']);
  WizardForm.WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
  WizardForm.WelcomeLabel2.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel2'), ['{#SetupSetting('AppName')}', '{#SetupSetting('AppVersion')}']);
end;

procedure LangBtnClick(Sender: TObject);
begin
  if lang='rus' then begin
    lang:= 'eng';
    langBtn.Caption:= 'рус';
  end else begin
    lang:= 'rus';
    langBtn.Caption:= 'eng';
  end;
  ChangeLang();
end;

procedure InitializeWizard;
begin
  langBtn:= TButton.Create(WizardForm);
  with langBtn do begin
    SetBounds(10,WizardForm.CancelButton.Top,30,WizardForm.CancelButton.Height)
    OnClick:= @LangBtnClick;
    Parent:= WizardForm;
  end;

  if ActiveLanguage='rus' then begin
    lang:= 'rus';
    langBtn.Caption:= 'eng';
  end else begin
    lang:= 'eng';
    langBtn.Caption:= 'рус';
  end;
end;
 
Код:
[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
ShowLanguageDialog=auto

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Default.isl

[CustomMessages]
; Русский
rusButtonBack=< &Назад
rusButtonNext=&Далее >
rusButtonCancel=Отмена
rusSetupWindowTitle=Установка — %1
rusWelcomeLabel1=Вас приветствует Мастер установки %1
rusWelcomeLabel2=Программа установит %1, версия %2 на Ваш компьютер.%n%nРекомендуется закрыть все прочие приложения перед тем, как продолжить.%n%nНажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

; English
engButtonBack=< &Back
engButtonNext=&Next >
engButtonCancel=Cancel
engSetupWindowTitle=Setup — %1
engWelcomeLabel1=Welcome to the %1 Setup Wizard
engWelcomeLabel2=This will install %1 version %2 on your computer.%n%nIt is recommended that you close all other applications before continuing.%n%nClick Next to continue, or Cancel to exit Setup.

[Code]
var
  lang: String;
  langBtn: TButton;

procedure ChangeLang();
begin
  WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
  WizardForm.NextButton.Caption:= CustomMessage(lang+'ButtonNext');
  WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
  WizardForm.Caption:= FmtMessage(CustomMessage(lang+'SetupWindowTitle'), ['{#SetupSetting('AppName')}']);
  WizardForm.WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
  WizardForm.WelcomeLabel2.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel2'), ['{#SetupSetting('AppName')}', '{#SetupSetting('AppVersion')}']);
end;

procedure LangBtnClick(Sender: TObject);
begin
  if lang='rus' then begin
    lang:= 'eng';
    langBtn.Caption:= 'рус';
  end else begin
    lang:= 'rus';
    langBtn.Caption:= 'eng';
  end;
  ChangeLang();
end;

procedure InitializeWizard;
begin
  langBtn:= TButton.Create(WizardForm);
  with langBtn do begin
    SetBounds(10,WizardForm.CancelButton.Top,30,WizardForm.CancelButton.Height)
    OnClick:= @LangBtnClick;
    Parent:= WizardForm;
  end;

  if ActiveLanguage='rus' then begin
    lang:= 'rus';
    langBtn.Caption:= 'eng';
  end else begin
    lang:= 'eng';
    langBtn.Caption:= 'рус';
  end;
end;

Спасибо, обязательно попробую. Прошу пока не закрывать тему.
 
а как быть если такой лейбл:
кто нибудь имеет пример с адаптацией под такие лейблы?
Код:
  WelcomeLabel1:= TLabel.Create(WizardForm);
  with WelcomeLabel1 do begin
    Parent:=WizardForm;
    AutoSize:=False;
    Transparent:=True;
    SetBounds(ScaleX(15), ScaleY(15), ScaleX(535), ScaleY(50));
    Font.Size:= 10;
    WordWrap:=True;
    Caption:=ExpandConstant('{cm:Welcome1}');
    OnMouseDown:=@FrameMouseDown;
  end;
 
Tjeyn,
Код:
[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
ShowLanguageDialog=auto

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Default.isl

[CustomMessages]
; Русский
rusButtonBack=< &Назад
rusButtonNext=&Далее >
rusButtonCancel=Отмена
rusSetupWindowTitle=Установка — %1
rusWelcomeLabel1=Вас приветствует Мастер установки %1
rusWelcomeLabel2=Программа установит %1, версия %2 на Ваш компьютер.%n%nРекомендуется закрыть все прочие приложения перед тем, как продолжить.%n%nНажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

; English
engButtonBack=< &Back
engButtonNext=&Next >
engButtonCancel=Cancel
engSetupWindowTitle=Setup — %1
engWelcomeLabel1=Welcome to the %1 Setup Wizard
engWelcomeLabel2=This will install %1 version %2 on your computer.%n%nIt is recommended that you close all other applications before continuing.%n%nClick Next to continue, or Cancel to exit Setup.

[Code]
var
lang: String;
langBtn: TButton;
WelcomeLabel1:TLAbel;

procedure ChangeLang();
begin
WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
WizardForm.NextButton.Caption:= CustomMessage(lang+'ButtonNext');
WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
WizardForm.Caption:= FmtMessage(CustomMessage(lang+'SetupWindowTitle'), ['{#SetupSetting('AppName')}']);
WizardForm.WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
WizardForm.WelcomeLabel2.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel2'), ['{#SetupSetting('AppName')}', '{#SetupSetting('AppVersion')}']);
WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
end;

procedure LangBtnClick(Sender: TObject);
begin
if lang='rus' then begin
lang:= 'eng';
langBtn.Caption:= 'рус';
end else begin
lang:= 'rus';
langBtn.Caption:= 'eng';
end;
ChangeLang();
end;

procedure InitializeWizard;
begin
langBtn:= TButton.Create(WizardForm);
with langBtn do begin
SetBounds(10,WizardForm.CancelButton.Top,30,WizardForm.CancelButton.Height)
OnClick:= @LangBtnClick;
Parent:= WizardForm;
end;

WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do begin
Parent:=WizardForm;
AutoSize:=False;
Transparent:=True;
SetBounds(ScaleX(45), ScaleY(330), ScaleX(535), ScaleY(50));
Font.Size:= 10;
WordWrap:=True;
Caption:= FmtMessage(CustomMessage(lang+'rusWelcomeLabel1'), ['{#SetupSetting('AppName')}']);
// OnMouseDown:=@FrameMouseDown;
end;

if ActiveLanguage='rus' then begin
lang:= 'rus';
langBtn.Caption:= 'eng';
end else begin
lang:= 'eng';
langBtn.Caption:= 'рус';
end;
end;
 
Спасибо, но язык меняют лишь те лейблы, которые в скрипте прописаны, а остальные что берутся из файла "Russian.isl" и "English.isl" не изменяются
 
Tjeyn, естественно, ведь в Inno нет функции смены языка на лету. Это уже самодельщина.
 
nik1967, то есть нужно все лейблы копировать из файла языка в скрипт или есть другое решение?
 
Tjeyn, не лейблы, а их значения, и не все, но большинство. Другого решения на данный момент не знаю.
 
nik1967, ну пусть будет так уже, может со временем найду другое решение, но еще не подскажете как этот пример адаптировать под ISDone?
 
Tjeyn,
Код:
[setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}
ShowLanguageDialog=auto

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Default.isl

[CustomMessages]
; Русский
rusButtonBack=< &Назад
rusButtonNext=&Далее >
rusButtonCancel=Отмена
rusSetupWindowTitle=Установка — %1
rusWelcomeLabel1=Вас приветствует Мастер установки %1
rusWelcomeLabel2=Программа установит %1, версия %2 на Ваш компьютер.%n%nРекомендуется закрыть все прочие приложения перед тем, как продолжить.%n%nНажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

; English
engButtonBack=< &Back
engButtonNext=&Next >
engButtonCancel=Cancel
engSetupWindowTitle=Setup — %1
engWelcomeLabel1=Welcome to the %1 Setup Wizard
engWelcomeLabel2=This will install %1 version %2 on your computer.%n%nIt is recommended that you close all other applications before continuing.%n%nClick Next to continue, or Cancel to exit Setup.

[Code]
var
lang: String;
langBtn: TButton;
WelcomeLabel1:TLAbel;

procedure ChangeLang();
begin
WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
WizardForm.NextButton.Caption:= CustomMessage(lang+'ButtonNext');
WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
WizardForm.Caption:= FmtMessage(CustomMessage(lang+'SetupWindowTitle'), ['{#SetupSetting('AppName')}']);
WizardForm.WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
WizardForm.WelcomeLabel2.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel2'), ['{#SetupSetting('AppName')}', '{#SetupSetting('AppVersion')}']);
WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
end;

procedure LangBtnClick(Sender: TObject);
begin
if lang='rus' then begin
lang:= 'eng';
langBtn.Caption:= 'рус';
end else begin
lang:= 'rus';
langBtn.Caption:= 'eng';
end;
ChangeLang();
end;

procedure InitializeWizard;
begin
langBtn:= TButton.Create(WizardForm);
with langBtn do begin
SetBounds(10,WizardForm.CancelButton.Top,30,WizardForm.CancelButton.Height)
OnClick:= @LangBtnClick;
Parent:= WizardForm;
end;

WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do begin
Parent:=WizardForm;
AutoSize:=False;
Transparent:=True;
SetBounds(ScaleX(45), ScaleY(330), ScaleX(535), ScaleY(50));
Font.Size:= 10;
WordWrap:=True;
Caption:= FmtMessage(CustomMessage(lang+'rusWelcomeLabel1'), ['{#SetupSetting('AppName')}']);
// OnMouseDown:=@FrameMouseDown;
end;

if ActiveLanguage='rus' then begin
lang:= 'rus';
langBtn.Caption:= 'eng';
end else begin
lang:= 'eng';
langBtn.Caption:= 'рус';
end;
end;
А можно такой же пример, но с кнопка смены языка текстурирована через botva2?

Добавлено:
и еще хотелось узнать как реализовать смену языка на компонент листе?
 
Последнее редактирование модератором:
HourseMAN, про кнопочку, ботва (там справочка, сам модуль).
про 2-ое:
Код:
 ListBox.ItemCaption[0]:= '   ';
0,1,2,3... нумерация строк с нуля.
 
про кнопочку, ботва (там справочка, сам модуль).
Кнопку то я могу создать и затекстурировать, но клик на смену caption'ов никак к ней не могу прикрепить!
про 2-ое:
Код:
 ListBox.ItemCaption[0]:= '   ';
0,1,2,3... нумерация строк с нуля.
Попробуем...
 
HourseMAN,
Код:
var
lang: String;
langBtn:HWND;
WelcomeLabel1:TLAbel;

procedure ChangeLang();
begin
WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
WizardForm.NextButton.Caption:= CustomMessage(lang+'ButtonNext');
WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
WizardForm.Caption:= FmtMessage(CustomMessage(lang+'SetupWindowTitle'), ['{#SetupSetting('AppName')}']);
WizardForm.WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
WizardForm.WelcomeLabel2.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel2'), ['{#SetupSetting('AppName')}', '{#SetupSetting('AppVersion')}']);
WelcomeLabel1.Caption:= FmtMessage(CustomMessage(lang+'WelcomeLabel1'), ['{#SetupSetting('AppName')}']);
end;

procedure LangBtnClick(hBtn:HWND);
begin
if lang='rus' then begin
lang:= 'eng';
BtnSetText(langBtn,'рус');
end else begin
lang:= 'rus';
BtnSetText(langBtn,'eng');
end;
ChangeLang();
end;
Only click.
ну я так не играю :(
 
vint56, sergey3695, Всем спасибо!
Но через ItemCaption[0] на компонент листе не меняет язык компонента
Код:
WizardForm.TypesCombo.Visible:=False;
WizardForm.ComponentsList.Height := ScaleY(181) - WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Width := ScaleX(417);
WizardForm.ComponentsList.ItemCaption[0]:=FmtMessage(CustomMessage(lang+'rusGameText'), ['{#SetupSetting('AppName')}']);
 
HourseMAN, это
Код:
WizardForm.ComponentsList.ItemCaption[0]:=FmtMessage(CustomMessage(lang+'rusGameText'), ['{#SetupSetting('AppName')}']);
в
Код:
procedure ChangeLang();
begin
?
 
sergey3695, уже там:D, вроде теперь все как надо...

Добавлено:
нашел баг, на этом примере не меняется язык текстурированных кнопок, надеюсь на чью то помощь, заранее спасибо
 
Последнее редактирование модератором:
HourseMAN, вот так баг :D
Код:
  BtnSetText(hCancelBtn, CustomMessage(lang+'ButtonCancel'));
  BtnSetText(hNextBtn, CustomMessage(lang+'ButtonNext'));
  BtnSetText(hBackBtn, CustomMessage(lang+'ButtonBack'));
 
sergey3695, а в этом не поможете?
нужна еще смена "Мб" "Гб" и "ТБ"
Код:
function NumToStr(Float: Extended): String;
begin
  Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0')or(Result[Length(Result)] = '.'))and(Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;

function MbOrTb(Float: Extended): String;
begin
  if Float < 1024 then Result:= NumToStr(Float)+' Мб' else ///////////// это
    if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else ///////////// это
      Result:= NumToStr(Float/(1024*1024))+' Тб'; ///////////// и это
end;

procedure ObjectFunc(Sender: TObject);
var
  Drive: String;
begin
  case Sender of
    WizardForm.DirEdit: begin
      Drive:= ExtractFileDrive(WizardForm.DirEdit.Text);
      GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
      InstallSpacelabel.Caption:=ExpandConstant('{cm:InstallSpace} ') +MbOrTb({#NeedInstallSize});
      NeedSpaceLabel.Caption:=ExpandConstant('{cm:NeedSpace} ') +MbOrTb({#NeedSize});
      WizardForm.NextButton.Enabled:=(FreeMB>{#NeedInstallSize})and(FreeMB>{#NeedSize});
      if WizardForm.NextButton.Enabled then NeedSpaceLabel.Font.Color:=$FFFFFF else NeedSpaceLabel.Font.Color:=$0000FF;
    end;
  end;
end;
[CODE][SPOILER/]
 
Назад
Сверху