[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Debian JP master SVN www commits (rev.495)



=======================================================
Repository: /org/svn.debian.or.jp/repos
  Revision: 495
  Commiter: kmuto
      Date: 2007-11-14 15:12:04 +0900 (水, 14 11月 2007)
=======================================================
Log:

import po4a from CVS

=======================================================
Changed:

A   po4a/Build.PL
A   po4a/COPYING
A   po4a/Locale/
A   po4a/Locale/Po4a/
A   po4a/MANIFEST
A   po4a/Makefile
A   po4a/NEWS
A   po4a/README
A   po4a/README.maintainers
A   po4a/README.tests
A   po4a/README.translators
A   po4a/TODO
A   po4a/changelog
A   po4a/debian/
A   po4a/debian/changelog
A   po4a/debian/compat
A   po4a/debian/control
A   po4a/debian/copyright
A   po4a/debian/dirs
A   po4a/debian/docs
A   po4a/debian/rules
A   po4a/doc/
A   po4a/doc/addendum.ca
A   po4a/doc/addendum.es
A   po4a/doc/addendum.fr
A   po4a/doc/addendum.it
A   po4a/doc/addendum.pl
A   po4a/doc/addendum_man.fr
A   po4a/doc/po4a.7.pod
A   po4a/extension/
A   po4a/extension/Build.PL
A   po4a/extension/lib/
A   po4a/extension/lib/Locale/
A   po4a/extension/lib/Locale/Po4a/
A   po4a/extension/lib/Locale/Po4a/Man.xs
A   po4a/extension/lib/Locale/Po4a/Po.h
A   po4a/extension/lib/Locale/Po4a/Po.xs
A   po4a/extension/lib/Locale/Po4a/TransTractor.xs
A   po4a/extension/lib/Locale/Po4a/hash.h
A   po4a/extension/lib/Locale/Po4a/message.h
A   po4a/extension/lib/Locale/Po4a/pos.h
A   po4a/extension/lib/Locale/Po4a/str-list.h
A   po4a/extension/typemap
A   po4a/html/
A   po4a/html/.htaccess
A   po4a/html/default.css
A   po4a/html/documentation.php.en
A   po4a/html/download.php.en
A   po4a/html/features.php.en
A   po4a/html/footer.php
A   po4a/html/fuzzy.png
A   po4a/html/getinvolved.php.en
A   po4a/html/header.php.en
A   po4a/html/header.png
A   po4a/html/header1.php.en
A   po4a/html/header2.php.en
A   po4a/html/index.php.en
A   po4a/html/table_translations_legend.php
A   po4a/html/translated.png
A   po4a/html/translations.php.en
A   po4a/html/untranslated.png
A   po4a/html-build-upload.sh
A   po4a/lib/
A   po4a/lib/Locale/
A   po4a/lib/Locale/Po4a/
A   po4a/lib/Locale/Po4a/BibTeX.pm
A   po4a/lib/Locale/Po4a/Chooser.pm
A   po4a/lib/Locale/Po4a/Common.pm
A   po4a/lib/Locale/Po4a/Debconf.pm
A   po4a/lib/Locale/Po4a/Dia.pm
A   po4a/lib/Locale/Po4a/Docbook.pm
A   po4a/lib/Locale/Po4a/Guide.pm
A   po4a/lib/Locale/Po4a/Html.pm
A   po4a/lib/Locale/Po4a/Ini.pm
A   po4a/lib/Locale/Po4a/KernelHelp.pm
A   po4a/lib/Locale/Po4a/LaTeX.pm
A   po4a/lib/Locale/Po4a/Man.pm
A   po4a/lib/Locale/Po4a/NewsDebian.pm
A   po4a/lib/Locale/Po4a/Po.pm
A   po4a/lib/Locale/Po4a/Pod.pm
A   po4a/lib/Locale/Po4a/Sgml.pm
A   po4a/lib/Locale/Po4a/TeX.pm
A   po4a/lib/Locale/Po4a/Texinfo.pm
A   po4a/lib/Locale/Po4a/Text.pm
A   po4a/lib/Locale/Po4a/TransTractor.pm
A   po4a/lib/Locale/Po4a/Wml.pm
A   po4a/lib/Locale/Po4a/Xhtml.pm
A   po4a/lib/Locale/Po4a/Xml.pm
A   po4a/po/
A   po4a/po/bin/
A   po4a/po/bin/.cvsignore
A   po4a/po/bin/af.po
A   po4a/po/bin/ar.po
A   po4a/po/bin/bn.po
A   po4a/po/bin/ca.po
A   po4a/po/bin/cs.po
A   po4a/po/bin/de.po
A   po4a/po/bin/eo.po
A   po4a/po/bin/es.po
A   po4a/po/bin/et.po
A   po4a/po/bin/eu.po
A   po4a/po/bin/fr.po
A   po4a/po/bin/he.po
A   po4a/po/bin/hr.po
A   po4a/po/bin/id.po
A   po4a/po/bin/it.po
A   po4a/po/bin/kn.po
A   po4a/po/bin/ko.po
A   po4a/po/bin/ku.po
A   po4a/po/bin/nb.po
A   po4a/po/bin/nl.po
A   po4a/po/bin/oc.po
A   po4a/po/bin/pl.po
A   po4a/po/bin/po4a.pot
A   po4a/po/bin/pt.po
A   po4a/po/bin/pt_BR.po
A   po4a/po/bin/ru.po
A   po4a/po/bin/sl.po
A   po4a/po/bin/sv.po
A   po4a/po/bin/uk.po
A   po4a/po/bin/uz.po
A   po4a/po/bin/zh_CN.po
A   po4a/po/bin/zh_HK.po
A   po4a/po/html.cfg
A   po4a/po/pod/
A   po4a/po/pod/.cvsignore
A   po4a/po/pod/ca.po
A   po4a/po/pod/es.po
A   po4a/po/pod/fr.po
A   po4a/po/pod/it.po
A   po4a/po/pod/pl.po
A   po4a/po/pod/po4a-pod.pot
A   po4a/po/pod.cfg
A   po4a/po/www/
A   po4a/po/www/fr.po
A   po4a/po/www/po4a-www.pot
A   po4a/po4a
A   po4a/po4a-gettextize
A   po4a/po4a-normalize
A   po4a/po4a-translate
A   po4a/po4a-updatepo
A   po4a/scripts/
A   po4a/scripts/msgsearch
A   po4a/scripts/msguntypot
A   po4a/scripts/po4aman-display-po
A   po4a/scripts/po4aman-display-po.1
A   po4a/t/
A   po4a/t/.cvsignore
A   po4a/t/01-classes.t
A   po4a/t/02-TransTractors.t
A   po4a/t/03-addendums.t
A   po4a/t/04-charsets.t
A   po4a/t/05-config.t
A   po4a/t/10-data/
A   po4a/t/10-discard-fuzzy.t
A   po4a/t/11-plural.t
A   po4a/t/20-sgml.t
A   po4a/t/21-dia.t
A   po4a/t/22-html.t
A   po4a/t/23-man.t
A   po4a/t/24-tex.t
A   po4a/t/25-xhtml.t
A   po4a/t/26-ini.t
A   po4a/t/27-xml.t
A   po4a/t/data/
A   po4a/t/data-02/
A   po4a/t/data-02/man
A   po4a/t/data-02/man.fr
A   po4a/t/data-02/man.fr-normalized
A   po4a/t/data-02/man.po
A   po4a/t/data-02/man.po-empty
A   po4a/t/data-02/man.po-ok
A   po4a/t/data-02/pod
A   po4a/t/data-02/pod.fr
A   po4a/t/data-02/pod.fr-normalized
A   po4a/t/data-02/pod.po
A   po4a/t/data-02/pod.po-empty
A   po4a/t/data-02/pod.po-ok
A   po4a/t/data-03/
A   po4a/t/data-03/man
A   po4a/t/data-03/man.addendum1
A   po4a/t/data-03/man.addendum2
A   po4a/t/data-03/man.addendum3
A   po4a/t/data-03/man.addendum4
A   po4a/t/data-03/man.fr
A   po4a/t/data-03/man.fr.add1
A   po4a/t/data-03/man.fr.add2
A   po4a/t/data-03/man.fr.add3
A   po4a/t/data-03/man.fr.add4
A   po4a/t/data-03/man.po-ok
A   po4a/t/data-04/
A   po4a/t/data-04/ascii-iso8859.po-ok
A   po4a/t/data-04/ascii.po-ok
A   po4a/t/data-04/iso8859.po-ok
A   po4a/t/data-04/text-ascii.pod
A   po4a/t/data-04/text-iso8859.pod
A   po4a/t/data-04/text-iso8859.pod-ok
A   po4a/t/data-04/text-iso8859_.pod
A   po4a/t/data-04/trans.po
A   po4a/t/data-04/utf.po
A   po4a/t/data-04/utf.po-ok
A   po4a/t/data-04/utf.pod-ok
A   po4a/t/data-05/
A   po4a/t/data-05/test0.conf
A   po4a/t/data-05/test0.err
A   po4a/t/data-05/test0.fr.po
A   po4a/t/data-05/test0.fr.po-empty
A   po4a/t/data-05/test0.pot
A   po4a/t/data-05/test0_man.1
A   po4a/t/data-05/test0_man.fr.1
A   po4a/t/data-05/test1.err
A   po4a/t/data-05/test2.conf
A   po4a/t/data-05/test2.de.po
A   po4a/t/data-05/test2.de.po-empty
A   po4a/t/data-05/test2.err
A   po4a/t/data-05/test2.es.po
A   po4a/t/data-05/test2.es.po-empty
A   po4a/t/data-05/test2.fr.po
A   po4a/t/data-05/test2.fr.po-empty
A   po4a/t/data-05/test2.it.po
A   po4a/t/data-05/test2.it.po-empty
A   po4a/t/data-05/test2.pot
A   po4a/t/data-05/test2_man.1
A   po4a/t/data-05/test2_man.de.1
A   po4a/t/data-05/test2_man.es.1
A   po4a/t/data-05/test2_man.fr.1
A   po4a/t/data-05/test2_man.it.1
A   po4a/t/data-05/test3.conf
A   po4a/t/data-05/test3.err
A   po4a/t/data-05/test4.conf
A   po4a/t/data-05/test4.err
A   po4a/t/data-05/test5.conf
A   po4a/t/data-05/test6.err
A   po4a/t/data-05/test7.err
A   po4a/t/data-10/
A   po4a/t/data-10/pod
A   po4a/t/data-10/pod.fr
A   po4a/t/data-10/pod.po
A   po4a/t/data-11/
A   po4a/t/data-11/err1
A   po4a/t/data-11/pod1
A   po4a/t/data-11/pod1.fr
A   po4a/t/data-11/pod1.po
A   po4a/t/data-11/pod2
A   po4a/t/data-11/pod2.fr
A   po4a/t/data-11/pod2.po
A   po4a/t/data-11/pod3
A   po4a/t/data-11/pod3.fr
A   po4a/t/data-11/pod4
A   po4a/t/data-11/pod4.fr
A   po4a/t/data-20/
A   po4a/t/data-20/test2-normalized.sgml
A   po4a/t/data-20/test2.pot
A   po4a/t/data-20/test2.sgml
A   po4a/t/data-20/text.xml
A   po4a/t/data-20/xml.po
A   po4a/t/data-21/
A   po4a/t/data-21/extract.dia
A   po4a/t/data-21/extract.po-ok
A   po4a/t/data-21/transl.dia
A   po4a/t/data-21/transl.dia-ok
A   po4a/t/data-21/transl.po
A   po4a/t/data-22/
A   po4a/t/data-22/attribute.html
A   po4a/t/data-22/attribute_out.html
A   po4a/t/data-22/html.html
A   po4a/t/data-22/html.po
A   po4a/t/data-22/spaces.html
A   po4a/t/data-22/spaces.po
A   po4a/t/data-22/spaces_out.html
A   po4a/t/data-23/
A   po4a/t/data-23/dot1
A   po4a/t/data-23/dot1.fr
A   po4a/t/data-23/dot1.fr.po
A   po4a/t/data-23/dot1.pot
A   po4a/t/data-23/dot2
A   po4a/t/data-23/dot2.err
A   po4a/t/data-23/dot3
A   po4a/t/data-23/dot3.err
A   po4a/t/data-23/dot4
A   po4a/t/data-23/dot4.err
A   po4a/t/data-23/dot5
A   po4a/t/data-23/dot5.it
A   po4a/t/data-23/dot5.it.po
A   po4a/t/data-23/dot5.pot
A   po4a/t/data-23/escapes1
A   po4a/t/data-23/escapes1.it
A   po4a/t/data-23/escapes1.it.po
A   po4a/t/data-23/escapes1.pot
A   po4a/t/data-23/fonts
A   po4a/t/data-23/fonts.en
A   po4a/t/data-23/fonts.en.po
A   po4a/t/data-23/fonts.pot
A   po4a/t/data-23/mdoc.1
A   po4a/t/data-23/mdoc.fr
A   po4a/t/data-23/mdoc.fr.po
A   po4a/t/data-23/mdoc.pot
A   po4a/t/data-23/mixed.cfg
A   po4a/t/data-23/mixed.fr.po
A   po4a/t/data-23/mixed.pot
A   po4a/t/data-23/mixed1
A   po4a/t/data-23/mixed1.fr
A   po4a/t/data-23/mixed2
A   po4a/t/data-23/mixed2.fr
A   po4a/t/data-23/mixed3
A   po4a/t/data-23/mixed3.fr
A   po4a/t/data-23/mixed4
A   po4a/t/data-23/mixed4.fr
A   po4a/t/data-23/null
A   po4a/t/data-23/null.fr
A   po4a/t/data-23/null.fr.po
A   po4a/t/data-23/null.pot
A   po4a/t/data-23/quotes
A   po4a/t/data-23/quotes.fr
A   po4a/t/data-23/quotes.fr.po
A   po4a/t/data-23/quotes.pot
A   po4a/t/data-23/spaces
A   po4a/t/data-23/spaces.fr_latin1
A   po4a/t/data-23/spaces.fr_latin1.po
A   po4a/t/data-23/spaces.fr_utf8
A   po4a/t/data-23/spaces.fr_utf8.po
A   po4a/t/data-23/spaces.ja
A   po4a/t/data-23/spaces.ja.po
A   po4a/t/data-23/spaces.pot
A   po4a/t/data-24/
A   po4a/t/data-24/simple-gettextize.out
A   po4a/t/data-24/simple-translate.out
A   po4a/t/data-24/simple-updatepo.out
A   po4a/t/data-24/simple.fr.po
A   po4a/t/data-24/simple.fr.tex
A   po4a/t/data-24/simple.pot
A   po4a/t/data-24/simple.tex
A   po4a/t/data-25/
A   po4a/t/data-25/xhtml.html
A   po4a/t/data-25/xhtml.po
A   po4a/t/data-25/xhtml_normalized.html
A   po4a/t/data-26/
A   po4a/t/data-26/test1.ini
A   po4a/t/data-26/test1.po
A   po4a/t/data-27/
A   po4a/t/data-27/general-normalized.xml
A   po4a/t/data-27/general.po
A   po4a/t/data-27/general.xml
A   po4a/t/tmp/
A   po4a/t/tmp/.cvsignore
A   po4a/testsuite/
A   po4a/testsuite/check
A   po4a/testsuite/stats.man
A   po4a/testsuite/stats.sh
A   po4a/testsuite/test.man
A   po4a/testsuite/test.man.addendum

Added: po4a/Build.PL
===================================================================
--- po4a/Build.PL	                        (rev 0)
+++ po4a/Build.PL	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,211 @@
+#!/usr/bin/perl
+
+use Module::Build;
+use strict;
+use warnings;
+
+my $builder = Module::Build->subclass
+(
+    class => 'My::Builder',
+    code => q{
+	sub ACTION_build {
+	    my $self = shift;
+	    $self->depends_on('code');
+	    $self->depends_on('docs');
+	    $self->depends_on('distmeta'); # regenerate META.yml
+	    $self->depends_on('man');
+	    $self->depends_on('postats');
+	}
+	sub perl_scripts {
+	    return ('po4a-gettextize', 'po4a-updatepo', 'po4a-translate',
+	            'po4a-normalize', 'po4a', 'scripts/msguntypot');
+	}
+	sub ACTION_install {
+	    my $self = shift;
+
+	    require ExtUtils::Install;
+#	    $self->depends_on('build');
+
+	    ExtUtils::Install::install($self->install_map, 1, 0, $self->{args}{uninst}||0); 
+	}
+	sub ACTION_binpo {
+	    my $self = shift;
+
+	    my @files = sort((perl_scripts(), @{$self->rscan_dir('lib',qr{\.pm$})}));
+
+	    unless ($self->up_to_date(\@files, "po/bin/po4a.pot")) {
+		print "XX Update po/bin/po4a.pot\n";
+		my $podfiles = join ("", map {" ../../".$_ } @files);
+		system("cd po/bin; xgettext --from-code=iso-8859-1 -L Perl $podfiles -o po4a.pot.new") && die;
+		if ( -e "po/bin/po4a.pot") {
+		    $diff = qx(diff -q -I'#:' -I'POT-Creation-Date:' -I'PO-Revision-Date:' po/bin/po4a.pot po/bin/po4a.pot.new);
+		    if ( $diff eq "" ) {
+			unlink "po/bin/po4a.pot.new" || die;
+			# touch it
+			my ($atime, $mtime) = (time,time);
+			utime $atime, $mtime, "po/bin/po4a.pot";
+		    } else {
+			rename "po/bin/po4a.pot.new", "po/bin/po4a.pot" || die;
+		    }
+		} else {
+		    rename "po/bin/po4a.pot.new", "po/bin/po4a.pot" || die;
+		}
+	    } else {
+		print "XX po/bin/po4a.pot uptodate.\n";
+	    }
+
+	    # update languages
+	    @files = @{$self->rscan_dir('po/bin',qr{\.po$})};
+	    foreach (@files) {
+		next if m|/.#|;
+		$_ =~ /.*\/(.*)\.po$/;
+		my $lang = $1;
+
+		unless ($self->up_to_date("po/bin/po4a.pot","po/bin/$lang.po")) {
+		    print "XX Sync po/bin/$lang.po: ";
+		    system("msgmerge po/bin/$lang.po po/bin/po4a.pot -o po/bin/$lang.po.new") && die;
+		    # Typically all that changes was a date. I'd
+		    # prefer not to cvs commit such changes, so
+		    # detect and ignore them.
+		    $diff = qx(diff -q -I'#:' -I'POT-Creation-Date:' -I'PO-Revision-Date:' po/bin/$lang.po po/bin/$lang.po.new);
+		    if ($diff eq "") {
+			unlink "po/bin/$lang.po.new" || die;
+			# touch it
+			my ($atime, $mtime) = (time,time);
+			utime $atime, $mtime, "po/bin/$lang.po";
+		    } else {
+			rename "po/bin/$lang.po.new", "po/bin/$lang.po" || die;
+		    }
+		} else {
+		    print "XX po/bin/$lang.po uptodate.\n";
+		}
+		unless ($self->up_to_date("po/bin/$lang.po","blib/po/$lang/LC_MESSAGES/po4a.mo")) {
+		    system("mkdir -p blib/po/$lang/LC_MESSAGES") && die;
+		    system("msgfmt -o blib/po/$lang/LC_MESSAGES/po4a.mo po/bin/$lang.po") && die;
+		} 
+	    }
+
+	}
+	sub ACTION_manpo {
+	    system("PERL5LIB=lib perl po4a --no-translations po/pod.cfg")
+		and die;
+	}
+	sub ACTION_man {
+	    my $self = shift;
+
+	    use Pod::Man;
+
+	    # Translate binaries manpages
+	    my $parser = Pod::Man->new ();
+
+	    system("PERL5LIB=lib perl po4a po/pod.cfg") and die;
+	    system("mkdir -p blib/man/man7") and die;
+	    system("mkdir -p blib/man/man1") and die;
+	    system("cp doc/po4a.7.pod blib/man/man7") and die;
+
+	    foreach $file (@{$self->rscan_dir('blib/man',qr{\.pod$})}) {
+		my $out = $file;
+		$out =~ s/\.pod$//;
+		$section = $2;
+		$parser->{name} = $out;
+		$parser->{name} =~ s/^.*\///;
+		$parser->{name} =~ s/^(.*).(1p|3pm|7)/$1/;
+		$parser->{section} = $2;
+		if ($parser->{section} ne "3pm") {
+		    $parser->{name} = uc $parser->{name};
+		}
+
+		my $lang = $out;
+		$lang =~ s/^blib\/man\/([^\/]*)\/.*$/$1/;
+
+		my $command;
+		$command = "msggrep -K -E -e \"Po4a Tools\" po/pod/$lang.po |";
+		$command .= "msgexec /bin/sh -c '[ -n \"\$MSGEXEC_MSGID\" ] ";
+		$command .= "&& cat || cat > /dev/null'";
+
+		my $title = `$command 2> /dev/null`;
+		$title = "Po4a Tools" unless length $title;
+		$parser->{release} = $parser->{center} = $title;
+		$parser->parse_from_file ($file, $out);
+
+		system("gzip -9 -f $out") and die;
+		system("rm -f $file") and die;
+	    }
+
+	    # Install the manpages of the Shell scripts
+	    system ("cp scripts/po4aman-display-po.1 blib/man/man1/") and die;
+	    foreach $file (@{$self->rscan_dir('blib/man',qr{\.1$})}) {
+		system ("gzip -9 -f $file") and die;
+	    }
+	}
+	sub ACTION_dist {
+	    my ($self) = @_;
+
+	    $self->depends_on('test');
+	    $self->depends_on('distdir');
+
+	    my $dist_dir = $self->dist_dir;
+
+	    if ( -e "$dist_dir.tar.gz") {
+		# Delete the distfile if it already exists
+		system ("rm $dist_dir.tar.gz") && die;
+	    }
+
+	    $self->make_tarball($dist_dir);
+	    $self->delete_filetree($dist_dir);
+	} 
+	sub ACTION_postats {
+	    my $self = shift;
+	    $self->depends_on('binpo');
+	    $self->depends_on('manpo');
+	    $self->postats("po/bin");
+	    $self->postats("po/pod");
+	}
+	sub postats {
+	    my ($self,$dir) = (shift,shift);
+	    my $potsize = `(cd $dir;ls -sh *.pot) | sed -n -e 's/^ *\\\\([^[:blank:]]*\\\\).*\$/\\\\1/p'`;
+	    $potsize =~ /(.*)/;
+	    print "$dir (pot: $1)\n";
+	    my @files = @{$self->rscan_dir($dir,qr{\.po$})};
+	    foreach (@files) {
+		$file = $_;
+		$file =~ /.*\/(.*)\.po$/;
+		my $lang = $1;
+		my $stat = `msgfmt -o /dev/null -c -v --statistics $file 2>&1`;
+		print "  $lang: $stat";
+	    }
+	}
+    },
+);
+
+my $base= $Config::Config{man1dir};
+$base =~ s/\/man\/man1//;
+
+my $b = $builder->new
+  ( module_name => 'po4a',
+      license => 'gpl',
+      dist_version_from => 'lib/Locale/Po4a/TransTractor.pm', # finds $VERSION
+      requires => {},
+      recommends => {'Text::WrapI18N' => 0, # Only used for wrapping long
+                                            # error/wraning lines.
+
+                     'Term::ReadKey' => 0,  # Needed to detect terminal
+                                            # width. Not needed if you
+                                            # don't have Text::WrapI18N.
+
+                     'SGMLS' => 0,          # Needed for the Sgml module.
+
+                     'Locale::gettext' => '1.01', # Only used for
+                                                  # translating the
+                                                  # po4a's messages.
+                    },
+      script_files => ['po4a-gettextize', 'po4a-updatepo',
+	  'po4a-translate', 'po4a-normalize', 'po4a', 'scripts/msguntypot',
+	  'scripts/po4aman-display-po'],
+      add_to_cleanup => ['t/tmp','messages.mo', 'blib', 'html',
+	  'po/pod/po4a-pod.pot~', 'po4a.log'],
+      install_path => {po => $base.'/locale', man => $base.'/man'},
+      dist_abstract => 'Tools for helping translation of documentation',
+      dist_author => ['Martin Quinson (mquinson#debian.org)',
+	  'Denis Barbier <barbier@xxxxxxxxxxx>']
+  )->create_build_script;

Added: po4a/COPYING
===================================================================
--- po4a/COPYING	                        (rev 0)
+++ po4a/COPYING	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,341 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program 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 program 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 program; if not, write to the Free Software
+    Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

Added: po4a/MANIFEST
===================================================================
--- po4a/MANIFEST	                        (rev 0)
+++ po4a/MANIFEST	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,243 @@
+MANIFEST			This list of files (needed by ModuleBuild)
+META.yml                        Module meta-data (added by ModuleBuild)
+COPYING
+changelog
+Build.PL			The rules to build this module (for ModuleBuild)
+Makefile
+README
+README.maintainers
+README.tests
+README.translators
+TODO
+NEWS
+
+doc/addendum.ca
+doc/addendum.es
+doc/addendum.fr
+doc/addendum.it
+doc/addendum.pl
+doc/po4a.7.pod
+lib/Locale/Po4a/BibTeX.pm
+lib/Locale/Po4a/Chooser.pm
+lib/Locale/Po4a/Common.pm
+lib/Locale/Po4a/Dia.pm
+lib/Locale/Po4a/Docbook.pm
+lib/Locale/Po4a/Guide.pm
+lib/Locale/Po4a/Ini.pm
+lib/Locale/Po4a/KernelHelp.pm
+lib/Locale/Po4a/LaTeX.pm
+lib/Locale/Po4a/Man.pm
+lib/Locale/Po4a/Po.pm
+lib/Locale/Po4a/Pod.pm
+lib/Locale/Po4a/Sgml.pm
+lib/Locale/Po4a/TeX.pm
+lib/Locale/Po4a/Texinfo.pm
+lib/Locale/Po4a/Text.pm
+lib/Locale/Po4a/TransTractor.pm
+lib/Locale/Po4a/Xhtml.pm
+lib/Locale/Po4a/Xml.pm
+po/bin/af.po
+po/bin/ar.po
+po/bin/bn.po
+po/bin/ca.po
+po/bin/cs.po
+po/bin/de.po
+po/bin/eo.po
+po/bin/es.po
+po/bin/et.po
+po/bin/eu.po
+po/bin/fr.po
+po/bin/he.po
+po/bin/hr.po
+po/bin/id.po
+po/bin/it.po
+po/bin/kn.po
+po/bin/ko.po
+po/bin/ku.po
+po/bin/nb.po
+po/bin/nl.po
+po/bin/oc.po
+po/bin/pl.po
+po/bin/po4a.pot
+po/bin/pt_BR.po
+po/bin/pt.po
+po/bin/ru.po
+po/bin/sl.po
+po/bin/sv.po
+po/bin/uk.po
+po/bin/uz.po
+po/bin/zh_CN.po
+po/bin/zh_HK.po
+po/pod/ca.po
+po/pod/es.po
+po/pod/fr.po
+po/pod/it.po
+po/pod/pl.po
+po/pod/po4a-pod.pot
+po/pod.cfg
+
+# the binaries
+po4a
+po4a-gettextize
+po4a-normalize
+po4a-translate
+po4a-updatepo
+
+# the random additional cool scripts
+scripts/msguntypot
+scripts/po4aman-display-po
+scripts/po4aman-display-po.1
+
+# The tests
+
+t/01-classes.t
+
+t/02-TransTractors.t
+t/data-02/man
+t/data-02/man.fr
+t/data-02/man.fr-normalized
+t/data-02/man.po
+t/data-02/man.po-empty
+t/data-02/man.po-ok
+t/data-02/pod
+t/data-02/pod.fr
+t/data-02/pod.fr-normalized
+t/data-02/pod.po
+t/data-02/pod.po-empty
+t/data-02/pod.po-ok
+
+t/03-addendums.t
+t/data-03/man
+t/data-03/man.addendum1
+t/data-03/man.addendum2
+t/data-03/man.addendum3
+t/data-03/man.addendum4
+t/data-03/man.fr
+t/data-03/man.fr.add1
+t/data-03/man.fr.add2
+t/data-03/man.fr.add3
+t/data-03/man.fr.add4
+t/data-03/man.po-ok
+
+t/04-charsets.t
+t/data-04/ascii.po-ok
+t/data-04/ascii-iso8859.po-ok
+t/data-04/iso8859.po-ok
+t/data-04/text-ascii.pod
+t/data-04/text-iso8859.pod
+t/data-04/text-iso8859_.pod
+t/data-04/text-iso8859.pod-ok
+t/data-04/trans.po
+t/data-04/utf.po
+t/data-04/utf.po-ok
+t/data-04/utf.pod-ok
+
+t/10-discard-fuzzy.t
+t/data-10/pod
+t/data-10/pod.fr
+t/data-10/pod.po
+
+t/11-plural.t
+t/data-11/err1
+t/data-11/pod1
+t/data-11/pod1.fr
+t/data-11/pod1.po
+t/data-11/pod2
+t/data-11/pod2.fr
+t/data-11/pod2.po
+t/data-11/pod3
+t/data-11/pod3.fr
+t/data-11/pod4
+t/data-11/pod4.fr
+
+t/20-sgml.t
+t/data-20/text.xml
+t/data-20/xml.po
+t/data-20/test2-normalized.sgml
+t/data-20/test2.pot
+t/data-20/test2.sgml
+
+t/21-dia.t
+t/data-21/extract.dia
+t/data-21/extract.po-ok
+t/data-21/transl.dia
+t/data-21/transl.dia-ok
+t/data-21/transl.po
+
+t/23-man.t
+t/data-23/dot1
+t/data-23/dot1.fr
+t/data-23/dot1.fr.po
+t/data-23/dot1.pot
+t/data-23/dot2
+t/data-23/dot2.err
+t/data-23/dot3
+t/data-23/dot3.err
+t/data-23/dot4
+t/data-23/dot4.err
+t/data-23/dot5
+t/data-23/dot5.it
+t/data-23/dot5.it.po
+t/data-23/dot5.pot
+t/data-23/escapes1
+t/data-23/escapes1.it
+t/data-23/escapes1.it.po
+t/data-23/escapes1.pot
+t/data-23/fonts
+t/data-23/fonts.en
+t/data-23/fonts.en.po
+t/data-23/fonts.pot
+t/data-23/mdoc.1
+t/data-23/mdoc.fr
+t/data-23/mdoc.fr.po
+t/data-23/mdoc.pot
+t/data-23/mixed1
+t/data-23/mixed1.fr
+t/data-23/mixed2
+t/data-23/mixed2.fr
+t/data-23/mixed3
+t/data-23/mixed3.fr
+t/data-23/mixed4
+t/data-23/mixed4.fr
+t/data-23/mixed.cfg
+t/data-23/mixed.fr.po
+t/data-23/mixed.pot
+t/data-23/null
+t/data-23/null.fr
+t/data-23/null.fr.po
+t/data-23/null.pot
+t/data-23/quotes
+t/data-23/quotes.fr
+t/data-23/quotes.fr.po
+t/data-23/quotes.pot
+t/data-23/spaces
+t/data-23/spaces.fr_latin1
+t/data-23/spaces.fr_latin1.po
+t/data-23/spaces.fr_utf8
+t/data-23/spaces.fr_utf8.po
+t/data-23/spaces.ja
+t/data-23/spaces.ja.po
+t/data-23/spaces.pot
+
+t/24-tex.t
+t/data-24/simple-translate.out
+t/data-24/simple.fr.po
+t/data-24/simple-updatepo.out
+t/data-24/simple.fr.tex
+t/data-24/simple-gettextize.out
+t/data-24/simple.pot
+t/data-24/simple.tex
+
+t/25-xhtml.t
+t/data-25/xhtml.html
+t/data-25/xhtml_normalized.html
+t/data-25/xhtml.po
+
+t/26-ini.t
+t/data-26/test1.po
+t/data-26/test1.ini
+
+t/27-xml.t
+t/data-27/general.xml
+t/data-27/general.po
+t/data-27/general-normalized.xml

Added: po4a/Makefile
===================================================================
--- po4a/Makefile	                        (rev 0)
+++ po4a/Makefile	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,22 @@
+all: Build
+	@./Build
+
+Build: Build.PL
+	perl Build.PL
+
+install: Build
+	@./Build install destdir=$(DESTDIR)
+
+clean: Build
+	@./Build realclean
+
+dist: Build
+	@./Build dist
+
+stats: Build
+	@./Build postats
+
+check:
+	script -c 'perl -V;perl Build.PL;./Build clean;./Build test verbose=1' po4a.log
+
+.PHONY: all install clean dist stats check

Added: po4a/NEWS
===================================================================
--- po4a/NEWS	                        (rev 0)
+++ po4a/NEWS	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,207 @@
+po4a NEWS
+
+===============================================================================
+* Major changes in release 0.33 ()
+
+Notes to packagers: Since 0.31, some tests in the sgml testsuite require
+the docbook sgml DTD. If you run the testsuite at build time you must have
+these DTD in your build dependencies or you must disable these tests
+cases in the testsuite.
+
+** New features
+  general: Support for PO files with plural forms.
+           Po4a does not generate such PO files, but it can receive one in
+           input. In such case, po4a cannot choose between the (singular
+           and) plural forms. It will consider that msgstr[0] is the
+           translation of msgid and msgstr[1] is the translation of
+           msgid_plural, which may be wrong. Thus, a warning will be
+           issued if po4a is asked to translate the singular or plural
+           form of a message with plural forms.
+
+  texinfo: Major changes. Tested on the elisp documentation.
+
+  sgml: Fail if nsgmls cannot validate the input file. This can be turned
+        off with the "force" option.
+
+===============================================================================
+* Major changes in release 0.32 (2007-08-15)
+
+** Security fix
+  Fix a symlink attack caused by the /tmp/gettextization.failed.po
+  temporary file.
+  (CVE-2007-4462)
+
+** Bug fixes
+
+  sgml: The handling of newlines was broken in no-wrap sections in 0.31
+
+  xhtml: The module is now distributed as the other modules.
+
+  texinfo: Fix infinite loop when a command parameter ends with \
+           (as in @samp{\})
+
+** New features
+
+  xml: New option includeexternal to support external entities.
+
+  texinfo: Added support for many commands and environment (see
+           changelog).
+
+  xhtml: New option includessi, which adds supports for Server Side
+         Includes include element (<!--#include virtual="/foo/bar.html" -->).
+
+  xml: New option ontagerror to control the behavior of the module in case
+       of error. This permits to support files that the module would
+       consider invalid otherwise.
+
+** Translations
+
+  New translations (Bengali, Estonian, Croatian, Indonesian, Kannada,
+  Korean, Occitan, Uzbek, Simplified Chinese, Chinese from Hong Kong) and
+  many updates.
+
+===============================================================================
+* Major changes in release 0.31 (2007-05-07)
+
+** Dependencies
+
+  po4a,
+  po4a-updatepo: New option --previous requires gettext 0.16.
+
+** Bug fixes
+
+  general: Don't hang when running in background with redirected stdout.
+           Thanks to Jim Meyering.
+
+** New features
+
+  general: po4a now uses timestamps to avoid re-generating a translation
+           if no changes are expected: if a translation is more recent
+           than its associated PO, master document, addenda or
+           configuration file, then there is no need to update it. For the
+           documents which do not pass the translation threshold, a
+           --stamp option was added to tell po4a to create files with a
+           .po4a-stamp extension (you can also create them manually).
+           This can save a lot of time when po4a knows that the
+           translation will not be generated because there were no changes
+           since the last po4a run.
+
+  general: Beginning of a C extension. This provides speedup. Testers are
+           welcomed.
+
+  po4a: New options: --msgid-bugs-address and --copyright-holder.
+
+  po4a: Add new tag: [options] to set global options (i.e. for every
+        documents in the configuration file).
+
+  po4a: Update translations based on modification times. Use timestamp to
+        avoid retrying generate uncompleted translations.
+
+  man: New 'unknown_macros' option to specify the behavior of po4a with
+       unknown groff macros.
+
+  man: Reset the configuration between two runs. This permits to define
+       different options for different files in a config file with the
+       opt:"..." parameters.
+
+===============================================================================
+* Major changes in release 0.30 (2007-01-05)
+
+** Bug fixes
+
+  man: Recode the text which is skipped, like comments.
+       This kind of issue may also appear on other modules.
+       A better solution would be to always use UTF-8 internally.
+
+  distribution: Some unit tests were missing.
+                Also, the dependencies have been simplified.
+                Locale::gettext, Text::WrapI18N, Term::ReadKey and SGMLS
+                are still recommended, but no more required.
+                The BibTex module is now distributed.
+
+  sgml: The module should be more friendly with XML files.
+
+  po4a: When po4a creates a new PO file, it now uses msginit. This may
+        change the header of created PO files.
+
+  guide: Major update of the tag definitions. Thanks to Azamat H.
+         Hackimov.
+
+  Po: use strftime instead of date because date is not available on
+      every platform.
+
+  tests: rename the XML testsuite to SGML, since it was testing the Sgml
+         module, and add a new testsuite for the Xml module (it currently
+         tests the Guide module).
+
+** Translations
+
+  Updated Russian translation.
+
+===============================================================================
+* Major changes in release 0.29 (2006-10-15)
+
+** New features
+
+** Bug fixes
+
+  sgml: Remove the tags from the default categories when they are defined
+  by the user.  This changes the behavior of the Sgml module's options.
+
+  sgml: Better line references in the generated PO.
+
+  sgml: Support for '/>' (empty XML tag closure) when an xml prologue is
+  found (<?xml ...?>).
+
+  po4a: When po4a create new PO files, it now uses msginit instead of
+  copying the POT file.
+
+===============================================================================
+* Major changes in release 0.29 (2006-10-15)
+
+** New features
+
+  New module for .INI files. Thanks to Costin Stroie.
+
+  New module for BibTeX bibliographies.
+
+  man: New mdoc option for stricter support of mdoc pages (NAME section
+  not translated).
+
+  text: Support for underlined text.
+
+  text: Support for bulleted paragraphs (can be deactivated with
+  -o nobullets).
+
+** Bug fixes
+
+  man: Keep empty commented lines.
+
+  man: Do not add spaces at the end of lines.
+
+  man: Languages without non breaking space could not use question marks.
+
+  sgml: Better support for verbatim sections, and consider <cmdsynopsis>
+  as verbatim. <arg> and <option> are now in the ignore category.
+
+  general: Length calculation algorithm changed for wrapping lines in the
+  output document or in the PO. This should improve output when files are
+  encoded in UTF-8.
+
+===============================================================================
+* Major changes in release 0.28 (2006-08-17)
+
+** Bug fixes
+
+  man: Fix for .I " " and other minor bug fixes.
+
+  tex/latex: Documentation and usability improvements.
+
+** Speed improvement
+
+  po4a: The POs are now only read once. This will speed the processing
+  when many documents are specified in a configuration file.
+
+** Translations
+
+  Updated French translation.

Added: po4a/README
===================================================================
--- po4a/README	                        (rev 0)
+++ po4a/README	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,78 @@
+Introduction to Po4a
+====================
+
+The po4a (po for anything) project goal is to ease translations (and
+more interestingly, the maintenance of translations) using gettext
+tools on areas where they were not expected like documentation.
+
+In po4a each documentation format is handled by a module. For now, we have a
+module for the pod format (in which the perl documentation is written), the
+good old man pages, and the documentation of the kernel compilation options.
+Some other modules are underway, like for sgml, xml or texinfo.
+
+
+INSTALLATION
+
+To install this module type the following:
+
+   make
+   make install
+
+
+USE WITHOUT INSTALLATION
+
+If you want to use a version without installing it (such as the CVS one),
+use the PERLLIB environment variable is such construction:
+ 
+  PERLLIB=~/CVSIMPORT/po4a/lib ~/CVSIMPORT/po4a/po4a-gettextize [usual args]
+
+
+PO4A DEPENDENCIES
+
+  Locale::gettext (v1.01): 
+    This module being itself internationalized, it needs the Locale::gettext
+    library to translate its own messages.
+    If it is not present, then po4a's messages won't be translated, but
+    po4a will remain fully functional.
+
+  Text::WrapI18N:
+    This module is used to format po4a's warnings and error messages.  It
+    permits to wrap long error messages without splitting words.
+    If it is not present, the formatting of messages will be different,
+    but po4a will remain fully functional.
+
+  Term::ReadKey:
+    This module is used to retrieve the terminal's line width.  It is not
+    used if Text::WrapI18N is not available.
+    If it is not present, the line width can be specified with the COLUMN
+    environment variable.
+
+
+SGML MODULE SPECIFIC DEPENDENCIES
+
+  SGMLS (1.03ii):
+    This is a set of Perl5 routines for processing the output from the sgmls
+    and nsgmls SGML parsers.
+ 
+  sp (1.3.4): James Clark's SGML parsing tools
+    This is the parser we use.
+    http://www.jclark.com/sp/
+
+
+PROJECT WEB PAGE
+
+You can find more information and report bugs at the po4a project web page:
+
+  http://po4a.alioth.debian.org
+
+
+COPYRIGHT AND LICENSE
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see COPYING file).
+       
+Copyright (C) 2002,2003 by SPI, inc.
+Authors:
+        Denis Barbier <barbier@xxxxxxxxxxx>
+        Martin Quinson (mquinson#debian.org)
+

Added: po4a/README.maintainers
===================================================================
--- po4a/README.maintainers	                        (rev 0)
+++ po4a/README.maintainers	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,131 @@
+This document provides some general rules to deploy a translation process
+that will ease the work of maintainers (upstream and distribution
+maintainers) and translators (or translation teams).
+
+
+Translators usually fetch a POT (for a new translation) or retrieve the current
+PO for their language, then they translate the untranslated strings and
+update the translation of the strings marked as fuzzy.
+
+
+Updating files
+--------------
+
+Translators need to know if a PO has to be updated:
+ * they can verify the POs in the version control system or in the
+   distributed archives/packages
+ * they can be informed by the translation teams, which automatically
+   check the status of the POs in various packages.
+We want to avoid translators to be notified by a user reporting that
+some strings are not translated even if the PO contains neither untranslated nor
+fuzzy string.
+
+
+Thus it is important to ensure that the POTs are up-to-date with the
+original documents and that the POs contain the same strings as the
+POTs.
+
+ 1. Upstream maintainers should update the POTs according to the original
+    documents and update the POs according to these up-to-date POTs when they
+    distribute an archive.
+
+ 2. If the switch to po4a was done in a distribution, the source package
+    should also contain up-to-date translation materials.
+
+ 3. If the documentation is patched by the distribution, the maintainer
+    must not forget to update the POTs and POs.
+
+It is important to ensure that the translation materials are updated
+automatically.
+
+
+Architecture
+------------
+
+A standardized architecture of the source tree will help the translation
+teams when they try to detect the POTs that need to be updated.
+
+Thus we recommend the following architecture:
+
+  /
+  /doc/
+  /doc/en/
+  /doc/en/
+  /doc/po4a/
+  /doc/po4a/add_<ll>/
+  /doc/po4a/po4a.cfg
+  /doc/po4a/po/
+  /doc/po4a/po/<pkg>.pot
+  /doc/po4a/po/<ll>.po
+  /doc/<ll>/
+
+Or, if you want to avoid a big POT and split it according to the packages,
+documents, formats, or subjects, you can use the following architecture:
+
+  /
+  /doc/
+  /doc/en/
+  /doc/en/
+  /doc/po4a/
+  /doc/po4a/add_<ll>/
+  /doc/po4a/<pkg1>/po4a.cfg
+  /doc/po4a/<pkg1>/po/
+  /doc/po4a/<pkg1>/po/<pkg1>.pot
+  /doc/po4a/<pkg1>/po/<ll>.po
+  /doc/<ll>/
+
+
+It is important to avoid a build failure if a generated
+translation cannot be generated (the PO is too outdated, an addendum
+cannot be applied, ...). You should therefore use wildcards or test if the file
+was generated in the 'install' or 'dist' rules
+
+
+Examples
+========
+
+Using po4a upstream
+-------------------
+When po4a is used upstream, we recommend to run po4a in the 'dist' rule.
+This will update the POT and POs, and will generate the translated documents.
+These translated documents can be distributed in the source archive if the
+maintainer don't want to add a build dependency on po4a. You should then
+add an autoconf check on po4a. It will allow you to update the documentation
+if po4a is available on your system. If po4a is not available, documents
+will be distributed without being synced with the original version, but the
+build process won't fail.
+
+It is important to distribute the POT and POs in the source archive.
+
+A typical dist rule could then be:
+
+dist:
+	po4a --rm-backups <package>.cfg
+	...
+
+If automake is used, the following could also be used.
+
+dist-hook:
+	po4a --rm-backups <package>.cfg
+	...
+
+
+Using po4a in a distribution
+----------------------------
+(Debian packaging is taken as an example, you will have to adapt this to
+your distribution)
+To ensure that the source of a Debian package contains only up-to-date POT
+and POs, you should run po4a in the 'clean' rule
+of debian/rules. The translated documents can be generated in the 'build'
+(or 'build-indep') rule:
+
+clean:
+	# Update the POT and POs
+	cd <...>/po4a && po4a --no-translations --rm-backups <package>.cfg
+
+build:
+	# Generate the translations
+	cd <...>/po4a && po4a --rm-backups <package>.cfg
+
+However, you should try to avoid distribution-specific build systems, to
+ensure the portability of your software.

Added: po4a/README.tests
===================================================================
--- po4a/README.tests	                        (rev 0)
+++ po4a/README.tests	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,17 @@
+"Testing can only prove the presence of bugs"
+  -- Dijkstra
+
+I'll try to add a test for each bug found in po4a in order to ensure that
+they won't surface again.
+
+If the test suite reports errors, please join enough details so that I can
+fix them. At least, provide me the detailed result of the test suite. For
+that, run the following command:
+
+  make check
+
+It will produce a file called 'po4a.log', containing most of the details I
+need. Please also report all details you think appropriate.
+
+
+Thanks, Mt.

Added: po4a/README.translators
===================================================================
--- po4a/README.translators	                        (rev 0)
+++ po4a/README.translators	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,9 @@
+This package naturally propose to translate both its messages and its
+documentation. The relevant po[t] files are in po/bin and po/pod
+(respectively).
+
+In order to refresh them (sync them to the actual material to translate),
+run from the top level:
+
+ perl Build.PL
+ ./Build postats

Added: po4a/TODO
===================================================================
--- po4a/TODO	                        (rev 0)
+++ po4a/TODO	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,59 @@
+********
+* TODO *
+********
+ Check xml2rfc
+
+Better error handling (errno, errstr)
+> >What we really need is a function embeeding the call to warn and sprintf,
+> >and reputting the module in front of it and the "\n" afterward (but not the
+> >dgettext since it has to be there to be able to extract the strings). It
+> >would help making the code more readable. We could also implement a sort of
+> >wrapping function setting the module name in front of every line. There is
+> >a module for that in Perl.
+>
+> I thought about it some time ago. It would be nice :)
+
+** TransTractor.pm
+ - process(): $self->addendum($file) || die "An addendum failed\n";
+ - poheader()
+
+ >> +$parser->{TT}{utf_mode} = 1;
+ >> +$parser->{TT}{file_in_charset} = $mastchar;
+ > What about a function in transtractor allowing to set the mastchar ? I'd
+ > prefer to leave the modification of the {TT} internals to the library code,
+ > not the binaries one.
+ 
+
+** po-debconf:
+ - change the pot header as documented in po4a(7) 
+
+** Po.pm
+ - close filehandle in write (and same in TransTractor.pm).
+ - verbose => type in automatic comments
+
+** Sgml.pm
+ - get ride of nsgml
+ - move the tag lists to an external file
+
+** Man.pm: 
+ - handle .ce (11 pages need it)
+   >>>
+   Text lines can be centered by using the ce' request.  The line
+   after `ce' is centered (horizontally) on the page.  To center more than
+   one line, use `.ce N' (where N is the number of lines to center),
+   followed by the N lines.  To center many lines without counting them,
+   type:
+   
+        .ce 1000
+	lines to center
+	.ce 0
+		  
+   The .ce 0' request tells groff' to center zero more lines, in other
+   words, stop centering.
+   <<<
+   The problem is that the number of lines may change during the
+   translation...
+ - same story about .ul N (underline N lines)
+
+** Xml.pm
+ - Add a test suite

Added: po4a/changelog
===================================================================
--- po4a/changelog	                        (rev 0)
+++ po4a/changelog	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,2389 @@
+2007-10-12  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Texinfo.pm: Added @ifclear definition. Thanks to
+	テ詠ic Reinbold for noticing.
+
+2007-09-18  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/TeX.pm: Add a no_wrap argument to the command,
+	environment (last argument) and translate_buffer functions (second
+	argument, before the @environments).
+	Currently, when $no_wrap equals 1 the no-wrap flag is forced.
+	A value of 0 could force the removal of the no-wrap flag and undef
+	could be used to specify that the current function can decide.
+	These last 2 values are not differentiated currently.
+	* lib/Locale/Po4a/TeX.pm: Fix debugging (do not display $t1.$t2,
+	but $t1$t2).
+	* lib/Locale/Po4a/LaTeX.pm: Add the no_wrap argument to the
+	'documentclass' command function, and pass it to the
+	generic_command function.
+	* lib/Locale/Po4a/Texinfo.pm: Add a no_wrap argument to the
+	command and environment function. Call translate_buffer with the
+	additional no_wrap parameter and add a parameter to the customized
+	translate_buffer functions (for the menu and ignore environments).
+	* lib/Locale/Po4a/Texinfo.pm: (line_command): line_command does
+	not need to add the command name to the list of no_wrap
+	environment. It now uses the no_wrap argument of translate_buffer.
+
+2007-09-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Texinfo.pm: Also translate in the menu
+	environments the paragraphs which are not par of a menu entry.
+
+2007-09-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Texinfo.pm: Define specific translate_buffer
+	functions for the menu (menu, direntry, detailmenu) and ignore
+	environments.
+	* lib/Locale/Po4a/Texinfo.pm: detailmenu is no more verbatim.
+	* lib/Locale/Po4a/Texinfo.pm: menu, detailmenu and direntry do not
+	need an env_separators definition anymore.
+
+2007-09-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Texinfo.pm: The header uses the @c comment, it
+	must not be included before the definition of this @c command.
+	Include the header after the first \input or before the first @c
+	comment.
+
+2007-09-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/TeX.pm (translate_buffer): Allow customization
+	of the translate_buffer function with an environment specific
+	function.
+	* lib/Locale/Po4a/TeX.pm (%translate_buffer_env): New hash to keep
+	the environment specific translate_buffer functions.
+
+2007-09-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Po.pm: Reindent.
+	* lib/Locale/Po4a/Po.pm: Prefer or/and to ||/&&.
+
+2007-09-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* t/20-sgml.t: Fix the testsuite, use option -o force when the
+	sgml module has to parse xml files.
+
+2007-09-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/pod/fr.po: Fix a typo. Missing ';' in an addendum header
+	example.
+
+2007-09-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* t/11-plural.t, t/data-11/err1, t/data-11/pod1,
+	t/data-11/pod1.fr, t/data-11/pod1.po, t/data-11/pod2,
+	t/data-11/pod2.fr, t/data-11/pod2.po, t/data-11/pod3,
+	t/data-11/pod3.fr, t/data-11/pod4, t/data-11/pod4.fr: Added
+	testsuite for PO files containing plural form messages.
+	* MANIFEST: Added new files for the new testsuite: t/11-plural.t,
+	t/data-11/err1, t/data-11/pod1, t/data-11/pod1.fr,
+	t/data-11/pod1.po, t/data-11/pod2, t/data-11/pod2.fr,
+	t/data-11/pod2.po, t/data-11/pod3, t/data-11/pod3.fr,
+	t/data-11/pod4, t/data-11/pod4.fr.
+
+2007-09-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Po.pm: Add support for PO with plural forms.
+	Po4a does not generate such PO files, but it can receive one in
+	input. In such case, po4a cannot choose between the (singular and)
+	plural forms. It will consider that msgstr[0] is the translation
+	of msgid and msgstr[1] is the translation of msgid_plural, which
+	may be wrong. Thus, a warning will be issued if po4a is asked to
+	translate the singular or plural form of a message with plural
+	forms.
+
+2007-09-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Po.pm (read): Be stricter when parsing PO files.
+	Add $ to the regular expressions.
+	* lib/Locale/Po4a/Po.pm (read): Remove unneeded test.
+	($line =~ /^#$/) is contained in ($line =~ /^#(.*)$/).
+	* lib/Locale/Po4a/Po.pm (read): Reindent.
+	* lib/Locale/Po4a/Po.pm (read): When we parse msgid, the $buffer
+	should be empty. Do not concatenate.
+
+2007-09-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: Do not try to validate the input file
+	when the force option is used. (useful for xml files handled with
+	the sgml module)
+
+2007-09-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* NEWS: Mention the major changes in the texinfo module.
+	* NEWS: Add a note to packagers: do not forget to depend on the
+	docbook DTD if you run the (SGML) testsuite.
+
+2007-09-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	Major changes in the Texinfo.pm module. Tested on the elisp
+	documentation:
+	* lib/Locale/Po4a/Texinfo.pm: Add 'tex' 'display' 'smalldisplay'
+	to the list of verbatim environments.
+	* lib/Locale/Po4a/Texinfo.pm: Remove exdent to the list of
+	verbatim environments. It is just a command.
+	* lib/Locale/Po4a/Texinfo.pm (line_command): Use
+	%translate_line_command to indicate which commands have
+	translatable arguments.
+	* lib/Locale/Po4a/Texinfo.pm (parse): Handle \input
+	* lib/Locale/Po4a/Texinfo.pm (line_command): Use translate_buffer
+	to translate the command arguments (when they are translatable).
+	Add the command to $no_wrap_environments just before and remove it
+	afterwards to force a no-wrap translation.
+	* lib/Locale/Po4a/Texinfo.pm: Add support for 'findex' 'kindex'
+	dircategory subtitle include center unnumberedsec heading
+	unnumbered unnumberedsubsec unnumberedsubsubsec appendixsec
+	appendixsubsec appendixsubsubsec majorheading chapheading
+	subheading subsubheading shorttitlepage set vskip synindex
+	syncodeindex need fonttextsize printindex headings finalout
+	defcodeindex defindex definfoenclose insertcopying page
+	shortcontents
+	* lib/Locale/Po4a/Texinfo.pm: Remove the def*x commands from the
+	list of environments. They are just commands.
+	* lib/Locale/Po4a/Texinfo.pm: Define anchor and refill as commands
+	which can be removed from the beginning or end of paragraphs.
+	* lib/Locale/Po4a/Texinfo.pm: Add a list of commands for which
+	only the argument are translated if a string only consist in this
+	command: titlefont w i r b sansserif sc slanted strong t cite
+	email footnote indicateurl emph ref xref pxref inforef kbd key
+	acronym file command dfn dmn option math code samp var
+	* lib/Locale/Po4a/Texinfo.pm: Add ".  " to the menu and detailmenu
+	environment separators.
+	* lib/Locale/Po4a/Texinfo.pm: Use the same separators for direntry
+	as for menu and detailmenu.
+	* lib/Locale/Po4a/Texinfo.pm: Use @item and @tab as the multitable
+	separators.
+	* lib/Locale/Po4a/Texinfo.pm: Update copyright informations.
+
+2007-09-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* NEWS, debian/changelog: Update old entries and mention the CVE
+	id: CVE-2007-4462.
+
+2007-09-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* NEWS: Prepare NEWS entry for 0.33.
+
+2007-09-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: Document that nsgmls and the DTD of the
+	document are required.
+	* lib/Locale/Po4a/Sgml.pm: Try to detect better if nsgmls or the
+	DTD is missing. Fail in these cases.
+
+2007-09-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* html/download.php.en, po/www/fr.po, po/www/po4a-www.pot: Fix
+	link to Alioth source download page.
+
+2007-09-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/cs.po, po/bin/it.po, po/bin/ru.po, po/bin/sv.po: Fix and
+	unfuzzy strings which referenced /tmp/gettextization.failed.po
+
+2007-09-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* doc/po4a.7.pod: Fix some remaining references to
+	/tmp/gettextization.failed.po
+	* po/pod/ca.po, po/pod/es.po, po/pod/fr.po, po/pod/it.po,
+	po/pod/pl.po, po/pod/po4a-pod.pot: Unfuzzy.
+
+2007-08-17  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* html/po4a.conf, po/html.cfg, html-build-upload.sh: Move
+	html/po4a.conf to po/html.cfg.
+
+2007-08-17  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* html/po4a.conf: Specify that the original web pages are encoded
+	in UTF-8.
+
+2007-08-17  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/pod/po4a-pod.pot: Regerated. The paths are relative to the
+	package root directory (no more relative to the PO directory). The
+	strings from unreleased modules are no more translated (Debconf
+	and Wml are not tested; Text and Xhtml should be used instead of
+	NewsDebian and Html). po4aman-display-po is now translatable.
+	* po/pod/*.po: Synchronized with the POT.
+	* po/pod/fr.po: Updated.
+
+2007-08-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* Build.PL, po/pod.cfg, MANIFEST: Simplify the build process by
+	using a po4a config file. Only the distributed files will be
+	translated. This also permits to translate the scripts' manpages.
+
+2007-08-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Xml.pm, lib/Locale/Po4a/Docbook.pm: Handle the
+	nodefault option in the Xml module. It was declared in the Xml
+	module, but implemented only in Docbook.
+
+2007-08-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* html/*, po/www/*, html-build-upload.sh: New website.
+	* .cvsignore: ignore html.gen.
+
+2007-08-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/TransTractor.pm: Prepare the next 0.32 release.
+	* po/bin/pl.po: Rewrapped.
+	* MANIFEST: Added NEWS file.
+	* NEWS, debian/changelog: Updated 0.32 release date.
+
+2007-08-14  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	Fix broken links in the documentation.
+	* po/pod/pl.po: Fix po4a-translate's section (2->1).
+	* doc/po4a.7.pod: Avoid redirections for the previewKonq and
+	Debian l10n links.
+	* po/pod/po4a-pod.pot: Regerated.
+	* po/pod/*.po: Synchronized with the POT, and unfuzzied.
+
+2007-08-13  Robert Luberda  <robert@debian.org>
+
+	* lib/Locale/Po4a/Xml.pm, lib/Locale/Po4a/Xhtml.pm: Fix typo in
+	documentation.
+	* po/pod/po4a-pod.pot: Regerated.
+	* po/pod/*.po: Synchronized with the POT, and unfuzzied.
+
+2007-08-13  Robert Luberda  <robert@debian.org>
+
+	* po/pod/pl.po, po/bin/pl.po: Updated
+
+2007-08-12  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Wml.pm: Remove non translatable strings from the
+	documentation.
+	* po/pod/po4a-pod.pot: Regerated.
+	* po/pod/*.po: Synchronized with the POT.
+
+2007-08-12  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/zh_HK.po po/bin/zh_CN.po po/bin/bn.po po/bin/et.po
+	po/bin/hr.po po/bin/id.po po/bin/kn.po po/bin/ko.po po/bin/oc.po
+	po/bin/uz.po: Imported translations from Rosetta.
+	* po/bin/ca.po, po/bin/cs.po, po/bin/de.po, po/bin/eo.po,
+	po/bin/es.po, po/bin/fr.po, po/bin/it.po, po/bin/nb.po,
+	po/bin/nl.po, po/bin/pt_BR.po: Updated translations from Rosetta.
+	* MANIFEST: Distribute new translations.
+
+2007-08-12  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+	* po/bin/fr.po, po/pod/fr.po: Updated French translation.
+
+2007-08-12  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Xml.pm: Added option ontagerror to control the
+	behavior of the module in case of error. This permits to support
+	files that the module would consider invalid otherwise.
+
+2007-08-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Xhtml.pm: includessi was always activated.
+
+2007-08-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+	* po/bin/fr.po, po/pod/fr.po: Updated French translation.
+
+2007-08-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Xml.pm: Fix typo (tex -> xml).
+	* lib/Locale/Po4a/Xml.pm: Export @tag_types. Needed for the Xhtml
+	module (see below).
+	* lib/Locale/Po4a/Xhtml.pm: New option: includessi. This adds
+	support for Server Side Includes include elements like:
+	<!--#include virtual="/foo/bar.html" -->
+
+2007-08-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Xhtml.pm: reindented.
+
+2007-08-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/fr.po, po/pod/fr.po: Updated French translation.
+
+2007-08-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Text.pm: Fix typo (inthe).
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+
+2007-08-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+
+2007-08-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Texinfo.pm: Added support for verbatim
+	environments: smallexample verbatim format smallformat exdent
+	flushleft flushright lisp smalllisp ignore.
+	* lib/Locale/Po4a/Texinfo.pm: Added command handling function:
+	environment_line_command. It provides a better support for
+	commands with arbitrary number of arguments, starting an
+	environment: defcodeindex defcv defcvx deffn deffnx defindex
+	definfoenclose defivar defivarx defmac defmacx defmethod
+	defmethodx defop defopx defopt defoptx defspec defspecx deftp
+	deftpx deftypecv deftypecvx deftypefn deftypefnx deftypefun
+	deftypefunx deftypeivar deftypeivarx deftypemethod deftypemethodx
+	deftypeop deftypeopx deftypevar deftypevarx deftypevr deftypevrx
+	defun defunx defvar defvarx defvr defvrx.
+	* lib/Locale/Po4a/Texinfo.pm: Added support for
+	commands/environments: noindent detailmenu group copying quotation
+	documentdescription display smalldisplay cartouche ifdocbook
+	ifplaintext iftex ifxml ifnotdocbook ifnothtml ifnotinfo
+	ifnotplaintext ifnottex ifnotxml
+
+2007-08-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/TeX.pm: Added debug information for
+	translate_buffer.
+	* lib/Locale/Po4a/TeX.pm (is_closed): Fix function for Texinfo.
+
+2007-08-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Texinfo.pm, lib/Locale/Po4a/LaTeX.pm: The name
+	of this software is po4a, not Foobar. Fix the GPL header.
+
+2007-08-06  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Xml.pm: Add support for external entities.
+	Option includeexternal added.
+
+2007-08-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Chooser.pm: Fix the list of modules in the
+	documentation.
+
+2007-08-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* MANIFEST: Distribute the Xhtml module and its test files.
+	* lib/Locale/Po4a/Chooser.pm: Activate the Xhtml module.
+
+2007-08-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Html.pm: Updated documentation and added TODO
+	for and option to specify attributes.
+	* lib/Locale/Po4a/Html.pm: Re-indented.
+
+2007-08-05  Kaloian Doganov  <kaloian@xxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Html.pm: Translated the 'alt' attribute for the
+	area, input and applet tags (not only img). Also translate the
+	'title' attribute.
+
+2007-08-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: Fix mishandling of newlines in no-wrap
+	mode.
+	* t/data-20/test2.sgml, t/data-20/test2-normalized.sgml,
+	t/data-20/test2.pot, t/20-sgml.t: Added test to detect check this.
+	* MANIFEST: Include the new test files.
+
+2007-08-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: As we won't get rid of nsgmls really
+	soon, lower the importance of the warning (only shown in verbose
+	mode now).  It seems there were no big issues found in the last
+	year anyway.
+
+2007-08-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* t/*/*.po*: Fix the test suite accodring to the previous change.
+	* t/data-25/xhtml_normalized.html: Fix the test suite regarding
+	change done on 2007-07-06.
+
+2007-07-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Po.pm: Add the same sentence as xgettext to the
+	default comment of the POT header: "This file is distributed under
+	the same license as the PACKAGE package."
+
+2007-07-06  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Chooser.pm: Show the generic xml and tex modules
+	in the list of supported modules (and mention respectively docbook
+	and latex).
+
+2007-07-06  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* doc/po4a.7.pod: Fix a typo: s/doc-XX.po/doc.XX.po/ for
+	consistency. Thanks to Helge Kreutzmann.
+
+2007-07-06  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Xml.pm: Do not forget the trailing new line at
+	the end of attributes. This fix the handling of tags with
+	attributes on multiple lines. (attributes could be concatenated
+	without spaces between them.)
+
+2007-07-04  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Text.pm: Document the nobullet option.
+	* lib/Locale/Po4a/Text.pm: Update status and copyright.
+	* lib/Locale/Po4a/Text.pm: Add a debianchangelog option to provide a
+	better support for NEWS.Debian files.
+
+2007-07-04  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Text.pm: Better detection of sub-bullets. (when a
+	sub-bullet is detected to be at the same indentation level as the previous
+	bullet.)
+
+2007-07-03  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/pod/fr.po: Fix a typo (s/Les valeur /Les valeurs /).
+
+2007-07-03  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: Support quoted parts inside option arguments. This fixes
+	infinite loop when a config file contains an argument with single
+	quotes (which are not surrounding quotes).
+
+2007-06-17  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	Merge some changes introduced in the Debian 0.31-1 package:
+	* COPYING, lib/Locale/Po4a/BibTeX.pm, lib/Locale/Po4a/Dia.pm,
+	lib/Locale/Po4a/Docbook.pm, lib/Locale/Po4a/Guide.pm,
+	lib/Locale/Po4a/LaTeX.pm, lib/Locale/Po4a/Sgml.pm, lib/Locale/Po4a/TeX.pm,
+	lib/Locale/Po4a/Texinfo.pm, lib/Locale/Po4a/Text.pm,
+	lib/Locale/Po4a/Xml.pm: Fix the FSF address.
+	* lib/Locale/Po4a/Po.pm: Fix possible symlink attacks in /tmp. Thanks to
+	Javier Fernテ。ndez-Sanguino Peテアa.
+
+2007-05-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a-updatepo: Make sure $msgmerge_opt is initialized.
+	* NEWS: prepare the release, update the release date.
+
+2007-04-30  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+
+2007-04-30  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a, po4a-updatepo: Do not make --previous a default option for
+	msgmerge. Add options --previous and --msgmerge-opt.
+	* NEWS: Documented.
+
+2007-04-29  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/fr.po, po/pod/fr.po: Updated French translation.
+
+2007-04-22  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+
+2007-04-18  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: reset the configuration variables when
+	the module is initialized. This avoid reusing configurations
+	defined by options in previous runs (when a config file is used
+	with opt:"..." parameters.
+
+2007-04-17  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: Do not activate the creation of .po4a-stamp files by
+	default. Some packages do not expect the creation of .po4a-stamp
+	files and this broke at least adduser. Add a --stamp option.
+
+2007-04-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: Fix the sorting algorithm. This caused some changes in the
+	order of documents in the PO files.
+
+2007-04-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* NEWS: document the timestamping mechanism in the NEWS file.
+
+2007-04-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Po.pm: $VERSION is not defined. Use the full
+	$Locale::Po4a::TransTractor::VERSION instead.
+
+2007-04-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/TransTractor.pm: Prepare next release.
+	Update the version to 0.31.
+
+2007-04-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: Make sure the file exists before 'stat'ing it.
+
+2007-04-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: Fix typo in a string.
+
+2007-04-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: New option 'unknown_macros' to specify
+	the behavior when an unknown macro is found.
+
+2007-03-26  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: Only re-generate translations if needed. Use a timestamp
+	when a translation cannot be generated. (deactivated with
+	--force).
+
+2007-03-24  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a, po4a-updatepo: Use msgmerge with the --previous switch.
+	This requires gettext >= 0.16
+
+2007-03-24  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: In the sort subroutine, the null document can be the first
+	or second argument.
+
+2007-03-24  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: Allow quoted arguments in options. This permits to use
+	spaces in arguments to modules options.
+
+2007-03-24  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: Fix a typo in the documentation and comments.
+	* po4a, lib/Locale/Po4a/Po.pm: Add options --msgid-bugs-address
+	and --copyright-holder.  Similar to the xgettext options.
+	* po4a: Allow global options in the configuration file
+	([options] opt:"...").
+	* NEWS: Document these changes.
+
+2007-03-24  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* extension/: New directory. It will be used for a C extension to
+	speed up po4a.
+	* extension/Build.PL: Build system for the extension. For testing,
+	you should add the links Locale and t, pointing to ../lib/Locale
+	and ../t in the extension directory.
+	* extension/lib/Locale/Po4a/Po.xs: First attempt for a C
+	extension.  The extensions for canonize, unquote_text,
+	get_charset, unescape_text, escape_text are complete, tested and
+	provide a speed up.
+	The Po object extension is not complete (Po_new, Po_DESTROY,
+	Po_read, Po_push). The goal for the Po object extension is to
+	fully rely on the gettext libraries. A Po object from the
+	extension will not be binary compatible with a Po object from the
+	Perl code, but it should provide the same API.
+	* extension/lib/Locale/Po4a/Man.xs: First attempt for a C
+	extension.  It provides a good speedup. It should be fully
+	compatible with the Perl code.
+	* extension/lib/Locale/Po4a/TransTractor.xs: First attempt for a C
+	extension.  No speedup noticed. Provided as an example, but could
+	be dropped latter.
+	* extension/typemap, extension/lib/Locale/Po4a/Po.h,
+	extension/lib/Locale/Po4a/hash.h,
+	extension/lib/Locale/Po4a/message.h,
+	extension/lib/Locale/Po4a/pos.h,
+	extension/lib/Locale/Po4a/str-list.h: Header files for the Po
+	object extension.  At least on Debian, the gettext library is not
+	directly useable if we want to play with the internal structure or
+	advance internal functions.  This may be a temporary hack.
+	* lib/Locale/Po4a/Man.pm, lib/Locale/Po4a/Po.pm,
+	lib/Locale/Po4a/TransTractor.pm: Load the C extensions if they are
+	available. This does not make po4a slower if the extension is not
+	built and present on the system.
+	* NEWS: Document the new C extension. Status of this extension.
+
+2007-02-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* t/data-21/extract.po-ok, t/data-27/general-normalized.xml,
+	t/data-27/general.po: The gettextized XML files indicate an UTF-8
+	charset, it's normal that the POs' charset are set to utf-8.
+
+2007-02-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/fr.po: Unfuzzy.
+
+2007-02-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	Encode::from_to spends 40% of its time in find_encoding. As the
+	encoding of the input file, output file and po files do not change
+	a lot, it's faster to keep the encoders in the Transtractor or Po
+	objects.
+	* lib/Locale/Po4a/Transtractor.pm: Use detected_charset to change
+	the charset, even in the initialization (in process()).
+	* lib/Locale/Po4a/Transtractor.pm: Add a file_out_encoder
+	* lib/Locale/Po4a/Transtractor.pm (encode_from_to): New function
+	to replace Encode::from_to.
+	* lib/Locale/Po4a/Transtractor.pm: Replace some occurences of
+	Encode::from_to by encode_from_to, when the encoders are known.
+	* lib/Locale/Po4a/Po.pm: add an 'encoder' field to the po
+	structure. It defaults to find_encoding("ascii"), and is changed
+	every time the header's charset is changed.
+
+2007-02-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm (post_trans, parse): Cache the result
+	when we convert a non-breaking space to its representation in the
+	input and output charset.
+
+2007-02-14  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: Fix minor typos in comments.
+	* lib/Locale/Po4a/Man.pm (translate): Try to always provide a
+	reference to do_fonts.
+	* lib/Locale/Po4a/TransTractor.pm (translate): There's no reasons
+	to check whether file_in_charset is set to CHARSET.
+	* lib/Locale/Po4a/TransTractor.pm (translate): Be case insensitive
+	to match the "ascii" encoding name.
+	* lib/Locale/Po4a/TransTractor.pm (detected_charset): Set
+	ascii_input to 0 in case of non ascii charset.
+	* lib/Locale/Po4a/TransTractor.pm (process): Likewise.
+	* lib/Locale/Po4a/TransTractor.pm (read): Do not try to guess the
+	encoding if the encoding was provided (speed up).
+
+2007-02-14  Jim Meyering  <jim@xxxxxxxxxxxx>
+
+	Don't hang when running in background with redirected stdout.
+	* lib/Locale/Po4a/Common.pm (BEGIN): Don't try to determine output
+	terminal size when STDOUT is not a terminal.
+
+2007-01-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+	* lib/Locale/Po4a/Docbook.pm: Add the verbatim programlisting tag.
+
+2007-01-05  Yuri Kozlov  <kozlov.y@xxxxxxxxx>
+
+	* po/bin/ru.po: Updated to 150t.
+
+2007-01-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* MANIFEST: Distribute the xml testsuite.
+	* NEWS: document the new XML test suite.
+	* lib/Locale/Po4a/Man.pm: Fix minor typos in comments.
+	* t/data-23/escapes1.fr.1: remove unused file
+
+2006-12-31  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: Fix a build failure with gettext 0.15:
+	"invalid variable interpolation". This issue is fixed in latter
+	versions of gettext, but it does not harm to fix it here.
+	* Build.PL: Rework the dependencies. There are no strong
+	dependencies, only recommended dependencies.
+	* README: Document what happens when each dependency is missing.
+	* t/01-classes.t, t/20-xml.t, t/23-man.t: Skip some tests when
+	some recommended dependencies are not present.
+	* MANIFEST, lib/Locale/Po4a/Chooser.pm: Distribute the BibTeX module.
+	* lib/Locale/Po4a/Po.pm: Po.pm do not uses TransTractor.
+	* lib/Locale/Po4a/TransTractor.pm: Prepare next release.
+	* lib/Locale/Po4a/Xml.pm: Initial support for comments in Xml.
+	* t/20-xml.t, t/20-sgml.t: Rename t/20-xml.t to t/20-sgml.t.
+	* t/26-ini.t: Fix a typo. It's the testsuite for the Ini module.
+	* t/05-config.t, t/data-05/test0.fr.po-empty,
+	t/data-05/test2.de.po-empty, t/data-05/test2.es.po-empty,
+	t/data-05/test2.fr.po-empty, t/data-05/test2.it.po-empty,
+	t/data-05/test7.err: Update the test suite. Po4a's behavior
+	changed when it has to create a new PO file: it now uses msginit.
+	* t/27-xml.t, t/data-27/general.xml, t/data-27/general.po,
+	t/data-27/general-normalized.xml: New testsuite for the XML
+	module.
+	* NEWS: Document changes in 0.30.
+
+2006-11-30  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a: (Splitted mode) Always add the directories (for POs and
+	POTs). They were missing when --force is used.
+	* lib/Locale/Po4a/Po.pm: Export move_po_if_needed. Other
+	subroutine are not needed. They are object's methods.
+	* po4a: Import move_po_if_needed, and use it instead of
+	Locale::Po4a::Po::move_po_if_needed().
+	* lib/Locale/Po4a/Po.pm (move_po_if_needed): Add reason for
+	failures of system calls.
+	* lib/Locale/Po4a/Po.pm (move_po_if_needed): Add a backup argument
+	to specify if we want a ~ backup file.
+	* po4a: Use the backup argument of move_po_if_needed: no backups
+	for temp files; no backups when the no-backups option is used.
+	* po4a: (Splitted mode) Always write in a temporary file, and at the
+	end, move it to the final location or use move_po_if_needed. This
+	was needed for the handling of backup files.
+	* po4a: (Splitted mode) When we create the big merged po, if an
+	header differ, the big PO's header is completely crap. So we have
+	to use msgmerge -U, and we have to create a initial PO with at
+	least a good header (with msggrep or msginit).
+	Thanks to Azamat H. Hackimov.
+
+2006-11-25  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/TransTractor.pm: Export new. This closes
+	Alioth's bug #304168. Thanks to J.
+
+2006-11-23  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/BibTeX.pm: Fix a typo in the documentation.
+	* lib/Locale/Po4a/TransTractor.pm: Likewise.
+	* lib/Locale/Po4a/Man.pm: Recode skipped text. It would be better
+	to always use UTF-8 internally. Other modules may suffer from the
+	same issue. Thanks to Thomas Huriaux for noticing the issue on a
+	man page comment.
+	* lib/Locale/Po4a/Man.pm: mdoc macros can have empty quoted
+	arguments. Thanks to Thomas Huriaux for noticing.
+	* po4a: Add a string for translation.
+	* po4a: In splitted mode, some directories may be missing. Force
+	their creation.
+	* lib/Locale/Po4a/Chooser.pm: No need to specify every modules in
+	the rewrite rules. Only indicate the modules whose name is not an
+	upper case letter followed by lower case letters.
+	* lib/Locale/Po4a/Chooser.pm: Alphabetically sort the modules in
+	the list of supported modules.
+	* lib/Locale/Po4a/Chooser.pm: Add (commented) the prospective
+	modules in the list of supported modules.
+
+2006-11-03  Azamat H. Hackimov (winterheart-guest)
+
+	* lib/Locale/Po4a/Guide.pm: Propose the lang attribute of the
+	<guide> tag for translation. This closes the Alioth's bug #304026.
+
+2006-10-30  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Po.pm: Do not use the %z format with strftime,
+	it is not portable. Compute our own numerical timezone.
+
+2006-10-30  Costin Stroie  <cstroie@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Po.pm: Do not call date, but use strftime.
+
+2006-10-30  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Guide.pm: The guide's DTD also mentions <img>
+	(inline) and <subtitle> and <summary> (which can be re-wrapped).
+	Also add <sub> and <sup> to translate them if they are used alone
+	in a paragraph.
+
+2006-10-30  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Guide.pm: Read the guide DTD and test on the
+	whole gentoo documentation:
+	  - Translate the content of the <author>, <b>, <brite>, <c>, <e>,
+	  <i>, <path>, and <uri> tags.
+	  - Re-wrap the content of the <dd>, <dt>, <li>, <th>, <ti>, and
+	  <title> tags.
+	  - Translate the 'link' attribute of the <figure> tag.
+	  - Add <brite>, <const>, <ident>, <keyword>, <mail>, <stmt>, and
+	  <var> to the list of inline tags.
+
+2006-10-30  Nobody
+
+	* lib/Locale/Po4a/Guide.pm: Add the following tags to the 'tags'
+	category: <const>, <dd>, <dt>, <ident>, <keyword>, <mail>, <stmt>,
+	<var>, <version>.
+	The content of these tags has to be translated.
+	* lib/Locale/Po4a/Guide.pm: Re-wrap the content of the <impo>,
+	<note>, and <warn> tags.
+	* lib/Locale/Po4a/Guide.pm: Translate the 'by' parameter of the
+	<p> tag.
+	* lib/Locale/Po4a/Guide.pm: Inline the content of the <b>, <sub>
+	and <sup> tags.
+	These entries close Alioth's bug #304026.
+
+2006-10-28  Azamat H. Hackimov (winterheart-guest)
+
+	* po4a: Use msginit instead of copying the POT to the PO file.
+	This closes the Alioth's bug #304039
+
+2006-10-23  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: When an xml prologue (<?xml ...?>) is
+	detected, consider '/>' as the end of XML empty tag (not an SGML
+	'/' tag closure followed by an '>' character).
+
+2006-10-22  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: Remove the tags from the default
+	categories when they are defined by the user.
+	* lib/Locale/Po4a/Sgml.pm: Do not start the line references of
+	included files at line #0, but at line #1.
+	* lib/Locale/Po4a/Sgml.pm: Avoid issues with the emacs/vim perl
+	parsers.
+	* lib/Locale/Po4a/Sgml.pm: Increment the line references even when
+	nsgmls do not indicate that the line changed: take into accound
+	the record ends (event with type 're'). This closes Alioth's bug
+	#300589 (reference for composite SGML documents not perfect).
+
+2006-10-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* MANIFEST: distribute more test units. Otherwise, the test suite
+	fails.
+
+2006-10-15  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/pod/fr.po: Updated to 1107t1u.
+
+2006-10-13  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* testsuite/check: Add the zZ and zY macro to include bash.1 in
+	the testsuite.
+
+2006-10-10  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Text.pm: When we try to detect if a paragraph
+	contains multiple bullets, quote the bullet to avoid problems with
+	parenthesis.
+
+2006-10-09  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Text.pm: The module generated additional empty
+	lines.  Better handling of empty paragraphs (empty line followed
+	by another one).
+	* lib/Locale/Po4a/Text.pm: Add support for underlined text.
+	Translate a title together with the underlining, in non wrapped
+	mode.  Underlines are lines consisting in only '=', '-' or '_'.
+	* lib/Locale/Po4a/Text.pm: Consider paragraphs with more than 3
+	consecutive spaces as non-wrapped paragraphs.
+	* lib/Locale/Po4a/Text.pm: Consider paragraphs starting by a
+	bullet ('*') or numberred paragraphs ('1)' or '2.') as non-wrapped
+	paragraphs.
+	* lib/Locale/Po4a/TransTractor.pm (translate): When the wrapcol
+	argument is negative, add the default wrapcol value.  NOTE: It
+	does not take into account the argument of the po4a-translate's
+	--width option.
+	* lib/Locale/Po4a/Text.pm: Support for bulleted paragraphs:
+	extract the bullet's text, and wrap/reindent after translation.
+	A -o nobullets option was added to revert this behavior.
+	* NEWS: Document these changes.
+	* lib/Locale/Po4a/Text.pm: Support consecutive bulleted
+	paragraphs, without empty line to separate them.
+
+2006-10-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* NEWS: document important changes in 0.29.
+	* lib/Locale/Po4a/TransTractor.pm: Prepare release 0.29.
+
+2006-10-08  Jordi Vilalta  <jvprat@xxxxxxxxx>
+
+	* po/bin/ca.po, po/bin/es.po: Updated the translations.
+
+2006-10-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+
+2006-10-08  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: Add an "mdoc" option to select a
+	stricter support for mdoc (no translation of the 'NAME' section).
+
+2006-10-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po4a-normalize: Beginning of support for reading stdin.
+	More work is needed for a full support (other options, other
+	tools, module should not read the file twice, how to deal with
+	inclusion, ...).
+	* po4a-gettextize: Likewise.
+
+2006-10-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: Add 'term' to the verbatim tags. This
+	is needed for the module-assistant sgml man page. Otherwise,
+	lists' items are not indented.
+
+2006-10-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: Fix the issue detected in the previous
+	changes (mdoc.fr). When a line was wrapped inside a E<.xx ...>,
+	the end of line was replaced by a space instead of just being
+	deleted.
+	* t/data-23/mdoc.fr: Fix the testsuite accordingly.
+
+2006-10-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Po.pm: Fix another wrap / length calculation
+	issue, this time for the generation of the PO.
+	* t/data-23/mdoc.fr: Needed by the previous change. The mdoc code
+	needs a fix.
+
+2006-10-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* t/data-23/mdoc.fr: This is needed by the previous change.  This
+	probably means there is minor issue in the handling of E<.xx ...>.
+
+2006-09-24  Yuri Kozlov  <kozlov.y@xxxxxxxxx>
+	* lib/Locale/Po4a/Po.pm: Convert UTF-8 strings to Perl's "logical
+	character" before wrapping the text. This helps the length
+	calculation needed for wrapping lines.
+
+2006-09-18  Stephane Blondon  <stephane.blondon@xxxxxxxxxxx>
+
+	* po/pod/fr.po: Fix a typo.
+
+2006-09-18  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: Do not reopen the input file.
+	Otherwise, it fails when the master document is stdin.
+
+2006-09-17  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: Add \N'xxx' to the exception for the ''
+	to \*(rq transliteration. Thanks to KISE Hiroshi for pointing
+	this.
+
+2006-09-14  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Sgml.pm: Move <cmdsynopsis> from the indent to the
+	verbatim category.
+	* lib/Locale/Po4a/Sgml.pm: Move <arg> and <option> from the
+	translate to the ignore.
+	* lib/Locale/Po4a/Sgml.pm: Fix the handling of verbatim sections.
+	Better spacing (some end of line were missing).
+
+2006-09-05  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* t/23-man.t, t/data-23/spaces, t/data-23/spaces.fr_latin1,
+	t/data-23/spaces.fr_latin1.po, t/data-23/spaces.fr_utf8,
+	t/data-23/spaces.fr_utf8.po, t/data-23/spaces.ja,
+	t/data-23/spaces.ja.po, t/data-23/spaces.pot: New test for an
+	issue pointed by KISE Hiroshi.
+	* lib/Locale/Po4a/Man.pm: ? was considered as a non breaking
+	space. Activate the detection of failing Encode::from_to().
+	Thanks to KISE Hiroshi for pointing it.
+	* t/data-23/fonts.en, t/data-23/fonts.pot: Fix the test suite:
+	"empty commented lines" are kept.
+	* t/data-23/mdoc.fr: Fix the test suite: "spaces at the
+	end of the line for blocks of text" are removed.
+
+2006-08-30  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/BibTeX.pm: Change what appears in the 'type'
+	comment of the msgid (in the PO).
+
+2006-08-29  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/BibTeX.pm: New module: support for BibTeX
+	bibliographies.
+	* lib/Locale/Po4a/Text.pm: Fix a typo in a comment.
+
+2006-08-27  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: Keep empty commented lines.
+	* lib/Locale/Po4a/Man.pm: wrap keeps spaces at the end of
+	empty lines. Remove the space at the end of the line for blocks of
+	text (it should be done in some other blocks,but at least, it seems
+	safe here).
+
+2006-08-27  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* t/data-23/mixed.cfg, t/data-23/mixed.pot, t/data-23/mixed.fr.po,
+	t/data-23/mixed1, t/data-23/mixed1.fr, t/data-23/mixed2,
+	t/data-23/mixed2.fr, t/data-23/mixed3, t/data-23/mixed3.fr,
+	t/data-23/mixed4, t/data-23/mixed.4.fr, t/23-man.t: New mixed
+	test. Avoid depending on files used by other tests.
+	* lib/Locale/Po4a/Man.pm: remove re_init() and detect the end of
+	file when there are no more lines in parse().
+
+2006-08-26  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: Reorganize the list of options: all the
+	options to specify the behaviour of new options together.
+
+2006-08-23  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* MANIFEST: Distribute the INI module.
+	* lib/Locale/Po4a/Chooser.pm: Add the 'ini' module alias.
+	* lib/Locale/Po4a/Ini.pm: Little cleanup. Remove references to
+	Pod::Parser.
+	* t/26-ini.t, t/data-26/test1.ini, t/data-26/test1.po: Add a test
+	to the testsuite for the ini module.
+	* lib/Locale/Po4a/Man.pm: Call re_init only once, in docheader.
+	When it was called in the .TH and .Dd macros, it used to remove
+	the comments at the beginning (e.g. copyright notice, preprocessor
+	indications, etc.
+
+2006-08-21  Costin Stroie <cstroie@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Ini.pm: New module for .INI files.
+
+2006-08-20  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/Man.pm: (mdoc) Only remove the spaces at the end
+	of an mdoc macros if the space is not escaped.
+	* lib/Locale/Po4a/Man.pm: Do not always change '' to \*(rq.
+	For example, Pod::Man uses \*' and this sequence may be followed by a
+	single quote.
+
+2006-08-17  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* po/bin/po4a.pot, po/pod/po4a-pod.pot: Regerated.
+	* po/bin/*.po, po/pod/*.po: Synchronized with the POTs.
+	* po/pod/fr.po: Updated to 1088t1u.
+	* t/data-05/test7.err: Update due to the change in po4a.
+	* lib/Locale/Po4a/TransTractor.pm, debian/changelog: Prepare the
+	po4a 0.28 release.
+
+2006-08-16  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* lib/Locale/Po4a/LaTeX.pm: Add a link to the TeX module man page.
+	* lib/Locale/Po4a/TeX.pm: Register the environment provided by
+	the -o verbatim or -o no_wrap option, if the environment does not
+	already exist.
+	* lib/Locale/Po4a/TeX.pm: Document the
+	'% po4a: verbatim environment I<env>' inline command.
+	* lib/Locale/Po4a/TeX.pm: When no parameters are specified in a
+	'% po4a: environment I<env> I<parameters>', do not expect a
+	trailing space.
+	* t/data-23/mdoc.1, t/data-23/mdoc.fr, t/data-23/mdoc.pot,
+	t/data-23/mixed.fr.po, t/data-23/mixed.pot: Add a test for font
+	modifiers nested in mdoc commands.
+	* lib/Locale/Po4a/Man.pm: fix the Man module to pass the above test.
+	* t/data-23/fonts: Add a test to make sure a '<' do not prevent
+	the processing of font modifiers.
+	* t/data-23/fonts: Add a test for .I " "
+	* lib/Locale/Po4a/Man.pm, t/data-23/fonts.en, t/data-23/fonts.pot:
+	Fix the above tests.
+	* po4a: Only read a PO once. It was read for every master file of
+	the configuration file.
+	* NEWS: Add a NEWS file.
+
+2006-08-07  Nicolas Franテァois  <nicolas.francois@xxxxxxxxxxxxxxx>
+
+	* scripts/po4aman-display-po: If man -aw find multiple manpages
+	(e.g. ls.1 and ls.1posix), but only one exactly matches the given
+	section, use this page. Thanks to Florentin Duneau for reporting.
+	* lib/Locale/Po4a/Man.pm: The "do not force the translators to
+	translate them if the line only consists in \&, spaces and font
+	modifiers." patch was wrong. Some strings could be untranslated if
+	a (multi-line) string contained a line with only font modifiers,
+	\& and spaces..
+	* lib/Locale/Po4a/Man.pm: Last patch fixing "Keep the \\f font
+	modifiers with the inline macros' arguments (E<...>)." was wrong.
+	Add missing $ at the end of the regex.
+	* lib/Locale/Po4a/TransTractor.pm: Update VERSION to 0.27.2.
+
+po4a (0.27.1-1)
+
+  [Nicolas Franテァois]
+  (po/pod/fr.po)
+  * Fix unterminated S<...>
+
+ -- Fri,  4 Aug 2006 23:25:25 +0200
+po4a (0.27-1)
+
+  [Nicolas Franテァois]
+  (html-build-upload.sh)
+  * Generate the manpages before the convertion to html (the line was
+    commented)
+  (Text.pm)
+  * Fix missing empty lines between paragraphs.
+  (Man.pm)
+  * Sometimes, the .B or .I macros are followed by an argument which only
+    consist in a space. As the .B or .I macro is replaced by \fB or \fI,
+    the quotes are removed, and some \& must be used to keep the space
+    (otherwise the line will be considered empty by groff.
+    Add these \&, and do not force the translators to translate them if
+    the line only consists in \&, spaces and font modifiers.
+  * Support for the ms' DA macro.
+  * Support commented lines between .ie and .el macros.
+  * Keep quotes arround mdoc macros' arguments when they contain spaces.
+  * Do not replace - by \- in the symbols used in \*(XX
+  * When we warn about using conditionnals without groff_code, also show
+    the reference of the line.
+  * gettextize the ".ie without .el" error, and add the reference of the
+    line in the manpage.
+  * add an mdoc method (translate_mdoc_no_quotes) because some mdoc macros
+    must not have their arguments quoted.
+  * In splitargs, change \&" to a groff double quote \(dq.
+    It's still not perfect, but it helps in a lot of pages.
+  * When a string is quoted, only translate the argument between the
+    quotes, and restore the quotes latter.
+  * Keep the \\f font modifiers with the inline macros' arguments (E<...>).
+  * Add \\f in the "Unsupported font in..." error. This helps understanding
+    what/where is the error.
+  * Fix typos.
+  (po4a)
+  * Print the number of translated strings, even if the translation is
+    discarded because it is less translated than the threshold.
+  (po4aman-display-po)
+  * Do not always use po4a-translate's -o options for the options passed
+    to po4aman-display-powith -o. Otherwise, we can only specify module
+    options, and not options for po4a-translate (i.e. we can't specify
+    something like -o "-L ISO-8859-1").
+  (Tex.pm)
+  * Fix typos.
+  (po/bin/fr.po)
+  * Update the translation, after review by the Debian l10n list.
+  (po/pod/fr.po)
+  * Update the translation, after review by the Debian l10n list.
+
+  [Florentin Duneau]
+  (po/pod/fr.po)
+  * Fix some typos.
+
+  [Thomas Huriaux]
+  (Man.pm)
+  * Support for empty .B or .I followed by commands, with a warning.
+
+ -- Sun,  9 Jul 2006 01:19:52 +0200
+
+po4a (0.26-1)
+
+  [Nicolas Franテァois]
+  (po4aman-display-po)
+  * When the master page is not provided, only look for the English man page.
+  * With -m, users can now just specify the name of the original manpage
+    (without the full path). Thanks to Florentin Duneau.
+  * Warn if the -m argument not sufficient to identify an unique man page
+    (the section is needed). Thanks to Florentin Duneau.
+  * Do not use the function keyword (yields a syntax error with dash).
+    Thanks to Julien Cristau.
+  * Add missing quotes
+  * Fix the trap command
+  (Man.pm)
+  * Fix failures when a configuration file is used to translate both mdoc
+    and groff man pages. The groff macros are no more erased in mdoc mode.
+  * When a TH macro is found, switch back to the groff mode (but keep the
+    mdoc macros if they were defined).
+  * Print the po4a header before the Dd macros.
+  * .SM is an inline macro. Thanks to Thomas Huriaux.
+  * Add support for \# groff comments. Thanks to Thomas Huriaux.
+  * Specify the line reference for "Unsupported font" errors.
+  * Allow some more \c escapes (still not supported everywhere)
+  * Reset some memories at the beginning of files (docheader & .TH & .Dd).
+    When multiple files were mentionned in a config file, the comments or
+    the fonts from one document could affect the next file.
+  * Fix the .IX macro.
+  * Support the \fL font modifier (needed for .IX).
+  * Do not replace - by \- in symbol name (\[XXX] or \C'XXX' \v'XXX')
+    (Also make sure there is odd number of \ in the other exceptions)
+  * Add a 'generated' option to allow using po4a on generated man pages.
+  * Only warn for .so and .mso, and do not translate the line.
+  * Fix some bugs related to quotes used in the arguments of groff macros.
+  * Do not split the arguments to the .ie, .if, .de macros. This fixes
+    some spacing and quote issues with these macros.
+  * el lines can start with a apostrophe (') instead of a period (.).
+  * .el macros can be followed by a space or an escaped curly bracket (\{).
+  * always convert back non breaking spaces to '\ ' before pushing the
+    arguments in splitargs().
+  * Do not convert non breaking spaces before calling splitargs.
+    (otherwise, the error mesages do not contain the original string)
+  (Chooser.pm)
+  * Fix a typo in the LaTeX module link and add the Xml module to the
+    SEE ALSO section.
+  (Sgml.pm)
+  * Add the docbook's edition tag to the translate category.
+    Thanks to Thomas Huriaux.
+  (Po.pm)
+  * quote: To restore the original trailing spaces, we must remove the
+  current trailing spaces with s/\s+$//s (not chomp).
+  (TeX.pm)
+  * Use the ESCAPE variable instead of \ when appropriate.
+  * Add variables for the comments regexp.
+  * Merge some strings.
+  * Allow space as an argument separator
+  (Texinfo.pm)
+  * New module.
+  (tests)
+  * Add an mdoc test.
+  * Add a mixed mdoc/roff test.
+  * Add some quote tests for the Man module.
+  (html-build-upload.sh)
+  * Update the script to build the html documentation. It now uses
+    man2html. (This was necessary for the Polish pages)
+  (po4a)
+  * Use the same order as in the configuration file when creating the POT
+    and the translated files.
+    NOTE: this may modify the order of strings in your current POTs.
+  (po4a.7.pod)
+  * Update the list of supported formats.
+  (Xml.pm)
+  * Update documentation: It is now distributed.
+  (Pod.pm)
+  * Fix a problem with non-breaking spaces, which were causing missing
+    output in the translated file.
+
+  [Yves Rテシtschlテゥ]
+  (Xhtml.pm)
+  * Update for the new Xml module behaviour (no need to define all the
+    tags).
+  (tests)
+  * Add an Xhtml test suite.
+  (Xml)
+  * Include the comments starting with a #.
+    This permits to support SSI statements in the Xhtml module.
+
+  [Yuri Kozlov]
+  * Updated Russian translation (po/bin/ru.po). 150t.
+
+  [Daniel Nylander]
+  * Updated Swedish translation (po/bin/sv.po). 141t9u.
+
+ -- Thu, 13 Apr 2006 11:08:43 +0200
+
+po4a (0.25-1) unstable; urgency=low
+
+  New upstream release (no change in packaging):
+  
+  [Nicolas Franテァois]
+  (Po.pm)
+  * Missing =back in the pod part.
+  * consecutive escaped tabulations in the PO: only the first one was
+    un-escaped. Closes: #359352
+  * gettextize: do not associate the strings by their order in the POs, but by
+    their order in the documents. This permits to gettextize documents
+    which have the same structure, but where a string have
+    multiple translations, or when different strings have the same translation.
+    If multiple translations appear for a string, both strings are proposed in
+    the PO. Closes: #326670
+  (po4a)
+  * When a master document is specified twice in a configuration file:
+    - do not ignore the options specified in the first line;
+    - also warn in this case since po4a may not do what the user wants.
+  * Fix the documentation: po4a do not use the POT-Creation-Date field of the
+    POT and PO headers. It only updates the POs with msgmerge -U.
+    Closes: #360141
+  (Man.pm)
+  * Documentation: this module is no more beta.
+  * Another fix for "when a font modifier if followed by another font
+    modifier". Also add a test for this case.
+  * mdoc support.
+  * Do not put the header at the top of the file, but just before the .TH
+    macro. This will preserve the indications on how to process the page if
+    the first line contains something like: '\" t
+  (Xml.pm)
+  * Implement placeholders: this permits to specify that footnotes must not be
+    translated inside a paragraph, but are translated separately and a
+    <placeholder0> tag will be put where the footnote must be installed.
+  * In tag_extract_doctype, we can't test whether the Document Type Definition
+    contains an Internal Subset by searching the document for "]>" because
+    this is also used for closing the CDATA Sections.  This caused
+    segmentation faults.  Closes: #362169
+  * get_string_until: add a option to search a regular expression.  The
+    default is to search for a fixed string.  Also make sure get_string_until
+    works when the serach string (or regex) contains a newline (\n).
+  * When there is an Internal Subset, the Document Type Definition ends with
+    "]\s*>", not necessarily "]>".
+  * Add support for CDATA Sections.
+  (po4aman-display-po)
+  * new script to display a translated man page with a given PO.
+    Thanks to Thomas Huriaux.
+  (po4a.7.pod)
+  * Fix a typo in the detailed example for the beginboundary field.
+    Thanks to Ognyan Kulev.
+
+ -- Martin Quinson <mquinson@debian.org>  Thu, 13 Apr 2006 11:08:43 +0200
+
+po4a (0.24-1) unstable; urgency=low
+
+  [Nicolas Franテァois]
+  (Sgml.pm)
+  * Preserve more entities. It was already the case for entities ending by a
+    semi-colon, but they were expended in entities not terminated by a
+    semi-colon (e.g. id="&url-debian-volatile").
+  * Add the docbook docinfo tag, and remove duplicate refsect1 tag.
+  * Add a post-translation filter, which converts non breaking spaツ「es (0xA0 in
+    latin1) to the &nbsp; entity.
+  (Po.pm)
+  * use File::Copy::move instead of rename (the POT/POs were not written when
+    /tmp and the file were not in the same device.
+    Thanks to Valテゥry Perrin and Thomas Huriaux. Closes: 354330
+  * make filter() less verbose
+  * delete the automatically generated apply subroutine to avoid warnings.
+  * be more restrictive on the lines ignored by diff in write_if_needed.
+  * New function move_po_if_needed to move a PO if there are some chnages.
+  (TeX.pm)
+  * Do not extract a trailing command if it is followed by an unexpected
+    parameter. This fixes an issue in list environments when the \item are
+    followed by blocks. Closes: 354955
+  * New verbatim environment category. You can now specify verbatim blocks in
+    environments other than "verbatim".
+  (po4a)
+  * The --split option is no more needed. This feature is supported by using
+    $master in the po4a_paths line.
+  * try to re-generate the POT if the config file was modified.
+  * use File::Copy instead of system("cp").
+  (general)
+  * replace some `||' by `or'. || has an higher priority and some warnings
+    were masked.
+  (Pod.pm)
+  * Overload the TransTractor's translate() in order to add pre- and
+    post-translation filters.
+  * Change the latin1 0xA0 (non-breaking spaces) to the pod S<...> equivalent.
+    This should help projects with multiple formats.
+  (Man.pm)
+  * .R is a (R), not a font modifier.
+  * Remove duplicate definition of the .P macro. The font was not reset to
+    Roman.
+  * Also handle empty font modifiers followed by .P, .PP, .LP or .TP
+  * When a font modifier if followed by another font modifier (or .P, or .SH,
+    etc.), the first font must not be ignored. Inform the font stack with
+    set_font.
+  * a .P or .TP may be followed by spaces.
+  * Remove unneded group in regex (theoretical speedup).
+  * Detect non-wrapped lines (lines starting by spaces) when the line starts
+    by a font modifier (\f).
+  (README.maintainers)
+  * Add a document to help the translators.
+    Thanks to the contributions from Denis Barbier, Thomas Huriaux and Cyril
+    Brulebois.
+  (MANIFEST)
+  * Distribute the ar, eo, eu, he, ku, nb, nl, pt, pt_BR, sl, sv and uk
+    translations since some of them have more translated strings than other
+    alredy distributed.
+
+  [Yuri Kozlov]
+  * Updated russian translation (po/bin/ru.po) (Closes: #350300)
+
+ -- Martin Quinson <mquinson@debian.org>  Sun, 12 Mar 2006 18:59:18 +0100
+
+po4a (0.23-1) unstable; urgency=low
+
+  [Thomas Huriaux]
+  (po4a)
+  * only updates the POT if a master document is more recent than the existing
+    POT. Closes: #339459
+  * New --variable option.
+  (Docbook.pm)
+  * refentrytitle can be specified inside a sentence. Move this tag to the
+    inline category.
+  (Sgml.pm)
+  * There can be spaces between the entity definition and '>'.
+  * Some fixes in the line references counting mechanism.
+  * Add a ignore-inclusion option. It permits to avoid including external
+    entities.
+  * For the conditionnal inclusions, use the <po4abeg name="..."> and
+    <po4aend> tags to fool nsgml instead of the {PO4A-beg-...} and {PO4A-end},
+    which caused extra tags to be added by nsgmls.
+  * Do not fail when the file pointed by a system entity does not exist and
+    this entity is not used.
+
+  [Nicolas Franテァois]
+  (Po.pm)
+  * If a line could not be wrapped (e.g. because of a more than xx chars
+    link), the rest of the paragraph was not rewrapped.
+    Thanks to Thomas Huriaux.
+  * Add a write_if_needed subroutine to check if an update is needed.
+    see #339459.
+  (Text.pm)
+  * A new very simple module for text documents. Closes: #243753
+  (po4a-gettextize)
+  * support for multiple master/localized files. Closes: #319208
+  (Sgml.pm)
+  * Do not re-wrap the prolog entities on one line.
+  * An external entity can be referenced as &entity; or &entity. The second
+    case is now supported. Thanks to Thomas Huriaux.
+  * Do not include the commented entities.
+  * support for the 'qref' tag.
+  * Support for the processing instructions (pi) (e.g. <?xml...?>).
+  * Fix various issues when po4a is not run in the master file directory.
+  (Xml.pm)
+  * The inline tags were not added to the tags path. It should now be possible
+    to put "<tag1><tag2>" in the 'tags' category, even if <tag1> is in the
+    'inline' category.
+  * The encoding declaration must be added before any standalone document
+    declaration. Otherwise the document is not valid. Thanks to Olivier
+    Trichet for noticing.
+  * First attempt to translate the entities.
+  (Docbook.pm)
+  * When a tag is added to the 'inline' or 'tags' category on the command
+    line, the default tags in Docbook.pm should not add this tag in the other
+    ('inline' or 'tags') category.
+  * New "nodefault" option, to avoid a specified tag to be set in the tags
+    or inline category by defaut.
+  (po4a)
+  * Add a set of options that could be useful for the maintainers:
+    --no-translations, --rm-translations, --no-backups, --rm-backups
+  * Add a --force option that force the re-generation of the POT and PO files.
+  * If the POT is updated (see Thomas change above), check that this update is
+    really needed (avoids changing only the POT-Creation-Date field).
+    see #339459.
+  * The error message when msgmerge failed was wrong. Closes: #339453
+  * Fix the --quiet option. CLoses: #342293
+    Thanks to Brendan O'Dea.
+  (translations)
+  * Update French translation, use non-breaking spaces where needed
+  * Fix a lot of typos in the French translation. Thanks to Frテゥdテゥric Bothamy.
+    Closes: #341175
+  * Update the Swedish translation according to Rosetta
+    (I can't update more languages. The update process of Rosetta is ways too
+    complicated)
+
+  [Danilo Piazzalunga]
+  * Update Italian program translation.
+
+  [Robert Luberda]
+  * Program and manpages translation to Polish. Closes: #340877
+  (Build.PL)
+  * Fix of the build script for the languages that don't use latin1 for their
+    man pages.
+
+ -- Martin Quinson <mquinson@debian.org>  Fri, 09 Dec 2005 18:12:12 +0100
+
+po4a (0.22-1) unstable; urgency=low
+
+  [Nicolas Franテァois]
+
+  (Sgml module)
+  * Fix a typo in the "keyword" tag.
+    Thanks to Chris Karakas.
+  * Add the DocBook's contrib and epigraph tags
+  * Be stricter on the regex matching entities
+  * Escape more chars in CDATA. This fixes #301335 (on Alioth)
+  * Append the content of a CDATA to the current buffer because it was
+    not output at the right position
+  * Don't forget some {PO4A-beg/end} in the output document
+  * Ignore (ie, remove) <![ IGNORE [...]]> sections
+  * recognize numerical character entities (e.g. &#38;)
+    Thanks to Thomas Huriaux.
+  * Improve speed 
+  * use the nsgmls -wno-valid option to avoid some errors since we include
+    all parts conditional inclusion constructs, for example.
+  * fix the spacing of the verbatim blocks.
+    Thanks to Julien Louis (ptitlouis) for reporting.
+  * Various other little fixes and improvements
+  (Man module)
+  * Fix the .ds macro (it arguments must be translated, except the name of the
+    variable, which must be dispalyed to the translator)
+  * implement .vs, .hw .EQ and .EN macros
+  * Do not wrap the first line following a .TP
+  * translate the .ta arguments in case they contain a word
+  * better support for .B or .I macros when they don't have arguments and are
+    followed by a font macro, a .SH, a .TP, or a .IP
+  * fix the translate_exh function
+  * Fix some issues with the '-' to '\-' transliteration
+  * Add support for the .de, .ie and .if section with the groff_code option
+  * Add options to deal with new options defined with .de, or options not
+    supported by po4a (untranslated, noarg, translate_joined,
+    translate_each, no_wrap, inline)
+  (TeX & LaTeX modules)
+  * New syntax for the "% po4a:" line.
+    This alow command to mix optional and mandatory arguments.
+  * remove the old category (untranslated, translate_each, ...) This was
+    problematic when a command is follwed by a block ({...}).
+  * Update the definition of the common LaTeX commands and environments.
+    All these definitions are now in the LaTeX module.
+  * Allow 3 mode of separation for the commands at an extremity of a block
+    (separate and translate the parameters that must be translated
+    separately, separate and translate the command with its parameters, only
+    separate if the command is alone in a block).
+  * Allow to translate the \begin command with all its arguments attached.
+  * Make error messages translatable.
+  (po4a)
+  * document the support for options/aliases in the config files.
+  (translations)
+  * Update French translation
+  * Fix some issues in the French translation of the manpages.
+    Thanks to Julien Louis (ptitlouis).
+  (Docbook module)
+  * Add the 'screen' tag, which should not be re-wrapped.
+    Thanks to Thomas Huriaux.
+  (Xml module)
+  * Do not break paragraphs on comments, just remove them.
+  (Po module)
+  * Restore the trailing spaces in Po.pm:wrap().
+    This fix an issue with the lang attribute of an XML file ('en' was
+    normalized into 'en\n').
+    This needed a minor correction of Pod.pm and Sgml.pm.
+  (Debian package)
+  * bump Standards-Version to 3.6.2
+  * do not build depend on libsgmls-perl
+  * depends on ${misc:depends}, ${perl:Depends} instead of perl | perl5
+  * only recommends liblocale-gettext-perl
+
+  [Franテァois Gouget (fgouget@xxxxxxx)]
+
+  (Xml module)
+  * Append the encoding attribute if it is not defined in the <?xml> tag.
+
+  (Sgml module) 
+  * Use a regular expression to simplify the tag kind check.
+  * Assorted spelling fixes.
+  * If relative, the path of included file must be considered to be relative
+    to the path of the master Sgml file.
+    Fixes bug #300874 on the Alioth tracker, for the Sgml module.
+  * The debug option is a space separated list of channels to print
+    information for. So we must split it to set $debug.
+  * Check the nsgmls exit code and issue an error if it is non-zero.
+    This lets us detect the case where nsgmls is missing.
+  * Add support for translating attribute values.
+  * Add a 'qualify' option to denote which attributes should get an
+    msgid 'qualified' by the attribute name.
+  * Don't qualify the lang attribute by default for consistency with Xml.pm
+  * Rename the 'attribute' option to 'attributes' for consistency with Xml.pm
+
+  (Po module)
+  * Add a porefs option controlling the file reference verbosity, and thus
+    the diff verbosity.
+
+  (Chooser)
+  * Store '\$@' in an intermediate variable so it does not get clobbered
+    before we report the plugin-load error.
+
+  (binaries)
+  * Clarify the '--option' documentation.
+  * Remove unneeded imports of TransTractor::VERSION.
+
+  (libraries)
+  * Remove unneeded imports and exports of TransTractor::VERSION.
+
+  (General)
+  * Various documentation improvements
+  * Implement wrappers for textdomain(), gettext() and dgettext() in
+    Po4a::Common to make the dependency on Locale::gettext optional.
+  * Remove unused load_config export in Po4a::Common
+  * Make the Text::WrapI18N and Term::ReadKey dependencies optional
+
+  [Jordi Vilalta]
+
+  (Docbook module)
+  * Add the missing > in <structname>
+
+  [Martin Quinson]
+
+  (po4a(1))
+  * Document the dataflow to explain that this tool cannot be used to 
+    gettextize (Closes: #313165)
+
+  (Sgml module)
+  * Allow prolog entities which are not SYSTEM ones
+  * Fix the way included files are looked for (was broken when everything is
+    in the same dir)
+
+  (Transtractor module)
+  * Allow to pass options to the po modules as to the plugins.
+
+  (Po module)
+  * Issue an useful error message when the gettextization fails because there
+    is not the same amount of entries (Closes: #325314)
+  * Tell that the gettextization documentation contain some hints to help users
+     in this painful task
+
+  (Random scripts)
+  * msguntypot: help eradicating typo in msgstr without needlessly fuzzying
+    the translations.
+
+  [Yuri Kozlov]
+  * Program translation to russian (po/bin/ru.po) (Closes: #324247)
+
+ -- Martin Quinson <mquinson@debian.org>  Tue,  1 Nov 2005 17:36:42 +0100
+
+po4a (0.21-1) unstable; urgency=low
+
+  [Nicolas Franテァois]
+  (TeX module)
+  * Fix an issue with file excluded from inclusion:
+    after a gettextization, the PO file contained two \input{x}.
+  * Add a generic way to specify separators.  For example, this permits
+    to translate each cell separately in a tabular environment.
+  * Just warn instead of dying when the documentclass cannot be found
+  (Man module)
+  * Add a verbose option, for "po4a -v".
+  * Add comments to the PO file, and fix the testsuite accordingly.
+  * Remove the with-non_breaking_spaces and with-hyphen_to_minus options
+    and document the transliterations performed in pre_trans and post_trans.
+  * Fix an encoding issue with non-breaking spaces.
+  (Po.pm)
+  * Allow multiple comment lines for a PO string.
+  (po4a)
+  * Add support for options/aliases in the config files.
+    First try ... undocumented feature.
+
+  [Jordi Vilalta]
+  (Xml module)
+  * Handle the processing instructions ( <?...?> ) simply ignoring them
+  (Docbook module)
+  * Wrap by default
+  (Po module)
+  * Handle tabs when canonizing
+
+ -- Martin Quinson <mquinson@debian.org>  Wed, 27 Apr 2005 15:03:10 +0200
+
+po4a (0.20-2) unstable; urgency=medium
+
+  Release critical bug fix.
+
+  [Martin Quinson]
+  * Catch errors of Term::ReadKey::GetTerminalSize so that we can build on the 
+    terminal-less settings that some debian automated builder love (Closes: #300395).
+
+ -- Martin Quinson <mquinson@debian.org>  Mon, 21 Mar 2005 10:04:59 +0100
+
+po4a (0.20-1) unstable; urgency=low
+
+  [Nicolas Franテァois]
+  (man module)
+  * Handle requests beginning by a single quote.
+  * More escapes for dots and single quotes at the beginning of a line.
+  * Fix some issues with the .HP macro.
+  * Fix a minor issue regarding empty lines.
+  * Do not reset the wrapping mode (when set by a '.nf' request) after the end
+    of a paragraph.
+  * Handle lines containing only spaces as empty lines.
+  * Fall back to the parser when a macro follow a '.TP'.
+  * The heading of a section (.SH) or subsection (.SS) can be provided on the
+    line after the macro.
+  * Better support for some groff escapes (\\, \.).
+  * Add a limited support for "\c".
+  * Some quotes could be converted to \", which starts a groff comment.
+  * Fix an issue with paragraphs starting by a new line.
+    (This also touch Po.pm)
+  * Honor "" in quoted macro argument, which represent a single double quote.
+  * When a macro argument is pushed in the output document, convert " to \(dq
+    if the argument has to be quoted.
+  * Handling of input line continuation (\<RET>) should not be reserved for
+    macros.
+  (TeX module)
+  * Add a generic TeX module:
+    - it tries to separate entities that can be translated on their own (i.e.
+      paragraphs, but also some commands when they are located at the
+      beginning or end of these entities);
+    - permits to build derivated parsers (e.g. for LaTeX, but texinfo is also
+      planned);
+    - allows personnalization (with '% po4a: ' lines in the tex file or a class
+      file);
+    - handles file inclusion.
+    - customization by categories of commands
+      (translated/untranslated and/or separated).
+    - break paragraphs at the beginning and end of environments blocks.
+    - it was tested with a book and the Python documentation
+  * Add a PythonDoc and a LaTex module derivated from TeX.
+    - NOTE: this module will probably be removed. Use the LaTeX module
+      instead.
+  (Po.pm)
+  * \n or \t can be preceded by an even number of backslash.
+  (translations)
+  * Update French program translation
+
+  [Martin Quinson]
+  (sgml module)
+  * Add <option>, <refname>, <refpurpose> and <holder> to the list of
+    verbatim tags to fix the second half of #280882.
+    More work needed to fix the first half.
+  (debian pkg)
+  * Build-depend on libtext-wrapi18n-perl for the new wrapping functions
+
+  [Yves Rテシtschlテゥ]
+  (Build.PL)
+  * Let the 'clean' target remove po4a.log.
+  (HTML module)
+  * Preserve leading and trailing spaces in tag content.
+  * Fix the <img> tag.
+  * Translate text only if it contains some letters.
+  * Add t/22-html.t
+  (Po.pm)
+  * Files containing nothing to translate are obviously
+    completely translated (set translation state to 100%).
+
+  [Jordi Vilalta]
+  (xml module)
+  * Don't search an unquoted end for comments. Closes: #291831 in Debian
+  * Now the strip option is enabled by default, as suggested by Denis
+  (generic)
+  * Complete the catalan documentation translation.
+  * Update the spanish documentation translation with some suggestions by
+    Ruben Porras.
+  * Updated the scripts and modules to use the new wrapping functions.
+  (Common module)
+  * New module that will contain common utilities.
+  * Added message wrapping functions.
+  (po4a)
+  * Added support for language templates in config files
+  (po/bin translations)
+  * Added Afrikaans translation by Theuns Smuts
+  * Added Czech translation by Vlastimil Skacel
+  * Added German translation by Tim Fuchs, Sebastian Aust, Thorsten Tasch
+    and Laura Ohrndorf
+
+  [Danilo Piazzalunga]
+  (documentation)
+  * Fix some (mostly cosmetic) typos, without changing the meaning of
+    anything. Examples include case changes, spelling improvements, and the
+    consistent use of 'addenda' as the plural form for 'addendum'.
+  * Sorry, fellow translators, for all the new fuzzies.
+  (translations)
+  * Regenerate po/bin/po4a.pot and po/pod/po4a-pod.pot.
+  * Update the Italian program translation.
+  (testsuite)
+  * Updated the expected test output to the new wrapped output.
+  * Added some new test cases for man pages.
+  * Rewrite the @tests array construction in t/23-man.t.
+  * Specify standard column size when running some tests.
+  (debian/control)
+  * Build-depend on libterm-readkey-perl, needed by the wrapping functions.
+  (scripts)
+  * Print full help when the user asks for --help, and a terse message
+    otherwise.
+
+ -- Martin Quinson <mquinson@debian.org>  Sun,  6 Mar 2005 11:44:39 +0100
+
+po4a (0.19-1) unstable; urgency=low
+
+  [Jordi Vilalta]
+  (po4a, po4a-translate)
+  * Added the -L, --localized-charset option to convert the translated
+    document to the specified charset
+
+  [Yves Rテシtschlテゥ]
+  (Locale/Po4a/Po.pm)
+  * Fix line numbers in error messages.  Closes: #278428
+
+  [Nicolas Franテァois]
+  (man module)
+  * Improved testsuite.
+  * Improve handling of nested font modifiers.  Closes: #277384
+  * Recognize some (probably incorrect, but usual) comment lines.
+  * Do not change hyphen to minus where it's forbiden (.so, .mso and \s
+    arguments).
+  * Do reset the wrapping mode when using .SH
+  * Fix splitting macro arguments.  Closes: #268904
+  * Do not quote the macro arguments when it would result in a breakage
+    (because they are already quoted, with the need to display the quotes).
+  * Add support for some macros (.R .EX .EE .cs .ss), and partial support
+    for others (.ce .ul .cu)
+  * Add splitargs and shiftline subroutines with some code from parse. This
+    permits to handle line continuations and font requests (.B, .RI, ...)
+    after a .TP.
+  * fix the testsuite (make check) to take last changes into account.
+  (po4a-normalize)
+  * Added the -M option to po4a-normalize
+  
+  [Martin Quinson]
+  (TransTractor)
+  * Allow modules to add automatic comments in the po file.
+  (sgml module)
+  * Make <title> verbatim so that man page generation works.  Closes: #274278
+    Thanks to Sylvain Cherrier for the bug report and testing the fix.
+  * Eat the comments in the prolog since they can contain some '<' and '>' 
+    preventing us to find the '>' closing the prolog. Closes: #278365
+
+  [Danilo Piazzalunga]
+  * [po/bin/it.po & po/pod/it.po] Update Italian translation, and
+    convert them to ISO-8859-1 for now so that generated manual pages
+    also have this encoding.  Closes: #273736
+  * [po/bin/it.po & po/pod/it.po] Convert PO files back to UTF-8. Thanks to
+    Jordi and everybody else for fixing the charset issues.
+
+ -- Denis Barbier <barbier@debian.org>  Wed, 10 Nov 2004 00:09:28 +0100
+
+po4a (0.18.1-1) unstable; urgency=high
+
+  * Urgency set to high to have a chance for 0.18 to enter testing.
+    This version has been much more tested than 0.17 and many bugs
+    fixed; they were not filed on the BTS because only its developers
+    are currently using po4a, but 0.18 is mature enough for a larger
+    audience.
+
+  [Jordi Vilalta]
+  - [Xml.pm] Improved attributes matching when there's no tag hierarchy in
+    front of an attribute
+  [Denis Barbier]
+  - A header comment is inserted by po4a-translate with some formats,
+    remove po4a version number from this comment so that test files do
+    not have to be updated at every release.
+
+ -- Denis Barbier <barbier@debian.org>  Fri, 27 Aug 2004 23:28:33 +0200
+
+po4a (0.18-1) unstable; urgency=low
+
+  [Jordi Vilalta]
+  - [Build.PL] Ensure we run the tests before distributing a new release
+  - Added encoding support (not complete by now)
+  - [Xml.pm] Added the generic XML support module
+  - [Dia.pm] Changed to use Xml.pm
+  - [tests] Updated most tests to work with the encoding issues
+  - [documentation] General improvements
+  - [translation] sync to en po/bin/es.po, po/bin/ca.po and po/pod/es.po
+    with small improvements suggested by Carme Cirera
+  - [Guide.pm] Added Guide XML support module
+  
+  [Martin Quinson]
+  (generic)
+  - Fix several typo in messages.
+    - po4a: inverting the meaning. Closes #264535 in Debian
+    - po4a-updatepo: was rather poor. Closes #264537 in Debian
+    - Sgml.pm: induced a perl error (not enough args for format).
+      Thanks Olivier Trichet for the last one, and Danilo for the others.
+  - Various documentation & messages improvements
+  - [translation] Update po/bin/fr.po
+  (TransTractor)
+  - Do not try (and fail miserably) to create path to output file when it's
+    in the current directory (also in Po.pm).
+  - [addendum] change a 'while (shift @toto) {}' to a 
+    'do {shift; bla} while (scalar @toto)' so that we proceed even if @toto
+    contains empty strings. (Clauses: #265383) of Debian
+  (Sgml)
+  - stop pushline()ing empty strings since it breaks TransTractor. Also
+    closes Debian's #265383. Yup, this bug is fixed twice. Slam!
+  (Man)
+  - Fix tests so that they stop make sure that the nf/fi bug of man is still
+    there. Test that it does not come back instead.
+  - Convert on the fly the groff horror \*(lqlibc5\*(rq, which stands for
+    "libc5", with the quotes. Thanks to Phillipe Batailler for bringing my
+    attention to this.
+  - Add support for the groff builtin registers and for the ms
+    "Displays and keeps" macros. This was needed to deal with the man pages
+    of shadow and dpkg.
+  - No groff nbsp (ie '\ ') on the last pos of the line, or groff adds an
+    extra space. Thanks to Nicolas Francois for the info. 
+  - Convert \- to - on the fly. The asteatic of the printed man page may
+    suffer (a hyphen is different of a minus sign in ps/pdf), but makes
+    translator's life easier. Thanks to Nicolas Francois for the expertise.
+  - Stick to groff_man(7) intead of man(7), and consider that when IP is
+    given only one argument, that's the designator (which we have to
+    translate) instead of the column indentation. Thanks Francois.
+  - Deal properly with '\ ' in macro arguments. Ie, stop changing 
+    '.BI -a\  addresses' to '.BI "-a addresses"' (but to .BI "-a " addresses)
+  - Do not eat \ at the end of the line (and put the next one on the same
+    line) when we're not on a macro definition line.
+  (po4a)
+  - Kill the code checking that the first argument contains no colon, since
+    the filename can contain colons. This triggers false positives here.
+    Thanks to Julien Louis for reporting. (Closes: #265684).
+
+  [Danilo Piazzalunga]
+  - [po/bin/it.po & po/pod/it.po] Add Italian translation
+
+  [Carme Cirera]
+  - [po/pod/ca.po] Add Catalan translation
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed, 25 Aug 2004 16:10:03 -0000
+
+po4a (0.17.2-1) unstable; urgency=low
+
+  [Martin Quinson]
+  - new script: msgsearch to extract some messages from a po file. That's a
+    generalization of msggrep allowing you to use OR between different
+    categories. msgselect is "reserved" by gettext author to do the same using
+    the SQL syntax in input. I use the LDAP one (with Perl RE ;).
+  - [sgml] add refentry to verbatim so that no spaces are added.
+  - [sgml] do not indent neither add superious spaces around verbatim tags
+    Those two should Closes #262739 (in Debian).
+  - [sgml] Allow entities def. to contain '>'. Closes #262735 (in Debian)
+  - [documentation] Overhaul of po4a(7)
+  - [documentation] Various pod fixup
+  - TransTractor and Po mkdir the path to where they are asked to write
+    something if it does not exist. Closes #263297 (in Debian)
+  - [addendum] Allow extra space after the semi colon separating fields in
+    headers. Closes #263299 (in Debian, provided that I understood the repport)
+  - [sgml] Allow %entities; in prolog, even if they are the evil incarned on
+    earth. Damn it, it wasn't easy. Fixes Alioth's #300710.
+  - [sgml] Detect when the included files do not exist, and spit the right
+    error message
+  - [translation] keep po/bin/fr.po in sync with the code, despite my own
+    effort to fuzzy the strings (I mean improve them, of course)
+
+  [Jordi Vilalta]
+  - [documentation] Further pod and english fixup
+  - [translation] Complete the spanish translation of the documentation
+  - Non-intrusive modifications to Po.pm and TransTractor.pm to help support
+    the encoding options in the near future
+  - [translation] sync to en po/bin/es.po and po/bin/ca.po
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Sat,  7 Aug 2004 16:18:53 -0700
+
+po4a (0.17.1-1) unstable; urgency=low
+
+  [Jordi Vilalta]
+   - sync to en po/bin/es.po and po/bin/ca.po
+   - Further improvement of the building mecanism
+   - [po/pod/es.po] Add Spanish translation
+
+  [Martin Quinson]
+   - sync to en po/bin/fr.po
+   - turn back my email address to tuxfamily instead of my professional one
+   - Cleanups of the building mecanism
+   - Rephrase some error messages here and there (sorry for keeping fuzzing
+     the translation ;)
+   - fix several brain dead errors in po4a (I swear I tested version 0.17 !)
+   - add a threshold option to po4a(1). If we cannot set it from the config
+     file, at least we can set it from the command file.
+   - Fix Man module:
+     - add support for the .na and .nh roff macro (ignored). Closes alioth's
+       #300845, and allows to tackle apt-proxy(8).
+     - .nf stops wrapping; .fi starts it again. The contrary was done.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Tue, 20 Jul 2004 18:54:11 -0700
+
+po4a (0.17-1) unstable; urgency=low
+
+  * Introduction of the po4a(1) program.
+    - have a configuration file instead of complex command line arguments
+    - updates po files and translations in one shoot
+    - allows to use the same pot file for different documents format [easily]
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Thu, 15 Jul 2004 21:14:13 -0700
+
+po4a (0.16.4-1) unstable; urgency=low
+
+  Cleaner build mecanism
+  Bugs fixes (new tags for Sgml, various glitches)
+
+  Jordi Vilalta
+  * New build mecanism based on Module::Build instead of the
+    deprecated MakeMaker
+  * [po/pod/Makefile] Allow to handle more than one language
+  * [po/bin/Makefile] Various cleanups
+  * [TransTractor.pm] Fix a by one offset in the line number reference
+  * [tests] Fix the false alarm resulting of previous change
+
+  Michael Wiedmann
+  * [Sgml.pm/docbook]
+    translate += revremark secondary tertiary editor othername
+    indent += bridgehead
+    ignore += keywordset keyword
+  * [TransTractor.pm] Fix two typos
+
+  Martin Quinson
+  * [Sgml.pm/docbook]
+    translate += synopsis
+    indent += reference shortcut
+  * Build process (lintian/linda clean again)
+    Call the scripts with "perl ../name" during build/test since
+      Module::Build fails to chmod +x @scripts.
+    Compress the translated manpage at full power to respect debian policy
+  * [debian/control]
+    Put myself as maintainer (not changing the uploaders)
+    Fix my email address for consistancy with my other packages
+    
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Thu, 15 Jul 2004 16:57:48 -0700
+
+po4a (0.16.3-1) unstable; urgency=low
+
+  Jordi Vilalta
+  * [po/bin/es.po] Various improvements 
+  * [po/bin/ca.po] New translation
+  
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Sun, 30 May 2004 15:36:33 -0700
+
+po4a (0.16.2-1) unstable; urgency=low
+
+  * Makes Pierre happy and do not distribute the debian files within the
+    regular archive, but in the diff.gz.
+  * [Sgml.pm] 
+    - Add <simpara> tag. this closes alioth's #300714.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed, 26 May 2004 11:48:16 -0700
+
+po4a (0.16.1-1) unstable; urgency=low
+
+  Martin Quinson
+  * Make sure --version option of all binary works
+  * [po/bin/fr.po] back to 100%
+
+  Jordi Vilalta
+  * [po/bin/es.po] back to 100%
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed, 26 May 2004 10:39:16 -0700
+
+po4a (0.16-1) unstable; urgency=low
+
+  SGML should work. Without source change, even for (simple) XML.
+  Addition of a Dia module by Jordi Vilalta.
+  
+  Martin Quinson
+  * [all binaries]
+    - add a -o/--option flag allowing to pass options to the format plugin
+  * [Sgml.pm] 
+    - Try to handle XML documents, with a big fat warning that this may fail,
+      and that no bug should be reported if it does not work.
+      Thanks to Jordi Vilalta for suggesting that.
+    - New options to add tags to the mechanism without modifying the code.
+    - Detect non-master files and report them properly. This was alioth's
+      #300591 and savannah's #6438.
+    - Put verbatim tags in their own msgid to avoid issues with
+      mixing wrapped and non-wrapped. This was savannah's #7155.
+    - Make a gentle error message when SGMLS.pm was not found.
+    - Issue warnings ("hello, user. This is a feature") when msgid is
+      skipped because it contains an entity alone, or because it contains
+      only tags. The translation of those is always the msgid itself. 
+      Thanks Jordi for falling into that trap ;)
+    - Detect msgid containing one entity and spaces, and skip them also.
+    - Add a 'include-all' option preventing the optimization described on
+      two previous items.
+    - Permit the translation of entity definition (not for file including
+      ones, but for the rewrite ones). Thanks Jordi for the hint.
+    - Add missing tags (articleinfo, which was savannah's #8475, and some more)
+  * Fix a bunch of typos reported by Francois Gouget (thanks). 
+    This was savannah's #7152.
+  * [t/data-02/man.po] back to 100% success on tests
+    Reformatting to match what we get. This does not impact the semantic of
+    the file, and I believe the change is due to gettext.
+  * [t/data-20/*; t/20-xml.t] New test about SGML plugin (when used in XML
+    mode since it tests both modes at once)
+  * [po/bin/fr.po] Complete translation. 
+    [po/pod/fr.po] Complete translation of binaries man page.
+    I reviewed the strings in the process and fixed some of them.
+
+  Denis Barbier
+  * Call 'xgettext -L Perl' instead of '-L c' to extract messages from
+    Perl scripts.  
+  * Remove trailing newlines from gettext messages.
+
+  Jordi Vilalta
+  * [po/bin/es.po] Add Spanish translation
+  * [Dia.pm] New module for the diagrams saved by dia program
+  * [t/21-dia.t  t/data-21] Relevant tests
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Tue, 25 May 2004 10:55:25 -0700
+
+po4a (0.15.4-2) unstable; urgency=low
+
+  * First official upload.  Closes: #176492
+  * Fix buglets in doc/po4a.7.pod
+  * Replace prefix variable by DESTDIR in debian/rules and po/bin/Makefile
+    to follow GNU usage.
+  * As told in section 3.1 of the Perl policy, man pages must be installed
+    under section 3pm, not 3perl.
+  * In debian/rules, remove the useless pods target, 'make -C po' does the
+    job.
+  * Make debian/rules much lighter by processing and running Makefile.PL
+  * Normalize po4a-normalize, replace --help-fmt command-line flag by
+    --help-format to comply with other po4a tools.
+  * In Locale::Po4a::Chooser, all available formats were loaded, the
+    requested one is now dynamically loaded.
+  * In Locale::Po4a::Pod, remove declarations of functions when they
+    are inherited from Locale::Po4a::TransTractor.
+  * Some newlines were missing with the POD format, because trailing
+    newlines were removed in Locale::Po4a::Pod, and some (but not all)
+    were added in Locale::Po4a::Po.  These changes are removed, and
+    po4a-normalize does no more lose newlines on POD files.
+
+ -- Denis Barbier <barbier@debian.org>  Wed, 24 Mar 2004 22:33:12 +0100
+
+po4a (0.15.4-1) unstable; urgency=low
+
+  * Small fixup to the Sgml.pm
+    move <command> to the ignore list to avoid sub-sentence splitup.
+    
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed,  12 Nov 2003 10:51:59 +0100
+
+po4a (0.15.3-2) unstable; urgency=low
+
+  * Fix lintian issues:
+    - Bump standard-version
+    - Versionned builddep on debhelper, add debian/compat
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Mon,  10 Nov 2003 14:03:37 +0100
+
+po4a (0.15.3-1) unstable; urgency=low
+
+  * Fix lintian issues:
+    debian/control: typo and line too long
+    doc/po4a.7.pod: add a NAME section
+  * Fix Sgml.pm:
+    - apply patch from Francois Gouget to support more docbook tags. Closes
+      Savannah's #2353. 
+      Add some more tags to parse a sgml file I used to fix the following:
+    - Fix references for composite files. Closes Savannah's #6439.
+      Do report the right file and line number for composite files.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Mon,  10 Nov 2003 13:38:38 +0100
+
+po4a (0.15.2-1) unstable; urgency=low
+
+  * Fix savannah's #5139: Bad quoting.
+    Quoting is a little nightmare, but I added the provided faulty example
+    in the tests, and it is fixed now.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Fri,  7 Nov 2003 15:59:42 +0100
+
+po4a (0.15.1-1) unstable; urgency=low
+
+  * The long awaited version.
+   
+  * Fix savannah's #4975: french man page is outdated.
+    - This revealed to be a grave bug in the tool itself, leading to the use
+      of the fuzzy strings in translation.
+    - t/10-discard-fuzzy.t is a test to make sure this bug will never come back.
+  * Fix savannah's #4976: po4a.7 outdated.
+    - Update the man page to reflect the new option names.
+  * Fix the small glitches which made the tests to fail. 
+    - Now, the testsuite is more complete, and all tests success on my box.
+    - README.tests is a bit of documentation on how to report make test
+      failure.
+ 
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Fri,  7 Nov 2003 13:43:17 +0100
+
+po4a (0.15) unstable; urgency=low
+
+  * The "Let's iritate the users by changing the option names" version.
+  
+  Major changes:
+  * Change and unify all option names for the scripts.
+  
+  Minor changes:
+  * Document a bit more the scripts.
+  * Update copyright year for scripts (FIXME: not lib).
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Tue, 11 Feb 2003 23:53:11 +0100
+
+po4a (0.14) unstable; urgency=low
+
+  * The "One step outside Debian" version.
+  
+  * A proper Perl package is now build, thanks to Makefile.PL
+    Next step: inclusion on CPAN ;)
+  * Preliminary testsuite:
+    - Every class is compilable
+    - Man.pm works (test number 4 is known to fail, because diff don't work well on po files).
+    - addendums work
+    Still to do: other modules.
+  * Fix po/pod/Makefile, to avoid tons of warnings and reflect the lib/ directory change.
+    [Denis Barbier]
+  * Updated documentation, thanks to Philippe for its review. One day,
+    addendums will be usable...
+  * Use warnings in all file
+  * Add a 'no-wrap' flag to all msgid which must not be wrapped by
+    po4a. This tag is valid for gettext and will be preserved by
+    tools. It means something else for gettext, but this other meaning seems
+    useless to me, and both uses can coexist. 
+  * Man.pm:
+    - don't split indented paragraphs on several msgids.
+    - don't pretend we handle nested font modifier when we don't
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Fri,  7 Feb 2003 08:46:23 +0100
+
+po4a (0.13.6) unstable; urgency=low
+
+  * po4a-updatepo reports the status of the file after the update
+  * Man.pm: handle UC and AT macro
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Thu, 23 Jan 2003 15:20:26 +0100
+
+po4a (0.13.5) unstable; urgency=low
+
+  * Make the placement of the addendum verbose when -v is passed to
+    po4a-translate, thanks to the crash tests from Philippe ;)
+  * More documentation improvement, thanks to the review from Philippe.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Thu, 23 Jan 2003 09:08:14 +0100
+
+po4a (0.13.4) unstable; urgency=low
+
+  * Really fix the problem I though to fix in 0.13.2
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed, 22 Jan 2003 10:34:38 +0100
+
+po4a (0.13.3) unstable; urgency=low
+
+  * Man.pm: explain why we refuse to process pages generated from pod or
+    sgml, document processed by db2man.xsl can be processed, since the 
+    XML module of po4a isn't done yet.
+  * gettextization: The fact that the original and the translated files
+    don't have the same number of entries isn't fatal anymore, so that
+    the user can see where there is a document structure disparity.
+  * Fix problems in po4a.7.pod, thanks to Philippe Batailler.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed, 22 Jan 2003 08:42:30 +0100
+
+po4a (0.13.2) unstable; urgency=low
+
+  * TransTractor.pm: don't check for the options passed to translate,
+    since I fail to make it work with the Man.pm
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Fri, 17 Jan 2003 08:39:53 +0100
+
+po4a (0.13.1) unstable; urgency=low
+
+  * Sgml.pm:
+    - don't translate the footnotes separatly, since it would imply to split
+      the sentence containing them.
+    - put all the author description (name+surname+email+...) in the same
+      msgid to ease the translator work.
+      
+  * Makefiles:
+    - implement a stats target in po/
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Sun, 12 Jan 2003 16:49:52 +0100
+ 
+po4a (0.13) unstable; urgency=low
+
+  * The "housekeeping is good when you want to invite people home" version.
+  
+  * TransTractor: Internals cleanup: 
+    - translate_wrapped() don't exist anymore, and translate() take extra
+      arguments to specify if we want to wrap.
+    - For internals data in the object, transtractor now use TT (it used to 
+      use DOC).
+    - Set the package version only in this file, and not in all.
+  * Po.pm:  Internals cleanup: 
+    - push_wrapped() and gettext_wrapped() disapeared also.
+  * All modules: Adapt to last changes in TransTractor.pm
+  * New module: Chooser.pm  
+    This is not a new format, but functions to manage all formats in the
+    same place. 
+    Before, when I added a module, I had to change all binaries to take it
+    into account.
+    Now, all binaries use this module to access format modules.
+  * Man.pm: cosmetic changes, to make it readable by others.
+  * Sgml.pm: 
+    - New dtd: docbook. 
+    - Should work even in case of conditional inclusion (string references in
+      po files will be wrong in that case).
+
+    - Generated source is better looking
+
+    - ups, added "use strict;" ;)
+    - Don't use SGMLS::Output anymore. This is an old piece of crap producing
+      tons of warnings when used under perl -w.
+    - remove debugging output
+  
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Sun, 12 Jan 2003 16:49:52 +0100
+
+po4a (0.12) unstable; urgency=low
+
+  * Rename po4a-identity to po4a-normalize, since it do normalize the
+    source document.
+  * We now have a decent documentation in po4a(7)
+  * Several small bug and glitches fix all over there.
+  * New module: SGML
+    - This is the long awaited sgml module !
+    - So far, it can handle only the debiandoc dtd but extending it to other
+      ones should be quite easy. 
+    - For now, this adds a strict dependence on libsgmls-perl and sp since
+      I didn't implement the check for existing libraries, like debconf does 
+      for curse.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Thu,  9 Jan 2003 20:53:26 +0100
+
+po4a (0.11) unstable; urgency=low
+
+  * Tons of bug fixes: 
+    - Pod.pm shouldn't fail anymore
+    - Man.pm now fail on only 3% of the pages installed on my box (because
+      they are too cleaver with roff for us)
+    see documentation and release note for more details
+  * Polishing:
+    - More argument checking to detect problems
+    - Redo some parts of the documentation
+    - Begin the translation of documentation to french
+  * New module:
+    - KernelHelp: The help messages associated with each kernel compilation 
+      option
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed, 25 Dec 2002 19:15:28 +0100
+
+po4a (0.10.3) unstable; urgency=low
+
+  * Move lib/ to Locale/Po4a/ so that pod translations can be builded
+    without build-depending on ourself
+  * Add a new script po4a-identity usefull to debug po4a modules (by
+    prooving they are idempotent)
+  * Fix the way the bold and italics are handeled in man pages (translator
+    are only faced to POD sequence B<blabla> and I<blibli>, but this was
+    broken and did not work in all cases).
+  * updatepo accepts non-existent po files, so that you can bootstrap a po
+    file for n documents without gettextize each one and using msgcat to
+    merge the results.
+  * Add a Copyright and License section in all man pages
+  * Fix a bug in the handling of 'pod' and 'back' commands.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed, 18 Dec 2002 08:08:45 +0100
+
+po4a (0.10.2) unstable; urgency=low
+
+  * Fix a bug reported by Julien Louis: Locale::Po4a::Man was not included 
+    in po4a-gettextize.
+  * Other bug reported by Julien Louis: indented paragraph in man pages
+    shouldn't be wrapped.
+  * Fix the generation of binary po files, and put the french translation.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Fri, 13 Dec 2002 07:51:00 +0100
+
+po4a (0.10.1) unstable; urgency=low
+
+  * Fix a bug reported by Julien Louis: All strings containing '\n' where
+    not translated.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Thu, 12 Dec 2002 16:25:52 +0100
+
+po4a (0.10) unstable; urgency=low
+
+  * New name, one more code reorganization. Having more than one package
+    implies to dupplicate code in the binaries. Ie, the difference between
+    pod-gettextize and man-gettextize is only the module to load.
+    I don't want to maintain the same code N times.
+  * Po.pm, TransTractor.pm:
+    - bug fixes
+  * Man.pm:
+    - first release.
+    - seems ok to me (it fails on unknown macro, and shouldn't change the
+      cat result).
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Wed, 11 Dec 2002 16:55:20 +0100
+
+po-pod (0.9) unstable; urgency=low
+
+  * Use the new Locale::Po4a::TransTractor as base of the parser/extractor.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Fri, 29 Nov 2002 14:23:04 +0100
+
+po-pod (0.8.4) unstable; urgency=low
+
+  * Depend on the newly created liblocale-po4a-perl, and do not provide
+    Po.pm anymore.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Tue, 19 Nov 2002 17:53:37 +0100
+
+po-pod (0.8.3) unstable; urgency=low
+
+  * pod-gettextize:
+    - output file defaults to standard output.
+    - document the fact that all translations found during the merge are
+      marked fuzzy, and why. 
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Tue, 19 Nov 2002 17:22:58 +0100
+
+po-pod (0.8.2) unstable; urgency=low
+
+  * Remove {read,write} to filehandle to avoid problems when running under
+    UTF8 locales.
+  * Po.pm: when calling the regular gettext, prefix it with
+    Locale::gettext::, so that we get the function we are looking for, and
+    not the one defined in this package.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Mon, 18 Nov 2002 15:08:43 +0100
+
+po-pod (0.8.1) unstable; urgency=low
+
+  * pod-translate:
+    - when a translation is discarded, remove the old generated file.
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Mon, 18 Nov 2002 09:22:55 +0100
+
+po-pod (0.8) unstable; urgency=low
+  
+  * Po.pm:
+    - New functions: gettext_stats, and gettext_stats_clear. Be careful
+      (and read the doc ;), it's not the status of the file, it's the
+      summary of its recent use through the gettext method.
+    - New function: wrapped_gettext(), wrapped_push(), which do like 
+      gettext() and push(), but assumes that whitespaces in msgid and 
+      msgstr are not significant (and modify them).
+  * pod-updatepo: INCOMPATIBLE INTERFACE CHANGE!
+    - now accepts several pod files (to put their translation in only one
+      file per language).  
+  * pod-translate:
+    - reports how much is each file translated when running verbose.
+    - New option: -k set the threshold under what the translation is
+      discarded. Defaults to 80. 
+    - New option: -w set the width to which the resulting file should be
+      wrapped. Defaults to 76.
+    - New option: -a|--add-file is implemented (see man page). It's not
+      specific to pod files, and should work for all modules, provided
+      that they keep the file to output in a @ of lines.
+  * Packaging:
+    - Perl modules are now stored under /usr/share, and not /usr/lib
+      because they are not arch-dependent.
+    - Manpages are now installed only with dh_installman, so that we don't  
+      get them twice.
+    - The comments in source also says that code is GPL'ed
+  * All binaries and modules:
+    use (regular) gettext.pm to localize the messages ;)
+
+ -- Martin Quinson <martin.quinson@xxxxxxxxxxxxx>  Sun, 17 Nov 2002 02:09:06 +0100
+
+po-pod (0.7) unstable; urgency=low
+
+  * Initial release.
+
+ -- Denis Barbier <barbier@debian.org>  Fri, 22 Mar 2002 23:47:06 +0100
+

Added: po4a/debian/changelog
===================================================================
--- po4a/debian/changelog	                        (rev 0)
+++ po4a/debian/changelog	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,114 @@
+po4a (0.32-1) unstable; urgency=low
+
+  * New upstream release.
+    - Infinite loop fixed when an option argument specified in a config file
+      contain single quotes. Note that single quotes are still supported
+      inside an option argument if this argument is protected by escaped
+      double quotes. Closes: #431162
+    - Fix handling of tags with argument on multiple lines. Closes: #430792
+    - Fix typo in po4a(7). Closes: #428193
+    - Xml is now really in the list of modules displayed by
+      po4a-gettextize --help-format (note however that you may prefer to use
+      instantiated modules like docbook). Closes: #398711
+    - The text module should work nicely with README.Debian files. With the
+      debianchangelog option, translation of NEWS.DEBIAN files should be
+      supported. Closes: #189641
+    - The warning which was (nearly) always displayed with the sgml module
+      is now only present in verbose mode. Closes: #428199
+    - New xml module's option: includeexternal. Closes: #425531
+  * debian/rules: Removed commented debhelper calls.
+  * debian/rules: Distribute upstream NEWS file.
+  * debian/rules: Recode テシ and テゥ to groff characters in the English manpages.
+
+ -- Nicolas FRANCOIS (Nekral) <nicolas.francois@xxxxxxxxxxxxxxx>  Wed, 15 Aug 2007 22:07:48 +0200
+
+po4a (0.31-1) unstable; urgency=low
+
+  * New upstream release.
+    - New options for po4a: --msgid-bugs-address and --copyright-holder.
+      Options can also be set in the configuration files. Closes: #415643
+    - gettext (>= 0.16) is needed (use of the --previous flag).
+  * Fix symlink attacks in /tmp vulnerability. Thanks to Javier
+    Fernテ。ndez-Sanguino Peテアa. Closes: #429160
+    (CVE-2007-4462)
+  * Update the FSF address.
+  * Update the debian/copyright to mention the actual copyrights and the
+    upstream location
+
+ -- Nicolas FRANCOIS (Nekral) <nicolas.francois@xxxxxxxxxxxxxxx>  Sat, 24 Mar 2007 21:19:01 +0100
+
+po4a (0.30-1) unstable; urgency=low
+
+  * New upstream release.
+    - Update of the list of module displayed by po4a-gettextize --help-format
+      Xml is now in this list. Closes: #398711
+
+ -- Nicolas FRANCOIS (Nekral) <nicolas.francois@xxxxxxxxxxxxxxx>  Sat, 30 Dec 2006 19:03:55 +0100
+
+po4a (0.29-1) unstable; urgency=low
+
+  * New upstream release. 
+  * Better rendering of <cmdsynopsis> with Sgml manpages. The cmdsynopsis
+    sections will be verbatim. Closes: #369778
+  * Convert UTF-8 strings to Perl's "logical character" before wrapping the
+    text. This helps the length calculation needed for wrapping lines. Thanks
+    to Yuri Kozlov. Closes: #389200
+  * New mdoc option for the man module, to select a stricter support of the
+    mdoc format. Also document how this section can be translated with an
+    addendum. Closes: #378245
+
+ -- Nicolas FRANCOIS (Nekral) <nicolas.francois@xxxxxxxxxxxxxxx>  Sun,  8 Oct 2006 01:10:57 +0200
+
+po4a (0.28-1) unstable; urgency=low
+
+  * New upstream release. 
+
+ -- Nicolas FRANCOIS (Nekral) <nicolas.francois@xxxxxxxxxxxxxxx>  Thu, 17 Aug 2006 00:34:25 +0200
+
+po4a (0.27.2-1) unstable; urgency=low
+
+  * New upstream release.
+  * If only one page matches the given section, use this file (even multiple
+    pages were found by man -aw). Closes: #381552
+  * Man module fixed. It generated \\fB instead of B<...>, and thus fuzzied a
+    lot of translations. Closes: #381939
+
+ -- Nicolas FRANCOIS (Nekral) <nicolas.francois@xxxxxxxxxxxxxxx>  Tue,  8 Aug 2006 00:09:03 +0200
+
+po4a (0.27.1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Martin Quinson <mquinson@debian.org>  Fri,  4 Aug 2006 23:32:41 +0200
+
+po4a (0.27-1) unstable; urgency=low
+
+  [Florentin Duneau]
+  * Fix typos in the French translation of the documentation. Closes: #378246
+
+  [Nicolas Franテァois]
+  * Keep the \\f font modifiers with the inline macros' arguments (E<...>).
+    Closes: #378622
+  * Set myself as the Maintainer
+
+ -- Martin Quinson <mquinson@debian.org>  Fri,  4 Aug 2006 21:57:40 +0200
+
+po4a (0.26-1) unstable; urgency=low
+
+  The changes for the releases prior to 0.26 are described in
+  /usr/share/doc/po4a/changelog.gz.  It includes upstream changes and
+  changes in the Debian package.
+
+  [Nicolas Franテァois]
+  * bump Standards-Version. No changes needed.
+  * move debhelper to Build-Depends, even if no architecture-dependent
+    packages are built, because it is run in the clean target.
+  * Replace the c with cedilla by \[,c] (fix some lintian warnings)
+
+  New upstream release
+  * po4aman-display-po improvements. Closes: #368997
+  * Updated Russian translation. Thanks to Yuri Kozlov. Closes: #373618
+  * Updated Swedish translation. Thanks to Daniel Nylander. Closes: #374896
+
+ -- Martin Quinson <mquinson@debian.org>  Sun, 25 Jun 2006 20:15:32 +0200
+

Added: po4a/debian/compat
===================================================================
--- po4a/debian/compat	                        (rev 0)
+++ po4a/debian/compat	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1 @@
+4

Added: po4a/debian/control
===================================================================
--- po4a/debian/control	                        (rev 0)
+++ po4a/debian/control	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,29 @@
+Source: po4a
+Section: text
+Priority: optional
+Maintainer: Nicolas FRANCOIS (Nekral) <nicolas.francois@xxxxxxxxxxxxxxx>
+Uploaders: Martin Quinson <mquinson@debian.org>, Pierre Machard <pmachard@debian.org>
+Standards-Version: 3.7.2
+Build-Depends-Indep: perl-modules, libmodule-build-perl
+Build-Depends: debhelper (>> 4.0.0)
+
+Package: po4a
+Architecture: all
+Depends: ${misc:depends}, ${perl:Depends}, gettext (>= 0.16), perl-modules, libsgmls-perl, sp
+Recommends: libtext-wrapi18n-perl, libterm-readkey-perl, liblocale-gettext-perl
+Conflicts: po-pod, po-man, liblocale-po4a-perl
+Description: tools for helping translation of documentation
+ The po4a (po for anything) project goal is to ease translations (and
+ more interestingly, the maintenance of translations) using gettext
+ tools on areas where they were not expected like documentation.
+ .
+ This package contains the main libraries of po4a, and the following
+ sub-modules:
+ .
+   - KernelHelp: Help messages of each kernel compilation option.
+   - Man: either roff or mdoc format.
+   - Pod: Perl documentation format.
+   - Sgml: either debiandoc or docbook DTD.
+   - Dia: uncompressed Dia diagrams.
+   - LaTeX: generic TeX or LaTeX format.
+   - XML: very configurable, docbook DTD preconfigured.

Added: po4a/debian/copyright
===================================================================
--- po4a/debian/copyright	                        (rev 0)
+++ po4a/debian/copyright	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,25 @@
+This package was first packaged by Martin Quinson mquinson#debian.org
+and Denis Barbier barbier@debian.org on Sat, 16 Nov 2002 19:28:48 +0200.
+It is now maintained by Nicolas Franテァois <nicolas.francois@xxxxxxxxxxxxxxx>.
+
+Upstream Authors:
+	Martin Quinson mquinson#debian.org
+	Denis Barbier barbier@debian.org
+	Jordi Vilalta  <jvprat@xxxxxxxxx>
+	Nicolas Franテァois <nicolas.francois@xxxxxxxxxxxxxxx>
+
+It was downloaded from http://po4a.alioth.debian.org/
+
+Copyright:
+	Copyright (c) 2002-2004 by Martin Quinson (mquinson#debian.org)
+	Copyright (c) 2002-2006 by Software of Public Interest, inc.
+	Copyright (c) 1995 by David Megginson <dmeggins@xxxxxxxxxxxxxxx>
+	Copyright (c) 2004 by Jordi Vilalta  <jvprat@xxxxxxxxx>
+	Copyright (c) 2005-2007 by Nicolas FRANテ⑯IS <nicolas.francois@xxxxxxxxxxxxxxx>
+	Copyright (c) 2006 by BitDefender
+
+You are free to distribute this software under the terms of
+the GNU General Public License.
+On Debian systems, the complete text of the GNU General Public
+License can be found in the file `/usr/share/common-licenses/GPL'.
+

Added: po4a/debian/dirs
===================================================================
--- po4a/debian/dirs	                        (rev 0)
+++ po4a/debian/dirs	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,4 @@
+usr/bin
+usr/share/perl5/Locale/Po4a
+usr/share/man/man1
+usr/share/man/fr/man1

Added: po4a/debian/docs
===================================================================
--- po4a/debian/docs	                        (rev 0)
+++ po4a/debian/docs	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1 @@
+README.maintainers

Added: po4a/debian/rules
===================================================================
--- po4a/debian/rules	                        (rev 0)
+++ po4a/debian/rules	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,88 @@
+#!/usr/bin/make -f
+# This file is public domain software, originally written by Joey Hess.
+
+package = po4a
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+DESTDIR = $(CURDIR)/debian/$(package)
+ifndef PERL
+PERL = /usr/bin/perl
+endif
+
+build: build-stamp
+build-stamp:
+	dh_testdir
+
+# Make sure the VERSION string were updated in binaries
+	@ pkgver=`dpkg-parsechangelog|\
+	          grep -m 1 Version|\
+		  sed -e 's/Version: //' -e 's/-.*//' -e 's/[[:blank:]]*//g'`;\
+	libver=`grep '$$VERSION=' lib/Locale/Po4a/TransTractor.pm| \
+                sed -e 's/^.*"\([^"]*\)".*/\1/'`; \
+	if [ "x$$pkgver" != "x$$libver" ] ; then \
+	   echo "VERSION in lib/Locale/Po4a/TransTractor.pm is wrong ($$pkgver!=$$libver)";\
+	   exit 1; \
+	fi;
+
+	$(PERL) Build.PL installdirs=vendor
+	$(PERL) Build
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+
+	-$(PERL) Build clean
+	rm -rf _build build-stamp Build
+
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+
+#	$(PERL) Build test
+	$(PERL) Build install destdir=$(DESTDIR)
+
+	for man in $(DESTDIR)/usr/share/man/man3/*.3pm; do \
+	    sed -i -e "s/\\[,c]/g;s/ヌ/\\[,C]/g" \
+	           -e "s/\\[:u]/g;s/薇\\['e]/g" $$man; \
+	done
+
+# Build architecture-independent files here.
+binary-indep: build install
+	dh_testdir
+	dh_testroot
+	dh_installdocs NEWS
+	dh_installchangelogs changelog
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_perl
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+# Build architecture-dependent files here.
+binary-arch: build install
+# We have nothing to do by default.
+
+binary: binary-indep binary-arch 
+
+#     Shortcuts
+tar: clean
+	version=`sed -e 's/.* (//' -e 's/-.*//' -e 1q debian/changelog`; \
+	echo Creating ../$(package)_$$version.orig.tar.gz; \
+	#tar cf - * | tarcust -p $(package)-$$version -x '.*CVS.*' -x '.*.cvsignore' -x 'debian/.*' | gzip --best > ../$(package)_$$version.orig.tar.gz
+	perl Build.PL
+	perl Build dist
+	#$(MAKE) tar
+
+deb:
+	dpkg-buildpackage -rfakeroot -i'/CVS|/\.cvsignore|/mantmp|testsuite|lib/Locale/Po4a|po/pod'
+
+.PHONY: build clean binary-indep binary-arch binary install


Property changes on: po4a/debian/rules
___________________________________________________________________
Name: svn:executable
   + *

Added: po4a/doc/addendum.ca
===================================================================
--- po4a/doc/addendum.ca	                        (rev 0)
+++ po4a/doc/addendum.ca	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,7 @@
+PO4A-HEADER:mode=after;position=^=head1 AUTORS;beginboundary=^=head1
+
+=head1 TRADUCCI+
+ Carme Cirera <menxu@xxxxxxxxxxx>
+ Jordi Vilalta <jvprat@xxxxxxxxx>
+

Added: po4a/doc/addendum.es
===================================================================
--- po4a/doc/addendum.es	                        (rev 0)
+++ po4a/doc/addendum.es	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,6 @@
+PO4A-HEADER:mode=after;position=^=head1 AUTORES;beginboundary=^=head1
+
+=head1 TRADUCCION
+
+ Jordi Vilalta <jvprat@xxxxxxxxx>
+

Added: po4a/doc/addendum.fr
===================================================================
--- po4a/doc/addendum.fr	                        (rev 0)
+++ po4a/doc/addendum.fr	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,6 @@
+PO4A-HEADER:mode=after;position=^=head1 AUTEURS;beginboundary=^=head1
+
+=head1 TRADUCTION
+
+ Martin Quinson (mquinson#debian.org)
+

Added: po4a/doc/addendum.it
===================================================================
--- po4a/doc/addendum.it	                        (rev 0)
+++ po4a/doc/addendum.it	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,6 @@
+PO4A-HEADER:mode=after;position=^=head1 AUTORI;beginboundary=^=head1
+
+=head1 TRADUZIONE
+
+ Danilo Piazzalunga <danilopiazza@xxxxxxxxx>
+

Added: po4a/doc/addendum.pl
===================================================================
--- po4a/doc/addendum.pl	                        (rev 0)
+++ po4a/doc/addendum.pl	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,6 @@
+PO4A-HEADER:mode=after;position=^=head1 AUTORZY;beginboundary=^=head1
+
+=head1 T$B!W(BUMACZENIE
+
+ Robert Luberda <robert@debian.org>
+

Added: po4a/doc/addendum_man.fr
===================================================================
--- po4a/doc/addendum_man.fr	                        (rev 0)
+++ po4a/doc/addendum_man.fr	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,6 @@
+PO4A-HEADER:mode=after;position=^\.SH AUTEUR;beginboundary=^\.SH
+
+.SH TRADUCTION
+
+Nicolas Fran$B%F%!(Bois <nicolas.francois@xxxxxxxxxxxxxxx>
+

Added: po4a/doc/po4a.7.pod
===================================================================
--- po4a/doc/po4a.7.pod	                        (rev 0)
+++ po4a/doc/po4a.7.pod	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1185 @@
+=head1 NAME
+
+po4a - framework to translate documentation and other materials
+
+=head1 Introduction
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on areas
+where they were not expected like documentation.
+
+=cut
+
+In po4a each documentation format is handled by a module. For now, we have
+a module for the pod format (in which the Perl documentation is written),
+the good old man pages, the documentation of the kernel compilation
+options and SGML. Some other modules are underway, like for texinfo or XML.
+
+=head1 Table of content
+
+This document is organized as follow:
+
+=over
+
+=item 1 Why should I use po4a? What is it good for?
+
+This introducing chapter explains the motivation of the project and its
+philosophy. You should read it first if you are in the process of evaluating
+po4a for your own translations.
+
+=item 2 How to use po4a?
+
+This chapter is a sort of reference manual, trying to answer the users'
+questions and to give you a better understanding of the whole process. This
+introduces how to do things with po4a and serve as an introduction to the
+documentation of the specific tools.
+
+=over
+
+=item HOWTO begin a new translation?
+
+=item HOWTO change the translation back to a documentation file?
+
+=item HOWTO update a po4a translation?
+
+=item HOWTO convert a pre-existing translation to po4a?
+
+=item HOWTO add extra text to translations (like translator's name)?
+
+=item HOWTO do all this in one program invocation?
+
+=back
+
+ 
+
+=item 3 How does it work?
+
+This chapter gives you a brief overview of the po4a internals, so that you
+may feel more confident to help us maintaining and improving it. It may also
+help you understanding why it does not do what you expected, and how to
+solve your problems.
+
+=item 4 FAQ
+
+This chapter groups the Frequently Asked Questions. In fact, most of the
+questions for now could be formulated that way: "Why is it designed this
+way, and not that one?" If you think po4a isn't the right answer to
+documentation translation, you should consider reading this section. If it
+does not answer your question, please contact us on the
+E<lt>po4a-devel@lists.alioth.debian.orgE<gt> mailing list. We love feedback.
+
+=item 5 Specific notes about modules
+
+This chapter presents the specificities of each module from the translator
+and original author's point of view. Read this to learn the syntax you will
+encounter when translating stuff in this module, or the rules you should
+follow in your original document to make translators' life easier.
+
+Actually, this section is not really part of this document. Instead, it is
+placed in each module's documentation. This helps ensuring that the
+information is up to date by keeping the documentation and the code
+together.
+
+=item 6 Known bugs and feature requests
+
+Quite a few already :(
+
+=back
+
+=head1 Why should I use po4a? What it is good for?
+
+I like the idea of open-source software, making it possible for everybody to
+access to software and to their source code. But being French, I'm well
+aware that the licensing is not the only restriction to the openness of
+software: non-translated free software is useless for non-English
+speakers, and we still have some work to make it available to really
+everybody out there.
+
+The perception of this situation by the open-source actors did dramatically
+improve recently. We, as translators, won the first battle and convinced
+everybody of the translations' importance. But unfortunately, it was the easy
+part. Now, we have to do the job and actually translate all this stuff.
+
+Actually, open-source software themselves benefit of a rather decent
+level of translation, thanks to the wonderful gettext tool suite. It is able
+to extract the strings to translate from the program, present a uniform
+format to translators, and then use the result of their works at run time to
+display translated messages to the user.
+
+But the situation is rather different when it comes to documentation. Too
+often, the translated documentation is not visible enough (not distributed
+as a part of the program), only partial, or not up to date. This last
+situation is by far the worst possible one. Outdated translation can reveal
+worse than no translation at all to the users by describing old program
+behavior which are not in use anymore.
+
+=head2 The problem to solve
+
+Translating documentation is not very difficult in itself. Texts are far
+longer than the messages of the program and thus take longer to be achieved,
+but no technical skill is really needed to do so. The difficult part comes
+when you have to maintain your work. Detecting which parts did change and
+need to be updated is very difficult, error-prone and highly unpleasant. I
+guess that this explains why so much translated documentation out there are
+outdated.
+
+=head2 The po4a answers
+
+So, the whole point of po4a is to make the documentation translation
+I<maintainable>. The idea is to reuse the gettext methodology to this new
+field. Like in gettext, texts are extracted from their original locations in
+order to be presented in a uniform format to the translators. The classical
+gettext tools help them updating their works when a new release of the
+original comes out. But to the difference of the classical gettext model,
+the translations are then re-injected in the structure of the original
+document so that they can be processed and distributed just like the
+English version.
+
+Thanks to this, discovering which parts of the document were changed and need
+an update becomes very easy. Another good point is that the tools will make
+almost all the work when the structure of the original document gets
+fundamentally reorganized and when some chapters are moved around, merged or
+split. By extracting the text to translate from the document structure, it also
+keeps you away from the text formatting complexity and reduces your chances to
+get a broken document (even if it does not completely prevent you to do so).
+
+Please also see the L<FAQ> below in this document for a more complete list
+of the advantages and disadvantages of this approach.
+
+=head2 Supported formats
+
+Currently, this approach has been successfully implemented to several kinds
+of text formatting formats:
+
+=head3 nroff
+
+The good old manual pages' format, used by so much programs out there. The
+po4a support is very welcome here since this format is somewhat difficult to
+use and not really friendly to the newbies.
+The L<Locale::Po4a::Man(3pm)|Man> module also supports the mdoc format,
+used by the BSD man pages (they are also quite common on Linux).
+
+=head3 pod
+
+This is the Perl Online Documentation format. The language and extensions
+themselves are documented that way, as well as most of the existing Perl
+scripts. It makes easy to keep the documentation close to the actual code by
+embedding them both in the same file. It makes programmer life easier, but
+unfortunately, not the translator one.
+
+=head3 sgml
+
+Even if somewhat superseded by XML nowadays, this format is still used
+rather often for documents which are more than a few screens long. It allows
+you to make complete books. Updating the translation of so long documents can
+reveal to be a real nightmare. diff reveals often useless when the original
+text was re-indented after update. Fortunately, po4a can help you in that
+process.
+
+Currently, only the debiandoc and docbook DTD are supported, but adding
+support to a new one is really easy. It is even possible to use po4a on an
+unknown sgml dtd without changing the code by providing the needed
+information on the command line. See L<Locale::Po4a::Sgml(3pm)> for details.
+
+=head3 TeX / LaTeX
+
+The LaTeX format is a major documentation format used in the Free Software
+world and for publications.
+The L<Locale::Po4a::LaTeX(3pm)|LaTeX> module was tested with the Python
+documentation, a book and some presentations.
+
+=head3 texinfo
+
+All the GNU documentation is written in this format (that's even one of
+the requirement to become an official GNU project).  The support for
+L<Locale::Po4a::Texinfo(3pm)|Texinfo> in po4a is still at the beginning.
+Please report bugs and feature requests.
+
+=head3 xml
+
+The XML format is a base format for many documentation formats.
+
+Currently, the docbook DTD is supported by po4a. See
+L<Locale::Po4a::Docbook(3pm)> for details.
+
+=head3 others
+
+Po4a can also handle some more rare or specialized formats, such as the
+documentation of compilation options for the 2.4.x kernels or the diagrams
+produced by the dia tool. Adding a new one is often very easy and the main
+task is to come up with a parser of your target format. See
+L<Locale::Po4a::TransTractor(3pm)> for more information about this.
+
+=head2 Unsupported formats
+
+Unfortunately, po4a still lacks support for several documentation formats.
+
+There is a whole bunch of other formats
+we would like to support in po4a, and not only documentation ones. Indeed,
+we aim at plugging all "market holes" left by the classical gettext tools.
+It encompass package descriptions (deb and rpm),
+package installation scripts questions, package changelogs, and all
+specialized file formats used by the programs such as game scenarios or
+wine resource files.
+
+=head1 How to use po4a?
+
+This chapter is a sort of reference manual, trying to answer the users'
+questions and to give you a better understanding of the whole process. This
+introduces how to do things with po4a and serve as an introduction to the
+documentation of the specific tools.
+
+=head2 Graphical overview
+
+The following schema gives an overview of the process of translating
+documentation using po4a. Do not be afraid by its apparent complexity, it
+comes from the fact that the I<whole> process is represented here. Once you
+converted your project to po4a, only the right part of the graphic is
+relevant. Note that sgml is taken as example here, but the same remains true
+for all modules. Each part of the picture will be detailed in the next
+sections.
+
+  fr.sgml  original.sgml ---->--------+------>----------->-------+
+     |         |                      |                          |
+     V         V           { update of original }                |
+     |         |                      |                          |
+     +--<---<--+                      V                          |
+     |         |              original.new.sgml----->------->----+
+     V         V                      |                          |
+  [po4a-gettextize]      +--->---->---+                          |
+     |         |         |            V                          |
+     |         |         |     [po4a-updatepo]                   |
+     |         V         ^            |                          V
+     V    original.pot   |            V                          |
+     |         |         |          fr.po                        |
+     |         |         |         (fuzzy)                       |
+     |  { translation }  |            |                          |
+     |         |         ^            V                          V
+     |         |         |     {manual editing}                  |
+     V         V         |            |                          |
+     |         |         |            V                          V
+     |         |         +--<---    fr.po       addendum   original.sgml
+     +---->----+---->------->---> (up-to-date) (optional)  (up-to-date) 
+                                      |            |             |
+                                      v            v             v
+                                      +------>-----+------<------+
+                                                   |
+                                                   v
+                                           [po4a-translate]
+                                                   |
+                                                   V
+                                                fr.sgml
+                                             (up-to-date)
+
+
+On the left part, the conversion of a translation not using po4a to this
+system is shown. On the top of the right part, the action of the original
+author is depicted (updating the documentation).  The middle of the right
+part is where the automatic actions of po4a are depicted. The new material
+are extracted, and compared against the exiting translation. Parts which
+didn't change are found, and previous translation is used. Parts which
+where partially modified are also connected to the previous translation, but
+with a specific marker indicating that the translation must be updated. The
+bottom of the figure shows how a formatted document is built.
+
+Actually, as a translator, the only manual operation you have to do is the
+part marked {manual editing}. Yeah, I'm sorry, but po4a helps you translate.
+It does not translate anything for you...
+
+=head2 HOWTO begin a new translation?
+
+This section presents the needed steps required to begin a new translation
+with po4a. The refinements involved in converting an existing project to
+this system are detailed in the relevant section.
+
+To begin a new translation using po4a, you have to do the following steps:
+
+=over 2
+
+=item -
+
+Extract the text which have to be translated from the original document into
+a new pot file (the gettext format). For that, use the I<po4a-gettextize>
+program that way:
+
+  $ po4a-gettextize -f <format> -m <master.doc> -p <translation.pot>
+
+E<lt>formatE<gt> is naturally the format used in the E<lt>master.docE<gt>
+document. As expected, the output goes into E<lt>translation.potE<gt>.
+Please refer to L<po4a-gettextize(1)> for more details about the existing
+options.
+
+=item -
+
+Actually translate what should be translated. For that, you have to rename
+the pot file for example to doc.XX.po (where XX is the ISO639 code of the
+language you are translating to, e.g. "fr" for French), and edit the
+resulting file. It is often a good idea to not name the file XX.po to avoid
+confusion with the translation of the program messages, but this your call.
+Don't forget to update the po file headers, they are important.
+
+The actual translation can be done using the Emacs po mode or kbabel (KDE
+based) or gtranslator (GNOME based), or whichever program you prefer to use
+them. A good ol' vi could do the trick too, even if there is no specialized
+mode for this task.
+
+If you wish to learn more about this, you definitively need to refer to the
+gettext documentation, available in the B<gettext-doc> package.
+
+=back
+
+=head2 HOWTO change the translation back to a documentation file?
+
+Once you're done with the translation, you want to get the translated
+documentation and distribute it to users along with the original one.
+For that, use the L<po4a-translate(1)> program like that (where XX is the
+language code):
+
+  $ po4a-translate -f <format> -m <master.doc> -p <doc.XX.po> -l <XX.doc>
+
+As before, E<lt>formatE<gt> is the format used in the E<lt>master.docE<gt> document. But
+this time, the po file provided with the -p flag is part of the input. This
+is your translation. The output goes into E<lt>XX.docE<gt>.
+
+Please refer to L<po4a-translate(1)> for more details.
+
+=head2 HOWTO update a po4a translation?
+
+To update your translation when the original file has changed, use the
+L<po4a-updatepo(1)> program like that:
+
+  $ po4a-updatepo -f <format> -m <new_original.doc> -p <existing.XX.po>
+
+(Please refer to L<po4a-updatepo(1)> for more details)
+
+Naturally, the new paragraph in the document won't get magically translated
+in the C<po> file with this operation, and you'll need to update the C<po>
+file manually. Likewise, you may have to rework the translation for
+paragraphs which were modified a bit. To make sure you won't miss any of
+them, they are marked as "fuzzy" during the process and you have to remove
+this marker before the translation can be used by po4a-translate.
+As for the initial translation, the best is to use your favorite po editor
+here.
+
+Once your C<po> file is up-to-date again, without any untranslated or fuzzy
+string left, you can generate a translated documentation file, as explained
+in the previous section.
+
+
+=head2 HOWTO convert a pre-existing translation to po4a?
+
+Often, you used to translate manually the document happily until a major
+reorganization of the original document happened. Then, after some
+unpleasant tries with diff or similar tools, you want to convert to po4a.
+But of course, you don't want to loose your existing translation in the
+process. Don't worry, this case is also handled by po4a tools and is called
+gettextization. 
+
+The key here is to have the same structure in the translated document and in
+the original one so that the tools can match the content accordingly.
+
+If you are lucky (i.e., if the structures of both documents perfectly match),
+it will work seamlessly and you will be set in a few seconds. Otherwise, you
+may understand why this process has such an ugly name, and you'd better be
+prepared to some grunt work here. In any case, remember that it is the
+price to pay to get the comfort of po4a afterward. And the good point is
+that you have to do so only once.
+
+I cannot emphasis this too much. In order to ease the process, it is thus
+important that you find the exact version which were used to do the
+translation. The best situation is when you noted down the cvs revision used
+for the translation and you didn't modify it in the translation process, so
+that you can use it. 
+
+It won't work well when you use the updated original text with the old
+translation. It remains possible, but is harder and really should be avoided if
+possible. In fact, I guess that if you fail to find the original text again,
+the best solution is to find someone to do the gettextization for you (but,
+please, not me ;).
+
+Maybe I'm too dramatic here. Even when things go wrong, it remains ways
+faster than translating everything again. I was able to gettextize the
+existing French translation of the Perl documentation in one day, even if
+things B<did> went wrong. That was more than two megabytes of text, and a
+new translation would have lasted months or more. 
+
+Let me explain the basis of the procedure first and I will come back on
+hints to achieve it when the process goes wrong. To ease comprehension, the
+sgml module is taken as an example once again, but the format used doesn't
+really matter.
+
+Once you have the old original again, the gettextization may be as easy as:
+
+ $ po4a-gettextize -f <format> -m <old.original> -l <old.translation> -p <doc.XX.po>
+
+When you're lucky, that's it. You converted your old translation to po4a and
+can begin with the updating task right away. Just follow the procedure
+explained a few section ago to synchronize your po file with the newest
+original document, and update the translation accordingly. 
+
+Please note that even when things seem to work properly, there is still room
+for errors in this process. The point is that po4a is unable to understand
+the text to make sure that the translation match the original. That's why
+all strings are marked as "fuzzy" in the process. You should check each of
+them carefully before removing those markers.
+
+Often the document structures don't match exactly, preventing
+po4a-gettextize from doing its job properly. At that point, the whole game
+is about editing the files to get their damn structures matching. 
+
+It may help to read the section L<Gettextization: how does it work?> below.
+Understanding the internal process will help you to make this work. The good
+point is that po4a-gettextize is rather verbose about what went wrong when
+it happens. First, it pinpoints where in the documents the structures'
+discrepancies are. You will learn the strings that don't match, their positions
+in the text, and the type of each of them. Moreover, the po file generated
+so far will be dumped to gettextization.failed.po. 
+
+=over
+
+=item -
+
+Remove all extra parts of the translations, such as the section in which you
+give the translator name and thank every people who contributed to the
+translation. Addenda, which are described in the next section, will allow
+you to re-add them afterward.
+
+=item -
+
+Do not hesitate to edit both the original and the translation. The most
+important thing is to get the po file. You will be able to update it
+afterward. That being said, editing the translation should be preferred when
+both are possible since it makes things easier when the gettextization is
+done.
+
+=item -
+
+If needed, kill some parts of the original if they happen to not be
+translated. When synchronizing the po with the document afterward, they will
+come back from themselves.
+
+=item -
+
+If you changed the structure a bit (to merge two paragraphs, or split
+another one), undo those changes. If there is issues in the original, you
+should inform the original author. Fixing them in your translation only fix
+it for a part of the community. And moreover, it's impossible when using
+po4a ;)
+
+=item - 
+
+Sometimes, the paragraph content does match, but their types don't. Fixing it
+is rather format-dependant. In pod and nroff, it often comes from the fact
+that one of the two contains a line beginning with a white space where the
+other doesn't. In those formats, such paragraph cannot be wrapped and thus
+become a different type. Just remove the space and you are fine. It may also
+be a typo in the tag name.
+
+Likewise, two paragraphs may get merged together in pod when the separating
+line contains some spaces, or when there is no empty line before the =item
+line and the content of the item.
+
+=item -
+
+Sometimes, there is a desynchronization between the files, and the
+translation is attached to the wrong original paragraph. It is the sign that
+the real problem was before in the files. Check
+gettextization.failed.po to see when the desynchronization begins, and
+fix it there.
+
+=item -
+
+Sometimes, you get the strong feeling that po4a ate some parts of the text,
+either the original or the translation. gettextization.failed.po
+indicates that both of them where gently matching, and then the
+gettextization fails because it tried to match one paragraph with the one
+after (or before) the right one, as if the right one disappeared. Curse po4a
+as I did when it first happened to me. Generously.
+
+This unfortunate situation happens when the same paragraph is repeated over
+the document. In that case, no new entry is created in the po file, but a
+new reference is added to the existing one instead.
+
+So, when the same paragraph appears twice in the original but are not
+translated in the exact same way each time, you will get the feeling that a
+paragraph of the original disappeared. Just kill the new translation. If you
+prefer to kill the first translation instead when it was actually better,
+remove the second one from where it is and put it in place of the first one.
+
+In the contrary, if two similar but different paragraphs were translated in the
+exact same way, you will get the feeling that a paragraph of the translation
+disappeared. A solution is to add a stupid string to the original paragraph
+(such as "I'm different"). Don't be afraid, those things will
+disappear during the synchronization, and when the added text is short enough,
+gettext will match your translation to the existing text (marking it as fuzzy,
+but you don't really care since all strings are fuzzy after gettextization).
+
+=back
+
+Hopefully, those tips will help you making your gettextization work and
+obtain your precious po file. You are now ready to synchronize your file and
+begin your translation. Please note that on large text, it may happen that
+the first synchronization takes a long time. 
+
+For example, the first po4a-updatepo of the Perl documentation's French
+translation (5.5 Mb po file) took about two days full on a 1Ghz G5 computer.
+Yes, 48 hours. But the subsequent ones only take a dozen of seconds on my
+old laptop. This is because the first time, most of the msgid of the po file
+don't match any of the pot file ones. This forces gettext to search for the
+closest one using a costly string proximity algorithm.
+
+=head2 HOWTO add extra text to translations (like translator's name)?
+
+Because of the gettext approach, doing this becomes more difficult in po4a
+than it was when simply editing a new file along the original one. But it
+remains possible, thanks to the so-called B<addenda>.
+
+It may help the comprehension to consider addenda as a sort of patches
+applied to the localized document after processing. They are rather
+different from the usual patches (they have only one line of context, which
+can embed perl regular expression, and they can only add new text without
+removing any), but the functionalities are the same.
+
+Their goal is to allow the translator to add extra content to the document
+which is not translated from the original document. The most common usage is
+to add a section about the translation itself, listing contributors and
+explaining how to report bug against the translation.
+
+Addendum must be provided as a separate file. The first line constitutes a
+header indicating where in the produced document they should be placed. The
+rest of the addendum file will be added verbatim at the determined position of
+the resulting document.
+
+The header have a pretty rigid syntax: It must begin with the string
+"PO4A-HEADER:", followed by a semi-colon (;) separated list of "key=value"
+fields. White spaces ARE important. Note that you cannot use the semi-colon
+char (;) in the value, and that quoting it doesn't help.
+
+Again, it sounds scary, but the examples given below should help you to find
+how to write the header line you need. To illustrate the discussion, assume
+we want to add a section called "About this translation" after the "About
+this document" one.
+
+Here are the possible header keys:
+
+=over 4
+
+=item position (mandatory)
+
+a regexp. The addendum will be placed near the line matching this regexp.
+Note that we're speaking about the translated document here, not the
+original. If more than a line match this expression (or none), the addition
+will fail. It is indeed better to report an error than inserting the
+addendum at the wrong location.
+
+This line is called I<position point> in the following. The point where the
+addendum is added is called I<insertion point>. Those two points are near one
+from another, but not equal. For example, if you want to insert a new section,
+it is easier to put the I<position point> on the title of the preceding section
+and explain po4a where the section ends (remember that I<position point> is
+given by a regexp which should match a unique line).
+
+The localization of the I<insertion point> with regard to the I<position point>
+is controlled by the C<mode>, C<beginboundary> and C<endboundary> fields, as
+explained below.
+
+In our case, we would have:
+
+     position=<title>About this document</title>
+
+
+=item mode (mandatory)
+
+It can be either the string "before" or "after", specifying the position of
+the addendum, relative to the I<position point>.
+
+Since we want the new section to be placed below the one we are matching, we
+have:
+
+     mode=after
+
+=item beginboundary (used only when mode=after, and mandatory in that case)
+
+=item endboundary (idem)
+
+regexp matching the end of the section after which the addendum goes.
+
+When mode=after, the I<insertion point> is after the I<position point>, but
+not directly after! It is placed at the end of the section beginning at the
+I<position point>, ie after or before the line matched by the
+C<???boundary> argument, depending on whether you used C<beginboundary> or
+C<endboundary>.
+
+In our case, we can choose to indicate the end of the section we match by
+adding:
+
+   endboundary=</section>
+
+or to indicate the beginning of the next section by indicating:
+
+   beginboundary=<section>
+
+In both case, our addendum will be placed after the E<lt>/sectionE<gt> and
+before the E<lt>sectionE<gt>. The first one is better since it will work
+even if the document gets reorganized.
+
+Both forms exist because documentation formats are different. In some of
+them, there is a way to mark the end of a section (just like the
+C<E<lt>/sectionE<gt>> we just used), while some other don't explicitly mark
+the end of section (like in nroff). In the former case, you want to make a
+I<boundary> matching the I<end of a section>, so that the I<insertion point>
+comes after it. In the latter case, you want to make a I<boundary> matching
+the I<beginning of next section>, so that the I<insertion point> comes just
+before it. 
+
+=back
+
+This can seem obscure, but hopefully, the next examples will enlighten you.
+
+=over 2
+
+=item 
+To sum up the example we used so far, in order to add a section called
+"About this translation" after the "About this document" one in a sgml
+document, you can use either of those header lines:
+
+ PO4A-HEADER: mode=after; position=About this document; endboundary=</section>
+ PO4A-HEADER: mode=after; position=About this document; beginboundary=<section>
+
+
+=item
+If you want to add something after the following nroff section:
+
+  .SH "AUTHORS"
+
+you should put a C<position> matching this line, and a C<beginboundary>
+matching the beginning of the next section (ie C<^\.SH>). The addendum will
+then be added B<after> the I<position point> and immediately B<before> the
+first line matching the C<beginboundary>. That is to say:
+
+ PO4A-HEADER:mode=after;position=AUTHORS;beginboundary=\.SH
+
+=item
+If you want to add something into a section (like after "Copyright Big Dude")
+instead of adding a whole section, give a C<position> matching this line,
+and give a C<beginboundary> matching any line.
+
+ PO4A-HEADER:mode=after;position=Copyright Big Dude, 2004;beginboundary=^
+
+=item If you want to add something at the end of the document, give a
+C<position> matching any line of your document (but only one line. Po4a
+won't proceed if it's not unique), and give an C<endboundary> matching
+nothing. Don't use simple strings here like "C<EOF>", but prefer which have
+less chance to be in your document.
+
+ PO4A-HEADER:mode=after;position=<title>About</title>;beginboundary=FakePo4aBoundary
+
+=back
+
+In any case, remember that these are regexp. For example, if you want to
+match the end of a nroff section ending with the line 
+
+  .fi
+
+don't use C<.fi> as endboundary, because it will match with "the[ fi]le",
+which is obviously not what you expect. The correct endboundary in that case
+is: C<^\.fi$>.
+
+If the addendum doesn't go where you expected, try to pass the -vv argument to
+the tools, so that they explain you what they do while placing the
+addendum.
+
+=head3 More detailed example
+
+Original document (pod formatted):
+
+ |=head1 NAME
+ |
+ |dummy - a dummy program
+ |
+ |=head1 AUTHOR
+ |
+ |me
+
+Then, the following addendum will ensure that a section (in French) about
+the translator is added at the end of the file. (in French, "TRADUCTEUR"
+means "TRANSLATOR", and "moi" means "me")
+
+ |PO4A-HEADER:mode=after;position=AUTEUR;beginboundary=^=head
+ |
+ |=head1 TRADUCTEUR
+ |
+ |moi
+
+In order to put your addendum before the AUTHOR, use the following header:
+
+ PO4A-HEADER:mode=after;position=NOM;beginboundary=^=head1
+
+This works because the next line matching the beginboundary /^=head1/ after
+the section "NAME" (translated to "NOM" in French), is the one declaring the
+authors. So, the addendum will be put between both sections.
+
+=head2 HOWTO do all this in one program invocation?
+
+The use of po4a proved to be a bit error prone for the users since you have
+to call two different programs in the right order (po4a-updatepo and
+then po4a-translate), each of them needing more than 3 arguments. Moreover,
+it was difficult with this system to use only one po file for all your
+documents when more than one format was used.
+
+The L<po4a(1)> program was designed to solve those difficulties. Once your
+project is converted to the system, you write a simple configuration file
+explaining where your translation files are (po and pot), where the original
+documents are, their formats and where their translations should be placed.
+
+Then, calling po4a(1) on this file ensure that the po files are synchronized
+against the original document, and that the translated document are
+generated properly. Of course, you will want to call this program twice:
+once before editing the po file to update them and once afterward to get
+completely updated translated document. But you only need to remember one
+command line.
+
+=head1 How does it work?
+
+This chapter gives you a brief overview of the po4a internals, so that you
+may feel more confident to help us maintaining and improving it. It may also
+help you understanding why it does not do what you expected, and how to
+solve your problems.
+
+=head2 What's the big picture here?
+
+The po4a architecture is object oriented (in Perl. Isn't that neat?). The
+common ancestor to all parser classes is called TransTractor. This strange
+name comes from the fact that it is at the same time in charge of
+translating document and extracting strings.
+
+More formally, it takes a document to translate plus a po file containing
+the translations to use as input while producing two separate outputs:
+Another po file (resulting of the extraction of translatable strings from
+the input document), and a translated document (with the same structure than
+the input one, but with all translatable strings replaced with content of
+the input po). Here is a graphical representation of this:
+
+   Input document --\                             /---> Output document
+                     \      TransTractor::       /       (translated)
+                      +-->--   parse()  --------+
+                     /                           \
+   Input po --------/                             \---> Output po
+                                                         (extracted)
+
+
+This little bone is the core of all the po4a architecture. If you omit the
+input po and the output document, you get po4a-gettextize. If you provide
+both input and disregard the output po, you get po4a-translate.
+
+TransTractor::parse() is a virtual function implemented by each module. Here
+is a little example to show you how it works. It parses a list of paragraphs,
+each of them beginning with <p>.
+
+  1 sub parse {
+  2   PARAGRAPH: while (1) {
+  3     $my ($paragraph,$pararef,$line,$lref)=("","","","");
+  4     $my $first=1;
+  5     while (($line,$lref)=$document->shiftline() && defined($line)) {
+  6       if ($line =~ m/<p>/ && !$first--; ) {
+  7         $document->unshiftline($line,$lref);
+  8
+  9         $paragraph =~ s/^<p>//s;
+ 10         $document->pushline("<p>".$document->translate($paragraph,$pararef));
+ 11
+ 12         next PARAGRAPH;
+ 13       } else {
+ 14         $paragraph .= $line;
+ 15         $pararef = $lref unless(length($pararef));
+ 16       }
+ 17     }
+ 18     return; # Did not got a defined line? End of input file.
+ 19   }
+ 20 } 
+
+On line 6, we encounter E<lt>pE<gt> for the second time. That's the signal
+of the next paragraph. We should thus put the just obtained line back into
+the original document (line 7) and push the paragraph built so far into the
+outputs. After removing the leading E<lt>pE<gt> of it on line 9, we push the
+concatenation of this tag with the translation of the rest of the paragraph.
+
+This translate() function is very cool. It pushes its argument into the output
+po file (extraction) and returns its translation as found in the input po
+file (translation). Since it's used as part of the argument of pushline(),
+this translation lands into the output document.
+
+Isn't that cool? It is possible to build a complete po4a module in less than
+20 lines when the format is simple enough...
+
+You can learn more about this in
+L<Locale::Po4a::TransTractor(3pm)|Locale::Po4a::TransTractor(3pm)>.
+
+=head2 Gettextization: how does it work?
+
+The idea here is to take the original document and its translation, and to
+say that the Nth extracted string from the translation is the translation
+of the Nth extracted string from the original. In order to work, both files
+must share exactly the same structure. For example, if the files have the
+following structure, it is very unlikely that the 4th string in translation
+(of type 'chapter') is the translation of the 4th string in original (of
+type 'paragraph').
+
+    Original         Translation
+
+  chapter            chapter
+    paragraph          paragraph
+    paragraph          paragraph
+    paragraph        chapter
+  chapter              paragraph
+    paragraph          paragraph
+
+For that, po4a parsers are used on both the original and the translation
+files to extract po files, and then a third po file is built from them
+taking strings from the second as translation of strings from the first. In
+order to check that the strings we put together are actually the
+translations of each other, document parsers in po4a should put information
+about the syntactical type of extracted strings in the document (all existing
+ones do so, yours should also). Then, this information is used to make sure
+that both documents have the same syntax. In the previous example, it would
+allow us to detect that string 4 is a paragraph in one case, and a chapter
+title in another case and to report the problem.
+
+In theory, it would be possible to detect the problem, and resynchronize the
+files afterward (just like diff does). But what we should do of the few
+strings before desynchronizations is not clear, and it would produce bad
+results some times. That's why the current implementation don't try to
+resynchronize anything and verbosely fail when something goes wrong,
+requiring manual modification of files to fix the problem.
+
+Even with these precautions, things can go wrong very easily here. That's
+why all translations guessed this way are marked fuzzy to make sure that
+the translator review and check them.
+
+=head2 Addendum: How does it work?
+
+Well, that's pretty easy here. The translated document is not written
+directly to disk, but kept in memory until all the addenda are applied. The
+algorithms involved here are rather straightforward. We look for a line
+matching the position regexp, and insert the addendum before it if we're in
+mode=before. If not, we search for the next line matching the boundary and
+insert the addendum after this line if it's an C<endboundary> or before this
+line if it's a C<beginboundary>.
+
+=head1 FAQ 
+
+This chapter groups the Frequently Asked Questions. In fact, most of the
+questions for now could be formulated that way: "Why is it designed this
+way, and not that one?" If you think po4a isn't the right answer to
+documentation translation, you should consider reading this section. If it
+does not answer your question, please contact us on the
+E<lt>po4a-devel@lists.alioth.debian.orgE<gt> mailing list. We love feedback.
+
+=head2 Why to translate each paragraph separately?
+
+Yes, in po4a, each paragraph is translated separately (in fact, each
+module decides this, but all existing modules do so, and yours should also).
+There are two main advantages to this approach:
+
+=over 2
+
+=item *
+
+When the technical parts of the document are hidden from the scene, the
+translator can't mess with them. The fewer markers we present to the
+translator the less error he can do.
+
+=item *
+
+Cutting the document helps in isolating the changes to the original
+document. When the original is modified, finding what parts of the
+translation need to be updated is eased by this process.
+
+=back
+
+Even with these advantages, some people don't like the idea of translating
+each paragraph separately. Here are some of the answers I can give to
+their fear:
+
+=over 2
+
+=item *
+
+This approach proved successfully in the KDE project and allows people there
+to produce the biggest corpus of translated and up to date documentation I
+know.
+
+=item *
+
+The translators can still use the context to translate, since the strings in
+the po file are in the same order than in the original document. Translating
+sequentially is thus rather comparable whether you use po4a or not.
+And in any case, the best way to get the context remains to convert the
+document to a printable format since the text formatting ones are not really
+readable, IMHO. 
+
+=item *
+
+This approach is the one used by professional translators. I agree, that
+they have somewhat different goals than open-source translators. The
+maintenance is for example often less critical to them since the content
+changes rarely.
+
+=back
+
+=head2 Why not to split on sentence level (or smaller)?
+
+Professional translator tools sometimes split the document at the sentence
+level in order to maximize the reusability of previous translations and
+speed up their process.  The problem is that the same sentence may have
+several translations, depending on the context.
+
+Paragraphs are by definition longer than sentences. It will hopefully ensure
+that having the same paragraph in two documents will have the same meaning
+(and translation), regardless of the context in each case.
+
+Splitting on smaller parts than the sentence would be B<very bad>. It would
+be a bit long to explain why here, but interested reader can refer to the
+L<Locale::Maketext::TPJ13(3pm)|Locale::Maketext::TPJ13(3pm)> man page
+(which comes with the Perl documentation), for example. To make short, each
+language has its specific syntactic rules, and there is no way to build
+sentences by aggregating parts of sentences working for all existing
+languages (or even for the 5 of the 10 most spoken ones, or even less).
+
+=head2 Why not put the original as comment along with translation (or other way)?
+
+At the first glance, gettext don't seem to be adapted to all kind of
+translations.  For example, it didn't seemed adapted to debconf, the
+interface all Debian packages use for their interaction with the user during
+installation. In that case, the texts to translate were pretty short (a
+dozen of line for each package), and it was difficult to put the translation
+in a specialized file since it has to be available before the package
+installation.
+
+That's why the debconf developer decided to implement another solution,
+where translations are be placed in the same file than the original. This is
+rather appealing. One would even want to do this for xml, for example. It
+would look like that:
+
+ <section>
+  <title lang="en">My title</title>
+  <title lang="fr">Mon titre</title>
+
+  <para>
+   <text lang="en">My text.</text>
+   <text lang="fr">Mon texte.</text>
+  </para>
+ </section>
+
+But it was so problematic that a po-based approach is now used. Only the
+original can be edited in the file, and the translations must take place in
+po files extracted from the master template (and placed back at package
+compilation time). The old system was deprecated because of several issues:
+
+=over
+
+=item * maintenance problems
+
+If several translators provide a patch at the same time, it gets hard to
+merge them together. 
+
+How will you detect changes to the original, which need to be applied to
+the translations? In order to use diff, you have to note which version of
+the original you translated. I.e., you need a po file in your file ;)
+
+=item * encoding problems
+
+This solution is viable when only European languages are involved, but the
+introduction of Korean, Russian and/or Arab really complicate the picture.
+UTF could be a solution, but there are still some problems with it.
+
+Moreover, such problems are hard to detect (i.e., only Korean readers will
+detect that the encoding of Korean is broken [because of the Russian
+translator])
+
+=back
+
+gettext solves all those problems together.
+
+=head2 But gettext wasn't designed for that use!
+
+That's true, but until now nobody came with a better solution. The only
+known alternative is manual translation, will all the maintenance issues.
+
+=head2 What about the other translation tools for documentation using
+gettext?
+
+As far as I know, there are only two of them: 
+
+=over 
+
+=item poxml
+
+This is the tool developed by KDE people to handle DocBook XML. AFAIK, it
+was the first program to extract strings to translate from documentation to
+po files, and inject them back after translation.
+
+It can only handle XML, and only a particular DTD. I'm quite unhappy with
+the handling of lists, which end in one big msgid. When the list become big,
+the chunk becomes harder to shallow.
+
+=item po-debiandoc
+
+This program done by Denis Barbier is a sort of precursor of the po4a sgml
+module, which more or less deprecates it. As the name says, it handles only
+the debiandoc dtd, which is more or less a deprecated dtd.
+
+=back
+
+The main advantages of po4a over them are the ease of extra content addition
+(which is even worse there) and the ability to achieve gettextization.
+
+=head2 Educating developers about translation
+
+When you try to translate documentation or programs, you face three kinds of
+problems; linguistics (not everybody speaks two languages), technical
+(that's why po4a exists) and relational/human. Not all developers understand
+the necessity of translating stuff. Even when good willed, they may ignore how to
+ease the work of translators. To help with that, po4a comes with lot of
+documentation which can be referred to.
+
+Another important point is that each translated file begins with a short
+comment indicating what the file is, how to use it. This should help the
+poor developers flooded with tons of files in different languages they
+hardly speak, and help them dealing correctly with it.
+
+In the po4a project, translated documents are not source files anymore. Since
+sgml files are habitually source files, it's an easy mistake. That's why all
+files present this header:
+
+
+ |       *****************************************************
+ |       *           GENERATED FILE, DO NOT EDIT             * 
+ |       * THIS IS NO SOURCE FILE, BUT RESULT OF COMPILATION *
+ |       *****************************************************
+ |
+ | This file was generated by po4a-translate(1). Do not store it (in cvs,
+ | for example), but store the po file used as source file by po4a-translate. 
+ |
+ | In fact, consider this as a binary, and the po file as a regular source file:
+ | If the po gets lost, keeping this translation up-to-date will be harder ;)
+
+Likewise, gettext's regular po files only need to be copied to the po/
+directory. But B<this is not the case of the ones manipulated by po4a>. The
+major risk here is that a developer erases the existing translation of his
+program with the translation of his documentation. (Both of them can't be
+stored in the same po file, because the program needs to install its
+translation as an mo file while the documentation only uses its translation at
+compile time). That's why the po files produced by the po-debiandoc module
+contain the following header:
+
+ #
+ #  ADVISES TO DEVELOPERS:
+ #    - you do not need to manually edit POT or PO files.
+ #    - this file contains the translation of your debconf templates.
+ #      Do not replace the translation of your program with this !!
+ #        (or your translators will get very upset)
+ #
+ #  ADVISES TO TRANSLATORS:
+ #    If you are not familiar with the PO format, gettext documentation 
+ #     is worth reading, especially sections dedicated to this format.
+ #    For example, run:
+ #         info -n '(gettext)PO Files'
+ #         info -n '(gettext)Header Entry'
+ #
+ #    Some information specific to po-debconf are available at
+ #            /usr/share/doc/po-debconf/README-trans
+ #         or http://www.debian.org/intl/l10n/po-debconf/README-trans
+ #
+
+=head2 SUMMARY of the advantages of the gettext based approach
+
+=over 2
+
+=item *
+
+The translations are not stored along with the original, which makes it
+possible to detect if translations become out of date.
+
+=item *
+
+The translations are stored in separate files from each other, which prevents
+translators of different languages from interfering, both when submitting
+their patch and at the file encoding level.
+
+=item *
+
+It is based internally on C<gettext> (but C<po4a> offers a very simple
+interface so that you don't need to understand the internals to use it).
+That way, we don't have to re-implement the wheel, and because of their
+wide use, we can think that these tools are more or less bug free.
+
+=item *
+
+Nothing changed for the end-user (beside the fact translations will
+hopefully be better maintained :). The resulting documentation file
+distributed is exactly the same.
+
+=item *
+
+No need for translators to learn a new file syntax and their favorite po
+file editor (like emacs' po mode, kbabel or gtranslator) will work just fine.
+
+=item * 
+
+Gettext offers a simple way to get statistics about what is done, what should
+be reviewed and updated, and what is still to do. Some example can be found
+at those addresses:
+
+ - http://kbabel.kde.org/img/previewKonq.png
+ - http://www.debian.org/intl/l10n/
+
+=back
+
+But everything isn't green, and this approach also has some disadvantages
+we have to deal with.
+
+=over 2
+
+=item *
+
+Addenda are... strange at the first glance.
+
+=item *
+
+You can't adapt the translated text to your preferences, like splitting a
+paragraph here, and joining two other ones there. But in some sense, if
+there is an issue with the original, it should be reported as a bug anyway.
+
+=item *
+
+Even with an easy interface, it remains a new tool people have to learn.
+
+One of my dreams would be to integrate somehow po4a to gtranslator or
+kbabel. When an sgml file is opened, the strings are automatically extracted.
+When it's saved a translated sgml file can be written to disk. If we manage
+to do an MS Word (TM) module (or at least RTF) professional translators may
+even use it.
+
+=back
+
+=head1 Known bugs and feature requests
+
+The biggest issue (besides missing modules) is the encoding handling. Adding
+a UTF8 perl pragma and then recoding the strings on output is the way to go,
+but it's not done yet.
+
+We would also like to factorise some code (about file insertion) of the sgml
+module back into the TransTractor so that all modules can benefit from this,
+but this is not user visible.
+
+=head1 AUTHORS
+
+ Denis Barbier <barbier,linuxfr.org>
+ Martin Quinson (mquinson#debian.org)
+
+=cut
+
+LocalWords:  po gettext sgml xml texinfo perl gettextize fr kbabel KDE updatepo
+LocalWords:  gtranslator gettextization cvs regexp boundary
+LocalWords:  lang TransTractor debconf diff poxml debiandoc LocalWords
+LocalWords: Denis barbier linuxfr org Quinson 

Added: po4a/extension/Build.PL
===================================================================
--- po4a/extension/Build.PL	                        (rev 0)
+++ po4a/extension/Build.PL	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+
+use Module::Build;
+use strict;
+use warnings;
+
+#my $builder = Module::Build->subclass
+#(
+#    code => q{
+#        sub ACTION_test {
+#            system("cd .. && PERL5LIB=\$(pwd)/extension/blib/arch:\$(pwd)/lib ./Build test verbose=1");
+#        }
+#    },
+#);
+
+#$builder->new
+my $builder = Module::Build->new
+  (
+    module_name       => 'po4ac',
+    dist_version_from => '../lib/Locale/Po4a/TransTractor.pm', # finds $VERSION
+    license           => 'gpl',
+    dist_abstract     => 'Tools for helping translation of documentation',
+    dist_author       => ['Nicolas Fran$B%F%!(Bois <nicolas.francois@xxxxxxxxxxxxxxx'],
+#    test_files        => '../t',
+    extra_linker_flags => '-lgettextpo -lgettextsrc'
+  )->create_build_script;

Added: po4a/extension/lib/Locale/Po4a/Man.xs
===================================================================
--- po4a/extension/lib/Locale/Po4a/Man.xs	                        (rev 0)
+++ po4a/extension/lib/Locale/Po4a/Man.xs	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,293 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+//#include "ppport.h"
+
+//#include "const-c.inc"
+
+
+static char *current_font = NULL;
+static char *previous_font = NULL;
+static char *regular_font = NULL;
+void set_font(char *font)
+{
+//    fprintf(stderr, "   set_font(%s)\n", font);
+    char *saved_previous;
+    if (current_font == NULL)
+        current_font = strdup("R");
+    if (previous_font == NULL)
+        previous_font = strdup("R");
+    saved_previous = previous_font;
+    previous_font = strdup(current_font);
+
+    if (font[0] == '\0')
+    {
+        free(current_font);
+        current_font = strdup("R");
+    }
+    else if (0 == strcmp(font, "P") ||
+             0 == strcmp(font, "[]") ||
+             0 == strcmp(font, "[P]"))
+    {
+        free(current_font);
+        current_font = strdup(saved_previous);
+    }
+    else if (strlen(font) == 1)
+    {
+        free(current_font);
+        current_font = strdup(font);
+    }
+    else if (strlen(font) == 2)
+    {
+        free(current_font);
+        current_font = malloc(4);
+        current_font[0] = '(';
+        current_font[1] = font[0];
+        current_font[2] = font[1];
+        current_font[3] = '\0';
+    }
+    else
+    {
+        fprintf(stderr, "not implemented");
+    }
+//        fprintf(stderr, "my set_font => r:'%s', p:'%s', c:'%s'\n", regular_font, previous_font, current_font);
+    free(saved_previous);
+//    fprintf(stderr, "   end set_font()\n");
+}
+void set_regular(char *font)
+{
+//    fprintf(stderr, "   set_regular(%s)\n", font);
+    set_font(font);
+    free(regular_font);
+    regular_font = strdup(current_font);
+//    fprintf(stderr, "   end set_regular()\n");
+}
+
+char *do_fonts(char *string, char *ref)
+{
+//    fprintf(stderr, "do_fonts(%s)\n", string);
+    char *tmp;
+    char *pc = string;
+    char *pc_tmp;
+    char previous[10];
+    char current[10];
+    char new[10];
+    char last[10];
+    if (current_font == NULL)
+        current_font = strdup("R");
+    if (previous_font == NULL)
+        previous_font = strdup("R");
+    if (regular_font == NULL)
+        regular_font = strdup("R");
+    last[0] = '\0';
+    Newx(tmp, strlen(string)*2, char);
+    pc_tmp = tmp;
+    strcpy(previous, previous_font);
+    strcpy(current, current_font);
+    if (strcmp(regular_font, current_font) != 0)
+        strcpy(new, current_font);
+    else
+        new[0] = '\0';
+
+    while (*pc != '\0')
+    {
+        if (pc[0] == 'E' && pc[1] == '<' && pc[2] == '.')
+        {
+            if (new[0] != '\0')
+            {
+                char *pc_new = new;
+                while (*pc_new != '\0')
+                    *pc_tmp++ = *pc_new++;
+                *pc_tmp++ = '<';
+                new[0] = '\0';
+            }
+
+            pc_tmp[0] = pc[0];
+            pc_tmp[1] = pc[1];
+            pc_tmp[2] = pc[2];
+            pc_tmp+=3;
+            pc+=3;
+
+            int count = 0;
+            while (*pc !='>' || count != 0)
+            {
+                if (*pc == '<')
+                    count++;
+                if (*pc == '>')
+                    count--;
+                *pc_tmp++ = *pc++;
+            }
+        }
+        else if (pc[0] == '\\' && pc[1] == 'f')
+        {
+            /* We found a font modifier */
+            char f[10];
+            pc += 2;
+
+            /* Extract the font */
+            if (*pc == '[')
+            {
+                char *pc_f = f;
+                pc++;
+                while(*pc != ']' && (pc_f - f < 10))
+                    *pc_f++ = *pc++;
+                if (*pc != ']')
+                    die("font too long: '%s%s'\n", f, pc);
+                pc++;
+                *pc_f = '\0';
+            }
+            else if (*pc == '(')
+            {
+                pc++;
+                f[0] = *pc++;
+                f[1] = *pc++;
+                f[2] = '\0';
+            }
+            else
+            {
+                f[0] = *pc++;
+                f[1] = '\0';
+            }
+//            fprintf(stderr, "found font: '%s'\n", f);
+
+            /* Canonize the font */
+            if (f[1] == '\0')
+            {
+                if (f[0] == '\0' || f[0] == 'P')
+                {
+                    strcpy(f,previous);
+                }
+                else if (f[0] == '1')
+                    f[0] = 'R';
+                else if (f[0] == '2')
+                    f[0] = 'I';
+                else if (f[0] == '3')
+                    f[0] = 'B';
+                else if (f[0] == '3')
+                {
+                    f[0] = 'B';
+                    f[1] = 'I';
+                    f[2] = '\0';
+                }
+            }
+
+//            fprintf(stderr, "found font: '%s'\n", f);
+            /*
+            if ((pc[0] == 'P' && pc++) ||
+                (pc[0] == '[' && pc[1] == ']' && (pc = pc + 2)) ||
+                (pc[0] == '[' && pc[1] == 'P' && pc[2] == ']' && (pc = pc +3)))
+            {
+                if (0 == strcmp(previous, regular_font))
+                {
+                    strcpy(previous, current);
+                    new[0] = '>';
+                    new[1] = '\0';
+                    strcpy(current, regular_font);
+                }
+                else
+                {
+                    strcpy(new, previous);
+                    strcpy(previous, current);
+                    strcpy(current, new);
+                }
+            }
+            else */
+
+            if (0 == strcmp(f, regular_font))
+            {
+//                printf("     regular\n");
+                strcpy(previous, current);
+//                if (0 != strcmp(current, regular_font))
+//                {
+                    new[0] = '>';
+                    new[1] = '\0';
+                    strcpy(current, regular_font);
+//                }
+            }
+            else// if (pc[1] pc[0] == 'B' || pc[0] == 'I' || pc[0] == 'R')
+            {
+                strcpy(previous, current);
+                strcpy(current, f);
+                strcpy(new, current);
+            }/*
+            else
+            {
+                fprintf(stderr, "unrecognized font: '%s'\n", pc);
+            }*/
+        }
+        else
+        {
+//            printf("%p %p\n", pc_tmp, pc);
+            if (new[0] != '\0')
+            {
+                char *pc_new = new;
+                if (strcmp(new, last) != 0 && last[0] != '\0')
+                    *pc_tmp++ = '>';
+                if (new[0] != '>')
+                {
+                    if (strcmp(new, last) != 0)
+                    {
+                    while (*pc_new != '\0')
+                        *pc_tmp++ = *pc_new++;
+                    *pc_tmp++ = '<';
+                    strcpy(last, new);
+                    }
+                }
+                else
+                    last[0] = '\0';
+                new[0] = '\0';
+            }
+
+            *pc_tmp++ = *pc++;
+        }
+    }
+    if (last[0] != '\0')
+    {
+        if (pc_tmp[-1] == '\n')
+        {
+            if (pc_tmp[-2] == '<')
+            {
+                if (pc_tmp[-3] == 'B' || pc_tmp[-3] == 'I' || pc_tmp[-3] == 'R')
+                {
+                    pc_tmp -=3;
+                }
+                else if (pc_tmp[-3] == 'W' && pc_tmp[-4] == 'C')
+                {
+                    pc_tmp -=4;
+                }
+                else
+                {
+                    pc_tmp[-1] = '>';
+                }
+            }
+            else
+            {
+                pc_tmp[-1] = '>';
+            }
+            *pc_tmp++ = '\n';
+        }
+        else
+            *pc_tmp++ = '>';
+    }
+    *pc_tmp = '\0';
+    strcpy(previous_font, previous);
+    strcpy(current_font, current);
+//    fprintf(stderr, "end do_fonts: '%s'\n", tmp);
+    return tmp;
+}
+
+MODULE = Locale::Po4a::Man		PACKAGE = Locale::Po4a::Man		
+
+char *
+do_fonts(string, ref)
+	char *		string
+	char *		ref
+
+void set_regular(font)
+	char *		font
+
+void set_font(font)
+	char *		font
+
+

Added: po4a/extension/lib/Locale/Po4a/Po.h
===================================================================
--- po4a/extension/lib/Locale/Po4a/Po.h	                        (rev 0)
+++ po4a/extension/lib/Locale/Po4a/Po.h	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,28 @@
+#ifndef _PO_H
+#define _PO_H
+
+#include <gettext-po.h>
+#include "message.h"
+
+extern void textmode_xerror (int severity,
+                             po_message_t message,
+                             const char *filename, size_t lineno, size_t column,                             int multiline_p, const char *message_text);
+extern void textmode_xerror2 (int severity,
+                              po_message_t message1,
+                              const char *filename1, size_t lineno1, size_t column1,
+                              int multiline_p1, const char *message_text1,
+                              po_message_t message2,
+                              const char *filename2, size_t lineno2, size_t column2,
+                              int multiline_p2, const char *message_text2);
+struct po_xerror_handler default_xerror_handler={textmode_xerror,
+                                                 textmode_xerror2};
+
+struct Po {
+//    po_file_t po_file;
+    message_list_ty *mlp;
+};
+
+typedef struct Po Locale__Po4a__Po;
+typedef struct Po * Locale_Po4a_Po;
+
+#endif

Added: po4a/extension/lib/Locale/Po4a/Po.xs
===================================================================
--- po4a/extension/lib/Locale/Po4a/Po.xs	                        (rev 0)
+++ po4a/extension/lib/Locale/Po4a/Po.xs	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,500 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+//#include "ppport.h"
+
+//#include "const-c.inc"
+
+#include "Po.h"
+
+Locale_Po4a_Po Po_new(char *class)
+{
+    struct Po *ret;
+    printf("Locale::Po4a::Po::new()\n");
+
+    ret = (struct Po *)safemalloc(sizeof(struct Po));
+//    ret->po_file = NULL;
+    ret->mlp = NULL;
+
+    return ret;
+}
+
+void Po_DESTROY(Locale_Po4a_Po self)
+{
+    printf("Locale::Po4a::Po::DESTROY\n");
+//    if (NULL != self->po_file)
+//        po_file_free(self->po_file);
+    if (NULL != self->mlp)
+        message_list_free(self->mlp, 0);
+    safefree(self);
+}
+
+void Po_read(Locale_Po4a_Po self, char *filename)
+{
+    printf("Locale::Po4a::Po::read(%s)\n", filename);
+//    self->po_file = po_file_read(filename, &default_xerror_handler);
+    po_file_t po_file = po_file_read(filename, &default_xerror_handler);
+    self->mlp = message_list_alloc (true);
+#if 0
+    FILE * fp = fopen(filename, "r");
+    extract_po(fp,
+               filename, /* real file name */
+               filename, /* logical file name */
+               NULL,     /* not applicable for PO files */
+               self->mdlp);
+    if (fp != stdin)
+        fclose (fp);
+#endif
+    if (po_file == NULL)
+        croak("Can't open the PO file %s", filename);
+    else
+    {
+        po_message_iterator_t iterator = po_message_iterator (po_file, NULL);
+        for (;;)
+        {
+            po_message_t message = po_next_message (iterator);
+            if (message == NULL)
+                break;
+            else
+                message_list_append (self->mlp, (message_ty *)message);
+        }
+        po_message_iterator_free (iterator);
+    }
+// No free, otherwise, the messages are freed.
+//    po_file_free (po_file);
+}
+
+int debug(char *key, int klen)
+{
+    int ret = 0;
+
+    HV* debug = get_hv("debug", FALSE);
+    if (NULL != debug)
+    {
+        SV **svp = hv_fetch(debug, key, klen, FALSE);
+        if (NULL != svp)
+        {
+            SV *sv = *svp;
+            if (0 != SvIV(sv))
+                ret = 1;
+        }
+    }
+
+    return ret;
+}
+
+#define KEY(x) x, sizeof(x)-1
+
+char *Po_escape_text(char *text)
+{
+    char *pc = text;
+    unsigned int len = 0;
+//    int need_escape = 0;
+    char *ret;
+    char *pc_ret;
+    int debug_escape = debug(KEY("escape"));
+    if (debug_escape)
+        fprintf(stderr, "\nescape [%s]====", text);
+    while (*pc != '\0')
+    {
+        switch (*pc)
+        {
+            case '\\':
+            case '\"':
+            case '\n':
+            case '\t':
+                len += 2;
+//                need_escape = 1;
+                break;
+            default:
+                len++;
+        }
+        pc++;
+    }
+//    if (0 == need_escape)
+//        return text;
+
+    Newx(ret, len+1, char);
+    pc_ret = ret;
+    pc = text;
+    while (*pc != '\0')
+    {
+        switch (*pc)
+        {
+            case '\\':
+                *pc_ret++ = '\\';
+                *pc_ret++ = '\\';
+                break;
+            case '"':
+                *pc_ret++ = '\\';
+                *pc_ret++ = '"';
+                break;
+            case '\n':
+                *pc_ret++ = '\\';
+                *pc_ret++ = 'n';
+                break;
+            case '\t':
+                *pc_ret++ = '\\';
+                *pc_ret++ = 't';
+                break;
+            default:
+                *pc_ret++ = *pc;
+        }
+        pc++;
+    }
+    *pc_ret = '\0';
+    if (debug_escape)
+        fprintf(stderr, ">%s<\n", ret);
+    return ret;
+}
+
+char *Po_unescape_text(char *text)
+{
+    char *ret;
+    char *pc = text;
+    char *pc_ret;
+    int debug_escape = debug(KEY("escape"));
+    if (debug_escape)
+        fprintf(stderr, "\nunescape [%s]====", text);
+    Newx(ret, strlen(text)+1, char);
+    pc_ret = ret;
+    while (*pc != '\0')
+    {
+        if (*pc != '\\')
+            *pc_ret++ = *pc++;
+        else if (*pc == '\n')
+            continue;
+        else switch (pc[1])
+        {
+            case '\0':
+                *pc_ret++ = *++pc;
+                break;
+            case 'n':
+                *pc_ret++ = '\n';
+                pc += 2;
+                break;
+            case 't':
+                *pc_ret++ = '\t';
+                pc += 2;
+                break;
+            case '"':
+                *pc_ret++ = '"';
+                pc += 2;
+                break;
+            case '\\':
+                *pc_ret++ = '\\';
+                pc += 2;
+                break;
+            default:
+                printf("unescape sequence ?: '%c'\n", pc[1]);
+        }
+    }
+    *pc_ret = '\0';
+
+    if (debug_escape)
+        fprintf(stderr, ">%s<\n", ret);
+    return ret;
+}
+
+char *Po_unquote_text(char *text)
+{
+    char *ret;
+    char *pc = text;
+    char *pc_ret;
+    int debug_quote = debug(KEY("quote"));
+    if (debug_quote)
+        fprintf(stderr, "\nunquote [%s]====\n", text);
+    Newx(ret, strlen(text)+1, char);
+    pc_ret = ret;
+    if (pc[0] == '"' && pc[1] == '"' && pc[2] == '\n')
+	pc += 3;
+    if (pc[0] == '"')
+	pc++;
+    while (*pc != '\0')
+    {
+	if (pc[0] == '"' && pc[1] == '\0')
+	    pc++;
+	else if (pc[0] == '"' && pc[1] == '\n' && pc[2] == '"')
+	    pc += 3;
+	else if (pc[0] == '\\' && pc[1] == 'n' && pc[2] == '\n')
+	{
+	    *pc_ret++ = '\\';
+	    *pc_ret++ = 'n';
+	    pc += 3;
+	}
+	else
+	{
+	    *pc_ret++ = *pc++;
+	}
+    }
+    *pc_ret = '\0';
+
+    if (debug_quote)
+        fprintf(stderr, ">%s<\n", ret);
+    return ret;
+}
+
+char *Po_canonize(char *text)
+{
+    char *ret;
+    char *pc = text;
+    char *pc_ret;
+    int len = strlen(text)+1;
+    int debug_canonize = debug(KEY("canonize"));
+    if (debug_canonize)
+        fprintf(stderr, "\ncanonize [%s]====\n", text);
+while(*pc != '\0')
+{
+    if (*pc == '.' || *pc == '(')
+        len++;
+    pc++;
+}
+pc = text;
+Newx(ret, len, char);
+pc_ret = ret;
+    while (*pc == ' ')
+        pc++;
+/*
+    if (*pc == '\t')
+    {
+        *pc_ret++ = ' ';
+        *pc_ret++ = ' ';
+        while (*pc == ' ' || *pc == '\t')
+            pc++;
+    }
+*/
+    while (*pc != '\0')
+    {
+        if (pc_ret != ret)
+        {
+            /* already one char in ret */
+            if (pc[0] == '\n')
+            {
+                if (pc_ret[-1] == ')' || pc_ret[-1] == '.')
+                {
+                    *pc_ret++ = ' ';
+                    *pc_ret++ = ' ';
+                }
+                else if (pc_ret[-1] != ' ' || pc_ret[-2] == ')' || pc_ret[-2] == '.')
+                {
+                    *pc_ret++ = ' ';
+                }
+                pc++;
+            }
+            else if (pc[0] == ' '/* || pc[0] == '\t'*/)
+            {
+                if (pc_ret[-1] == ' ')
+                {
+                    if (pc_ret >= ret+2 && (pc_ret[-2] == ')' || pc_ret[-2] == '.'))
+                    {
+                        *pc_ret++ = ' ';
+                    }
+                }
+                else
+                {
+                    *pc_ret++ = ' ';
+                }
+                pc++;
+            }
+            else
+                *pc_ret++ = *pc++;
+        }
+        else
+            *pc_ret++ = *pc++;
+    }
+
+    do
+    {
+        *pc_ret-- = '\0';
+    }
+    while (*pc_ret == ' ');
+
+    if (debug_canonize)
+        fprintf(stderr, ">%s<\n", ret);
+    return ret;
+}
+
+/*
+char *quote_text(char *text)
+{
+    char *ret;
+    int debug_escape = debug(KEY("escape"));
+    if (debug_escape)
+        fprintf(stderr, "\nquote [%s]====", text);
+
+    if (debug_escape)
+        fprintf(stderr, ">%s<\n", ret);
+    return ret;
+}
+*/
+char *Po_get_charset(SV* self)
+{
+    char *ret;
+    char *header;
+    STRLEN headerlen;
+    SV* self_sv;
+    SV** psv;
+    SV* string;
+    STRLEN header_len;
+    if(!SvOK(self) || !SvROK(self)) goto error;
+    self_sv = SvRV(self);
+    if(SvTYPE(self_sv) != SVt_PVHV) goto error;
+    psv = hv_fetch((HV *)self_sv, "header", 6, 0);
+    if(psv == NULL) goto error;
+    string = *psv;
+//fprintf(stderr, "get_charset3 %p %s\n", string, SvPV_nolen(string));
+    if(!SvPOK(string)) goto error;
+//fprintf(stderr, "get_charset4\n");
+    header = SvPV(string, headerlen);
+    char *charset = strstr(header, "charset=");
+    if (NULL == charset)
+    {
+        fprintf(stderr, "no charset found\n");
+        ret = strdup("");
+    }
+    else
+    {
+        charset += 8; /* remove "charset=" */
+        char *pc = charset;
+        while (   pc < header + headerlen
+               && *pc != ' '
+               && *pc != '\t'
+               && *pc != '\n'
+               && *pc != '\\')
+        {
+            pc++;
+        }
+        Newx(ret, pc - charset+1, char);
+        memcpy(ret, charset, pc - charset);
+        ret[pc - charset] = '\0';
+    }
+
+
+    return ret;
+error:
+    croak("can't extract charset.");
+}
+
+/*
+self new(this, options)
+char *timezone()
+initialize(self,options)
+read(self, filename)
+write(self, filename)
+write_if_needed(self, filename)
+move_po_if_needed(new_po, old_po, backup)
+gettextize(this, class)
+filter(self, filter)
+to_utf8(self)
+gettext(self, text, options)
+stats_get(self)
+stats_clear(self)
+push(self, entry)
+push_raw(self, entry)
+int count_enties(self)
+int count_entries_doc(self)
+char *msgid(self, num)
+char *msgid_doc(self, num)
+set_charset(self, charset)
+char *quote_text(string)
+char *wrap(text)
+char *format_comment(comment, c)
+*/
+MODULE = Locale::Po4a::Po		PACKAGE = Locale::Po4a::Po		PREFIX = Po_
+
+char *
+Po_escape_text(text)
+	char *		text
+
+char *
+Po_unescape_text(text)
+	char *		text
+
+char *
+Po_get_charset(self)
+	SV *		self
+
+char *
+Po_unquote_text(text)
+	char *		text
+
+char *
+Po_canonize(text)
+	char *		text
+
+Locale_Po4a_Po
+Po_new(class)
+	char *		class
+
+void
+Po_DESTROY(self)
+	Locale_Po4a_Po	self
+
+void 
+Po_read(self, filename)
+	Locale_Po4a_Po	self
+	char *		filename
+
+void
+Po_push(self, ...)
+	Locale_Po4a_Po	self
+CODE:
+    char *msgid     = NULL;
+    char *msgstr    = NULL;
+    char *reference = NULL;
+    char *comment   = NULL;
+    char *automatic = NULL;
+    char *flags     = NULL;
+    char *type      = NULL;
+    int i = items;
+
+    printf("Locale::Po4a::Po::push()\n");
+
+    if ((items % 2) == 0)
+        croak("Usage: Locale::Po4a::Po::push(self, k => v, ...)\n");
+
+    for (i=1; i<items; i+=2)
+    {
+        char *key = SvPV_nolen(ST(i));
+        if (strEQ(key, "msgid"))
+            msgid     = SvPV_nolen(ST(i+1));
+        else if (strEQ(key, "msgstr"))
+            msgstr    = SvPV_nolen(ST(i+1));
+        else if (strEQ(key, "reference"))
+            reference = SvPV_nolen(ST(i+1));
+        else if (strEQ(key, "comment"))
+            comment   = SvPV_nolen(ST(i+1));
+        else if (strEQ(key, "automatic"))
+            automatic = SvPV_nolen(ST(i+1));
+        else if (strEQ(key, "flags"))
+            flags     = SvPV_nolen(ST(i+1));
+        else if (strEQ(key, "type"))
+            type      = SvPV_nolen(ST(i+1));
+        else
+            croak("Unknown key found in Locale::Po4a::Po::push: %s\n",
+                  SvPV_nolen(ST(i)));
+    }
+    /* message_list_search, message_list_append, message_alloc */
+
+    message_ty *mp1 = message_list_search(self->mlp, NULL, msgid);
+    printf("push search: %p\n", mp1);
+    lex_pos_ty pos = { "file", 0 /*line*/};
+    message_ty *mp2 = message_alloc(NULL, /* msgctxt */
+                                   msgid,
+                                   NULL, /* No plural */
+                                   msgstr,
+                                   strlen (msgstr) + 1,
+                                   &pos);
+
+    if (NULL == mp1)
+    {
+        message_list_append(self->mlp, mp2);
+    }
+    else
+    {
+        if (!strEQ(msgstr, mp1->msgstr))
+            printf("duplicate: msgid: \"%s\", msgstr: \"%s\"/\"%s\"\n",
+                   msgid, msgstr, mp1->msgstr);
+    }
+

Added: po4a/extension/lib/Locale/Po4a/TransTractor.xs
===================================================================
--- po4a/extension/lib/Locale/Po4a/TransTractor.xs	                        (rev 0)
+++ po4a/extension/lib/Locale/Po4a/TransTractor.xs	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,85 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+//#include "ppport.h"
+
+//#include "const-c.inc"
+
+char *TransTractor_write(SV* self, char *filename)
+{
+    FILE *out = NULL;
+
+    if (NULL == filename)
+        croak("Can't write to a file without filename");
+
+    if (0 == strcmp(filename, "-"))
+    {
+        out = stdout;
+    }
+    else
+    {
+        int count;
+        I32 i = 0;
+        dSP;
+        ENTER;
+
+        out = fopen(filename, "w");
+        if (NULL == out)
+        {
+            perror("fopen");
+            croak("Can't create %s.\n", filename);
+        }
+
+        PUSHMARK(SP);
+        XPUSHs(self);
+        PUTBACK;
+        count = call_method("docheader", G_ARRAY);
+
+        SPAGAIN;
+
+        for (i=0; i< count; i++)
+        {
+            fputs(POPp, out);
+        }
+
+        HV *hv = SvRV(self);
+//        if (hv_exists(hv, "TT", 2))
+//        {
+            SV **psv = hv_fetch(hv, "TT", 2,0);
+            if (NULL != psv)
+            {
+                SV *sv = *psv;
+//                if (hv_exists(SvRV(sv), "doc_out", 7))
+//                {
+                    psv = hv_fetch(SvRV(sv), "doc_out", 7, 0);
+                    sv = *psv;
+                    AV *av = SvRV(sv);
+                    for (i = 0; i < av_len(av); i++)
+                    {
+                        fputs(SvRV(*av_fetch(av, i, 0)), out);
+                    }
+//                }
+//                else
+//                {
+//                    croak("No doc_out.\n");
+//                }
+            }
+//        }
+//        else
+//        {
+//            croak("No TT.\n");
+//        }
+
+fclose(out);
+        PUTBACK;
+        LEAVE;
+    }
+}
+
+MODULE = Locale::Po4a::TransTractor	PACKAGE = Locale::Po4a::TransTractor	PREFIX = TransTractor_
+
+void TransTractor_write(self, filename)
+	SV *		self
+	char *		filename
+

Added: po4a/extension/lib/Locale/Po4a/hash.h
===================================================================
--- po4a/extension/lib/Locale/Po4a/hash.h	                        (rev 0)
+++ po4a/extension/lib/Locale/Po4a/hash.h	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,92 @@
+/* Copyright (C) 1995, 2000-2003, 2005-2006 Free Software Foundation, Inc.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, write to the Free Software Foundation, Inc., 51 Franklin Street,
+   Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef _HASH_H
+#define _HASH_H
+
+#include "obstack.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct hash_entry;
+
+typedef struct hash_table
+{
+  unsigned long int size;   /* Number of allocated entries.  */
+  unsigned long int filled; /* Number of used entries.  */
+  struct hash_entry *first; /* Pointer to head of list of entries.  */
+  struct hash_entry *table; /* Pointer to array of entries.  */
+  struct obstack mem_pool;  /* Memory pool holding the keys.  */
+}
+hash_table;
+
+/* Initialize a hash table.  INIT_SIZE > 1 is the initial number of available
+   entries.
+   Return 0 upon successful completion, -1 upon memory allocation error.  */
+extern int hash_init (hash_table *htab, unsigned long int init_size);
+
+/* Delete a hash table's contents.
+   Return 0 always.  */
+extern int hash_destroy (hash_table *htab);
+
+/* Look up the value of a key in the given table.
+   If found, return 0 and set *RESULT to it.  Otherwise return -1.  */
+extern int hash_find_entry (hash_table *htab,
+			    const void *key, size_t keylen,
+			    void **result);
+
+/* Try to insert the pair (KEY[0..KEYLEN-1], DATA) in the hash table.
+   Return non-NULL (more precisely, the address of the KEY inside the table's
+   memory pool) if successful, or NULL if there is already an entry with the
+   given key.  */
+extern const void * hash_insert_entry (hash_table *htab,
+				       const void *key, size_t keylen,
+				       void *data);
+
+/* Insert the pair (KEY[0..KEYLEN-1], DATA) in the hash table.
+   Return 0.  */
+extern int hash_set_value (hash_table *htab,
+			   const void *key, size_t keylen,
+			   void *data);
+
+/* Steps *PTR forward to the next used entry in the given hash table.  *PTR
+   should be initially set to NULL.  Store information about the next entry
+   in *KEY, *KEYLEN, *DATA.
+   Return 0 normally, -1 when the whole hash table has been traversed.  */
+extern int hash_iterate (hash_table *htab, void **ptr,
+			 const void **key, size_t *keylen,
+			 void **data);
+
+/* Steps *PTR forward to the next used entry in the given hash table.  *PTR
+   should be initially set to NULL.  Store information about the next entry
+   in *KEY, *KEYLEN, *DATAP.  *DATAP is set to point to the storage of the
+   value; modifying **DATAP will modify the value of the entry.
+   Return 0 normally, -1 when the whole hash table has been traversed.  */
+extern int hash_iterate_modify (hash_table *htab, void **ptr,
+				const void **key, size_t *keylen,
+				void ***datap);
+
+/* Given SEED > 1, return the smallest odd prime number >= SEED.  */
+extern unsigned long int next_prime (unsigned long int seed);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* not _HASH_H */

Added: po4a/extension/lib/Locale/Po4a/message.h
===================================================================
--- po4a/extension/lib/Locale/Po4a/message.h	                        (rev 0)
+++ po4a/extension/lib/Locale/Po4a/message.h	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,325 @@
+/* GNU gettext - internationalization aids
+   Copyright (C) 1995-1998, 2000-2006 Free Software Foundation, Inc.
+
+   This file was written by Peter Miller <millerp@xxxxxxxxxxxxxxxx>
+
+   This program 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, or (at your option)
+   any later version.
+
+   This program 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 program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef _MESSAGE_H
+#define _MESSAGE_H
+
+#include "str-list.h"
+#include "pos.h"
+#include "hash.h"
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* According to Sun's Uniforum proposal the default message domain is
+   named 'messages'.  */
+#define MESSAGE_DOMAIN_DEFAULT "messages"
+
+
+/* Separator between msgctxt and msgid in .mo files.  */
+#define MSGCTXT_SEPARATOR '\004'  /* EOT */
+
+
+/* Kinds of format strings.  */
+enum format_type
+{
+  format_c,
+  format_objc,
+  format_sh,
+  format_python,
+  format_lisp,
+  format_elisp,
+  format_librep,
+  format_scheme,
+  format_smalltalk,
+  format_java,
+  format_csharp,
+  format_awk,
+  format_pascal,
+  format_ycp,
+  format_tcl,
+  format_perl,
+  format_perl_brace,
+  format_php,
+  format_gcc_internal,
+  format_qt,
+  format_boost
+};
+#define NFORMATS 21	/* Number of format_type enum values.  */
+//extern DLL_VARIABLE const char *const format_language[NFORMATS];
+//extern DLL_VARIABLE const char *const format_language_pretty[NFORMATS];
+extern const char *const format_language[NFORMATS];
+extern const char *const format_language_pretty[NFORMATS];
+
+/* Is current msgid a format string?  */
+enum is_format
+{
+  undecided,
+  yes,
+  no,
+  yes_according_to_context,
+  possible,
+  impossible
+};
+
+extern bool
+       possible_format_p (enum is_format);
+
+
+/* Is current msgid wrappable?  */
+#if 0
+enum is_wrap
+{
+  undecided,
+  yes,
+  no
+};
+#else /* HACK - C's enum concept is so stupid */
+#define is_wrap is_format
+#endif
+
+
+typedef struct message_ty message_ty;
+struct message_ty
+{
+  /* The msgctxt string, if present.  */
+  const char *msgctxt;
+
+  /* The msgid string.  */
+  const char *msgid;
+
+  /* The msgid's plural, if present.  */
+  const char *msgid_plural;
+
+  /* The msgstr strings.  */
+  const char *msgstr;
+  /* The number of bytes in msgstr, including the terminating NUL.  */
+  size_t msgstr_len;
+
+  /* Position in the source PO file.  */
+  lex_pos_ty pos;
+
+  /* Plain comments (#) appearing before the message.  */
+  string_list_ty *comment;
+
+  /* Extracted comments (#.) appearing before the message.  */
+  string_list_ty *comment_dot;
+
+  /* File position comments (#:) appearing before the message, one for
+     each unique file position instance, sorted by file name and then
+     by line.  */
+  size_t filepos_count;
+  lex_pos_ty *filepos;
+
+  /* Informations from special comments (e.g. generated by msgmerge).  */
+  bool is_fuzzy;
+  enum is_format is_format[NFORMATS];
+
+  /* Do we want the string to be wrapped in the emitted PO file?  */
+  enum is_wrap do_wrap;
+
+  /* The prev_msgctxt, prev_msgid and prev_msgid_plural strings appearing
+     before the message, if present.  Generated by msgmerge.  */
+  const char *prev_msgctxt;
+  const char *prev_msgid;
+  const char *prev_msgid_plural;
+
+  /* If set the message is obsolete and while writing out it should be
+     commented out.  */
+  bool obsolete;
+
+  /* Used for checking that messages have been used, in the msgcmp,
+     msgmerge, msgcomm and msgcat programs.  */
+  int used;
+
+  /* Used for looking up the target message, in the msgcat program.  */
+  message_ty *tmp;
+
+  /* Used for combining alternative translations, in the msgcat program.  */
+  int alternative_count;
+  struct altstr
+    {
+      const char *msgstr;
+      size_t msgstr_len;
+      const char *msgstr_end;
+      string_list_ty *comment;
+      string_list_ty *comment_dot;
+      char *id;
+    }
+    *alternative;
+};
+
+extern message_ty *
+       message_alloc (const char *msgctxt,
+		      const char *msgid, const char *msgid_plural,
+		      const char *msgstr, size_t msgstr_len,
+		      const lex_pos_ty *pp);
+#define is_header(mp) ((mp)->msgctxt == NULL && (mp)->msgid[0] == '\0')
+extern void
+       message_free (message_ty *mp);
+extern void
+       message_comment_append (message_ty *mp, const char *comment);
+extern void
+       message_comment_dot_append (message_ty *mp, const char *comment);
+extern void
+       message_comment_filepos (message_ty *mp, const char *name, size_t line);
+extern message_ty *
+       message_copy (message_ty *mp);
+
+
+typedef struct message_list_ty message_list_ty;
+struct message_list_ty
+{
+  message_ty **item;
+  size_t nitems;
+  size_t nitems_max;
+  bool use_hashtable;
+  hash_table htable;	/* Table mapping msgid to 'message_ty *'.  */
+};
+
+/* Create a fresh message list.
+   If USE_HASHTABLE is true, a hash table will be used to speed up
+   message_list_search().  USE_HASHTABLE can only be set to true if it is
+   known that the message list will not contain duplicate msgids.  */
+extern message_list_ty *
+       message_list_alloc (bool use_hashtable);
+/* Free a message list.
+   If keep_messages = 0, also free the messages.  If keep_messages = 1, don't
+   free the messages.  */
+extern void
+       message_list_free (message_list_ty *mlp, int keep_messages);
+extern void
+       message_list_append (message_list_ty *mlp, message_ty *mp);
+extern void
+       message_list_prepend (message_list_ty *mlp, message_ty *mp);
+extern void
+       message_list_insert_at (message_list_ty *mlp, size_t n, message_ty *mp);
+extern void
+       message_list_delete_nth (message_list_ty *mlp, size_t n);
+typedef bool message_predicate_ty (const message_ty *mp);
+extern void
+       message_list_remove_if_not (message_list_ty *mlp,
+				   message_predicate_ty *predicate);
+/* Recompute the hash table of a message list after the msgids or msgctxts
+   changed.  */
+extern bool
+       message_list_msgids_changed (message_list_ty *mlp);
+extern message_ty *
+       message_list_search (message_list_ty *mlp,
+			    const char *msgctxt, const char *msgid);
+extern message_ty *
+       message_list_search_fuzzy (message_list_ty *mlp,
+				  const char *msgctxt, const char *msgid);
+
+
+typedef struct message_list_list_ty message_list_list_ty;
+struct message_list_list_ty
+{
+  message_list_ty **item;
+  size_t nitems;
+  size_t nitems_max;
+};
+
+extern message_list_list_ty *
+       message_list_list_alloc (void);
+/* Free a list of message lists.
+   If keep_level = 0, also free the messages.  If keep_level = 1, don't free
+   the messages but free the lists.  If keep_level = 2, don't free the
+   the messages and the lists.  */
+extern void
+       message_list_list_free (message_list_list_ty *mllp, int keep_level);
+extern void
+       message_list_list_append (message_list_list_ty *mllp,
+				 message_list_ty *mlp);
+extern void
+       message_list_list_append_list (message_list_list_ty *mllp,
+				      message_list_list_ty *mllp2);
+extern message_ty *
+       message_list_list_search (message_list_list_ty *mllp,
+				 const char *msgctxt, const char *msgid);
+extern message_ty *
+       message_list_list_search_fuzzy (message_list_list_ty *mllp,
+				       const char *msgctxt, const char *msgid);
+
+
+typedef struct msgdomain_ty msgdomain_ty;
+struct msgdomain_ty
+{
+  const char *domain;
+  message_list_ty *messages;
+};
+
+extern msgdomain_ty *
+       msgdomain_alloc (const char *domain, bool use_hashtable);
+extern void
+       msgdomain_free (msgdomain_ty *mdp);
+
+
+typedef struct msgdomain_list_ty msgdomain_list_ty;
+struct msgdomain_list_ty
+{
+  msgdomain_ty **item;
+  size_t nitems;
+  size_t nitems_max;
+  bool use_hashtable;
+  const char *encoding;		/* canonicalized encoding or NULL if unknown */
+};
+
+extern msgdomain_list_ty *
+       msgdomain_list_alloc (bool use_hashtable);
+extern void
+       msgdomain_list_free (msgdomain_list_ty *mdlp);
+extern void
+       msgdomain_list_append (msgdomain_list_ty *mdlp, msgdomain_ty *mdp);
+extern void
+       msgdomain_list_append_list (msgdomain_list_ty *mdlp,
+				   msgdomain_list_ty *mdlp2);
+extern message_list_ty *
+       msgdomain_list_sublist (msgdomain_list_ty *mdlp, const char *domain,
+			       bool create);
+extern message_ty *
+       msgdomain_list_search (msgdomain_list_ty *mdlp,
+			      const char *msgctxt, const char *msgid);
+extern message_ty *
+       msgdomain_list_search_fuzzy (msgdomain_list_ty *mdlp,
+				    const char *msgctxt, const char *msgid);
+
+
+/* The goal function used in fuzzy search.
+   Higher values indicate a closer match.  */
+extern double
+       fuzzy_search_goal_function (const message_ty *mp,
+				   const char *msgctxt, const char *msgid);
+
+/* The threshold for fuzzy-searching.
+   A message is considered only if  fstrcmp (msg, given) > FUZZY_THRESHOLD.  */
+#define FUZZY_THRESHOLD 0.6
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* message.h */

Added: po4a/extension/lib/Locale/Po4a/pos.h
===================================================================
--- po4a/extension/lib/Locale/Po4a/pos.h	                        (rev 0)
+++ po4a/extension/lib/Locale/Po4a/pos.h	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,33 @@
+/* Source file positions.
+   Copyright (C) 1995-1998, 2000-2001 Free Software Foundation, Inc.
+
+   This program 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, or (at your option)
+   any later version.
+
+   This program 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 program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef _POS_H
+#define _POS_H
+
+/* Get size_t.  */
+#include <stddef.h>
+
+/* Position of a message within a source file.
+   Used for error reporting purposes.  */
+typedef struct lex_pos_ty lex_pos_ty;
+struct lex_pos_ty
+{
+  char *file_name;
+  size_t line_number;
+};
+
+#endif /* _POS_H */

Added: po4a/extension/lib/Locale/Po4a/str-list.h
===================================================================
--- po4a/extension/lib/Locale/Po4a/str-list.h	                        (rev 0)
+++ po4a/extension/lib/Locale/Po4a/str-list.h	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,89 @@
+/* GNU gettext - internationalization aids
+   Copyright (C) 1995-1996, 1998, 2000-2004 Free Software Foundation, Inc.
+
+   This file was written by Peter Miller <millerp@xxxxxxxxxxxxxxxx>
+
+   This program 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, or (at your option)
+   any later version.
+
+   This program 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 program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef _STR_LIST_H
+#define _STR_LIST_H 1
+
+/* Get size_t and NULL.  */
+#include <stddef.h>
+
+/* Get bool.  */
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Type describing list of immutable strings,
+   implemented using a dynamic array.  */
+typedef struct string_list_ty string_list_ty;
+struct string_list_ty
+{
+  const char **item;
+  size_t nitems;
+  size_t nitems_max;
+};
+
+/* Initialize an empty list of strings.  */
+extern void string_list_init (string_list_ty *slp);
+
+/* Return a fresh, empty list of strings.  */
+extern string_list_ty *string_list_alloc (void);
+
+/* Append a single string to the end of a list of strings.  */
+extern void string_list_append (string_list_ty *slp, const char *s);
+
+/* Append a single string to the end of a list of strings, unless it is
+   already contained in the list.  */
+extern void string_list_append_unique (string_list_ty *slp, const char *s);
+
+/* Destroy a list of strings.  */
+extern void string_list_destroy (string_list_ty *slp);
+
+/* Free a list of strings.  */
+extern void string_list_free (string_list_ty *slp);
+
+/* Return a freshly allocated string obtained by concatenating all the
+   strings in the list.  */
+extern char *string_list_concat (const string_list_ty *slp);
+
+/* Return a freshly allocated string obtained by concatenating all the
+   strings in the list, and destroy the list.  */
+extern char *string_list_concat_destroy (string_list_ty *slp);
+
+/* Return a freshly allocated string obtained by concatenating all the
+   strings in the list, separated by the separator character, terminated
+   by the terminator character.  The terminator character is not added if
+   drop_redundant_terminator is true and the last string already ends with
+   the terminator. */
+extern char *string_list_join (const string_list_ty *slp, char separator,
+			       char terminator, bool drop_redundant_terminator);
+
+/* Return 1 if s is contained in the list of strings, 0 otherwise.  */
+extern bool string_list_member (const string_list_ty *slp, const char *s);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STR_LIST_H */

Added: po4a/extension/typemap
===================================================================
--- po4a/extension/typemap	                        (rev 0)
+++ po4a/extension/typemap	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,17 @@
+TYPEMAP
+Locale_Po4a_Po	T_PTROBJ_SPECIAL
+INPUT
+T_PTROBJ_SPECIAL
+        if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")) {
+            IV tmp = SvIV((SV*)SvRV($arg));
+            $var = INT2PTR($type, tmp);
+        }
+        else
+            croak(\"$var is not of type ${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")
+
+OUTPUT
+T_PTROBJ_SPECIAL
+        sv_setref_pv($arg,
+                     \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\",
+                     (void*)$var);
+

Added: po4a/html/.htaccess
===================================================================
--- po4a/html/.htaccess	                        (rev 0)
+++ po4a/html/.htaccess	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,2 @@
+# Activate content negotiation
+Options Multiviews

Added: po4a/html/default.css
===================================================================
--- po4a/html/default.css	                        (rev 0)
+++ po4a/html/default.css	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,86 @@
+body {
+    font-family: Tahoma,Verdana,sans-serif;
+    font-size: small;
+    color: rgb(100,100,100);
+    margin: 0;
+    background: rgb(250,255,252);
+}
+
+.bg {
+    margin: 0;
+    margin-bottom: 20px;
+    background-image: url(header.png);
+    background-repeat: repeat-x;
+}
+
+.bg .header {
+    margin: 0 15% 0 15%;
+    max-width: 50em;
+    padding-top: 1em;
+    padding-bottom: 1em;
+}
+
+.bg .header h1 {
+    font-size: xx-large;
+    text-align: right;
+    color: white;
+}
+
+.bg .header h1 sup {
+    font-size: small;
+    position: absolute;
+}
+
+#body {
+    margin: 0 15% 0 15%;
+    max-width: 50em;
+}
+
+h1 { font-size: x-large; border-bottom: 1px rgb(200,200,200) solid; text-align: right; margin: 0 0 0.7em 0; padding: 0 0 0.2em 0; }
+h1 sup { font-size: small; position: absolute; }
+
+h2 { margin: 0; font-size: small;}
+
+
+a { font-weight: bold; text-decoration: none; color: black; }
+a:visited { font-weight: normal; }
+a:hover { font-style: italic; }
+
+#nav {
+    width: 10em;
+    /*background: gray;*/
+    text-align: right;
+    float: left;
+    padding: 1em 0 0 0;
+}
+
+#nav a { display: block; padding: 0 0 1em 0; font-weight: normal; }
+#nav a:hover { font-style: normal; background: transparent; /* background so that IE does hover effect (?!?!)*/ }
+#nav a span { color: rgb(250,255,252); }
+#nav a:hover span { color: black; }
+
+#content {
+    /*background: lightsteelblue;*/
+    margin: 0 0 0 10em;
+    padding: 1em 1em 0 1em;
+    border-left: 1px rgb(200,200,200) solid;
+}
+
+div.item {
+    border-bottom: 1px rgb(200,200,200) solid;
+    margin: 0 0 2em 0;
+}
+
+div.item p { margin: 1em 0.2em 0.3em 0; line-height: 1.5; text-align: justify; }
+
+#languages {
+    margin: 2em 0 2em 2em;
+    font-size: x-small;
+}
+
+#footer {
+    margin: 2em 0 0 0;
+    text-align: center;
+    border-top: 1px rgb(200,200,200) solid;
+    font-size: xx-small;
+}

Added: po4a/html/documentation.php.en
===================================================================
--- po4a/html/documentation.php.en	                        (rev 0)
+++ po4a/html/documentation.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,39 @@
+<!-- vim: set noexpandtab tw=0 : -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";>
+<head>
+	<link rel="stylesheet"
+	      type="text/css"
+	      href="default.css" />
+	<meta http-equiv="Content-Type"
+	      content="application/xhtml+xml; charset=utf-8" />
+	<title>po4a - Documentation</title>
+</head>
+<body>
+	<? include "header.php.en"; ?>
+
+	<div id="content">
+		<div class="item">
+			<h2>Documentation</h2>
+			<p>Here is an HTML version of the po4a's manpages.</p>
+			<p>The <a href="man/man7/po4a.7.php">po4a.7</a> manpage
+			provides an introduction to po4a.</p>
+			<p>For more details, the <a href="man/">index</a>
+			provides the documentation of the various commands
+			and modules.</p>
+		</div>
+		<div class="item">
+			<h2>Help</h2>
+			<p>We can help you to set up a translation framework
+			for your project's documentation or to adapt po4a to
+			your needs.  Do not hesitate to contact us on our
+			<a href="mailto:po4a-devel@lists.alioth.debian.org";>mailing
+			list</a> or on IRC (#po4a on oftc).</p>
+		</div>
+	</div>
+
+	<? include "footer_documentation.php"; ?>
+	<? include "footer.php"; ?>
+</body>
+</html>

Added: po4a/html/download.php.en
===================================================================
--- po4a/html/download.php.en	                        (rev 0)
+++ po4a/html/download.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,40 @@
+<!-- vim: set noexpandtab tw=0 : -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";>
+<head>
+	<link rel="stylesheet"
+	      type="text/css"
+	      href="default.css" />
+	<meta http-equiv="Content-Type"
+	      content="application/xhtml+xml; charset=utf-8" />
+	<title>po4a - Download</title>
+</head>
+<body>
+	<? include "header.php.en"; ?>
+
+	<div id="content">
+		<div class="item">
+			<h2>Sources</h2>
+			<p>You can find the sources of the latest release on
+			<a href="http://alioth.debian.org/frs/?group_id=30267";>Alioth</a>.</p>
+		</div>
+		<div class="item">
+			<h2>Binary</h2>
+			<p>po4a is a Perl module. It is available as a binary
+			package in many OpenSource distributions (Debian,
+			Ubuntu, Fink, FreeBSD, Gentoo, Fedora, Mandriva, and
+			probably others).</p>
+		</div>
+		<div class="item">
+			<h2>CVS</h2>
+			<p>The latest sources are available from our <a href="http://alioth.debian.org/plugins/scmcvs/cvsweb.php/po4a/?cvsroot=po4a";>CVS repository</a>.</p>
+			<p>It also contains additional modules which are being
+			considered, but are not of a sufficient quality.</p>
+		</div>
+	</div>
+
+	<? include "footer_download.php"; ?>
+	<? include "footer.php"; ?>
+</body>
+</html>

Added: po4a/html/features.php.en
===================================================================
--- po4a/html/features.php.en	                        (rev 0)
+++ po4a/html/features.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,60 @@
+<!-- vim: set noexpandtab tw=0 : -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";>
+<head>
+	<link rel="stylesheet"
+	      type="text/css"
+	      href="default.css" />
+	<meta http-equiv="Content-Type"
+	      content="application/xhtml+xml; charset=utf-8" />
+	<title>po4a - Features</title>
+</head>
+<body>
+	<? include "header.php.en"; ?>
+
+	<div id="content">
+		<div class="item">
+			<h2>Introduction</h2>
+			<p>po4a extracts the translatable material from its
+			input in a PO file.</p>
+			<p>When the PO file is translated, it re-injects the
+			translation in the structure of the document, and
+			generates the translated document.</p>
+			<p>If a string is not translated (i.e. it was not
+			translated or it is "fuzzy" because the original
+			document was updated), the original string is used.</p>
+			<p>This permits to provide always up-to-date
+			documentation.</p>
+		</div>
+		<div class="item">
+			<h2>Supported formats</h2>
+			<p>po4a supports currently the following formats:</p>
+			<ul>
+				<li>manpages</li>
+				<li>pod</li>
+				<li>xml (generic, docbook, xhtml, dia, or guide)</li>
+				<li>sgml</li>
+				<li>TeX (generic, LaTeX, or Texinfo)</li>
+				<li>text (simple text files with some
+				formatting)</li>
+				<li>ini</li>
+				<li>KernelHelp</li>
+			</ul>
+		</div>
+		<div class="item">
+			<h2>Configuration file</h2>
+			<p>You can use a configuration file to ease its usage
+			to a single command invocation. This configuration
+			file will contain the list of documents, the options,
+			etc.</p>
+			<p>When invoked with a configuration file, po4a uses
+			an 'a la make' algorithm to detect if files changed and
+			if an operation is required.</p>
+		</div>
+	</div>
+
+	<? include "footer_features.php"; ?>
+	<? include "footer.php"; ?>
+</body>
+</html>

Added: po4a/html/footer.php
===================================================================
--- po4a/html/footer.php	                        (rev 0)
+++ po4a/html/footer.php	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,8 @@
+<!-- begin footer.php -->
+<!--This theme is free for distriubtion,  so long as  link to openwebdesing.org and webhostingbluebook.com stay on the theme-->
+	<div id="footer">
+		<p>Theme courtesy <a href="http://www.openwebdesign.org";>Open Web Design</a>.
+		Thanks to <a href="http://www.webhostingbluebook.com";>web hosting bluebook</a>.
+		(Copyright &copy;2004 Mark Florian)</p>
+	</div>
+<!-- end footer.php -->

Added: po4a/html/fuzzy.png
===================================================================
(Binary files differ)


Property changes on: po4a/html/fuzzy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: po4a/html/getinvolved.php.en
===================================================================
--- po4a/html/getinvolved.php.en	                        (rev 0)
+++ po4a/html/getinvolved.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,43 @@
+<!-- vim: set noexpandtab tw=0 : -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";>
+<head>
+	<link rel="stylesheet"
+	      type="text/css"
+	      href="default.css" />
+	<meta http-equiv="Content-Type"
+	      content="application/xhtml+xml; charset=utf-8" />
+	<title>po4a - Get involved!</title>
+</head>
+<body>
+	<? include "header.php.en"; ?>
+
+	<div id="content">
+		<div class="item">
+			<h2>Get involved!</h2>
+			<p>If you want to participate, you can contact us</p>
+			<ul>
+				<li>on our <a href="mailto:po4a-devel@lists.alioth.debian.org";>mailing list</a>,</li>
+				<li>on IRC (#po4a on oftc).</li></ul>
+			<p>Bug reports, patches, feature requests or any
+			feedback are welcomed on the mailing list, in the
+			<a href="http://alioth.debian.org/tracker/?atid=410622&amp;group_id=30267";>Alioth tracker</a>
+			or in the <a href="http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=po4a;dist=unstable";>Debian BTS</a>.</p>
+			<p>Commit emails are sent on a separate
+			<a href="mailto:po4a-commits@lists.alioth.debian.org";>mailing list</a>.</p>
+		</div>
+		<div class="item">
+			<h2>TODO</h2>
+			<p>We are looking for people interesting in
+			testing/porting on Windows</p>
+			<p>Support for XLIFF would be welcomed.</p>
+			<p>Implementation of a C extension to make po4a faster
+			is ongoing.</p>
+		</div>
+	</div>
+
+	<? include "footer_getinvolved.php"; ?>
+	<? include "footer.php"; ?>
+</body>
+</html>

Added: po4a/html/header.php.en
===================================================================
--- po4a/html/header.php.en	                        (rev 0)
+++ po4a/html/header.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,14 @@
+<!-- begin header.php -->
+	<div class="bg"><div class="header">
+		<h1>po4a<sup>v<? include "version.php"; ?></sup></h1>
+	</div></div>
+
+	<div id="nav">
+		<a href="."                 title="Welcome"      >Welcome<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="features.php"      title="Features"     >Features<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="documentation.php" title="Documentation">Documentation<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="download.php"      title="Download"     >Download<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="getinvolved.php"   title="Get Involved" >Get Involved<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="translations.php"  title="Translations" >Translations<span>&nbsp;&nbsp;&lt;</span></a>
+	</div>
+<!-- end header.php -->

Added: po4a/html/header.png
===================================================================
(Binary files differ)


Property changes on: po4a/html/header.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: po4a/html/header1.php.en
===================================================================
--- po4a/html/header1.php.en	                        (rev 0)
+++ po4a/html/header1.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,14 @@
+<!-- begin header1.php -->
+	<div class="bg"><div class="header">
+		<h1>po4a<sup>v<? include "version.php"; ?></sup></h1>
+	</div></div>
+
+	<div id="nav">
+		<a href="../index.php"         title="Welcome"      >Welcome<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../features.php"      title="Features"     >Features<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../documentation.php" title="Documentation">Documentation<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../download.php"      title="Download"     >Download<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../getinvolved.php"   title="Get Involved" >Get Involved<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../translations.php"  title="Translations" >Translations<span>&nbsp;&nbsp;&lt;</span></a>
+	</div>
+<!-- end header1.php -->

Added: po4a/html/header2.php.en
===================================================================
--- po4a/html/header2.php.en	                        (rev 0)
+++ po4a/html/header2.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,14 @@
+<!-- begin header2.php -->
+	<div class="bg"><div class="header">
+		<h1>po4a<sup>v<? include "version.php"; ?></sup></h1>
+	</div></div>
+
+	<div id="nav">
+		<a href="../../index.php"         title="Welcome"      >Welcome<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../../features.php"      title="Features"     >Features<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../../documentation.php" title="Documentation">Documentation<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../../download.php"      title="Download"     >Download<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../../getinvolved.php"   title="Get Involved" >Get Involved<span>&nbsp;&nbsp;&lt;</span></a>
+		<a href="../../translations.php"  title="Translations" >Translations<span>&nbsp;&nbsp;&lt;</span></a>
+	</div>
+<!-- end header2.php -->

Added: po4a/html/index.php.en
===================================================================
--- po4a/html/index.php.en	                        (rev 0)
+++ po4a/html/index.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,44 @@
+<!-- vim: set noexpandtab tw=0 : -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";>
+<head>
+	<link rel="stylesheet"
+	      type="text/css"
+	      href="default.css" />
+	<meta http-equiv="Content-Type"
+	      content="application/xhtml+xml; charset=utf-8" />
+	<title>po4a - Welcome</title>
+</head>
+<body>
+	<? include "header.php.en"; ?>
+
+	<div id="content">
+		<div class="item">
+			<h2>Welcome!</h2>
+			<p>The po4a (po for anything) project goal is to ease
+			translations (and more interestingly, the maintenance
+			of translations) using gettext tools on areas where
+			they were not expected like documentation.</p>
+		</div>
+		<div class="item">
+			<h2>2007-08-16 - New website</h2>
+			<p>We've changed the aspect of our web site and we've
+			added some contents to help new users to use po4a.</p>
+		</div>
+		<div class="item">
+			<h2>2007-08-15 - po4a 0.32 released</h2>
+			<p></p>
+		</div>
+		<div class="item">
+			<h2>Project links</h2>
+			<p>The <a href="http://alioth.debian.org/projects/po4a/";>po4a project</a>
+			is hosted on
+			<a href="http://alioth.debian.org";>Alioth</a>.</p>
+		</div>
+	</div>
+
+	<? include "footer_index.php"; ?>
+	<? include "footer.php"; ?>
+</body>
+</html>

Added: po4a/html/table_translations_legend.php
===================================================================
--- po4a/html/table_translations_legend.php	                        (rev 0)
+++ po4a/html/table_translations_legend.php	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,4 @@
+<tr><td>legend:</td><td></td></tr>
+<tr><td><img height="10" src="translated.png" style="height: 1em;" width="100%" alt="translated"/></td><td>translated</td></tr>
+<tr><td><img height="10" src="fuzzy.png" style="height: 1em;" width="100%" alt="fuzzy"/></td><td>fuzzy</td></tr>
+<tr><td><img height="10" src="untranslated.png" style="height: 1em;" width="100%" alt="untranslated"/></td><td>untranslated</td></tr>

Added: po4a/html/translated.png
===================================================================
(Binary files differ)


Property changes on: po4a/html/translated.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: po4a/html/translations.php.en
===================================================================
--- po4a/html/translations.php.en	                        (rev 0)
+++ po4a/html/translations.php.en	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,48 @@
+<!-- vim: set noexpandtab tw=0 : -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";>
+<head>
+	<link rel="stylesheet"
+	      type="text/css"
+	      href="default.css" />
+	<meta http-equiv="Content-Type"
+	      content="application/xhtml+xml; charset=utf-8" />
+	<title>po4a - Translations</title>
+</head>
+<body>
+	<? include "header.php.en"; ?>
+
+	<div id="content">
+		<div class="item">
+			<h2>Translating</h2>
+			<p>Strings are usually frozen one or two week before
+			the releases. Tell us if you want to be notified.</p>
+			<p>See below for the list of available translations and
+			work needed.</p>
+			<p>You can find the translation material on our CVS
+			repository (<a href="http://alioth.debian.org/plugins/scmcvs/cvsweb.php/po4a/po/bin/?cvsroot=po4a";>translation of the program</a>,
+			<a href="http://alioth.debian.org/plugins/scmcvs/cvsweb.php/po4a/po/pod/?cvsroot=po4a";>translation of the documentation</a>).</p>
+		</div>
+		<div class="item">
+			<h2>Available translations</h2>
+			<p>Po4a is currently translated in the following
+			languages:</p>
+			<? include "table_translations_bin.php";?>
+		</div>
+		<div class="item">
+			<h2>Translations of the documentation</h2>
+			<p>The po4a documentation is also translated in the following languages:</p>
+			<? include "table_translations_pod.php";?>
+		</div>
+		<div class="item">
+			<h2>Translations of the web site</h2>
+			<p>This web site is also translated in the following languages:</p>
+			<? include "table_translations_www.php";?>
+		</div>
+	</div>
+
+	<? include "footer_translations.php"; ?>
+	<? include "footer.php"; ?>
+</body>
+</html>

Added: po4a/html/untranslated.png
===================================================================
(Binary files differ)


Property changes on: po4a/html/untranslated.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: po4a/html-build-upload.sh
===================================================================
--- po4a/html-build-upload.sh	                        (rev 0)
+++ po4a/html-build-upload.sh	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,289 @@
+#! /bin/sh
+# vim: set noexpandtab tw=0:
+# Rebuild the documentation and upload this to the web server.
+
+set -e # we want to fail on any error instead of risking uploading broken stuff
+#set -x
+
+percent_lang() {
+	STATS=`msgfmt -o /dev/null --statistics po/pod/$1.po 2>&1`
+	YES=`echo $STATS | sed -n -e 's/^\([[:digit:]]*\).*$/\1/p'`
+	NO=`echo $STATS | sed -n -e 's/^\([[:digit:]]\+\)[^[:digit:]]\+\([[:digit:]]\+\).*$/\2/p'`
+	if [ ! $NO ]; then
+		NO=0
+	fi
+	O3=`echo $STATS | sed -n -e 's/^\([[:digit:]]\+\)[^[:digit:]]\+\([[:digit:]]\+\)[^[:digit:]]\+\([[:digit:]]\+\).*$/\3/p'`
+	if [ $O3 ]; then
+		NO=$(($NO + $O3))
+	fi
+	TOTAL=$(($YES+$NO))
+	echo $((($YES*100)/$TOTAL))
+}
+
+get_charset() {
+	case $1 in
+		en)
+			echo "UTF-8"
+			;;
+		pl)
+			echo "ISO-8859-2"
+			;;
+		*)
+			echo "ISO-8859-1"
+			;;
+	esac
+}
+
+POFILES=`cd po/pod; ls *.po`
+LANGS=${POFILES//.po/}
+
+PO4A_OPTS="-k 0 -v -f pod -M utf-8"
+
+./Build man
+
+rm -rf html.gen/
+cp -a blib/man html.gen
+mkdir -p html.gen/en/
+mv html.gen/man* html.gen/en/
+mkdir html.gen/en/man3pm
+mkdir html.gen/man
+mkdir html.gen/man/man1
+mkdir html.gen/man/man3pm
+mkdir html.gen/man/man7
+
+echo "Generate the web pages translations with po4a"
+PERLLIB=lib ./po4a -v po/html.cfg
+
+find html.gen -name "*.pl" |
+while read f
+do
+	mv $f ${f%pl}po
+done
+
+for lang in $(grep po4a_langs po/html.cfg | sed -e 's/\[po4a_langs\] //')
+do
+	for f in html.gen/*.${lang/pl/po}
+	do
+		sed -i -e "s/\.en\"; ?>/\.${lang/pl/po}\"; ?>/" $f
+	done
+done
+
+echo "Generate the English man pages"
+find lib -name "*.pm" | while read file
+do
+	name=$(basename $file)
+	name=${name//.pm/}
+	pod2man --section=3pm --release="Po4a Tools" --center="Po4a Tools" \
+	    $file html.gen/en/man3pm/Locale::Po4a::$name.3pm
+done
+for file in po4a po4a-gettextize po4a-normalize po4a-translate po4a-updatepo
+do
+	pod2man --section=1 --release="Po4a Tools" --center="Po4a Tools" \
+	    $file html.gen/en/man1/$file.1
+done
+
+# Main page
+#for lang in $LANGS ; do
+#	PERC=`percent_lang $lang`
+#	echo "   $lang ($PERC% translated):
+#   <a href=\"$lang/man7/po4a.7.php\">Introduction</a>
+#   <a href=\"$lang/\">Index</a>
+#   <br>" >> html.gen/documentation_translations.php
+#done
+#echo "   <br>
+#   Last update: `LANG=C date`" >> html.gen/documentation_translations.php
+
+for lang in en $LANGS ; do
+	echo Generate the $lang index
+	if [ -d html.gen/$lang/man3 ]
+	then
+		mv html.gen/$lang/man3 html.gen/$lang/man3pm
+	fi
+
+	echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
+<html>
+ <head>
+  <link rel=\"stylesheet\"
+        title=\"Default Style\"
+        type=\"text/css\"
+        href=\"../default.css\" >
+  <meta content=\"text/html; charset=UTF-8\" http-equiv=\"Content-Type\">
+  <title>Table of Contents</title>
+ </head>
+ <body>
+  <? include \"../header1.php.${lang/pl/po}\"; ?>
+  <div id=\"content\">
+  <h1>Table of Contents</h1>
+   <table>" > html.gen/man/index.php.${lang/pl/po}
+	for man in html.gen/en/man*/*
+	do
+		man=$(echo $man | sed -e "s/^html.gen\/en\///")
+		man=${man%.gz}
+		man=${man/1p/1}
+		if ls html.gen/$lang/$man* > /dev/null 2>&1
+		then
+			page=$(ls html.gen/$lang/$man*)
+		else
+			page=$(ls html.gen/en/$man*)
+		fi
+		title=$(lexgrog "$page" |
+		        iconv -f $(get_charset $lang) -t utf8 | \
+		        sed -ne 's/.*: \".* - //;s/"$//;p')
+		ref=$man.php
+		man=$(basename $man)
+		man=$(echo $man | sed -e 's/^\(.*\)\.\([0-9]\(pm\)\?\)$/\1(\2)/')
+		echo "    <tr>
+     <td><a href=\"$ref\">$man</a></td>
+     <td>$title</td>
+     </td>
+    </tr>" >> html.gen/man/index.php.${lang/pl/po}
+	done
+	echo "   </table>
+  </div>
+  <? include \"footer_index.php\"; ?>
+  <? include \"../footer.php\"; ?>
+ </body>
+</html>" >> html.gen/man/index.php.${lang/pl/po}
+
+	echo Generate the $lang HTML pages
+	for man in html.gen/$lang/man*/*
+	do
+		if [ "$man" != "${man%.gz}" ]
+		then
+			gunzip $man
+			man=${man%.gz}
+		fi
+		out=${man/1p/1}.php.${lang/pl/po}
+		out=$(echo $out | sed -e "s/html.gen\/$lang\//html.gen\/man\//")
+		footer=footer_$(basename $out)
+		footer=${footer%.${lang/pl/po}}
+		man2html -r $man | sed -e '/Content-type: text.html/d' \
+		                       -e '/cgi-bin.man.man2html/d' \
+		                       -e 's/\.html"/\.php"/g' \
+		                       -e "s/<HEAD>/<HEAD><link rel=\"stylesheet\" title=\"Default Style\" type=\"text\/css\" href=\"..\/..\/default.css\"><meta content=\"text\/html; charset=UTF-8\" http-equiv=\"Content-Type\">/" \
+		                       -e "s/<BODY>/<BODY><? include \"..\/..\/header2.php.${lang/pl/po}\"; ?><div id=\"content\">/" \
+		                       -e "s/<\/BODY>/<\/div><? include \"$footer\"; ?><? include \"..\/..\/footer.php\"; ?><\/BODY>/" | \
+		                   iconv -f $(get_charset $lang) -t utf8 > $out
+	done
+
+	if [ "$lang" != "en" ]
+	then
+		rm -rf html.gen/$lang
+	fi
+done
+rm -rf html.gen/en
+
+gen_translations() {
+	dir="$1"
+
+	total=$(LC_ALL=C msgfmt -o /dev/null --statistics "$dir"/*.pot 2>&1 | \
+	        sed -ne "s/^.* \([0-9]*\) untranslated.*$/\1/p;d")
+
+	echo "<table>"
+	for pofile in "$dir"/*.po
+	do
+		lang=${pofile%.po}
+		lang=$(basename $lang)
+		stats=$(LC_ALL=C msgfmt -o /dev/null --statistics $pofile 2>&1)
+		echo -n "<tr><td>$lang</td><td>"
+		for type in translated fuzzy untranslated
+		do
+			strings=$(echo " $stats" | \
+			          sed -ne "s/^.* \([0-9]*\) $type.*$/\1/p;d")
+			if [ -n "$strings" ]
+			then
+				pcent=$((strings*100/total))
+				width=$((strings*200/total))
+				echo -n "<img height=\"10\" src=\"$type.png\" "
+				echo -n "style=\"height: 1em;\" "
+				echo -n "width=\"$width\" "
+				echo -n "alt=\"$pcent% $type ($strings/$total), \" "
+				echo -n "title=\"$type: $pcent% ($strings/$total)\"/>"
+			fi
+		done
+		echo "</td></tr>"
+	done
+	echo "<? include \"table_translations_legend.php\";?>"
+	echo "</table>"
+	echo "<p>Last update: `LC_ALL=C date`.</p>"
+}
+
+echo Generate the translation statistics for po/bin
+gen_translations po/bin > html.gen/table_translations_bin.php
+echo Generate the translation statistics for po/pod
+gen_translations po/pod > html.gen/table_translations_pod.php
+echo Generate the translation statistics for po/www
+gen_translations po/www > html.gen/table_translations_www.php
+
+echo Extract the version
+grep '$VERSION=' lib/Locale/Po4a/TransTractor.pm | \
+	sed -e 's/^.*"\([^"]*\)".*/\1/' > html.gen/version.php
+
+get_language() {
+# FIXME: use gettext
+	case $1 in
+		ca)
+			echo -n "catal$B%F(B
+			;;
+		en)
+			echo -n "English"
+			;;
+		es)
+			echo -n "espal"
+			;;
+		fr)
+			echo -n "fran軋is"
+			;;
+		it)
+			echo -n "Italiano"
+			;;
+		po)
+			echo -n "polski"
+			;;
+		*)
+			echo "Language '$1' not supported" >&2
+			exit 1
+			;;
+	esac
+}
+
+gen_language_footer() {
+	page="$1"
+#	echo "Generating language footer for $page"
+	page=${page%.en}
+	page=${page#html/}
+	page=${page#html.gen/}
+	out=html.gen/$(dirname $page)/footer_$(basename $page)
+	echo "<div id=\"languages\">" > $out
+	for langcode in $(ls html/$page.* html.gen/$page.* 2>/dev/null)
+	do
+		langcode=${langcode#html/$page.}
+		langcode=${langcode#html.gen/$page.}
+		language=$(get_language $langcode)
+		echo "<a href=\"$(basename $page | sed -e 's/:/%3A/g').$langcode\">$language</a>" >> $out
+	done
+	echo "</div>" >> $out
+#	echo "done"
+}
+
+echo "Generating language footers"
+for page in html/*.en
+do
+	gen_language_footer "$page"
+done
+
+find html.gen -name "*.en" |
+while read page
+do
+	gen_language_footer "$page"
+done
+
+echo Uploading...
+scp -pr html/*.* po4a.alioth.debian.org:/var/lib/gforge/chroot/home/groups/po4a/htdocs
+scp -pr html/.htaccess po4a.alioth.debian.org:/var/lib/gforge/chroot/home/groups/po4a/htdocs
+scp -pr html.gen/man po4a.alioth.debian.org:/var/lib/gforge/chroot/home/groups/po4a/htdocs
+scp -pr html.gen/*.* po4a.alioth.debian.org:/var/lib/gforge/chroot/home/groups/po4a/htdocs
+ssh po4a.alioth.debian.org chgrp -R po4a /var/lib/gforge/chroot/home/groups/po4a/htdocs
+ssh po4a.alioth.debian.org chmod -R g+rw /var/lib/gforge/chroot/home/groups/po4a/htdocs
+echo done
+


Property changes on: po4a/html-build-upload.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: po4a/lib/Locale/Po4a/BibTeX.pm
===================================================================
--- po4a/lib/Locale/Po4a/BibTeX.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/BibTeX.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,150 @@
+#!/usr/bin/perl -w
+
+# Po4a::BibTeX.pm
+# 
+# extract and translate translatable strings from BibTeX documents
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::BibTeX - Convert BibTeX documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::BibTeX is a module to help the translation of
+bibliographies in the BibTeX format into other [human] languages.
+
+Fields values are extracted and proposed for translation.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+NONE.
+
+=head1 STATUS OF THIS MODULE
+
+It is a very simple module, but still young.
+
+=cut
+
+package Locale::Po4a::BibTeX;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+
+sub initialize {}
+
+sub parse {
+    my $self = shift;
+    my ($line,$ref);
+    my $paragraph="";
+    my $field="";
+    my $id="";
+    my $wrapped_mode = 1;
+    ($line,$ref)=$self->shiftline();
+    while (defined($line)) {
+        chomp($line);
+#print "tutu: '$line'\n";
+        $self->{ref}="$ref";
+        if (    $id eq ""
+            and $line =~ m/^\@.*?\s*\{\s*(.*),\s*$/) {
+            $id = $1;
+            $self->pushline( $line."\n" );
+        } elsif (    $id ne ""
+                 and $field eq ""
+                 and $line =~ m/^((.*?)\s*=\s*)([^ "{].*?)(\s*,?\s*)$/) {
+            my $end=(defined $4)?$4:"";
+            $self->pushline( $1.$self->translate($3,
+                                                 $self->{ref},
+                                                 "$2 ($id)",
+                                                 "wrap" => 1).$end."\n" );
+            $field = "";
+            $paragraph = "";
+        } elsif (    $id ne ""
+                 and $field eq ""
+                 and $line =~ m/^((.*?)\s*=\s*)(.*)$/) {
+            $field = $2;
+            $paragraph = $3."\n";
+            $self->pushline( $1 );
+        } elsif ($field ne "") {
+            $paragraph.="$line\n";
+        } elsif ($line =~ m/^\s*(\%.*)?$/) {
+            $self->pushline( $line."\n" );
+        } elsif ($line =~ m/^\s*\}\s*$/) {
+            $self->pushline( $line."\n" );
+            $id="";
+        } else {
+            print "unsupported line: '$line'\n";
+        }
+        if (   $paragraph =~ m/^(\s*\{)(.*)(\}\s*,?\s*)$/s
+            or $paragraph =~ m/^(\s*")(.*)("\s*,?\s*)$/s
+            or $paragraph =~ m/^(\s*)([^ "{].*)(\s*,?\s*)$/s) {
+            $self->pushline( $1.$self->translate($2,
+                                                 $self->{ref},
+                                                 "$field ($id)",
+                                                 "wrap" => 1).$3);
+            $field="";
+            $paragraph="";
+        }
+        ($line,$ref)=$self->shiftline();
+    }
+        if (   $paragraph =~ m/^(\s*\{)(.*)(\}\s*,?\s*)$/s
+            or $paragraph =~ m/^(\s*")(.*)("\s*,?\s*)$/s
+            or $paragraph =~ m/^(\s*)(.*)(\s*,?\s*)$/s) {
+            $self->pushline( $self->translate($1,
+                                              $self->{ref},
+                                              "$field ($id)",
+                                              "wrap" => 1).$2);
+            $field="";
+            $paragraph="";
+        }
+}
+
+sub do_paragraph {
+    my ($self, $paragraph, $wrap) = (shift, shift, shift);
+    $self->pushline( $self->translate($paragraph,
+                                      $self->{ref},
+                                      "Plain text",
+                                      "wrap" => $wrap) );
+}
+
+1;
+
+=head1 AUTHORS
+
+ Nicolas Fran輟is <nicolas.francois@xxxxxxxxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+ Copyright 2006 by Nicolas FRANヌOIS <nicolas.francois@xxxxxxxxxxxxxxx>.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).

Added: po4a/lib/Locale/Po4a/Chooser.pm
===================================================================
--- po4a/lib/Locale/Po4a/Chooser.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Chooser.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,142 @@
+# Locale::Po4a::Pod -- Convert POD data to PO file, for translation.
+# $Id: Chooser.pm,v 1.38 2007-08-05 18:47:57 nekral-guest Exp $
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the terms of GPL (see COPYING).
+#
+# This module converts POD to PO file, so that it becomes possible to 
+# translate POD formatted documentation. See gettext documentation for
+# more info about PO files.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+
+package Locale::Po4a::Chooser;
+
+use 5.006;
+use strict;
+use warnings;
+use Locale::Po4a::Common;
+
+sub new {
+    my ($module)=shift;
+    my (%options)=@_;
+
+    die wrap_mod("po4a::chooser", gettext("Need to provide a module name"))
+      unless defined $module;
+
+    my $modname;
+    if ($module eq 'kernelhelp') {
+        $modname = 'KernelHelp';
+    } elsif ($module eq 'newsdebian') {
+        $modname = 'NewsDebian';
+    } elsif ($module eq 'latex') {
+        $modname = 'LaTeX';
+    } elsif ($module eq 'bibtex') {
+        $modname = 'BibTex';
+    } else {
+        $modname = ucfirst($module);
+    }
+    if (! UNIVERSAL::can("Locale::Po4a::$modname", 'new')) {
+        eval qq{use Locale::Po4a::$modname};
+        if ($@) {
+            my $error=$@;
+            warn wrap_msg(gettext("Unknown format type: %s."), $module);
+	    warn wrap_mod("po4a::chooser",
+		gettext("Module loading error: %s"), $error)
+	      if defined $options{'verbose'} && $options{'verbose'} > 0;
+            list(1);
+        }
+    }
+    return "Locale::Po4a::$modname"->new(%options);
+}
+
+sub list {
+    warn wrap_msg(gettext("List of valid formats:")
+#	."\n  - ".gettext("bibtex: BibTex bibliography format.")
+	."\n  - ".gettext("dia: uncompressed Dia diagrams.")
+	."\n  - ".gettext("docbook: Docbook XML.")
+	."\n  - ".gettext("guide: Gentoo Linux's xml documentation format.")
+#	."\n  - ".gettext("html: HTML documents (EXPERIMENTAL).")
+	."\n  - ".gettext("ini: .INI format.")
+	."\n  - ".gettext("kernelhelp: Help messages of each kernel compilation option.")
+	."\n  - ".gettext("latex: LaTeX format.")
+	."\n  - ".gettext("man: Good old manual page format.")
+	."\n  - ".gettext("pod: Perl Online Documentation format.")
+	."\n  - ".gettext("sgml: either debiandoc or docbook DTD.")
+	."\n  - ".gettext("texinfo: The info page format.")
+	."\n  - ".gettext("tex: generic TeX documents (see also latex).")
+	."\n  - ".gettext("text: simple text document.")
+#	."\n  - ".gettext("wml: WML documents.")
+	."\n  - ".gettext("xhtml: XHTML documents.")
+	."\n  - ".gettext("xml: generic XML documents (see also docbook).")
+    );
+    exit shift;
+}
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Locale::Po4a::Chooser - Manage po4a modules
+
+=head1 DESCRIPTION
+
+Locale::Po4a::Chooser is a module to manage po4a modules. Before, all po4a
+binaries used to know all po4a modules (pod, man, sgml, etc). This made the
+add of a new module boring, to make sure the documentation is synchronized
+in all modules, and that each of them can access the new module.
+
+Now, you just have to call the Locale::Po4a::Chooser::new() function,
+passing the name of module as argument.
+
+You also have the Locale::Po4a::Chooser::list() function which lists the
+available format and exits on the value passed as argument.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item About po4a:
+
+L<po4a(7)|po4a.7>, 
+L<Locale::Po4a::TransTractor(3pm)>,
+L<Locale::Po4a::Po(3pm)>
+
+=item About modules:
+
+L<Locale::Po4a::Dia(3pm)>,
+L<Locale::Po4a::Docbook(3pm)>,
+L<Locale::Po4a::Guide(3pm)>,
+L<Locale::Po4a::Ini(3pm)>,
+L<Locale::Po4a::KernelHelp(3pm)>,
+L<Locale::Po4a::LaTeX(3pm)>,
+L<Locale::Po4a::Man(3pm)>,
+L<Locale::Po4a::Pod(3pm)>,
+L<Locale::Po4a::Sgml(3pm)>,
+L<Locale::Po4a::Texinfo(3pm)>,
+L<Locale::Po4a::Text(3pm)>,
+L<Locale::Po4a::Xhtml(3pm)>,
+L<Locale::Po4a::Xml(3pm)>.
+
+=back
+
+=head1 AUTHORS
+
+ Denis Barbier <barbier@xxxxxxxxxxx>
+ Martin Quinson (mquinson#debian.org)
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2002,2003,2004,2005 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut

Added: po4a/lib/Locale/Po4a/Common.pm
===================================================================
--- po4a/lib/Locale/Po4a/Common.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Common.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,224 @@
+# Locale::Po4a::Common -- Common parts of the po4a scripts and utils
+# $Id: Common.pm,v 1.15 2007-02-14 21:14:38 nekral-guest Exp $
+#
+# Copyright 2005 by Jordi Vilalta <jvprat@xxxxxxxxx>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the terms of GPL (see COPYING).
+#
+# This module has common utilities for the various scripts of po4a
+
+=head1 NAME
+
+Locale::Po4a::Common - Common parts of the po4a scripts and utils
+
+=head1 DESCRIPTION
+
+Locale::Po4a::Common contains common parts of the po4a scripts and some useful
+functions used along the other modules.
+
+=cut
+
+package Locale::Po4a::Common;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Exporter);
+@EXPORT = qw(wrap_msg wrap_mod wrap_ref_mod textdomain gettext dgettext);
+
+use 5.006;
+use strict;
+use warnings;
+
+BEGIN {
+    if (eval { require Text::WrapI18N }) {
+    
+        # Don't bother determining the wrap column if we cannot wrap.
+        my $col=$ENV{COLUMNS};
+        if (!defined $col && -t STDOUT) {
+            my @term=eval "use Term::ReadKey; Term::ReadKey::GetTerminalSize()";
+            $col=$term[0] if (!$@);
+            # If GetTerminalSize() failed we will fallback to a safe default.
+            # This can happen if Term::ReadKey is not available
+            # or this is a terminal-less build or such strange condition.
+        }
+        $col=76 if (!defined $col);
+        
+        eval ' use Text::WrapI18N qw($columns);
+               $columns = $col;
+             ';
+       
+        eval ' sub wrapi18n($$$) { Text::WrapI18N::wrap($_[0],$_[1],$_[2]) } '
+    } else {
+    
+        # If we cannot wrap, well, that's too bad. Survive anyway.
+        eval ' sub wrapi18n($$$) { $_[0].$_[2] } '
+    }
+}
+
+sub min($$) {
+    return $_[0] < $_[1] ? $_[0] : $_[1];
+}
+
+=head1 FUNCTIONS
+
+=head2 Showing output messages
+
+=over
+
+=item 
+
+show_version($)
+
+Shows the current version of the script, and a short copyright message. It
+takes the name of the script as an argument.
+
+=cut
+
+sub show_version {
+    my $name = shift;
+
+    print sprintf(gettext(
+	"%s version %s.\n".
+	"written by Martin Quinson and Denis Barbier.\n\n".
+	"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n".
+	"This is free software; see source code for copying\n".
+	"conditions. There is NO warranty; not even for\n".
+	"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+	), $name, $Locale::Po4a::TransTractor::VERSION)."\n";
+}
+
+=item 
+
+wrap_msg($@)
+
+This function displays a message the same way than sprintf() does, but wraps
+the result so that they look nice on the terminal.
+
+=cut
+
+sub wrap_msg($@) {
+    my $msg = shift;
+    my @args = @_;
+
+    return wrapi18n("", "", sprintf($msg, @args))."\n";
+}
+
+=item 
+
+wrap_mod($$@)
+
+This function works like wrap_msg(), but it takes a module name as the first
+argument, and leaves a space at the left of the message.
+
+=cut
+
+sub wrap_mod($$@) {
+    my ($mod, $msg) = (shift, shift);
+    my @args = @_;
+
+    $mod .= ": ";
+    my $spaces = " " x min(length($mod), 15);
+    return wrapi18n($mod, $spaces, sprintf($msg, @args))."\n";
+}
+
+=item 
+
+wrap_ref_mod($$$@)
+
+This function works like wrap_msg(), but it takes a file:line reference as the
+first argument, a module name as the second one, and leaves a space at the left
+of the message.
+
+=back
+
+=cut
+
+sub wrap_ref_mod($$$@) {
+    my ($ref, $mod, $msg) = (shift, shift, shift);
+    my @args = @_;
+
+    if (!$mod) {
+	# If we don't get a module name, show the message like wrap_mod does
+	return wrap_mod($ref, $msg, @args);
+    } else {
+	$ref .= ": ";
+	my $spaces = " " x min(length($ref), 15);
+	$msg = "$ref($mod)\n$msg";
+	return wrapi18n("", $spaces, sprintf($msg, @args))."\n";
+    }
+}
+
+=head2 Wrappers for other modules
+
+=over 
+
+=item 
+
+Locale::Gettext
+
+When the Locale::Gettext module cannot be loaded, this module provide dummy
+(empty) implementation of the following functions. In that case, po4a
+messages won't get translated but the program will continue to work.
+
+If Locale::gettext is present, this wrapper also calls
+setlocale(LC_MESSAGES, "") so callers don't depend on the POSIX module
+either.
+
+=over
+
+=item 
+
+bindtextdomain($$)
+
+=item 
+
+textdomain($)
+
+=item 
+
+gettext($)
+
+=item 
+
+dgettext($$)
+
+=back
+
+=back
+
+=cut
+
+BEGIN {
+    if (eval { require Locale::gettext }) {
+       import Locale::gettext;
+       use POSIX;
+       setlocale(LC_MESSAGES, '');
+    } else {
+       eval '
+           sub bindtextdomain($$) { }
+           sub textdomain($) { }
+           sub gettext($) { shift }
+           sub dgettext($$) { return $_[1] }
+       '
+    }
+}
+
+
+=cut
+
+1;
+__END__
+
+=head1 AUTHORS
+
+ Jordi Vilalta <jvprat@xxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2005 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut

Added: po4a/lib/Locale/Po4a/Debconf.pm
===================================================================
--- po4a/lib/Locale/Po4a/Debconf.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Debconf.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,219 @@
+#!/usr/bin/perl -w
+
+# Po4a::Debconf.pm
+# 
+# extract and translate translatable strings from debconf templates
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Debconf - Convert debconf templates from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Debconf is a module to help the translation of the debconf
+templates into other [human] languages.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+NONE.
+
+=head1 STATUS OF THIS MODULE
+
+Not tested. 
+
+
+DO NOT USE THIS MODULE TO PRODUCE TEMPLATES. It's only good to extract data.
+
+
+=cut
+
+# Note that the following works. It may help to write a multi-translate
+
+# sub toto {
+#     do shift;
+# }
+# toto({print "ok"});
+
+
+package Locale::Po4a::Debconf;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+
+
+sub initialize {}
+
+sub parse {
+    my $self = shift;
+    
+    my ($line,$lref);
+        
+    my ($field, $value, $extended,$ref,$type)=('', '', '', '','');
+    my $verb = 0; # whether we are in verbatim mode
+
+    my $escape = sub {
+	my $str=shift;
+	$str =~ s/"/\\"/g;
+	return $str;
+    };
+    
+    # function in charge of pushing the accumulated material to output
+    my $handle_field = sub {
+	my $field=shift;
+	my $value=shift;
+	my $extended=shift;
+	my $ref = shift;
+	my $type = shift;
+
+	$field =~ s/^(_*)(.*)$/$2/;
+	my $undercount = length($1) || 0; # number of _ leading the field name
+	
+	# Only one leading _: regular translated field
+	if ($undercount == 1) {
+	    
+	    # the untranslated field
+	    $self->pushline("$field: $value"); 
+	    map {$self->pushline(' '.($_||'.'))} split (/\n/,$extended);
+	    
+	    
+	    my $eval='$self->pushline("'.$field.'[FIXME:LANGCODE.ENCODING]: "'; # what to multi-eval
+	    $eval .= '.$self->translate("'.$escape->($value)."\",\"$ref\",\"$type/$field\",wrap=>1)".'."\n".'."\n";
+	    
+	    my $count = 0;
+	    foreach my $para (split(/\n\n/, $extended)) {
+		my $wrap = 1;
+		if ($para =~ /(^|\n)\s/m) {
+		    $wrap = 0;
+		}
+		$eval .= ($count?'.':'');
+		$count ++;
+		$eval .= '$self->translate("'.$escape->($para)."\",\"$ref\",\"$type/$field\[$count\]\",wrap=>$wrap)"."\n";
+	    }
+	    
+	    $eval .= ")\n";
+	    print STDERR $eval if $self->debug();
+	    eval $eval;
+	    print STDERR "XXXXXXXXXXXXXXXXX\n" if $self->debug();
+	    
+	    
+	# two leading _: split on coma and multi-translate each part. No extended value.
+	} elsif ($undercount == 2) {
+	    $self->pushline("$field: $value"); # the untranslated field
+	    
+	    my $eval='$self->pushline("'.$field.'FIXME[LANGCODE]: "'; # what to multi-eval
+	    
+	    my $first = 1;
+	    for my $part (split(/(?<!\\), */, $value, 0))
+	    {
+		$part =~ s/\\,/,/g;
+		$eval .= ($first?'':'.", "').'.$self->translate("'.$escape->($part)."\",\"$ref\",\"$type/$field chunk\",wrap=>1)";
+		$first = 0;
+	    }
+	    $eval .= ")\n";
+	    
+	    print $eval if $self->debug();
+	    eval $eval;
+	    
+	# no leading _: don't touch it
+	} else {
+	    $self->pushline("$field: $value");
+	    map {$self->pushline(' '.($_||'.'))} split (/\n/,$extended);
+	}
+    };
+    
+    # main loop
+    ($line,$lref)=$self->shiftline();
+    
+    while (defined($line)) {
+       	# a new field (within a stanza)
+	if ($line=~/^([-_.A-Za-z0-9]*):\s?(.*)/) {
+	    
+	    $handle_field->($field, $value, $extended, $ref,$type); # deal with previously accumulated
+	    ($field, $value, $extended,$verb)=('', '', '', 0);
+
+	    $field=$1;
+	    $value=$2;
+	    $value=~s/\s*$//;
+	    $extended='';
+	    $ref=$lref;
+	    
+	    $type = $value if $field eq 'Type';
+	    
+	    die wrap_mod("po4a::debconf", dgettext("po4a", "Translated field in master document: %s"), $field)
+	      if $field =~ m/-/;
+	    
+	# paragraph separator within extended value    
+	} elsif ($line=~/^\s\.$/) {
+	    $extended.="\n\n";
+	
+	# continuation of extended value
+	} elsif ($line=~/^\s(.*)/) {
+	    
+	    my $bit=$1;
+	    $verb = 1 if ($bit =~ m/^\s/);
+	    
+	    $bit=~s/\s*$//;
+	    
+	    $extended .= ($verb ? "\n" : ' ') if length $extended && $extended !~ /[\n ]$/;
+	    $extended .= $bit.($verb ? "\n" : "");
+	    
+	# this may be an empty line closing the stanza, a comment or even a parse error (if file not DebConf-clean).
+	} else {
+	
+	    $handle_field->($field, $value, $extended, $ref,$type);
+	    ($field, $value, $extended,$verb)=('', '', '', 0);
+
+	    $self->pushline($line);
+	    
+	}
+	 
+	($line,$lref)=$self->shiftline();
+    }
+    
+    $handle_field->($field, $value, $extended, $ref,$type); 
+}
+
+1;
+
+=head1 AUTHORS
+
+This module is loosely inspired from both po-debconf and debconf code. The
+adaptation for po4a was done by:
+
+ Martin Quinson (mquinson#debian.org)
+
+=head1 COPYRIGHT AND LICENSE
+
+ Copyright 2005 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).

Added: po4a/lib/Locale/Po4a/Dia.pm
===================================================================
--- po4a/lib/Locale/Po4a/Dia.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Dia.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,111 @@
+#!/usr/bin/perl
+
+# Po4a::Dia.pm 
+# 
+# extract and translate translatable strings from Dia diagrams.
+# 
+# This code extracts plain text from string tags on uncompressed Dia
+# diagrams.
+#
+# Copyright (c) 2004 by Jordi Vilalta  <jvprat@xxxxxxxxx>
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Dia - Convert uncompressed Dia diagrams from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Dia is a module to help the translation of diagrams in the
+uncompressed Dia format into other [human] languages.
+
+You can get Dia (the graphical editor for these diagrams) from:
+  http://www.gnome.org/projects/dia/
+
+=head1 TRANSLATING WITH PO4A::DIA
+
+This module only translates uncompressed Dia diagrams.  You can save your
+uncompressed diagrams with Dia itself, unchecking the "Compress diagram
+files" at the "Save Diagram" dialog.
+
+Another way is to uncompress the dia files from command line with:
+  gunzip < original.dia > uncompressed.dia
+
+=head1 STATUS OF THIS MODULE
+
+This module is fully functional, as it relies in the L<Locale::Po4a::Xml>
+module. This only defines the translatable tags (E<lt>dia:stringE<gt>), and
+filters the internal strings (the content of the E<lt>dia:diagramdataE<gt>
+tag), not interesting for translation.
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)>, L<Locale::Po4a::Xml(3pm)>.
+
+=head1 AUTHORS
+
+ Jordi Vilalta <jvprat@xxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2004 by Jordi Vilalta  <jvprat@xxxxxxxxx>
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut
+
+package Locale::Po4a::Dia;
+
+use 5.006;
+use strict;
+use warnings;
+
+use Locale::Po4a::Xml;
+
+use vars qw(@ISA);
+@ISA = qw(Locale::Po4a::Xml);
+
+sub initialize {
+	my $self = shift;
+	my %options = @_;
+
+	$self->SUPER::initialize(%options);
+	$self->{options}{'tagsonly'}=1;
+	$self->{options}{'nostrip'}=1;
+	$self->{options}{'tags'}.=' <dia:string>';
+	$self->treat_options;
+}
+
+sub found_string {
+	my ($self,$text,$ref,$options)=@_;
+
+	#We skip the paper type string
+	if ( $self->get_path() !~ /<dia:diagramdata>/ ) {
+		$text =~ /^#(.*)#$/s;
+		$text = "#".$self->translate($1,$ref,"String",
+			'wrap'=>$self->{options}{'wrap'})."#";
+	}
+
+	return $text;
+}

Added: po4a/lib/Locale/Po4a/Docbook.pm
===================================================================
--- po4a/lib/Locale/Po4a/Docbook.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Docbook.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,244 @@
+#!/usr/bin/perl
+
+# Po4a::Docbook.pm 
+# 
+# extract and translate translatable strings from Docbook XML documents.
+# 
+# This code extracts plain text from tags and attributes on Docbook XML
+# documents.
+#
+# Copyright (c) 2004 by Jordi Vilalta  <jvprat@xxxxxxxxx>
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Docbook - Convert Docbook XML documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Docbook is a module to help the translation of DocBook XML 
+documents into other [human] languages.
+
+Please note that this module is still under heavy development, and not 
+distributed in official po4a release since we don't feel it to be mature 
+enough. If you insist on trying, check the CVS out.
+
+=head1 STATUS OF THIS MODULE
+
+This module is fully functional, as it relies in the L<Locale::Po4a::Xml>
+module. This only defines the translatable tags and attributes.
+
+The only known issue is that it doesn't handle entities yet, and this includes
+the file inclusion entities, but you can translate most of those files alone
+(except the typical entities files), and it's usually better to maintain them
+separated.
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)>, L<Locale::Po4a::Xml(3pm)>.
+
+=head1 AUTHORS
+
+ Jordi Vilalta <jvprat@xxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2004 by Jordi Vilalta  <jvprat@xxxxxxxxx>
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut
+
+package Locale::Po4a::Docbook;
+
+use 5.006;
+use strict;
+use warnings;
+
+use Locale::Po4a::Xml;
+
+use vars qw(@ISA);
+@ISA = qw(Locale::Po4a::Xml);
+
+sub initialize {
+	my $self = shift;
+	my %options = @_;
+
+	$self->SUPER::initialize(%options);
+	$self->{options}{'tagsonly'}=1;
+	$self->{options}{'wrap'}=1;
+	$self->{options}{'doctype'}=$self->{options}{'doctype'} || 'docbook xml';
+	$self->{options}{'tags'} .= '
+		<abbrev>
+		<acronym>
+		<arg>
+		<artheader>
+		<attribution>
+		<citetitle>
+		<computeroutput>
+		<date>
+		<entry>
+		<figure>
+		<glosssee>
+		<glossseealso>
+		<glossterm>
+		<holder>
+		<member>
+		<msgaud>
+		<msglevel>
+		<msgorig>
+		<option>
+		<orgname>
+		<para>
+		<phrase>
+		<pubdate>
+		<publishername>
+		<primary>
+		W<programlisting>
+		<prompt>
+		<quote>
+		<refclass>
+		<refdescriptor>
+		<refmiscinfo>
+		<refname>
+		<refpurpose>
+		<releaseinfo>
+		<remark>
+		<replaceable>
+		<revnumber>
+		W<screen>
+		<screeninfo>
+		<seg>
+		<segtitle>
+		<simpara>
+		<subtitle>
+		<synopfragmentref>
+		<term>
+		<title>
+		<titleabbrev>
+		<userinput>';
+	$self->{options}{'inline'} .= '
+		<action>
+		<affiliation>
+		<anchor>
+		<application>
+		<arg>
+		<author>
+		<authorinitials>
+		<command>
+		<citation>
+		<citerefentry>
+		<citetitle>
+		<classname>
+		<co>
+		<computeroutput>
+		<constant>
+		<corpauthor>
+		<database>
+		<email>
+		<emphasis>
+		<envar>
+		<errorcode>
+		<errorname>
+		<errortext>
+		<errortype>
+		<exceptionname>
+		<filename>
+		<firstname>
+		<firstterm>
+		<footnote>
+		<footnoteref>
+		<foreignphrase>
+		<function>
+		<glossterm>
+		<guibutton>
+		<guiicon>
+		<guilabel>
+		<guimenu>
+		<guimenuitem>
+		<guisubmenu>
+		<hardware>
+		<indexterm>
+		<informalexample>
+		<inlineequation>
+		<inlinegraphic>
+		<inlinemediaobject>
+		<interface>
+		<interfacename>
+		<keycap>
+		<keycode>
+		<keycombo>
+		<keysym>
+		<link>
+		<literal>
+		<manvolnum>
+		<markup>
+		<medialabel>
+		<menuchoice>
+		<methodname>
+		<modespec>
+		<mousebutton>
+		<nonterminal>
+		<olink>
+		<ooclass>
+		<ooexception>
+		<oointerface>
+		<optional>
+		<othercredit>
+		<parameter>
+		<personname>
+		<phrase>
+		<productname>
+		<productnumber>
+		<prompt>
+		<property>
+		<quote>
+		<refentrytitle>
+		<replaceable>
+		<remark>
+		<returnvalue>
+		<revhistory>
+		<sgmltag>
+		<sidebar>
+		<structfield>
+		<structname>
+		<subscript>
+		<superscript>
+		<surname>
+		<symbol>
+		<systemitem>
+		<token>
+		<trademark>
+		<type>
+		<ulink>
+		<userinput>
+		<varname>
+		<wordasword>
+		<xref>
+		<year>';
+	$self->{options}{'attributes'}.='
+		lang';
+
+	$self->treat_options;
+}

Added: po4a/lib/Locale/Po4a/Guide.pm
===================================================================
--- po4a/lib/Locale/Po4a/Guide.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Guide.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,150 @@
+#!/usr/bin/perl
+
+# Po4a::Guide.pm 
+# 
+# extract and translate translatable strings from Guide XML documents.
+# 
+# This code extracts plain text from tags and attributes on Guide XML
+# documents.
+#
+# Copyright (c) 2004 by Jordi Vilalta  <jvprat@xxxxxxxxx>
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Guide - Convert Guide XML documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Guide is a module to help in the translation of the Gentoo
+Linux documentation in the Guide XML format into other [human] languages.
+
+This format is documented here: http://www.gentoo.org/doc/en/xml-guide.xml
+
+=head1 STATUS OF THIS MODULE
+
+This module is fully functional, as it relies in the L<Locale::Po4a::Xml>
+module. This only defines the translatable tags and attributes.
+
+The only known issue is that it doesn't include files with the <include
+href="..."> tag, but you can translate all those files alone, and it's usually
+better to have them separated.
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)>, L<Locale::Po4a::Xml(3pm)>.
+
+=head1 AUTHORS
+
+ Jordi Vilalta <jvprat@xxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2004 by Jordi Vilalta  <jvprat@xxxxxxxxx>
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut
+
+package Locale::Po4a::Guide;
+
+use 5.006;
+use strict;
+use warnings;
+
+use Locale::Po4a::Xml;
+
+use vars qw(@ISA);
+@ISA = qw(Locale::Po4a::Xml);
+
+sub initialize {
+	my $self = shift;
+	my %options = @_;
+
+#TODO: <include href="..."> includes a file
+	$self->SUPER::initialize(%options);
+	$self->{options}{'tagsonly'}=1;
+	$self->{options}{'tags'}.='
+		w<abstract>
+		<author>
+		<b>
+		<brite>
+		<c>
+		<codenote>
+		<comment>
+		<const>
+		<date>
+		w<dd>
+		w<dt>
+		<e>
+		<i>
+		<ident>
+		w<impo>
+		<keyword>
+		w<li>
+		<mail>
+		w<note>
+		w<p>
+		<path>
+		W<pre>
+		<stmt>
+		<sub>
+		w<subtitle>
+		w<summary>
+		<sup>
+		w<th>
+		w<ti>
+		w<title>
+		<uri>
+		<var>
+		<version>
+		w<warn>';
+	$self->{options}{'attributes'}.='
+		<author>title
+		<figure>caption
+		<figure>link
+		<figure>short
+		<guide>lang
+		<guide>link
+		<p>by
+		<pre>caption';
+	$self->{options}{'inline'}.='
+		<b>
+		<brite>
+		<c>
+		<const>
+		<e>
+		<i>
+		<ident>
+		<img>
+		<keyword>
+		<mail>
+		<path>
+		<stmt>
+		<sub>
+		<sup>
+		<uri>
+		<var>';
+	$self->treat_options;
+}

Added: po4a/lib/Locale/Po4a/Html.pm
===================================================================
--- po4a/lib/Locale/Po4a/Html.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Html.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,216 @@
+#!/usr/bin/perl
+
+# Po4a::Html.pm 
+# 
+# extract and translate translatable strings from a html document.
+# 
+# This code extracts plain text between html tags and some "alt" or
+# "title" attributes.
+#
+# Copyright (c) 2003 by Laurent Hausermann  <laurent@xxxxxxxxxxxxxx>
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Html - Convert html documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Html is a module to help the translation of documentation in
+the HTML format into other [human] languages.
+
+Please note that this module is not distributed with the main po4a archive
+because we don't feel it mature enough for that. If you insist on using it
+anyway, check it from the CVS out.
+
+=cut
+
+package Locale::Po4a::Html;
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw(new initialize);
+
+use Locale::Po4a::TransTractor;
+
+use strict;
+use warnings;
+
+use HTML::TokeParser;
+
+use File::Temp;
+
+sub initialize {}
+
+sub read {
+    my ($self,$filename)=@_;
+    push @{$self->{DOCPOD}{infile}}, $filename;
+    $self->Locale::Po4a::TransTractor::read($filename);
+}
+
+sub parse {
+    my $self=shift;
+    map {$self->parse_file($_)} @{$self->{DOCPOD}{infile}};
+}
+
+#
+# Parse file and translate it
+#
+sub parse_file {
+    my ($self,$filename)=@_;
+    my $stream = HTML::TokeParser->new($filename)
+        || die "Couldn't read HTML file $filename : $!";
+
+    $stream->unbroken_text( [1] );
+    
+    my @type=();
+    NEXT : while (my $token = $stream->get_token) {
+        if($token->[0] eq 'T') {
+            my $text = $token->[1];
+            my ($pre_spaces) = ($text =~ /^(\s*)/);
+            my ($post_spaces) = ($text =~ /(\s*)$/);
+            $text = trim($text);
+            if (notranslation($text) == 1) {
+                $self->pushline( get_tag( $token ) );
+                next NEXT;
+            }
+#  FIXME : it should be useful to encode characters 
+#  in UTF8 in the po, but converting them in HTML::Entities
+#  in the doc_out, translate acts both way 
+#  so we cant do that.
+#  use HTML::Entities ();
+#  $encoded = HTML::Entities::encode($a);
+#  $decoded = HTML::Entities::decode($a);
+            #print STDERR $token->[0];
+            $self->pushline( $pre_spaces . $self->translate($text,
+                                                  "FIXME:0",
+                                                  (scalar @type ? $type[scalar @type-1]: "NOTYPE")
+                                                  ) . $post_spaces,
+                             'wrap' => 1
+                             );
+            next NEXT;
+        } elsif ($token->[0] eq 'S') {
+            push @type,$token->[1];
+            my $text =  get_tag( $token );
+            my $tag = $token->[1];
+# TODO: It would be nice to support an option to specify these
+#       (e.g. a list of tag.attribute)
+            my @trans_attr = (( $tag eq 'img' ) || ( $tag eq 'input' ) ||
+                              ( $tag eq 'area' ) || ( $tag eq 'applet'))
+                ? qw/title alt/ : qw/title/;
+            my %attr = %{$token->[2]};
+            for my $a (@trans_attr) {
+                my $content = $attr{$a};
+                if (defined $content) {
+                    $content = trim($content);
+                    my $translated = $self->translate( 
+                        $content,
+                        "FIXME:0",
+                        "${tag}_$a"
+                        );
+                    $attr{$a} = $translated;
+                }
+            }
+            my ($closing) = ( $text =~ /(\s*\/?>)/ );
+            # reconstruct the tag from scratch
+            delete $attr{'/'}; # Parser thinks closing / in XHTML is an attribute
+            $text = "<$tag";
+            $text .= " $_=\"$attr{$_}\"" foreach keys %attr;
+            $text .= $closing;
+            $self->pushline( $text );
+        } elsif ($token->[0] eq 'E') {
+            pop @type;
+            $self->pushline( get_tag( $token ) );
+        } else { 
+            $self->pushline( get_tag( $token ) );
+        }       
+    }
+}
+
+sub get_tag {
+    my $token = shift;
+    my $tag = "";
+
+    if ($token->[0] eq 'S') {
+        $tag = $token->[4];
+    }
+    if ( ($token->[0] eq 'C') || 
+         ($token->[0] eq 'D') ||
+         ($token->[0] eq 'T') ) {
+        $tag =  $token->[1];
+    }
+    if ( ($token->[0] eq 'E') || 
+         ($token->[0] eq 'PI') ) {
+        $tag =  $token->[2];
+    }
+
+    return $tag;   
+}
+
+sub trim { 
+    my $s=shift;
+    $s =~ s/\n/ /g;  # remove \n in text
+    $s =~ s/\r/ /g;  # remove \r in text
+    $s =~ s/\t/ /g;  # remove tabulations
+    $s =~ s/\s+/ /g; # remove multiple spaces
+    $s =~ s/^\s*//g; # remove leading spaces
+    $s =~ s/\s*$//g; # remove trailing spaces
+    return $s;
+} 
+
+#
+# This method says if a string must be 
+# translated or not.
+# To be improved with more test or regexp
+# Maybe there is a way to do this in TransTractor
+# for example ::^ should not be translated
+sub notranslation {
+    my $s=shift;
+    return 1 if ( ($s cmp "")   == 0);
+    return 1 if ( ($s cmp "-")  == 0);
+    return 1 if ( ($s cmp "::") == 0);
+    return 1 if ( ($s cmp ":")  == 0);
+    return 1 if ( ($s cmp ".")  == 0);
+    return 1 if ( ($s cmp "|")  == 0);
+    return 1 if ( ($s cmp '"')  == 0);
+    return 1 if ( ($s cmp "'")  == 0);
+    # don't translate entries composed of one entity
+    return 1 if ($s =~ /^&[^;]*;$/);
+    
+# don't translate entries with no letters
+# (happens with e.g.  <b>Hello</b>, <i>world</i> )
+#                                 ^^
+#                    ", " doesn't need translation
+    return 1 unless $s =~ /\w/;
+    return 0;          
+}
+
+=head1 AUTHORS
+
+ Laurent Hausermann <laurent@xxxxxxxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Laurent Hausermann <laurent@xxxxxxxxxxxxxx>
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).

Added: po4a/lib/Locale/Po4a/Ini.pm
===================================================================
--- po4a/lib/Locale/Po4a/Ini.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Ini.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,118 @@
+# Locale::Po4a::Ini -- Convert ini files to PO file, for translation.
+# $Id: Ini.pm,v 1.2 2006-08-23 19:30:30 nekral-guest Exp $
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the terms of GPL (see COPYING).
+#
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+use Locale::Po4a::TransTractor qw(process new);
+use Locale::Po4a::Common;
+
+package Locale::Po4a::Ini;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+
+use vars qw(@ISA @EXPORT $AUTOLOAD);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+my $debug=0;
+
+sub initialize {}
+
+
+sub parse {
+	my $self=shift;
+	my ($line,$ref);
+	my $par;
+
+	LINE:
+	($line,$ref)=$self->shiftline();
+
+	while (defined($line)) {
+		chomp($line);
+		print STDERR  "begin\n" if $debug;
+
+		if ($line =~ /\"/) {
+			print STDERR  "Start of line containing \".\n" if $debug;
+			# Text before the first quote
+			$line =~ m/(^[^"\r\n]*")/;
+			my $pre_text = $1;
+			print STDERR  "  PreText=".$pre_text."\n" if $debug;
+			# The text for translation
+			$line =~ m/("[^\r\n]*")/;
+			my $quoted_text = $1;
+			print STDERR  "  QuotedText=".$quoted_text."\n" if $debug;
+			# Text after last quote
+			$line =~ m/("[^"\n]*$)/;
+			my $post_text = $1;
+			print STDERR  "  PostText=".$post_text."\n" if $debug;
+			# Remove starting and ending quotes from the translation text, if any
+			$quoted_text =~ s/^"//g;
+			$quoted_text =~ s/"$//g;
+			# Translate the string it
+			$par = $self->translate($quoted_text, $ref);
+			# Escape the \n characters
+			$par =~ s/\n/\\n/g;
+			# Now push the result
+			$self->pushline($pre_text.$par.$post_text."\n");
+			print STDERR  "End of line containing \".\n" if $debug;
+		}
+		else
+		{
+			print STDERR "Other stuff\n" if $debug;
+			$self->pushline("$line\n");
+		}
+		# Reinit the loop
+		($line,$ref)=$self->shiftline();
+	}
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Locale::Po4a::Ini - Convert ini files from/to PO files
+
+=head1 DESCRIPTION
+
+Locale::Po4a::Ini is a module to help the translation of INI files into other
+[human] languages.
+
+The module searches for lines of the following format and extracts the quoted
+text:
+
+identificator="text than can be translated"
+
+NOTE: If the text is not quoted, it will be ignored.
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)>.
+
+=head1 AUTHORS
+
+ Razvan Rusu <rrusu@xxxxxxxxxxxxxxx>
+ Costin Stroie <cstroie@xxxxxxxxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006 by BitDefender
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut

Added: po4a/lib/Locale/Po4a/KernelHelp.pm
===================================================================
--- po4a/lib/Locale/Po4a/KernelHelp.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/KernelHelp.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,172 @@
+# Locale::Po4a::Pod -- Convert POD data to PO file, for translation.
+# $Id: KernelHelp.pm,v 1.13 2005-05-30 07:15:19 mquinson Exp $
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the terms of GPL (see COPYING).
+#
+# This module converts POD to PO file, so that it becomes possible to 
+# translate POD formatted documentation. See gettext documentation for
+# more info about PO files.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+use Pod::Parser;
+use Locale::Po4a::TransTractor qw(process new);
+use Locale::Po4a::Common;
+
+package Locale::Po4a::KernelHelp;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+
+use vars qw(@ISA @EXPORT $AUTOLOAD);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw(); # new process write read writepo readpo);
+
+my $debug=0;
+
+sub initialize {}
+
+sub parse {
+    my $self=shift;
+    my ($line,$ref);
+    my $paragraph=""; # Buffer where we put the paragraph while building
+    my ($status)=0; # Syntax of KH is:
+                    #   description<nl>variable<nl>help text<nl><nl>
+                    # Status will be:
+                    #   0             1            2        3   0
+
+    my ($desc,$variable);
+    
+  LINE:
+    ($line,$ref)=$self->shiftline();
+    
+    while (defined($line)) {
+	chomp($line);
+	print STDERR "status=$status;Seen >>$line<<:" if $debug;
+
+	if ($line =~ /^\#/) {
+	    print STDERR "comment.\n" if $debug;
+	    $self->pushline("$line\n");
+	} elsif ($status == 0) {
+	    if ($line =~ /\S/) {
+		print STDERR "short desc.\n" if $debug;
+		$desc=$line;
+		$status ++;
+	    } else {
+		print STDERR "empty line.\n" if $debug;
+		$self->pushline("$line\n");
+	    }
+	} elsif ($status == 1) {
+	    print STDERR "var name.\n" if $debug;
+	    $variable=$line;
+	    $status++;
+
+	    $self->pushline($self->translate($desc,$ref,"desc_$variable").
+			    "\n$variable\n");
+
+	} elsif ($status == 2) {
+	    $line =~ s/^  //;
+	    if ($line =~ /\S/) {
+		print STDERR "paragraph line.\n" if $debug;
+		$paragraph .= $line."\n";
+	    } else {
+		print STDERR "end of paragraph.\n" if $debug;
+		$status++;
+		$paragraph=$self->translate($paragraph,
+					    $ref,
+					    "helptxt_$variable");
+		$paragraph =~ s/^/  /gm;
+		$self->pushline("$paragraph\n");
+		$paragraph ="";
+	    }
+	} elsif ($status == 3) {
+	    if ($line =~ s/^  //) {
+		if ($line =~ /\S/) {
+		    print "begin of paragraph.\n" if $debug;
+		    $paragraph = $line."\n";
+		    $status--;
+		} else {
+		    print "end of config option.\n" if $debug;
+		    $status=0;
+		    $self->pushline("\n");
+		}	    
+	    } else {
+		$self->unshiftline($line,$ref);
+		$status=0;
+	    }
+	} else {
+	    die wrap_ref_mod($ref, "po4a::kernelhelp", gettext("Syntax error"));
+	}
+
+    	# Reinit the loop
+	($line,$ref)=$self->shiftline();
+    }
+}
+
+sub docheader {
+    return <<EOT;
+#
+#        *****************************************************
+#        *           GENERATED FILE, DO NOT EDIT             * 
+#        * THIS IS NO SOURCE FILE, BUT RESULT OF COMPILATION *
+#        *****************************************************
+#
+# This file was generated by po4a(7). Do not store it (in cvs, for example),
+# but store the po file used as source file by pod-translate. 
+#
+# In fact, consider this as a binary, and the po file as a regular .c file:
+# If the po get lost, keeping this translation up-to-date will be harder.
+#
+EOT
+}
+1;
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Locale::Po4a::KernelHelp - Convert kernel configuration help from/to PO files
+
+=head1 DESCRIPTION
+
+Locale::Po4a::KernelHelp is a module to help the translation of
+documentation for the Linux kernel configuration options into other [human]
+languages.
+
+=head1 STATUS OF THIS MODULE
+
+This module is just written, and needs more tests. Most of the needed work
+will concern the tools used to parse this file (and configure the kernel),
+so that they accept to read the documentation from another (translated)
+file.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)>,
+L<Locale::Po4a::Man(3pm)>,
+L<Locale::Po4a::Pod(3pm)>,
+
+=head1 AUTHORS
+
+ Denis Barbier <barbier@xxxxxxxxxxx>
+ Martin Quinson (mquinson#debian.org)
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2002 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut

Added: po4a/lib/Locale/Po4a/LaTeX.pm
===================================================================
--- po4a/lib/Locale/Po4a/LaTeX.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/LaTeX.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,399 @@
+#!/usr/bin/perl -w
+
+# Copyright (c) 2004, 2005 by Nicolas FRANヌOIS <nicolas.francois@xxxxxxxxxxxxxxx>
+#
+# This file is part of po4a.
+#
+# This program 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 program 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 po4a; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::LaTeX - Convert LaTeX documents and derivates from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::LaTeX is a module to help the translation of LaTeX documents into
+other [human] languages. It can also be used as a base to build modules for
+LaTeX-based documents.
+
+This module contains the definitions of common LaTeX commands and
+environments.
+
+See the L<Locale::Po4a::TeX(3pm)|Locale::Po4a::TeX> manpage for the list
+of recognized options.
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>,
+L<Locale::Po4a::TransTractor(3pm)|Locale::Po4a::TransTractor>,
+L<Locale::Po4a::TeX(3pm)|Locale::Po4a::TeX>.
+
+=head1 AUTHORS
+
+ Nicolas Fran輟is <nicolas.francois@xxxxxxxxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2004, 2005 by Nicolas FRANヌOIS <nicolas.francois@xxxxxxxxxxxxxxx>.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see COPYING file).
+
+=cut
+
+package Locale::Po4a::LaTeX;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION= $Locale::Po4a::TeX::VERSION;
+@ISA= qw(Locale::Po4a::TeX);
+@EXPORT= qw();
+
+use Locale::Po4a::TeX;
+use subs qw(&generic_command
+            &parse_definition_file
+            &register_generic_command
+            &register_generic_environment);
+*parse_definition_file         = \&Locale::Po4a::TeX::parse_definition_file;
+*generic_command               = \&Locale::Po4a::TeX::generic_command;
+*register_generic_command      = \&Locale::Po4a::TeX::register_generic_command;
+*register_generic_environment  = \&Locale::Po4a::TeX::register_generic_environment;
+use vars qw($RE_ESCAPE            $ESCAPE
+            $no_wrap_environments
+            %commands             %environments
+            %separated_command    %separated_environment
+            %command_parameters   %environment_parameters
+            %env_separators
+            @exclude_include);
+*RE_ESCAPE                = \$Locale::Po4a::TeX::RE_ESCAPE;
+*ESCAPE                   = \$Locale::Po4a::TeX::ESCAPE;
+*no_wrap_environments     = \$Locale::Po4a::TeX::no_wrap_environments;
+*commands                 = \%Locale::Po4a::TeX::commands;
+*environments             = \%Locale::Po4a::TeX::environments;
+*separated_command        = \%Locale::Po4a::TeX::separated_command;
+*separated_environment    = \%Locale::Po4a::TeX::separated_environment;
+*env_separators           = \%Locale::Po4a::TeX::env_separators;
+*exclude_include          = \@Locale::Po4a::TeX::exclude_include;
+*command_parameters       = \%Locale::Po4a::TeX::command_parameters;
+*environment_parameters   = \%Locale::Po4a::TeX::environment_parameters;
+
+
+# documentclass:
+# Only read the documentclass in order to find some po4a directives.
+# FIXME: The documentclass could contain translatable strings.
+# Maybe it should be implemented as \include{}.
+register_generic_command("*documentclass,[]{}");
+# We use register_generic_command to define the number and types of
+# parameters. The function is then overwritten:
+$commands{'documentclass'} = sub {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+
+    # Only try to parse the file.  We don't want to fail or parse this file
+    # if it is a standard documentclass.
+    my $name = ($args->[0] eq '[')? $args->[3]: $args->[1];
+    parse_definition_file($self, $name.".cls", 1);
+
+    my ($t,@e) = generic_command($self,$command,$variant,$args,$env,$no_wrap);
+
+    return ($t, @$env);
+};
+
+# LaTeX 2
+# I chose not to translate files, counters, lengths
+register_generic_command("*addcontentsline,{}{}{_}");
+register_generic_command("address,{_}");           # lines are seperated by \\
+register_generic_command("*addtocontents,{}{_}");
+register_generic_command("*addtocounter,{}{}");
+register_generic_command("*addtolength,{}{}");
+register_generic_command("*addvspace,{}");
+register_generic_command("alph,{}");               # another language may not want this alphabet
+register_generic_command("arabic,{}");             # another language may not want an arabic numbering
+register_generic_command("*author,{_}");           # authors are separated by \and
+register_generic_command("bibitem,[]{}");
+register_generic_command("*bibliographystyle,{}"); # BibTeX
+register_generic_command("*bibliography,{}");      # BibTeX
+register_generic_command("*centerline,{_}");
+register_generic_command("*caption,[]{_}");
+register_generic_command("cc,{_}");
+register_generic_command("circle,[]{}");
+register_generic_command("cite,[_]{}");
+register_generic_command("cline,{}");
+register_generic_command("closing,{_}");
+register_generic_command("dashbox,{}");            # followed by a (w,h) argument
+register_generic_command("date,{_}");
+register_generic_command("*enlargethispage,{}");
+register_generic_command("ensuremath,{_}");
+register_generic_command("*fbox,{_}");
+register_generic_command("fnsymbol,{}");
+register_generic_command("*footnote,[]{_}");
+register_generic_command("*footnotemark,[]");
+register_generic_command("*footnotetext,[]{_}");
+register_generic_command("frac,{_}{_}");
+register_generic_command("*frame,{_}");
+register_generic_command("*framebox,[][]{_}");     # There is another form in picture environment
+register_generic_command("*hbox,{}");
+register_generic_command("*hspace,[]{}");
+register_generic_command("*hyphenation,{_}");      # Translators may wish to add/remove words
+register_generic_command("*include,{}");
+#register_generic_command("includeonly,{}");       # should not be supported for now
+register_generic_command("*index,{_}");
+register_generic_command("*input,{}");
+register_generic_command("*item,[_]");
+register_generic_command("*label,{}");
+register_generic_command("lefteqn,{_}");
+register_generic_command("line,");                 # The first argument is (x,y)
+register_generic_command("*linebreak,[]");
+register_generic_command("linethickness,{}");
+register_generic_command("location,{_}");
+register_generic_command("makebox,[][]{_}");       # There's another form in picture environment
+register_generic_command("makelabels,{}");
+register_generic_command("*markboth,[]{_}{_}");
+register_generic_command("*markright,{_}");
+register_generic_command("mathcal,{_}");
+register_generic_command("mathop,{_}");
+register_generic_command("mbox,{_}");
+register_generic_command("multicolumn,{}{}{_}");
+register_generic_command("multiput,");             # The first arguments are (x,y)(dx,dy)
+register_generic_command("name,{_}");
+register_generic_command("*newcommand,{}[][]{_}");
+register_generic_command("*newcounter,{}[]");
+register_generic_command("*newenvironment,{}[]{_}{_}");
+register_generic_command("*newfont,{}{}");
+register_generic_command("*newlength,{}");
+register_generic_command("*newsavebox,{}");
+register_generic_command("*newtheorem,{}{_}");     # Two forms, the optionnal arg is not the first one
+register_generic_command("nocite,{}");
+register_generic_command("nolinebreak,[]");
+register_generic_command("*nopagebreak,[]");
+register_generic_command("opening,{_}");
+register_generic_command("oval,");                 # The first argument is (w,h)
+register_generic_command("overbrace,{_}");
+register_generic_command("overline,{_}");
+register_generic_command("*pagebreak,[]");
+register_generic_command("*pagenumbering,{_}");
+register_generic_command("pageref,{}");
+register_generic_command("*pagestyle,{}");
+register_generic_command("*parbox,[][][]{}{_}");
+register_generic_command("providecommand,{}[][]{_}");
+register_generic_command("put,");                  # The first argument is (x,y)
+register_generic_command("raisebox,{}[][]{_}");
+register_generic_command("ref,{}");
+register_generic_command("*refstepcounter,{}");
+register_generic_command("*renewcommand,{}[][]{_}");
+register_generic_command("*renewenvironment,{}[]{_}{_}");
+register_generic_command("roman,{}");              # another language may not want a roman numbering
+register_generic_command("rule,[]{}{}");
+register_generic_command("savebox,{}");            # Optional arguments in 2nd & 3rd position
+register_generic_command("sbox,{}{_}");
+register_generic_command("*setcounter,{}{}");
+register_generic_command("*setlength,{}{}");
+register_generic_command("*settodepth,{}{_}");
+register_generic_command("*settoheight,{}{_}");
+register_generic_command("*settowidth,{}{_}");
+register_generic_command("shortstack,[]{_}");
+register_generic_command("signature,{_}");
+register_generic_command("sqrt,[_]{_}");
+register_generic_command("stackrel,{_}{_}");
+register_generic_command("stepcounter,{}");
+register_generic_command("*subfigure,[_]{_}");
+register_generic_command("symbol,{_}");
+register_generic_command("telephone,{_}");
+register_generic_command("thanks,{_}");
+register_generic_command("*thispagestyle,{}");
+register_generic_command("*title,{_}");
+register_generic_command("typeout,{_}");
+register_generic_command("typein,[]{_}");
+register_generic_command("twocolumn,[_]");
+register_generic_command("underbrace,{_}");
+register_generic_command("underline,{_}");
+register_generic_command("*usebox,{}");
+register_generic_command("usecounter,{}");
+register_generic_command("*usepackage,[]{}");
+register_generic_command("value,{}");
+register_generic_command("vector,");             # The first argument is (x,y)
+register_generic_command("vphantom,{_}");
+register_generic_command("*vspace,[]{}");
+register_generic_command("*vbox,{}");
+register_generic_command("*vcenter,{}");
+
+register_generic_command("*part,[_]{_}");
+register_generic_command("*chapter,[_]{_}");
+register_generic_command("*section,[_]{_}");
+register_generic_command("*subsection,[_]{_}");
+register_generic_command("*subsubsection,[_]{_}");
+register_generic_command("*paragraph,[_]{_}");
+register_generic_command("*subparagraph,[_]{_}");
+
+register_generic_command("textrm,{_}");
+register_generic_command("textit,{_}");
+register_generic_command("emph,{_}");
+register_generic_command("textmd,{_}");
+register_generic_command("textbf,{_}");
+register_generic_command("textup,{_}");
+register_generic_command("textsl,{_}");
+register_generic_command("textsf,{_}");
+register_generic_command("textsc,{_}");
+register_generic_command("texttt,{_}");
+register_generic_command("textnormal,{_}");
+register_generic_command("mathrm,{_}");
+register_generic_command("mathsf,{_}");
+register_generic_command("mathtt,{_}");
+register_generic_command("mathit,{_}");
+register_generic_command("mathnormal,{_}");
+register_generic_command("mathversion,{}");
+
+register_generic_command("*contentspage,");
+register_generic_command("*tablelistpage,");
+register_generic_command("*figurepage,");
+
+register_generic_command("*PassOptionsToPackage,{}{}");
+
+register_generic_command("*ifthenelse,{}{_}{_}");
+
+# graphics
+register_generic_command("*includegraphics,[]{}");
+register_generic_command("*graphicspath,{}");
+register_generic_command("*resizebox,{}{}{_}");
+register_generic_command("*scalebox,{}{_}");
+register_generic_command("*rotatebox,{}{_}");
+
+# url
+register_generic_command("UrlFont,{}");
+register_generic_command("*urlstyle,{}");
+
+# hyperref
+register_generic_command("href,{}{_}");            # 1:URL
+register_generic_command("url,{}");                # URL
+register_generic_command("nolinkurl,{}");          # URL
+register_generic_command("hyperbaseurl,{}");       # URL
+register_generic_command("hyperimage,{}");         # URL
+register_generic_command("hyperdef,{}{}{_}");      # 1:category, 2:name
+register_generic_command("hyperref,{}{}{}{_}");    # 1:URL, 2:category, 3:name
+register_generic_command("hyperlink,{}{_}");       # 1:name
+register_generic_command("*hypersetup,{_}");
+register_generic_command("hypertarget,{}{_}");     # 1:name
+register_generic_command("autoref,{}");            # 1:label
+
+register_generic_command("*selectlanguage,{}");
+
+# color
+register_generic_command("*definecolor,{}{}{}");
+register_generic_command("*textcolor,{}{_}");
+register_generic_command("*colorbox,{}{_}");
+register_generic_command("*fcolorbox,{}{}{_}");
+register_generic_command("*pagecolor,{_}");
+register_generic_command("*color,{_}");
+
+# equations/theorems
+register_generic_command("*qedhere,");
+register_generic_command("*qedsymbol,");
+register_generic_command("*theoremstyle,{}");
+register_generic_command("*proclaim,{_}");
+register_generic_command("*endproclaim,");
+register_generic_command("*shoveleft,{_}");
+register_generic_command("*shoveright,{_}");
+
+# commands without arguments. This is better than untranslated or
+# translate_joined because the number of arguments will be checked.
+foreach (qw(a *appendix *backmatter backslash *baselineskip *baselinestretch bf
+            *bigskip boldmath cal cdots *centering *cleardoublepage *clearpage
+            ddots dotfill em flushbottom *footnotesize frenchspacing
+            *frontmatter *glossary *hfill *hline hrulefill huge Huge indent it
+            kill large Large LARGE ldots left linewidth listoffigures
+            listoftables *mainmatter *makeatletter *makeglossary *makeindex
+            *maketitle *medskip *newline *newpage noindent nonumber *normalsize
+            not *null *onecolumn *par parindent *parskip *printindex protect ps
+            pushtabs *qquad *quad raggedbottom raggedleft raggedright right rm
+            sc scriptsize sf sl small *smallskip *startbreaks *stopbreaks
+            *tableofcontents textwidth textheight tiny today tt unitlength
+            vdots verb *vfill *vline *fussy *sloppy
+
+            aleph hbar imath jmath ell wp Re Im prime nabla surd angle forall
+            exists partial infty triangle Box Diamond flat natural sharp
+            clubsuit diamondsuit heartsuit spadesuit dag ddag S P copyright
+            pounds Delta ASCII
+
+            rmfamily itshape mdseries bfseries upshape slshape sffamily scshape
+            ttfamily *normalfont width height depth totalheight
+
+            *fboxsep *fboxrule
+            *itemi *itemii *itemiii *itemiv
+            *theitemi *theitemii *theitemiii *theitemiv)) {
+    register_generic_command("$_,");
+}
+
+
+
+# standard environments.
+# FIXME: All these definitions should be re-checked
+foreach (qw(abstract align align* cases center description displaymath document enumerate
+            eqnarray eqnarray* equation equation* flushleft flushright footnotesize itemize
+            letter lrbox multline multline* proof quotation quote
+            sloppypar tabbing theorem titlepage
+            trivlist verbatim verbatim* verse wrapfigure)) {
+    register_generic_environment("$_,");
+}
+register_generic_environment("tabular,[]{}");
+register_generic_environment("tabular*,{}{}");
+register_generic_environment("multicols,{}");
+register_generic_environment("list,{_}{}");
+register_generic_environment("array,[]{}");
+register_generic_environment("figure,[]");
+register_generic_environment("minipage,[]{}");
+register_generic_environment("picture,{}{}");
+register_generic_environment("table,[]");
+register_generic_environment("thebibliography,{_}");
+
+
+# Commands and environments with separators.
+
+# & is the cell separator, \\ is the line separator
+# '\' is escaped twice
+$env_separators{'array'} =
+  $env_separators{'tabular'} = "(?:&|\\\\\\\\)";
+
+$env_separators{'trivlist'} =
+  $env_separators{'list'} =
+  $env_separators{'description'} =
+  $env_separators{'enumerate'} =
+  $env_separators{'itemize'} = "\\\\item";
+
+$env_separators{'thebibliography'} = "\\\\bibitem";
+
+$env_separators{'displaymath'} =
+  $env_separators{'eqnarray'} =
+  $env_separators{'eqnarray*'} =
+  $env_separators{'flushleft'} =
+  $env_separators{'flushright'} =
+  $env_separators{'center'} =
+  $env_separators{'author{#1}'} =
+  $env_separators{'title{#1}'} = "\\\\\\\\";
+
+# tabbing
+
+1;

Added: po4a/lib/Locale/Po4a/Man.pm
===================================================================
--- po4a/lib/Locale/Po4a/Man.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Man.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,2486 @@
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+Locale::Po4a::Man - Convert manual pages from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Man is a module to help the translation of documentation in
+the nroff format (the language of manual pages) into other [human]
+languages.
+
+=head1 TRANSLATING WITH PO4A::MAN
+
+This module tries pretty hard to make translator's life easier. For that,
+the text presented to translators isn't a verbatim copy of the text found
+in the man page. Indeed, the cruder parts of the nroff format are hidden, so
+that translators can't mess up with them.
+
+=head2 Text wrapping
+
+Unindented paragraphs are automatically rewrapped for the translator.  This
+can lead to some minor difference in the generated output, since the
+rewrapping rules used by groff aren't very clear. For example, two spaces
+after a parenthesis are sometimes preserved, while typographic rules only
+ask to preserve the two spaces after the period sign (ok, I'm not native
+speaker, and I'm not sure of that. If you have any other information,
+you're welcome). 
+
+Anyway, the difference will only be about the position of the extra spaces
+in wrapped paragraph, and I think it's worth.
+
+=head2 Font specification
+
+The first change is about font change specifications.  In nroff, there are
+several ways to specify if a given word should be written in small, bold or
+italics. In the text to translate, there is only one way, borrowed from the
+pod (perl online documentation) format:
+
+=over
+
+=item IE<lt>textE<gt> -- italic text
+
+equivalent to \fItext\fP or ".I text"
+
+=item BE<lt>textE<gt> -- bold text
+
+equivalent to \fBtext\fP or ".B text"
+
+=item RE<lt>textE<gt> -- roman text
+
+equivalent to \fRtext\fP
+
+=item CWE<lt>textE<gt> -- constant width text
+
+equivalent to \f(CWtext\fP or ".CW text"
+
+=back
+
+Remark: The CW face is not available for all groff devices. It is not
+recommended to use it. It is provided for your convenience.
+
+=head2 Automatic characters transliteration
+
+Po4a automatically transliterate some characters to ease the translation
+or the review of the translation.
+Here is the list of the transliterations:
+
+=over
+
+=item hyphens
+
+Hyphens (-) and minus signs (\-) in man pages are all transliterated
+as simple dashes (-) in the PO file.  Then all dash are transliterated into
+roff minus signs (\-) when the translation is inserted into the output
+document.
+
+Translators can force an hyphen by using the roff glyph '\[hy]' in their
+translations.
+
+=item non-breaking spaces
+
+Translators can use non-breaking spaces in their translations.  These
+non-breaking spaces (0xA0 in latin1) will be transliterated into a roff
+non-breaking space ('\ ').
+
+=item quotes transliterations
+
+`` and '' are respectively tranliterated into \*(lq and \*(rq.
+
+To avoid these transliterations, translators can insert a zero width roff
+character (i.e., using `\&` or '\&' respectively).
+
+=back
+
+=head2 Putting 'E<lt>' and 'E<gt>' in translations
+
+Since these chars are used to delimit parts under font modification, you
+can't use them verbatim. Use EE<lt>ltE<gt> and EE<lt>gtE<gt> instead (as in
+pod, one more time).
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+These are this module's particular options:
+
+=over
+
+=item B<debug>
+
+Activate debugging for some internal mechanisms of this module.
+Use the source to see which parts can be debugged.
+
+=item B<verbose>
+
+Increase verbosity.
+
+=item B<groff_code>
+
+This option permits to change the behavior of the module when it encounter
+a .de, .ie or .if section. It can take the following values:
+
+=over
+
+=item I<fail>
+
+This is the default value.
+The module will fail when a .de, .ie or .if section is encountered.
+
+=item I<verbatim>
+
+Indicates that the .de, .ie or .if sections must be copied as is
+from the original to the translated document.
+
+=item I<translate>
+
+Indicates that the .de, .ie or .if sections will be proposed for the
+translation.
+You should only use this option if a translatable string is
+contained in one of these section. Otherwise, I<verbatim>
+should be preferred.
+
+=back
+
+=item B<generated>
+
+This option specifies that the file was generated, and that po4a should not
+try to detect if the man pages was generated from another format.
+This permits to use po4a on generated man pages.
+This option does not take any argument.
+
+=item B<mdoc>
+
+This option is only useful for mdoc pages.
+
+It selects a stricter support of the mdoc format by telling po4a not to
+translate the 'NAME' section.
+mdoc pages whose 'NAME' section is translated won't generate any header of
+footer.
+
+According to the groff_mdoc page, the NAME, SYNOPSIS and DESCRIPTION
+sections are mandatory.
+There are no known issues with translated SYNOPSIS or DESCRIPTION section,
+but you can also specify these sections this way:
+ -o mdoc=NAME,SYNOPSIS,DESCRIPTION
+
+This mdoc issue can also be solved with an addendum like this one:
+ PO4A-HEADER:mode=before;position=^.Dd
+ .TH DOCUMENT_TITLE 1 "Month day, year" OS "Section Name"
+
+
+=back
+
+The following options permit to specify the behavior of a new macro
+(defined with a .de request), or of a macro not supported by po4a.
+They take in argument a coma separated list of macros.
+For example:
+
+ -o noarg=FO,OB,AR -o translate_joined=BA,ZQ,UX
+
+Note: if a macro is not supported by po4a and if you consider that it is a
+standard roff macro, you should submit it to the po4a development team.
+
+=over
+
+=item B<untranslated>
+
+B<untranslated> indicates that this macro (at its arguments) don't have to
+be translated.
+
+=item B<noarg>
+
+B<noarg> is like B<untranslated>, except that po4a will verify that no
+argument is added to this macro.
+
+=item B<translate_joined>
+
+B<translate_joined> indicates that po4a must propose to translate the
+arguments of the macro.
+
+=item B<translate_each>
+
+With B<translate_each>, the arguments will also be proposed for the
+translation, except that each one will be translated separately.
+
+=item B<no_wrap>
+
+This option takes in argument a list of coma-separated couples
+I<begin>:I<end>, where I<begin> and I<end> are commands that delimit
+the begin and end of a section that should not be rewrapped.
+
+Note: no test is done to ensure that an I<end> command matches its
+I<begin> command; any ending command stop the no_wrap mode.
+If you have a I<begin> (respectively I<end>) macro that has no I<end>
+(respectively I<begin>), you can specify an existing I<end> (like fi) or
+I<begin> (like nf) as a counterpart.
+These macros (and their arguments) wont be translated.
+
+=item B<inline>
+
+This option specifies a list of coma-separated macros that must
+not split the current paragraph. The string to translate will then contain
+I<foo E<lt>.bar baz quxE<gt> quux>, where I<bar> is the command that
+should be inlined, and I<baz qux> its arguments.
+
+=item B<unknown_macros>
+
+This option indicates how po4a should behave when an unknown macro is found.
+By default, po4a fails with a warning.
+It can take the following values: I<failed> (the default value),
+I<untranslated>, I<noarg>, I<translate_joined>, I<translate_each>.
+
+=back
+
+=head1 AUTHORING MAN PAGES COMPLIANT WITH PO4A::MAN
+
+This module is still very limited, and will always be, because it's not a
+real nroff interpreter. It would be possible to do a real nroff
+interpreter, to allow authors to use all the existing macros, or even to
+define new ones in their pages, but we didn't want to. It would be too
+difficult, and we thought it wasn't necessary. We do think that if
+manpages' authors want to see their productions translated, they may have to
+adapt to ease the work of translators.
+
+So, the man parser implemented in po4a have some known limitations we are
+not really inclined to correct, and which will constitute some pitfalls
+you'll have to avoid if you want to see translators taking care of your
+documentation.
+
+=head2 Don't program in nroff
+
+nroff is a complete programming language, with macro definition,
+conditionals and so on. Since this parser isn't a fully featured nroff
+interpreter, it will fail on pages using these facilities (There are about
+200 such pages on my box).
+
+=head2 Use the plain macro set
+
+There are still some macros which are not supported by po4a::man. This is
+only because I failed to find any documentation about them. Here is the
+list of unsupported macros used on my box. Note that this list isn't
+exhaustive since the program fails on the first encountered unsupported
+macro. If you have any information about some of these macros, I'll
+happily add support for them. Because of these macros, about 250 pages on
+my box are inaccessible to po4a::man.
+
+ ..               ."              .AT             .b              .bank
+ .BE              ..br            .Bu             .BUGS           .BY
+ .ce              .dbmmanage      .do                             .En
+ .EP              .EX             .Fi             .hw             .i
+ .Id              .l              .LO             .mf             
+ .N               .na             .NF             .nh             .nl
+ .Nm              .ns             .NXR            .OPTIONS        .PB
+ .pp              .PR             .PRE            .PU             .REq
+ .RH              .rn             .S<             .sh             .SI
+ .splitfont       .Sx             .T              .TF             .The
+ .TT              .UC             .ul             .Vb             .zZ
+
+=head2 Conclusion
+
+To summarise this section, keep simple, and don't try to be clever while
+authoring your man pages. A lot of things are possible in nroff, and not
+supported by this parser. For example, don't try to mess with \c to
+interrupt the text processing (like 40 pages on my box do). Or, be sure to
+put the macro arguments on the same line that the macro itself. I know that
+it's valid in nroff, but would complicate too much the parser to be
+handled.
+
+Of course, another possibility is to use another format, more translator
+friendly (like pod using po4a::pod, or one of the xml familly like sgml),
+but thanks to po4a::man it isn't needed anymore. That being said, if the
+source format of your documentation is pod, or xml, it may be clever to
+translate the source format and not this generated one. In most cases,
+po4a::man will detect generated pages and issue a warning. It will even
+refuse to process Pod generated pages, because those pages are perfectly
+handled by po4a::pod, and because their nroff counterpart defines a lot of
+new macros I didn't want to write support for. On my box, 1432 of the 4323
+pages are generated from pod and will be ignored by po4a::man.
+
+In most cases, po4a::man will detect the problem and refuse to process the
+page, issuing an adapted message. In some rare cases, the program will
+complete without warning, but the output will be wrong. Such cases are
+called "bugs" ;) If you encounter such case, be sure to report this, along
+with a fix when possible...
+
+=head1 STATUS OF THIS MODULE
+
+This module can be used for most of the existing man pages.
+
+Some tests are regularly run on Linux boxes:
+
+=over 4
+
+=item *
+
+one third of the pages are refused because they were generated from
+another format supported by po4a (e.g. pod or SGML).
+
+=item *
+
+10% of the remaining pages are rejected with an error (e.g. a
+groff macro is not supported).
+
+=item *
+
+Then, less than 1% of the pages are accepted silently by po4a, but with
+significant issues (i.e. missing words, or new words inserted)
+
+=item *
+
+The other pages are usually handled without differences more important
+than spacing differences or line rewrapped (font issues in less than 10% of
+the processed pages).
+
+=back
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)>,
+L<Locale::Po4a::Pod(3pm)>.
+
+=head1 AUTHORS
+
+ Denis Barbier <barbier@xxxxxxxxxxx>
+ Nicolas Fran輟is <nicolas.francois@xxxxxxxxxxxxxxx>
+ Martin Quinson (mquinson#debian.org)
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2002, 2003, 2004, 2005, 2006 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut
+
+package Locale::Po4a::Man;
+use DynaLoader;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor DynaLoader);
+@EXPORT = qw();#  new initialize);
+
+# Try to use a C extension if present.
+eval('bootstrap Locale::Po4a::Man "0.30"');
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+
+use File::Spec;
+use Getopt::Std;
+
+my %macro; # hash of known macro, with parsing sub. See end of this file
+my %default_macro; # The default known macros, when no options are used.
+
+# A font start by \f and is followed either by
+# [.*] - a font name within brackets (e.g. [P], [A_USER_FONT])
+# (..  - a parenthesis followed by two char (e.g. "(CW")
+# .    - a single char (e.g. B, I, R, P, 1, 2, 3, 4, etc.)
+my $FONT_RE = "\\\\f(?:\\[[^\\]]*\\]|\\(..|[^\\(\\[])";
+
+# Variable used to identify non breaking spaces.
+# These non breaking spaces are used to ease the parsing, and a
+# translator can use them in her translation (and they will be translated
+# into the groff non-breaking space.
+my $nbs;
+
+# Indicate if the page uses the mdoc macros
+my $mdoc_mode = 0;
+
+my $unknown_macros = undef;
+
+#########################
+#### DEBUGGING STUFF ####
+#########################
+my %debug;
+# The following debug options can be set with '-o debug=...':
+# * splitargs  see how macro args are separated
+# * pretrans   see pre-conditioning of translation
+# * postrans   see post-conditioning of translation
+# * fonts      see font modifier handling
+
+
+######## CONFIG #########
+# This variable indicates the behavior of the module when a .de, .if or
+# .ie is encountered.
+my $groff_code;
+# %no_wrap_begin and %no_wrap_end are lists of macros that respectively
+# begins and ends a no_wrap paragraph.
+# Any ending macro will end the no_wrap paragraph started by any beginning
+# macro.
+my %no_wrap_begin;
+my %no_wrap_end;
+# List of macros that should be inlined (with E<.xx ...>)
+my %inline;
+# The default list of inlined macros (when no options are used)
+my %default_inline;
+# This variable indicates whether po4a should try to detect the generated
+# files.
+my $allow_generated;
+# This hash indicates section name that should not be translated in mdoc
+# mode.
+# The groff's mdoc processor requires the NAME section, otherwise headers
+# and footers of the pages are not generated.
+# The mdoc_groff man page indicates that NAME, SYNOPSIS and DESCRIPTION
+# are mandatory.
+my %mdoc;
+sub initialize {
+    my $self = shift;
+    my %options = @_;
+
+    $self->{options}{'debug'}='';
+    $self->{options}{'verbose'}='';
+    $self->{options}{'groff_code'}='';
+    $self->{options}{'untranslated'}='';
+    $self->{options}{'noarg'}='';
+    $self->{options}{'translate_joined'}='';
+    $self->{options}{'translate_each'}='';
+    $self->{options}{'no_wrap'}='';
+    $self->{options}{'inline'}='';
+    $self->{options}{'generated'}='';
+    $self->{options}{'mdoc'}='';
+    $self->{options}{'unknown_macros'}='';
+
+    foreach my $opt (keys %options) {
+        if (defined $options{$opt}) {
+            die wrap_mod("po4a::man",
+                         dgettext("po4a", "Unknown option: %s"), $opt)
+                unless exists $self->{options}{$opt};
+            $self->{options}{$opt} = $options{$opt};
+        }
+    }
+
+    %debug = ();
+    if (defined $options{'debug'}) {
+        foreach ($options{'debug'}) {
+            $debug{$_} = 1;
+        }
+    }
+
+    $groff_code = "fail";
+    if (defined $options{'groff_code'}) {
+        unless ($options{'groff_code'} =~ m/fail|verbatim|translate/) {
+          die wrap_mod("po4a::man", dgettext("po4a",
+               "Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."));
+        }
+        $groff_code = $options{'groff_code'};
+    }
+
+    if (%default_macro) {
+        %macro = %default_macro;
+    } else {
+        %default_macro = %macro
+    }
+    if (defined $options{'untranslated'}) {
+        foreach (split(/,/, $options{'untranslated'})) {
+            $macro{$_} = \&untranslated;
+        }
+    }
+    if (defined $options{'noarg'}) {
+        foreach (split(/,/, $options{'noarg'})) {
+            $macro{$_} = \&noarg;
+        }
+    }
+    if (defined $options{'translate_joined'}) {
+        foreach (split(/,/, $options{'translate_joined'})) {
+            $macro{$_} = \&translate_joined;
+        }
+    }
+    if (defined $options{'translate_each'}) {
+        foreach (split(/,/, $options{'translate_each'})) {
+            $macro{$_} = \&translate_each;
+        }
+    }
+
+    %no_wrap_begin = (
+        'nf' => 1,
+        'EX' => 1,
+        'EQ' => 1
+    );
+    %no_wrap_end = (
+        'fi' => 1,
+        'EE' => 1,
+        'EN' => 1
+    );
+    if (defined $options{'no_wrap'}) {
+        foreach (split(/,/, $options{'no_wrap'})) {
+            if ($_ =~ m/^(.*):(.*)$/) {
+               $no_wrap_begin{$1} = 1;
+               $no_wrap_end{$2} = 1;
+            } else {
+                die wrap_mod("po4a::man", dgettext("po4a","The no_wrap parameters must be a set of comma-separated begin:end couples.\n"));
+            }
+        }
+    }
+
+    if (%default_inline) {
+        %inline = %default_inline;
+    } else {
+        %default_inline = %inline
+    }
+    if (defined $options{'inline'}) {
+        foreach (split(/,/, $options{'inline'})) {
+            $inline{$_} = 1;
+        }
+    }
+
+    $allow_generated = 0;
+    if (defined $options{'generated'}) {
+        $allow_generated = 1;
+    }
+
+    %mdoc = ();
+    if (defined $options{'mdoc'}) {
+        if ($options{'mdoc'} eq 1) {
+            $mdoc{"NAME"} = 1;
+        } else {
+            foreach (split(/,/, $options{'mdoc'})) {
+                $mdoc{$_} = 1;
+            }
+        }
+    }
+
+    $unknown_macros = undef;
+    if (defined $options{'unknown_macros'}) {
+        if ($options{'unknown_macros'} eq "failed") {
+            $unknown_macros = undef;
+        } elsif ($options{'unknown_macros'} eq "untranslated") {
+            $unknown_macros = \&untranslated;
+        } elsif ($options{'unknown_macros'} eq "noarg") {
+            $unknown_macros = \&noarg;
+        } elsif ($options{'unknown_macros'} eq "translate_joined") {
+            $unknown_macros = \&translate_joined;
+        } elsif ($options{'unknown_macros'} eq "translate_each") {
+            $unknown_macros = \&translate_each;
+        } else {
+            die wrap_mod("po4a::man", dgettext("po4a",
+                "Invalid 'unknown_macros' value. Must be one of:\n").
+                "failed untranslated noarg translate_joined translate_each\n");
+        }
+    }
+}
+
+my @comments = ();
+my @next_comments = ();
+# This function returns the next line of the document being parsed
+# (and its reference).
+# It overload the Transtractor shiftline to handle:
+#   - font requests (.B, .I, .BR, .BI, ...)
+#     because these requests can be present in a paragraph (handled
+#     in the parse subroutine), or in argument (on the next line)
+#     of some other request (for example .TP)
+#   - font size requests (.SM,.SB) (not done yet)
+#   - input escape (\ at the end of a line)
+sub shiftline {
+    my $self = shift;
+    # call Transtractor's shiftline
+NEW_LINE:
+    my ($line,$ref) = $self->SUPER::shiftline();
+
+    if (!defined $line) {
+        # end of file
+        return ($line,$ref);
+    }
+
+    # Do as few treatments as possible with the .de, .ie and .if sections
+    if ($line =~ /^\.\s*(if|ie|de)/) {
+        chomp $line;
+        return ($line,$ref);
+    }
+
+    # Handle some escapes
+    #   * reduce the number of \ in macros
+    if ($line =~ /^\\?[.']/) {
+        # The first backslash is consumed while the macro is read.
+        $line =~ s/\\\\/\\/g;
+    }
+    #   * \\ is equivalent to \e, which is less error prone for the rest
+    #     of the module (e.g. when searching for a font : \f, whe don't
+    #     want to match \\f)
+    $line =~ s/\\\\/\\e/g;
+    #   * \. is just a dot (this can even be use to introduce a macro)
+    $line =~ s/\\\././g;
+
+    chomp $line;
+    if ($line =~ m/^(.*?)(?:(?<!\\)\\(["#])(.*))$/) {
+        my ($l, $t, $c) = ($1, $2, $3);
+        $line = $l;
+        unless ($allow_generated) {
+        # Check for comments indicating that the file was generated.
+        if ($c =~ /Pod::Man/) {
+            warn wrap_mod("po4a::man", dgettext("po4a", "This file was generated with Pod::Man. Translate the pod file with the pod module of po4a."));
+            exit 254;
+        } elsif ($c =~ /generated by help2man/)    {
+            warn wrap_mod("po4a::man", dgettext("po4a", "This file was generated with help2man. Translate the source file with the regular gettext."));
+        } elsif ($c =~ /with docbook-to-man/)      {
+            warn wrap_mod("po4a::man", dgettext("po4a", "This file was generated with docbook-to-man. Translate the source file with the sgml module of po4a."));
+            exit 254;
+        } elsif ($c =~ /generated by docbook2man/) {
+            warn wrap_mod("po4a::man", dgettext("po4a", "This file was generated with docbook2man. Translate the source file with the sgml module of po4a."));
+            exit 254;
+        } elsif ($c =~ /created with latex2man/)   {
+            warn wrap_mod("po4a::man", dgettext("po4a",
+                "This file was generated with %s. ".
+                "You should translate the source file, but continuing anyway."
+                ),"latex2man");
+        } elsif ($c =~ /Generated by db2man.xsl/)  { 
+            warn wrap_mod("po4a::man", dgettext("po4a","This file was generated with db2man.xsl. Translate the source file with the xml module of po4a."));
+            exit 254;
+        } elsif ($c =~ /generated automatically by mtex2man/)  {
+            warn wrap_mod("po4a::man", dgettext("po4a",
+                "This file was generated with %s. ".
+                "You should translate the source file, but continuing anyway."
+                ),"mtex2man");
+        } elsif ($c =~ /THIS FILE HAS BEEN AUTOMATICALLY GENERATED.  DO NOT EDIT./ ||
+                 $c =~ /DO NOT EDIT/i || $c =~ /generated/i) {
+            warn wrap_mod("po4a::man", dgettext("po4a",
+                "This file contains the line '%s'. ".
+                "You should translate the source file, but continuing anyway."
+                ),$l."\\\"".$c);
+        }
+        }
+
+        if ($line =~ m/^[.']*$/) {
+            if ($c !~ m/^\s+$/) {
+                # This commentted line may be comment for the next paragraph
+                push @next_comments, $c;
+            }
+            if ($line =~ m/^[.']+$/) {
+                # those lines are ignored
+                # (empty lines are a little bit different)
+                goto NEW_LINE;
+            }
+            if ($line =~ m/^\s*$/ and $t eq "#") {
+                # Groff comments
+                goto NEW_LINE;
+            }
+        } else {
+            push @comments, $c;
+        }
+    } else {
+        # finally, we did not reach the end of the paragraph.  The comments
+        # belong to the current paragraph.
+        push @comments, @next_comments;
+        @next_comments = ();
+    }
+
+    # A .I or .B request chnage the current font
+    # and on exit, switch the font to Roman
+    # When one of these request doesn't have its argument on its line
+    # (and when we support this usage), we must keep this font request to
+    # insert it later.
+    # It is a stack of fonts to be inserted (in case a .I is followed by
+    # a .B and then followed bysome text; note that in this case,
+    # only one \fR must be inserted at the end of the text)
+    my $insert_font = "";
+    while ($line =~ /\\$/ || $line =~ /^(\.[BI])\s*$/) {
+        my ($l2,$r2)=$self->SUPER::shiftline();
+        chomp($l2);
+        if ($line =~ /^(\.[BI])\s*$/) {
+            if ($l2 =~ /^[.'][\t ]*([BI]|BI|BR|IB|IR|RB|RI)(?:[\t ]|\s*$)/) {
+                my $font = $line;
+                $font =~ s/^\.([BI])\s*$/$1/;
+                $insert_font = "\\f$font$insert_font";
+                $line = $l2;
+                $ref = $r2;
+            } elsif ($l2 =~ /^[.'][\t ]*(SH|TP|P|PP|LP)(?:[\t ]|\s*$)/) {
+                $line =~ s/^\.([BI])\s*$/$insert_font\\f$1/;
+                $self->SUPER::unshiftline($l2,$r2);
+            } elsif ($l2 =~ /^([.'][\t ]*(?:IP)[\t ]+"?)(.*)$/) {
+                # Install the font modifier into the next line
+                # after a possible quote (")
+                my $macro = $1;
+                my $arg   = $2;
+                $line =~ /^\.([BI])\s*$/;
+                $line = $macro."$insert_font\\f$1".$arg;
+                $ref = $r2;
+            } elsif ($l2 =~ /^[.']/) {
+                warn wrap_ref_mod($ref, "po4a::man", dgettext("po4a",
+                         "Font modifiers followed by a command may disturb ".
+                         "po4a.  You should either remove the font modifier ".
+                         "'%s', or integrate a \\f font modifier in the ".
+                         "following command ('%s'), but continuing anyway."
+                         ), $line, $l2);
+                $line = "PO4A-INLINE:$line:PO4A-INLINE";
+                $self->SUPER::unshiftline($l2,$r2);
+            } else {
+                # convert " to the groff's double quote glyph; it will be
+                # converted back to " in pre_trans. It is needed because
+                # otherwise, these quotes will be taken as arguments
+                # delimiters.
+                $l2 =~ s/"/\\(dq/g;
+                # append this line to the macro, with surrounding quotes, so
+                # that the line appear as an uniq argument.
+                $line .= ' "'.$l2.'"';
+            }
+        } else {
+            $line =~ s/\\$//;
+            $line .= $l2;
+        }
+    }
+    # Detect non-wrapped paragraphs
+    # This must be done before handling the .B, .RI ... font requests
+    $line =~ s/^($FONT_RE)(\s+)/$2$1/;
+
+    $line .= "\n";
+
+    # Handle font requests here
+    if ($line =~ /^[.'][\t ]*([BI]|BI|BR|IB|IR|RB|RI)(?:(?: +|\t)(.*)|)$/) {
+        my $macro = $1;
+        my $arguments = $2;
+        my @args = splitargs($ref,$arguments);
+        if ($macro eq 'B' || $macro eq 'I') {
+            # To keep the space(s), we must introduce some \&
+            @args = map { $_ =~ s/^(\s*)$/\\&$1\\&/s; $_ } @args;
+            my $arg=join(" ",@args);
+            $arg =~ s/^ +//;
+            this_macro_needs_args($macro,$ref,$arg);
+            $line = "$insert_font\\f$macro".$arg."\\fR\n";
+            $insert_font = "";
+        }
+        # .BI bold alternating with italic
+        # .BR bold/roman
+        # .IB italic/bold
+        # .IR italic/roman
+        # .RB roman/bold
+        # .RI roman/italic
+        if ($macro eq 'BI' || $macro eq 'BR' || $macro eq 'IB' || 
+            $macro eq 'IR' || $macro eq 'RB' || $macro eq 'RI'   ) {
+            # num of seen args, first letter of macro name, second one
+            my ($i,$a,$b)=(0,substr($macro,0,1),substr($macro,1));
+            $line = join("", map { $i++ % 2 ? 
+                                    "\\f$b$_" :
+                                    "\\f$a$_"
+                                 } @args)."\\fR\n";
+            if ($i eq 0) {
+                # If a .BI is used without argument, we must insert a
+                # \fI\fR. The \fR was inserted previously.
+                $line = "\\f$b$line";
+            }
+        }
+
+        if (length $insert_font) {
+            $line =~ s/\n$//;
+            $line = "$insert_font$line\\fR\n";
+        }
+
+        if ($line =~ /^(.*)\\c(\\f.)?\s*\\fR\n/) {
+            my $begin = $1;
+
+            my ($l2,$r2)=$self->SUPER::shiftline();
+            if ($l2 =~ /^[.']/) {
+                $self->SUPER::unshiftline($l2,$r2);
+            } else {
+                $l2 =~ s/\s*$//s;
+                $line = "$begin\\fR$l2\n";
+            }
+        }
+    }
+
+    return ($line,$ref);
+}
+
+# Overload Transtractor's pushline.
+# This pushline first push comments (if there are comments for the
+# current line, and the line is not empty), and then push the line.
+sub pushline {
+    my ($self, $line) = (shift, shift);
+    if ($line !~ m/^\s*$/) {
+        # add comments
+        foreach my $c (@comments) {
+            # comments are pushed (maybe at the wrong place).
+            $self->SUPER::pushline($self->r(".\\\"$c\n"));
+        }
+        @comments = ();
+    }
+
+    $self->SUPER::pushline($line);
+}
+
+# The default unshiftline from Transtractor may fail because shiftline
+# is overloaded
+sub unshiftline {
+    die wrap_mod("po4a::man", dgettext("po4a",
+	"The unshiftline is not supported for the man module. ".
+	"Please send a bug report with the groff page that generated ".
+	"this error."));
+}
+
+###############################################
+#### FUNCTION TO TRANSLATE OR NOT THE TEXT ####
+###############################################
+sub pushmacro {
+    my $self=shift;
+    if (scalar @_) { 
+	# Do quote the arguments containing spaces, as it should.
+	
+	#  but do not do so if they already contain quotes and escaped spaces
+	# For example, cdrdao(1) uses:
+	# .IP CATALOG\ "ddddddddddddd" (Here, the quote have to be displayed)
+	# Adding extra quotes as in:
+	# .IP "CATALOG\ "ddddddddddddd""
+	# results in two args: 'CATALOG\ ' and 'ddddddddddddd""'
+	$self->pushline(join(" ",map {
+		# Replace double quotes by \(dq (double quotes could be
+		# taken as an argument delimiter).
+		# Only quotes not preceded by \ are taken into account
+		# (\" introduces a comment).
+		s/(?<!\\)"/\\\(dq/g if (defined $_);
+
+		defined $_ ? (
+			length($_)?
+			    (m/([^\\] |^ )/ ? "\"$_\"" : "$_")
+			    # Quote arguments that contain a space.
+			    # (not needed for non breaknig spaces, i.e.
+			    # spaces preceded by '\')
+			    :'""' # empty argument
+		) : '' # no argument
+	    } @_)."\n");
+    } else {
+	$self->pushline("\n");
+    }
+}
+sub this_macro_needs_args {
+    my ($macroname,$ref,$args)=@_;
+    unless (length($args)) {
+	die wrap_ref_mod($ref, "po4a::man", dgettext("po4a",
+		"macro %s called without arguments. ".
+		"Even if placing the macro arguments on the next line is authorized ".
+		"by man(7), handling this would make the po4a parser too complicate. ".
+		"Please simply put the macro args on the same line."
+		), $macroname);
+    }
+}
+
+sub pre_trans {
+    my ($self,$str,$ref,$type)=@_;
+    # Preformatting, so that translators don't see 
+    # strange chars
+    my $origstr=$str;
+    print STDERR "pre_trans($str)="
+	if ($debug{'pretrans'});
+
+    # Do as few treatments as possible with the .de, .ie and .if sections
+    if (defined $self->{type} && $self->{type} =~ m/^(ie|if|de)$/) {
+        return $str;
+    }
+
+    # Note: if you want to implement \c support, the gdb man page is your playground
+    if (    not defined $self->{type}) {
+        $str =~ s/(\G|^(?:.*?)\n|^)        # Last position, or begin of a line
+                   ([ \t]*[^.'][^\n]*(?<!\\)(?:\\\\)*) # the new line, which
+                   \\c[ \t]*\n             # ends by \c and followed by a line
+                   (?![ \t]*[.'])/$1$2/sgx;# not followed by a command (.')
+    }
+    die wrap_ref_mod($ref, "po4a::man", dgettext("po4a","Escape sequence \\c encountered. This is not completely handled yet."))
+	if ($str =~ /\\c/);
+
+    $str =~ s/>/E<gt>/sg;
+    $str =~ s/</E<lt>/sg;
+    $str =~ s/EE<lt>gt>/E<gt>/g; # could be done in a smarter way?
+
+    while ($str =~ m/^(.*)PO4A-INLINE:(.*?):PO4A-INLINE(.*)$/s) {
+        my ($t1,$t2, $t3) = ($1, $2, $3);
+        $str = "$1E<$2>";
+        if ($mdoc_mode) {
+            # When a punctuation sign must be joined to an argument, mdoc
+            # permits to use such a construct:
+            # .Ar file1 , file2 , file3 ) .
+            # Here, we move the punctuation out of the E<...> tag.
+            # This is reverted in post_trans.
+            # FIXME: To be checked with the French punctuation
+            while ($str =~ m/(?<!\\) +([.,;:\)\]]) *>/s) {
+                $str =~ s/(?<!\\) +([.,;:\)\]]) *>/>$1/s;
+            }
+        }
+        if (defined $t3 and length $t3) {
+            $t3 =~ s/^\n//s;
+            $str .= "\n$t3";
+        }
+    }
+
+    # simplify the fonts for the translators
+    if (defined $self->{type} && $self->{type} =~ m/^(SH|SS)$/) {
+        set_regular("B");
+    }
+    $str = do_fonts($str, $ref);
+    if (defined $self->{type} && $self->{type} =~ m/^(SH|SS)$/) {
+        set_regular("R");
+    }
+
+    # After the simplification, the first char can be a \n.
+    # Simply push these newlines before the translation, but make sure the
+    # resulting string is not empty (or an additional line will be
+    # added).
+    if ($str =~ /^(\n+)(.+)$/s) {
+        $self->pushline($1);
+        $str = $2;
+    }
+
+    unless ($mdoc_mode) {
+    # Kill minus sign/hyphen difference.
+    # Aestetic of printed man pages may suffer, but:
+    #  * they are translator-unfriendly
+    #  * they break when using utf8 (for obscure reasons)
+    #  * they forbid the searches, since keybords don't have hyphen key
+    #  * they forbid copy/paste, since options need minus sign, not hyphen
+    $str =~ s|\\-|-|sg;
+
+    # Groff bestiary
+    $str =~ s/\\\*\(lq/``/sg;
+    $str =~ s/\\\*\(rq/''/sg;
+    $str =~ s/\\\(dq/"/sg;
+    }
+    
+    # non-breaking spaces
+    # some non-breaking spaces may have been added during the parsing
+    $str =~ s/\Q$nbs/\\ /sg;
+
+    print STDERR "$str\n" if ($debug{'pretrans'});
+    return $str;
+}
+
+sub post_trans {
+    my ($self,$str,$ref,$type,$wrap)=@_;
+    my $transstr=$str;
+
+    print STDERR "post_trans($str)="
+	if ($debug{'postrans'});
+    
+    # Do as few treatments as possible with the .de, .ie and .if sections
+    if (defined $self->{type} && $self->{type} =~ m/^(ie|if|de)$/) {
+        return $str;
+    }
+
+    unless ($mdoc_mode) {
+    # Post formatting, so that groff see the strange chars
+    $str =~ s|\\-|-|sg; # in case the translator added some of them manually
+    # change hyphens to minus signs
+    # (this shouldn't be done for \s-<number> font size modifiers)
+    # nor on .so/.mso args
+    unless (defined $self->{type} && $self->{type} =~ m/^m?so$/) {
+        my $tmp = "";
+        while ($str =~ m/^(.*?)-(.*)$/s) {
+            my $begin = $1;
+            $str = $2;
+            my $tmp2 = $tmp.$begin;
+            if (   ($begin =~ m/(?<!\\)(\\\\)*\\s$/s)
+                or ($begin =~ m/(?<!\\)(\\\\)*\\\((.|E<[gl]t>)$/s)
+                or ($tmp2 =~ m/(?<!\\)(\\\\)*\\[hCv]'([^']|(?<!\\)(\\\\)*\\')*$/)
+                or ($tmp2 =~ m/(?<!\\)(\\\\)*\\\[([^\]]|(?<!\\)(\\\\)*\\\[)*$/)
+                or ($tmp2 =~ m/(?<!\\)(\\\\)*\\\*\(.?$/)) {
+                # Do not change - to \- for
+                #  * \s-n (reduce font size)
+                #  * \(.- (a character named '.-', e.g. '<-')
+                #  * inside a \h'...'
+                #  * inside a \C'...'
+                #  * inside a \[...]
+                #  * inside a \*(..
+                #  * inside a \v'...'
+                $tmp = $tmp2."-";
+            } else {
+                $tmp = $tmp2."\\-";
+            }
+        }
+        $str = $tmp.$str;
+    }
+    }
+
+    # There must not be an end of line inside an inline macro
+    $str =~ s/(E<\.[^>]*)\n([^>]*>)/$1$2/gs;
+
+    # No . or ' on first char, or nroff will think it's a macro
+    # * at the beginning of a paragraph, add \& (zero width space) at
+    #   the beginning of the line
+    if (not defined $self->{type}) {
+        # Only do it on regular text, because
+        # his doesn't work after a TS (this macros shift
+        # lines, which may contain macros)
+        # or for the .ta arguments (e.g. .ta .5i 3i)
+        $str =~ s/^((?:
+                       (?:CW|[RBI])<
+                      |$FONT_RE
+                    )?
+                    [.']
+                   )/\\&$1/mgx;
+    } elsif ($self->{type} =~ m/^(TP)$/) {
+        # But it is also needed for some type (e.g. TP, if followed by a
+        # font macro)
+        # This regular expression is the same as above
+        $str =~ s/^((?:(?:CW|[RBI])<|$FONT_RE)?[.'])/\\&$1/mg;
+    }
+    # * degraded mode, doesn't work for the first line of a paragraph
+    $str =~ s/\n([.'])/ $1/mg;
+
+    # Change ascii non-breaking space to groff one
+    my $nbs_out = get_out_nbs($self->get_out_charset);
+    $str =~ s/\Q$nbs_out/\\ /sg if defined $nbs_out;
+    # No nbsp (said "\ " in groff on the last pos of the line, or groff adds
+    # an extra space
+    $str =~ s/\\ \n/\\ /sg;
+
+    # Make sure we compute internal sequences right.
+    # think about: B<AZE E<lt> EZA E<gt>>
+    while ($str =~ m/^(.*)(CW|[RBI])<(.*)$/s) {
+	my ($done,$rest)=($1."\\f$2",$3);
+	$done =~ s/CW$/\(CW/;
+	my $lvl=1;
+	while (length $rest && $lvl > 0) {
+	    my $first=substr($rest,0,1);
+	    if ($first eq '<') {
+		$lvl++;
+	    } elsif ($first eq '>') {
+		$lvl--;
+	    } 
+	    $done .= $first  if ($lvl > 0);
+	    $rest=substr($rest,1);
+	}
+	die wrap_ref_mod($ref||$self->{ref}, "po4a::man", dgettext("po4a","Unbalanced '<' and '>' in font modifier. Faulty message: %s"),$str)
+	    if ($lvl > 0);
+	# Return to the regular font
+	$done .= "\\fP$rest";
+	$str=$done;
+    }
+
+    while ($str =~ m/^(.*?)E<([.'][\t ]*.*?(?<!E<[gl]t))>(.*)$/s) {
+        my ($t1, $t2, $t3) = ($1,$2,$3);
+        $t1 =~ s/ +$//s;
+        $t2 =~ s/\n/ /gs;
+        if ($mdoc_mode) {
+            # restore the punctuation inside the line (see pre_trans)
+            if ($t3 =~ s/^([.,;:\)\]]+)//s) {
+                my $punctuation = $1;
+                $punctuation =~ s/([.,;:\)\]])/$1 /;
+                $t2 .= " $punctuation";
+            }
+        }
+        $t3 =~ s/^ +//s;
+        if ($wrap) {
+        # The no-wrap case should be checked
+            $t1 =~ s/\n$//s;
+        }
+        $str = $t1;
+        if (length $t1) {
+            $t1 =~ s/\n$//s;
+            $str = "$t1\n";
+        }
+        $str .= $t2;
+        if (defined $t3 and length $t3) {
+            $t3 =~ s/^\n//s;
+            $str.= "\n$t3";
+        }
+    }
+    $str =~ s/E<gt>/>/mg;
+    $str =~ s/E<lt>/</mg;
+    # Don't do that, because we'll go into trouble if previous line was .TP
+    # $str =~ s/^\\f([BI])(.*?)\\f[RP]$/\.$1 $2/mg;
+    
+    unless ($mdoc_mode) {
+        my $tmp = "";
+        while ($str =~ m/^(.*?)(``|'')(.*)$/s) {
+            $tmp .= $1;
+            my $q = $2;
+            $str = $3;
+            # There are probably many more exceptions, here are those I could
+            # detect in my manpages.
+            # \*(.'  \*(.`
+            # \*'    \*`
+            # \N'xxx'
+            if ($tmp =~ m/(?<!\\)(?:\\\\)*\\\*\($/s) {
+                $tmp .= $q;
+            } elsif (   $tmp =~ m/(?<!\\)(?:\\\\)*\\\*\(.$/s
+                     or $tmp =~ m/(?<!\\)(?:\\\\)*\\\*$/s
+                     or ($tmp =~ m/(?<!\\)(?:\\\\)*\\N'[0-9]*$/s
+                         and $q eq "''")) {
+                $q =~ m/(.)(.)/;
+                $tmp .= $1;
+                $str = $2.$str;
+            } else {
+                $q =~ s/``/\\\*\(lq/;
+                $q =~ s/''/\\\*\(rq/;
+                $tmp .= $q;
+            }
+        }
+        $str = $tmp.$str;
+    }
+    if (not defined $self->{type}) {
+        $str =~ s/ $//mg;
+    }
+
+    print STDERR "$str\n" if ($debug{'postrans'});
+    return $str;
+}
+sub translate {
+    my ($self,$str,$ref,$type) = (shift, shift, shift,shift);
+    my (%options)=@_;
+    my $origstr=$str;
+    
+    return $str unless (defined $str) && length($str);
+    return $str if ($str eq "\n");
+    # Do not translate the strings that only consist of fonts, spaces and
+    # \&. This is useful because we introduced \& in shiftline.
+    if ($str =~ m/^($FONT_RE|\s|\\&)*$/s) {
+        do_fonts($str, $ref||$self->{ref});
+        return $str;
+    }
+
+    # If a string is quoted, only translate the argument between the
+    # quotes.
+    if ($options{'wrap'} or $str !~ m/\n/s) {
+        if ($str =~ m/^\"(.*)\"$/s and $1 !~ m/(?<!\\)\"/) {
+            $str = '"'.$self->translate($1, $ref, $type, %options).'"';
+            $str =~ s/\n"$/"\n/s;
+            return $str;
+        }
+    }
+
+    $str=pre_trans($self,$str,$ref||$self->{ref},$type);
+    $options{'comment'} .= join('\n', @comments);
+    # Translate this
+    $str = $self->SUPER::translate($str,
+				   $ref||$self->{ref},
+				   $type || $self->{type},
+				   %options);
+    if ($options{'wrap'}) {
+	my (@paragraph);
+	@paragraph=split (/\n/,$str);
+	if (defined ($paragraph[0]) && $paragraph[0] eq '') {
+	    shift @paragraph;
+	}
+	$str = join("\n",@paragraph)."\n";
+    }
+    $str=post_trans($self,$str,$ref||$self->{ref},$type, $options{'wrap'});
+    return $str;
+}
+
+# shortcut
+sub t { 
+    return $_[0]->translate($_[1]);
+}
+
+# shortcut.
+# As a rule of thumb, I do not recode macro names, unless they may be
+# followed by other characters.
+sub r {
+    return $_[0]->recode_skipped_text($_[1]);
+}
+
+
+sub do_paragraph {
+    my ($self,$paragraph,$wrapped_mode) = (shift,shift,shift);
+
+    # Following needed because of 'ft' (at least, see ft macro below)
+    unless ($paragraph =~ m/\n$/s) {
+	my @paragraph = split(/\n/,$paragraph);
+
+	$paragraph .= "\n"
+	    unless scalar (@paragraph) == 1;
+    }
+
+    $self->pushline( $self->translate($paragraph,$self->{ref},"Plain text",
+				      "wrap" => ($wrapped_mode eq 'YES') ) );
+}
+
+#############################
+#### MAIN PARSE FUNCTION ####
+#############################
+sub parse{
+    my $self = shift;
+    my ($line,$ref);
+    my ($paragraph)=""; # Buffer where we put the paragraph while building
+    my $wrapped_mode='YES'; # Should we wrap the paragraph? Three possible values: 
+                            # YES: do wrap
+                            # NO: don't wrap because this paragraph contains indented lines
+                            #     this status disapear after the end of the paragraph
+                            # MACRONO: don't wrap because we saw the nf macro. It stays so 
+                            #          until the next fi macro.
+
+
+    # We want to change the non-breaking space according to the input
+    # document charset
+    $nbs = get_in_nbs($self->{TT}{'file_in_charset'});
+
+  LINE:
+    undef $self->{type};
+    ($line,$ref)=$self->shiftline();
+    
+    while (defined($line)) {
+#	print STDERR "line=$line;ref=$ref";
+	chomp($line);
+	$self->{ref}="$ref";
+#	print STDERR "LINE=$line<<\n";
+
+
+	if ($line =~ /^[.']/) {
+	    die wrap_mod("po4a::man", dgettext("po4a", "Unparsable line: %s"), $line)
+		unless ($line =~ /^([.']+\\*?)(\\["#])(.*)/ ||
+			$line =~ /^([.'])(\S*)(.*)/);
+	    my $arg1=$1;
+	    $arg1 .= $2;
+	    my $macro=$2;
+	    my $arguments=$3;
+
+	    if ($inline{$macro}) {
+		$paragraph .= "PO4A-INLINE:".$line.":PO4A-INLINE\n";
+		goto LINE;
+	    }
+
+	    # Split on spaces for arguments, but not spaces within double quotes
+	    my @args=();
+	    push @args,$arg1;
+	    if ($macro =~ /^(?:ta|TP|ie|if|de)$/) {
+		# The number of spaces may be critical for the 'ta' macro,
+		# and there is no need to split the arguments.
+		push @args, $arguments;
+	    } else {
+		push @args, splitargs($ref,$arguments);
+	    }
+
+
+	    if (length($paragraph)) {
+		do_paragraph($self,$paragraph,$wrapped_mode);
+		$paragraph="";
+		$wrapped_mode = $wrapped_mode eq 'NO' ? 'YES' : $wrapped_mode;
+	    }
+
+	    # Special case: Don't change these lines
+	    #  .\"  => comments
+	    #  .\#  => comments
+	    #  ."   => comments
+	    #  .    => empty point on the line
+	    #  .tr abcd...
+	    #       => substitution like Perl's tr/ac/bd/ on output.
+	    if ($macro eq '\\"' || $macro eq '' || $macro eq 'tr' ||
+	        $macro eq '"'   || $macro eq '\\#') {
+		$self->pushline($self->r($line)."\n");
+		goto LINE;
+	    }
+	    # Special case:
+	    #  .nf => stop wrapped mode
+	    #  .fi => wrap again
+	    if ($no_wrap_begin{$macro} or $no_wrap_end{$macro}) {
+		if ($no_wrap_end{$macro}) {
+		    $wrapped_mode='YES';
+		} else {
+		    $wrapped_mode='MACRONO';
+		}
+		$self->pushline($self->r($line)."\n");
+		goto LINE;
+	    }
+	    
+	    # SH resets the wrapping (in addition to starting a section)
+	    if ($macro eq 'SH') {
+		$wrapped_mode='YES';
+	    }
+	    
+	    unshift @args,$self;
+	    # Apply macro
+	    $self->{type}=$macro;
+
+	    if (defined ($macro{$macro})) {
+		&{$macro{$macro}}(@args);
+	    } else {
+		if (defined $unknown_macros) {
+		    &{$unknown_macros}(@args);
+		} else {
+		$self->pushline($self->r($line)."\n");
+		die wrap_ref_mod($ref, "po4a::man", dgettext("po4a",
+		    "Unknown macro '%s'. Remove it from the document, or refer to the Locale::Po4a::Man manpage to see how po4a can handle new macros."), $line);
+		}
+	    }
+
+	} elsif ($line =~ /^ +[^. ]/) {
+	    # (Lines containing only spaces are handled as empty lines)
+	    # Not a macro, but not a wrapped paragraph either
+	    $wrapped_mode = $wrapped_mode eq 'YES' ? 'NO' : $wrapped_mode;
+	    $paragraph .= $line."\n";
+	} elsif ($line =~ /^[^.].*/ && $line !~ /^ *$/) {
+	    # (Lines containing only spaces are handled latter as empty lines)
+	    if ($line =~ /^\\"/) {
+		# special case: the line is entirely a comment, keep the
+		# comment.
+		# NOTE: comment could also be found in the middle of a line.
+		# From info groff:
+		# Escape: \": Start a comment.  Everything to the end of the
+		# input line is ignored.
+		$self->pushline($self->r($line)."\n");
+		goto LINE;
+	    } elsif ($line =~ /^\\#/) {
+		# Special groff comment. Do not keep the new line
+		goto LINE;
+	    } else {
+		# Not a macro
+		# * first, try to handle some "output line continuation" (\c)
+		$paragraph =~ s/\\c *(($FONT_RE)?)\n?$/$1/s;
+		# * append the line to the current paragraph
+		$paragraph .= $line."\n";
+	    }
+	} else { #empty line, or line containing only spaces
+	    if (length($paragraph)) {
+	        do_paragraph($self,$paragraph,$wrapped_mode);
+	        $paragraph="";
+	    }
+	    $wrapped_mode = $wrapped_mode eq 'NO' ? 'YES' : $wrapped_mode;
+	    $self->pushline($line."\n");
+	}
+
+	# finally, we did not reach the end of the paragraph.  The comments
+	# belong to the current paragraph.
+	push @comments, @next_comments;
+	@next_comments = ();
+
+	# Reinit the loop
+	($line,$ref)=$self->shiftline();
+	undef $self->{type};
+    }
+
+    if (length($paragraph)) {
+	do_paragraph($self,$paragraph,$wrapped_mode);
+	$wrapped_mode = $wrapped_mode eq 'NO' ? 'YES' : $wrapped_mode;
+	$paragraph="";
+    }
+
+    # flush the last comments
+    push @comments, @next_comments;
+    @next_comments = @comments;
+    @comments = ();
+    for my $c (@next_comments) {
+	$self->pushline($self->r(".\\\"$c\n"));
+    }
+
+    # reinitialize the module
+    @next_comments = ();
+    set_regular("R");
+    set_font("R");
+    set_font("R");
+    $mdoc_mode = 0;
+} # end of main
+
+# Cache the results of get_in_nbs and get_out_nbs
+{
+    my $last_in_charset;
+    my $last_in_nbs;
+
+# get_in_nbs(charset)
+# Return the representation of a non breaking space in the input charset
+# (given in argument).
+# or PO4A:VERY_IMPROBABLE_STRING_USEDFOR_NON-BREAKING-SPACES if this
+# character doesn't exist in this charset.
+    sub get_in_nbs() {
+        my $charset = shift;
+
+        return $last_in_nbs
+            if (    defined $charset
+                and defined $last_in_charset
+                and $charset eq $last_in_charset);
+
+        my $nbs = "\xA0";
+        my $length;
+        if (defined $charset and length $charset)
+        {
+            eval ("\$length = Encode::from_to(\$nbs, \"latin-1\",
+                                              \$charset,
+                                              1)");
+        }
+        # fall back solution
+        $nbs = "PO4A:VERY_IMPROBABLE_STRING_USEDFOR_NON-BREAKING-SPACES"
+            unless defined $length;
+        $last_in_charset = $charset;
+        $last_in_nbs = $nbs;
+
+        return $last_in_nbs;
+    }
+
+    my $last_out_charset;
+    my $last_out_nbs;
+# get_out_nbs(charset)
+# Return the representation of a non breaking space in the output charset
+# (given in argument).
+# or undef if this character doesn't exist in this charset.
+    sub get_out_nbs() {
+        my $charset = shift;
+
+        return $last_out_nbs
+            if (    defined $charset
+                and defined $last_out_charset
+                and $charset eq $last_out_charset);
+
+        my $nbs = "\xA0";
+        my $length;
+        if (defined $charset and length $charset)
+        {
+            eval ("\$length = Encode::from_to(\$nbs, \"latin-1\",
+                                              \$charset,
+                                              1)");
+        }
+        # fall back solution
+        undef $nbs
+            unless defined $length;
+        $last_out_charset = $charset;
+        $last_out_nbs = $nbs;
+
+        return $last_out_nbs;
+    }
+
+}
+
+# We can't push the header in the first line of the document, as in the
+# other module, because the first line may contain indications on how the
+# man page must be processed.
+sub docheader {
+    return "";
+}
+
+# The header is pushed just before the .TH macro (this macro is mandatory
+# and must be specified at the begining (there may be macro definitions
+# before).
+sub push_docheader {
+    my $self = shift;
+    $self->pushline(
+".\\\"*******************************************************************\n".
+".\\\"\n".
+".\\\" This file was generated with po4a. Translate the source file.\n".
+".\\\"\n".
+".\\\"*******************************************************************\n"
+    );
+}
+
+# Split request's arguments.
+# see:
+#     info groff --index-search "Request Arguments"
+sub splitargs {
+    my ($ref,$arguments) = ($_[0],$_[1]);
+    my @args=();
+    my $buffer="";
+    my $escaped=0;
+    if (! defined $arguments) {
+        return @args;
+    }
+    # change non-breaking space before to ensure that split does what we want
+    # We change them back before pushing into the arguments. The one which
+    # will be translated will have the same change again (in pre_trans and
+    # post_trans), but the ones which won't get translated are not changed
+    # anymore. Let's play safe.
+    $arguments =~ s/\\ /$nbs/g;
+    $arguments =~ s/^ +//;
+    $arguments =~ s/\\&"/\\(dq/g;
+    foreach my $elem (split (/ +/,$arguments)) {
+        print STDERR ">>Seen $elem(buffer=$buffer;esc=$escaped)\n"
+            if ($debug{'splitargs'});
+
+        if (length $buffer && !($elem=~ /\\$/) ) {
+            $buffer .= " ".$elem;
+            print STDERR "Continuation of a quote\n"
+                if ($debug{'splitargs'});
+            # Inside a quoted argument, "" indicates a double quote
+            while ($buffer =~ s/^"([^"]*?)""/"$1\\(dq/) {}
+            # print "buffer=$buffer.\n";
+            if ($buffer =~ m/^"(.*)"(.+)$/) {
+                print STDERR "End of quote, with stuff after it\n"
+                    if ($debug{'splitargs'});
+                my ($a,$b)=($1,$2);
+                $a =~ s/\Q$nbs/\\ /g;
+                $b =~ s/\Q$nbs/\\ /g;
+                push @args,$a;
+                push @args,$b;
+                $buffer = "";
+            } elsif ($buffer =~ m/^"(.*)"$/) {
+                print STDERR "End of a quote\n"
+                    if ($debug{'splitargs'});
+                my $a = $1;
+                $a =~ s/\Q$nbs/\\ /g;
+                push @args,$a;
+                $buffer = "";
+            } elsif ($escaped) {
+                print STDERR "End of an escaped sequence\n"
+                    if ($debug{'splitargs'});
+                unless(length($elem)){
+                    die wrap_ref_mod($ref, "po4a::man", dgettext("po4a",
+                        "Escaped space at the end of macro arg. With high probability, it won't do the trick with po4a (because of wrapping). You may want to remove it and use the .nf/.fi groff macro to control the wrapping."));
+                }
+                $buffer =~ s/\Q$nbs/\\ /g;
+                push @args,$buffer;
+                $buffer = "";
+                $escaped = 0;
+            } else {
+                print STDERR "Quotes: Oops\n"
+                    if ($debug{'splitargs'});
+            }
+        } elsif ($elem =~ m/^"(.*?(?<!")(?:"")*)"(?!")(.+)$/) {
+            print STDERR "Quoted: quote without space\n"
+                if ($debug{'splitargs'});
+            my $a = $1;
+            my $b = $2;
+            $a =~ s/""/\\(dq/g;
+            $a =~ s/\Q$nbs/\\ /g;
+            $b =~ s/""/\\(dq/g;
+            $b =~ s/\Q$nbs/\\ /g;
+            push @args,$a;
+            push @args,$b;
+        } elsif ($elem =~ m/^"(.*)"$/) {
+            print STDERR "Quoted, no space\n"
+                if ($debug{'splitargs'});
+            my $a = $1;
+            # Inside a quoted argument, "" indicates a double quote
+            $a =~ s/""/\\(dq/g;
+            $a =~ s/\Q$nbs/\\ /g;
+            push @args,$a;
+        } elsif ($elem =~ m/^"/) { #") {
+            print STDERR "Begin of a quoting arg\n"
+                if ($debug{'splitargs'});
+            $buffer=$elem;
+        } elsif ($elem =~ m/^(.*)\\$/) {
+            print STDERR "escaped space after $1\n"
+                if ($debug{'splitargs'});
+            # escaped space
+            $buffer = (length($buffer)?$buffer:'').$1." ";
+            $escaped = 1;
+        } else {
+            print STDERR "Unquoted arg, nothing to declare\n"
+                if ($debug{'splitargs'});
+            $elem =~ s/\Q$nbs/\\ /g;
+            push @args,$elem;
+            $buffer="";
+        }
+    }
+    if (length($buffer)) {
+        # Inside a quoted argument, "" indicates a double quote
+        while ($buffer =~ s/^"([^"]*?)""/"$1\\(dq/) {}
+        $buffer=~ s/"//g;
+        $buffer =~ s/\Q$nbs/\\ /g;
+        push @args,$buffer;
+    }
+    if ($debug{'splitargs'}) {
+        print STDERR "ARGS=";
+        map { print STDERR "$_^"} @args;
+        print STDERR "\n";
+    }
+
+    return @args;
+}
+
+{
+    #static variables
+    # font stack.
+    #     Keep track of the current font (because a font modifier can
+    #     stay open at the end of a paragraph), and the previous font (to
+    #     handle \fP)
+    my $current_font  = "R";
+    my $previous_font = "R";
+    # $regular_font describe the "Regular" font, which is the font used
+    # when there is no font modifier.
+    # For example, .SS use a Bold font, and thus in
+    # .SS This is a \fRsubsection\fB header
+    # the \fR and \fB font modifiers have to be kept.
+    my $regular_font  = "R";
+
+    # Set the regular font
+    # It takes the regular font in argument (when no argument is provided,
+    # it uses "R").
+    sub set_regular {
+        print STDERR "set_regular('@_')\n"
+            if ($debug{'fonts'});
+        set_font(@_);
+        $regular_font = $current_font;
+    }
+
+    sub set_font {
+        print STDERR "set_font('@_')\n"
+            if ($debug{'fonts'});
+        my $saved_previous = $previous_font;
+        $previous_font = $current_font;
+
+        if (! defined $_[0]) {
+            $current_font = "R";
+        } elsif ($_[0] =~ /^(P|\[\]|\[P\])/) {
+            $current_font = $saved_previous;
+        } elsif (length($_[0]) == 1) {
+            $current_font = $_[0];
+        } elsif (length($_[0]) == 2) {
+            $current_font = "($_[0]";
+        } else {
+            $current_font = "[$_[0]]";
+        }
+        print STDERR "r:'$regular_font', p:'$previous_font', c:'$current_font'\n"
+            if ($debug{'fonts'});
+    }
+
+    sub do_fonts {
+        # one argument: a string
+        my ($str, $ref) = (shift, shift);
+        print STDERR "do_fonts('$str', '$ref')="
+            if ($debug{'fonts'});
+
+        # restore the font stack
+        $str = "\\f$previous_font\\f$current_font".$str;
+        # In order to be able to split on /\\f/, without problem with
+        # \\foo, groff backslash (\\) are changed to the (equivalent)
+        # form: \e (this should be done in shiftline).
+        my @array1=split(/\\f/, $str);
+
+        $str = shift @array1;  # The first element is always empty because
+                               # the $current_font was put at the beginning
+        # $last_font indicates the last font that was appended to the buffer.
+        # It differ from $current_font because concecutive identical fonts
+        # are not written in the buffer.
+        my $last_font=$regular_font;
+
+        foreach my $elem (@array1) {
+            # Do not touch the fonts in the inline macros
+            # These inline macros may have their argument in bold or italic,
+            # we can't know.
+            if ($str =~ m/E<\.([^>]|E<gt>|E<lt>)*$/s) {
+                # We can't use \\f here, otherwise the font simplifier regexp
+                # will use the fonts of the inline macros.
+                $str .= "PO4A-FAKE-FONT".$elem;
+                next;
+            }
+
+            # Replace \fP by the exact font (because some font modifiers will
+            # be removed or added, which will break groff's font stack)
+            $elem =~ s/^(P|\[\]|\[P\])/$previous_font/s;
+                # change \f1 to \fR, etc.
+                # Those fonts are defined in the DESC file, which
+                # may depend on the groff device.
+                # fonts 1 to 4 are usually mapped to R, I, B, BI
+                # TODO: use an array for the font positions. This
+                # array should be updated by .fp requests.
+                $elem =~ s/^1/R/;
+                $elem =~ s/^2/I/;
+                $elem =~ s/^3/B/;
+                $elem =~ s/^4/(BI/;
+
+            if ($elem =~ /^([1-4]|B|I|R|\(CW|\[\]|\[P\]|L)(.*)$/s) {
+                # Each element should now start by a recognized font modifier
+                my $new_font = $1;
+                my $arg = $2;
+                # Update the font stack
+                $previous_font = $current_font;
+                $current_font = $new_font;
+
+                if ($new_font eq $last_font) {
+                    # continue with the same font.
+                    $str.=$arg;
+                } else {
+                    # A new font is used, update $last_font
+                    $last_font = $new_font;
+                    $str .= "\\f".$elem;
+                }
+            } else {
+                die wrap_ref_mod($ref,
+                                 "po4a::man",
+                                 dgettext("po4a",
+                                          "Unsupported font in: '%s'."),
+                                 "\\f".$elem);
+            }
+        }
+        # Do some simplification (they don't change the font stack)
+        # Remove empty font modifiers at the end
+        $str =~ s/($FONT_RE)*$//s;
+
+        # close any font modifier
+        if ($str =~ /.*($FONT_RE)(.*?)$/s && $1 ne "\\f$regular_font") {
+            $str =~ s/(\n?)$/\\f$regular_font$1/;
+        }
+
+        # remove fonts with empty argument
+        while ($str =~ /($FONT_RE){2}/) {
+            # while $str has two consecutive font modifiers
+            # only keep the second one.
+            $str =~ s/($FONT_RE)($FONT_RE)/$2/s;
+        }
+
+        # when there are two consecutive switches to the regular font,
+        # remove the last one.
+        while ($str =~ /^(.*)\\f$regular_font # anything followed by a
+                                              # regular font
+                        ((?:\\(?!f)|[^\\])*)  # the text concerned by
+                                              # this font (i.e. without any
+                                              # font modifier, i.e. it
+                                              # contains no '\' followed by
+                                              # an 'f')
+                        \\f$regular_font      # another regular font
+                        (.*)$/sx) {
+            $str = "$1\\f$regular_font$2$3";
+        }
+
+        # the regular font modifier at the beginning of the string is not
+        # needed (the do_fonts subroutine ensure that every paragraph ends with
+        # the regular font.
+        if ($str =~ /^(.*?)\\f$regular_font(.*)$/s && $1 !~ /$FONT_RE/) {
+            $str = "$1$2";
+        }
+
+        # Use special markup for common fonts, so that translators don't see
+        # groff's font modifiers
+        my $PO_FONTS = "B|I|R|\\(CW";
+        # remove the regular font from this list
+        $PO_FONTS =~ s/^$regular_font\|//;
+        $PO_FONTS =~ s/\|$regular_font\|/|/;
+        $PO_FONTS =~ s/\|$regular_font$//;
+        while ($str =~ /^(.*?)                  # $1: anything (non greedy: as
+                                                # few as possible)
+                         \\f($PO_FONTS)         # followed by a common font
+                                                # modifier ($2)
+                         ((?:\\[^f]|[^\\])*)    # $3: the text concerned by
+                                                # this font (i.e. without any
+                                                # font modifier, i.e. it
+                                                # contains no '\' followed by
+                                                # an 'f')
+                         \\f                    # the next font modifier
+                         (.*)$/sx) {            # $4: anything up to the end
+            my ($begin, $font, $arg, $end) = ($1,$2,$3,$4);
+            if ($end =~ /^$regular_font(.*)$/s) {
+                # no need to add a switch to $regular_font
+                $str = $begin."$font<$arg>$1";
+            } else {
+                $str = $begin."$font<$arg>\\f$end";
+            }
+        }
+        $str =~ s/\(CW</CW</sg;
+        $str =~ s/PO4A-FAKE-FONT/\\f/sg;
+
+        print STDERR "'$str'\n" if ($debug{'fonts'});
+        return $str;
+    }
+}
+
+##########################################
+#### DEFINITION OF THE MACROS WE KNOW ####
+##########################################
+# Each sub is passed self as first arg,
+#   plus the args present on the roff line
+#   ie, <<.TH LS "1" "October 2002" "ls (coreutils) 4.5.2" "User Commands">>
+#   is passed (".TH","LS","1","October 2002","ls (coreutils) 4.5.2","User Commands")
+#   Macro name is also passed, because .B (bold) will be encoded in pod format (and mangeled).
+# They should return a list, which will be join'ed(' ',..)
+#   or undef when they don't want to add anything
+
+# Some well known macro handling
+
+# For macro taking only one argument, but people may forget the quotes.
+# Example: >>.SH Another Section<< which should be >>.SH "Another Section"<<
+sub translate_joined {
+    my ($self,$macroname,$macroarg)=(shift,shift,join(" ",@_));
+    #section# .S[HS] name
+    
+    $self->pushmacro($macroname,
+		     $self->t($macroarg));
+}
+
+# For macro taking several arguments, having to be translated separately
+sub translate_each {
+    my ($self,$first)= (shift,0);
+    $self->pushmacro( map { $first++ ?$self->t($_):$_ } @_);
+}
+
+# For macro which shouldn't be given any arg
+sub noarg {
+    my $self = shift;
+    warn "Macro $_[0] does not accept any argument\n"
+	if (defined ($_[1]));
+    $self->pushmacro(@_);
+}
+
+# For macro whose arguments shouldn't be translated
+sub untranslated {
+    my $self = shift;
+    $self->pushmacro(@_);
+}
+
+###
+### man 7 man
+###
+
+$macro{'TH'}= sub {
+    my $self=shift;
+    my ($th,$title,$section,$date,$source,$manual)=@_;
+    #Preamble#.TH      title     section   date     source   manual
+#    print STDERR "TH=$th;titre=$title;sec=$section;date=$date;source=$source;manual=$manual\n";
+
+    # Reset the memories
+    $self->push_docheader();
+
+    $self->pushmacro($th,
+		     $self->t($title),
+		     $section,
+		     $self->t($date),
+		     $self->t($source),
+		     $self->t($manual));
+};
+
+# .SS t    Subheading t (like .SH, but used for a subsection inside a section).
+$macro{'SS'}=$macro{'SH'}=sub {
+    if (!defined $_[2]) {
+        # The argument is on the next line.
+        my ($self,$macroname) = (shift,shift);
+        my ($l2,$ref2) = $self->shiftline();
+        if ($l2 =~/^\./) {
+            $self->SUPER::unshiftline($l2,$ref2);
+        } else {
+            chomp($l2);
+            $self->pushmacro($macroname,
+                             $self->t($l2));
+        }
+        return;
+    } else {
+        return translate_joined(@_);
+    }
+};
+
+# Macro: .SM [text]
+#     Set the text on the same line or the text on the next line in a
+#     font that is one point size smaller than the default font.
+# FIXME: Maybe we should find a better way to represent this (inline is
+#        not really nice in the PO).
+$inline{'SM'}=1;
+
+# .SP n     Skip n lines (I think)
+$macro{'SP'}=\&untranslated;	
+
+#Normal Paragraphs
+#  .LP      Same as .PP (begin a new paragraph).
+#  .P       Same as .PP (begin a new paragraph).
+#  .PP      Begin a new paragraph and reset prevailing indent.
+#Relative Margin Indent
+#  .RS i    Start relative margin indent - moves the left margin i to the right 
+#           As a result,  all  following  paragraph(s) will be indented until
+#           the corresponding .RE.
+#  .RE      End  relative  margin indent.
+$macro{'LP'}=$macro{'P'}=$macro{'PP'}=sub {
+    noarg(@_);
+
+    # From info groff:
+    # The font size and shape are reset to the default value (10pt roman if no
+    # `-rS' option is given on the command line).
+    set_font("R");
+};
+$macro{'RE'}=\&noarg;
+$macro{'RS'}=\&untranslated;
+
+#Indented Paragraph Macros
+#  .TP i    Begin  paragraph  with  hanging tag.  The tag is given on the next line,
+#           but its results are like those of the .IP command.
+$macro{'TP'}=sub {
+    my $self=shift;
+    my ($line,$l2,$ref2);
+    $line .= $_[0] if defined($_[0]);
+    $line .= ' '.$_[1] if defined($_[1]);
+    $self->pushline($self->r($line)."\n");
+
+    ($l2,$ref2) = $self->shiftline();
+    chomp($l2);
+    while ($l2 =~ /^\.PD/) {
+	$self->pushline($self->r($l2)."\n");
+	($l2,$ref2) = $self->shiftline();
+	chomp($l2);
+    }
+    if ($l2 =~/^([.'][\t ]*([^\t ]*))(?:([\t ]+)(.*)$|$)/) {
+        if ($inline{$2}) {
+            my $tmp = "";
+            if (defined $4 and length $4) {
+                $tmp = $3.$self->t($4, "wrap" => 0);
+            }
+            $self->pushline($1.$tmp."\n");
+        } else {
+            # If the line after a .TP is a macro,
+            # let the parser do it's job.
+            # Note: use Transtractor unshiftline for now. This may require an
+            #       implementation of the man module's own implementation.
+            #       This may be a problem if, for example, the line resulted
+            #       of a line continuation.
+            $self->SUPER::unshiftline($l2,$ref2);
+        }
+    } else {
+	$self->pushline($self->t($l2, "wrap" => 0)."\n");
+    }
+
+    # From info groff:
+    # Note that neither font shape nor font size of the label [i.e. argument
+    # or first line] is set to a default value; on the other hand, the rest of
+    # the text has default font settings.
+    set_font("R");
+};
+
+#   Indented Paragraph Macros
+#       .HP i    Begin paragraph with a hanging indent (the first line of  the  paragraph
+#                is  at  the  left margin of normal paragraphs, and the rest of the para-
+#                graph's lines are indented).
+#
+$macro{'HP'}=sub {
+    untranslated(@_);
+
+    # From info groff:
+    # Font size and face are reset to their default values.
+    set_font("R");
+};
+
+# Indented Paragraph Macros
+#       .IP [designator] [nnn]
+#              Sets up an indented paragraph, using designator as a  tag  to  mark
+#              its  beginning.   The indentation is set to nnn if that argument is
+#              supplied (default unit is `n'), otherwise the  default  indentation
+#              value  is  used.   Font size and face of the paragraph (but not the
+#              designator) are reset to its default values.  To start an  indented
+#              paragraph  with  a particular indentation but without a designator,
+#              use `""' (two doublequotes) as the second argument.
+	
+# Note that the above is the groff_man(7) version, which of course differs radically
+# from man(7). In one case, the designator is optional and the nnn is not, and the 
+# contrary in the other. This implies that when sticking to groff_man(7), we should
+# mark an uniq argument as translatable. 
+	
+$macro{'IP'}=sub {
+    my $self=shift;
+    if (defined $_[2]) {
+	$self->pushmacro($_[0],$self->t($_[1]),$_[2]);
+    } elsif (defined $_[1]) {
+	$self->pushmacro($_[0],$self->t($_[1]));
+    } else {
+	$self->pushmacro(@_);
+    }
+
+    # From info groff:
+    # Font size and face of the paragraph (but not the designator) are reset
+    # to their default values.
+    set_font("R");
+};
+
+# Hypertext Link Macros
+#  .UR u  Begins a hypertext link to the URI (URL) u; it will end with
+#         the corresponding UE command. When generating HTML this should
+#         translate into the HTML command <A HREF="u">.
+#         There is an exception: if u is the special value ":", then no
+#         hypertext link of any kind will be generated until after the
+#         closing UE (this permits disabling hypertext links in
+#         phrases like LALR(1) when linking is not appropriate). 
+#  .UE    Ends the corresponding UR command; when generating HTML this
+#         should translate into </A>.
+#  .UN u  Creates a named hypertext location named u; do not include a
+#         corresponding UE  command.
+#         When generating HTML this should translate into the HTML command
+#         <A  NAME="u" id="u">&nbsp;</A>
+$macro{'UR'}=sub {
+    return untranslated(@_) 
+	if (defined($_[2]) && $_[2] eq ':');
+    return translate_joined(@_);
+};
+$macro{'UE'}=\&noarg;
+$macro{'UN'}=\&translate_joined;
+
+# Miscellaneous Macros
+#  .DT      Reset tabs to default tab values (every 0.5 inches); does not
+#           cause a break.
+#  .PD d    Set inter-paragraph vertical distance to d (if omitted, d=0.4v);
+#            does not cause a break.
+$macro{'DT'}=\&noarg;
+$macro{'PD'}=\&untranslated;
+
+# Indexing term (printed on standard error).
+# (ms macros)
+$macro{'IX'}=\&translate_each;
+
+###
+### groff macros
+###
+# .br 
+$macro{'br'}=\&noarg;
+# .bp N      Eject current page and begin new page.
+$macro{'bp'}=\&untranslated;
+# .ad       Begin line adjustment for output lines in current adjust mode.
+# .ad c     Start line adjustment in mode c (c=l,r,b,n).
+$macro{'ad'}=\&untranslated;
+# .de macro Define or redefine macro until .. is encountered.
+$macro{'de'}=sub {
+    if ($groff_code ne "fail") {
+        my $self = shift;
+        my $paragraph = "@_";
+        my $end = ".";
+        if ($paragraph=~/^[.'][\t ]*de[\t ]+([^\t ]+)[\t ]+([^\t ]+)[\t ]$/) {
+            $end = $2;
+        }
+        my ($line, $ref) = $self->SUPER::shiftline();
+        chomp $line;
+        $paragraph .= "\n".$line;
+        while (defined($line) and $line ne ".$end") {
+            ($line, $ref) = $self->SUPER::shiftline();
+            if (defined $line) {
+                chomp $line;
+                $paragraph .= "\n".$line;
+            }
+        }
+        $paragraph .= "\n";
+        if ($groff_code eq "verbatim") {
+            $self->pushline( $self->r($paragraph) );
+        } else {
+            $self->pushline( $self->translate($paragraph,
+                                              $self->{ref},
+                                              "groff code",
+                                              "wrap" => 0) );
+        }
+    } else {
+        die wrap_mod("po4a::man", dgettext("po4a", "This page defines a new macro with '.de'. Since po4a is not a real groff parser, this is not supported."));
+    }
+};
+# .ds stringvar anything
+#                 Set stringvar to anything.
+$macro{'ds'}=sub {
+    my ($self, $m) = (shift,shift);
+    my $name = shift;
+    my $string = "@_";
+    # indicate to which variable this corresponds. The translator can
+    # find references to this string in the translation "\*(name" or
+    # "\*[name]"
+    $self->{type} = "ds $name";
+    $self->pushline($m." ".$self->r($name)." ".$self->translate($string)."\n");
+};
+#       .fam      Return to previous font family.
+#       .fam name Set the current font family to name.
+$macro{'fam'}=\&untranslated;
+# .fc a b   Set field delimiter to a and pad character to b.
+$macro{'fc'}=\&untranslated;
+# .ft font  Change to font name or number font;
+$macro{'ft'}=sub {
+    if (defined $_[2]) {
+        set_font($_[2]);
+    } else {
+        set_font("P");
+    }
+};
+# .hc c     Set up additional hyphenation indicator character c.
+$macro{'hc'}=\&untranslated;
+# .hy       Enable hyphenation (see nh)
+# .hy N     Switch to hyphenation mode N.
+# .hym n    Set the hyphenation margin to n (default scaling indicator m).
+# .hys n    Set the hyphenation space to n.
+$macro{'hy'}=$macro{'hym'}=$macro{'hys'}=\&untranslated;
+
+# .ie cond anything  If cond then anything else goto .el.
+# .if cond anything  If cond then anything; otherwise do nothing.
+$macro{'ie'}=$macro{'if'}=sub {
+    my $self = shift;
+    if ($groff_code ne "fail") {
+        my $m = $_[0];
+        my $paragraph = "@_";
+        my ($line,$ref);
+        my $count = 0;
+        $count = 1 if ($paragraph =~ m/(?<!\\)\\\{/s);
+        while (   ($paragraph =~ m/(?<!\\)\\$/s)
+               or ($count > 0)) {
+            ($line,$ref)=$self->SUPER::shiftline();
+            chomp $line;
+            $paragraph .= "\n".$line;
+            $count += 1 if ($line =~ m/(?<!\\)\\\{/s);
+            $count -= 1 if ($line =~ m/(?<!\\)\\\}/s);
+        }
+        if ($m eq '.ie') {
+            # The .el line may be preceded by comments
+            ($line,$ref)=$self->SUPER::shiftline();
+            chomp $line;
+            while ($line =~ m/^[.']\\"/) {
+                $paragraph .= "\n".$line;
+                ($line,$ref)=$self->SUPER::shiftline();
+                chomp $line;
+            }
+
+            if ($line !~ m/^[.'][ \t]*el(\s|\\\{)/) {
+                die wrap_ref_mod($self->{ref}, "po4a::man", dgettext("po4a",
+                            "The .ie macro must be followed by a .el macro."));
+            }
+            my $paragraph2 = $line;
+            $count = 0;
+            $count = 1 if ($line =~ m/(?<!\\)\\\{/s);
+            while (   ($paragraph2 =~ m/(?<!\\)\\$/s)
+                   or ($count > 0)) {
+                ($line,$ref)=$self->SUPER::shiftline();
+                chomp $line;
+                $paragraph2 .= "\n".$line;
+                $count += 1 if ($line =~ m/(?<!\\)\\\{/s);
+                $count -= 1 if ($line =~ m/(?<!\\)\\\}/s);
+            }
+            $paragraph .= "\n".$paragraph2;
+        }
+        $paragraph .= "\n";
+        if ($groff_code eq "verbatim") {
+            $self->pushline( $self->r($paragraph) );
+        } else {
+            $self->pushline( $self->translate($paragraph,
+                                              $self->{ref},
+                                              "groff code",
+                                              "wrap" => 0) );
+        }
+    } else {
+        die wrap_ref_mod($self->{ref}, "po4a::man", dgettext("po4a",
+            "This page uses conditionals with '%s'. Since po4a is not a real groff parser, this is not supported."), $_[0]);
+    }
+};
+# .in  N    Change indent according to N (default scaling indicator m).
+$macro{'in'}=\&untranslated;
+
+# .ig end   Ignore text until .end.
+$macro{'ig'}=sub {
+    my $self = shift;
+    $self->pushmacro(@_);
+    my ($name,$end) = (shift,shift||'');
+    $end='' if ($end =~ m/^\\\"/);
+    my ($line,$ref)=$self->shiftline();
+    while (defined($line)) {
+	$self->pushline($self->r($line));
+	last if ($line =~ /^\.$end\./);
+	($line,$ref)=$self->shiftline();
+    }
+};
+
+
+# .lf N file  Set input line number to N and filename to file.
+$macro{'lf'}=\&untranslated; 
+# .ll N       Set line length according to N
+$macro{'ll'}=\&untranslated; 
+
+# .nh         disable hyphenation (see hy)
+$macro{'nh'}=\&untranslated;
+# .na       No Adjusting (see ad)
+$macro{'na'}=\&untranslated;
+# .ne N     Need N vertical space
+$macro{'ne'}=\&untranslated;
+# .nr register N M
+#         Define or modify register
+$macro{'nr'}=\&untranslated;
+# .ps N    Point size; same as \s[N]
+$macro{'ps'}=\&untranslated;
+# .so filename Include source file.
+# .mso groff variant of .so (other search path)
+$macro{'so'}= $macro{'mso'} = sub {
+    warn wrap_mod("po4a::man", dgettext("po4a",
+	"This page includes another file with '%s'. Do not forget to translate this file ('%s')."), $_[1], $_[2]);
+    my $self = shift;
+    $self->pushmacro(@_);
+};
+# .sp     Skip one line vertically.
+# .sp N   Space  vertical distance N
+$macro{'sp'}=\&untranslated;
+# .vs [space]
+# .vs +space
+# .vs -space
+# Change (increase, decrease) the vertical spacing by SPACE.  The
+# default scaling indicator is `p'.
+$macro{'vs'}=\&untranslated;
+# .ta T N   Set tabs after every position that is a multiple of N.
+# .ta n1 n2 ... nn T r1 r2 ... rn
+#           Set  tabs at positions n1, n2, ..., nn, [...]
+$macro{'ta'}=sub {
+    # In some cases, a ta request can contain a translatable argument.
+    # FIXME: detect those cases (something like 5i does not need to be
+    # translated)
+    my ($self,$m)=(shift,shift);
+    my $line = "@_";
+    $line =~ s/^ +//;
+    $self->pushline($m." ".$self->translate($line,$self->{ref},'ta')."\n");
+};
+# .ti +N    Temporary indent next line (default scaling indicator m).
+$macro{'ti'}=\&untranslated;
+
+
+### 
+### tbl macros
+### 
+$macro{'TS'}=sub {
+    my $self=shift;
+    my ($in_headers,$buffer)=(1,"");
+    my ($line,$ref)=$self->shiftline();
+    
+    # Push table start
+    $self->pushmacro(@_);
+    while (defined($line)) {
+	if ($line =~ /^\.TE/) {
+	    # Table end
+	    $self->pushline($self->r($line));
+	    return;
+	}
+	if ($in_headers) {
+	    if ($line =~ /\.$/) {
+		$in_headers = 0;
+	    }
+	    $self->pushline($self->r($line));
+	} elsif ($line =~ /\\$/) {
+	    # Lines are continued on \ at the end of line
+	    $buffer .= $line;
+	} else {
+	    $buffer .= $line;
+	    # Arguments to translate are separated by \t
+	    $self->pushline(join("\t",
+				 map { $self->translate($buffer,
+							$ref,
+							'tbl table') 
+				     } split (/\\t/,$line)));
+	    $buffer = "";
+	}
+	($line,$ref)=$self->shiftline();
+    }
+};
+
+###
+### info groff
+### 
+
+## Builtin register, of course they do not need to be translated
+
+$macro{'F'}=$macro{'H'}=$macro{'V'}=$macro{'A'}=$macro{'T'}=\&untranslated;
+
+## ms package
+##
+#
+# Displays and keeps. None of these macro accept a translated argument
+# (they allow to make blocks of text which cannot be broken by new page)
+
+$macro{'DS'}=$macro{'LD'}=$macro{'DE'}=\&untranslated;
+$macro{'ID'}=$macro{'BD'}=$macro{'CD'}=\&untranslated;
+$macro{'RD'}=$macro{'KS'}=$macro{'KE'}=\&untranslated;
+$macro{'KF'}=$macro{'B1'}=$macro{'B2'}=\&untranslated;
+$macro{'DA'}=\&translate_joined;
+
+# .pc c  Change page number character
+$macro{'pc'}=\&translate_joined;
+
+# .ns    Disable .sp and such
+# .rs    Enable them again
+$macro{'ns'}=$macro{'rs'}=\&untranslated;
+
+# .cs font [width [em-size]]
+# Switch to and from "constant glyph space mode".
+$macro{'cs'}=\&untranslated;
+
+# .ss word_space_size [sentence_space_size]
+# Change the minimum size of a space between filled words.
+$macro{'ss'}=\&untranslated;
+
+# .ce     Center one line horizontally
+# .ce N   Center N lines
+# .ul N   Underline N lines (but not the spaces)
+# .cu N   Underline N lines (even the spaces)
+$macro{'ce'}=$macro{'ul'}=$macro{'cu'}=sub {
+    my $self=shift;
+    if (defined $_[1]) {
+        if ($_[1] <= 0) {
+            # disable centering, underlining, ...
+            $self->pushmacro($_[0]);
+        } else {
+# All of these are not handled yet because the number of line may change
+# during the translation
+            die wrap_mod("po4a::man", dgettext("po4a",
+		"This page uses the '%s' request with the number of lines in argument. This is not supported yet."), $_[0]);
+        }
+    } else {
+	$self->pushmacro($_[0]);
+    }
+};
+
+# .ec [c]
+# Set the escape character to C.  With no argument the default
+# escape character `\' is restored.  It can be also used to
+# re-enable the escape mechanism after an `eo' request.
+$macro{'ec'}=sub {
+    my $self=shift;
+    if (defined $_[1]) {
+        die wrap_mod("po4a::man", dgettext("po4a",
+	    "This page uses the '%s' request. This request is only supported when no argument is provided."), $_[0]);
+    } else {
+        $self->pushmacro($_[0]);
+    }
+};
+
+
+###
+### BSD compatibility macros: .AT and .UC
+### (define the version of Berkley used)
+### FIXME: the header ("3rd Berkeley Distribution" or such) declared 
+###        by this macro isn't translatable we may want to remove 
+###        this from the generated manpage, and declare our own header
+###
+$macro{'UC'}=$macro{'AT'}=\&untranslated;
+
+# Request: .hw word1 word2 ...
+#   Define how WORD1, WORD2, etc. are to be hyphenated.  The words
+#   must be given with hyphens at the hyphenation points.
+#
+#   If the English page needs to specify how a word must be hyphenated, the
+#   translated page may also have this need.
+$macro{'hw'}=\&translate_each;
+
+
+#############################################################################
+#
+# mdoc macros
+#
+# The macros are defined in mdoc(7) and groff_mdoc(7)
+#
+# TBC: Should the font processing be disabled in the mdoc mode?
+#############################################################################
+# FIXME: Maybe we should verify that the page is an mdoc page
+#        (add a flag in Dd, and always check that this flag is set in the
+#        other mdoc macros)
+sub translate_mdoc {
+    my ($self,$macroname)=(shift,shift);
+    my $macroarg = "";
+    foreach (@_) {
+        $macroarg.=" " if (length $macroarg);
+        if ($_ =~ m/((?<!\\) |\t|^$)/) {
+            $macroarg.="\"$_\"";
+        } else {
+            $macroarg.=$_;
+        }
+    }
+
+    $self->pushline("$macroname ".$self->t($macroarg)."\n");
+}
+sub translate_mdoc_no_quotes {
+    my ($self,$macroname, $macroarg)=(shift,shift, join(" ", @_));
+
+    $self->pushline("$macroname ".$self->t($macroarg)."\n");
+}
+#
+# Title Macros
+# ============
+# .Dd   Month day, year                       Document date.
+$macro{'Dd'}=sub {
+    my ($self,$macroname,$macroarg)=(shift,shift,join(" ",@_));
+
+    $mdoc_mode = 1;
+    $self->push_docheader();
+
+# FIXME: It would be nice if we could switch from one set of macros to the
+# other.
+#
+# This does not work at this time. If we erase the current set of macros,
+# po4a fails when a configuration file uses both mdoc and groff pages.
+#
+#    # Erase the current macro definitions
+#    %macro=();
+#    %inline=();
+#    %no_wrap_begin=();
+#    %no_wrap_end=();
+    # Use the mdoc macros
+    define_mdoc_macros();
+
+    $self->translate_mdoc_no_quotes($macroname,$macroarg);
+};
+
+sub define_mdoc_macros {
+    # .Dt   DOCUMENT_TITLE [section] [volume]     Title, in upper case.
+    $macro{'Dt'}=\&translate_mdoc;
+    # .Os   OPERATING_SYSTEM [version/release]    Operating system (BSD).
+    $macro{'Os'}=\&translate_each;
+    # Keep the quotes e.g. finger.1
+    # Don't add quotes e.g. logger.1
+
+    # Page Layout Macros
+    # ==================
+    # .Sh   Section Headers.
+    # (man mdoc indicates only a limited set of valid headers,
+    # but it should be OK to translate the header)
+    $macro{'Sh'}= sub {
+        my ($self,$macroname)=(shift,shift);
+        my $macroarg = "";
+        foreach (@_) {
+            $macroarg.=" " if (length $macroarg);
+            if ($_ =~ m/((?<!\\) |\t|^$)/) {
+                $macroarg.="\"$_\"";
+            } else {
+                $macroarg.=$_;
+            }
+        }
+        if ($mdoc{$macroarg}) {
+            $self->pushline("$macroname ".$self->r($macroarg)."\n");
+        } else {
+            $self->pushline("$macroname ".$self->t($macroarg)."\n");
+        }
+    };
+    # .Ss   Subsection Headers.
+    $macro{'Ss'}=\&translate_mdoc;
+    # .Pp   Paragraph Break.  Vertical space (one line).
+    $macro{'Pp'}=\&noarg;
+    # .D1   (D-one) Display-one Indent and display one text line.
+    $macro{'D1'}=\&translate_mdoc;
+    # .Dl   (D-ell) Display-one literal.
+    #       Indent and display one line of literal text
+    $macro{'Dl'}=\&translate_mdoc;
+    # .Bd   Begin-display block.
+    # FIXME: Note: there are some options, some of the options argument
+    #        may be translatable (-file <name>, -offset <string>)
+    $no_wrap_begin{'Bd'} = 1;
+    # .Ed   End-display (matches .Bd).
+    $no_wrap_end{'Ed'} = 1;
+    # .Bl   Begin-list.  Create lists or columns.
+    # FIXME: As for .Bd, there are some options
+    $macro{'Bl'}=\&untranslated;
+    # .El   End-list.
+    $macro{'El'}=\&noarg;
+    # .It   List item.
+    # FIXME: Maybe we could extract other modifiers
+    #        as in .It Fl l Ar num
+    $macro{'It'}=\&translate_mdoc;
+
+    # Manual Domain Macros
+    # ====================
+    # FIXME: I think most Manual and General text domain are in the inline category
+    foreach (qw(Ad An Ar Cd Cm Dv Er Ev Fa Fd Fn Ic Li Nm Op Ot Pa St Va Vt Xr)) {
+        $inline{$_} = 1;
+    }
+    # FIXME: some of thes macro introduce a line in bold.
+    #        Using \fP in these line is not supported.
+    #        do_fonts should be called for every inline line
+
+    # General Text Domain
+    # ===================
+    foreach (qw(%A %B %C %D %J %N %O %P %R %T %V
+                Ac Ao Ap Aq At Bc Bf Bo Bq Bx Db Dc Do Dq Ec Ef Em Eo Fx No Ns
+                Pc Pf Po Pq Qc Ql Qo Qq Re Rs Rv Sc So Sq Sm Sx Sy Tn Ux Xc Xo)) {
+        $inline{$_} = 1;
+    }
+
+    # FIXME: Maybe it should be joined with the preceding .Nm
+    $macro{'Nd'}=\&translate_mdoc;
+
+    # Command line flags
+    $inline{'Fl'} = 1;
+    # Exit status
+    $inline{'Ex'} = 1;
+    # Opening option bracket
+    $inline{'Oo'} = 1;
+    # Closing option bracket
+    $inline{'Oc'} = 1;
+    # Begin keep (keep words in the same line)
+    $inline{'Bk'} = 1;
+    # End keep
+    $inline{'Ek'} = 1;
+    # Library Names
+    $inline{'Lb'} = 1;
+    # Function Types
+    $inline{'Ft'} = 1;
+    # Function open (for functions with many arguments)
+    $inline{'Fo'} = 1;
+    # Function close
+    $inline{'Fc'} = 1;
+    # OpenBSD macro
+    $inline{'Ox'} = 1;
+    # BSD/OS Macro
+    $inline{'Bsx'} = 1;
+    # #include statements
+    $macro{'In'} = \&translate_mdoc;
+    # NetBSD Macro
+    $inline{'Nx'} = 1;
+
+    # This macro is a groff macro. I don't know if ot is valid in an mdoc page.
+    # But this is used in some pages and seems to work
+    $macro{'br'}=\&noarg;
+
+} # end of define_mdoc_macros

Added: po4a/lib/Locale/Po4a/NewsDebian.pm
===================================================================
--- po4a/lib/Locale/Po4a/NewsDebian.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/NewsDebian.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,152 @@
+#!/usr/bin/perl -w
+
+# Po4a::NewsDebian.pm
+# 
+# extract and translate translatable strings from a NEWS.Debian documents
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::NewsDebian - Convert NEWS.Debian documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::NewsDebian is a module to help the translation of the
+NEWS.Debian files into other [human] languages. Those files are where
+maintainer are supposed to write the important news about their package.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+NONE.
+
+=head1 STATUS OF THIS MODULE
+
+Not tested. 
+
+A finer split of the entries may be preferable (search for /^ */, for
+example), but this version is more robust and NEWS.Debian entries are not
+supposed to change that often.
+
+=cut
+
+package Locale::Po4a::NewsDebian;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+
+
+sub initialize {}
+
+sub parse {
+    my $self = shift;
+
+    my ($blanklines)=(""); # We want to preserve the blank lines inside the entry, and strip the extrem ones
+
+    my ($body)=""; # the accumulated paragraph
+    my ($bodyref)="";
+    my ($bodytype)="";
+
+    my ($line,$lref);
+
+    # main loop
+    ($line,$lref)=$self->shiftline();
+    print "seen >>$line<<\n" if $self->debug();
+    while (defined($line)) {
+
+	# Begining of an entry
+	if ($line =~ m/^(\w[-+0-9a-z.]*) \(([^\(\) \t]+)\)((\s+[-0-9a-z]+)+)\;/i) {
+
+	    die wrap_ref_mod($lref, "po4a::newsdebian", dgettext("po4a", "Begin of a new entry before the end of previous one"))
+	      if (length ($body));
+
+	    $self->pushline($line."\n");
+
+	    # Signature of this entry
+	    $bodyref = $lref;
+	    $bodytype = $line;
+
+	    # eat all leading empty lines
+	    ($line,$lref)=$self->shiftline();
+	    while (defined($line) && $line =~ m/^\s*$/) {
+		print "Eat >>$line<<\n" if $self->debug();
+		($line,$lref)=$self->shiftline();
+	    }
+	    # ups, ate one line too much. Put it back.
+	    $self->unshiftline($line,$lref);
+
+
+	    # get ready to read the entry (cleanups)
+	    $blanklines = "";
+
+	# End of current entry
+	} elsif ($line =~ m/^ \-\- (.*) <(.*)>  .*$/) { #((\w+\,\s*)?\d{1,2}\s+\w+\s+\d{4}\s+\d{1,2}:\d\d:\d\d\s+[-+]\d{4}(\s+\([^\\\(\)]\))?) *$/) {
+
+	    $self->translate($body, $bodyref, $bodytype,
+		             wrap=>0);
+	    $body="";
+
+	# non-specific line
+	} else {
+
+	    if ($line =~ /^\s*$/) {
+		$blanklines .= "$line";
+	    } else {
+		$body .= $blanklines.$line;
+		$blanklines = "";
+	    }
+	}
+
+	($line,$lref)=$self->shiftline();
+	print "seen >>".($line || '')."<<\n" if $self->debug();
+    }
+}
+
+1;
+
+=head1 AUTHORS
+
+This module is loosely inspired from /usr/lib/dpkg/parsechangelog/debian, which is:
+
+ Copyright (C) 1996 Ian Jackson.  This is free software; see the GNU
+ General Public Licence version 2 or later for copying conditions.  There
+ is NO warranty.
+
+The adaptation for po4a was done by:
+
+ Martin Quinson (mquinson#debian.org)
+
+=head1 COPYRIGHT AND LICENSE
+
+ Copyright (c) 1996 by Ian Jackson.
+ Copyright 2005 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).

Added: po4a/lib/Locale/Po4a/Po.pm
===================================================================
--- po4a/lib/Locale/Po4a/Po.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Po.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1521 @@
+# Locale::Po4a::Po -- manipulation of po files
+# $Id: Po.pm,v 1.85 2007-09-16 13:24:21 nekral-guest Exp $
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the terms of GPL (see COPYING).
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+=head1 NAME
+
+Locale::Po4a::Po - po file manipulation module
+
+=head1 SYNOPSIS
+
+    use Locale::Po4a::Po;
+    my $pofile=Locale::Po4a::Po->new();
+
+    # Read po file
+    $pofile->read('file.po');
+
+    # Add an entry
+    $pofile->push('msgid' => 'Hello', 'msgstr' => 'bonjour',
+                  'flags' => "wrap", 'reference'=>'file.c:46');
+
+    # Extract a translation
+    $pofile->gettext("Hello"); # returns 'bonjour'
+
+    # Write back to a file
+    $pofile->write('otherfile.po');
+
+=head1 DESCRIPTION
+
+Locale::Po4a::Po is a module that allows you to manipulate message
+catalogs. You can load and write from/to a file (which extension is often
+I<po>), you can build new entries on the fly or request for the translation
+of a string.
+
+For a more complete description of message catalogs in the po format and
+their use, please refer to the documentation of the gettext program.
+
+This module is part of the PO4A project, which objective is to use po files
+(designed at origin to ease the translation of program messages) to
+translate everything, including documentation (man page, info manual),
+package description, debconf templates, and everything which may benefit
+from this.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+=over 4
+
+=item porefs
+
+This specifies the reference format. It can be one of 'none' to not produce
+any reference, 'noline' to not specify the line number, and 'full' to
+include complete references.
+
+=back
+
+=cut
+
+use IO::File;
+
+
+require Exporter;
+
+package Locale::Po4a::Po;
+use DynaLoader;
+
+use Locale::Po4a::Common qw(wrap_msg wrap_mod wrap_ref_mod dgettext);
+
+use subs qw(makespace);
+use vars qw(@ISA @EXPORT_OK);
+@ISA = qw(Exporter DynaLoader);
+@EXPORT = qw(%debug);
+@EXPORT_OK = qw(&move_po_if_needed);
+
+use Locale::Po4a::TransTractor;
+# Try to use a C extension if present.
+eval("bootstrap Locale::Po4a::Po $Locale::Po4a::TransTractor::VERSION");
+
+use 5.006;
+use strict;
+use warnings;
+
+use Carp qw(croak);
+use File::Path; # mkdir before write
+use File::Copy; # move
+use POSIX qw(strftime floor);
+
+use Encode;
+
+my @known_flags=qw(wrap no-wrap c-format fuzzy);
+
+our %debug=('canonize'  => 0,
+            'quote'     => 0,
+            'escape'    => 0,
+            'encoding'  => 0,
+            'filter'    => 0);
+
+=head1 Functions about whole message catalogs
+
+=over 4
+
+=item new()
+
+Creates a new message catalog. If an argument is provided, it's the name of
+a po file we should load.
+
+=cut
+
+sub new {
+    my ($this, $options) = (shift, shift);
+    my $class = ref($this) || $this;
+    my $self = {};
+    bless $self, $class;
+    $self->initialize($options);
+
+    my $filename = shift;
+    $self->read($filename) if defined($filename) && length($filename);
+    return $self;
+}
+
+# Return the numerical timezone (e.g. +0200)
+# The %z format of strftime is not portable.
+# For example, it indicates "2006-10-25 19:36E. Europe Standard Time" on
+# MS Windows.
+sub timezone {
+    my @g = gmtime();
+    my @l = localtime();
+
+    my $diff;
+    $diff  = floor(strftime("%s",@l)/60 +0.5);
+    $diff -= floor(strftime("%s",@g)/60 +0.5);
+
+    my $h = floor($diff / 60) + $l[8]; # $l[8] indicates if we are currently
+                                       # in a daylight saving time zone
+    my $m = $diff%60;
+
+    return sprintf "%+03d%02d\n", $h, $m;
+}
+
+sub initialize {
+    my ($self, $options) = (shift, shift);
+    my $date = strftime("%Y-%m-%d %H:%M", localtime).timezone();
+    chomp $date;
+#    $options = ref($options) || $options;
+
+    $self->{options}{'porefs'}= 'full';
+    $self->{options}{'msgid-bugs-address'}= undef;
+    $self->{options}{'copyright-holder'}= "Free Software Foundation, Inc.";
+    foreach my $opt (keys %$options) {
+        if ($options->{$opt}) {
+            die wrap_mod("po4a::po",
+                         dgettext ("po4a", "Unknown option: %s"), $opt)
+                unless exists $self->{options}{$opt};
+            $self->{options}{$opt} = $options->{$opt};
+        }
+    }
+    $self->{options}{'porefs'} =~ /^(full|noline|none)$/ ||
+        die wrap_mod("po4a::po",
+                     dgettext ("po4a",
+                               "Invalid value for option 'porefs' ('%s' is ".
+                               "not one of 'full', 'noline' or 'none')"),
+                     $self->{options}{'porefs'});
+
+    $self->{po}=();
+    $self->{count}=0;  # number of msgids in the PO
+    # count_doc: number of strings in the document
+    # (duplicate strings counted multiple times)
+    $self->{count_doc}=0;
+    $self->{header_comment}=
+        escape_text( " SOME DESCRIPTIVE TITLE\n"
+                    ." Copyright (C) YEAR ".
+                     $self->{options}{'copyright-holder'}."\n"
+                    ." This file is distributed under the same license ".
+                     "as the PACKAGE package.\n"
+                    ." FIRST AUTHOR <EMAIL\@ADDRESS>, YEAR.\n"
+                    ." \n"
+                    .", fuzzy");
+#    $self->header_tag="fuzzy";
+    $self->{header}=escape_text("Project-Id-Version: PACKAGE VERSION\n".
+                        ((defined $self->{options}{'msgid-bugs-address'})?
+        "Report-Msgid-Bugs-To: ".$self->{options}{'msgid-bugs-address'}."\n":
+                                "").
+                                "POT-Creation-Date: $date\n".
+                                "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n".
+                                "Last-Translator: FULL NAME <EMAIL\@ADDRESS>\n".
+                                "Language-Team: LANGUAGE <LL\@li.org>\n".
+                                "MIME-Version: 1.0\n".
+                                "Content-Type: text/plain; charset=CHARSET\n".
+                                "Content-Transfer-Encoding: ENCODING");
+
+    $self->{encoder}=find_encoding("ascii");
+
+    # To make stats about gettext hits
+    $self->stats_clear();
+}
+
+=item read($)
+
+Reads a po file (which name is given as argument).  Previously existing
+entries in self are not removed, the new ones are added to the end of the
+catalog.
+
+=cut
+
+sub read {
+    my $self=shift;
+    my $filename=shift
+        or croak wrap_mod("po4a::po",
+                          dgettext("po4a",
+                                   "Please provide a non-null filename"));
+
+    my $fh;
+    if ($filename eq '-') {
+        $fh=*STDIN;
+    } else {
+        open $fh,"<$filename"
+            or croak wrap_mod("po4a::po",
+                              dgettext("po4a", "Can't read from %s: %s"),
+                              $filename, $!);
+    }
+
+    ## Read paragraphs line-by-line
+    my $pofile="";
+    my $textline;
+    while (defined ($textline = <$fh>)) {
+        $pofile .= $textline;
+    }
+#    close INPUT
+#        or croak (sprintf(dgettext("po4a",
+#                                   "Can't close %s after reading: %s"),
+#                          $filename,$!)."\n");
+
+    my $linenum=0;
+
+    foreach my $msg (split (/\n\n/,$pofile)) {
+        my ($msgid,$msgstr,$comment,$automatic,$reference,$flags,$buffer);
+        my ($msgid_plural, $msgstr_plural);
+        foreach my $line (split (/\n/,$msg)) {
+            $linenum++;
+            if ($line =~ /^#\. ?(.*)$/) {  # Automatic comment
+                $automatic .= (defined($automatic) ? "\n" : "").$1;
+
+            } elsif ($line =~ /^#: ?(.*)$/) { # reference
+                $reference .= (defined($reference) ? "\n" : "").$1;
+
+            } elsif ($line =~ /^#, ?(.*)$/) { # flags
+                $flags .= (defined($flags) ? "\n" : "").$1;
+
+            } elsif ($line =~ /^#(.*)$/) {  # Translator comments
+                $comment .= (defined($comment) ? "\n" : "").($1||"");
+
+            } elsif ($line =~ /^msgid (".*")$/) { # begin of msgid
+                $buffer = $1;
+
+            } elsif ($line =~ /^msgid_plural (".*")$/) {
+                # begin of msgid_plural, end of msgid
+
+                $msgid = $buffer;
+                $buffer = $1;
+
+            } elsif ($line =~ /^msgstr (".*")$/) {
+                # begin of msgstr, end of msgid
+
+                $msgid = $buffer;
+                $buffer = "$1";
+
+            } elsif ($line =~ /^msgstr\[([0-9]+)\] (".*")$/) {
+                # begin of msgstr[x], end of msgid_plural or msgstr[x-1]
+
+                # Note: po4a cannot uses plural forms
+                # (no integer to use the plural form)
+                #   * drop the msgstr[x] where x >= 2
+                #   * use msgstr[0] as the translation of msgid
+                #   * use msgstr[1] as the translation of msgid_plural
+
+                if ($1 eq "0") {
+                    $msgid_plural = $buffer;
+                    $buffer = "$2";
+                } elsif ($1 eq "1") {
+                    $msgstr = $buffer;
+                    $buffer = "$2";
+                } elsif ($1 eq "2") {
+                    $msgstr_plural = $buffer;
+                }
+            } elsif ($line =~ /^(".*")$/) {
+                # continuation of a line
+                $buffer .= "\n$1";
+
+            } else {
+                warn wrap_ref_mod("$filename:$linenum",
+                                  "po4a::po",
+                                  dgettext("po4a", "Strange line: -->%s<--"),
+                                  $line);
+            }
+        }
+        $linenum++;
+        if (defined $msgstr) {
+            $msgstr_plural=$buffer;
+
+            $msgid = unquote_text($msgid) if (defined($msgid));
+            $msgstr = unquote_text($msgstr) if (defined($msgstr));
+
+            $self->push_raw ('msgid'     => $msgid,
+                             'msgstr'    => $msgstr,
+                             'reference' => $reference,
+                             'flags'     => $flags,
+                             'comment'   => $comment,
+                             'automatic' => $automatic,
+                             'plural'    => 0);
+
+            $msgid_plural = unquote_text($msgid_plural)
+                if (defined($msgid_plural));
+            $msgstr_plural = unquote_text($msgstr_plural)
+                if (defined($msgstr_plural));
+
+            $self->push_raw ('msgid'     => $msgid_plural,
+                             'msgstr'    => $msgstr_plural,
+                             'reference' => $reference,
+                             'flags'     => $flags,
+                             'comment'   => $comment,
+                             'automatic' => $automatic,
+                             'plural'    => 1);
+        } else {
+            $msgstr=$buffer;
+
+            $msgid = unquote_text($msgid) if (defined($msgid));
+            $msgstr = unquote_text($msgstr) if (defined($msgstr));
+
+            $self->push_raw ('msgid'     => $msgid,
+                             'msgstr'    => $msgstr,
+                             'reference' => $reference,
+                             'flags'     => $flags,
+                             'comment'   => $comment,
+                             'automatic' => $automatic);
+        }
+    }
+}
+
+=item write($)
+
+Writes the current catalog to the given file.
+
+=cut
+
+sub write{
+    my $self=shift;
+    my $filename=shift
+        or croak dgettext("po4a","Can't write to a file without filename")."\n";
+
+    my $fh;
+    if ($filename eq '-') {
+        $fh=\*STDOUT;
+    } else {
+        # make sure the directory in which we should write the localized
+        # file exists
+        my $dir = $filename;
+        if ($dir =~ m|/|) {
+            $dir =~ s|/[^/]*$||;
+
+            File::Path::mkpath($dir, 0, 0755) # Croaks on error
+                if (length ($dir) && ! -e $dir);
+        }
+        open $fh,">$filename"
+            or croak wrap_mod("po4a::po",
+                              dgettext("po4a", "Can't write to %s: %s"),
+                              $filename, $!);
+    }
+
+    print $fh "".format_comment(unescape_text($self->{header_comment}),"")
+        if defined($self->{header_comment}) && length($self->{header_comment});
+
+    print $fh "msgid \"\"\n";
+    print $fh "msgstr ".quote_text($self->{header})."\n\n";
+
+
+    my $first=1;
+    foreach my $msgid ( sort { ($self->{po}{"$a"}{'pos'}) <=>
+                               ($self->{po}{"$b"}{'pos'})
+                             }  keys %{$self->{po}}) {
+        my $output="";
+
+        if ($first) {
+            $first=0;
+        } else {
+            $output .= "\n";
+        }
+
+        $output .= format_comment($self->{po}{$msgid}{'comment'},"")
+            if    defined($self->{po}{$msgid}{'comment'})
+               && length ($self->{po}{$msgid}{'comment'});
+        if (   defined($self->{po}{$msgid}{'automatic'})
+            && length ($self->{po}{$msgid}{'automatic'})) {
+            foreach my $comment (split(/\\n/,$self->{po}{$msgid}{'automatic'}))
+            {
+                $output .= format_comment($comment, ". ")
+            }
+        }
+        $output .= format_comment($self->{po}{$msgid}{'type'}," type: ")
+            if    defined($self->{po}{$msgid}{'type'})
+               && length ($self->{po}{$msgid}{'type'});
+        $output .= format_comment($self->{po}{$msgid}{'reference'},": ")
+            if    defined($self->{po}{$msgid}{'reference'})
+               && length ($self->{po}{$msgid}{'reference'});
+        $output .= "#, ". join(", ", sort split(/\s+/,$self->{po}{$msgid}{'flags'}))."\n"
+            if    defined($self->{po}{$msgid}{'flags'})
+               && length ($self->{po}{$msgid}{'flags'});
+
+        if ($self->get_charset =~ /^utf-8$/i) {
+            my $msgstr = Encode::decode_utf8($self->{po}{$msgid}{'msgstr'});
+            $msgid = Encode::decode_utf8($msgid);
+            $output .= Encode::encode_utf8("msgid ".quote_text($msgid)."\n");
+            $output .= Encode::encode_utf8("msgstr ".quote_text($msgstr)."\n");
+        } else {
+            $output .= "msgid ".quote_text($msgid)."\n";
+            $output .= "msgstr ".quote_text($self->{po}{$msgid}{'msgstr'})."\n";
+        }
+        print $fh $output;
+    }
+#    print STDERR "$fh";
+#    if ($filename ne '-') {
+#        close $fh
+#            or croak (sprintf(dgettext("po4a",
+#                                       "Can't close %s after writing: %s\n"),
+#                              $filename,$!));
+#    }
+}
+
+=item write_if_needed($$)
+
+Like write, but if the PO or POT file already exists, the object will be
+written in a temporary file which will be compared with the existing file
+to check that the update is needed (this avoids to change a POT just to
+update a line reference or the POT-Creation-Date field).
+
+=cut
+
+sub move_po_if_needed {
+    my ($new_po, $old_po, $backup) = (shift, shift, shift);
+    my $diff;
+
+    if (-e $old_po) {
+        my $diff_ignore = "-I'^#:' "
+                         ."-I'^\"POT-Creation-Date:' "
+                         ."-I'^\"PO-Revision-Date:'";
+        $diff = qx(diff -q $diff_ignore $old_po $new_po);
+        if ( $diff eq "" ) {
+            unlink $new_po
+                or die wrap_msg(dgettext("po4a","Can't unlink %s: %s."),
+                                $new_po, $!);
+            # touch the old PO
+            my ($atime, $mtime) = (time,time);
+            utime $atime, $mtime, $old_po;
+        } else {
+            if ($backup) {
+                copy $old_po, $old_po."~"
+                    or die wrap_msg(dgettext("po4a","Can't copy %s to %s: %s."),
+                                    $old_po, $old_po."~", $!);
+            } else {
+            }
+            move $new_po, $old_po
+                or die wrap_msg(dgettext("po4a","Can't move %s to %s: %s."),
+                                $new_po, $old_po, $!);
+        }
+    } else {
+        move $new_po, $old_po
+            or die wrap_msg(dgettext("po4a","Can't move %s to %s: %s."),
+                            $new_po, $old_po, $!);
+    }
+}
+
+sub write_if_needed {
+    my $self=shift;
+    my $filename=shift
+        or croak dgettext("po4a","Can't write to a file without filename")."\n";
+
+    if (-e $filename) {
+        my ($tmp_filename);
+        (undef,$tmp_filename)=File::Temp->tempfile($filename."XXXX",
+                                                   DIR    => "/tmp",
+                                                   OPEN   => 0,
+                                                   UNLINK => 0);
+        $self->write($tmp_filename);
+        move_po_if_needed($tmp_filename, $filename);
+    } else {
+        $self->write($filename);
+    }
+}
+
+=item gettextize($$)
+
+This function produces one translated message catalog from two catalogs, an
+original and a translation. This process is described in L<po4a(7)|po4a.7>,
+section I<Gettextization: how does it work?>.
+
+=cut
+
+sub gettextize {
+    my $this = shift;
+    my $class = ref($this) || $this;
+    my ($poorig,$potrans)=(shift,shift);
+
+    my $pores=Locale::Po4a::Po->new();
+
+    my $please_fail = 0;
+    my $toobad = dgettext("po4a",
+        "\nThe gettextization failed (once again). Don't give up, ".
+        "gettextizing is a subtle art, but this is only needed once ".
+        "to convert a project to the gorgeous luxus offered by po4a ".
+        "to translators.".
+        "\nPlease refer to the po4a(7) documentation, the section ".
+        "\"HOWTO convert a pre-existing translation to po4a?\" ".
+        "contains several hints to help you in your task");
+
+    # Don't fail right now when the entry count does not match. Instead, give
+    # it a try so that the user can see where we fail (which is probably where
+    # the problem is).
+    if ($poorig->count_entries_doc() > $potrans->count_entries_doc()) {
+        warn wrap_mod("po4a gettextize", dgettext("po4a",
+            "Original has more strings than the translation (%d>%d). ".
+            "Please fix it by editing the translated version to add ".
+            "some dummy entry."),
+                      $poorig->count_entries_doc(),
+                      $potrans->count_entries_doc());
+        $please_fail = 1;
+    } elsif ($poorig->count_entries_doc() < $potrans->count_entries_doc()) {
+        warn wrap_mod("po4a gettextize", dgettext("po4a",
+            "Original has less strings than the translation (%d<%d). ".
+            "Please fix it by removing the extra entry from the ".
+            "translated file. You may need an addendum (cf po4a(7)) ".
+            "to reput the chunk in place after gettextization. A ".
+            "possible cause is that a text duplicated in the original ".
+            "is not translated the same way each time. Remove one of ".
+            "the translations, and you're fine."),
+                      $poorig->count_entries_doc(),
+                      $potrans->count_entries_doc());
+        $please_fail = 1;
+    }
+
+    if ( $poorig->get_charset =~ /^utf-8$/i ) {
+        $potrans->to_utf8;
+        $pores->set_charset("utf-8");
+    } else {
+        if ($potrans->get_charset eq "CHARSET") {
+            $pores->set_charset("ascii");
+        } else {
+            $pores->set_charset($potrans->get_charset);
+        }
+    }
+    print "Po character sets:\n".
+        "  original=".$poorig->get_charset."\n".
+        "  translated=".$potrans->get_charset."\n".
+        "  result=".$pores->get_charset."\n"
+            if $debug{'encoding'};
+
+    for (my ($o,$t)=(0,0) ;
+         $o<$poorig->count_entries_doc() && $t<$potrans->count_entries_doc();
+         $o++,$t++) {
+        #
+        # Extract some informations
+
+        my ($orig,$trans)=($poorig->msgid_doc($o),$potrans->msgid_doc($t));
+#       print STDERR "Matches [[$orig]]<<$trans>>\n";
+
+        my ($reforig,$reftrans)=($poorig->{po}{$orig}{'reference'},
+                                 $potrans->{po}{$trans}{'reference'});
+        my ($typeorig,$typetrans)=($poorig->{po}{$orig}{'type'},
+                                   $potrans->{po}{$trans}{'type'});
+
+        #
+        # Make sure the type of both string exist
+        #
+        die wrap_mod("po4a gettextize",
+                     "Internal error: type of original string number %s ".
+                     "isn't provided", $o)
+            if ($typeorig eq '');
+
+        die wrap_mod("po4a gettextize",
+                     "Internal error: type of translated string number %s ".
+                     "isn't provided", $o)
+            if ($typetrans eq '');
+
+        #
+        # Make sure both type are the same
+        #
+        if ($typeorig ne $typetrans){
+            $pores->write("gettextization.failed.po");
+            die wrap_msg(dgettext("po4a",
+                         "po4a gettextization: Structure disparity between ".
+                         "original and translated files:\n".
+                         "msgid (at %s) is of type '%s' while\n".
+                         "msgstr (at %s) is of type '%s'.\n".
+                         "Original text: %s\n".
+                         "Translated text: %s\n".
+                         "(result so far dumped to gettextization.failed.po)").
+                         "%s",
+                         $reforig, $typeorig,
+                         $reftrans, $typetrans,
+                         $orig,
+                         $trans,
+                         $toobad);
+        }
+
+        #
+        # Push the entry
+        #
+        my $flags;
+        if (defined $poorig->{po}{$orig}{'flags'}) {
+            $flags = $poorig->{po}{$orig}{'flags'}." fuzzy";
+        } else {
+            $flags = "fuzzy";
+        }
+        $pores->push_raw('msgid'     => $orig,
+                         'msgstr'    => $trans,
+                         'flags'     => $flags,
+                         'type'      => $typeorig,
+                         'reference' => $reforig,
+                         'conflict'  => 1)
+            unless (defined($pores->{po}{$orig})
+                    and ($pores->{po}{$orig}{'msgstr'} eq $trans))
+        # FIXME: maybe we should be smarter about what reference should be
+        #        sent to push_raw.
+    }
+
+    # make sure we return a useful error message when entry count differ
+    die "$toobad\n" if $please_fail;
+
+    return $pores;
+}
+
+=item filter($)
+
+This function extracts a catalog from an existing one. Only the entries having
+a reference in the given file will be placed in the resulting catalog.
+
+This function parses its argument, converts it to a perl function definition,
+eval this definition and filter the fields for which this function returns
+true.
+
+I love perl sometimes ;)
+
+=cut
+
+sub filter {
+    my $self=shift;
+    our $filter=shift;
+
+    my $res;
+    $res = Locale::Po4a::Po->new();
+
+    # Parse the filter
+    our $code="sub apply { return ";
+    our $pos=0;
+    our $length = length $filter;
+
+    # explode chars to parts. How to subscript a string in Perl?
+    our @filter = split(//,$filter);
+
+    sub gloups {
+        my $fmt=shift;
+        my $space = "";
+        for (1..$pos){
+            $space .= ' ';
+        }
+        die wrap_msg("$fmt\n$filter\n$space^ HERE");
+    }
+    sub showmethecode {
+        return unless $debug{'filter'};
+        my $fmt=shift;
+        my $space="";
+        for (1..$pos){
+            $space .= ' ';
+        }
+        print STDERR "$filter\n$space^ $fmt\n";#"$code\n";
+    }
+
+    # I dream of a lex in perl :-/
+    sub parse_expression {
+        showmethecode("Begin expression")
+            if $debug{'filter'};
+
+        gloups("Begin of expression expected, got '%s'",$filter[$pos])
+            unless ($filter[$pos] eq '(');
+        $pos ++; # pass the '('
+        if ($filter[$pos] eq '&') {
+            # AND
+            $pos++;
+            showmethecode("Begin of AND")
+                if $debug{'filter'};
+            $code .= "(";
+            while (1) {
+                gloups ("Unfinished AND statement.")
+                    if ($pos == $length);
+                parse_expression();
+                if ($filter[$pos] eq '(') {
+                    $code .= " && ";
+                } elsif ($filter[$pos] eq ')') {
+                    last; # do not eat that char
+                } else {
+                    gloups("End of AND or begin of sub-expression expected, got '%s'", $filter[$pos]);
+                }
+            }
+            $code .= ")";
+        } elsif ($filter[$pos] eq '|') {
+            # OR
+            $pos++;
+            $code .= "(";
+            while (1) {
+                gloups("Unfinished OR statement.")
+                    if ($pos == $length);
+                parse_expression();
+                if ($filter[$pos] eq '(') {
+                    $code .= " || ";
+                } elsif ($filter[$pos] eq ')') {
+                    last; # do not eat that char
+                } else {
+                    gloups("End of OR or begin of sub-expression expected, got '%s'",$filter[$pos]);
+                }
+            }
+            $code .= ")";
+        } elsif ($filter[$pos] eq '!') {
+            # NOT
+            $pos++;
+            $code .= "(!";
+            gloups("Missing sub-expression in NOT statement.")
+                if ($pos == $length);
+            parse_expression();
+            $code .= ")";
+        } else {
+            # must be an equal. Let's get field and argument
+            my ($field,$arg,$done);
+            $field = substr($filter,$pos);
+            gloups("EQ statement contains no '=' or invalid field name")
+                unless ($field =~ /([a-z]*)=/i);
+            $field = lc($1);
+            $pos += (length $field) + 1;
+
+            # check that we've got a valid field name,
+            # and the number it referes to
+            # DO NOT CHANGE THE ORDER
+            my @names=qw(msgid msgstr reference flags comment automatic);
+            my $fieldpos;
+            for ($fieldpos = 0;
+                 $fieldpos < scalar @names && $field ne $names[$fieldpos];
+                 $fieldpos++) {}
+            gloups("Invalid field name: %s",$field)
+                if $fieldpos == scalar @names; # not found
+
+            # Now, get the argument value. It has to be between quotes,
+            # which can be escaped
+            # We point right on the first char of the argument
+            # (first quote already eaten)
+            my $escaped = 0;
+            my $quoted = 0;
+            if ($filter[$pos] eq '"') {
+                $pos++;
+                $quoted = 1;
+            }
+            showmethecode(($quoted?"Quoted":"Unquoted")." argument of field '$field'")
+                if $debug{'filter'};
+
+            while (!$done) {
+                gloups("Unfinished EQ argument.")
+                    if ($pos == $length);
+
+                if ($quoted) {
+                    if ($filter[$pos] eq '\\') {
+                        if ($escaped) {
+                            $arg .= '\\';
+                            $escaped = 0;
+                        } else {
+                            $escaped = 1;
+                        }
+                    } elsif ($escaped) {
+                        if ($filter[$pos] eq '"') {
+                            $arg .= '"';
+                            $escaped = 0;
+                        } else {
+                            gloups("Invalid escape sequence in argument: '\\%s'",$filter[$pos]);
+                        }
+                    } else {
+                        if ($filter[$pos] eq '"') {
+                            $done = 1;
+                        } else {
+                            $arg .= $filter[$pos];
+                        }
+                    }
+                } else {
+                    if ($filter[$pos] eq ')') {
+                        # counter the next ++ since we don't want to eat
+                        # this char
+                        $pos--;
+                        $done = 1;
+                    } else {
+                        $arg .= $filter[$pos];
+                    }
+                }
+                $pos++;
+            }
+            # and now, add the code to check this equality
+            $code .= "(\$_[$fieldpos] =~ m/$arg/)";
+
+        }
+        showmethecode("End of expression")
+            if $debug{'filter'};
+        gloups("Unfinished statement.")
+            if ($pos == $length);
+        gloups("End of expression expected, got '%s'",$filter[$pos])
+            unless ($filter[$pos] eq ')');
+        $pos++;
+    }
+    # And now, launch the beast, finish the function and use eval
+    # to construct this function.
+    # Ok, the lack of lexer is a fair price for the eval ;)
+    parse_expression();
+    gloups("Garbage at the end of the expression")
+        if ($pos != $length);
+    $code .= "; }";
+    print STDERR "CODE = $code\n"
+        if $debug{'filter'};
+    eval $code;
+    die wrap_mod("po4a::po", dgettext("po4a", "Eval failure: %s"), $@)
+        if $@;
+
+    for (my $cpt=(0) ;
+         $cpt<$self->count_entries();
+         $cpt++) {
+
+        my ($msgid,$ref,$msgstr,$flags,$type,$comment,$automatic);
+
+        $msgid = $self->msgid($cpt);
+        $ref=$self->{po}{$msgid}{'reference'};
+
+        $msgstr= $self->{po}{$msgid}{'msgstr'};
+        $flags =  $self->{po}{$msgid}{'flags'};
+        $type = $self->{po}{$msgid}{'type'};
+        $comment = $self->{po}{$msgid}{'comment'};
+        $automatic = $self->{po}{$msgid}{'automatic'};
+
+        # DO NOT CHANGE THE ORDER
+        $res->push_raw('msgid' => $msgid,
+                       'msgstr' => $msgstr,
+                       'flags' => $flags,
+                       'type'  => $type,
+                       'reference' => $ref,
+                       'comment' => $comment,
+                       'automatic' => $automatic)
+               if (apply($msgid,$msgstr,$ref,$flags,$comment,$automatic));
+    }
+    # delete the apply subroutine
+    # otherwise it will be redefined.
+    undef &apply;
+    return $res;
+}
+
+=item to_utf8()
+
+Recodes to utf-8 the po's msgstrs. Does nothing if the charset is not
+specified in the po file ("CHARSET" value), or if it's already utf-8 or
+ascii.
+
+=cut
+
+sub to_utf8 {
+    my $this = shift;
+    my $charset = $this->get_charset();
+
+    unless ($charset eq "CHARSET" or
+            $charset =~ /^ascii$/i or
+            $charset =~ /^utf-8$/i) {
+        foreach my $msgid ( keys %{$this->{po}} ) {
+            Encode::from_to($this->{po}{$msgid}{'msgstr'}, $charset, "utf-8");
+        }
+        $this->set_charset("utf-8");
+    }
+}
+
+=back
+
+=head1 Functions to use a message catalog for translations
+
+=over 4
+
+=item gettext($%)
+
+Request the translation of the string given as argument in the current catalog.
+The function returns the original (untranslated) string if the string was not
+found.
+
+After the string to translate, you can pass a hash of extra
+arguments. Here are the valid entries:
+
+=over
+
+=item wrap
+
+boolean indicating whether we can consider that whitespaces in string are
+not important. If yes, the function canonizes the string before looking for
+a translation, and wraps the result.
+
+=item wrapcol
+
+The column at which we should wrap (default: 76).
+
+=back
+
+=cut
+
+sub gettext {
+    my $self=shift;
+    my $text=shift;
+    my (%opt)=@_;
+    my $res;
+
+    return "" unless defined($text) && length($text); # Avoid returning the header.
+    my $validoption="reference wrap wrapcol";
+    my %validoption;
+
+    map { $validoption{$_}=1 } (split(/ /,$validoption));
+    foreach (keys %opt) {
+        Carp::confess "internal error:  unknown arg $_.\n".
+                      "Here are the valid options: $validoption.\n"
+            unless $validoption{$_};
+    }
+
+    $text=canonize($text)
+        if ($opt{'wrap'});
+
+    my $esc_text=escape_text($text);
+
+    $self->{gettextqueries}++;
+
+    if (    defined $self->{po}{$esc_text}
+        and defined $self->{po}{$esc_text}{'msgstr'}
+        and length $self->{po}{$esc_text}{'msgstr'}
+        and (   not defined $self->{po}{$esc_text}{'flags'}
+             or $self->{po}{$esc_text}{'flags'} !~ /fuzzy/)) {
+
+        $self->{gettexthits}++;
+        $res = unescape_text($self->{po}{$esc_text}{'msgstr'});
+        if (defined $self->{po}{$esc_text}{'plural'}) {
+            if ($self->{po}{$esc_text}{'plural'} eq "0") {
+                warn wrap_mod("po4a gettextize", dgettext("po4a",
+                              "'%s' is the singular form of a message, ".
+                              "po4a will use the msgstr[0] translation (%s)."),
+                              $esc_text, $res);
+            } else {
+                warn wrap_mod("po4a gettextize", dgettext("po4a",
+                              "'%s' is the plural form of a message, ".
+                              "po4a will use the msgstr[1] translation (%s)."),
+                              $esc_text, $res);
+            }
+        }
+    } else {
+        $res = $text;
+    }
+
+    if ($opt{'wrap'}) {
+        if ($self->get_charset =~ /^utf-8$/i) {
+            $res=Encode::decode_utf8($res);
+            $res=wrap ($res, $opt{'wrapcol'} || 76);
+            $res=Encode::encode_utf8($res);
+        } else {
+            $res=wrap ($res, $opt{'wrapcol'} || 76);
+        }
+    }
+#    print STDERR "Gettext >>>$text<<<(escaped=$esc_text)=[[[$res]]]\n\n";
+    return $res;
+}
+
+=item stats_get()
+
+Returns statistics about the hit ratio of gettext since the last time that
+stats_clear() was called. Please note that it's not the same
+statistics than the one printed by msgfmt --statistic. Here, it's statistics
+about recent usage of the po file, while msgfmt reports the status of the
+file.  Example of use:
+
+    [some use of the po file to translate stuff]
+
+    ($percent,$hit,$queries) = $pofile->stats_get();
+    print "So far, we found translations for $percent\%  ($hit of $queries) of strings.\n";
+
+=cut
+
+sub stats_get() {
+    my $self=shift;
+    my ($h,$q)=($self->{gettexthits},$self->{gettextqueries});
+    my $p = ($q == 0 ? 100 : int($h/$q*10000)/100);
+
+#    $p =~ s/\.00//;
+#    $p =~ s/(\..)0/$1/;
+
+    return ( $p,$h,$q );
+}
+
+=item stats_clear()
+
+Clears the statistics about gettext hits.
+
+=cut
+
+sub stats_clear {
+    my $self = shift;
+    $self->{gettextqueries} = 0;
+    $self->{gettexthits} = 0;
+}
+
+=back
+
+=head1 Functions to build a message catalog
+
+=over 4
+
+=item push(%)
+
+Push a new entry at the end of the current catalog. The arguments should
+form a hash table. The valid keys are:
+
+=over 4
+
+=item msgid
+
+the string in original language.
+
+=item msgstr
+
+the translation.
+
+=item reference
+
+an indication of where this string was found. Example: file.c:46 (meaning
+in 'file.c' at line 46). It can be a space-separated list in case of
+multiple occurrences.
+
+=item comment
+
+a comment added here manually (by the translators). The format here is free.
+
+=item automatic
+
+a comment which was automatically added by the string extraction
+program. See the I<--add-comments> option of the B<xgettext> program for
+more information.
+
+=item flags
+
+space-separated list of all defined flags for this entry.
+
+Valid flags are: c-text, python-text, lisp-text, elisp-text, librep-text,
+smalltalk-text, java-text, awk-text, object-pascal-text, ycp-text,
+tcl-text, wrap, no-wrap and fuzzy.
+
+See the gettext documentation for their meaning.
+
+=item type
+
+This is mostly an internal argument: it is used while gettextizing
+documents. The idea here is to parse both the original and the translation
+into a po object, and merge them, using one's msgid as msgid and the
+other's msgid as msgstr. To make sure that things get ok, each msgid in po
+objects are given a type, based on their structure (like "chapt", "sect1",
+"p" and so on in docbook). If the types of strings are not the same, that
+means that both files do not share the same structure, and the process
+reports an error.
+
+This information is written as automatic comment in the po file since this
+gives to translators some context about the strings to translate.
+
+=item wrap
+
+boolean indicating whether whitespaces can be mangled in cosmetic
+reformattings. If true, the string is canonized before use.
+
+This information is written to the po file using the 'wrap' or 'no-wrap' flag.
+
+=item wrapcol
+
+The column at which we should wrap (default: 76).
+
+This information is not written to the po file.
+
+=back
+
+=cut
+
+sub push {
+    my $self=shift;
+    my %entry=@_;
+
+    my $validoption="wrap wrapcol type msgid msgstr automatic flags reference";
+    my %validoption;
+
+    map { $validoption{$_}=1 } (split(/ /,$validoption));
+    foreach (keys %entry) {
+        Carp::confess "internal error:  unknown arg $_.\n".
+                      "Here are the valid options: $validoption.\n"
+            unless $validoption{$_};
+    }
+
+    unless ($entry{'wrap'}) {
+        $entry{'flags'} .= " no-wrap";
+    }
+    if (defined ($entry{'msgid'})) {
+        $entry{'msgid'} = canonize($entry{'msgid'})
+            if ($entry{'wrap'});
+
+        $entry{'msgid'} = escape_text($entry{'msgid'});
+    }
+    if (defined ($entry{'msgstr'})) {
+        $entry{'msgstr'} = canonize($entry{'msgstr'})
+            if ($entry{'wrap'});
+
+        $entry{'msgstr'} = escape_text($entry{'msgstr'});
+    }
+
+    $self->push_raw(%entry);
+}
+
+# The same as push(), but assuming that msgid and msgstr are already escaped
+sub push_raw {
+    my $self=shift;
+    my %entry=@_;
+    my ($msgid,$msgstr,$reference,$comment,$automatic,$flags,$type)=
+        ($entry{'msgid'},$entry{'msgstr'},
+         $entry{'reference'},$entry{'comment'},$entry{'automatic'},
+         $entry{'flags'},$entry{'type'});
+    my $keep_conflict = $entry{'conflict'};
+
+#    print STDERR "Push_raw\n";
+#    print STDERR " msgid=>>>$msgid<<<\n" if $msgid;
+#    print STDERR " msgstr=[[[$msgstr]]]\n" if $msgstr;
+#    Carp::cluck " flags=$flags\n" if $flags;
+
+    return unless defined($entry{'msgid'});
+
+    #no msgid => header definition
+    unless (length($entry{'msgid'})) {
+#       if (defined($self->{header}) && $self->{header} =~ /\S/) {
+#           warn dgettext("po4a","Redefinition of the header. ".
+#                                "The old one will be discarded\n");
+#       } FIXME: do that iff the header isn't the default one.
+        $self->{header}=$msgstr;
+        $self->{header_comment}=$comment;
+        my $charset = $self->get_charset;
+        if ($charset ne "CHARSET") {
+            $self->{encoder}=find_encoding($charset);
+        } else {
+            $self->{encoder}=find_encoding("ascii");
+        }
+        return;
+    }
+
+    if ($self->{options}{'porefs'} eq "none") {
+        $reference = "";
+    } elsif ($self->{options}{'porefs'} eq "noline") {
+        $reference =~ s/:[0-9]*/:1/g;
+    }
+
+    if (defined($self->{po}{$msgid})) {
+        warn wrap_mod("po4a::po",
+                      dgettext("po4a","msgid defined twice: %s"),
+                      $msgid)
+            if (0); # FIXME: put a verbose stuff
+        if (    defined $msgstr
+            and defined $self->{po}{$msgid}{'msgstr'}
+            and $self->{po}{$msgid}{'msgstr'} ne $msgstr) {
+            my $txt=quote_text($msgid);
+            my ($first,$second)=
+                (format_comment(". ",$self->{po}{$msgid}{'reference'}).
+                 quote_text($self->{po}{$msgid}{'msgstr'}),
+
+                 format_comment(". ",$reference).
+                 quote_text($msgstr));
+
+            if ($keep_conflict) {
+                $msgstr = "#-#-#-#-#  choice  #-#-#-#-#\\n".
+                          $self->{po}{$msgid}{'msgstr'}."\\n".
+                          "#-#-#-#-#  choice  #-#-#-#-#\\n".
+                          "$msgstr";
+                $msgstr = "#-#-#-#-#  choice  #-#-#-#-#\\n".$msgstr
+                    unless ($msgstr =~ m/^#-#-#-#-#  choice  #-#-#-#-#\\n/s);
+            } else {
+            warn wrap_msg(dgettext("po4a",
+                                   "Translations don't match for:\n".
+                                   "%s\n".
+                                   "-->First translation:\n".
+                                   "%s\n".
+                                   " Second translation:\n".
+                                   "%s\n".
+                                   " Old translation discarded."),
+                          $txt,$first,$second);
+            }
+        }
+    }
+    if (defined $reference) {
+        if (defined $self->{po}{$msgid}{'reference'}) {
+            $self->{po}{$msgid}{'reference'} .= " ".$reference;
+        } else {
+            $self->{po}{$msgid}{'reference'} = $reference;
+        }
+    }
+    $self->{po}{$msgid}{'msgstr'} = $msgstr;
+    $self->{po}{$msgid}{'comment'} = $comment;
+    $self->{po}{$msgid}{'automatic'} = $automatic;
+    if (defined($self->{po}{$msgid}{'pos_doc'})) {
+        $self->{po}{$msgid}{'pos_doc'} .= " ".$self->{count_doc}++;
+    } else {
+        $self->{po}{$msgid}{'pos_doc'}  = $self->{count_doc}++;
+    }
+    unless (defined($self->{po}{$msgid}{'pos'})) {
+        $self->{po}{$msgid}{'pos'} = $self->{count}++;
+    }
+    $self->{po}{$msgid}{'type'} = $type;
+    $self->{po}{$msgid}{'plural'} = $entry{'plural'}
+        if defined $entry{'plural'};
+
+    if (defined($flags)) {
+        $flags = " $flags ";
+        $flags =~ s/,/ /g;
+        foreach my $flag (@known_flags) {
+            if ($flags =~ /\s$flag\s/) { # if flag to be set
+                unless (   defined($self->{po}{$msgid}{'flags'})
+                        && $self->{po}{$msgid}{'flags'} =~ /\b$flag\b/) {
+                    # flag not already set
+                    if (defined $self->{po}{$msgid}{'flags'}) {
+                        $self->{po}{$msgid}{'flags'} .= " ".$flag;
+                    } else {
+                        $self->{po}{$msgid}{'flags'} = $flag;
+                    }
+                }
+            }
+        }
+    }
+#    print STDERR "stored ((($msgid)))=>(((".$self->{po}{$msgid}{'msgstr'}.")))\n\n";
+
+}
+
+=back
+
+=head1 Miscellaneous functions
+
+=over 4
+
+=item count_entries()
+
+Returns the number of entries in the catalog (without the header).
+
+=cut
+
+sub count_entries($) {
+    my $self=shift;
+    return $self->{count};
+}
+
+=item count_entries_doc()
+
+Returns the number of entries in document. If a string appears multiple times
+in the document, it will be counted multiple times
+
+=cut
+
+sub count_entries_doc($) {
+    my $self=shift;
+    return $self->{count_doc};
+}
+
+=item msgid($)
+
+Returns the msgid of the given number.
+
+=cut
+
+sub msgid($$) {
+    my $self=shift;
+    my $num=shift;
+
+    foreach my $msgid ( keys %{$self->{po}} ) {
+        return $msgid if ($self->{po}{$msgid}{'pos'} eq $num);
+    }
+    return undef;
+}
+
+=item msgid_doc($)
+
+Returns the msgid with the given position in the document.
+
+=cut
+
+sub msgid_doc($$) {
+    my $self=shift;
+    my $num=shift;
+
+    foreach my $msgid ( keys %{$self->{po}} ) {
+        foreach my $pos (split / /, $self->{po}{$msgid}{'pos_doc'}) {
+            return $msgid if ($pos eq $num);
+        }
+    }
+    return undef;
+}
+
+=item get_charset()
+
+Returns the character set specified in the po header. If it hasn't been
+set, it will return "CHARSET".
+
+=cut
+
+sub get_charset() {
+    my $self=shift;
+    $self->{header} =~ /charset=(.*?)[\s\\]/;
+    return $1;
+}
+
+=item set_charset($)
+
+This sets the character set of the po header to the value specified in its
+first argument. If you never call this function (and no file with a specified
+character set is read), the default value is left to "CHARSET". This value
+doesn't change the behavior of this module, it's just used to fill that field
+in the header, and to return it in get_charset().
+
+=cut
+
+sub set_charset() {
+    my $self=shift;
+
+    my ($newchar,$oldchar);
+    $newchar = shift;
+    $oldchar = $self->get_charset();
+
+    $self->{header} =~ s/$oldchar/$newchar/;
+    $self->{encoder}=find_encoding($newchar);
+}
+
+#----[ helper functions ]---------------------------------------------------
+
+# transforme the string from its po file representation to the form which
+#   should be used to print it
+sub unescape_text {
+    my $text = shift;
+
+    print STDERR "\nunescape [$text]====" if $debug{'escape'};
+    $text = join("",split(/\n/,$text));
+    $text =~ s/\\"/"/g;
+    # unescape newlines
+    #   NOTE on \G:
+    #   The following regular expression introduce newlines.
+    #   Thus, ^ doesn't match all beginnings of lines.
+    #   \G is a zero-width assertion that matches the position
+    #   of the previous substitution with s///g. As every
+    #   substitution ends by a newline, it always matches a
+    #   position just after a newline.
+    $text =~ s/(           # $1:
+                (\G|[^\\]) #    beginning of the line or any char
+                           #    different from '\'
+                (\\\\)*    #    followed by any even number of '\'
+               )\\n        # and followed by an escaped newline
+              /$1\n/sgx;   # single string, match globally, allow comments
+    # unescape tabulations
+    $text =~ s/(          # $1:
+                (\G|[^\\])#    beginning of the line or any char
+                          #    different from '\'
+                (\\\\)*   #    followed by any even number of '\'
+               )\\t       # and followed by an escaped tabulation
+              /$1\t/mgx;  # multilines string, match globally, allow comments
+    # and unescape the escape character
+    $text =~ s/\\\\/\\/g;
+    print STDERR ">$text<\n" if $debug{'escape'};
+
+    return $text;
+}
+
+# transform the string to its representation as it should be written in po
+# files
+sub escape_text {
+    my $text = shift;
+
+    print STDERR "\nescape [$text]====" if $debug{'escape'};
+    $text =~ s/\\/\\\\/g;
+    $text =~ s/"/\\"/g;
+    $text =~ s/\n/\\n/g;
+    $text =~ s/\t/\\t/g;
+    print STDERR ">$text<\n" if $debug{'escape'};
+
+    return $text;
+}
+
+# put quotes around the string on each lines (without escaping it)
+# It does also normalize the text (ie, make sure its representation is wraped
+#   on the 80th char, but without changing the meaning of the string)
+sub quote_text {
+    my $string = shift;
+
+    return '""' unless defined($string) && length($string);
+
+    print STDERR "\nquote [$string]====" if $debug{'quote'};
+    # break lines on newlines, if any
+    # see unescape_text for an explanation on \G
+    $string =~ s/(           # $1:
+                  (\G|[^\\]) #    beginning of the line or any char
+                             #    different from '\'
+                  (\\\\)*    #    followed by any even number of '\'
+                 \\n)        # and followed by an escaped newline
+                /$1\n/sgx;   # single string, match globally, allow comments
+    $string = wrap($string);
+    my @string = split(/\n/,$string);
+    $string = join ("\"\n\"",@string);
+    $string = "\"$string\"";
+    if (scalar @string > 1 && $string[0] ne '') {
+        $string = "\"\"\n".$string;
+    }
+
+    print STDERR ">$string<\n" if $debug{'quote'};
+    return $string;
+}
+
+# undo the work of the quote_text function
+sub unquote_text {
+    my $string = shift;
+    print STDERR "\nunquote [$string]====" if $debug{'quote'};
+    $string =~ s/^""\\n//s;
+    $string =~ s/^"(.*)"$/$1/s;
+    $string =~ s/"\n"//gm;
+    # Note: an even number of '\' could precede \\n, but I could not build a
+    # document to test this
+    $string =~ s/([^\\])\\n\n/$1!!DUMMYPOPM!!/gm;
+    $string =~ s|!!DUMMYPOPM!!|\\n|gm;
+    print STDERR ">$string<\n" if $debug{'quote'};
+    return $string;
+}
+
+# canonize the string: write it on only one line, changing consecutive
+# whitespace to only one space.
+# Warning, it changes the string and should only be called if the string is
+# plain text
+sub canonize {
+    my $text=shift;
+    print STDERR "\ncanonize [$text]====" if $debug{'canonize'};
+    $text =~ s/^ *//s;
+    $text =~ s/^[ \t]+/  /gm;
+    # if ($text eq "\n"), it messed up the first string (header)
+    $text =~ s/\n/  /gm if ($text ne "\n");
+    $text =~ s/([.)])  +/$1  /gm;
+    $text =~ s/([^.)])  */$1 /gm;
+    $text =~ s/ *$//s;
+    print STDERR ">$text<\n" if $debug{'canonize'};
+    return $text;
+}
+
+# wraps the string. We don't use Text::Wrap since it mangles whitespace at
+# the end of splited line
+sub wrap {
+    my $text=shift;
+    return "0" if ($text eq '0');
+    my $col=shift || 76;
+    my @lines=split(/\n/,"$text");
+    my $res="";
+    my $first=1;
+    while (defined(my $line=shift @lines)) {
+        if ($first && length($line) > $col - 10) {
+            unshift @lines,$line;
+            $first=0;
+            next;
+        }
+        if (length($line) > $col) {
+            my $pos=rindex($line," ",$col);
+            while (substr($line,$pos-1,1) eq '.' && $pos != -1) {
+                $pos=rindex($line," ",$pos-1);
+            }
+            if ($pos == -1) {
+                # There are no spaces in the first $col chars, pick-up the
+                # first space
+                $pos = index($line," ");
+            }
+            if ($pos != -1) {
+                my $end=substr($line,$pos+1);
+                $line=substr($line,0,$pos+1);
+                if ($end =~ s/^( +)//) {
+                    $line .= $1;
+                }
+                unshift @lines,$end;
+            }
+        }
+        $first=0;
+        $res.="$line\n";
+    }
+    # Restore the original trailing spaces
+    $res =~ s/\s+$//s;
+    if ($text =~ m/(\s+)$/s) {
+        $res .= $1;
+    }
+    return $res;
+}
+
+# outputs properly a '# ... ' line to be put in the po file
+sub format_comment {
+    my $comment=shift;
+    my $char=shift;
+    my $result = "#". $char . $comment;
+    $result =~ s/\n/\n#$char/gs;
+    $result =~ s/^#$char$/#/gm;
+    $result .= "\n";
+    return $result;
+}
+
+
+1;
+__END__
+
+=back
+
+=head1 AUTHORS
+
+ Denis Barbier <barbier@xxxxxxxxxxx>
+ Martin Quinson (mquinson#debian.org)
+
+=cut

Added: po4a/lib/Locale/Po4a/Pod.pm
===================================================================
--- po4a/lib/Locale/Po4a/Pod.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Pod.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,306 @@
+# Locale::Po4a::Pod -- Convert POD data to PO file, for translation.
+# $Id: Pod.pm,v 1.21 2006-06-13 19:57:17 nekral-guest Exp $
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the terms of GPL (see COPYING file).
+#
+# This module converts POD to PO file, so that it becomes possible to 
+# translate POD formatted documentation. See gettext documentation for
+# more info about PO files.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+use Pod::Parser;
+use Locale::Po4a::TransTractor qw(process new);
+
+package Locale::Po4a::Pod;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+
+use vars qw(@ISA);
+@ISA = qw(Locale::Po4a::TransTractor Pod::Parser);
+
+sub initialize {}
+
+sub translate {
+    my ($self,$str,$ref,$type) = @_;
+    my (%options)=@_;
+
+    $str = $self->pre_trans($str,$ref,$type);
+    $str = $self->SUPER::translate($str, $ref, $type, %options);
+    $str = $self->post_trans($str,$ref,$type);
+
+    return $str;
+}
+
+sub pre_trans {
+    my ($self,$str,$ref,$type)=@_;
+
+    return $str;
+}
+
+sub post_trans {
+    my ($self,$str,$ref,$type)=@_;
+
+    # Change ascii non-breaking space to POD one
+    my $nbs_out = "\xA0";
+    my $enc_length = Encode::from_to($nbs_out, "latin1",
+                                               $self->get_out_charset);
+    if (defined $enc_length) {
+        while ($str =~ m/(^|.*\s)(\S+?)\Q$nbs_out\E(\S+?)(\s.*$|$)/s) {
+            my ($begin, $m1, $m2, $end) = ($1, $2, $3, $4);
+            $str  = (defined $begin)?$begin:"";
+            # Remove the non-breaking spaces in the string that will be
+            # between S<...>
+            $m2 =~ s/\Q$nbs_out\E/ /g;
+            $str .= "S<$m1 $m2>";
+            $str .= (defined $end)?$end:"";
+        }
+    }
+
+    return $str;
+}
+
+
+sub command {
+    my ($self, $command, $paragraph, $line_num) = @_;
+#    print STDOUT "cmd: '$command' '$paragraph' at $line_num\n";
+    if ($command eq 'back'
+	|| $command eq 'cut'
+	|| $command eq 'pod') {
+	$self->pushline("=$command\n\n");
+    } elsif ($command eq 'over') {
+	$self->pushline("=$command $paragraph".(length($paragraph)?"":"\n\n"));
+    } else {
+	$paragraph=$self->translate($paragraph,
+				    $self->input_file().":$line_num",
+				    "=$command",
+				    "wrap"=>1);
+	$self->pushline("=$command $paragraph\n\n");
+    }
+}
+
+sub verbatim {
+    my ($self, $paragraph, $line_num) = @_;
+#    print "verb: '$paragraph' at $line_num\n";
+
+    if ($paragraph eq "\n") {
+	$self->pushline("$paragraph\n");
+	return;
+    }
+    $paragraph=$self->translate($paragraph,
+				$self->input_file().":$line_num",
+				"verbatim");
+    $paragraph =~ s/\n$//m;
+    $self->pushline("$paragraph\n");
+}
+
+sub textblock {
+    my ($self, $paragraph, $line_num) = @_;
+#    print "text: '$paragraph' at $line_num\n";
+
+    # Fix a pretty damned bug. 
+    # Podlators don't wrap explicitelly the text, and groff won't seem to
+    #  wrap any line begining with a space. So, we have to consider as
+    #  verbatim not only the paragraphs whose first line is indented, but
+    #  the paragraph containing an indented line.
+    # That way, we'll declare more paragraphs as verbatim than needed, but
+    #  that's harmless (only less confortable for translators).
+
+    if ($paragraph eq "\n") {
+	$self->pushline("$paragraph\n");
+	return;
+    }
+    if ($paragraph =~ m/^[ \t]/m) {
+	$self->verbatim($paragraph, $line_num) ;
+	return;
+    }
+
+    $paragraph=$self->translate($paragraph,
+				$self->input_file().":$line_num",
+				'textblock',
+				"wrap"=>1);
+    $paragraph=~ s/ +\n/\n/gm;
+    $self->pushline("$paragraph\n\n");
+}
+
+sub end_pod {}
+
+sub read {
+    my ($self,$filename)=@_;
+
+    push @{$self->{DOCPOD}{infile}}, $filename;
+    $self->Locale::Po4a::TransTractor::read($filename);
+}
+
+sub parse {
+    my $self=shift;
+    map {$self->parse_from_file($_)} @{$self->{DOCPOD}{infile}};
+}
+
+sub docheader {
+    return <<EOT;
+
+        *****************************************************
+        *           GENERATED FILE, DO NOT EDIT             * 
+        * THIS IS NO SOURCE FILE, BUT RESULT OF COMPILATION *
+        *****************************************************
+
+This file was generated by po4a(7). Do not store it (in cvs, for example),
+but store the po file used as source file by po4a-translate. 
+
+In fact, consider this as a binary, and the po file as a regular .c file:
+If the po get lost, keeping this translation up-to-date will be harder.
+
+EOT
+}
+1;
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Locale::Po4a::Pod - Convert POD data from/to PO files
+
+=head1 SYNOPSIS
+
+    use Locale::Po4a::Pod;
+    my $parser = Locale::Po4a::Pod->new (sentence => 0, width => 78);
+
+    # Read POD from STDIN and write to STDOUT.
+    $parser->parse_from_filehandle;
+
+    # Read POD from file.pod and write to file.txt.
+    $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Locale::Po4a::Pod is a module to help the translation of documentation in
+the POD format (the preferred language for documenting Perl) into other
+[human] languages.
+
+=head1 STATUS OF THIS MODULE
+
+I think that this module is rock stable, and there is only one known bug:
+
+I have another problem with /usr/lib/perl5/Tk/MainWindow.pod (and some other
+pages, see below) which contains:
+
+  CE<lt>" #n"E<gt>
+
+Lack of luck, in the po4a version, this was splited on the space by the
+wrapping. As result, in the original version, the man contain 
+
+ " #n"
+
+and mine contain
+
+ "" #n""
+ 
+which is logic since C<foobar> is rewritten "foobar"
+
+Complete list of pages having this problem on my box (from 564 pages ; note
+that it depends on the chosen wrapping column):
+/usr/lib/perl5/Tk/MainWindow.pod
+/usr/share/perl/5.8.0/overload.pod
+/usr/share/perl/5.8.0/pod/perlapi.pod
+/usr/share/perl/5.8.0/pod/perldelta.pod
+/usr/share/perl/5.8.0/pod/perlfaq5.pod
+/usr/share/perl/5.8.0/pod/perlpod.pod
+/usr/share/perl/5.8.0/pod/perlre.pod
+/usr/share/perl/5.8.0/pod/perlretut.pod
+
+
+
+=head1 INTERNALS
+
+As a derived class from Pod::Parser, Locale::Po4a::Pod supports the same
+methods and interfaces.  See L<Pod::Parser> for all the details; briefly,
+one creates a new parser with C<< Locale::Po4a::Pod->new() >> and then
+calls either parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs, that control the
+behavior of the parser.  The recognized options common to all Pod::Parser
+children are:
+
+=over 4
+
+=item alt
+
+If set to a true value, selects an alternate output format that, among other
+things, uses a different heading style and marks C<=item> entries with a
+colon in the left margin.  Defaults to false.
+
+=item code
+
+If set to a true value, the non-POD parts of the input file will be included
+in the output.  Useful for viewing code documented with POD blocks with the
+POD rendered and the code left intact.
+
+=item indent
+
+The number of spaces to indent regular text, and the default indentation for
+C<=over> blocks.  Defaults to 4.
+
+=item loose
+
+If set to a true value, a blank line is printed after a C<=head1> heading.
+If set to false (the default), no blank line is printed after C<=head1>,
+although one is still printed after C<=head2>.  This is the default because
+it's the expected formatting for manual pages; if you're formatting
+arbitrary text documents, setting this to true may result in more pleasing
+output.
+
+=item quotes
+
+Sets the quote marks used to surround CE<lt>> text.  If the value is a
+single character, it is used as both the left and right quote; if it is two
+characters, the first character is used as the left quote and the second as
+the right quoted; and if it is four characters, the first two are used as
+the left quote and the second two as the right quote.
+
+This may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text.
+
+=item sentence
+
+If set to a true value, Locale::Po4a::Pod will assume that each sentence
+ends in two spaces, and will try to preserve that spacing.  If set to
+false, all consecutive whitespace in non-verbatim paragraphs is compressed
+into a single space.  Defaults to true.
+
+=item width
+
+The column at which to wrap text on the right-hand side.  Defaults to 76.
+
+=back
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)>,
+L<Locale::Po4a::Man(3pm)>,
+
+=head1 AUTHORS
+
+ Denis Barbier <barbier@xxxxxxxxxxx>
+ Martin Quinson (mquinson#debian.org)
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2002 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut

Added: po4a/lib/Locale/Po4a/Sgml.pm
===================================================================
--- po4a/lib/Locale/Po4a/Sgml.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Sgml.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1253 @@
+#!/usr/bin/perl -w
+
+# Po4a::Sgml.pm
+#
+# extract and translate translatable strings from an sgml based document.
+#
+# This code is an adapted version of sgmlspl (SGML postprocessor for the
+#   SGMLS and NSGMLS parsers) which was:
+#
+# Copyright (c) 1995 by David Megginson <dmeggins@xxxxxxxxxxxxxxx>
+#
+# The adaptation for po4a was done by Denis Barbier <barbier@xxxxxxxxxxx>,
+# Martin Quinson (mquinson#debian.org) and others.
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Sgml - Convert sgml documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Sgml is a module to help the translation of documentation in
+the SGML format into other [human] languages.
+
+This module uses B<nsgmls> to parse the SGML files. Make sure it is
+installed.
+Also make sure that the DTD of the SGML files are installed in the system.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+=over 4
+
+=item debug
+
+Space separated list of keywords indicating which part you want to debug. Possible values are: tag, generic, entities and refs.
+
+=item verbose
+
+Give more information about what's going on.
+
+=item translate
+
+Space separated list of extra tags (beside the dtd provided ones) whose
+content should form an extra msgid.
+
+=item section
+
+Space separated list of extra tags (beside the dtd provided ones)
+containing other tags, some of them being of category 'translate'.
+
+=item indent
+
+Space separated list of tags which increase the indentation level.
+
+=item verbatim
+
+The layout within those tags should not be changed. The paragraph won't get
+wrapped, and no extra indentation space or new line will be added for
+cosmetic purpose.
+
+=item empty
+
+Tags not needing to be closed.
+
+=item ignore
+
+Tags ignored and considered as plain char data by po4a. That is to say that
+they can be part of an msgid. For example, E<lt>bE<gt> is a good candidate
+for this category since putting it in the translate section would create
+msgids not being whole sentences, which is bad.
+
+=item attributes
+
+A space separated list of attributes that need to be translated. You can
+specify the attributes by their name (for example, "lang"), but you can also
+prefix it with a tag hierarchy, to specify that this attribute will only be
+translated when it is into the specified tag. For example:
+E<lt>bbbE<gt>E<lt>aaaE<gt>lang specifies that the lang attribute will only be
+translated if it is in an E<lt>aaaE<gt> tag, which is in a E<lt>bbbE<gt> tag.
+The tag names are actually regular expressions so you can also write things
+like E<lt>aaa|bbbbE<gt>lang to only translate lang attributes that are in
+an E<lt>aaaE<gt> or a E<lt>bbbE<gt> tag.
+
+=item qualify
+
+A space separated list of attributes for which the translation must be
+qualified by the attribute name. Note that this setting automatically adds the
+given attribute into the 'attributes' list too.
+
+=item force
+
+Proceed even if the DTD is unknown or if nsgmls finds errors in the input
+file.
+
+=item include-all
+
+By default, msgids containing only one entity (like '&version;') are skipped
+for the translator comfort. Activating this option prevents this
+optimisation. It can be useful if the document contains a construction like
+"<title>&Aacute;</title>", even if I doubt such things to ever happen...
+
+=item ignore-inclusion
+
+Space separated list of entities that won't be inlined.
+Use this option with caution: it may cause nsgmls (used internally) to add
+tags and render the output document invalid.
+
+=back
+
+=head1 STATUS OF THIS MODULE
+
+The result is perfect. I.e., the generated documents are exactly the
+same. But there are still some problems:
+
+=over 2
+
+=item *
+
+the error output of nsgmls is redirected to /dev/null, which is clearly
+bad. I don't know how to avoid that.
+
+The problem is that I have to "protect" the conditional inclusions (ie, the
+C<E<lt>! [ %foo [> and C<]]E<gt>> stuff) from nsgmls. Otherwise
+nsgmls eats them, and I don't know how to restore them in the final
+document. To prevent that, I rewrite them to C<{PO4A-beg-foo}> and
+C<{PO4A-end}>.
+
+The problem with this is that the C<{PO4A-end}> and such I add are valid in
+the document (not in a E<lt>pE<gt> tag or so).
+
+Everything works well with nsgmls's output redirected that way, but it will
+prevent us from detecting that the document is badly formatted.
+
+=item *
+
+It does work only with the debiandoc and docbook dtd. Adding support for a
+new dtd should be very easy. The mechanism is the same for every dtd, you just
+have to give a list of the existing tags and some of their characteristics.
+
+I agree, this needs some more documentation, but it is still considered as
+beta, and I hate to document stuff which may/will change.
+
+=item *
+
+Warning, support for dtds is quite experimental. I did not read any
+reference manual to find the definition of every tag. I did add tag
+definition to the module 'till it works for some documents I found on the
+net. If your document use more tags than mine, it won't work. But as I said
+above, fixing that should be quite easy.
+
+I did test docbook against the SAG (System Administrator Guide) only, but
+this document is quite big, and should use most of the docbook
+specificities.
+
+For debiandoc, I tested some of the manuals from the DDP, but not all yet.
+
+=item *
+
+In case of file inclusion, string reference of messages in po files (ie,
+lines like C<#: en/titletoc.sgml:9460>) will be wrong.
+
+This is because I preprocess the file to protect the conditional inclusion
+(ie, the C<E<lt>! [ %foo [> and C<]]E<gt>> stuff) and some entities (like
+&version;) from nsgmls because I want them verbatim to the generated
+document. For that, I make a temp copy of the input file and do all the
+changes I want to this before passing it to nsgmls for parsing.
+
+So that it works, I replace the entities asking for a file inclusion by the
+content of the given file (so that I can protect what needs to in subfile
+also). But nothing is done so far to correct the references (i.e., filename
+and line number) afterward. I'm not sure what the best thing to do is.
+
+=back
+
+=cut
+
+package Locale::Po4a::Sgml;
+
+use 5.006;
+use strict;
+use warnings;
+
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+
+eval qq{use SGMLS};
+if ($@) {
+  die wrap_mod("po4a::sgml", dgettext("po4a","The needed module SGMLS.pm was not found and needs to be installed. It can be found on the CPAN, in package libsgmls-perl on debian, etc."));
+}
+
+use File::Temp;
+
+my %debug=('tag'      => 0,
+	   'generic'  => 0,
+	   'entities' => 0,
+	   'refs'     => 0,
+	   'nsgmls'   => 0);
+
+my $xmlprolog = undef; # the '<?xml ... ?>' line if existing
+
+sub initialize {
+    my $self = shift;
+    my %options = @_;
+
+    $self->{options}{'translate'}='';
+    $self->{options}{'section'}='';
+    $self->{options}{'indent'}='';
+    $self->{options}{'empty'}='';
+    $self->{options}{'verbatim'}='';
+    $self->{options}{'ignore'}='';
+    $self->{options}{'ignore-inclusion'}='';
+
+    $self->{options}{'include-all'}='';
+
+    $self->{options}{'force'}='';
+
+    $self->{options}{'verbose'}='';
+    $self->{options}{'debug'}='';
+
+    foreach my $opt (keys %options) {
+	if ($options{$opt}) {
+	    die wrap_mod("po4a::sgml", dgettext ("po4a", "Unknown option: %s"), $opt) unless exists $self->{options}{$opt};
+	    $self->{options}{$opt} = $options{$opt};
+	}
+    }
+    if ($options{'debug'}) {
+	foreach (split /\s+/, $options{'debug'}) {
+	    $debug{$_} = 1;
+	}
+    }
+}
+
+sub read {
+    my ($self,$filename)=@_;
+
+    push @{$self->{DOCPOD}{infile}}, $filename;
+    $self->Locale::Po4a::TransTractor::read($filename);
+}
+
+sub parse {
+    my $self=shift;
+    map {$self->parse_file($_)} @{$self->{DOCPOD}{infile}};
+}
+
+#
+# Filter out some uninteresting strings for translation
+#
+sub translate {
+    my ($self)=(shift);
+    my ($string,$ref,$type)=(shift,shift,shift);
+    my (%options)=@_;
+
+    # don't translate entries composed of one entity
+    if ( (($string =~ /^&[^;]*;$/) || ($options{'wrap'} && $string =~ /^\s*&[^;]*;\s*$/))
+	 && !($self->{options}{'include-all'}) ){
+	warn wrap_mod("po4a::sgml", dgettext("po4a", "msgid skipped to help translators (contains only an entity)"), $string)
+	    unless $self->verbose() <= 0;
+	return $string.($options{'wrap'}?"\n":"");
+    }
+    # don't translate entries composed of tags only
+    if ( $string =~ /^(((<[^>]*>)|\s)*)$/
+	 && !($self->{options}{'include-all'}) ) {
+	warn wrap_mod("po4a::sgml", dgettext("po4a", "msgid skipped to help translators (contains only tags)"), $string)
+	       unless $self->verbose() <= 0;
+	return $string.($options{'wrap'}?"\n":"");
+    }
+
+    # don't translate entries composed of marked section tags only
+    if (   ($string =~ /^(?:<!\s*\[\s*[^\[]+\s*\[|\]\s*]\s*>|\s)*$/)
+        && !($self->{options}{'include-all'})) {
+        warn wrap_mod("po4a::sgml", dgettext("po4a", "msgid skipped to ".
+                      "help translators (contains only opening or closing ".
+                      "tags of marked sections)"), $string)
+               unless $self->verbose() <= 0;
+        return $string.($options{'wrap'}?"\n":"");
+    }
+
+    $string = $self->SUPER::translate($string,$ref,$type,%options);
+
+    $string = $self->post_trans($string,$ref,$type);
+
+    return $string;
+}
+
+sub post_trans {
+    my ($self,$str,$ref,$type)=@_;
+
+    # Change ascii non-breaking space to an &nbsp;
+    my $nbs_out = "\xA0";
+    my $enc_length = Encode::from_to($nbs_out, "latin1",
+                                               $self->get_out_charset);
+    $str =~ s/\Q$nbs_out/&nbsp;/g if defined $enc_length;
+
+    return $str;
+}
+
+#
+# Make sure our cruft is removed from the file
+#
+sub pushline {
+    my ($self,$line)=@_;
+    $line =~ s/{PO4A-amp}/&/g;
+    $self->SUPER::pushline($line);
+}
+
+sub set_tags_kind {
+    my $self=shift;
+    my (%kinds)=@_;
+
+    foreach (qw(translate empty section verbatim ignore attributes qualify)) {
+	$self->{SGML}->{k}{$_} = $self->{options}{$_} ? $self->{options}{$_}.' ' : '';
+        # Remove the default behavior for the tags defined with the
+        # options.
+        foreach my $k (keys %kinds) {
+            foreach my $t (split(" ", $self->{SGML}->{k}{$_})) {
+                $kinds{$k} =~ s/\b$t\b//;
+            }
+        }
+    }
+
+    foreach (keys %kinds) {
+	die "po4a::sgml: internal error: set_tags_kind called with unrecognized arg $_"
+	    if ($_ !~ /^(translate|empty|verbatim|ignore|indent|attributes|qualify)$/);
+
+	$self->{SGML}->{k}{$_} .= $kinds{$_};
+    }
+}
+
+#
+# Do the actual work, using the SGMLS package and settings done elsewhere.
+#
+sub parse_file {
+    my ($self,$mastername)=@_;
+    my ($prolog);
+
+    # Rewrite the file to:
+    #   - protect optional inclusion marker (ie, "<![ %str [" and "]]>")
+    #   - protect entities from expansion (ie "&release;")
+    my $origfile="";
+    my $i=0;
+    while ($i < @{$self->{TT}{doc_in}}) {
+        $origfile .= ${$self->{TT}{doc_in}}[$i];
+        $i+=2;
+    }
+    unless ($self->{options}{'force'}) {
+    # Detect if we can find the DTD
+    open (VALID, "| nsgmls -p")
+        or die wrap_mod("po4a::sgml",
+                        dgettext("po4a", "Can't run nsgmls -p: %s"), $!);
+    print VALID $origfile;
+    close VALID
+        or die wrap_mod("po4a::sgml",
+                        dgettext("po4a", "Error while running nsgmls -p.  ".
+                                         "Please check if nsgmls and the ".
+                                         "DTD are installed."));
+    }
+    # Detect the XML pre-prolog
+    if ($origfile =~ s/^(\s*<\?xml[^?]*\?>)//) {
+	warn wrap_mod("po4a::sgml", dgettext("po4a",
+		"Trying to handle a XML document as a SGML one. ".
+		"Feel lucky if it works, help us implementing a proper XML backend if it does not."), $mastername)
+	  unless $self->verbose() <= 0;
+	$xmlprolog=$1;
+    }
+    # Get the prolog
+    {
+	$prolog=$origfile;
+	my $lvl;    # number of '<' seen without matching '>'
+	my $pos = 0;  # where in the document (in chars) while detecting prolog boundaries
+
+	unless ($prolog =~ s/^(.*<!DOCTYPE).*$/$1/is) {
+	    die wrap_mod("po4a::sgml", dgettext("po4a",
+		"This file is not a master SGML document (no DOCTYPE). ".
+		"It may be a file to be included by another one, in which case it should not be passed to po4a directly. Text from included files is extracted/translated when handling the master file including them."));
+	}
+	$pos += length($prolog);
+	$lvl=1;
+	while ($lvl != 0) {
+	    # Eat comments in the prolog, since there may be some '>' or '<' in them.
+	    if ($origfile =~ m/^.{$pos}?(<!--.*?-->)/s) {
+		print "Found a comment in the prolog: $1\n" if ($debug{'generic'});
+		$pos += length($1);
+		# take care of the line numbers
+		my @a = split(/\n/,$1);
+		shift @a; # nb line - 1
+		while (defined(shift @a)) {
+		    $prolog .= "\n";
+		}
+		next;
+	    }
+	    # Search the closing '>'
+	    my ($c)=substr($origfile,$pos,1);
+	    $lvl++ if ($c eq '<');
+	    $lvl-- if ($c eq '>');
+	    $prolog = "$prolog$c";
+	    $pos++;
+	}
+    }
+
+    # Add the definition of new tags that will be used for the
+    # conditionnal inclusions
+    if ($origfile =~ /^.*<!DOCTYPE[^[>]*\[/is) {
+        $origfile =~ s/^(.*<!DOCTYPE[^[>]*\[)/$1 <!ELEMENT PO4ABEG - o empty> <!ATTLIST PO4ABEG name CDATA #REQUIRED> <!ELEMENT PO4AEND - o empty>/is;
+    }
+
+    print STDERR "PROLOG=$prolog\n------------\n" if ($debug{'generic'});
+
+    # Configure the tags for this dtd
+    if ($prolog =~ /debiandoc/i) {
+	$self->set_tags_kind("translate" => "author version abstract title".
+			                    "date copyrightsummary heading p ".
+			                    "example tag title",
+			     "empty"     => "date ref manref url toc",
+			     "verbatim"  => "example",
+			     "ignore"    => "package prgn file tt em var ".
+					    "name email footnote po4aend po4abeg ".
+			                    "strong ftpsite ftppath qref",
+			     "indent"    => "appendix ".
+	                                    "book ".
+	                                    "chapt copyright ".
+			                    "debiandoc ".
+			                    "enumlist ".
+			                    "item ".
+			                    "list ".
+	                                    "sect sect1 sect2 sect3 sect4 ".
+			                    "tag taglist titlepag toc");
+
+    } elsif ($prolog =~ /docbook/i) {
+	$self->set_tags_kind("translate" => "abbrev acronym artheader attribution ".
+	                                    "date ".
+	                                    "edition editor entry ".
+	                                    "figure ".
+	                                    "glosssee glossseealso glossterm ".
+	                                    "holder ".
+	                                    "member msgaud msglevel msgorig ".
+	                                    "orgname othername ".
+	                                    "para phrase pubdate publishername primary ".
+	                                    "refclass refdescriptor refentrytitle refmiscinfo refname refpurpose releaseinfo remark revnumber revremark ".
+	                                    "screeninfo seg secondary segtitle simpara subtitle synopfragmentref synopsis ".
+	                                    "term tertiary title titleabbrev ".
+	                                    "contrib epigraph",
+	                     "empty"     => "audiodata colspec graphic imagedata textdata sbr videodata xref",
+	                     "indent"    => "abstract answer appendix article articleinfo audioobject author authorgroup ".
+	                                    "bibliodiv bibliography blockquote blockinfo book bookinfo bridgehead ".
+	                                    "callout calloutlist caption caution chapter copyright ".
+	                                    "dedication docinfo ".
+	                                    "entry ".
+	                                    "formalpara ".
+	                                    "glossary glossdef glossdiv glossentry glosslist group ".
+	                                    "imageobject important index indexterm informaltable itemizedlist ".
+	                                    "keyword keywordset ".
+	                                    "legalnotice listitem lot ".
+	                                    "mediaobject msg msgentry msginfo msgexplan msgmain msgrel msgsub msgtext ".
+	                                    "note ".
+	                                    "objectinfo orderedlist ".
+	                                    "part partintro preface procedure publisher ".
+	                                    "qandadiv qandaentry qandaset question ".
+	                                    "reference refentry refentryinfo refmeta refnamediv refsect1 refsect1info refsect2 refsect2info refsect3 refsect3info refsection refsectioninfo refsynopsisdiv refsynopsisdivinfo revision revdescription row ".
+	                                    "screenshot sect1 sect1info sect2 sect2info sect3 sect3info sect4 sect4info sect5 sect5info section sectioninfo seglistitem segmentedlist set setindex setinfo shortcut simplelist simplemsgentry simplesect step synopfragment ".
+	                                    "table tbody textobject tgroup thead tip toc ".
+	                                    "variablelist varlistentry videoobject ".
+	                                    "warning",
+	                     "verbatim"  => "address cmdsynopsis holder literallayout programlisting ".
+	                                    "refentrytitle refname refpurpose screen term title",
+	                     "ignore"    => "action affiliation anchor application arg author authorinitials ".
+	                                    "command citation citerefentry citetitle classname co computeroutput constant corpauthor ".
+	                                    "database po4abeg po4aend ".
+	                                    "email emphasis envar errorcode errorname errortext errortype exceptionname ".
+	                                    "filename firstname firstterm footnote footnoteref foreignphrase function ".
+	                                    "glossterm guibutton guiicon guilabel guimenu guimenuitem guisubmenu ".
+	                                    "hardware ".
+	                                    "indexterm informalexample inlineequation inlinegraphic inlinemediaobject interface interfacename ".
+	                                    "keycap keycode keycombo keysym ".
+	                                    "link literal ".
+	                                    "manvolnum markup medialabel menuchoice methodname modespec mousebutton ".
+	                                    "nonterminal ".
+	                                    "olink ooclass ooexception oointerface option optional othercredit ".
+	                                    "parameter personname phrase productname productnumber prompt property ".
+	                                    "quote ".
+	                                    "remark replaceable returnvalue revhistory ".
+	                                    "sgmltag sidebar structfield structname subscript superscript surname symbol systemitem ".
+	                                    "token trademark type ".
+	                                    "ulink userinput ".
+	                                    "varname ".
+	                                    "wordasword ".
+	                                    "xref ".
+	                                    "year",
+	                     "attributes" =>"<(article|book)>lang");
+
+    } else {
+	if ($self->{options}{'force'}) {
+	    warn wrap_mod("po4a::sgml", dgettext("po4a", "DTD of this file is unknown, but proceeding as requested."));
+	    $self->set_tags_kind();
+	} else {
+	    die wrap_mod("po4a::sgml", dgettext("po4a",
+		"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog follows:")."\n$prolog");
+	}
+    }
+
+    # Hash of the file entities that won't be included
+    my %ignored_inclusion = ();
+    foreach (split / /,$self->{options}{'ignore-inclusion'}) {
+        $ignored_inclusion{$_} = 1;
+    }
+
+    # Prepare the reference indirection stuff
+    my @refs;
+    my $length = ($origfile =~ tr/\n/\n/);
+    print "XX Prepare reference indirection stuff\n" if $debug{'refs'};
+    for (my $i=1; $i<=$length; $i++) {
+	push @refs,"$mastername:$i";
+	print "$mastername:$i\n" if $debug{'refs'};
+    }
+
+    # protect the conditional inclusions in the file
+    $origfile =~ s/<!\[\s*IGNORE\s*\[/{PO4A-beg-IGNORE}/g; # cond. incl. starts
+    $origfile =~ s/<!\[\s*CDATA\s*\[/{PO4A-beg-CDATA}/g; # cond. incl. starts
+    $origfile =~ s/<!\[\s*RCDATA\s*\[/{PO4A-beg-RCDATA}/g; # cond. incl. starts
+    $origfile =~ s/<!\[\s*([^\[\s]+)\s*\[/<po4abeg name="$1">/g; # cond. incl. starts
+    $origfile =~ s/\]\]>/<po4aend>/g;                # cond. incl. end
+
+    # Remove <![ IGNORE [ sections
+    # FIXME: we don't support included PO4A-beg-
+    my $tmp1 = $origfile;
+    while ($tmp1 =~ m/^(.*?)({PO4A-beg-\s*IGNORE\s*}(?:.+?)<po4aend>)(.*)$/s)
+    {
+        my ($begin,$ignored,$end) = ($1, $2, $3);
+        my @begin   = split(/\n/, $begin);
+        my @ignored = split(/\n/, $ignored);
+        my $pre = scalar @begin;
+        my $len = (scalar @ignored) -1;
+        $pre++ if ($begin =~ /\n$/s);
+        $len++ if ($end   =~ /^\n/s);
+        # remove the references of the ignored lines
+        splice @refs, $pre+1, $len-1;
+        # remove the lines
+        $tmp1 = $begin.$end;
+    }
+    $origfile = $tmp1;
+    # The <, >, and & in a CDATA must be escaped because they do not
+    # correspond to tags or entities delimiters.
+    $tmp1 = $origfile;
+    $origfile = "";
+    while ($tmp1 =~ m/^(.*?{PO4A-beg-\s*(?:CDATA|RCDATA)\s*})(.+?)(<po4aend>.*)$/s) {
+        my ($begin, $tmp) = ($1, $2);
+        $tmp1 = $3;
+        $tmp =~ s/</{PO4A-lt}/gs;
+        $tmp =~ s/>/{PO4A-gt}/gs;
+        $tmp =~ s/&/{PO4A-amp}/gs;
+        $origfile .= $begin.$tmp;
+    }
+    $origfile .= $tmp1;
+
+    # Deal with the %entities; in the prolog. God damn it, this code is gross!
+    # Try hard not to change the number of lines to not fuck up the references
+    my %prologentincl;
+    my $moretodo=1;
+    PROLOGENTITY: while ($moretodo) { # non trivial loop to deal with recursive inclusion
+	$moretodo = 0;
+	# Unprotect not yet defined inclusions
+	$prolog =~ s/{PO4A-percent}/%/sg;
+        print STDERR "prolog=>>>>$prolog<<<<\n"
+	      if ($debug{'entities'});
+	while ($prolog =~ /(.*?)<!ENTITY\s*%\s*(\S*)\s+SYSTEM\s*"([^>"]*)"\s*>(.*)$/is) {  #})"{ (Stupid editor)
+	    print STDERR "Seen the definition entity of prolog inclusion '$2' (=$3)\n"
+	      if ($debug{'entities'});
+	    # Preload the content of the entity.
+	    my $key = $2;
+	    my $filename=$3;
+	    my $origfilename = $filename;
+	    my ($begin, $end) = ($1, $4);
+	    if ($filename !~ m%^/% && $mastername =~ m%/%) {
+	        my $dir=$mastername;
+	        $dir =~ s%/[^/]*$%%;
+	        $filename="$dir/$filename";
+	        # origfile also needs to be fixed otherwise nsgmls won't
+	        # find the file.
+	        $origfile =~ s/(<!ENTITY\s*%\s*\Q$key\E\s+SYSTEM\s*")\Q$origfilename\E("\s*>)/$1$filename$2/gsi;
+	    }
+	    if (defined $ignored_inclusion{$key} or !-e $filename) {
+		# We won't expand this entity.
+		# And we avoid nsgmls to do so.
+		$prolog = "$begin<!--{PO4A-ent-beg-$key}$filename".
+		          "{PO4A-ent-end}-->$end";
+	    } else {
+	    $prolog = $begin.$end;
+	    (-e $filename && open IN,"<$filename")  ||
+	      die wrap_mod("po4a::sgml",
+	                   dgettext("po4a",
+	                       "Can't open %s (content of entity %s%s;): %s"),
+	                   $filename, '%', $key, $!);
+	    local $/ = undef;
+	    $prologentincl{$key} = <IN>;
+	    close IN;
+	    print STDERR "Content of \%$key; is $filename (".
+	                 ($prologentincl{$key} =~ tr/\n/\n/).
+	                 " lines long)\n"
+	      if ($debug{'entities'});
+	    print STDERR "content: ".$prologentincl{$key}."\n"
+	      if ($debug{'entities'});
+	    $moretodo = 1;
+	    next PROLOGENTITY;
+	    }
+	}
+	while ($prolog =~ /(.*?)<!ENTITY\s*%\s*(\S*)\s*"([^>"]*)"\s>(.*)$/is) {  #})"{ (Stupid editor)
+	    print STDERR "Seen the definition entity of prolog definition '$2' (=$3)\n"
+	      if ($debug{'entities'});
+	    # Preload the content of the entity.
+	    my $key = $2;
+	    $prolog = $1.$4;
+	    $prologentincl{$key} = $3;
+	    print STDERR "content: ".$prologentincl{$key}."\n"
+	      if ($debug{'entities'});
+	    $moretodo = 1;
+	    next PROLOGENTITY;
+	}
+        while ($prolog =~ /^(.*?)%([^;\s]*);(.*)$/s) {
+	    my ($pre,$ent,$post) = ($1,$2,$3);
+	    # Yeah, right, the content of the entity can be defined in a not yet loaded entity
+	    # It's easy to build a weird case where all that shit collapses poorly. But why the
+	    # hell are you using those strange constructs in your document, damn it?
+	    print STDERR "Seen prolog inclusion $ent\n" if ($debug{'entities'});
+	    if (defined ($prologentincl{$ent})) {
+		$prolog = $pre.$prologentincl{$ent}.$post;
+		print STDERR "Change \%$ent; to its content in the prolog\n"
+		  if $debug{'entities'};
+		$moretodo = 1;
+	    } else {
+		# AAAARGH stupid document using %bla; and having then defined in another inclusion!
+		# Protect it for this pass, and unprotect it on next one
+		print STDERR "entity $ent not defined yet ?!\n"
+		  if $debug{'entities'};
+		$prolog = "$pre".'{PO4A-percent}'."$ent;$post";
+	    }
+	}
+    }
+    $prolog =~ s/<!--{PO4A-ent-beg-(.*?)}(.*?){PO4A-ent-end}-->/<!ENTITY % $1 SYSTEM "$2">/g;
+    # Unprotect undefined inclusions, and die of them
+    $prolog =~ s/{PO4A-percent}/%/sg;
+    if ($prolog =~ /%([^;\s]*);/) {
+        die wrap_mod("po4a::sgml",
+                     dgettext("po4a",
+                              "unrecognized prolog inclusion entity: %%%s;"),
+                     $1)
+           unless ($ignored_inclusion{$1});
+    }
+    # Protect &entities; (all but the ones asking for a file inclusion)
+    #   search the file inclusion entities
+    my %entincl;
+    my $searchprolog=$prolog;
+    while ($searchprolog =~ /(.*?)<!ENTITY\s+(\S*)\s+SYSTEM\s*"([^>"]*)"\s*>(.*)$/is) {  #})"{
+	print STDERR "Seen the entity of inclusion $2 (=$3)\n"
+	  if ($debug{'entities'});
+	my $key = $2;
+	my $filename = $3;
+	my $origfilename = $filename;
+	$searchprolog = $4;
+	if ($filename !~ m%^/% && $mastername =~ m%/%) {
+	    my $dir=$mastername;
+	    $dir =~ s%/[^/]*$%%;
+	    $filename="$dir/$filename";
+	    # origfile also needs to be fixed otherwise nsgmls won't find
+	    # the file.
+	    $origfile =~ s/(<!ENTITY\s+$key\s+SYSTEM\s*")\Q$origfilename\E("\s*>)/$1$filename$2/gsi;
+	}
+	if ((not defined $ignored_inclusion{$2}) and (-e $filename)) {
+	    $entincl{$key}{'filename'}=$filename;
+	    # Preload the content of the entity
+	    (-e $filename && open IN,"<$filename")  ||
+		die wrap_mod("po4a::sgml",
+		       dgettext("po4a",
+		                "Can't open %s (content of entity %s%s;): %s"),
+		                $filename, '&', $key, $!);
+	    local $/ = undef;
+	    $entincl{$key}{'content'} = <IN>;
+	    close IN;
+	    $entincl{$key}{'length'} = ($entincl{$key}{'content'} =~ tr/\n/\n/);
+	    print STDERR "read $filename (content of \&$key;, $entincl{$key}{'length'} lines long)\n"
+		if ($debug{'entities'});
+	}
+    }
+
+    #   Change the entities including files in the document
+    foreach my $key (keys %entincl) {
+        # The external entity can be referenced as &key; or &key
+        # In the second case, we must differentiate &key and &key2
+        while ($origfile =~/^(.*?)&$key(;.*$|[^-_:.A-Za-z0-9].*$|$)/s) {
+	    my ($begin,$end)=($1,$2);
+	    $end = "" unless (defined $end);
+	    $end =~ s/^;//s;
+
+	    if ($begin =~ m/.*<!--(.*?)$/s and $1 !~ m/-->/s) {
+		# This entity is commented. Just remove it.
+		$origfile = $begin.$end;
+		next;
+	    }
+
+	    # add the refs
+	    my $len  = $entincl{$key}{'length'}; # number added by the inclusion
+	    my $pre  = ($begin =~ tr/\n/\n/); # number of \n
+	    my $post = ($end =~ tr/\n/\n/);
+	    print "XX Add a ref. pre=$pre; len=$len; post=$post\n" if $debug{'refs'};
+	    # Keep a reference of inclusion position in main file
+	    my $main = $refs[$pre];
+
+	    # Remove the references for the lines after the inclusion
+	    # point.
+	    my @endrefs = splice @refs, $pre+1;
+
+	    # Add the references of the added lines
+	    my $i;
+	    for ($i=0; $i<$len; $i++) {
+		$refs[$i+$pre] = "$main $entincl{$key}{'filename'}:".($i+1);
+	    }
+
+	    if ($begin !~ m/\n[ \t]*$/s) {
+		if ($entincl{$key}{'content'} =~ m/^[ \t]*\n/s) {
+		    # There is nothing in the first line of the included
+		    # file, and something on the line before the inclusion
+		    # The line reference will be more informative like
+		    # this:
+		    $refs[$pre] = $main;
+		}
+	    }
+	    if ($end !~ s/^[ \t]*\n//s) {
+		if ($entincl{$key}{'content'} =~ m/\n[ \t]*$/s) {
+		    # There is something on the line after the inclusion,
+		    # and there is an end of line at the end of the
+		    # included file. We must add the line reference of the
+		    # remainder on the line:
+		    push @refs, $main;
+		}
+	    }
+	    # Append the references removed earlier (lines after the
+	    # inclusion point).
+	    push @refs, @endrefs;
+
+	    # Do the substitution
+	    $origfile = "$begin".$entincl{$key}{'content'}."$end";
+	    print STDERR "substitute $2\n" if ($debug{'entities'});
+        }
+    }
+    $origfile=~s/\G(.*?)&([A-Za-z_:][-_:.A-Za-z0-9]*|#[0-9]+|#x[0-9a-fA-F]+)\b/$1\{PO4A-amp\}$2/gs;
+    if (defined($xmlprolog) && length($xmlprolog)) {
+        $origfile=~s/\/>/\{PO4A-close\}>/gs;
+    }
+
+    if ($debug{'refs'}) {
+	print "XX Resulting shifts\n";
+	for (my $i=0; $i<scalar @refs; $i++) {
+	    print "$mastername:".($i+1)." -> $refs[$i]\n";
+	}
+    }
+
+    my ($tmpfh,$tmpfile)=File::Temp::tempfile("po4a-XXXX",
+                                              SUFFIX => ".sgml",
+                                              DIR    => "/tmp",
+                                              UNLINK => 0);
+    print $tmpfh $origfile;
+    close $tmpfh or die wrap_mod("po4a::sgml", dgettext("po4a", "Can't close tempfile: %s"), $!);
+
+    my $cmd="nsgmls -l -E 0 -wno-valid < $tmpfile".
+            ($debug{'nsgmls'}?"":" 2>/dev/null")." |";
+    print STDERR "CMD=$cmd\n" if ($debug{'generic'} or $debug{'nsgmls'});
+
+    open (IN,$cmd) || die wrap_mod("po4a::sgml", dgettext("po4a", "Can't run nsgmls: %s"), $!);
+
+    # The kind of tags
+    my (%translate,%empty,%verbatim,%indent,%exist,%attribute,%qualify);
+    foreach (split(/ /, ($self->{SGML}->{k}{'translate'}||'') )) {
+	$translate{uc $_} = 1;
+	$indent{uc $_} = 1;
+	$exist{uc $_} = 1;
+    }
+    foreach (split(/ /, ($self->{SGML}->{k}{'empty'}||'') )) {
+	$empty{uc $_} = 1;
+	$exist{uc $_} = 1;
+    }
+    foreach (split(/ /, ($self->{SGML}->{k}{'verbatim'}||'') )) {
+	$translate{uc $_} = 1;
+	$verbatim{uc $_} = 1;
+	$exist{uc $_} = 1;
+    }
+    foreach (split(/ /, ($self->{SGML}->{k}{'indent'}||'') )) {
+	$translate{uc $_} = 1;
+	$indent{uc $_} = 1;
+	$exist{uc $_} = 1;
+    }
+    foreach (split(/ /, ($self->{SGML}->{k}{'ignore'}) || '')) {
+	$exist{uc $_} = 1;
+    }
+    foreach (split(/ /, ($self->{SGML}->{k}{'attributes'} || ''))) {
+        my ($attr, $tags);
+        if (m/(^.*>)(\w+)/) {
+            $attr=uc $2;
+            $tags=$1;
+        } else {
+            $attr=uc $_;
+            $tags=".*";
+        }
+        if (exists $attribute{$attr}) {
+            $attribute{$attr}.="|$tags";
+        } else {
+            $attribute{$attr} = $tags;
+        }
+    }
+    foreach (split(/ /, ($self->{SGML}->{k}{'qualify'}) || '')) {
+        $qualify{uc $_} = 1;
+        $attribute{uc $_} = '.*' unless exists $attribute{uc $_};
+    }
+
+
+    # What to do before parsing
+
+    # push the XML prolog if existing
+    $self->pushline($xmlprolog."\n") if (defined($xmlprolog) && length($xmlprolog));
+
+    # Put the prolog into the file, allowing for entity definition translation
+    #  <!ENTITY myentity "definition_of_my_entity">
+    # and push("<!ENTITY myentity \"".$self->translate("definition_of_my_entity")
+    if ($prolog =~ m/(.*?\[)(.*)(\]>)/s) {
+	warn "Pre=~~$1~~;Post=~~$3~~\n" if ($debug{'entities'});
+	$self->pushline($1."\n") if (length($1));
+	$prolog=$2;
+	my ($post) = $3;
+	while ($prolog =~ m/^(.*?)<!ENTITY\s+(\S*)\s+"([^"]*)"\s*>(.*)$/is) { #" ){
+	   $self->pushline($1) if length($1);
+	   $self->pushline("<!ENTITY $2 \"".$self->translate($3,"","definition of entity \&$2;")."\">");
+	   warn "Seen text entity $2\n" if ($debug{'entities'});
+	   $prolog = $4;
+	}
+	$prolog .= $post;
+	$self->pushline($prolog."\n") if (length($prolog));
+    } else {
+	warn "No entity declaration detected in ~~$prolog~~...\n" if ($debug{'entities'});
+	$self->pushline($prolog) if length($prolog);
+    }
+
+    # The parse object.
+    # Damn SGMLS. It makes me do crude things.
+    no strict "subs";
+    my $parse= new SGMLS(IN);
+    use strict;
+
+    # Some values for the parsing
+    my @open=(); # opened translation container tags
+    my $verb=0;  # can we wrap or not
+    my $verb_last_ref;
+    my $seenfootnote=0;
+    my $indent=0; # indent level
+    my $lastchar = ''; #
+    my $buffer= ""; # what we will soon handle
+
+    # Keep a reference to the last line indicated by nsgmls
+    my $line=0;
+    # Unfortunately, nsgmls do not mention all the line changes.  We have
+    # to keep track of the number of lines seen in the "record ends".
+    my $adds=0;
+    # If the last line received contains only spaces, do not take it into
+    # account for the line reference of the paragraph.
+    my $empty_last_cdata=0;
+    # run the appropriate handler for each event
+    EVENT: while (my $event = $parse->next_event) {
+	# get the line reference to build po entries
+	if ($line != $parse->line) {
+	    # nsgmls informs us of that the line changed. Reset $adds and
+	    # $empty_last_cdata
+	    $adds = 0;
+	    $empty_last_cdata = 0;
+	    $line = $parse->line;
+	}
+	my $ref=$refs[$parse->line-1 + $adds - $empty_last_cdata];
+	# In verbatim mode, keep the current line reference.
+	if ($verb) {
+	    $ref=$refs[$parse->line-1];
+	}
+	my $type;
+
+	if ($event->type eq 'start_element') {
+	    die wrap_ref_mod($ref, "po4a::sgml",
+	                     dgettext("po4a", "Unknown tag %s"),
+	                     $event->data->name)
+		unless $exist{$event->data->name};
+
+	    $lastchar = ">";
+
+	    # Which tag did we see?
+	    my $tag='';
+	    $tag .= '<'.lc($event->data->name());
+	    while (my ($attr, $val) = each %{$event->data->attributes()}) {
+		my $value = $val->value();
+#		if ($val->type() eq 'IMPLIED') {
+#		    $tag .= ' '.lc($attr).'="'.lc($attr).'"';
+#		} els
+                if ($val->type() eq 'CDATA' ||
+		    $val->type() eq 'IMPLIED') {
+		    if (defined $value && length($value)) {
+                        my $lattr=lc $attr;
+                        my $uattr=uc $attr;
+                        if (exists $attribute{$uattr}) {
+                            my $context="";
+                            foreach my $o (@open) {
+                                next if (!defined $o or $o =~ m%^</%);
+                                $o =~ s/ .*/>/;
+                                $context.=$o;
+                            }
+                            $context=join("", $context,
+                                          "<", lc($event->data->name()), ">");
+                            if ($context =~ /^($attribute{$uattr})$/) {
+                                if ($qualify{$uattr}) {
+                                    my $translated = $self->translate("$lattr=$value", $ref, "attribute $context$lattr");
+                                    if ($translated =~ s/^$lattr=//) {
+                                        $value=$translated;
+                                    } else {
+                                        die wrap_mod("po4a::sgml", dgettext("po4a", "bad translation '%s' for '%s' in '%s'"), $translated, $context.$lattr, $ref);
+                                    }
+                                } else {
+                                    $value = $self->translate($value, $ref, "attribute $context$lattr");
+                                }
+                            }
+                        }
+			if ($value =~ m/\"/) {
+			    $value = "'".$value."'";
+			} else {
+			    $value = '"'.$value.'"';
+			}
+			$tag .= " $lattr=$value";
+		    }
+		} elsif ($val->type() eq 'NOTATION') {
+		} else {
+		    $tag .= ' '.lc($attr).'="'.lc($value).'"'
+			if (defined $value && length($value));
+		}
+	    }
+	    $tag .= '>';
+
+
+	    # debug
+	    print STDERR "Seen $tag, open level=".(scalar @open).", verb=$verb\n"
+		if ($debug{'tag'});
+
+	    if ($event->data->name() eq 'FOOTNOTE') {
+		# we want to put the <para> inside the <footnote> in the same msgid
+		$seenfootnote = 1;
+	    }
+
+	    if ($seenfootnote) {
+		$buffer .= $tag;
+		next EVENT;
+	    }
+	    if ($translate{$event->data->name()}) {
+		# Build the type
+		if (scalar @open > 0) {
+		    $type=$open[$#open] . $tag;
+		} else {
+		    $type=$tag;
+		}
+
+		# do the job
+		if (@open > 0) {
+		    $self->end_paragraph($buffer,$ref,$type,$verb,$indent,
+					 @open);
+		} else {
+		    $self->pushline($buffer) if $buffer;
+		}
+		$buffer="";
+		push @open,$tag;
+	    } elsif ($indent{$event->data->name()}) {
+		die wrap_ref_mod($ref, "po4a::sgml", dgettext("po4a",
+		    "Closing tag for a translation container missing before %s"),$tag)
+		    if (scalar @open);
+	    }
+
+	    if ($verbatim{$event->data->name()}) {
+		$verb++;
+		# Keep a reference to the line that openned the verbatim
+		# section. This is needed to check if its data starts on
+		# the same line.
+		$verb_last_ref = $ref;
+	    }
+	    if ($verb) {
+		# Tag in a verbatim section. Check if it appeared at
+		# the same line than the previous data. If not, it
+		# means that an end of line must be added to the
+		# buffer.
+		if ($ref ne $verb_last_ref) {
+		    # FIXME: Does it work if $verb > 1
+		    $buffer .= "\n";
+		    $verb_last_ref = $ref;
+		}
+	    }
+
+	    if ($indent{$event->data->name()}) {
+		# push the indenting space only if not in verb before that tag
+		# push trailing "\n" only if not in verbose afterward
+		$self->pushline( ($verb>1?"": (" " x $indent)).$tag.($verb?"":"\n"));
+		$indent ++ unless $empty{$event->data->name()} ;
+	    }  else {
+		$tag =~ s/<po4abeg name="([^"]+)">/<![ $1 [/; #"; Stupid emacs
+		$tag =~ s/<po4aend>/]]>/;
+		$buffer .= $tag;
+	    }
+	} # end of type eq 'start_element'
+
+	elsif ($event->type eq 'end_element') {
+	    my $tag = ($empty{$event->data->name()}
+		           ?
+		       ''
+		           :
+		       '</'.lc($event->data->name()).'>');
+
+	    if ($verb) {
+		# Tag in a verbatim section. Check if it appeared at
+		# the same line than the previous data. If not, it
+		# means that an end of line must be added to the
+		# buffer.
+		if ($ref ne $verb_last_ref) {
+		    # FIXME: Does it work if $verb > 1
+		    $buffer .= "\n";
+		    $verb_last_ref = $ref;
+		}
+	    }
+	    print STDERR "Seen $tag, level=".(scalar @open).", verb=$verb\n"
+		if ($debug{'tag'});
+
+	    $lastchar = ">";
+
+	    if ($event->data->name() eq 'FOOTNOTE') {
+		# we want to put the <para> inside the <footnote> in the same msgid
+		$seenfootnote = 0;
+	    }
+
+	    if ($seenfootnote) {
+		$buffer .= $tag;
+		next EVENT;
+	    }
+	    if ($translate{$event->data->name()}) {
+		$type = $open[$#open] . $tag;
+		$self->end_paragraph($buffer,$ref,$type,$verb,$indent,@open);
+		$buffer = "";
+		pop @open;
+		if (@open > 0) {
+		    pop @open;
+		    push @open,$tag;
+		}
+	    } elsif ($indent{$event->data->name()}) {
+		die wrap_ref_mod($ref, "po4a::sgml", dgettext("po4a",
+           "Closing tag for a translation container missing before %s"), $tag)
+		    if (scalar @open);
+	    }
+
+	    unless ($event->data->name() =~ m/^(PO4ABEG|PO4AEND)$/si) {
+		if ($indent{$event->data->name()}) {
+		    $indent -- ;
+		    # add indenting space only when not in verbatim
+		    # add the tailing \n only if out of verbatim after that tag
+		    $self->pushline(($verb?"":(" " x $indent)).$tag.($verb>1?"":"\n"));
+		}  else {
+		    $buffer .= $tag;
+		}
+		$verb-- if $verbatim{$event->data->name()};
+	    }
+	} # end of type eq 'end_element'
+
+	elsif ($event->type eq 'cdata') {
+	    my $cdata = $event->data;
+	    $empty_last_cdata=($cdata =~ m/^\s*$/);
+	    $cdata =~ s/{PO4A-lt}/</g;
+	    $cdata =~ s/{PO4A-gt}/>/g;
+	    $cdata =~ s/{PO4A-amp}/&/g;
+            $cdata =~ s/{PO4A-end}/\]\]>/g;
+            $cdata =~ s/{PO4A-beg-([^\}]+)}/<!\[$1\[/g;
+	    if ($verb) {
+		# Check if this line of data appear on the same line
+		# than the previous tag. If not, append an end of line
+		# to the buffer.
+		if ($ref ne $verb_last_ref) {
+		    $buffer .= "\n";
+		    $verb_last_ref = $ref;
+		}
+	    } else {
+		$cdata =~ s/\\t/ /g;
+		$cdata =~ s/\s+/ /g;
+		$cdata =~ s/^\s//s if $lastchar eq ' ';
+	    }
+	    $lastchar = substr($cdata, -1, 1);
+	    $buffer .= $cdata;
+	    if (defined($xmlprolog) && length($xmlprolog)) {
+		$buffer =~ s/>PO4A-close\}>/\/>/sg;
+		$buffer =~ s/PO4A-close\}>//sg; # This should not be necessary
+	    }
+	} # end of type eq 'cdata'
+
+	elsif ($event->type eq 'sdata') {
+	    my $sdata = $event->data;
+	    $sdata =~ s/^\[//;
+	    $sdata =~ s/\s*\]$//;
+	    $lastchar = substr($sdata, -1, 1);
+	    $buffer .= '&'.$sdata.';';
+	} # end of type eq 'sdata'
+
+	elsif ($event->type eq 're') {
+	    # End of record, the line reference shall be incremented.
+	    $adds +=1;
+	    if ($verb) {
+		# Check if this line of data appear on the same line
+		# than the previous tag. If not, append an end of line
+		# to the buffer.
+		if ($ref ne $verb_last_ref) {
+		    $buffer .= "\n";
+		    $verb_last_ref = $ref;
+		}
+		$buffer .= "\n";
+	    } elsif ($lastchar ne ' ') {
+		$buffer .= " ";
+	    }
+	    $lastchar = ' ';
+	} #end of type eq 're'
+
+	elsif ($event->type eq 'conforming') {
+
+	}
+
+	elsif ($event->type eq 'pi') {
+	    my $pi = $event->data;
+	    $buffer .= "<?$pi>";
+	}
+
+	else {
+	    die wrap_ref_mod($refs[$parse->line], "po4a::sgml",
+	                     dgettext("po4a","Unknown SGML event type: %s"),
+	                     $event->type);
+	}
+    }
+
+    # What to do after parsing
+    $self->pushline($buffer);
+    close(IN);
+    warn wrap_mod("po4a::sgml",
+                  dgettext("po4a","Warning: nsgmls produced some errors.  ".
+                  "This is usually caused by po4a, which modifies the input ".
+                  "and restores it afterwards, causing the input of nsgmls ".
+                  "to be invalid.  This is usually safe, but you may wish ".
+                  "to verify the generated document with nsgmls -wno-valid.  ".
+                  "Continuing..."))
+        if ($? != 0 and $self->verbose() > 0);
+    unlink ($tmpfile) unless ($debug{'refs'} or $debug{'nsgmls'});
+}
+
+sub end_paragraph {
+    my ($self, $para,$ref, $type,$verb,$indent)=
+	(shift,shift,shift,shift,shift,shift);
+    my (@open)=@_;
+    die "Internal error: no paragraph to end here!!"
+	unless scalar @open;
+
+    return unless defined($para) && length($para);
+
+    if (($para =~ m/^\s*$/s) and (not $verb)) {
+	# In non-verbatim environments, a paragraph with only spaces is
+	# like an empty paragraph
+	return;
+    }
+
+    # unprotect &entities;
+    $para =~ s/{PO4A-amp}/&/g;
+    # remove the name"\|\|" nsgmls added as attributes
+    $para =~ s/ name=\"\\\|\\\|\"//g;
+    $para =~ s/ moreinfo=\"none\"//g;
+
+    # Extract the leading and trailing spaces. They will be restored only
+    # in verbatim environments.
+    my ($leading_spaces, $trailing_spaces) = ("", "");
+    if ($verb) {
+	# In the verbatim mode, we can ignore empty lines, but not the
+	# leading spaces or tabulations. Otherwise, the PO will look
+	# weird.
+	if ($para =~ m/^(\s*\n)(.*?)(\s*)$/s) {
+	    $leading_spaces = $1;
+	    $para = $2;
+	    $trailing_spaces = $3;
+	}
+    } else {
+	if ($para =~ m/^(\s*)(.*?)(\s*)$/s) {
+	    $leading_spaces = $1;
+	    $para = $2;
+	    $trailing_spaces = $3;
+	}
+    }
+
+    $para = $self->translate($para,$ref,$type,
+                             'wrap' => ! $verb,
+                             'wrapcol' => (75 - $indent));
+
+    if ($verb) {
+	$para = $leading_spaces.$para.$trailing_spaces;
+    } else {
+	$para =~ s/^\s+//s;
+	my $toadd=" " x ($indent+1);
+	$para =~ s/^/$toadd/mg;
+	$para .= "\n";
+    }
+
+    $self->pushline( $para );
+}
+
+1;
+
+=head1 AUTHORS
+
+This module is an adapted version of sgmlspl (SGML postprocessor for the
+SGMLS and NSGMLS parsers) which was:
+
+ Copyright (c) 1995 by David Megginson <dmeggins@xxxxxxxxxxxxxxx>
+
+The adaptation for po4a was done by:
+
+ Denis Barbier <barbier@xxxxxxxxxxx>
+ Martin Quinson (mquinson#debian.org)
+
+=head1 COPYRIGHT AND LICENSE
+
+ Copyright (c) 1995 by David Megginson <dmeggins@xxxxxxxxxxxxxxx>
+ Copyright 2002, 2003, 2004, 2005 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).

Added: po4a/lib/Locale/Po4a/TeX.pm
===================================================================
--- po4a/lib/Locale/Po4a/TeX.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/TeX.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1727 @@
+#!/usr/bin/perl -w
+
+# Copyright (c) 2004, 2005 by Nicolas FRANヌOIS <nicolas.francois@xxxxxxxxxxxxxxx>
+#
+# This file is part of po4a.
+#
+# This program 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 program 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 po4a; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+
+=head1 NAME
+
+Locale::Po4a::TeX - Convert TeX documents and derivates from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::TeX is a module to help the translation of TeX documents into
+other [human] languages. It can also be used as a base to build modules for
+TeX-based documents.
+
+Users should probably use the LaTeX module, which inherite from the TeX module
+and contains the definitions of common LaTeX commands.
+
+=head1 TRANSLATING WITH PO4A::TEX
+
+This module can be used directly to handle generic TeX documents.
+This will split your document in smaller blocks (paragraphs, verbatim
+blocks, or even smaller like titles or indexes).
+
+There are some options (described in the next section) that can customize
+this behavior.  If this doesn't fit to your document format you're encouraged
+to write your own module derived from this, to describe your format's details.
+See the section "Writing derivate modules" below, for the process description.
+
+This module can also be customized by lines starting with "% po4a:" in the
+TeX file.
+These customizations are described in the B<INLINE CUSTOMIZATION> section.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+These are this module's particular options:
+
+=over 4
+
+=cut
+
+package Locale::Po4a::TeX;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw(%commands %environments
+             $RE_ESCAPE $ESCAPE $RE_VERBATIM
+             $no_wrap_environments
+             $verbatim_environments
+             %separated_command
+             %separated_environment
+             %translate_buffer_env
+             &generic_command
+             &register_generic_command
+             &register_generic_environment);
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+use File::Basename qw(dirname);
+use Carp qw(croak);
+
+use Encode;
+use Encode::Guess;
+
+# hash of known commands and environments, with parsing sub.
+# See end of this file
+use vars qw(%commands %environments);
+# hash to describe the number of parameters and which one have to be
+# translated. Used by generic commands
+our %command_parameters = ();
+our %environment_parameters = ();
+# hash to describe the separators of environments.
+our %env_separators =();
+
+# The escape character used to introduce commands.
+our $RE_ESCAPE = "\\\\";
+our $ESCAPE    = "\\";
+# match the beginning of a verbatim block
+our $RE_VERBATIM = "\\\\begin\\{(?:verbatim)\\*?\\}";
+# match the beginning of a comment.
+# NOTE: It must contain a group, with chars preceding the comment
+our $RE_PRE_COMMENT= "(?<!\\\\)(?:\\\\\\\\)*";
+our $RE_COMMENT= "\\\%";
+
+# Space separated list of environments that should not be re-wrapped.
+our $no_wrap_environments = "verbatim";
+our $verbatim_environments = "verbatim";
+# hash with the commands that have to be separated (or have to be joined).
+# 3 modes are currently used:
+#  '*' The command is separated if it appear at an extremity of a
+#      paragraph
+#  '+' The command is separated, but its arguments are joined together
+#      with the command name for the translation
+#  '-' The command is not separated, unless it appear alone on a paragraph
+#      (e.g. \strong)
+our %separated_command = ();
+our %separated_environment = ();
+
+=item debug
+
+Activate debugging for some internal mechanisms of this module.
+Use the source to see which parts can be debugged.
+
+=item no_wrap
+
+Coma-separated list of environments which should not be re-wrapped.
+
+Note that there is a difference between verbatim and no_wrap environments.
+There is no command and comments analysis in verbatim blocks.
+
+If this environment was not already registered, po4a will consider that
+this environment does not take any parameters.
+
+=item exclude_include
+
+Colon-separated list of files that should not be included by \input and
+\include.
+
+=item definitions
+
+The name of a file containing definitions for po4a, as defined in the
+B<INLINE CUSTOMIZATION> section.
+You can use this option if it is not possible to put the definitions in
+the document being translated.
+
+=item verbatim
+
+Coma-separated list of environments which should be taken as verbatim.
+
+If this environment was not already registered, po4a will consider that
+this environment does not take any parameters.
+
+=back
+
+Using these options permits to override the behaviour of the commands defined
+in the default lists.
+
+=head1 INLINE CUSTOMIZATION
+
+The TeX module can be customized with lines starting by "% po4a:".
+These lines are interpreted as commands to the parser.
+The following commands are recognized:
+
+=over 4
+
+=item % po4a: command I<command1> alias I<command2>
+
+Indicates that the arguments of the I<command1> command should be
+treated as the arguments of the I<command2> command.
+
+=item % po4a: command I<command1> I<parameters>
+
+This permit to describe in detail the parameters of the I<command1>
+command.
+This information will be used to check the number of arguments and their
+types.
+
+You can precede the I<command1> command by
+
+=over 4
+
+=item an asterisk (*)
+
+po4a will extract this command from paragraphs (if it is located at
+the beginning or the end of a paragraph).
+The translators will then have to translate the parameters that are marked
+as translatable.
+
+=item a plus (+)
+
+As for an asterisk, the command will be extracted if it appear at an
+extremity of a block, but the parameters won't be translated separately.
+The translator will have to translate the command concatenated to all its
+parameters.
+This permits to keep more context, and is usefull for commands with small
+words in parameter, which can have multiple meanings (and translations).
+
+Note: In this case you don't have to specify which parameters are
+translatable, but po4a must know the type and number of parameters.
+
+=item a minus (-)
+
+In this case, the command won't be extracted from any block.
+But if it appear alone on a bloc, then only the parameters marked as
+translatable will be presented to the translator.
+This is usefull for font command.  These commands should generally not be
+separated from their paragraph (to keep the context), but there is no
+reason to annoy the translator with them if a whole string is enclosed in
+such a command.
+
+=back
+
+The I<parameters> argument is a set of [] (to indicate an optional
+argument) or {} (to indicate a mandatory argument).
+You can place an underscore (_) between these brackets to indicate that
+the parameter must be translated. For example:
+ % po4a: command *chapter [_]{_}
+
+This indicates that the chapter command has two parameters: an optional
+(short title) and a mandatory one, which must both be translated.
+If you want to specify that the href command has two mandatory parameters,
+that you don't want to translate the URL (first parameter), and that you
+don't want this command to be separated from its paragraph (which allow
+the translator to move the link in the sentence), you can use:
+ % po4a: command -href {}{_}
+
+In this case, the information indicating which arguments must be
+translated is only used if a paragraph is only composed of this href
+command.
+
+=item % po4a: environment I<env> I<parameters>
+
+This permits to define the parameters accepted by the I<env> environment.
+This information is latter used to check the number of arguments of the
+\begin command, and permit to specify which one must be translated.
+The syntax of the I<parameters> argument is the same as described for the
+commands.
+The first parameter of the \begin command is the name of the environment.
+This parameter must not be specified in the list of parameters. Here are
+some examples:
+ % po4a: environment multicols {}
+ % po4a: environment equation
+
+As for the commands, I<env> can be preceded by a plus (+) to indicate
+that the \begin command must be translated with all its arguments.
+
+=item % po4a: separator I<env> "I<regex>"
+
+Indicates that an environment should be split according to the given
+regular expression.
+
+The regular expression is delimited by quotes.
+It should not create any backreference.
+You should use (?:) if you need a group.
+It may also need some escapes.  
+
+For example, the LaTeX module uses the "(?:&|\\\\)" regular expression to
+translate separately each cell of a table (lines are separated by '\\' and
+cells by '&').
+
+The notion of environment is expended to the type displayed in the PO file.
+This can be used to split on "\\\\" in the first mandatory argument of the
+title command.  In this case, the environment is title{#1}.
+
+=item % po4a: verbatim environment I<env>
+
+Indicate that I<env> is a verbatim environment.
+Comments and commands will be ignored in this environment.
+
+If this environment was not already registered, po4a will consider that
+this environment does not take any parameters.
+
+=back
+
+=cut
+
+# Directory name of the main file.
+# It is the directory where included files will be searched.
+# See read_file.
+my $my_dirname;
+
+# Array of files that should not be included by read_file.
+# See read_file.
+our @exclude_include;
+
+my %type_end=('{'=>'}', '['=>']', ' '=>'');
+
+#########################
+#### DEBUGGING STUFF ####
+#########################
+my %debug=('pretrans'         => 0, # see pre-conditioning of translation
+           'postrans'         => 0, # see post-conditioning of translation
+           'translate'        => 0, # see translation
+           'extract_commands' => 0, # see commands extraction
+           'commands'         => 0, # see command subroutines
+           'environments'     => 0, # see environment subroutines
+           'translate_buffer' => 0  # see buffer translation
+           );
+
+=head1 WRITING DERIVATE MODULES
+
+=over 4
+
+=item pre_trans
+
+=cut
+
+sub pre_trans {
+    my ($self,$str,$ref,$type)=@_;
+    # Preformatting, so that translators don't see
+    # strange chars
+    my $origstr=$str;
+    print STDERR "pre_trans($str)="
+        if ($debug{'pretrans'});
+
+    # Accentuated characters
+    # FIXME: only do this if the encoding is UTF-8?
+#    $str =~ s/${RE_ESCAPE}`a/牆g;
+##    $str =~ s/${RE_ESCAPE}c{c}/膀g; # not in texinfo: @,{c}
+#    $str =~ s/${RE_ESCAPE}^e/蟄g;
+#    $str =~ s/${RE_ESCAPE}'e/薇g;
+#    $str =~ s/${RE_ESCAPE}`e/莚g;
+#    $str =~ s/${RE_ESCAPE}`u/仼g;
+#    $str =~ s/${RE_ESCAPE}"i/鎭g;
+#    # Non breaking space. FIXME: should we change $\sim$ to ~
+#    $str =~ s/~/\xA0/g; # FIXME: not in texinfo: @w{ }
+
+    print STDERR "$str\n" if ($debug{'pretrans'});
+    return $str;
+}
+
+=item post_trans
+
+=cut
+
+sub post_trans {
+    my ($self,$str,$ref,$type)=@_;
+    my $transstr=$str;
+
+    print STDERR "post_trans($str)="
+        if ($debug{'postrans'});
+
+    # Accentuated characters
+#    $str =~ s/牆${ESCAPE}`a/g;
+##    $str =~ s/膀$ESCAPEc{c}/g; # FIXME: not in texinfo
+#    $str =~ s/蟄${ESCAPE}^e/g;
+#    $str =~ s/薇${ESCAPE}'e/g;
+#    $str =~ s/莚${ESCAPE}`e/g;
+#    $str =~ s/仼${ESCAPE}`u/g;
+#    $str =~ s/鎭${ESCAPE}"i/g;
+#    # Non breaking space. FIXME: should we change ~ to $\sim$
+#    $str =~ s/\xA0/~/g; # FIXME: not in texinfo
+
+    print STDERR "$str\n" if ($debug{'postrans'});
+    return $str;
+}
+
+# Comments are extracted in the parse function.
+# They are stored in the @comments array, and then displayed as a PO
+# comment with the first translated string of the paragraph.
+my @comments = ();
+
+=item translate
+
+Wrapper around Transtractor's translate, with pre- and post-processing
+filters.
+
+Comments of a paragraph are inserted as a PO comment for the first
+translated string of this paragraph.
+
+=cut
+
+sub translate {
+    my ($self,$str,$ref,$type) = @_;
+    my (%options)=@_;
+    my $origstr=$str;
+    print STDERR "translate($str)="
+        if ($debug{'translate'});
+
+    return $str unless (defined $str) && length($str);
+    return $str if ($str eq "\n");
+
+    $str=pre_trans($self,$str,$ref||$self->{ref},$type);
+
+    # add comments (if any and not already added to the PO)
+    if (@comments) {
+        $options{'comment'} .= join('\n', @comments);
+
+        @comments = ();
+    }
+
+# FIXME: translate may append a newline, keep the trailing spaces so we can
+# recover them.
+    my $spaces = "";
+    if ($options{'wrap'} and $str =~ m/^(.*?)(\s+)$/s) {
+        $str    = $1;
+        $spaces = $2;
+    }
+
+    # Translate this
+    $str = $self->SUPER::translate($str,
+                                   $ref||$self->{ref},
+                                   $type || $self->{type},
+                                   %options);
+
+# FIXME: translate may append a newline, see above
+    if ($options{'wrap'}) {
+        chomp $str;
+        $str .= $spaces;
+    }
+
+    $str=post_trans($self,$str,$ref||$self->{ref},$type);
+
+    print STDERR "'$str'\n" if ($debug{'translate'});
+    return $str;
+}
+
+###########################
+### COMMANDS SEPARATION ###
+###########################
+
+=item get_leading_command($buffer)
+
+This function returns:
+
+=over 4
+
+=item A command name
+
+If no command is found at the beginning of the given buffer, this string
+will be empty.  Only commands that can be separated are considered.
+The %separated_command hash contains the list of these commands.
+
+=item A variant
+
+This indicate if a variant is used.  For example, an asterisk (*) can
+be added at the end of sections command to specify that they should
+not be numbered.  In this case, this field will contain "*".  If there
+is no variant, the field is an empty string.
+
+=item An array of tuples (type of argument, argument)
+
+The type of argument can be either '{' (for mandatory arguments) or '['
+(for optional arguments).
+
+=item The remaining buffer
+
+The rest of the buffer after the removal of this leading command and
+its arguments.  If no command is found, the original buffer is not
+touched and returned in this field.
+
+=back
+
+=cut
+
+sub get_leading_command {
+    my ($self, $buffer) = (shift,shift);
+    my $command = ""; # the command name
+    my $variant = ""; # a varriant for the command (e.g. an asterisk)
+    my @args; # array of arguments
+    print STDERR "get_leading_command($buffer)="
+        if ($debug{'extract_commands'});
+
+    if ($buffer =~ m/^$RE_ESCAPE([[:alpha:]]+)(\*?)(.*)$/s
+        && defined $separated_command{$1}) {
+        # The buffer begin by a comand (possibly preceded by some
+        # whitespaces).
+        $command = $1;
+        $variant = $2;
+        $buffer  = $3;
+        # read the arguments (if any)
+        while ($buffer =~ m/^\s*([\[\{])(.*)$/s) {
+            my $type = $1;
+            my $arg = "";
+            my $count = 1;
+            $buffer = $2;
+            # stop reading the buffer when the number of ] (or }) matches the
+            # the number of [ (or {).
+            while ($count > 0) {
+                if ($buffer =~ m/^(.*?)([\[\]\{\}])(.*)$/s) {
+                    $arg .= $1;
+                    $buffer = $3;
+                    if ($2 eq $type) {
+                        $count++;
+                    } elsif ($2 eq $type_end{$type}) {
+                        $count--;
+                    }
+                    if ($count > 0) {
+                        $arg .= $2
+                    }
+                } else {
+                    die wrap_ref_mod($self->{ref},
+                                     "po4a::tex",
+                                     dgettext("po4a", "un-balanced %s in '%s'"),
+                                     $type,
+                                     $buffer);
+                }
+            }
+            push @args, ($type,$arg);
+        }
+    }
+    if (defined $command and length $command) {
+        # verify the number of arguments
+        my($check,$reason,$remainder) = check_arg_count($self,$command,\@args);
+        if (not $check) {
+            die wrap_ref_mod($self->{ref}, "po4a::tex",
+                             dgettext("po4a",
+                                 "Error while checking the number of ".
+                                 "arguments of the '%s' command: %s")."\n",
+                             $command, $reason);
+        }
+
+        if (@$remainder) {
+            # FIXME: we should also keep the spaces to be idempotent
+            my ($temp,$type,$arg);
+            while (@$remainder) {
+                $type = shift @$remainder;
+                $arg  = shift @$remainder;
+                $temp .= $type.$arg.$type_end{$type};
+                # And remove the same number of arguments from @args
+                pop @args;
+                pop @args;
+            }
+            $buffer = $temp.$buffer;
+        }
+    }
+
+    print STDERR "($command,$variant,@args,$buffer)\n"
+        if ($debug{'extract_commands'});
+    return ($command,$variant,\@args,$buffer);
+}
+
+=item get_trailing_command($buffer)
+
+The same as get_leading_command, but for commands at the end of a buffer.
+
+=cut
+
+sub get_trailing_command {
+    my ($self, $buffer) = (shift,shift);
+    my $orig_buffer = $buffer;
+    print STDERR "get_trailing_command($buffer)="
+        if ($debug{'extract_commands'});
+
+    my @args;
+    my $command = "";
+    my $variant = "";
+
+    # While the buffer ends by }, consider it is a mandatory argument
+    # and extract this argument.
+    while (   $buffer =~ m/^(.*(\{).*)\}$/s
+           or $buffer =~ m/^(.*(\[).*)\]$/s) {
+        my $arg = "";
+        my $count = 1;
+        $buffer = $1;
+        my $type = $2;
+        # stop reading the buffer when the number of } (or ]) matches the
+        # the number of { (or [).
+        while ($count > 0) {
+            if ($buffer =~ m/^(.*)([\{\}\[\]])(.*)$/s) {
+                 $arg = $3.$arg;
+                 $buffer = $1;
+                 if ($2 eq $type) {
+                     $count--;
+                 } elsif ($2 eq $type_end{$type}) {
+                     $count++;
+                 }
+                 if ($count > 0) {
+                     $arg = $2.$arg;
+                 }
+            } else {
+                die wrap_ref_mod($self->{ref},
+                                 "po4a::tex",
+                                 dgettext("po4a", "un-balanced %s in '%s'"),
+                                 $type_end{$type},
+                                 $buffer);
+            }
+        }
+        unshift @args, ($type,$arg);
+    }
+
+    # There should now be a command, maybe followed by an asterisk.
+    if ($buffer =~ m/^(.*)$RE_ESCAPE([[:alpha:]]+)(\*?)\s*$/s
+        && defined $separated_command{$2}) {
+        $buffer = $1;
+        $command = $2;
+        $variant = $3;
+        my($check,$reason,$remainder) = check_arg_count($self,$command,\@args);
+        if (not $check) {
+            die wrap_ref_mod($self->{ref}, "po4a::tex",
+                             dgettext("po4a",
+                                 "Error while checking the number of ".
+                                 "arguments of the '%s' command: %s")."\n",
+                             $command, $reason);
+        }
+        if (@$remainder) {
+            # There are some arguments after the command.
+            # We can't extract this comand.
+            $command = "";
+        }
+    }
+
+    # sanitize return values if no command was found.
+    if (!length($command)) {
+        $command = "";
+        $variant = "";
+        undef @args;
+        $buffer = $orig_buffer;
+    }
+# verify the number of arguments
+
+    print STDERR "($command,$variant,@args,$buffer)\n"
+        if ($debug{'extract_commands'});
+    return ($command,$variant,\@args,$buffer);
+}
+
+=item translate_buffer
+
+Recursively translate a buffer by separating leading and trailing
+commands (those which should be translated separately) from the
+buffer.
+
+If a function is defined in %translate_buffer_env for the current
+environment, this function will be used to translate the buffer instead of
+translate_buffer().
+
+=cut
+
+our %translate_buffer_env = ();
+sub translate_buffer {
+    my ($self,$buffer,$no_wrap,@env) = (shift,shift,shift,@_);
+
+    if (@env and defined $translate_buffer_env{$env[-1]}) {
+        return &{$translate_buffer_env{$env[-1]}}($self,$buffer,$no_wrap,@env);
+    }
+
+    print STDERR "translate_buffer($buffer,$no_wrap,@env)="
+        if ($debug{'translate_buffer'});
+
+    my ($command,$variant) = ("","");
+    my $args;
+    my $translated_buffer = "";
+    my $orig_buffer = $buffer;
+    my $t = ""; # a temporary string
+
+    if ($buffer =~ /^\s*$/s) {
+        print STDERR "($buffer,@env)\n"
+            if ($debug{'translate_buffer'});
+        return ($buffer, @env);
+    }
+    # verbatim blocks.
+    # Buffers starting by \end{verbatim} are handled after.
+    if (in_verbatim(@env) and $buffer !~ m/^\n?\Q$ESCAPE\Eend\{$env[-1]\*?\}/) {
+        if($buffer =~ m/^(.*?)(\n?\Q$ESCAPE\Eend\{$env[-1]\*?\}.*)$/s) {
+            # end of a verbatim block
+            my ($begin, $end) = ($1?$1:"", $2);
+            my ($t1, $t2) = ("", "");
+            if (defined $begin) {
+                $t1 = $self->translate($begin,$self->{ref},
+                                       $env[-1],
+                                       "wrap" => 0);
+            }
+            ($t2, @env) = translate_buffer($self, $end, $no_wrap, @env);
+            print STDERR "($t1$t2,@env)\n"
+                if ($debug{'translate_buffer'});
+            return ($t1.$t2, @env);
+        } else {
+            $translated_buffer = $self->translate($buffer,$self->{ref},
+                                                  $env[-1],
+                                                  "wrap" => 0);
+            print STDERR "($translated_buffer,@env)\n"
+                if ($debug{'translate_buffer'});
+            return ($translated_buffer, @env);
+        }
+    }
+    # early detection of verbatim environment
+    if ($buffer =~ /^($RE_VERBATIM\n?)(.*)$/s and length $2) {
+        my ($begin, $end) = ($1, $2);
+        my ($t1, $t2) = ("", "");
+        ($t1, @env) = translate_buffer($self, $begin, $no_wrap, @env);
+        ($t2, @env) = translate_buffer($self, $end,   $no_wrap, @env);
+
+        print STDERR "($t1$t2,@env)\n"
+            if ($debug{'translate_buffer'});
+        return ($t1.$t2, @env);
+    }
+    # detect \begin and \end (if they are not commented)
+    if ($buffer =~ /^((?:.*?\n)?                # $1 is
+                      (?:[^%]                   # either not a %
+                        |                       # or
+                         (?<!\\)(?:\\\\)*\\%)*? # a % preceded by an odd nb of \
+                     )                          # $2 is a \begin{ with the end of the line
+                      (${RE_ESCAPE}(?:begin|end)\{.*)$/sx
+        and length $1) {
+        my ($begin, $end) = ($1, $2);
+        my ($t1, $t2) = ("", "");
+        if (is_closed($begin)) {
+            ($t1, @env) = translate_buffer($self, $begin, $no_wrap, @env);
+            ($t2, @env) = translate_buffer($self, $end,   $no_wrap, @env);
+
+            print STDERR "($t1$t2,@env)\n"
+                if ($debug{'translate_buffer'});
+            return ($t1.$t2, @env);
+        }
+    }
+
+    # remove comments from the buffer.
+    # Comments are stored in an array and shown as comments in the PO.
+    while ($buffer =~ m/($RE_PRE_COMMENT)$RE_COMMENT([^\n]*)(\n[ \t]*)(.*)$/s) {
+        my $comment = $2;
+        my $end = "";
+        if ($4 =~ m/^\n/s and $buffer !~ m/^$RE_COMMENT/s) {
+            # a line with comments, followed by an empty line.
+            # Keep the empty line, but remove the comment.
+            # This is an empirical heuristic, but seems to work;)
+            $end = "\n";
+        }
+        if (defined $comment and $comment !~ /^\s*$/s) {
+            push @comments, $comment;
+        }
+        $buffer =~ s/($RE_PRE_COMMENT)$RE_COMMENT([^\n]*)(\n[ \t]*)/$1$end/s;
+    }
+    
+
+    # translate leading commands.
+    do {
+        # keep the leading space to put them back after the translation of
+        # the command.
+        my $spaces = "";
+        if ($buffer =~ /^(\s+)(.*?)$/s) {
+            $spaces = $1;
+#            $buffer = $2; # FIXME: this also remove trailing spaces!!
+            $buffer =~ s/^\s*//;
+        }
+        my $buffer_save = $buffer;
+        ($command, $variant, $args, $buffer) =
+            get_leading_command($self,$buffer);
+        if (    (length $command)
+            and (defined $separated_command{$command})
+            and ($separated_command{$command} eq '-')
+            and (   (not (defined($buffer)))
+                 or ($buffer !~ m/^\s*$/s)  )) {
+            # This command can be separated only if alone on a buffer.
+            # We need to remove the trailing commands first, and see if it
+            # will be alone on this buffer.
+            $buffer = $buffer_save;
+            $command = "";
+        }
+        if (length($command)) {
+            # call the command subroutine.
+            # These command subroutines will probably call translate_buffer
+            # with the content of each argument that need a translation.
+            if (defined ($commands{$command})) {
+                ($t,@env) = &{$commands{$command}}($self,$command,$variant,
+                                                   $args,\@env,$no_wrap);
+                $translated_buffer .= $spaces.$t;
+                # Handle spaces after a command.
+                $spaces = "";
+                if ($buffer =~ /^(\s+)(.*?)$/s) {
+                    $spaces = $1;
+#                    $buffer = $2;  # FIXME: this also remove trailing spaces!!
+                    $buffer =~ s/^\s*//;
+                }
+                $translated_buffer .= $spaces;
+            } else {
+                die wrap_ref_mod($self->{ref},
+                                 "po4a::tex",
+                                 dgettext("po4a", "Unknown command: '%s'"),
+                                 $command);
+            }
+        } else {
+            $buffer = $spaces.$buffer;
+        }
+    } while (length($command));
+
+    # array of trailing commands, which will be translated later.
+    my @trailing_commands = ();
+    do {
+        my $spaces = "";
+        if ($buffer =~ /^(.*?)(\s+)$/s) {
+            $buffer = $1;
+            $spaces = $2;
+        }
+        my $buffer_save = $buffer;
+        ($command, $variant, $args, $buffer) =
+            get_trailing_command($self,$buffer);
+        if (    (length $command)
+            and (defined $separated_command{$command})
+            and ($separated_command{$command} eq '-')
+            and (   (not defined $buffer)
+                 or ($buffer !~ m/^\s*$/s))) {
+            # We can extract this command.
+            $command = "";
+            $buffer = $buffer_save;
+        }
+        if (length($command)) {
+            unshift @trailing_commands, ($command, $variant, $args, $spaces);
+        } else {
+            $buffer .= $spaces;
+        }
+    } while (length($command));
+
+    # Now, $buffer is just a block that can be translated.
+
+    # environment specific treatment
+    if (@env and defined $env_separators{$env[-1]}) {
+        my $re_separator = $env_separators{$env[-1]};
+        my $buf_begin = "";
+# FIXME: the separator may have to be translated.
+        while ($buffer =~ m/^(.*?)(\s*$re_separator\s*)(.*)$/s) {
+            my ($begin, $sep, $end) = ($1, $2, $3);
+            $buf_begin .= $begin;
+            if (is_closed($buf_begin)) {
+                my $t = "";
+                ($t, @env) = translate_buffer($self,$buf_begin,$no_wrap,@env);
+                $translated_buffer .= $t.$sep;
+                $buf_begin = "";
+            } else {
+                # the command is in a command argument
+                $buf_begin .= $sep;
+            }
+            $buffer = $end;
+        }
+        $buffer = $buf_begin . $buffer;
+    }
+
+    # finally, translate
+    if (length($buffer)) {
+        my $wrap = 1;
+        my ($e1, $e2);
+        NO_WRAP_LOOP: foreach $e1 (@env) {
+            foreach $e2 (split(' ', $no_wrap_environments)) {
+                if ($e1 eq $e2) {
+                    $wrap = 0;
+                    last NO_WRAP_LOOP;
+                }
+            }
+        }
+        $wrap = 0 if (defined $no_wrap and $no_wrap == 1);
+        # Keep spaces at the end of the buffer.
+        my $spaces = "";
+        if ($buffer =~ /^(.*?)(\s+)$/s) {
+            $spaces = $2;
+            $buffer = $1;
+        }
+        $translated_buffer .= $self->translate($buffer,$self->{ref},
+                                               @env?$env[-1]:"Plain text",
+                                               "wrap" => $wrap);
+        # Restore spaces at the end of the buffer.
+        $translated_buffer .= $spaces;
+    }
+
+    # append the translation of the trailing commands
+    while (@trailing_commands) {
+        my $command = shift @trailing_commands;
+        my $variant = shift @trailing_commands;
+        my $args    = shift @trailing_commands;
+        my $spaces  = shift @trailing_commands;
+        if (defined ($commands{$command})) {
+            ($t,@env) = &{$commands{$command}}($self,$command,$variant,
+                                               $args,\@env,$no_wrap);
+            $translated_buffer .= $t.$spaces;
+        } else {
+            die wrap_ref_mod($self->{ref},
+                             "po4a::tex",
+                             dgettext("po4a", "Unknown command: '%s'"),
+                             $command);
+        }
+    }
+
+    print STDERR "($translated_buffer,@env)\n"
+        if ($debug{'translate_buffer'});
+    return ($translated_buffer,@env);
+}
+
+################################
+#### EXTERNAL CUSTOMIZATION ####
+################################
+
+=item read
+
+Overload Transtractor's read
+
+=cut
+
+sub read {
+    my $self=shift;
+    my $filename=shift;
+
+    # keep the directory name of the main file.
+    $my_dirname = dirname($filename);
+
+    push @{$self->{TT}{doc_in}}, read_file($self, $filename);
+}
+
+=item read_file
+
+Recursively read a file, appending included files which are not listed in the
+@exclude_include array.  Included files are searched in the directory of the
+input document or in a directory listed in the TEXINPUTS environment variable.
+
+Except from the file inclusion part, it is a cut and paste from
+Transtractor's read.
+
+=cut
+
+# TODO: fix DOS end of lines
+sub read_file {
+    my $self=shift;
+    my $filename=shift
+        or croak wrap_mod("po4a::tex",
+            dgettext("po4a", "Can't read from file without having a filename"));
+    my $linenum=0;
+    my @entries=();
+
+    open (my $in, $filename)
+        or croak wrap_mod("po4a::tex",
+            dgettext("po4a", "Can't read from %s: %s"), $filename, $!);
+    while (defined (my $textline = <$in>)) {
+        $linenum++;
+        my $ref="$filename:$linenum";
+        # TODO: add support for includeonly
+        # The next regular expression matches \input or \includes that are
+        # not commented (but can be preceded by a \%.
+        while ($textline =~ /^((?:[^%]|(?<!\\)(?:\\\\)*\\%)*)
+                              \\(include|input)
+                              \{([^\{]*)\}(.*)$/x) {
+            my ($begin,$newfilename,$end) = ($1,$3,$4);
+            my $tag = $2;
+            my $include = 1;
+            foreach my $f (@exclude_include) {
+                if ($f eq $newfilename) {
+                    $include = 0;
+                    $begin .= "\\$tag"."{$newfilename}";
+                    $textline = $end;
+                    last;
+                }
+            }
+            if ($include and ($tag eq "include")) {
+                $begin .= "\\clearpage";
+            }
+            if ($begin !~ /^\s*$/) {
+                push @entries, ($begin,$ref);
+            }
+            if ($include) {
+                # search the file
+                foreach (($my_dirname,
+                          defined($ENV{"TEXINPUTS"})?
+                              split(/:/, $ENV{"TEXINPUTS"}):
+                              ".")) {
+                    if      (-r "$_/$newfilename") {
+                        $newfilename = "$_/$newfilename";
+                        last;
+                    } elsif (-r "$_/$newfilename.tex") {
+                        $newfilename = "$_/$newfilename.tex";
+                        last;
+                    }
+                }
+                push @entries, read_file($self,
+                                         $newfilename);
+                if ($tag eq "include") {
+                    $textline = "\\clearpage".$end;
+                } else {
+                    $textline = $end;
+                }
+            }
+        }
+        if (length($textline)) {
+            my @entry=($textline,$ref);
+            push @entries, @entry;
+
+            # Detect if this file has non-ascii characters
+            if($self->{TT}{ascii_input}) {
+
+                my $decoder = guess_encoding($textline);
+                if (!ref($decoder) or $decoder !~ /Encode::XS=/) {
+                    # We have detected a non-ascii line
+                    $self->{TT}{ascii_input} = 0;
+                    # Save the reference for future error message
+                    $self->{TT}{non_ascii_ref} ||= $ref;
+                }
+            }
+        }
+    }
+    close $in
+        or croak wrap_mod("po4a::tex",
+            dgettext("po4a", "Can't close %s after reading: %s"), $filename, $!);
+
+    return @entries;
+}
+
+=back
+
+
+=over 4
+
+=item parse_definition_file
+
+Subroutine for parsing a file with po4a directive (definitions for
+newcommands).
+
+=cut
+
+sub parse_definition_file {
+    my ($self,$filename,$only_try)=@_;
+
+    foreach (($my_dirname,
+              defined($ENV{"TEXINPUTS"})?
+                  split(/:/, $ENV{"TEXINPUTS"}):
+                  ".")) {
+        if ((not defined $_) or (not length $_)) {
+            $_ = ".";
+        }
+        if (-r $_."/".$filename) {
+            $filename = $_."/".$filename;
+            last;
+        }
+    }
+
+    if (! open (IN,"<$filename")) {
+        warn wrap_mod("po4a::tex",
+            dgettext("po4a", "Can't open %s: %s"), $filename, $!);
+        if (defined $only_try && $only_try) {
+            return;
+        } else {
+            exit 1;
+        }
+    }
+    while (<IN>) {
+        if (/^\s*%\s*po4a\s*:/) {
+            parse_definition_line($self, $_);
+        }
+    }
+}
+
+=item parse_definition_line
+
+Parse a definition line of the form "% po4a: ".
+
+See the INLINE CUSTOMIZATION section for more details.
+
+=cut
+
+sub parse_definition_line {
+    my ($self,$line)=@_;
+    $line =~ s/^\s*%\s*po4a\s*:\s*//;
+
+    if ($line =~ /^command\s+([-*+]?)(\w+)\s+(.*)$/) {
+        my $command = $2;
+        $line = $3;
+        if ($1) {
+            $separated_command{$command} = $1;
+        }
+        if ($line =~ /^alias\s+(\w+)\s*$/) {
+            if (defined ($commands{$1})) {
+                $commands{$command} = $commands{$1};
+                $command_parameters{$command} = $command_parameters{$1};
+            } else {
+                die wrap_mod("po4a::tex",
+                             dgettext("po4a", "Cannot use an alias to the unknown command '%s'"),
+                             $2);
+            }
+        } elsif ($line =~ /^(-1|\d+),(-1|\d+),(-1|[ 0-9]*),(-1|[ 0-9]*?)\s*$/) {
+            die wrap_ref_mod($self->{ref},
+                             "po4a::tex",
+                             dgettext("po4a", "You are using the old ".
+                                      "definitions format (%s).  ".
+                                      "Please update this definition line."),
+                             $_[1])
+        } elsif ($line =~ m/^((?:\{_?\}|\[_?\])*)\s*$/) {
+            register_generic_command("$command,$1");
+        }
+    } elsif ($line =~ /^environment\s+([+]?\w+\*?)(.*)$/) {
+        my $env = $1;
+        $line = $2;
+        if ($line =~ m/^\s*((?:\{_?\}|\[_?\])*)\s*$/) {
+            register_generic_environment("$env,$1");
+        }
+    } elsif ($line =~ /^separator\s+(\w+(?:\[#[0-9]+\]))\s+\"(.*)\"\s*$/) {
+        my $env = $1; # This is not necessarily an environment.
+                      # It can also be smth like 'title{#1}'.
+        $env_separators{$env} = $2;
+    } elsif ($line =~ /^verbatim\s+environment\s+(\w+)\s+$/) {
+        register_verbatim_environment($1);
+    }
+}
+
+=item is_closed
+
+=cut
+
+sub is_closed {
+    my $paragraph = shift;
+# FIXME: [ and ] are more difficult to handle, because it is not easy to detect if it introduce an optional argument
+    my $tmp = $paragraph;
+    my $closing = 0;
+    my $opening = 0;
+    # FIXME: { and } should not be counted in verbatim blocks
+    # Remove comments
+    $tmp =~ s/($RE_PRE_COMMENT)$RE_COMMENT.*//mg;
+    while ($tmp =~ /^.*?(?<!$RE_ESCAPE)(?:$RE_ESCAPE$RE_ESCAPE)*\{(.*)$/s) {
+        $opening += 1;
+        $tmp = $1;
+    }
+    $tmp = $paragraph;
+    # Remove comments
+    $tmp =~ s/($RE_PRE_COMMENT)$RE_COMMENT.*//mg;
+    while ($tmp =~ /^.*?(?<!$RE_ESCAPE)(?:$RE_ESCAPE$RE_ESCAPE)*\}(.*)$/s) {
+        $closing += 1;
+        $tmp = $1;
+    }
+    return $opening eq $closing;
+}
+
+sub in_verbatim {
+    foreach my $e1 (@_) {
+        foreach my $e2 (split(' ', $verbatim_environments)) {
+            if ($e1 eq $e2) {
+                return 1;
+            }
+        }
+    }
+
+    return 0;
+}
+
+#############################
+#### MAIN PARSE FUNCTION ####
+#############################
+=item parse
+
+=cut
+
+sub parse {
+    my $self = shift;
+    my ($line,$ref);
+    my $paragraph = ""; # Buffer where we put the paragraph while building
+    my @env = (); # environment stack
+    my $t = "";
+
+  LINE:
+    undef $self->{type};
+    ($line,$ref)=$self->shiftline();
+
+    while (defined($line)) {
+        chomp($line);
+        $self->{ref}="$ref";
+
+        if ($line =~ /^\s*%\s*po4a\s*:/) {
+            parse_definition_line($self, $line);
+            goto LINE;
+        }
+
+        my $closed = is_closed($paragraph);
+
+#FIXME: what happens if a \begin{verbatim} or \end{verbatim} is in the
+#       middle of a line. (This is only an issue if the verbatim
+#       environment contains an un-closed bracket)
+        if (   ($closed and ($line =~ /^\s*$/ or
+                             $line =~ /^\s*$RE_VERBATIM\s*$/))
+            or (in_verbatim(@env) and $line =~ /^\s*\Q$ESCAPE\Eend{$env[-1]}\s*$/)
+           ) {
+            # An empty line. This indicates the end of the current
+            # paragraph.
+            $paragraph .= $line."\n";
+            if (length($paragraph)) {
+                ($t, @env) = translate_buffer($self,$paragraph,undef,@env);
+                $self->pushline($t);
+                $paragraph="";
+                @comments = ();
+            }
+        } else {
+            # continue the same paragraph
+            $paragraph .= $line."\n";
+        }
+
+        # Reinit the loop
+        ($line,$ref)=$self->shiftline();
+        undef $self->{type};
+    }
+
+    if (length($paragraph)) {
+        ($t, @env) = translate_buffer($self,$paragraph,undef,@env);
+        $self->pushline($t);
+        $paragraph="";
+    }
+} # end of parse
+
+=item docheader
+
+=back
+
+=cut
+
+sub docheader {
+    return "% This file was generated with po4a. Translate the source file.\n".
+           "%\n";
+}
+
+
+####################################
+#### DEFINITION OF THE COMMANDS ####
+####################################
+
+=head1 INTERNAL FUNCTIONS used to write derivated parsers
+
+Command and environment functions take the following arguments (in
+addition to the $self object):
+
+=over
+
+=item A command name
+
+=item A variant
+
+=item An array of (type, argument) tuples
+
+=item The current environment
+
+=back
+
+The first 3 arguments are extracted by get_leading_command or
+get_trailing_command.
+
+Command and environment functions return the translation of the command
+with its arguments and a new environment.
+
+Environment functions are called when a \begin command is found. They are
+called with the \begin command and its arguments.
+
+The TeX module only proposes one command function and one environment
+function: generic_command and generic_environment.
+
+generic_command uses the information specified by
+register_generic_command or by adding definition to the TeX file:
+ % po4a: command I<command1> I<parameters>
+
+generic_environment uses the information specified by
+register_generic_environment or by adding definition to the TeX file:
+ % po4a: environment I<env> I<parameters>
+
+Both functions will only translate the parameters that were specified as
+translatable (with a '_').
+generic_environment will append the name of the environment to the
+environment stack and generic_command will append the name of the command
+followed by an identifier of the parameter (like {#7} or [#2]).
+
+=cut
+
+# definition of environment related commands
+
+$commands{'begin'}= sub {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+    print "begin($command,$variant,@$args,@$env,$no_wrap)="
+        if ($debug{'commands'} || $debug{'environments'});
+    my ($t,@e) = ("",());
+
+    my $envir = $args->[1];
+    if (defined($envir) and $envir =~ /^(.*)\*$/) {
+        $envir = $1;
+    }
+
+    if (defined($envir) && defined($environments{$envir})) {
+        ($t, @e) = &{$environments{$envir}}($self,$command,$variant,
+                                            $args,$env,$no_wrap);
+    } else {
+        die wrap_ref_mod($self->{ref}, "po4a::tex",
+                     dgettext("po4a", "unknown environment: '%s'"),
+                     $args->[1]);
+    }
+
+    print "($t, @e)\n"
+        if ($debug{'commands'} || $debug{'environments'});
+    return ($t, @e);
+};
+# Use register_generic to set the type of arguments. The function is then
+# overwritten:
+register_generic_command("*end,{}");
+$commands{'end'}= sub {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+    print "end($command,$variant,@$args,@$env,$no_wrap)="
+        if ($debug{'commands'} || $debug{'environments'});
+
+    # verify that this environment was the last pushed environment.
+    if (!@$env || @$env[-1] ne $args->[1]) {
+        # a begin may have been hidden in the middle of a translated
+        # buffer. FIXME: Just warn for now.
+        warn wrap_ref_mod($self->{'ref'}, "po4a::tex",
+                          dgettext("po4a", "unmatched end of environment '%s'"),
+                          $args->[1]);
+    } else {
+        pop @$env;
+    }
+
+    my ($t,@e) = generic_command($self,$command,$variant,$args,$env,$no_wrap);
+
+    print "($t, @$env)\n"
+        if ($debug{'commands'} || $debug{'environments'});
+    return ($t, @$env);
+};
+$separated_command{'begin'} = '*';
+
+sub generic_command {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+    print "generic_command($command,$variant,@$args,@$env,$no_wrap)="
+        if ($debug{'commands'} || $debug{'environments'});
+
+    my ($t,@e)=("",());
+    my $translated = "";
+
+    # the number of arguments is checked during the extraction of the
+    # arguments
+
+    if (   (not (defined $separated_command{$command}))
+        or $separated_command{$command} ne '+') {
+        # Use the information from %command_parameters to only translate
+        # the needed parameters
+        $translated = "$ESCAPE$command$variant";
+        # handle arguments
+        my @arg_types = @{$command_parameters{$command}{'types'}};
+        my @arg_translated = @{$command_parameters{$command}{'translated'}};
+        my ($type, $opt);
+        my @targs = @$args;
+        my $count = 0;
+        while (@targs) {
+            $type = shift @targs;
+            $opt  = shift @targs;
+            my $have_to_be_translated = 0;
+TEST_TYPE:
+            if ($count >= scalar @arg_types) {
+                # The number of arguments does not match,
+                # and a variable number of arguments was not specified
+                die wrap_ref_mod($self->{ref}, "po4a::tex",
+                                 dgettext("po4a",
+                                          "Wrong number of arguments for ".
+                                          "the '%s' command.")."\n",
+                                 $command);
+            } elsif ($type eq $arg_types[$count]) {
+                $have_to_be_translated = $arg_translated[$count];
+                $count ++;
+            } elsif ($type eq '{' and $arg_types[$count] eq '[') {
+                # an optionnal argument was not provided,
+                # try with the next argument.
+                $count++;
+                goto TEST_TYPE;
+            } else {
+                my $reason = dgettext("po4a",
+                                      "An optional argument ".
+                                      "was provided, but a mandatory one ".
+                                      "is expected.");
+                die wrap_ref_mod($self->{ref}, "po4a::tex",
+                                 dgettext("po4a", "Command '%s': %s")."\n",
+                                 $command, $reason);
+            }
+            if ($have_to_be_translated) {
+                ($t, @e) = translate_buffer($self,$opt,$no_wrap,(@$env,$command.$type."#".$count.$type_end{$type}));
+            } else {
+                $t = $opt;
+            }
+            $translated .= $type.$t.$type_end{$type};
+        }
+    } else {
+        # Translate the command with all its arguments joined
+        my $tmp = "$ESCAPE$command$variant";
+        my ($type, $opt);
+        while (@$args) {
+            $type = shift @$args;
+            $opt  = shift @$args;
+            $tmp .= $type.$opt.$type_end{$type};
+        }
+        @e = @$env;
+        my $wrap = 1;
+        $wrap = 0 if $no_wrap == 1;
+        $translated = $self->translate($tmp,$self->{ref},
+                                       @e?$e[-1]:"Plain text",
+                                       "wrap" => $wrap);
+    }
+
+    print "($translated, @$env)\n"
+        if ($debug{'commands'} || $debug{'environments'});
+    return ($translated, @$env);
+}
+
+sub register_generic_command {
+    if ($_[0] =~ m/^(.*),((\{_?\}|\[_?\]| _? )*)$/) {
+        my $command = $1;
+        my $arg_types = $2;
+        if ($command =~ /^([-*+])(.*)$/) {
+            $command = $2;
+            $separated_command{$command}=$1;
+        }
+        my @types = ();
+        my @translated = ();
+        while (    defined $arg_types
+               and length $arg_types
+               and $arg_types =~ m/^(?:([\{\[ ])(_?)[\}\] ])(.*)$/) {
+            push @types, $1;
+            push @translated, ($2 eq "_")?1:0;
+            $arg_types = $3;
+        }
+        $command_parameters{$command}{'types'} = \@types;
+        $command_parameters{$command}{'translated'} = \@translated;
+        $command_parameters{$command}{'nb_args'} = "";
+        $commands{$command} = \&generic_command;
+    } else {
+        die wrap_mod("po4a::tex",
+                     dgettext("po4a",
+                              "register_generic_command: unsupported ".
+                              "format: '%s'.")."\n",
+                     $_[0]);
+    }
+}
+
+########################################
+#### DEFINITION OF THE ENVIRONMENTS ####
+########################################
+sub generic_environment {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+    print "generic_environment($command,$variant,$args,$env,$no_wrap)="
+        if ($debug{'environments'});
+    my ($t,@e)=("",());
+    my $translated = "";
+
+    # The first argument (the name of the environment is never translated)
+    # For the others, @types and @translated are used.
+    $translated = "$ESCAPE$command$variant";
+    my @targs = @$args;
+    my $type = shift @targs;
+    my $opt  = shift @targs;
+    my $new_env = $opt;
+    $translated .= $type.$new_env.$type_end{$type};
+    if (   (not (defined $separated_environment{$new_env}))
+        or $separated_environment{$new_env} ne '+') {
+        # Use the information from %command_parameters to only translate
+        # the needed parameters
+        my @arg_types = @{$environment_parameters{$new_env}{'types'}};
+        my @arg_translated = @{$environment_parameters{$new_env}{'translated'}};
+
+        my $count = 0;
+        while (@targs) {
+            $type = shift @targs;
+            $opt  = shift @targs;
+            my $have_to_be_translated = 0;
+TEST_TYPE:
+            if ($count >= scalar @arg_types) {
+                die wrap_ref_mod($self->{ref}, "po4a::tex",
+                                 dgettext("po4a",
+                                          "Wrong number of arguments for ".
+                                          "the '%s' command.")."\n",
+                                 $command);
+            } elsif ($type eq $arg_types[$count]) {
+                $have_to_be_translated = $arg_translated[$count];
+                $count ++;
+            } elsif ($type eq '{' and $arg_types[$count] eq '[') {
+                # an optionnal argument was not provided,
+                # try with the next argument.
+                $count++;
+                goto TEST_TYPE;
+            } else {
+                my $reason = dgettext("po4a",
+                                      "An optional argument ".
+                                      "was provided, but a mandatory one ".
+                                      "is expected.");
+                die wrap_ref_mod($self->{ref}, "po4a::tex",
+                                 dgettext("po4a", "Command '%s': %s")."\n",
+                                 $command, $reason);
+            }
+
+            if ($have_to_be_translated) {
+                ($t, @e) = translate_buffer($self,$opt,$no_wrap,(@$env,$new_env.$type."#".$count.$type_end{$type}));
+            } else {
+                $t = $opt;
+            }
+            $translated .= $type.$t.$type_end{$type};
+
+        }
+    } else {
+        # Translate the \begin command with all its arguments joined
+        my ($type, $opt);
+        my $buf = $translated;
+        while (@targs) {
+            $type = shift @targs;
+            $opt  = shift @targs;
+            $buf .= $type.$opt.$type_end{$type};
+        }
+        @e = @$env;
+        my $wrap = 1;
+        $wrap = 0 if $no_wrap == 1;
+        $translated = $self->translate($buf,$self->{ref},
+                                       @e?$e[-1]:"Plain text",
+                                       "wrap" => $wrap);
+    }
+    @e = (@$env, $new_env);
+
+    print "($translated,@e)\n"
+        if ($debug{'environments'});
+    return ($translated,@e);
+}
+
+
+sub check_arg_count {
+    my $self = shift;
+    my $command = shift;
+    my $args = shift;
+    my @targs = @$args;
+    my $check = 1;
+    my @remainder = ();
+    my $reason = "";
+    my ($type, $arg);
+    my @arg_types;
+    
+    if ($command eq 'begin') {
+        $type = shift @targs;
+        # The name of the environment is mandatory
+        if (   (not defined $type)
+            or ($type ne '{')) {
+            $reason = dgettext("po4a",
+                               "The first argument of \\begin is mandatory.");
+            $check = 0;
+        }
+        my $env = shift @targs;
+        if (not defined $environment_parameters{$env}) {
+            die wrap_ref_mod($self->{ref},"po4a::tex",
+                             dgettext("po4a", "unknown environment: '%s'"),
+                             $env);
+        }
+        @arg_types = @{$environment_parameters{$env}{'types'}};
+    } else {
+        @arg_types = @{$command_parameters{$command}{'types'}};
+    }
+    
+    my $count = 0;
+    while ($check and @targs) {
+        $type = shift @targs;
+        $arg  = shift @targs;
+TEST_TYPE:
+        if ($count >= scalar @arg_types) {
+            # Too many arguments some will remain
+            @remainder = ($type, $arg, @targs);
+            last;
+        } elsif ($type eq $arg_types[$count]) {
+            $count ++;
+        } elsif ($type eq '{' and $arg_types[$count] eq '[') {
+            # an optionnal argument was not provided,
+            # try with the next argument.
+            $count++;
+            goto TEST_TYPE;
+        } else {
+            $check = 0;
+            $reason = dgettext("po4a",
+                               "An optional argument was ".
+                               "provided, but a mandatory one is expected.");
+        }
+    }
+
+    return ($check, $reason, \@remainder);
+}
+
+sub register_generic_environment {
+    print "register_generic_environment($_[0])\n"
+        if ($debug{'environments'});
+    if ($_[0] =~ m/^(.*),((?:\{_?\}|\[_?\])*)$/) {
+        my $env = $1;
+        my $arg_types = $2;
+        if ($env =~ /^([+])(.*)$/) {
+            $separated_environment{$2} = $1;
+            $env = $2;
+        }
+        my @types = ();
+        my @translated = ();
+        while (    defined $arg_types
+               and length $arg_types
+               and $arg_types =~ m/^(?:([\{\[])(_?)[\}\]])(.*)$/) {
+            push @types, $1;
+            push @translated, ($2 eq "_")?1:0;
+            $arg_types = $3;
+        }
+        $environment_parameters{$env} = {
+            'types'      => \@types,
+            'translated' => \@translated
+        };
+        $environments{$env} = \&generic_environment;
+    }
+}
+
+sub register_verbatim_environment {
+    my $env = shift;
+    $no_wrap_environments .= " $env";
+    $verbatim_environments .= " $env";
+    $RE_VERBATIM = "\\\\begin\\{(?:".
+                   join("|", split(/ /, $verbatim_environments)).
+                   ")\\*?\\}";
+    register_generic_environment("$env,")
+        unless (defined $environments{$env});
+}
+
+####################################
+### INITIALIZATION OF THE PARSER ###
+####################################
+sub initialize {
+    my $self = shift;
+    my %options = @_;
+
+    $self->{options}{'definitions'}='';
+    $self->{options}{'exclude_include'}='';
+    $self->{options}{'no_wrap'}='';
+    $self->{options}{'verbatim'}='';
+    $self->{options}{'debug'}='';
+    $self->{options}{'verbose'}='';
+
+    %debug = ();
+    # FIXME: %commands and %separated_command should also be restored to their
+    #        default values.
+
+    foreach my $opt (keys %options) {
+        if ($options{$opt}) {
+            die wrap_mod("po4a::tex",
+                         dgettext("po4a", "Unknown option: %s"), $opt)
+                unless exists $self->{options}{$opt};
+            $self->{options}{$opt} = $options{$opt};
+        }
+    }
+
+    if ($options{'debug'}) {
+        foreach ($options{'debug'}) {
+            $debug{$_} = 1;
+        }
+    }
+
+    if ($options{'exclude_include'}) {
+        foreach (split(/:/, $options{'exclude_include'})) {
+            push  @exclude_include, $_;
+        }
+    }
+
+    if ($options{'no_wrap'}) {
+        foreach (split(/,/, $options{'no_wrap'})) {
+            $no_wrap_environments .= " $_";
+            register_generic_environment("$_,")
+                unless (defined $environments{$_});
+        }
+    }
+
+    if ($options{'verbatim'}) {
+        foreach (split(/,/, $options{'verbatim'})) {
+            register_verbatim_environment($_);
+        }
+    }
+
+    if ($options{'definitions'}) {
+        $self->parse_definition_file($options{'definitions'})
+    }
+}
+
+=head1 STATUS OF THIS MODULE
+
+This module needs more tests.
+
+It was tested on a book and with the Python documentation.
+
+=head1 TODO LIST
+
+=over 4
+
+=item Automatic detection of new commands
+
+The TeX module could parse the newcommand arguments and try to guess the
+number of arguments, their type and whether or not they should be
+translated.
+
+=item Tranlation of the environment separator
+
+When \item is used as an environment separator, the item argument is
+attached to the following string.
+
+=item Some commands should be added to the environment stack
+
+These commands should be specified by couples.
+This could allow to specify commands beginning or ending a verbatim
+environment.
+
+=item Others
+
+Various other points are tagged TODO in the source.
+
+=back
+
+=head1 KNOWN BUGS
+
+Various points are tagged FIXME in the source.
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>,
+L<Locale::Po4a::TransTractor(3pm)|Locale::Po4a::TransTractor>,
+L<Locale::Po4a::LaTeX(3pm)|Locale::Po4a::LaTeX>.
+
+=head1 AUTHORS
+
+ Nicolas Fran輟is <nicolas.francois@xxxxxxxxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2004, 2005 by Nicolas FRANヌOIS <nicolas.francois@xxxxxxxxxxxxxxx>.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut
+
+1;

Added: po4a/lib/Locale/Po4a/Texinfo.pm
===================================================================
--- po4a/lib/Locale/Po4a/Texinfo.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Texinfo.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,526 @@
+#!/usr/bin/perl -w
+
+# Copyright (c) 2004-2007 by Nicolas FRANヌOIS <nicolas.francois@xxxxxxxxxxxxxxx>
+#
+# This file is part of po4a.
+#
+# This program 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 program 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 po4a; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Texinfo - Convert Texinfo documents and derivates from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Texinfo is a module to help the translation of Texinfo documents into
+other [human] languages.
+
+This module contains the definitions of common Texinfo commands and
+environments.
+
+=head1 STATUS OF THIS MODULE
+
+This module is still beta.
+Please send feedback and feature requests.
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>,
+L<Locale::Po4a::TransTractor(3pm)|Locale::Po4a::TransTractor>,
+L<Locale::Po4a::TeX(3pm)|Locale::Po4a::TeX>.
+
+=head1 AUTHORS
+
+ Nicolas Fran輟is <nicolas.francois@xxxxxxxxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2004-2007 by Nicolas FRANヌOIS <nicolas.francois@xxxxxxxxxxxxxxx>.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see COPYING file).
+
+=cut
+
+package Locale::Po4a::Texinfo;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION= $Locale::Po4a::TeX::VERSION;
+@ISA= qw(Locale::Po4a::TeX);
+@EXPORT= qw();
+
+use Locale::Po4a::Common;
+use Locale::Po4a::TeX;
+use subs qw(&untranslated     &translate_joined
+            &parse_definition_file
+            &register_generic_command &is_closed &translate_buffer
+            &register_verbatim_environment
+            &generic_command
+            &in_verbatim);
+*untranslated                  = \&Locale::Po4a::TeX::untranslated;
+*translate_joined              = \&Locale::Po4a::TeX::translate_joined;
+*parse_definition_file         = \&Locale::Po4a::TeX::parse_definition_file;
+*register_generic_command      = \&Locale::Po4a::TeX::register_generic_command;
+*register_verbatim_environment = \&Locale::Po4a::TeX::register_verbatim_environment;
+*generic_command               = \&Locale::Po4a::TeX::generic_command;
+*is_closed                     = \&Locale::Po4a::TeX::is_closed;
+*in_verbatim                   = \&Locale::Po4a::TeX::in_verbatim;
+*translate_buffer              = \&Locale::Po4a::TeX::translate_buffer;
+use vars qw($RE_ESCAPE            $ESCAPE
+            $RE_VERBATIM
+            $RE_COMMENT           $RE_PRE_COMMENT
+            $no_wrap_environments $separated_commands
+            %commands             %environments
+            %command_categories   %separated
+            %env_separators       %debug
+            %translate_buffer_env
+            @exclude_include      @comments);
+*RE_ESCAPE             = \$Locale::Po4a::TeX::RE_ESCAPE;
+*ESCAPE                = \$Locale::Po4a::TeX::ESCAPE;
+*RE_VERBATIM           = \$Locale::Po4a::TeX::RE_VERBATIM;
+*RE_COMMENT            = \$Locale::Po4a::TeX::RE_COMMENT;
+*RE_PRE_COMMENT        = \$Locale::Po4a::TeX::RE_PRE_COMMENT;
+*no_wrap_environments  = \$Locale::Po4a::TeX::no_wrap_environments;
+*separated_commands    = \$Locale::Po4a::TeX::separated_commands;
+*commands              = \%Locale::Po4a::TeX::commands;
+*environments          = \%Locale::Po4a::TeX::environments;
+*command_categories    = \%Locale::Po4a::TeX::command_categories;
+*separated             = \%Locale::Po4a::TeX::separated;
+*env_separators        = \%Locale::Po4a::TeX::env_separators;
+*debug                 = \%Locale::Po4a::TeX::debug;
+*translate_buffer_env  = \%Locale::Po4a::TeX::translate_buffer_env;
+*exclude_include       = \@Locale::Po4a::TeX::exclude_include;
+*comments              = \@Locale::Po4a::TeX::comments;
+
+$ESCAPE = "\@";
+$RE_ESCAPE = "\@";
+$RE_VERBATIM = "\@example";
+$RE_COMMENT = "\\\@(?:c|comment)\\b";
+
+my %break_line = ();
+
+# translate_line_command indicate if the arguments to the command handled
+# by line_command() should be translated:
+# undefined: arguments are not translated
+# 0:         there should be no arguments
+# 1:         arguments should be translated
+my %translate_line_command = ();
+
+foreach (qw/example smallexample tex display smalldisplay verbatim format smallformat
+            flushleft flushright lisp smalllisp ignore/) {
+    register_verbatim_environment($_);
+    $commands{$_} = \&environment_line_command;
+    $translate_line_command{$_} = 0; # There should be no arguments
+    $break_line{$_} = 1;
+}
+
+my $docheader_pushed = 0;
+# The header shall not be written before the Texinfo header (which include
+# the \input command that define the texinfo macros)
+sub docheader {
+    return "";
+}
+
+sub push_docheader {
+    return if $docheader_pushed;
+    my $self = shift;
+    $self->pushline(<<END);
+\@c ===========================================================================
+\@c
+\@c This file was generated with po4a. Translate the source file.
+\@c
+\@c ===========================================================================
+END
+    $docheader_pushed = 1;
+}
+
+sub parse {
+    my $self = shift;
+    my ($line,$ref);
+    my $paragraph = ""; # Buffer where we put the paragraph while building
+    my @env = (); # environment stack
+    my $t = "";
+    $docheader_pushed = 0;
+
+  LINE:
+    undef $self->{type};
+    ($line,$ref)=$self->shiftline();
+
+    while (defined($line)) {
+        chomp($line);
+        $self->{ref}="$ref";
+
+        if ($line =~ /^\s*@\s*po4a\s*:/) {
+            parse_definition_line($self, $line);
+            goto LINE;
+        }
+
+        my $closed = 1;
+        if (!in_verbatim(@env)) {
+            $closed = is_closed($paragraph);
+        }
+#        if (not $closed) {
+#            print "not closed. line: '$line'\n            para: '$paragraph'\n";
+#        }
+
+        if ($closed and $line =~ /^\s*$/) {
+            # An empty line. This indicates the end of the current
+            # paragraph.
+            $paragraph .= $line."\n";
+            if (length($paragraph)) {
+                ($t, @env) = translate_buffer($self,$paragraph,undef,@env);
+                $self->pushline($t);
+                $paragraph="";
+            }
+        } elsif ($line =~ m/^\\input /) {
+            if (length($paragraph)) {
+                ($t, @env) = translate_buffer($self,$paragraph,undef,@env);
+                $self->pushline($t);
+                $paragraph="";
+            }
+            $self->pushline($line."\n");
+            $self->push_docheader();
+        } elsif ($line =~ m/^$RE_COMMENT/) {
+            $self->push_docheader();
+            $self->pushline($line."\n");
+        } elsif (    $closed
+                 and ($line =~ /^@([^ ]*?)(?: +(.*))?$/)
+                 and (defined $commands{$1})
+                 and ($break_line{$1})) {
+            if (length($paragraph)) {
+                ($t, @env) = translate_buffer($self,$paragraph,undef,@env);
+                $self->pushline($t);
+                $paragraph="";
+            }
+            my $arg = $2;
+            my @args = ();
+            if (defined $arg and length $arg) {
+                # FIXME: keep the spaces ?
+                $arg =~ s/\s*$//s;
+                @args= (" ", $arg);
+            }
+            ($t, @env) = &{$commands{$1}}($self, $1, "", \@args, \@env, 1);
+            $self->pushline($t."\n");
+        } else {
+            # continue the same paragraph
+            $paragraph .= $line."\n";
+        }
+
+        # Reinit the loop
+        ($line,$ref)=$self->shiftline();
+        undef $self->{type};
+    }
+
+    if (length($paragraph)) {
+        ($t, @env) = translate_buffer($self,$paragraph,undef,@env);
+        $self->pushline($t);
+        $paragraph="";
+    }
+} # end of parse
+
+sub line_command {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+    print "line_command($command,$variant,@$args,@$env,$no_wrap)="
+        if ($debug{'commands'});
+
+    my $translated = $ESCAPE.$command;
+    my $line = $args->[1];
+    if (defined $line and length $line) {
+        if (    defined $translate_line_command{$command}
+            and $translate_line_command{$command}) {
+            # $no_wrap could be forced to 1, but it should already be set
+            my ($t,$e) = $self->translate_buffer($line,$no_wrap,@$env,$command);
+            $translated .= " ".$t;
+        } else {
+            $translated .= " ".$line;
+        }
+    }
+    print "($translated,@$env)\n"
+        if ($debug{'commands'});
+    return ($translated,@$env);
+}
+
+sub translate_buffer_menu {
+    my ($self,$buffer,$no_wrap,@env) = (shift,shift,shift,@_);
+    print STDERR "translate_buffer_menu($buffer,$no_wrap,@env)="
+        if ($debug{'translate_buffer'});
+
+    my $translated_buffer = "";
+    my $spaces = "";
+    if ($buffer =~ m/(\s*)$/s) {
+        $spaces = $1;
+    }
+
+
+    while ($buffer =~ m/^(.*?)((?:\n|^)\* )(.*)$/s) {
+        my $sep = $2;
+        $buffer = $3;
+        my($t, @e) = $self->translate_buffer_menuentry($1, $no_wrap,
+                                                       @env, "menuentry");
+        $translated_buffer .= $t.$sep;
+    }
+    my($t, @e) = $self->translate_buffer_menuentry($buffer, $no_wrap,
+                                                   @env, "menuentry");
+    $translated_buffer .= $t;
+
+    $translated_buffer .= $spaces;
+
+    print STDERR "($translated_buffer,@env)\n"
+        if ($debug{'translate_buffer'});
+    return ($translated_buffer,@env);
+}
+$translate_buffer_env{"menu"}       = \&translate_buffer_menu;
+$translate_buffer_env{"detailmenu"} = \&translate_buffer_menu;
+$translate_buffer_env{"direntry"}   = \&translate_buffer_menu;
+
+my $menu_width = 78;
+my $menu_sep_width = 30;
+sub translate_buffer_menuentry {
+    my ($self,$buffer,$no_wrap,@env) = (shift,shift,shift,@_);
+    print STDERR "translate_buffer_menuentry($buffer,$no_wrap,@env)="
+        if ($debug{'translate_buffer'});
+
+    my $translated_buffer = "";
+    
+    if (   $buffer =~ m/^(.*?)(::)\s+(.*)$/s
+        or $buffer =~ m/^(.*?: .*?)(\.)\s+(.*)$/s) {
+        my ($name, $sep, $description) = ($1, $2, $3);
+        my ($t, @e) = $self->translate_buffer($name, $no_wrap, @env);
+        $translated_buffer = $t.$sep."  ";
+        my $l = length($translated_buffer) + 2;
+        if ($l < $menu_sep_width-1) {
+            $translated_buffer .= ' 'x($menu_sep_width-1-$l);
+            $l = $menu_sep_width-1;
+        }
+        ($t, @e) = $self->translate_buffer($description, $no_wrap, @env);
+        $t =~ s/\n//sg;
+        $t = Locale::Po4a::Po::wrap($t, $menu_width-$l-2);
+        my $spaces = ' 'x($l+2);
+        $t =~ s/\n/\n$spaces/sg;
+        $translated_buffer .= $t;
+    } else {
+# FIXME: no-wrap if a line start by a space
+        my ($t, @e) = $self->translate_buffer($buffer, $no_wrap, @env);
+        $translated_buffer = $t;
+    }
+
+    print STDERR "($translated_buffer,@env)\n"
+        if ($debug{'translate_buffer'});
+    return ($translated_buffer,@env);
+}
+
+sub translate_buffer_ignore {
+    my ($self,$buffer,$no_wrap,@env) = (shift,shift,shift,@_);
+    print STDERR "translate_buffer_ignore($buffer,$no_wrap,@env);\n"
+        if ($debug{'translate_buffer'});
+    return ($buffer,@env);
+}
+$translate_buffer_env{"ignore"} = \&translate_buffer_ignore;
+
+foreach (qw(appendix section cindex findex kindex pindex vindex subsection
+            dircategory subtitle include
+            exdent center unnumberedsec
+            heading unnumbered unnumberedsubsec
+            unnumberedsubsubsec appendixsec appendixsubsec
+            appendixsubsubsec majorheading chapheading subheading
+            subsubheading shorttitlepage
+            subsubsection top item itemx chapter settitle
+            title author)) {
+    $commands{$_} = \&line_command;
+    $break_line{$_} = 1;
+    $translate_line_command{$_} = 1;
+}
+foreach (qw(c comment set setfilename setchapternewpage vskip synindex
+            syncodeindex need fonttextsize printindex headings finalout sp
+            defcodeindex defindex definfoenclose)) {
+    $commands{$_} = \&line_command;
+    $break_line{$_} = 1;
+}
+# definfoenclose: command definition => translate?
+foreach (qw(insertcopying page bye summarycontents shortcontents contents
+            noindent)) {
+    $commands{$_} = \&line_command;
+    $break_line{$_} = 1;
+    $translate_line_command{$_} = 0;
+}
+
+foreach (qw(defcv deffn
+            defivar defmac defmethod defop
+            defopt defspec deftp deftypecv
+            deftypefn deftypefun 
+            deftypeivar deftypemethod
+            deftypeop deftypevar deftypevr
+            defun defvar defvr)) {
+    $commands{$_} = \&environment_line_command;
+    $translate_line_command{$_} = 1;
+    $break_line{$_} = 1;
+}
+foreach (qw(defcvx deffnx defivarx defmacx defmethodx defopx defoptx
+            defspecx deftpx deftypecvx deftypefnx deftypefunx deftypeivarx
+            deftypemethodx deftypeopx deftypevarx deftypevrx defunx
+            defvarx defvrx)) {
+    $commands{$_} = \&line_command;
+    $translate_line_command{$_} = 1;
+    $break_line{$_} = 1;
+}
+
+foreach (qw(titlefont w i r b sansserif sc slanted strong t cite email
+            footnote indicateurl emph ref xref pxref inforef kbd key
+            acronym),
+# The following commands could cause problems since the their arguments
+# has a semantic and a translator could decide not to translate code but
+# still translate thses short words if they appear in another context.
+         qw(file command dfn dmn option math code samp var)) {
+    register_generic_command("-$_,{_}");
+}
+
+register_generic_command("*anchor,{_}");
+register_generic_command("*refill,");
+
+$translate_line_command{'node'} = 1;
+$no_wrap_environments .= " node";
+$break_line{'node'} = 1;
+# @node     Comments,  Minimum, Conventions, Overview
+$commands{'node'} = sub {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+    print "node($command,$variant,@$args,@$env,$no_wrap)="
+        if ($debug{'commands'});
+
+    my $translated = $ESCAPE.$command;
+    my $line = $args->[1];
+    if (defined $line and length $line) {
+        my @pointers = split (/, */, $line);
+        my @t;
+        foreach (@pointers) {
+            push @t, $self->translate($_, $self->{ref}, $command, "wrap" => 0);
+        }
+        $translated .= " ".join(", ", @t);
+    }
+
+    print "($translated,@$env)\n"
+        if ($debug{'commands'});
+    return ($translated,@$env);
+};
+
+sub environment_command {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+    print "environment_command($command,$variant,@$args,@$env,$no_wrap)="
+        if ($debug{'commands'});
+    my ($t,@e)=("",());
+
+    ($t, @e) = generic_command($self,$command,$variant,$args,$env,$no_wrap);
+    @e = (@$env, $command);
+
+    print "($t,@e)\n"
+        if ($debug{'commands'});
+    return ($t,@e);
+}
+
+sub environment_line_command {
+    my $self = shift;
+    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+    my $no_wrap = shift;
+    print "environment_command_line($command,$variant,@$args,@$env,$no_wrap)="
+        if ($debug{'commands'});
+    my ($t,@e)=("",());
+
+    ($t, @e) = line_command($self,$command,$variant,$args,$env,$no_wrap);
+    @e = (@$env, $command);
+
+    print "($t,@e)\n"
+        if ($debug{'commands'});
+    return ($t,@e);
+}
+
+## push the environment in the environment stack, and do not translate
+## the command
+#sub push_environment {
+#    my $self = shift;
+#    my ($command,$variant,$args,$env) = (shift,shift,shift,shift);
+#    print "push_environment($command,$variant,@$args,@$env)="
+#        if ($debug{'environments'});
+#
+#    my ($t,@e) = generic_command($self,$command,$variant,$args,$env);
+#
+#    print "($t,@e)\n"
+#        if ($debug{'environments'});
+#    return ($t,@e);
+#}
+#
+foreach (qw(detailmenu menu titlepage group copying
+            documentdescription cartouche
+            direntry
+            ifdocbook ifhtml ifinfo ifplaintext iftex ifxml
+            ifnotdocbook ifnothtml ifnotinfo ifnotplaintext ifnottex ifnotxml)) {
+    $commands{$_} = \&environment_line_command;
+    $translate_line_command{$_} = 0;
+    $break_line{$_} = 1;
+}
+foreach (qw(enumerate multitable ifclear ifset)) {
+    $commands{$_} = \&environment_line_command;
+    $break_line{$_} = 1;
+}
+foreach (qw(quotation)) {
+    $commands{$_} = \&environment_line_command;
+    $translate_line_command{$_} = 1;
+    $break_line{$_} = 1;
+}
+
+$env_separators{'format'} = "(?:(?:^|\n)\\\*|END-INFO-DIR-ENTRY|START-INFO-DIR-ENTRY)";
+$env_separators{'multitable'} = "(?:\@item|\@tab)";
+
+my $end_command=$commands{'end'};
+register_generic_command("*end,  ");
+$commands{'end'} = $end_command;
+$break_line{'end'} = 1;
+
+register_generic_command("*macro,  ");
+$commands{'macro'} = \&environment_command;
+$break_line{'macro'} = 1;
+register_generic_command("*itemize,  ");
+$commands{'itemize'} = \&environment_command;
+$break_line{'itemize'} = 1;
+register_generic_command("*table,  ");
+$commands{'table'} = \&environment_command;
+$break_line{'table'} = 1;
+
+# TODO: is_closed, use a regexp: \ does not escape the closing brace.
+# TBC on LaTeX.
+# In Texinfo, it appears with the "code" command. Maybe this command should
+# be used as verbatim. (Expressions.texi)
+
+# TODO: @include @ignore
+
+# TBC: node Indices
+
+1;

Added: po4a/lib/Locale/Po4a/Text.pm
===================================================================
--- po4a/lib/Locale/Po4a/Text.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Text.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,236 @@
+#!/usr/bin/perl -w
+
+# Po4a::Text.pm
+# 
+# extract and translate translatable strings from a text documents
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Text - Convert text documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Text is a module to help the translation of text documents into
+other [human] languages.
+
+Paragraphs are splitted on empty lines (or lines containing only spaces or
+tabulations).
+
+If a paragraph contains a line starting by a space (or tabulation), this
+paragraph won't be rewrapped.
+
+=cut
+
+package Locale::Po4a::Text;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+These are this module's particular options:
+
+=over
+
+=item B<nobullet>
+
+Deactivate detection of bullets.
+
+By default, when a bullet is detected, the bullet paragraph is not considered
+as a verbatim paragraph (with the no-wrap flag in the PO file), but the module
+rewrap this paragraph in the generated PO file and in the translation.
+
+=cut
+
+my $bullets = 1;
+
+=item B<debianchangelog>
+
+Handle the header and footer of
+released versions, which only contain non translatable informations.
+
+=cut
+
+my $debianchangelog = 0;
+
+sub initialize {
+    my $self = shift;
+    my %options = @_;
+
+    $self->{options}{'nobullets'}='';
+
+    if (defined $options{'nobullets'}) {
+        $bullets = 0;
+    }
+
+    if (defined $options{'debianchangelog'}) {
+        $debianchangelog=1;
+    }
+}
+
+sub parse {
+    my $self = shift;
+    my ($line,$ref);
+    my $paragraph="";
+    my $wrapped_mode = 1;
+    my $expect_header = 1;
+    ($line,$ref)=$self->shiftline();
+    while (defined($line)) {
+        chomp($line);
+        $self->{ref}="$ref";
+        if ($debianchangelog and
+            $expect_header and
+            $line =~ /^(\w[-+0-9a-z.]*)\ \(([^\(\) \t]+)\) # src, version
+                       \s+([-+0-9a-z.]+);                 # distribution
+                       \s*urgency\s*\=\s*(.*\S)\s*$/ix) { #
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            $self->pushline("$line\n");
+            $expect_header=0;
+        } elsif ($debianchangelog and
+                 $line =~ m/^ \-\- (.*) <(.*)>  ((\w+\,\s*)?\d{1,2}\s+\w+\s+\d{4}\s+\d{1,2}:\d\d:\d\d\s+[-+]\d{4}(\s+\([^\\\(\)]\))?)$/) {
+            # Found trailer
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            $self->pushline("$line\n");
+            $expect_header=1;
+        } elsif ($line =~ /^\s*$/) {
+            # Break paragraphs on lines containing only spaces
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $self->pushline("\n") unless (   $wrapped_mode == 0
+                                          or $paragraph eq "");
+            $paragraph="";
+            $wrapped_mode = 1;
+            $self->pushline($line."\n");
+        } elsif (   $line =~ /^=*$/
+                 or $line =~ /^_*$/
+                 or $line =~ /^-*$/) {
+            $wrapped_mode = 0;
+            $paragraph .= $line."\n";
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            $wrapped_mode = 1;
+        } else {
+            if ($line =~ /^\s/) {
+                # A line starting by a space indicates a non-wrap
+                # paragraph
+                $wrapped_mode = 0;
+            }
+            $paragraph .= $line."\n";
+        }
+        # paragraphs starting by a bullet, or numbered
+        # or paragraphs with a line containing many consecutive spaces
+        # (more than 3)
+        # are considered as verbatim paragraphs
+        $wrapped_mode = 0 if (   $paragraph =~ m/^(\*|[0-9]+[.)] )/s
+                              or $paragraph =~ m/[ \t][ \t][ \t]/s);
+        ($line,$ref)=$self->shiftline();
+    }
+    if (length $paragraph) {
+        do_paragraph($self,$paragraph,$wrapped_mode);
+    }
+}
+
+sub do_paragraph {
+    my ($self, $paragraph, $wrap) = (shift, shift, shift);
+    return if ($paragraph eq "");
+
+    if ($bullets) {
+        # Detect bullets
+        # |        * blah blah
+        # |<spaces>  blah
+        # |          ^-- aligned
+        # <empty line>
+        #
+        # Other bullets supported:
+        # - blah         o blah         + blah
+        # 1. blah       1) blah       (1) blah
+TEST_BULLET:
+        if ($paragraph =~ m/^(\s*)((?:[-*o+]|([0-9]+[.\)])|\([0-9]+\))\s+)([^\n]*\n)(.*)$/s) {
+            my $para = $5;
+            my $bullet = $2;
+            my $indent1 = $1;
+            my $indent2 = "$1".(' ' x length $bullet);
+            my $text = $4;
+            while ($para !~ m/$indent2(?:[-*o+]|([0-9]+[.\)])|\([0-9]+\))\s+/
+                   and $para =~ s/^$indent2(\S[^\n]*\n)//s) {
+                $text .= $1;
+            }
+            # TODO: detect if a line starts with the same bullet
+            if ($text !~ m/\S[ \t][ \t][ \t]+\S/s) {
+                my $bullet_regex = quotemeta($indent1.$bullet);
+                $bullet_regex =~ s/[0-9]+/\\d\+/;
+                if ($para eq '' or $para =~ m/^$bullet_regex\S/s) {
+                    my $trans = $self->translate($text,
+                                                 $self->{ref},
+                                                 "Bullet: '$indent1$bullet'",
+                                                 "wrap" => 1,
+                                                 "wrapcol" => - (length $indent2));
+                    $trans =~ s/^/$indent1$bullet/s;
+                    $trans =~ s/\n(.)/\n$indent2$1/sg;
+                    $self->pushline( $trans."\n" );
+                    if ($para eq '') {
+                        return;
+                    } else {
+                        # Another bullet
+                        $paragraph = $para;
+                        goto TEST_BULLET;
+                    }
+                }
+            }
+        }
+    }
+    # TODO: detect indented paragraphs
+
+    $self->pushline( $self->translate($paragraph,
+                                      $self->{ref},
+                                      "Plain text",
+                                      "wrap" => $wrap) );
+}
+
+1;
+
+=head1 STATUS OF THIS MODULE
+
+Tested successfully on simple text files and NEWS.Debian files.
+
+=head1 AUTHORS
+
+ Nicolas Fran輟is <nicolas.francois@xxxxxxxxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+ Copyright 2005,2007 by Nicolas FRANヌOIS <nicolas.francois@xxxxxxxxxxxxxxx>.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).

Added: po4a/lib/Locale/Po4a/TransTractor.pm
===================================================================
--- po4a/lib/Locale/Po4a/TransTractor.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/TransTractor.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1091 @@
+#!/usr/bin/perl -w
+
+require Exporter;
+
+package Locale::Po4a::TransTractor;
+use DynaLoader;
+
+use 5.006;
+use strict;
+use warnings;
+
+use subs qw(makespace);
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION="0.32";
+@ISA = qw(DynaLoader);
+@EXPORT = qw(new process translate 
+             read write readpo writepo
+             getpoout setpoout);
+
+# Try to use a C extension if present.
+eval("bootstrap Locale::Po4a::TransTractor $VERSION");
+
+use Carp qw(croak);
+use Locale::Po4a::Po;
+use Locale::Po4a::Common;
+
+use File::Path; # mkdir before write
+
+use Encode;
+use Encode::Guess;
+
+=head1 NAME
+
+Po4a TransTractor - Generic trans(lator ex)tractor.
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+This class is the ancestor of every po4a parsers used to parse a document to
+search translatable strings, extract them to a po file and replace them by
+their translation in the output document. 
+
+More formally, it takes the following arguments as input:
+
+=over 2
+
+=item -
+
+a document to translate ;
+
+=item -
+
+a po file containing the translations to use.
+
+=back
+
+As output, it produces:
+
+=over 2
+
+=item -
+
+another po file, resulting of the extraction of translatable strings from
+the input document ;
+
+=item -
+
+a translated document, with the same structure than the one in input, but
+with all translatable strings replaced with the translations found in the
+po file provided in input.
+
+=back
+
+Here is a graphical representation of this:
+
+   Input document --\                             /---> Output document
+                     \                           /       (translated)
+                      +-> parse() function -----+
+                     /                           \
+   Input po --------/                             \---> Output po
+                                                         (extracted)
+
+=head1 FUNCTIONS YOUR PARSER SHOULD OVERRIDE
+
+=over 4
+
+=item parse()
+
+This is where all the work takes place: the parsing of input documents, the
+generation of output, and the extraction of the translatable strings. This
+is pretty simple using the provided functions presented in the section
+"INTERNAL FUNCTIONS" below. See also the synopsis, which present an
+example.
+
+This function is called by the process() function bellow, but if you choose
+to use the new() function, and to add content manually to your document,
+you will have to call this function yourself.
+
+=item docheader()
+
+This function returns the header we should add to the produced document,
+quoted properly to be a comment in the target language.  See the section
+"Educating developers about translations", from L<po4a(7)|po4a.7>, for what
+it is good for.
+
+=back
+
+=cut
+
+sub docheader {}
+
+sub parse {}
+
+=head1 SYNOPSIS
+
+The following example parses a list of paragraphs beginning with "<p>". For the sake
+of simplicity, we assume that the document is well formatted, i.e. that '<p>'
+tags are the only tags present, and that this tag is at the very beginning
+of each paragraph.
+
+ sub parse {
+   my $self = shift;
+
+   PARAGRAPH: while (1) {
+       my ($paragraph,$pararef)=("","");
+       my $first=1;
+       my ($line,$lref)=$self->shiftline();
+       while (defined($line)) {
+	   if ($line =~ m/<p>/ && !$first--; ) {
+	       # Not the first time we see <p>. 
+	       # Reput the current line in input,
+	       #  and put the built paragraph to output
+	       $self->unshiftline($line,$lref);
+	      
+	       # Now that the document is formed, translate it:
+	       #   - Remove the leading tag
+	       $paragraph =~ s/^<p>//s;
+
+	       #   - push to output the leading tag (untranslated) and the
+	       #     rest of the paragraph (translated)
+	       $self->pushline(  "<p>"
+                               . $document->translate($paragraph,$pararef)
+                               );
+
+ 	       next PARAGRAPH;
+	   } else {
+	       # Append to the paragraph
+	       $paragraph .= $line;
+	       $pararef = $lref unless(length($pararef));
+	   }
+
+           # Reinit the loop
+           ($line,$lref)=$self->shiftline();
+       }
+       # Did not get a defined line? End of input file.
+       return;
+   }
+ } 
+
+Once you've implemented the parse function, you can use your document
+class, using the public interface presented in the next section.
+
+=head1 PUBLIC INTERFACE for scripts using your parser
+
+=head2 Constructor
+
+=over 4
+
+=item process(%)
+
+This function can do all you need to do with a po4a document in one
+invocation. Its arguments must be packed as a hash. ACTIONS:
+
+=over 3
+
+=item a.
+
+Reads all the po files specified in po_in_name
+
+=item b.
+
+Reads all original documents specified in file_in_name
+
+=item c.
+
+Parses the document
+
+=item d.
+
+Reads and applies all the addenda specified
+
+=item e.
+
+Writes the translated document to file_out_name (if given)
+
+=item f.
+
+Writes the extracted po file to po_out_name (if given)
+
+=back
+
+ARGUMENTS, beside the ones accepted by new() (with expected type):
+
+=over 4
+
+=item file_in_name (@)
+
+List of filenames where we should read the input document.
+
+=item file_in_charset ($)
+
+Charset used in the input document (if it isn't specified, it will try
+to detect it from the input document).
+
+=item file_out_name ($)
+
+Filename where we should write the output document.
+
+=item file_out_charset ($)
+
+Charset used in the output document (if it isn't specified, it will use
+the po file charset).
+
+=item po_in_name (@)
+
+List of filenames where we should read the input po files from, containing
+the translation which will be used to translate the document.
+
+=item po_out_name ($)
+
+Filename where we should write the output po file, containing the strings
+extracted from the input document.
+
+=item addendum (@)
+
+List of filenames where we should read the addenda from.
+
+=item addendum_charset ($)
+
+Charset for the addenda.
+
+=back
+
+=item new(%)
+
+Create a new Po4a document. Accepted options (but be in a hash):
+
+=over 4
+
+=item verbose ($)
+
+Sets the verbosity.
+
+=item debug ($)
+
+Sets the debugging.
+
+=back
+
+=cut
+
+sub process {
+    ## Determine if we were called via an object-ref or a classname
+    my $self = shift;
+
+    ## Any remaining arguments are treated as initial values for the
+    ## hash that is used to represent this object.
+    my %params = @_;
+    
+    # Build the args for new()
+    my %newparams = ();
+    foreach (keys %params) {
+	next if ($_ eq 'po_in_name' ||
+		 $_ eq 'po_out_name' ||
+		 $_ eq 'file_in_name' ||
+		 $_ eq 'file_in_charset' ||
+		 $_ eq 'file_out_name' ||
+		 $_ eq 'file_out_charset' ||
+		 $_ eq 'addendum' ||
+		 $_ eq 'addendum_charset');
+	$newparams{$_}=$params{$_};
+    }
+
+    $self->detected_charset($params{'file_in_charset'});
+    $self->{TT}{'file_out_charset'}=$params{'file_out_charset'};
+    if (defined($self->{TT}{'file_out_charset'}) and
+	length($self->{TT}{'file_out_charset'})) {
+	$self->{TT}{'file_out_encoder'} = find_encoding($self->{TT}{'file_out_charset'});
+    }
+    $self->{TT}{'addendum_charset'}=$params{'addendum_charset'};
+
+    foreach my $file (@{$params{'po_in_name'}}) {
+	print STDERR "readpo($file)... " if $self->debug();
+	$self->readpo($file);
+	print STDERR "done.\n" if $self->debug()
+    }
+    foreach my $file (@{$params{'file_in_name'}}) {
+	print STDERR "read($file)..." if $self->debug();
+	$self->read($file);
+	print STDERR "done.\n"  if $self->debug();
+    }
+    print STDERR "parse..." if $self->debug();
+    $self->parse();
+    print STDERR "done.\n" if $self->debug();
+    foreach my $file (@{$params{'addendum'}}) {
+	print STDERR "addendum($file)..." if $self->debug();
+	$self->addendum($file) || die "An addendum failed\n";
+	print STDERR "done.\n" if $self->debug();
+    }
+    if (defined $params{'file_out_name'}) {
+	print STDERR "write(".$params{'file_out_name'}.")... " 
+	    if $self->debug();
+	$self->write($params{'file_out_name'});
+	print STDERR "done.\n" if $self->debug();
+    }
+    if (defined $params{'po_out_name'}) {
+	print STDERR "writepo(".$params{'po_out_name'}.")... "
+	     if $self->debug();
+	$self->writepo($params{'po_out_name'});
+	print STDERR "done.\n" if $self->debug();
+    }
+    return $self;
+}
+
+sub new {
+    ## Determine if we were called via an object-ref or a classname
+    my $this = shift;
+    my $class = ref($this) || $this;
+    my $self = { };
+    my %options=@_;
+    ## Bless ourselves into the desired class and perform any initialization
+    bless $self, $class;
+    
+    ## initialize the plugin
+    # prevent the plugin from croaking on the options intended for Po.pm
+    $self->{options}{'porefs'} = '';
+    # let the plugin parse the options and such
+    $self->initialize(%options);
+
+    ## Create our private data
+    my %po_options;
+    $po_options{'porefs'} = $self->{options}{'porefs'};
+    
+    # private data
+    $self->{TT}=(); 
+    $self->{TT}{po_in}=Locale::Po4a::Po->new();
+    $self->{TT}{po_out}=Locale::Po4a::Po->new(\%po_options);
+    # Warning, this is an array of array:
+    #  The document is splited on lines, and for each
+    #  [0] is the line content, [1] is the reference [2] the type
+    $self->{TT}{doc_in}=();
+    $self->{TT}{doc_out}=();
+    if (defined $options{'verbose'}) {
+	$self->{TT}{verbose}  =  $options{'verbose'};
+    }
+    if (defined $options{'debug'}) {
+	$self->{TT}{debug}  =  $options{'debug'};
+    }
+    # Input document is in ascii until we prove the opposite (in read())
+    $self->{TT}{ascii_input}=1;
+    # We try not to use utf unless it's forced from the outside (in case the
+    # document isn't in ascii)
+    $self->{TT}{utf_mode}=0;
+
+    
+    return $self;
+}
+
+=back
+
+=head2 Manipulating document files
+
+=over 4
+
+=item read($)
+
+Add another input document at the end of the existing one. The argument is
+the filename to read. 
+
+Please note that it does not parse anything. You should use the parse()
+function when you're done with packing input files into the document. 
+
+=cut
+
+#'
+sub read() {
+    my $self=shift;
+    my $filename=shift
+	or croak wrap_msg(dgettext("po4a", "Can't read from file without having a filename"));
+    my $linenum=0;
+
+    open INPUT,"<$filename" 
+	or croak wrap_msg(dgettext("po4a", "Can't read from %s: %s"), $filename, $!);
+    while (defined (my $textline = <INPUT>)) {
+	$linenum++;
+	my $ref="$filename:$linenum";
+	my @entry=($textline,$ref);
+	push @{$self->{TT}{doc_in}}, @entry;
+
+	if (!defined($self->{TT}{'file_in_charset'})) {
+	    # Detect if this file has non-ascii characters
+	    if($self->{TT}{ascii_input}) {
+		my $decoder = guess_encoding($textline);
+		if (!ref($decoder) or $decoder !~ /Encode::XS=/) {
+		    # We have detected a non-ascii line
+		    $self->{TT}{ascii_input} = 0;
+		    # Save the reference for future error message
+		    $self->{TT}{non_ascii_ref} ||= $ref;
+		}
+	    }
+	}
+    }
+    close INPUT 
+	or croak wrap_msg(dgettext("po4a", "Can't close %s after reading: %s"), $filename, $!);
+
+}
+
+=item write($)
+
+Write the translated document to the given filename.
+
+=cut
+
+sub write {
+    my $self=shift;
+    my $filename=shift
+	or croak wrap_msg(dgettext("po4a", "Can't write to a file without filename"));
+
+    my $fh;
+    if ($filename eq '-') {
+	$fh=\*STDOUT;
+    } else {
+	# make sure the directory in which we should write the localized file exists
+	my $dir = $filename;
+	if ($dir =~ m|/|) {
+	    $dir =~ s|/[^/]*$||;
+	
+	    File::Path::mkpath($dir, 0, 0755) # Croaks on error
+	      if (length ($dir) && ! -e $dir);
+	}
+	open $fh,">$filename"
+	    or croak wrap_msg(dgettext("po4a", "Can't write to %s: %s"), $filename, $!);
+    }
+    
+    map { print $fh $_ } $self->docheader();
+    map { print $fh $_ } @{$self->{TT}{doc_out}};
+
+    if ($filename ne '-') {
+	close $fh or croak wrap_msg(dgettext("po4a", "Can't close %s after writing: %s"), $filename, $!);
+    }
+
+}
+
+=back
+
+=head2 Manipulating po files
+
+=over 4 
+
+=item readpo($)
+
+Add the content of a file (which name is passed in argument) to the
+existing input po. The old content is not discarded.
+
+=item writepo($)
+
+Write the extracted po file to the given filename.
+
+=item stats()
+
+Returns some statistics about the translation done so far. Please note that
+it's not the same statistics than the one printed by msgfmt
+--statistic. Here, it's stats about recent usage of the po file, while
+msgfmt reports the status of the file. It is a wrapper to the
+Locale::Po4a::Po::stats_get function applied to the input po file. Example
+of use:
+
+    [normal use of the po4a document...]
+
+    ($percent,$hit,$queries) = $document->stats();
+    print "We found translations for $percent\%  ($hit from $queries) of strings.\n";
+
+=back
+
+=cut
+
+sub getpoout {
+    return $_[0]->{TT}{po_out};
+}
+sub setpoout {
+    $_[0]->{TT}{po_out} = $_[1];
+}
+sub readpo  { 
+    $_[0]->{TT}{po_in}->read($_[1]);        
+}
+sub writepo { 
+    $_[0]->{TT}{po_out}->write( $_[1] );    
+}
+sub stats   { 
+    return $_[0]->{TT}{po_in}->stats_get(); 
+}
+
+=cut
+
+=head2 Manipulating addenda
+
+=over 4
+
+=item addendum($)
+
+Please refer to L<po4a(7)|po4a.7> for more information on what addenda are,
+and how translators should write them. To apply an addendum to the translated
+document, simply pass its filename to this function and you are done ;)
+
+This function returns a non-null integer on error.
+
+=cut
+
+# Internal function to read the header.
+sub addendum_parse {
+    my ($filename,$header)=shift;
+
+    my ($errcode,$mode,$position,$boundary,$bmode,$content)=
+	(1,"","","","","");
+
+    unless (open (INS, "<$filename")) {
+	warn wrap_msg(dgettext("po4a", "Can't read from %s: %s"), $filename, $!);
+	goto END_PARSE_ADDFILE;
+    } 
+
+    unless (defined ($header=<INS>) && $header)  {
+	warn wrap_msg(dgettext("po4a", "Can't read Po4a header from %s."), $filename);
+	goto END_PARSE_ADDFILE;
+    }
+
+    unless ($header =~ s/PO4A-HEADER://i) {
+	warn wrap_msg(dgettext("po4a", "First line of %s does not look like a Po4a header."), $filename);
+	goto END_PARSE_ADDFILE;
+    }
+    foreach my $part (split(/;/,$header)) {
+	unless ($part =~ m/^\s*([^=]*)=(.*)$/) {
+	    warn wrap_msg(dgettext("po4a", "Syntax error in Po4a header of %s, near \"%s\""), $filename, $part);
+	    goto END_PARSE_ADDFILE;
+	}
+	my ($key,$value)=($1,$2);
+	$key=lc($key);
+  	     if ($key eq 'mode')     {  $mode=lc($value);
+	} elsif ($key eq 'position') {  $position=$value;
+	} elsif ($key eq 'endboundary') {  
+	    $boundary=$value;
+	    $bmode='after';
+	} elsif ($key eq 'beginboundary') {  
+	    $boundary=$value;
+	    $bmode='before';
+	} else { 
+	    warn wrap_msg(dgettext("po4a", "Invalid argument in the Po4a header of %s: %s"), $filename, $key);
+	    goto END_PARSE_ADDFILE;
+	}
+    }
+
+    unless (length($mode)) {
+	warn wrap_msg(dgettext("po4a", "The Po4a header of %s does not define the mode."), $filename);
+	goto END_PARSE_ADDFILE;
+    }
+    unless ($mode eq "before" || $mode eq "after") {
+	warn wrap_msg(dgettext("po4a", "Mode invalid in the Po4a header of %s: should be 'before' or 'after' not %s."), $filename, $mode);
+	goto END_PARSE_ADDFILE;
+    }
+
+    unless (length($position)) {
+	warn wrap_msg(dgettext("po4a", "The Po4a header of %s does not define the position."), $filename);
+	goto END_PARSE_ADDFILE;
+    }
+    unless ($mode eq "before" || length($boundary)) {
+    	warn wrap_msg(dgettext("po4a", "No ending boundary given in the Po4a header, but mode=after."));
+	goto END_PARSE_ADDFILE;
+    }
+
+    while (defined(my $line = <INS>)) {
+	$content .= $line;
+    }
+    close INS;
+
+    $errcode=0;
+  END_PARSE_ADDFILE: 
+      return ($errcode,$mode,$position,$boundary,$bmode,$content);
+}
+
+sub mychomp {
+    my ($str) = shift;
+    chomp($str);
+    return $str;
+}
+
+sub addendum {
+    my ($self,$filename) = @_;
+
+    print STDERR "Apply addendum $filename..." if $self->debug();
+    unless ($filename) {
+	warn wrap_msg(dgettext("po4a",
+	    "Can't apply addendum when not given the filename"));
+	return 0;
+    }
+    die wrap_msg(dgettext("po4a", "Addendum %s does not exist."), $filename)
+      unless -e $filename;
+  
+    my ($errcode,$mode,$position,$boundary,$bmode,$content)=
+	addendum_parse($filename);
+    return 0 if ($errcode);
+
+    print STDERR "mode=$mode;pos=$position;bound=$boundary;bmode=$bmode;ctn=$content\n"
+      if $self->debug();
+    
+    # We only recode the addendum if an origin charset is specified, else we
+    # suppose it's already in the output document's charset
+    if (defined($self->{TT}{'addendum_charset'}) &&
+        length($self->{TT}{'addendum_charset'})) {
+	Encode::from_to($content,$self->{TT}{'addendum_charset'},
+	    $self->get_out_charset);
+    }
+
+    my $found = scalar grep { /$position/ } @{$self->{TT}{doc_out}};
+    if ($found == 0) {
+	warn wrap_msg(dgettext("po4a",
+	    "No candidate position for the addendum %s."), $filename);
+	return 0;
+    }
+    if ($found > 1) {
+	warn wrap_msg(dgettext("po4a",
+	    "More than one candidate position found for the addendum %s."), $filename);
+	return 0;
+    }
+
+    if ($mode eq "before") {
+	if ($self->verbose() > 1 || $self->debug() ) {
+	    map { print STDERR wrap_msg(dgettext("po4a", "Addendum '%s' applied before this line: %s"), $filename, $_) if (/$position/);
+ 	        } @{$self->{TT}{doc_out}};
+	}
+	@{$self->{TT}{doc_out}} = map { /$position/ ? ($content,$_) : $_ 
+                                        }  @{$self->{TT}{doc_out}};
+    } else {
+	my @newres=();
+
+	do {
+	    # make sure it doesnt whine on empty document
+	    my $line = scalar @{$self->{TT}{doc_out}} ? shift @{$self->{TT}{doc_out}} : "";
+	    push @newres,$line;
+	    my $outline=mychomp($line);
+	    $outline =~ s/^[ \t]*//;
+	      
+	    if ($line =~ m/$position/) {
+		while ($line=shift @{$self->{TT}{doc_out}}) {
+		    last if ($line=~/$boundary/);
+		    push @newres,$line;
+		}
+		if (defined $line) {
+		    if ($bmode eq 'before') {
+			print wrap_msg(dgettext("po4a",
+			    "Addendum '%s' applied before this line: %s"),
+			    $filename, $outline)
+			  if ($self->verbose() > 1 || $self->debug());
+			push @newres,$content;
+			push @newres,$line;
+		    } else {
+			print wrap_msg(dgettext("po4a",
+			    "Addendum '%s' applied after the line: %s."),
+			    $filename, $outline)
+			  if ($self->verbose() > 1 || $self->debug());
+			push @newres,$line;
+			push @newres,$content;
+		    }
+		} else {
+		    print wrap_msg(dgettext("po4a", "Addendum '%s' applied at the end of the file."), $filename)
+		      if ($self->verbose() > 1 || $self->debug());
+		    push @newres,$content;
+		}
+	    }
+	} while (scalar @{$self->{TT}{doc_out}});
+	@{$self->{TT}{doc_out}} = @newres;
+    }
+    print STDERR "done.\n" if $self->debug();
+    return 1;
+}
+
+=back
+
+=head1 INTERNAL FUNCTIONS used to write derivated parsers
+
+=head2 Getting input, providing output
+
+Four functions are provided to get input and return output. They are very
+similar to shift/unshift and push/pop. The first pair is about input, while
+the second is about output. Mnemonic: in input, you are interested in the
+first line, what shift gives, and in output you want to add your result at
+the end, like push does.
+
+=over 4
+
+=item shiftline()
+
+This function returns the next line of the doc_in to be parsed and its
+reference (packed as an array).
+
+=item unshiftline($$)
+
+Unshifts a line of the input document and its reference. 
+
+=item pushline($)
+
+Push a new line to the doc_out.
+
+=item popline()
+
+Pop the last pushed line from the doc_out.
+
+=back
+
+=cut
+
+sub shiftline   {  
+    my ($line,$ref)=(shift @{$_[0]->{TT}{doc_in}},
+		     shift @{$_[0]->{TT}{doc_in}}); 
+    return ($line,$ref);
+}
+sub unshiftline {  unshift @{$_[0]->{TT}{doc_in}},($_[1],$_[2]);  }
+
+sub pushline    {  push @{$_[0]->{TT}{doc_out}}, $_[1] if defined $_[1]; }
+sub popline     {  return pop @{$_[0]->{TT}{doc_out}};            }
+
+=head2 Marking strings as translatable
+
+One function is provided to handle the text which should be translated. 
+
+=over 4
+
+=item translate($$$)
+
+Mandatory arguments:
+
+=over 2
+
+=item -
+
+A string to translate
+
+=item -
+
+The reference of this string (ie, position in inputfile)
+
+=item -
+
+The type of this string (ie, the textual description of its structural role
+; used in Locale::Po4a::Po::gettextization() ; see also L<po4a(7)|po4a.7>,
+section I<Gettextization: how does it work?>)
+
+=back
+
+This function can also take some extra arguments. They must be organized as
+a hash. For example:
+
+  $self->translate("string","ref","type",
+		   'wrap' => 1);
+
+=over
+
+=item wrap
+
+boolean indicating whether we can consider that whitespaces in string are
+not important. If yes, the function canonizes the string before looking for
+a translation or extracting it, and wraps the translation.
+
+=item wrapcol
+
+The column at which we should wrap (default: 76).
+
+=item comment
+
+An extra comment to add to the entry.
+
+=back
+
+Actions:
+
+=over 2
+
+=item -
+
+Pushes the string, reference and type to po_out.
+
+=item -
+
+Returns the translation of the string (as found in po_in) so that the
+parser can build the doc_out.
+
+=item -
+
+Handles the charsets to recode the strings before sending them to
+po_out and before returning the translations.
+
+=back
+
+=back
+
+=cut
+
+sub translate {
+    my $self=shift;
+    my ($string,$ref,$type)=(shift,shift,shift);
+    my (%options)=@_;
+
+    # my $validoption="wrap wrapcol";
+    # my %validoption;
+
+    return "" unless defined($string) && length($string);
+
+    # map { $validoption{$_}=1 } (split(/ /,$validoption));
+    # foreach (keys %options) {
+    #	Carp::confess "internal error: translate() called with unknown arg $_. Valid options: $validoption"
+    #	    unless $validoption{$_};
+    # }
+
+    my $in_charset;
+    if ($self->{TT}{ascii_input}) {
+	$in_charset = "ascii";
+    } else {
+	if (defined($self->{TT}{'file_in_charset'}) and
+	    length($self->{TT}{'file_in_charset'}) and
+	    $self->{TT}{'file_in_charset'} !~ m/ascii/i) {
+	    $in_charset=$self->{TT}{'file_in_charset'};
+	} else {
+	    # FYI, the document charset have to be determined *before* we see the first
+	    # string to recode.
+	    die wrap_mod("po4a", dgettext("po4a", "Couldn't determine the input document's charset. Please specify it on the command line. (non-ascii char at %s)"), $self->{TT}{non_ascii_ref})
+	}
+    }
+
+    if ($self->{TT}{po_in}->get_charset ne "CHARSET") {
+	$string = encode_from_to($string,
+	                         $self->{TT}{'file_in_encoder'},
+	                         $self->{TT}{po_in}{encoder});
+    }
+
+    if (defined $options{'wrapcol'} && $options{'wrapcol'} < 0) {
+# FIXME: should be the parameter given with --width
+        $options{'wrapcol'} = 76 + $options{'wrapcol'};
+    }
+    my $transstring = $self->{TT}{po_in}->gettext($string,
+					'wrap'      => $options{'wrap'}||0,
+					'wrapcol'   => $options{'wrapcol'});
+
+    if ($self->{TT}{po_in}->get_charset ne "CHARSET") {
+	my $out_encoder = $self->{TT}{'file_out_encoder'};
+	unless (defined $out_encoder) {
+	    $out_encoder = find_encoding($self->get_out_charset)
+	}
+	$transstring = encode_from_to($transstring,
+	                              $self->{TT}{po_in}{encoder},
+	                              $out_encoder);
+    }
+
+    # If the input document isn't completely in ascii, we should see what to
+    # do with the current string
+    unless ($self->{TT}{ascii_input}) {
+        my $out_charset = $self->{TT}{po_out}->get_charset;
+	# We set the output po charset 
+        if ($out_charset eq "CHARSET") {
+	    if ($self->{TT}{utf_mode}) {
+		$out_charset="utf-8";
+	    } else {
+		$out_charset=$in_charset;
+	    }
+	    $self->{TT}{po_out}->set_charset($out_charset);
+	}
+	if ( $in_charset !~ /^$out_charset$/i ) {
+	    Encode::from_to($string,$in_charset,$out_charset);
+	    if (defined($options{'comment'}) and length($options{'comment'})) {
+		Encode::from_to($options{'comment'},$in_charset,$out_charset);
+	    }
+	}
+    }
+
+    # the comments provided by the modules are automatic comments from the PO point of view
+    $self->{TT}{po_out}->push('msgid'     => $string,
+			      'reference' => $ref,
+			      'type'      => $type,
+	                      'automatic' => $options{'comment'},
+			      'wrap'      => $options{'wrap'}||0,
+			      'wrapcol'   => $options{'wrapcol'});
+
+#    if ($self->{TT}{po_in}->get_charset ne "CHARSET") {
+#	Encode::from_to($transstring,$self->{TT}{po_in}->get_charset,
+#	    $self->get_out_charset);
+#    }
+    return $transstring;
+}
+
+=head2 Misc functions
+
+=over 4
+
+=item verbose()
+
+Returns if the verbose option was passed during the creation of the
+TransTractor.
+
+=cut
+
+sub verbose {
+    if (defined $_[1]) {
+	$_[0]->{TT}{verbose} = $_[1];
+    } else {
+	return $_[0]->{TT}{verbose} || 0; # undef and 0 have the same meaning, but one generates warnings
+    }
+}
+
+=item debug()
+
+Returns if the debug option was passed during the creation of the
+TransTractor.
+
+=cut
+
+sub debug {
+    return $_[0]->{TT}{debug};
+}
+
+=item detected_charset($)
+
+This tells TransTractor that a new charset (the first argument) has been
+detected from the input document. It can usually be read from the document
+header. Only the first charset will remain, coming either from the
+process() arguments or detected from the document.
+
+=cut
+
+sub detected_charset {
+    my ($self,$charset)=(shift,shift);
+    unless (defined($self->{TT}{'file_in_charset'}) and
+            length($self->{TT}{'file_in_charset'}) ) {
+        $self->{TT}{'file_in_charset'}=$charset;
+        if (defined $charset) {
+            $self->{TT}{'file_in_encoder'}=find_encoding($charset);
+        }
+    }
+
+    if (defined $self->{TT}{'file_in_charset'} and
+        length $self->{TT}{'file_in_charset'} and
+        $self->{TT}{'file_in_charset'} !~ m/ascii/i) {
+	$self->{TT}{ascii_input}=0;
+    }
+}
+
+=item get_out_charset()
+
+This function will return the charset that should be used in the output
+document (usually useful to substitute the input document's detected charset
+where it has been found).
+
+It will use the output charset specified in the command line. If it wasn't
+specified, it will use the input po's charset, and if the input po has the
+default "CHARSET", it will return the input document's charset, so that no
+encoding is performed.
+
+=cut
+
+sub get_out_charset {
+    my $self=shift;
+    my $charset;
+
+    # Use the value specified at the command line
+    if (defined($self->{TT}{'file_out_charset'}) and
+	length($self->{TT}{'file_out_charset'})) {
+	$charset=$self->{TT}{'file_out_charset'};
+    } else {
+	if ($self->{TT}{utf_mode} && $self->{TT}{ascii_input}) {
+	    $charset="utf-8";
+	} else {
+	    $charset=$self->{TT}{po_in}->get_charset;
+	    $charset=$self->{TT}{'file_in_charset'}
+		if $charset eq "CHARSET" and
+		    defined($self->{TT}{'file_in_charset'}) and
+		    length($self->{TT}{'file_in_charset'});
+	    $charset="ascii"
+		if $charset eq "CHARSET";
+	}
+    }
+    return $charset;
+}
+
+=item recode_skipped_text($)
+
+This function returns the recoded text passed as argument, from the input
+document's charset to the output document's one. This isn't needed when
+translating a string (translate() recodes everything itself), but it is when
+you skip a string from the input document and you want the output document to
+be consistent with the global encoding.
+
+=cut
+
+sub recode_skipped_text {
+    my ($self,$text)=(shift,shift);
+    unless ($self->{TT}{'ascii_input'}) {
+	if(defined($self->{TT}{'file_in_charset'}) and
+	    length($self->{TT}{'file_in_charset'}) ) {
+	    $text = encode_from_to($text,
+	                           $self->{TT}{'file_in_encoder'},
+	                           find_encoding($self->get_out_charset));
+	} else {
+	    die wrap_mod("po4a", dgettext("po4a", "Couldn't determine the input document's charset. Please specify it on the command line. (non-ascii char at %s)"), $self->{TT}{non_ascii_ref})
+	}
+    }
+    return $text;
+}
+
+
+# encode_from_to($,$,$)
+#
+# Encode the given text from one encoding to another one.
+# It differs from Encode::from_to because it does not take the name of the
+# encoding in argument, but the encoders (as returned by the
+# Encode::find_encoding(<name>) method). Thus it permits to save a bunch
+# of call to find_encoding.
+#
+# If the "from" encoding is undefined, it is considered as UTF-8 (or
+# ascii).
+# If the "to" encoding is undefined, it is considered as UTF-8.
+#
+sub encode_from_to {
+    my ($text,$from,$to) = (shift,shift,shift);
+
+    if (not defined $from) {
+        # for ascii and UTF-8, no conversion needed to get an utf-8
+        # string.
+    } else {
+        $text = $from->decode($text, 0);
+    }
+
+    if (not defined $to) {
+        # Already in UTF-8, no conversion needed
+    } else {
+        $text = $to->encode($text, 0);
+    }
+
+    return $text;
+}
+
+=back
+
+=head1 FUTURE DIRECTIONS
+
+One shortcoming of the current TransTractor is that it can't handle
+translated document containing all languages, like debconf templates, or
+.desktop files.
+
+To address this problem, the only interface changes needed are:
+
+=over 2
+
+=item -
+
+take a hash as po_in_name (a list per language)
+
+=item -
+
+add an argument to translate to indicate the target language
+
+=item -
+
+make a pushline_all function, which would make pushline of its content for
+all language, using a map-like syntax:
+
+    $self->pushline_all({ "Description[".$langcode."]=".
+			  $self->translate($line,$ref,$langcode) 
+		        });
+
+=back
+
+Will see if it's enough ;)
+
+=head1 AUTHORS
+
+ Denis Barbier <barbier@xxxxxxxxxxx>
+ Martin Quinson (mquinson#debian.org)
+ Jordi Vilalta <jvprat@xxxxxxxxx>
+
+=cut
+
+1;

Added: po4a/lib/Locale/Po4a/Wml.pm
===================================================================
--- po4a/lib/Locale/Po4a/Wml.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Wml.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,158 @@
+#!/usr/bin/perl -w
+
+# Po4a::Wml.pm
+# 
+# extract and translate translatable strings from a wml (web markup language) documents
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Wml - Convert wml (web markup language) documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Wml is a module to help the translation of wml documents into
+other [human] languages. Do not mixup the WML we are speaking about here
+(web markup language) and the WAP crap used on cell phones.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+NONE.
+
+=head1 STATUS OF THIS MODULE
+
+Still to be implemented.
+
+=cut
+#
+#=head1 TODO
+#
+#Dans le po, faut corriger les references pour pointer sur le fichier de depart, pas le temporaire 
+#
+#(12:11:26) adn: et pour les # du debut ?
+#(12:11:57) adn: si y a moyen juste de sortir le pagetitle="foo" en <title>foo</title>, c'est encore mieux
+#(00:42:51) adn: #use wml::debian::mainpage title="Le systeme d'exploitation universel"
+
+package Locale::Po4a::Wml;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+use File::Temp;
+
+sub initialize {}
+
+sub read {
+    my ($self,$filename)=@_;
+    
+    push @{$self->{DOCWML}{infile}}, $filename;
+}
+    
+
+sub parse {
+    my $self = shift;
+
+    my $tmp_filename;
+    (undef,$tmp_filename)=File::Temp->tempfile("po4aXXXX",
+                                                DIR    => "/tmp",
+					        SUFFIX => ".xml",
+                                                OPEN   => 0,
+						UNLINK => 0)
+        or die wrap_msg(gettext("Can't create a temporary xml file: %s"), $!);
+    foreach my $filename (@{$self->{DOCWML}{infile}}) {
+#      print STDERR "TMP: $tmp_filename\n";
+      my $file;
+      open FILEIN,"$filename" or die "Cannot read $filename: $!\n";
+      {
+        $/ = undef; 
+        $file=<FILEIN>;
+      }
+      
+      # Mask perl cruft out of XML sight
+      while ($file =~ m|^(.*?)<perl>(.*?)</perl>(.*?)$|ms || $file =~ m|^(.*?)<:(.*?):>(.*)$|ms) {
+        my ($pre,$in,$post) = ($1,$2,$3);
+        $in =~ s/</PO4ALT/g;
+        $in =~ s/>/PO4AGT/g;
+        $file = "${pre}<!--PO4ABEGINPERL${in}PO4AENDPERL-->$post";
+      }
+
+      # Mask mp4h cruft         
+      while ($file =~ m|^#(.*)$|<!--PO4ASHARPBEGIN$1PO4ASHARPEND-->|m) {
+        my $line = $1;
+        print STDERR "PROTECT HEADER: $line\n";
+        if ($line =~ m/title="([^"]*)"/) { #) {#"){
+          warn "FIXME: We should translate the page title: $1\n";
+        }          
+      }
+                
+      # Flush the result to disk          
+      open OUTFILE,">$tmp_filename";
+      print OUTFILE $file;
+      close INFILE;
+      close OUTFILE or die "Cannot write $tmp_filename: $!\n";
+      
+      # Build the XML TransTractor which will do the job for us
+      my $xmlizer = Locale::Po4a::Chooser::new("xhtml");
+      $xmlizer->{TT}{po_in}=$self->{TT}{po_in};
+      $xmlizer->{TT}{po_out}=$self->{TT}{po_out};
+      
+      # Let it do the job
+      $xmlizer->read("$tmp_filename");
+      $xmlizer->parse();
+      my ($percent,$hit,$queries) = $xmlizer->stats();
+      print "We found translations for $percent\%  ($hit from $queries) of strings.\n";
+                        
+      # Get the output po file back
+      $self->{TT}{po_out}=$xmlizer->{TT}{po_out};
+      
+      # Get the document back (undoing our wml masking)
+      $file = join("",@{$xmlizer->{TT}{doc_out}});
+      $file =~ s/^<!--PO4ASHARPBEGIN(.*?)PO4ASHARPEND-->/#$1/mg;
+      $file =~ s/<!--PO4ABEGINPERL(.*?)PO4AENDPERL-->/<:$1:>/msg;
+      $file =~ s/PO4ALT/</msg;
+      $file =~ s/PO4AGT/>/msg;
+
+      map { push @{$self->{TT}{doc_out}},"$_\n" } split(/\n/,$file);
+    }
+    unlink "$tmp_filename";
+}
+
+1;
+
+=head1 AUTHORS
+
+This module will be implemented by Martin Quinson (mquinson#debian.org), amonst other (I hope).
+
+=head1 COPYRIGHT AND LICENSE
+
+ Copyright 2005 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).

Added: po4a/lib/Locale/Po4a/Xhtml.pm
===================================================================
--- po4a/lib/Locale/Po4a/Xhtml.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Xhtml.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,228 @@
+#!/usr/bin/perl
+
+# Po4a::Xhtml.pm 
+# 
+# extract and translate translatable strings from Xhtml documents.
+# 
+# This code extracts plain text from tags and attributes from strict Xhtml
+# documents.
+#
+# Copyright (c) 2005 by Yves Rschl<po4a@xxxxxxxxxxxx>
+# Copyright (c) 2007 by Nicolas Fran輟is <nicolas.francois@xxxxxxxxxxxxxxx>
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Xhtml - Convert Xhtml documents from/to PO files
+
+=head1 DESCRIPTION
+
+The goal of the po4a (po for anything) project is to ease translations (and
+more interestingly, the maintenance of translations) using gettext tools on
+areas where they were not originally expected like documentation.
+
+Locale::Po4a::Xhtml is a module to help the translation of Xhtml documents into
+other [human] languages.
+
+Please note that this module is still experimental. It is not distributed in
+the official po4a releases since we don't feel it to be mature enough. If you
+insist on trying, check the CVS out.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+These are this module's particular options:
+
+=over 4
+
+=item B<includessi>[=I<rootpath>]
+
+Include files specified by an include SSI (Server Side Includes) element
+(e.g. <!--#include virtual="/foo/bar.html" -->).
+
+B<Note:> You should use it only for static files.
+
+An additional I<rootpath> parameter can be specified. It specifies the root
+path to find files included by a B<virtual> attribute.
+
+=back
+
+=head1 STATUS OF THIS MODULE
+
+This module is fully functional, as it relies in the L<Locale::Po4a::Xml>
+module. This only defines the translatable tags and attributes.
+
+It is derived from Jordi's DocBook module.
+
+"It works for me", which means I use it successfully on my personal Web site.
+However, YMMV: please let me know if something doesn't work for you. In
+particular, tables are getting no testing whatsoever, as we don't use them.
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)>, L<Locale::Po4a::Xml(3pm)>.
+
+=head1 AUTHORS
+
+ Yves Rschl<po4a@xxxxxxxxxxxx>
+ Nicolas Fran輟is <nicolas.francois@xxxxxxxxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2004 by Yves Rschl<po4a@xxxxxxxxxxxx>
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut
+
+package Locale::Po4a::Xhtml;
+
+use 5.006;
+use strict;
+use warnings;
+
+use Locale::Po4a::Xml;
+use vars qw(@tag_types);
+*tag_types = \@Locale::Po4a::Xml::tag_types;
+
+use Locale::Po4a::Common;
+use Carp qw(croak);
+
+use vars qw(@ISA);
+@ISA = qw(Locale::Po4a::Xml);
+
+sub tag_extract_SSI {
+        my ($self,$remove)=(shift,shift);
+        my ($eof,@tag)=$self->get_string_until("-->",
+                                               {include=>1,
+                                                remove=>$remove,
+                                                unquoted=>1});
+        my ($t,$r) = @tag;
+        if ($t =~ m/<!--#include (file|virtual)="(.*?)"\s-->/s) {
+                my $includefile;
+                if ($1 eq "file") {
+                        $includefile = ".";
+                } else {
+                        $includefile = $self->{options}{'includessi'};
+                }
+                $includefile .= $2;
+                if (!$remove) {
+                        $self->get_string_until("-->",
+                                                {include=>1,
+                                                 remove=>1,
+                                                 unquoted=>1});
+                }
+                my $linenum=0;
+                my @include;
+
+                open (my $in, $includefile)
+                    or croak wrap_mod("po4a::xml",
+                                     dgettext("po4a", "Can't read from %s: %s"),
+                                      $includefile, $!);
+                while (defined (my $includeline = <$in>)) {
+                        $linenum++;
+                        my $includeref=$includefile.":$linenum";
+                        push @include, ($includeline,$includeref);
+                }
+                close $in
+                    or croak wrap_mod("po4a::xml",
+                           dgettext("po4a", "Can't close %s after reading: %s"),
+                                      $includefile, $!);
+
+                while (@include) {
+                        my ($ir, $il) = (pop @include, pop @include);
+                        $self->unshiftline($il,$ir);
+                }
+                $t =~ s/<!--#include/<!-- SSI included by po4a: /;
+                $self->unshiftline($t, $r);
+        }
+        return ($eof,@tag);
+}
+
+sub initialize {
+        my $self = shift;
+        my %options = @_;
+
+        $self->{options}{'includessi'}='';
+
+        $self->SUPER::initialize(%options);
+
+        $self->{options}{'wrap'}=1;
+        $self->{options}{'doctype'}=$self->{options}{'doctype'} || 'html';
+
+        $self->{options}{'inline'}.='
+                <a> 
+                <object> 
+                <br> 
+                <span> 
+                <bdo> 
+                <map> 
+                <tt> 
+                <i> 
+                <b> 
+                <big> 
+                <small> 
+                <em> 
+                <strong> 
+                <dfn> 
+                <code> 
+                <q> 
+                <samp> 
+                <kbd> 
+                <var> 
+                <cite> 
+                <abbr> 
+                <acronym> 
+                <sub> 
+                <sup> 
+                <input> 
+                <select> 
+                <textarea> 
+                <label> 
+                <button> 
+                <ins> 
+                <del>
+        ';
+
+        # Ignored tags: <img>
+        # Technically, <img> is an inline tag, but setting it as such is
+        # annoying, and not usually useful, unless you use images to
+        # write text (in which case you have bigger problems than this
+        # program not inlining img: you now have to translate all your
+        # images. That'll teach you).
+
+        $self->{options}{'attributes'}.='
+                lang
+                alt
+                title
+                ';
+        $self->treat_options;
+
+        if (    defined $self->{options}{'includessi'}
+            and length $self->{options}{'includessi'}) {
+                foreach (@tag_types) {
+                        if ($_->{beginning} eq "!--#") {
+                                $_->{f_extract} = \&tag_extract_SSI;
+                        }
+                }
+                # FIXME: the directory may be named "1" ;(
+                if ($self->{options}{'includessi'} eq "1") {
+                        $self->{options}{'includessi'} = ".";
+                }
+        }
+}

Added: po4a/lib/Locale/Po4a/Xml.pm
===================================================================
--- po4a/lib/Locale/Po4a/Xml.pm	                        (rev 0)
+++ po4a/lib/Locale/Po4a/Xml.pm	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1564 @@
+#!/usr/bin/perl
+
+# Po4a::Xml.pm 
+# 
+# extract and translate translatable strings from XML documents.
+# 
+# This code extracts plain text from tags and attributes from generic
+# XML documents, and it can be used as a base to build modules for
+# XML-based documents.
+#
+# Copyright (c) 2004 by Jordi Vilalta  <jvprat@xxxxxxxxx>
+#
+# This program 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 program 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 program; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Xml - Convert XML documents and derivates from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Xml is a module to help the translation of XML documents into
+other [human] languages. It can also be used as a base to build modules for
+XML-based documents.
+
+=cut
+
+package Locale::Po4a::Xml;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw(new initialize @tag_types);
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+use Carp qw(croak);
+
+#It will mantain the path from the root tag to the current one
+my @path;
+
+#It will contain a list of external entities and their attached paths
+my %entities;
+
+my @comments;
+
+sub shiftline {
+    my $self = shift;
+    # call Transtractor's shiftline
+    my ($line,$ref) = $self->SUPER::shiftline();
+    return ($line,$ref) if (not defined $line);
+
+    for my $k (keys %entities) {
+        if ($line =~ m/^(.*?)&$k;(.*)$/s) {
+            my ($before, $after) = ($1, $2);
+            my $linenum=0;
+            my @textentries;
+
+            open (my $in, $entities{$k})
+                or croak wrap_mod("po4a::xml",
+                                  dgettext("po4a", "Can't read from %s: %s"),
+                                  $entities{$k}, $!);
+            while (defined (my $textline = <$in>)) {
+                $linenum++;
+                my $textref=$entities{$k}.":$linenum";
+                push @textentries, ($textline,$textref);
+            }
+            close $in
+                or croak wrap_mod("po4a::xml",
+                          dgettext("po4a", "Can't close %s after reading: %s"),
+                                  $entities{$k}, $!);
+
+            push @textentries, ($after, $ref);
+            $line = $before.(shift @textentries);
+            $ref .= " ".(shift @textentries);
+            while (@textentries) {
+                my ($r, $l) = (pop @textentries, pop @textentries);
+                $self->unshiftline($l,$r);
+            }
+        }
+    }
+
+    return ($line,$ref);
+}
+
+sub read {
+	my ($self,$filename)=@_;
+	push @{$self->{DOCPOD}{infile}}, $filename;
+	$self->Locale::Po4a::TransTractor::read($filename);
+}
+
+sub parse {
+	my $self=shift;
+	map {$self->parse_file($_)} @{$self->{DOCPOD}{infile}};
+}
+
+# @save_holders is a stack of references to ('paragraph', 'translation',
+# 'sub_translations') hashes, where:
+# paragraph is a reference to an array (see paragraph in the
+#           treat_content() subroutine) of strings followed by references.
+#           It contains the @paragraph array as it was before the
+#           processing was interrupted by a tag instroducing a
+#           placeholder.
+# translation is the translation of this level up to now
+# sub_translations is a reference to an array of strings containing the
+#                  translations which must replace the placeholders.
+#
+# If @save_holders only has 1 holder, then we are not processing the
+# content of an holder, we are translating the document.
+my @save_holders;
+
+
+# If we are at the bottom of the stack and there is no <placeholder\d+> in
+# the current translation, we can push the translation in the translated
+# document.
+# Otherwise, we keep the translation in the current holder.
+sub pushline {
+	my ($self, $line) = (shift, shift);
+
+	my $holder_ref = pop @save_holders;
+	my %holder = %$holder_ref;
+	my $translation = $holder{'translation'};
+	$translation .= $line;
+	if (   (scalar @save_holders)
+	    or ($translation =~ m/<placeholder\d+>/s)) {
+		$holder{'translation'} = $translation;
+	} else {
+		$self->SUPER::pushline($translation);
+		$holder{'translation'} = '';
+	}
+	push @save_holders, \%holder;
+}
+
+=head1 TRANSLATING WITH PO4A::XML
+
+This module can be used directly to handle generic XML documents.  This will
+extract all tag's content, and no attributes, since it's where the text is
+written in most XML based documents.
+
+There are some options (described in the next section) that can customize
+this behavior.  If this doesn't fit to your document format you're encouraged
+to write your own module derived from this, to describe your format's details.
+See the section "Writing derivate modules" below, for the process description.
+
+=cut
+
+#
+# Parse file and translate it
+#
+sub parse_file {
+	my ($self,$filename) = @_;
+	my $eof = 0;
+
+	while (!$eof) {
+		# We get all the text until the next breaking tag (not
+		# inline) and translate it
+		$eof = $self->treat_content;
+		if (!$eof) {
+			# And then we treat the following breaking tag
+			$eof = $self->treat_tag;
+		}
+	}
+}
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+The global debug option causes this module to show the excluded strings, in
+order to see if it skips something important.
+
+These are this module's particular options:
+
+=over 4
+
+=item nostrip
+
+Prevents it to strip the spaces around the extracted strings.
+
+=item wrap
+
+Canonizes the string to translate, considering that whitespaces are not
+important, and wraps the translated document. This option can be overridden
+by custom tag options. See the "tags" option below.
+
+=item caseinsensitive
+
+It makes the tags and attributes searching to work in a case insensitive
+way.  If it's defined, it will treat E<lt>BooKE<gt>laNG and E<lt>BOOKE<gt>Lang as E<lt>bookE<gt>lang.
+
+=item includeexternal
+
+When defined, external entities are included in the generated (translated)
+document, and for the extraction of strings.  If it's not defined, you
+will have to translate external entities separately as independent
+documents.
+
+=item ontagerror
+
+This option defines the behavior of the module when it encounter a invalid
+closing tag (a tag is closed, which does not match the last opening tag).
+It can take the following values:
+
+=over
+
+=item I<fail>
+
+This is the default value.
+The module will exit with an error.
+
+=item I<warn>
+
+The module will continue, and will issue a warning.
+
+=item I<silent>
+
+The module will continue without any warnings.
+
+=back
+
+Be careful when using this option.
+It is generally recommended to fix the input file.
+
+=item tagsonly
+
+Extracts only the specified tags in the "tags" option.  Otherwise, it
+will extract all the tags except the ones specified.
+
+=item doctype
+
+String that will try to match with the first line of the document's doctype
+(if defined). If it doesn't, the document will be considered of a bad type.
+
+=item tags
+
+Space-separated list of the tags you want to translate or skip.  By default,
+the specified tags will be excluded, but if you use the "tagsonly" option,
+the specified tags will be the only ones included.  The tags must be in the
+form E<lt>aaaE<gt>, but you can join some (E<lt>bbbE<gt>E<lt>aaaE<gt>) to say that the content of
+the tag E<lt>aaaE<gt> will only be translated when it's into a E<lt>bbbE<gt> tag.
+
+You can also specify some tag options putting some characters in front of
+the tag hierarchy. For example, you can put 'w' (wrap) or 'W' (don't wrap)
+to override the default behavior specified by the global "wrap" option.
+
+Example: WE<lt>chapterE<gt>E<lt>titleE<gt>
+
+=item attributes
+
+Space-separated list of the tag's attributes you want to translate.  You can
+specify the attributes by their name (for example, "lang"), but you can
+prefix it with a tag hierarchy, to specify that this attribute will only be
+translated when it's into the specified tag. For example: E<lt>bbbE<gt>E<lt>aaaE<gt>lang
+specifies that the lang attribute will only be translated if it's into an
+E<lt>aaaE<gt> tag, and it's into a E<lt>bbbE<gt> tag.
+
+=item inline
+
+Space-separated list of the tags you want to treat as inline.  By default,
+all tags break the sequence.  This follows the same syntax as the tags option.
+
+=item nodefault
+
+Space separated list of tags that the module should not try to set by
+default in the "tags" or "inline" category.
+
+=back
+
+=cut
+
+sub initialize {
+	my $self = shift;
+	my %options = @_;
+
+	# Initialize the stack of holders
+	my @paragraph = ();
+	my @sub_translations = ();
+	my %holder = ('paragraph' => \@paragraph,
+	              'translation' => "",
+	              'sub_translations' => \@sub_translations);
+	@save_holders = (\%holder);
+
+	$self->{options}{'nostrip'}=0;
+	$self->{options}{'wrap'}=0;
+	$self->{options}{'caseinsensitive'}=0;
+	$self->{options}{'tagsonly'}=0;
+	$self->{options}{'tags'}='';
+	$self->{options}{'attributes'}='';
+	$self->{options}{'inline'}='';
+	$self->{options}{'placeholder'}='';
+	$self->{options}{'doctype'}='';
+	$self->{options}{'nodefault'}='';
+	$self->{options}{'includeexternal'}=0;
+	$self->{options}{'ontagerror'}="fail";
+
+	$self->{options}{'verbose'}='';
+	$self->{options}{'debug'}='';
+
+	foreach my $opt (keys %options) {
+		if ($options{$opt}) {
+			die wrap_mod("po4a::xml",
+				dgettext("po4a", "Unknown option: %s"), $opt)
+				unless exists $self->{options}{$opt};
+			$self->{options}{$opt} = $options{$opt};
+		}
+	}
+
+	#It will maintain the list of the translatable tags
+	$self->{tags}=();
+	#It will maintain the list of the translatable attributes
+	$self->{attributes}=();
+	#It will maintain the list of the inline tags
+	$self->{inline}=();
+	$self->{placeholder}=();
+	#list of the tags that must not be set in the tags or inline category
+	#by this module or sub-module (unless specified in an option)
+	$self->{nodefault}=();
+
+	$self->treat_options;
+}
+
+=head1 WRITING DERIVATE MODULES
+
+=head2 DEFINE WHAT TAGS AND ATTRIBUTES TO TRANSLATE
+
+The simplest customization is to define which tags and attributes you want
+the parser to translate.  This should be done in the initialize function.
+First you should call the main initialize, to get the command-line options,
+and then, append your custom definitions to the options hash.  If you want
+to treat some new options from command line, you should define them before
+calling the main initialize:
+
+  $self->{options}{'new_option'}='';
+  $self->SUPER::initialize(%options);
+  $self->{options}{'tags'}.=' <p> <head><title>';
+  $self->{options}{'attributes'}.=' <p>lang id';
+  $self->{options}{'inline'}.=' <br>';
+  $self->treat_options;
+
+=head2 OVERRIDING THE found_string FUNCTION
+
+Another simple step is to override the function "found_string", which
+receives the extracted strings from the parser, in order to translate them.
+There you can control which strings you want to translate, and perform
+transformations to them before or after the translation itself.
+
+It receives the extracted text, the reference on where it was, and a hash
+that contains extra information to control what strings to translate, how
+to translate them and to generate the comment.
+
+The content of these options depends on the kind of string it is (specified in an 
+entry of this hash):
+
+=over
+
+=item type="tag"
+
+The found string is the content of a translatable tag. The entry "tag_options"
+contains the option characters in front of the tag hierarchy in the module
+"tags" option.
+
+=item type="attribute"
+
+Means that the found string is the value of a translatable attribute. The
+entry "attribute" has the name of the attribute.
+
+=back
+
+It must return the text that will replace the original in the translated
+document. Here's a basic example of this function:
+
+  sub found_string {
+    my ($self,$text,$ref,$options)=@_;
+    $text = $self->translate($text,$ref,"type ".$options->{'type'},
+      'wrap'=>$self->{options}{'wrap'});
+    return $text;
+  }
+
+There's another simple example in the new Dia module, which only filters
+some strings.
+
+=cut
+
+sub found_string {
+	my ($self,$text,$ref,$options)=@_;
+
+	my $comment;
+	my $wrap = $self->{options}{'wrap'};
+
+	if ($options->{'type'} eq "tag") {
+		$comment = "Content of: ".$self->get_path;
+
+		if($options->{'tag_options'} =~ /w/) {
+			$wrap = 1;
+		}
+		if($options->{'tag_options'} =~ /W/) {
+			$wrap = 0;
+		}
+	} elsif ($options->{'type'} eq "attribute") {
+		$comment = "Attribute '".$options->{'attribute'}."' of: ".$self->get_path;
+	} elsif ($options->{'type'} eq "CDATA") {
+		$comment = "CDATA";
+		$wrap = 0;
+	} else {
+		die wrap_ref_mod($ref, "po4a::xml", dgettext("po4a", "Internal error: unknown type identifier '%s'."), $options->{'type'});
+	}
+	$text = $self->translate($text,$ref,$comment,'wrap'=>$wrap, comment => $options->{'comments'});
+	return $text;
+}
+
+=head2 MODIFYING TAG TYPES (TODO)
+
+This is a more complex one, but it enables a (almost) total customization.
+It's based in a list of hashes, each one defining a tag type's behavior. The
+list should be sorted so that the most general tags are after the most
+concrete ones (sorted first by the beginning and then by the end keys). To
+define a tag type you'll have to make a hash with the following keys:
+
+=over 4
+
+=item beginning
+
+Specifies the beginning of the tag, after the "E<lt>".
+
+=item end
+
+Specifies the end of the tag, before the "E<gt>".
+
+=item breaking
+
+It says if this is a breaking tag class.  A non-breaking (inline) tag is one
+that can be taken as part of the content of another tag.  It can take the
+values false (0), true (1) or undefined.  If you leave this undefined, you'll
+have to define the f_breaking function that will say whether a concrete tag of
+this class is a breaking tag or not.
+
+=item f_breaking
+
+It's a function that will tell if the next tag is a breaking one or not.  It
+should be defined if the "breaking" option is not.
+
+=item f_extract
+
+If you leave this key undefined, the generic extraction function will have to
+extract the tag itself.  It's useful for tags that can have other tags or
+special structures in them, so that the main parser doesn't get mad.  This
+function receives a boolean that says if the tag should be removed from the
+input stream or not.
+
+=item f_translate
+
+This function receives the tag (in the get_string_until() format) and returns
+the translated tag (translated attributes or all needed transformations) as a
+single string.
+
+=back
+
+=cut
+
+##### Generic XML tag types #####' 
+
+our @tag_types = ( 
+	{	beginning	=> "!--#",
+		end		=> "--",
+		breaking	=> 0},
+	{	beginning	=> "!--",
+		end		=> "--",
+		breaking	=> 0,
+		f_extract	=> \&tag_extract_comment,
+		f_translate	=> \&tag_trans_comment},
+	{	beginning	=> "?xml",
+		end		=> "?",
+		breaking	=> 1,
+		f_translate	=> \&tag_trans_xmlhead},
+	{	beginning	=> "?",
+		end		=> "?",
+		breaking	=> 1,
+		f_translate	=> \&tag_trans_procins},
+	{	beginning	=> "!DOCTYPE",
+		end		=> "",
+		breaking	=> 1,
+		f_extract	=> \&tag_extract_doctype,
+		f_translate	=> \&tag_trans_doctype},
+	{	beginning	=> "![CDATA[",
+		end		=> "",
+		breaking	=> 1,
+		f_extract	=> \&CDATA_extract,
+		f_translate	=> \&CDATA_trans},
+	{	beginning	=> "/",
+		end		=> "",
+		f_breaking	=> \&tag_break_close,
+		f_translate	=> \&tag_trans_close},
+	{	beginning	=> "",
+		end		=> "/",
+		f_breaking	=> \&tag_break_alone,
+		f_translate	=> \&tag_trans_alone},
+	{	beginning	=> "",
+		end		=> "",
+		f_breaking	=> \&tag_break_open,
+		f_translate	=> \&tag_trans_open}
+);
+
+sub tag_extract_comment {
+	my ($self,$remove)=(shift,shift);
+	my ($eof,@tag)=$self->get_string_until('-->',{include=>1,remove=>$remove});
+	return ($eof,@tag);
+}
+
+sub tag_trans_comment {
+	my ($self,@tag)=@_;
+	return $self->join_lines(@tag);
+}
+
+sub tag_trans_xmlhead {
+	my ($self,@tag)=@_;
+
+	# We don't have to translate anything from here: throw away references
+	my $tag = $self->join_lines(@tag);
+	$tag =~ /encoding=(("|')|)(.*?)(\s|\2)/s;
+	my $in_charset=$3;
+	$self->detected_charset($in_charset);
+	my $out_charset=$self->get_out_charset;
+
+	if (defined $in_charset) {
+		$tag =~ s/$in_charset/$out_charset/;
+	} else {
+		if ($tag =~ m/standalone/) {
+			$tag =~ s/(standalone)/encoding="$out_charset" $1/;
+		} else {
+			$tag.= " encoding=\"$out_charset\"";
+		}
+	}
+
+	return $tag;
+}
+
+sub tag_trans_procins {
+	my ($self,@tag)=@_;
+	return $self->join_lines(@tag);
+}
+
+sub tag_extract_doctype {
+#TODO
+	my ($self,$remove)=(shift,shift);
+
+	# Check if there is an internal subset (between []).
+	my ($eof,@tag)=$self->get_string_until('>',{include=>1,unquoted=>1});
+	my $parity = 0;
+	my $paragraph = "";
+	map { $parity = 1 - $parity; $paragraph.= $parity?$_:""; } @tag;
+	my $found = 0;
+	if ($paragraph =~ m/<.*\[.*</s) {
+		$found = 1
+	}
+
+	if (not $found) {
+		($eof,@tag)=$self->get_string_until('>',{include=>1,remove=>$remove,unquoted=>1});
+	} else {
+		($eof,@tag)=$self->get_string_until(']\s*>',{include=>1,remove=>$remove,unquoted=>1,regex=>1});
+	}
+	return ($eof,@tag);
+}
+
+sub tag_trans_doctype {
+#TODO
+	my ($self,@tag)=@_;
+	if (defined $self->{options}{'doctype'} ) {
+		my $doctype = $self->{options}{'doctype'};
+		if ( $tag[0] !~ /\Q$doctype\E/i ) {
+			die wrap_ref_mod($tag[1], "po4a::xml", dgettext("po4a", "Bad document type. '%s' expected."), $doctype);
+		}
+	}
+	my $i = 0;
+	while ( $i < $#tag ) {
+		my $t = $tag[$i];
+		my $ref = $tag[$i+1];
+		if ( $t =~ /^(\s*<!ENTITY\s+)(.*)$/is ) {
+			my $part1 = $1;
+			my $part2 = $2;
+			my $includenow = 0;
+			my $file = 0;
+			my $name = "";
+			if ($part2 =~ /^(%\s+)(.*)$/s ) {
+				$part1.= $1;
+				$part2 = $2;
+				$includenow = 1;
+			}
+			$part2 =~ /^(\S+)(\s+)(.*)$/s;
+			$name = $1;
+			$part1.= $1.$2;
+			$part2 = $3;
+			if ( $part2 =~ /^(SYSTEM\s+)(.*)$/is ) {
+				$part1.= $1;
+				$part2 = $2;
+				$file = 1;
+				if ($self->{options}{'includeexternal'}) {
+					$entities{$name} = $part2;
+					$entities{$name} =~ s/^"?(.*?)".*$/$1/s;
+				}
+			}
+			if ((not $file) and (not $includenow)) {
+			    if ($part2 =~ m/^\s*(["'])(.*)\1(\s*>.*)$/s) {
+				my $comment = "Content of the $name entity";
+				my $quote = $1;
+				my $text = $2;
+				$part2 = $3;
+				$text = $self->translate($text,
+				                         $ref,
+				                         $comment,
+				                         'wrap'=>1);
+				$t = $part1."$quote$text$quote$part2";
+			    }
+			}
+#			print $part1."\n";
+#			print $name."\n";
+#			print $part2."\n";
+		}
+		$tag[$i] = $t;
+		$i += 2;
+	}
+	return $self->join_lines(@tag);
+}
+
+sub tag_break_close {
+	my ($self,@tag)=@_;
+	if ($self->tag_in_list($self->get_path."<".
+		$self->get_tag_name(@tag).">",@{$self->{inline}})) {
+		return 0;
+	} else {
+		return 1;
+	}
+}
+
+sub tag_trans_close {
+	my ($self,@tag)=@_;
+	my $name = $self->get_tag_name(@tag);
+
+	my $test = pop @path;
+	if (!defined($test) || $test ne $name ) {
+		my $ontagerror = $self->{options}{'ontagerror'};
+		if ($ontagerror eq "warn") {
+			warn wrap_ref_mod($tag[1], "po4a::xml", dgettext("po4a", "Unexpected closing tag </%s> found. The main document may be wrong.  Continuing..."), $name);
+		} elsif ($ontagerror ne "silent") {
+			die wrap_ref_mod($tag[1], "po4a::xml", dgettext("po4a", "Unexpected closing tag </%s> found. The main document may be wrong."), $name);
+		}
+	}
+	return $self->join_lines(@tag);
+}
+
+sub CDATA_extract {
+	my ($self,$remove)=(shift,shift);
+        my ($eof, @tag) = $self->get_string_until(']]>',{include=>1,unquoted=>1,remove=>$remove});
+
+	return ($eof, @tag);
+}
+
+sub CDATA_trans {
+	my ($self,@tag)=@_;
+	return $self->found_string($self->join_lines(@tag),
+	                           $tag[1],
+	                           {'type' => "CDATA"});
+}
+
+sub tag_break_alone {
+	my ($self,@tag)=@_;
+	if ($self->tag_in_list($self->get_path."<".
+		$self->get_tag_name(@tag).">",@{$self->{inline}})) {
+		return 0;
+	} else {
+		return 1;
+	}
+}
+
+sub tag_trans_alone {
+	my ($self,@tag)=@_;
+	my $name = $self->get_tag_name(@tag);
+	push @path, $name;
+
+	$name = $self->treat_attributes(@tag);
+
+	pop @path;
+	return $name;
+}
+
+sub tag_break_open {
+	my ($self,@tag)=@_;
+	if ($self->tag_in_list($self->get_path."<".
+		$self->get_tag_name(@tag).">",@{$self->{inline}})) {
+		return 0;
+	} else {
+		return 1;
+	}
+}
+
+sub tag_trans_open {
+	my ($self,@tag)=@_;
+	my $name = $self->get_tag_name(@tag);
+	push @path, $name;
+
+	$name = $self->treat_attributes(@tag);
+
+	return $name;
+}
+
+##### END of Generic XML tag types #####
+
+=head1 INTERNAL FUNCTIONS used to write derivated parsers
+
+=head2 WORKING WITH TAGS
+
+=over 4
+
+=item get_path()
+
+This function returns the path to the current tag from the document's root,
+in the form E<lt>htmlE<gt>E<lt>bodyE<gt>E<lt>pE<gt>.
+
+=cut
+
+sub get_path {
+	my $self = shift;
+	if ( @path > 0 ) {
+		return "<".join("><",@path).">";
+	} else {
+		return "outside any tag (error?)";
+	}
+}
+
+=item tag_type()
+
+This function returns the index from the tag_types list that fits to the next
+tag in the input stream, or -1 if it's at the end of the input file.
+
+=cut
+
+sub tag_type {
+	my $self = shift;
+	my ($line,$ref) = $self->shiftline();
+	my ($match1,$match2);
+	my $found = 0;
+	my $i = 0;
+
+	if (!defined($line)) { return -1; }
+
+	$self->unshiftline($line,$ref);
+	while (!$found && $i < @tag_types) {
+		($match1,$match2) = ($tag_types[$i]->{beginning},$tag_types[$i]->{end});
+		if ($line =~ /^<\Q$match1\E/) {
+			if (!defined($tag_types[$i]->{f_extract})) {
+				my ($eof,@lines) = $self->get_string_until(">",{include=>1,unquoted=>1});
+				my $line2 = $self->join_lines(@lines);
+#print substr($line2,length($line2)-1-length($match2),1+length($match2))."\n";
+				if (defined($line2) and $line2 =~ /\Q$match2\E>$/) {
+					$found = 1;
+#print "YES: <".$match1." ".$match2.">\n";
+				} else {
+#print "NO: <".$match1." ".$match2.">\n";
+					$i++;
+				}
+			} else {
+				$found = 1;
+			}
+		} else {
+			$i++;
+		}
+	}
+	if (!$found) {
+		#It should never enter here, unless you undefine the most
+		#general tags (as <...>)
+		die "po4a::xml: Unknown tag type: ".$line."\n";
+	} else {
+		return $i;
+	}
+}
+
+=item extract_tag($$)
+
+This function returns the next tag from the input stream without the beginning
+and end, in an array form, to maintain the references from the input file.  It
+has two parameters: the type of the tag (as returned by tag_type) and a
+boolean, that indicates if it should be removed from the input stream.
+
+=cut
+
+sub extract_tag {
+	my ($self,$type,$remove) = (shift,shift,shift);
+	my ($match1,$match2) = ($tag_types[$type]->{beginning},$tag_types[$type]->{end});
+	my ($eof,@tag);
+	if (defined($tag_types[$type]->{f_extract})) {
+		($eof,@tag) = &{$tag_types[$type]->{f_extract}}($self,$remove);
+	} else {
+		($eof,@tag) = $self->get_string_until($match2.">",{include=>1,remove=>$remove,unquoted=>1});
+	}
+	$tag[0] =~ /^<\Q$match1\E(.*)$/s;
+	$tag[0] = $1;
+	$tag[$#tag-1] =~ /^(.*)\Q$match2\E>$/s;
+	$tag[$#tag-1] = $1;
+	return ($eof,@tag);
+}
+
+=item get_tag_name(@)
+
+This function returns the name of the tag passed as an argument, in the array
+form returned by extract_tag.
+
+=cut
+
+sub get_tag_name {
+	my ($self,@tag)=@_;
+	$tag[0] =~ /^(\S*)/;
+	return $1;
+}
+
+=item breaking_tag()
+
+This function returns a boolean that says if the next tag in the input stream
+is a breaking tag or not (inline tag).  It leaves the input stream intact.
+
+=cut
+
+sub breaking_tag {
+	my $self = shift;
+	my $break;
+
+	my $type = $self->tag_type;
+	if ($type == -1) { return 0; }
+
+#print "TAG TYPE = ".$type."\n";
+	$break = $tag_types[$type]->{breaking};
+	if (!defined($break)) {
+		# This tag's breaking depends on its content
+		my ($eof,@lines) = $self->extract_tag($type,0);
+		$break = &{$tag_types[$type]->{f_breaking}}($self,@lines);
+	}
+#print "break = ".$break."\n";
+	return $break;
+}
+
+=item treat_tag()
+
+This function translates the next tag from the input stream.  Using each
+tag type's custom translation functions.
+
+=cut
+
+sub treat_tag {
+	my $self = shift;
+	my $type = $self->tag_type;
+
+	my ($match1,$match2) = ($tag_types[$type]->{beginning},$tag_types[$type]->{end});
+	my ($eof,@lines) = $self->extract_tag($type,1);
+
+	$lines[0] =~ /^(\s*)(.*)$/s;
+	my $space1 = $1;
+	$lines[0] = $2;
+	$lines[$#lines-1] =~ /^(.*?)(\s*)$/s;
+	my $space2 = $2;
+	$lines[$#lines-1] = $1;
+
+	# Calling this tag type's specific handling (translation of
+	# attributes...)
+	my $line = &{$tag_types[$type]->{f_translate}}($self,@lines);
+	$self->pushline("<".$match1.$space1.$line.$space2.$match2.">");
+	return $eof;
+}
+
+=item tag_in_list($@)
+
+This function returns a string value that says if the first argument (a tag
+hierarchy) matches any of the tags from the second argument (a list of tags
+or tag hierarchies). If it doesn't match, it returns 0. Else, it returns the
+matched tag's options (the characters in front of the tag) or 1 (if that tag
+doesn't have options).
+
+=back
+
+=cut
+
+sub tag_in_list {
+	my ($self,$tag,@list) = @_;
+	my $found = 0;
+	my $i = 0;
+	
+	while (!$found && $i < @list) {
+		my $options;
+		my $element;
+		if ($list[$i] =~ /(.*?)(<.*)/) {
+			$options = $1;
+			$element = $2;
+		} else {
+			$element = $list[$i];
+		}
+		if ($self->{options}{'caseinsensitive'}) {
+			if ( $tag =~ /\Q$element\E$/i ) {
+				$found = 1;
+			}
+		} else {
+			if ( $tag =~ /\Q$element\E$/ ) {
+				$found = 1;
+			}
+		}
+		if ($found) {
+			if ($options) {
+				$found = $options;
+			}
+		} else {
+			$i++;
+		}
+	}
+	return $found;
+}
+
+=head2 WORKING WITH ATTRIBUTES
+
+=over 4
+
+=item treat_attributes(@)
+
+This function handles the translation of the tags' attributes. It receives the tag
+without the beginning / end marks, and then it finds the attributes, and it
+translates the translatable ones (specified by the module option "attributes").
+This returns a plain string with the translated tag.
+
+=back
+
+=cut
+
+sub treat_attributes {
+	my ($self,@tag)=@_;
+
+	$tag[0] =~ /^(\S*)(.*)/s;
+	my $text = $1;
+	$tag[0] = $2;
+
+	while (@tag) {
+		my $complete = 1;
+
+		$text .= $self->skip_spaces(\@tag);
+		if (@tag) {
+			# Get the attribute's name
+			$complete = 0;
+
+			$tag[0] =~ /^([^\s=]+)(.*)/s;
+			my $name = $1;
+			my $ref = $tag[1];
+			$tag[0] = $2;
+			$text .= $name;
+			$text .= $self->skip_spaces(\@tag);
+			if (@tag) {
+				# Get the '='
+				if ($tag[0] =~ /^=(.*)/s) {
+					$tag[0] = $1;
+					$text .= "=";
+					$text .= $self->skip_spaces(\@tag);
+					if (@tag) {
+						# Get the value
+						my $value="";
+						$ref=$tag[1];
+						my $quot=substr($tag[0],0,1);
+						if ($quot ne "\"" and $quot ne "'") {
+							# Unquoted value
+							$quot="";
+							$tag[0] =~ /^(\S+)(.*)/s;
+							$value = $1;
+							$tag[0] = $2;
+						} else {
+							# Quoted value
+							$text .= $quot;
+							$tag[0] =~ /^\Q$quot\E(.*)/s;
+							$tag[0] = $1;
+							while ($tag[0] !~ /\Q$quot\E/) {
+								$value .= $tag[0];
+								shift @tag;
+								shift @tag;
+							}
+							$tag[0] =~ /^(.*?)\Q$quot\E(.*)/s;
+							$value .= $1;
+							$tag[0] = $2;
+						}
+						$complete = 1;
+						if ($self->tag_in_list($self->get_path.$name,@{$self->{attributes}})) {
+							$text .= $self->found_string($value, $ref, { type=>"attribute", attribute=>$name });
+						} else {
+							print wrap_ref_mod($ref, "po4a::xml", dgettext("po4a", "Content of attribute %s excluded: %s"), $self->get_path.$name, $value)
+							       if $self->debug();
+							$text .= $self->recode_skipped_text($value);
+						}
+						$text .= $quot;
+					}
+				}
+			}
+          
+			die wrap_ref_mod($ref, "po4a::xml", dgettext ("po4a", "Bad attribute syntax"))
+				unless ($complete);
+		}
+	}
+	return $text;
+}
+
+
+
+sub treat_content {
+	my $self = shift;
+	my $blank="";
+	# Indicates if the paragraph will have to be translated
+	my $translate = 0;
+
+	my ($eof,@paragraph)=$self->get_string_until('<',{remove=>1});
+
+	# Check if this has to be translated
+	if ($self->join_lines(@paragraph) !~ /^\s*$/s) {
+		my $struc = $self->get_path;
+		my $inlist = 0;
+		if ($self->tag_in_list($struc,@{$self->{tags}})) {
+			$inlist = 1;
+		}
+		if ($self->{options}{'tagsonly'} eq $inlist) {
+			$translate = 1;
+		}
+	}
+
+	while (!$eof and !$self->breaking_tag) {
+	NEXT_TAG:
+		my @text;
+		my $type = $self->tag_type;
+		my $f_extract = $tag_types[$type]->{'f_extract'};
+		if (    defined($f_extract)
+		    and $f_extract eq \&tag_extract_comment) {
+			# Remove the content of the comments
+			($eof, @text) = $self->extract_tag($type,1);
+			push @comments, @text;
+		} else {
+			my ($tmpeof, @tag) = $self->extract_tag($type,0);
+			# Append the found inline tag
+			($eof,@text)=$self->get_string_until('>',
+			                                     {include=>1,
+			                                      remove=>1,
+			                                      unquoted=>1});
+			# Append or remove the opening/closing tag from
+			# the tag path
+			if ($tag_types[$type]->{'end'} eq "") {
+				if ($tag_types[$type]->{'beginning'} eq "") {
+					# Opening inline tag
+					my $placeholder_regex = join("|", @{$self->{placeholder}});
+					if (length($placeholder_regex) and
+					    $self->get_tag_name(@tag) =~ m/($placeholder_regex)/) { # FIXME
+						# We enter a new holder.
+						# Append a <placeholder#> tag to the current
+						# paragraph, and save the @paragraph in the
+						# current holder.
+						my $holder_ref = pop @save_holders;
+						my %old_holder = %$holder_ref;
+						my $sub_translations_ref = $old_holder{'sub_translations'};
+						my @sub_translations = @$sub_translations_ref;
+
+						push @paragraph, ("<placeholder".($#sub_translations+1).">", $text[1]);
+						my @saved_paragraph = @paragraph;
+
+						$old_holder{'paragraph'} = \@saved_paragraph;
+						push @save_holders, \%old_holder;
+
+						# Then we must push a new holder
+						my @new_paragraph = ();
+						@sub_translations = ();
+						my %new_holder = ('paragraph' => \@new_paragraph,
+						                  'translation' => "",
+						                  'sub_translations' => \@sub_translations);
+						push @save_holders, \%new_holder;
+
+						# The current @paragraph
+						# (for the current holder)
+						# is empty.
+						@paragraph = ();
+					}
+					push @path, $self->get_tag_name(@tag);
+				} elsif ($tag_types[$type]->{'beginning'} eq "/") {
+					# Closing inline tag
+
+					# Check if this is closing the
+					# last opening tag we detected.
+					my $test = pop @path;
+					if (!defined($test) ||
+					    $test ne $tag[0] ) {
+						my $ontagerror = $self->{options}{'ontagerror'};
+						if ($ontagerror eq "warn") {
+							warn wrap_ref_mod($tag[1], "po4a::xml", dgettext("po4a", "Unexpected closing tag </%s> found. The main document may be wrong.  Continuing..."), $tag[0]);
+						} elsif ($ontagerror ne "silent") {
+							die wrap_ref_mod($tag[1], "po4a::xml", dgettext("po4a", "Unexpected closing tag </%s> found. The main document may be wrong."), $tag[0]);
+						}
+					}
+
+					my $placeholder_regex = join("|", @{$self->{placeholder}});
+					if (length($placeholder_regex) and
+					    $self->get_tag_name(@tag) =~ m/($placeholder_regex)/) {
+						# This closes the current holder.
+
+						# We keep the closing tag in the holder paragraph.
+						push @paragraph, @text;
+						@text = ();
+
+						# Now translate this paragraph if needed.
+						# This will call pushline and append the
+						# translation to the current holder's translation.
+						$self->translate_paragraph($translate, @paragraph);
+
+						# Now that this holder is closed, we can remove
+						# the holder from the stack.
+						my $holder_ref = pop @save_holders;
+						# We need to keep the translation of this holder
+						my %holder = %$holder_ref;
+						my $translation = $holder{'translation'};
+						# Then we store the translation in the previous
+						# holder's sub_translations array
+						my $old_holder_ref = pop @save_holders;
+						my %old_holder = %$old_holder_ref;
+						my $sub_translations_ref = $old_holder{'sub_translations'};
+						my @sub_translations = @$sub_translations_ref;
+						push @sub_translations, $translation;
+						# We also need to restore the @paragraph array, as
+						# it was before we encountered the holder.
+						my $paragraph_ref = $old_holder{'paragraph'};
+						@paragraph = @$paragraph_ref;
+
+						# restore the holder in the stack
+						$old_holder{'sub_translations'} = \@sub_translations;
+						push @save_holders, \%old_holder;
+					}
+				}
+			}
+			push @paragraph, @text;
+		}
+
+		# Next tag
+		($eof,@text)=$self->get_string_until('<',{remove=>1});
+		if ($#text > 0) {
+			# Check if text (extracted after the inline tag)
+			# has to be translated
+			if ($self->join_lines(@text) !~ /^\s*$/s) {
+				my $struc = $self->get_path;
+				my $inlist = 0;
+				if ($self->tag_in_list($struc,
+				                       @{$self->{tags}})) {
+					$inlist = 1;
+				}
+				if ($self->{options}{'tagsonly'} eq $inlist) {
+					$translate = 1;
+				}
+			}
+			push @paragraph, @text;
+		}
+
+		# If the next tag closes the last inline tag, we loop again
+		# (In the case of <foo><bar> being the inline tag, we can't
+		# loop back with the "while" because breaking_tag will check
+		# for <foo><bar><bar>, hence the goto)
+		$type = $self->tag_type;
+		if (    ($tag_types[$type]->{'end'} eq "")
+		    and ($tag_types[$type]->{'beginning'} eq "/") ) {
+			my ($tmpeof, @tag) = $self->extract_tag($type,0);
+			if ($self->get_tag_name(@tag) eq $path[$#path]) {
+				# The next tag closes the last inline tag.
+				# We need to temporarily remove the tag from
+				# the path before calling breaking_tag
+				my $t = pop @path;
+				if (!$tmpeof and !$self->breaking_tag) {
+					push @path, $t;
+					goto NEXT_TAG;
+				}
+				push @path, $t;
+			}
+		}
+	}
+
+	# This strips the extracted strings
+	# (only if you don't specify the 'nostrip' option)
+	if (!$self->{options}{'nostrip'}) {
+		my $clean = 0;
+		# Clean the beginning
+		while (!$clean and $#paragraph > 0) {
+			$paragraph[0] =~ /^(\s*)(.*)/s;
+			my $match = $1;
+			if ($paragraph[0] eq $match) {
+				if ($match ne "") {
+					$self->pushline($match);
+				}
+				shift @paragraph;
+				shift @paragraph;
+			} else {
+				$paragraph[0] = $2;
+				if ($match ne "") {
+					$self->pushline($match);
+				}
+				$clean = 1;
+			}
+		}
+		$clean = 0;
+		# Clean the end
+		while (!$clean and $#paragraph > 0) {
+			$paragraph[$#paragraph-1] =~ /^(.*?)(\s*)$/s;
+			my $match = $2;
+			if ($paragraph[$#paragraph-1] eq $match) {
+				if ($match ne "") {
+					$blank = $match.$blank;
+				}
+				pop @paragraph;
+				pop @paragraph;
+			} else {
+				$paragraph[$#paragraph-1] = $1;
+				if ($match ne "") {
+					$blank = $match.$blank;
+				}
+				$clean = 1;
+			}
+		}
+	}
+
+	# Translate the string when needed
+	# This will either push the translation in the translated document or
+	# in the current holder translation.
+	$self->translate_paragraph($translate, @paragraph);
+
+	# Now the paragraph is fully translated.
+	# If we have all the holders' translation, we can replace the
+	# placeholders by their translations.
+	# We must wait to have all the translations because the holders are
+	# numbered.
+	if (scalar @save_holders) {
+		my $holder_ref = pop @save_holders;
+		my %holder = %$holder_ref;
+		my $sub_translations_ref = $holder{'sub_translations'};
+		my $translation = $holder{'translation'};
+		my @sub_translations = @$sub_translations_ref;
+
+		# Count the number of <placeholder\d+> in $translation
+		my $count = 0;
+		my $str = $translation;
+		while ($str =~ m/^.*?<placeholder\d+>(.*)$/s) {
+			$count += 1;
+			$str = $1;
+		}
+
+		if (scalar(@sub_translations) == $count) {
+			# OK, all the holders of the current paragraph are
+			# closed (and translated).
+			# Replace them by their translation.
+			while ($translation =~ m/^(.*?)<placeholder(\d+)>(.*)$/s) {
+				# FIXME: we could also check that
+				#          * the holder exists
+				#          * all the holders are used
+				$translation = $1.$sub_translations[$2].$3;
+			}
+			# We have our translation
+			$holder{'translation'} = $translation;
+			# And there is no need for any holder in it.
+			@sub_translations = ();
+			$holder{'sub_translations'} = \@sub_translations;
+# FIXME: is it alright if a document ends by a placeholder?
+		}
+		# Either we don't have all the holders, either we have the
+		# final translation.
+		# We must keep the current holder at the top of the stack.
+		push @save_holders, \%holder;
+	}
+
+	# Push the trailing blanks
+	if ($blank ne "") {
+		$self->pushline($blank);
+	}
+	return $eof;
+}
+
+# Translate a @paragraph array of (string, reference).
+# The $translate argument indicates if the strings must be translated or
+# just pushed
+sub translate_paragraph {
+	my ($self, $translate) = (shift, shift);
+	my @paragraph = @_;
+
+	my $comments;
+	while (@comments) {
+		my ($t,$l) = (shift @comments, shift @comments);
+		$comments .= "\n" if defined $comments;
+		$comments .= $t;
+	}
+	$self->pushline("<!--".$comments."-->\n") if defined $comments;
+	@comments = ();
+
+	if ( length($self->join_lines(@paragraph)) > 0 ) {
+		my $struc = $self->get_path;
+		my $options = $self->tag_in_list($struc,@{$self->{tags}});
+		$options = "" if ($options eq 0 or $options eq 1);
+		if ($translate) {
+			# This tag should be translated
+			$self->pushline($self->found_string(
+				$self->join_lines(@paragraph),
+				$paragraph[1], {
+					type=>"tag",
+					tag_options=>$options,
+					comments=>$comments
+				}));
+		} else {
+			# Inform that this tag isn't translated in debug mode
+			print wrap_ref_mod($paragraph[1], "po4a::xml", dgettext ("po4a", "Content of tag %s excluded: %s"), $self->get_path, $self->join_lines(@paragraph))
+			       if $self->debug();
+			$self->pushline($self->recode_skipped_text($self->join_lines(@paragraph)));
+		}
+	}
+}
+
+
+
+=head2 WORKING WITH THE MODULE OPTIONS
+
+=over 4
+
+=item treat_options()
+
+This function fills the internal structures that contain the tags, attributes
+and inline data with the options of the module (specified in the command-line
+or in the initialize function).
+
+=back
+
+=cut
+
+sub treat_options {
+	my $self = shift;
+        
+	$self->{options}{'nodefault'} =~ /\s*(.*)\s*/s;
+	my %list_nodefault;
+	foreach (split(/\s+/s,$1)) {
+	    $list_nodefault{$_} = 1;
+	}
+	$self->{nodefault} = \%list_nodefault;
+
+	$self->{options}{'tags'} =~ /\s*(.*)\s*/s;
+	my @list_tags;
+	foreach my $tag (split(/\s+/s,$1)) {
+		push @list_tags, $tag
+			unless $list_nodefault{$tag};
+	}
+	$self->{tags} = \@list_tags;
+
+	$self->{options}{'attributes'} =~ /\s*(.*)\s*/s;
+	my @list_attr = split(/\s+/s,$1);
+	$self->{attributes} = \@list_attr;
+
+	$self->{options}{'inline'} =~ /\s*(.*)\s*/s;
+	my @list_inline;
+	foreach my $tag (split(/\s+/s,$1)) {
+		push @list_inline, $tag
+			unless $list_nodefault{$tag};
+	}
+	$self->{inline} = \@list_inline;
+
+	$self->{options}{'placeholder'} =~ /\s*(.*)\s*/s;
+	my @list_placeholder = split(/\s+/s,$1);
+	$self->{placeholder} = \@list_placeholder;
+}
+
+=head2 GETTING TEXT FROM THE INPUT DOCUMENT
+
+=over
+
+=item get_string_until($%)
+
+This function returns an array with the lines (and references) from the input
+document until it finds the first argument.  The second argument is an options
+hash. Value 0 means disabled (the default) and 1, enabled.
+
+The valid options are:
+
+=over 4
+
+=item include
+
+This makes the returned array to contain the searched text
+
+=item remove
+
+This removes the returned stream from the input
+
+=item unquoted
+
+This ensures that the searched text is outside any quotes
+
+=back
+
+=cut
+
+sub get_string_until {
+	my ($self,$search) = (shift,shift);
+	my $options = shift;
+	my ($include,$remove,$unquoted, $regex) = (0,0,0,0);
+
+	if (defined($options->{include})) { $include = $options->{include}; }
+	if (defined($options->{remove})) { $remove = $options->{remove}; }
+	if (defined($options->{unquoted})) { $unquoted = $options->{unquoted}; }
+	if (defined($options->{regex})) { $regex = $options->{regex}; }
+
+	my ($line,$ref) = $self->shiftline();
+	my (@text,$paragraph);
+	my ($eof,$found) = (0,0);
+
+	$search = "\Q$search\E" unless $regex;
+	while (defined($line) and !$found) {
+		push @text, ($line,$ref);
+		$paragraph .= $line;
+		if ($unquoted) {
+			if ( $paragraph =~ /^((\".*?\")|(\'.*?\')|[^\"\'])*$search.*/s ) {
+				$found = 1;
+			}
+		} else {
+			if ( $paragraph =~ /.*$search.*/s ) {
+				$found = 1;
+			}
+		}
+		if (!$found) {
+			($line,$ref)=$self->shiftline();
+		}
+	}
+
+	if (!defined($line)) { $eof = 1; }
+
+	if ( $found ) {
+		$line = "";
+		if($unquoted) {
+			$paragraph =~ /^(?:(?:\".*?\")|(?:\'.*?\')|[^\"\'])*?$search(.*)$/s;
+			$line = $1;
+			$text[$#text-1] =~ s/\Q$line\E$//s;
+		} else {
+			$paragraph =~ /$search(.*)$/s;
+			$line = $1;
+			$text[$#text-1] =~ s/\Q$line\E$//s;
+		}
+		if(!$include) {
+			$text[$#text-1] =~ /(.*)($search.*)/s;
+			$text[$#text-1] = $1;
+			$line = $2.$line;
+		}
+		if (defined($line) and ($line ne "")) {
+			$self->unshiftline ($line,$text[$#text]);
+		}
+	}
+	if (!$remove) {
+		my $i = $#text;
+		while ($i > 0) {
+			$self->unshiftline ($text[$i-1],$text[$i]);
+			$i -= 2;
+		}
+	}
+
+	#If we get to the end of the file, we return the whole paragraph
+	return ($eof,@text);
+}
+
+=item skip_spaces(\@)
+
+This function receives as argument the reference to a paragraph (in the format
+returned by get_string_until), skips his heading spaces and returns them as
+a simple string.
+
+=cut
+
+sub skip_spaces {
+	my ($self,$pstring)=@_;
+	my $space="";
+
+	while (@$pstring and (@$pstring[0] =~ /^(\s+)(.*)$/s or @$pstring[0] eq "")) {
+		if (@$pstring[0] ne "") {
+			$space .= $1;
+			@$pstring[0] = $2;
+		}
+
+		if (@$pstring[0] eq "") {
+			shift @$pstring;
+			shift @$pstring;
+		}
+	}
+	return $space;
+}
+
+=item join_lines(@)
+
+This function returns a simple string with the text from the argument array
+(discarding the references).
+
+=cut
+
+sub join_lines {
+	my ($self,@lines)=@_;
+	my ($line,$ref);
+	my $text = "";
+	while ($#lines > 0) {
+		($line,$ref) = (shift @lines,shift @lines);
+		$text .= $line;
+	}
+	return $text;
+}
+
+=back
+
+=head1 STATUS OF THIS MODULE
+
+This module can translate tags and attributes.
+
+Support for entities and included files is in the TODO list.
+
+The writing of derivate modules is rather limited.
+
+=head1 TODO LIST
+
+DOCTYPE (ENTITIES)
+
+There is a minimal support for the translation of entities. They are
+translated as a whole, and tags are not taken into account. Multilines
+entities are not supported and entities are always rewrapped during the
+translation.
+
+INCLUDED FILES
+
+MODIFY TAG TYPES FROM INHERITED MODULES
+(move the tag_types structure inside the $self hash?)
+
+breaking tag inside non-breaking tag (possible?) causes ugly comments
+
+=head1 SEE ALSO
+
+L<po4a(7)|po4a.7>, L<Locale::Po4a::TransTractor(3pm)|Locale::Po4a::TransTractor>.
+
+=head1 AUTHORS
+
+ Jordi Vilalta <jvprat@xxxxxxxxx>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2004 by Jordi Vilalta  E<lt>jvprat@xxxxxxxxxx<gt>
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
+
+=cut
+
+1;

Added: po4a/po/bin/.cvsignore
===================================================================
--- po4a/po/bin/.cvsignore	                        (rev 0)
+++ po4a/po/bin/.cvsignore	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1 @@
+*.mo

Added: po4a/po/bin/af.po
===================================================================
--- po4a/po/bin/af.po	                        (rev 0)
+++ po4a/po/bin/af.po	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,926 @@
+# Afrikaans translation of po4a
+# This file is distributed under the same license as the po4a package.
+# Theuns Smuts, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: po4a bin\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-12 13:53+0200\n"
+"PO-Revision-Date: 2005-02-25 20:19+0100\n"
+"Last-Translator: Theuns Smuts\n"
+"Language-Team: AF\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:27
+#, fuzzy
+msgid "Need to provide a module name"
+msgstr "Moet 'n module naam verskaf aan die Kieser"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:46
+#, perl-format
+msgid "Unknown format type: %s."
+msgstr "Onbekende formaat tipe: %s."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:48
+#, perl-format
+msgid "Module loading error: %s"
+msgstr "Module laai fout: %s"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:57
+msgid "List of valid formats:"
+msgstr "Lys van geldige formate:"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:59
+msgid "dia: uncompressed Dia diagrams."
+msgstr "dia: onsaamgepersde Dia diagramme."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:60
+msgid "docbook: Docbook XML."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:61
+msgid "guide: Gentoo Linux's xml documentation format."
+msgstr "guide: Gentoo Linux's xml dokumentasie formaat."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:63
+msgid "ini: .INI format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:64
+msgid "kernelhelp: Help messages of each kernel compilation option."
+msgstr "kernelhelp: Help boodskappe van elke kernel kompilasie opsie."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:65
+msgid "latex: LaTeX format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:66
+msgid "man: Good old manual page format."
+msgstr "man: Goeie ou handboek bladsy formaat."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:67
+msgid "pod: Perl Online Documentation format."
+msgstr "pod: Perl Aanlyn Dokumentasie formaat."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:68
+msgid "sgml: either debiandoc or docbook DTD."
+msgstr "sgml: of debiandoc of docbook DTD."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:69
+msgid "texinfo: The info page format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:70
+msgid "tex: generic TeX documents (see also latex)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:71
+msgid "text: simple text document."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:73
+msgid "xhtml: XHTML documents."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:74
+msgid "xml: generic XML documents (see also docbook)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Common.pm:82
+#, perl-format
+msgid ""
+"%s version %s.\n"
+"written by Martin Quinson and Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"This is free software; see source code for copying\n"
+"conditions. There is NO warranty; not even for\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Debconf.pm:171
+#, perl-format
+msgid "Translated field in master document: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/KernelHelp.pm:104
+msgid "Syntax error"
+msgstr "Syntaks fout"
+
+#: ../../lib/Locale/Po4a/Man.pm:456 ../../lib/Locale/Po4a/Po.pm:153
+#: ../../lib/Locale/Po4a/Sgml.pm:243 ../../lib/Locale/Po4a/TeX.pm:1612
+#: ../../lib/Locale/Po4a/Xml.pm:322
+#, perl-format
+msgid "Unknown option: %s"
+msgstr "Onbekende opsie: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:473
+msgid ""
+"Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:520
+msgid ""
+"The no_wrap parameters must be a set of comma-separated begin:end couples.\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:566
+msgid "Invalid 'unknown_macros' value. Must be one of:\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:620
+msgid ""
+"This file was generated with Pod::Man. Translate the pod file with the pod "
+"module of po4a."
+msgstr ""
+"Die l麁r was gegenereer deur Pod::Man. Vertaal die pod l麁r met die pod "
+"module van po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:623
+msgid ""
+"This file was generated with help2man. Translate the source file with the "
+"regular gettext."
+msgstr ""
+"Die l麁r is gegenereer deur help2man. Vertaal die bron-l麁r met die gewone "
+"gettext."
+
+#: ../../lib/Locale/Po4a/Man.pm:625
+msgid ""
+"This file was generated with docbook-to-man. Translate the source file with "
+"the sgml module of po4a."
+msgstr ""
+"Die l麁r is gegenereer deur docbook-to-man. Vertaal die bron-l麁r met die "
+"sgml module van po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:628
+msgid ""
+"This file was generated with docbook2man. Translate the source file with the "
+"sgml module of po4a."
+msgstr ""
+"Die l麁r is gegenereer deur docbook2man. Vertaal die bron-l麁r met die sgml "
+"module van po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:632 ../../lib/Locale/Po4a/Man.pm:640
+#, perl-format
+msgid ""
+"This file was generated with %s. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Die l麁r is genereer met %s. U moet die bron l麁r vertaal, maar gaan in elk "
+"geval voort."
+
+#: ../../lib/Locale/Po4a/Man.pm:636
+msgid ""
+"This file was generated with db2man.xsl. Translate the source file with the "
+"xml module of po4a."
+msgstr ""
+"Die l麁r was gegenereer deur db2man.xsl. Vertaal die bron l麁r met die xml "
+"module van po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:646
+#, perl-format
+msgid ""
+"This file contains the line '%s'. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Die l麁r bevat die lyn '%s'. U moet die bron l麁r vertaal, maar gaan in elk "
+"geval voort."
+
+#: ../../lib/Locale/Po4a/Man.pm:708
+#, perl-format
+msgid ""
+"Font modifiers followed by a command may disturb po4a.  You should either "
+"remove the font modifier '%s', or integrate a \\f font modifier in the "
+"following command ('%s'), but continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:813
+msgid ""
+"The unshiftline is not supported for the man module. Please send a bug "
+"report with the groff page that generated this error."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:856
+#, perl-format
+msgid ""
+"macro %s called without arguments. Even if placing the macro arguments on "
+"the next line is authorized by man(7), handling this would make the po4a "
+"parser too complicate. Please simply put the macro args on the same line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:884
+#, fuzzy
+msgid "Escape sequence \\c encountered. This is not completely handled yet."
+msgstr "Ontsnap volgorde \\c tee gekom. Dit word nog nie hanteer nie."
+
+#: ../../lib/Locale/Po4a/Man.pm:1047
+#, perl-format
+msgid "Unbalanced '<' and '>' in font modifier. Faulty message: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1224
+#, perl-format
+msgid "Unparsable line: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1297
+#, perl-format
+msgid ""
+"Unknown macro '%s'. Remove it from the document, or refer to the Locale::"
+"Po4a::Man manpage to see how po4a can handle new macros."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1508
+msgid ""
+"Escaped space at the end of macro arg. With high probability, it won't do "
+"the trick with po4a (because of wrapping). You may want to remove it and use "
+"the .nf/.fi groff macro to control the wrapping."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1682
+#, perl-format
+msgid "Unsupported font in: '%s'."
+msgstr "Nie-ondersteunde lettertipe in:  '%s'."
+
+#: ../../lib/Locale/Po4a/Man.pm:2031
+msgid ""
+"This page defines a new macro with '.de'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2097
+msgid "The .ie macro must be followed by a .el macro."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2123
+#, perl-format
+msgid ""
+"This page uses conditionals with '%s'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2164
+#, perl-format
+msgid ""
+"This page includes another file with '%s'. Do not forget to translate this "
+"file ('%s')."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2280
+#, perl-format
+msgid ""
+"This page uses the '%s' request with the number of lines in argument. This "
+"is not supported yet."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2295
+#, perl-format
+msgid ""
+"This page uses the '%s' request. This request is only supported when no "
+"argument is provided."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/NewsDebian.pm:87
+msgid "Begin of a new entry before the end of previous one"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:159
+#, perl-format
+msgid ""
+"Invalid value for option 'porefs' ('%s' is not one of 'full', 'noline' or "
+"'none')"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:204
+msgid "Please provide a non-null filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:211 ../../lib/Locale/Po4a/TeX.pm:913
+#: ../../lib/Locale/Po4a/TransTractor.pm:396
+#: ../../lib/Locale/Po4a/TransTractor.pm:530
+#: ../../lib/Locale/Po4a/Xhtml.pm:135 ../../lib/Locale/Po4a/Xml.pm:83
+#, perl-format
+msgid "Can't read from %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:250
+#, perl-format
+msgid "Strange line: -->%s<--"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:275 ../../lib/Locale/Po4a/Po.pm:392
+#: ../../lib/Locale/Po4a/TransTractor.pm:430
+msgid "Can't write to a file without filename"
+msgstr "Kan nie skryf na 'n l麁r sonder 'n naam nie"
+
+#: ../../lib/Locale/Po4a/Po.pm:290 ../../lib/Locale/Po4a/TransTractor.pm:445
+#, perl-format
+msgid "Can't write to %s: %s"
+msgstr "Kan nie skryf na %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:366
+#, fuzzy, perl-format
+msgid "Can't unlink %s: %s."
+msgstr "Kan nie %s: %s oopmaak nie"
+
+#: ../../lib/Locale/Po4a/Po.pm:374 ../../po4a:987
+#, fuzzy, perl-format
+msgid "Can't copy %s to %s: %s."
+msgstr "Kan nie %s: %s oopmaak nie"
+
+#: ../../lib/Locale/Po4a/Po.pm:379 ../../lib/Locale/Po4a/Po.pm:384
+#: ../../po4a:994
+#, fuzzy, perl-format
+msgid "Can't move %s to %s: %s."
+msgstr "Kan nie %s: %s oopmaak nie"
+
+#: ../../lib/Locale/Po4a/Po.pm:424
+msgid ""
+"\n"
+"The gettextization failed (once again). Don't give up, gettextizing is a "
+"subtle art, but this is only needed once to convert a project to the "
+"gorgeous luxus offered by po4a to translators.\n"
+"Please refer to the po4a(7) documentation, the section \"HOWTO convert a pre-"
+"existing translation to po4a?\" contains several hints to help you in your "
+"task"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:434
+#, perl-format
+msgid ""
+"Original has more strings than the translation (%d>%d). Please fix it by "
+"editing the translated version to add some dummy entry."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:440
+#, perl-format
+msgid ""
+"Original has less strings than the translation (%d<%d). Please fix it by "
+"removing the extra entry from the translated file. You may need an addendum "
+"(cf po4a(7)) to reput the chunk in place after gettextization. A possible "
+"cause is that a text duplicated in the original is not translated the same "
+"way each time. Remove one of the translations, and you're fine."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:493
+#, perl-format
+msgid ""
+"po4a gettextization: Structure disparity between original and translated "
+"files:\n"
+"msgid (at %s) is of type '%s' while\n"
+"msgstr (at %s) is of type '%s'.\n"
+"Original text: %s\n"
+"Translated text: %s\n"
+"(result so far dumped to gettextization.failed.po)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:701
+#, perl-format
+msgid "Eval failure: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1024
+#, perl-format
+msgid "msgid defined twice: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1044
+#, perl-format
+msgid ""
+"Translations don't match for:\n"
+"%s\n"
+"-->First translation:\n"
+"%s\n"
+" Second translation:\n"
+"%s\n"
+" Old translation discarded."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:209
+msgid ""
+"The needed module SGMLS.pm was not found and needs to be installed. It can "
+"be found on the CPAN, in package libsgmls-perl on debian, etc."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:277
+msgid "msgid skipped to help translators (contains only an entity)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:284
+msgid "msgid skipped to help translators (contains only tags)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:292
+msgid ""
+"msgid skipped to help translators (contains only opening or closing tags of "
+"marked sections)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:369
+msgid ""
+"Trying to handle a XML document as a SGML one. Feel lucky if it works, help "
+"us implementing a proper XML backend if it does not."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:382
+msgid ""
+"This file is not a master SGML document (no DOCTYPE). It may be a file to be "
+"included by another one, in which case it should not be passed to po4a "
+"directly. Text from included files is extracted/translated when handling the "
+"master file including them."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:501
+msgid "DTD of this file is unknown, but proceeding as requested."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:505
+msgid ""
+"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog "
+"follows:"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:599 ../../lib/Locale/Po4a/Sgml.pm:681
+#, perl-format
+msgid "Can't open %s (content of entity %s%s;): %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:652
+#, perl-format
+msgid "unrecognized prolog inclusion entity: %%%s;"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:769
+#, perl-format
+msgid "Can't close tempfile: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:775
+#, perl-format
+msgid "Can't run nsgmls: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:890
+#, perl-format
+msgid "Unknown tag %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:924
+#, perl-format
+msgid "bad translation '%s' for '%s' in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:979 ../../lib/Locale/Po4a/Sgml.pm:1057
+#, perl-format
+msgid "Closing tag for a translation container missing before %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1140
+#, perl-format
+msgid "Unknown SGML event type: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1149
+msgid ""
+"Warning: nsgmls produced some errors.  This is usually caused by po4a, which "
+"modifies the input and restores it afterwards, causing the input of nsgmls "
+"to be invalid.  This is usually safe, but you may wish to verify the "
+"generated document with nsgmls -wno-valid.  Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:501 ../../lib/Locale/Po4a/TeX.pm:581
+#, fuzzy, perl-format
+msgid "un-balanced %s in '%s'"
+msgstr "Ongebalanseer '<' en '>'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:515 ../../lib/Locale/Po4a/TeX.pm:599
+#, perl-format
+msgid "Error while checking the number of arguments of the '%s' command: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:764 ../../lib/Locale/Po4a/TeX.pm:861
+#, fuzzy, perl-format
+msgid "Unknown command: '%s'"
+msgstr "Onbekende opsie: %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:907 ../../lib/Locale/Po4a/TransTractor.pm:392
+msgid "Can't read from file without having a filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:982 ../../lib/Locale/Po4a/TransTractor.pm:417
+#: ../../lib/Locale/Po4a/Xhtml.pm:144 ../../lib/Locale/Po4a/Xml.pm:92
+#, perl-format
+msgid "Can't close %s after reading: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1017 ../../po4a:560
+#, perl-format
+msgid "Can't open %s: %s"
+msgstr "Kan nie %s: %s oopmaak nie"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1055
+#, perl-format
+msgid "Cannot use an alias to the unknown command '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1061
+#, perl-format
+msgid ""
+"You are using the old definitions format (%s).  Please update this "
+"definition line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1264 ../../lib/Locale/Po4a/TeX.pm:1518
+#, fuzzy, perl-format
+msgid "unknown environment: '%s'"
+msgstr "Onbekende opsie: %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1286
+#, perl-format
+msgid "unmatched end of environment '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1332 ../../lib/Locale/Po4a/TeX.pm:1444
+#, perl-format
+msgid "Wrong number of arguments for the '%s' command."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1345 ../../lib/Locale/Po4a/TeX.pm:1457
+#: ../../lib/Locale/Po4a/TeX.pm:1545
+msgid "An optional argument was provided, but a mandatory one is expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1349 ../../lib/Locale/Po4a/TeX.pm:1461
+#, fuzzy, perl-format
+msgid "Command '%s': %s"
+msgstr "Kan nie %s: %s oopmaak nie"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1403
+#, perl-format
+msgid "register_generic_command: unsupported format: '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1512
+msgid "The first argument of \\begin is mandatory."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:452
+#, perl-format
+msgid "Can't close %s after writing: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:535
+#, perl-format
+msgid "Can't read Po4a header from %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:540
+#, perl-format
+msgid "First line of %s does not look like a Po4a header."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:545
+#, perl-format
+msgid "Syntax error in Po4a header of %s, near \"%s\""
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:559
+#, perl-format
+msgid "Invalid argument in the Po4a header of %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:565
+#, perl-format
+msgid "The Po4a header of %s does not define the mode."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:569
+#, perl-format
+msgid ""
+"Mode invalid in the Po4a header of %s: should be 'before' or 'after' not %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:574
+#, perl-format
+msgid "The Po4a header of %s does not define the position."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:578
+msgid "No ending boundary given in the Po4a header, but mode=after."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:604
+msgid "Can't apply addendum when not given the filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:607
+#, perl-format
+msgid "Addendum %s does not exist."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:628
+#, perl-format
+msgid "No candidate position for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:633
+#, perl-format
+msgid "More than one candidate position found for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:639
+#: ../../lib/Locale/Po4a/TransTractor.pm:662
+#, perl-format
+msgid "Addendum '%s' applied before this line: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:669
+#, perl-format
+msgid "Addendum '%s' applied after the line: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:676
+#, perl-format
+msgid "Addendum '%s' applied at the end of the file."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:836
+#: ../../lib/Locale/Po4a/TransTractor.pm:1012
+#, perl-format
+msgid ""
+"Couldn't determine the input document's charset. Please specify it on the "
+"command line. (non-ascii char at %s)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Wml.pm:88
+#, perl-format
+msgid "Can't create a temporary xml file: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:425
+#, perl-format
+msgid "Internal error: unknown type identifier '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:590
+#, perl-format
+msgid "Bad document type. '%s' expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:662 ../../lib/Locale/Po4a/Xml.pm:1106
+#, perl-format
+msgid ""
+"Unexpected closing tag </%s> found. The main document may be wrong.  "
+"Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:664 ../../lib/Locale/Po4a/Xml.pm:1108
+#, perl-format
+msgid "Unexpected closing tag </%s> found. The main document may be wrong."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1004
+#, perl-format
+msgid "Content of attribute %s excluded: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1013
+msgid "Bad attribute syntax"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1323
+#, perl-format
+msgid "Content of tag %s excluded: %s"
+msgstr ""
+
+#: ../../po4a:494 ../../po4a:670
+#, perl-format
+msgid "Unparsable argument '%s' (%s)."
+msgstr ""
+
+#: ../../po4a:528
+#, perl-format
+msgid "failed to execute '%s': %s."
+msgstr ""
+
+#: ../../po4a:532
+#, perl-format
+msgid "'%s' died with signal %d, with coredump."
+msgstr ""
+
+#: ../../po4a:536
+#, perl-format
+msgid "'%s' died with signal %d, without coredump."
+msgstr ""
+
+#: ../../po4a:541
+#, perl-format
+msgid "'%s' exited with value %d."
+msgstr ""
+
+#: ../../po4a:545
+#, perl-format
+msgid "Error: %s"
+msgstr ""
+
+#: ../../po4a:551 ../../po4a-gettextize:197 ../../po4a-normalize:140
+#: ../../po4a-translate:204 ../../po4a-translate:205 ../../po4a-updatepo:192
+#: ../../scripts/msguntypot:171 ../../scripts/msguntypot:173
+#, perl-format
+msgid "File %s does not exist."
+msgstr ""
+
+#: ../../po4a:573
+#, fuzzy, perl-format
+msgid "Unknown variable: %s"
+msgstr "Onbekende opsie: %s"
+
+#: ../../po4a:582
+#, perl-format
+msgid "Syntax error: %s"
+msgstr ""
+
+#: ../../po4a:609 ../../po4a:621
+#, perl-format
+msgid "'%s' redeclared"
+msgstr ""
+
+#: ../../po4a:614
+#, perl-format
+msgid "Unparsable argument '%s'."
+msgstr ""
+
+#: ../../po4a:628
+#, perl-format
+msgid ""
+"The '%s' master file was specified earlier in the configuration file.  This "
+"may cause problems with options."
+msgstr ""
+
+#: ../../po4a:674
+msgid "The translated and master file are the same."
+msgstr ""
+
+#: ../../po4a:681
+#, perl-format
+msgid "Translation of %s in %s redefined"
+msgstr ""
+
+#: ../../po4a:703
+#, perl-format
+msgid "Unparsable command '%s'."
+msgstr ""
+
+#: ../../po4a:709
+msgid "po4a_paths not declared. Dunno where to find the pot and po files"
+msgstr ""
+
+#: ../../po4a:746
+msgid "Splitted mode, creating a temporary POT"
+msgstr ""
+
+#: ../../po4a:781 ../../po4a:914 ../../po4a-updatepo:220
+#, perl-format
+msgid "Updating %s:"
+msgstr ""
+
+#: ../../po4a:784 ../../po4a:924 ../../po4a-updatepo:228
+#, perl-format
+msgid "Creating %s:"
+msgstr ""
+
+#: ../../po4a:831 ../../po4a:861 ../../po4a:948 ../../po4a-updatepo:202
+#, perl-format
+msgid "Can't create a temporary pot file: %s"
+msgstr ""
+
+#: ../../po4a:842
+#, perl-format
+msgid " (%d entries)"
+msgstr ""
+
+#: ../../po4a:868 ../../po4a:974
+#, fuzzy, perl-format
+msgid "Can't create directory '%s': %s"
+msgstr "Kan nie skryf na %s: %s"
+
+#: ../../po4a:888 ../../scripts/msguntypot:208
+#, perl-format
+msgid "Can't create a temporary po file: %s"
+msgstr ""
+
+#: ../../po4a:1038
+#, perl-format
+msgid "%s doesn't need to be updated."
+msgstr ""
+
+#: ../../po4a:1079
+#, perl-format
+msgid "Discard %s (%s of %s strings; only %s%% translated; need %s%%)."
+msgstr ""
+
+#: ../../po4a:1086
+#, perl-format
+msgid "Timestamp %s created."
+msgstr ""
+
+#: ../../po4a:1096
+#, perl-format
+msgid "Timestamp %s removed."
+msgstr ""
+
+#: ../../po4a:1105
+#, perl-format
+msgid "Addendum %s does NOT apply to %s (translation discarded)."
+msgstr ""
+
+#: ../../po4a:1114
+#, perl-format
+msgid "%s is %s%% translated (%s strings)."
+msgstr ""
+
+#: ../../po4a:1117 ../../po4a-translate:236
+#, perl-format
+msgid "%s is %s%% translated (%s of %s strings)."
+msgstr ""
+
+#: ../../po4a-translate:242
+#, perl-format
+msgid "Discard the translation of %s (only %s%% translated; need %s%%)."
+msgstr ""
+
+#: ../../po4a-translate:249
+#, perl-format
+msgid "Discard the translation of %s (addendum %s does not apply)."
+msgstr ""
+
+#: ../../po4a-updatepo:193
+msgid "po4a-updatepo can't take the input po from stdin."
+msgstr ""
+
+#: ../../po4a-updatepo:205
+msgid "Parse input files... "
+msgstr ""
+
+#: ../../po4a-updatepo:215
+msgid "done."
+msgstr ""
+
+#: ../../po4a-updatepo:224 ../../scripts/msguntypot:217
+#, perl-format
+msgid "Error while running msgmerge: %s"
+msgstr ""
+
+#: ../../po4a-updatepo:231
+#, perl-format
+msgid "Error while copying the po file: %s"
+msgstr ""
+
+#: ../../scripts/msguntypot:170 ../../scripts/msguntypot:172
+#, perl-format
+msgid "Mandatory argument '%s' missing."
+msgstr ""
+
+#: ../../scripts/msguntypot:181
+#, perl-format
+msgid ""
+"The new and old pot files have different amount of strings (%d != %d). "
+"Something's seriously wrong here."
+msgstr ""
+
+#: ../../scripts/msguntypot:199
+#, perl-format
+msgid "Found %d modified entries."
+msgstr ""
+
+#: ../../scripts/msguntypot:213
+#, perl-format
+msgid "Handling %s"
+msgstr ""
+
+#: ../../scripts/msguntypot:238
+#, perl-format
+msgid "Modified %d entries in %d files."
+msgstr ""
+
+#~ msgid "Unbalanced '<' and '>'"
+#~ msgstr "Ongebalanseer '<' en '>'"
+
+#, fuzzy
+#~ msgid "Unknown function (%s) for '%s'"
+#~ msgstr "Onbekende opsie: %s"
+
+#, fuzzy
+#~ msgid "can't close %s: %s"
+#~ msgstr "Kan nie %s: %s oopmaak nie"
+
+#, fuzzy
+#~ msgid "%s: Unknown tag %s"
+#~ msgstr "Onbekende opsie: %s"
+
+#, fuzzy
+#~ msgid "%s: Unknown SGML event type: %s"
+#~ msgstr "Onbekende formaat tipe: %s."

Added: po4a/po/bin/ar.po
===================================================================
--- po4a/po/bin/ar.po	                        (rev 0)
+++ po4a/po/bin/ar.po	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,894 @@
+# Arabic translation for po4a
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the po4a package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: po4a\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-12 13:53+0200\n"
+"PO-Revision-Date: 2005-05-21\n"
+"Last-Translator: EMAD AL-BLOUSHI\n"
+"Language-Team: Arabic <ar@xxxxxx>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n == 2 ? 1 : 2\n"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:27
+msgid "Need to provide a module name"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:46
+#, perl-format
+msgid "Unknown format type: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:48
+#, perl-format
+msgid "Module loading error: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:57
+msgid "List of valid formats:"
+msgstr "B'&E) 'D5J: 'D5-J-):"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:59
+msgid "dia: uncompressed Dia diagrams."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:60
+msgid "docbook: Docbook XML."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:61
+msgid "guide: Gentoo Linux's xml documentation format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:63
+msgid "ini: .INI format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:64
+msgid "kernelhelp: Help messages of each kernel compilation option."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:65
+msgid "latex: LaTeX format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:66
+msgid "man: Good old manual page format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:67
+msgid "pod: Perl Online Documentation format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:68
+msgid "sgml: either debiandoc or docbook DTD."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:69
+msgid "texinfo: The info page format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:70
+msgid "tex: generic TeX documents (see also latex)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:71
+msgid "text: simple text document."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:73
+msgid "xhtml: XHTML documents."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:74
+msgid "xml: generic XML documents (see also docbook)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Common.pm:82
+#, perl-format
+msgid ""
+"%s version %s.\n"
+"written by Martin Quinson and Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"This is free software; see source code for copying\n"
+"conditions. There is NO warranty; not even for\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Debconf.pm:171
+#, perl-format
+msgid "Translated field in master document: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/KernelHelp.pm:104
+msgid "Syntax error"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:456 ../../lib/Locale/Po4a/Po.pm:153
+#: ../../lib/Locale/Po4a/Sgml.pm:243 ../../lib/Locale/Po4a/TeX.pm:1612
+#: ../../lib/Locale/Po4a/Xml.pm:322
+#, perl-format
+msgid "Unknown option: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:473
+msgid ""
+"Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:520
+msgid ""
+"The no_wrap parameters must be a set of comma-separated begin:end couples.\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:566
+msgid "Invalid 'unknown_macros' value. Must be one of:\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:620
+msgid ""
+"This file was generated with Pod::Man. Translate the pod file with the pod "
+"module of po4a."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:623
+msgid ""
+"This file was generated with help2man. Translate the source file with the "
+"regular gettext."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:625
+msgid ""
+"This file was generated with docbook-to-man. Translate the source file with "
+"the sgml module of po4a."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:628
+msgid ""
+"This file was generated with docbook2man. Translate the source file with the "
+"sgml module of po4a."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:632 ../../lib/Locale/Po4a/Man.pm:640
+#, perl-format
+msgid ""
+"This file was generated with %s. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:636
+msgid ""
+"This file was generated with db2man.xsl. Translate the source file with the "
+"xml module of po4a."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:646
+#, perl-format
+msgid ""
+"This file contains the line '%s'. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:708
+#, perl-format
+msgid ""
+"Font modifiers followed by a command may disturb po4a.  You should either "
+"remove the font modifier '%s', or integrate a \\f font modifier in the "
+"following command ('%s'), but continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:813
+msgid ""
+"The unshiftline is not supported for the man module. Please send a bug "
+"report with the groff page that generated this error."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:856
+#, perl-format
+msgid ""
+"macro %s called without arguments. Even if placing the macro arguments on "
+"the next line is authorized by man(7), handling this would make the po4a "
+"parser too complicate. Please simply put the macro args on the same line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:884
+msgid "Escape sequence \\c encountered. This is not completely handled yet."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1047
+#, perl-format
+msgid "Unbalanced '<' and '>' in font modifier. Faulty message: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1224
+#, perl-format
+msgid "Unparsable line: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1297
+#, perl-format
+msgid ""
+"Unknown macro '%s'. Remove it from the document, or refer to the Locale::"
+"Po4a::Man manpage to see how po4a can handle new macros."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1508
+msgid ""
+"Escaped space at the end of macro arg. With high probability, it won't do "
+"the trick with po4a (because of wrapping). You may want to remove it and use "
+"the .nf/.fi groff macro to control the wrapping."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1682
+#, perl-format
+msgid "Unsupported font in: '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2031
+msgid ""
+"This page defines a new macro with '.de'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2097
+msgid "The .ie macro must be followed by a .el macro."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2123
+#, perl-format
+msgid ""
+"This page uses conditionals with '%s'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2164
+#, perl-format
+msgid ""
+"This page includes another file with '%s'. Do not forget to translate this "
+"file ('%s')."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2280
+#, perl-format
+msgid ""
+"This page uses the '%s' request with the number of lines in argument. This "
+"is not supported yet."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2295
+#, perl-format
+msgid ""
+"This page uses the '%s' request. This request is only supported when no "
+"argument is provided."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/NewsDebian.pm:87
+msgid "Begin of a new entry before the end of previous one"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:159
+#, perl-format
+msgid ""
+"Invalid value for option 'porefs' ('%s' is not one of 'full', 'noline' or "
+"'none')"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:204
+msgid "Please provide a non-null filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:211 ../../lib/Locale/Po4a/TeX.pm:913
+#: ../../lib/Locale/Po4a/TransTractor.pm:396
+#: ../../lib/Locale/Po4a/TransTractor.pm:530
+#: ../../lib/Locale/Po4a/Xhtml.pm:135 ../../lib/Locale/Po4a/Xml.pm:83
+#, perl-format
+msgid "Can't read from %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:250
+#, perl-format
+msgid "Strange line: -->%s<--"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:275 ../../lib/Locale/Po4a/Po.pm:392
+#: ../../lib/Locale/Po4a/TransTractor.pm:430
+msgid "Can't write to a file without filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:290 ../../lib/Locale/Po4a/TransTractor.pm:445
+#, perl-format
+msgid "Can't write to %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:366
+#, perl-format
+msgid "Can't unlink %s: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:374 ../../po4a:987
+#, perl-format
+msgid "Can't copy %s to %s: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:379 ../../lib/Locale/Po4a/Po.pm:384
+#: ../../po4a:994
+#, perl-format
+msgid "Can't move %s to %s: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:424
+msgid ""
+"\n"
+"The gettextization failed (once again). Don't give up, gettextizing is a "
+"subtle art, but this is only needed once to convert a project to the "
+"gorgeous luxus offered by po4a to translators.\n"
+"Please refer to the po4a(7) documentation, the section \"HOWTO convert a pre-"
+"existing translation to po4a?\" contains several hints to help you in your "
+"task"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:434
+#, perl-format
+msgid ""
+"Original has more strings than the translation (%d>%d). Please fix it by "
+"editing the translated version to add some dummy entry."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:440
+#, perl-format
+msgid ""
+"Original has less strings than the translation (%d<%d). Please fix it by "
+"removing the extra entry from the translated file. You may need an addendum "
+"(cf po4a(7)) to reput the chunk in place after gettextization. A possible "
+"cause is that a text duplicated in the original is not translated the same "
+"way each time. Remove one of the translations, and you're fine."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:493
+#, perl-format
+msgid ""
+"po4a gettextization: Structure disparity between original and translated "
+"files:\n"
+"msgid (at %s) is of type '%s' while\n"
+"msgstr (at %s) is of type '%s'.\n"
+"Original text: %s\n"
+"Translated text: %s\n"
+"(result so far dumped to gettextization.failed.po)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:701
+#, perl-format
+msgid "Eval failure: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1024
+#, perl-format
+msgid "msgid defined twice: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1044
+#, perl-format
+msgid ""
+"Translations don't match for:\n"
+"%s\n"
+"-->First translation:\n"
+"%s\n"
+" Second translation:\n"
+"%s\n"
+" Old translation discarded."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:209
+msgid ""
+"The needed module SGMLS.pm was not found and needs to be installed. It can "
+"be found on the CPAN, in package libsgmls-perl on debian, etc."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:277
+msgid "msgid skipped to help translators (contains only an entity)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:284
+msgid "msgid skipped to help translators (contains only tags)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:292
+msgid ""
+"msgid skipped to help translators (contains only opening or closing tags of "
+"marked sections)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:369
+msgid ""
+"Trying to handle a XML document as a SGML one. Feel lucky if it works, help "
+"us implementing a proper XML backend if it does not."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:382
+msgid ""
+"This file is not a master SGML document (no DOCTYPE). It may be a file to be "
+"included by another one, in which case it should not be passed to po4a "
+"directly. Text from included files is extracted/translated when handling the "
+"master file including them."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:501
+msgid "DTD of this file is unknown, but proceeding as requested."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:505
+msgid ""
+"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog "
+"follows:"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:599 ../../lib/Locale/Po4a/Sgml.pm:681
+#, perl-format
+msgid "Can't open %s (content of entity %s%s;): %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:652
+#, perl-format
+msgid "unrecognized prolog inclusion entity: %%%s;"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:769
+#, perl-format
+msgid "Can't close tempfile: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:775
+#, perl-format
+msgid "Can't run nsgmls: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:890
+#, perl-format
+msgid "Unknown tag %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:924
+#, perl-format
+msgid "bad translation '%s' for '%s' in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:979 ../../lib/Locale/Po4a/Sgml.pm:1057
+#, perl-format
+msgid "Closing tag for a translation container missing before %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1140
+#, perl-format
+msgid "Unknown SGML event type: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1149
+msgid ""
+"Warning: nsgmls produced some errors.  This is usually caused by po4a, which "
+"modifies the input and restores it afterwards, causing the input of nsgmls "
+"to be invalid.  This is usually safe, but you may wish to verify the "
+"generated document with nsgmls -wno-valid.  Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:501 ../../lib/Locale/Po4a/TeX.pm:581
+#, perl-format
+msgid "un-balanced %s in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:515 ../../lib/Locale/Po4a/TeX.pm:599
+#, perl-format
+msgid "Error while checking the number of arguments of the '%s' command: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:764 ../../lib/Locale/Po4a/TeX.pm:861
+#, perl-format
+msgid "Unknown command: '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:907 ../../lib/Locale/Po4a/TransTractor.pm:392
+msgid "Can't read from file without having a filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:982 ../../lib/Locale/Po4a/TransTractor.pm:417
+#: ../../lib/Locale/Po4a/Xhtml.pm:144 ../../lib/Locale/Po4a/Xml.pm:92
+#, perl-format
+msgid "Can't close %s after reading: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1017 ../../po4a:560
+#, perl-format
+msgid "Can't open %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1055
+#, perl-format
+msgid "Cannot use an alias to the unknown command '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1061
+#, perl-format
+msgid ""
+"You are using the old definitions format (%s).  Please update this "
+"definition line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1264 ../../lib/Locale/Po4a/TeX.pm:1518
+#, perl-format
+msgid "unknown environment: '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1286
+#, perl-format
+msgid "unmatched end of environment '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1332 ../../lib/Locale/Po4a/TeX.pm:1444
+#, perl-format
+msgid "Wrong number of arguments for the '%s' command."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1345 ../../lib/Locale/Po4a/TeX.pm:1457
+#: ../../lib/Locale/Po4a/TeX.pm:1545
+msgid "An optional argument was provided, but a mandatory one is expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1349 ../../lib/Locale/Po4a/TeX.pm:1461
+#, perl-format
+msgid "Command '%s': %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1403
+#, perl-format
+msgid "register_generic_command: unsupported format: '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1512
+msgid "The first argument of \\begin is mandatory."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:452
+#, perl-format
+msgid "Can't close %s after writing: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:535
+#, perl-format
+msgid "Can't read Po4a header from %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:540
+#, perl-format
+msgid "First line of %s does not look like a Po4a header."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:545
+#, perl-format
+msgid "Syntax error in Po4a header of %s, near \"%s\""
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:559
+#, perl-format
+msgid "Invalid argument in the Po4a header of %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:565
+#, perl-format
+msgid "The Po4a header of %s does not define the mode."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:569
+#, perl-format
+msgid ""
+"Mode invalid in the Po4a header of %s: should be 'before' or 'after' not %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:574
+#, perl-format
+msgid "The Po4a header of %s does not define the position."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:578
+msgid "No ending boundary given in the Po4a header, but mode=after."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:604
+msgid "Can't apply addendum when not given the filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:607
+#, perl-format
+msgid "Addendum %s does not exist."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:628
+#, perl-format
+msgid "No candidate position for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:633
+#, perl-format
+msgid "More than one candidate position found for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:639
+#: ../../lib/Locale/Po4a/TransTractor.pm:662
+#, perl-format
+msgid "Addendum '%s' applied before this line: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:669
+#, perl-format
+msgid "Addendum '%s' applied after the line: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:676
+#, perl-format
+msgid "Addendum '%s' applied at the end of the file."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:836
+#: ../../lib/Locale/Po4a/TransTractor.pm:1012
+#, perl-format
+msgid ""
+"Couldn't determine the input document's charset. Please specify it on the "
+"command line. (non-ascii char at %s)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Wml.pm:88
+#, perl-format
+msgid "Can't create a temporary xml file: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:425
+#, perl-format
+msgid "Internal error: unknown type identifier '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:590
+#, perl-format
+msgid "Bad document type. '%s' expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:662 ../../lib/Locale/Po4a/Xml.pm:1106
+#, perl-format
+msgid ""
+"Unexpected closing tag </%s> found. The main document may be wrong.  "
+"Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:664 ../../lib/Locale/Po4a/Xml.pm:1108
+#, perl-format
+msgid "Unexpected closing tag </%s> found. The main document may be wrong."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1004
+#, perl-format
+msgid "Content of attribute %s excluded: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1013
+msgid "Bad attribute syntax"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1323
+#, perl-format
+msgid "Content of tag %s excluded: %s"
+msgstr ""
+
+#: ../../po4a:494 ../../po4a:670
+#, perl-format
+msgid "Unparsable argument '%s' (%s)."
+msgstr ""
+
+#: ../../po4a:528
+#, perl-format
+msgid "failed to execute '%s': %s."
+msgstr ""
+
+#: ../../po4a:532
+#, perl-format
+msgid "'%s' died with signal %d, with coredump."
+msgstr ""
+
+#: ../../po4a:536
+#, perl-format
+msgid "'%s' died with signal %d, without coredump."
+msgstr ""
+
+#: ../../po4a:541
+#, perl-format
+msgid "'%s' exited with value %d."
+msgstr ""
+
+#: ../../po4a:545
+#, perl-format
+msgid "Error: %s"
+msgstr ""
+
+#: ../../po4a:551 ../../po4a-gettextize:197 ../../po4a-normalize:140
+#: ../../po4a-translate:204 ../../po4a-translate:205 ../../po4a-updatepo:192
+#: ../../scripts/msguntypot:171 ../../scripts/msguntypot:173
+#, perl-format
+msgid "File %s does not exist."
+msgstr ""
+
+#: ../../po4a:573
+#, perl-format
+msgid "Unknown variable: %s"
+msgstr ""
+
+#: ../../po4a:582
+#, perl-format
+msgid "Syntax error: %s"
+msgstr ""
+
+#: ../../po4a:609 ../../po4a:621
+#, perl-format
+msgid "'%s' redeclared"
+msgstr ""
+
+#: ../../po4a:614
+#, perl-format
+msgid "Unparsable argument '%s'."
+msgstr ""
+
+#: ../../po4a:628
+#, perl-format
+msgid ""
+"The '%s' master file was specified earlier in the configuration file.  This "
+"may cause problems with options."
+msgstr ""
+
+#: ../../po4a:674
+msgid "The translated and master file are the same."
+msgstr ""
+
+#: ../../po4a:681
+#, perl-format
+msgid "Translation of %s in %s redefined"
+msgstr ""
+
+#: ../../po4a:703
+#, perl-format
+msgid "Unparsable command '%s'."
+msgstr ""
+
+#: ../../po4a:709
+msgid "po4a_paths not declared. Dunno where to find the pot and po files"
+msgstr ""
+
+#: ../../po4a:746
+msgid "Splitted mode, creating a temporary POT"
+msgstr ""
+
+#: ../../po4a:781 ../../po4a:914 ../../po4a-updatepo:220
+#, perl-format
+msgid "Updating %s:"
+msgstr ""
+
+#: ../../po4a:784 ../../po4a:924 ../../po4a-updatepo:228
+#, perl-format
+msgid "Creating %s:"
+msgstr ""
+
+#: ../../po4a:831 ../../po4a:861 ../../po4a:948 ../../po4a-updatepo:202
+#, perl-format
+msgid "Can't create a temporary pot file: %s"
+msgstr ""
+
+#: ../../po4a:842
+#, perl-format
+msgid " (%d entries)"
+msgstr ""
+
+#: ../../po4a:868 ../../po4a:974
+#, perl-format
+msgid "Can't create directory '%s': %s"
+msgstr ""
+
+#: ../../po4a:888 ../../scripts/msguntypot:208
+#, perl-format
+msgid "Can't create a temporary po file: %s"
+msgstr ""
+
+#: ../../po4a:1038
+#, perl-format
+msgid "%s doesn't need to be updated."
+msgstr ""
+
+#: ../../po4a:1079
+#, perl-format
+msgid "Discard %s (%s of %s strings; only %s%% translated; need %s%%)."
+msgstr ""
+
+#: ../../po4a:1086
+#, perl-format
+msgid "Timestamp %s created."
+msgstr ""
+
+#: ../../po4a:1096
+#, perl-format
+msgid "Timestamp %s removed."
+msgstr ""
+
+#: ../../po4a:1105
+#, perl-format
+msgid "Addendum %s does NOT apply to %s (translation discarded)."
+msgstr ""
+
+#: ../../po4a:1114
+#, perl-format
+msgid "%s is %s%% translated (%s strings)."
+msgstr ""
+
+#: ../../po4a:1117 ../../po4a-translate:236
+#, perl-format
+msgid "%s is %s%% translated (%s of %s strings)."
+msgstr ""
+
+#: ../../po4a-translate:242
+#, perl-format
+msgid "Discard the translation of %s (only %s%% translated; need %s%%)."
+msgstr ""
+
+#: ../../po4a-translate:249
+#, perl-format
+msgid "Discard the translation of %s (addendum %s does not apply)."
+msgstr ""
+
+#: ../../po4a-updatepo:193
+msgid "po4a-updatepo can't take the input po from stdin."
+msgstr ""
+
+#: ../../po4a-updatepo:205
+msgid "Parse input files... "
+msgstr ""
+
+#: ../../po4a-updatepo:215
+msgid "done."
+msgstr ""
+
+#: ../../po4a-updatepo:224 ../../scripts/msguntypot:217
+#, perl-format
+msgid "Error while running msgmerge: %s"
+msgstr ""
+
+#: ../../po4a-updatepo:231
+#, perl-format
+msgid "Error while copying the po file: %s"
+msgstr ""
+
+#: ../../scripts/msguntypot:170 ../../scripts/msguntypot:172
+#, perl-format
+msgid "Mandatory argument '%s' missing."
+msgstr ""
+
+#: ../../scripts/msguntypot:181
+#, perl-format
+msgid ""
+"The new and old pot files have different amount of strings (%d != %d). "
+"Something's seriously wrong here."
+msgstr ""
+
+#: ../../scripts/msguntypot:199
+#, perl-format
+msgid "Found %d modified entries."
+msgstr ""
+
+#: ../../scripts/msguntypot:213
+#, perl-format
+msgid "Handling %s"
+msgstr ""
+
+#: ../../scripts/msguntypot:238
+#, perl-format
+msgid "Modified %d entries in %d files."
+msgstr ""

Added: po4a/po/bin/bn.po
===================================================================
--- po4a/po/bin/bn.po	                        (rev 0)
+++ po4a/po/bin/bn.po	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,895 @@
+# Bengali translation for po4a
+# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007
+# This file is distributed under the same license as the po4a package.
+# カチュヘー ェヘー弊カ ェセイ <shuvro_paul@xxxxxxxxx>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: po4a\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-12 13:53+0200\n"
+"PO-Revision-Date: 2007-08-12 21:47+0200\n"
+"Last-Translator: カチュヘー ェヘー弊カ ェセイ <shuvro_paul@xxxxxxxxx>\n"
+"Language-Team: Bengali <bn@xxxxxx>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Export-Date: 2007-08-12 16:08:33+0000\n"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:27
+#, fuzzy
+msgid "Need to provide a module name"
+msgstr "ョ。ソ牡涸ー 助淦 ィセョ ヲヌ゜セ ヲー弊ー"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:46
+#, perl-format
+msgid "Unknown format type: %s."
+msgstr "ヘ楡、 ォセ㌣ ォーョヘッセ: %s"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:48
+#, perl-format
+msgid "Module loading error: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:57
+msgid "List of valid formats:"
+msgstr "Ⅹチョヒヲソ、 ォーョヘッセ淺ー 、セイソ弊 :"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:59
+msgid "dia: uncompressed Dia diagrams."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:60
+msgid "docbook: Docbook XML."
+msgstr "。噴チ 。噴チ助ヘク尚彰"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:61
+msgid "guide: Gentoo Linux's xml documentation format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:63
+msgid "ini: .INI format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:64
+msgid "kernelhelp: Help messages of each kernel compilation option."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:65
+msgid "latex: LaTeX format."
+msgstr "イヘッセ淺箆ク :イヘッセ淺箆ク ォーョヘッセ
+
+#: ../../lib/Locale/Po4a/Chooser.pm:66
+msgid "man: Good old manual page format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:67
+msgid "pod: Perl Online Documentation format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:68
+msgid "sgml: either debiandoc or docbook DTD."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:69
+#, fuzzy
+msgid "texinfo: The info page format."
+msgstr "架淺箆ク :イヘッセ淺箆ク ォーョヘッセ
+
+#: ../../lib/Locale/Po4a/Chooser.pm:70
+msgid "tex: generic TeX documents (see also latex)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:71
+msgid "text: simple text document."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:73
+msgid "xhtml: XHTML documents."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:74
+msgid "xml: generic XML documents (see also docbook)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Common.pm:82
+#, perl-format
+msgid ""
+"%s version %s.\n"
+"written by Martin Quinson and Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"This is free software; see source code for copying\n"
+"conditions. There is NO warranty; not even for\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Debconf.pm:171
+#, perl-format
+msgid "Translated field in master document: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/KernelHelp.pm:104
+msgid "Syntax error"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:456 ../../lib/Locale/Po4a/Po.pm:153
+#: ../../lib/Locale/Po4a/Sgml.pm:243 ../../lib/Locale/Po4a/TeX.pm:1612
+#: ../../lib/Locale/Po4a/Xml.pm:322
+#, perl-format
+msgid "Unknown option: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:473
+msgid ""
+"Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:520
+msgid ""
+"The no_wrap parameters must be a set of comma-separated begin:end couples.\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:566
+msgid "Invalid 'unknown_macros' value. Must be one of:\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:620
+msgid ""
+"This file was generated with Pod::Man. Translate the pod file with the pod "
+"module of po4a."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:623
+msgid ""
+"This file was generated with help2man. Translate the source file with the "
+"regular gettext."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:625
+msgid ""
+"This file was generated with docbook-to-man. Translate the source file with "
+"the sgml module of po4a."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:628
+msgid ""
+"This file was generated with docbook2man. Translate the source file with the "
+"sgml module of po4a."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:632 ../../lib/Locale/Po4a/Man.pm:640
+#, perl-format
+msgid ""
+"This file was generated with %s. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:636
+msgid ""
+"This file was generated with db2man.xsl. Translate the source file with the "
+"xml module of po4a."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:646
+#, perl-format
+msgid ""
+"This file contains the line '%s'. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:708
+#, perl-format
+msgid ""
+"Font modifiers followed by a command may disturb po4a.  You should either "
+"remove the font modifier '%s', or integrate a \\f font modifier in the "
+"following command ('%s'), but continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:813
+msgid ""
+"The unshiftline is not supported for the man module. Please send a bug "
+"report with the groff page that generated this error."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:856
+#, perl-format
+msgid ""
+"macro %s called without arguments. Even if placing the macro arguments on "
+"the next line is authorized by man(7), handling this would make the po4a "
+"parser too complicate. Please simply put the macro args on the same line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:884
+msgid "Escape sequence \\c encountered. This is not completely handled yet."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1047
+#, perl-format
+msgid "Unbalanced '<' and '>' in font modifier. Faulty message: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1224
+#, perl-format
+msgid "Unparsable line: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1297
+#, perl-format
+msgid ""
+"Unknown macro '%s'. Remove it from the document, or refer to the Locale::"
+"Po4a::Man manpage to see how po4a can handle new macros."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1508
+msgid ""
+"Escaped space at the end of macro arg. With high probability, it won't do "
+"the trick with po4a (because of wrapping). You may want to remove it and use "
+"the .nf/.fi groff macro to control the wrapping."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1682
+#, perl-format
+msgid "Unsupported font in: '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2031
+msgid ""
+"This page defines a new macro with '.de'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2097
+msgid "The .ie macro must be followed by a .el macro."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2123
+#, perl-format
+msgid ""
+"This page uses conditionals with '%s'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2164
+#, perl-format
+msgid ""
+"This page includes another file with '%s'. Do not forget to translate this "
+"file ('%s')."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2280
+#, perl-format
+msgid ""
+"This page uses the '%s' request with the number of lines in argument. This "
+"is not supported yet."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2295
+#, perl-format
+msgid ""
+"This page uses the '%s' request. This request is only supported when no "
+"argument is provided."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/NewsDebian.pm:87
+msgid "Begin of a new entry before the end of previous one"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:159
+#, perl-format
+msgid ""
+"Invalid value for option 'porefs' ('%s' is not one of 'full', 'noline' or "
+"'none')"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:204
+msgid "Please provide a non-null filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:211 ../../lib/Locale/Po4a/TeX.pm:913
+#: ../../lib/Locale/Po4a/TransTractor.pm:396
+#: ../../lib/Locale/Po4a/TransTractor.pm:530
+#: ../../lib/Locale/Po4a/Xhtml.pm:135 ../../lib/Locale/Po4a/Xml.pm:83
+#, perl-format
+msgid "Can't read from %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:250
+#, perl-format
+msgid "Strange line: -->%s<--"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:275 ../../lib/Locale/Po4a/Po.pm:392
+#: ../../lib/Locale/Po4a/TransTractor.pm:430
+msgid "Can't write to a file without filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:290 ../../lib/Locale/Po4a/TransTractor.pm:445
+#, perl-format
+msgid "Can't write to %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:366
+#, perl-format
+msgid "Can't unlink %s: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:374 ../../po4a:987
+#, perl-format
+msgid "Can't copy %s to %s: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:379 ../../lib/Locale/Po4a/Po.pm:384
+#: ../../po4a:994
+#, perl-format
+msgid "Can't move %s to %s: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:424
+msgid ""
+"\n"
+"The gettextization failed (once again). Don't give up, gettextizing is a "
+"subtle art, but this is only needed once to convert a project to the "
+"gorgeous luxus offered by po4a to translators.\n"
+"Please refer to the po4a(7) documentation, the section \"HOWTO convert a pre-"
+"existing translation to po4a?\" contains several hints to help you in your "
+"task"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:434
+#, perl-format
+msgid ""
+"Original has more strings than the translation (%d>%d). Please fix it by "
+"editing the translated version to add some dummy entry."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:440
+#, perl-format
+msgid ""
+"Original has less strings than the translation (%d<%d). Please fix it by "
+"removing the extra entry from the translated file. You may need an addendum "
+"(cf po4a(7)) to reput the chunk in place after gettextization. A possible "
+"cause is that a text duplicated in the original is not translated the same "
+"way each time. Remove one of the translations, and you're fine."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:493
+#, perl-format
+msgid ""
+"po4a gettextization: Structure disparity between original and translated "
+"files:\n"
+"msgid (at %s) is of type '%s' while\n"
+"msgstr (at %s) is of type '%s'.\n"
+"Original text: %s\n"
+"Translated text: %s\n"
+"(result so far dumped to gettextization.failed.po)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:701
+#, perl-format
+msgid "Eval failure: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1024
+#, perl-format
+msgid "msgid defined twice: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1044
+#, perl-format
+msgid ""
+"Translations don't match for:\n"
+"%s\n"
+"-->First translation:\n"
+"%s\n"
+" Second translation:\n"
+"%s\n"
+" Old translation discarded."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:209
+msgid ""
+"The needed module SGMLS.pm was not found and needs to be installed. It can "
+"be found on the CPAN, in package libsgmls-perl on debian, etc."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:277
+msgid "msgid skipped to help translators (contains only an entity)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:284
+msgid "msgid skipped to help translators (contains only tags)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:292
+msgid ""
+"msgid skipped to help translators (contains only opening or closing tags of "
+"marked sections)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:369
+msgid ""
+"Trying to handle a XML document as a SGML one. Feel lucky if it works, help "
+"us implementing a proper XML backend if it does not."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:382
+msgid ""
+"This file is not a master SGML document (no DOCTYPE). It may be a file to be "
+"included by another one, in which case it should not be passed to po4a "
+"directly. Text from included files is extracted/translated when handling the "
+"master file including them."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:501
+msgid "DTD of this file is unknown, but proceeding as requested."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:505
+msgid ""
+"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog "
+"follows:"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:599 ../../lib/Locale/Po4a/Sgml.pm:681
+#, perl-format
+msgid "Can't open %s (content of entity %s%s;): %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:652
+#, perl-format
+msgid "unrecognized prolog inclusion entity: %%%s;"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:769
+#, perl-format
+msgid "Can't close tempfile: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:775
+#, perl-format
+msgid "Can't run nsgmls: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:890
+#, perl-format
+msgid "Unknown tag %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:924
+#, perl-format
+msgid "bad translation '%s' for '%s' in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:979 ../../lib/Locale/Po4a/Sgml.pm:1057
+#, perl-format
+msgid "Closing tag for a translation container missing before %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1140
+#, perl-format
+msgid "Unknown SGML event type: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1149
+msgid ""
+"Warning: nsgmls produced some errors.  This is usually caused by po4a, which "
+"modifies the input and restores it afterwards, causing the input of nsgmls "
+"to be invalid.  This is usually safe, but you may wish to verify the "
+"generated document with nsgmls -wno-valid.  Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:501 ../../lib/Locale/Po4a/TeX.pm:581
+#, perl-format
+msgid "un-balanced %s in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:515 ../../lib/Locale/Po4a/TeX.pm:599
+#, perl-format
+msgid "Error while checking the number of arguments of the '%s' command: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:764 ../../lib/Locale/Po4a/TeX.pm:861
+#, perl-format
+msgid "Unknown command: '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:907 ../../lib/Locale/Po4a/TransTractor.pm:392
+msgid "Can't read from file without having a filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:982 ../../lib/Locale/Po4a/TransTractor.pm:417
+#: ../../lib/Locale/Po4a/Xhtml.pm:144 ../../lib/Locale/Po4a/Xml.pm:92
+#, perl-format
+msgid "Can't close %s after reading: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1017 ../../po4a:560
+#, perl-format
+msgid "Can't open %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1055
+#, perl-format
+msgid "Cannot use an alias to the unknown command '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1061
+#, perl-format
+msgid ""
+"You are using the old definitions format (%s).  Please update this "
+"definition line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1264 ../../lib/Locale/Po4a/TeX.pm:1518
+#, perl-format
+msgid "unknown environment: '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1286
+#, perl-format
+msgid "unmatched end of environment '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1332 ../../lib/Locale/Po4a/TeX.pm:1444
+#, perl-format
+msgid "Wrong number of arguments for the '%s' command."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1345 ../../lib/Locale/Po4a/TeX.pm:1457
+#: ../../lib/Locale/Po4a/TeX.pm:1545
+msgid "An optional argument was provided, but a mandatory one is expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1349 ../../lib/Locale/Po4a/TeX.pm:1461
+#, perl-format
+msgid "Command '%s': %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1403
+#, perl-format
+msgid "register_generic_command: unsupported format: '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1512
+msgid "The first argument of \\begin is mandatory."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:452
+#, perl-format
+msgid "Can't close %s after writing: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:535
+#, perl-format
+msgid "Can't read Po4a header from %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:540
+#, perl-format
+msgid "First line of %s does not look like a Po4a header."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:545
+#, perl-format
+msgid "Syntax error in Po4a header of %s, near \"%s\""
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:559
+#, perl-format
+msgid "Invalid argument in the Po4a header of %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:565
+#, perl-format
+msgid "The Po4a header of %s does not define the mode."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:569
+#, perl-format
+msgid ""
+"Mode invalid in the Po4a header of %s: should be 'before' or 'after' not %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:574
+#, perl-format
+msgid "The Po4a header of %s does not define the position."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:578
+msgid "No ending boundary given in the Po4a header, but mode=after."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:604
+msgid "Can't apply addendum when not given the filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:607
+#, perl-format
+msgid "Addendum %s does not exist."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:628
+#, perl-format
+msgid "No candidate position for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:633
+#, perl-format
+msgid "More than one candidate position found for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:639
+#: ../../lib/Locale/Po4a/TransTractor.pm:662
+#, perl-format
+msgid "Addendum '%s' applied before this line: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:669
+#, perl-format
+msgid "Addendum '%s' applied after the line: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:676
+#, perl-format
+msgid "Addendum '%s' applied at the end of the file."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:836
+#: ../../lib/Locale/Po4a/TransTractor.pm:1012
+#, perl-format
+msgid ""
+"Couldn't determine the input document's charset. Please specify it on the "
+"command line. (non-ascii char at %s)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Wml.pm:88
+#, perl-format
+msgid "Can't create a temporary xml file: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:425
+#, perl-format
+msgid "Internal error: unknown type identifier '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:590
+#, perl-format
+msgid "Bad document type. '%s' expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:662 ../../lib/Locale/Po4a/Xml.pm:1106
+#, perl-format
+msgid ""
+"Unexpected closing tag </%s> found. The main document may be wrong.  "
+"Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:664 ../../lib/Locale/Po4a/Xml.pm:1108
+#, perl-format
+msgid "Unexpected closing tag </%s> found. The main document may be wrong."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1004
+#, perl-format
+msgid "Content of attribute %s excluded: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1013
+msgid "Bad attribute syntax"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1323
+#, perl-format
+msgid "Content of tag %s excluded: %s"
+msgstr ""
+
+#: ../../po4a:494 ../../po4a:670
+#, perl-format
+msgid "Unparsable argument '%s' (%s)."
+msgstr ""
+
+#: ../../po4a:528
+#, perl-format
+msgid "failed to execute '%s': %s."
+msgstr ""
+
+#: ../../po4a:532
+#, perl-format
+msgid "'%s' died with signal %d, with coredump."
+msgstr ""
+
+#: ../../po4a:536
+#, perl-format
+msgid "'%s' died with signal %d, without coredump."
+msgstr ""
+
+#: ../../po4a:541
+#, perl-format
+msgid "'%s' exited with value %d."
+msgstr ""
+
+#: ../../po4a:545
+#, perl-format
+msgid "Error: %s"
+msgstr ""
+
+#: ../../po4a:551 ../../po4a-gettextize:197 ../../po4a-normalize:140
+#: ../../po4a-translate:204 ../../po4a-translate:205 ../../po4a-updatepo:192
+#: ../../scripts/msguntypot:171 ../../scripts/msguntypot:173
+#, perl-format
+msgid "File %s does not exist."
+msgstr ""
+
+#: ../../po4a:573
+#, perl-format
+msgid "Unknown variable: %s"
+msgstr ""
+
+#: ../../po4a:582
+#, perl-format
+msgid "Syntax error: %s"
+msgstr ""
+
+#: ../../po4a:609 ../../po4a:621
+#, perl-format
+msgid "'%s' redeclared"
+msgstr ""
+
+#: ../../po4a:614
+#, perl-format
+msgid "Unparsable argument '%s'."
+msgstr ""
+
+#: ../../po4a:628
+#, perl-format
+msgid ""
+"The '%s' master file was specified earlier in the configuration file.  This "
+"may cause problems with options."
+msgstr ""
+
+#: ../../po4a:674
+msgid "The translated and master file are the same."
+msgstr ""
+
+#: ../../po4a:681
+#, perl-format
+msgid "Translation of %s in %s redefined"
+msgstr ""
+
+#: ../../po4a:703
+#, perl-format
+msgid "Unparsable command '%s'."
+msgstr ""
+
+#: ../../po4a:709
+msgid "po4a_paths not declared. Dunno where to find the pot and po files"
+msgstr ""
+
+#: ../../po4a:746
+msgid "Splitted mode, creating a temporary POT"
+msgstr ""
+
+#: ../../po4a:781 ../../po4a:914 ../../po4a-updatepo:220
+#, perl-format
+msgid "Updating %s:"
+msgstr ""
+
+#: ../../po4a:784 ../../po4a:924 ../../po4a-updatepo:228
+#, perl-format
+msgid "Creating %s:"
+msgstr ""
+
+#: ../../po4a:831 ../../po4a:861 ../../po4a:948 ../../po4a-updatepo:202
+#, perl-format
+msgid "Can't create a temporary pot file: %s"
+msgstr ""
+
+#: ../../po4a:842
+#, perl-format
+msgid " (%d entries)"
+msgstr ""
+
+#: ../../po4a:868 ../../po4a:974
+#, perl-format
+msgid "Can't create directory '%s': %s"
+msgstr ""
+
+#: ../../po4a:888 ../../scripts/msguntypot:208
+#, perl-format
+msgid "Can't create a temporary po file: %s"
+msgstr ""
+
+#: ../../po4a:1038
+#, perl-format
+msgid "%s doesn't need to be updated."
+msgstr ""
+
+#: ../../po4a:1079
+#, perl-format
+msgid "Discard %s (%s of %s strings; only %s%% translated; need %s%%)."
+msgstr ""
+
+#: ../../po4a:1086
+#, perl-format
+msgid "Timestamp %s created."
+msgstr ""
+
+#: ../../po4a:1096
+#, perl-format
+msgid "Timestamp %s removed."
+msgstr ""
+
+#: ../../po4a:1105
+#, perl-format
+msgid "Addendum %s does NOT apply to %s (translation discarded)."
+msgstr ""
+
+#: ../../po4a:1114
+#, perl-format
+msgid "%s is %s%% translated (%s strings)."
+msgstr ""
+
+#: ../../po4a:1117 ../../po4a-translate:236
+#, perl-format
+msgid "%s is %s%% translated (%s of %s strings)."
+msgstr ""
+
+#: ../../po4a-translate:242
+#, perl-format
+msgid "Discard the translation of %s (only %s%% translated; need %s%%)."
+msgstr ""
+
+#: ../../po4a-translate:249
+#, perl-format
+msgid "Discard the translation of %s (addendum %s does not apply)."
+msgstr ""
+
+#: ../../po4a-updatepo:193
+msgid "po4a-updatepo can't take the input po from stdin."
+msgstr ""
+
+#: ../../po4a-updatepo:205
+msgid "Parse input files... "
+msgstr ""
+
+#: ../../po4a-updatepo:215
+msgid "done."
+msgstr ""
+
+#: ../../po4a-updatepo:224 ../../scripts/msguntypot:217
+#, perl-format
+msgid "Error while running msgmerge: %s"
+msgstr ""
+
+#: ../../po4a-updatepo:231
+#, perl-format
+msgid "Error while copying the po file: %s"
+msgstr ""
+
+#: ../../scripts/msguntypot:170 ../../scripts/msguntypot:172
+#, perl-format
+msgid "Mandatory argument '%s' missing."
+msgstr ""
+
+#: ../../scripts/msguntypot:181
+#, perl-format
+msgid ""
+"The new and old pot files have different amount of strings (%d != %d). "
+"Something's seriously wrong here."
+msgstr ""
+
+#: ../../scripts/msguntypot:199
+#, perl-format
+msgid "Found %d modified entries."
+msgstr ""
+
+#: ../../scripts/msguntypot:213
+#, perl-format
+msgid "Handling %s"
+msgstr ""
+
+#: ../../scripts/msguntypot:238
+#, perl-format
+msgid "Modified %d entries in %d files."
+msgstr ""

Added: po4a/po/bin/ca.po
===================================================================
--- po4a/po/bin/ca.po	                        (rev 0)
+++ po4a/po/bin/ca.po	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1037 @@
+# Catalan translation of po4a
+# This file is distributed under the same license as the po4a package.
+# Jordi Vilalta <jvprat@xxxxxxxxx>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: po4a bin\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-12 13:53+0200\n"
+"PO-Revision-Date: 2007-08-12 19:43+0200\n"
+"Last-Translator: Jordi Vilalta Prat <jvprat@xxxxxxxxx>\n"
+"Language-Team: CA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:27
+msgid "Need to provide a module name"
+msgstr "Cal indicar un nom de mul"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:46
+#, perl-format
+msgid "Unknown format type: %s."
+msgstr "Tipus de format desconegut: %s."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:48
+#, perl-format
+msgid "Module loading error: %s"
+msgstr "Error al carregar el mul: %s"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:57
+msgid "List of valid formats:"
+msgstr "Llista de formats v$B_M(Bids:"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:59
+msgid "dia: uncompressed Dia diagrams."
+msgstr "dia: diagrames de Dia descomprimits."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:60
+msgid "docbook: Docbook XML."
+msgstr "docbook: Docbook XML."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:61
+msgid "guide: Gentoo Linux's xml documentation format."
+msgstr "guide: format xml de la documentacide Gentoo Linux."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:63
+msgid "ini: .INI format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:64
+msgid "kernelhelp: Help messages of each kernel compilation option."
+msgstr "kernelhelp: L'ajuda de les opcions de compilacidel kernel."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:65
+msgid "latex: LaTeX format."
+msgstr "latex: format LaTeX."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:66
+msgid "man: Good old manual page format."
+msgstr "man: El format cl$B_T(Bsic de les p$B_H(Bines de manual."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:67
+msgid "pod: Perl Online Documentation format."
+msgstr "pod: Format de la DocumentaciOnline de Perl."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:68
+msgid "sgml: either debiandoc or docbook DTD."
+msgstr "sgml: ja sigui el DTD de debiandoc o el de docbook."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:69
+msgid "texinfo: The info page format."
+msgstr "texinfo: El format les p$B_H(Bines info."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:70
+msgid "tex: generic TeX documents (see also latex)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:71
+msgid "text: simple text document."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:73
+msgid "xhtml: XHTML documents."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:74
+msgid "xml: generic XML documents (see also docbook)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Common.pm:82
+#, perl-format
+msgid ""
+"%s version %s.\n"
+"written by Martin Quinson and Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"This is free software; see source code for copying\n"
+"conditions. There is NO warranty; not even for\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+"%s versi%s.\n"
+"escrit per Martin Quinson i Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"Aix$BqT(B software lliure; mireu el codi font per les condicions\n"
+"de cia. No es da CAP garantia; ni tan sols per finalitats\n"
+"COMERCIALS o ADAPTACI$B%b(B A UN PROP$B%a(BSIT PARTICULAR."
+
+#: ../../lib/Locale/Po4a/Debconf.pm:171
+#, perl-format
+msgid "Translated field in master document: %s"
+msgstr "Camp tradu en el document principal: %s"
+
+#: ../../lib/Locale/Po4a/KernelHelp.pm:104
+msgid "Syntax error"
+msgstr "Error de sintaxi"
+
+#: ../../lib/Locale/Po4a/Man.pm:456 ../../lib/Locale/Po4a/Po.pm:153
+#: ../../lib/Locale/Po4a/Sgml.pm:243 ../../lib/Locale/Po4a/TeX.pm:1612
+#: ../../lib/Locale/Po4a/Xml.pm:322
+#, perl-format
+msgid "Unknown option: %s"
+msgstr "Opcidesconeguda: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:473
+msgid ""
+"Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."
+msgstr ""
+"Valor 'groff_code' no v$B_M(Bid. Hauria de ser un d'aquests 'fail', 'verbatim', "
+"'translate'."
+
+#: ../../lib/Locale/Po4a/Man.pm:520
+msgid ""
+"The no_wrap parameters must be a set of comma-separated begin:end couples.\n"
+msgstr ""
+"Els par$B_N(Betres de no_wrap han de ser un conjunt de parelles inici:final "
+"separades per comes.\n"
+
+#: ../../lib/Locale/Po4a/Man.pm:566
+msgid "Invalid 'unknown_macros' value. Must be one of:\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:620
+msgid ""
+"This file was generated with Pod::Man. Translate the pod file with the pod "
+"module of po4a."
+msgstr ""
+"Aquest fitxer ha sigut generat amb Pod::Man. Tradueixi el fitxer pod amb el "
+"mul pod de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:623
+msgid ""
+"This file was generated with help2man. Translate the source file with the "
+"regular gettext."
+msgstr ""
+"Aquest fitxer ha sigut generat amb help2man. Tradueixi el fitxer font amb el "
+"gettext habitual."
+
+#: ../../lib/Locale/Po4a/Man.pm:625
+msgid ""
+"This file was generated with docbook-to-man. Translate the source file with "
+"the sgml module of po4a."
+msgstr ""
+"Aquest fitxer ha sigut generat amb docbook-to-man. Tradueixi el fitxer font "
+"amb el mul sgml de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:628
+msgid ""
+"This file was generated with docbook2man. Translate the source file with the "
+"sgml module of po4a."
+msgstr ""
+"Aquest fitxer ha sigut generat amb docbook2man. Tradueixi el fitxer font amb "
+"el mul sgml de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:632 ../../lib/Locale/Po4a/Man.pm:640
+#, perl-format
+msgid ""
+"This file was generated with %s. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Aquest fitxer ha sigut generat amb %s. S'hauria de traduir el fitxer font, "
+"peres procedeix de totes maneres."
+
+#: ../../lib/Locale/Po4a/Man.pm:636
+msgid ""
+"This file was generated with db2man.xsl. Translate the source file with the "
+"xml module of po4a."
+msgstr ""
+"Aquest fitxer ha sigut generat amb db2man.xsl. Tradueixi el fitxer font amb "
+"el mul xml de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:646
+#, perl-format
+msgid ""
+"This file contains the line '%s'. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Aquest fitxer contla l$ByO(Bia '%s'. S'hauria de traduir el fitxer font, per"
+"es procedeix de totes maneres."
+
+#: ../../lib/Locale/Po4a/Man.pm:708
+#, perl-format
+msgid ""
+"Font modifiers followed by a command may disturb po4a.  You should either "
+"remove the font modifier '%s', or integrate a \\f font modifier in the "
+"following command ('%s'), but continuing anyway."
+msgstr ""
+"Els modificadors de font seguits per una comanda poden confondre al po4a.  "
+"Haur$ByF(Bu d'eliminar el modificador de font '%s', o bintegrar un modificador "
+"de font \\f a la segnt comanda ('%s'), perse segueix de totes maneres."
+
+#: ../../lib/Locale/Po4a/Man.pm:813
+msgid ""
+"The unshiftline is not supported for the man module. Please send a bug "
+"report with the groff page that generated this error."
+msgstr ""
+"El mul man no tsuport per a unshiftline. Envieu un informe d'error amb "
+"la p$B_H(Bina de groff que ha generat aquest error."
+
+#: ../../lib/Locale/Po4a/Man.pm:856
+#, perl-format
+msgid ""
+"macro %s called without arguments. Even if placing the macro arguments on "
+"the next line is authorized by man(7), handling this would make the po4a "
+"parser too complicate. Please simply put the macro args on the same line."
+msgstr ""
+"s'ha cridat la macro %s sense par$B_N(Betres. Malgrat man(7) autoritza posar els "
+"par$B_N(Betres a la propera l$ByO(Bia, tractar aquest cas faria l'analitzador de "
+"po4a massa complicat. Simplement poseu els par$B_N(Betres de la macro a la "
+"mateixa l$ByO(Bia."
+
+#: ../../lib/Locale/Po4a/Man.pm:884
+msgid "Escape sequence \\c encountered. This is not completely handled yet."
+msgstr ""
+"S'ha trobat la seqncia d'escapada \\c. El seu tractament encara no $BqT(B "
+"complet."
+
+#: ../../lib/Locale/Po4a/Man.pm:1047
+#, perl-format
+msgid "Unbalanced '<' and '>' in font modifier. Faulty message: %s"
+msgstr ""
+"Etiqueta '<' and '>'sense balancejar al modificador de font. Missatge "
+"d'error: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1224
+#, perl-format
+msgid "Unparsable line: %s"
+msgstr "No s'ha pogut analitzar la l$ByO(Bia: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1297
+#, perl-format
+msgid ""
+"Unknown macro '%s'. Remove it from the document, or refer to the Locale::"
+"Po4a::Man manpage to see how po4a can handle new macros."
+msgstr ""
+"Macro '%s' desconeguda. Elimineu-la del document, o mireu la p$B_H(Bina de "
+"manual Locale::Po4a::Man per veure com po4a pot tractar noves macros."
+
+#: ../../lib/Locale/Po4a/Man.pm:1508
+msgid ""
+"Escaped space at the end of macro arg. With high probability, it won't do "
+"the trick with po4a (because of wrapping). You may want to remove it and use "
+"the .nf/.fi groff macro to control the wrapping."
+msgstr ""
+"Espai saltat al final del par$B_N(Betre de la macro. Molt probablement, no far"
+"la seva feina amb po4a (degut al justificat). Segurament li interessar"
+"eliminar-lo i utilitzar les macros .nf/.fi de groff per controlar el "
+"justificat."
+
+#: ../../lib/Locale/Po4a/Man.pm:1682
+#, perl-format
+msgid "Unsupported font in: '%s'."
+msgstr "Font no suportada a: '%s'."
+
+#: ../../lib/Locale/Po4a/Man.pm:2031
+msgid ""
+"This page defines a new macro with '.de'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+"Aquesta p$B_H(Bina defineix una nova macro amb '.de'. Com po4a no $BqT(B un "
+"analitzador de groff real, aixno estsuportat."
+
+#: ../../lib/Locale/Po4a/Man.pm:2097
+msgid "The .ie macro must be followed by a .el macro."
+msgstr "La macro .ie ha d'anar seguida d'una macro .el."
+
+#: ../../lib/Locale/Po4a/Man.pm:2123
+#, perl-format
+msgid ""
+"This page uses conditionals with '%s'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+"Aquesta p$B_H(Bina utilitza condicionals amb '%s'. Com po4a no $BqT(B un analitzador "
+"de groff, aixno estsuportat."
+
+#: ../../lib/Locale/Po4a/Man.pm:2164
+#, perl-format
+msgid ""
+"This page includes another file with '%s'. Do not forget to translate this "
+"file ('%s')."
+msgstr ""
+"Aquesta p$B_H(Bina inclou un altre fitxer amb '%s'. No us oblideu de traduir "
+"aquest fitxer ('%s')."
+
+#: ../../lib/Locale/Po4a/Man.pm:2280
+#, perl-format
+msgid ""
+"This page uses the '%s' request with the number of lines in argument. This "
+"is not supported yet."
+msgstr ""
+"Aquesta p$B_H(Bina utilitza la petici'%s' amb el n$By2(Bero de l$ByO(Bies com a "
+"par$B_N(Betre. Aixno estsuportat (encara)."
+
+#: ../../lib/Locale/Po4a/Man.pm:2295
+#, perl-format
+msgid ""
+"This page uses the '%s' request. This request is only supported when no "
+"argument is provided."
+msgstr ""
+"Aquesta p$B_H(Bina utilitza la petici'%s'.  Aquesta nom$BqT(B estsuportada quan "
+"no se li passen par$B_N(Betres."
+
+#: ../../lib/Locale/Po4a/NewsDebian.pm:87
+msgid "Begin of a new entry before the end of previous one"
+msgstr "Comen$BmB(B una nova entrada abans d'acabar l'anterior"
+
+#: ../../lib/Locale/Po4a/Po.pm:159
+#, perl-format
+msgid ""
+"Invalid value for option 'porefs' ('%s' is not one of 'full', 'noline' or "
+"'none')"
+msgstr ""
+"Valor no v$B_M(Bid per a l'opci'porefs' ('%s' no $BqT(B un dels 'full', 'noline' o "
+"'none')"
+
+#: ../../lib/Locale/Po4a/Po.pm:204
+msgid "Please provide a non-null filename"
+msgstr "Si us plau, prove un nom de fitxer no nul"
+
+#: ../../lib/Locale/Po4a/Po.pm:211 ../../lib/Locale/Po4a/TeX.pm:913
+#: ../../lib/Locale/Po4a/TransTractor.pm:396
+#: ../../lib/Locale/Po4a/TransTractor.pm:530
+#: ../../lib/Locale/Po4a/Xhtml.pm:135 ../../lib/Locale/Po4a/Xml.pm:83
+#, perl-format
+msgid "Can't read from %s: %s"
+msgstr "No s'ha pogut llegir de %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:250
+#, perl-format
+msgid "Strange line: -->%s<--"
+msgstr "L$ByO(Bia estranya: -->%s<--"
+
+#: ../../lib/Locale/Po4a/Po.pm:275 ../../lib/Locale/Po4a/Po.pm:392
+#: ../../lib/Locale/Po4a/TransTractor.pm:430
+msgid "Can't write to a file without filename"
+msgstr "No es pot escriure a un fitxer sense nom"
+
+#: ../../lib/Locale/Po4a/Po.pm:290 ../../lib/Locale/Po4a/TransTractor.pm:445
+#, perl-format
+msgid "Can't write to %s: %s"
+msgstr "No s'ha pogut escriure a %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:366
+#, fuzzy, perl-format
+msgid "Can't unlink %s: %s."
+msgstr "No s'ha pogut esborrar %s."
+
+#: ../../lib/Locale/Po4a/Po.pm:374 ../../po4a:987
+#, fuzzy, perl-format
+msgid "Can't copy %s to %s: %s."
+msgstr "No s'ha pogut moure %s a %s."
+
+#: ../../lib/Locale/Po4a/Po.pm:379 ../../lib/Locale/Po4a/Po.pm:384
+#: ../../po4a:994
+#, fuzzy, perl-format
+msgid "Can't move %s to %s: %s."
+msgstr "No s'ha pogut moure %s a %s."
+
+#: ../../lib/Locale/Po4a/Po.pm:424
+msgid ""
+"\n"
+"The gettextization failed (once again). Don't give up, gettextizing is a "
+"subtle art, but this is only needed once to convert a project to the "
+"gorgeous luxus offered by po4a to translators.\n"
+"Please refer to the po4a(7) documentation, the section \"HOWTO convert a pre-"
+"existing translation to po4a?\" contains several hints to help you in your "
+"task"
+msgstr ""
+"\n"
+"Ha fallat la gettextitzaci(una altra vegada). No abandoneu, gettextitzar "
+"$BqT(B un art subtil, pernom$BqT(B s'ha de fer una vegada per convertir el "
+"projecte al meravell luxe ofert per po4a als traductors.\n"
+"Si us plau, mireu la documentacipo4a(7), la secci\"Com convertir una "
+"traduccipre-existent a po4a?\" inclou alguns suggerimets."
+
+#: ../../lib/Locale/Po4a/Po.pm:434
+#, perl-format
+msgid ""
+"Original has more strings than the translation (%d>%d). Please fix it by "
+"editing the translated version to add some dummy entry."
+msgstr ""
+"L'original tm$BqT(B cadenes que la traducci(%d>%d). Arregleu-ho editant la "
+"versitradua afegint algunes entrades difuses."
+
+#: ../../lib/Locale/Po4a/Po.pm:440
+#, perl-format
+msgid ""
+"Original has less strings than the translation (%d<%d). Please fix it by "
+"removing the extra entry from the translated file. You may need an addendum "
+"(cf po4a(7)) to reput the chunk in place after gettextization. A possible "
+"cause is that a text duplicated in the original is not translated the same "
+"way each time. Remove one of the translations, and you're fine."
+msgstr ""
+"L'original tmenys cadenes que la traducci(%d<%d). Si us plau, arregleu-"
+"ho treient les entrades extra del fitxer tradu. Probablement necessiteu un "
+"annex (consulteu po4a(7)) per tornar a inserir el fragment despr$BqT(B de la "
+"gettextitzaci Una causa possible $BqT(B que un text duplicat en l'original no "
+"estigui sempre tradu igual. Elimineu una de les traduccions, i ja hauria "
+"d'estar."
+
+#: ../../lib/Locale/Po4a/Po.pm:493
+#, perl-format
+msgid ""
+"po4a gettextization: Structure disparity between original and translated "
+"files:\n"
+"msgid (at %s) is of type '%s' while\n"
+"msgstr (at %s) is of type '%s'.\n"
+"Original text: %s\n"
+"Translated text: %s\n"
+"(result so far dumped to gettextization.failed.po)"
+msgstr ""
+"po4a gettextization: L'estructura del fitxer original i del tradu "
+"difereixen:\n"
+"msgid (a %s) $BqT(B del tipus '%s' mentre que\n"
+"msgstr (a %s) $BqT(B del tipus '%s'.\n"
+"Text original: %s\n"
+"Text tradu: %s\n"
+"(el resultat fins al moment s'ha desat a gettextization.failed.po)"
+
+#: ../../lib/Locale/Po4a/Po.pm:701
+#, perl-format
+msgid "Eval failure: %s"
+msgstr "Ha fallat l'avaluaci %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:1024
+#, perl-format
+msgid "msgid defined twice: %s"
+msgstr "msgid definit m$BqT(B d'una vegada: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:1044
+#, perl-format
+msgid ""
+"Translations don't match for:\n"
+"%s\n"
+"-->First translation:\n"
+"%s\n"
+" Second translation:\n"
+"%s\n"
+" Old translation discarded."
+msgstr ""
+"Les traduccions no encaixen per:\n"
+"%s\n"
+"-->Primera traducci\n"
+"%s\n"
+" Segona traducci\n"
+"%s\n"
+" S'ha descartat la traduccivella."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:209
+msgid ""
+"The needed module SGMLS.pm was not found and needs to be installed. It can "
+"be found on the CPAN, in package libsgmls-perl on debian, etc."
+msgstr ""
+"No s'ha trobat el mul SGMLS.pm i es necessita instal$B%-(Blat. El pot trobar al "
+"CPAN, en el paquet libsgmls-perl de debian, etc."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:277
+msgid "msgid skipped to help translators (contains only an entity)"
+msgstr "msgid saltat per ajudar als traductors (tan sols contuna entitat)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:284
+msgid "msgid skipped to help translators (contains only tags)"
+msgstr "msgid saltat per ajudar als traductors (tan sols conttags)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:292
+msgid ""
+"msgid skipped to help translators (contains only opening or closing tags of "
+"marked sections)"
+msgstr ""
+"msgid saltat per ajudar als traductors (tan sols contetiquetes d'obertura "
+"i de tancada de les seccions marcades)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:369
+msgid ""
+"Trying to handle a XML document as a SGML one. Feel lucky if it works, help "
+"us implementing a proper XML backend if it does not."
+msgstr ""
+"Intentant analitzar un document XML com a SGML. Senti's afortunat si "
+"funciona, sin ajudi'ns a implementar un backend propi per a XML."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:382
+msgid ""
+"This file is not a master SGML document (no DOCTYPE). It may be a file to be "
+"included by another one, in which case it should not be passed to po4a "
+"directly. Text from included files is extracted/translated when handling the "
+"master file including them."
+msgstr ""
+"Aquest fitxer no $BqT(B un document SGML principal (no contDOCTYPE). Deu ser "
+"un fitxer a ser incl en un altre. En aquest cas, no s'hauria de passar "
+"directament a po4a. El text dels fitxers inclosos $BqT(B extret/tradu quan es "
+"tracta el fitxer principal, incloent-los."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:501
+msgid "DTD of this file is unknown, but proceeding as requested."
+msgstr ""
+"El DTD d'aquest fitxer $BqT(B desconegut, peres procedeix tal com s'ha "
+"sol$B%-(Blicitat."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:505
+msgid ""
+"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog "
+"follows:"
+msgstr ""
+"El DTD d'aquest fitxer $BqT(B desconegut. (suportats: debiandoc, docbook). El "
+"pr$Brl(Beg segueix:"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:599 ../../lib/Locale/Po4a/Sgml.pm:681
+#, perl-format
+msgid "Can't open %s (content of entity %s%s;): %s"
+msgstr "No s'ha pogut obrir %s (contingut de l'entitat %s%s;): %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:652
+#, perl-format
+msgid "unrecognized prolog inclusion entity: %%%s;"
+msgstr "entitat d'inclussien el pr$Brl(Beg no reconeguda: %%%s;"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:769
+#, perl-format
+msgid "Can't close tempfile: %s"
+msgstr "No s'ha pogut tancar el fitxer temporal: %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:775
+#, perl-format
+msgid "Can't run nsgmls: %s"
+msgstr "No s'ha pogut executar nsgmls: %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:890
+#, perl-format
+msgid "Unknown tag %s"
+msgstr "Tag %s desconegut"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:924
+#, perl-format
+msgid "bad translation '%s' for '%s' in '%s'"
+msgstr "mala traducci'%s' per a '%s' a '%s'"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:979 ../../lib/Locale/Po4a/Sgml.pm:1057
+#, perl-format
+msgid "Closing tag for a translation container missing before %s"
+msgstr ""
+"Falta el tag de tancament per al contenidor de la traducciabans de %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1140
+#, perl-format
+msgid "Unknown SGML event type: %s"
+msgstr "Tipus d'event SGML desconegut: %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1149
+msgid ""
+"Warning: nsgmls produced some errors.  This is usually caused by po4a, which "
+"modifies the input and restores it afterwards, causing the input of nsgmls "
+"to be invalid.  This is usually safe, but you may wish to verify the "
+"generated document with nsgmls -wno-valid.  Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:501 ../../lib/Locale/Po4a/TeX.pm:581
+#, perl-format
+msgid "un-balanced %s in '%s'"
+msgstr "%s desbalancejats a '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:515 ../../lib/Locale/Po4a/TeX.pm:599
+#, perl-format
+msgid "Error while checking the number of arguments of the '%s' command: %s"
+msgstr ""
+"Error mentre es comprovava el nombre de par$B_N(Betres de la comanda '%s': %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:764 ../../lib/Locale/Po4a/TeX.pm:861
+#, perl-format
+msgid "Unknown command: '%s'"
+msgstr "Comanda desconeguda: '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:907 ../../lib/Locale/Po4a/TransTractor.pm:392
+msgid "Can't read from file without having a filename"
+msgstr "No es pot llegir d'un fitxer sense nom"
+
+#: ../../lib/Locale/Po4a/TeX.pm:982 ../../lib/Locale/Po4a/TransTractor.pm:417
+#: ../../lib/Locale/Po4a/Xhtml.pm:144 ../../lib/Locale/Po4a/Xml.pm:92
+#, perl-format
+msgid "Can't close %s after reading: %s"
+msgstr "No s'ha pogut tancar %s despr$BqT(B de llegir: %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1017 ../../po4a:560
+#, perl-format
+msgid "Can't open %s: %s"
+msgstr "No s'ha pogut obrir %s: %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1055
+#, perl-format
+msgid "Cannot use an alias to the unknown command '%s'"
+msgstr "No es pot utilitzar un alias a la comanda desconeguda '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1061
+#, perl-format
+msgid ""
+"You are using the old definitions format (%s).  Please update this "
+"definition line."
+msgstr ""
+"Est$B_T(B fent servir el format de definicions antic (%s).Si us plau actualitza "
+"aquesta l$ByO(Bia definici"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1264 ../../lib/Locale/Po4a/TeX.pm:1518
+#, perl-format
+msgid "unknown environment: '%s'"
+msgstr "entorn desconegut: '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1286
+#, perl-format
+msgid "unmatched end of environment '%s'"
+msgstr "final de l'entorn '%s' desaparellat"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1332 ../../lib/Locale/Po4a/TeX.pm:1444
+#, perl-format
+msgid "Wrong number of arguments for the '%s' command."
+msgstr "Nombre de par$B_N(Betres incorrecte per a la comanda '%s'."
+
+#: ../../lib/Locale/Po4a/TeX.pm:1345 ../../lib/Locale/Po4a/TeX.pm:1457
+#: ../../lib/Locale/Po4a/TeX.pm:1545
+msgid "An optional argument was provided, but a mandatory one is expected."
+msgstr "S'ha passat un par$B_N(Betre opcional, perse n'esperava un d'obligatori."
+
+#: ../../lib/Locale/Po4a/TeX.pm:1349 ../../lib/Locale/Po4a/TeX.pm:1461
+#, perl-format
+msgid "Command '%s': %s"
+msgstr "Comanda '%s': %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1403
+#, perl-format
+msgid "register_generic_command: unsupported format: '%s'."
+msgstr "register_generic_command: format no suportat: '%s'."
+
+#: ../../lib/Locale/Po4a/TeX.pm:1512
+msgid "The first argument of \\begin is mandatory."
+msgstr "El primer par$B_N(Betre de \\begin $BqT(B obligatori."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:452
+#, perl-format
+msgid "Can't close %s after writing: %s"
+msgstr "No s'ha pogut tancar %s despr$BqT(B d'escriure: %s"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:535
+#, perl-format
+msgid "Can't read Po4a header from %s."
+msgstr "No s'ha pogut llegir una cap$BmB(Blera Po4a de %s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:540
+#, perl-format
+msgid "First line of %s does not look like a Po4a header."
+msgstr "La primera l$ByO(Bia de %s no sembla ser una cap$BmB(Blera Po4a."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:545
+#, perl-format
+msgid "Syntax error in Po4a header of %s, near \"%s\""
+msgstr "Error de sintaxi a la cap$BmB(Blera Po4a de %s, prop de \"%s\""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:559
+#, perl-format
+msgid "Invalid argument in the Po4a header of %s: %s"
+msgstr "Par$B_N(Betre inv$B_M(Bid en la cap$BmB(Blera Po4a de %s: %s"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:565
+#, perl-format
+msgid "The Po4a header of %s does not define the mode."
+msgstr "La cap$BmB(Blera Po4a de %s no defineix el mode."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:569
+#, perl-format
+msgid ""
+"Mode invalid in the Po4a header of %s: should be 'before' or 'after' not %s."
+msgstr ""
+"Mode inv$B_M(Bid a la cap$BmB(Blera Po4a de %s: hauria de ser 'before' o 'after', no "
+"%s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:574
+#, perl-format
+msgid "The Po4a header of %s does not define the position."
+msgstr "La cap$BmB(Blera Po4a de %s no defineix la posici"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:578
+msgid "No ending boundary given in the Po4a header, but mode=after."
+msgstr "No es da l$ByN(Bit al final en la cap$BmB(Blera Po4a, permode=after."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:604
+msgid "Can't apply addendum when not given the filename"
+msgstr "No es pot aplicar l'annex si no s'especifica el nom del fitxer"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:607
+#, perl-format
+msgid "Addendum %s does not exist."
+msgstr "L'annex %s no existeix."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:628
+#, perl-format
+msgid "No candidate position for the addendum %s."
+msgstr "No s'ha trobat cap posicicandidata per l'annex %s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:633
+#, perl-format
+msgid "More than one candidate position found for the addendum %s."
+msgstr "S'ha trobat m$BqT(B d'una posicicandidata per l'annex %s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:639
+#: ../../lib/Locale/Po4a/TransTractor.pm:662
+#, perl-format
+msgid "Addendum '%s' applied before this line: %s"
+msgstr "S'ha aplicat l'annex '%s' abans d'aquesta la l$ByO(Bia: %s"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:669
+#, perl-format
+msgid "Addendum '%s' applied after the line: %s."
+msgstr "S'ha aplicat l'annex '%s' despr$BqT(B de la l$ByO(Bia: %s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:676
+#, perl-format
+msgid "Addendum '%s' applied at the end of the file."
+msgstr "S'ha aplicat l'annex '%s' al final del fitxer."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:836
+#: ../../lib/Locale/Po4a/TransTractor.pm:1012
+#, perl-format
+msgid ""
+"Couldn't determine the input document's charset. Please specify it on the "
+"command line. (non-ascii char at %s)"
+msgstr ""
+"No s'ha pogut determinar el joc de caracters del document d'entrada. Si us "
+"plau, especifiqueu-ho a la l$ByO(Bia de comandes. (caracter no-ascii a %s)"
+
+#: ../../lib/Locale/Po4a/Wml.pm:88
+#, perl-format
+msgid "Can't create a temporary xml file: %s"
+msgstr "No s'ha pogut crear el fitxer xml temporal: %s"
+
+#: ../../lib/Locale/Po4a/Xml.pm:425
+#, perl-format
+msgid "Internal error: unknown type identifier '%s'."
+msgstr "Error intern: identificador de tipus '%s' desconegut."
+
+#: ../../lib/Locale/Po4a/Xml.pm:590
+#, perl-format
+msgid "Bad document type. '%s' expected."
+msgstr "Tipus de document incorrecte. S'esperava '%s'."
+
+#: ../../lib/Locale/Po4a/Xml.pm:662 ../../lib/Locale/Po4a/Xml.pm:1106
+#, fuzzy, perl-format
+msgid ""
+"Unexpected closing tag </%s> found. The main document may be wrong.  "
+"Continuing..."
+msgstr ""
+"S'ha trobat el tag de tancament </%s> inesperat. Pot ser que el document "
+"principal sigui incorrecte."
+
+#: ../../lib/Locale/Po4a/Xml.pm:664 ../../lib/Locale/Po4a/Xml.pm:1108
+#, perl-format
+msgid "Unexpected closing tag </%s> found. The main document may be wrong."
+msgstr ""
+"S'ha trobat el tag de tancament </%s> inesperat. Pot ser que el document "
+"principal sigui incorrecte."
+
+#: ../../lib/Locale/Po4a/Xml.pm:1004
+#, perl-format
+msgid "Content of attribute %s excluded: %s"
+msgstr "S'ha excl el contingut de l'atribut %s: %s"
+
+#: ../../lib/Locale/Po4a/Xml.pm:1013
+msgid "Bad attribute syntax"
+msgstr "Sintaxi d'atribut incorrecta"
+
+#: ../../lib/Locale/Po4a/Xml.pm:1323
+#, perl-format
+msgid "Content of tag %s excluded: %s"
+msgstr "S'ha excl el contingut del tag %s: %s"
+
+#: ../../po4a:494 ../../po4a:670
+#, perl-format
+msgid "Unparsable argument '%s' (%s)."
+msgstr "No s'ha pogut analitzar el par$B_N(Betre '%s' (%s)."
+
+#: ../../po4a:528
+#, perl-format
+msgid "failed to execute '%s': %s."
+msgstr "no s'ha pogut executar '%s': %s."
+
+#: ../../po4a:532
+#, perl-format
+msgid "'%s' died with signal %d, with coredump."
+msgstr "'%s' ha mort amb la senyal %d, amb coredump."
+
+#: ../../po4a:536
+#, perl-format
+msgid "'%s' died with signal %d, without coredump."
+msgstr "'%s' ha mort amb la senyal %d, sense coredump."
+
+#: ../../po4a:541
+#, perl-format
+msgid "'%s' exited with value %d."
+msgstr "'%s' ha sortit amb el valor %d."
+
+#: ../../po4a:545
+#, perl-format
+msgid "Error: %s"
+msgstr "Error: %s"
+
+#: ../../po4a:551 ../../po4a-gettextize:197 ../../po4a-normalize:140
+#: ../../po4a-translate:204 ../../po4a-translate:205 ../../po4a-updatepo:192
+#: ../../scripts/msguntypot:171 ../../scripts/msguntypot:173
+#, perl-format
+msgid "File %s does not exist."
+msgstr "El fitxer %s no existeix."
+
+#: ../../po4a:573
+#, perl-format
+msgid "Unknown variable: %s"
+msgstr "Variable desconeguda: %s"
+
+#: ../../po4a:582
+#, perl-format
+msgid "Syntax error: %s"
+msgstr "Error de sintaxi: %s"
+
+#: ../../po4a:609 ../../po4a:621
+#, perl-format
+msgid "'%s' redeclared"
+msgstr "'%s' redeclarat"
+
+#: ../../po4a:614
+#, perl-format
+msgid "Unparsable argument '%s'."
+msgstr "No s'ha pogut analitzar el par$B_N(Betre '%s'."
+
+#: ../../po4a:628
+#, perl-format
+msgid ""
+"The '%s' master file was specified earlier in the configuration file.  This "
+"may cause problems with options."
+msgstr ""
+"El fitxer principal '%s' ja s'havia especificat abans al fitxer de "
+"configuraci  Aixpot causar problemes amb les opcions."
+
+#: ../../po4a:674
+msgid "The translated and master file are the same."
+msgstr "El fitxer tradu i l'original s el mateix."
+
+#: ../../po4a:681
+#, perl-format
+msgid "Translation of %s in %s redefined"
+msgstr "S'ha redefinit la traduccide %s a %s"
+
+#: ../../po4a:703
+#, perl-format
+msgid "Unparsable command '%s'."
+msgstr "No s'ha pogut analitzar la comanda '%s'."
+
+#: ../../po4a:709
+msgid "po4a_paths not declared. Dunno where to find the pot and po files"
+msgstr "No s'ha declarat po4a_paths. No son trobar els fitxers pot i po."
+
+#: ../../po4a:746
+msgid "Splitted mode, creating a temporary POT"
+msgstr ""
+
+#: ../../po4a:781 ../../po4a:914 ../../po4a-updatepo:220
+#, perl-format
+msgid "Updating %s:"
+msgstr "Actualitzant %s:"
+
+#: ../../po4a:784 ../../po4a:924 ../../po4a-updatepo:228
+#, perl-format
+msgid "Creating %s:"
+msgstr "Creant %s:"
+
+#: ../../po4a:831 ../../po4a:861 ../../po4a:948 ../../po4a-updatepo:202
+#, perl-format
+msgid "Can't create a temporary pot file: %s"
+msgstr "No s'ha pogut crear el fitxer pot temporal: %s"
+
+#: ../../po4a:842
+#, perl-format
+msgid " (%d entries)"
+msgstr "(%d entrades)"
+
+#: ../../po4a:868 ../../po4a:974
+#, fuzzy, perl-format
+msgid "Can't create directory '%s': %s"
+msgstr "No s'ha pogut escriure a %s: %s"
+
+#: ../../po4a:888 ../../scripts/msguntypot:208
+#, perl-format
+msgid "Can't create a temporary po file: %s"
+msgstr "No s'ha pogut crear el fitxer po temporal: %s"
+
+#: ../../po4a:1038
+#, perl-format
+msgid "%s doesn't need to be updated."
+msgstr ""
+
+#: ../../po4a:1079
+#, perl-format
+msgid "Discard %s (%s of %s strings; only %s%% translated; need %s%%)."
+msgstr ""
+"%s descartat (%s cadenes de %s; nom$BqT(B hi ha un %s%% tradu; es necessita un "
+"%s%%)."
+
+#: ../../po4a:1086
+#, perl-format
+msgid "Timestamp %s created."
+msgstr ""
+
+#: ../../po4a:1096
+#, perl-format
+msgid "Timestamp %s removed."
+msgstr ""
+
+#: ../../po4a:1105
+#, perl-format
+msgid "Addendum %s does NOT apply to %s (translation discarded)."
+msgstr "L'annex %s NO es pot aplicar a %s (traduccidescartada)."
+
+#: ../../po4a:1114
+#, perl-format
+msgid "%s is %s%% translated (%s strings)."
+msgstr "%s esttradu en un %s%% (%s cadenes)"
+
+#: ../../po4a:1117 ../../po4a-translate:236
+#, perl-format
+msgid "%s is %s%% translated (%s of %s strings)."
+msgstr "%s esttradu en un %s%% (%s de %s cadenes)."
+
+#: ../../po4a-translate:242
+#, perl-format
+msgid "Discard the translation of %s (only %s%% translated; need %s%%)."
+msgstr ""
+"S'ha descartat la traduccide %s (tan sols hi ha un %s%% tradu; es "
+"necessita un %s%%)."
+
+#: ../../po4a-translate:249
+#, perl-format
+msgid "Discard the translation of %s (addendum %s does not apply)."
+msgstr "S'ha descartat la traduccide %s (no s'ha pogut aplicar l'annex %s)."
+
+#: ../../po4a-updatepo:193
+msgid "po4a-updatepo can't take the input po from stdin."
+msgstr "po4a-updatepo no pot agafar el fitxer po d'entrada de stdin."
+
+#: ../../po4a-updatepo:205
+msgid "Parse input files... "
+msgstr "Analitzant els fitxers d'entrada... "
+
+#: ../../po4a-updatepo:215
+msgid "done."
+msgstr "fet."
+
+#: ../../po4a-updatepo:224 ../../scripts/msguntypot:217
+#, perl-format
+msgid "Error while running msgmerge: %s"
+msgstr "Error durant l'execucide msgmerge: %s"
+
+#: ../../po4a-updatepo:231
+#, perl-format
+msgid "Error while copying the po file: %s"
+msgstr "Error mentre es copiava el fitxer po: %s"
+
+#: ../../scripts/msguntypot:170 ../../scripts/msguntypot:172
+#, perl-format
+msgid "Mandatory argument '%s' missing."
+msgstr "Falta el par$B_N(Betre obligatori '%s'."
+
+#: ../../scripts/msguntypot:181
+#, perl-format
+msgid ""
+"The new and old pot files have different amount of strings (%d != %d). "
+"Something's seriously wrong here."
+msgstr ""
+"Els fitxers pot nou i vell tenen diferent nombre de cadenes (%d != %d). "
+"Alguna cosa no ha estb"
+
+#: ../../scripts/msguntypot:199
+#, perl-format
+msgid "Found %d modified entries."
+msgstr "S'han trobat %d entrades modificades."
+
+#: ../../scripts/msguntypot:213
+#, perl-format
+msgid "Handling %s"
+msgstr "Tractant %s"
+
+#: ../../scripts/msguntypot:238
+#, perl-format
+msgid "Modified %d entries in %d files."
+msgstr "S'han modificat %d entrades a %d fitxers."
+
+#~ msgid ""
+#~ "Warning: nsgmls is missing or non-functional.  Please make sure that "
+#~ "nsgmls is present and does not produce any error (with the -wno-valid "
+#~ "option), and report a bug otherwise.  Continuing..."
+#~ msgstr ""
+#~ "Av$ByT(B: no s'ha trobat nsgmls o bno $BqT(B funcional.  Si us plau, assegureu-"
+#~ "vos que nsgmls estdisponible i no produeix cap error (amb l'opci-wno-"
+#~ "valid), i informeu de bug en cas contrari.  Seguint..."
+
+#~ msgid "Can't close %s: %s"
+#~ msgstr "No s'ha pogut tancar %s: %s"
+
+#~ msgid ""
+#~ "This page seems to be a mdoc(7) formatted one. This is not supported "
+#~ "(yet)."
+#~ msgstr ""
+#~ "Aquesta p$B_H(Bina sembla estar formatada amb mdoc(7). Aixno estsuportat "
+#~ "(encara)."
+
+#~ msgid "Unbalanced '<' and '>'"
+#~ msgstr "'<' i '>' desbalancejats"
+
+#~ msgid "Unknown function (%s) for '%s'"
+#~ msgstr "Funcidesconeguda (%s) per a '%s'"
+
+#~ msgid "wrong number of optional arguments for command '%s'"
+#~ msgstr "nombre de par$B_N(Betres opcionals incorrecte per a la comanda '%s'"

Added: po4a/po/bin/cs.po
===================================================================
--- po4a/po/bin/cs.po	                        (rev 0)
+++ po4a/po/bin/cs.po	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1030 @@
+# Czech translation of po4a
+# This file is distributed under the same license as the po4a package.
+# Vlastimil Skacel, 2005.
+# Martin Fr$B%J/L(Ba <flintik@xxxxxxxxx>, 2007
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: po4a bin\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-12 13:53+0200\n"
+"PO-Revision-Date: 2007-09-05 00:05+0200\n"
+"Last-Translator: Martin Fr$B%J/L(Ba <flintik@xxxxxxxxx>\n"
+"Language-Team: CS\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Export-Date: 2007-08-12 16:08:46+0000\n"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:27
+#, fuzzy
+msgid "Need to provide a module name"
+msgstr "Nebylo zad$B%F!#(Bno jm$B%F%%(Bno modulu"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:46
+#, perl-format
+msgid "Unknown format type: %s."
+msgstr "Nezn$B%F!#(Bm$B%F%9(B form$B%F!#(Bt: %s."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:48
+#, perl-format
+msgid "Module loading error: %s"
+msgstr "Nezda$B%JQJ(Blo se na$B%H:E%e(Bst modul: %s"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:57
+msgid "List of valid formats:"
+msgstr "Seznam platn$B%F%9(Bch form$B%F!#(Bt$B%J%C(B:"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:59
+msgid "dia: uncompressed Dia diagrams."
+msgstr "dia: nekomprimovan$B%F%%(B diagramy Dia."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:60
+msgid "docbook: Docbook XML."
+msgstr "docbook: XML docbook."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:61
+msgid "guide: Gentoo Linux's xml documentation format."
+msgstr "guide: xml dokimenta$B%H9O%F%e(B form$B%F!#(Bt Gentoo Linuxu."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:63
+msgid "ini: .INI format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:64
+msgid "kernelhelp: Help messages of each kernel compilation option."
+msgstr "kernelhelp: N$B%F!#(Bpov$B%HUE(Ba pro ka$B%J%;(Bdou z voleb p$B%JQJ(B kompilaci kernelu."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:65
+msgid "latex: LaTeX format."
+msgstr "latex: form$B%F!#(Bt LaTeX."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:66
+msgid "man: Good old manual page format."
+msgstr "man: star$B%F%9(B dobr$B%F%9(B form$B%F!#(Bt  manu$B%F!#(Blov$B%F%9(Bch str$B%F!#(Bnek."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:67
+msgid "pod: Perl Online Documentation format."
+msgstr "pod: form$B%F!#(Bt online dokumentace perlu (Perl Online Documentation)."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:68
+msgid "sgml: either debiandoc or docbook DTD."
+msgstr "sgml: bu$B%H(Bdebiandoc, nebo docbook DTD."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:69
+#, fuzzy
+msgid "texinfo: The info page format."
+msgstr "latex: form疸 LaTeX."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:70
+msgid "tex: generic TeX documents (see also latex)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:71
+msgid "text: simple text document."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:73
+msgid "xhtml: XHTML documents."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:74
+msgid "xml: generic XML documents (see also docbook)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Common.pm:82
+#, fuzzy, perl-format
+msgid ""
+"%s version %s.\n"
+"written by Martin Quinson and Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"This is free software; see source code for copying\n"
+"conditions. There is NO warranty; not even for\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+"%s. verze %s.\n"
+"vytvoYili Martin Quinson a Denis Barbier.\n"
+"\n"
+"Copyright (c) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"Toto je svobodnsoftware; informace o vytv畉enkopinaleznete \n"
+"ve zdrojovh k禔ech. Nejsou poskytov疣y }チDNノ z疵uky, a to ani na\n"
+"obchodovatelnost 
i vhodnost pou~itke konkr騁n匇u elu."
+
+#: ../../lib/Locale/Po4a/Debconf.pm:171
+#, perl-format
+msgid "Translated field in master document: %s"
+msgstr "PYelo~enpole v hlavn匇 dokumentu: %s"
+
+#: ../../lib/Locale/Po4a/KernelHelp.pm:104
+msgid "Syntax error"
+msgstr "Syntaktickchyba"
+
+#: ../../lib/Locale/Po4a/Man.pm:456 ../../lib/Locale/Po4a/Po.pm:153
+#: ../../lib/Locale/Po4a/Sgml.pm:243 ../../lib/Locale/Po4a/TeX.pm:1612
+#: ../../lib/Locale/Po4a/Xml.pm:322
+#, perl-format
+msgid "Unknown option: %s"
+msgstr "Nezn疥volba: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:473
+msgid ""
+"Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."
+msgstr ""
+"`patnhodnota 'groff_code'. Parametr mo~e nabat hodnoty 'fail', "
+"'verbatim' nebo 'translate'."
+
+#: ../../lib/Locale/Po4a/Man.pm:520
+#, fuzzy
+msgid ""
+"The no_wrap parameters must be a set of comma-separated begin:end couples.\n"
+msgstr ""
+"Parametry no_wrap musb mno~inou 
疵kou oddlenh p疵o za
疸ek:konec.\n"
+
+#: ../../lib/Locale/Po4a/Man.pm:566
+msgid "Invalid 'unknown_macros' value. Must be one of:\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:620
+msgid ""
+"This file was generated with Pod::Man. Translate the pod file with the pod "
+"module of po4a."
+msgstr ""
+"Tento soubor byl vytvoYen pomocaplikace Pod::Man. 'Pod' soubor pYekl疆ejte "
+"pomocmodulu 'pod' aplikace po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:623
+msgid ""
+"This file was generated with help2man. Translate the source file with the "
+"regular gettext."
+msgstr ""
+"Tento soubor byl vytvoYen pomocaplikace help2man. zdrojovsoubor "
+"pYekl疆ejte pomocregul疵n劜o gettextu."
+
+#: ../../lib/Locale/Po4a/Man.pm:625
+msgid ""
+"This file was generated with docbook-to-man. Translate the source file with "
+"the sgml module of po4a."
+msgstr ""
+"Tento soubor byl vytvoYen pomocaplikace docbook-to-man. Zdrojovsoubor "
+"pYekl疆ejte pomocmodulu sgml aplikace po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:628
+msgid ""
+"This file was generated with docbook2man. Translate the source file with the "
+"sgml module of po4a."
+msgstr ""
+"Tento soubor byl vytvoYen pomocaplikace docbook2man. Zdrojovsoubor "
+"pYekl疆ejte pomocmodulu sgml aplikace po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:632 ../../lib/Locale/Po4a/Man.pm:640
+#, perl-format
+msgid ""
+"This file was generated with %s. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Tento soubor byl vytvoYen pomocaplikace %s. Zdrojovsoubor by ml b "
+"pYelo~en, nicm駭 pYesto pokra
uji d疝."
+
+#: ../../lib/Locale/Po4a/Man.pm:636
+msgid ""
+"This file was generated with db2man.xsl. Translate the source file with the "
+"xml module of po4a."
+msgstr ""
+"Tento soubor byl vytvoYen pomocaplikace db2man.xsl. Zdrojovsoubor "
+"pYekl疆ejte pomocmodulu xml aplikace po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:646
+#, perl-format
+msgid ""
+"This file contains the line '%s'. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Tento soubor obsahuje Y疆ek '%s'. Zdrojovsoubor by ml b pYelo~en, "
+"nicm駭 pYesto pokra
uji d疝."
+
+#: ../../lib/Locale/Po4a/Man.pm:708
+#, fuzzy, perl-format
+msgid ""
+"Font modifiers followed by a command may disturb po4a.  You should either "
+"remove the font modifier '%s', or integrate a \\f font modifier in the "
+"following command ('%s'), but continuing anyway."
+msgstr ""
+"po4a nepodporuje modifik疸ory fontu n疽ledovanpY勛azem. Ml by b bu "
+"odstrannen modifik疸or fontu '%s', nebo za
lenn modifik疸or fontu /f do "
+"n疽leduj兤劜o pY勛azu ('%s')"
+
+#: ../../lib/Locale/Po4a/Man.pm:813
+msgid ""
+"The unshiftline is not supported for the man module. Please send a bug "
+"report with the groff page that generated this error."
+msgstr ""
+"'Unshiftline' nenv mudulu man podporov疣o. Zaalete, pros匇, chybov"
+"hl畭ens groff str疣kou, ktervygenerovala tuto chybu."
+
+#: ../../lib/Locale/Po4a/Man.pm:856
+#, perl-format
+msgid ""
+"macro %s called without arguments. Even if placing the macro arguments on "
+"the next line is authorized by man(7), handling this would make the po4a "
+"parser too complicate. Please simply put the macro args on the same line."
+msgstr ""
+"makro %s bylo spuatno bez parametro. Um﨎tnparametro na na n疽leduj兤"
+"Y疆ek je sice dovoleno v man(7), ale zapracov疣t騁o mo~nosti by po4a "
+"parser pY匀ia zkomplikovalo. Pros匇, vlo~te prost argumenty makra na stejn"
+"Y疆ek."
+
+#: ../../lib/Locale/Po4a/Man.pm:884
+msgid "Escape sequence \\c encountered. This is not completely handled yet."
+msgstr ""
+"Vyskytla se escape sekvence \\c. Tato mo~nost jeat nen侊ln "
+"implementov疣o."
+
+#: ../../lib/Locale/Po4a/Man.pm:1047
+#, perl-format
+msgid "Unbalanced '<' and '>' in font modifier. Faulty message: %s"
+msgstr ""
+"`patn zp疵ovanznaky '<' a '>' v modifik疸oru fontu. Chybnzpr疱a\" %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1224
+#, perl-format
+msgid "Unparsable line: %s"
+msgstr "NeanalyzovatelnY疆ek: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1297
+#, fuzzy, perl-format
+msgid ""
+"Unknown macro '%s'. Remove it from the document, or refer to the Locale::"
+"Po4a::Man manpage to see how po4a can handle new macros."
+msgstr ""
+"Nezn疥makro '%s'. OdstraHte jej z dokumentu, nebo poskytnte patch tu "
+"po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:1508
+msgid ""
+"Escaped space at the end of macro arg. With high probability, it won't do "
+"the trick with po4a (because of wrapping). You may want to remove it and use "
+"the .nf/.fi groff macro to control the wrapping."
+msgstr ""
+"Vynucenmezera na konci argumentu makra: Velice pravdpodobn toto nebude "
+"fungovat s po4a (kvoli zalamov疣. Pravdpodobn budete cht咜 tuto mezeru "
+"odstranit a pou~咜 makro groffu .nf/.fi pro Y坥enzalamov疣"
+
+#: ../../lib/Locale/Po4a/Man.pm:1682
+#, perl-format
+msgid "Unsupported font in: '%s'."
+msgstr "nepodporovanp﨎mo v: '%s'."
+
+#: ../../lib/Locale/Po4a/Man.pm:2031
+msgid ""
+"This page defines a new macro with '.de'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+"Tato str疣ka definuje novmakro pomoc'.de'. Jeliko~ toto nenskute
n"
+"groff parser, toto nenpodporov疣o."
+
+#: ../../lib/Locale/Po4a/Man.pm:2097
+msgid "The .ie macro must be followed by a .el macro."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2123
+#, perl-format
+msgid ""
+"This page uses conditionals with '%s'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+"Tato str疣ka pou~咩podm匤ky s '%s'. Jeliko~ toto nenskute
ngroff "
+"parser, toto nenpodporov疣o."
+
+#: ../../lib/Locale/Po4a/Man.pm:2164
+#, fuzzy, perl-format
+msgid ""
+"This page includes another file with '%s'. Do not forget to translate this "
+"file ('%s')."
+msgstr ""
+"Do t騁o str疣ky je vlo~en jinsoubor s '%s'. Jeliko~ toto nenskute
n"
+"groff parser, toto nenpodporov疣o."
+
+#: ../../lib/Locale/Po4a/Man.pm:2280
+#, perl-format
+msgid ""
+"This page uses the '%s' request with the number of lines in argument. This "
+"is not supported yet."
+msgstr ""
+"Tato str疣ky pou~咩po~adavek '%s' s po
tem Y疆ko v argumentu. Toto nenv "
+"sou
asndob podporov疣o."
+
+#: ../../lib/Locale/Po4a/Man.pm:2295
+#, perl-format
+msgid ""
+"This page uses the '%s' request. This request is only supported when no "
+"argument is provided."
+msgstr ""
+"Tato str疣ka vyu~咩po~adavek  '%s'. Tento po~adavek je podporov疣 pouze "
+"pokud nenuveden ~疆nargument."
+
+#: ../../lib/Locale/Po4a/NewsDebian.pm:87
+msgid "Begin of a new entry before the end of previous one"
+msgstr "Za
疸ek n疽leduj兤劜o z痙namu pYed ukon
en匇 pYedch痙ej兤劜o"
+
+#: ../../lib/Locale/Po4a/Po.pm:159
+#, perl-format
+msgid ""
+"Invalid value for option 'porefs' ('%s' is not one of 'full', 'noline' or "
+"'none')"
+msgstr ""
+"Nespr疱nodnota parametru 'porefs' (hodnota '%s' nenjednou z 'full', "
+"'noline' nebo 'none')"
+
+#: ../../lib/Locale/Po4a/Po.pm:204
+#, fuzzy
+msgid "Please provide a non-null filename"
+msgstr "Pros匇 zadej nepr痙dnjm駭o souboru"
+
+#: ../../lib/Locale/Po4a/Po.pm:211 ../../lib/Locale/Po4a/TeX.pm:913
+#: ../../lib/Locale/Po4a/TransTractor.pm:396
+#: ../../lib/Locale/Po4a/TransTractor.pm:530
+#: ../../lib/Locale/Po4a/Xhtml.pm:135 ../../lib/Locale/Po4a/Xml.pm:83
+#, perl-format
+msgid "Can't read from %s: %s"
+msgstr "Nemohu 
﨎t z %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:250
+#, perl-format
+msgid "Strange line: -->%s<--"
+msgstr "NesrozumitelnY疆ek: -->%s<--"
+
+#: ../../lib/Locale/Po4a/Po.pm:275 ../../lib/Locale/Po4a/Po.pm:392
+#: ../../lib/Locale/Po4a/TransTractor.pm:430
+msgid "Can't write to a file without filename"
+msgstr "Nemohu zapsat do souboru bez jm駭a"
+
+#: ../../lib/Locale/Po4a/Po.pm:290 ../../lib/Locale/Po4a/TransTractor.pm:445
+#, perl-format
+msgid "Can't write to %s: %s"
+msgstr "Nemohu zapsat do %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:366
+#, fuzzy, perl-format
+msgid "Can't unlink %s: %s."
+msgstr "Nemo~u odpojit %s."
+
+#: ../../lib/Locale/Po4a/Po.pm:374 ../../po4a:987
+#, fuzzy, perl-format
+msgid "Can't copy %s to %s: %s."
+msgstr "Nemohu uzavY咜 do
asnsoubor: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:379 ../../lib/Locale/Po4a/Po.pm:384
+#: ../../po4a:994
+#, fuzzy, perl-format
+msgid "Can't move %s to %s: %s."
+msgstr "Nemohu 
﨎t z %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:424
+msgid ""
+"\n"
+"The gettextization failed (once again). Don't give up, gettextizing is a "
+"subtle art, but this is only needed once to convert a project to the "
+"gorgeous luxus offered by po4a to translators.\n"
+"Please refer to the po4a(7) documentation, the section \"HOWTO convert a pre-"
+"existing translation to po4a?\" contains several hints to help you in your "
+"task"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:434
+#, fuzzy, perl-format
+msgid ""
+"Original has more strings than the translation (%d>%d). Please fix it by "
+"editing the translated version to add some dummy entry."
+msgstr ""
+"Origin疝 obsahuje v兤e Yetzco ne~ pYeklad (%d>%d). Opravte tento probl駑 "
+"eidtacpYelo~enverze. Vlo~te do nnjakfingovantext."
+
+#: ../../lib/Locale/Po4a/Po.pm:440
+#, perl-format
+msgid ""
+"Original has less strings than the translation (%d<%d). Please fix it by "
+"removing the extra entry from the translated file. You may need an addendum "
+"(cf po4a(7)) to reput the chunk in place after gettextization. A possible "
+"cause is that a text duplicated in the original is not translated the same "
+"way each time. Remove one of the translations, and you're fine."
+msgstr ""
+"Origin疝 mm駭 Yetzco, ne~ pYeklad (%d<%d). Pros匇, opravte tento probl駑 "
+"odstrann匇 nadbyte
nh polo~ek v pYelo~en駑 souboru. Mo~nbudete "
+"potYebovat dodatek (cf po4a(7)) pro optovnvlo~en
疽ti textu na m﨎to po "
+"gettextizaci. Mo~npY寀ina je v tom, ~e duplikovantext v origin疝e nebyl "
+"poka~dpYelo~en stejn. OdstraHte jeden z pYeklado, a vae by mlo b v "
+"poY疆ku."
+
+#: ../../lib/Locale/Po4a/Po.pm:493
+#, perl-format
+msgid ""
+"po4a gettextization: Structure disparity between original and translated "
+"files:\n"
+"msgid (at %s) is of type '%s' while\n"
+"msgstr (at %s) is of type '%s'.\n"
+"Original text: %s\n"
+"Translated text: %s\n"
+"(result so far dumped to gettextization.failed.po)"
+msgstr ""
+"po4a gettextizace: Neshoda struktury mezi origin疝em a pYelo~en souborem:\n"
+"msgid (v %s) je typu '%s' zat匇co\n"
+"msgstr (v %s) je typu '%s'.\n"
+"Povodntext: %s\n"
+"PYelo~entext: %s\n"
+"(
疽te
nvledek byl zaps疣 do gettextization.failed.po)"
+
+#: ../../lib/Locale/Po4a/Po.pm:701
+#, perl-format
+msgid "Eval failure: %s"
+msgstr "Chyba vyhodnocov疣 %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:1024
+#, perl-format
+msgid "msgid defined twice: %s"
+msgstr "msgid definov疣o dvakr疸\" %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:1044
+#, perl-format
+msgid ""
+"Translations don't match for:\n"
+"%s\n"
+"-->First translation:\n"
+"%s\n"
+" Second translation:\n"
+"%s\n"
+" Old translation discarded."
+msgstr ""
+"PYeklad nesouhlaspro:\n"
+"%s\n"
+"--> PrvnpYeklad:\n"
+"%s\n"
+" DruhpYeklad:\n"
+"%s\n"
+" PovodnpYeklad zahozen."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:209
+msgid ""
+"The needed module SGMLS.pm was not found and needs to be installed. It can "
+"be found on the CPAN, in package libsgmls-perl on debian, etc."
+msgstr ""
+"Po~adovanmodul SGMLS.pm nebyl nalezen a je potYeba jej nainstalovat. Modul "
+"je dostupnna CPAN, v bal勛u libsgmls-perl v Debianu, atd."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:277
+msgid "msgid skipped to help translators (contains only an entity)"
+msgstr "zmenahesla*963"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:284
+msgid "msgid skipped to help translators (contains only tags)"
+msgstr "msgid pYesko
ena kvoli pomoci pYekladatelom (obsahuje pouze zna
ky)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:292
+msgid ""
+"msgid skipped to help translators (contains only opening or closing tags of "
+"marked sections)"
+msgstr ""
+"msgid pYesko
ena kvoli pomoci pYekladatelom (obsahuje pouye otev叝ac "
+"nebozav叝aczna
ky ozna
enh sekc"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:369
+msgid ""
+"Trying to handle a XML document as a SGML one. Feel lucky if it works, help "
+"us implementing a proper XML backend if it does not."
+msgstr ""
+"Pokus o zpracov疣XML dokumentu jako SGML. Pokud to funguje, m疸e atst "
+"pokud ne, pomozte n疥 implementovat spr疱nou XML podporu."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:382
+msgid ""
+"This file is not a master SGML document (no DOCTYPE). It may be a file to be "
+"included by another one, in which case it should not be passed to po4a "
+"directly. Text from included files is extracted/translated when handling the "
+"master file including them."
+msgstr ""
+"Tento soubor nenhlavnSGML dokument (nemDOCTYPE). Mo~e to b soubor "
+"kterje vkl疆疣 do jin馼o, v tom pY厓ad by neml b pYedkl疆疣 Po4a "
+"pY匇o. Text z vlo~enh je vyta~en a pYelo~en kdy~ se zpracov疱hlavn"
+"soubor, ve kter駑 jsou vlo~eny."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:501
+msgid "DTD of this file is unknown, but proceeding as requested."
+msgstr "DTD tohoto souboru je nezn疥 pokra
uji podle po~adavku."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:505
+#, fuzzy
+msgid ""
+"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog "
+"follows:"
+msgstr ""
+"DTD tohoto souboru je nezn疥 (podporov疣y jsou: debiandoc, docbook). レvod "
+"n疽leduje:"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:599 ../../lib/Locale/Po4a/Sgml.pm:681
+#, perl-format
+msgid "Can't open %s (content of entity %s%s;): %s"
+msgstr "Nemohu otevY咜 %s (obsah entity %s%s;): %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:652
+#, perl-format
+msgid "unrecognized prolog inclusion entity: %%%s;"
+msgstr "nerozpoznan俿odnvkl疆acentita: %%%s;"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:769
+#, perl-format
+msgid "Can't close tempfile: %s"
+msgstr "Nemohu uzavY咜 do
asnsoubor: %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:775
+#, perl-format
+msgid "Can't run nsgmls: %s"
+msgstr "Nemohu spustit nsgmls: %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:890
+#, perl-format
+msgid "Unknown tag %s"
+msgstr "Nezn疥zna
ka %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:924
+#, perl-format
+msgid "bad translation '%s' for '%s' in '%s'"
+msgstr "apatnpYeklad '%s' na '%s' v '%s'"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:979 ../../lib/Locale/Po4a/Sgml.pm:1057
+#, fuzzy, perl-format
+msgid "Closing tag for a translation container missing before %s"
+msgstr "Chybukon
ovaczna
ka kontejneru pYekladu pYed %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1140
+#, fuzzy, perl-format
+msgid "Unknown SGML event type: %s"
+msgstr "Nezn疥form疸: %s."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1149
+msgid ""
+"Warning: nsgmls produced some errors.  This is usually caused by po4a, which "
+"modifies the input and restores it afterwards, causing the input of nsgmls "
+"to be invalid.  This is usually safe, but you may wish to verify the "
+"generated document with nsgmls -wno-valid.  Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:501 ../../lib/Locale/Po4a/TeX.pm:581
+#, perl-format
+msgid "un-balanced %s in '%s'"
+msgstr "nevyv痿en%s v '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:515 ../../lib/Locale/Po4a/TeX.pm:599
+#, perl-format
+msgid "Error while checking the number of arguments of the '%s' command: %s"
+msgstr "Chyba pYi ovYov疣po
tu argumento pY勛ayu '%s': %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:764 ../../lib/Locale/Po4a/TeX.pm:861
+#, perl-format
+msgid "Unknown command: '%s'"
+msgstr "Nezn疥pY勛az: '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:907 ../../lib/Locale/Po4a/TransTractor.pm:392
+msgid "Can't read from file without having a filename"
+msgstr "Nemohu 
﨎t ze souboru, proto~e nebylo zad疣o jm駭o souboru."
+
+#: ../../lib/Locale/Po4a/TeX.pm:982 ../../lib/Locale/Po4a/TransTractor.pm:417
+#: ../../lib/Locale/Po4a/Xhtml.pm:144 ../../lib/Locale/Po4a/Xml.pm:92
+#, perl-format
+msgid "Can't close %s after reading: %s"
+msgstr "Nemohu uzavY咜 %s po 
ten %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1017 ../../po4a:560
+#, perl-format
+msgid "Can't open %s: %s"
+msgstr "Nemohu otevY咜 %s: %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1055
+#, perl-format
+msgid "Cannot use an alias to the unknown command '%s'"
+msgstr "nemohu pou~咜 alias k nezn疥駑u pY勛azu '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1061
+#, perl-format
+msgid ""
+"You are using the old definitions format (%s).  Please update this "
+"definition line."
+msgstr ""
+"Pou~咩疸e zastaralform疸 definic (%s). Aktualizujte prostento defini
n"
+"Y疆ek."
+
+#: ../../lib/Locale/Po4a/TeX.pm:1264 ../../lib/Locale/Po4a/TeX.pm:1518
+#, perl-format
+msgid "unknown environment: '%s'"
+msgstr "Nezn疥prostYed '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1286
+#, perl-format
+msgid "unmatched end of environment '%s'"
+msgstr "nezp疵ovankonec prostYed'%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1332 ../../lib/Locale/Po4a/TeX.pm:1444
+#, perl-format
+msgid "Wrong number of arguments for the '%s' command."
+msgstr "`patnpo
et argumento pro pY勛az '%s'."
+
+#: ../../lib/Locale/Po4a/TeX.pm:1345 ../../lib/Locale/Po4a/TeX.pm:1457
+#: ../../lib/Locale/Po4a/TeX.pm:1545
+#, fuzzy
+msgid "An optional argument was provided, but a mandatory one is expected."
+msgstr "PY勛az '%s': byl poskytnut nepovinnargument, ale je o
ek疱疣 povinn
+
+#: ../../lib/Locale/Po4a/TeX.pm:1349 ../../lib/Locale/Po4a/TeX.pm:1461
+#, fuzzy, perl-format
+msgid "Command '%s': %s"
+msgstr "Nemohu otevY咜 %s: %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1403
+#, perl-format
+msgid "register_generic_command: unsupported format: '%s'."
+msgstr "register_generic_command: nepodporovanform疸: '%s'."
+
+#: ../../lib/Locale/Po4a/TeX.pm:1512
+msgid "The first argument of \\begin is mandatory."
+msgstr "Prvnargument u \\begin je povinn"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:452
+#, perl-format
+msgid "Can't close %s after writing: %s"
+msgstr "Nemohu uzavY咜 %s po z疳isu: %s"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:535
+#, perl-format
+msgid "Can't read Po4a header from %s."
+msgstr "Nemohu na
﨎t hlavi
ku Po4a z %s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:540
+#, perl-format
+msgid "First line of %s does not look like a Po4a header."
+msgstr "ProvnY疆ek v %s nevypadjako hlavi
ka Po4a."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:545
+#, perl-format
+msgid "Syntax error in Po4a header of %s, near \"%s\""
+msgstr "Syntaktickchyba %s v hlavi
ce Po4a, pobl﨏 \"%s\""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:559
+#, perl-format
+msgid "Invalid argument in the Po4a header of %s: %s"
+msgstr "Chybnargument v hlavi
cce Po4a v %s\" %s"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:565
+#, perl-format
+msgid "The Po4a header of %s does not define the mode."
+msgstr "Po4a hlavi
ka %s nedefinuje m禔."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:569
+#, perl-format
+msgid ""
+"Mode invalid in the Po4a header of %s: should be 'before' or 'after' not %s."
+msgstr ""
+"`patnm禔 Po4a hlavi
ky v %s: o
ek疱疣o 'before' nebo 'after' m﨎to %s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:574
+#, perl-format
+msgid "The Po4a header of %s does not define the position."
+msgstr "Po4a hlavi
ka %s nedefinuje pozici."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:578
+msgid "No ending boundary given in the Po4a header, but mode=after."
+msgstr "Po4a nebyla d疣a ukon
uj兤hranice v Po4a hlavi
ce, ale m禔=after."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:604
+msgid "Can't apply addendum when not given the filename"
+msgstr "Nelze aplikovat dodatek, pokud nenzad疣 n痙ev souboru."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:607
+#, perl-format
+msgid "Addendum %s does not exist."
+msgstr "Dodatek %s neexistuje."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:628
+#, perl-format
+msgid "No candidate position for the addendum %s."
+msgstr "Nebyla nalezena vhodnpozice pro dodatek %s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:633
+#, fuzzy, perl-format
+msgid "More than one candidate position found for the addendum %s."
+msgstr "Byla nalezena v兤e ne~ jedna vhodnpozice pro dodatek %s."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:639
+#: ../../lib/Locale/Po4a/TransTractor.pm:662
+#, perl-format
+msgid "Addendum '%s' applied before this line: %s"
+msgstr "Dodatek '%s' byl aplikov疣 pYed t匇to Y疆kem: %s"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:669
+#, perl-format
+msgid "Addendum '%s' applied after the line: %s."
+msgstr "Dodatek '%s' byl aplikov疣 po tomto Y疆ku: %s"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:676
+#, perl-format
+msgid "Addendum '%s' applied at the end of the file."
+msgstr "Dodatek '%s' byl aplikov疣 na konec souboru."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:836
+#: ../../lib/Locale/Po4a/TransTractor.pm:1012
+#, perl-format
+msgid ""
+"Couldn't determine the input document's charset. Please specify it on the "
+"command line. (non-ascii char at %s)"
+msgstr ""
+"Nelze rozpoznat vstupnznakovou sadu dokumentu. Pros匇 specifikujte ji na "
+"pY勛azovY疆ce. (non=ascii znak v %s)"
+
+#: ../../lib/Locale/Po4a/Wml.pm:88
+#, perl-format
+msgid "Can't create a temporary xml file: %s"
+msgstr "Nemohu vytvoYit do
asnxml soubor: %s"
+
+#: ../../lib/Locale/Po4a/Xml.pm:425
+#, perl-format
+msgid "Internal error: unknown type identifier '%s'."
+msgstr "VnitYnchyba: nezn疥identifik疸or typu '%s'."
+
+#: ../../lib/Locale/Po4a/Xml.pm:590
+#, perl-format
+msgid "Bad document type. '%s' expected."
+msgstr "`patntyp dokumentu. Byl o
ek疱疣 '%s'."
+
+#: ../../lib/Locale/Po4a/Xml.pm:662 ../../lib/Locale/Po4a/Xml.pm:1106
+#, fuzzy, perl-format
+msgid ""
+"Unexpected closing tag </%s> found. The main document may be wrong.  "
+"Continuing..."
+msgstr ""
+"Bzla nalezena neo
ek疱anukon
ovaczna
ka </%s>. Dokument je pravdpodobn "
+"chybn"
+
+#: ../../lib/Locale/Po4a/Xml.pm:664 ../../lib/Locale/Po4a/Xml.pm:1108
+#, perl-format
+msgid "Unexpected closing tag </%s> found. The main document may be wrong."
+msgstr ""
+"Bzla nalezena neo
ek疱anukon
ovaczna
ka </%s>. Dokument je pravdpodobn "
+"chybn"
+
+#: ../../lib/Locale/Po4a/Xml.pm:1004
+#, perl-format
+msgid "Content of attribute %s excluded: %s"
+msgstr "Obsah atributu %s vynech疣: %s"
+
+#: ../../lib/Locale/Po4a/Xml.pm:1013
+msgid "Bad attribute syntax"
+msgstr "`patnsyntaxe atributu"
+
+#: ../../lib/Locale/Po4a/Xml.pm:1323
+#, perl-format
+msgid "Content of tag %s excluded: %s"
+msgstr "Obsah zna
ky %s vynech疣: %s"
+
+#: ../../po4a:494 ../../po4a:670
+#, perl-format
+msgid "Unparsable argument '%s' (%s)."
+msgstr "Neanalyzovatelnargument '%s' (%s)."
+
+#: ../../po4a:528
+#, perl-format
+msgid "failed to execute '%s': %s."
+msgstr "chyba pYi vykon疱疣 '%s': %s."
+
+#: ../../po4a:532
+#, fuzzy, perl-format
+msgid "'%s' died with signal %d, with coredump."
+msgstr "'%s' odumYel se sign疝em %d, s visem j疆ra."
+
+#: ../../po4a:536
+#, fuzzy, perl-format
+msgid "'%s' died with signal %d, without coredump."
+msgstr "'%s' odumYel se sign疝em %d, bez visu j疆ra."
+
+#: ../../po4a:541
+#, perl-format
+msgid "'%s' exited with value %d."
+msgstr "'%s' skon
il s hodnotou %d."
+
+#: ../../po4a:545
+#, fuzzy, perl-format
+msgid "Error: %s"
+msgstr "Chybnsyntaxe: %s"
+
+#: ../../po4a:551 ../../po4a-gettextize:197 ../../po4a-normalize:140
+#: ../../po4a-translate:204 ../../po4a-translate:205 ../../po4a-updatepo:192
+#: ../../scripts/msguntypot:171 ../../scripts/msguntypot:173
+#, perl-format
+msgid "File %s does not exist."
+msgstr "Soubor %s neexistuje."
+
+#: ../../po4a:573
+#, perl-format
+msgid "Unknown variable: %s"
+msgstr ""
+
+#: ../../po4a:582
+#, perl-format
+msgid "Syntax error: %s"
+msgstr "Chybnsyntaxe: %s"
+
+#: ../../po4a:609 ../../po4a:621
+#, perl-format
+msgid "'%s' redeclared"
+msgstr "'%s' byl pYedeklarov疣"
+
+#: ../../po4a:614
+#, perl-format
+msgid "Unparsable argument '%s'."
+msgstr "Neanalyzovatelnargument '%s'."
+
+#: ../../po4a:628
+#, perl-format
+msgid ""
+"The '%s' master file was specified earlier in the configuration file.  This "
+"may cause problems with options."
+msgstr ""
+
+#: ../../po4a:674
+msgid "The translated and master file are the same."
+msgstr "Povodna pYelo~ensoubor jsou shodn"
+
+#: ../../po4a:681
+#, perl-format
+msgid "Translation of %s in %s redefined"
+msgstr "PYeklad %s v %s pYedefinov疣."
+
+#: ../../po4a:703
+#, perl-format
+msgid "Unparsable command '%s'."
+msgstr "NeanalyzovatelnpY勛az '%s'."
+
+#: ../../po4a:709
+msgid "po4a_paths not declared. Dunno where to find the pot and po files"
+msgstr ""
+"cesty po4a_paths nejsou deklarov疣y. Nelze ur
it, kde hledat soubory pot a "
+"po."
+
+#: ../../po4a:746
+msgid "Splitted mode, creating a temporary POT"
+msgstr ""
+
+#: ../../po4a:781 ../../po4a:914 ../../po4a-updatepo:220
+#, perl-format
+msgid "Updating %s:"
+msgstr "Aktualizace %s:"
+
+#: ../../po4a:784 ../../po4a:924 ../../po4a-updatepo:228
+#, perl-format
+msgid "Creating %s:"
+msgstr "Vytv畉匇 %s:"
+
+#: ../../po4a:831 ../../po4a:861 ../../po4a:948 ../../po4a-updatepo:202
+#, perl-format
+msgid "Can't create a temporary pot file: %s"
+msgstr "Nemohu vytvoYit do
asnpot soubor: %s"
+
+#: ../../po4a:842
+#, perl-format
+msgid " (%d entries)"
+msgstr " (%d polo~ek)"
+
+#: ../../po4a:868 ../../po4a:974
+#, fuzzy, perl-format
+msgid "Can't create directory '%s': %s"
+msgstr "Nemohu zapsat do %s: %s"
+
+#: ../../po4a:888 ../../scripts/msguntypot:208
+#, perl-format
+msgid "Can't create a temporary po file: %s"
+msgstr "Nemohu vytvoYit do
asnpo soubor: %s"
+
+#: ../../po4a:1038
+#, perl-format
+msgid "%s doesn't need to be updated."
+msgstr ""
+
+#: ../../po4a:1079
+#, fuzzy, perl-format
+msgid "Discard %s (%s of %s strings; only %s%% translated; need %s%%)."
+msgstr "Zahazuji %s (pYelo~eno pouze %s%%; bylo potYeba %s%%)."
+
+#: ../../po4a:1086
+#, perl-format
+msgid "Timestamp %s created."
+msgstr ""
+
+#: ../../po4a:1096
+#, perl-format
+msgid "Timestamp %s removed."
+msgstr ""
+
+#: ../../po4a:1105
+#, perl-format
+msgid "Addendum %s does NOT apply to %s (translation discarded)."
+msgstr "Dodatek %s nebude aplikov疣 v %s (pYeklad zahozen)"
+
+#: ../../po4a:1114
+#, perl-format
+msgid "%s is %s%% translated (%s strings)."
+msgstr "%s je %s%% pYelo~eno (%s Yetzco)."
+
+#: ../../po4a:1117 ../../po4a-translate:236
+#, perl-format
+msgid "%s is %s%% translated (%s of %s strings)."
+msgstr "%s je %s%% pYelo~eno (%s z %s Yetzco)."
+
+#: ../../po4a-translate:242
+#, perl-format
+msgid "Discard the translation of %s (only %s%% translated; need %s%%)."
+msgstr "PYeklad %s zahozen (pouze %s%% pYelo~eno; bylo potYeba %s%%)."
+
+#: ../../po4a-translate:249
+#, perl-format
+msgid "Discard the translation of %s (addendum %s does not apply)."
+msgstr "PYeklad %s zahozen (dodatek %s nebyl aplikov疣)."
+
+#: ../../po4a-updatepo:193
+msgid "po4a-updatepo can't take the input po from stdin."
+msgstr "po4a-updatepo nemo~e 
﨎t vstupn'po' dokument ze stdin"
+
+#: ../../po4a-updatepo:205
+msgid "Parse input files... "
+msgstr "Analyzovat vstupnsoubory... "
+
+#: ../../po4a-updatepo:215
+msgid "done."
+msgstr "dokon
eno."
+
+#: ../../po4a-updatepo:224 ../../scripts/msguntypot:217
+#, perl-format
+msgid "Error while running msgmerge: %s"
+msgstr "Chyba v probhu vzkon疱疣msgmerge: %s"
+
+#: ../../po4a-updatepo:231
+#, perl-format
+msgid "Error while copying the po file: %s"
+msgstr "Chyba pYi kop叝ov疣'po' souboru: %s"
+
+#: ../../scripts/msguntypot:170 ../../scripts/msguntypot:172
+#, perl-format
+msgid "Mandatory argument '%s' missing."
+msgstr "Chybpovinnargument %s."
+
+#: ../../scripts/msguntypot:181
+#, perl-format
+msgid ""
+"The new and old pot files have different amount of strings (%d != %d). "
+"Something's seriously wrong here."
+msgstr ""
+"Nova povodnsoubor pot modlianpo
et Yetzco (%d != %d). Nastala v痿n"
+"chyba."
+
+#: ../../scripts/msguntypot:199
+#, perl-format
+msgid "Found %d modified entries."
+msgstr "Nalezeno %d modifikovanh polo~ek."
+
+#: ../../scripts/msguntypot:213
+#, perl-format
+msgid "Handling %s"
+msgstr "Pracuji s %s:"
+
+#: ../../scripts/msguntypot:238
+#, perl-format
+msgid "Modified %d entries in %d files."
+msgstr "Zmnno %d polo~ek v %d souborech."
+
+#, fuzzy
+#~ msgid "Unknown function (%s) for '%s'"
+#~ msgstr "Nezn疥pY勛az: '%s'"
+
+#, fuzzy
+#~ msgid "can't close %s: %s"
+#~ msgstr "Nemohu uzavY咜 do
asnsoubor: %s"
+
+#, fuzzy
+#~ msgid "%s: Unknown tag %s"
+#~ msgstr "%s: Nezn疥zna
ka %s"
+
+#, fuzzy
+#~ msgid "%s: Unknown SGML event type: %s"
+#~ msgstr "Nezn疥form疸: %s."
+
+#~ msgid ""
+#~ "This page seems to be a mdoc(7) formatted one. This is not supported "
+#~ "(yet)."
+#~ msgstr ""
+#~ "Zdse, ~e tato str疣ka je ve form疵u mdoc(7). Tento form疸 nen"
+#~ "podporov疣 (zat匇)."
+
+#~ msgid ""
+#~ "Warning: nsgmls is missing or non-functional.  Please make sure that "
+#~ "nsgmls is present and does not produce any error (with the -wno-valid "
+#~ "option), and report a bug otherwise.  Continuing..."
+#~ msgstr ""
+#~ "Varov疣躡 nsgmls chybnebo nenfunk
n蹼 Ujistte se pros匇, ~e je "
+#~ "nsgmls pY咜omno a neprodukuje ~疆nchyby (pomocparametru -wno-valid), "
+#~ "a v tom pY厓ad nahlaate chybu. Pokra
uji..."

Added: po4a/po/bin/de.po
===================================================================
--- po4a/po/bin/de.po	                        (rev 0)
+++ po4a/po/bin/de.po	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,964 @@
+# German translation of po4a
+# This file is distributed under the same license as the po4a package.
+# Tim Fuchs, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: po4a bin\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-12 13:53+0200\n"
+"PO-Revision-Date: 2007-08-12 18:58+0200\n"
+"Last-Translator: Laura Ohrndorf\n"
+"Language-Team: DE\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:27
+msgid "Need to provide a module name"
+msgstr "Bitte geben Sie einen Modulnamen im Auswahlformular an"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:46
+#, perl-format
+msgid "Unknown format type: %s."
+msgstr "Unbekanntes Format: %s."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:48
+#, perl-format
+msgid "Module loading error: %s"
+msgstr "Fehler beim Laden des Moduls: %s"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:57
+msgid "List of valid formats:"
+msgstr "Gtige Formate:"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:59
+msgid "dia: uncompressed Dia diagrams."
+msgstr "dia: unkomprimierte Dia-Diagramme."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:60
+msgid "docbook: Docbook XML."
+msgstr "docbook: Docbook XML."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:61
+msgid "guide: Gentoo Linux's xml documentation format."
+msgstr "guide: Gentoo Linux XML-Dokumentation."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:63
+msgid "ini: .INI format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:64
+msgid "kernelhelp: Help messages of each kernel compilation option."
+msgstr "kernelhelp: Beschreibungen f die einzelnen Kerneloptionen."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:65
+msgid "latex: LaTeX format."
+msgstr "latex: LaTeX Format."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:66
+msgid "man: Good old manual page format."
+msgstr "man: (alte) Manual Pages."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:67
+msgid "pod: Perl Online Documentation format."
+msgstr "pod: Dokumentation f Perl."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:68
+msgid "sgml: either debiandoc or docbook DTD."
+msgstr "sgml: Debiandoc oder Docbook DTD."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:69
+#, fuzzy
+msgid "texinfo: The info page format."
+msgstr "latex: LaTeX Format."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:70
+msgid "tex: generic TeX documents (see also latex)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:71
+msgid "text: simple text document."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:73
+msgid "xhtml: XHTML documents."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:74
+msgid "xml: generic XML documents (see also docbook)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Common.pm:82
+#, fuzzy, perl-format
+msgid ""
+"%s version %s.\n"
+"written by Martin Quinson and Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"This is free software; see source code for copying\n"
+"conditions. There is NO warranty; not even for\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+"%s Version %s\n"
+"von Martin Quinson und Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"Dies ist freie Software; sehen Sie im Quellcode nach f weitere "
+"Bedingungen. Es gibt KEINE Garantie, nicht einmal f die "
+"Gebrauchstauglichkeit oder f die Verwendung f einen bestimmtem Zweck."
+
+#: ../../lib/Locale/Po4a/Debconf.pm:171
+#, fuzzy, perl-format
+msgid "Translated field in master document: %s"
+msgstr "ワbersetztes Feld im Originaldokument: %s"
+
+#: ../../lib/Locale/Po4a/KernelHelp.pm:104
+msgid "Syntax error"
+msgstr "Syntax Fehler"
+
+#: ../../lib/Locale/Po4a/Man.pm:456 ../../lib/Locale/Po4a/Po.pm:153
+#: ../../lib/Locale/Po4a/Sgml.pm:243 ../../lib/Locale/Po4a/TeX.pm:1612
+#: ../../lib/Locale/Po4a/Xml.pm:322
+#, perl-format
+msgid "Unknown option: %s"
+msgstr "Unbekannte Option: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:473
+msgid ""
+"Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."
+msgstr ""
+"Ungtiger Wert f 'groff_code'. Zul舖sige Werte sind 'fail', 'verbatim' "
+"und 'translate'."
+
+#: ../../lib/Locale/Po4a/Man.pm:520
+msgid ""
+"The no_wrap parameters must be a set of comma-separated begin:end couples.\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:566
+msgid "Invalid 'unknown_macros' value. Must be one of:\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:620
+msgid ""
+"This file was generated with Pod::Man. Translate the pod file with the pod "
+"module of po4a."
+msgstr ""
+"Diese Datei wurde mit Pod::Man erstellt. ワbersetzen Sie diese Pod-Datei mit "
+"dem Pod-Modul von po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:623
+msgid ""
+"This file was generated with help2man. Translate the source file with the "
+"regular gettext."
+msgstr ""
+"Diese Datei wurde mit help2man erstellt. ワbersetzen Sie die Datei mit "
+"gettext."
+
+#: ../../lib/Locale/Po4a/Man.pm:625
+msgid ""
+"This file was generated with docbook-to-man. Translate the source file with "
+"the sgml module of po4a."
+msgstr ""
+"Diese Datei wurde mit docbook-to-man erstellt. ワbersetzen Sie die Datei mit "
+"dem sgml-Modul von po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:628
+msgid ""
+"This file was generated with docbook2man. Translate the source file with the "
+"sgml module of po4a."
+msgstr ""
+"Diese Datei wurde mit docbook2man erstellt. ワbersetzen Sie die Datei mit dem "
+"sgml-Modul von po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:632 ../../lib/Locale/Po4a/Man.pm:640
+#, perl-format
+msgid ""
+"This file was generated with %s. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Diese Datei wurde mit %s generiert. Sie sollten die Quelldatei ersetzen, "
+"fahre aber trotzdem fort."
+
+#: ../../lib/Locale/Po4a/Man.pm:636
+msgid ""
+"This file was generated with db2man.xsl. Translate the source file with the "
+"xml module of po4a."
+msgstr ""
+"Diese Datei wurde mit db2man.xsl erstellt. ワbersetzen Sie die Datei mit dem "
+"xml-Modul von po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:646
+#, perl-format
+msgid ""
+"This file contains the line '%s'. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Diese Datei enth舁t die Zeile '%s'. Sie sollten die Quelldatei ersetzen, "
+"fahre aber trotzdem fort."
+
+#: ../../lib/Locale/Po4a/Man.pm:708
+#, perl-format
+msgid ""
+"Font modifiers followed by a command may disturb po4a.  You should either "
+"remove the font modifier '%s', or integrate a \\f font modifier in the "
+"following command ('%s'), but continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:813
+msgid ""
+"The unshiftline is not supported for the man module. Please send a bug "
+"report with the groff page that generated this error."
+msgstr ""
+"Unshiftline ist vom man-Modul nicht unterstzt. Bitte senden Sie einen "
+"Fehlerreport f die groff-Seite ein welche diesen Fehler verursacht hat."
+
+#: ../../lib/Locale/Po4a/Man.pm:856
+#, perl-format
+msgid ""
+"macro %s called without arguments. Even if placing the macro arguments on "
+"the next line is authorized by man(7), handling this would make the po4a "
+"parser too complicate. Please simply put the macro args on the same line."
+msgstr ""
+"Das Makro %s wurde ohne Argumente aufgerufen. Laut man(7) ist es zwar "
+"erlaubt die Argumente auf der n臘hsten Zeile mitzugeben, dies wde aber den "
+"po4a Parser unnig komplizierter machen. Bitte ergeben Sie die Argumente "
+"auf der gleichen Zeile."
+
+#: ../../lib/Locale/Po4a/Man.pm:884
+msgid "Escape sequence \\c encountered. This is not completely handled yet."
+msgstr ""
+"Escapesequenz \\c angetroffen. Dies wird noch nicht komplett unterstzt."
+
+#: ../../lib/Locale/Po4a/Man.pm:1047
+#, perl-format
+msgid "Unbalanced '<' and '>' in font modifier. Faulty message: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1224
+#, perl-format
+msgid "Unparsable line: %s"
+msgstr "Nicht-interpretierbare Zeile: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1297
+#, fuzzy, perl-format
+msgid ""
+"Unknown macro '%s'. Remove it from the document, or refer to the Locale::"
+"Po4a::Man manpage to see how po4a can handle new macros."
+msgstr ""
+"Unbekanntes Makro '%s'. Entfernen Sie es vom Dokument oder senden Sie dem "
+"po4a Team einen Patch ein."
+
+#: ../../lib/Locale/Po4a/Man.pm:1508
+msgid ""
+"Escaped space at the end of macro arg. With high probability, it won't do "
+"the trick with po4a (because of wrapping). You may want to remove it and use "
+"the .nf/.fi groff macro to control the wrapping."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1682
+#, perl-format
+msgid "Unsupported font in: '%s'."
+msgstr "Nicht unterstzter Font in: '%s'"
+
+#: ../../lib/Locale/Po4a/Man.pm:2031
+#, fuzzy
+msgid ""
+"This page defines a new macro with '.de'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+"Diese Seite definiert ein neues Makro mit '.de'. Da po4a kein richtiger "
+"groff parser ist wird dies nicht unterstzt."
+
+#: ../../lib/Locale/Po4a/Man.pm:2097
+msgid "The .ie macro must be followed by a .el macro."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2123
+#, perl-format
+msgid ""
+"This page uses conditionals with '%s'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2164
+#, perl-format
+msgid ""
+"This page includes another file with '%s'. Do not forget to translate this "
+"file ('%s')."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2280
+#, perl-format
+msgid ""
+"This page uses the '%s' request with the number of lines in argument. This "
+"is not supported yet."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2295
+#, perl-format
+msgid ""
+"This page uses the '%s' request. This request is only supported when no "
+"argument is provided."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/NewsDebian.pm:87
+msgid "Begin of a new entry before the end of previous one"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:159
+#, perl-format
+msgid ""
+"Invalid value for option 'porefs' ('%s' is not one of 'full', 'noline' or "
+"'none')"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:204
+#, fuzzy
+msgid "Please provide a non-null filename"
+msgstr "Bitte geben Sie einen Filenamen an."
+
+#: ../../lib/Locale/Po4a/Po.pm:211 ../../lib/Locale/Po4a/TeX.pm:913
+#: ../../lib/Locale/Po4a/TransTractor.pm:396
+#: ../../lib/Locale/Po4a/TransTractor.pm:530
+#: ../../lib/Locale/Po4a/Xhtml.pm:135 ../../lib/Locale/Po4a/Xml.pm:83
+#, perl-format
+msgid "Can't read from %s: %s"
+msgstr "Kann %s: %s nicht lesen."
+
+#: ../../lib/Locale/Po4a/Po.pm:250
+#, perl-format
+msgid "Strange line: -->%s<--"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:275 ../../lib/Locale/Po4a/Po.pm:392
+#: ../../lib/Locale/Po4a/TransTractor.pm:430
+msgid "Can't write to a file without filename"
+msgstr "In eine Datei ohne Dateiname kann nicht geschrieben werden."
+
+#: ../../lib/Locale/Po4a/Po.pm:290 ../../lib/Locale/Po4a/TransTractor.pm:445
+#, perl-format
+msgid "Can't write to %s: %s"
+msgstr "Schreiben nach %s nicht mlich: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:366
+#, fuzzy, perl-format
+msgid "Can't unlink %s: %s."
+msgstr "Kann %s: %s nicht fnen"
+
+#: ../../lib/Locale/Po4a/Po.pm:374 ../../po4a:987
+#, fuzzy, perl-format
+msgid "Can't copy %s to %s: %s."
+msgstr "Kann %s: %s nicht lesen."
+
+#: ../../lib/Locale/Po4a/Po.pm:379 ../../lib/Locale/Po4a/Po.pm:384
+#: ../../po4a:994
+#, fuzzy, perl-format
+msgid "Can't move %s to %s: %s."
+msgstr "Kann %s: %s nicht lesen."
+
+#: ../../lib/Locale/Po4a/Po.pm:424
+msgid ""
+"\n"
+"The gettextization failed (once again). Don't give up, gettextizing is a "
+"subtle art, but this is only needed once to convert a project to the "
+"gorgeous luxus offered by po4a to translators.\n"
+"Please refer to the po4a(7) documentation, the section \"HOWTO convert a pre-"
+"existing translation to po4a?\" contains several hints to help you in your "
+"task"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:434
+#, perl-format
+msgid ""
+"Original has more strings than the translation (%d>%d). Please fix it by "
+"editing the translated version to add some dummy entry."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:440
+#, perl-format
+msgid ""
+"Original has less strings than the translation (%d<%d). Please fix it by "
+"removing the extra entry from the translated file. You may need an addendum "
+"(cf po4a(7)) to reput the chunk in place after gettextization. A possible "
+"cause is that a text duplicated in the original is not translated the same "
+"way each time. Remove one of the translations, and you're fine."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:493
+#, perl-format
+msgid ""
+"po4a gettextization: Structure disparity between original and translated "
+"files:\n"
+"msgid (at %s) is of type '%s' while\n"
+"msgstr (at %s) is of type '%s'.\n"
+"Original text: %s\n"
+"Translated text: %s\n"
+"(result so far dumped to gettextization.failed.po)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:701
+#, perl-format
+msgid "Eval failure: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1024
+#, perl-format
+msgid "msgid defined twice: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1044
+#, perl-format
+msgid ""
+"Translations don't match for:\n"
+"%s\n"
+"-->First translation:\n"
+"%s\n"
+" Second translation:\n"
+"%s\n"
+" Old translation discarded."
+msgstr ""
+"Die 彙ersetzung passt nicht zu:\n"
+"%s\n"
+"-->Erste ワbersetzung:\n"
+"%s\n"
+" Zweite ワbersetzung:\n"
+"%s\n"
+" Alte ワbersetzung wurde verworfen."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:209
+msgid ""
+"The needed module SGMLS.pm was not found and needs to be installed. It can "
+"be found on the CPAN, in package libsgmls-perl on debian, etc."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:277
+#, fuzzy
+msgid "msgid skipped to help translators (contains only an entity)"
+msgstr ""
+"msgid wurde ersprungen um den ワbersetzern zu helfen (enth舁t nur eine "
+"Datei)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:284
+msgid "msgid skipped to help translators (contains only tags)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:292
+#, fuzzy
+msgid ""
+"msgid skipped to help translators (contains only opening or closing tags of "
+"marked sections)"
+msgstr ""
+"msgid wurde ersprungen um den ワbersetzern zu helfen (enth舁t nur eine "
+"Datei)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:369
+msgid ""
+"Trying to handle a XML document as a SGML one. Feel lucky if it works, help "
+"us implementing a proper XML backend if it does not."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:382
+msgid ""
+"This file is not a master SGML document (no DOCTYPE). It may be a file to be "
+"included by another one, in which case it should not be passed to po4a "
+"directly. Text from included files is extracted/translated when handling the "
+"master file including them."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:501
+msgid "DTD of this file is unknown, but proceeding as requested."
+msgstr ""
+"DTD dieser Datei ist unbekannt, es wird aber fortgefahren wie gewscht."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:505
+msgid ""
+"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog "
+"follows:"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:599 ../../lib/Locale/Po4a/Sgml.pm:681
+#, perl-format
+msgid "Can't open %s (content of entity %s%s;): %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:652
+#, perl-format
+msgid "unrecognized prolog inclusion entity: %%%s;"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:769
+#, perl-format
+msgid "Can't close tempfile: %s"
+msgstr "Kann tempor舐e Datei %s nicht schlie゜en"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:775
+#, perl-format
+msgid "Can't run nsgmls: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:890
+#, perl-format
+msgid "Unknown tag %s"
+msgstr "Unbekanntes Tag %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:924
+#, perl-format
+msgid "bad translation '%s' for '%s' in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:979 ../../lib/Locale/Po4a/Sgml.pm:1057
+#, perl-format
+msgid "Closing tag for a translation container missing before %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1140
+#, perl-format
+msgid "Unknown SGML event type: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1149
+msgid ""
+"Warning: nsgmls produced some errors.  This is usually caused by po4a, which "
+"modifies the input and restores it afterwards, causing the input of nsgmls "
+"to be invalid.  This is usually safe, but you may wish to verify the "
+"generated document with nsgmls -wno-valid.  Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:501 ../../lib/Locale/Po4a/TeX.pm:581
+#, perl-format
+msgid "un-balanced %s in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:515 ../../lib/Locale/Po4a/TeX.pm:599
+#, perl-format
+msgid "Error while checking the number of arguments of the '%s' command: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:764 ../../lib/Locale/Po4a/TeX.pm:861
+#, perl-format
+msgid "Unknown command: '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:907 ../../lib/Locale/Po4a/TransTractor.pm:392
+#, fuzzy
+msgid "Can't read from file without having a filename"
+msgstr "Kann nicht von einer Datei lesen, ohne einen Dateinamen zu haben"
+
+#: ../../lib/Locale/Po4a/TeX.pm:982 ../../lib/Locale/Po4a/TransTractor.pm:417
+#: ../../lib/Locale/Po4a/Xhtml.pm:144 ../../lib/Locale/Po4a/Xml.pm:92
+#, perl-format
+msgid "Can't close %s after reading: %s"
+msgstr "Kann %s nach dem Lesen von %s nicht schlie゜en"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1017 ../../po4a:560
+#, perl-format
+msgid "Can't open %s: %s"
+msgstr "Kann %s: %s nicht fnen"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1055
+#, perl-format
+msgid "Cannot use an alias to the unknown command '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1061
+#, perl-format
+msgid ""
+"You are using the old definitions format (%s).  Please update this "
+"definition line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1264 ../../lib/Locale/Po4a/TeX.pm:1518
+#, perl-format
+msgid "unknown environment: '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1286
+#, perl-format
+msgid "unmatched end of environment '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1332 ../../lib/Locale/Po4a/TeX.pm:1444
+#, perl-format
+msgid "Wrong number of arguments for the '%s' command."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1345 ../../lib/Locale/Po4a/TeX.pm:1457
+#: ../../lib/Locale/Po4a/TeX.pm:1545
+msgid "An optional argument was provided, but a mandatory one is expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1349 ../../lib/Locale/Po4a/TeX.pm:1461
+#, fuzzy, perl-format
+msgid "Command '%s': %s"
+msgstr "Kann %s: %s nicht fnen"
+
+#: ../../lib/Locale/Po4a/TeX.pm:1403
+#, perl-format
+msgid "register_generic_command: unsupported format: '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1512
+msgid "The first argument of \\begin is mandatory."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:452
+#, perl-format
+msgid "Can't close %s after writing: %s"
+msgstr "Kann %s nach Beschreiben nicht schlie゜en: %s"
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:535
+#, perl-format
+msgid "Can't read Po4a header from %s."
+msgstr "Kann den Po4a-Header von %s nicht lesen."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:540
+#, perl-format
+msgid "First line of %s does not look like a Po4a header."
+msgstr "Die erste Zeile von %s scheint kein Po4a header zu sein."
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:545
+#, perl-format
+msgid "Syntax error in Po4a header of %s, near \"%s\""
+msgstr "Syntax-Fehler im Po4a-Headert von %s  bei \"%s\""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:559
+#, perl-format
+msgid "Invalid argument in the Po4a header of %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:565
+#, perl-format
+msgid "The Po4a header of %s does not define the mode."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:569
+#, perl-format
+msgid ""
+"Mode invalid in the Po4a header of %s: should be 'before' or 'after' not %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:574
+#, perl-format
+msgid "The Po4a header of %s does not define the position."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:578
+msgid "No ending boundary given in the Po4a header, but mode=after."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:604
+msgid "Can't apply addendum when not given the filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:607
+#, perl-format
+msgid "Addendum %s does not exist."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:628
+#, perl-format
+msgid "No candidate position for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:633
+#, perl-format
+msgid "More than one candidate position found for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:639
+#: ../../lib/Locale/Po4a/TransTractor.pm:662
+#, perl-format
+msgid "Addendum '%s' applied before this line: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:669
+#, perl-format
+msgid "Addendum '%s' applied after the line: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:676
+#, perl-format
+msgid "Addendum '%s' applied at the end of the file."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:836
+#: ../../lib/Locale/Po4a/TransTractor.pm:1012
+#, perl-format
+msgid ""
+"Couldn't determine the input document's charset. Please specify it on the "
+"command line. (non-ascii char at %s)"
+msgstr ""
+"Der Zeichensatz des Eingabe-Dokuments konnte nicht ermittelt werden. Bitte "
+"geben Sie ihn auf der Befehlszeile an. (Nicht-ASCI-Zeichen bei %s)"
+
+#: ../../lib/Locale/Po4a/Wml.pm:88
+#, perl-format
+msgid "Can't create a temporary xml file: %s"
+msgstr "Kann keine tempor舐e XML- Datei erstellen: %s"
+
+#: ../../lib/Locale/Po4a/Xml.pm:425
+#, perl-format
+msgid "Internal error: unknown type identifier '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:590
+#, perl-format
+msgid "Bad document type. '%s' expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:662 ../../lib/Locale/Po4a/Xml.pm:1106
+#, perl-format
+msgid ""
+"Unexpected closing tag </%s> found. The main document may be wrong.  "
+"Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:664 ../../lib/Locale/Po4a/Xml.pm:1108
+#, perl-format
+msgid "Unexpected closing tag </%s> found. The main document may be wrong."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1004
+#, perl-format
+msgid "Content of attribute %s excluded: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1013
+msgid "Bad attribute syntax"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1323
+#, perl-format
+msgid "Content of tag %s excluded: %s"
+msgstr ""
+
+#: ../../po4a:494 ../../po4a:670
+#, perl-format
+msgid "Unparsable argument '%s' (%s)."
+msgstr "Argument '%s' (%s) kann nicht geparst werden."
+
+#: ../../po4a:528
+#, perl-format
+msgid "failed to execute '%s': %s."
+msgstr ""
+
+#: ../../po4a:532
+#, perl-format
+msgid "'%s' died with signal %d, with coredump."
+msgstr ""
+
+#: ../../po4a:536
+#, perl-format
+msgid "'%s' died with signal %d, without coredump."
+msgstr ""
+
+#: ../../po4a:541
+#, perl-format
+msgid "'%s' exited with value %d."
+msgstr ""
+
+#: ../../po4a:545
+#, fuzzy, perl-format
+msgid "Error: %s"
+msgstr "Syntax Fehler: %s"
+
+#: ../../po4a:551 ../../po4a-gettextize:197 ../../po4a-normalize:140
+#: ../../po4a-translate:204 ../../po4a-translate:205 ../../po4a-updatepo:192
+#: ../../scripts/msguntypot:171 ../../scripts/msguntypot:173
+#, perl-format
+msgid "File %s does not exist."
+msgstr "Datei %s existiert nicht."
+
+#: ../../po4a:573
+#, fuzzy, perl-format
+msgid "Unknown variable: %s"
+msgstr "Unbekanntes Tag %s"
+
+#: ../../po4a:582
+#, perl-format
+msgid "Syntax error: %s"
+msgstr "Syntax Fehler: %s"
+
+#: ../../po4a:609 ../../po4a:621
+#, perl-format
+msgid "'%s' redeclared"
+msgstr ""
+
+#: ../../po4a:614
+#, perl-format
+msgid "Unparsable argument '%s'."
+msgstr ""
+
+#: ../../po4a:628
+#, perl-format
+msgid ""
+"The '%s' master file was specified earlier in the configuration file.  This "
+"may cause problems with options."
+msgstr ""
+
+#: ../../po4a:674
+msgid "The translated and master file are the same."
+msgstr "Das esetzte und das ursprgliche File sind identisch."
+
+#: ../../po4a:681
+#, perl-format
+msgid "Translation of %s in %s redefined"
+msgstr ""
+
+#: ../../po4a:703
+#, perl-format
+msgid "Unparsable command '%s'."
+msgstr "Befehl '%s' kann nicht geparst werden."
+
+#: ../../po4a:709
+msgid "po4a_paths not declared. Dunno where to find the pot and po files"
+msgstr ""
+
+#: ../../po4a:746
+msgid "Splitted mode, creating a temporary POT"
+msgstr ""
+
+#: ../../po4a:781 ../../po4a:914 ../../po4a-updatepo:220
+#, perl-format
+msgid "Updating %s:"
+msgstr "Aktualisiere %s:"
+
+#: ../../po4a:784 ../../po4a:924 ../../po4a-updatepo:228
+#, perl-format
+msgid "Creating %s:"
+msgstr "Erstelle %s:"
+
+#: ../../po4a:831 ../../po4a:861 ../../po4a:948 ../../po4a-updatepo:202
+#, perl-format
+msgid "Can't create a temporary pot file: %s"
+msgstr "Kann keine tempor舐e pot Datei erstellen: %s"
+
+#: ../../po4a:842
+#, perl-format
+msgid " (%d entries)"
+msgstr " (%d Eintr臠e)"
+
+#: ../../po4a:868 ../../po4a:974
+#, fuzzy, perl-format
+msgid "Can't create directory '%s': %s"
+msgstr "Kann %s: %s nicht lesen."
+
+#: ../../po4a:888 ../../scripts/msguntypot:208
+#, perl-format
+msgid "Can't create a temporary po file: %s"
+msgstr "Kann keine tempor舐e po Datei erstellen: %s"
+
+#: ../../po4a:1038
+#, perl-format
+msgid "%s doesn't need to be updated."
+msgstr ""
+
+#: ../../po4a:1079
+#, fuzzy, perl-format
+msgid "Discard %s (%s of %s strings; only %s%% translated; need %s%%)."
+msgstr "Verwerfe die ワbersetzung von %s (nur %s%% ersetzt; brauche %s%%)."
+
+#: ../../po4a:1086
+#, perl-format
+msgid "Timestamp %s created."
+msgstr ""
+
+#: ../../po4a:1096
+#, perl-format
+msgid "Timestamp %s removed."
+msgstr ""
+
+#: ../../po4a:1105
+#, perl-format
+msgid "Addendum %s does NOT apply to %s (translation discarded)."
+msgstr ""
+
+#: ../../po4a:1114
+#, perl-format
+msgid "%s is %s%% translated (%s strings)."
+msgstr "%s ist zu %s%% ersetzt (%s strings)"
+
+#: ../../po4a:1117 ../../po4a-translate:236
+#, perl-format
+msgid "%s is %s%% translated (%s of %s strings)."
+msgstr "%s ist zu %s%% ersetzt (%s von %s strings)"
+
+#: ../../po4a-translate:242
+#, perl-format
+msgid "Discard the translation of %s (only %s%% translated; need %s%%)."
+msgstr "Verwerfe die ワbersetzung von %s (nur %s%% ersetzt; brauche %s%%)."
+
+#: ../../po4a-translate:249
+#, fuzzy, perl-format
+msgid "Discard the translation of %s (addendum %s does not apply)."
+msgstr ""
+"Verwerfe die ワbersetzung von %s (Anhang %s kann nicht angewandt werden)."
+
+#: ../../po4a-updatepo:177
+#, fuzzy
+msgid "po4a-updatepo can't take the input po from stdin."
+msgstr ""
+"po4a-updatepo kann die Eingabe nicht von der Standard-Eingabe (stdin) "
+"annehmen."
+
+#: ../../po4a-updatepo:205
+msgid "Parse input files... "
+msgstr "Parse Eingangs Dateien... "
+
+#: ../../po4a-updatepo:215
+msgid "done."
+msgstr "Fertig."
+
+#: ../../po4a-updatepo:224 ../../scripts/msguntypot:217
+#, perl-format
+msgid "Error while running msgmerge: %s"
+msgstr "Fehler von msgmerge: %s"
+
+#: ../../po4a-updatepo:231
+#, perl-format
+msgid "Error while copying the po file: %s"
+msgstr "Fehler beim Kopieren der po Datei: %s"
+
+#: ../../scripts/msguntypot:170 ../../scripts/msguntypot:172
+#, fuzzy, perl-format
+msgid "Mandatory argument '%s' missing."
+msgstr "Argument '%s' (%s) kann nicht geparst werden."
+
+#: ../../scripts/msguntypot:181
+#, perl-format
+msgid ""
+"The new and old pot files have different amount of strings (%d != %d). "
+"Something's seriously wrong here."
+msgstr ""
+
+#: ../../scripts/msguntypot:199
+#, perl-format
+msgid "Found %d modified entries."
+msgstr ""
+
+#: ../../scripts/msguntypot:213
+#, fuzzy, perl-format
+msgid "Handling %s"
+msgstr "Aktualisiere %s:"
+
+#: ../../scripts/msguntypot:238
+#, perl-format
+msgid "Modified %d entries in %d files."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Can't close %s: %s"
+#~ msgstr "kann %s: %s nicht schlie゜en"
+
+#~ msgid ""
+#~ "This page seems to be a mdoc(7) formatted one. This is not supported "
+#~ "(yet)."
+#~ msgstr ""
+#~ "Diese Seite scheint im mdoc(7) Format zu sein. Dies ist (noch) nicht "
+#~ "unterstzt."
+
+#~ msgid "Unbalanced '<' and '>'"
+#~ msgstr "Nicht ausgeglichene '<' und '>'"

Added: po4a/po/bin/eo.po
===================================================================
--- po4a/po/bin/eo.po	                        (rev 0)
+++ po4a/po/bin/eo.po	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,926 @@
+# Esperanto translation for po4a
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the po4a package.
+# Tim Morley <t_morley@xxxxxxxxxxxxx>, 2005.
+# Joop Eggen <joop_eggen@xxxxxxxx>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: po4a\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-12 13:53+0200\n"
+"PO-Revision-Date: 2007-04-19 16:20+0000\n"
+"Last-Translator: Joop Eggen <joop_eggen@xxxxxxxx>\n"
+"Language-Team: Esperanto <eo@xxxxxx>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Export-Date: 2007-08-12 16:08:29+0000\n"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:27
+msgid "Need to provide a module name"
+msgstr "Devas provizi modulnomon"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:46
+#, perl-format
+msgid "Unknown format type: %s."
+msgstr "Nekonata formatotipe: %s."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:48
+#, perl-format
+msgid "Module loading error: %s"
+msgstr "Eraro dum ]argo de modulo: %s."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:57
+msgid "List of valid formats:"
+msgstr "Listo de validaj formatoj:"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:59
+msgid "dia: uncompressed Dia diagrams."
+msgstr "dia: nedensigita Dia-diagramoj."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:60
+msgid "docbook: Docbook XML."
+msgstr "docbook: Docbook XML."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:61
+msgid "guide: Gentoo Linux's xml documentation format."
+msgstr "guide: la xml-formato de la dokumentaro de Gentoo-Linukso."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:63
+msgid "ini: .INI format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:64
+msgid "kernelhelp: Help messages of each kernel compilation option."
+msgstr "kernelhelp: La helpmesaoj de 	iu agorda5o de la kernokompilado."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:65
+msgid "latex: LaTeX format."
+msgstr "latex: la formato LaTeX."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:66
+msgid "man: Good old manual page format."
+msgstr "Fidinda, fidata formato de helpopaoj."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:67
+msgid "pod: Perl Online Documentation format."
+msgstr "pod: la formato Perl Online Documentation."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:68
+msgid "sgml: either debiandoc or docbook DTD."
+msgstr "sgml: am debiandoc am docbook DTD."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:69
+#, fuzzy
+msgid "texinfo: The info page format."
+msgstr "latex: la formato LaTeX."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:70
+msgid "tex: generic TeX documents (see also latex)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:71
+msgid "text: simple text document."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:73
+msgid "xhtml: XHTML documents."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:74
+msgid "xml: generic XML documents (see also docbook)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Common.pm:82
+#, perl-format
+msgid ""
+"%s version %s.\n"
+"written by Martin Quinson and Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"This is free software; see source code for copying\n"
+"conditions. There is NO warranty; not even for\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+"%s versio %s.\n"
+"verkita de Martin Quinson kaj Denis Barbier.\n"
+"\n"
+"Kopirajto C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"Tiu 	i estas libera programo; vidu la fontkodon por kodi	oj de\n"
+"kopiado. NE estas garantio, e	 ne pri TAlGECO POR IU AJN\n"
+"SPECIALA FUNKCIO."
+
+#: ../../lib/Locale/Po4a/Debconf.pm:171
+#, perl-format
+msgid "Translated field in master document: %s"
+msgstr "Tradukita kampo en 	efdokumento: %s"
+
+#: ../../lib/Locale/Po4a/KernelHelp.pm:104
+msgid "Syntax error"
+msgstr "Sintakseraro"
+
+#: ../../lib/Locale/Po4a/Man.pm:456 ../../lib/Locale/Po4a/Po.pm:153
+#: ../../lib/Locale/Po4a/Sgml.pm:243 ../../lib/Locale/Po4a/TeX.pm:1612
+#: ../../lib/Locale/Po4a/Xml.pm:322
+#, perl-format
+msgid "Unknown option: %s"
+msgstr "Nekonata agorda5o: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:473
+msgid ""
+"Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."
+msgstr ""
+"Nevalida valoro 'groff_code'. Estu unu el 'fail', 'verbatim', 'translate'."
+
+#: ../../lib/Locale/Po4a/Man.pm:520
+msgid ""
+"The no_wrap parameters must be a set of comma-separated begin:end couples.\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:566
+msgid "Invalid 'unknown_macros' value. Must be one of:\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:620
+msgid ""
+"This file was generated with Pod::Man. Translate the pod file with the pod "
+"module of po4a."
+msgstr ""
+"Tiu 	i dosiero estis kreita per Pod::Man. Vi traduku la pod-dosiero per la "
+"pod-modulo de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:623
+msgid ""
+"This file was generated with help2man. Translate the source file with the "
+"regular gettext."
+msgstr ""
+"Tiu 	i dosiero estis kreita per help2man. Vi traduku la fontodosieron per "
+"normala gettext."
+
+#: ../../lib/Locale/Po4a/Man.pm:625
+msgid ""
+"This file was generated with docbook-to-man. Translate the source file with "
+"the sgml module of po4a."
+msgstr ""
+"Tiu 	i dosiero estis kreita per docbook-to-man. Vi traduku la fontodosieron "
+"per la sgml-modulo de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:628
+msgid ""
+"This file was generated with docbook2man. Translate the source file with the "
+"sgml module of po4a."
+msgstr ""
+"Tiu 	i dosiero estis kreita per docbook2man. Vi traduku la fontodosieron per "
+"la sgml-modulo de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:632 ../../lib/Locale/Po4a/Man.pm:640
+#, perl-format
+msgid ""
+"This file was generated with %s. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Tiu 	i dosiero estis kreita per %s. Vi devus traduki la fontodosieron, sed "
+"ni tamen damrigas."
+
+#: ../../lib/Locale/Po4a/Man.pm:636
+msgid ""
+"This file was generated with db2man.xsl. Translate the source file with the "
+"xml module of po4a."
+msgstr ""
+"Tiu 	i dosiero estis kreita per db2man.xsl. Vi traduku la fontodosieron per "
+"la xml-modulo de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:646
+#, perl-format
+msgid ""
+"This file contains the line '%s'. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Tiu 	i dosiero enhavas la linion '%s'. Vi devus traduki la fontodosieron, "
+"sed ni tamen damrigas."
+
+#: ../../lib/Locale/Po4a/Man.pm:708
+#, perl-format
+msgid ""
+"Font modifiers followed by a command may disturb po4a.  You should either "
+"remove the font modifier '%s', or integrate a \\f font modifier in the "
+"following command ('%s'), but continuing anyway."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:813
+msgid ""
+"The unshiftline is not supported for the man module. Please send a bug "
+"report with the groff page that generated this error."
+msgstr ""
+"La unshiftline ne estas subtenata por la man-modulo. Bonvolu sendi "
+"cimraporton kun la groff-pao, kiu generis tiun 	i eraro."
+
+#: ../../lib/Locale/Po4a/Man.pm:856
+#, perl-format
+msgid ""
+"macro %s called without arguments. Even if placing the macro arguments on "
+"the next line is authorized by man(7), handling this would make the po4a "
+"parser too complicate. Please simply put the macro args on the same line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:884
+msgid "Escape sequence \\c encountered. This is not completely handled yet."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1047
+#, perl-format
+msgid "Unbalanced '<' and '>' in font modifier. Faulty message: %s"
+msgstr "Senpara '<' kaj '>' en tipara modifilo. Erara mesao: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1224
+#, perl-format
+msgid "Unparsable line: %s"
+msgstr "Neanalizebla linio: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1297
+#, perl-format
+msgid ""
+"Unknown macro '%s'. Remove it from the document, or refer to the Locale::"
+"Po4a::Man manpage to see how po4a can handle new macros."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1508
+msgid ""
+"Escaped space at the end of macro arg. With high probability, it won't do "
+"the trick with po4a (because of wrapping). You may want to remove it and use "
+"the .nf/.fi groff macro to control the wrapping."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:1682
+#, perl-format
+msgid "Unsupported font in: '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2031
+msgid ""
+"This page defines a new macro with '.de'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2097
+msgid "The .ie macro must be followed by a .el macro."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2123
+#, perl-format
+msgid ""
+"This page uses conditionals with '%s'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2164
+#, perl-format
+msgid ""
+"This page includes another file with '%s'. Do not forget to translate this "
+"file ('%s')."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2280
+#, perl-format
+msgid ""
+"This page uses the '%s' request with the number of lines in argument. This "
+"is not supported yet."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:2295
+#, perl-format
+msgid ""
+"This page uses the '%s' request. This request is only supported when no "
+"argument is provided."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/NewsDebian.pm:87
+msgid "Begin of a new entry before the end of previous one"
+msgstr "Komenco de nova elemento antam la fino de la antama."
+
+#: ../../lib/Locale/Po4a/Po.pm:159
+#, perl-format
+msgid ""
+"Invalid value for option 'porefs' ('%s' is not one of 'full', 'noline' or "
+"'none')"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:204
+msgid "Please provide a non-null filename"
+msgstr "Bonvolu provizi nenulan dosiernomon"
+
+#: ../../lib/Locale/Po4a/Po.pm:211 ../../lib/Locale/Po4a/TeX.pm:913
+#: ../../lib/Locale/Po4a/TransTractor.pm:396
+#: ../../lib/Locale/Po4a/TransTractor.pm:530
+#: ../../lib/Locale/Po4a/Xhtml.pm:135 ../../lib/Locale/Po4a/Xml.pm:83
+#, perl-format
+msgid "Can't read from %s: %s"
+msgstr "Ne eblas legi de %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:250
+#, perl-format
+msgid "Strange line: -->%s<--"
+msgstr "Stranga linio: -->%s<--"
+
+#: ../../lib/Locale/Po4a/Po.pm:275 ../../lib/Locale/Po4a/Po.pm:392
+#: ../../lib/Locale/Po4a/TransTractor.pm:430
+msgid "Can't write to a file without filename"
+msgstr "Ne eblas skribi al dosiero sen dosiernomo"
+
+#: ../../lib/Locale/Po4a/Po.pm:290 ../../lib/Locale/Po4a/TransTractor.pm:445
+#, perl-format
+msgid "Can't write to %s: %s"
+msgstr "Ne eblas skribi al %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:366
+#, fuzzy, perl-format
+msgid "Can't unlink %s: %s."
+msgstr "Ne eblas forigi %s."
+
+#: ../../lib/Locale/Po4a/Po.pm:374 ../../po4a:987
+#, fuzzy, perl-format
+msgid "Can't copy %s to %s: %s."
+msgstr "Ne eblas skribi al %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:379 ../../lib/Locale/Po4a/Po.pm:384
+#: ../../po4a:994
+#, fuzzy, perl-format
+msgid "Can't move %s to %s: %s."
+msgstr "Ne eblas skribi al %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:424
+msgid ""
+"\n"
+"The gettextization failed (once again). Don't give up, gettextizing is a "
+"subtle art, but this is only needed once to convert a project to the "
+"gorgeous luxus offered by po4a to translators.\n"
+"Please refer to the po4a(7) documentation, the section \"HOWTO convert a pre-"
+"existing translation to po4a?\" contains several hints to help you in your "
+"task"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:434
+#, perl-format
+msgid ""
+"Original has more strings than the translation (%d>%d). Please fix it by "
+"editing the translated version to add some dummy entry."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:440
+#, perl-format
+msgid ""
+"Original has less strings than the translation (%d<%d). Please fix it by "
+"removing the extra entry from the translated file. You may need an addendum "
+"(cf po4a(7)) to reput the chunk in place after gettextization. A possible "
+"cause is that a text duplicated in the original is not translated the same "
+"way each time. Remove one of the translations, and you're fine."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:493
+#, perl-format
+msgid ""
+"po4a gettextization: Structure disparity between original and translated "
+"files:\n"
+"msgid (at %s) is of type '%s' while\n"
+"msgstr (at %s) is of type '%s'.\n"
+"Original text: %s\n"
+"Translated text: %s\n"
+"(result so far dumped to gettextization.failed.po)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:701
+#, perl-format
+msgid "Eval failure: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1024
+#, perl-format
+msgid "msgid defined twice: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Po.pm:1044
+#, perl-format
+msgid ""
+"Translations don't match for:\n"
+"%s\n"
+"-->First translation:\n"
+"%s\n"
+" Second translation:\n"
+"%s\n"
+" Old translation discarded."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:209
+msgid ""
+"The needed module SGMLS.pm was not found and needs to be installed. It can "
+"be found on the CPAN, in package libsgmls-perl on debian, etc."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:277
+msgid "msgid skipped to help translators (contains only an entity)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:284
+msgid "msgid skipped to help translators (contains only tags)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:292
+msgid ""
+"msgid skipped to help translators (contains only opening or closing tags of "
+"marked sections)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:369
+msgid ""
+"Trying to handle a XML document as a SGML one. Feel lucky if it works, help "
+"us implementing a proper XML backend if it does not."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:382
+msgid ""
+"This file is not a master SGML document (no DOCTYPE). It may be a file to be "
+"included by another one, in which case it should not be passed to po4a "
+"directly. Text from included files is extracted/translated when handling the "
+"master file including them."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:501
+msgid "DTD of this file is unknown, but proceeding as requested."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:505
+msgid ""
+"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog "
+"follows:"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:599 ../../lib/Locale/Po4a/Sgml.pm:681
+#, perl-format
+msgid "Can't open %s (content of entity %s%s;): %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:652
+#, perl-format
+msgid "unrecognized prolog inclusion entity: %%%s;"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:769
+#, perl-format
+msgid "Can't close tempfile: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:775
+#, perl-format
+msgid "Can't run nsgmls: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:890
+#, perl-format
+msgid "Unknown tag %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:924
+#, perl-format
+msgid "bad translation '%s' for '%s' in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:979 ../../lib/Locale/Po4a/Sgml.pm:1057
+#, perl-format
+msgid "Closing tag for a translation container missing before %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1140
+#, perl-format
+msgid "Unknown SGML event type: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1149
+msgid ""
+"Warning: nsgmls produced some errors.  This is usually caused by po4a, which "
+"modifies the input and restores it afterwards, causing the input of nsgmls "
+"to be invalid.  This is usually safe, but you may wish to verify the "
+"generated document with nsgmls -wno-valid.  Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:501 ../../lib/Locale/Po4a/TeX.pm:581
+#, perl-format
+msgid "un-balanced %s in '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:515 ../../lib/Locale/Po4a/TeX.pm:599
+#, perl-format
+msgid "Error while checking the number of arguments of the '%s' command: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:764 ../../lib/Locale/Po4a/TeX.pm:861
+#, perl-format
+msgid "Unknown command: '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:907 ../../lib/Locale/Po4a/TransTractor.pm:392
+msgid "Can't read from file without having a filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:982 ../../lib/Locale/Po4a/TransTractor.pm:417
+#: ../../lib/Locale/Po4a/Xhtml.pm:144 ../../lib/Locale/Po4a/Xml.pm:92
+#, perl-format
+msgid "Can't close %s after reading: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1017 ../../po4a:560
+#, perl-format
+msgid "Can't open %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1055
+#, perl-format
+msgid "Cannot use an alias to the unknown command '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1061
+#, perl-format
+msgid ""
+"You are using the old definitions format (%s).  Please update this "
+"definition line."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1264 ../../lib/Locale/Po4a/TeX.pm:1518
+#, perl-format
+msgid "unknown environment: '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1286
+#, perl-format
+msgid "unmatched end of environment '%s'"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1332 ../../lib/Locale/Po4a/TeX.pm:1444
+#, perl-format
+msgid "Wrong number of arguments for the '%s' command."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1345 ../../lib/Locale/Po4a/TeX.pm:1457
+#: ../../lib/Locale/Po4a/TeX.pm:1545
+msgid "An optional argument was provided, but a mandatory one is expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1349 ../../lib/Locale/Po4a/TeX.pm:1461
+#, perl-format
+msgid "Command '%s': %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1403
+#, perl-format
+msgid "register_generic_command: unsupported format: '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:1512
+msgid "The first argument of \\begin is mandatory."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:452
+#, perl-format
+msgid "Can't close %s after writing: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:535
+#, perl-format
+msgid "Can't read Po4a header from %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:540
+#, perl-format
+msgid "First line of %s does not look like a Po4a header."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:545
+#, perl-format
+msgid "Syntax error in Po4a header of %s, near \"%s\""
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:559
+#, perl-format
+msgid "Invalid argument in the Po4a header of %s: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:565
+#, perl-format
+msgid "The Po4a header of %s does not define the mode."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:569
+#, perl-format
+msgid ""
+"Mode invalid in the Po4a header of %s: should be 'before' or 'after' not %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:574
+#, perl-format
+msgid "The Po4a header of %s does not define the position."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:578
+msgid "No ending boundary given in the Po4a header, but mode=after."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:604
+msgid "Can't apply addendum when not given the filename"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:607
+#, perl-format
+msgid "Addendum %s does not exist."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:628
+#, perl-format
+msgid "No candidate position for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:633
+#, perl-format
+msgid "More than one candidate position found for the addendum %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:639
+#: ../../lib/Locale/Po4a/TransTractor.pm:662
+#, perl-format
+msgid "Addendum '%s' applied before this line: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:669
+#, perl-format
+msgid "Addendum '%s' applied after the line: %s."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:676
+#, perl-format
+msgid "Addendum '%s' applied at the end of the file."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TransTractor.pm:836
+#: ../../lib/Locale/Po4a/TransTractor.pm:1012
+#, perl-format
+msgid ""
+"Couldn't determine the input document's charset. Please specify it on the "
+"command line. (non-ascii char at %s)"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Wml.pm:88
+#, perl-format
+msgid "Can't create a temporary xml file: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:425
+#, perl-format
+msgid "Internal error: unknown type identifier '%s'."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:590
+#, perl-format
+msgid "Bad document type. '%s' expected."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:662 ../../lib/Locale/Po4a/Xml.pm:1106
+#, perl-format
+msgid ""
+"Unexpected closing tag </%s> found. The main document may be wrong.  "
+"Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:664 ../../lib/Locale/Po4a/Xml.pm:1108
+#, perl-format
+msgid "Unexpected closing tag </%s> found. The main document may be wrong."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1004
+#, perl-format
+msgid "Content of attribute %s excluded: %s"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1013
+msgid "Bad attribute syntax"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Xml.pm:1323
+#, perl-format
+msgid "Content of tag %s excluded: %s"
+msgstr ""
+
+#: ../../po4a:494 ../../po4a:670
+#, perl-format
+msgid "Unparsable argument '%s' (%s)."
+msgstr ""
+
+#: ../../po4a:528
+#, perl-format
+msgid "failed to execute '%s': %s."
+msgstr ""
+
+#: ../../po4a:532
+#, perl-format
+msgid "'%s' died with signal %d, with coredump."
+msgstr ""
+
+#: ../../po4a:536
+#, perl-format
+msgid "'%s' died with signal %d, without coredump."
+msgstr ""
+
+#: ../../po4a:541
+#, perl-format
+msgid "'%s' exited with value %d."
+msgstr ""
+
+#: ../../po4a:545
+#, perl-format
+msgid "Error: %s"
+msgstr ""
+
+#: ../../po4a:551 ../../po4a-gettextize:197 ../../po4a-normalize:140
+#: ../../po4a-translate:204 ../../po4a-translate:205 ../../po4a-updatepo:192
+#: ../../scripts/msguntypot:171 ../../scripts/msguntypot:173
+#, perl-format
+msgid "File %s does not exist."
+msgstr ""
+
+#: ../../po4a:573
+#, perl-format
+msgid "Unknown variable: %s"
+msgstr "Nekonata variablo: %s"
+
+#: ../../po4a:582
+#, perl-format
+msgid "Syntax error: %s"
+msgstr ""
+
+#: ../../po4a:609 ../../po4a:621
+#, perl-format
+msgid "'%s' redeclared"
+msgstr ""
+
+#: ../../po4a:614
+#, perl-format
+msgid "Unparsable argument '%s'."
+msgstr ""
+
+#: ../../po4a:628
+#, perl-format
+msgid ""
+"The '%s' master file was specified earlier in the configuration file.  This "
+"may cause problems with options."
+msgstr ""
+
+#: ../../po4a:674
+msgid "The translated and master file are the same."
+msgstr ""
+
+#: ../../po4a:681
+#, perl-format
+msgid "Translation of %s in %s redefined"
+msgstr ""
+
+#: ../../po4a:703
+#, perl-format
+msgid "Unparsable command '%s'."
+msgstr ""
+
+#: ../../po4a:709
+msgid "po4a_paths not declared. Dunno where to find the pot and po files"
+msgstr ""
+
+#: ../../po4a:746
+msgid "Splitted mode, creating a temporary POT"
+msgstr ""
+
+#: ../../po4a:781 ../../po4a:914 ../../po4a-updatepo:220
+#, perl-format
+msgid "Updating %s:"
+msgstr ""
+
+#: ../../po4a:784 ../../po4a:924 ../../po4a-updatepo:228
+#, perl-format
+msgid "Creating %s:"
+msgstr ""
+
+#: ../../po4a:831 ../../po4a:861 ../../po4a:948 ../../po4a-updatepo:202
+#, perl-format
+msgid "Can't create a temporary pot file: %s"
+msgstr ""
+
+#: ../../po4a:842
+#, perl-format
+msgid " (%d entries)"
+msgstr ""
+
+#: ../../po4a:868 ../../po4a:974
+#, fuzzy, perl-format
+msgid "Can't create directory '%s': %s"
+msgstr "Ne eblas skribi al %s: %s"
+
+#: ../../po4a:888 ../../scripts/msguntypot:208
+#, perl-format
+msgid "Can't create a temporary po file: %s"
+msgstr ""
+
+#: ../../po4a:1038
+#, perl-format
+msgid "%s doesn't need to be updated."
+msgstr ""
+
+#: ../../po4a:1079
+#, perl-format
+msgid "Discard %s (%s of %s strings; only %s%% translated; need %s%%)."
+msgstr ""
+
+#: ../../po4a:1086
+#, perl-format
+msgid "Timestamp %s created."
+msgstr ""
+
+#: ../../po4a:1096
+#, perl-format
+msgid "Timestamp %s removed."
+msgstr ""
+
+#: ../../po4a:1105
+#, perl-format
+msgid "Addendum %s does NOT apply to %s (translation discarded)."
+msgstr ""
+
+#: ../../po4a:1114
+#, perl-format
+msgid "%s is %s%% translated (%s strings)."
+msgstr ""
+
+#: ../../po4a:1117 ../../po4a-translate:236
+#, perl-format
+msgid "%s is %s%% translated (%s of %s strings)."
+msgstr ""
+
+#: ../../po4a-translate:242
+#, perl-format
+msgid "Discard the translation of %s (only %s%% translated; need %s%%)."
+msgstr ""
+
+#: ../../po4a-translate:249
+#, perl-format
+msgid "Discard the translation of %s (addendum %s does not apply)."
+msgstr ""
+
+#: ../../po4a-updatepo:193
+msgid "po4a-updatepo can't take the input po from stdin."
+msgstr ""
+
+#: ../../po4a-updatepo:205
+msgid "Parse input files... "
+msgstr ""
+
+#: ../../po4a-updatepo:215
+msgid "done."
+msgstr ""
+
+#: ../../po4a-updatepo:224 ../../scripts/msguntypot:217
+#, perl-format
+msgid "Error while running msgmerge: %s"
+msgstr ""
+
+#: ../../po4a-updatepo:231
+#, perl-format
+msgid "Error while copying the po file: %s"
+msgstr ""
+
+#: ../../scripts/msguntypot:170 ../../scripts/msguntypot:172
+#, perl-format
+msgid "Mandatory argument '%s' missing."
+msgstr ""
+
+#: ../../scripts/msguntypot:181
+#, perl-format
+msgid ""
+"The new and old pot files have different amount of strings (%d != %d). "
+"Something's seriously wrong here."
+msgstr ""
+
+#: ../../scripts/msguntypot:199
+#, perl-format
+msgid "Found %d modified entries."
+msgstr ""
+
+#: ../../scripts/msguntypot:213
+#, perl-format
+msgid "Handling %s"
+msgstr ""
+
+#: ../../scripts/msguntypot:238
+#, perl-format
+msgid "Modified %d entries in %d files."
+msgstr ""
+
+#~ msgid ""
+#~ "This page seems to be a mdoc(7) formatted one. This is not supported "
+#~ "(yet)."
+#~ msgstr ""
+#~ "Tiu 	i pao ]ajnas havi la formaton mdoc(7). Tio (ankoram) ne estas "
+#~ "subtenata."

Added: po4a/po/bin/es.po
===================================================================
--- po4a/po/bin/es.po	                        (rev 0)
+++ po4a/po/bin/es.po	2007-11-14 06:12:04 UTC (rev 495)
@@ -0,0 +1,1040 @@
+# Spanish translation of po4a
+# This file is distributed under the same license as the po4a package.
+# Jordi Vilalta <jvprat@xxxxxxxxx>, 2004-2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: po4a bin\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-12 13:53+0200\n"
+"PO-Revision-Date: 2007-08-12 20:01+0200\n"
+"Last-Translator: Jordi Vilalta Prat <jvprat@xxxxxxxxx>\n"
+"Language-Team: ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:27
+msgid "Need to provide a module name"
+msgstr "Se debe proporcionar un nombre de mulo"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:46
+#, perl-format
+msgid "Unknown format type: %s."
+msgstr "Tipo de formato desconocido: %s."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:48
+#, perl-format
+msgid "Module loading error: %s"
+msgstr "Error al cargar el mulo: %s"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:57
+msgid "List of valid formats:"
+msgstr "Lista de formatos v$BaM(Bidos:"
+
+#: ../../lib/Locale/Po4a/Chooser.pm:59
+msgid "dia: uncompressed Dia diagrams."
+msgstr "dia: diagramas de Dia descomprimidos."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:60
+msgid "docbook: Docbook XML."
+msgstr "docbook: Docbook XML."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:61
+msgid "guide: Gentoo Linux's xml documentation format."
+msgstr "guide: formato xml de la documentaci de Gentoo Linux."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:63
+msgid "ini: .INI format."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:64
+msgid "kernelhelp: Help messages of each kernel compilation option."
+msgstr "kernelhelp: La ayuda de las opciones de compilaci del kernel."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:65
+msgid "latex: LaTeX format."
+msgstr "latex: formato LaTeX."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:66
+msgid "man: Good old manual page format."
+msgstr "man: El cl$BaT(Bico formato de las p$BaH(Binas de manual."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:67
+msgid "pod: Perl Online Documentation format."
+msgstr "pod: Formato de Documentaci Online de Perl."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:68
+msgid "sgml: either debiandoc or docbook DTD."
+msgstr "sgml: ya sea el DTD de debiandoc o el de docbook."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:69
+msgid "texinfo: The info page format."
+msgstr "texinfo: El formato de las p$BaH(Binas info."
+
+#: ../../lib/Locale/Po4a/Chooser.pm:70
+msgid "tex: generic TeX documents (see also latex)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:71
+msgid "text: simple text document."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:73
+msgid "xhtml: XHTML documents."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Chooser.pm:74
+msgid "xml: generic XML documents (see also docbook)."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Common.pm:82
+#, perl-format
+msgid ""
+"%s version %s.\n"
+"written by Martin Quinson and Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"This is free software; see source code for copying\n"
+"conditions. There is NO warranty; not even for\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+"%s versi %s.\n"
+"escrito por Martin Quinson y Denis Barbier.\n"
+"\n"
+"Copyright (C) 2002, 2003, 2004 Software of Public Interest, Inc.\n"
+"Esto es software libre; vea los fuentes para las condiciones\n"
+"de copia. No se da NINGUNA garant$ByB(B; ni siquiera para fines\n"
+"COMERCIALES o ADAPTACION A UN PROPOSITO PARTICULAR."
+
+#: ../../lib/Locale/Po4a/Debconf.pm:171
+#, perl-format
+msgid "Translated field in master document: %s"
+msgstr "Campo traducido en el documento principal: %s"
+
+#: ../../lib/Locale/Po4a/KernelHelp.pm:104
+msgid "Syntax error"
+msgstr "Error de sintaxis"
+
+#: ../../lib/Locale/Po4a/Man.pm:456 ../../lib/Locale/Po4a/Po.pm:153
+#: ../../lib/Locale/Po4a/Sgml.pm:243 ../../lib/Locale/Po4a/TeX.pm:1612
+#: ../../lib/Locale/Po4a/Xml.pm:322
+#, perl-format
+msgid "Unknown option: %s"
+msgstr "Opci desconocida: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:473
+msgid ""
+"Invalid 'groff_code' value. Must be one of 'fail', 'verbatim', 'translate'."
+msgstr ""
+"Valor de 'groff_code' inv$BaM(Bido. Debe ser 'fail', 'verbatim' o 'translate'."
+
+#: ../../lib/Locale/Po4a/Man.pm:520
+msgid ""
+"The no_wrap parameters must be a set of comma-separated begin:end couples.\n"
+msgstr ""
+"Los par$BaN(Betros de no_wrap deben ser un conjunto de parejas inicio:final "
+"separadas por comas.\n"
+
+#: ../../lib/Locale/Po4a/Man.pm:566
+msgid "Invalid 'unknown_macros' value. Must be one of:\n"
+msgstr ""
+
+#: ../../lib/Locale/Po4a/Man.pm:620
+msgid ""
+"This file was generated with Pod::Man. Translate the pod file with the pod "
+"module of po4a."
+msgstr ""
+"Este fichero ha sido generado con Pod::Man. Traduzca el fichero pod con el "
+"mulo pod de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:623
+msgid ""
+"This file was generated with help2man. Translate the source file with the "
+"regular gettext."
+msgstr ""
+"Este fichero ha sido generado con help2man. Traduzca el fichero fuente con "
+"el gettext habitual."
+
+#: ../../lib/Locale/Po4a/Man.pm:625
+msgid ""
+"This file was generated with docbook-to-man. Translate the source file with "
+"the sgml module of po4a."
+msgstr ""
+"Este fichero ha sido generado con docbook-to-man. Traduzca el fichero fuente "
+"con el mulo sgml de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:628
+msgid ""
+"This file was generated with docbook2man. Translate the source file with the "
+"sgml module of po4a."
+msgstr ""
+"Este fichero ha sido generado con docbook2man. Traduzca el fichero fuente "
+"con el mulo sgml de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:632 ../../lib/Locale/Po4a/Man.pm:640
+#, perl-format
+msgid ""
+"This file was generated with %s. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Este fichero ha sido generado con %s. Se deber$ByB(B traducir el fichero fuente, "
+"pero se contin$By&(B de todas formas."
+
+#: ../../lib/Locale/Po4a/Man.pm:636
+msgid ""
+"This file was generated with db2man.xsl. Translate the source file with the "
+"xml module of po4a."
+msgstr ""
+"Este fichero ha sido generado con db2man.xsl. Traduzca el fichero fuente con "
+"el mulo xml de po4a."
+
+#: ../../lib/Locale/Po4a/Man.pm:646
+#, perl-format
+msgid ""
+"This file contains the line '%s'. You should translate the source file, but "
+"continuing anyway."
+msgstr ""
+"Este fichero contiene la l$ByO(Bea '%s'. Se deber$ByB(B traducir el fichero fuente, "
+"pero se contin$By&(B de todas formas."
+
+#: ../../lib/Locale/Po4a/Man.pm:708
+#, perl-format
+msgid ""
+"Font modifiers followed by a command may disturb po4a.  You should either "
+"remove the font modifier '%s', or integrate a \\f font modifier in the "
+"following command ('%s'), but continuing anyway."
+msgstr ""
+"Los modificadores de fuentes seguidos de un comando pueden confundir a "
+"po4a.  Se deber$ByB(B quitar el modificador de fuente '%s', o integrar un "
+"modificador de fuente \\f en el siguiente comando ('%s'), pero se contin$By&(B "
+"de todas formas."
+
+#: ../../lib/Locale/Po4a/Man.pm:813
+msgid ""
+"The unshiftline is not supported for the man module. Please send a bug "
+"report with the groff page that generated this error."
+msgstr ""
+"El mulo man no tiene soporte para unshiftline. Env$ByF(B un informe de error "
+"con la p$BaH(Bina de groff que ha generado $BqT(Bte error."
+
+#: ../../lib/Locale/Po4a/Man.pm:856
+#, perl-format
+msgid ""
+"macro %s called without arguments. Even if placing the macro arguments on "
+"the next line is authorized by man(7), handling this would make the po4a "
+"parser too complicate. Please simply put the macro args on the same line."
+msgstr ""
+"la macro %s se ha llamado sin par$BaN(Betros. A pesar de que man(7) autoriza a "
+"poner los par$BaN(Betros de la macro en la siguiente l$ByO(Bea, tratar esto har$ByB(B "
+"muy complicado el analizador de po4a. Por favor, simplemente ponga los "
+"par$BaN(Betros de la macro en la misma l$ByO(Bea."
+
+#: ../../lib/Locale/Po4a/Man.pm:884
+msgid "Escape sequence \\c encountered. This is not completely handled yet."
+msgstr ""
+"Encontrada la secuencia de escape \\c. Su tratamiento a$By3(B no es completo."
+
+#: ../../lib/Locale/Po4a/Man.pm:1047
+#, perl-format
+msgid "Unbalanced '<' and '>' in font modifier. Faulty message: %s"
+msgstr ""
+"'<' y '>' no balanceados en el modificador de fuente. Mensaje del fallo: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1224
+#, perl-format
+msgid "Unparsable line: %s"
+msgstr "No se ha podido analizar la l$ByO(Bea: %s"
+
+#: ../../lib/Locale/Po4a/Man.pm:1297
+#, perl-format
+msgid ""
+"Unknown macro '%s'. Remove it from the document, or refer to the Locale::"
+"Po4a::Man manpage to see how po4a can handle new macros."
+msgstr ""
+"Macro '%s' desconocida. Elim$ByO(Bela del documento, o consulte la p$BaH(Bina de "
+"manual de Locale::Po4a::Man para ver co po4a puede tratar nuevas macros."
+
+#: ../../lib/Locale/Po4a/Man.pm:1508
+msgid ""
+"Escaped space at the end of macro arg. With high probability, it won't do "
+"the trick with po4a (because of wrapping). You may want to remove it and use "
+"the .nf/.fi groff macro to control the wrapping."
+msgstr ""
+"Espacio saltado al final del par$BaN(Betro de macro. Probablemente no harsu "
+"funci con po4a (por el justificado). Quizquiera quitarlo y usar las "
+"macros .nf/.fi de groff para controlar el justificado."
+
+#: ../../lib/Locale/Po4a/Man.pm:1682
+#, perl-format
+msgid "Unsupported font in: '%s'."
+msgstr "Fuente no soportada en: '%s'."
+
+#: ../../lib/Locale/Po4a/Man.pm:2031
+msgid ""
+"This page defines a new macro with '.de'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+"Esta p$BaH(Bina define una nueva macro con '.de'. Como po4a no es un analizador "
+"de groff real, $BqT(Bto no estsoportado."
+
+#: ../../lib/Locale/Po4a/Man.pm:2097
+msgid "The .ie macro must be followed by a .el macro."
+msgstr "La macro .ie debe ir seguida de una macro .el."
+
+#: ../../lib/Locale/Po4a/Man.pm:2123
+#, perl-format
+msgid ""
+"This page uses conditionals with '%s'. Since po4a is not a real groff "
+"parser, this is not supported."
+msgstr ""
+"Esta p$BaH(Bina utiliza condicionales con '%s'. Como po4a no es un analizador de "
+"groff real, esto no estsoportado."
+
+#: ../../lib/Locale/Po4a/Man.pm:2164
+#, perl-format
+msgid ""
+"This page includes another file with '%s'. Do not forget to translate this "
+"file ('%s')."
+msgstr ""
+"Esta p$BaH(Bina incluye otro fichero con '%s'. No se olvide de traducir este "
+"fichero ('%s')."
+
+#: ../../lib/Locale/Po4a/Man.pm:2280
+#, perl-format
+msgid ""
+"This page uses the '%s' request with the number of lines in argument. This "
+"is not supported yet."
+msgstr ""
+"Esta p$BaH(Bina utiliza la petici '%s' con los n$By2(Beros de l$ByO(Bea como "
+"par$BaN(Betros. Esto no estsoportado (a$By3(B)."
+
+#: ../../lib/Locale/Po4a/Man.pm:2295
+#, perl-format
+msgid ""
+"This page uses the '%s' request. This request is only supported when no "
+"argument is provided."
+msgstr ""
+"Esta p$BaH(Bina utiliza la petici '%s'.  Esta solo estsoportada cuando no se "
+"le pasan par$BaN(Betros."
+
+#: ../../lib/Locale/Po4a/NewsDebian.pm:87
+msgid "Begin of a new entry before the end of previous one"
+msgstr "Comienzo de una nueva entrada antes del fin de la anterior"
+
+#: ../../lib/Locale/Po4a/Po.pm:159
+#, perl-format
+msgid ""
+"Invalid value for option 'porefs' ('%s' is not one of 'full', 'noline' or "
+"'none')"
+msgstr ""
+"Valor inv$BaM(Bido para la opci 'porefs' ('%s' no es 'full', 'noline' ni "
+"'none')"
+
+#: ../../lib/Locale/Po4a/Po.pm:204
+msgid "Please provide a non-null filename"
+msgstr "Por favor, proporcione un nombre de fichero no nulo"
+
+#: ../../lib/Locale/Po4a/Po.pm:211 ../../lib/Locale/Po4a/TeX.pm:913
+#: ../../lib/Locale/Po4a/TransTractor.pm:396
+#: ../../lib/Locale/Po4a/TransTractor.pm:530
+#: ../../lib/Locale/Po4a/Xhtml.pm:135 ../../lib/Locale/Po4a/Xml.pm:83
+#, perl-format
+msgid "Can't read from %s: %s"
+msgstr "No se ha podido leer de %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:250
+#, perl-format
+msgid "Strange line: -->%s<--"
+msgstr "L$ByO(Bea extra: -->%s<--"
+
+#: ../../lib/Locale/Po4a/Po.pm:275 ../../lib/Locale/Po4a/Po.pm:392
+#: ../../lib/Locale/Po4a/TransTractor.pm:430
+msgid "Can't write to a file without filename"
+msgstr "No se puede escribir en un fichero sin nombre"
+
+#: ../../lib/Locale/Po4a/Po.pm:290 ../../lib/Locale/Po4a/TransTractor.pm:445
+#, perl-format
+msgid "Can't write to %s: %s"
+msgstr "No se ha podido escribir en %s: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:366
+#, fuzzy, perl-format
+msgid "Can't unlink %s: %s."
+msgstr "No se ha podido borrar %s."
+
+#: ../../lib/Locale/Po4a/Po.pm:374 ../../po4a:987
+#, fuzzy, perl-format
+msgid "Can't copy %s to %s: %s."
+msgstr "No se ha podido mover %s a %s."
+
+#: ../../lib/Locale/Po4a/Po.pm:379 ../../lib/Locale/Po4a/Po.pm:384
+#: ../../po4a:994
+#, fuzzy, perl-format
+msgid "Can't move %s to %s: %s."
+msgstr "No se ha podido mover %s a %s."
+
+#: ../../lib/Locale/Po4a/Po.pm:424
+msgid ""
+"\n"
+"The gettextization failed (once again). Don't give up, gettextizing is a "
+"subtle art, but this is only needed once to convert a project to the "
+"gorgeous luxus offered by po4a to translators.\n"
+"Please refer to the po4a(7) documentation, the section \"HOWTO convert a pre-"
+"existing translation to po4a?\" contains several hints to help you in your "
+"task"
+msgstr ""
+"\n"
+"La gettextizaci ha fallado (una vez m$BaT(B). No abandone, gettextizar es un "
+"arte sutil, pero so se debe hacer una vez para convertir el proyecto al "
+"maravilloso lujo ofrecido por po4a a los traductores.\n"
+"Por favor, consulte la documentaci po4a(7), la secci \"$B%=(BCo convertir "
+"una traducci ya existente a po4a?\" contiene varios trucos que se pueden "
+"ayudar en su tarea"
+
+#: ../../lib/Locale/Po4a/Po.pm:434
+#, perl-format
+msgid ""
+"Original has more strings than the translation (%d>%d). Please fix it by "
+"editing the translated version to add some dummy entry."
+msgstr ""
+"El original tiene m$BaT(B cadenas que la traducci (%d>%d). Por favor, "
+"arr$BqH(Blelo editando la versi traducida adiendo algunas entradas difusas."
+
+#: ../../lib/Locale/Po4a/Po.pm:440
+#, perl-format
+msgid ""
+"Original has less strings than the translation (%d<%d). Please fix it by "
+"removing the extra entry from the translated file. You may need an addendum "
+"(cf po4a(7)) to reput the chunk in place after gettextization. A possible "
+"cause is that a text duplicated in the original is not translated the same "
+"way each time. Remove one of the translations, and you're fine."
+msgstr ""
+"El original tiene menos cadenas que la traducci (%d<%d). Por favor, "
+"arr$BqH(Blelo quitando las entradas extra del fichero traducido. Puede que "
+"necesite un ap$BqO(Bdice (consulte po4a(7)) para volver a poner el fragmento "
+"despu$BqT(B de la gettextizaci. Una posible causa es que haya un texto "
+"duplicado en el original que se haya traducido de formas diferentes. Elimine "
+"una de las traducciones, eso deber$ByB(B bastar."
+
+#: ../../lib/Locale/Po4a/Po.pm:493
+#, perl-format
+msgid ""
+"po4a gettextization: Structure disparity between original and translated "
+"files:\n"
+"msgid (at %s) is of type '%s' while\n"
+"msgstr (at %s) is of type '%s'.\n"
+"Original text: %s\n"
+"Translated text: %s\n"
+"(result so far dumped to gettextization.failed.po)"
+msgstr ""
+"po4a gettextization: Difiere la estructura del fichero original y del "
+"traducido:\n"
+"msgid (en %s) es del tipo '%s' mientras que\n"
+"msgstr (en %s) es del tipo '%s'.\n"
+"Texto original: %s\n"
+"Texto traducido:%s\n"
+"(el resultado hasta el momento se ha guardado en gettextization.failed.po)"
+
+#: ../../lib/Locale/Po4a/Po.pm:701
+#, perl-format
+msgid "Eval failure: %s"
+msgstr "Ha fallado la evaluaci: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:1024
+#, perl-format
+msgid "msgid defined twice: %s"
+msgstr "msgid definido m$BaT(B de una vez: %s"
+
+#: ../../lib/Locale/Po4a/Po.pm:1044
+#, perl-format
+msgid ""
+"Translations don't match for:\n"
+"%s\n"
+"-->First translation:\n"
+"%s\n"
+" Second translation:\n"
+"%s\n"
+" Old translation discarded."
+msgstr ""
+"Las traducciones no encajan para:\n"
+"%s\n"
+"-->Primera traducci:\n"
+"%s\n"
+" Segunda traducci:\n"
+"%s\n"
+" Se ha descartado la traducci vieja."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:209
+msgid ""
+"The needed module SGMLS.pm was not found and needs to be installed. It can "
+"be found on the CPAN, in package libsgmls-perl on debian, etc."
+msgstr ""
+"No se ha encontrado el mulo SGMLS.pm y se necesita instalado. Puede "
+"encontrarlo en el CPAN, en el paquete libsgmls-perl de debian, etc."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:277
+msgid "msgid skipped to help translators (contains only an entity)"
+msgstr ""
+"msgid saltado para ayudar a los traductores (so contiene una entidad)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:284
+msgid "msgid skipped to help translators (contains only tags)"
+msgstr "msgid saltado para ayudar a los traductores (so contiene tags)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:292
+msgid ""
+"msgid skipped to help translators (contains only opening or closing tags of "
+"marked sections)"
+msgstr ""
+"msgid saltado para ayudar a los traductores (so contiene marcas de inicio "
+"y final de secci)"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:369
+msgid ""
+"Trying to handle a XML document as a SGML one. Feel lucky if it works, help "
+"us implementing a proper XML backend if it does not."
+msgstr ""
+"Intentando tratar un documento XML como SGML. Si$BqO(Btase afortunado si "
+"funciona, ay$By)(Benos a implementar un backend propio para XML en caso "
+"contrario."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:382
+msgid ""
+"This file is not a master SGML document (no DOCTYPE). It may be a file to be "
+"included by another one, in which case it should not be passed to po4a "
+"directly. Text from included files is extracted/translated when handling the "
+"master file including them."
+msgstr ""
+"Este fichero no es un documento principal SGML (no tiene DOCTYPE). Puede que "
+"sea un fichero a ser incluido en otro, en cuyo caso no deber$ByB(B ser pasado "
+"directamente a po4a. El texto de los ficheros incluidos es extra$ByE(Bo/"
+"traducido cuando se analiza el fichero principal, incluy$BqO(Bdolos."
+
+#: ../../lib/Locale/Po4a/Sgml.pm:501
+msgid "DTD of this file is unknown, but proceeding as requested."
+msgstr ""
+"Se desconoce el DTD de $BqT(Bte fichero, pero se procede tal como se solicit"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:505
+msgid ""
+"DTD of this file is unknown. (supported: debiandoc, docbook). The prolog "
+"follows:"
+msgstr ""
+"Se desconoce el DTD de $BqT(Bte fichero. (soportados: debiandoc, docbook). El "
+"pr$Bsl(Bogo sigue:"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:599 ../../lib/Locale/Po4a/Sgml.pm:681
+#, perl-format
+msgid "Can't open %s (content of entity %s%s;): %s"
+msgstr "No se ha podido abrir %s (contenido de la entidad %s%s;): %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:652
+#, perl-format
+msgid "unrecognized prolog inclusion entity: %%%s;"
+msgstr "entidad de inclusi$Bsn(B en el pr$Bsl(Bogo no reconocida: %%%s;"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:769
+#, perl-format
+msgid "Can't close tempfile: %s"
+msgstr "No se ha podido cerrar el fichero temporal: %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:775
+#, perl-format
+msgid "Can't run nsgmls: %s"
+msgstr "No se ha podido ejecutar nsgmls: %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:890
+#, perl-format
+msgid "Unknown tag %s"
+msgstr "Tag %s desconocido"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:924
+#, perl-format
+msgid "bad translation '%s' for '%s' in '%s'"
+msgstr "mala traducci$Bsn(B '%s' para '%s' en %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:979 ../../lib/Locale/Po4a/Sgml.pm:1057
+#, perl-format
+msgid "Closing tag for a translation container missing before %s"
+msgstr ""
+"Falta el tag de cerrado para el contenedor de la traducci$Bsn(B antes de %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1140
+#, perl-format
+msgid "Unknown SGML event type: %s"
+msgstr "Tipo de evento SGML desconocido: %s"
+
+#: ../../lib/Locale/Po4a/Sgml.pm:1149
+msgid ""
+"Warning: nsgmls produced some errors.  This is usually caused by po4a, which "
+"modifies the input and restores it afterwards, causing the input of nsgmls "
+"to be invalid.  This is usually safe, but you may wish to verify the "
+"generated document with nsgmls -wno-valid.  Continuing..."
+msgstr ""
+
+#: ../../lib/Locale/Po4a/TeX.pm:501 ../../lib/Locale/Po4a/TeX.pm:581
+#, perl-format
+msgid "un-balanced %s in '%s'"
+msgstr "%s desbalanceados en '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:515 ../../lib/Locale/Po4a/TeX.pm:599
+#, perl-format
+msgid "Error while checking the number of arguments of the '%s' command: %s"
+msgstr ""
+"Error mientras se comprobaba el n$By2(Bero de par$BaN(Betros del comando '%s': %s"
+
+#: ../../lib/Locale/Po4a/TeX.pm:764 ../../lib/Locale/Po4a/TeX.pm:861
+#, perl-format
+msgid "Unknown command: '%s'"
+msgstr "Comando desconocido: '%s'"
+
+#: ../../lib/Locale/Po4a/TeX.pm:907 ../../lib/Locale/Po4a/TransTractor.pm:392
+msgid "Can't read from file without having a file