例如,在这个简单的Hello World程序:
#include <iostream>
int main()
{
std::cout<<"Hello World!"<<std::endl;
return 0;
}
我想看看法国,如果用户的环境中LANG
设置为fr_FR
,它可能是这样的:
$ ./a.out
Hello World!
$ LANG=fr_FR.utf8
$ ./a.out
Bonjour tout le monde!
是否有一个如何在Linux下archieve这个方针?
关键是要利用“资源”(每一个语言,配置在运行时被读取)与硬编码字符串。 像Qt和GTK + GUI框架,使这(相对)很容易。
下面是由GTK +使用的攀高”库的链接(但不是,强调自己专有的,GTK +):
下面是关于使用Pango的教程:
- http://x11.gp2x.de/personal/google/
下面是关于“gettext的()”(其中,我相信,Pango的使用)教程:
- http://inti.sourceforge.net/tutorial/libinti/internationalization.html
这里有两个问题。
你可以很容易使你的程序国际化/使用本地化gettext库。
您可以使用标准的函数'的getenv()'检查用户的环境变量:
const char *langcode = getenv("LANG");
或者一些实现(我相信Linux和Mac OS X在内)支持3个参数的主要功能:
int main(int argc, char **argv, char **envp)
{
char **e;
char *langcode;
for (langcode = NULL, e = envp; e != NULL; e++)
{
if (strstr(*e, "LANG") != NULL)
{
langcode = strchr(*e, '=') + 1;
break;
}
}
printf("Language: %s\n", langcode);
}
你可能不希望做这个简单的程序,但是如果你的程序是足够大,你可以使用GNU gettext的,这可以在这里找到http://www.gnu.org/software/gettext/ 。 然后,你用文本文件提供程序,然后用printf(_(“一些字符串\ n”))输出本地化的字符串。
刚刚发现一个教程,我可以轻松地跟踪: http://fedoraproject.org/wiki/How_to_do_I18N_through_gettext
这是我的新代码
#include <iostream>
#include <libintl.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL, "");
bindtextdomain("helloworld", "/usr/share/locale");
textdomain("helloworld");
std::cout<<gettext("Hello World!")<<std::endl;
return 0;
}
然后创建pot
文件
mkdir po
xgettext --package-name helloworld --package-version 1.0 -d helloworld -o po/helloworld.pot -s a.cpp
生成mo
文件
msginit --no-translator --locale fr_FR --output-file po/helloworld.po --input po/helloworld.pot
sed --in-place po/helloworld.po --expression='/"Hello World!"/,/#: / s/""/"Bonjour tout le monde!"/'
msgfmt po/helloworld.po -o po/helloworld.mo
sudo cp po/helloworld.mo /usr/share/locale/fr/LC_MESSAGES/
这里是输出
[deqing@hdell]~/work/sty$ ./helloworld
Hello World!
[deqing@hdell]~/work/sty$ LANG=fr_FR.utf-8
[deqing@hdell]~/work/sty$ ./helloworld
Bonjour tout le monde!
对于C ++,如果你可以使用Qt库,它有定位的良好支持。 有关详细信息看看到他们的页面的内在 。
接下来伪示例演示如何加载翻译文件,并设置语言环境:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
QTranslator myappTranslator;
myappTranslator.load("myapp_" + QLocale::system().name());
app.installTranslator(&myappTranslator);
...
return app.exec();
}