WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

translate_user_role() WP 2.8.0

Переводит название роли.

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

Вызов функции before_last_bar() нужен потому что старые установки хранят роли в старом контексте 'Role name|User role' и сохранить старый контент это проще чем менять (исправлять его) его в БД.

Работает на основе: translate_with_gettext_context(), before_last_bar()

Хуков нет.

Возвращает

Строку. Переведенную роль или оригинальное название роли, если не удалось перевести.

Использование

translate_user_role( $name, $domain );
$name(строка) (обязательный)
Название роли, например "Administrator".
$domain(строка)
Идентификатор файла перевода, указывается при регистрации и подключении файла перевода. Если не указать, то будет использован дефолтный файл перевода, который используется в WordPress.
По умолчанию: 'default'

Примеры

#1 Переведем все роли

Чтобы понять, зачем нужна функция translate_user_role(), посмотрим в каком виде хранятся системные роли WordPress.

$roles = [];

foreach ( wp_roles()->roles as $role_name => $role_details ) {
	$roles[ $role_name ] = $role_details['name'];
}

print_r( $roles );

Содержимое переменной $roles будет:

Array (
	// Системные роли
	[administrator] => Administrator
	[editor]        => Editor
	[author]        => Author
	[contributor]   => Contributor
	[subscriber]    => Subscriber

	// Пользовательские роли
	[project_expert]        => Эксперт
	[project_moderator]     => Модератор
	[project_tracker]       => Трекер
	[project_tracker_fake]  => Трекер (неподтверждённый)
	[project_leader]        => Руководитель
	[test_role]             => Тестовая роль
)

Для примера пользовательские роли были созданы плагинами и темой с помощью функции add_role(), где вторым параметром были добавлены их названия на русском языке. Системные роли добавляется также (см. populate_roles_160()), но названия ролей передаются на английском языке, а затем при надобности переводятся на основе файлов перевода.

Чаще всего для получения списка ролей и их возможностей используется класс WP_Roles{} или его обёртка в виде функции wp_roles(), которые возвращают данные, и в них названия ролей не переведено, кроме моментов когда название было туда помещено сразу переведенное, как в нашем примере сделано с пользовательскими ролями.

Попробуем перевести название ролей традиционной __()

$roles = [];

foreach ( wp_roles()->roles as $role_name => $role_details ) {
	//$roles[ $role_name ] = translate_user_role( $role_details['name'] );
	$roles[ $role_name ] = __( $role_details['name'] );
}

print_r( $roles );

/*
Array (
	// Системные роли
	[administrator] => Administrator
	[editor]        => Редактор
	[author]        => Автор
	[contributor]   => Contributor
	[subscriber]    => Subscriber

	// Пользовательские роли
	[project_expert]        => Эксперт
	[project_moderator]     => Модератор
	[project_tracker]       => Трекер
	[project_tracker_fake]  => Трекер (неподтверждённый)
	[project_leader]        => Руководитель
	[test_role]             => Тестовая роль
)
*/

Почему часть системных ролей не перевелись? Потому что у них есть контекст, вот так это выглядит в файле po:

msgctxt "User role"
msgid "Administrator"
msgstr "Администратор"

Чтобы корректно перевести подобные строки, нужно использовать функцию _x(), для которой указать контекст User role:

$roles = [];

foreach ( wp_roles()->roles as $role_name => $role_details ) {
	$roles[ $role_name ] = _x( $role_details['name'], 'User role' );
}

print_r( $roles );

/*
Array (
	// Системные роли
	[administrator] => Администратор
	[editor]        => Редактор
	[author]        => Автор
	[contributor]   => Участник
	[subscriber]    => Подписчик

	// Пользовательские роли
	[project_expert]        => Эксперт
	[project_moderator]     => Модератор
	[project_tracker]       => Трекер
	[project_tracker_fake]  => Трекер (неподтверждённый)
	[project_leader]        => Руководитель
	[test_role]             => Тестовая роль
)
*/

Мы получили правильные переводы. Но зачем тогда нужна функция translate_user_role()? Она не только делает тоже самое, что в последнем примере, но и учитывает старые варианты использования названия ролей, а также сама подставляет нужный контекст, что избавляет от потенциальных ошибок.

Финальный вариант:

$roles = [];

foreach ( wp_roles()->roles as $role_name => $role_details ) {
	$roles[ $role_name ] = translate_user_role( $role_details['name'] );
}

print_r( $roles );

/*
Array (
	// Системные роли
	[administrator] => Администратор
	[editor]        => Редактор
	[author]        => Автор
	[contributor]   => Участник
	[subscriber]    => Подписчик

	// Пользовательские роли
	[project_expert]        => Эксперт
	[project_moderator]     => Модератор
	[project_tracker]       => Трекер
	[project_tracker_fake]  => Трекер (неподтверждённый)
	[project_leader]        => Руководитель
	[test_role]             => Тестовая роль
)
*/

Список изменений

С версии 2.8.0 Введена.
С версии 5.2.0 Added the $domain parameter.

Код translate user role: wp-includes/l10n.php WP 5.3

<?php
function translate_user_role( $name, $domain = 'default' ) {
	return translate_with_gettext_context( before_last_bar( $name ), 'User role', $domain );
}

Cвязанные функции

Из раздела: Локализация

campusboy 3433youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Редакторы: Kama 7641
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться