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

Re: [ITT] po://aptitude/po/de.po



Am 13.11.2019 um 19:08 schrieb Sven Joachim:

> Am 13.11.2019 um 18:28 schrieb Helge Kreutzmann:
>
>> On Wed, Nov 13, 2019 at 06:11:22PM +0100, Sven Joachim wrote:
>>> 
>>> Ich hatte eher an etwas gedacht, was keinen Editor benötigt und die
>>> Datei nach soundsoviel Bytes oder Zeichenketten automatisch splittet.
>>> Ein erster Versuch ist angehängt, aber bedarf sicherlich noch der
>>> Verbesserung.
>>> 
>>> Sind Häppchen von ca. 20 Kilobyte akzeptabel?  Das wären im Fall von
>>> aptitude etwa 13 Teile.
>>
>> Das sind ja ca. 120 Zeichenketten pro Teil, das ist schon recht viel,
>> für eine Programmübersetzung mag es aber noch i.O. sein, wenn da viele
>> Zeichenketten vom Typ "Open", "Open as" etc. dabei sind. 
>
> Sicher, je mehr Zeichenketten die einzelnen Teile enthalten, umso kürzer
> sind diese dann (wegen der nahezu konstanten Größe der Teile).  Ich kann
> auch zum Beispiel 16 Kilobyte nehmen.

Ich habe das Skript ein wenig aufgebohrt, und jetzt trennt es, sobald
15000 Bytes oder 80 Zeichenketten erreicht sind, konfigurierbar per
Befehlszeilenoptionen.  Einiges an Fehlerbehandlung wäre noch zu tun,
aber funktioniert schon ganz gut.

Morgen werde ich dann die ersten Teile zur Begutachtung schicken.

Viele Grüße,
Sven

#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;
use open qw< :encoding(UTF-8) >;

$/ = "";

sub usage {
    print "Usage: $0 [options] input-file\n";
    print "Options:\n";
    print "--size=n      Split after n*1000 bytes (default: n=15)\n";
    print "--messages=n  Split after n messages (default: n=80)\n";
    print "--keep-old    Preserve obsolete messages\n";
    print "--help        Show this help message\n";
}

my $splitsize = 15;
my $messagemax = 80;
my $keep_old;
my $help;
unless (GetOptions ("size=i" => \$splitsize,
		    "messages=i" => \$messagemax,
		    "keep-old" => \$keep_old,
		    "help" => \$help)) {
    usage();
    exit(1);
    }

if ($help) {usage(); exit(0);}

unless (@ARGV) {usage(); exit(1);}

my $infile = $ARGV[0];
my $input;
open ($input, "<", $infile)
    or die "Could not open file $infile for reading: $!";

my $count = 1;
(my $outfile = $infile) =~ s/\.po$/$count.po/;
my $output;
open ($output, ">", $outfile)
    or die "Could not open file $outfile for writing: $!";
for (my $seen = 0; my $text = <$input>; $seen++) {
    if ($text =~ "^#~" and not $keep_old) {
	exit(0);
    }
    if ((-s $outfile >= $splitsize * 1000) || ($seen >= $messagemax)) {
	close ($output);
	$count++;
	$seen = 0;
	($outfile = $infile) =~ s/\.po$/$count.po/;
	open ($output, ">", $outfile)
	    or die "Could not open file $outfile for writing: $!";
    }
    print $output ($text)
	or die "Error writing to $outfile: $!";
}

Reply to: