gettext
Позволяет изменить строку (текст) перевода.
Использование
add_filter( 'gettext', 'wp_kama_gettext_filter', 10, 3 ); /** * Function for `gettext` filter-hook. * * @param string $translation Translated text. * @param string $text Text to translate. * @param string $domain Text domain. Unique identifier for retrieving translated strings. * * @return string */ function wp_kama_gettext_filter( $translation, $text, $domain ){ // filter... return $translation; }
- $translation(строка)
- Переведённый текст. В файлах
*.po
помечен какmsgstr
. - $text(строка)
- Текст для перевода. В файлах
*.po
помечен какmsgid
. - $domain(строка)
- Текстовый домен. Уникальный идентификатор для получения переведенных строк. Указывается при подключении MO файла перевода в функции load_textdomain().
Примеры
#1 Заменим "Комментарии" на "Отзывы"
Заменим в админке на странице управления комментариями заголовок с "Комментарии" на "Отзывы".
На странице управления комментариями (edit-comments.php) слово "Комментарии" выводится с помощью этого кода:
_e( 'Comments' );
Функция _e() и некоторые другие работают на основе функции translate(), в которой срабатывает описываемый хук.
Так как через фильтр проходит огромное количество переводов, а нам необходимо перевести определенную фразу и только в нужном месте, то используем условие:
- Запрашивается перевод слова "Comments"
- Запрашивается домен default (перевод самого WordPress)
add_filter( 'gettext', 'filter_gettext', 10, 3 ); function filter_gettext( $translation, $text, $domain ) { if ( $text === 'Comments' && $domain === 'default' ) { $translation = 'Отзывы'; } return $translation; }
Возникает вопрос, почему на скриншотах слово "Комментарии" не изменились в правом меню? В файле wp-admin/menu.php мы можем найти код этого пункта меню:
$menu[25] = array( /* translators: %s: Number of comments. */ sprintf( __( 'Comments %s' ), '<span class="awaiting-mod count-' . absint( $awaiting_mod ) . '"><span class="pending-count" aria-hidden="true">' . $awaiting_mod_i18n . '</span><span class="comments-in-moderation-text screen-reader-text">' . $awaiting_mod_text . '</span></span>' ), 'edit_posts', 'edit-comments.php', '', 'menu-top menu-icon-comments', 'menu-comments', 'dashicons-admin-comments', );
То есть, фраза для переводов здесь уже Comments %s
, а значит наш код должен быть таким:
add_filter( 'gettext', 'filter_gettext', 10, 3 ); function filter_gettext( $translation, $text, $domain ) { if ( $text === 'Comments %s' && $domain === 'default' ) { $translation = 'Отзывы %s'; } return $translation; }
Список изменений
С версии 2.0.11 | Введена. |
Где вызывается хук
$translation = apply_filters( 'gettext', $translation, $text, $domain );