Переопределить стандартный перевод WordPress ядра

11

WordPress настроен на нидерландский язык. Когда я использую get_the_archive_title()свою тему, правильно выводит «Категория: Имя категории» на странице архива категории. Однако я хотел бы прочитать "Sectie: Category-name".

Я не хочу изменять файл голландского языка в папке wp-content / languages, потому что он будет обновляться обновлениями WordPress.

Я попытался скопировать этот файл перевода, изменив перевод "category" и поместив новый файл nl_NL.mo в my-theme / languages. Это не имело никакого эффекта.

Как я могу добиться другого перевода для некоторых строк, не изменяя основные файлы перевода?

Florian
источник

Ответы:

15

Вы можете использовать фильтр gettext :

add_filter( 'gettext', 'cyb_filter_gettext', 10, 3 );
function cyb_filter_gettext( $translated, $original, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

Если вам нужно отфильтровать перевод по контексту, используйте gettext_with_contextфильтр :

add_filter( 'gettext_with_context', 'cyb_filter_gettext_with_context', 10, 4 );
function cyb_filter_gettext_with_context( $translated, $original, $context, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

Перевод с контекстом означает, что контекст задан в функции gettext, используемой для перевода строки. Например, это без контекста:

$translated = __( 'Search', 'textdomain' );

И это с контекстом:

$translated = _x( 'Search', 'form placeholder', 'textdomain' );

Подобные фильтры доступны для множественных переводов ( [_n()][2]и [_nx()][2]): ngettextи ngettext_with_context.

cybmeta
источник
1
Это сработало! Я должен был сделать «Категория:% s» и «Sectie:% s», потому что текст должен быть точно таким же, как в файле перевода.
Флориан
О да, это правильно. Я не знал точного текста для перевода.
cybmeta
1
Отличный кусок кода - просто имейте в виду, что gettextфильтр не будет перехватывать переводы, использующие «контекстную» строку, для этого потребуется gettext_with_context .
Ману
Спасибо за это отличное решение. Поскольку я создаю дочернюю тему и хочу переопределить некоторые переводы родительской темы, я заменил тело предлагаемой функции следующей строкой return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;. Таким образом, я могу хранить первоочередные переводы в PO-файле дочерней темы, а не записывать их в код функции.
Франко
Спасибо, Кибмета! Я использовал эту технику, чтобы изменить основной текст с помощью плагина, который я опубликовал в репо. Я зачислил этот пост в коде. wordpress.org/plugins/…
Джон Ди