翻訳関数を構築するための簡単なソリューション:
f() {
eval 'local msg=$"'"${1//[\"\$\`]}"\"
shift
printf "${msg}" "$@"
}
テスト:
TEXTDOMAIN=coreutils
LANG="fr_CH.utf8"
f system boot
démarrage système
f $'Written by %s, %s, %s,\nand %s.\n' Athos Portos Aramis Shreck
Écrit par Athos, Portos, Aramis
et Shreck.
しかし、私は関数をフォークする代わりに変数を設定することを好むので:
f() {
eval 'local msg=$"'"${1//[\"\$\`]}"\"
local -n variable=$2
shift 2
printf -v variable "$msg" "$@"
}
それで
f $'Written by %s, %s, %s,\nand %s.\n' string Huey Dewey Louie Batman
echo ${string@Q}
$'Écrit par Huey, Dewey, Louie\net Batman.\n'
echo "$string"
Écrit par Huey, Dewey, Louie
et Batman.
または、完全な翻訳機能としてさらに優れています。
f() {
local store=false OPTIND OPTARG OPTERR varname
while getopts 'd:v:' opt ;do
case $opt in
d ) local TEXTDOMAIN=$OPTARG ;;
v ) varname=$OPTARG ;;
esac
done
shift $((OPTIND-1))
eval 'local msg=$"'"${1//[\"\$\`]}"\"
shift
printf ${varname+-v} $varname "$msg" "$@"
}
それで
f -d libc -v string "Permission denied"
echo $string
Permission non accordée
f -d coreutils $'Written by %s, %s, %s,\nand %s.\n' Riri Fifi Loulou Georges
Écrit par Riri, Fifi, Loulou
et Georges.
古い答え(2013年1月)
さて、私の自己回答があります:
これは現在うまく実装されていないようです。多くの状況で機能しますが、
echo "$(gettext 'missing character class name `[::]'\')"
caractère de nom de classe « [::] » manquant
簡単に言えば、このバシズムを使用して同じ文字列を翻訳することは不可能のようです。
echo $"missing character class name `[::]'"
>
コンソールはロックされたままです(文字列のそのような終わりを待っています) `` "`を追加すると、bashが複雑な解釈プロセスに没頭します:->>
> `"
bash: command substitution: line 1: Caractère de fin de fichier (EOF) prématuré lors de la recherche du « ' » correspondant
bash: command substitution: line 2: Erreur de syntaxe : fin de fichier prématurée
missing character class name
そしてもちろん:
echo $"missing character class name \`[::]'"
missing character class name `[::]'
翻訳しないでください。:-p
2つのバッククォートを含むこの文字列を翻訳している間、うまく機能します:
echo $"%s}: integer required between `{' and `}'"
%s} : entier requis entre « { » et « } »
私の失敗した試みのいくつかを見るかもしれないスクリプトがあります。
#!/bin/bash
echo "Localized tests"
export TEXTDOMAIN=coreutils
export LANG=fr_CH.UTF-8
export WRITTERS=(Athos Portos Aramis Dartagnan\ Le\ Beau)
echo '#First method# whitout eval'
declare -A MyMessages;
MyMessages[sysReboot]=$"system boot"
MyMessages[writtenBy]=$"Written by %s, %s, %s,
and %s.
"
MyMessages[intReq]=$"%s}: integer required between `{' and `}'"
MyMessages[trClass]=$"when translating, the only character classes that may appear in
string2 are `upper' and `lower'"
# MyMessages[missClass]=$"missing character class name `[::]'"
for msgIdx in ${!MyMessages[@]} ;do
printf "\n--- Test chain '%s' ---\n" $msgIdx
case $msgIdx in
writ* )
printf "${MyMessages[$msgIdx]}\n" "${WRITTERS[@]}"
;;
intReq )
printf "ARRAY{${MyMessages[$msgIdx]}\n" NaN
;;
* )
printf "${MyMessages[$msgIdx]}\n"
;;
esac
done
echo $'###\n#Second method# whith limited eval'
unset MyMessages;
declare -A MyMessages;
lPrintf() {
local sFormat="$(
eval 'echo $"'"${1}"'"'.
)"
shift
printf "${sFormat%.}" "$@"
}
MyMessages[sysReboot]="system boot"
MyMessages[writtenBy]=$'Written by %s, %s, %s,\nand %s.\n'
MyMessages[intReq]="%s}: integer required between \`{' and \`}'"
MyMessages[trClass]="when translating, the only character classes that "
MyMessages[trClass]+=$'may appear in\nstring2 '
MyMessages[trClass]+="are \`upper' and \`lower'"
MyMessages[missClass]="missing character class name \`[::]'"
for msgIdx in ${!MyMessages[@]} ;do
printf "\n--- Test chain '%s' ---\n" $msgIdx
case $msgIdx in
writ* )
lPrintf "${MyMessages[$msgIdx]}" "${WRITTERS[@]}"
;;
intReq )
lPrintf "${MyMessages[$msgIdx]}" NaN
;;
* )
lPrintf "${MyMessages[$msgIdx]}"
;;
esac
done
と彼の出力:
Localized tests
#First method# whitout eval
--- Test chain 'trClass' ---
à la traduction, les seules classes de caractères qui peuvent apparaître
dans string2 sont « upper » ou « lower »
--- Test chain 'intReq' ---
ARRAY{NaN} : entier requis entre « { » et « } »
--- Test chain 'sysReboot' ---
démarrage système
--- Test chain 'writtenBy' ---
Écrit par Athos, Portos, Aramis,
et Dartagnan Le Beau.
###
#Second method# whith limited eval
--- Test chain 'trClass' ---
à la traduction, les seules classes de caractères qui peuvent apparaître
dans string2 sont « upper » ou « lower »
--- Test chain 'missClass' ---
./localized.sh: eval: line 44: Caractère de fin de fichier (EOF) prématuré lors de la recherche du « ` » correspondant
./localized.sh: eval: line 45: Erreur de syntaxe : fin de fichier prématurée
--- Test chain 'intReq' ---
NaN} : entier requis entre « { » et « } »
--- Test chain 'sysReboot' ---
démarrage système
--- Test chain 'writtenBy' ---
Écrit par Athos, Portos, Aramis,
et Dartagnan Le Beau.
誰かがこのスクリプトのコメントやエラーメッセージを削除するのを手伝ってくれるなら!?...(8時間以内に?!)
みなさん、ありがとうございました。(私の報奨金は、8時間以内に最良の回答がない限り、@ gniourf_gniourfに送られます。しかし、@ technoのおかげで、私はあなたのlPrintfが好きです!)