软件本地化(国际化)步骤
增加本地化代码实例
#define LOCALE_DIR “/usr/share/locale”
#define LOCALE_DIR “”//如果设置当前目录
#define _(string) gettext(string)
int main()
{
setlocale(LC_ALL, ""); //配置地域化信息
bindtextdomain("test",LOCALE_DIR); //指定包里包含消息条目的目录(mo目录)
bind_textdomain_codeset("test","UTF-8")//指定域消息条目(mo)中消息的字符编码
textdomain("test"); //指定域名(test.mo)
printf(_("Hello world!/n"));//gettext函数,用于xgettext导出pot文件
...
}
#Makefile
src=test.c
exe=test
filename=test
CC = gcc
zh = zh_CN/LC_MESSAGES
LOCALE_DIR = /usr/share/locale
all:
$(CC) $(src) -o $(exe)
po:
xgettext --keyword=_ $(src) -o $(filename).pot
msginit -l zh_CN.UTF-8 -i $(filename).pot -o $(filename).po
mo:
msgfmt $(filename).po -o $(filename).mo
dir:
mkdir -p zh_CN/LC_MESSAGES
cp:
cp test.mo $(zh)
cp test.mo $(LOCALE_DIR)/$(zh)
#end Makefile
详细说明
函数setlocale()
原型: char* setlocale(const char* category, const char* locale);
内容说明
本函数用来配置地域的信息。参数 category 有下列的选择:
LC_ALL 包括下面的全项选项都要。
LC_COLLATE 配置字符串比较
LC_CTYPE 配置字符类别及转换
LC_MONETARY 配置金融货币
LC_NUMERIC 配置小数点后的位数。
LC_TIME 配置时间日期格式
而参数 locate 若是空字符串 "",则会使用系统环境变量的 locate 或是 LANG 的值。若 locate 为零,则不会改变地域化配置。返回新的地域,若系统尚未实现则返回 false。
//===
函数 bindtextdomain()
原型: char * bindtextdomain (const char * domainname, const char * dirname);
函数功能:函数的作用是设置指定消息域(mo)里包含消息条目的位置。
bindtextdomain 告诉程序域 domainname 的文件是在 locale 目录下。所以 gettext 最终会选择从 locale/$LANG/LC_MESSAGES/helloworld.mo 文件中得到翻译的字符串。$LANG 是由 locale环境变量的值所决定。
//===
函数 bind_textdomain_codeset()
原型:bind_textdomain_codeset(const char* Domain,const char* encoding)
用法:bind_textdomain_codeset(“test”, “UTF-8”);
函数功能:指定域消息条目中消息的字符编码
//===
函数 textdomain()
原型:textdomain(const char* Domain);
用法:textdomain(“test”);
函数功能:textdomain 告诉程序要全局使用的 domain 名字叫 test。一个域实际上对应的是一个文件名。比如这里就是 test.mo 文件