त्रुटियों को उपयोगकर्ता की भाषा में कैसे बोलें?
\n\nSwift डेवलपर्स अक्सर एक समस्या का सामना करते हैं: त्रुटि फेंकी गई है, लेकिन उपयोगकर्ता कुछ इस तरह देखता है Error Domain=MyApp Code=42। यह तकनीकी रूप से सही है, लेकिन मनुष्य के लिए पूरी तरह से बेकार है। Stack Overflow पर प्रश्न "How to provide a localized description with an Error type in Swift?" ने हजारों बार देखा गया है — और यह व्यर्थ नहीं है।
इस लेख में, हम सूखी त्रुटि कोड को समझने योग्य, स्थानीयकृत संदेशों में बदलने का तरीका समझेंगे। आप सीखेंगे कि LocalizedError प्रोटोकॉल का उपयोग कैसे करें, NSError के साथ कैसे काम करें और विभिन्न भाषाओं के लिए स्ट्रिंग्स को ठीक से कैसे तैयार करें। अपने ऐप को और अधिक अनुकूल बनाने के लिए तैयार हैं? चलिए शुरू करते हैं!
सिर्फ Error क्यों काम नहीं करता?
\n\nSwift में, Error प्रोटोकॉल एक न्यूनतम अनुबंध है। यह न तो विवरण और न ही स्थानीयकरण की आवश्यकता रखता है। जब आप अपनी त्रुटि बनाते हैं:
enum NetworkError: Error {\n case timeout\n case serverError(code: Int)\n}\n\n...आपको केवल केस का नाम मिलता है। localizedDescription को कॉल करने का प्रयास करें:
let error = NetworkError.timeout\nprint(error.localizedDescription) // "The operation couldn’t be completed. (NetworkError error 0.)"\n\nसिस्टम एक मानक वाक्यांश डालता है — जानकारीहीन और बदसूरत। उपयोगकर्ता को एक सार्थक संदेश देने के लिए, आपको LocalizedError प्रोटोकॉल को लागू करना होगा।
मिलिए: LocalizedError प्रोटोकॉल
\n\nLocalizedError Error का विस्तार करता है और चार वैकल्पिक गुण जोड़ता है:
- \n
errorDescription— उपयोगकर्ता के लिए मुख्य संदेश \n failureReason— त्रुटि का कारण (तकनीकी) \n recoverySuggestion— उपयोगकर्ता को क्या करना चाहिए \n helpAnchor— सहायता के लिए लिंक (शायद ही कभी उपयोग किया जाता है) \n
सबसे महत्वपूर्ण है errorDescription। सिस्टम घटक (अलर्ट, SwiftUI) इसे प्रदर्शित करते हैं।
स्थानीयकृत त्रुटि को लागू करना
\n\nअपने NetworkError में LocalizedError जोड़ें:
enum NetworkError: LocalizedError {\n case timeout\n case serverError(code: Int)\n case noInternet\n \n var errorDescription: String? {\n switch self {\n case .timeout:\n return NSLocalizedString(\n "सर्वर प्रतिक्रिया नहीं दे रहा है। कनेक्शन जांचें और पुनः प्रयास करें।",\n comment: "Timeout error"\n )\n case .serverError(let code):\n let format = NSLocalizedString(\n "सर्वर त्रुटि: %d। बाद में पुनः प्रयास करें।",\n comment: "Server error with code"\n )\n return String(format: format, code)\n case .noInternet:\n return NSLocalizedString(\n "इंटरनेट से कोई कनेक्शन नहीं।",\n comment: "No internet error"\n )\n }\n }\n \n var failureReason: String? {\n switch self {\n case .timeout:\n return NSLocalizedString(\n "सर्वर से प्रतिक्रिया की प्रतीक्षा का समय समाप्त हो गया।",\n comment: "Timeout reason"\n )\n case .serverError(let code):\n return NSLocalizedString(\n "सर्वर ने कोड \\(code) लौटाया।",\n comment: "Server error reason"\n )\n case .noInternet:\n return NSLocalizedString(\n "कोई सक्रिय इंटरनेट कनेक्शन नहीं है।",\n comment: "No internet reason"\n )\n }\n }\n \n var recoverySuggestion: String? {\n switch self {\n case .timeout:\n return NSLocalizedString(\n "Wi-Fi या मोबाइल डेटा जांचें और अनुरोध दोहराएं।",\n comment: "Timeout recovery"\n )\n case .serverError:\n return NSLocalized