mata teras
NOTA: Jika anda tidak biasa dengan konsep i18n, terjemahan dan getText, saya sangat mengesyorkan agar anda membaca siri ini sebelum meneroka artikel ini lebih lanjut. Ia akan memberi anda maklumat yang lebih terperinci daripada gambaran ringkas yang anda dapati di sini dan membantu anda memahami topik -topik ini dengan lebih baik.
Tetapan Alam Sekitar
Terdapat banyak cara untuk menggunakan terjemahan dalam PHP. Cara paling mudah yang saya dapat ingat adalah untuk mempunyai array bersekutu yang mengandungi semua rentetan yang diterjemahkan dan kemudian gunakan kunci untuk mengambil rentetan yang betul. Seperti yang anda fikirkan, penyelesaian ini tidak berskala dan anda harus mengelakkan menggunakan penyelesaian ini melainkan anda bekerja pada projek yang sangat kecil (mungkin tidak lebih daripada 5 baris kod). Untuk terjemahan yang serius, kita boleh menggunakan gettext. Pendekatan ini membolehkan kita mempunyai fail yang berbeza untuk setiap bahasa sasaran, yang membantu mengekalkan pemisahan antara logik perniagaan, lapisan persembahan, dan terjemahan (yang boleh kita fikirkan sebagai tambahan kepada lapisan persembahan). Dengan GetText, kita dapat selaras dengan proses ini kerana apabila kita memproses ciri -ciri tertentu laman web, penterjemah masih boleh menggunakan perisian seperti poedit untuk diterjemahkan.
terjemahan hendaklah disimpan dalam laluan dengan struktur tetap. Pertama, kami akan mempunyai folder root yang dinamakan mengikut keutamaan anda (mis. "Bahasa"). Di dalamnya, kita mesti membuat folder untuk setiap bahasa sasaran, yang namanya mesti mematuhi piawaian ISO 3166. Oleh itu, nama -nama yang sah untuk terjemahan Itali boleh menjadi "it_it" (Itali Itali), "it_ch" (Itali Swiss), "en_us" (Amerika Inggeris), dan sebagainya. Dalam folder dengan kod bahasa, kita mesti mempunyai folder yang dipanggil "lc_messages", di mana kita akan menyimpan fail terjemahan.
PoEdit menganalisis kod sumber laman web dan mengekstrak rentetan yang akan diterjemahkan berdasarkan satu atau lebih corak yang kami tetapkan dalam perisian. Ia menjimatkan rentetan dalam satu fail dengan sambungan .po (objek mudah alih), yang perisian (atau setaraf) disusun ke dalam fail .mo binari. Yang terakhir adalah format yang kami berminat dengan fungsi GetText () PHP. Fail .Mo adalah fail yang perlu kita letakkan dalam direktori "lc_messages" yang kami buat sebelum ini.
kod sampel menggunakan getText () adalah seperti berikut (kod telah dikomentari supaya anda dapat dengan cepat memahami fungsinya):
<?php // 包含翻译文件的根文件夹的名称 $translationsPath = 'languages'; // 要翻译到的语言 $language = 'it_IT'; // 翻译文件的名称(在gettext中称为域) $domain = 'audero'; // 指示此会话将使用哪种语言 putenv("LANG=" . $language); setlocale(LC_ALL, $language); // 设置当前域的路径 bindtextdomain($domain, $translationsPath); // 指定字符编码 bind_textdomain_codeset($domain, 'UTF-8'); // 选择域 textdomain($domain); // 调用gettext()函数(它有一个名为_()的别名) echo gettext("HELLO_WORLD"); // 等效于echo _("HELLO_WORLD"); ?>
Selepas menyimpan kod sebelumnya di halaman dan memuatkannya dalam penyemak imbas, jika getText () dapat mencari fail terjemahan, anda akan melihat terjemahan yang anda buat pada skrin.
Setakat ini, semuanya berjalan lancar. Berita buruk ialah apabila terjemahan dimuatkan, Apache cache itu. Oleh itu, melainkan jika kita boleh memulakan semula enjin, sebarang kemas kini ke fail terjemahan tidak akan dipaparkan. Ini amat menjengkelkan jika kita bekerja di hosting bersama dan tidak mempunyai keistimewaan pentadbir. Bagaimana menyelesaikan masalah ini? Audero dikongsi getText datang untuk menyelamatkan!
Apa itu Audero Shared GetText
Audero Shared GetText adalah perpustakaan PHP (sebenarnya hanya kelas, tetapi biarkan saya bermimpi mengenainya) yang membolehkan anda memintas isu terjemahan yang dimuatkan melalui fungsi gettex () yang di -cache oleh Apache. Perpustakaan ini mengambil pendekatan yang mudah dan berkesan, jadi anda akan sentiasa menggunakan terjemahan terkini. Audero dikongsi getText memerlukan Php 5.3 atau lebih tinggi kerana ia menggunakan ruang nama dan terdapat struktur yang diterangkan dalam bahagian sebelumnya. Ia mempunyai dua kaedah utama: updateTranslation () dan DeleteoldTranslations (). Yang pertama adalah teras perpustakaan dan juga cara untuk melaksanakan teknik ini. Tetapi apakah teknik ini? Mari kita lihat kodnya untuk mengetahui lebih lanjut. Untuk memahaminya sepenuhnya, perlu menekankan bahawa pembina kelas menerima jalan untuk menyimpan terjemahan, bahasa yang akan diterjemahkan ke, dan nama (domain) fail yang diterjemahkan.
<?php // 包含翻译文件的根文件夹的名称 $translationsPath = 'languages'; // 要翻译到的语言 $language = 'it_IT'; // 翻译文件的名称(在gettext中称为域) $domain = 'audero'; // 指示此会话将使用哪种语言 putenv("LANG=" . $language); setlocale(LC_ALL, $language); // 设置当前域的路径 bindtextdomain($domain, $translationsPath); // 指定字符编码 bind_textdomain_codeset($domain, 'UTF-8'); // 选择域 textdomain($domain); // 调用gettext()函数(它有一个名为_()的别名) echo gettext("HELLO_WORLD"); // 等效于echo _("HELLO_WORLD"); ?>
Perkara pertama yang perlu dilakukan oleh kaedah ini adalah untuk menguji sama ada fail terjemahan binari asal (.mo fail) wujud. Jika ia tidak wujud, kaedah melemparkan pengecualian. Ia kemudian mengira laluan penuh ke fail yang diterjemahkan berdasarkan parameter yang diberikan kepada pembina dan timestamp yang diubah suai terakhir fail. Selepas itu, ia mewujudkan rentetan baru yang menggabungkan domain asal dengan cap waktu yang dikira sebelumnya. Setelah selesai, inilah helah, yang membuat salinan cermin fail terjemahan. Jika fail dengan nama sedemikian sudah ada, kelas cukup pintar untuk mengelakkan penyalinan ini. Akhirnya, ia mengembalikan nama baru yang akan digunakan dalam bindTextDomain (), bind_textdomain_codeset (), dan textDomain (). Melakukannya, Apache akan melihat bahawa terjemahan itu seperti tidak ada kaitan dengan terjemahan asal, dengan itu mengelakkan masalah caching. Seperti yang saya katakan, mudah dan berkesan!
"Aurelio hebat!", Anda berfikir, "tetapi kemudian folder saya akan kembung dengan salinan ini." Inilah sebabnya saya mencipta DeleteoldTranslations (). Ia memadam semua salinan cermin folder terjemahan yang dipilih kecuali yang terakhir.
Sekarang anda telah mempelajari apa yang dikongsi GetText Audero dan apa yang boleh dilakukan untuk anda, mari kita lihat bagaimana untuk mendapatkannya.
Memasang Audero Shared GetText
anda boleh mendapatkan "Audero Shared GetText" melalui komposer, menambah baris berikut ke komposer.json anda:
/** * 创建翻译文件的镜像副本 * * @return string 创建的翻译文件的名称(在gettext中称为域) * * @throws \Exception 如果找不到翻译文件 */ public function updateTranslation() { if (!self::translationExists()) { throw new \Exception('在给定路径中找不到翻译文件。'); } $originalTranslationPath = $this->getTranslationPath(); $lastAccess = filemtime($originalTranslationPath); $newTranslationPath = str_replace(self::FILE_EXTENSION, $lastAccess . self::FILE_EXTENSION, $originalTranslationPath); if(!file_exists($newTranslationPath)) { copy($originalTranslationPath, $newTranslationPath); } return $this->domain . $lastAccess; }
kemudian jalankan arahan pemasangan untuk menghuraikan dan memuat turun kebergantungan:
"require": { "audero/audero-shared-gettext": "1.0.*" }
Komposer akan memasang perpustakaan ke direktori vendor/audero projek anda.
Jika anda tidak mahu menggunakan komposer (anda sepatutnya), anda boleh mendapatkan getText berkongsi Audero melalui Git dengan menjalankan arahan berikut:
php composer.phar install
Pilihan terakhir yang anda miliki ialah mengakses repositori dan memuat turunnya sebagai arkib.
Cara menggunakan Audero Shared GetText
Katakan anda mendapat Audero berkongsi getText menggunakan komposer, yang anda boleh bergantung pada autoloadernya untuk memuatkan kelas secara dinamik. Kemudian anda perlu membuat contoh SharedGetTex dan hubungi kaedah yang anda perlukan. Anda boleh menggunakan salah satu kaedah yang disebutkan di atas seperti yang ditunjukkan dalam contoh berikut.
git clone https://github.com/AurelioDeRosa/Audero-Shared-Gettext.git
Kesimpulan
Artikel ini memperkenalkan anda kepada Audero yang dikongsi GetText, perpustakaan mudah (baik ... kelas) yang membolehkan anda memintas isu terjemahan yang dimuatkan melalui fungsi gettext () yang di -cache oleh Apache. Audero berkongsi Gettext mempunyai keserasian yang luas kerana ia memerlukan anda mempunyai sekurang -kurangnya Php 5.3 (ia telah dikeluarkan untuk seketika) kerana ia menggunakan ruang nama. Jangan ragu untuk menggunakan demo dan fail yang terkandung dalam repositori, dan jika anda menemui masalah, serahkan permintaan dan soalan tarik. Saya telah mengeluarkan Audero Shared GetText di bawah lesen CC BY-NC 4.0 supaya ia bebas untuk digunakan.
Adakah anda menghadapi masalah ini? Bagaimana anda menyelesaikannya? Jangan malu dan hantarkan penyelesaian anda dalam komen!
(Berikut adalah bahagian FAQ, yang telah pseudo-asal berdasarkan teks asal dan teks asal disimpan dalam fikiran)
FAQS (FAQ) Mengenai Menguruskan terjemahan GetText pada hosting dikongsi
Memasang getText pada hosting bersama boleh menjadi agak rumit, kerana anda mungkin tidak mempunyai akses root. Walau bagaimanapun, anda masih boleh memasangnya melalui CPanel atau Plesk. Dalam cPanel, anda boleh mencari pilihan untuk membolehkan GetText di bawah bahagian PILIH PHP Versi. Di Plesk, anda boleh mengaktifkannya di bawah bahagian "Tetapan PHP". Jika anda tidak dapat mencari pilihan ini, anda mungkin perlu menghubungi penyedia hosting anda untuk mendapatkan bantuan.
Terjemahan GetText anda tidak berfungsi untuk beberapa sebab. Masalah biasa ialah fail .mo tidak disusun dengan betul atau laluan fail tidak betul. Pastikan fail .mo berada dalam direktori yang betul dan laluan fail dalam kod adalah betul. Satu lagi masalah mungkin bahawa lokasi yang anda gunakan tidak disokong oleh pelayan. Anda boleh menyemak ini dengan perintah locale -a.
Debugging GetText Translation boleh dilakukan dengan memeriksa kesilapan dalam fail .po dan .mo. Anda boleh membuka fail ini menggunakan alat seperti poEdit dan periksa sebarang kesilapan sintaks. Di samping itu, anda boleh menggunakan fungsi gettext dalam kod anda untuk memeriksa sama ada terjemahan yang diambil dengan betul. Jika fungsi mengembalikan rentetan asal, terjemahan tidak dapat dijumpai.
Ya, anda boleh menggunakan getText dalam WordPress. WordPress menggunakan GetText sebagai rangka kerja penyetempatannya. Anda boleh menggunakan fungsi __ () dan _e () dalam WordPress untuk mendapatkan terjemahan. Fungsi ini menggunakan getText di latar belakang.
anda boleh mengemas kini terjemahan getText anda dengan mengemas kini fail .po dan kemudian menyusunnya ke dalam fail .mo. Fail .po adalah fail teks biasa yang boleh anda buka dengan mana -mana editor teks. Sebaik sahaja perubahan dilakukan, anda boleh menggunakan alat seperti poEdit untuk menyusun fail .po ke dalam fail .mo.
Ralat ini biasanya berlaku apabila pakej tidak tersedia di repositori pelayan anda menggunakan. Anda boleh cuba mengemas kini senarai pakej anda menggunakan arahan kemas kini SUDO Apt-GET. Jika ralat berterusan, anda mungkin perlu menambah repositori lain atau memasang pakej secara manual.
Anda boleh menggunakan getText dalam PHP dengan menggunakan fungsi getText. Fungsi ini mengambil rentetan sebagai hujah dan mengembalikan rentetan yang diterjemahkan. Sebelum anda boleh menggunakan fungsi ini, anda perlu menetapkan fungsi locale menggunakan fungsi setLocale dan tentukan laluan ke fail .mo menggunakan fungsi bindTextDomain.
Ya, anda boleh menggunakan getText di Ubuntu. Anda boleh memasangnya menggunakan perintah GetText pemasangan Sudo Apt-Get. Selepas pemasangan, anda boleh menggunakan arahan gettext di terminal untuk mengendalikan fail .po dan .mo.
anda boleh membuat fail .po dan .mo menggunakan alat seperti poEdit. Alat ini membolehkan anda membuat dan mengedit fail .po dan secara automatik menyusunnya ke dalam fail .mo. Anda juga boleh membuat fail .po secara manual menggunakan editor teks, tetapi anda memerlukan alat seperti poEdit atau MSGFMT untuk menyusunnya ke dalam fail .mo.
.po Fail adalah fail teks biasa yang mengandungi rentetan asal dan terjemahannya. Mereka boleh dibuka dan diedit menggunakan mana -mana editor teks. Sebaliknya, fail .mo adalah fail binari yang dihasilkan dari fail .po. Mereka digunakan oleh gettext untuk mendapatkan terjemahan semasa runtime.
Atas ialah kandungan terperinci Menguruskan terjemahan gettext pada hosting bersama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!