bash localization won't work with multilines strings (with strong syntax or through `eval`)
I've played a little bit with this feature and this is what I came up with: you can include the newline verbatim as:
$ echo $"Written by %s.
> "
Écrit par %s.
$
In a script:
#!/bin/bash
message=$"Written by %s.
"
printf "$message" Gniourf
This script will output:
Écrit par Gniourf.
Ok, this is not really an answer, but it might help a little bit (at least, we're not using the evil eval
).
Personal remark: I find this feature really clunky!
If using eval
is bad with arbitrary variables, there is a way to do this only when called/needed, in running eval
only on message part:
function lPrintf() {
local sFormat="$(
eval 'echo $"'"${1}"'"'.
)"
shift
printf "${sFormat%.}" $@
}
lPrintf "system boot"
démarrage système
lPrintf $'Written by %s, %s, %s,\nand %s.\n' techno moi lui-même bibi
Écrit par techno, moi, lui-même,
et bibi.
( The dot at end of translated string ensure that whole string, including leading line-break, where passed to variable sFormat
. They will be dropped with ${sFormat%.}
)
OK I think finally got it right.
iprintf() {
msg="$2"
domain="$1"
shift
shift
imsg=$(gettext -ed "$domain" "$msg" ; echo EOF)
imsg="${imsg%EOF}"
printf "$imsg" "$@"
}
Usage example:
LANG=fr_CH.utf8 iprintf coreutils "If FILE is not specified, use %s. %s as FILE is common.\n\n" foo bar