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

Install the right file with the same name depending on the app's language in NSIS

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

现在我希望根据 $detected_language 的值只安装一个 menu.cfg 文件。不允许在 File ... 中使用变量。是创建大量 Sections 并将它们命名为“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。