DOCX अनुवाद बोल्डफेस क्यों खो देता है? पहले रन रखें, और फिर पूरे अनुभाग को बदलने के बारे में बात करें।
अनुवाद के बाद DOCX बोल्ड और इटैलिक खो गया? समस्या शायद यह है कि पूरा खंड बदल दिया गया है और रन बह गया है। यह आलेख रन फॉर्मेट को एक-एक करके सहेजने के लिए पायथन-डॉक्स का उपयोग करता है, और सहेजने के बाद इसे दोबारा पढ़ता है और स्वीकार करता है। यदि इसका सामना किसी जटिल संरचना से होता है या खंड मेल नहीं खाता है, तो यह सीधे इसे बदलने से इनकार कर देगा।
DOCX अनुवाद के बाद बोल्डनेस, इटैलिक और फ़ॉन्ट आकार खो जाते हैं। सामान्य कारण यह है कि अनुच्छेद सामग्री को सीधे संपूर्ण पाठ से बदल दिया जाता है, जो मूल रन-लेवल प्रारूप को नष्ट कर देता है। कई टीमों द्वारा अनुवाद प्राप्त करने के बाद, एक आम प्रतिक्रिया यह होती है कि वर्ड में जोर प्रारूप गायब है। यह आलेख उन डेवलपर्स के लिए उपयुक्त है जो DOCX को संसाधित करने के लिए Python-docx का उपयोग करते हैं, साथ ही उन संपादकों के लिए जिन्हें द्विभाषी दस्तावेज़ वितरित करने की आवश्यकता होती है।
ऐसा लगता है कि वर्ड में एक पैराग्राफ में केवल एक वाक्य होता है, लेकिन DOCX में यह कई रन से बना हो सकता है: साधारण टेक्स्ट, ज़ोर दिया गया टेक्स्ट, फ़ॉन्ट आकार में बदलाव, और हाइपरलिंक और अन्य संरचनाएं जो सामान्य रन सूची से संबंधित नहीं हैं। इसे पढ़ने के बाद, आपको पता चल जाएगा कि समस्या आम तौर पर कहां होती है, अनुवादों को एक-एक करके कैसे लिखना है, और कब आपको स्वचालित प्रतिस्थापन को अस्वीकार कर देना चाहिए।
यदि अनुवाद के बाद DOCX का प्रारूप खो जाता है तो मुझे क्या करना चाहिए? एक वाक्य का निष्कर्ष
पहले प्रसंस्करण को केवल सामान्य पाठ रन पैराग्राफ तक सीमित रखें, मूल रन अनुक्रम संख्या के अनुसार अनुवाद को एक-एक करके वापस लिखें, इसे सहेजें और स्वीकृति के लिए इसे फिर से पढ़ें; यदि यह एक जटिल संरचना का सामना करता है या खंड मेल नहीं खाता है, तो सीधे प्रतिस्थापन को अस्वीकार कर दें।
| आपकी स्थिति | अनुशंसित प्रथाएँ | कारण |
|---|---|---|
| अनुच्छेदों में केवल सामान्य पाठ चलता है | रन अनुक्रम संख्या के अनुसार अनुवादों को एक-एक करके वापस लिखें | प्रत्येक रन के लिए प्रारूप सीमाएँ संरक्षित हैं |
| पैराग्राफ में हाइपरलिंक, चित्र, फ़ील्ड, लाइन ब्रेक या टैब होते हैं | स्पष्ट रूप से मना करें और विशेष प्रक्रिया में स्थानांतरित करें | कोड इन तत्वों को चुपचाप समतल नहीं करता है |
| अनुवाद खंडों की संख्या या क्रम मूल रन के साथ असंगत है | मौजूदा रनों पर ज़ोर देने के बजाय, पुन: स्वरूपण रणनीतियों या मैन्युअल समीक्षा का उपयोग करें | जबरन पत्राचार प्रारूप को बाधित करेगा |
| राइट बैक परिणाम की पुष्टि करने की आवश्यकता है | सेव करने के बाद फाइल को दोबारा खोलें और इसे स्वीकार करें। | स्मृति में केवल वस्तुओं की जाँच करने से बचें |
paragraph.text को सीधे मान निर्दिष्ट करें | प्रयोग करने से बचें | पैराग्राफ की मौजूदा सामग्री को नए टेक्स्ट से बदल दिया जाएगा, और रन-लेवल फ़ॉर्मेटिंग स्वचालित रूप से बरकरार नहीं रखी जाएगी। |
समस्या कहां है: पूरे पैराग्राफ को बदलने से रन फॉर्मेट ख़त्म हो जाएगा
paragraph.text को सीधे मान निर्दिष्ट करने से पैराग्राफ की मौजूदा सामग्री नए पाठ से बदल जाएगी। पैराग्राफ-स्तरीय शैलियों को बरकरार रखा जा सकता है, लेकिन मूल रन-स्तरीय स्वरूपण स्वचालित रूप से बरकरार नहीं रखा जाएगा। यह व्यवहार पायथन-डॉक्स टेक्स्ट एपीआई में स्पष्ट रूप से प्रलेखित है।
अनुवाद परिणाम सटीक दिखता है, लेकिन प्रारूप पूरी तरह से ख़त्म हो गया है। शायद यही कारण है.
आवेदन का दायरा: प्रारूप संरक्षित है, लेकिन इसका मतलब यह नहीं है कि अन्य समस्याएं हल हो गई हैं।
इस आलेख के परीक्षण रिकॉर्ड स्थानीय रूप से संश्लेषित DOCX से आते हैं, टाइपसेटिंग इंजन स्क्रीनशॉट से नहीं। यह जो हल करता है वह है "प्रारूप खोए बिना विवश प्रतिस्थापन"। यह स्वचालित रूप से क्रॉस-भाषा सिंटैक्स पुनर्व्यवस्था को हल नहीं करता है, न ही यह सुनिश्चित करता है कि अनुवाद के बाद पेजिंग अपरिवर्तित रहे।
पहले उस सीमा को सीमित करें जिसे सुरक्षित रूप से संशोधित किया जा सकता है
यह संक्षिप्त उदाहरण केवल सादे पाठ वाले पैराग्राफ को स्वीकार करता है। जब किसी पैराग्राफ में हाइपरलिंक, चित्र, फ़ील्ड, लाइन ब्रेक, टैब या अन्य जटिल XML नोड होते हैं, तो इसे स्पष्ट रूप से अस्वीकार करें और कॉल करने वाले को एक विशेष प्रक्रिया पर पुनर्निर्देशित करें। कोड इन तत्वों को चुपचाप समतल नहीं करेगा।
अनुवाद इनपुट स्ट्रिंग्स की एक मनमानी सूची नहीं है: प्रत्येक परिणाम में मूल रन की क्रम संख्या होनी चाहिए, और संशोधन शुरू होने से पहले संख्या, क्रम और प्रकार सभी का मिलान होना चाहिए। आधे अद्यतन के बाद बाद के क्षेत्रों में समस्याओं की खोज से बचने के लिए सत्यापन को लिखने से पहले रखा जाता है।
एक न्यूनतम परीक्षण जिसे बार-बार चलाया जा सकता है
परीक्षण वातावरण python-docx==1.2.0 है। यहां अंग्रेजी हस्तलिखित निश्चित तुलना से आती है, जिसका उपयोग संरचना को सत्यापित करने के लिए किया जाता है और मशीनी अनुवाद का आह्वान नहीं किया जाता है।
from docx import Document
from docx.oxml.ns import qn
def replace_plain_runs(paragraph, translated):
if any(child.tag not in {qn("w:pPr"), qn("w:r")}
for child in paragraph._p):
raise ValueError("paragraph contains unsupported structures")
runs = paragraph.runs
for run in runs:
if any(child.tag not in {qn("w:rPr"), qn("w:t")}
for child in run._r):
raise ValueError("run contains a field, image or control")
if len(translated) != len(runs):
raise ValueError("segment count mismatch")
for index, item in enumerate(translated):
if (not isinstance(item, dict) or item.get("id") != index
or not isinstance(item.get("text"), str)
or any(ch in item["text"] for ch in "\t\r\n")):
raise ValueError("segment identity or text mismatch")
for run, item in zip(runs, translated):
run.text = item["text"]
def signature(paragraph):
return [(r.text, r.bold, r.italic) for r in paragraph.runs]
doc = Document()
p = doc.add_paragraph()
p.add_run("请在 ")
p.add_run("周五之前").bold = True
p.add_run(" 提交报告。")
before = signature(p)
try:
replace_plain_runs(p, [{"id": 0, "text": "Incomplete"}])
raise AssertionError("bad segments accepted")
except ValueError:
assert signature(p) == before
replace_plain_runs(p, [
{"id": 0, "text": "Submit the report "},
{"id": 1, "text": "before Friday"},
{"id": 2, "text": "."},
])
doc.save("translated-runs.docx")
restored = Document("translated-runs.docx").paragraphs[0]
assert restored.text == "Submit the report before Friday."
assert restored.runs[1].bold is True
assert len(restored.runs) == 3
complex_p = doc.add_paragraph("keep")
complex_p.runs[0].add_break()
try:
replace_plain_runs(complex_p, [{"id": 0, "text": "reject"}])
raise AssertionError("line break accepted")
except ValueError:
assert complex_p.text == "keep\n"
print("PASS count mismatch: no partial write")
print("PASS save/reopen: 3 runs, emphasis preserved")
print("PASS unsupported control: rejected")
print(signature(restored))
सहेजने के बाद, translated-runs.docx को फिर से खोलें और फिर मेमोरी में केवल ऑब्जेक्ट की जाँच करने से बचने के लिए इसे स्वीकार करें।
अनुवादक को प्रत्येक रन व्यक्तिगत रूप से क्यों नहीं दिया जाता?
रन एक प्रारूप सीमा है, अर्थ संबंधी सीमा नहीं। Word का संपादन इतिहास किसी शब्द को एकाधिक रन में भी विभाजित कर सकता है। पृथक अनुवाद संदर्भ खो देंगे; विभिन्न भाषाओं का शब्द क्रम भी वाक्य के आरंभ या अंत पर जोर दे सकता है।
वास्तविक अनुवाद पीढ़ी को संपूर्ण खंडों के रूप में संदर्भ प्रदान करना चाहिए और फिर मान्य संरचित खंड लौटाना चाहिए। जब लौटाया गया परिणाम मूल लंबाई के समान नहीं है, तो इसे मौजूदा रन में बाध्य न करें। एक स्पष्ट पुन: स्वरूपण रणनीति या मैन्युअल समीक्षा की आवश्यकता है। इस आलेख में सरल उदाहरण केवल तीन टुकड़े रख सकता है, लेकिन इसे सभी भाषाओं में सामान्यीकृत नहीं किया जा सकता है।
स्वीकृति को तीन स्तरों में विभाजित करें
| स्तर | सामग्री की जाँच करें | क्या यह लेख कवर करता है |
|---|---|---|
| डेटा संरचना | सेव करने के बाद मात्रा, ऑर्डर, बोल्ड हस्ताक्षर और पुनर्प्राप्ति चलाएँ | इस प्रतिबंधित उदाहरण को ओवरराइड करें |
| अर्थपूर्ण सामग्री | शर्तें, नकारात्मक शब्द, तिथियां, मात्राएं, चूक | शामिल नहीं किया हुआ; स्वतंत्र प्रूफरीडिंग की आवश्यकता है |
| दृश्य लेआउट | फ़ॉन्ट रोलबैक, लाइन ब्रेक, पेज नंबर, टेबल ओवरफ्लो | शामिल नहीं किया हुआ; इसे पुनः प्रस्तुत और जाँचने की आवश्यकता है |
_p और _r आंतरिक गुण हैं जिनका उपयोग यहां XML की जांच के लिए किया जाता है। Python-docx को अपग्रेड करते समय, आपको संस्करण को ठीक करना होगा और परीक्षण को फिर से चलाना होगा। आप यह नहीं मान सकते कि आंतरिक संरचना कभी नहीं बदलेगी। जब आपको तालिकाओं, शीर्षलेखों, पादलेखों, पाठ बक्सों और संशोधन अंशों को संसाधित करने की आवश्यकता होती है, तो आपको सामग्री श्रेणियों की अलग से गणना भी करनी होगी, क्योंकि document.paragraphs दस्तावेज़ में सभी पाठ का प्रतिनिधित्व नहीं कर सकता है।
डिलीवरी से पहले रुकने की स्थिति
असमर्थित संरचनाएं, बेमेल खंड, गायब फ़ॉन्ट, महत्वपूर्ण फ़ील्ड में परिवर्तन, इनमें से किसी को भी स्वचालित वितरण को रोकना चाहिए। मूल फ़ाइल को केवल पढ़ने के लिए सहेजें, एक नई फ़ाइल में अनुवाद लिखें, और भाषा, प्रसंस्करण संस्करण और मैन्युअल स्वीकृति रिकॉर्ड संलग्न करें। यह "सफलतापूर्वक सहेजें" की तुलना में गुणवत्ता का बेहतर संकेतक है।
यदि आपको दस्तावेज़ अपलोड करने से लेकर अनुवाद और समीक्षा प्रक्रिया तक जाने की आवश्यकता है, तो आप ओमनीडॉक उत्पाद पोर्टल देख सकते हैं। इस आलेख में कोड उदाहरण स्वतंत्र ओपन सोर्स लाइब्रेरी शिक्षण नमूने हैं और ओमनीडॉक के वर्तमान आयातक या लेआउट इंजन के कार्यान्वयन का प्रतिनिधित्व नहीं करते हैं। केवल एक ही मूल सिद्धांत है: प्रारूप को अनुवादित बोनस के बजाय स्वीकार किए जाने वाले डेटा के रूप में मानें।
📊 कोर तुलना
| अभ्यास | मुख्य जोखिम | लेख में दिए गए सुझाव |
|---|---|---|
paragraph.text को सीधे मान निर्दिष्ट करें | रन-स्तरीय स्वरूपण स्वचालित रूप से संरक्षित नहीं है | उन अनुच्छेदों के लिए उपयोग नहीं किया जाता है जिन्हें फ़ॉर्मेटिंग को संरक्षित करने की आवश्यकता होती है |
| एक-एक करके पृथक अनुवाद चलाएँ | संदर्भ खो गया है, शब्द क्रम में परिवर्तन से जोर हट सकता है | संपूर्ण खंडों के रूप में संदर्भ प्रदान करें |
| संपूर्ण खंड का अनुवाद हो जाने के बाद, इसे सत्यापित करने और वापस लिखने के लिए रन दबाएँ। | यदि लौटाया गया परिणाम मूल रन के बराबर लंबाई का नहीं है, तो इसका मिलान करना कठिन नहीं हो सकता है। | इसके बजाय पुन: स्वरूपण रणनीति या मैन्युअल समीक्षा का उपयोग करें |
🎯कौन सा तरीका आपके लिए उपयुक्त है?
यदि आपके पैराग्राफ में केवल सामान्य टेक्स्ट चलता है
इस आलेख में न्यूनतम उदाहरण के अनुसार, पहले क्रम संख्या, मात्रा, क्रम और प्रकार को सत्यापित करें, फिर एक-एक करके लिखें, सहेजें और स्वीकृति के लिए दोबारा पढ़ें।
यदि आपके पैराग्राफ में हाइपरलिंक, फ़ील्ड या चित्र हैं
स्वचालित प्रतिस्थापन को सीधे अस्वीकार करें और इसे एक विशेष प्रक्रिया में स्थानांतरित करें। कोड इन संरचनाओं को चुपचाप समतल नहीं करता है।
यदि आप औपचारिक द्विभाषी दस्तावेज़ वितरित कर रहे हैं
मूल फ़ाइल को केवल पढ़ने के लिए सहेजें, एक नई फ़ाइल में अनुवाद लिखें, और भाषा, प्रसंस्करण संस्करण और मैन्युअल स्वीकृति रिकॉर्ड संलग्न करें। गुम फ़ॉन्ट, महत्वपूर्ण फ़ील्ड में परिवर्तन, बेमेल खंड, आदि सभी को स्वचालित वितरण को रोकना चाहिए।
❓ अक्सर पूछे जाने वाले प्रश्न (FAQ)
1. यदि आप सीधे पैराग्राफ.टेक्स्ट को कोई मान निर्दिष्ट करते हैं तो क्या बोल्डनेस खत्म हो जाएगी?
बैठक। पैराग्राफ-स्तरीय शैलियों को बरकरार रखा जा सकता है, लेकिन मूल रन-स्तरीय स्वरूपण स्वचालित रूप से बरकरार नहीं रखा जाएगा।
2. अनुवादक को प्रत्येक रन व्यक्तिगत रूप से क्यों नहीं दिया जाता?
रन सिमेंटिक सीमा के बजाय एक प्रारूप सीमा है। एक-एक करके अलग-अलग अनुवाद करने से संदर्भ खो जाएगा और विभिन्न भाषाओं का शब्द क्रम भी वाक्य के आरंभ या अंत पर जोर दे सकता है।
3. क्या सफलतापूर्वक सहेजने का मतलब यह है कि प्रारूप ठीक है?
नही सकता। फ़ाइल स्वीकृति डेटा संरचनाओं को सहेजने के बाद फिर से खोला जाना चाहिए; सिमेंटिक सामग्री और दृश्य लेआउट को अलग से जांचने की आवश्यकता है।
4. Python-docx को अपग्रेड करते समय मुझे क्या ध्यान देना चाहिए?
कोड _p और _r के आंतरिक गुणों का उपयोग करता है। आपको संस्करण को ठीक करना होगा और परीक्षण फिर से चलाना होगा। आप यह नहीं मान सकते कि आंतरिक संरचना कभी नहीं बदलेगी।
📝सारांश
केवल एक ही मूल सिद्धांत है: प्रारूप को अनुवादित बोनस के बजाय स्वीकार किए जाने वाले डेटा के रूप में मानें। इस आलेख में कोड उदाहरण स्वतंत्र ओपन सोर्स लाइब्रेरी शिक्षण नमूने हैं और ओमनीडॉक के वर्तमान आयातक या लेआउट इंजन के कार्यान्वयन का प्रतिनिधित्व नहीं करते हैं।
इसे अभी आज़माएं: मूल लेआउट को बरकरार रखते हुए अनुवाद शुरू करने के लिए दस्तावेज़ अपलोड करें


