C++ में अंतर्राष्ट्रीयकरण (i18n): पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में अंतर्राष्ट्रीयकरण (i18n): बुनियादी से उन्नत तकनीकों तक



अंतर्राष्ट्रीयकरण (संक्षेप में i18n — अंग्रेजी के "internationalization" से, जहाँ 18 पहले 'i' और अंतिम 'n' के बीच के अक्षरों की संख्या को दर्शाता है) — सॉफ्टवेयर को इस प्रकार डिज़ाइन करने की प्रक्रिया है कि इसे कोड में बदलाव किए बिना विभिन्न भाषाओं और क्षेत्रीय विशेषताओं के अनुकूल बनाया जा सके। C++ में, इस कार्य की अपनी विशिष्टता है: भाषा अनुवाद के साथ काम करने के लिए अंतर्निहित साधन प्रदान नहीं करती है, लेकिन कई शक्तिशाली लाइब्रेरीज़ हैं जो इस समस्या का समाधान करती हैं।



C++ प्रोजेक्ट्स के लिए i18n क्यों महत्वपूर्ण है?



आधुनिक C++ एप्लिकेशन शायद ही कभी एक ही भाषा तक सीमित होते हैं। डेस्कटॉप प्रोग्राम, गेम, सर्वर सॉल्यूशंस — इन सभी को कई लोकेल के समर्थन की आवश्यकता होती है। i18n द्वारा हल की जाने वाली मुख्य समस्याएँ:



  • एन्कोडिंग के साथ कार्य — ASCII से UTF-8, UTF-16 और अन्य मल्टीबाइट एन्कोडिंग में संक्रमण;
  • संख्या, दिनांक और मुद्रा का स्वरूपण — विभिन्न देशों में विभिन्न विभाजक और प्रारूप उपयोग किए जाते हैं;
  • वाक्यों में शब्द क्रम — रूसी भाषा में विभक्तियाँ आवश्यक हैं, जबकि अंग्रेजी में आर्टिकल;
  • बहुवचन — बहुवचन बनाने के नियम भिन्न होते हैं (रूसी में 3 रूप हैं, अंग्रेजी में 2)।


C++ में i18n के लिए मुख्य लाइब्रेरीज़



1. GNU gettext — क्लासिक



GNU gettext C और C++ में अंतर्राष्ट्रीयकरण के लिए सबसे लोकप्रिय लाइब्रेरी है। यह अलग अनुवाद फ़ाइलों (.po/.mo) का उपयोग करती है और स्ट्रिंग को कोड से अलग करने की अनुमति देती है।



उपयोग का मूल उदाहरण:



#include <iostream>#include <libintl.h>#include <locale.h>

#define _(str) gettext(str)

int main() { setlocale(LC_ALL, ""); bindtextdomain("myapp", "./locale"); textdomain("myapp");

std::cout << _("Hello, world!") << std::endl; std::cout << _("File not found") << std::endl; return 0;}


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



लाभ:

  • एकीकरण में सरलता;
  • विशाल समुदाय और कई उपकरण (Poedit, Lokalize);
  • ngettext() के माध्यम से बहुवचन का समर्थन;
  • किसी भी प्लेटफ़ॉर्म पर काम करता है।


कमियाँ:

  • अतिरिक्त तरकीबों के बिना प्रासंगिक अनुवाद का समर्थन नहीं करता;
  • .mo फ़ाइलें उत्पन्न करने के लिए एक अलग बिल्ड चरण की आवश्यकता होती है।


2. Boost.Locale — आधुनिक C++ दृष्टिकोण



Boost.Locale लाइब्रेरी अधिक आधुनिक और टाइप-सेफ इंटरफ़ेस प्रदान करती है। यह ICU (International Components for Unicode) या सिस्टम लोकेल के ऊपर बनाई गई है।



अनुवाद के साथ कार्य का उदाहरण:



#include <boost/locale.hpp>#include <iostream>

int main() { using namespace boost::locale; generator gen; std::locale loc = gen("ru_RU.UTF-8"); std::locale::global(loc); // अनुवादक बनाएँ translator tr; std::cout << tr("Hello, world!") << std::endl; std::cout << tr("Today is {1}", "Monday") << std::endl; // बहुवचन std::cout << tr("You have {1} message", "You have {1} messages", 5) << std::endl; return 0;}


लाभ:

  • UTF-8 का मूल समर्थन;
  • दिनांक, संख्या और मुद्रा का स्वरूपण;
  • प्रासंगिक अनुवाद का समर्थन;
  • std::string और std::wstring के साथ काम करता है।


कमियाँ:

  • Boost पर निर्भरता (भारी लाइब्रेरी);
  • अनुवादकों के लिए कम उपकरण।


3. ICU — उद्योग मानक



ICU (Intern

अनुशंसाएँ