po4a: fix compatibility with gettext 1.0
gettext 1.0 changed msginit to merge into existing output files instead of overwriting them. When po4a passes an empty PO file as the output target, this produces a PO with stripped headers and corrupted UTF-8 content (e.g. "nämes" becomes "nmes"). Fix by removing empty output files before calling msginit, so it creates a fresh PO file with proper headers. https://github.com/mquinson/po4a/issues/636
This commit is contained in:
@@ -34,6 +34,14 @@ buildPerlPackage rec {
|
||||
hash = "sha256-JfwyPyuje71Iw68Ov0mVJkSw5GgmH5hjPpEhmoOP58I=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
# Fix compatibility with gettext >= 1.0, whose msginit merges into
|
||||
# existing files instead of overwriting, producing broken PO headers
|
||||
# when the output file already exists but is empty.
|
||||
# https://github.com/mquinson/po4a/issues/636
|
||||
./gettext-1.0-msginit-compat.patch
|
||||
];
|
||||
|
||||
strictDeps = true;
|
||||
|
||||
nativeBuildInputs =
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
Fix po4a compatibility with gettext >= 1.0
|
||||
|
||||
gettext 1.0 changed msginit behavior: when the output file already
|
||||
exists, msginit now merges into it (like msgmerge) instead of
|
||||
overwriting. This causes problems when po4a passes an empty PO file as
|
||||
the output target, because msginit produces a PO with stripped headers
|
||||
and corrupted UTF-8 content.
|
||||
|
||||
Fix by removing the output file before calling msginit, ensuring
|
||||
msginit creates a fresh PO file with proper headers.
|
||||
|
||||
See: https://github.com/mquinson/po4a/issues/636
|
||||
See: https://savannah.gnu.org/news/?id=10853
|
||||
|
||||
--- a/po4a
|
||||
+++ b/po4a
|
||||
@@ -1875,6 +1875,10 @@
|
||||
}
|
||||
|
||||
my $read_pot_filename = find_input_file($pot_filename);
|
||||
+ # Remove the output file if it exists (e.g. as an empty file),
|
||||
+ # because gettext >= 1.0's msginit merges into existing files
|
||||
+ # instead of overwriting, producing broken PO headers.
|
||||
+ unlink $outfile if ( -e $outfile && -z $outfile );
|
||||
my $cmd =
|
||||
"msginit$Config{_exe} -i \"$read_pot_filename\" --locale $lang -o \"$outfile\" --no-translator >$devnull";
|
||||
run_cmd($cmd);
|
||||
Reference in New Issue
Block a user