Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Wagtail membuat terjemahan halaman secara pemrograman

Wagtail membuat terjemahan halaman secara pemrograman

Linda Hamilton
Linda Hamiltonasal
2024-09-30 12:15:02381semak imbas

Wagtail programmatically create page translation

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.

Getcha pokok halaman

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:-

  • Buat pengguna pentadbir akar, mari kita panggil pengguna One.
  • Buat contoh Halaman Utama
  • Lampirkan Halaman Utama sebagai halaman akar baharu
  • Buat terjemahan Bahasa Jepun Halaman Utama
  • Buat contoh BlogIndexPage
  • Isi BlogPage dengan contoh siaran dan lampirkannya di bawah BlogIndexPage
  • Terjemah BlogIndexPage dengan include_subtree=True

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:-

  • Buat BlogIndexPage
  • Lampirkan BlogIndexPage ke halaman akar
  • Terjemah halaman akar kepada ja
  • Isi BlogPage dan lampirkan pada BlogIndexPage
  • Terjemah BlogIndexPage ke ja

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!

Kenyataan:
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