問題:アプリケーションを他の言語に翻訳する場合(多くの場合、英語製品のロシア化に直面しています)、複数形式の数値のサポートが最も影響を受けます。 たとえば、
「1つの音符、2つの音符、5つの音符」または普遍的な
「1つのファイル」など。 実際、すべてのプログラミング言語では、通常、これはsprintf()バリアントまたは何らかのテンプレートエンジンを超えないため、複数のフォームのサポートは毎回ペンでプログラムする必要があります:
N = 1の場合、「1 note」、それ以外の場合は「N notes」 。 そして、毎回それを行うのは怠け者です。 gettextフレームワークは、この問題を部分的に解決します。ローカライズされた文字列のいくつかのバリアントの概念がありますが、ユーザーに表示される1つの文字列には、数字に応じて複数の部分が存在する可能性があるため(「3つのフォルダーで23ファイル」)、その後、とにかく線分を接着する必要があります。
そこで、次のアイデアが浮かびました:この問題に対処し、将来的にローカライズされたコードの記述を簡素化するために、何らかの一般的な形式、
マイクロ言語 (関数format()またはsprintf()の定評のある形式に類似)を考え出してみませんか
ご存知のように、異なる言語では異なる数の複数形の数字。 英語には2つあります(
“ 1 file” 、
“ many files” )。 ロシア語-3(
「1ファイル」 、
「2ファイル」 、
「多くのファイル」 )。 アラビア語では、一般に、Pootleが私たちに言うように、6個ものピースがあります。 したがって、いくつかの部分文字列のセットと、これらの部分文字列の選択が依存するパラメータを行に直接設定できる必要があります。
複数のオプションがある推奨サブストリング形式:
{%COUNTER%|FORM0|FORM1|FORM2[|FORM3][|FORM4][|...]}
どこで
%COUNTER%
は特定の変数名で、値[0,1,2,3、...]を持つことができます
FORM0
は、COUNTER = 0の文字列のバージョンです(これは特別な場合で、通常は個別のメッセージが必要です)
FORM1
、
FORM2
など -これらは、特定の言語の複数形ごとの代替テキストオプションです。 英語の場合は2つのオプション、ロシア語の場合は3つのオプションになります。
英語の例:
{%F%|No files|1 file|%F% files} found in {%D%|0 folders|1 folder|%D% folders}.
これにより、%F%と%D%のさまざまな値を置き換えるときに、出力行の次の最終的なバリアントが得られます。
%F%= 0、%D%= 1 =>
1つのフォルダーにファイルが見つかりません。%F%= 1、%D%= 2 =>
2つのフォルダーで1つのファイルが見つかりました。ロシア語に翻訳された文字列の同じ例:
{%F%| |1 |%F% |%F% } {%D%|0 |1 |%D% |%D% }.
これにより、%F%と%D%のさまざまな値を置き換えるときに、出力行の次の最終的なバリアントが得られます。
%F%= 0、%D%= 1 =>
1つのフォルダーにファイルが見つかりません。%F%= 1、%D%= 2 =>
2つのフォルダーで1つのファイルが見つかりました。いくつかのそのような異形のインクルードを含む翻訳用の文字列全体を受け取ったことにより、翻訳者は、a)文字列のすべての部分がどのコンテキストで使用されているかを理解しやすくなり、b)最後に文字列の音が良くなるように操作できることに注意してください
さまざまなプログラミング言語でこのようなマイクロ言語を実装することは素晴らしいことです。
誰かがアイデアを思いつくことを願っています。
UPD:結果は
もうすぐでした。
このトピックでは、 webdew
habrayuzerがC#での関数の実装を共有しています。