実際には、面倒なi18nアプローチに代わる方法があります。このソリューションはTr8nと呼ばれます。
上記のコードは単純に次のようになります。
<%= tr("You have {num || kid}", num: 1) %>
それでおしまい。コードからキーを抽出してリソースバンドルに保持する必要はなく、言語ごとに複数化ルールを実装する必要もありません。Tr8nには、すべての言語の数値コンテキストルールが付属しています。また、性別のルール、リストのルール、言語のケースが付属しています。
上記の翻訳キーの完全な定義は、実際には次のようになります。
<%= tr("You have {num:number || one: kid, other: kids}", num: 1) %>
ただし、スペースと時間を節約したいので、numは自動的に数値ルールにマップされ、ルール値のすべてのオプションを提供する必要はありません。Tr8nには、その場で作業を行うマルチプラライザーとインフレクターが付属しています。
ロシア語でのキーの翻訳は、次のようになります。
"У вас есть {num || ребенок, ребенка, детей}"
ちなみに、性別固有のルールがある言語では、翻訳は不正確になります。たとえば、ヘブライ語では、「あなた」は表示しているユーザーの性別によって異なるため、実際には例として少なくとも2つの翻訳を指定する必要があります。Tr8nはそれを非常にうまく処理します。ヘブライ語の翻訳の音訳は次のとおりです。
"Yesh leha yeled ahad" with {context: {viewing_user: male, num: one}}
"Yesh leha {num} yeladim" with {context: {viewing_user: male, num: other}}
"Yesh lah yeled ahad" with {context: {viewing_user: female, num: one}}
"Yesh lah {num} yeladim" with {context: {viewing_user: female, num: other}}
したがって、この場合、単一の英語キーには4つの翻訳が必要です。すべての翻訳は文脈の中で行われます-あなたは文を壊す必要はありません。Tr8nには、言語とコンテキストに基づいて1つのキーを複数の翻訳にマッピングするメカニズムがあります。これらはすべてオンザフライで実行されます。
最後に一つだけ。カウント部分を太字にする必要がある場合はどうなりますか?それは単に次のようになります:
<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>
後で「太字」を再定義したい場合に備えて(非常に簡単です)、すべてのYAMLファイルを調べて変更する必要はありません。1か所で行うだけです。
詳細については、こちらをご覧ください。
https://github.com/tr8n/tr8n_rails_clientsdk
開示:私はTr8nフレームワークとそのすべてのライブラリの開発者およびメンテナーです。
"#{....}"
上記のコードでは、「補間器」と引用符は必要ないことに注意してください。