2012-09-10 14 views
19

में एक localizable.strings फ़ाइल लोड कर सकता हूं, मान लें कि मेरा ऐप केवल अंग्रेज़ी में चलता है। लेकिन जब भी मैं एक नई भाषा जोड़ता हूं, तब तक मैं एक नया संस्करण जारी नहीं करना चाहता हूं। मेरा प्रस्ताव है कि यह localizable.strings फ़ाइल को मेरे ऐप में दूरस्थ रूप से लोड करना है।क्या मैं एक आईओएस ऐप ऑन-द-एयर

मेरे ऐप में ftp साइटों से फ़ाइलों को लोड करने की सुविधा है।

क्या आप सोचते हैं कि भाषाएं इस तरह से लोड करना संभव है? या क्या ऐप को संकलित समय पर भाषा फ़ाइल संकलित करना है?

+0

वही प्रश्न http://stackoverflow.com/questions/12358379/is-it-possible-to-access-the-app-bundles-en-lproj के समान प्रश्न? –

+0

प्रश्न का उत्तर पहले से ही दिया गया है [यहां] (http://stackoverflow.com/a/6075533/1651167) – Shelm

+1

सिमुलेटर है लेकिन लोग पूछे जाने वाले तरीके के आधार पर अलग-अलग प्रश्नों का उत्तर देते हैं। यह स्पष्ट रूप से नीचे बेहतर जवाब है। – mskw

उत्तर

32

सभी स्थानीयकृत स्ट्रिंग संसाधन (साथ ही कई अन्य प्रकार के संसाधन) बंडल से निकाले जाते हैं। आम तौर पर एक ऐप "मुख्य बंडल" का उपयोग करता है जो कि आपके ऐप के साथ एक्सकोड द्वारा बनाई गई एक है। लेकिन आप अलग-अलग किसी अन्य बंडल को बना सकते हैं, बशर्ते आप इसे सही संरचना के साथ बना सकें, फिर आप इसे अपने ऐप में डाउनलोड कर सकते हैं और अंत में NSLocalizedStringFromTableInBundle() फ़ंक्शन का उपयोग करके स्थानीयकृत स्ट्रिंग निकाल सकते हैं।

तो मान लीजिए कि आप एक कुंजी "KEY" भाषा अनुवाद के लिए निकालने हैं, तो सामान्य वाक्य रचना होगा:

NSString *translated = NSLocalizedStringFromTable(@"key",nil,nil); 

लेकिन इस विकल्प है कि आप पहले समूह को निर्दिष्ट कर सकते हैं का एक प्रकार है:

NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil); 

मानक मामले में आप [NSBundle mainBundle] साथ myBundle की जगह लेकिन आप इसे इस तरह से निर्दिष्ट कर सकते हैं यदि आप किसी अन्य बंडल का उपयोग करना चाहते हैं:

NSString *myBundlePath = "the path to the downloaded bundle"; 
NSBundle *myBundle = [NSBundle bundleWithPath:myBundlePath]; 
NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil); 

एक बंडल का पूरा ढांचा "बंडल प्रोग्रामिंग गाइड" एप्पल डॉक्स में में देखा जा सकता है, लेकिन आपके मामले में आप बस इस तरह से बना सकते हैं: अपने मैक एक निर्देशिका बनाने में

  • , और इसे "MyBundle"
  • इस निर्देशिका के अंदर अपनी स्थानीय स्ट्रिंग को स्थानांतरित करें (यदि आपके पास बंडल में एकाधिक भाषाएं हैं तो localizable.strings फ़ाइल lproj निर्देशिकाओं के अंदर होगी: en.lproj, it.lproj, fr .lproj, ...)
  • फिर निर्देशिका को "MyBundle.bundle" का नाम बदलें

आप अंतिम ऑपरेशन के साथ नोटिस करेंगे कि अब यह ऑब्जेक्ट एक स्टैंडअलोन ऑब्जेक्ट के रूप में देखा जाता है लेकिन वास्तव में यह एक निर्देशिका है।

अब आप एक बहु-बंडल दृष्टिकोण रखने या एकल-बंडल तकनीक का पालन करने का निर्णय ले सकते हैं: बाद के मामले में आप सभी भाषाओं को पैकेज कर सकते हैं और फिर स्वत: सिस्टम स्थानीयकरण नियमों का उपयोग करके भाषा अनुवाद के लिए अद्वितीय अद्यतन बंडल का उपयोग कर सकते हैं ; दूसरे मामले में आप प्रत्येक भाषा के लिए एक बंडल बना सकते हैं और फिर - वर्तमान में चयनित भाषा के आधार पर - उपयुक्त बंडल लोड करें और इसे अपने अनुवादों के लिए चुनें।

+3

बहुत उपयोगी! दुर्भाग्यवश, यदि आप ऐप स्टोर मेटाडेटा (जिसे आप शायद एक नया स्थानीयकरण जोड़ना चाहते हैं) के स्थानीयकरण को जोड़ना चाहते हैं, तो आपको किसी भी ऐप अपडेट को सबमिट करना होगा ... –

+0

ऐप स्टोर मेटाडाटा का उपयोग किस लिए किया जाएगा? – mskw

+1

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