bash 中有一个很好的特性,关于本地化(语言翻译):
TEXTDOMAIN=coreutils
LANG=fr_CH.utf8
echo $"system boot"
démarrage système
(注意对于这项工作,fr_CH.utf8
已经在您的系统上生成...否则您可以尝试自己的语言环境...或安装 locales
并生成一个。)
问题:
但是如果这对简单的字符串工作正常,当字符串包含 \n
(或者最糟糕的是:反引号 `
时,事情就更复杂了:
echo $"Written by %s, %s, %s,\nand %s.\n"
Written by %s, %s, %s,\nand %s.\n
这不是有人参与的回答。
(Nota2:对于这项工作,必须在 .mo
消息文件中准备准确的消息,在这个示例/测试中,我使用现有的 coreutils.mo
文件,可以使用 msgunfmt
命令未格式化。)
总而言之,我发现进行翻译的唯一方法是:
eval echo \$\"$'Written by %s, %s, %s,\nand %s.\n'\"
Écrit par %s, %s, %s,
et %s.
或
msg=$'Written by %s, %s, %s,\nand %s.\n'
eval echo \$\""$msg"\"
Écrit par %s, %s, %s,
et %s.
(你可以看到两个双引号……不是很性感……)
最后我可以:
WRITTERS=(Hans Pierre Jackob Heliott)
eval printf \$\""$msg"\" ${WRITTERS[@]}
Écrit par Hans, Pierre, Jackob,
et Heliott.
但正如我最近听说的那样,eval 是邪恶的... ;-)
事实上,我对使用仅硬编码部分 运行的eval
没有问题,但我希望有一种方法可以将此 eval 排除在外并以更自然或可读的方式编写此类部分。
@techno 的回答让我明白我的第一个想法是危险的,好像WRITTERS
包含一些;ls
,因为 sample ...
编辑: 所以问题是:
我怎样才能将这个eval
排除在外和/或以更性感的方式编写它
备注:
$ printf "I use bash %s on Debian %s\n" $BASH_VERSION $(</etc/debian_version)
I use bash 4.1.5(1)-release on Debian 6.0.6
最佳答案
我玩过这个功能,这就是我想出的:你可以逐字包括换行符:
$ echo $"Written by %s.
> "
Écrit par %s.
$
在脚本中:
#!/bin/bash
message=$"Written by %s.
"
printf "$message" Gniourf
此脚本将输出:
Écrit par Gniourf.
好吧,这不是一个真正的答案,但它可能会有一点帮助(至少,我们没有使用邪恶的 eval
)。
个人评论:我觉得这个功能真的很笨拙!
关于bash 本地化不适用于多行字符串(具有强语法或通过 `eval` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027030/