42言語中14言語では、「one」という複数形カテゴリは単に1を表すものではない
言語
アプリの文字列「One habit left today」には、複数形の対応文字列「%d habits left today」があります。Androidはカテゴリに基づいてこれらを使い分けます。英語では1に「one」、それ以外に「other」を使います。ロシア語では、カテゴリ「one」が1、21、31、41などに使われます。当社の翻訳チェックは、同じ日に両方向でこの判定を誤りました。
正しい翻訳を拒否したケース
11月2日、翻訳キットのサンプルアプリで再実行しました。ロシア語の「one」に対して、モデルは「Осталась %d привычка на сегодня」(「%d habit left today」、数字付き)と出力しました。当社のチェックは、これを英語の「one」形式と比較し、英語側にない%dが存在することを理由に、捏造されたプレースホルダーとして拒否しました。モデルは正しかったです。残りの習慣が21個のユーザーはこの形式を受け取るため、数字を表示する必要があります。チェックを修正しました。英語の「other」形式が使うカウントを、形式側で追加することを許容します。次の実行では、サンプルの350文字列すべてが出力されました。
誤った翻訳を通過させたケース
同じチェックで、逆のケースが通過してしまいました。モデルが「Осталась одна привычка」(「one habit left」)と出力した場合、文字列から情報が失われていないため通過し、残りの習慣が21個のユーザーに「1個」と表示されてしまいます。旧ルールでは、英語の「one」は1のみを表すため、あらゆる「one」形式で数字を省略することを許容していました。
現在、チェックはCLDR(AndroidとICUが使用するUnicodeの複数形ルール)に基づき、各カテゴリがカバーする数字を認識します。複数の数字をカバーするカテゴリの形式は、数字を表示する必要があります。単一の数字を表す形式は、数字を省略できます。ドイツ語の「one」は1のみを表すため、「Noch eine Gewohnheit」で問題ありません。
「one」が単に1ではない言語
Babel 2.10が認識するCLDRのデータにおける41のターゲット言語のうち14言語では、「one」は数字1以外もカバーします。
- 1, 21, 31, 41…: ロシア語、ウクライナ語、セルビア語、マケドニア語。
- 0と1: フランス語、ポルトガル語、ペルシア語、アルメニア語、カンナダ語、パンジャブ語、アムハラ語。習慣が0個の場合、「Une habitude restante」が表示されます。
- 1と11: スコットランド・ゲール語。 1, 101, 201…: スロベニア語。同言語の「two」は102と202もカバーします。
- 4、6、9で終わらないすべての数字: フィリピン語。
ICUメッセージでは、独自の分岐がこれを変更します。メッセージに =0{…} を含めると、フランス語の「one」は1のみをカバーするようになり、チェックもこれを考慮します。
Android自身の文字列と照合済み
出荷前に、Androidのフレームワーク文字列内の複数形メッセージでこのルールを実行しました。対象は、当社の39言語における897件の翻訳です。検出された問題はありませんでした。Googleの翻訳者は、複数の数をカバーするすべての分岐に数値を含めており、英語では1が独自の分岐を持つ場合でも、ロシア語の「単数形」分岐にも数値が入っています。あるロシア語の「単数形」分岐から手動で数値を削除したところ、このチェックは、その形式が21、31、41、51にも使用されることを示しました。
ルールは、ICU メッセージ用として GitHub で無料公開されている translation-checks 1.2.0 に、Android の複数形と ICU メッセージの両方に対応するものとして Polyglot 1.2.0 に記載されています。今週追加したその他のチェックは、別の文字の文字についてのノートに記載されています。