1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SlintAdvent Calendar 2024

Day 1

Slint で値によって単数形と複数形を使い分ける方法

Last updated at Posted at 2024-12-01

遅くなりましたが、この記事は 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 上で実行すると以下のようになります。

slintpad-2024-12-02_00.10.38.gif

ドキュメントのバグを見つけました

先ほど引用したサンプルコードですが、バグがあります。

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) を使ってみる」です。お楽しみに!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?