#!/usr/bin/perl -w # # GNOME PO Update Utility # # Copyright (C) 2000, 2003 Free Software Foundation, Inc. # # This script is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or (at # your option) any later version. # # This script is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, # USA. # # Authors: Kenneth Christiansen # # NOTICE: Please remember to change the variable $PACKAGE to reflect # the package this script is used within. $PACKAGE="nano"; use File::Basename; # Declare global variables #------------------------- my $VERSION = "1.5beta5"; my $LANG = $ARGV[0]; # Always print as the first thing #-------------------------------- $| = 1; # Figure out what package that is in use #--------------------------------------- #open FILE, "../configure.in"; # while () { # next if /^dnl/; #ignore comments # if ($_=~/AM_INIT_AUTOMAKE\((.*),(.*)\)/o){ # $PACKAGE=$1; # last; #stop when found # } # if ($_=~/PACKAGE\((.*)\)/o){ # $PACKAGE=$1; # last; #stop when found # } # } #close FILE; # Give error if script is run without an argument #------------------------------------------------ if (! $LANG){ print "update.pl: missing file arguments\n"; print "Try `update.pl --help' for more information.\n"; exit; } # Use the supplied arguments #--------------------------- if ($LANG=~/^-(.)*/){ if ("$LANG" eq "--version" || "$LANG" eq "-V"){ &Version; } elsif ($LANG eq "--help" || "$LANG" eq "-H"){ &Help; } elsif ($LANG eq "--dist" || "$LANG" eq "-D"){ &Merging; } elsif ($LANG eq "--pot" || "$LANG" eq "-P"){ # Check for .headerlock file, so the Makefile # will not generate the header files twise #-------------------------------------------- if (-e ".headerlock"){ &GeneratePot; }else{ &GenHeaders; &GeneratePot;} exit; } elsif ($LANG eq "--headers" || "$LANG" eq "-S"){ &GenHeaders; exit; } elsif ($LANG eq "--maintain" || "$LANG" eq "-M"){ &Maintain; } else { &InvalidOption; } } else { # Run standard procedure #----------------------- if(-s "$LANG.po"){ &GenHeaders; &GeneratePot; &Merging; &Status; } # Report error if the language file supplied # to the command line is non-existent #------------------------------------------- else { &NotExisting; } } sub Version{ # Print version information #-------------------------- print "GNOME PO Updater $VERSION\n"; print "Written by Kenneth Christiansen , 2000.\n\n"; print "Copyright (C) 2000 Free Software Foundation, Inc.\n"; print "This is free software; see the source for copying conditions. There is NO\n"; print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"; exit; } sub Help{ # Print usage information #------------------------ print "Usage: ./update.pl [OPTIONS] ...LANGCODE\n"; print "Updates pot files and merge them with the translations.\n\n"; print " -H, --help shows this help page\n"; print " -P, --pot generate the pot file only\n"; print " -S, --headers generate the XML headerfiles in POTFILES.in\n"; print " -M, --maintain search for missing files in POTFILES.in\n"; print " -V, --version shows the version\n"; print "\nExamples of use:\n"; print "update.sh --pot just creates a new pot file from the source\n"; print "update.sh da created new pot file and updated the da.po file\n\n"; print "Report bugs to .\n"; exit; } sub Maintain{ # Search and fine, all translatable files # --------------------------------------- $i18nfiles="find ../ -print | egrep '.*\\.(c|y|cc|c++|h|gob)' "; open(BUF2, "POTFILES.in") || die "update.pl: there's no POTFILES.in!!!\n"; print "Searching for missing _(\" \") entries...\n"; open(BUF1, "$i18nfiles|"); @buf1_1 = ; @buf1_2 = ; # Check if we should ignore some found files, when # comparing with POTFILES.in #------------------------------------------------- if (-s ".potignore"){ open FILE, ".potignore"; while () { if ($_=~/^[^#]/o){ push @bup, $_; } } print "Found .potignore: Ignoring files...\n"; @buf1_2 = (@bup, @buf1_2); } foreach my $file (@buf1_1){ open FILE, "<$file"; while () { if ($_=~/_\(\"/o){ $file = unpack("x3 A*",$file) . "\n"; push @buf2_1, $file; last; } } } @buf3_1 = sort (@buf2_1); @buf3_2 = sort (@buf1_2); my %in2; foreach (@buf3_2) { $in2{$_} = 1; } foreach (@buf3_1){ if (!exists($in2{$_})){ push @result, $_ } } # Save file with information about the files missing # if any, and give information about this proceedier #--------------------------------------------------- if(@result){ open OUT, ">missing"; print OUT @result; print "\nHere is the result:\n\n", @result, "\n"; print "The file \"missing\" has been placed in the current directory.\n"; print "Files supposed to be ignored should be placed in \".potignore\"\n"; } # If there is nothing to complain about, notice the user #------------------------------------------------------- else{ print "\nWell, it's all perfect! Congratulation!\n"; } } sub InvalidOption{ # Handle invalid arguments #------------------------- print "update.pl: invalid option -- $LANG\n"; print "Try `update.pl --help' for more information.\n"; } sub GenHeaders{ # Generate the .h header files, so we can allow glade and # xml translation support #-------------------------------------------------------- if(-s "ui-extract.pl"){ print "Found ui-extract.pl script\nRunning ui-extract...\n"; open FILE, ") { # Find .xml files in POTFILES.in and generate the # files with help from the ui-extract.pl script #-------------------------------------------------- if ($_=~ /(.*)(\.xml)/o){ $filename = "../$1.xml"; $xmlfiles="perl \.\/ui-extract.pl --local $filename"; system($xmlfiles); } # Find .glade files in POTFILES.in and generate # the files with help from the ui-extract.pl script #-------------------------------------------------- elsif ($_=~ /(.*)(\.glade)/o){ $filename = "../$1.glade"; $xmlfiles="perl \.\/ui-extract.pl --local $filename"; system($xmlfiles); } } close FILE; # Create .headerlock file, so the script will know # that we already passed this section. This is required # since the individual sections can be reaced at different # times by the Makefile #--------------------------------------------------------- system("touch .headerlock"); } } sub GeneratePot{ # Generate the potfiles from the POTFILES.in file #------------------------------------------------ print "Building the $PACKAGE.pot...\n"; system ("mv POTFILES.in POTFILES.in.old"); open INFILE, "POTFILES.in"; while () { if ($_ =~ /\.(glade|xml)$/) { s/\.glade$/\.glade\.h/; s/\.xml$/\.xml\.h/; $_ = basename($_); $_ = "po/tmp/$_\n"; } print OUTFILE $_; } close OUTFILE; close INFILE; $GETTEXT ="xgettext --default-domain\=$PACKAGE --directory\=\.\." ." --add-comments --keyword\=\_ --keyword\=N\_ --keyword\=P_\:1,2" ." --files-from\=\.\/POTFILES\.in "; $GTEST ="test \! -f $PACKAGE\.po \|\| \( rm -f \.\/$PACKAGE\.pot " ."&& mv $PACKAGE\.po \.\/$PACKAGE\.pot \)"; system($GETTEXT); system($GTEST); print "Wrote $PACKAGE.pot\n"; system("mv POTFILES.in.old POTFILES.in"); # If .headerlock file is found, it means that the potfiles # already has been generated. If so delete the generated # .h header files. The reason for this approach with a # file as a marker is due to that the Makefile runs the # scripts in turns #--------------------------------------------------------- if(-e ".headerlock"){ unlink(".headerlock"); print "Removing generated header (.h) files..."; system("rm ./tmp/ -rf"); } print "done\n"; } sub Merging{ if ($ARGV[1]){ $LANG = $ARGV[1]; } else { $LANG = $ARGV[0]; } if ($ARGV[0] ne "--dist" && $ARGV[0] ne "-D") { print "Merging $LANG.po with $PACKAGE.pot..."; } $MERGE="cp $LANG.po $LANG.po.old && msgmerge $LANG.po.old $PACKAGE.pot -o $LANG.po"; system($MERGE); if ($ARGV[0] ne "--dist" && $ARGV[0] ne "-D") { print "\n\n"; } # Remove the "messages" trash file generated # by gettext, aswell as the backup file #------------------------------------------- unlink "messages"; unlink "$LANG.po.old"; } sub NotExisting{ # Report error if supplied language # file is non-existant #---------------------------------- print "update.pl: sorry, $LANG.po does not exist!\n"; print "Try `update.pl --help' for more information.\n"; exit; } sub Status{ # Print status information about the po file #------------------------------------------- $STATUS="msgfmt --statistics $LANG.po"; system($STATUS); print "\n"; }