#!/usr/bin/perl # -n do not include custom_ scripts # -a build all file # -m do not generate missing files use FileHandle; use Getopt::Long; Getopt::Long::Configure('bundling'); $basedir = "../.."; $bindir = "$basedir/bin"; $customdir = "$bindir/custom"; $menufile = "menu.ini"; my $excludeCustom = 0; my $buildAll = 0; my $noMissing = 0; my $goodOpt = 0; $goodOpt = GetOptions( 'n' => \$excludeCustom, 'no-custom' => \$excludeCustom, 'a' => \$buildAll, 'build-all' => \$buildAll, 'm' => \$noMissing, 'no-missing' => \$noMissing ); if ( !$goodOpt ) { printf "Invalid options\n"; exit 1; } open( FH, "LANGUAGE" ); $language = ; close(FH); chomp $language; $language =~ s/\((.*)\)/$1/; $charset = $1; opendir DIR, "$bindir" or die "$!"; @progfiles = grep { /\.pl/; !/(_|^\.)/ } readdir DIR; seekdir DIR, 0; @customfiles = grep /_/, readdir DIR; closedir DIR; # put customized files into @customfiles @customfiles = () if ($excludeCustom); if ($excludeCustom) { @menufiles = ($menufile); } else { opendir DIR, "$bindir" or die "$!"; @menufiles = grep { /.*?_$menufile$/ } readdir DIR; closedir DIR; ## unshift @menufiles, $menufile; ## opendir DIR, "$customdir" or die "$!"; ## @menufiles = grep { /^$menufile$/ } readdir DIR; ## closedir DIR; unshift @menufiles, $menufile; } if ( -f "all" ) { eval { require "all"; }; %all = %{ $self{texts} }; %{ $self{texts} } = (); } else { # build %all file from individual files foreach $file (@progfiles) { &scanfile("$bindir/$file"); } } # remove the old missing file if ( -f 'missing' ) { unlink "missing"; } foreach $file (@progfiles) { next if -d "$bindir/$file"; %locale = (); %submit = (); %subrt = (); @missing = (); %missing = (); &scanfile("$bindir/$file"); # scan custom_{module}.pl or {login}_{module}.pl files foreach $customfile (@customfiles) { if ( $customfile =~ /_$file/ ) { if ( -f "$bindir/$customfile" ) { &scanfile("$bindir/$customfile"); } } } # if this is the menu.pl file if ( $file eq 'menu.pl' ) { foreach $item (@menufiles) { &scanmenu("$basedir/$item"); } } $file =~ s/\.pl//; if ( -f "$file.missing" ) { eval { require "$file.missing"; }; unlink "$file.missing"; for ( keys %$missing ) { $self{texts}{$_} ||= $missing->{$_}; } } open FH, '>', "$file" or die "$! : $file"; if ($charset) { print FH qq|\$self{charset} = '$charset';\n\n|; } print FH q|$self{texts} = { |; foreach $key ( sort keys %locale ) { $text = ( $self{texts}{$key} ) ? $self{texts}{$key} : $all{$key}; $count++; $text =~ s/'/\\'/g; $text =~ s/\\$/\\\\/; $keytext = $key; $keytext =~ s/'/\\'/g; $keytext =~ s/\\$/\\\\/; if ( !$text ) { $notext++; push @missing, $keytext; next; } print FH qq| '$keytext'| . ( ' ' x ( 27 - length($keytext) ) ) . qq| => '$text',\n|; } print FH q|}; $self{subs} = { |; foreach $key ( sort keys %subrt ) { $text = $key; $text =~ s/'/\\'/g; $text =~ s/\\$/\\\\/; print FH qq| '$text'| . ( ' ' x ( 27 - length($text) ) ) . qq| => '$text',\n|; } foreach $key ( sort keys %submit ) { $text = ( $self{texts}{$key} ) ? $self{texts}{$key} : $all{$key}; next unless $text; $text =~ s/'/\\'/g; $text =~ s/\\$/\\\\/; $english_sub = $key; $english_sub =~ s/'/\\'/g; $english_sub =~ s/\\$/\\\\/; $english_sub = lc $key; $translated_sub = lc $text; $english_sub =~ s/( |-|,|\/|\.$)/_/g; $translated_sub =~ s/( |-|,|\/|\.$)/_/g; print FH qq| '$translated_sub'| . ( ' ' x ( 27 - length($translated_sub) ) ) . qq| => '$english_sub',\n|; } print FH q|}; 1; |; close FH; if ( !$noMissing ) { if (@missing) { open FH, '>', "$file.missing" or die "$! : missing"; print FH qq|# module $file # add the missing texts and run locales.pl to rebuild \$missing = { |; foreach $text (@missing) { $text =~ s/'/\\'/g; $text =~ s/\\$/\\\\/; print FH qq| '$text'| . ( ' ' x ( 27 - length($text) ) ) . qq| => '',\n|; } print FH q|}; 1; |; close FH; } } # redo the all file if ($buildAll) { open FH, '>', "all" or die "$! : all"; print FH q|# These are all the texts to build the translations files. # to build unique strings edit the module files instead # this file is just a shortcut to build strings which are the same |; if ($charset) { print FH qq|\$self{charset} = '$charset';\n\n|; } print FH q| $self{texts} = { |; foreach $key ( sort keys %all ) { $keytext = $key; $keytext =~ s/'/\\'/g; $keytext =~ s/\\$/\\\\/; $text = $all{$key}; $text =~ s/'/\\'/g; $text =~ s/\\$/\\\\/; print FH qq| '$keytext'| . ( ' ' x ( 27 - length($keytext) ) ) . qq| => '$text',\n|; } print FH q|}; 1; |; close FH; } } $per = sprintf( "%.1f", ( $count - $notext ) / $count * 100 ); print "\n$language - ${per}%\n"; exit; # eof sub scanfile { my ( $file, $level ) = @_; my $fh = new FileHandle; return unless ( -e $file or $file !~ /custom/ ); open $fh, '<', "$file" or die "$! : $file"; $file =~ s/\.pl//; $file =~ s/$bindir\///; %temp = (); for ( keys %{ $self{texts} } ) { $temp{$_} = $self{texts}{$_}; } # read translation file if it exists if ( -f $file ) { eval { do "$file"; }; for ( keys %{ $self{texts} } ) { $all{$_} ||= $self{texts}{$_}; if ($level) { $temp{$_} ||= $self{texts}{$_}; } else { $temp{$_} = $self{texts}{$_}; } } } %{ $self{texts} } = (); for ( sort keys %temp ) { $self{texts}{$_} = $temp{$_}; } while (<$fh>) { # is this another file if (/require\s+\W.*\.pl/) { my $newfile = $&; $newfile =~ s/require\s+\W//; $newfile =~ s/\$form->{path}\///; &scanfile( "$basedir/$newfile", 1 ) if $newfile !~ /_/; } # is this a sub ? if (/^sub /) { ( $null, $subrt ) = split / +/; $subrt{$subrt} = 1; next; } my $rc = 1; while ($rc) { if (/Locale/) { if ( !/^use / ) { my ( $null, $country ) = split /,/; $country =~ s/^ +["']//; $country =~ s/["'].*//; } } if (/\$locale->text.*?\W\)/) { my $string = $&; $string =~ s/\$locale->text\(\s*['"(q|qq)]['\/\\\|~]*//; $string =~ s/\W\)+.*$//; # if there is no $ in the string record it unless ( $string =~ /\$\D.*/ ) { # this guarantees one instance of string $locale{$string} = 1; # is it a submit button before $locale-> if (/type="?submit"?/i) { $submit{$string} = 1; } } } # exit loop if there are no more locales on this line ($rc) = ( $' =~ /\$locale->text/ ); # strip text s/^.*?\$locale->text.*?\)//; } } close($fh); } sub scanmenu { my $file = shift; my $fh = new FileHandle; open $fh, '<', "$file" or die "$! : $file"; my @a = grep /^\[/, <$fh>; close($fh); # strip [] grep { s/(\[|\])//g } @a; foreach my $item (@a) { $item =~ s/ *$//; @b = split /--/, $item; foreach $string (@b) { chomp $string; if ( $string !~ /^\s*$/ ) { $locale{$string} = 1; } } } }