Python 3.7

gettext - बहुभाषी अंतर्राष्ट्रीयकरण सेवाएं




python

gettext - बहुभाषी अंतर्राष्ट्रीयकरण सेवाएं

स्रोत कोड: Lib/gettext.py

gettext मॉड्यूल आपके पायथन मॉड्यूल और अनुप्रयोगों के लिए अंतर्राष्ट्रीयकरण (I18N) और स्थानीयकरण (L10N) सेवाएं प्रदान करता है। यह GNU gettext मैसेज कैटलॉग एपीआई और उच्च स्तर, क्लास-आधारित एपीआई दोनों का समर्थन करता है जो पायथन फाइलों के लिए अधिक उपयुक्त हो सकता है। नीचे वर्णित इंटरफ़ेस आपको अपने मॉड्यूल और एप्लिकेशन संदेशों को एक प्राकृतिक भाषा में लिखने की अनुमति देता है, और विभिन्न प्राकृतिक भाषाओं के तहत चलने के लिए अनुवादित संदेशों की एक सूची प्रदान करता है।

आपके पायथन मॉड्यूल और एप्लिकेशन को स्थानीय बनाने के कुछ संकेत भी दिए गए हैं।

जीएनयू गेटटेक्स्ट एपीआई

gettext मॉड्यूल निम्नलिखित एपीआई को परिभाषित करता है, जो जीएनयू गेटटेक्स्ट एपीआई के समान है। यदि आप इस API का उपयोग करते हैं तो आप विश्व स्तर पर अपने संपूर्ण एप्लिकेशन के अनुवाद को प्रभावित करेंगे। अक्सर यह वही है जो आप चाहते हैं कि यदि आपका एप्लिकेशन मोनोलिंगुअल है, तो आपके उपयोगकर्ता के लोकेल पर निर्भर भाषा की पसंद के साथ। यदि आप पायथन मॉड्यूल को स्थानीय कर रहे हैं, या यदि आपके एप्लिकेशन को फ़्लाई पर भाषाओं को स्विच करने की आवश्यकता है, तो आप संभवतः इसके बजाय क्लास-आधारित एपीआई का उपयोग करना चाहते हैं।

gettext.bindtextdomain(domain, localedir=None)

डोमेन को लोकल डायरेक्टरी लोकलडिर में बाँधें । अधिक localedir/language/LC_MESSAGES/domain.mo द्विआधारी .mo फ़ाइलों के लिए पथ (यूनिक्स पर) का उपयोग करके दिए गए डोमेन के लिए दिखेगा: localedir/language/LC_MESSAGES/domain.mo , जहाँ भाषाओं को पर्यावरण चर LC_MESSAGES , LC_ALL , LC_MESSAGES , और LC_MESSAGES में खोजा जाता है। क्रमशः।

यदि स्थानीयकृत को छोड़ दिया गया है या None , तो डोमेन के लिए वर्तमान बाध्यकारी वापस आ जाता है। [1]

gettext.bind_textdomain_codeset(domain, codeset=None)

डोमेन को lgettext() में lgettext() , lgettext() , ldgettext() , lngettext() और ldngettext() फ़ंक्शन द्वारा लौटे बाइट स्ट्रिंग्स के एन्कोडिंग को बदलते हुए। यदि कोडसेट को छोड़ दिया जाता है, तो वर्तमान बाइंडिंग वापस आ जाती है।

gettext.textdomain(domain=None)

वर्तमान वैश्विक डोमेन को बदलें या क्वेरी करें। यदि डोमेन None , तो वर्तमान वैश्विक डोमेन वापस आ जाता है, अन्यथा वैश्विक डोमेन डोमेन पर सेट होता है , जिसे वापस कर दिया जाता है।

gettext.gettext(message)

वर्तमान वैश्विक डोमेन, भाषा और स्थानीय निर्देशिका के आधार पर, संदेश का स्थानीय अनुवाद लौटाएं। इस कार्य को आमतौर पर स्थानीय नामस्थान में _() रूप में उतारा जाता है _() नीचे उदाहरण देखें)।

gettext.dgettext(domain, message)

gettext() , लेकिन निर्दिष्ट डोमेन में संदेश देखें।

gettext.ngettext(singular, plural, n)

gettext() , लेकिन बहुवचन रूपों पर विचार करें। यदि कोई अनुवाद पाया जाता है, तो बहुवचन सूत्र को n पर लागू करें, और परिणामी संदेश लौटाएं (कुछ भाषाओं में दो से अधिक बहुवचन रूप हैं)। यदि कोई अनुवाद नहीं मिला है, तो एकवचन लौटें यदि n 1 है; अन्यथा बहुवचन में लौटें।

बहुवचन सूत्र कैटलॉग हेडर से लिया गया है। यह एक सी या पायथन अभिव्यक्ति है जिसमें एक मुफ्त चर n है ; अभिव्यक्ति कैटलॉग में बहुवचन के सूचकांक का मूल्यांकन करती है। जीएनयू गेटटेक्स्ट डॉक्यूमेंट को सटीक। सिंटैक्स के लिए .po फ़ाइलों और विभिन्न भाषाओं के फ़ार्मुलों में उपयोग करने के लिए देखें।

gettext.dngettext(domain, singular, plural, n)

ngettext() , लेकिन निर्दिष्ट डोमेन में संदेश देखें।

gettext.lgettext(message)
gettext.ldgettext(domain, message)
gettext.lngettext(singular, plural, n)
gettext.ldngettext(domain, singular, plural, n)

l उपसर्ग ( dgettext() gettext() , dgettext() , ngettext() और dngettext() ) के बिना संबंधित कार्यों के समतुल्य, लेकिन अनुवाद को बाइट स्ट्रिंग के रूप में लौटाया जाता है जो पसंदीदा सिस्टम एन्कोडिंग में एन्कोडेड होता है अगर कोई अन्य एन्कोडिंग स्पष्ट रूप से सेट नहीं था bind_textdomain_codeset()

चेतावनी

पायथन 3 में इन कार्यों से बचा जाना चाहिए, क्योंकि वे एन्कोडेड बाइट्स लौटाते हैं। इसके बजाय विकल्प का उपयोग करना बेहतर है जो यूनिकोड स्ट्रिंग्स को बदले में देता है, क्योंकि अधिकांश पायथन एप्लिकेशन बाइट्स के बजाय मानव पठनीय पाठ को स्ट्रिंग्स के रूप में हेरफेर करना चाहते हैं। इसके अलावा, यह संभव है कि अनपेक्षित यूनिकोड से संबंधित अपवाद मिल सकते हैं यदि अनुवादित स्ट्रिंग्स के साथ एन्कोडिंग समस्याएं हैं। यह संभव है कि l*() फ़ंक्शंस को उनकी अंतर्निहित समस्याओं और सीमाओं के कारण भविष्य के पायथन संस्करणों में चित्रित किया जाएगा।

ध्यान दें कि GNU dcgettext() एक dcgettext() विधि को भी परिभाषित करता है, लेकिन इसे उपयोगी नहीं माना गया था और इसलिए इसे वर्तमान में लागू नहीं किया गया है।

यहाँ इस एपीआई के लिए विशिष्ट उपयोग का एक उदाहरण है:

import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))

क्लास-आधारित एपीआई

gettext मॉड्यूल का वर्ग-आधारित एपीआई आपको GNU गेटटेक्स्ट एपीआई की तुलना में अधिक लचीलापन और अधिक सुविधा देता है। यह आपके पायथन अनुप्रयोगों और मॉड्यूल को स्थानीय बनाने का अनुशंसित तरीका है। gettext एक "अनुवाद" वर्ग को परिभाषित करता है जो GNU .mo प्रारूप फ़ाइलों के पार्सिंग को लागू करता है, और इसमें लेयरिंग के लिए तरीके होते हैं। इस "अनुवाद" वर्ग के उदाहरण भी फ़ंक्शन _() रूप में अंतर्निहित नेमस्पेस में खुद को स्थापित कर सकते हैं।

gettext.find(domain, localedir=None, languages=None, all=False)

यह फ़ंक्शन मानक .mo फ़ाइल खोज एल्गोरिदम को लागू करता है। यह एक डोमेन लेता है, जो textdomain() समान है। वैकल्पिक स्थानीयकृत bindtextdomain में है bindtextdomain() वैकल्पिक भाषाएं स्ट्रिंग की एक सूची है, जहां प्रत्येक स्ट्रिंग एक भाषा कोड है।

यदि लोकलडेयर नहीं दिया जाता है, तो डिफ़ॉल्ट सिस्टम लोकेल डायरेक्टरी का उपयोग किया जाता है। [2] यदि भाषाएं नहीं दी जाती हैं, तो निम्न पर्यावरण चर खोजे जाते हैं: LANGUAGE , LC_ALL , LC_MESSAGES , और LANG । गैर-रिक्त मान लौटाने वाले पहले का उपयोग भाषाओं के चर के लिए किया जाता है। पर्यावरण चर में भाषाओं की एक बृहदान्त्र पृथक सूची होनी चाहिए, जो भाषा कोड स्ट्रिंग की अपेक्षित सूची का उत्पादन करने के लिए बृहदान्त्र पर विभाजित होगी।

find() तब भाषाओं का विस्तार और सामान्यीकरण करता है, और फिर उनके माध्यम से पुनरावृत्त करता है, इन घटकों से बनी एक मौजूदा फ़ाइल की खोज करता है:

localedir / language /LC_MESSAGES/ domain .mo

पहला ऐसा फ़ाइल नाम जो मौजूद है, जिसे ढूंढकर लौटाया गया find() । यदि ऐसी कोई फ़ाइल नहीं मिलती है, तो None भी वापस None जाता है। यदि सभी दिया जाता है, तो यह सभी फ़ाइल नामों की एक सूची देता है, जिस क्रम में वे भाषाओं की सूची या पर्यावरण चर में दिखाई देते हैं।

gettext.translation(domain, localedir=None, languages=None, class_=None, fallback=False, codeset=None)

डोमेन , लोकल , और भाषाओं के आधार पर Translations उदाहरण लौटाएं , जो संबद्ध .mo फ़ाइल पथों की सूची प्राप्त करने के लिए सबसे पहले find() लिए पास किए गए find() । समान .mo फ़ाइल नामों के साथ उदाहरण कैश्ड हैं। यदि उपलब्ध कराया गया है, तो वास्तविक वर्ग या तो वर्ग_ है , अन्यथा GNUTranslations । कक्षा के निर्माता को एक एकल फ़ाइल ऑब्जेक्ट तर्क लेना होगा। यदि प्रदान किया जाता है, तो lgettext() बदल दिए गए तार को lgettext() और lngettext() विधियों में अनुवादित स्ट्रिंग्स को एनकोड करने के लिए बदल देगा।

यदि कई फाइलें मिल जाती हैं, तो बाद की फाइलें पहले वाले के लिए कमियां के रूप में उपयोग की जाती हैं। फ़ॉलबैक सेट करने की अनुमति देने के लिए, कैश से प्रत्येक अनुवाद ऑब्जेक्ट को क्लोन करने के लिए copy.copy() का उपयोग किया जाता है; वास्तविक उदाहरण डेटा अभी भी कैश के साथ साझा किया गया है।

यदि कोई .mo फ़ाइल नहीं मिली है, तो यह फ़ंक्शन OSError उठाता है यदि फ़ॉलबैक गलत है (जो कि डिफ़ॉल्ट है), और NullTranslations उदाहरण देता है यदि फ़ॉलबैक सत्य है।

संस्करण 3.3 में परिवर्तित: IOError बजाय IOError उपयोग किया जाता था।

gettext.install(domain, localedir=None, codeset=None, names=None)

यह फ़ंक्शन _() को डोमेन , लोकल , और कोडसेट पर आधारित पायथन के निर्मित नामस्थान में स्थापित करता है, जो फ़ंक्शन translation()

नाम पैरामीटर के लिए, कृपया अनुवाद ऑब्जेक्ट का install() विधि का विवरण देखें।

जैसा कि नीचे देखा गया है, आप आमतौर पर अपने आवेदन में उन स्ट्रिंग को चिह्नित करते हैं जो अनुवाद के लिए उम्मीदवार हैं, उन्हें _() फ़ंक्शन के लिए कॉल में लपेटकर, इस तरह:

print(_('This string will be translated.'))

सुविधा के लिए, आप चाहते हैं कि पायथन के निर्मित नामस्थान में _() फ़ंक्शन इंस्टॉल हो, इसलिए यह आपके एप्लिकेशन के सभी मॉड्यूल में आसानी से उपलब्ध है।

NullTranslations वर्ग

अनुवाद कक्षाएं वे हैं जो वास्तव में मूल स्रोत फ़ाइल संदेश स्ट्रिंग के अनुवाद को अनुवादित संदेश स्ट्रिंग में लागू करते हैं। सभी अनुवाद वर्गों द्वारा उपयोग किया जाने वाला आधार वर्ग NullTranslations ; यह मूल इंटरफ़ेस प्रदान करता है जिसका उपयोग आप अपने स्वयं के विशेष अनुवाद वर्गों को लिखने के लिए कर सकते हैं। यहाँ NullTranslations की विधियाँ दी गई हैं:

class gettext.NullTranslations(fp=None)

एक वैकल्पिक फ़ाइल ऑब्जेक्ट fp लेता है, जिसे आधार वर्ग द्वारा अनदेखा किया जाता है। प्रारंभिक "संरक्षित" उदाहरण वैरिएबल _info और _charset को व्युत्पन्न करता है जो व्युत्पन्न वर्गों द्वारा निर्धारित किए जाते हैं, साथ ही _fallback , जो add_fallback() माध्यम से सेट किया जाता है। इसे तब self._parse(fp) यदि fp कोई None

_parse(fp)

आधार वर्ग में नो-ऑप्‍ड, यह विधि फ़ाइल ऑब्जेक्ट fp लेती है, और फ़ाइल से डेटा पढ़ती है, इसके संदेश कैटलॉग को इनिशियलाइज़ करती है। यदि आपके पास कोई असमर्थित संदेश कैटलॉग फ़ाइल स्वरूप है, तो आपको अपने स्वरूप को पार्स करने के लिए इस विधि को ओवरराइड करना चाहिए।

add_fallback(fallback)

वर्तमान अनुवाद ऑब्जेक्ट के लिए फ़ॉलबैक ऑब्जेक्ट के रूप में फ़ॉलबैक जोड़ें। यदि अनुवाद किसी दिए गए संदेश के लिए अनुवाद प्रदान नहीं कर सकता है, तो एक अनुवाद ऑब्जेक्ट को कमबैक से परामर्श करना चाहिए।

gettext(message)

यदि gettext() सेट किया गया है, तो फ़ॉलबैक के लिए gettext() को अग्रेषित करें। अन्यथा, संदेश वापस करें । व्युत्पन्न वर्गों में ओवरराइड।

ngettext(singular, plural, n)

यदि कोई फ़ॉलबैक सेट किया गया है, तो फ़ॉलबैक में ngettext() को अग्रेषित करें। अन्यथा, यदि एकवचन n 1 है तो लौटें; अन्यथा बहुवचन में लौटें। व्युत्पन्न वर्गों में ओवरराइड।

lgettext(message)
lngettext(singular, plural, n)

ngettext() gettext() और ngettext() बराबर, लेकिन पसंदीदा सिस्टम एन्कोडिंग में एन्कोडेड बाइट स्ट्रिंग के रूप में अनुवाद लौटाया जाता है यदि कोई एन्कोडिंग स्पष्ट रूप से set_output_charset() साथ सेट नहीं किया गया था। व्युत्पन्न वर्गों में ओवरराइड।

चेतावनी

पायथन में इन तरीकों से बचना चाहिए। 3. lgettext() फ़ंक्शन के लिए चेतावनी देखें।

info()

"संरक्षित" _info चर लौटें।

charset()

संदेश कैटलॉग फ़ाइल की एन्कोडिंग लौटें।

output_charset()

lgettext() और lngettext() में अनुवादित संदेशों को वापस करने के लिए उपयोग की गई एन्कोडिंग लौटें।

set_output_charset(charset)

अनुवादित संदेशों को वापस करने के लिए उपयोग की गई एन्कोडिंग को बदलें।

install(names=None)

यह विधि gettext() को अंतर्निहित नेमस्पेस में स्थापित करती है, इसे _ लिए बाध्य करती है।

यदि नाम पैरामीटर दिया जाता है, तो यह एक अनुक्रम होना चाहिए जिसमें उन कार्यों के नाम शामिल हों जिन्हें आप _() अलावा बिल्टइन नेमस्पेस में स्थापित करना चाहते हैं। समर्थित नाम 'ngettext' , 'lgettext' , 'lgettext' और 'lngettext'

ध्यान दें कि यह केवल एक ही तरीका है, यद्यपि आपके आवेदन के लिए _() फ़ंक्शन उपलब्ध कराने के लिए सबसे सुविधाजनक तरीका है। क्योंकि यह वैश्विक रूप से पूरे एप्लिकेशन को प्रभावित करता है, और विशेष रूप से अंतर्निहित नेमस्पेस, स्थानीयकृत मॉड्यूल को कभी भी _() स्थापित नहीं करना चाहिए। इसके बजाय, उन्हें अपने मॉड्यूल को _() उपलब्ध कराने के लिए इस कोड का उपयोग करना चाहिए:

import gettext
t = gettext.translation('mymodule', ...)
_ = t.gettext

यह केवल मॉड्यूल के वैश्विक नामस्थान में _() डालता है और इसलिए केवल इस मॉड्यूल के भीतर कॉल को प्रभावित करता है।

GNUTranslations वर्ग

NullTranslations मॉड्यूल NullTranslations : GNUTranslations से प्राप्त एक अतिरिक्त वर्ग प्रदान करता है। यह वर्ग जीएनयू गेटटेक्स्ट प्रारूप को पढ़ने में सक्षम करने के लिए _parse() को ओवरराइड करता है .mo बड़े-एंडियन और छोटे-एंडियन दोनों प्रारूप में .mo फाइलें।

GNUTranslations अनुवाद सूची से वैकल्पिक मेटा-डेटा को पार्स करता है। खाली स्ट्रिंग के लिए अनुवाद के रूप में मेटा-डेटा को शामिल करने के लिए यह जीएनयू गेटटेक्स्ट के साथ सम्मेलन है। यह मेटा-डेटा RFC 822 -स्टाइल key: value पेयर में है, और इसमें Project-Id-Version शामिल होना चाहिए। यदि कुंजी Content-Type पाया जाता है, तो "संरक्षित" _charset उदाहरण चर को आरंभ करने के लिए charset संपत्ति का उपयोग किया जाता है, यदि नहीं मिला है तो None डिफ़ॉल्ट है। यदि चारसेट एन्कोडिंग निर्दिष्ट किया गया है, तो कैटलॉग से पढ़े गए सभी संदेश आईडी और संदेश स्ट्रिंग को इस एन्कोडिंग का उपयोग करके यूनिकोड में बदल दिया जाता है, अन्यथा एएससीआईआई एन्कोडिंग मान लिया जाता है।

चूंकि संदेश आईडी को यूनिकोड के तारों के रूप में भी पढ़ा जाता है, इसलिए सभी *gettext() विधियाँ संदेश आईडी को यूनिकोड के तार के रूप में ग्रहण करेंगी, बाइट के तारों के रूप में नहीं।

कुंजी / मान जोड़े के पूरे सेट को एक शब्दकोश में रखा गया है और "संरक्षित" _info उदाहरण चर के रूप में सेट किया गया है।

यदि .mo फ़ाइल का मैजिक नंबर अमान्य है, तो प्रमुख संस्करण संख्या अनपेक्षित है, या यदि फ़ाइल को पढ़ते समय अन्य समस्याएं आती हैं, तो एक GNUTranslations वर्ग को तत्काल करना GNUTranslations बढ़ा OSError

class gettext.GNUTranslations

बेस क्लास कार्यान्वयन से निम्नलिखित विधियां ओवरराइड हैं:

gettext(message)

कैटलॉग में संदेश आईडी देखें और यूनिकोड स्ट्रिंग के रूप में संबंधित संदेश स्ट्रिंग लौटाएं। यदि संदेश आईडी के लिए कैटलॉग में कोई प्रविष्टि नहीं है, और एक फॉलबैक सेट किया गया है, तो लुक अप को फ़ॉलबैक के gettext() विधि में भेजा जाता है। अन्यथा, संदेश आईडी वापस आ गया है।

ngettext(singular, plural, n)

एक संदेश आईडी के बहुवचन-रूपों की खोज करें। एकवचन का उपयोग कैटलॉग में देखने के उद्देश्यों के लिए संदेश आईडी के रूप में किया जाता है, जबकि n का उपयोग यह निर्धारित करने के लिए किया जाता है कि किस बहुवचन का उपयोग करना है। लौटाया गया संदेश स्ट्रिंग एक यूनिकोड स्ट्रिंग है।

यदि संदेश आईडी कैटलॉग में नहीं मिली है, और एक फॉलबैक निर्दिष्ट किया गया है, तो अनुरोध को फ़ॉलबैक के ngettext() विधि में भेजा जाता है। अन्यथा, जब n 1 सिंगुलर होता है, और अन्य सभी मामलों में बहुवचन वापस आ जाता है।

यहाँ एक उदाहरण है:

n = len(os.listdir('.'))
cat = GNUTranslations(somefile)
message = cat.ngettext(
    'There is %(num)d file in this directory',
    'There are %(num)d files in this directory',
    n) % {'num': n}
lgettext(message)
lngettext(singular, plural, n)

ngettext() gettext() और ngettext() बराबर, लेकिन पसंदीदा सिस्टम एन्कोडिंग में एन्कोडेड बाइट स्ट्रिंग के रूप में अनुवाद लौटाया जाता है यदि कोई एन्कोडिंग स्पष्ट रूप से set_output_charset() साथ सेट नहीं किया गया था।

चेतावनी

पायथन में इन तरीकों से बचना चाहिए। 3. lgettext() फ़ंक्शन के लिए चेतावनी देखें।

सोलारिस संदेश कैटलॉग समर्थन

सोलारिस ऑपरेटिंग सिस्टम अपने स्वयं के द्विआधारी .mo फ़ाइल प्रारूप को परिभाषित करता है, लेकिन चूंकि इस प्रारूप पर कोई दस्तावेज़ीकरण नहीं पाया जा सकता है, इसलिए यह इस समय समर्थित नहीं है।

कैटलॉग निर्माता

GNOME जेम्स हेनस्ट्रिज द्वारा gettext मॉड्यूल के एक संस्करण का उपयोग करता है, लेकिन इस संस्करण में थोड़ा अलग एपीआई है। इसका प्रलेखित उपयोग था:

import gettext
cat = gettext.Catalog(domain, localedir)
_ = cat.gettext
print(_('hello world'))

इस पुराने मॉड्यूल के साथ संगतता के लिए, फ़ंक्शन Catalog() ऊपर वर्णित translation() फ़ंक्शन के लिए एक उपनाम है।

इस मॉड्यूल और हेनस्ट्रिज के बीच एक अंतर: उनकी कैटलॉग ऑब्जेक्ट्स ने मैपिंग एपीआई के माध्यम से पहुंच का समर्थन किया, लेकिन यह अप्रयुक्त प्रतीत होता है और इसलिए वर्तमान में समर्थित नहीं है।

अपने कार्यक्रमों और मॉड्यूल का अंतर्राष्ट्रीयकरण करना

अंतर्राष्ट्रीयकरण (I18N) उस ऑपरेशन को संदर्भित करता है जिसके द्वारा एक कार्यक्रम को कई भाषाओं से अवगत कराया जाता है। स्थानीयकरण (L10N) स्थानीय भाषा और सांस्कृतिक आदतों के लिए, एक बार अंतर्राष्ट्रीयकरण, आपके कार्यक्रम के अनुकूलन को संदर्भित करता है। अपने पायथन कार्यक्रमों के लिए बहुभाषी संदेश प्रदान करने के लिए, आपको निम्नलिखित कदम उठाने होंगे:

  1. ट्रांसलेटेबल स्ट्रिंग्स को विशेष रूप से चिह्नित करके अपना प्रोग्राम या मॉड्यूल तैयार करें
  2. कच्चे संदेश कैटलॉग उत्पन्न करने के लिए अपनी चिह्नित फ़ाइलों पर उपकरणों का एक सूट चलाएं
  3. संदेश कैटलॉग के भाषा विशिष्ट अनुवाद बनाएं
  4. gettext मॉड्यूल का उपयोग करें ताकि संदेश तार ठीक से अनुवादित हो

I18N के लिए अपना कोड तैयार करने के लिए, आपको अपनी फ़ाइलों के सभी स्ट्रिंग्स को देखना होगा। जिस भी स्ट्रिंग को अनुवादित करने की आवश्यकता है, उसे _('...') में लपेटकर चिह्नित किया जाना चाहिए - यानी फ़ंक्शन _() कॉल करें। उदाहरण के लिए:

filename = 'mylog.txt'
message = _('writing a log message')
fp = open(filename, 'w')
fp.write(message)
fp.close()

इस उदाहरण में, स्ट्रिंग 'writing a log message' को अनुवाद के लिए एक उम्मीदवार के रूप में चिह्नित किया गया है, जबकि तार 'mylog.txt' और 'w' नहीं हैं।

अनुवाद के लिए बने तारों को निकालने के लिए कुछ उपकरण हैं। मूल GNU गेटटेक्स्ट ने केवल C या C ++ सोर्स कोड का समर्थन किया है, लेकिन इसके विस्तारित संस्करण xgettext स्कैन कोड को पायथन सहित कई भाषाओं में लिखा है, अनुवाद योग्य के रूप में चिह्नित तार खोजने के लिए। Babel एक पायथन अंतर्राष्ट्रीयकरण पुस्तकालय है जिसमें संदेश कैटलॉग को निकालने और संकलित करने के लिए एक pybabel स्क्रिप्ट शामिल है। फ्रांस्वा पिनार्ड के कार्यक्रम जिसे एक्सपोट कहा जाता है, एक समान काम करता है और यह उसके पो-यूटल्स पैकेज के हिस्से के रूप में उपलब्ध है।

(पायथन में इन कार्यक्रमों के शुद्ध-पायथन संस्करण भी शामिल हैं, जिन्हें pygettext.py और msgfmt.py कहा जाता है; कुछ Python वितरण उन्हें आपके लिए स्थापित करेंगे। pygettext.py xgettext के समान है, लेकिन केवल पायथन स्रोत कोड को समझता है और अन्य प्रोग्रामिंग भाषाओं को नहीं संभाल सकता है। जैसे कि C या C ++। pygettext.py, xgettext के समान कमांड-लाइन इंटरफ़ेस का समर्थन करता है, इसके उपयोग के विवरण के लिए, pygettext.py --help चलाएँ। msgfmt.py , GNU msgftt के साथ द्विआधारी संगत है। इन दो कार्यक्रमों के साथ, आप कर सकते हैं। अपने पायथन एप्लिकेशन को अंतर्राष्ट्रीय बनाने के लिए GNU गेटटेक्स्ट पैकेज की आवश्यकता नहीं है।)

xgettext , pygettext , और इसी तरह के उपकरण .po फाइलें उत्पन्न करते हैं जो संदेश कैटलॉग हैं। वे मानव-पठनीय फ़ाइलें हैं जो स्रोत कोड में प्रत्येक चिह्नित स्ट्रिंग के साथ-साथ इन स्ट्रिंग्स के अनुवादित संस्करणों के लिए एक प्लेसहोल्डर हैं।

इन .po फ़ाइलों की प्रतियां तब व्यक्तिगत मानव अनुवादकों को सौंप दी जाती हैं जो हर समर्थित प्राकृतिक भाषा के लिए अनुवाद लिखते हैं। वे पूर्ण भाषा-विशिष्ट संस्करणों को <language-name>.po फ़ाइल के रूप में वापस भेजते हैं, जो कि मशीन-पठनीय .mo बाइनरी कैटलॉग फ़ाइल में संकलित की जाती है, जो msgfmt प्रोग्राम का उपयोग करती है। .mo फाइलें रन-टाइम में वास्तविक अनुवाद प्रसंस्करण के लिए gettext मॉड्यूल द्वारा उपयोग की जाती हैं।

आप अपने कोड में gettext मॉड्यूल का उपयोग कैसे करते हैं, यह इस बात पर निर्भर करता है कि क्या आप किसी एकल मॉड्यूल या आपके संपूर्ण अनुप्रयोग का अंतर्राष्ट्रीयकरण कर रहे हैं। अगले दो खंड प्रत्येक मामले पर चर्चा करेंगे।

अपने मॉड्यूल को स्थानीय बनाना

यदि आप अपने मॉड्यूल का स्थानीयकरण कर रहे हैं, तो आपको ध्यान रखना चाहिए कि वैश्विक परिवर्तन न करें, जैसे अंतर्निहित नेमस्पेस। आपको जीएनयू gettext एपीआई का उपयोग नहीं करना चाहिए, बल्कि क्लास-आधारित एपीआई का उपयोग करना चाहिए।

मान लें कि आपके मॉड्यूल को "स्पैम" और मॉड्यूल की विभिन्न प्राकृतिक भाषा अनुवाद कहा जाता है। GNU गेटटेक्स्ट प्रारूप में /usr/share/locale में .mo फाइलें रहती हैं। यहाँ आप अपने मॉड्यूल के शीर्ष पर क्या रखा जाएगा:

import gettext
t = gettext.translation('spam', '/usr/share/locale')
_ = t.gettext

अपने आवेदन को स्थानीय बनाना

यदि आप अपने एप्लिकेशन को स्थानीय कर रहे हैं, तो आप विश्व स्तर पर अंतर्निहित नेमस्पेस में _() फ़ंक्शन को स्थापित कर सकते हैं, आमतौर पर आपके एप्लिकेशन के मुख्य ड्राइवर फ़ाइल में। यह आपकी सभी एप्लिकेशन-विशिष्ट फ़ाइलों को स्पष्ट रूप से प्रत्येक फ़ाइल में स्थापित किए बिना _('...') उपयोग करने देगा।

साधारण मामले में, आपको अपने एप्लिकेशन के मुख्य ड्राइवर फ़ाइल में केवल निम्न कोड को जोड़ना होगा:

import gettext
gettext.install('myapplication')

यदि आपको स्थानीय निर्देशिका सेट करने की आवश्यकता है, तो आप इसे install() फ़ंक्शन में पास कर सकते हैं:

import gettext
gettext.install('myapplication', '/usr/share/locale')

मक्खी पर भाषा बदलना

यदि आपके कार्यक्रम को एक ही समय में कई भाषाओं का समर्थन करने की आवश्यकता है, तो आप कई अनुवाद उदाहरण बनाना चाहते हैं और फिर उनके बीच स्पष्ट रूप से स्विच कर सकते हैं, जैसे:

import gettext

lang1 = gettext.translation('myapplication', languages=['en'])
lang2 = gettext.translation('myapplication', languages=['fr'])
lang3 = gettext.translation('myapplication', languages=['de'])

# start by using language1
lang1.install()

# ... time goes by, user selects language 2
lang2.install()

# ... more time goes by, user selects language 3
lang3.install()

आस्थगित अनुवाद

अधिकांश कोडिंग स्थितियों में, स्ट्रिंग्स का अनुवाद किया जाता है जहां उन्हें कोडित किया जाता है। हालांकि कभी-कभी, आपको अनुवाद के लिए तार को चिह्नित करने की आवश्यकता होती है, लेकिन बाद में वास्तविक अनुवाद को स्थगित कर दें। एक क्लासिक उदाहरण है:

animals = ['mollusk',
           'albatross',
           'rat',
           'penguin',
           'python', ]
# ...
for a in animals:
    print(a)

यहां, आप animals सूची में तार को अनुवाद करने योग्य के रूप में चिह्नित करना चाहते हैं, लेकिन आप वास्तव में उन्हें तब तक अनुवाद नहीं करना चाहते जब तक वे मुद्रित नहीं होते।

यहाँ एक तरीका है जिससे आप इस स्थिति को संभाल सकते हैं:

def _(message): return message

animals = [_('mollusk'),
           _('albatross'),
           _('rat'),
           _('penguin'),
           _('python'), ]

del _

# ...
for a in animals:
    print(_(a))

यह काम करता है क्योंकि _() की डमी परिभाषा केवल स्ट्रिंग को अपरिवर्तित लौटाती है। और यह डमी परिभाषा अंतर्निहित नेमस्पेस ( del कमांड) तक _() की किसी भी परिभाषा को अस्थायी रूप से ओवरराइड करेगी। ध्यान रखें, यदि आपके पास स्थानीय नामस्थान में _() की पिछली परिभाषा है।

ध्यान दें कि गेट के प्रोग्राम के लिए अनुवाद योग्य होने के कारण _() का दूसरा उपयोग "ए" की पहचान नहीं करेगा, क्योंकि पैरामीटर एक स्ट्रिंग शाब्दिक नहीं है।

इसे संभालने का दूसरा तरीका निम्नलिखित उदाहरण के साथ है:

def N_(message): return message

animals = [N_('mollusk'),
           N_('albatross'),
           N_('rat'),
           N_('penguin'),
           N_('python'), ]

# ...
for a in animals:
    print(_(a))

इस स्थिति में, आप फ़ंक्शन N_() साथ अनुवाद योग्य स्ट्रिंग को चिह्नित कर रहे हैं, जो _() की किसी भी परिभाषा के साथ संघर्ष नहीं करेगा। हालाँकि, आपको अपने संदेश निष्कर्षण कार्यक्रम को N_() के साथ चिह्नित अनुवाद योग्य स्ट्रिंग को देखने के लिए सिखाने की आवश्यकता होगी। xgettext , pygettext , pybabel extract , और xpot सभी इसे -k कमांड-लाइन स्विच के उपयोग के माध्यम से समर्थन करते हैं। यहां N_() का चुनाव पूरी तरह से मनमाना है; यह आसानी से MarkThisStringForTranslation()

स्वीकृतियाँ

निम्नलिखित लोगों ने इस मॉड्यूल के निर्माण में कोड, फीडबैक, डिज़ाइन सुझाव, पिछले कार्यान्वयन और बहुमूल्य अनुभव का योगदान दिया:

  • पीटर फंक
  • जेम्स हेनस्ट्रिज
  • जुआन डेविड इब्नेज़ पालोमर
  • मार्क-एंड्रे लेम्बर्ग
  • मार्टिन वॉन लोविस
  • फ्रांकोइस पिनार्ड
  • बैरी वारसॉ
  • गुस्तावो नीमेयर

फुटनोट

[1] डिफ़ॉल्ट लोकेल निर्देशिका सिस्टम निर्भर है; उदाहरण के लिए, RedHat Linux पर यह /usr/share/locale , लेकिन Solaris पर यह /usr/lib/locale gettext मॉड्यूल इन सिस्टम पर निर्भर चूक का समर्थन करने की कोशिश नहीं करता है; इसके बजाय इसका डिफ़ॉल्ट sys.prefix/share/locale । इस कारण से, आपके एप्लिकेशन की शुरुआत में एक स्पष्ट निरपेक्ष पथ के साथ bindtextdomain() को कॉल करना सबसे अच्छा है।
[2] ऊपर bindtextdomain() लिए फ़ुटनोट देखें।