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

Outil pour visualiser le rendu d'un fichier po-debconf



Bonsoir,

grâce à l'aide de Joey Hess, je vais inclure bientôt dans po-debconf
le programme attaché, qui permet de visualiser un fichier fr.po sans 
avoir à installer le paquet traduit pour le tester.
Comme ce programme n'utilise que le fichier PO fourni en argument,
on ne peut pas s'attendre à des miracles : il n'y a que deux types
d'affichage, qui sont Select (utilisé lorsqu'un champ Choices a été
trouvé dans le fichier PO, ce qui correspond à un champ original
Select ou Multiselect) et String (pour tout le reste : boolean, note,
text ,,.). La substitution de variables n'est bien sûr pas effectuée.
L'interface voulue peut être spécifiée sur la ligne de commande avec
l'option -f.

Denis
#!/usr/bin/perl -w

use strict;
use File::Temp;
use Getopt::Long;

sub usage {
        my $rc = shift;
        print "Usage: podebconf-display-text [-h] [-f frontend] file.po\n";
        exit($rc);
}

my $help = 0;
my $frontend = '';
Getopt::Long::GetOptions(
        "h|help" => \$help,
        "f|frontend=s" => \$frontend,
) || usage(1);
usage(0) if $help;
usage(1) if $#ARGV != 0;

#  1.  Read the PO file and write a fake templates file

my $fields = {};
my $charset = "";
my $lang = $ARGV[0];
$lang =~ s/\.po$//;

{
        open(PO, "< $ARGV[0]")
                or die "Unable to open file $ARGV[0]: $!\n";
        local $/ = "\n\n";
        while (<PO>) {
                next unless m/^msgid/m;
                s/"\n"//g;
                if (m/^msgid ""$/m) {
                        $charset = $1 if m/\\nContent-Type: text\/plain; charset=(.*?)\\n/;
                        $charset = '.'.$charset if length($charset);
                        next;
                }

                my ($field) = m/#\. (\S+)/;
                my ($file,$line) = m/#:\s*([^:\s]+):(\d+)/;
                $fields->{$file} = {} unless defined($fields->{$file});
                my ($msgid) = m/^msgid "(.*)"/m;
                my ($msgstr) = m/^msgstr "(.*)"/m;
                if ($field eq 'Description') {
                        $msgid =~ s/\\n/\n /g;
                        $msgstr =~ s/\\n/\n /g;
                }
                if (defined $fields->{$file}->{$line}) {
                        $fields->{$file}->{$line}->{msgid} .= "\n ".($fields->{$file}->{$line}->{msgid} =~ m/\n/ ? ".\n " : '').$msgid;
                        $fields->{$file}->{$line}->{msgstr} .= "\n ".($fields->{$file}->{$line}->{msgstr} =~ m/\n/ ? ".\n " : '').$msgstr;
                } else {
                        $fields->{$file}->{$line} = {
                                field => $field,
                                msgid => $msgid,
                                msgstr => $msgstr,
                        };
                }
        }
        close(PO);
}

my $count = 0;
my $new = 1;
my $choices = 0;
my ($fh, $template) = File::Temp::mkstemp("tmppoTXXXXXX")
        or die "Unable to write temporary files";

for my $file (keys %$fields) {
        for (sort { $a <=> $b } keys %{$fields->{$file}}) {
                print $fh "Template: foo/bar$count\n" if $new;
                if ($fields->{$file}->{$_}->{field} eq 'Description') {
                        print $fh "Type: ".($choices ? "select" : "string")."\n";
                        $choices = 0;
                } elsif ($fields->{$file}->{$_}->{field} eq 'Choices') {
                        $choices = 1;
                } elsif ($fields->{$file}->{$_}->{field} eq 'DefaultChoice') {
                        $fields->{$file}->{$_}->{field} = 'Default';
                }
                print $fh "$fields->{$file}->{$_}->{field}: $fields->{$file}->{$_}->{msgid}\n";
                print $fh "$fields->{$file}->{$_}->{field}-$lang$charset: $fields->{$file}->{$_}->{msgstr}\n";
                $new = 0;
                if ($fields->{$file}->{$_}->{field} eq 'Description') {
                        $count++;
                        $new = 1;
                        print $fh "\n";
                }
        }
}
close($fh);

#  2.  Load the templates file in debconf DB

use Debconf::Db;
use Debconf::AutoSelect qw(:all);
use Debconf::Config;

my ($dbth, $dbt) = File::Temp::mkstemp("tmppotXXXXXX")
        or die "Unable to write temporary files";
my ($dbch, $dbc) = File::Temp::mkstemp("tmppocXXXXXX")
        or die "Unable to write temporary files";

my %hashconfig = (
        driver => "File",
        mode => '0600',
        name => "config",
        backup => 0,
        filename => $dbc
);
my %hashtemplates = (
        driver => "File",
        mode => '0600',
        name => "templates",
        backup => 0,
        filename => $dbt
);

$Debconf::Db::config=Debconf::Db->makedriver(%hashconfig);
$Debconf::Db::templates=Debconf::Db->makedriver(%hashtemplates);
Debconf::Template->load($template, 'display');
Debconf::Db->save;
unlink $template;

# 3.  Display questions

$Debconf::Db::config=Debconf::Db->makedriver(%hashconfig);
$Debconf::Db::templates=Debconf::Db->makedriver(%hashtemplates);
Debconf::Config->frontend($frontend) if length($frontend);
my $dc_frontend=make_frontend();
my $dc_confmodule=make_confmodule();
my $code=127;

my $cnt = 0;
while (1) {
	$_="RESET foo/bar$cnt\n";
	my $ret=$dc_confmodule->process_command($_);
	$_="INPUT high foo/bar$cnt\n";
	$ret=$dc_confmodule->process_command($_);
	($code, undef)=split(/ /, $ret, 2);
	last if $code ne 0;
	$_="GO\n";
	$ret=$dc_confmodule->process_command($_);
	($code, undef)=split(/ /, $ret, 2);
	$cnt++;
}

$dc_frontend->shutdown;
$dc_confmodule->finish;
Debconf::Db->save;
unlink $dbt, $dbc;

1;

Reply to: