C++ में अंतर्राष्ट्रीयकरण (i18n): बुनियादी से उन्नत तकनीकों तक
अंतर्राष्ट्रीयकरण (संक्षेप में i18n — "internationalization" से, जहाँ 18 पहले और आखिरी अक्षर के बीच के अक्षरों की संख्या है) सॉफ्टवेयर को इस तरह डिज़ाइन करने की प्रक्रिया है कि इसे स्रोत कोड में बदलाव किए बिना विभिन्न भाषाओं और क्षेत्रों के लिए आसानी से अनुकूलित किया जा सके। C++ भाषा के लिए, जो पारंपरिक रूप से उच्च-प्रदर्शन और क्रॉस-प्लेटफ़ॉर्म अनुप्रयोगों में उपयोग की जाती है, i18n का सही कार्यान्वयन बहुत महत्वपूर्ण है। इस लेख में, हम C++ अनुप्रयोगों के लोकलाइज़ेशन के मुख्य दृष्टिकोण, लाइब्रेरी और व्यावहारिक उदाहरण देखेंगे।
i18n की मुख्य अवधारणाएँ
टूल्स पर जाने से पहले, मुख्य शब्दों को समझना ज़रूरी है:
- लोकलाइज़ेशन (l10n) — किसी विशिष्ट क्षेत्र के लिए अनुवादित टेक्स्ट, दिनांक, संख्या और मुद्रा प्रारूपों का अनुकूलन।
- लोकेल — नियमों का एक सेट (भाषा, क्षेत्र, एन्कोडिंग) जो डेटा फ़ॉर्मेटिंग को परिभाषित करता है।
- Unicode और UTF-8 — कैरेक्टर एन्कोडिंग का मानक, जो आधुनिक अंतर्राष्ट्रीयकरण के लिए अनिवार्य है।
- प्लुरलाइज़ेशन — बहुवचन रूपों का सही प्रदर्शन (जैसे, "1 फ़ाइल", "2 फ़ाइलें", "10 फ़ाइलें")।
C++ के लिए GNU gettext लाइब्रेरी
GNU gettext Unix/Linux दुनिया में अंतर्राष्ट्रीयकरण के लिए सबसे लोकप्रिय टूल है, जो C++ के साथ भी बढ़िया काम करता है। यह एक न्यूनतम API और अनुवाद निकालने और प्रबंधित करने के लिए शक्तिशाली उपयोगिताएँ प्रदान करता है।
इंस्टॉलेशन और सेटअप
C++ प्रोजेक्ट में gettext का उपयोग करने के लिए, libintl पैकेज इंस्टॉल करना और हेडर फ़ाइल शामिल करना आवश्यक है:
#include <libintl.h>
#include <locale.h>
#define _(STRING) gettext(STRING)
बुनियादी उपयोग का उदाहरण
#include <iostream>
#include <libintl.h>
#include <locale.h>
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 --keyword=_ main.cpp -o messages.po - .po फ़ाइल संपादित करना — मैन्युअल रूप से या Poedit के माध्यम से अनुवाद जोड़ना।
- .mo में कंपाइल करना:
msgfmt messages.po -o locale/hi/LC_MESSAGES/myapp.mo
प्लुरलाइज़ेशन सपोर्ट
Gettext ngettext फ़ंक्शन के माध्यम से बहुवचन रूपों का समर्थन करता है:
int count = 5;
printf(ngettext("%d file deleted", "%d files deleted", count), count);
ICU (International Components for Unicode) लाइब्रेरी
ICU IBM की एक शक्तिशाली लाइब्रेरी है, जो अंतर्राष्ट्रीयकरण के लिए टूल का पूरा सेट प्रदान करती है: Unicode सपोर्ट, लोकेल-आधारित सॉर्टिंग, संख्याओं, दिनांकों, मुद्राओं का फ़ॉर्मेटिंग, टाइम ज़ोन के साथ काम करना और भी बहुत कुछ। C++ के लिए, icu4c पैकेज से C++ API का उपयोग किया जाता है।
ICU इंस्टॉल करना
Ubuntu/Debian पर: sudo apt install libicu-dev
macOS पर: brew install icu4c
संख्या और दिनांक फ़ॉर्मेटिंग
#include <unicode/numfmt.h>
#include <unicode/datefmt.h>
#include <iostream>
int main() {
// hi_IN लोकेल के लिए संख्या फ़ॉर्मेटिंग
icu::UnicodeString pattern;
icu::NumberFormat* fmt = icu::NumberFormat::createInstance(
icu::Locale("hi", "IN"), status);
icu::UnicodeString result;
fmt->format(1234567.89, result);
std::string utf8;
result.toUTF8String(utf8);
std::cout << "संख्या: " << utf8 << std::endl; // 12,34,567.89
delete fmt;
// दिनांक फ़ॉर्मेटिंग
icu::DateFormat* dateF