2013-07-04 5 views
7

Win7 पर स्थानीयकृत UI होने पर, error_code::message() एक गैर-अंग्रेज़ी संदेश देता है। जहां तक ​​मैं देख रहा हूँ (बूस्ट 1.54 में, system_error_category के लिए), उपरोक्त समारोह निम्नलिखित WinAPI कॉल करने पर निर्भर करता:बढ़ावा कैसे प्राप्त करें :: system :: error_code :: संदेश अंग्रेजी में?

DWORD retval = ::FormatMessageA( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS, 
    NULL, 
    ev, 
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
    (LPSTR) &lpMsgBuf, 
    0, 
    NULL 
); 

कैसे ऊपर FormatMessage एक अंग्रेजी संदेश वापस जाने के लिए प्राप्त करने के लिए? मैंने लोकेल को std फ़ंक्शंस और SetThreadLocale के साथ सेट करने का प्रयास किया - इससे मदद नहीं मिली।

अद्यतन: बस एक स्पष्टीकरण: अनिवार्य रूप से, मेरे सवाल यह है कि "ओवरराइड" प्रोग्राम के रूप में user default language और क्यों किया जाना स्थानीय सेटिंग के लिए पर्याप्त नहीं है।

उत्तर

1

अनुमान में, आपको डिफ़ॉल्ट भाषा के बजाय dwLanguageId के लिए अंग्रेज़ी निर्दिष्ट करने की आवश्यकता होगी। उदा .:

MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) 

या, आप विशेष रूप से चाहते हैं, तो यूएस अंग्रेज़ी:

MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 

ध्यान दें कि यह असफल हो जायेगी यदि निर्दिष्ट भाषा में संदेश मौजूद नहीं है। तो आप ERROR_RESOURCE_LANG_NOT_FOUND को संभालना चाहते हैं और dwLanguageId=0 के साथ इसे फिर से कॉल करने का प्रयास कर सकते हैं।

अधिक जानकारी के लिए, see MSDN

+1

जैसा कि मैंने बताया है, यह मेरा कोड नहीं है, लेकिन बूस्ट। सिस्टम जो 'FormatMessage' कहता है। –

+0

ठीक है, तो अपना खुद का फ़ंक्शन लिखें। यह कठिन नहीं है। –

+0

पैचिंग बूस्ट एक विकल्प है, लेकिन मैं एक और अधिक साफ समाधान पसंद करूंगा। दरअसल, सवाल यह है कि क्या (LANG_NEUTRAL, SUBLANG_DEFAULT), यानी "उपयोगकर्ता डिफ़ॉल्ट भाषा" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd373908(v=vs.85 ओवरराइड करना संभव है या नहीं)) .aspx)। थ्रेड लोकेल या ग्लोबल लोकेल को प्रभावित नहीं करना चाहिए? –

3

समाधान के लिए पूरे इंटरनेट पर खोज कर रहे थे, और अंत में this मिला। असल में, आपको अपने main/WinMain में SetThreadUILanguage पर कॉल करना चाहिए।

संबंधित मुद्दे