Merge pull request #11399

This commit is contained in:
Johannes Altmanninger
2025-05-04 11:58:05 +02:00
2 changed files with 33 additions and 19 deletions

View File

@@ -304,7 +304,7 @@ To update a translation:
``build_tools/fish_xgettext.fish`` from the source tree
* update the existing translation by running
``msgmerge --update --no-fuzzy-matching po/LANG.po messages.pot``
``msgmerge --update --no-fuzzy-matching --no-wrap po/LANG.po messages.pot``
The ``--no-fuzzy-matching`` is important as we have had terrible experiences with gettext's "fuzzy" translations in the past.

View File

@@ -6,7 +6,7 @@
# works around that - based on share/functions/funced.fish.
set -q TMPDIR
or set -l TMPDIR /tmp
set -l tmpdir (mktemp -d $TMPDIR/fish.XXXXXX)
set tmpdir (mktemp -d $TMPDIR/fish.XXXXXX)
or exit 1
# This is a gigantic crime.
@@ -30,35 +30,49 @@ for str in $strs
# grep -P needed for string escape to be compatible (PCRE-style),
# -H gives the filename, -n the line number.
# If you want to run this on non-GNU grep: Don't.
echo "#:" (grep -PHn -r -- (string escape --style=regex -- $str) src/ |
echo "#:" (grep -PHn -r -- \"(string escape --style=regex -- $str)\" src/ |
head -n1 | string replace -r ':\s.*' '')
echo "msgid \"$str\""
echo 'msgstr ""'
end >messages.pot
function extract_fish_script_messages --argument-names name regex;
mkdir -p $tmpdir/$name/share/completions $tmpdir/$name/share/functions
for f in share/config.fish share/completions/*.fish share/functions/*.fish
# Extract messages from fish script.
# This is done by creating a file which has the message strings in the same lines as the
# oritinal, in the form:
# N_ "message"
# All other lines will be empty.
# Multiple messages on a single line are not supported.
# Start by transforming the matching lines according to $explicit_regex and adding 'N_ ' as
# a prefix.
# Then, replace all lines without this prefix by empty lines.
# These lines are kept to ensure that the correct line number makes it into the pot file.
# Replacing irrelevant lines by empty lines must happen before unescaping, because otherwise
# multi-line commands (lines ending on \) would get merged, changing the line count.
# Double quotes are escaped, and finally unescaped double quotes are added around the string.
# The result will be a file consisting of empty lines and potentially some lines prefixed with
# 'N_ ', followed by a double-quoted string.
string replace --regex $regex 'N_ $1' <$f |
sed '/^N_ / !{s/^.*$//}' |
string unescape |
string replace --all '"' '\\"' |
string replace --regex '^N_ (.*)$' 'N_ "$1"' \
>$tmpdir/$name/$f
end
end
# This regex handles descriptions for `complete` and `function` statements. These messages are not
# particularly important to translate. Hence the "implicit" label.
set -l implicit_regex '(?:^| +)(?:complete|function).*? (?:-d|--description) (([\'"]).+?(?<!\\\\)\\2).*'
extract_fish_script_messages implicit $implicit_regex
# This regex handles explicit requests to translate a message. These are more important to translate
# than messages which should be implicitly translated.
set -l explicit_regex '.*\( *_ (([\'"]).+?(?<!\\\\)\\2) *\).*'
mkdir -p $tmpdir/implicit/share/completions $tmpdir/implicit/share/functions
mkdir -p $tmpdir/explicit/share/completions $tmpdir/explicit/share/functions
for f in share/config.fish share/completions/*.fish share/functions/*.fish
# Extract explicit attempts to translate a message. That is, those that are of the form
# `(_ "message")`.
string replace --filter --regex $explicit_regex '$1' <$f | string unescape \
| string replace --all '"' '\\"' | string replace -r '(.*)' 'N_ "$1"' >$tmpdir/explicit/$f
# Handle `complete` / `function` description messages. The `| fish` is subtle. It basically
# avoids the need to use `source` with a command substitution that could affect the current
# shell.
string replace --filter --regex $implicit_regex '$1' <$f | string unescape \
| string replace --all '"' '\\"' | string replace -r '(.*)' 'N_ "$1"' >$tmpdir/implicit/$f
end
extract_fish_script_messages explicit $explicit_regex
xgettext -j -k -kN_ -LShell --from-code=UTF-8 -cDescription --no-wrap -o messages.pot $tmpdir/{ex,im}plicit/share/*/*.fish