Updated compendium-de date
[gpg4win.git] / src / make-msi.pl
index 00d287c..df5bbe0 100644 (file)
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 
+# FIXME: Here is how to support multiple languages in one MSI package,
+# using an undocumented feature: Create one MSI package in each
+# language, then create transformations:
+# MsiTran.Exe -g foo.en.msi foo.de.msi language.de.mst
+# Embed these transformations:
+# CScript.exe WiSubStg.vbs foo.en.msi language.de.mst 1031
+# Change the summmary informations attribute (with Orca):
+# Languages = 1033, 1031
+# Primary language must come first!
+# http://www.installsite.org/pages/de/artikel/embeddedlang/index.htm
+# http://forum.installsite.net/index.php?showtopic=16734
+
 use strict;
 use warnings;
 use diagnostics;
@@ -134,6 +146,22 @@ sub lang_to_lcid
     {
        return 1031;
     }
+    elsif ($lang eq 'ar')
+    {
+       return 1025;
+    }
+    elsif ($lang eq 'es')
+    {
+       return 3082;
+    }
+    elsif ($lang eq 'fr')
+    {
+       return 1036;
+    }
+    elsif ($lang eq 'ru')
+    {
+       return 1049;
+    }
     else
     {
        fail "language $lang not supported";
@@ -503,13 +531,20 @@ sub nsis_parse_line
        {
            fail "$file:$.: syntax error" if $#tokens != 1;
 
-           print STDERR "Including $tokens[1]\n"
-               if $::nsis_parser_debug;
-
-           my $filename = nsis_eval ($parser, $file, $tokens[1]);
-
-           # Recursion.
-           nsis_parse_file ($parser, $filename);
+           if ($tokens[1] eq 'Memento.nsh')
+           {
+               print STDERR "Skipping $tokens[1]\n"
+                   if $::nsis_parser_debug;
+           }
+           else
+           {       print STDERR "Including $tokens[1]\n"
+                       if $::nsis_parser_debug;
+                   
+                   my $filename = nsis_eval ($parser, $file, $tokens[1]);
+                   
+                   # Recursion.
+                   nsis_parse_file ($parser, $filename);
+           }
        }
        elsif ($tokens[0] eq '!macro')
        {
@@ -652,13 +687,21 @@ sub gpg4win_nsis_stubs
     # We parse SetOutPath and File directives in sections.
     # Everything else is ignored.
 
-    elsif ($parser->{state} eq '' and $command eq 'Section')
+    elsif ($parser->{state} eq ''
+          and ($command eq 'Section' or $command eq '${MementoSection}'
+               or $command eq '${MementoUnselectedSection}'))
     {
        my $idx = 0;
        # Default install level for MSI is 3.
        my $level = $::nsis_level_default;
        my $hidden = 0;
        
+       if ($command eq '${MementoUnselectedSection}')
+       {
+           # Default install level for MSI is 3.
+           $level = $::nsis_level_optional;
+       }
+
        # Check for options first.
        return if ($idx > $#args);
        if ($args[$idx] eq '/o')
@@ -667,7 +710,7 @@ sub gpg4win_nsis_stubs
            $level = $::nsis_level_optional;
            $idx++;
        }
-
+       
        return if ($idx > $#args);
 
        my $title = nsis_eval ($parser, $file, $args[$idx++]);
@@ -681,7 +724,7 @@ sub gpg4win_nsis_stubs
            $hidden = 1;
            substr ($title, 0, 1) = '';
        }
-               
+
        # We only pay attention to special sections and those which
        # have a section index defined.
        if ($title eq 'startmenu')
@@ -715,7 +758,7 @@ sub gpg4win_nsis_stubs
     }
     elsif ($parser->{state} eq 'in-section')
     {
-       if ($command eq 'SectionEnd')
+       if ($command eq 'SectionEnd' or $command eq '${MementoSectionEnd}')
        {
            delete $parser->{pkg};
            undef $parser->{state};
@@ -725,11 +768,19 @@ sub gpg4win_nsis_stubs
            fail "$file:$.: syntax error" if ($#args != 0);
 
            my $outpath = $args[0];
-           if (not $outpath =~ s/^"\$INSTDIR\\?(.*)"$/$1/)
+#          if (not $outpath =~ s/^"\$INSTDIR\\?(.*)"$/$1/)
+           if ($outpath =~ m/^"\$INSTDIR\\?(.*)"$/)
+           {
+               $parser->{outpath} = $1;
+           }
+           elsif ($outpath =~ m/^"\$APPDATA\\?(.*)"$/)
+           {
+               $parser->{outpath} = "%CommonAppDataFolder%\\" . $1;
+           }
+           else
            {
                fail "$file:$.: unsupported out path: $args[0]";
            }
-           $parser->{outpath} = $outpath;
        }
        elsif ($command eq 'File')
        {
@@ -797,7 +848,7 @@ sub gpg4win_nsis_stubs
 
     elsif ($parser->{state} eq 'section-startmenu')
     {
-       if ($command eq 'SectionEnd')
+       if ($command eq 'SectionEnd' or $command eq '${MementoSectionEnd}')
        {
            undef $parser->{state};
        }
@@ -813,7 +864,8 @@ sub gpg4win_nsis_stubs
            # for a block between two labels.
            return if ($link !~ m/STARTMENU_FOLDER/);
 
-           # Take the base name of the link.  */
+           # Take the base name of the link.
+           # FIXME: We want the manuals in a subdirectory.
            $link =~ s/^.*\\([^\\]*)\"$/$1/;
            $link =~ s/\.lnk$//;
 
@@ -856,6 +908,22 @@ sub gpg4win_nsis_stubs
        {
            $lang = 'de';
        }
+       elsif ($lang eq 'ARABIC')
+       {
+           $lang = 'ar';
+       }
+       elsif ($lang eq 'SPANISH')
+       {
+           $lang = 'es';
+       }
+       elsif ($lang eq 'FRENCH')
+       {
+           $lang = 'fr';
+       }
+       elsif ($lang eq 'RUSSIAN')
+       {
+           $lang = 'ru';
+       }
        else
        {
            fail "$file:$.: unsupported language ID $args[1]";
@@ -1316,10 +1384,13 @@ sub dump_all2
        {
            my $deppkg = $parser->{pkgs}->{$dep};
            
+           # We use Level=1 because with InstallDefault followParent
+           # the Level seems to specify some sort of minimum install
+           # level or something (FIXME: confirm this).
            print ' ' x $::level
                . "  <Feature Id='p_$pkg->{name}_$dep' "
                . "Title='p_$pkg->{name}_$dep' "
-               . "Level='$pkg->{level}' Display='hidden' "
+               . "Level='1' Display='hidden' "
                . "InstallDefault='followParent'>\n";
            $::level += 2;
            dump_meat ($deppkg);