Я разработчик модулей и переводчик. Передо мной уже около полугода стоит проблема в переводе строки, которая в зависимости от пола пользователя в русском языке выглядит по разному.

Вот два варианта строки:

  • Ирина вошла в чат
  • Коля вошел в чат

В отличие от русского языка на английском это строка будет только в одном виде:

  • Iren joined the chat
  • Nikole joined the chat

Кто хоть когда-то смотрел в файлы модулей и тем, тот видел как надо обернуть строку, чтобы её можно было потом перевести:
$username . t('joined the chat') - самый простой вариант без использования подстановок.

Итого у нас получается: строка в английском одна, а вот на русский её надо перевести в зависимости от пола. Конечно можно просто проигнорировать пол и перевести как 'Пользователь %username% вошел в чат', но согласитесь, что первый вариант гораздо красивей выглядит.
Может у кого-то будут предложения как это сделать?

Groups audience: 

Comments

Есть в Друпале функция format_plural, но она используется для числового перевода(в зависимости от того 1 единица или несколько берутся разные строки для перевода), если я её попробую использовать, то меня волонтеры, которые утверждают модуль просто "запинают" :-(

Можно говорить, сообщая о произошедшем: 'Пользователь %username% в чате'.

Хочется использовать все преимущества русского языка, а не использовать ограниченный английский язык. Ведь так предложение похоже на живое, а не написанное роботом.

Язык бывает разный, я из Казахстана, родной язык русский, но казахский (тюрский) язык тоже нам очень близок, поэтому для нас не проблема, похоже на робота или нет-:), можем говорить по разному и будет вполне понятно пользователям, можно формировать доступный русский язык для казахов, чтобы казахи могли без ущерба пользоваться русским языком, мне кажется что такое выражение было бы даже удобнее, хотя может быть это не литературное выражение по А. С. Пушкину, но в обиходе было бы удобно...

Ну это самый простой выход - оставить так же как и в английском варианте. Все-таки модуль больше ориентирован на русскую аудиторию.

Социальная сеть Вконтакте различает мужчин и женщин, но делает это на основе регистрации, кто мужчина, кто женщина, возможно написать модуль который будет просматривать данные, кто как зарегистрировался, это не всегда работает, потому что не все указывают свой пол, еще хуже делать регулярное выражение по Логинам, потому что понятно что Логин придумывается часто не системно, едиственно можно написать регулярное выражение по настоящему имени, в большинстве случаев будет работать для русского языка, можно переписать модуль специально для русского языка, но я думаю это не обязательно - усложнять жизнь, нужно принимать жизнь как есть и не боятся машинного языка...

Различие пола по данным регистрации - это единственный ПРАВИЛЬНЫЙ способ, так как по другому отличить Женю, Валю, Сашу и т.д. не представляется возможным. Я уж молчу про всяких Ким, Ли и т.д. :-)

У татар, у бурят, и так далее, все по другому!

Проблема касается не только пользователей сайта. Как быть например, в следующем случае "Статья был создан" ?

Вот здесь решение с подменой переводов. Я еще не копал вглубь, просто вспомнил про такое решение. Может посмотрите?

ну это ИМХО не вопрос глобальности 8(
так себе решеньице для отдельного случая

Эмм... все проще, пол пользователя я знаю наверняка. Осталось только правильно построить перевод.

Я сомневаюсь, что тут дело в переводе. Потому что *.po различает только множественные формы (plural).

Можно править файл *.po как угодно, нет никаких проблем, да лишь бы потом было удобно пользоваться системой Друпал, *.po создается выборкой текстовых строк из файла системы, всегда можно создавать произвольный перевод этих текстовых строк, самое главное - легкость понимания перевода при работе.

Но для этого должна быть соответствующая строка в оригинале, а её туда не добавишь, не добавив использование этой строки в коде.

А если модуль для этого дела написать, который бы перехватывал вывод значений зависимых от рода. Отследить эти значения конечно трудно будет.
Или уже для себя пропатчить только необходимые функции.
Хм, это глубокое имхо, потому что модули пока маленькие писал :)

Отдельный модуль - плохой вариант. Патчить это изначально не хорошо. Надо использовать стандартные средства.
Вот если бы была функция похожая на format_plural но только для пола.

Стандартные как? Функцию надо писать и ратовать, чтобы её включили в ядро (до исх пор использовать патчи ядра), но этой функцией надо обрабатывать вывод во всех модулях...
А всё таки нужен модуль, в котором бы настраивалось поле, определяющее пол (поле модуля profile), а в нём уже подменять (хуки есть такие?) вывод имени пользователя (для начала только здесь род нужен).

Это будет не hook`ом, а в модуле, в котором это нужно, невозможно ядро написать например для немецкого языка, то есть надо разбираться с модулем для которого это нужно.

Никто не мешает добавить вам функцию format_gender в свою тему, и пользоваться ею по мере необходимости. Например, format_gender("вошёл") будет возвращать значение "вошла". Фактически, вам нужен обычный массив ключ->замена для всех используемых слов, изменяющихся по роду. Но в таком виде format_gender вряд ли появится в системе, так как помимо английского и русского наверняка существует куча других языков, с более сложными правилами спряжения по родам.

Господа, данное явление называется сексизмом в языке. Так как оригинальный язык Drupal - английский, то любые фразы базируются на его основе. Как мы все знаем, во многих английских предложениях смысл без контекста понятен только при наличии контекста: "Yesterday I visited a doctor. She told, that I was very sick"

Исторически сложилось, что мужчина в обществе практически во всех культурах (разве, что за исключением первобытной эпохи, где часто в племенах был матриархат) мужчины доминировали. Это наложило свой отпечаток на культуру и, соответственно, язык. Поэтому в большинство слов, которые относятся к обоим полам, по умолчанию в мужской роде. Примеры: доктор, кандидат наук, шаман, водитель и т.д.

Вариантов 2:

  1. Политкорректный, официально рекомендуемый лингвистами (и он же самый громоздкий): "%username% вошла/вошел в чат" (обратите внимание, что женский пол употребляется первым).
  2. Способ, которым пользуются профессиональные переводчики. Перефразировать текстовые строки таким образом, чтобы они одинаково относились как к мужчине, таки и женщине. Примером служат переводы любой части The Elder Scrolls или Fallout, где тысячи реплик могут относиться как к мужскому, так и женскому персонажу ГГ.

    Т.е., как уже было предложено: "Пользователь %username% вошла/вошел в чат"
    Этот способ не убирает сексизм, но делает текст компактнее, и не требует никаких "плясок с бубном" с родами в коде.

Я вообще сделал так: "%username% входит в чат". Т.е. привёл к глаголу настоящего времени (что делает?), и проблема с полом, в принципе, исчезла. Но конечно хотелось бы большей приближённости к русскому, и делению по родам.

Вы рассуждаете с точки зрения переводчика, и предлагаете "аналог format_plural".
Но проблема совсем не решается так просто, как для множественных чисел. Друпал "не знает", какое имя считать женским а какое мужским, и это главная проблема. То что вы это знаете, тут мало поможет :) Регулярками такое не решить, как сказали выше, надо привязывать профайл пользователя сюда. Это значит, что строка становится контекстно-зависимой от каких то внешних данных (пола в профиле). А профиль, известное дело, в Друпале может быть сделан не только через родной модуль profile. Это сразу поднимает целый ворох проблем, как можно догадаться. Поэтому красивых решений нет, и вряд ли появятся в ближайшем будущем.

красивых решений нет, и вряд ли появятся в ближайшем будущем.
Вы абсолютно правы.

Мне кажется, сама проблема также надуманная, либо уникальна для Вашего проекта. Мне с ходу и не приходит в голову ситуация, где при общении программы с пользователем так остро встает проблема пола. Все диалоги в безличном 2-м лице, множественном числе: "Выберите опцию... блаблабла", "Вы уверены, что... блаблабла?"

Ситуацию упоминания в 1-м и 3-м родах единственного числа можно избежать. Так ли важно, какого именно пола зашел в чат пользователь %username% ?

P.S. Заметьте, я как-то во всех своих сообщениях обошелся без упоминания пола собеседника)

Надо просто переводить нейтрально, как предлагалось выше: Пользователь %юзер% вошёл в чат.

Красивое решение для своих проектов — определить в теме функцию и использовать ее в шаблонах. А для официального перевода необходимо грамотно перефразировать строки.

Думаю, что контекст (msgctxt) вполне может подойти в этом случае, но без програминга тут не обойтись
Вывод должен уметь выводить зависимую строку