根据NSIS中应用程序的语言,安装具有相同名称的正确文件

问题描述

安装程序检测到已安装应用程序的语言,假设$detected_language的值为“ pl ”。

现在,我希望基于menu.cfg的值仅安装一个$detected_language文件。不允许在File ...中使用变量。是创建大量部分并将其命名为“ Kardaw Mod(英语)”,“ Kardaw Mod(德语)”等并隐藏所有不必要的带有标志的部分的唯一方法匹配检测到的语言? (menu.cfg不能即时修改,因为它已加密)。

var detected_language
...

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE detect_app_language; /*$detected_language → "pl"*/
!insertmacro MUI_PAGE_DIRECTORY
...

Section "Kardaw Mod"
  SetoutPath "$INSTDIR\data"
  File "E:\MyMods\Kardaw Mod\English\data\menu.cfg"
  File "E:\MyMods\Kardaw Mod\German\data\menu.cfg"
  File "E:\MyMods\Kardaw Mod\french\data\menu.cfg"
  File "E:\MyMods\Kardaw Mod\Spanish\data\menu.cfg"
  File "E:\MyMods\Kardaw Mod\Russian\data\menu.cfg"
  File "E:\MyMods\Kardaw Mod\Polish\data\menu.cfg";/* ←this one is the correct one */

解决方法

创建一个包含用户所选语言的变量,并使用$ {If} s仅提取所需的文件。

    Var /Global MySelectedlanguage ; Fill this variable with user selected language eg. "EN" for English etc.
    
    Section "Kardaw Mod"
      SetOutPath "$INSTDIR\data"

      ${If} $MySelectedlanguage == "EN"
      File "E:\MyMods\Kardaw Mod\English\data\menu.cfg"
      ${EndIf}

    ${If} $MySelectedlanguage == "DE"
      File "E:\MyMods\Kardaw Mod\German\data\menu.cfg"
    ${EndIf}

    ; ... The same for other languages ...
    SectionEnd
,

首先想到的是使这些条目在组中不可见。但是-符号仍然可见,并且如果已选中该节组的标题,其复选标记为灰色☑。

我的问题的解决方案是将所有部分一个接一个地放置。当我们离开页面时,一个函数将选中右边的框。它还将检查是否选择了mod。

Wrong Solution Right Solution