我也在寻找这个问题的答案。我在寻找答案时发现了这个问题。我正在寻找如何在 bash 脚本中使用 .po 和 .pot 文件的正确轨道。
看起来gettext程序和朋友可以用来做这件事。
我发现这篇很好的博客文章很好地解释了它。虽然他使用这个echo
也可以用于 Zenity 的字符串。
基本情况是这样的。要使用,gettext
您需要在脚本顶部设置两个环境变量。像这样的行:
export TEXTDOMAIN=$(basename $0) # Name of this script
export TEXTDOMAINDIR==$(dirname "$(readlink -f "$0")")/locale # Location of this script
这将允许您将翻译放在脚本旁边的文件夹中,如果您未将其设置为 TEXTDOMAINDIR 的默认位置/usr/share/locale
。
并在您的脚本中获取gettext.sh脚本
source gettext.sh
之后,您可以通过将需要翻译的 Zenity 文本字符串包装eval_gettext
在子命令中来更改它们。
例如:
zenity --info --title="Now opening programs!" --text="I will now open the starup programs for you. This will help you get the computer setup quicker. I will let you know when I am finished" --timeout=5
变成:
zenity --info --title="$(eval_gettext "Now opening programs!")" --text="$(eval_gettext "I will now open the starup programs for you. This will help you get the computer setup quicker. I will let you know when I am finished")" --timeout=5
所以用于 Zenity 文本选项的语法,比如--title
and --text
,如下所示:
"$(eval_gettext "Text string")"
我们有"Text string"
双引号。
这是在一个eval_gettext
子命令中:$(eval_gettext "Text string")
用双引号括起来,这样 Zenity 就可以从双引号中的子命令返回字符串。
"$(eval_gettext "Text string")"
接下来,您需要使用xgettext创建一个翻译模板文件 (.pot) 。
xgettext -L Shell -o myscript.pot myscript
生成的 .pot 文件可以提供给您的翻译人员,他们可以使用Poedit等程序为其语言创建 .po 文件。然后,翻译人员可以向您发送要包含在项目中的 .po 文件。
如果您使用 Poedit 还会在您保存时为您创建 .mo 文件。在TEXTDOMAINDIR
上面,您可以在您的脚本是以下文件夹结构的同一文件夹中创建:
locale/<LANG>/LC_MESSAGES/
替换为翻译的语言代码。我将要翻译的 .po 文件放在文件LC_MESSAGES
夹中,然后用 Poedit 保存它以创建 .mo 文件。.po 的名称应与TEXTDOMAIN
上面的变量加上 .mo 的名称相同。如果您的脚本以 .sh 结尾,请将其包含到。IE。对于myscript.sh
.mo 文件将是myscript.sh.mo
.
如果你不使用 Poedit,你也可以使用它msgfmt
来制作 .mo 文件:
msgfmt -v myscript.sh.po -o myscript.sh.mo
要使用一种语言测试您的脚本,您可以像这样运行它。IE。对于德语代码de
LANGUAGE=de ./myscript.sh
myscript.sh、德语 (de)、.po、.mo 和文件夹的文件结构:
- 脚本文件
- 语言环境
- 德
- LC_MESSAGES
- 我的脚本.sh.mo
- myscript.sh.po