3

たとえば、この最も単純なhelloworldプログラムでは次のようになります。

#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

重要なのは、「リソース」(言語ごとに1つ、実行時に読み取られるように構成されている)とハードコーディング文字列を使用することです。QtやGTK+のようなGUIフレームワークは、これを(比較的)簡単にします。

GTK +で使用される「Pango」ライブラリへのリンクは次のとおりです(ただし、 GTK +専用ではありません)。

Pangoの使用に関するチュートリアルは次のとおりです。

そして、これが「gettext()」に関するチュートリアルです(これは、Pangoが使用していると思います)。

于 2012-08-03T05:14:31.917 に答える
1

ここで 2 つの質問があります。

  1. Gettext ライブラリを使用して、プログラムを簡単に国際化/ローカライズできます。

  2. 標準関数「getenv()」のいずれかを使用して、ユーザーの環境変数を確認できます。

    const char *langcode = getenv("LANG");

または、いくつかの実装 (Linux と Mac OS X が含まれていると思います) は、3 つの引数の main 関数をサポートしています。

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

単純なプログラムではおそらくこれを行いたくないでしょうが、プログラムが十分に大きい場合は、 http: //www.gnu.org/software/gettext/にあるGNUgettextを使用できます。次に、プログラムにテキストファイルを提供し、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 に答える