如何支持多语言在Linux C / C ++程序?(How to support multiple

2019-07-30 18:35发布

例如,在这个简单的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这个方针?

Answer 1:

关键是要利用“资源”(每一个语言,配置在运行时被读取)与硬编码字符串。 像Qt和GTK + GUI框架,使这(相对)很容易。

下面是由GTK +使用的攀高”库的链接(但不是,强调自己专有的,GTK +):

  • http://www.pango.org/

下面是关于使用Pango的教程:

  • http://x11.gp2x.de/personal/google/

下面是关于“gettext的()”(其中,我相信,Pango的使用)教程:

  • http://inti.sourceforge.net/tutorial/libinti/internationalization.html


Answer 2:

这里有两个问题。

  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);
}


Answer 3:

你可能不希望做这个简单的程序,但是如果你的程序是足够大,你可以使用GNU gettext的,这可以在这里找到http://www.gnu.org/software/gettext/ 。 然后,你用文本文件提供程序,然后用printf(_(“一些字符串\ n”))输出本地化的字符串。



Answer 4:

刚刚发现一个教程,我可以轻松地跟踪: 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!


Answer 5:

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


文章来源: How to support multiple language in a Linux C/C++ program?
标签: c++ c linux locale