"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > वैगटेल प्रोग्रामेटिक रूप से पेज अनुवाद बनाता है

वैगटेल प्रोग्रामेटिक रूप से पेज अनुवाद बनाता है

2024-11-08 को प्रकाशित
ब्राउज़ करें:385

Wagtail programmatically create page translation

मुझे पृष्ठ अनुवाद बनाने के लिए कोई प्रोग्रामेटिक इंटरफ़ेस नहीं मिल रहा है। सभी तर्क Wagtail.contrib.simple_translation.views में SubmitTranslationView में लागू किए जा रहे हैं।

इसलिए प्रोग्रामेटिक रूप से उन तक पहुंचने का एकमात्र तरीका दृश्यों तक पहुंचने के अनुरोध का अनुकरण करना है। मैंने इसे Translate_page() नामक फ़ंक्शन में लपेटा है। किसी पृष्ठ का अनुवाद करने के लिए, हम इस फ़ंक्शन को इस प्रकार कॉल कर सकते हैं:-

page_ja = translate_page(user, page, "ja")

या हम वैकल्पिक पैरामीटर include_subtree:-
पास कर सकते हैं

page_ja = translate_page(user, page, "ja", include_subtree=True)

और फ़ंक्शन को इस प्रकार परिभाषित किया गया है:-

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

मेरे पास Translate_snippet() नामक एक अन्य फ़ंक्शन है। एकमात्र अंतर केवल सबमिट करने के लिए यूआरएल का है और कोई include_subtree पैरामीटर नहीं है।

पेज ट्री गोचास

हमारी सभी साइटों के लिए, हमारे पास एक सेटअप स्क्रिप्ट है जो स्वचालित रूप से कुछ पोस्ट और उनके अनुवाद को पॉप्युलेट करेगी ताकि डेवलपर मैन्युअल रूप से नमूना पृष्ठ बनाने के बजाय तुरंत काम करना शुरू कर सके।

हमारी पेज संरचना इस प्रकार है:-

HomePage ==> BlogIndexPage ==> BlogPage

और सेटअप स्क्रिप्ट निम्नलिखित कार्य करेगी:-

  • रूट एडमिन यूजर बनाएं, चलिए इसे यूजर वन कहते हैं।
  • होमपेज का उदाहरण बनाएं
  • होमपेज को नए रूट पेज के रूप में संलग्न करें
  • होमपेज का जापानी अनुवाद बनाएं
  • BlogIndexPage का उदाहरण बनाएं
  • ब्लॉगपेज को नमूना पोस्ट से भरें और उन्हें BlogIndexPage के अंतर्गत संलग्न करें
  • BlogIndexPage का include_subtree=True के साथ अनुवाद करें

यह सब तब तक ठीक से काम करता है जब तक हम नई साइट स्थापित नहीं कर रहे हैं जहां पृष्ठ संरचना है:-

BlogIndexPage ==> BlogPage

इसलिए हमने होमपेज को छोड़ दिया (जो मुझे अब एक बुरा विचार लगता है लेकिन आइए इसे किसी अन्य विषय के लिए सहेजें) क्योंकि यह साइट मुख्य रूप से एक ब्लॉग है। सेटअप स्क्रिप्ट चलाने के बाद पहली बात जो मैंने नोटिस की, वह यह है कि ब्लॉग इंडेक्सपेज का अनुवाद करते समय हम पहले ही include_subtree पास कर चुके हैं, इसके बावजूद ब्लॉग पोस्ट का कोई अनुवाद नहीं किया गया।

मेरी पहली प्रतिक्रिया यह थी कि नए वैगटेल संस्करणों में कुछ बदलाव हो सकते हैं। हमारी अधिकांश साइटें कुछ साल पहले बनाई जा रही हैं और अभी भी वैगटेल 5 पर हैं, लेकिन इस नई साइट के लिए, हम वैगटेल 6 से शुरुआत करेंगे क्योंकि यह नवीनतम है।

लेकिन Simple_translation view.py के लिए वैगटेल के कमिट लॉग को देखने से पता चलता है कि कोड में आखिरी बदलाव तीन साल पहले हुआ था। और हम वैगटेल 5 और 6 के बीच कोड को मूल रूप से समान देख सकते हैं।

उपर्युक्त Translate_page फ़ंक्शन के साथ समस्या यह है कि यह किसी भी त्रुटि की जांच नहीं करता है। क्योंकि त्रुटियों को पकड़ने का मतलब है कि आपको कुछ त्रुटि स्ट्रिंग के लिए अनुरोध की प्रतिक्रिया को पार्स करना होगा। लेकिन कोड प्रवाह का पता लगाने से मैं एक ऐसे चरण पर पहुंच गया जहां मैं देख सकता हूं कि कोड निष्पादित नहीं हुआ है क्योंकि फॉर्म मान्य नहीं है।

प्रिंटिंग form.errors ने अमान्य लोकेल से संबंधित त्रुटि संदेश दिखाए। यह अजीब है क्योंकि हम ऊपर दिए गए Translate_page फ़ंक्शन में देख सकते हैं कि यदि यह अभी तक मौजूद नहीं है तो हम लोकेल बना रहे हैं।

और फॉर्म के self.fields["locales"].choices को प्रिंट कर रहा हूं, मुझे पता है कि रूट पेज का अनुवाद करते समय Translate_page() की पहली कॉल के दौरान विकल्प में लोकेल मौजूद था, लेकिन दूसरी बार कॉल करने पर विकल्प खाली था। BlogIndexPage का अनुवाद करें।

फॉर्म के कोड को पढ़ते हुए, लोकेशंस फ़ील्ड के विकल्पों को __init__ विधि में गतिशील रूप से सेट किया जाता है, जहां पहले से अनुवादित पृष्ठ का लोकेल हटा दिया जाएगा। यही कारण हो सकता है कि दूसरी कॉल में स्थान खाली था। लेकिन पेज का अभी तक अनुवाद नहीं किया गया है!

आइए इस प्रक्रिया को याद करें:-

  • BlogIndexPage बनाएं
  • BlogIndexPage को रूट पेज से जोड़ें
  • रूट पेज का अनुवाद ja
  • में करें
  • ब्लॉगपेज को पॉप्युलेट करें और उन्हें BlogIndexPage से जोड़ें
  • BlogIndexPage का अनुवाद ja
  • में करें

और यहीं पर घंटों डिबगिंग के बाद प्रकाश बल्ब (?) आया। मूल स्क्रिप्ट में, हम पहले HomePage को ja में अनुवाद कर रहे हैं, और फिर BlogIndexPage को उसके सभी बच्चों के साथ अनुवाद कर रहे हैं। लेकिन इस नई स्क्रिप्ट में, रूट पेज BlogIndexPage है। इसलिए BlogIndexPage का दूसरी बार अनुवाद हो चुका है, जिसे हम Translate_page कहते हैं!

तो यही कारण है कि स्थानों के विकल्प खाली हो जाते हैं।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/k4ml/wagtail-programmatically-create-page-translation-2814?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3