Обработка грамматического пола с помощью Gettext

Я ищу простой и элегантный способ обработки грамматического пола с Gettext в приложении Rails, так же, как множественные числа обрабатываются с помощью метода n_().

Это не интересует английский язык, поскольку слова не меняются в зависимости от пола, но это происходит при переводе на испанский. Его/ее хороший вариант использования на английском языке. Это действительно необходимо при переводе на испанский.

Пример:

Учитывая пользователей Пабло (мужчина) и Марии (женщины).

_('%{user} is tall') & {:user => user.name}

Должно быть переведено на

'Pablo es alto'
'María es alta'

Конечно, у нас есть доступ к user.gender

Любые идеи?

Ура!

Ответ 1

Используя стандартные функции gettext, это можно решить с помощью контекстов. Как вызов подходящего:

p_('Male', '%{user} is tall')

или

p_('Female', '%{user} is tall')

Это приведет к созданию двух отдельных строк в каталогах gettext, обозначающих их контекстами "Мужской" и "Женский".

Ответ 2

К сожалению нет. Это ограничение системы gettext - помимо числа, лингвистические функции основаны на языке, который вы отключаете. Если бы вы использовали все свои строки на испанском языке, это сработало бы.

Другим вариантом было бы добавить символ в строку для радиуса трансляции, а затем отключить его.

Я не знаком с Ruby, но основная идея в psuedo-коде будет:

if (user.sex == male) {
    strip_last_char(_('%{user} is tall♂') & {:user => user.name})
} else {
    strip_last_char(_('%{user} is tall♀') & {:user => user.name})
}

Ответ 3

Как насчет использования множественной формы механизма gettext. Обычно для различения сингулярных и множественных форм используется параметр n.

Теперь представьте, что вы используете n для определения своего пола вместо суммы. Таким образом, p.ex. n = 1 означает женский (а не сингулярный) и n = 2 (или n > 1) означает женский (а не множественный).

n = user.male? ? 1 : 0
n_('%{user} is tall', '%{user} is tall', n) & {:user => user.name}