translate_user_role()
Переводит название роли.
С тех пор как названия ролей хранятся в БД, в код добавляются неиспользуемые строки перевода, для того чтобы они попали в шаблон перевода для po файлов и эта функция смогла их перевести когда нужно.
Вызов функции before_last_bar() нужен потому что старые установки хранят роли в старом контексте 'Role name|User role' и сохранить старый контент это проще чем менять (исправлять) его в БД.
Хуков нет.
Возвращает
Строку. Переведенную роль или оригинальное название роли, если не удалось перевести.
Использование
translate_user_role( $name, $domain );
- $name(строка) (обязательный)
- Название роли, например "Administrator".
- $domain(строка)
- Идентификатор файла перевода, указывается при регистрации и подключении файла перевода. Если не указать, то будет использован дефолтный файл перевода, который используется в WordPress.
По умолчанию: 'default'
Примеры
#1 Убедитесь, что первая буква $name написана с заглавной буквы!
Например, в этом случае будет ошибка и вернется исходное значение $name:
translate_user_role( 'administrator' ); // administrator
Но этот вариант вернет перевод $name:
translate_user_role( 'Administrator' ); // 管理者
#2 Переведем все роли
Чтобы понять, зачем нужна функция 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] => Тестовая роль
)
*/ #3 Выведем роль пользователя в локализованном виде
/**
* Returns localized user role name by ID.
*
* @param int $user_id User ID.
* @return string Localized user role name.
*
* @since 2023-04-06
* @version 1.0.0
*/
function get_localized_user_role_name( $user_id ) {
$user = get_userdata( $user_id );
$roles = [];
foreach ( wp_roles()->roles as $role_name => $role_details ) {
if ( $role_name === 'subscriber' ) {
$roles[ $role_name ] = __( 'Пользователь', 'User role' );
} else {
$roles[ $role_name ] = _x( $role_details['name'], 'User role' );
}
}
$user_role = $user->roles[0];
return $roles[ $user_role ] ?? '';
}
- Функция get_localized_user_role_name возвращает локализованное название роли пользователя по его ID.
- При вызове функции необходимо передать ID пользователя в качестве аргумента.
- Если роль не найдена, функция вернет пустую строку.
- В функции используется цикл foreach для перебора всех ролей, доступных в системе.
- Если роль является 'subscriber', то ее название переводится на русский язык, используя функцию __().
- Для остальных ролей используется функция _x() для локализации названия.
- При выводе значения роли используется оператор объединения с null coalescing, чтобы избежать ошибок, если значение не определено.
Код для вывода в шаблоне:
<?php echo get_localized_user_role_name( wp_get_current_user()->ID ); ?>
Список изменений
| С версии 2.8.0 | Введена. |
| С версии 5.2.0 | Added the $domain parameter. |
Код translate_user_role() translate user role WP 6.9.1
function translate_user_role( $name, $domain = 'default' ) {
return translate_with_gettext_context( before_last_bar( $name ), 'User role', $domain );
}