1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

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

Тема в разделе "Inno Setup", создана пользователем ExPlayer, 23 июл 2014.

  1. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    Доброго времени суток! Хотелось бы узнать, как можно добавить кнопку смены языка в самом инсталляторе, т.е. чтобы у человека нажавшего на эту кнопку поменялся бы язык к примеру с русского на английский (т.е. название всех лейблов, текстов и название кнопок)?
     
  2. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Код (Text):
    [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;
     
     
    ExPlayer и aibek1996 нравится это.
  3. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    Спасибо, обязательно попробую. Прошу пока не закрывать тему.
     
  4. Пользователь

    Регистрация:
    5 янв 2014
    Сообщения:
    31
    Симпатии:
    0
    а как быть если такой лейбл:
    кто нибудь имеет пример с адаптацией под такие лейблы?
    Код (Text):

      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;
     
  5. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    703
    Симпатии:
    494
    Tjeyn,
    Код (Text):
    [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;
     
    Winst@n, Adil, Tjeyn и ещё 1-му нравится это.
  6. Пользователь

    Регистрация:
    5 янв 2014
    Сообщения:
    31
    Симпатии:
    0
    Спасибо, но язык меняют лишь те лейблы, которые в скрипте прописаны, а остальные что берутся из файла "Russian.isl" и "English.isl" не изменяются
     
  7. Old Men Проверенный

    Регистрация:
    17 июн 2011
    Сообщения:
    347
    Симпатии:
    327
    Пол:
    Мужской
    Tjeyn, естественно, ведь в Inno нет функции смены языка на лету. Это уже самодельщина.
     
    Tjeyn нравится это.
  8. Пользователь

    Регистрация:
    5 янв 2014
    Сообщения:
    31
    Симпатии:
    0
    nik1967, то есть нужно все лейблы копировать из файла языка в скрипт или есть другое решение?
     
  9. Old Men Проверенный

    Регистрация:
    17 июн 2011
    Сообщения:
    347
    Симпатии:
    327
    Пол:
    Мужской
    Tjeyn, не лейблы, а их значения, и не все, но большинство. Другого решения на данный момент не знаю.
     
    Tjeyn нравится это.
  10. Пользователь

    Регистрация:
    5 янв 2014
    Сообщения:
    31
    Симпатии:
    0
    nik1967, ну пусть будет так уже, может со временем найду другое решение, но еще не подскажете как этот пример адаптировать под ISDone?
     
  11. Пользователь

    Регистрация:
    18 фев 2015
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    А можно такой же пример, но с кнопка смены языка текстурирована через botva2?

    Добавлено:
    и еще хотелось узнать как реализовать смену языка на компонент листе?
     
    Последнее редактирование модератором: 23 фев 2015
  12. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    614
    HourseMAN, про кнопочку, ботва (там справочка, сам модуль).
    про 2-ое:
    Код (Text):
     ListBox.ItemCaption[0]:= '   ';
    0,1,2,3... нумерация строк с нуля.
     
    HourseMAN нравится это.
  13. Пользователь

    Регистрация:
    18 фев 2015
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    Кнопку то я могу создать и затекстурировать, но клик на смену caption'ов никак к ней не могу прикрепить!
    Попробуем...
     
  14. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    703
    Симпатии:
    494
    Adil, HourseMAN и sergey3695 нравится это.
  15. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    614
    HourseMAN,
    Код (Text):
    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.
    ну я так не играю :(
     
    Adil и HourseMAN нравится это.
  16. Пользователь

    Регистрация:
    18 фев 2015
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    vint56, sergey3695, Всем спасибо!
    Но через ItemCaption[0] на компонент листе не меняет язык компонента
    Код (Text):
    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')}']);
     
  17. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    614
    HourseMAN, это
    Код (Text):
    WizardForm.ComponentsList.ItemCaption[0]:=FmtMessage(CustomMessage(lang+'rusGameText'), ['{#SetupSetting('AppName')}']);
    в
    Код (Text):
    procedure ChangeLang();
    begin
    ?
     
    HourseMAN нравится это.
  18. Пользователь

    Регистрация:
    18 фев 2015
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    sergey3695, уже там:D, вроде теперь все как надо...

    Добавлено:
    нашел баг, на этом примере не меняется язык текстурированных кнопок, надеюсь на чью то помощь, заранее спасибо
     
    Последнее редактирование модератором: 23 фев 2015
  19. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    614
    HourseMAN, вот так баг :D
    Код (Text):
      BtnSetText(hCancelBtn, CustomMessage(lang+'ButtonCancel'));
      BtnSetText(hNextBtn, CustomMessage(lang+'ButtonNext'));
      BtnSetText(hBackBtn, CustomMessage(lang+'ButtonBack'));
     
    HourseMAN нравится это.
  20. Пользователь

    Регистрация:
    18 фев 2015
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    sergey3695, а в этом не поможете?
    нужна еще смена "Мб" "Гб" и "ТБ"
    Код (Text):

    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/]
     

Поделиться этой страницей