diff options
-rw-r--r-- | po/ChangeLog | 10 | ||||
-rw-r--r-- | po/Makefile.i18npatch | 63 | ||||
-rw-r--r-- | po/POTFILES.in | 16 | ||||
-rwxr-xr-x | po/ui-extract.pl | 182 | ||||
-rwxr-xr-x | po/update.pl | 271 |
5 files changed, 462 insertions, 80 deletions
diff --git a/po/ChangeLog b/po/ChangeLog index 539fdd9371..bd9a5eaee4 100644 --- a/po/ChangeLog +++ b/po/ChangeLog @@ -1,3 +1,13 @@ +2000-11-05 Michael Meeks <michael@helixcode.com> + + * POTFILES.in: update all of ui/*.h to ui/*.xml + + * Makefile.i18npatch: sort out the xml bits. + + * ui-extract.pl: add from Kenneth. + + * update.pl: Update to the version in bonobo. + 2000-11-04 Zbigniew Chyla <cyba@gnome.pl> * pl.po: Updated Polish translation. diff --git a/po/Makefile.i18npatch b/po/Makefile.i18npatch new file mode 100644 index 0000000000..98837e85c2 --- /dev/null +++ b/po/Makefile.i18npatch @@ -0,0 +1,63 @@ +--- Makefile.in.in.clean Sat Oct 28 15:31:52 2000 ++++ Makefile.in.in Sat Oct 28 16:11:18 2000 +@@ -33,7 +33,9 @@ + GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ + MSGFMT = @MSGFMT@ + XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ +-MSGMERGE = PATH=../src:$$PATH msgmerge ++MSGMERGE = PATH=$(top_srcdir)/po:../src:$$PATH perl $(top_srcdir)/po/update.pl --dist ++GENPOT = PATH=$(top_srcdir)/po:../src:$$PATH perl $(top_srcdir)/po/update.pl --pot ++GENHEAD = PATH=$(top_srcdir)/po:../src:$$PATH perl $(top_srcdir)/po/update.pl --headers + + DEFS = @DEFS@ + CFLAGS = @CFLAGS@ +@@ -47,7 +49,7 @@ + POFILES = @POFILES@ + GMOFILES = @GMOFILES@ + DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ +-stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) ++stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) update.pl ui-extract.pl + + POTFILES = \ + +@@ -83,12 +85,7 @@ + all-no: + + $(srcdir)/$(PACKAGE).pot: $(POTFILES) +- $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ +- --add-comments --keyword=_ --keyword=N_ \ +- --files-from=$(srcdir)/POTFILES.in \ +- && test ! -f $(PACKAGE).po \ +- || ( rm -f $(srcdir)/$(PACKAGE).pot \ +- && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) ++ $(GENPOT) + + $(srcdir)/cat-id-tbl.c: stamp-cat-id; @: + $(srcdir)/stamp-cat-id: $(PACKAGE).pot +@@ -214,18 +211,21 @@ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ +- mv $$lang.po $$lang.old.po; \ ++ cp $$lang.po $$lang.old.po; \ + echo "$$lang:"; \ +- if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ +- rm -f $$lang.old.po; \ ++ if $(MSGMERGE) $$lang; then \ ++ rm -f $$lang.old.po; \ + else \ + echo "msgmerge for $$cat failed!"; \ +- rm -f $$lang.po; \ + mv $$lang.old.po $$lang.po; \ + fi; \ + done + +-POTFILES: POTFILES.in ++.headerlock: ++ $(GENHEAD) ++ touch .headerlock ++ ++POTFILES: POTFILES.in .headerlock + ( if test 'x$(srcdir)' != 'x.'; then \ + posrcprefix='$(top_srcdir)/'; \ + else \ diff --git a/po/POTFILES.in b/po/POTFILES.in index 507f8eebbf..40e8342579 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -146,14 +146,14 @@ shell/e-storage.c shell/e-storage-set-view.c shell/main.c #tests/ui-tests/message-browser.c -ui/evolution-addressbook-ldap.h -ui/evolution-addressbook.h -ui/evolution-calendar.h -ui/evolution-contact-editor.h -ui/evolution-event-editor.h -ui/evolution-mail.h -ui/evolution-subscribe.h -ui/evolution.h +ui/evolution-addressbook-ldap.xml +ui/evolution-addressbook.xml +ui/evolution-calendar.xml +ui/evolution-contact-editor.xml +ui/evolution-event-editor.xml +ui/evolution-mail.xml +ui/evolution-subscribe.xml +ui/evolution.xml widgets/meeting-time-sel/e-meeting-time-sel.c widgets/meeting-time-sel/e-meeting-time-sel-item.c widgets/misc/e-calendar.c diff --git a/po/ui-extract.pl b/po/ui-extract.pl new file mode 100755 index 0000000000..a7ccf78bfc --- /dev/null +++ b/po/ui-extract.pl @@ -0,0 +1,182 @@ +#!/usr/bin/perl -w + +# The XML UI Translation Extractor +# (C) 2000 The Free Software Foundation +# +# Authors: Kenneth Christiansen <kenneth@gnu.org> + +use strict; +use Getopt::Long; + +my $VERSION = "0.6.1"; + +my $FILE = $ARGV[0]; +my $HELP_ARG = "0"; +my $VERSION_ARG = "0"; +my $UPDATE_ARG = "0"; +my %string = (); +my $n = 0; + +$| = 1; + +GetOptions ( + "help|h|?" => \$HELP_ARG, + "version|v" => \$VERSION_ARG, + "update" => \$UPDATE_ARG, + ) or &Error; + +&SplitOnArgument; + + +#--------------------------------------------------- +# Check for options. +# This section will check for the different options. +#--------------------------------------------------- + +sub SplitOnArgument { + + if ($VERSION_ARG) { + &Version; + + } elsif ($HELP_ARG) { + &Help; + + } elsif ($UPDATE_ARG) { + &Xmlfiles; + + } elsif (@ARGV > 0) { + &Message; + &Xmlfiles; + + } else { + &Help; + + } +} + +#------------------- +sub Version{ + print "The XML UI Translations Extractor $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: ui-extract.pl [FILENAME] [OPTIONS] ...\n"; + print "Generates a headerfile from an xml source.\n\nGraps all strings "; + print "between <_translatable_node> and it's end tag,\nwhere tag are all allowed "; + print "xml tags. Read the docs for more info.\n\n"; + print " -V, --version shows the version\n"; + print " -H, --help shows this help page\n"; + print "\nReport bugs to <kenneth\@gnu.org>.\n"; + exit; +} + +#------------------- +sub Error{ +# print "ui-extract: invalid option @ARGV\n"; + print "Try `ui-extract.pl --help' for more information.\n"; + exit; +} + +sub Message { + print "Generating headerfile for XML translation.\n"; +} + +sub Xmlfiles { + + if (-s "$FILE.h"){ + unlink "$FILE.h"; + } + + &Convert ($FILE); + + + open OUT, ">>$FILE.h"; + &addMessages; + close OUT; + + print "Wrote $FILE.h\n"; +} + +#------------------- +sub Convert($) { + + if ($ARGV[1]){ + $FILE = $ARGV[1]; + } else { + $FILE = $ARGV[0]; + } + + #----------------- + # Reading the file + #----------------- + my $input; { + local (*IN); + local $/; #slurp mode + open (IN, "<$FILE") || die "can't open $FILE: $!"; + $input = <IN>; + } + + if (!-s "$FILE.h"){ + open OUT, ">$FILE.h"; + + print OUT "/*\n"; + print OUT " * Translatable strings file generated by extract-ui.\n"; + print OUT " * Add this file to your project's POTFILES.in\n"; + print OUT " * DO NOT compile it as part of your application.\n"; + print OUT " */\n\n"; + + } + close OUT; + + ### For generic translatable XML files ### + + if ($FILE =~ /xml$/sg){ + while ($input =~ /[\t\n\s]_[a-zA-Z0-9_]+=\"([^\"]+)\"/sg) { + $string{$1} = []; + } + + while ($input =~ /<_[a-zA-Z0-9_]+>(..[^_]*)<\/_[a-zA-Z0-9_]+>/sg) { + $string{$1} = []; + }} + + ### For translatable Glade XML files ### + + if ($FILE =~ /glade$/sg){ + my $translate = "label|title|text|format|copyright|comments|preview_text|tooltip"; + + while ($input =~ /<($translate)>(..[^<]*)<\/($translate)>/sg) { + $string{$2} = []; + }} + } + +sub addMessages{ + + foreach my $theMessage (sort keys %string) { + my ($lineNo,$fileName) = @{ $string{$theMessage} }; + + if ($theMessage =~ /\n/) { + print OUT "gchar *s = N_("; + + $n = 1; + for (split /\n/, $theMessage) { + $_ =~ s/^\s+//mg; + if ($n > 1) { print OUT " ";} + $n++; + print OUT "\"$_\");\n"; + } + + } else { + + print OUT "gchar *s = N_(\"$theMessage\");\n"; + + } + + } +} + diff --git a/po/update.pl b/po/update.pl index 9ca5a33d8a..e7fc4a4253 100755 --- a/po/update.pl +++ b/po/update.pl @@ -5,7 +5,7 @@ # # Author(s): Kenneth Christiansen # -# GNOME PO Update Utility requires the XML to POT Generator, ui-extract.pl +# GNOME PO Update Utility can use the XML to POT Generator, ui-extract.pl # Please distribute it along with this scrips, aswell as desk.po and # README.tools. # @@ -13,32 +13,51 @@ # used within. -$VERSION = "1.3.2"; -$LANG = $ARGV[0]; -$PACKAGE = "evolution"; -$| = 1; +# Declare global variables +#------------------------- +my $VERSION = "1.5beta4"; +my $LANG = $ARGV[0]; +my $PACKAGE = "evolution"; +# Always print as the first thing +#-------------------------------- +$| = 1; +# 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"){ + if ("$LANG" eq "--version" || "$LANG" eq "-V"){ &Version; } - elsif ($LANG eq "--help" || "$LANG" eq "-H"){ + elsif ($LANG eq "--help" || "$LANG" eq "-H"){ &Help; } - elsif ($LANG eq "--dist" || "$LANG" eq "-D"){ + elsif ($LANG eq "--dist" || "$LANG" eq "-D"){ &Merging; -# &Status; } - elsif ($LANG eq "--pot" || "$LANG" eq "-P"){ + 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"){ @@ -49,17 +68,28 @@ if ($LANG=~/^-(.)*/){ } } 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"; @@ -69,13 +99,16 @@ sub Version{ } 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 " -V, --version shows the version\n"; print " -H, --help shows this help page\n"; - print " -P, --pot only generates the potfile\n"; -# print " -S, --status shows the status of the po file\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"; @@ -84,139 +117,233 @@ sub Help{ } sub Maintain{ - $a="find ../ -print | egrep '.*\\.(c|y|cc|c++|h|gob)' "; + + # 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 not POTFILES.in!!!\n"; + open(BUF2, "POTFILES.in") || die "update.pl: there's no POTFILES.in!!!\n"; print "Searching for missing _(\" \") entries...\n"; - open(BUF1, "$a|"); + open(BUF1, "$i18nfiles|"); - @buf2 = <BUF2>; - @buf1 = <BUF1>; + @buf1_1 = <BUF1>; + @buf1_2 = <BUF2>; - if (-s "POTFILES.ignore"){ - open FILE, "POTFILES.ignore"; + # 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 "POTFILES.ignore found! Ignoring files...\n"; - @buf2 = (@bup, @buf2); + print "Found .potignore: Ignoring files...\n"; + @buf1_2 = (@bup, @buf1_2); } - foreach my $file (@buf1){ + foreach my $file (@buf1_1){ open FILE, "<$file"; while (<FILE>) { if ($_=~/_\(\"/o){ $file = unpack("x3 A*",$file) . "\n"; - push @buff1, $file; + push @buf2_1, $file; last; } } } - @bufff1 = sort (@buff1); - @bufff2 = sort (@buf2); + @buf3_1 = sort (@buf2_1); + @buf3_2 = sort (@buf1_2); my %in2; - foreach (@bufff2) { - $in2{$_} = 1; + foreach (@buf3_2) { + $in2{$_} = 1; } - foreach (@bufff1){ - if (!exists($in2{$_})){ - push @result, $_ } - } + 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, ">POTFILES.in.missing"; + open OUT, ">missing"; print OUT @result; - print "\nHere are the results:\n\n", @result, "\n"; - print "File POTFILES.in.missing is being placed in directory...\n"; - print "Please add the files that should be ignored in POTFILES.ignore\n"; + 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{ -sub GeneratePot{ + # 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"; - print "Building the $PACKAGE.pot...\n\n"; - - $c="xgettext --default-domain\=$PACKAGE --directory\=\.\." - ." --add-comments --keyword\=\_ --keyword\=N\_" - ." --files-from\=\.\/POTFILES\.in "; - $c1="test \! -f $PACKAGE\.po \|\| \( rm -f \.\/$PACKAGE\.pot " - ."&& mv $PACKAGE\.po \.\/$PACKAGE\.pot \)"; - - if (-s "ui-extract.pl"){ - open FILE, "<POTFILES.in"; - while (<FILE>) { - if ($_=~ /(.*)(\.xml\.h)/o){ - $filename = "$1\.xml"; - $xmlfiles="\.\/ui-extract.pl --update ../$filename"; - system($xmlfiles); - } - - elsif ($_=~ /(.*)(\.glade\.h)/o){ - $filename = "$1\.glade"; - $xmlfiles="\.\/ui-extract.pl --update ../$filename"; - system($xmlfiles); - } + open FILE, "<POTFILES.in"; + while (<FILE>) { + + # Find .xml.h 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 --update $filename"; + system($xmlfiles); + } + + # Find .glade.h 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 --update $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>) { + s/\.glade$/\.glade\.h/; + s/\.xml$/\.xml\.h/; + print OUTFILE $_; } + close OUTFILE; + close INFILE; + + $GETTEXT ="xgettext --default-domain\=$PACKAGE --directory\=\.\." + ." --add-comments --keyword\=\_ --keyword\=N\_" + ." --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 + #--------------------------------------------------------- - close FILE; + if(-e ".headerlock"){ + unlink(".headerlock"); - system($c); - system($c1); + print "Removing generated header (.h) files..."; + + open FILE, "<POTFILES.in"; + while (<FILE>) { + + # Delete header files coming from xml files + #------------------------------------------ + if ($_=~ /(.*)(\.xml)/o){ + $filename = "../$1.xml.h"; + unlink($filename); + } + + # Delete header files coming from glade files + #-------------------------------------------- + elsif ($_=~ /(.*)(\.glade)/o){ + $filename = "../$1.glade.h"; + unlink($filename); + } + } + close FILE; + } + print "done\n"; } sub Merging{ if ($ARGV[1]){ - $LANG = $ARGV[1]; + $LANG = $ARGV[1]; } else { $LANG = $ARGV[0]; } if ($ARGV[0] ne "--dist" && $ARGV[0] ne "-D") { - print "\n\nMerging $LANG.po with $PACKAGE.pot, creating updated $LANG.po...\n\n"; + print "Merging $LANG.po with $PACKAGE.pot..."; } - $d="cp $LANG.po $LANG.po.old && msgmerge $LANG.po.old $PACKAGE.pot -o $LANG.po"; + $MERGE="cp $LANG.po $LANG.po.old && msgmerge $LANG.po.old $PACKAGE.pot -o $LANG.po"; - if ($ARGV[0] ne "--dist" && $ARGV[0] ne "-D") { - print "Working, please wait"; - } - system($d); + 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{ - print "update.pl: sorry $LANG.po does not exist!\n"; + + # 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{ - $f="msgfmt --statistics $LANG.po"; + + # Print status information about the po file + #------------------------------------------- + $STATUS="msgfmt --statistics $LANG.po"; - system($f); + system($STATUS); print "\n"; } |