我在ubuntu的shell脚本中使用zenity实用程序来显示GUI对话框。我想知道在更改系统区域设置时如何实现语言翻译。
zenity --question --title="" --text="Hello World. How was the day today..Good?" --width="500" --height="20"
在上面的命令中,如何实现英文文本的语言翻译“Hello World。今天怎么样......好吗?”用不同的语言。如果我将系统区域设置从英语更改为其他语言,默认情况下带有zenity的“是”,“否”按钮文本会自动更改,但如何翻译我的自定义文本?
答案 0 :(得分:1)
我也在寻找答案。我在寻找答案时发现了这个问题。我正在寻找如何在bash脚本中使用.po和.pot文件的正确方法。
看起来gettext程序和朋友可以用来做这件事。
我发现这个好blog post解释得很好。虽然他将此用于echo
,但这也可用于Zenity的字符串。
基础是这个。要使用gettext
,您需要在脚本顶部设置两个环境变量。像这样的行:
export TEXTDOMAIN=$(basename $0) # Name of this script
export TEXTDOMAINDIR==$(dirname "$(readlink -f "$0")")/locale # Location of this script
这样您就可以将翻译放在脚本旁边的文件夹中,如果您没有将其设置为/usr/share/locale
,则为TEXTDOMAINDIR的默认位置。
并使用
在脚本中获取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
因此,与--title
和--text
等Zenity文本选项一起使用的语法如下所示:
"$(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结尾,请将此包含在内。即。对于myscript.sh
,.mo文件为myscript.sh.mo
。
如果您不使用Poedit,您还可以使用msgfmt
制作.mo文件:
msgfmt -v myscript.sh.po -o myscript.sh.mo
要使用某种语言测试脚本,您可以像这样运行它。即。对于德语代码 de
LANGUAGE=de ./myscript.sh
myscript.sh,德语(de),. po,.mo和文件夹的文件结构: