На самом деле есть альтернатива громоздкому подходу 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 имеет механизм для сопоставления одного ключа с несколькими переводами на основе языка и контекста - все делается на лету.
И последнее. Что если бы вам пришлось сделать часть подсчета жирным шрифтом? Это было бы просто:
<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>
На всякий случай, если вы захотите переопределить ваш «жирный» позже - это будет очень просто - вам не нужно будет просматривать все ваши файлы YAML и изменять их - вы просто делаете это в одном месте.
Чтобы узнать больше, посмотрите здесь:
https://github.com/tr8n/tr8n_rails_clientsdk
Раскрытие информации: я являюсь разработчиком и сопровождающим фреймворка Tr8n и всех его библиотек.