Apa gunanya sintaks gettext?

9

Sejauh ini saya sudah menangani beberapa terjemahan di Wordpress dan mencoba membaca dokumentasi gettext resmi tetapi tidak akan mendapatkan satu hal yang mungkin sederhana: Apa perbedaan antara awal itu seperti __ (, _e (, dll.? Dan bahkan lebih lanjut: yang lainnya ada di samping? Terima kasih sebelumnya!

jujur

Sirkus Sirkuit
sumber
Terima kasih atas jawaban yang rumit! Saya sangat menghargai ini di sini!
Circuit Circus
... Mungkin satu pertanyaan lebih lanjut untuk ini: Bisakah entri teks-domain ditinggalkan? Saya langsung mulai membawanya ke setiap string yang ingin saya terjemahkan tetapi kemudian mengenali beberapa contoh dalam kodeks Wordpress yang tidak mengandung sama sekali ...
Circuit Circus
... Oke, sekarang saya menemukannya di halaman codex ini - maaf untuk pertanyaan yang berlebihan ini :-)
Circuit Circus

Jawaban:

13

__(garis bawah ganda) adalah fungsi terjemahan dasar. Ini menerjemahkan string dan mengembalikannya sebagai string.

_emelakukan hal yang sama __, tetapi gema hasilnya segera.

_xadalah fungsi menerjemahkan kontekstual. Ini memiliki opsi kedua untuk memberikan konteks kepada orang yang melakukan terjemahan.

_exsama dengan _x, tetapi gema hasilnya.

Contoh menggunakan _x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

Terkadang string yang sama dapat berbeda dalam bahasa lain. Memberikan konteks kepada penerjemah dapat membantu mereka memilih kata yang tepat.

Fungsi pintasan:

  • esc_attr__: Setara dengan __tetapi juga menjalankan hasilnya esc_attr.
  • esc_html__: Setara dengan __tetapi juga menjalankan hasilnya esc_html.
  • esc_attr_e: Setara dengan _etetapi juga menjalankan hasilnya esc_attr.
  • esc_html_e: Setara dengan _etetapi juga menjalankan hasilnya esc_html.
  • esc_attr_x: Setara dengan _xtetapi juga menjalankan hasilnya esc_attr.
  • esc_html_x: Setara dengan _xtetapi juga menjalankan hasilnya esc_html.

_nadalah penangan pluralisasi. Contoh:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

Dalam contoh itu, ada dua cara untuk mengatakan jumlah taco, tergantung pada apakah itu tunggal atau tidak. Penggunaan pertama dari $ number memberitahu _nfungsi versi mana yang digunakan. Penggunaan $ number yang kedua terjadi di sprintf, untuk mengganti% d dengan angka aktual dalam string.

Tidak ada fungsi gema yang setara untuk _n, tetapi ada fungsi bernama _nx. Ini kombinasi dari _ndan _x. Pluralisasi dan konteks.

_n_noopadalah yang spesial. Ini digunakan untuk menerjemahkan string jamak, tetapi tidak benar-benar melakukan terjemahan segera. Ini berguna jika Anda ingin membuat string terpusat tetapi benar-benar melakukan pekerjaan di tempat lain. Fungsi yang sebenarnya melakukan pekerjaan di tempat lain adalah translate_nooped_plural.

Contoh:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

Ini tidak banyak digunakan, tetapi bisa berguna untuk organisasi. Jika Anda meletakkan semua string Anda dalam satu file, misalnya, lalu referensi mereka di tempat lain, ini tidak akan mungkin dengan hanya _n, Anda perlu sesuatu seperti _n_noopmelakukan itu.

_nx_noopsama dengan _n_noop, tetapi juga dapat mengambil konteks untuk para penerjemah, sama seperti _x.

Perhatikan bahwa Anda dapat memasukkan domain ke panggilan fungsi noop, atau ke panggilan fungsi translate_nooped_plural. Mana yang lebih masuk akal untuk organisasi Anda. Jika keduanya memiliki domain, maka yang diteruskan ke panggilan telepon menang.

number_format_i18nadalah setara dengan number_format bawaan PHP , tetapi menambahkan penanganan untuk hal-hal seperti desimal dan sebagainya, yang berbeda di lokal lain.

date_i18nadalah setara dengan PHP built-in tanggal , dengan semua terkait penanganan sana juga. Nama bulan, nama hari, dll.

Juga, jangan pernah melanggar hukum . Hanya pengingat. :)

Otto
sumber
Wow, ini penjelasan yang bagus! Terima kasih banyak telah membantu! Sekarang saya melihat dengan jelas.
Circuit Circus
6

__ (), _e () dan _x (), _ex ()

__()dan _e()pada dasarnya keduanya pembungkus translate()(jangan gunakan langsung) dan hampir sama.

Perbedaannya terletak pada yang __()mengembalikan string yang diterjemahkan dan _e()menggemakannya. Keduanya perlu diberi string sebagai parameter yang diperlukan dan biasanya, meskipun opsional, juga merupakan textdomain.

Secara analog, ada _x()dan _ex(), yang memungkinkan Anda menentukan konteks yang dapat menggambarkan di mana string muncul. Jika proyek Anda menyertakan lebih dari beberapa puluh string yang dapat diterjemahkan, menggunakan konteks sangat masuk akal.

Juga, perhatikan keberadaan _n()dan _nx()untuk bentuk jamak.

Contoh penggunaan umum

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

Parameter

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Semua parameter $numberadalah string. Semua kecuali $domaindiwajibkan.

Fleksibilitas lebih lanjut dengan variabel dan sprintf ()

Jika string Anda akan berisi angka atau kata-kata variabel, gunakan sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

Sumber daya tambahan

Beberapa sumber daya tambahan untuk WordPress I18n Ninja yang akan datang:

Johannes Pille
sumber
Lihat juga "Pelokalan" di bawah "Lain-lain" dalam kodeks untuk rincian lengkap fungsi & penjelasan terperinci.
TheDeadMedic
& Ini adalah tempat pertemuan wp-polyglots .
brasofilo
@Johannes Pille: Saya tidak melihat jawaban Anda sampai saya memposting milik saya, haruskah saya menghapus posting saya?
Jeremy Jared
@ JeremyJared Tidak, mengapa? Info lebih lanjut tidak bisa menjadi hal yang buruk, bukan ?! Saya pikir jawaban Anda dipikirkan dengan matang. +1 dari saya.
Johannes Pille
@TheDeadMedic Diedit ke dalam "sumber daya tambahan".
Johannes Pille
3

Saya bukan ahli terjemahan, tetapi Halaman Codex WordPress memiliki dokumentasi yang baik dan menjelaskan alasan untuk menggunakan setiap contoh.

Dari halaman codex:

__()

Digunakan ketika pesan dilewatkan sebagai argumen ke fungsi lain; _e()digunakan untuk menulis pesan langsung ke halaman. Lebih detail tentang dua fungsi ini:

__('message')

Mencari modul lokalisasi untuk terjemahan 'pesan', dan meneruskan terjemahan ke pernyataan pengembalian PHP. Jika tidak ada terjemahan yang ditemukan untuk 'pesan', itu hanya mengembalikan 'pesan'.

_e('message')

Mencari modul lokalisasi untuk terjemahan 'pesan', dan meneruskan terjemahan ke pernyataan gema PHP. Jika tidak ada terjemahan yang ditemukan untuk 'pesan', itu hanya menggemakan 'pesan'.

Perhatikan bahwa jika Anda menginternasionalisasi Tema atau Plugin, Anda harus menggunakan a "Text Domain" .

Kerangka gettext menangani sebagian besar WordPress. Namun, ada beberapa tempat di distribusi WordPress di mana gettext tidak dapat digunakan:

  • File README WordPress utama - ini adalah file HTML statis, bukan file PHP, sehingga tidak dapat dijalankan melalui fungsi gettext.
  • Beberapa pesan kesalahan dibuat sangat awal dalam siklus pemuatan WordPress, sebelum gettext dimuat.

Tautan ke Halaman Codex

Info tambahan tentang kapan gettext tidak berfungsi

Semoga itu menjawab pertanyaan Anda, jika tidak beri tahu kami dan mungkin orang lain dapat membantu atau saya dapat melakukan riset lebih lanjut.

Jeremy Jared
sumber