Package: po4a Version: 0.45-1 Severity: normal Tags: patch Hi,
The man module does not handle tbl's T{ ... }T text blocks, and splits the blocks into separate lines. Fox example the follwing code from the ps(1) man page: %cpu %CPU T{ cpu utilization of the process in "##.#" format. It is the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias\ \fBpcpu\fR). T} generates the following msgids: msgid "%cpu\t%CPU\tT{\n" msgid "cpu utilization of the process in \"##.#\" format. It is the CPU time\n" msgid "used divided by the time the process has been running (cputime/realtime\n" msgid "ratio), expressed as a percentage. It will not add up to 100% unless you\n" msgid "are lucky. (alias\\ B<pcpu>).\n" msgid "T}\n" Translating such content seems to be a nightmare. The attached patch tries to solve the issue by concatenating the lines inside T{ ... }T - such approach works in most cases. It does not work however if the T{...}T block contains embeeded macros, like for example in the follwing quote of the same ps.1 man page: class CLS T{ scheduling class of the process. (alias\ \fBpolicy\fR,\ \fBcls\fR). Field's possible values are: .br \- not reported .br TS SCHED_OTHER .br FF SCHED_FIFO .br RR SCHED_RR .br ? unknown value T} Without having no idea, how to properly handle this, I've choosen to fall-back to previous behavior of translating the macro lines separately - see the TODO comment in the patch. (However to be honest in my opinion, even with lack of proper support for embedded macros, the patched version is more translator-friendly than the original one, so I would be grateful if you could apply the patch in following versions of po4a). Additionally you may notice that the patch fixes the typo in `split "\\t"' line so that the tbl data is now properly split into msgids on tabulators, what I belive was the intention of the author of the code. Regards, robert -- System Information: Debian Release: jessie/sid APT prefers unstable APT policy: (990, 'unstable'), (200, 'testing') Architecture: i386 (i686) Kernel: Linux 3.11-2-686-pae (SMP w/1 CPU core) Locale: LANG=pl_PL.UTF8, LC_CTYPE=pl_PL.UTF8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages po4a depends on: ii gettext 0.18.3.2-1 ii libsgmls-perl 1.03ii-33 ii perl 5.18.2-4 ii perl-modules 5.18.2-4 ii sp 1.3.4-1.2.1-47.3 Versions of packages po4a recommends: ii liblocale-gettext-perl 1.05-8 ii libterm-readkey-perl 2.32-1 ii libtext-wrapi18n-perl 0.06-7 pn libunicode-linebreak-perl <none> po4a suggests no packages. -- no debconf information -- debsums errors found: debsums: changed file /usr/share/perl5/Locale/Po4a/Man.pm (from po4a package)
Index: lib/Locale/Po4a/Man.pm =================================================================== --- lib/Locale/Po4a/Man.pm (wersja 2754) +++ lib/Locale/Po4a/Man.pm (kopia robocza) @@ -2191,6 +2191,7 @@ $macro{'TS'}=sub { my $self=shift; my ($in_headers,$buffer)=(1,""); + my ($in_textblock,$preline,$postline)=(0,"",""); my ($line,$ref)=$self->shiftline(); # Push table start @@ -2206,18 +2207,49 @@ $in_headers = 0; } $self->pushline($self->r($line)); - } elsif ($line =~ /\\$/) { + } elsif ($in_textblock && $line =~ /^T}\s*/) { # end of text block + $in_textblock = 0; + $preline = $&; # save the `T}' marker to be output later + $line = $'; # save the remaing part of the line + $self->pushline($self->translate($buffer, + $ref, + 'tbl table')); + $buffer = ""; + next; # continue processing with the remaining part of the line + } elsif ($in_textblock && $line =~ /^[.']/) { + # TODO: properly handle macros inside text blocks, currently we mark them + # for translations just like the previous version did + $self->pushline($self->translate($buffer, + $ref, + 'tbl table')); + $self->pushline($self->translate($line, + $ref, + 'tbl table')); + $buffer = ""; + } elsif ($line =~ /\\$/ || $in_textblock) { # Lines are continued on \ at the end of line $buffer .= $line; } else { + if ($line =~ s/\s*T{\s*$//) { # start of text block + $in_textblock = 1; + $postline = $&; # save the `T{' to be outputed below + } elsif ($buffer eq "" && $line ne ""){ # single line data + chomp $line; # drop eol char from the entry to be translated + $postline = "\n"; # and save the eol for output below + } + $buffer .= $line; # Arguments to translate are separated by \t - $self->pushline(join("\t", - map { $self->translate($buffer, + $self->pushline($preline + .join("\t", + map { $self->translate($_, $ref, 'tbl table') - } split (/\\t/,$line))); - $buffer = ""; + } split (/\t/,$buffer)) + .$postline); + + $buffer = $preline = $postline = ""; + } ($line,$ref)=$self->shiftline(); }