From 4ecace2cd4fc4d71bcb5c62e43021b17774b4897 Mon Sep 17 00:00:00 2001 From: Ewoud Kohl van Wijngaarden Date: Tue, 17 Sep 2024 23:34:46 +0200 Subject: [PATCH] Refs #37833 - Fix file timestamp handling when pulling translations The Ruby gettext library wants the .po.time_stamp file to be at least as new as the .po file. If it doesn't exist or is older, it will remove the .edit.po file and then copy the .po file to .edit.po. In practice the Makefile doesn't guarantee this, causing translations to be ignored. A more concrete example what ends up happening: make -C locale tx-pull # updates $domain.edit.po # This all assumes $domain.po exists if [ ! -f $domain.po.time_stamp ] -o [ $domain.po -nt $domain.po.time_stamp ] ; then rm -f $domain.edit.po fi if [ ! -f $domain.edit.po ] ; then cp $domain.po $domain.edit.po # Merge in the new messages from the template msgmerge --update --sort-by-file --no-wrap $domain.edit.po $domain.pot if [ -f $domain.po ] -a [ $domain.po -nt $domain.edit.po ] ; then msgmerge --output $domain.edit.po --sort-by-file --no-wrap --no-obsolete-entries $domain.po $domain.edit.po fi fi This ensures that $domain.po.time_stamp is always the same mtime as $domain.po which prevents the gettext library from removing the updated $domain.edit.po file. It means there is no message merging and we rely on Transifex for doing that part for us. --- locale/Makefile | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/locale/Makefile b/locale/Makefile index 46e3e1ba7e8..1a3d5b7e0cf 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -31,6 +31,16 @@ all-mo: $(MOFILES) check: $(POXFILES) +%.edit.po: %.po.time_stamp + touch $@ + +# gettext will trash the .edit.po file if the time stamp doesn't exist or is older than the po file +%.po.time_stamp: %.po + touch --reference $< $@ + +# Prevent make from treating this as an intermediate file to be cleaned up +.PRECIOUS: %.po.time_stamp + # Unify duplicate translations uniq-po: for f in $(shell find ./ -name "*.po") ; do \