В bash есть хорошая функция, о локализации (перевод языка):
TEXTDOMAIN=coreutils
LANG=fr_CH.utf8
echo $"system boot"
démarrage système
( Nota:. Для этой работы уже был сгенерирован в вашей системе... Иначе вы можете попробовать создать свой собственный язык... или установить locales
и сгенерировать его.)
Проблема:
Но если это отлично работает с простыми строками, когда строка содержит \n
(или худшее: backtick `
, вещи сложнее:
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
, которые выполняются только с жестко закодированной частью, но я был бы признателен за то, чтобы сохранить эту оценку и написать эту часть более естественным или читаемым образом.
Во всех ответах @techno дайте мне понять, что моя первая идея - это что-то опасное, если WRITTERS
содержит некоторые ;ls
, для образца...
Изменить: Итак, вопрос:
Как я могу сохранить этот eval
и/или записать это более сексуально.
Nota:
$ 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