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