Dapatkan placeholder teks

Saya sedang membangun aplikasi multibahasa di PHP + CodeIgniter. Saya telah memutuskan untuk menggunakan gettext untuk terjemahan teks UI, dan sejauh ini terbukti efisien dan mudah digunakan.

Tapi sekarang saya menghadapi sesuatu yang sangat menjengkelkan: fungsi gettext() hanya menerima satu parameter, sementara saya ingin perilaku seperti printf yang saya dapatkan dari adaptor gettext Zend Framework, di mana saya dapat menggunakan %1$s, %2$s dll. sebagai placeholder dan kemudian tentukan string pengganti sebagai parameter tambahan pada fungsi translate() tampilan Zend.

Saya tidak ingin membuang gettext karena manajemen terjemahan yang mudah dengan file .po dan poEdit (saya bisa memperbaruinya dengan satu klik). Apa saja pilihan saya?

Saya sudah mencoba menulis pembantu untuk berinteraksi dengan gettext: jalankan argumen pertama melalui gettext dan kemudian jalankan strtr pada string yang dihasilkan. Apakah ada pendekatan lain/lebih baik yang Anda rekomendasikan?


person mingos    schedule 26.03.2011    source sumber
comment
Saya menyadari bahwa Anda mengatakan Anda tidak ingin membuang gettext, namun Anda harus menyadari bahwa Anda dapat menggunakan Zend_Translate dan CI secara bersamaan tanpa terlalu banyak kesulitan. Manualnya menyatakan bahwa ia dapat membaca .mo file. Saya tidak yakin apa bedanya dengan file .po, itulah alasan mengapa saya memposting ini sebagai komentar, bukan jawaban. Manualnya mengatakan bahwa POEdit berfungsi dengan format itu.   -  person Charles    schedule 27.03.2011
comment
.mo adalah apa yang menjadi .po setelah dikompilasi. Gettext berbunyi .mo, tetapi .po dapat dibaca manusia dan itulah yang Anda edit :). Ya, menggunakan Zend_Translate jelas merupakan pilihan yang perlu dipertimbangkan.   -  person mingos    schedule 27.03.2011


Jawaban (1)


Sebenarnya cukup sederhana, Anda mendefinisikan fungsi variadik seperti ini:

function myGettext($id)
{
    return vsprintf(gettext($id), array_slice(func_get_args(), 1));
}

Sekarang melakukan myGettext('%u %s in a %s', 3, 'monkeys', 'tree') akan mengembalikan string yang diharapkan dengan placeholder digantikan oleh argumen yang tersisa. Anda jelas juga perlu mengimplementasikan fungsi jamak yang memanggil ngettext() sebagai gantinya.

Mengenai poEdit, Anda harus mengubah kata kunci yang dicarinya, sudah lama sejak saya terakhir menggunakannya tetapi cukup sederhana, satu-satunya masalah yang saya hadapi adalah mengidentifikasi kata kunci untuk dukungan jamak (lihat ini).

Semoga bisa membantu!

person Alix Axel    schedule 27.03.2011
comment
Ini kurang lebih yang dilakukan oleh pembantu saya, tetapi kodenya lebih sederhana (satu baris vs empat, hehe). poEdit memang memiliki kemungkinan untuk menentukan kata kunci - ini adalah cara saya mengambil string yang dapat diterjemahkan dalam fungsi translate, setLabel dan setDescription Zend Framework :). Terima kasih, saya suka pendekatan Anda. - person mingos; 27.03.2011
comment
itu sebenarnya bukan masalah, tapi ya, saya mengubah pembantu saya sesuai saran Anda dan tidak hanya berfungsi dengan baik, tetapi saya juga menyukai jumlah kode yang diperlukan :D. Terima kasih lagi. - person mingos; 27.03.2011
comment
@mingos: Oh, bagus. Saya senang bisa membantu. ;) - person Alix Axel; 27.03.2011