Обработка множественных чисел в строках локализации ActivityPub

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

Первая публикация новой темы будет опубликована через %{delay_minutes} минут(ы) после создания

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
Если delay_minutes равно 1, должно быть написано «1 минута».

«Опубликовать пост #%{post_number} и доставить его подписчикам Групповых акторов через %{minutes} минут(ы).»

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
То же самое, что и выше.

«Опубликовать %{count} неопубликованных постов в теме #%{topic_id}. Посты не будут доставлены подписчикам Групповых акторов.»

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub

Если неопубликован только 1 пост, следует сказать: «Опубликовать %{count} неопубликованный пост в теме #%{topic_id}. Пост не будет доставлен подписчикам Групповых акторов.»

«От %{min_length} до %{max_length} букв, цифр, дефисов или подчёркиваний.»

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
Думаю, это зависит от max_length. Если max_length равно 1, следует сказать «буква, цифра, дефис или подчёркивание». Но не уверен, есть ли другие языки, где также важно значение min_length.

«Имя пользователя должно содержать от %{min_length} до %{max_length} букв, цифр, дефисов или подчёркиваний.»

discourse-activity-pub/config/locales/server.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
То же самое, что и выше.

«%{count} из %{total} постов в этой теме опубликовано.»

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
Этот случай немного сложнее, так как зависит от двух переменных: count и total. Например:

  • 1 из 1 поста в этой теме опубликовано
  • 1 из 3 постов в этой теме опубликовано
  • 2 из 3 постов в этой теме опубликовано
4 лайка

Извините за задержку, Moin, это должно решить большинство вопросов: DEV: Update pluralization for some strings by pmusaraj · Pull Request #262 · discourse/discourse-activity-pub · GitHub

Для этих двух случаев я оставляю строки без изменений. Если на сайте ограничение на имена пользователей установлено на 1 символ, это означает неправильную конфигурацию… менять ничего не нужно.

1 лайк

А как быть с сайтами, где имя пользователя состоит из 11 символов? В некоторых языках форма для числа 1 используется также и для числа 11. Как это работает в языках с несколькими формами множественного числа, если в английском языке не предусмотрено их различение? Могут ли переводчики вводить эти различные формы множественного числа?

1 лайк

Хм, считается ли 11 в этих языках единственным числом?

1 лайк

Существуют языки, в которых для чисел, оканчивающихся на 1, используется форма для «одного» (хотя, возможно, число 11 не самый удачный пример). Кроме того, в таких языках имеется больше форм, чем просто «один» и «другое», поэтому даже при различных количествах, больших единицы, требуются разные переводы в зависимости от точного числа.

Немецкий язык к таким не относится, так что, полагаю, некоторые из ваших коллег знают в этом вопросе лучше меня.

1 лайк

Я немного запутался с переводом: выбирает ли Discourse единственное или множественное число на основе count или total?
По моим представлениям, обычно это count.
Но я не могу понять, как обработать случай, когда count равен 1, а total равен 3. У меня получается что-то вроде «1 из 3 post в этой теме опубликовано». Я могу исправить это, используя «posts»: «1 из 3 posts в этой теме опубликовано». Но тогда это не сработает, если total равен 1. :exploding_head:

Возможно, в этом случае нам понадобится Message Format support for localization?

Это то, что мы называем «инженерным английским». Такая форма никогда не должна использоваться. Должно быть что-то вроде «сообщение опубликовано» или «тема опубликована», если возможно, чтобы последующие сообщения публиковались автоматически.

Аналогичная ситуация, по крайней мере в финском языке: числа от 0 до 9 (на самом деле каждое число в этом диапазоне) должны писаться словами, а не цифрами. Однако довольно распространённая практика — писать «one» вместо «1», а числа больше одного уже цифрами.

Что-то вроде «1 сообщение» всегда обречено на провал — это то, что используют англоязычные разработчики, потому что им лень писать по-человечески. Почти жаль это говорить вслух. И в более общем смысле: это воспринимается как американский стиль, а не как использование заглавных букв в заголовках и текстах :smirking_face:

Дело не в лени. Использование плейсхолдера для числа крайне важно. Как я уже объяснял выше, в некоторых языках говорят «21 пост», точно так же, как говорят «1 пост». Если в английском тексте вместо %{count} было бы написано «one», переводчику было бы очень легко перевести это как есть, и тогда число не подставится вместо плейсхолдера, что приведёт к фразе «один пост», даже когда на самом деле их 21.
Поэтому использование чисел имеет свои причины. См. также: Always use %{count} variable when translating pluralized strings

Кстати, в немецком языке это тоже очень помогает избежать проблем, подобных этой.

Мне трудно поверить, что код находится на таком низком уровне, что невозможно заменить %(count) на слово, когда %(count) = 1. Я почти уверен, что при локализации я менял подобные плейсхолдеры на обычный текст, когда для единственного и множественного числа требуются разные варианты.

Вот что я имею в виду, говоря о лени и «инженерном английском». Под капотом действительно должны использоваться переменные и плейсхолдеры, но они должны преобразовываться в форму, удобную для чтения человеком и носителем языка. В конце концов, известные конечные пользователи используют программное обеспечение, а не инженеры…

Да, я знаю. Это более широкий и масштабный вопрос, чем просто рассмотрение того, как переводить «1 из 3…» или «1 из 1…». Но моя главная мысль в том, что не должно возникать необходимости задумываться о таких вещах (помимо других различий тысяч языков).

Но, конечно, возможно, мы живём в мире, где есть сложные ИИ, но нет решения, чтобы избежать ситуаций вроде «1 из 1» :joy:

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

Однако, возможно, вы могли бы заменить 1 на “one” везде в интерфейсе на английском языке.
Но в немецком это не сработает так просто. Проблема в том, что в немецком языке слово, обозначающее «один», меняется в зависимости от падежа, рода и грамматической роли.

Например:

  • Тема останется открытой ещё на один месяц. → Das Thema ist noch einen Monat geöffnet.
  • Тема будет закрыта через один месяц. → Das Thema wird in einem Monat geschlossen.
  • Прошёл один месяц. → Ein Monat ist vergangen.

Таким образом, хотя в немецком языке также распространено писать числа словами, правильное оформление этого вопроса грамматически сложно.
Нельзя просто заменить цифру «1» на слово «eins», так как эта форма никогда не используется перед существительным, а нужная форма слова зависит от грамматического падежа.

Другими словами, использование слов вместо цифр создаст гораздо больше работы для переводчиков.
Нельзя просто использовать плейсхолдер вроде %{duration}, который подставляется как «one month», «one week» или «one day» во всех контекстах.
Вместо трёх длительностей и трёх предложений потребуется отдельная версия для каждой возможной грамматической комбинации — что потенциально увеличит объём текста в несколько раз.

1 лайк

Спасибо за ссылку. Из чтения кода и просмотра других языков, таких как арабский, я вижу, что языки могут предоставлять свои собственные переопределения, даже если английская строка одинакова для всех вариантов. Например, для арабского языка существуют отдельные правила, когда количество равно 2, и я вижу использование two: в строках на арабском, которые не определены в английском. Таким образом, для 1/11 язык, имеющий правило, может предоставить этот вариант. Насколько я понимаю, определять это в английском не нужно.

Спасибо за то, что углубились в этот вопрос. У меня нет контекста для этой строки, но если вы хотите отправить PR с изменениями, я с радостью посмотрю. Спасибо.

Можете ли вы объяснить, как это можно сделать в Crowdin?
Вот что я вижу в Crowdin, когда хочу перевести discourse_activity_pub.actor.warning.invalid_username на арабский язык:

Раньше я видел меню для ввода множественных форм. Например, для js.user.password.too_short:

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

У меня тоже. В последний раз я смотрел тексты ActivityPub в апреле, когда создавал эту тему. Сейчас я просто заменял заполнители во время перевода, иначе было бы очень трудно подобрать правильные слова. Именно тогда я заметил, что фраза «1 из 3 сообщений в этой теме опубликовано» кажется мне неправильной — не только в немецком, но и в английском.