Rumah > pembangunan bahagian belakang > tutorial php > Menguruskan terjemahan gettext pada hosting bersama

Menguruskan terjemahan gettext pada hosting bersama

Jennifer Aniston
Lepaskan: 2025-02-22 08:51:11
asal
1025 orang telah melayarinya

Managing Gettext Translations on Shared Hosting

mata teras

    GetText adalah kaedah yang popular untuk pengurusan terjemahan laman web PHP, tetapi ia mempunyai kelemahan yang signifikan: Terjemahan Caches Apache, yang bermaksud bahawa melainkan jika enjin dimulakan semula, kemas kini ke fail yang diterjemahkan tidak akan dapat dilihat. Ini amat bermasalah pada hosting bersama, kerana keistimewaan pentadbir sering tidak tersedia.
  • Audero Shared GetText adalah perpustakaan PHP yang membolehkan pemaju memintas cache Apache yang dimuatkan melalui fungsi gettext (). Perpustakaan menggunakan helah mudah untuk membuat salinan cermin fail terjemahan, menipu Apache untuk memikirkannya sebagai terjemahan yang baru, tidak relevan, dengan itu mengelakkan masalah caching.
  • Audero Shared GetText boleh dipasang melalui komposer, git, atau memuat turun arkib dari repositori. Selepas pemasangan, pemaju boleh menggunakan autoloader komposer untuk memuat kelas secara dinamik dan membuat contoh SharedGette.
  • Perpustakaan ini memerlukan PHP 5.3 atau lebih tinggi kerana ia menggunakan ruang nama dan dikeluarkan di bawah lesen CC BY-NC 4.0 dan boleh didapati secara percuma. Dua kaedah utamanya ialah updateTranslation (), yang mencipta salinan cermin fail terjemahan, dan DeleteoldTranslations (), yang memadamkan semua salinan dalam folder terjemahan yang dipilih kecuali salinan cermin terkini.
Banyak syarikat akhirnya akan menjadikan pasaran sasaran mereka di seluruh dunia. Matlamat ini akan membawa keperluan untuk menterjemahkan laman web syarikat ke dalam satu atau lebih bahasa. Walaupun anda tidak bekerja untuk sebuah syarikat besar, anda mungkin perlu melancarkan perkhidmatan baru dalam bahasa ibunda anda (dengan mengandaikan anda bukan penceramah bahasa Inggeris asli) untuk menargetkan pasaran tempatan dan ke pasaran global dalam bahasa Inggeris. Sebagai pemaju, bukan tanggungjawab kami untuk menterjemahkan teks, tetapi untuk menyediakan laman web untuk menyokong terjemahan. Dalam PHP, kaedah yang paling popular adalah melalui GetText. Ini adalah pendekatan yang hebat kerana ia membolehkan pemisahan terjemahan dari aplikasi, dengan itu membolehkan pengunduran proses. Masalahnya ialah terjemahan Apache cache, jadi melainkan jika anda boleh memulakan semula enjin, sebarang kemas kini ke fail terjemahan tidak akan muncul. Fakta ini sangat menjengkelkan jika anda bekerja di hosting bersama dan tidak mempunyai keistimewaan pentadbir. Dalam artikel ini, saya akan menerangkan isu ini secara terperinci dan menerangkan penyelesaian yang saya dapati untuk mengelakkan isu ini.

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");
?>
Salin selepas log masuk
Salin selepas log masuk

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");
?>
Salin selepas log masuk
Salin selepas log masuk

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;
}
Salin selepas log masuk

kemudian jalankan arahan pemasangan untuk menghuraikan dan memuat turun kebergantungan:

"require": {
    "audero/audero-shared-gettext": "1.0.*"
}
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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

bagaimana memasang getText pada hosting saya yang 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.

Mengapa terjemahan gettext saya tidak berfungsi?

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.

bagaimana untuk debug terjemahan gettext?

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.

Bolehkah saya menggunakan getText di WordPress?

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.

Bagaimana untuk mengemas kini terjemahan getText saya?

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.

Kenapa saya mendapat ralat "Pakej PHP-GETTEXT tidak dapat dijumpai"?

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.

bagaimana menggunakan getText dalam php?

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.

Bolehkah saya menggunakan gettext di ubuntu?

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.

bagaimana membuat 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.

Apakah perbezaan antara.po dan .mo fail?

.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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan