Inno设置 - 根据系统语言设置默认组件

时间:2015-08-31 10:19:16

标签: dynamic inno-setup pascal multilingual

我对InnoSetup相对较新,请原谅我,如果我错过了什么。

情况:我的程序被组织成可选择的组件。 "核心组件"和"语言组件" (以及其他一些与此无关的内容)。 "语言组件"包含"英语","西班牙语"等等..设置已本地化为组件支持的所有语言。

我想要实现的目标:当用户拥有例如西班牙语操作系统并为设置选择西班牙语时,我想要"语言组件>西班牙语"由DE DEFAULT自动选择,但即使设置为西班牙语,用户仍然可以为我的程序选择其他语言。

它现在做了什么:现在默认选择第一个语言元素,即"英语"因为它是第一个元素。用户必须专门选择"西班牙语"或者其他,无论使用何种语言进行设置。

问题:根据设置区域设置,是否可以让Inno Setup选择或检查组件?

演示代码:

[Setup]
AppName=My App
AppVersion=1.0
DefaultDirName={pf}\My App

[Components]
Name: "core_files"; Description: "Core Component"; Types: full compact custom; Flags: fixed
Name: "lang_files"; Description: "Language Component"; Types: full compact custom; Flags: fixed
Name: "lang_files\en"; Description: "English"; Flags: exclusive
Name: "lang_files\es"; Description: "Spanish"; Flags: exclusive;

[Files]
;Source: "Files\*"; DestDir: "{app}"; Components: game_files
;Source: "Files_EN\*"; DestDir: "{app}"; Components: lang_files\en
;Source: "Files_ES\*"; DestDir: "{app}"; Components: lang_files\es

[Icons]  
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl"
Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl"

请注意: 使用它似乎没有任何效果:

Name: "lang_files\es"; Description: "Spanish"; Languages: es; Flags: exclusive;

使用它不是我的选择,因为用户在安装过程中无法选择其他语言,如果他想更改我的应用语言,他唯一的选择就是更改整个安装语言。

Source: "Files_ES\*"; DestDir: "{app}"; Languages: es; Components: lang_files\es

结论: 我希望有一些方法可以使这项工作。我想知道为什么要在"组件"上设置语言?被忽略或者没有效果,但在编译时仍然没有显示任何错误。也许在[Code]部分可能会出现这样的事情,但我对Pascal一无所知。

任何帮助或指向我正确的方向都是非常苛刻的。 问候。

2 个答案:

答案 0 :(得分:2)

解决方案:各位大家好,感谢您的帮助。随着一些谷歌,大脑和许多失败的编译,我终于冷却了一些相当不错的解决方案。

以下是有人发现它有用的代码:

[Setup]
AppName=My App
AppVersion=1.0
DefaultDirName={pf}\My App

[Types]
Name: "full_en"; Description: "Full installation"; Languages: en; 
Name: "full_es"; Description: "Full installation"; Languages: es;
Name: "custom"; Description: "Custom installation"; Flags: iscustom
; Full installation (With all languages)
#define full "full_en full_es"

[Components]
Name: "core_files"; Description: "Core Component"; Types: {#full} custom; Flags: fixed
Name: "lang_files"; Description: "Language Component"; Types: {#full} custom; Flags: fixed
Name: "lang_files\en"; Description: "English"; Types: full_en custom; Flags: exclusive
Name: "lang_files\es"; Description: "Spanish"; Types: full_es custom; Flags: exclusive;

[Files]
;Source: "Files\*"; DestDir: "{app}"; Components: game_files
;Source: "Files_EN\*"; DestDir: "{app}"; Components: lang_files\en
;Source: "Files_ES\*"; DestDir: "{app}"; Components: lang_files\es

[Icons]  
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl"
Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl"

我正在使用"安装类型"默认情况下检查语言。这个解决方案似乎对我来说非常好,并且适用于市长Pascal编码。缺点是它需要每种语言的安装类型,如果你包含许多语言,它们会变得非常大。我想知道是否还有其他更多的elegand和紧凑的方法来做到这一点。

问候并感谢您的帮助!

更新:现在根本没有任何pascal脚本。 更新2:使用ISPP避免使用元素的所有语言进行复制,更容易使用和更好的可读性。

答案 1 :(得分:0)

从这个页面(http://www.jrsoftware.org/ishelp/index.php?topic=languagessection)我读到了这个信息:

“如果ShowLanguageDialog [Setup] section指令设置为yes(默认值),将显示Select Language对话框,使用户有机会覆盖Setup选择的语言。在非Unicode Inno Setup语言中可以'将隐藏在用户系统上正确显示的内容。有关详细信息,请参阅[LangOptions]部分帮助主题。“