Nsis 未翻译的LangString如何使用默认语言?

Nsis 未翻译的LangString如何使用默认语言?,nsis,Nsis,我的安装必须适用于多种语言,但我不能完全翻译所有消息。未翻译邮件时,如何使用默认语言 例如: !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "TradChinese" !insertmacro MUI_LANGUAGE "SimpChinese" LangString EMBEDED ${LANG_ENGLISH} "Installati

我的安装必须适用于多种语言,但我不能完全翻译所有消息。未翻译邮件时,如何使用默认语言

例如:

!insertmacro MUI_LANGUAGE "English" 
!insertmacro MUI_LANGUAGE "Spanish" 
!insertmacro MUI_LANGUAGE "TradChinese" 
!insertmacro MUI_LANGUAGE "SimpChinese"


LangString EMBEDED ${LANG_ENGLISH} "Installation single user" 
LangString EMBEDED ${LANG_SPANISH} "Instalación usuario único"

我希望如果安装是用繁体中文,嵌入字符串将使用英文翻译,因为没有嵌入中文。

我在NSIS论坛上问了同样的问题,但没有成功。最后,我创建了一个小的Perl脚本,它解析我的NSIS代码,检测包含的语言和所有语言字符串,检测缺少的翻译,并创建初始化为默认语言的语言字符串:

#/usr/bin/perl
#
#filltranslationgaps.pl
#获取包含的语言列表
my$tmp=uc(`grep^!insertmacro MUI_LANGUAGE“installer.nsi|grep-v”;“| cut-f2-d\\”);
my@lang=split(/\n/,$tmp);
my$DEFAULTLANGUAGE=$lang[0];
#获取字符串

open($fh,
LangFile.nsh
包含帮助程序代码,用于创建具有回退支持的语言文件(由MUI等使用),但每种语言必须位于单独的.nsh文件中

如果要将所有翻译保留在.nsi中,则必须创建自己的自定义宏:

!macro MyLangInit lnam nlf
!ifndef MYLANG
    !define MYLANG ${lnam}
    !ifndef MYLANG_${lnam}
        !define MYLANG_${lnam}
        LoadLanguageFile "${NSISDIR}\Contrib\Language files\${nlf}.nlf"
        !ifndef LANG_${lnam}
            !define LANG_${lnam} ${LANG_${nlf}}
        !endif
    !endif
!endif
!macroend
!define MyLangInit "!insertmacro MyLangInit "
!macro MyLangSet mode nam str
!ifndef MYLANG_${MYLANG}_${nam}
    !define MYLANG_${MYLANG}_${nam} "${str}"
!else
    !if ${mode} != 0
        !ifdef MYLANG_${MYLANG}_${nam}
            LangString ${nam} "" "${MYLANG_${MYLANG}_${nam}}"
            !undef MYLANG_${MYLANG}_${nam}
        !endif
    !endif
!endif
!macroend
!macro MyLangLoad lnam
!define MyLangSet "!insertmacro MyLangSet 0 "
!insertmacro ${lnam}
!insertmacro ${MYLANG_FALLBACK}
!undef MyLangSet
!define MyLangSet "!insertmacro MyLangSet 1 "
!insertmacro ${lnam}
!insertmacro ${MYLANG_FALLBACK}
!undef MyLangSet
!undef MYLANG
!macroend

!macro English
${MyLangInit} English English
${MyLangSet} foo "bar"
${MyLangSet} bar "baz"
!macroend

!macro Bork
${MyLangInit} Bork Swedish ; Based on Swedish
${MyLangSet} foo "bork"
; Missing: ${MyLangSet} bar "barkz"
!macroend

!macro Danish
${MyLangInit} Danish Danish
; All strings are missing!
!macroend


!define MYLANG_FALLBACK English ; Language to use for missing strings
!insertmacro MyLangLoad Bork
!insertmacro MyLangLoad Danish
!insertmacro MyLangLoad English

Function .onInit
StrCpy $LANGUAGE ${LANG_BORK} ; TODO: Use LangDLL or some algorithm to select the language here
FunctionEnd

Section
SetDetailsView show
DetailPrint LangId=$LANGUAGE
DetailPrint "$(foo)"
DetailPrint "$(bar)"
SectionEnd

如果使用不同语言的回退字符串没有意义,那么您应该翻译所有字符串,或者根本不支持该语言。。。
!include  missingphrases.nsi
!macro MyLangInit lnam nlf
!ifndef MYLANG
    !define MYLANG ${lnam}
    !ifndef MYLANG_${lnam}
        !define MYLANG_${lnam}
        LoadLanguageFile "${NSISDIR}\Contrib\Language files\${nlf}.nlf"
        !ifndef LANG_${lnam}
            !define LANG_${lnam} ${LANG_${nlf}}
        !endif
    !endif
!endif
!macroend
!define MyLangInit "!insertmacro MyLangInit "
!macro MyLangSet mode nam str
!ifndef MYLANG_${MYLANG}_${nam}
    !define MYLANG_${MYLANG}_${nam} "${str}"
!else
    !if ${mode} != 0
        !ifdef MYLANG_${MYLANG}_${nam}
            LangString ${nam} "" "${MYLANG_${MYLANG}_${nam}}"
            !undef MYLANG_${MYLANG}_${nam}
        !endif
    !endif
!endif
!macroend
!macro MyLangLoad lnam
!define MyLangSet "!insertmacro MyLangSet 0 "
!insertmacro ${lnam}
!insertmacro ${MYLANG_FALLBACK}
!undef MyLangSet
!define MyLangSet "!insertmacro MyLangSet 1 "
!insertmacro ${lnam}
!insertmacro ${MYLANG_FALLBACK}
!undef MyLangSet
!undef MYLANG
!macroend

!macro English
${MyLangInit} English English
${MyLangSet} foo "bar"
${MyLangSet} bar "baz"
!macroend

!macro Bork
${MyLangInit} Bork Swedish ; Based on Swedish
${MyLangSet} foo "bork"
; Missing: ${MyLangSet} bar "barkz"
!macroend

!macro Danish
${MyLangInit} Danish Danish
; All strings are missing!
!macroend


!define MYLANG_FALLBACK English ; Language to use for missing strings
!insertmacro MyLangLoad Bork
!insertmacro MyLangLoad Danish
!insertmacro MyLangLoad English

Function .onInit
StrCpy $LANGUAGE ${LANG_BORK} ; TODO: Use LangDLL or some algorithm to select the language here
FunctionEnd

Section
SetDetailsView show
DetailPrint LangId=$LANGUAGE
DetailPrint "$(foo)"
DetailPrint "$(bar)"
SectionEnd