Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Учим phpBB склонять русские слова

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3335
Стаж: 15 лет
Благодарил (а): 35 раз
Поблагодарили: 1434 раза

Учим phpBB склонять русские слова

Сообщение Nekstati »

Приводим фразы типа «Новых ЛС: 1», «Сообщений: 22» и т. п. в литературную форму: «1 новое ЛС», «22 сообщения».

1. Добавляем в includes/functions.php новую функцию.

Код: Выделить всё

function plural_form($number, $baseword)
{
	global $user;
	$cases = array (5, 1, 2, 2, 2, 5);
	return sprintf($user->lang[$baseword . '_' . (($number % 100 > 4 && $number % 100 < 20) ? 5 : $cases[min($number % 10, 5)])], $number);
}
2. Выводим языковую переменную, требующую склонения, с помощью этой функции.

Код: Выделить всё

plural_form($number, 'POSTS');
3. Добавляем в языковой файл три переменные — три словоформы, подходящие к числам 1, 2 и 5.

Код: Выделить всё

	'POSTS_1'				=> 'сообщение',
	'POSTS_2'				=> 'сообщения',
	'POSTS_5'				=> 'сообщений',
Переменные могут содержать подстановочный знак %d, он заменится на значение $number, например:

Код: Выделить всё

	'POSTS_5'				=> 'Вам пришло %d новых сообщений',

Пример №1: изменяем вид счётчика сообщений на страницах тем (viewtopic.php).

1. См. выше.

2. Находим во viewtopic.php строку

Код: Выделить всё

	'TOTAL_POSTS'	=> ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts),
И изменяем её так:

Код: Выделить всё

	'TOTAL_POSTS'	=> plural_form($total_posts, 'POSTS'),
3. Добавляем в language/ru/viewtopic.php:

Код: Выделить всё

	'POSTS_1'				=> '%d сообщение',
	'POSTS_2'				=> '%d сообщения',
	'POSTS_5'				=> '%d сообщений',
Результат:

Код: Выделить всё

0 сообщений
1 сообщение
2 сообщения
3 сообщения
4 сообщения
5 сообщений
...
10 сообщений
11 сообщений
12 сообщений
...
21 сообщение
22 сообщения
23 сообщения
24 сообщения
25 сообщений
26 сообщений
...

Пример №2: изменяем вид строки «Новых ЛС: 1».

1. См. выше.

2. Находим в includes/functions.php строку

Код: Выделить всё

			$l_privmsgs_text = sprintf($l_message_new, $user->data['user_new_privmsg']);
И изменяем её так:

Код: Выделить всё

			$l_privmsgs_text = plural_form($user->data['user_new_privmsg'], 'NEW_PMS');
3. Добавляем в language/ru/common.php:

Код: Выделить всё

	'NEW_PMS_1'				=> '%d новое ЛС',
	'NEW_PMS_2'				=> '%d новых ЛС',
	'NEW_PMS_5'				=> '%d новых ЛС',
Заодно олитературиваем :) переменную NO_NEW_PM — например, так:

Код: Выделить всё

	'NO_NEW_PM'					=> 'нет новых ЛС',
Результат:

Код: Выделить всё

нет новых ЛС
1 новое ЛС
2 новых ЛС
...
21 новое ЛС
22 новых ЛС
...

Если на конференции используется несколько языков, функцию plural_form() можно перенести в файлы language/xx/common.php и изменять её в соответствии с особенностями каждого языка.
Аватара пользователя
Айдар
Former team member
Сообщения: 1687
Стаж: 13 лет 3 месяца
Откуда: KZN
Благодарил (а): 93 раза
Поблагодарили: 189 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение Айдар »

Nekstati, браво! Это как раз, что я давно хотел, но стеснялся спросить! :)
Вот бы еще самому главному научить - склонять и определять пол (больше по модам) - пользователей: "История репутации Иван", "Иван писал(а)" и т.п.
In Web We Trust
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение rxu »

Есть альтернативный вариант.
Встроенная функция $user->lang() позволяет использовать множественное число в разных формах (plural forms).
Пример: $user->lang('POSTS', 3);
Языковая переменная:

Код: Выделить всё

'POSTS' => array(
       1 => %d сообщение,
       2 => %d сообщения,
       5 => %d сообщений,
), 
В этом случае получим результат "3 сообщения", так как число 3 попадает между 2 и 5.
Можно использовать и многомерные массивы.
Изображение
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2208
Стаж: 16 лет 3 месяца
Откуда: Павлодар
Благодарил (а): 7 раз
Поблагодарили: 338 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение nissin »

rxu
plural forms в phpbb ущербный и сделан для галочки.
Лучше бы сделали аналогично gettext и не изобретали велосипед.
Gettext

Множественные числа
Для перевода множественных чисел необходимо, чтобы в заголовке (там, где указываются такие данные, как Project-Id-Version и PO-Revision-Date) .po-файла было указано правило формирования множественных чисел для данного языка. Например, в русском языке существует три формы множественных чисел:
  • 1, 21, 31… день
  • 2, 3, 4, 22, 23, 24, 32, 33, 34… дня
  • 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36… дней
Выбор одной из этих трёх форм в зависимости от числа осуществляется следующей формулой:

Код: Выделить всё

"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));n"
Собственно это и попыталась сделать Nekstati.

PS: Ещё нормальную вставку Rich-текста сделал кто-нибудь, цены бы не было...

Добавлено спустя 10 минут 31 секунду:
Айдар
Нужно чтобы Gender Mod и нормальные plural forms были в phpbb штатно, тогда можно будет огород городить.
Всё повторяется. nurlan.info
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение rxu »

nissin писал(а):plural forms в phpbb ущербный и сделан для галочки.
Я не против, просто сообщил об имеющихся стандартных возможностях :) От варианта Nekstati они, кстати, принципиально не отличаются.
Изображение
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2208
Стаж: 16 лет 3 месяца
Откуда: Павлодар
Благодарил (а): 7 раз
Поблагодарили: 338 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение nissin »

А продвинуть на оффе нормальные plural forms никак нельзя?
Там делов на пару-тройку строк, проверять наличие функции plural_form, если её нет, то выводить по старому.
У Nekstati реализовано через суффиксы, через индексы ближе к официальным исходным текстам phpbb и реализации в gettext.
Всё повторяется. nurlan.info
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение rxu »

nissin
Врядли это будет в третьей ветке, скорее всего - в четвертой.
Изображение
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2208
Стаж: 16 лет 3 месяца
Откуда: Павлодар
Благодарил (а): 7 раз
Поблагодарили: 338 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение nissin »

Т.е. лет через пять?
Если исходить из того, что в четвёрке будут движок полностью переписывать, а Symfony 2 ещё не зарелизилась (текущая версия Preview Release 8).
Всё повторяется. nurlan.info
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение rxu »

Я исхожу из того, что gettext используется в Symphony. Последнюю предполагается использовать только начиная с phpBB 4.
Изображение
Аватара пользователя
valentin
phpBB 1.4.2
Сообщения: 54
Стаж: 9 лет 8 месяцев
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 2 раза
Контактная информация:
Забанен: Бессрочно

Re: Учим phpBB склонять русские слова

Сообщение valentin »

rxu писал(а): 'POSTS' => array(
       1 => %d сообщение,
       2 => %d сообщения,
       5 => %d сообщений,
), 
А если к примеру
Скачали: 1 раз, 2 раза, 20 раз, 54 раза? Значит нужно 2 значения раз и раза?
Если наши жизненные дорожки с кем-то расходятся, значит, этот человек выполнил свою задачу в нашей жизни, а мы – в его. На их место приходят новые люди, чтобы научить нас чему-то еще.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение rxu »

Достаточно одного раз(а). Система определится самостоятельно, какой ключ использовать.
Изображение
Аватара пользователя
valentin
phpBB 1.4.2
Сообщения: 54
Стаж: 9 лет 8 месяцев
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 2 раза
Контактная информация:
Забанен: Бессрочно

Re: Учим phpBB склонять русские слова

Сообщение valentin »

Не совсем понятно, правильно понял суть:
Это ланг

Код: Выделить всё

 'POSTS' => array(
       1 => %d раз,
       3 => %d раза,
), 
Это вывод в php?

Код: Выделить всё

$user->lang('POSTS', 1);

Так будет правильно?
Если наши жизненные дорожки с кем-то расходятся, значит, этот человек выполнил свою задачу в нашей жизни, а мы – в его. На их место приходят новые люди, чтобы научить нас чему-то еще.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Учим phpBB склонять русские слова

Сообщение rxu »

Не посмотрел, что речь о 3.0. Здесь придется повторяться.
Индексы определяют диапазоны чисел, в которых значения валидны. В вашем примере раз будет использовано для цифр 1 и 2, а для 3 - уже раза. Как пример, можно посмотреть стандартный языковой файл: https://github.com/rxu/Olympusrupack/bl ... #L751-L767
Изображение
Аватара пользователя
valentin
phpBB 1.4.2
Сообщения: 54
Стаж: 9 лет 8 месяцев
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 2 раза
Контактная информация:
Забанен: Бессрочно

Re: Учим phpBB склонять русские слова

Сообщение valentin »

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

Вернуться в «Для авторов (phpBB 3.0.x)»