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

  显示原文与译文双语对照的内容
0 0

有优秀的特性bash中,有关本地化( 语言翻译) :

TEXTDOMAIN=coreutils
LANG=fr_CH.utf8
echo $"system boot"
démarrage système

( Nota : 为此工作, fr_CH.utf8已经在系统上生成 。。。 你还可以尝试用自己的语言环境... 或安装 locales并生成一个) 。

Problem :

但如果这可以很好地使用简单字符串,当字符串包含 n( 或最差: 以反引号 `事情则更为复杂:

echo $"Written by %s, %s, %s,nand %s.n"
Written by %s, %s, %s,nand %s.n

这不是参加了回答。

( Nota2: 单位,各确切消息含有已准备就绪 .mo消息文件,在本sample/test我用existant coreutils.mo文件,这些文件可能是 unformated 使用命令 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,对于示例。。。

EDIT : 所以问题是:

我怎么保留这个evalout和/ 或写入这个更加性感时尚

Nota :

$ printf "I use bash %s on Debian %sn" $BASH_VERSION $(</etc/debian_version)
I use bash 4.1.5(1)-release on Debian 6.0.6
时间:原作者:9个回答

0 0

如果使用的是 eval不好带有任意变量,可以通过某种方法为此仅当called/needed,在运行 eval只有消息部分:

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.

( 点翻译后的字符串末尾有确保整个字符串( 包括前导换行符( 其中传递给变量 sFormat. 它们将被放弃,并 ${sFormat%.})

原作者:
0 0

我还在分散了此功能,这是我想到的: 你可以在插入换行符按原义为:

$ echo $"Written by %s.
> "
Écrit par %s.
$ 

在脚本中:

#!/bin/bash
message=$"Written by %s.
"
printf "$message" Gniourf

此脚本的输出类似于:

Écrit par Gniourf.

是的,这并不算是个,但是它可以帮助回答一下( 至少在罪恶中,我们不使用 eval) 。

个人言论: 我觉得这个功能很笨拙 !

原作者:
0 0

ok我想终于做对了?

iprintf() {
    msg="$2"
    domain="$1"
    shift
    shift
    imsg=$(gettext -ed "$domain" "$msg" ; echo EOF)
    imsg="${imsg%EOF}"
    printf "$imsg" "$@"
}

使用示例:

LANG=fr_CH.utf8 iprintf coreutils "If FILE is not specified, use %s.  %s as FILE is common.nn" foo bar
原作者:
0 0

嗯,这是我自主答:

现在实现此似乎欠佳。 在许多情况下,但工作,而

echo "$(gettext 'missing character class name `[::]'')"
caractère de nom de classe « [::] » manquant

机理简单些相同的字符串似乎不可能翻译使用此 bashism

echo $"missing character class name `[::]'"
> 

控制台保持锁定 ( 等待这样一个end of string ) 添加 `"将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

而将这一字符串,包含两个逆向撇号工作精细地

echo $"%s}: integer required between `{' and `}'"
%s} : entier requis entre « { » et « } »

有我的脚本,你能够看到一些unsuccessfull trys 。

#!/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 innstring2 '
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 小时) 我起来 !

根本,感谢所有。 ( 我的赏金去@gniourf_gniourf除非最佳回答在8 小时。 但是多亏了@techno太,我喜欢你lPrintf ! )

原作者:
...