На самом деле есть альтернатива громоздкому подходу 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 и всех его библиотек.
"#{....}"
в приведенном выше коде не нужны.