PEF-Front
view release on metacpan or search on metacpan
nls/import-po.pl view on Meta::CPAN
#!/usr/bin/perl
use DBIx::Connector;
use Locale::PO;
use JSON;
use Encode;
use SQL::Abstract;
my $dbuser = ((getpwuid $>)[0]);
my $dbname = $dbuser;
my $dbpass = "";
my $conn;
my $fname;
my $language;
for (my $i = 0 ; $i < @ARGV ; ++$i) {
if ($ARGV[$i] =~ /^-/) {
$ARGV[$i] =~ /^-dbname/ && do {
$dbname = $ARGV[$i + 1];
++$i;
};
$ARGV[$i] =~ /^-dbuser/ && do {
$dbuser = $ARGV[$i + 1];
++$i;
};
$ARGV[$i] =~ /^-dbpass/ && do {
$dbpass = $ARGV[$i + 1];
++$i;
};
} else {
$fname = $ARGV[$i];
}
}
die <<USAGE if not $fname;
import-po.pl [options] filename
-dbname full dsn or PostreSQL db name
-dbuser db user
-dbpass db password
USAGE
sub db_connect {
$dbname = "dbi:Pg:dbname=$dbname" if $dbname !~ /^dbi:/;
my ($driver) = $dbname =~ /^dbi:([^:]+):/;
my $attrs = {
AutoCommit => 1,
PrintError => 0,
AutoInactiveDestroy => 1,
RaiseError => 1,
};
$attrs->{pg_enable_utf8} = 1 if $driver eq 'Pg';
$attrs->{mysql_enable_utf8} = 1 if $driver eq 'mysql';
$conn = DBIx::Connector->new($dbname, $dbuser, $dbpass, $attrs)
or die "SQL_connect: " . DBI->errstr();
$conn->mode('fixup');
$conn;
}
my $aref = Locale::PO->load_file_asarray($fname);
if (Locale::PO->dequote($aref->[0]->msgid) ne '') {
die "unknown PO-file format $fname";
}
my $header = Locale::PO->dequote($aref->[0]->msgstr);
my %header_lines = map {
my ($h, $v) = split /:/, $_, 2;
$v =~ s/^\s+//;
($h => $v)
} split /\\n/, $header;
$language = $header_lines{Language}
or die "no Language header in PO-file $fname";
db_connect;
my $nls_lang = $conn->run(
sub {
if ($language =~ /^[a-z]{2}$/) {
$_->selectrow_hashref('select * from nls_lang where short = ?', undef, $language);
} else {
$_->selectrow_hashref('select * from nls_lang where name = ?', undef, $language);
}
}
) or die "unknown nls_lang";
my $inserted = 0;
my $updated = 0;
my $abs_where = SQL::Abstract->new;
for my $msg (@$aref) {
next if Locale::PO->dequote($msg->msgid) eq '';
my $msgctxt = $msg->msgctxt;
$msgctxt = Locale::PO->dequote(decode_utf8 $msgctxt) if defined $msgctxt;
my $nls_msgid = $conn->run(
sub {
my $cond = {
msgid => Locale::PO->dequote(decode_utf8 $msg->msgid),
context => $msgctxt
};
my ($where, @bind) = $abs_where->where($cond);
$_->selectrow_hashref('select * from nls_msgid ' . $where, undef, @bind);
}
);
my $plural =
$msg->msgid_plural
? Locale::PO->dequote(decode_utf8 $msg->msgid_plural)
: undef;
if (!$nls_msgid) {
$nls_msgid = $conn->run(
sub {
if ($plural) {
my $cond = {msgid => $plural, context => $msgctxt};
( run in 3.003 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )