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: