Обработка грамматического пола с Gettext - PullRequest
12 голосов
/ 26 мая 2011

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

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

Пример:

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

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

Следует перевести на

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

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

Есть идеи?

Ура!

Ответы [ 3 ]

12 голосов
/ 17 апреля 2013

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

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

или

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

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

3 голосов
/ 03 мая 2012

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

Другой вариант - добавить символ в строку для перевода и затем удалить его.

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

if (user.sex == male) {
    strip_last_char(_('%{user} is tall♂') & {:user => user.name})
} else {
    strip_last_char(_('%{user} is tall♀') & {:user => user.name})
}
1 голос
/ 12 декабря 2013

А как насчет использования механизма множественного числа в 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}
...