Ganti terjemahan tema induk dengan tema anak

11

Saya memiliki tema induk yang menggunakan dengan benar load_theme_textdomain()untuk memuat semua string yang diterjemahkan dalam banyak bahasa.

Kemudian saya membuat tema anak yang digunakan load_child_theme_textdomain()untuk mencapai hal yang sama untuk senarnya.

Ada string terjemahan tertentu untuk bahasa tertentu pada tema induk yang ingin saya ganti / timpa dalam tema anak.

Saya tahu jika mereka berada di file templat saya bisa mengganti file dan cukup mengganti textdomain untuk string-string itu, tetapi sayangnya yang saya bicarakan digunakan di banyak tempat dan juga di dashboard (jadi di dalam beberapa fungsi filter / aksi ).

Jadi pertanyaan saya adalah: apakah ada cara untuk mengganti string yang diterjemahkan di dalam tema anak tanpa harus mengganti file atau fungsi templat induk?

Saya tidak tahu, mungkin menambahkan file parent-theme.mo di dalam folder bahasa tema anak dengan hanya string yang diterjemahkan, atau sesuatu seperti itu.

d79
sumber

Jawaban:

9

Saya pikir saya menemukan solusi, tetapi sebelum sedikit

Premis

load_theme_textdomain()dan load_child_theme_textdomain()pada dasarnya sama, satu-satunya perbedaan adalah jalur default yang mereka gunakan:

  • mereka mendapatkan bahasa saat ini (menggunakan get_locale()) dan menambahkan file .mo relatif ke jalur yang dilewati sebagai argumen;
  • kemudian mereka memanggil load_textdomain()lewat sebagai argumen baik itu textdomain dan path yang dihasilkan ke file .mo.

Kemudian load_textdomainmemuat file .mo ke dalam variabel textdomain global, tetapi seperti yang dapat kita baca dari sumber :

Jika domain sudah ada, terjemahan akan digabungkan.

Jika kedua set memiliki string yang sama, terjemahan dari nilai asli akan diambil.

Jadi, untuk mengganti / mengganti hanya string dari theme parent yang kita inginkan, kita perlu memuat file .mo kustom untuk textdomain induk, hanya berisi string yang diterjemahkan, sebelum theme parent memuat file .mo-nya.


Larutan

Pada akhirnya, saya hanya membuat folder dengan nama tema induk (hanya untuk kenyamanan) ke dalam folder bahasa tema anak, dan memasukkan ke dalamnya file .mo kustom saya untuk domain teks induk (satu untuk bahasa, dalam xx_XX.mobentuk, dimana xx_XXkode bahasanya).

Dan kemudian saya menambahkan baris dalam functions.phpfile tema anak saya selama after_setup_themeaksi, di dekat salah satu yang memuat file .mo untuk textdomain tema anak saya:

add_action( 'after_setup_theme', function () {
    // load custom translation file for the parent theme
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // load translation file for the child theme
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

Karena functions.phpfile tema anak dimuat sebelum yang orang tua, rangkaian string ini akan lebih diutamakan daripada terjemahan tema induk (atau saya bisa saja menetapkan prioritas menggunakan parameter ketiga add_actionfungsi).


Catatan: Saya bisa menggunakan load_child_theme_textdomainbukan load_theme_textdomain, seperti yang dikatakan di premis itu akan sama.

d79
sumber
4

Anda dapat menggunakan file bahasa yang ada di folder tema anak Anda. Pertama, Anda harus tahu domain teks mana yang menggunakan tema induk. Kemudian buat file .po dan .mo hanya dengan bahasa Anda sebagai nama file (mis. De_DE.po / de_DE.mo atau nl_NL.po / nl_NL.mo) dan masukkan ke dalam folder di dalam direktori tema anak Anda, "bahasa" sebagai contoh.

Anda kemudian dapat menginisialisasi domain teks dengan load_child_theme_textdomain():

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

Perhatikan bahwa Anda dapat menemukan domain teks dengan mencari panggilan fungsi seperti __()atau _e()di dalam file PHP tema induk. Parameter kedua adalah domain teks:__( 'Translated text string', 'text_domain' );

redelschaap
sumber
terima kasih @redelschaap, pada akhirnya solusi Anda akan bekerja selama Anda menggunakan folder yang berbeda untuk domain teks induk dari yang Anda gunakan untuk domain teks anak: itu tangkapannya! :)
d79
Anda dapat memuat beberapa domain teks dari dalam tema anak Anda. Tetapi Anda juga bisa menggunakan domain teks tema induk untuk semua terjemahan, karena terjemahan digabungkan ketika memuat file untuk domain teks yang sama.
redelschaap
0

Pembaruan 2019 untuk Wordpress 5.0.1.

  1. File TIDAK boleh memiliki orangtua atau anak siput di dalamnya. Misalnya, menyediakan terjemahan bahasa Spanyol Spanyol harus memiliki file child-theme-name / languages ​​/ es_MX.po dan /child-theme-name/languages/es_MX.mo
  2. Tema child functions.php harus memiliki kode berikut. Perhatikan bahwa fungsi load_child_theme_textdomain () parameter pertama adalah slug tema PARENT, bukan anak:
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
Cesar
sumber