Ganti terjemahan inti WordPress default

11

WordPress diatur ke bahasa Belanda. Ketika saya menggunakan get_the_archive_title()tema saya dengan benar, output "Categorie: Category-name" pada halaman arsip kategori. Namun saya ingin itu membaca "Sectie: Category-name".

Saya tidak ingin mengubah file bahasa Belanda di folder wp-content / languages, karena itu akan diperbarui oleh pembaruan WordPress.

Saya mencoba menyalin file terjemahan itu, mengubah terjemahan "kategori" dan memasukkan file nl_NL.mo baru ke dalam my-theme / languages. Ini tidak memiliki efek apa pun.

Bagaimana saya bisa mencapai terjemahan yang berbeda untuk beberapa string tanpa mengubah file terjemahan inti?

Florian
sumber

Jawaban:

15

Anda dapat menggunakan filter 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;
}

Jika Anda perlu memfilter terjemahan dengan konteks, gunakan gettext_with_contextfilter :

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

Terjemahan dengan konteks berarti bahwa konteks diberikan dalam fungsi gettext yang digunakan untuk menerjemahkan string. Misalnya, ini tanpa konteks:

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

Dan ini dengan konteks:

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

Filter serupa tersedia untuk terjemahan jamak ( [_n()][2]dan [_nx()][2]): ngettextdan ngettext_with_context.

cybmeta
sumber
1
Itu berhasil! Saya harus melakukan "Categorie:% s" dan "Sectie:% s" karena teksnya harus persis seperti dalam file terjemahan.
Florian
Oh ya, itu benar. Saya tidak tahu teks yang tepat untuk diterjemahkan.
cybmeta
1
Sepotong kode hebat - perlu diketahui bahwa gettextfilter tidak akan menangkap terjemahan yang menggunakan string "konteks", itu akan memerlukan gettext_with_context .
Manu
Terima kasih atas solusi hebat ini. Ketika saya sedang membangun tema anak dan bersedia untuk mengesampingkan beberapa terjemahan tema orang tua, saya mengganti badan fungsi yang diusulkan dengan baris berikut return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;. Dengan cara ini, saya dapat mengatur terjemahan utama pada file PO tema anak bukannya mengirimnya ke dalam kode fungsi.
Franco
Terima kasih cybmeta! Saya menggunakan teknik ini untuk mengubah teks inti dengan plugin yang saya terbitkan di repo. Saya mengkredit posting ini dalam kode. wordpress.org/plugins/…
John Dee