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