HTML di dalam string terjemahan bahasa __ () atau _e ()


24

Apa pendekatan yang tepat untuk membangun string terjemahan?

Sebagai contoh,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

Apakah boleh menambahkan string dan / atau HTML atau harus dilakukan terlebih dahulu kemudian jalankan melalui terjemahan seperti:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

Jawaban:


41

Ada argumen kedua dalam __()fungsi ini. Ini harus diatur ke domain yang Anda gunakan untuk plugin atau tema Anda. Dalam contoh di bawah ini saya gunakan 'text_domain'. String domain Anda harus unik. Seharusnya tidak cocok dengan string domain lainnya. Tidak menggunakan argumen domain teks default ke 'default'nama domain WordPress. Lihat tautan untuk detail lebih lanjut.

Selalu gunakan string ( 'text_domain'). Jangan pernah menggunakan variabel, fungsi atau konstanta dengan string di dalamnya. Sebagian besar (semua?) Program terjemahan tidak akan melihatnya tanpa string di sana.

Kode Anda:

echo __( 'Hello ' . $first . ' you own me money.' );

Jangan sertakan variabel dalam string.

Cara yang lebih baik:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Atau hanya:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

The %splaceholder menceritakan penerjemah manusia yang string akan di sana. Gunakan %duntuk angka. Ada juga placeholder lainnya .

(Kalimat ini secara tata bahasa Inggris salah. Gunakan salah satu 'Hello %s, you owe me money.'atau 'Hello %s, you own my money.'tergantung pada maksud Anda.)


Kode Anda:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

Jangan terjemahkan HTML. Itu sama dalam bahasa apa pun.

Cara yang lebih baik:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

Atau pisahkan menjadi beberapa baris:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

Jika tidak jelas apa Atas dan Bawah Anda dapat menggunakan _x()untuk menjelaskan konteks istilah-istilah ini.


Anda dapat menemukan kasus terjemahan lain di sini: Internasionalisasi: Anda mungkin salah melakukannya


Anda mengatakan jangan menerjemahkan HTML. Mungkin saya tunjukkan bahwa ini tidak sedang diterjemahkan, sedang dilihat di tabel yang sudah ada dari string yang sudah diterjemahkan sebelumnya. Memiliki HTML dalam string tidak membuat perbedaan asalkan penerjemah tidak menghapusnya. Bahkan, dalam beberapa situasi itu membuat kinerja lebih baik daripada pencarian dan penggantian regex.
Twifty

Tidak terkait, tetapi perlu diperhatikan: textdomainharus berupa string literal, tidak boleh berupa variabel / konstan / properti.
brasofilo

@brasofilo, saran itu tertulis di jawaban di dekat bagian atas, tetapi harus diulang. Saya membuat kesalahan ini di beberapa plugin khusus yang saya tulis untuk pelanggan.
Charles Clarkson

+1 untuk sprintf(). Itu benar-benar cara untuk memiliki HTML dalam string yang dapat diterjemahkan.
helgatheviking

Saya tidak melihat bagaimana penggunaan sprintf()bantuan dengan cara apa pun selain mungkin terlihat lebih bersih. Jika Anda memiliki kalimat dengan HTML di dalamnya seperti Some text with a <strong>strong</strong> word inside.bagaimana mungkin menerjemahkan kalimat secara keseluruhan dan tidak menerjemahkan Some text with a, strongdan secara word insideindividual (yang tidak masuk akal).
phpheini

4

Saya tidak akan membahas masalah variabel dalam string karena sudah dikatakan.

Anda ingin menjaga string Anda tetap statis, artinya konten tidak akan berubah. Anda juga ingin menghindari HTML yang tidak perlu.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

Di atas akan mengambil dua baris di tabel Anda untuk apa yang pada dasarnya adalah teks yang sama. Mereka dapat ditulis ulang sebagai:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

Mengurangi menjadi satu baris.

Terkadang HTML dalam teks tidak dapat dihindari. Ambil contoh:

__( 'You currently owe <b>%s</b> dollars' );

Karena bahasa adalah tata bahasa, pemisahan teks akan menyebabkan masalah bagi siapa pun yang menerjemahkan.

Aturan praktis. Tag format teks HTML di tengah kalimat tidak masalah. Kalimat yang dimulai dan diakhiri dengan HTML hanya membuang-buang ruang.


Dalam contoh terakhir, Anda bisa membungkus tag tebal di sekitar argumen yang dimasukkan "<b>$string</b>". Maka Anda bisa menggunakannya 'You currently owe %s dollars'. Tetapi mungkin perlu tetap jika Anda menggunakannya dengan _n()fungsi yang membutuhkan %dpengganti.
Charles Clarkson

@CharlesClarkson Panggilan yang bagus. Mungkin saya harus mengabaikannya %sagar lebih jelas.
Twifty
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.