2001-06-02 06:02:08 +04:00
|
|
|
#!/usr/bin/perl -w
|
|
|
|
|
|
|
|
#
|
|
|
|
# GNOME PO Update Utility
|
|
|
|
#
|
|
|
|
# Copyright (C) 2000 Free Software Foundation.
|
|
|
|
#
|
|
|
|
# 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
#
|
|
|
|
# Authors: Kenneth Christiansen <kenneth@gnu.org>
|
|
|
|
#
|
|
|
|
|
|
|
|
# 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 (<FILE>) {
|
|
|
|
# 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 <kenneth\@gnome.org>, 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 <kenneth\@gnome.org>.\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>;
|
|
|
|
@buf1_2 = <BUF2>;
|
|
|
|
|
|
|
|
# Check if we should ignore some found files, when
|
|
|
|
# comparing with POTFILES.in
|
|
|
|
#-------------------------------------------------
|
|
|
|
if (-s ".potignore"){
|
|
|
|
open FILE, ".potignore";
|
|
|
|
while (<FILE>) {
|
|
|
|
if ($_=~/^[^#]/o){
|
|
|
|
push @bup, $_;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
print "Found .potignore: Ignoring files...\n";
|
|
|
|
@buf1_2 = (@bup, @buf1_2);
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach my $file (@buf1_1){
|
|
|
|
open FILE, "<$file";
|
|
|
|
while (<FILE>) {
|
|
|
|
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, "<POTFILES.in";
|
|
|
|
while (<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.old";
|
|
|
|
open OUTFILE, ">POTFILES.in";
|
|
|
|
while (<INFILE>) {
|
|
|
|
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\=\.\."
|
2003-02-10 14:33:43 +03:00
|
|
|
." --add-comments --keyword\=\_ --keyword\=N\_ --keyword\=P_\:1,2"
|
2001-06-02 06:02:08 +04:00
|
|
|
." --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";
|
|
|
|
}
|