With the new target, it is now easy to update all translations in the project for a language against latest code with the simple command, run from the top directory:
make update-lang PO=<lang> Signed-off-by: Christophe CURIS <christophe.cu...@free.fr> --- Makefile.am | 26 ++++++ WINGs/po/Makefile.am | 7 ++ WPrefs.app/po/Makefile.am | 7 ++ doc/build/Translations.texi | 12 +++ po/Makefile.am | 7 ++ script/generate-po-from-template.sh | 152 ++++++++++++++++++++++++++++++++++++ util/po/Makefile.am | 7 ++ 7 files changed, 218 insertions(+) create mode 100755 script/generate-po-from-template.sh diff --git a/Makefile.am b/Makefile.am index bd1db34..55667a1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -40,6 +40,7 @@ EXTRA_DIST = TODO BUGS BUGFORM FAQ INSTALL \ email-clients.txt checkpatch.pl update-changelog.pl \ script/check-translation-sources.sh \ script/generate-mapfile-from-header.sh \ + script/generate-po-from-template.sh \ script/generate-txt-from-texi.sh \ script/nested-func-to-macro.sh @@ -56,3 +57,28 @@ coverage: .PHONY: coverage-reset coverage endif + +# make update-lang PO=<lang> +# ========================== +# Update the PO files against the POT file in all the translation sub-directories +# +# We do not use an automatic recursive target from Automake (AM_EXTRA_RECURSIVE_TARGETS) +# because we want to check only once that the variable PO was defined; the added bonus +# being that we do not process all directories but only the related ones, which is +# faster and a lot less verbose + +update-lang: +if HAVE_XGETTEXT + @if echo "$(PO)" | grep -v '^[a-z][a-z]\(_[A-Z][A-Z]\)\?$$' > /dev/null ; then \ + echo "Error: invalid value \"$(PO)\" for update-lang, use PO=<lang>" >&2 ; exit 1 ; \ + fi ; \ + for subdir in $(SUBDIRS_PO); do \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) update-lang || exit $$?); \ + done + +SUBDIRS_PO = WINGs/po po util/po WPrefs.app/po +else + @echo "Error: the program 'xgettext' was not found by configure, it is mandatory for this operation" >&2 ; exit 1 +endif + +.PHONY: update-lang diff --git a/WINGs/po/Makefile.am b/WINGs/po/Makefile.am index 133f244..cab81e3 100644 --- a/WINGs/po/Makefile.am +++ b/WINGs/po/Makefile.am @@ -78,7 +78,14 @@ SUFFIXES = .po .mo all-local: $(CATALOGS) +.PHONY: update-lang + if HAVE_XGETTEXT +update-lang: $(DOMAIN).pot + $(AM_V_GEN)$(top_srcdir)/script/generate-po-from-template.sh \ + -n "$(PACKAGE_NAME)" -v "$(PACKAGE_VERSION)" -b "$(PACKAGE_BUGREPORT)" \ + -t "$(DOMAIN).pot" "$(srcdir)/$(PO).po" + $(DOMAIN).pot: $(POTFILES) $(AM_V_GEN)$(XGETTEXT) --default-domain=$(DOMAIN) \ --add-comments --keyword=_ --keyword=N_ $(POTFILES) diff --git a/WPrefs.app/po/Makefile.am b/WPrefs.app/po/Makefile.am index c132a8c..3b78034 100644 --- a/WPrefs.app/po/Makefile.am +++ b/WPrefs.app/po/Makefile.am @@ -44,7 +44,14 @@ SUFFIXES = .po .mo all-local: $(CATALOGS) +.PHONY: update-lang + if HAVE_XGETTEXT +update-lang: $(DOMAIN).pot + $(AM_V_GEN)$(top_srcdir)/script/generate-po-from-template.sh \ + -n "$(PACKAGE_NAME)" -v "$(PACKAGE_VERSION)" -b "$(PACKAGE_BUGREPORT)" \ + -t "$(DOMAIN).pot" "$(srcdir)/$(PO).po" + $(DOMAIN).pot: $(POTFILES) $(AM_V_GEN)$(XGETTEXT) --default-domain=$(DOMAIN) \ --add-comments --keyword=_ --keyword=N_ $(POTFILES) diff --git a/doc/build/Translations.texi b/doc/build/Translations.texi index 1e10a64..427aec2 100644 --- a/doc/build/Translations.texi +++ b/doc/build/Translations.texi @@ -348,6 +348,9 @@ value. If you don't know what is the correct value, unset it. You may have noticed that many translations are not up to date, because the code has evolved but the persons who initially contributed may not have had the time to continue, so any help is welcome. +Since @sc{Window Maker} 0.95.7 there are some targets to @command{make} that can help you in that +task. + @c ------------------------------------------------------------------ Install the latest sources --- @section Install the latest sources @@ -425,7 +428,16 @@ In @sc{Window Maker}, you have actually 4 @code{po} files to take care of: @item @file{util/po/@emph{<lang>}.po}: for the command-line tools of @sc{Window Maker} @end itemize +As stated previously, there is a @command{make} target that can help you to automatically generate +the POT and update the PO for these 4 cases: + +@example +make update-lang PO=<lang> +@end example +Once run, it will have updated as needed the 4 @code{po} files against the latest source code. +You may wish to use the command @command{git gui} to view the changes; +you can now edit the files to complete the translation, correct them, remove deprecated stuff, ... Please note that the encoding should be set to @emph{UTF-8} as this is now the standard. If you think an error message is too obscure, just ask on the developer mailing list diff --git a/po/Makefile.am b/po/Makefile.am index 815c1d1..e862ce5 100644 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -73,7 +73,14 @@ SUFFIXES = .po .mo all-local: $(CATALOGS) +.PHONY: update-lang + if HAVE_XGETTEXT +update-lang: $(DOMAIN).pot + $(AM_V_GEN)$(top_srcdir)/script/generate-po-from-template.sh \ + -n "$(PACKAGE_NAME)" -v "$(PACKAGE_VERSION)" -b "$(PACKAGE_BUGREPORT)" \ + -t "$(DOMAIN).pot" "$(srcdir)/$(PO).po" + $(DOMAIN).pot: $(POTFILES) $(AM_V_GEN)$(XGETTEXT) --default-domain=$(DOMAIN) \ --add-comments --keyword=_ --keyword=N_ $(POTFILES) diff --git a/script/generate-po-from-template.sh b/script/generate-po-from-template.sh new file mode 100755 index 0000000..6e73ba3 --- /dev/null +++ b/script/generate-po-from-template.sh @@ -0,0 +1,152 @@ +#!/bin/sh +########################################################################### +# +# Window Maker window manager +# +# Copyright (c) 2014-2015 Christophe CURIS +# Copyright (c) 2015 Window Maker Team +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +########################################################################### +# +# generate-po-from-template.sh: +# update an existing <lang>.po file from the POT (gettext template for +# translations) +# +# The goal is to take the opportunity to do a little bit more than what +# msgmerge does, including: +# - copying the full template if the language file does not yet exist; +# - post-process a few fields that it does not change but we may wish to +# see updated (project name, version, ...) +# +########################################################################### +# +# Please note that this script is writen in sh+awk on purpose: this script +# is gonna be run on the machine of the person who is trying to compile +# WindowMaker, and as such we cannot be sure to find any scripting language +# in a known version and that works (python/ruby/tcl/perl/php/you-name-it). +# +# So for portability, we stick to the same sh+awk constraint as Autotools +# to limit the problem, see for example: +# http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Portable-Shell.html +# +########################################################################### + +# Report an error on stderr and exit with status 1 to tell make could not work +arg_error() { + echo "$0: $@" >&2 + exit 1 +} + +# print help and exit with success status +print_help() { + echo "$0: update language po file from xgettext template" + echo "Usage: $0 [options...] po_file" + echo "valid options are:" + echo " -b email : email address to place in 'Report-Msgid-Bugs-To'" + echo " -n name : name of the project, to place in 'Project-Id-Version'" + echo " -t file : template file to be used" + echo " -v version : version of the project, to place in 'Project-Id-Version'" + exit 0 +} + +# Extract command line arguments +while [ $# -gt 0 ]; do + case $1 in + -b) + shift + project_email="$1" + ;; + + -h|-help|--help) print_help ;; + + -n) + shift + project_name="$1" + ;; + + -t) + shift + [ "x$template" = "x" ] || arg_error "template already set to \"$template\", can't use also \"$1\"" + template="$1" + [ -r "$template" ] || arg_error "template file \"$1\" is not readable" + ;; + + -v) + shift + project_version="$1" + ;; + + -*) arg_error "unknow option '$1'" ;; + + *) + [ "x$lang_file" = "x" ] || arg_error "only 1 po file can be specified, not \"$lang_file\" and \"$1\"" + lang_file="$1" + ;; + esac + shift +done + +# Check consistency of command-line +[ "x$lang_file" != "x" ] || arg_error "no po file given" +[ "x$template" != "x" ] || arg_error "no template file given" + +# Generate the <lang>.po using the usual method if possible +if [ -r "$lang_file" ] ; then + msgmerge --update --silent "$lang_file" "$template" + + # Fuzzy matching is generally not great, so print a little message to make + # sure the user will think about taking care of it + grep ', fuzzy' "$lang_file" > /dev/null && \ + echo "Warning: fuzzy matching was used in \"$lang_file\", please review" +else + # If the <lang>.po file does not exist, we create a dummy one now from the + # template, updating a few fields that 'msgmerge' will not do: + # - it won't touch 'Language', so let's handle it for the user; + # - it won't like 'CHARSET' in content-type, we place a safe 'UTF-8' as default; + echo "Warning: creating new \"$lang_file\"" + lang="`echo "$lang_file" | sed -e 's,^.*/\([^/]*\)$,\1,' -e 's/\..*$//' `" + sed -e '/^"Language:/s,:.*\\n,: '"$lang"'\\n,' \ + -e '/^"Content-Type:/s,CHARSET,UTF-8,' < "$template" > "$lang_file" +fi + +# We need to post-process the generated file because 'msgmerge' does not do +# everything, there are some field for which we can give a value to xgettext +# but msgmerge will not take the new value of the header on update +temp_file="`echo "$lang_file" | sed -e 's,^.*/\([^/]*\)$,\1,' -e 's/\.po$//' `.tmp" + +# The 'PO-Revision-Date' is supposed to be automatically updated by the user's +# po edition tool, but in case it does not, we feel safer with at least the +# current date +cmd_update="/PO-Revision-Date:/s,:.*\\\\n,: `date +"%Y-%m-%d %H:%M%z" `\\\\n," + +# We update the 'Project-Id-Version', because for historical reasons the PO +# files did not have had a consistent name; it is also the opportunity to +# place the current version of the project in the field +if [ "x$project_name$project_version" != "x" ]; then + cmd_update="$cmd_update;/Project-Id-Version:/s,:.*\\\\n,: $project_name $project_version\\\\n," +fi + +# We update the 'Report-Msgid-Bugs-To', because for historical reasons the PO +# files probably did not have this information; it is also an opportunity to be +# sure it is in line with project's latest value +if [ "x$project_email" != "x" ]; then + cmd_update="$cmd_update;/Report-Msgid-Bugs-To:/s,:.*\\\\n,: $project_email\\\\n," +fi + +mv "$lang_file" "$temp_file" +sed -e "$cmd_update" < "$temp_file" > "$lang_file" +rm -f "$temp_file" diff --git a/util/po/Makefile.am b/util/po/Makefile.am index 4ca002c..124368f 100644 --- a/util/po/Makefile.am +++ b/util/po/Makefile.am @@ -19,7 +19,14 @@ SUFFIXES = .po .mo all-local: $(CATALOGS) +.PHONY: update-lang + if HAVE_XGETTEXT +update-lang: $(DOMAIN).pot + $(AM_V_GEN)$(top_srcdir)/script/generate-po-from-template.sh \ + -n "$(PACKAGE_NAME)" -v "$(PACKAGE_VERSION)" -b "$(PACKAGE_BUGREPORT)" \ + -t "$(DOMAIN).pot" "$(srcdir)/$(PO).po" + $(DOMAIN).pot: $(POTFILES) $(AM_V_GEN)$(XGETTEXT) --default-domain=$(DOMAIN) \ --add-comments --keyword=_ --keyword=N_ $(POTFILES) -- 2.1.4 -- To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.