xref: /AOO41X/main/solenv/bin/modules/installer/languagepack.pm (revision fe22d2cfc602815794415026f1317bd625db6f83)
1#**************************************************************
2#
3#  Licensed to the Apache Software Foundation (ASF) under one
4#  or more contributor license agreements.  See the NOTICE file
5#  distributed with this work for additional information
6#  regarding copyright ownership.  The ASF licenses this file
7#  to you under the Apache License, Version 2.0 (the
8#  "License"); you may not use this file except in compliance
9#  with the License.  You may obtain a copy of the License at
10#
11#    http://www.apache.org/licenses/LICENSE-2.0
12#
13#  Unless required by applicable law or agreed to in writing,
14#  software distributed under the License is distributed on an
15#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16#  KIND, either express or implied.  See the License for the
17#  specific language governing permissions and limitations
18#  under the License.
19#
20#**************************************************************
21
22
23
24package installer::languagepack;
25
26use installer::converter;
27use installer::existence;
28use installer::files;
29use installer::globals;
30use installer::logger;
31use installer::pathanalyzer;
32use installer::scpzipfiles;
33use installer::scriptitems;
34use installer::systemactions;
35use installer::worker;
36
37####################################################
38# Selecting all files with the correct language
39####################################################
40
41sub select_language_items
42{
43    my ( $itemsref, $languagesarrayref, $itemname ) = @_;
44
45    installer::logger::include_header_into_logfile("Selecting languages for language pack. Item: $itemname");
46
47    my @itemsarray = ();
48
49    for ( my $i = 0; $i <= $#{$itemsref}; $i++ )
50    {
51        my $oneitem = ${$itemsref}[$i];
52
53        my $ismultilingual = $oneitem->{'ismultilingual'};
54
55        if (!($ismultilingual))
56        {
57            # Files with style "LANGUAGEPACK" and "FORCELANGUAGEPACK" also have to be included into the language pack.
58            # Files with style "LANGUAGEPACK" are only included into language packs.
59            # Files with style "FORCELANGUAGEPACK" are included into language packs and non language packs. They are
60            # forced, because otherwise they not not be included into languagepacks.
61
62            my $styles = "";
63            if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
64
65            if (( $styles =~ /\bLANGUAGEPACK\b/ ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) { push(@itemsarray, $oneitem); }
66
67            next;   # single language files are not included into language pack
68        }
69
70        my $specificlanguage = "";
71        if ( $oneitem->{'specificlanguage'} ) { $specificlanguage = $oneitem->{'specificlanguage'}; }
72
73        for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ )   # iterating over all languages
74        {
75            my $onelanguage = ${$languagesarrayref}[$j];
76            my $locallang = $onelanguage;
77            $locallang =~ s/-/_/;
78
79            if ( $specificlanguage eq $onelanguage )
80            {
81                # $oneitem->{'modules'} = $installer::globals::rootmodulegid;    # all files in a language pack are root files
82                # Using $installer::globals::languagemodulesbase (?)
83
84#               # no more automatic change of module assignments
85#               $oneitem->{'modules'} = $installer::globals::rootmodulegid . "_$locallang";      # all files in a language pack are root files
86#
87#               if (( $installer::globals::islinuxbuild ) || ( $installer::globals::issolarispkgbuild ))
88#               {
89#                   if ( $oneitem->{'Dir'} )
90#                   {
91#                       if ( $oneitem->{'Dir'} eq "gid_Dir_Fonts_Truetype" ) { $oneitem->{'modules'} = "gid_Module_Langpack_Fonts_$locallang"; }
92#                       if ( $oneitem->{'Dir'} eq "gid_Dir_Resource" ) { $oneitem->{'modules'} = "gid_Module_Langpack_Resource_$locallang"; }
93#                       if ( $oneitem->{'Dir'} eq "gid_Dir_Help_Isolanguage" ) { $oneitem->{'modules'} = "gid_Module_Langpack_Help_$locallang"; }
94#                   }
95#               }
96
97                # preparing different modules for Windows Installer language packs
98                # my $underlinelanguage = $specificlanguage;
99                # $underlinelanguage =~ s/-/_/;
100                # if ( $installer::globals::iswindowsbuild ) { $oneitem->{'modules'} = $installer::globals::languagemodulesbase . $underlinelanguage; }
101
102#               # no more collecting of language pack feature
103#               if (! installer::existence::exists_in_array($oneitem->{'modules'}, \@installer::globals::languagepackfeature))
104#               {
105#                   push(@installer::globals::languagepackfeature, $oneitem->{'modules'});  # Collecting all language pack feature
106#               }
107
108                push(@itemsarray, $oneitem);
109            }
110        }
111    }
112
113    return \@itemsarray;
114}
115
116sub replace_languagestring_variable
117{
118    my ($onepackageref, $languagestringref) = @_;
119
120    my $key;
121
122    foreach $key (keys %{$onepackageref})
123    {
124        my $value = $onepackageref->{$key};
125        $value =~ s/\%LANGUAGESTRING/$$languagestringref/g;
126        $onepackageref->{$key} = $value;
127    }
128}
129
130#########################################################
131# Including the license text into the script template
132#########################################################
133
134sub put_license_file_into_script
135{
136    my ($scriptfile, $licensefile) = @_;
137
138    my $infoline = "Adding licensefile into language pack script\n";
139    $installer::logger::Lang->print($infoline);
140
141    my $includestring = "";
142
143    for ( my $i = 0; $i <= $#{$licensefile}; $i++ )
144    {
145        $includestring = $includestring . ${$licensefile}[$i];
146    }
147
148    for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
149    {
150        ${$scriptfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/;
151    }
152}
153
154#########################################################
155# Creating a tar.gz file from a Solaris package
156#########################################################
157
158sub create_tar_gz_file
159{
160    my ($installdir, $packagename, $packagestring) = @_;
161
162    $packagename =~ s/\.rpm\s*$//;
163    my $targzname = $packagename . ".tar.gz";
164    $systemcall = "cd $installdir; tar -cf - $packagestring | gzip > $targzname";
165    $installer::logger::Info->printf("... %s ...\n", $systemcall);
166
167    my $returnvalue = system($systemcall);
168
169    my $infoline = "Systemcall: $systemcall\n";
170    $installer::logger::Lang->print($infoline);
171
172    if ($returnvalue)
173    {
174        $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
175        $installer::logger::Lang->print($infoline);
176    }
177    else
178    {
179        $infoline = "Success: Executed \"$systemcall\" successfully!\n";
180        $installer::logger::Lang->print($infoline);
181    }
182
183    return $targzname;
184}
185
186#########################################################
187# Determining the name of the package file
188#########################################################
189
190sub get_packagename_from_packagelist
191{
192    my ( $alldirs, $allvariables, $languagestringref ) = @_;
193
194    # my $packagename = "";
195
196    # for ( my $i = 0; $i <= $#{$alldirs}; $i++ )
197    # {
198    #   if ( ${$alldirs}[$i] =~ /-fonts/ ) { next; }
199    #   if ( ${$alldirs}[$i] =~ /-help/ ) { next; }
200    #   if ( ${$alldirs}[$i] =~ /-res/ ) { next; }
201    #
202    #   $packagename = ${$alldirs}[$i];
203    #   last;
204    # }
205
206    # if ( $packagename eq "" ) { installer::exiter::exit_program("ERROR: Could not find base package in directory $installdir!", "get_packagename_from_packagelist"); }
207
208    my $localproductname = $allvariables->{'PRODUCTNAME'};
209    $localproductname = lc($localproductname);
210    $localproductname =~ s/ //g;
211    $localproductname =~ s/-/_/g;
212
213    my $packagename = $localproductname . "_" . $$languagestringref;
214
215    return $packagename;
216}
217
218#########################################################
219# Determining the name of the package file or the rpm
220# in the installation directory. For language packs
221# there is only one file in this directory
222#########################################################
223
224sub determine_packagename
225{
226    my ( $installdir, $allvariables, $languagestringref ) = @_;
227
228    my $packagename = "";
229    my $allnames = "";
230
231    if ( $installer::globals::islinuxrpmbuild )
232    {
233        # determining the rpm file in directory $installdir
234
235        my $fileextension = "rpm";
236        my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $installdir);
237        if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); }
238        my $rpmsav = installer::converter::copy_array_from_references($rpmfiles);
239        for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); }
240
241        $packagename = get_packagename_from_packagelist($rpmfiles, $allvariables, $languagestringref);
242
243        my $packagestring = installer::converter::convert_array_to_space_separated_string($rpmfiles);
244        $packagename = create_tar_gz_file($installdir, $packagename, $packagestring);   # only one file
245        for ( my $i = 0; $i <= $#{$rpmsav}; $i++ )
246        {
247            my $onefile = $installdir . $installer::globals::separator . ${$rpmsav}[$i];
248            unlink($onefile);
249        }
250
251        $allnames = $rpmfiles;
252    }
253
254    if ( $installer::globals::issolarisbuild )
255    {
256        # determining the Solaris package file in directory $installdir
257        my $alldirs = installer::systemactions::get_all_directories($installdir);
258
259        if ( ! ( $#{$alldirs} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); }
260        my $alldirssav = installer::converter::copy_array_from_references($alldirs);
261        for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$alldirs}[$i]); }
262
263        $packagename = get_packagename_from_packagelist($alldirs, $allvariables, $languagestringref);
264        my $packagestring = installer::converter::convert_array_to_space_separated_string($alldirs);
265        $packagename = create_tar_gz_file($installdir, $packagename, $packagestring);   # only a file (not a directory) can be included into the shell script
266        for ( my $i = 0; $i <= $#{$alldirssav}; $i++ ) { installer::systemactions::remove_complete_directory(${$alldirssav}[$i], 1); }
267        $allnames = $alldirs;
268    }
269
270    my $infoline = "Found package in installation directory $installdir : $packagename\n";
271    $installer::logger::Lang->print($infoline);
272
273    return ( $packagename, $allnames);
274}
275
276#########################################################
277# Including the name of the package file or the rpm
278# into the script template
279#########################################################
280
281sub put_packagename_into_script
282{
283    my ($scriptfile, $packagename, $allnames) = @_;
284
285    my $localpackagename = $packagename;
286    $localpackagename =~ s/\.tar\.gz//; # making "OOOopenoffice-it-ea.tar.gz" to "OOOopenoffice-it-ea"
287    my $infoline = "Adding packagename $localpackagename into language pack script\n";
288    $installer::logger::Lang->print($infoline);
289
290    my $installline = "";
291
292    if ( $installer::globals::issolarisbuild ) { $installline = "  /usr/sbin/pkgadd -d \$outdir -a \$adminfile"; }
293
294    if ( $installer::globals::islinuxrpmbuild ) { $installline = "  rpm --prefix \$PRODUCTINSTALLLOCATION --replacepkgs -i"; }
295
296    for ( my $i = 0; $i <= $#{$allnames}; $i++ )
297    {
298        if ( $installer::globals::issolarisbuild ) { $installline = $installline . " ${$allnames}[$i]"; }
299
300        if ( $installer::globals::islinuxrpmbuild ) { $installline = $installline . " \$outdir/${$allnames}[$i]"; }
301    }
302
303    for ( my $j = 0; $j <= $#{$scriptfile}; $j++ )
304    {
305        ${$scriptfile}[$j] =~ s/INSTALLLINES/$installline/;
306    }
307}
308
309##################################################################
310# Including the lowercase product name into the script template
311##################################################################
312
313sub put_productname_into_script
314{
315    my ($scriptfile, $variableshashref) = @_;
316
317    my $productname = $variableshashref->{'PRODUCTNAME'};
318    $productname = lc($productname);
319    $productname =~ s/\.//g;    # openoffice.org -> openofficeorg
320
321    my $infoline = "Adding productname $productname into language pack script\n";
322    $installer::logger::Lang->print($infoline);
323
324    for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
325    {
326        ${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/;
327    }
328}
329
330##################################################################
331# Including the full product name into the script template
332# (name and version)
333##################################################################
334
335sub put_fullproductname_into_script
336{
337    my ($scriptfile, $variableshashref) = @_;
338
339    my $productname = $variableshashref->{'PRODUCTNAME'};
340    my $productversion = "";
341    if ( $variableshashref->{'PRODUCTVERSION'} ) { $productversion = $variableshashref->{'PRODUCTVERSION'}; };
342    my $fullproductname = $productname . " " . $productversion;
343
344    my $infoline = "Adding full productname \"$fullproductname\" into language pack script\n";
345    $installer::logger::Lang->print($infoline);
346
347    for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
348    {
349        ${$scriptfile}[$i] =~ s/FULLPRODUCTNAMELONGPLACEHOLDER/$fullproductname/;
350    }
351}
352
353##################################################################
354# Including the name of the search package (-core01)
355# into the script template
356##################################################################
357
358sub put_searchpackage_into_script
359{
360    my ($scriptfile, $variableshashref) = @_;
361
362    my $basispackageprefix = $variableshashref->{'BASISPACKAGEPREFIX'};
363    my $basispackageversion = $variableshashref->{'OOOBASEVERSION'};
364
365    if ( $installer::globals::issolarisbuild ) { $basispackageversion =~ s/\.//g; } # "3.0" -> "30"
366
367    my $infoline = "Adding basis package prefix $basispackageprefix into language pack script\n";
368    $installer::logger::Lang->print($infoline);
369
370    $infoline = "Adding basis package version $basispackageversion into language pack script\n";
371    $installer::logger::Lang->print($infoline);
372
373    for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
374    {
375        ${$scriptfile}[$i] =~ s/BASISPACKAGEPREFIXPLACEHOLDER/$basispackageprefix/;
376        ${$scriptfile}[$i] =~ s/OOOBASEVERSIONPLACEHOLDER/$basispackageversion/;
377    }
378
379}
380
381#########################################################
382# Including the linenumber into the script template
383#########################################################
384
385sub put_linenumber_into_script
386{
387    my ( $scriptfile, $licensefile, $allnames ) = @_;
388
389    my $linenumber =  $#{$scriptfile} + $#{$licensefile} + 3;   # also adding the content of the license file!
390
391    my $infoline = "Adding linenumber $linenumber into language pack script\n";
392    $installer::logger::Lang->print($infoline);
393
394    for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
395    {
396        ${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/;
397    }
398}
399
400#########################################################
401# Determining the name of the new scriptfile
402#########################################################
403
404sub determine_scriptfile_name
405{
406    my ( $packagename ) = @_;
407
408    my $scriptfilename = $packagename;
409
410#   if ( $installer::globals::islinuxrpmbuild ) { $scriptfilename =~ s/\.rpm\s*$/\.sh/; }
411#   if ( $installer::globals::issolarisbuild ) { $scriptfilename =~ s/\.tar\.gz\s*$/\.sh/; }
412
413    $scriptfilename =~ s/\.tar\.gz\s*$/\.sh/;
414
415    my $infoline = "Setting language pack script file name to $scriptfilename\n";
416    $installer::logger::Lang->print($infoline);
417
418    return $scriptfilename;
419}
420
421#########################################################
422# Saving the script file in the installation directory
423#########################################################
424
425sub save_script_file
426{
427    my ($installdir, $newscriptfilename, $scriptfile) = @_;
428
429    $newscriptfilename = $installdir . $installer::globals::separator . $newscriptfilename;
430    installer::files::save_file($newscriptfilename, $scriptfile);
431
432    my $infoline = "Saving script file $newscriptfilename\n";
433    $installer::logger::Lang->print($infoline);
434
435    return $newscriptfilename;
436}
437
438#########################################################
439# Including the binary package into the script
440#########################################################
441
442sub include_package_into_script
443{
444    my ( $scriptfilename, $installdir, $packagename ) = @_;
445
446    my $longpackagename = $installdir . $installer::globals::separator . $packagename;
447    my $systemcall = "cat $longpackagename >>$scriptfilename";
448
449    my $returnvalue = system($systemcall);
450
451    my $infoline = "Systemcall: $systemcall\n";
452    $installer::logger::Lang->print($infoline);
453
454    if ($returnvalue)
455    {
456        $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
457        $installer::logger::Lang->print($infoline);
458    }
459    else
460    {
461        $infoline = "Success: Executed \"$systemcall\" successfully!\n";
462        $installer::logger::Lang->print($infoline);
463    }
464
465    my $localcall = "chmod 775 $scriptfilename \>\/dev\/null 2\>\&1";
466    system($localcall);
467
468}
469
470#########################################################
471# Removing the binary package
472#########################################################
473
474sub remove_package
475{
476    my ( $installdir, $packagename ) = @_;
477
478    my $remove_package = 1;
479
480    if ( $ENV{'DONT_REMOVE_PACKAGE'} ) { $remove_package = 0; }
481
482    if ( $remove_package )
483    {
484        my $longpackagename = $installdir . $installer::globals::separator . $packagename;
485        unlink $longpackagename;
486
487        my $infoline = "Removing package: $longpackagename \n";
488        $installer::logger::Lang->print($infoline);
489    }
490}
491
492####################################################
493# Unix language packs, that are not part of
494# multilingual installation sets, need a
495# shell script installer
496####################################################
497
498sub build_installer_for_languagepack
499{
500    my ($installdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref) = @_;
501
502    $installer::logger::Info->print("... creating shell script installer ...\n");
503
504    installer::logger::include_header_into_logfile("Creating shell script installer:");
505
506    # find and read setup script template
507
508    my $scriptfilename = "langpackscript.sh";
509    my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0);
510    if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find script file $scriptfilename!", "build_installer_for_languagepack"); }
511    my $scriptfile = installer::files::read_file($$scriptref);
512
513    my $infoline = "Found  script file $scriptfilename: $$scriptref \n";
514    $installer::logger::Lang->print($infoline);
515
516    # find and read english license file
517    my $licenselanguage = "en-US";                  # always english !
518    my $licensefilename = "LICENSE";
519    my $licenseincludepatharrayref = installer::worker::get_language_specific_include_pathes($includepatharrayref, $licenselanguage);
520
521    my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0);
522    if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "build_installer_for_languagepack"); }
523    my $licensefile = installer::files::read_file($$licenseref);
524
525    $infoline = "Found licensefile $licensefilename: $$licenseref \n";
526    $installer::logger::Lang->print($infoline);
527
528    # including variables into license file
529    installer::scpzipfiles::replace_all_ziplistvariables_in_file($licensefile, $allvariableshashref);
530
531    # add license text into script template
532    put_license_file_into_script($scriptfile, $licensefile);
533
534    # add rpm or package file name into script template
535    my ( $packagename, $allnames) = determine_packagename($installdir, $allvariableshashref, $languagestringref);
536    put_packagename_into_script($scriptfile, $packagename, $allnames);
537
538    # add product name into script template
539    put_productname_into_script($scriptfile, $allvariableshashref);
540
541    # add product name into script template
542    put_fullproductname_into_script($scriptfile, $allvariableshashref);
543
544    # add product name into script template
545    put_searchpackage_into_script($scriptfile, $allvariableshashref);
546
547    # replace linenumber in script template
548    put_linenumber_into_script($scriptfile, $licensefile, $allnames);
549
550    # saving the script file
551    my $newscriptfilename = determine_scriptfile_name($packagename);
552    $newscriptfilename = save_script_file($installdir, $newscriptfilename, $scriptfile);
553
554    # include rpm or package into script
555    include_package_into_script($newscriptfilename, $installdir, $packagename);
556
557    # remove rpm or package
558    remove_package($installdir, $packagename);
559}
560
5611;
562