Inno setup 选择应用程序语言并将其保存到Inno安装程序的注册表中

Inno setup 选择应用程序语言并将其保存到Inno安装程序的注册表中,inno-setup,Inno Setup,请帮助为应用程序(而不是安装程序)选择语言 我有一个工作脚本。我想添加combobox或其他控件元素来选择此脚本用于安装的应用程序的语言。 首先,我尝试使用这段代码,这是可行的: [Languages] Name: en; MessagesFile: "compiler:m_Default_en.isl" ; Chinese Name: cn; MessagesFile: "compiler:m_Default_cn.isl" [Registry] Root: HKCU; Subkey:

请帮助为应用程序(而不是安装程序)选择语言

我有一个工作脚本。我想添加combobox或其他控件元素来选择此脚本用于安装的应用程序的语言。 首先,我尝试使用这段代码,这是可行的:

[Languages]
Name: en; MessagesFile: "compiler:m_Default_en.isl"
; Chinese
Name: cn; MessagesFile: "compiler:m_Default_cn.isl"  

[Registry]
Root: HKCU; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}"; ValueType: string; ValueName: "language"; ValueData: "zh_CN"; Languages: cn
Root: HKCU; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}"; ValueType: string; ValueName: "language"; ValueData: "en_US"; Languages: en
这样做的目的是要求选择将在安装过程中使用的语言(如果使用默认翻译)。然后根据选择将值写入寄存器。然后在安装后,应用程序在启动时读取该寄存器并上传相应的翻译文件

问题是我想在“创建桌面图标”页面后显示此带有语言选择的窗口。但它总是在启动安装程序时首先出现

也许还有别的解决办法?我不熟悉Inno安装脚本


我使用的是Inno安装编译器5.5.9。

您必须使用自己的自定义选择页面。您可以从以下内容开始:

[注册表]
根:香港中文大学;子键:“软件\我的程序”;ValueType:字符串\
ValueName:“语言”;ValueData:“{code:GetApplLanguage}”
[守则]
变量
语言页面:t输入选项向导页面;
语言:TStrings;
LanguageDefault:字符串;
函数GetApplLanguage(参数:string):string;
开始
{应该总是正确的}
如果LanguagePage.SelectedValueIndex>=0,则
结果:=语言[LanguagePage.SelectedValueIndex];
结束;
过程AddLanguage(代码:string;名称:string);
变量
索引:整数;
开始
索引:=LanguagePage.Add(名称);
语言。添加(代码);
如果Code=LanguageDefault,则
开始
LanguagePage.Values[Index]:=True;
结束;
结束;
过程初始化Wizard();
开始
RegQueryStringValue(
HKEY_当前用户,“软件\我的程序”,“语言”,语言默认值);
语言页面:=
CreateInputOptionPage(wpSelectTasks,'应用程序语言','',True,True);
语言:=TStringList.Create;
AddLanguage('zh_CN','Chinese');
AddLanguage(“en_US”,“English”);
LanguagePage.CheckListBox.Color:=clBtnFace
LanguagePage.CheckListBox.WantTables:=True
LanguagePage.CheckListBox.BorderStyle:=bsNone;
LanguagePage.CheckListBox.MinItemHeight:=WizardForm.TasksList.MinItemHeight;
如果LanguagePage.SelectedValueIndex<0,则
开始
LanguagePage.Values[0]:=True;
结束;
结束;



但是请注意,在安装程序中配置用户首选项(可能在不同的本地帐户下运行)是有问题的。看。

非常感谢@MartinPrikryl!!! 我还做了一些更改,所以现在安装程序从寄存器中获取语言值,并将radio box中的相应选项设置为默认值:

[Registry]
Root: HKCU; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}"; ValueType: string; ValueName: "language"; ValueData: "{code:GetAppLanguage}"

[Code]

var
  LanguagePage: TInputOptionWizardPage;
  Languages: TStrings;
  LanguageDefault: String; 
  DefaultLanguageIndex: Integer;

function GetAppLanguage(Param: string): string;
begin
  { Should always be true }
  if LanguagePage.SelectedValueIndex >= 0 then
    Result := Languages[LanguagePage.SelectedValueIndex];
end;

procedure AddLanguage(Code: string; Name: string);
begin
  LanguagePage.Add(Name);
  Languages.Add(Code);
end;

procedure InitializeWizard();
begin
  LanguagePage :=
    CreateInputOptionPage(wpSelectTasks, 'Select application language', 'Which language will be used in buttons, tooltips, dialogs etc.?', 'Available translations:', True, True);
  Languages := TStringList.Create;
  AddLanguage('en_US', 'English');
  AddLanguage('zh_CN', 'Chinese');
  LanguagePage.CheckListBox.Color := clBtnFace;
  LanguagePage.CheckListBox.WantTabs := True;
  LanguagePage.CheckListBox.BorderStyle := bsNone;
  { Set language by default to English }
  DefaultLanguageIndex := 0;
  { Get language from register if application was previously installed and set corresponding radiobox on select language }                               
  if RegQueryStringValue(HKEY_CURRENT_USER, 'Software\{#MyAppPublisher}\{#MyAppName}', 'language', LanguageDefault) then begin
    if LanguageDefault = 'zh_CN' then
  DefaultLanguageIndex := 1;
  end;
  LanguagePage.Values[DefaultLanguageIndex] := True;
end;

“我想在“创建桌面图标”页面后显示此语言选择窗口。”-为什么?该对话框主要用于选择安装程序的语言。因此,它必须是用户看到的第一件事。如果您想询问其他任何地方,您必须使用自己的自定义选择,这对安装程序本身没有影响。@MartinPrikryl感谢您的回复!是的,我说过这可能不是最好的决定。你知道怎么做吗?我在回答中添加了一个更通用的解决方案。@MartinPrikryl非常感谢你的帮助!