原博文内容:
1、首先通过一个简单的脚本来实践(原博文链接:http://t.csdnimg.cn/8IPPq):
#!/bin/bash
alias GETTEXT=‘gettext “test01“’ //这里的alias语句似乎无法在bash下正常执行,alias语句的功能见原博文
HELLO_WORLD=$(GETTEXT “Hello world”) //在没有前面的alias的语句的情况下,GETTEXT只是占位符,没有任何含义,所以 在不使用alias语句的情况下应该小写为gettext才能成功生效
echo “$HELLO_WORLD“ //这个语句和其上一行语句是一个整体,两个合起来的效果与下面的语句相同,即 可以改为:echo “$(GETTEXT “Hello world”)”
echo “$(GETTEXT ”Press any key to continue“)“
这里创建了名为test01的脚本。
以上的脚本中,主要是使用了gettext工具对echo语句的内容进行了标记:
如对于:echo "hello world"
标记后的样式为:echo "$(gettext "hello world")"
注:gettext后有空格。同时这次的测试脚本中使用的gettext为大写是因为使用了alias,个人不推荐使用alias,修改后的内容见后续步骤。
2、然后对于标记完成的脚本,使用命令生成.pot文件:
xgettext -o test01.pot -L Shell --keyword=GETTEXT test01
//这里的第一个文件名指的是要生成的.pot文件的文件名,后一个文件名指的是翻译的脚本文件名,即上一页的脚本文件.
翻译的工作就在生成的.pot文件中进行。
.pot文件内容如图所示:
对于新生成的.pot文件,msgstr后的引号中是空的,翻译工作就在此进行,输入每个语句对应的翻译内容到引号中,在实现翻译的时候即可将对应的语句切换为手动输入的翻译内容。
3、生成.pot文件后需要生成中间文件.po文件:
msginit -i test01.pot -l zh_CN.UTF-8 -o test01.po
//po文件主要是指定了语言区域.这个语言区域决定了gettext工具在翻译时去哪里寻找.mo文件(关于mo文件的路径选择在后面阐述)
4、最后是将.po文件生成.mo文件:
msgfmt -o test01.mo test01.po
// 容易看出前一个是生成.mo文件的文件名,后一是用于生成.mo文件所依赖的.po文件的文件名
至此对应的翻译域文件(.mo文件)就会生成在当前的目录下
5、.mo文件位置的修改:
对于该教程中的案例,原博文作者选择的是非常标准的路径:
通过命令拷贝到目标路径:sudo cp test01.mo /usr/share/locale/zh_CN/LC_MESSAGES/
然后运行即可实现对原来脚本的翻译.
注意:原博文运行时是用sh的模式运行的而不是直接以bash运行,因为似乎alias不支持bash。
个人对原博文内容的改进:
因为考虑到原博文作者使用了alias进行翻译,不能直接./运行,所以通过定义变量的方式对相关内容进行对应的修改:
①
对于之前的脚本的内容,取消掉alias语句,因此后面使用GETTEXT捕捉文本内容的语句需要吧GETTEXT改为小写gettext.
②
在脚本内容开始定义两个变量:
export TEXTDOMAIN=“test01” //这个变量定义的内容是.mo文件的文件名
export TEXTDOMAINDIR=“./locale” //这个变量定义的内容是.mo文件的路径,以我这个路径为例的话,指的就是去当前目录下的子目录locale内寻找.mo文件
③
这里为了配合寻找.mo文件的路径,需要在locale目录下创建和开始提到的标准目录相同的目录,即在locale下创建额外的文件夹zh_CN,然后再zh_CH文件夹下再创建LC_MESSAGES文件夹,然后需要将.mo文件放在该目录下.
即.mo文件的位置应该修改为当前目录下的locale/zh_CN/LC_MESSAGES/
以上路径需要手动创建,可以直接在图形界面创建和移动.mo文件,比较方便
最后就可以直接以命令:./test01运行脚本并得到翻译后的内容,不需要添加sh
最后大概的文件结构如图: