2009-03-06 4 views
10

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

समस्या यह है कि मैं इसके साथ देखता हूं कि अगर स्थानीयकरण के बाद यूआई को बदलने की जरूरत है, तो हमें प्रत्येक भाषा के लिए अलग-अलग से अलग-अलग अंकों को अपडेट करना होगा जो इष्टतम से कम है। क्या किसी .strings फ़ाइल में प्रासंगिक मानों के लिए nib फ़ाइलों में प्रदर्शित तारों को शायद टाई करने का एक आसान तरीका है? या क्या मुझे प्रोग्रामिंग रूप से प्रत्येक ui तत्व (जो थोड़ा बेहतर है लेकिन अभी भी परेशान है) के लिए उन तारों को सेट करना होगा?

उत्तर

3
सबसे अच्छा तुम कर सकते हो

रिकर्सिवली प्रत्येक दृश्य के माध्यम से लूप है और फिर उन पर पाठ सेट:

static void translateView(NSBundle *bundle, UIView *view) 
{ 
    id idView = view; 
    if ([idView respondsToSelector:@selector(text)] && [view respondsToSelector:@selector(setText:)]) 
     [idView setText:[bundle localizedStringForKey:[idView text] value:nil table:nil]]; 
    if ([idView respondsToSelector:@selector(title)] && [view respondsToSelector:@selector(setTitle:)]) 
     [idView setTitle:[bundle localizedStringForKey:[idView title] value:nil table:nil]]; 
    if ([idView respondsToSelector:@selector(placeholder)] && [view respondsToSelector:@selector(setPlaceholder:)]) 
     [idView setPlaceholder:[bundle localizedStringForKey:[idView placeholder] value:nil table:nil]]; 
    if ([idView respondsToSelector:@selector(prompt)] && [view respondsToSelector:@selector(setPrompt:)]) 
     [idView setPrompt:[bundle localizedStringForKey:[idView prompt] value:nil table:nil]]; 
    if ([idView respondsToSelector:@selector(titleForState:)] && [view respondsToSelector:@selector(setTitle:forState:)]) 
     [idView setTitle:[bundle localizedStringForKey:[idView titleForState:UIControlStateNormal] value:nil table:nil] forState:UIControlStateNormal]; 
    if ([idView isKindOfClass:[UITabBar class]] || [idView isKindOfClass:[UIToolbar class]]) 
     for (UIBarItem *item in [idView items]) 
      [item setTitle:[bundle localizedStringForKey:[item title] value:nil table:nil]]; 
    for (UIView *subview in [view subviews]) 
     translateView(bundle, subview); 
} 

चेतावनी: आप चयनकर्ताओं सब कुछ को पकड़ने के लिए के अन्य सेट की जाँच करने के लिए है के मई । यह सबसे अच्छा अभ्यास नहीं है, लेकिन ऐसा लगता है कि बहुत कम काम

+0

दिलचस्प दृष्टिकोण में "बढ़ती वृद्धिशील स्थानीयकरण अपडेट" देखें ; जब हमारा ऐप आगे बढ़ता है तो मैं इसे आज़माउंगा। – Kevlar

+0

मैं इसे आज़माता हूं और एक स्टैक ओवरफ़्लो (यानी एक अनंत लूप) प्राप्त करता हूं – mamcx

+0

क्षमा करें, अंतिम पंक्ति में एक टाइपो है। इसे अनुवाद करना चाहिए (बंडल, सबव्यू); अनुवाद के बजाय दृश्य (बंडल, देखें); बेशक – rpetrich

2

मुझे लगता है कि आप कमांड लाइन उपकरण के बारे में पढ़ना चाहते हैं: ibtool। इसे सरल बनाना चाहिए जो आप करना चाहते हैं।

+1

हालांकि यह अनुवाद प्रक्रिया में स्वयं सहायता करता है, फिर भी अंत में एक अलग निब फ़ाइल होने का परिणाम होता है, जिसे मैं टालने की उम्मीद कर रहा हूं। यद्यपि सूचक के लिए धन्यवाद। – Kevlar

+0

मैंने इसे पहले इस्तेमाल नहीं किया है क्योंकि हम घर में स्थानीयकरण नहीं करते हैं। मैं इस धारणा के तहत था कि आप इसे 'निकालने' फ़ाइलों को उस चीज़ पर इस्तेमाल कर सकते हैं जिसे आप स्थानीयकृत कर सकते हैं और फिर निब फ़ाइल में फिर से सम्मिलित कर सकते हैं। निब फ़ाइल निश्चित रूप से जीयूआई के साथ मदद करता है .. –

+0

ibtool नए एनआईबी फाइलों को थूकने के लिए स्ट्रिंग्स को फिर से मुख्य एनआईबी फाइलों में फिर से भरने में सक्षम होना चाहिए, जिसमें नए स्ट्रिंग और नए निब दोनों बदलाव हैं। Http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/IB_UserGuide/LocalizingNibFiles/LocalizingNibFiles.html#//apple_ref/doc/uid/TP40005344-CH13 – mahboudz

0

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

मार्को

15

ऐप्पल के अंतर्निहित कमांड लाइन प्रोग्राम ibtool आपको ऐसा करने देता है। आप एक एक्सआईबी से तारों को डंप कर सकते हैं, उन्हें स्थानांतरित कर सकते हैं, फिर मौजूदा XIB के आधार पर एक नया XIB बना सकते हैं लेकिन स्थानीय तारों का उपयोग कर सकते हैं। तो आप हमेशा XIB का आधार सेट कर सकते हैं और जब भी स्थानीय तार बदलते हैं तो उन्हें फिर से बना सकते हैं। यहां अधिक जानकारी: http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/

0

मैं हमेशा सभी स्ट्रिंग्स .xib में केवल होने प्लेसहोल्डर के साथ विधि viewDidLoad() में आवश्यक निर्धारित किया है। इस तरह से मैं किसी भी .xib को आसानी से अद्यतन कर सकता हूं। केवल स्ट्रिंग फाइलों को अपडेट कर सकता है

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