Сначала небольшая предыстория… У меня есть пользовательский тип сообщений, в котором я хотел бы использовать настраиваемые статусы сообщений. Поскольку настраиваемые статусы сообщений (stati/status/независимо) не были полностью реализованы в ядре, я решил использовать фильтры gettetext для изменения названий определенных вещей. Например, я изменил текст «Опубликовать» на кнопке публикации на «Сохранить». Я пошел с чем-то вроде подхода Рарста здесь. Краткое изложение моего кода ниже. Я действительно не собираюсь делать ничего радикального здесь, поскольку меняю то, что делает/является каждым статусом.
В любом случае, перевод отлично работает в том, что касается PHP. Однако во время тестирования я понял, что если я щелкну ссылку «Изменить» в разделе «Разное действия публикации», а затем щелкну ссылку «Отмена», которая появится впоследствии, моя переведенная кнопка «Сохранить» вернется к кнопке «Опубликовать».
Похоже, это происходит из-за функции javascript, updateText()
найденной в/wp-admin/js/post.dev.js
. Я ищу способ, чтобы JS не топтал мой перевод. Я бы предпочел не возиться с этим, используя манипуляции с DOM, но если это мой единственный вариант, я пойду на это. У меня 3.1, кстати.
<?php
class MyClass {
function __contsruct() {
add_action( 'admin_head', array ( &$this, 'load_gettext_filters' ) );
}
function load_gettext_filters() {
add_filter( 'gettext', array ( &$this, 'change_publishing_text' ), 10, 2 );
}
function change_publishing_text( $translation, $text ) {
global $post;
if ( ! isset ( $post->post_type ) ) {
return $translation;
}
if ( 'mypost' === $post->post_type ) {
if ( ( 'Publish' === $text ) ) {
return 'Save';
}
}
return $translation;
}
}
Во-первых, у вас неприятная опечатка в
__contsruct
. 🙂Во-вторых, у вас неверный тайминг хука. Связанный WP JavaScript локализуется через
postL10n
объект (вы можете видеть его повторение в исходном коде страницы), который собирается наinit
крючке — намного раньше, чем тогда,admin_head
и ваш фильтр еще не на месте.Из быстрого теста это должно сделать это:
Обновлять
Хорошо, сотрите это. Не сработает, если нам нужен контекст. Давайте попробуем это:
Спасибо Рарст! Эта опечатка ускользнула от меня даже после того, как вы указали на нее. Может быть, я слишком увлекся правильным способом множественного числа «статус»: p
Да, действительно, здесь проблема со временем. Я подтвердил, что ваше решение в целом работает, но только если я удалю условие post_type, которое мне нужно, поскольку я хочу повлиять только на определенный тип сообщения. Можете ли вы предложить способ, которым я могу воспользоваться преимуществами проверки gettext и post_type? Спасибо еще раз!
@ goto10 ах, подсунул мне, что так рано у вас не настроен контекст… Я обновлю свой ответ позже, если что-нибудь придумаю.
Потрясающий! Да, я объединил ваш обновленный код с тем, с чего начал (кстати, спасибо за примечание к сообщению t310s), и теперь переведенный текст остается переведенным даже после запуска js-материала.
Да, мое обновление было задумано как дополнение к исходному коду, а не замена. 🙂
Большое спасибо, сэр! Да, это отлично работает, и я ценю, что все это выложено и еще много чего.
@Rarst Edit: Дангит. Кажется, я могу отметить только 1 ответ как принятый, и если бы я мог, я бы выбрал оба. Я разрываюсь, потому что ответ Рарста (с редактированием решения) был опубликован первым и выполняет то, о чем я просил, но ваш немного более отточен. Супер огромное спасибо вам обоим! Это удивительное место.
@ goto10 лучше выбрать более полные и развернутые ответы, принятые для будущих посетителей, чтобы меньше путаться в решении, поэтому вам следует изменить принятый этот. Вы всегда можете проголосовать за мой ответ, если он был полезен. 🙂
Вы здесь сначала отвечали на вопрос со всей важной информацией и заслуживаете принятия, я просто отметил в конце.. 🙂
У вас обоих есть правильная идея, но на самом деле вам понадобятся оба фильтра: один для улавливания текста кнопки, другой для улавливания локализованного текста, то есть их комбинация.
Это работает..