3

QObject::tr()数字を含む文字列を翻訳するために私が使用している関数には、次の2つの形式があります。

tr("There are %n foo(s)", 0, foo.size());
tr("%1: %2").arg(QLocale().toString(bar.size())).arg(bar.name());

これらは、同じ文字列でローカリゼーション複数形化を実行する場合を除いて、文字列に数値が必要なほとんどの場合に対応します。もちろん、翻訳を分割することもできますが、その文字列がすべての言語の同じ場所で分割されるかどうかを推測する必要があります(ほとんどの場合、私が行う資格はありません)。

QLocaleのドキュメントには次のように記載されています...

QString :: arg()は、フォーマット文字列内の位置指定子に「L」が含まれている場合、デフォルトのロケールを使用して数値をフォーマットします(例:「%L1」)。

...したがって、2番目の形式は次のように書き直すことができます...

tr("%L1: %2").arg(bar.size()).arg(bar.name());

...そしてこれはあなたが最初のフォームを次のように書き直すことができることを示唆しています...

tr("There are %Ln foo(s)", 0, foo.size());

これはコンパイルされ、Linguistに複数形として表示されますが、これによって番号がローカライズされるかどうかは誰にもわかりませんか?どちらの方法でも、どのドキュメントにも何も書かれていません。

4

2 に答える 2

7

はい、動作します:

#include <QtCore>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

//    QLocale::setDefault(QLocale(QLocale::German));
    QLocale::setDefault(QLocale(QLocale::English));

    QTranslator qtTranslator;
//    qtTranslator.load("foo_de", qApp->applicationDirPath());
    qtTranslator.load("foo_en", qApp->applicationDirPath());
    a.installTranslator(&qtTranslator);

    int foo_count = 123456;

    QString str1 = QObject::tr("There are %n foo(s)", "foo", foo_count);
    QString str2 = QObject::tr("There are %Ln foo(s)", "foo", foo_count);

    qDebug() << str1;
    qDebug() << str2;

    return a.exec();
}

英語を実行している場合の出力:

"There are 123456 foos"
"There are 123,456 foos"

ドイツ語を実行している場合の出力(実際のドイツ語話者に謝罪します):

"Es gibt 123456 fooen"
"Es gibt 123.456 fooen"

唯一の奇妙なことは次のとおりです。

  • %Ln翻訳者は、通常の翻訳だけでなく、単数形と複数形の両方の翻訳を維持する必要があり%nます。
  • 言語学者は、「翻訳に必要な%n場所マーカーが含まれていない」という複数形について文句を言います。これはバグです。
于 2012-03-01T02:06:07.233 に答える
1

ここでの(Qt 4.x)ドキュメントは、「複数形の処理」という見出しの下に表示されているため、複数形とローカライズの両方を意味しているように見えます。

ここでの後半のQt5.xのドキュメントは逐語的なコピーのようですが、これは特に十分にドキュメント化された使用法ではないため、残念なことのようですQObject::tr(...)

于 2012-02-14T16:44:24.557 に答える