遅くなりましたが、この記事は Slint Advent Calendar 2024 一日目の記事です。
単数形と複数形
ものを数える際に、言葉によって語形が変化することがあります。
例えば、Qt では 以下のようにルールがまとめられ、これらに対応しています。
Language | Rule 1 | Rule 2 | Rule 3 |
---|---|---|---|
English | n == 1 | otherwise | N/A |
French | n < 2 | otherwise | N/A |
Czech | n % 100 == 1 | n % 100 >= 2 && n % 100 <= 4 | otherwise |
Irish | n == 1 | n == 2 | otherwise |
Latvian | n % 10 == 1&& n % 100 != 11 | n != 0 | otherwise |
Lithuanian | n % 10 == 1&& n % 100 != 11 | n % 100 != 12 && n % 10 == 2 | otherwise |
Macedonian | n % 10 == 1 | n % 10 == 2 | otherwise |
Polish | n == 1 | n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 | |
Romanian | n == 1 | n == 0 | |
Russian | n % 10 == 1&& n % 100 != 11 | n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 | |
Slovak | n == 1 | n >= 2 && n <= 4 | otherwise |
Japanese | otherwise | N/A | N/A |
Slint での対応
Slint では 1.8.0 現在、単数形か複数形かの使い分けが可能になっています。
翻訳のドキュメントに含まれる Plurals というセクションに以下の記載があります。
Use plural formatting when the translation of text involving a variable number of elements should change depending on whether there is a single element or multiple.
Given count and an expression that represents the count of something, form the plural with the | and % symbols like so:
@tr("I have {n} item" | "I have {n} items" % count).
Use {n} in the format string to access the expression after the %.
export component Example inherits Text { in property <int> score; in property <int> name; text: @tr("Hello {0}, you have one point" | "Hello {0}, you have {n} point" % score, name); }
翻訳対象用の @tr
を利用し、
@tr("単数形の場合" | "複数形の場合" % 数値);
という表現で、単数形と複数形を切り替えます。
文字列中の {n}
は、与えられた数値に置き換えられます。
実際のコード
SpinBox の値が単数の場合は 1 point
、複数の場合は n points
と表示するプログラムを書いてみました。
import { SpinBox } from "std-widgets.slint";
export component Demo {
VerticalLayout {
alignment: start;
spin-box := SpinBox {
value: 0;
}
Text {
text: @tr("{n} point" | "{n} points" % spin-box.value);
font-size: 24px;
horizontal-alignment: center;
}
}
}
これを、SlintPad 上で実行すると以下のようになります。
ドキュメントのバグを見つけました
先ほど引用したサンプルコードですが、バグがあります。
export component Example inherits Text { in property <int> score; in property <int> name; text: @tr("Hello {0}, you have one point" | "Hello {0}, you have {n} point" % score, name); }
単数形の場合: "Hello {0}, you have one point"
複数形の場合: "Hello {0}, you have {n} point"
となっていますが、複数形の場合は points となっているべきでしょう。
修正しました
以下の PR を作成し、本体に取り込まれました。次のバージョンでは修正されていることでしょう。
おわりに
今回は、Slint の翻訳における複数形の扱いを紹介しました。
最初に紹介した通り、言語に寄ってはもっと複雑なルールに対応する必要があり、それは今後ということになるでしょう。
日本語には単数形/複数形はないので気にする必要はありませんが、英語などで複数形の表記が必要になる際は是非ご利用ください。
明日は @hermit4 さんによる「Slint-python (Alpha) を使ってみる」です。お楽しみに!