2015-10-27 10 views
2

В моей программе установки я не хочу использовать стандартную форму диалога языка.Inno Setup: измените язык установки во время установки

Вместо этого я хочу, чтобы добавить выпадающий на первую страницу моей установки Inno, чтобы сделать ту же работу, внесенный языком диалога, так что она способна:

  1. показать все языки, включенными в раздел [Languages] в выпадающем списке. Таким образом, пользователь может выбрать язык из этого пользовательского combobox.

  2. примените выбранный язык к всей настройке.

Я знаю, что это невозможно, используя «обычный способ», потому что в Inno Setup нет функций для выполнения этого задания (!!!).

Так что, я добавил несколько функций компилятора Setup Inno и я называю их из моего сценария:

  • function GetAvailableLanguages: TStringList: он способен вернуть список всех активных языков (полные данные), и он отлично работает.

  • procedure SetChosenLanguage(const I:integer): он должен установить выбранный язык, и он работает, но теперь только «частично». Язык изменяется для всех, НО метки на всех страницах установки. Итак, надписи кнопок, окна сообщений, диалоговые окна ... все имеет язык, выбранный для выбранного, но все метки по-прежнему находятся на языке по умолчанию (OS).

Я пытался решить с помощью Refresh, Invalidate, Update, отправлять сообщения без какого-либо успеха. Подписи подписи по-прежнему находятся на исходном языке по умолчанию.

Ниже приведено видео, показывающее мою тестовую настройку с изменением списков и языков. Мой язык по умолчанию (OS) - итальянский. Видео показывает, что, даже если я изменю язык, например, на Deutsch, все изменит язык на Deustch, но на этикетках.

http://screencast.com/t/SDI5VN67LFL

Если кто-то уже решил проблему, пожалуйста, помогите мне!

ответ

2

Вам необходимо будет повторно установить все метки один за другим так же, как код TWizardForm инициализирует их на исходном языке.

Например:

SelectTasksLabel.Caption := ExpandSetupMessage(msgSelectTasksLabel2); 

См TWizardForm.Create code больше.

Нет более простого способа. Строки копируются в элементы управления Windows (Win32), они не будут волшебно узнавать, что вы изменили язык. Вы должны перезаписать строки с новыми значениями.

Например ярлыки на «Next» и «Назад» кнопки обновляются с изменением языка, потому что они всегда повторно набор, когда страница изменена, из TWizardForm.SetCurPage:

procedure TWizardForm.SetCurPage(const NewPageID: Integer); 
... 
begin 
    ... 
    BackButton.Caption := SetupMessages[msgButtonBack]; 
    if CurPageID = wpReady then begin 
    NextButton.Caption := SetupMessages[msgButtonInstall]; 
    CancelButton.Caption := SetupMessages[msgButtonCancel]; 
    end else if ((CurPageID = wpPreparing) and PrepareToInstallNeedsRestart) or (CurPageID = wpFinished) then begin 
    NextButton.Caption := SetupMessages[msgButtonFinish]; 
    CancelButton.Caption := SetupMessages[msgButtonCancel]; 
    end else begin 
    NextButton.Caption := SetupMessages[msgButtonNext]; 
    CancelButton.Caption := SetupMessages[msgButtonCancel]; 
    end; 
    ... 
end; 

Но большинство других этикеток являются статическими и никогда не обновляются, поэтому они остаются на языке оригинала.

+1

Большое спасибо. Немного длиннее, чтобы реализовать, но образец, который я сделал, работает как charme! – radiolondra57