Inno Setup:在设置运行时更改设置语言

时间:2015-10-27 14:00:40

标签: inno-setup delphi-2009 vcl

在我的设置中,我不想使用标准语言对话框表格。

相反,我想在我的Inno安装程序的欢迎页面添加一个组合框,以完成语言对话框所做的相同工作,以便它能够:

  1. 显示下拉列表中[Languages]部分中包含的所有语言。因此,用户可以从此自定义组合框中选择一种语言。

  2. 将所选语言应用于整个设置。

  3. 我知道使用“普通方式”是不可能的,因为Inno Setup中没有可用于执行此工作的功能(!!!)。

    所以,我在Inno Setup编译器中添加了几个函数,我从我的脚本中调用它们:

    • function GetAvailableLanguages: TStringList:它可以返回所有活动语言的列表(完整数据),并且工作正常。

    • procedure SetChosenLanguage(const I:integer):它应该设置所选语言,但现在只能“部分”。语言将针对所有设置页面中的标签进行更改。因此,按钮标题,消息框,对话框,...所有语言都设置为所选语言,但所有标签仍然是默认(OS)语言。

    我尝试使用RefreshInvalidateUpdate解决,发送消息但没有成功。标签标题仍为原始默认语言。

    以下链接是一个视频,显示我的测试设置,其中包含组合框和语言更改。我的默认(OS)语言是意大利语。该视频显示,即使我将语言更改为Deutsch,一切都会将语言更改为Deustch BUT标签。

    http://screencast.com/t/SDI5VN67LFL

    如果有人已经解决了这个问题,请帮助我!

1 个答案:

答案 0 :(得分:2)

您必须逐个重新设置所有标签,方法与TWizardForm代码将其初始化为初始语言的方式相同。

例如:

SelectTasksLabel.Caption := ExpandSetupMessage(msgSelectTasksLabel2);

有关详情,请参阅TWizardForm.Create code

没有更简单的方法。字符串被复制到Windows(Win32)控件,他们不会神奇地知道您已经更改了语言。您必须使用新值覆盖字符串。

例如,“下一页”和“后退”按钮的标签会随语言更改而更新,因为在更改页面时,它们始终会从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;

但是大多数其他标签都是静态的,永远不会更新,所以它们保持原始语言。