2010-07-22 8 views
17

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

मैंने एक en_AU और en_NZ भाषा फ़ाइल बनाई है, लेकिन वे दोनों मानक अंग्रेजी फ़ाइल का उपयोग कर रहे हैं। मैंने अंग्रेजी भाषा फ़ाइल हटा दी, लेकिन यह जारी है ...

कोई विचार यह है कि मैं इसे कैसे काम कर सकता हूं?

धन्यवाद,

--D

+0

अंग्रेजी फ़ाइल को हटाने से समस्याओं का एक गुच्छा हुआ ... मेरे पास अन्य भाषाओं का एक गुच्छा काम कर रहा है, लेकिन जब मैं एक ही भाषा का उपयोग करना चाहता हूं लेकिन विभिन्न क्षेत्रों के लिए, यह काम नहीं करता है: एस – dewberry

उत्तर

37

iPhone localisations (या है कि स्थानीयकरणों?) क्षेत्र के किसी भी नोटिस नहीं लेते उपयोगकर्ता सेट (यानी, ब्रिटेन, ऑस्ट्रेलिया, न्यूजीलैंड)। डिफ़ॉल्ट रूप से केवल एक "अंग्रेजी" भाषा अनुवाद उपलब्ध है। हालांकि, आप एक अलग अनुवाद सेटिंग का उपयोग करने के लिए मजबूर करने के लिए चीजों के साथ चारों ओर हैक कर सकते हैं - मैंने इसे "अंग्रेजी" (यूएस) और "एन_जीबी" (ब्रिटिश अंग्रेजी) के बीच चुनने के लिए अभी किया है।

अपने main.m फ़ाइल में, यह बदल कि वह नीचे दिए तरह दिखता है

int main(int argc, char *argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

// Set up the locale jiggery pokery 
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; 
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]; 
if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"]; 
} 

int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 

}

यह उपयोगकर्ताओं भाषा पॉप (उदाहरण के लिए "(NZ या ए.यू. के लिए अपने स्वयं के परीक्षण में डाल) एन ") एनएसएसटींग भाषा में, और उपयोगकर्ता लोकेल (उदाहरण के लिए, एनजेड, जीबी, एयू) लोकेल एनएसएसटींग में। यदि वे (मेरे मामले में) मैच और जीबी से मेल खाते हैं, तो मैंने उपयोगकर्ताओं को डिफ़ॉल्ट भाषा प्राथमिकता सेटिंग्स "en_GB", फिर "en" सेट करने के लिए सेट किया है।

फिर, अपने आवेदन प्रतिनिधियों आवेदन में: didFinishLaunchingWithOptions विधि आपको लगता है कि NSUserDefaults की स्थापना तुम सिर्फ कोड

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"]; 

यह इस बिंदु पर दूर करने के लिए है क्योंकि सभी बंडल initialisation पूरा हो चुका है सुरक्षित है के साथ सेट निकालना चाहते हैं। आपका ऐप अब en_GB.lproj निर्देशिका में Localization.strings फ़ाइल का उपयोग कर रहा है।

यह एक भयानक, हैकी समाधान है, लेकिन यह मेरे लिए काम करता है।

+0

यह आपके लिए काम करता है , यह मेरे लिए काम करता है ... यह सिर्फ काम करता है! बहुत बढ़िया धन्यवाद! – dewberry

+0

इस उत्तर के लिए धन्यवाद। वास्तव में मेरी समस्याओं को हल करने में मेरी मदद की। – AppAspect

+0

एनएसएसटींग * भाषा = [[एनएसएलोकेल पसंदीदा भाषाएं] ऑब्जेक्टएट इंडेक्स: 0] के लिए धन्यवाद; – CReaTuS

4

Apple documents this missing iOS feature here.

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

14

मैं सोचता हूं कि मुझे लगता है कि रिकरभ के स्वीकृत उत्तर का थोड़ा बेहतर संस्करण है। एहसास करने वाली पहली बात यह है कि उपयोगकर्ता डिफ़ॉल्ट डोमेन में व्यवस्थित होते हैं, और @"AppleLanguages" कुंजी ऐप के डोमेन से नहीं आती है, लेकिन कुछ डोमेन से डोमेन के पदानुक्रम को ऊपर ले जाती है।यह उपयोगकर्ता चूक से निकालने के लिए पूरी तरह से सुरक्षित है इसका मतलब है:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

इस कोड को कॉल करने के बाद, आप ध्यान देंगे कि बुला [defaults objectForKey:@"AppleLanguages"] अभी भी एक मान देता है। तो, किसी बिंदु पर @"AppleLanguages" को हटाने के बजाय, जो आपके ऐप की जटिलता के आधार पर समस्याग्रस्त हो सकता है, आप इसके विपरीत करना चाहते हैं: @"AppleLanguages" तुरंत हटाएं। अनिवार्य रूप से, यह इसे अपने डिफ़ॉल्ट मान पर रीसेट करता है और सिस्टम में किए गए किसी भी बदलाव को कैप्चर करता है, उदाहरण के लिए, उपयोगकर्ता ने अपनी पसंदीदा भाषा बदल दी है।

यहाँ मैं क्या करना है:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy]; 
NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; 
NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"]; 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    [appleLanguages removeObject:languageAndRegion]; 
} 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    NSInteger index = [appleLanguages indexOfObject:language]; 
    [appleLanguages insertObject:languageAndRegion atIndex:index]; 
} 
[defaults setObject:appleLanguages forKey:@"AppleLanguages"]; 

(। नोट filteredArrayUsingPredicateFormat: एक विस्तार विधि मैंने लिखा है कि यह रॉकेट विज्ञान नहीं है यह पता लगाने की यह क्या करता है या यह कैसे काम करता है।)

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

+1

आईओएस 8.1 के साथ यह समाधान है। – Mike

+0

यह ठोस लग रहा है। जोड़ने के लिए एक बात, @ चयनकर्ता (फ़िल्टर किए गएअरेयूयूजिंगप्र्रेडिकेटफॉर्मैट :) एनएसएआरएआरई पर एक श्रेणी विधि है जिसे आप यहां पा सकते हैं: https://github.com/huguesbr/library-ios/blob/master/Categories/NSArray%2BFilteredSortedShortcuts.m –

+0

इसके अलावा , आप इसे अपने कोड में कहां रखते हैं: ऐप प्रतिनिधि या आपके "मुख्य" फ़ंक्शन में? –

0

मुझे जर्मन के साथ एक ही समस्या थी और मुझे लगता है कि मुझे "सही" समाधान मिला है। गलती यह थी कि मूल रूप से मेरी मूल भाषा केवल "जर्मन (डी)" थी, जब "जर्मन/ऑस्ट्रिया (डी_एटी)" स्थानीयकरण जोड़ते समय, फाइलों को नजरअंदाज कर दिया गया था। बेस भाषा को "जर्मन/जर्मनी (डी_डीई) में बदलते समय ऑस्ट्रेलियाई अनुवादों को नजरअंदाज नहीं किया गया था।

0

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

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