【问题标题】:How LangString not translated can use a default language?未翻译的LangString 怎么可以使用默认语言?
【发布时间】:2013-02-06 11:45:44
【问题描述】:

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

例如:

!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"

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

【问题讨论】:

  • 恕我直言,使用其他语言的后备字符串没有意义,您应该翻译所有字符串或根本不支持该语言...

标签: nsis


【解决方案1】:

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

#!/usr/bin/perl
#
# filltranslationgaps.pl 

# Get list of included languages
my $tmp = uc(`grep "^!insertmacro MUI_LANGUAGE" installer.nsi |grep -v ";" |cut -f2 -d\\"`);
my @lang = split(/\n/, $tmp);
my $DEFAULTLANGUAGE = $lang[0];

# Get langstrings
open( $fh, "<installer.nsi");
while (<$fh>) {
        if (/LangString *(.*?) *\${LANG_(.*?)} *\"(.*)\"/)  {
                $phrases{$1}{$2}=$3;
        }
}
close $fh;

# Foreach Langstring, check if it's defined in all included languages.
foreach my $k (keys %phrases) {
        foreach my $j (@lang) {
                if (not defined $phrases{$k}{$j}) {
                        #print "MISSING PAIR: $k\t$j\n";
                        print "LangString $k \${LANG_$j} \"$phrases{$DEFAULTLANGUAGE}{$j}\"\n";
                }
        }
}

我的编译脚本:

#/bin/sh
perl filltranslationgaps.pl >missingphrases.nsi
makensis installer.nsi

在installer.nsi 中我需要包含生成的nsi:

!include  missingphrases.nsi

希望对你有帮助。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多