我在ubuntu的shell脚本中使用zenity实用程序来显示GUI对话框。我想知道当系统区域设置改变时,如何实现语言翻译。
zenity --question --title="" --text="Hello World. How was the day today..Good?" --width="500" --height="20"
在上面的命令中,如何实现英文文本"Hello World"的语言翻译。今天过得怎么样……还好吗?"如果我将系统语言环境从英语更改为其他语言,则默认情况下带有zenity的"Yes","No"按钮文本会自动更改,但是如何翻译我的自定义文本呢?
我也在寻找这个问题的答案。我在寻找答案的时候发现了这个问题。我在正确的轨道上搜索如何使用。po和。pot文件在bash脚本。
看起来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
之后,您可以通过在子命令中用eval_gettext
包装它们来更改需要翻译的Zenity文本字符串。
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
和--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。对于德语代码deLANGUAGE=de ./myscript.sh
myscript.sh、德语(de)、。po、。mo和文件夹的文件结构:
- myscript.sh
- 语言环境
- 德
- LC_MESSAGES
- myscript.sh.mo
- myscript.sh.po
- LC_MESSAGES