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 中归档的指南?

4

5 回答 5

3

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

这是 GTK+ 使用的 Pango" 库的链接(但强调不是GTK+独有的):

以下是使用 Pango 的教程:

这是一个关于“gettext()”的教程(我相信 Pango 使用它):

于 2012-08-03T05:14:31.917 回答
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);
}
于 2012-08-03T05:17:43.197 回答
0

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

于 2012-08-03T08:30:08.303 回答
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!
于 2012-08-03T09:00:48.033 回答
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();
 }
于 2012-08-03T10:32:13.127 回答