bash 本地化不适用于多行字符串(具有强语法或通过 `eval` )

标签 bash localization

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/

相关文章:

python - 使用 Python 进行参数扩展

angular - ngx-translate:重新加载时不显示翻译

git - 在哪里可以找到 Git 本地化的语言列表?

php - 使用 PHP strftime() 使用 date() 格式化字符串

Linux shell 脚本 - 将尾值分配给变量?

linux - ssh 无法与 sudo 一起正常工作

java - 如何在 Ubuntu 和 Windows (Cygwin) 中使用的 bash 脚本中设置 Java 类路径

java - Java 中的静态字符串本地化问题

ios - 仅加载包含资源的 bundle 时出现 "Cannot find executable for CFBundle"

git - 如何使使用 git bash(触摸文件)创建的文件在 Windows 8.1 中可见?