From 3e29793d046ad3e5a79dfe1ec75e9df3f2d87090 Mon Sep 17 00:00:00 2001 From: Kurtis Rader Date: Sat, 27 May 2017 22:13:18 -0700 Subject: [PATCH] improve detection of msgs to be translated This change does several things. First, it works around a quirk of the `xgetttext` command that only recognizes description strings in even numbered position on the command. Second, it allows descriptions introduced by the `-d` short flag to be recognized. More importantly, it normalizes the strings so that `xgettext` correctly extracts them into the *.po file. Prior to this change many fish script strings were ignored due to how they were written (e.g., single versus double quotes). Fixes #4073 --- Makefile.in | 15 +++++++----- build_tools/fish_xgettext.fish | 42 ++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 6 deletions(-) create mode 100755 build_tools/fish_xgettext.fish diff --git a/Makefile.in b/Makefile.in index 8577fed4d..3e5a7dd04 100644 --- a/Makefile.in +++ b/Makefile.in @@ -516,13 +516,12 @@ doc.h: $(HDR_FILES) -e "s,@prefix\@,$(prefix),g" \ -e "s,@fish_build_version\@,$(FISH_BUILD_VERSION),g" \ - # -# Compile translation files to binary format +# Compile translation files to binary format. # %.gmo: @echo " msgfmt $(em)$@$(sgr0)" - $v msgfmt -o $@ $*.po + $v msgfmt --use-fuzzy -o $@ $*.po # # Update existing po file or copy messages.pot @@ -538,10 +537,14 @@ doc.h: $(HDR_FILES) # # Create a template translation object # -messages.pot: $(wildcard src/*.cpp src/*.h share/completions/*.fish share/functions/*.fish) +messages.pot: fish $(wildcard src/*.cpp src/*.h share/completions/*.fish share/functions/*.fish) @echo " xgettext $(em)$@$(sgr0)" - xgettext -k_ -kN_ $(wildcard src/*.cpp src/*.h) -o messages.pot - $v xgettext -j -k_ -kN_ -k--description -LShell --from-code=UTF-8 $(wildcard share/completions/*.fish share/functions/*.fish) share/config.fish -o messages.pot + $v xgettext -k -k_ -kN_ -LC++ --no-wrap -o messages.pot src/*.cpp src/*.h + $v rm -rf /tmp/fish + $v ./fish build_tools/fish_xgettext.fish + $v xgettext -j -k -kN_ -LShell --from-code=UTF-8 -cDescription --no-wrap -o messages.pot /tmp/fish/explicit/share/*.fish /tmp/fish/explicit/share/*/*.fish + $v xgettext -j -k -kN_ -LShell --from-code=UTF-8 -cDescription --no-wrap -o messages.pot /tmp/fish/implicit/share/*.fish /tmp/fish/implicit/share/*/*.fish + $v rm -rf /tmp/fish ifdef EXTRA_PCRE2 src/builtin_string.cpp: $(PCRE2_H) diff --git a/build_tools/fish_xgettext.fish b/build_tools/fish_xgettext.fish new file mode 100755 index 000000000..eeeddaf32 --- /dev/null +++ b/build_tools/fish_xgettext.fish @@ -0,0 +1,42 @@ +#!/usr/bin/env fish +# +# This script was originally motivated to work around a quirk (or bug depending on your viewpoint) +# of the xgettext command. See https://lists.gnu.org/archive/html/bug-gettext/2014-11/msg00006.html. +# However, it turns out that even if that quirk did not exist we would still need something like +# this script to properly extract descriptions. That's because we need to normalize the strings to +# a format that xgettext will handle correctly. Also, `xgettext -LShell` doesn't correctly extract +# all the strings we want translated. So we extract and normalize all such strings into a format +# that `xgettext` can handle. + +# This regex handles descriptions for `complete` and `function` statements. These messages are not +# particularly important to translate. Hence the "implicit" label. +set implicit_regex '(?:^| +)(?:complete|function) .*? (?:-d|--description) (([\'"]).+?(?/tmp/fish/explicit/$f.tmp ^/dev/null + while read description + echo 'N_ "'(string replace --all '"' '\\"' -- $description)'"' + end /tmp/fish/explicit/$f + rm /tmp/fish/explicit/$f.tmp + + # Handle `complete` / `function` description messages. The `| fish` is subtle. It basically + # avoids the need to use `source` with a command substituion that could affect the current + # shell. + string replace --filter --regex $implicit_regex 'echo $1' <$f | fish >/tmp/fish/implicit/$f.tmp ^/dev/null + while read description + # We don't use `string escape` as shown in the next comment because it produces output that + # is not parsed correctly by xgettext. Instead just escape double-quotes and quote the + # resulting string. + echo 'N_ "'(string replace --all '"' '\\"' -- $description)'"' + end /tmp/fish/implicit/$f + rm /tmp/fish/implicit/$f.tmp +end