2009-10-13 12 views
5

वहाँ Win32 एपीआई में किसी तरह एक तीन पत्र भाषा कोड कन्वर्ट करने के लिए के रूप में, LOCALE_SABBREVLANGNAME साथ GetLocaleInfo() निर्दिष्ट द्वारा दिया है, एक इसी LANGID या LCID? यही है, GetLocaleInfo() सामान्यतः क्या करता है "रिवर्स" में जा रहा है?कन्वर्ट तीन पत्र भाषा कोड

मैं क्या करने की कोशिश कर रहा हूँ, भाषा की किस तरह एक संसाधन DLL उपयोग कर रहा है, और अब तक, पार्स करने के लिए DLL बारे में कुछ भी बिना छुए है एक प्रारूप nameLNG.dll, जहां LNG एक तीन है के साथ dll नाम से जा रहा पत्र भाषा कोड, ऐसा लगता है कि ऐसा कोई कार्य मौजूद है, सबसे आसान तरीका प्रतीत होता है।

यदि यह करना आसान नहीं है, तो मुझे लगता है कि प्लान बी हमारी भाषा डीएलएल को एक संस्करण जानकारी संसाधन देना है, वहां अपनी संबंधित संस्कृतियों को निर्दिष्ट करना है, और बाद में आवेदन में, वे कौन सी संस्कृतियों का उपयोग करते हैं।

उत्तर

2

दुर्भाग्यवश, कोई प्रत्यक्ष Win32 API नहीं है जो आपको 3 अक्षरों के संक्षिप्त नाम दिए गए LANGID देता है।

ऐसा लगता है कि CLanguageSupport आपका मित्र है today :-) यह संस्करण जानकारी संसाधन की सामग्री के आधार पर LANGID को देखने के लिए पहले से ही आपकी योजना बी लागू करता है।

कोड आप देख रहे हैं का टुकड़ा समारोह

LANGID CLanguageSupport::GetLangIdFromFile(LPCTSTR pszFilename) 
बेशक

पूर्णांक है, दोष यह आप संस्करण जानकारी और DLL नाम के बीच एक बेमेल हो सकता है। लेकिन आप परीक्षण के दौरान इसे बहुत जल्दी पकड़ लेंगे। और यदि आप appTranslator जैसे टूल को आपके लिए डीएलएल बनाते हैं, तो आप सुरक्षित पक्ष पर रहना सुनिश्चित कर सकते हैं।

+0

हां, मुझे लगता है कि मैं इस कक्षा का उपयोग कर समाप्त कर दूंगा, क्योंकि आपने जाहिर तौर पर पहले से ही एक-एक कदम उठाया है, लेकिन अब हम जिन मुद्दों का सामना कर रहे हैं उनमें से दो मुद्दे हैं। हम भाषा उपमेनू को फिर भी कार्यान्वित कर सकते हैं जिसे मैंने कुछ दिन पहले हटा लिया था, सोच रहा था कि एमएफसी तंत्र पर हमारा स्विच अंतिम होगा। ओह ठीक है ... – Jonas

1

आप EnumSystemLocales() का उपयोग कर स्थापित लोकेशंस का आकलन कर सकते हैं और मानचित्र को स्वयं बना सकते हैं। मैं इसे एक सेवा में प्रारंभिकरण के दौरान करता हूं जिसे मैंने कुछ समय पहले लिखा था और इसने अब तक अच्छी तरह से काम किया है।

मैं इस मामले में प्लान बी का उपयोग करने की सलाह दूंगा। मैं आमतौर पर फ़ाइल नाम में एन्कोडिंग सामान को साफ़ करता हूं। यदि किसी अन्य कारण के लिए, 3-वर्ण ISO-639 संस्करण का उपयोग तब तक सही नहीं है जब तक कि आप कड़ाई से निर्दिष्ट नहीं करते कि आप किस प्रकार का उपयोग कर रहे हैं -, या ISO-639-3

यदि आपको लोकेल-विशिष्ट प्रकार प्रदान करने की आवश्यकता है, तो आपको RFC3066 पर नजदीकी नज़र डालना चाहिए। असल में, आपको भाषा और देश कोड निर्दिष्ट करना होगा, और कुछ मामलों में, क्षेत्र कोड भी। किसी भी मामले में, एलसीआईडी ​​इस सब भलाई को समाहित करता है।

एक बात यह है कि मैं पूरी तरह से निश्चित नहीं हूं कि संसाधन जानकारी में लैंगिड एक पूर्ण एलसीआईडी ​​है या नहीं। VERSIONINFO संदर्भ में सूचीबद्ध कोड एलसीआईडी ​​हैं इसलिए मैं VERSIONINFO शीर्षलेख में एक एलसीआईडी ​​का उपयोग करने का प्रयास करूंगा। यदि नहीं, तो आप हमेशा स्ट्रिंग ब्लॉक में स्ट्रिंग के रूप में जानकारी शामिल कर सकते हैं।

+1

EnumSystemLocales केवल मुझे तीन अक्षर शब्दकोषों की एक सूची देता है, है ना? मुझे यकीन है कि केवल इस जानकारी का उपयोग करके मानचित्र बनाने का तरीका है, और एलसीआईडी ​​या LANGID का अनुवाद करने की कमी है? यह समाधान सही होगा यदि EnumSystemLocales के लिए कॉलबैक फ़ंक्शन एलसीआईडी ​​और "आईएसओ" तारों की * जोड़ी * वापस कर देता। – Jonas

+0

'EnumLocalesProc' के लिए तर्क वास्तव में एक स्ट्रिंग में हेक्साडेसिमल संख्या के रूप में स्वरूपित एलसीआईडी ​​है। दस्तावेज इस बारे में स्पष्ट से कम है - _ "एक बफर के लिए पॉइंटर जिसमें एक नल-टर्मिनेटेड लोकेल पहचानकर्ता स्ट्रिंग है" _। वे जो उल्लेख करने में असफल होते हैं वह यह है कि आपको लोकल पहचानकर्ता को प्रयोग करने योग्य रूप में प्राप्त करने के लिए '_tcstoul (lpLocaleString, NULL, 16)' जैसे कुछ कॉल करना होगा। एक बार आपके पास एलसीआईडी ​​हो जाने के बाद, आपको 'LOCALE_SISO639LANGNAME' और' LOCALE_SISO3166CTRYNAME' का उपयोग करके 'GetLocaleInfo()' से जो चाहिए उसे प्राप्त कर सकते हैं। –

0

आप LCType पैरामीटर के लिए LOCAL_RETURN_NUMBER|LOCALE_ILANGUAGE साथ GetLocaleInfo() बुला, बस के रूप में आप LOCALE_SABBREVLANGNAME पारित कर दिया तीन अक्षर वाले ISO कोड प्राप्त करने के लिए द्वारा LangID प्राप्त कर सकते हैं। इस फ़ंक्शन में एलसीआईडी ​​ पास करके, आप संबंधित लैंग आईडी को आईएसओ कोड के साथ स्टोर कर सकते हैं।

ध्यान दें कि MSDN कहते हैं LOCALE_ILANGUAGE ऊपर Vista और पर पक्ष LOCALE_SLANG में नहीं किया जाना चाहिए, लेकिन मेरा मानना ​​है कि टिप्पणी LOCALE_RETURN_NUMBER साथ LOCALE_ILANGUAGE के उपयोग के लिए लागू नहीं होता।

आपकी परियोजना विकसित होने के बाद, आप प्रत्येक भाषा के लिए कई स्थानीय फाइलें उत्पन्न कर सकते हैं। इस कारण से, मैं सुझाव दूंगा कि आप अपनी स्थानीय फाइलों को भाषा के नाम पर उपनिर्देशिका में संग्रहीत करें। माइक्रोसॉफ्ट ने लैंगिड्स के नाम पर निर्देशिका का उपयोग किया है, उदाहरण के लिए "1033" अंग्रेजी संसाधन निर्देशिका के रूप में। मुझे लगता है कि यह "एनएनयू \ name.dll" जैसे तीन-अक्षर कोड का उपयोग करने के लिए अधिक अनुकूल होगा। किसी भी मामले में, उपनिर्देशिकाएं एक साधारण समाधान हैं और आशा है कि आपकी बिल्ड प्रक्रिया को जितना अधिक लक्षित फ़ाइल नाम बदलना उतना जटिल नहीं होगा।

+0

दुर्भाग्य से मुझे एलसीआईडी ​​तक पहुंच नहीं है, लेकिन भाषा कोड से लैनजीआईडी ​​तीन अक्षर परिवर्णी (गलत-आईएसओ कोड) चाहते हैं। – Jonas

+0

एफडब्ल्यूआईडब्लू, एमएस चाहता है कि हम LOCALE_ILANGUAGE से दूर चले जाएं क्योंकि वे स्ट्रिंग-केवल "लैंग आईडी", एक ला .NET संस्कृतियों आईडी में स्थानांतरित करना चाहते हैं। iow वे हमें यह समझाने की कोशिश करते हैं कि WinGID * Win8 + में कम से कम नई समर्थित भाषाओं के लिए कुछ दिन मर सकता है –

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