Rewrite update-po target, so that it works less like a shell script and more
authorPeter Eisentraut <peter_e@gmx.net>
Fri, 9 Jan 2009 10:54:08 +0000 (10:54 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Fri, 9 Jan 2009 10:54:08 +0000 (10:54 +0000)
like a makefile with real dependencies.

Instead of overwriting the old po file, write the new one to .po.new.  This is
less annoying and integrates better with the NLS web site.

Also, we can now merge languages that don't have a po file yet, by merging
against all other po files of that language, to pick up recurring translations
automatically.  This previously only worked when a po file already existed.

doc/src/sgml/nls.sgml
src/nls-global.mk

index 5381de7d78c952db8663a5bd4f63631f21f51415..3a567df16c4266ad57078dc1e0efe7f69e5f49e2 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/nls.sgml,v 1.16 2007/02/01 00:28:17 momjian Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/nls.sgml,v 1.17 2009/01/09 10:54:07 petere Exp $ -->
 
 <chapter id="nls">
  <chapterinfo>
@@ -200,9 +200,8 @@ gmake update-po
     which will create a new blank message catalog file (the pot file
     you started with) and will merge it with the existing PO files.
     If the merge algorithm is not sure about a particular message it
-    marks it <quote>fuzzy</quote> as explained above.  For the case
-    where something went really wrong, the old PO file is saved with a
-    <filename>.po.old</filename> extension.
+    marks it <quote>fuzzy</quote> as explained above.  The new PO file
+    is saved with a <filename>.po.new</filename> extension.
    </para>
   </sect2>
 
index ba69bfaebfa11546e34c05c4b85d8f8ab36e2c2f..ef06d6e372380faad4d11366f962b965a4311305 100644 (file)
@@ -1,4 +1,4 @@
-# $PostgreSQL: pgsql/src/nls-global.mk,v 1.16 2009/01/02 15:15:42 petere Exp $
+# $PostgreSQL: pgsql/src/nls-global.mk,v 1.17 2009/01/09 10:54:08 petere Exp $
 
 # Common rules for Native Language Support (NLS)
 #
@@ -80,7 +80,7 @@ uninstall-po:
 
 clean-po:
        $(if $(MO_FILES),rm -f $(MO_FILES))
-       @$(if $(PO_FILES),rm -f $(addsuffix .old, $(PO_FILES)))
+       @$(if $(wildcard po/*.po.new),rm -f po/*.po.new)
        rm -f po/$(CATALOG_NAME).pot
 
 
@@ -93,26 +93,31 @@ maintainer-check-po: $(PO_FILES)
 init-po: po/$(CATALOG_NAME).pot
 
 
-define merge-lang
-@printf 'merging $(1) '
-@if $(MSGMERGE) $(srcdir)/po/$(1).po $< -o po/$(1).po.new $(addprefix --compendium=,$(shell find $(top_srcdir) -name $(1).po -printf '%p ')); \
-then \
-    mv $(srcdir)/po/$(1).po po/$(1).po.old; \
-    mv po/$(1).po.new $(srcdir)/po/$(1).po; \
-else \
-    echo "msgmerge for $(1) failed"; \
-    rm -f po/$(1).po.new; \
-fi
-
-endef
-
-update-po: po/$(CATALOG_NAME).pot
-ifdef MSGMERGE
-       $(foreach lang,$(LANGUAGES),$(call merge-lang,$(lang)))
+# For performance reasons, only calculate these when the user actually
+# requested update-po or a specific file.
+ifneq (,$(filter update-po %.po.new,$(MAKECMDGOALS)))
+ALL_LANGUAGES := $(shell find $(top_srcdir) -name '*.po' -printf '%f\n' | sort -u | sed 's/\.po$$//')
+all_compendia := $(shell find $(top_srcdir) -name '*.po' -printf '%p ')
 else
-       @echo "You don't have 'msgmerge'." ; exit 1
+ALL_LANGUAGES = $(AVAIL_LANGUAGES)
+all_compendia = FORCE
+FORCE:
+endif
+
+ifdef WANTED_LANGUAGES
+ALL_LANGUAGES := $(filter $(WANTED_LANGUAGES), $(ALL_LANGUAGES))
 endif
 
+update-po: $(ALL_LANGUAGES:%=po/%.po.new)
+
+$(AVAIL_LANGUAGES:%=po/%.po.new): po/%.po.new: po/%.po po/$(CATALOG_NAME).pot $(all_compendia)
+       $(MSGMERGE) $(word 1, $^) $(word 2,$^) -o $@ $(addprefix --compendium=,$(filter %/$*.po,$(wordlist 3,$(words $^),$^)))
+
+# For languages not yet available, merge against empty file, to pick
+# up translations from the compendia.
+po/%.po.new: po/$(CATALOG_NAME).pot $(all_compendia)
+       $(MSGMERGE) /dev/null $(word 1,$^) -o $@ $(addprefix --compendium=,$(filter %/$*.po,$(wordlist 2,$(words $^),$^)))
+
 
 all: all-po
 install: install-po