如何在Linux C/C++程序中支持多种语言?

3
例如,在这个最简单的“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中实现这一点的指南?

1
另一个简单易用的格式是GetText库,就像在PHP中所知道的那样。将其适配到C++中足够容易。 - ATaylor
5个回答

3
关键是使用“资源”(每种语言一个,配置为在运行时读取),而不是硬编码字符串。像Qt和GTK+这样的GUI框架使此过程(相对)容易。
这是一个链接到GTK+使用的Pango库(但强调一点,并非仅限于GTK+):

这是一个关于使用Pango的教程:

以下是关于“gettext()”(我相信Pango使用它)的教程:


如果这个应用程序不是GUI应用程序呢?- 请看我的回答。 - user529758

1

这里有两个问题。

  1. 您可以使用Gettext库轻松地使您的程序国际化/本地化。

  2. 您可以使用标准函数`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);
}

0

刚刚找到一个我可以轻松跟随的教程: 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!

0

对于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();
 }

0

你可能不想在简单程序中这样做,但如果你的程序足够大,你可以使用GNU gettext,它可以在http://www.gnu.org/software/gettext/找到。然后,你提供文本文件给你的程序,然后使用printf(_("Some string\n"))来输出本地化字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接