Inno Setup:在设置 运行 时更改设置语言
Inno Setup: change the setup language while setup is running
在我的设置中,我不想使用标准语言对话框表单。
相反,我想在我的 Inno Setup 的欢迎页面中添加一个组合框来完成语言对话框所做的相同工作,以便它能够:
在下拉列表中显示 [Languages]
部分中包含的所有语言。因此用户可以从这个自定义组合框中 select 一种语言。
将所选语言应用于整个设置。
我知道使用 "normal way" 是不可能的,因为 Inno Setup 中没有可用的功能来执行此工作 (!!!)。
因此,我向 Inno Setup 编译器添加了几个函数,并从我的脚本中调用它们:
function GetAvailableLanguages: TStringList
:它能够return所有活动语言的列表(完整数据),并且工作正常。
procedure SetChosenLanguage(const I:integer)
:它应该设置所选的语言,但现在只有 "partially"。除了所有设置页面中的标签外,所有内容的语言都已更改。因此,按钮标题、消息框、对话框...所有内容都已将语言设置为所选语言,但所有标签仍使用默认 (OS) 语言。
我尝试使用 Refresh
、Invalidate
、Update
来解决,但发送消息没有成功。标签标题仍然是原来的默认语言。
下面的 link 是一个视频,展示了我的测试设置以及组合框和语言的变化。我的默认 (OS) 语言是意大利语。视频显示,即使我将语言更改为 Deutsch,所有内容都会将语言更改为 Deustch,但标签除外。
http://screencast.com/t/SDI5VN67LFL
如果有人已经解决了问题,请帮助我!
您必须按照 TWizardForm
代码将它们初始化为初始语言的相同方式一一重新设置所有标签。
例如:
SelectTasksLabel.Caption := ExpandSetupMessage(msgSelectTasksLabel2);
有关更多信息,请参阅 TWizardForm.Create
code。
没有更简单的方法。字符串被复制到 Windows (Win32) 控件,它们不会神奇地知道您已经更改了语言。您必须用新值覆盖字符串。
例如,"Next" 和 "Back" 按钮的标签随着语言的变化而更新,因为它们总是在页面更改时重新设置,从 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;
但大多数其他标签都是静态的,永远不会更新,因此它们会保留原始语言。
在我的设置中,我不想使用标准语言对话框表单。
相反,我想在我的 Inno Setup 的欢迎页面中添加一个组合框来完成语言对话框所做的相同工作,以便它能够:
在下拉列表中显示
[Languages]
部分中包含的所有语言。因此用户可以从这个自定义组合框中 select 一种语言。将所选语言应用于整个设置。
我知道使用 "normal way" 是不可能的,因为 Inno Setup 中没有可用的功能来执行此工作 (!!!)。
因此,我向 Inno Setup 编译器添加了几个函数,并从我的脚本中调用它们:
function GetAvailableLanguages: TStringList
:它能够return所有活动语言的列表(完整数据),并且工作正常。procedure SetChosenLanguage(const I:integer)
:它应该设置所选的语言,但现在只有 "partially"。除了所有设置页面中的标签外,所有内容的语言都已更改。因此,按钮标题、消息框、对话框...所有内容都已将语言设置为所选语言,但所有标签仍使用默认 (OS) 语言。
我尝试使用 Refresh
、Invalidate
、Update
来解决,但发送消息没有成功。标签标题仍然是原来的默认语言。
下面的 link 是一个视频,展示了我的测试设置以及组合框和语言的变化。我的默认 (OS) 语言是意大利语。视频显示,即使我将语言更改为 Deutsch,所有内容都会将语言更改为 Deustch,但标签除外。
http://screencast.com/t/SDI5VN67LFL
如果有人已经解决了问题,请帮助我!
您必须按照 TWizardForm
代码将它们初始化为初始语言的相同方式一一重新设置所有标签。
例如:
SelectTasksLabel.Caption := ExpandSetupMessage(msgSelectTasksLabel2);
有关更多信息,请参阅 TWizardForm.Create
code。
没有更简单的方法。字符串被复制到 Windows (Win32) 控件,它们不会神奇地知道您已经更改了语言。您必须用新值覆盖字符串。
例如,"Next" 和 "Back" 按钮的标签随着语言的变化而更新,因为它们总是在页面更改时重新设置,从 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;
但大多数其他标签都是静态的,永远不会更新,因此它们会保留原始语言。