Rumah > Artikel > pembangunan bahagian belakang > Wagtail membuat terjemahan halaman secara pemrograman
Saya tidak menemui sebarang antara muka terprogram untuk membuat terjemahan halaman. Semua logik nampaknya dilaksanakan dalam SubmitTranslationView dalam wagtail.contrib.simple_translation.views.
Jadi satu-satunya cara untuk mengaksesnya secara pengaturcaraan adalah dengan mensimulasikan permintaan untuk mengakses paparan. Saya membungkus ini dalam fungsi bernama translate_page(). Untuk menterjemah halaman, kita boleh memanggil fungsi ini sebagai:-
page_ja = translate_page(user, page, "ja")
Atau kita boleh lulus parameter pilihan include_subtree:-
page_ja = translate_page(user, page, "ja", include_subtree=True)
Dan fungsinya ditakrifkan sebagai:-
def translate_page(user, page, lang, include_subtree=False): locale, created = Locale.objects.get_or_create(language_code=lang) data = {"locales": [locale.id], "include_subtree": include_subtree} url = reverse( "simple_translation:submit_page_translation", kwargs={"page_id": page.id} ) factory = RequestFactory() request = factory.post(url) request.POST = data request.user = user get_response = lambda request: None middleware = SessionMiddleware(get_response) middleware.process_request(request) request.session.save() messages = FallbackStorage(request) setattr(request, "_messages", messages) SubmitPageTranslationView.model = type(page) SubmitPageTranslationView.as_view()(request, page_id=page.pk) page_translated = page.get_translations()[0].specific return page_translated
Saya mempunyai fungsi lain yang dipanggil translate_snippet(). Satu-satunya perbezaan hanyalah url untuk diserahkan dan tiada parameter include_subtree.
Untuk semua tapak kami, kami mempunyai skrip persediaan yang akan mengisi beberapa siaran dan terjemahannya secara automatik supaya pembangun boleh mula bekerja serta-merta dan bukannya perlu membuat halaman sampel secara manual.
Struktur halaman kami adalah seperti ini:-
HomePage ==> BlogIndexPage ==> BlogPage
Dan skrip persediaan akan melakukan perkara berikut:-
Ini semua berfungsi dengan baik sehingga kami menetapkan tapak baharu dengan struktur halaman:-
BlogIndexPage ==> BlogPage
Jadi kami meninggalkan Laman Utama (yang saya rasa idea yang tidak baik sekarang tetapi mari simpan untuk topik lain) memandangkan tapak ini kebanyakannya adalah blog. Perkara pertama yang saya perhatikan selepas menjalankan skrip persediaan ialah tiada terjemahan catatan blog dibuat, walaupun kami telah melepasi include_subtree semasa menterjemah BlogIndexPage.
Reaksi usus pertama saya ialah mungkin beberapa perubahan dalam versi wagtail baharu. Kebanyakan tapak kami dibuat beberapa tahun lalu dan masih menggunakan wagtail 5 tetapi untuk tapak baharu ini, kami akan mulakan dengan wagtail 6 memandangkan ia adalah yang terbaru.
Tetapi melihat log komit wagtail untuk simple_translation views.py, perubahan terakhir kod adalah tiga tahun lalu. Dan kita boleh melihat kod pada asasnya sama antara wagtail 5 dan 6.
Masalah dengan fungsi translate_page di atas ialah ia tidak menyemak sebarang ralat. Kerana menangkap ralat bermakna anda perlu menghuraikan respons permintaan untuk beberapa rentetan ralat. Tetapi mengesan aliran kod membawa saya ke peringkat di mana saya dapat melihat kod tidak dilaksanakan kerana borang tidak disahkan.
Borang cetakan.error menunjukkan mesej ralat yang berkaitan dengan tempat tidak sah. Ini pelik kerana kita dapat melihat dalam fungsi translate_page di atas kita mencipta tempat jika ia belum wujud lagi.
Dan mencetak self.fields["locales"].pilihan I can locale ada dalam pilihan semasa panggilan pertama translate_page() semasa menterjemah halaman akar, tetapi pilihan itu kosong apabila memanggilnya untuk kali kedua terjemah BlogIndexPage.
Membaca kod borang, pilihan medan locales ditetapkan secara dinamik dalam kaedah __init__, tempat tempat halaman yang telah diterjemahkan akan dialih keluar. Ini boleh menjadi sebab mengapa tempat itu kosong dalam panggilan kedua. Tetapi halaman itu belum diterjemahkan lagi!
Mari kita imbas kembali prosesnya:-
Dan di sinilah mentol lampu (?) masuk, selepas beberapa jam nyahpepijat. Dalam skrip asal, kami menterjemah HomePage ke ja dahulu, dan kemudian BlogIndexPage dengan semua anak-anaknya. Tetapi dalam skrip baru ini, halaman akar ialah BlogIndexPage. Jadi BlogIndexPage sudah menterjemah kali kedua kami memanggil translate_page!
Jadi itulah sebab pilihan tempat menjadi kosong.
Atas ialah kandungan terperinci Wagtail membuat terjemahan halaman secara pemrograman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!