ローカリゼーションと数字

Habréには、数字を正しく処理し、それに関連する名詞を傾斜させる方法について、さまざまな言語の例を含む多くの記事があります。 このタスクを見てみましょう Qtで解決しました。



Qtでのローカリゼーションに関する以前の記事は、QObject :: tr()関数が言及されており、プレースホルダー%1、%2などを文字列に挿入できるとさえ言われました。



ただし、残念ながら、特別なプレースホルダーは言及されていません-%n。 QObject :: tr関数のシグネチャをよく見ると

QString QObject::tr ( const char * sourceText, const char * comment = 0, int n = -1 )



あなたは彼女が3番目のパラメータを持っていることがわかります-特定の整数n、それは何ですか?



前回の記事の例を取り上げて、少し単純化してみましょう。コピーされたファイルの数のみを示します。

void FileCopier::showProgress(int done)

{

label.setText(tr("%1 files copied.").arg(done));

}




ご覧のとおり、done == 1の条件に応じて、1つまたは複数のファイルを書き込む必要があります。 ロシア語に翻訳すると、すべてがさらに複雑になります-フォームは3(1ファイル、2ファイル、5ファイルがコピーされます)になり、条件はより複雑になります。



そして、ここでplaceholder%nとtr()関数の3番目の引数を使用します。

すべてを正しくするために、次のようにshowProgress関数を作成します。

void FileCopier::showProgress(int done)

{

label.setText(tr("%n files copied.", "", done));

}




また、言語学者が翻訳するとき、%nの異なる値に対してこの行を翻訳するためのいくつかのオプションを設定する機会があります。



英語には、SingularとPluralの2つのオプションがあります。 Singularは次のように表示されます。「%nファイルがコピーされました。」、Pluralは次のようになります。「%nファイルがコピーされました。」



ロシアの3つ-単数形、二重形、複数形。

単数形: "コピーされた%nファイル。"

二重:「%nファイルをコピーしました。」

複数:「%n個のファイルをコピーしました。」



ここで、翻訳者とプログラマーの仕事が終わります。 Qt自体は、この特定の言語でどの形式を使用するのかをどのような数字で知っています。 プログラムが実行されると、現在のロケールと3番目のパラメーターに応じて、tr()関数は目的の行を返します。



興味のある方は、Qtで使用されるいくつかの言語のを以下に示します。



All Articles