Linux 让你的软件支持多国语言

| 2011年12月14日

开头

Xgcom一直想做成多国语言的支持,但是之前没有仔细研究怎么做,今天有时间,就研究了一下,感觉也挺简单的,这里先做一个测试demo出来,也刚好记录一下。

如下的程序:xtest.c

#include <stdio.h>

int main(int argc, char* argv[])

{

printf(_("Hello, GetText!\n"));

return 0;

}

对这个做一个中文的,默认是英文,在没识别出你当前的语言环境或者没有这种语言支持的时候以英文显示。

首先把代码修改如下:xtest.c

#include <stdio.h>

#include <locale.h>

#include <libintl.h>

#define _(string) gettext (string)

#define LOCALEDIR "./locale/"  //这是语言包的引用路径

#define PACKAGE "xtest" //包名称,以这个名称去找语言包

int main(int argc, char* argv[])

{

setlocale (LC_ALL, "");

bindtextdomain (PACKAGE, LOCALEDIR);

textdomain (PACKAGE);

printf(_("Hello, GetText!\n"));

return 0;

}

制作文本po文件:xtest.po

制作命令:

xgettext -a xtest.c -o xtest.po

一般生成的xtest.po会不是很符合我们的需求,要修改或是删除一些不需要的内容。

比如这里修改了一下几个方面:

1.删除不需要替换的msgid和msgstr

2.修改了文件的编码类型为UTF-8

3.默认生成的msgstr是没有内容,这里需要添加,我这里添加的是“你好,GetText!\n”

修改后的xtest.po内容如下:xtest.po

# SOME DESCRIPTIVE TITLE.

# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER

# This file is distributed under the same license as the PACKAGE package.

# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.

#

#, fuzzy

msgid ""

msgstr ""

"Project-Id-Version: PACKAGE VERSION\n"

"Report-Msgid-Bugs-To: \n"

"POT-Creation-Date: 2011-12-14 14:26+0800\n"

"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"

"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"

"Language-Team: LANGUAGE <LL@li.org>\n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=UTF-8\n"

"Content-Transfer-Encoding: 8bit\n"

#: xtest.c:14

#, c-format

msgid "Hello, GetText!\n"

msgstr "你好,GetText!\n"

制作mo文件

首先要保证刚才的xtest.po文件的编码是utf-8的,是和xtest.po中所注明的编码格式是一致的。否则在生成xtest.mo的时候会报错。

制作命令:

msgfmt xtest.po -o xtest.mo

mo文件是二进制文件,无法用文本编辑器查看。

建立语言包目录并存放语言包

在程序当前目录下再建立这样的目录:

mkdir ./locale/zh_CN/LC_MESSAGES/

用来保存mo文件,把刚才生成的xtest.mo文件拷贝到这个目录

编译程序测试查看

编译程序命令:

gcc xtest.c -o xtest

查看当前的语言环境:locale

运行结果1

helightxu@zhwen:/helightxu/testcode/xtextgen> locale

LANG=en_US.UTF-8

LC_CTYPE="en_US.UTF-8"

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_COLLATE="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_PAPER="en_US.UTF-8"

LC_NAME="en_US.UTF-8"

LC_ADDRESS="en_US.UTF-8"

LC_TELEPHONE="en_US.UTF-8"

LC_MEASUREMENT="en_US.UTF-8"

LC_IDENTIFICATION="en_US.UTF-8"

LC_ALL=

helightxu@zhwen:/helightxu/testcode/xtextgen> ./xtest

Hello, GetText!

运行结果2

helightxu@zhwen:/helightxu/testcode/xtextgen> export LANG=zh_CN

helightxu@zhwen:/helightxu/testcode/xtextgen> locale

LANG=zh_CN

LC_CTYPE="zh_CN"

LC_NUMERIC="zh_CN"

LC_TIME="zh_CN"

LC_COLLATE="zh_CN"

LC_MONETARY="zh_CN"

LC_MESSAGES="zh_CN"

LC_PAPER="zh_CN"

LC_NAME="zh_CN"

LC_ADDRESS="zh_CN"

LC_TELEPHONE="zh_CN"

LC_MEASUREMENT="zh_CN"

LC_IDENTIFICATION="zh_CN"

LC_ALL=

helightxu@zhwen:/helightxu/testcode/xtextgen> ./xtest

你好,GetText!

话尾

总的来看用xgettext 和msgfmt可以做出支持多国语言的程序,在操作上和后期更新上还是比较方便的。

但是这里介绍的只是一个简单的demo,要真正使用起来还需要配置其它的脚本,如:如何控制根据当前的语言环境安装所需要的语言包等。后面还需要再好好探索学习一下啊。

看完本文有收获?请分享给更多人

关注「黑光技术」,关注大数据+微服务