Accessibility 'कमजोर' लोगों के लिए नहीं, बल्कि कोड की गुणवत्ता के लिए क्यों है
\n\nजब हम C++ में लिखते हैं, तो हम प्रदर्शन, मेमोरी और गति के बारे में सोचने के आदी होते हैं। लेकिन एक और पहलू है जिसे अक्सर अनदेखा किया जाता है — accessibility। यह सिर्फ वेब डेवलपमेंट की दुनिया का एक फैशनेबल शब्द नहीं है। C++ में, एप्लिकेशन की सुलभता का मतलब है कि विकलांग लोग (दृष्टि, श्रवण, मोटर क्षमता में कमी) आपके सॉफ्टवेयर का उपयोग दूसरों के समान कर सकें।
\n\nकल्पना करें: आपने एक शानदार ग्राफिक एडिटर या कंसोल यूटिलिटी बनाई है। लेकिन अगर यह screen reader द्वारा नहीं पढ़ी जा सकती या कीबोर्ड से नियंत्रित नहीं की जा सकती — तो आप 15–20% उपयोगकर्ताओं को खो देते हैं। और साथ ही, accessibility अक्सर कानूनी आवश्यकता होती है (उदाहरण के लिए, अमेरिका में — Section 508, यूरोप में — EN 301 549)।
\n\nइस लेख में, हम देखेंगे कि प्रदर्शन से समझौता किए बिना C++ प्रोजेक्ट्स में a11y best practices (a11y — accessibility का संख्यात्मक संक्षिप्त नाम) कैसे शामिल करें। चलिए शुरू करते हैं!
\n\nकहां से शुरू करें: समावेशी कोड के मूल सिद्धांत
\n\nकोड में जाने से पहले, तीन मूलभूत सिद्धांत याद रखें:
\n\n- \n
- बोधगम्यता — जानकारी कम से कम एक इंद्रिय (दृष्टि, श्रवण, स्पर्श) के माध्यम से सुलभ होनी चाहिए। \n
- नियंत्रणीयता — इंटरफ़ेस को कीबोर्ड, आवाज या स्विच के माध्यम से काम करना चाहिए। \n
- समझने योग्यता — तत्वों का व्यवहार पूर्वानुमानित हो, त्रुटियाँ स्पष्ट हों। \n
C++ में यह विशेष रूप से महत्वपूर्ण है, क्योंकि हम अक्सर निम्न-स्तरीय API के साथ काम करते हैं जहाँ सिमैंटिक्स खो जाता है। उदाहरण के लिए, OpenGL के माध्यम से एक बटन बनाने पर, आपको screen readers का स्वचालित समर्थन नहीं मिलेगा — इसे मैन्युअल रूप से जोड़ना होगा।
\n\nC++ GUI में सिमैंटिक मार्कअप: Qt और अन्य
\n\nC++ में accessibility जोड़ने का सबसे सामान्य तरीका Qt फ्रेमवर्क का उपयोग करना है। इसमें QAccessibleInterface के माध्यम से अंतर्निहित समर्थन है। लेकिन भले ही आप शुद्ध WinAPI पर लिख रहे हों — IAccessible उपलब्ध है।
उदाहरण: बटन को सुलभ बनाना
\n\nमान लीजिए, आपके पास QPainter के माध्यम से बनाया गया एक कस्टम बटन है। accessibility के बिना, screen reader इसे सिर्फ 'आयत' के रूप में देखेगा। इसे ठीक करते हैं:
\n\n#include <QAccessible>\n#include <QAccessibleWidget>\n#include <QPushButton>\n\nclass AccessibleButton : public QAccessibleWidget {\npublic:\n explicit AccessibleButton(QWidget* widget)\n : QAccessibleWidget(widget, QAccessible::Button) {}\n\n QString text(QAccessible::Text t) const override {\n if (t == QAccessible::Name) {\n auto* btn = qobject_cast<QPushButton*>(widget());\n return btn ? btn->text() : QString();\n }\n return QAccessibleWidget::text(t);\n }\n};\n\n// उपयोग:\nQPushButton* btn = new QPushButton("भेजें");\nQAccessible::registerAccessibleFactory(\n [](QObject* obj) -> QAccessibleInterface* {\n if (auto* btn = qobject_cast<QPushButton*>(obj)) {\n return new AccessibleButton(btn);\n }\n return nullptr;\n }\n);\n\nअब screen reader पढ़ेगा 'भेजें, बटन'। जादू? नहीं, बस समावेशी कोड।
\n\nC++ कंसोल एप्लिकेशन में Accessibility
\n\nशायद ऐसा लगे कि कंसोल पुराना है। लेकिन कई यूटिलिटीज़, CI/CD पाइपलाइन और सर्वर एप्लिकेशन टर्मिनल में ही काम करते हैं। उन्हें सुलभ कैसे बनाएं?
\n\nScreen readers के लिए सही आउटपुट
\n\nScreen reader (जैसे, NVDA, JAWS) कंसोल को पंक्ति दर पंक्ति पढ़ता है। यदि आप ASCII वर्णों के साथ एक तालिका प्रदर्शित करते हैं — यह एक बुरा सपना है। बेहतर होगा कि संरचित आउटपुट का उपयोग करें:
\n\n#include <iostream>\n#include <string>\n#include <vector>\n\nstruct User {\n std::string name;\n int age;\n};\n\nvoid printAccessibleTable(const std::vector<User>& users) {\n // Screen reader के अनुकूल: पहले शीर्षक, फिर डेटा\n std::cout << "उपयोगकर्ताओं की तालिका:" << std::endl;\n for (const auto&