デフォルトのWordPressコア翻訳を上書きする


11

WordPressはオランダ語に設定されています。get_the_archive_title()テーマを正しく使用すると、カテゴリアーカイブページに「カテゴリ:カテゴリ名」が正しく出力されます。しかし、「Sectie:Category-name」を読んでほしい。

WordPressの更新で更新されるため、wp-content / languagesフォルダー内のオランダ語ファイルを変更したくありません。

その翻訳ファイルをコピーして、「カテゴリ」の翻訳を変更し、新しいnl_NL.moファイルをmy-theme / languagesに入れてみました。これによる影響はありませんでした。

コアの翻訳ファイルを変更せずに、一部の文字列に対して異なる翻訳を実現するにはどうすればよいですか?

回答:


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;
}

コンテキストで翻訳をフィルタリングする必要がある場合は、filterを使用し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


1
うまくいきました!「Categorie:%s」と「Sectie:%s」を実行する必要があったのは、テキストが翻訳ファイルとまったく同じである必要があるためです。
フロリアン

ああ、そうです。翻訳する正確なテキストがわかりませんでした。
cybmeta

1
素晴らしいコード– gettextフィルターは「コンテキスト」文字列を使用する翻訳をキャッチしないことに注意してください。これらはgettext_with_contextを必要とします
マヌ

この素晴らしい解決策をありがとう。子テーマを作成していて、親テーマの翻訳の一部をオーバーライドするつもりなので、提案された関数本体を次の行に置き換えましたreturn $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;。このようにして、オーバーライドする翻訳を関数コードにケーブル接続する代わりに、子テーマのPOファイルでハウスキーピングできます。
フランコ

cybmeta、ありがとう!この手法を使用して、リポジトリで公開したプラグインでコアテキストを変更しました。この投稿はコードに記載しました。wordpress.org/plugins/...
ジョン・ディー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.