如何在bash脚本中使用gettext?
我只找到此页面,但不理解。
我的脚本是这样写的:
#!/bin/bash
. lang_file.sh
echo $LANG_HELLO_WORLD
和lang_file.sh看起来像这样:
#!/bin/bash
LANG_HELLO_WORLD="Hello World"
我想使用gettext将lang_file.sh更改为某种内容,例如:
#!/bin/bash
LANG_HELLO_WORLD=`some gettext command to get string in user language`
我想使用启动板中的代码,以便其他用户可以翻译它(.po,.pot文件)
对不起,英语不好,有什么建议吗?
您需要执行以下步骤:
标记要翻译的字符串。以下代码段给出了示例:
我们称它为PRJ.sh
:
#!/bin/sh
alias GETTEXT='gettext "PRJ"'
## Use GETTEXT to mark the string you want to translate
HELLO_WORLD=$(GETTEXT "Hello world")
echo "$HELLO_WORLD"
生产.pot文件,以便翻译可以在其中工作。
运行以下命令,它只会查找实际要翻译的GETTEXT。
xgettext -o PRJ.pot -L Shell --keyword --keyword=GETTEXT PRJ.sh
可选:生成.po文件。
对于您要覆盖的每个语言环境。
msginit -i PRJ.pot -l fr.UTF-8
注意,建议使用“ UTF-8”,否则msginit
可能会为您错误地选择一些过时的编码。
检索完成的.po文件,并将它们转换为.mo文件(机器可以读取的文件)
msgfmt -v fr.po -o fr.mo
安装.mo文件。运行:
sudo install fr.mo /usr/share/locale/fr/LC_MESSAGES/PRJ.mo
现在您可以尝试结果:
LANGUAGE=fr ./PRJ.sh
您应该会看到Hello world的法语翻译。
bash中有一个长期丢失,从未记录且几乎不推荐使用的内置解决方案。
LANG=foo_BAR.utf8
TEXTDOMAIN="test"
TEXTDOMAINDIR="/usr/share/locale"
echo $"fooMsgid"
# bash --dump-po-strings <scriptfile>
gettext翻译使用可编辑格式* .po来存储翻译,并使用编译格式* .mo来进行加载。
有关文件格式的信息,请参考此处:https://www.gnu.org/software/gettext/manual/html_node/index.html的“ 3 PO文件的格式”和“ 10个生成二进制MO文件”部分
这里,我重点介绍如何尝试使用gettext
命令来简要翻译。
[在准备好具有<lang>/LC_MESSAGES/<textdomain>.mo
之类的内部层次结构的文件夹/ path / to / your / locale之后(其中<lang>
例如韩语的ko_KR
),请在lang_file.sh
中使用以下代码:
#!/bin/bash
export LC_ALL=ko_KR.UTF-8 # if LC_ALL not work, you could try also "LANG" and "LANGUAGE"
export TEXTDOMAINDIR=/path/to/your/locale
# export TEXTDOMAIN="<textdomain>" # <- optional, set this to save the "<textdomain>" argument for `gettext` below
LANG_HELLO_WORLD="$( gettext "<textdomain>" "Your message to translate" )"
我想用适当的语言问用户?您可能希望用户首先选择语言。您要询问的另一部分只是将$(get_some_str_func)之类的命令嵌入到变量中。
我没有编写此代码,但可能与您尝试执行的操作类似?我不确定,我不太了解您的要求。
function _configure_locale() { # [profile]
local profile=${1:-EN}
case ${profile} in
DE|DE_DE|de_DE)
LC_ALL="de_DE.UTF-8"
LANG="de_DE.UTF-8"
LANGUAGE="de_DE:de:en_US:en"
;;
EN|EN_US|en|en_US)
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
;;
*)
echo "ALERT" "${FUNCNAME}: unknown profile '${profile}'"
;;
esac
LC_PAPER="de_DE.UTF-8"; # independent from locale
LESSCHARSET="utf-8"; # independent from locale
MM_CHARSET="utf-8" # independent from locale
echo "locale settings" "${LANG}";
export LC_ALL LANG LANGUAGE LC_PAPER LESSCHARSET MM_CHARSET
}