diff --git a/.gitignore b/.gitignore index 121c2caed1..df0ac8e3d4 100644 --- a/.gitignore +++ b/.gitignore @@ -101,6 +101,9 @@ /mingw-libvirt.spec /mkinstalldirs /po/*gmo +/po/*po +!/po/*.mini.po +/po/*pot /proxy/ /python/ /run diff --git a/build-aux/minimize-po.pl b/build-aux/minimize-po.pl new file mode 100755 index 0000000000..497533a836 --- /dev/null +++ b/build-aux/minimize-po.pl @@ -0,0 +1,37 @@ +#!/usr/bin/perl + +my @block; +my $msgstr = 0; +my $empty = 0; +my $unused = 0; +my $fuzzy = 0; +while (<>) { + if (/^$/) { + if (!$empty && !$unused && !$fuzzy) { + print @block; + } + @block = (); + $msgstr = 0; + $fuzzy = 0; + push @block, $_; + } else { + if (/^msgstr/) { + $msgstr = 1; + $empty = 1; + } + if (/^#.*fuzzy/) { + $fuzzy = 1; + } + if (/^#~ msgstr/) { + $unused = 1; + } + if ($msgstr && /".+"/) { + $empty = 0; + } + push @block, $_; + } +} + +if (@block && !$empty && !$unused) { + print @block; +} diff --git a/po/Makefile.am b/po/Makefile.am index 973ecb42e5..ee1175a524 100644 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -20,6 +20,8 @@ POTFILE := $(DOMAIN).pot POFILES := $(LANGS:%=%.po) GMOFILES := $(LANGS:%=%.gmo) +MAINTAINERCLEANFILES = $(POTFILE) $(POFILES) $(GMOFILES) + EXTRA_DIST = \ POTFILES \ $(POTFILE) \ @@ -46,26 +48,26 @@ SED_PO_FIXUP_ARGS = \ -e "s|Copyright (C) YEAR|Copyright (C) $$(date +'%Y')|" \ $(NULL) - -# Although they're in EXTRA_DIST, we still need to -# copy these again, because update-gmo will change -# their content, and dist-hook runs after the -# things in EXTRA_DIST are copied. -dist-hook: $(GMOFILES) - cp -f $(POTFILE:%=$(srcdir)/%) $(distdir)/ - cp -f $(POFILES:%=$(srcdir)/%) $(distdir)/ - cp -f $(GMOFILES:%=$(srcdir)/%) $(distdir)/ - update-po: $(POFILES) update-gmo: $(GMOFILES) +update-mini-po: $(POTFILE) + for lang in $(LANGS); do \ + echo "Minimizing $$lang content" && \ + $(MSGMERGE) --no-location --no-fuzzy-matching --sort-output \ + $$lang.po $(POTFILE) | \ + $(SED) $(SED_PO_FIXUP_ARGS) | \ + $(PERL) $(top_srcdir)/build-aux/minimize-po.pl > \ + $(srcdir)/$$lang.mini.po ; \ + done + push-pot: $(POTFILE) zanata push --push-type=source pull-po: $(POTFILE) zanata pull --create-skeletons - $(MAKE) update-po + $(MAKE) update-mini-po $(MAKE) update-gmo $(POTFILE): POTFILES $(POTFILE_DEPS) @@ -74,9 +76,9 @@ $(POTFILE): POTFILES $(POTFILE_DEPS) $(SED) $(SED_PO_FIXUP_ARGS) < $@-t > $@ rm -f $@-t -%.po: $(POTFILE) - cd $(srcdir) && \ - $(MSGMERGE) --backup=off --no-fuzzy-matching --update $@ $(POTFILE) +%.po: %.mini.po $(POTFILE) + $(MSGMERGE) --no-fuzzy-matching $< $(POTFILE) | \ + $(SED) $(SED_PO_FIXUP_ARGS) > $@ %.gmo: %.po rm -f $(srcdir)/$@ $@-t diff --git a/po/README.md b/po/README.md index ba3d07ccdb..71b5793a2d 100644 --- a/po/README.md +++ b/po/README.md @@ -7,17 +7,39 @@ file formats, in combination with the Zanata web service. Source repository ================= -The libvirt GIT repository stores the master "libvirt.pot" file and full "po" -files for translations. The master "libvirt.pot" file can be re-generated using +The libvirt GIT repository does NOT store the master "libvirt.pot" file, nor +does it store full "po" files for translations. The master "libvirt.pot" file +can be generated at any time using make libvirt.pot -The full po files can have their source locations and msgids updated using +The translations are kept in minimized files that are the same file format +as normal po files but with all redundant information stripped and messages +re-ordered. The key differences between the ".mini.po" files in GIT and the +full ".po" files are + + - msgids with no current translation are omitted + - msgids are sorted in alphabetical order not source file order + - msgids with a msgstr marked "fuzzy" are discarded + - source file locations are omitted + +The full po files can be created at any time using make update-po -Normally these updates are only done when either refreshing translations from -Zanata, or when creating a new release. +This merges the "libvirt.pot" with the "$LANG.mini.po" for each language, to +create the "$LANG.po" files. These are included in the release archives created +by "make dist". + +When a full po file is updated, changes can be propagated back into the +minimized po files using + + make update-mini-po + +Note, however, that this is generally not something that should be run by +developers normally, as it is triggered by 'make pull-po' when refreshing +content from Zanata. + Zanata web service ================== @@ -32,5 +54,22 @@ directly to libvirt GIT. Any changes made to "$LANG.mini.po" files in libvirt GIT will be overwritten and lost the next time content is imported from Zanata. The master "libvirt.pot" file is periodically pushed to Zanata to provide the -translation team with content changes. New translated text is then periodically -pulled down from Zanata to update the po files. +translation team with content changes, using + + make push-pot + +New translated text is then periodically pulled down from Zanata to update the +minimized po files, using + + make pull-po + +Sometimes the translators make mistakes, most commonly with handling printf +format specifiers. The "pull-po" command re-generates the .gmo files to try to +identify such mistakes. If a mistake is made, the broken msgstr should be +deleted in the local "$LANG.mini.po" file, and the Zanata web interface used +to reject the translation so that the broken msgstr isn't pulled down next time. + +After pulling down new content the diff should be examined to look for any +obvious mistakes that are not caught automatically. There have been bugs in +Zanata tools which caused messges to go missing, so pay particular attention to +diffs showing deletions where the msgid still exists in libvirt.pot