c++ समस तार के स्थानीयकरण के लिए डिजाइन करने का सर्वोत्तम तरीका




सूती वस्त्र उद्योग राजस्थान (6)

सरल तरीका केवल आपके कोड में स्ट्रिंग आईडी का उपयोग करना है - कोई शाब्दिक तार नहीं है फिर आप प्रत्येक भाषा के लिए। आरसी फ़ाइल के विभिन्न संस्करणों का उत्पादन कर सकते हैं और या तो केवल संसाधन बना सकते हैं DLL या बस अलग-अलग भाषा बनाता है

कुछ शेयरवेयर उपयोगस्टोहेल्प आरसी फ़ाइल को स्थानीयकरण कर रहे हैं, जो भाषाओं के लंबे समय तक शब्दों के साथ रीज़िस करने वाले डायलॉग तत्वों को संभालता है और लापता अनुवाद के बारे में चेतावनी देता है।

एक अधिक जटिल समस्या शब्द ऑर्डर है, यदि आपके पास कई संख्याएं हैं जो एक प्रिंटफ़ में होती हैं जो अलग-अलग भाषा के व्याकरण के लिए अलग-अलग क्रम में होनी चाहिए। कोडप्रूवड पर कुछ विस्तारित printf कक्षाएं हैं जो आपको printf ("word% 1s और% 2s", var1, var2) जैसी चीज़ों को निर्दिष्ट करने देती हैं ताकि आप आवश्यक होने पर% 1s और% 2s स्विच कर सकें।

यह थोड़े सामान्य सवाल है, राय के लिए खुला है। मैं विंडोज एमएफसी एप्लिकेशन और संबंधित उपयोगिताओं के लिए स्ट्रिंग संसाधनों के स्थानीयकरण के लिए डिजाइन करने का एक अच्छा तरीका तैयार करने की कोशिश कर रहा हूं। मेरी इच्छा सूची है:

  • कोड में स्ट्रिंग लीटरल्स को संरक्षित करना चाहिए (मैक्रो #define संसाधन आईडी के साथ प्रतिस्थापित करने का विरोध करने के लिए), ताकि संदेश अभी भी पठनीय इनलाइन हो
  • स्थानीय स्ट्रिंग संसाधनों (डुह) की अनुमति चाहिए
  • अतिरिक्त रन-टाइम वातावरण प्रतिबंधों को लागू नहीं करना चाहिए (उदाहरण: .NET, आदि पर निर्भरता)
  • मौजूदा कोड में न्यूनतम बेदखल होना चाहिए (कम संशोधन बेहतर है)
  • Debuggable होना चाहिए
  • संसाधन फ़ाइलों को उत्पन्न करना चाहिए जो आम टूल द्वारा संपादन योग्य हैं (यानी: सामान्य प्रारूप)
  • कोड में शाब्दिक तारों को संरक्षित करने के लिए कॉपी / पेस्ट टिप्पणी ब्लॉक का उपयोग नहीं करना चाहिए, या कुछ अन्य जो तुल्यकालन के लिए संभावित बनाता है
  • स्थैतिक (संकलन-समय) की जांच करने के लिए अच्छा होगा कि प्रत्येक "नोटिटेड" स्ट्रिंग संसाधन फ़ाइल में है
  • क्रॉस-भाषा संसाधन स्ट्रिंग पूलिंग की अनुमति देने के लिए अच्छा होगा (विभिन्न भाषाओं के घटक के लिए, उदाहरण: देशी C ++ और .NET)

मेरे पास एक तरीका है जो मेरी सभी इच्छाओं को स्थिर जांच के अलावा कुछ हद तक पूरा करता है, लेकिन मुझे इसे हासिल करने के लिए कुछ कस्टम कोड विकसित करना पड़ा (और इसकी सीमाएं हैं)। मैं सोच रहा हूं कि किसी ने इस समस्या को विशेष रूप से अच्छी तरह से हल किया है।

संपादित करें: मेरे वर्तमान समाधान में ऐसा दिखता है:

ShowMessage( RESTRING( _T("Some string") ) );
ShowMessage( RESTRING( _T("Some string with variable %1"), sNonTranslatedStringVariable ) );

फिर मेरे पास 'रीस्टोरिंग' ब्लॉकों के भीतर से स्ट्रिंग्स को पार्स करने और स्थानीयकरण के लिए .resx फाइल में डाल देने के लिए कस्टम उपयोगिता है, और उन्हें अलग-अलग संसाधन फ़ाइलों से फॉलबैक से लोड करने के लिए एक अलग C # COM ऑब्जेक्ट है। अगर सी # ऑब्जेक्ट उपलब्ध नहीं है (या लोड नहीं किया जा सकता है), तो मैं कोड में स्ट्रिंग पर वापस आ जाता हूं। मैक्रो एक टेम्पलेट क्लास का विस्तार करता है जो COM वस्तु को कॉल करता है और स्वरूपण करता है आदि।

वैसे भी, मैंने सोचा कि यह संदर्भ के लिए अब क्या है जोड़ने के लिए उपयोगी होगा।


आपका समाधान यूनिक्स / लिनक्स " gettext " समाधान के समान है। वास्तव में, आपको निष्कर्षण रोज़ाना लिखने की ज़रूरत नहीं होगी।

मुझे यकीन नहीं है कि आप बहुल तर्कों को संभाल करने के लिए _RESTRING मैक्रो क्यों चाहते हैं मेरा कोड (gettext के लिए wxWidgets समर्थन का उपयोग करके) इस तरह दिखता है: MyString.Format(_("Some string with variable %ls"), _("variable")); । इसका अर्थ यह है कि स्ट्रिंग :: फॉर्मेट (...) दो व्यक्तिगत अनुवादित तर्क मिलते हैं। हिंदसाईट में, बूस्ट :: प्रारूप बेहतर होता, लेकिन यह भी boost::format(_("Some string with variable %1")) % _("variable"); लिए अनुमति देता है boost::format(_("Some string with variable %1")) % _("variable");

(हम संक्षेप के लिए _() मैक्रो का उपयोग करते हैं)


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

http://www.codeproject.com/KB/string/stringtable.aspx

बीटीडब्ल्यू, नेटिव्ह Win32 प्रोग्राम्स और .नेट प्रोग्राम्स में पूरी तरह से अलग संसाधन भंडारण प्रबंधन है। आपको दोनों के लिए एक सामान्य समाधान खोजने में एक कठिन समय होगा।


चूंकि यह राय के लिए खुला है, यहां यह है कि मैं यह कैसे करूँ।

मेरी स्थानीय पाठ फ़ाइल एक सरल टैब सीमांकित पाठ फ़ाइल है जिसे Excel में लोड किया जा सकता है और संपादित किया जा सकता है। पहला कॉलम परिभाषित करने के लिए है और दाईं ओर प्रत्येक स्तंभ एक बाद की भाषा है, उदाहरण के लिए:

ID              ENGLISH      FRENCH    GERMAN
STRING_YES      YES          OUI       YA
STRING_NO       NO           NON       NEIN

फिर मेरे मेसेफ़ाइल में एक क्यूसम बिल्ड चरण होता है जो स्ट्रिंग्स एच फ़ाइल और स्ट्रिंग्स डाट करता है। मेरे मामले में यह स्ट्रिंग आईडी के लिए एक enum सूची बनाता है और फिर पाठ के लिए ऑफ़सेट के साथ एक बाइनरी फ़ाइल है। चूंकि मेरे ऐप में उपयोगकर्ता किसी भी समय भाषा को बदल सकता है, जब तक मैं उन्हें स्मृति में नहीं रखता हूं, लेकिन आप आसानी से अपने प्री-प्रोसेसर को प्रत्येक भाषा के लिए अलग-अलग आउटपुट फाइल जेनरेट कर सकते हैं।

जो चीज़ मुझे इस डिजाइन के बारे में पसंद है वह यह है कि यदि कोई स्ट्रिंग गायब हो तो मुझे एक संकलन त्रुटि मिलती है, अगर स्ट्रिंग्स को रनटाइम पर देखा जाता है, तो आपको बाद में जब तक कोड का एक ही हिस्सा इस्तेमाल नहीं किया जाता है,


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

आपके कोड में, आपको अपारदर्शी आईडी के बजाय अपनी मूल भाषा में तार दिखाई देंगे।


हम आईडी के रूप में अंग्रेज़ी स्ट्रिंग का उपयोग करते हैं

यदि यह अंतरराष्ट्रीय संसाधन ऑब्जेक्ट (आईआईएलएन डीएलएल से भरी हुई) से देखने में विफल रहता है तो हम आईडी स्ट्रिंग के लिए डिफ़ॉल्ट होते हैं।

कोड ऐसा दिखता है:

doAction(I18N.get("Press OK to continue"));

निर्माण प्रक्रियाओं के हिस्से के रूप में हमारे पास एक पर्ल स्क्रिप्ट है जो स्ट्रिंग स्थिरांक के लिए सभी स्रोत पार्स करता है। यह अनुप्रयोग में सभी स्ट्रिंग्स की एक अस्थायी फ़ाइल बनाता है और फिर इन्हें प्रत्येक स्थानीय में संसाधन स्ट्रिंग्स के विरुद्ध तुलना करता है, यह देखने के लिए कि क्या वे मौजूद हैं। किसी भी लापता तार उपयुक्त अनुवाद टीम के लिए ई-मेल उत्पन्न करता है।

हम प्रत्येक स्थानीय के लिए कई डीएलएल कर सकते हैं। डीएलएल का नाम आरएफसी 3066 पर आधारित है
भाषा [_territory] [। codeset] [@ संशोधक]

हम कोशिश करते हैं और मशीन से लोकेल को निकालते हैं और I18N dll को लोड करते समय जितना संभव हो उतना विशिष्ट हो सकते हैं लेकिन अधिक विशिष्ट संस्करण उपस्थित नहीं होने पर कम विशिष्ट स्थानीय भिन्नताओं में फॉलबैक।

उदाहरण:

यूके में: अगर स्थानीय en_GB.UTF-8 था
(मैं विशिष्ट खिड़कियों के अर्थों में ढलान से नहीं शब्द dll का उपयोग)।

I18N.en_GB.UTF-8 dll के लिए पहले देखो। यदि यह DLL मौजूद नहीं है I18N.en_GB पर वापस आ जाता है यदि यह DLL मौजूद नहीं है I18N.en पर वापस आ जाता है यदि यह DLL मौजूद नहीं है I18N.default के लिए हो

इस नियम का एकमात्र अपवाद है: सरलीकृत चीनी (zh_CN) जहां फ़ॉलबैक अमेरिकी अंग्रेजी (en_US) है। यदि मशीन सरलीकृत चीनी का समर्थन नहीं करती है तो यह पूरी चीनी का समर्थन करने की संभावना नहीं है।







localization