Python t-strings के साथ
पूरे संदेशों का अनुवाद¶
gettext-tstrings Python 3.14+ के t-strings को मानक gettext कैटलॉग और Babel
टूलिंग से जोड़ती है। Values और फ़ॉर्मैटिंग एप्लिकेशन कोड में ही रहती हैं;
अनुवादक पूरे संदेशों और सरल {name} placeholders के साथ काम करते हैं:
import gettext
from gettext_tstrings import Translator
_ = Translator(gettext.translation("messages", localedir="locales"))
name = "Ada"
print(_(t"Hello {name}")) # with a Japanese catalog: こんにちは Ada
कैटलॉग में Hello {name} रहता है। कोई अनुवाद {name} का स्थान बदल सकता है या
उसे दोहरा सकता है। अगर वह placeholder को हटा दे, उसका नाम बदल दे, या उसकी
फ़ॉर्मैटिंग बदल दे, तो कैटलॉग सत्यापन उस त्रुटि की सूचना देता है। और अगर कोई
अमान्य एंट्री फिर भी प्रोडक्शन तक पहुँच जाए, तो लाइब्रेरी क्रैश करने की बजाय
चेतावनी दर्ज करती है और स्रोत संदेश रेंडर करती है।
पाँच मिनट का ट्यूटोरियल शुरू करें विकल्पों से तुलना करें
Alpha · Python 3.14+ · मानक PO/MO कैटलॉग · कोई थर्ड-पार्टी रनटाइम निर्भरता नहीं
यह साइट वही करती है जो यह सिखाती है: हर भाषा संस्करण — नेविगेशन, लेबल,
और बहुवचन-सचेत बिल्ड रिपोर्ट — PO कैटलॉग से
gettext-tstrings द्वारा ही
रेंडर किया जाता है।
क्या यह आपके काम की है?¶
आज यह उपयुक्त है जब आपका एप्लिकेशन Python 3.14 या उससे नए पर चलता है; आप पहले से gettext और Babel का उपयोग करते हैं, या उनका PO/MO वर्कफ़्लो अपनाना चाहते हैं; और आपको नामित placeholders वाला t-string सिंटैक्स चाहिए जिनकी जाँच रेंडर होने से पहले हो जाए।
अभी उपयुक्त नहीं है जब आपको Python 3.13 या पुराना चाहिए; आपको स्थिर Python API चाहिए — यह एक alpha है, और विनिर्देश ही इसका वह हिस्सा है जो ठहर चुका है; या आपका लगभग सारा अनुवाद-योग्य टेक्स्ट Python स्रोत के बजाय किसी टेम्पलेट भाषा में रहता है।
पहले से कैटलॉग हैं? वे चलते रहेंगे। _("Hello {name}").format(name=name) और
tr(t"Hello {name}") एक ही msgid बनाते हैं, इसलिए मौजूदा अनुवाद इस बदलाव के
बाद भी बचे रहते हैं — माइग्रेशन पूरी प्रक्रिया समझाता है।
कैटलॉग क्या कह सकता है¶
कोई अनुवाद उस संदेश की संरचना नहीं बदल सकता जिसका वह अनुवाद कर रहा है। पूरा
वादा यही है, और इस साइट का बाक़ी सब कुछ इसी से निकलता है। अनुवाद {name} का
क्रम बदल सकता है या उसे दोहरा सकता है, और उसके आसपास का हर दूसरा शब्द फिर से
लिख सकता है। लेकिन वह placeholder को छोड़ नहीं सकता, नया गढ़ नहीं सकता, उसके
ज़रिए आपके ऑब्जेक्ट्स तक नहीं पहुँच सकता, और अपनी ओर से फ़ॉर्मैटिंग नहीं जोड़
सकता।
लाइब्रेरी इसकी जाँच अंदर आते समय करती है — जब कैटलॉग कंपाइल होते हैं — और फिर रेंडर के समय भी, और यही वह अंतर है जो समीक्षा में पकड़ी गई ग़लती और उपयोगकर्ता द्वारा पकड़ी गई ग़लती के बीच है।
gettext नया है? पूरा वर्कफ़्लो चार वाक्यों में
gettext सॉफ़्टवेयर के अनुवाद का मानक तरीका है, Python में और उससे
कहीं आगे भी। आपका कोड अनुवाद-योग्य संदेशों को मार्क करता है; एक
एक्सट्रैक्टर उन्हें एक टेम्पलेट फ़ाइल (.pot) में इकट्ठा करता है; एक
अनुवादक — जो प्रायः प्रोग्रामर नहीं होता — प्रति भाषा एक कैटलॉग फ़ाइल
(.po) भरता है, जो एक बाइनरी .mo में कंपाइल होती है और आपका
एप्लिकेशन उसे रनटाइम पर लोड करता है। अनुवाद फ़ंक्शन का पारंपरिक नाम _
है, इसलिए _(t"Hello {name}") को "इस संदेश का अनुवाद करो" की तरह पढ़ा
जाता है। ट्यूटोरियल पूरे रास्ते — मार्क, एक्सट्रैक्ट,
अनुवाद, कंपाइल, रन — को लगभग पाँच मिनट में तय कराता है।
यह जिस समस्या को हल करती है¶
कोई f-string किसी भी लाइब्रेरी तक पहुँचने से पहले ही इंटरपोलेट हो चुका होता
है — f"Hello {name}" तब तक "Hello Ada" बन चुका है, और value के आसपास के
टुकड़ों का अनुवाद अधिकांश भाषाओं का व्याकरण तोड़ देता है। एक t-string
(PEP 750) स्थिर टेक्स्ट, मूल्यांकित values, स्रोत एक्सप्रेशन, कन्वर्ज़न और
फ़ॉर्मैट स्पेक को अलग-अलग रखता है — और यही वह विभाजन है जिसकी संदेश कैटलॉग
को ज़रूरत होती है।
%(name)s, .format() और $-strings की तुलना में
इससे क्या बदलता है।
पर gettext या Babel में कहीं नहीं लिखा कि t-string संदेश कैसे बनता है। यह लाइब्रेरी वह चुनाव करती है, उसे एक संस्करणित विनिर्देश के रूप में दर्ज करती है, और उसकी जाँच के लिए कन्फ़ॉर्मन्स सुइट भी देती है।
डिज़ाइन के नियम¶
- हमेशा पूरे संदेशों का अनुवाद, वाक्य के टुकड़ों का कभी नहीं।
- केवल
{name}जैसे सरल वेरिएबल नाम स्वीकार किए जाते हैं। !rऔर:.2fएप्लिकेशन के नियंत्रण में रहते हैं, कैटलॉग से बाहर।- अनुवादों को ज्ञात placeholders का क्रम बदलने और उन्हें दोहराने की छूट, पर attributes तक पहुँचने या फ़ॉर्मैटिंग जोड़ने से रोक।
- साधारण POT, PO और MO फ़ाइलें, और उन्हें पहले से पढ़ने वाले टूल, ज्यों के त्यों पुन: उपयोग होते हैं।
और उसी के साथ वह सूची जिसे यह जान-बूझकर नहीं छूती: यह संख्याओं, मुद्राओं या तिथियों का स्थानीयकरण नहीं करती — उन्हें पहले फ़ॉर्मैट करें, Babel के साथ; यह रेंडर किए गए आउटपुट को HTML, शेल या टर्मिनल के लिए एस्केप नहीं करती; और यह नहीं आँक सकती कि कोई अनुवाद सही है या नहीं, केवल यह कि उसके placeholders बरकरार हैं या नहीं।
इंस्टॉल¶
Python 3.14 या नया चाहिए। रेंडरिंग की कोई निर्भरता नहीं है — वह मानक
लाइब्रेरी के gettext का उपयोग करती है, और कुछ नहीं।
एक्सट्रैक्शन और कैटलॉग सत्यापन Babel के ज़रिए चलते हैं, इसलिए यह extra
वहाँ इंस्टॉल करें जहाँ pybabel चलता है — आम तौर पर विकास या CI परिवेश,
प्रोडक्शन इमेज नहीं:
आगे कहाँ जाएँ¶
यहाँ से शुरू करें — gettext का कोई अनुभव अपेक्षित नहीं:
- ट्यूटोरियल — खाली डायरेक्टरी से चलते हुए जापानी अनुवाद तक पाँच चरणों में, हर कमांड अपने आउटपुट सहित।
- t-strings क्यों — एक ही संदेश चार तरीक़ों से लिखा
हुआ, और
%(name)s,.format()तथा$-strings कैटलॉग को क्या-क्या सौंप देते हैं।
इसका उपयोग — कामकाजी संदर्भ:
- गाइड — रनटाइम API: कौन-सा प्रवेश बिंदु चुनें, बहुवचन, प्रति-request भाषाएँ, deferred strings, और कैटलॉग ग़लत होने पर क्या होता है।
- एक्सट्रैक्शन —
pybabelसंदर्भ: कॉन्फ़िगरेशन, अपने फ़ंक्शन नाम, और मौजूदा टूल इन कैटलॉग को मुफ़्त में कैसे सत्यापित करते हैं। - प्रोडक्शन में — टीम द्वारा चलाया जाने वाला लूप: अपडेट चक्र, fuzzy एंट्रियाँ, CI गेट, अनुवाद प्लेटफ़ॉर्म, और शिपिंग।
- माइग्रेशन — जिस प्रोजेक्ट में पहले से कैटलॉग हैं उसमें इसे अपनाना, एक-एक कॉल साइट करके।
- अनुवादकों के लिए — एक पेज, जो
.poफ़ाइलें संपादित करने वाले को थमाया जा सके।
इसे समझना — इतिहास से क्रियान्वयन तक:
- पृष्ठभूमि — यह लाइब्रेरी क्यों मौजूद है: gettext के तीस साल, दो PEP, और stdlib की वह चर्चा जो बिना उत्तर के बंद हुई।
- नुकसानदेह जगहें — इस साइट का पैंतीस भाषाओं में अनुवाद करते समय असल में क्या-क्या टूटा, और उसका कौन-सा आधा हिस्सा कोई टूल पकड़ सकता है।
- यह कैसे काम करता है — PEP 750 के टेम्पलेट ऑब्जेक्ट से रेंडर की गई स्ट्रिंग तक, और वे कैश जो जाँच को सस्ता बनाते हैं।
संदर्भ — अनुबंध:
स्थिति¶
| पैकेज संस्करण | 0.1.0a8 |
| API स्थिरता | alpha — Python API अभी बदल सकती है |
| विनिर्देश | v1, कन्फ़ॉर्मन्स सुइट के साथ |
| Python | 3.14 और उससे नया; 3.14, 3.14t (free-threaded) और 3.15 पर परीक्षित |
| Babel | 2.18 या उससे नया, और केवल वहाँ जहाँ pybabel चलता है |
| रनटाइम निर्भरताएँ | कोई नहीं — मानक लाइब्रेरी का gettext |
| कैटलॉग प्रारूप | साधारण POT, PO और MO |
| परिवर्तन | CHANGELOG |
यह एक alpha है। अनुबंध जान-बूझकर छोटा रखा गया है और विनिर्देश उसका स्थिर हिस्सा है; Python API अभी बदल सकती है। स्थिर रिलीज़ से पहले इसे और भाषाओं के fixtures, निरंतर प्रदर्शन ट्रैकिंग, gettext और Babel के गंभीर उपयोगकर्ताओं से API समीक्षा, और हर समर्थित Python तथा Babel रिलीज़ पर संगतता परीक्षण चाहिए।
Issues और pull requests का स्वागत है — alpha ही वह समय है जब इंटरफ़ेस पर बहस करना सार्थक होता है।
समुदाय से जुड़ें¶
- किसी सीमित योगदान के लिए एक good first issue चुनें।
- उपयोग से जुड़े प्रश्न Q&A Discussions में पूछें।
- प्रोडक्शन के gettext वर्कफ़्लो और API सुझाव Ideas Discussions में लाएँ।
- Pull request खोलने से पहले योगदान गाइड पढ़ें।