2012-11-27 7 views
24

मैं अपना आईओएस ऐप स्थानीयकरण कर रहा हूं, और सिम्युलेटर में यह हर बार मेरी चुनी भाषा में सही ढंग से चलता है।मेरा आईओएस ऐप केवल पहली बार ठीक से वर्तमान भाषा का पता क्यों लगाता है?

मेरे आईफोन 5 पर परीक्षण करते समय, यह केवल ऐप चलाने पर पहली बार भाषा का पता लगाता है। हर बार जब मैं डिवाइस पर अपना ऐप पुन: संकलित करता हूं और चलाता हूं, तो यह भाषा के रूप में "एन" का पता लगाता है, भले ही मैं Español ("es") के साथ परीक्षण कर रहा हूं।

[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]

मैं भी उपयोग किया है::

[[NSLocale preferredLanguages] objectAtIndex:0]

एक ही परिणाम

मैं का उपयोग कर भाषा का पता लगाने।

यदि मैं पहले रन के बाद ऐप को मारता हूं, और डिवाइस पर पुनरारंभ करता हूं, तो यह भाषा को सही तरीके से पहचानता रहता है।

लेकिन अगर मैं ऐप को मारता हूं और फिर प्रारंभिक दौड़ के बाद एक्सकोड के माध्यम से पुनः संकलित/पुनरारंभ करता हूं, तो इसके बजाय यह "एन" (अंग्रेज़ी) के साथ लोड होगा।

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

मेरे डिवाइस पर अन्य सभी ऐप्स पूरे समय स्पेनिश भाषा के साथ प्रदर्शित होते हैं। संपूर्ण यूआई स्पेनिश में दिखाता है।

अद्यतन: अब मैंने अपने आईपैड (तीसरे जीन) पर आईओएस 6 चलाने का परीक्षण किया है, और एक ही व्यवहार का अनुभव कर रहा हूं।

अद्यतन 2: (भाषा एक NSString * है):

didFinishLaunchingWithOptions में, मैं भाषा का पता लगाने के लिए इस कोड है

language = [[NSLocale preferredLanguages] objectAtIndex:0];

इस डिबगिंग बयान इसके बाद, तुलना करने के लिए मूल्य मैं प्राप्त कर रहा हूं, साथ ही इसे पहचानने का थोड़ा अलग तरीका, केवल डीबगिंग के लिए:

NSLog(@"Detected language: %@/%@", language, [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]);

आउटपुट "डिटेक्टेड भाषा: es/es" के रूप में दिखाता है जब ऐप स्पैनिश मोड में ठीक से काम करता है, और उसके बाद "पता लगाई गई भाषा: en/en" के रूप में दिखाता है। अभी भी कोई विचार नहीं है कि यह कभी-कभी अंग्रेजी के रूप में लोड करने का फैसला क्यों करता है ...

अद्यतन 4: मैं सभी के उत्तरों की सराहना करता हूं, और मैंने विभिन्न सुझावों का प्रयास किया है। दुर्भाग्य से मैं +100 बाउंटी पुरस्कार देने में असमर्थ था क्योंकि इस मुद्दे को हल करने के लिए कोई सुझाव नहीं था। अगर कोई अंतिम समाधान करता है जो मेरे लिए काम करता है, तो मैं उस समय उन्हें एक और +50 बक्षीस दूंगा।

अद्यतन 5: मैंने एक्सकोड 4.5 से 4.5.2 तक अद्यतन किया है, और इस समस्या का सामना कर रहा है।

अद्यतन 6: मैंने अब स्क्रैच से एक नया परीक्षण प्रोजेक्ट बनाया है, और यह पूरी तरह से ठीक काम करता है! जाहिर है कि मेरी परियोजना को निर्धारित करने के तरीके में कुछ गलत होना चाहिए, या शायद डेटा फ़ाइलों में से एक में। मुझे लगता है कि मेरी अगली यात्रा खरोंच से परियोजना को फिर से बनाने के लिए, एक के बाद एक से अधिक फ़ाइल डेटा की प्रतिलिपि हो जाएगा ...

अद्यतन 7 (महीने बाद): दुख की बात है, मैं फिर से अस्थायी रूप से हल करने के बाद इस मुद्दे का सामना करना पड़ रहा यह (प्रतीत होता है) दर्दनाक रूप से मेरी परियोजना को पुनर्जीवित करके। पहले लोड पर, भाषा सही ढंग से प्रस्तुत की जाती है, लेकिन बाद के भार पर, यह वापस अंग्रेजी में वापस आती है।

सोल्व मेरा अंतिम समाधान below देखें। सहायता के लिए हर किसी को धन्यवाद। मैं कुछ बकाया राशि निकाल सकता हूं क्योंकि यह वैसे भी बर्बाद हो जाएगा।

+2

मेरे पास वास्तव में आपके साथ साझा करने के लिए बहुत कुछ नहीं है, लेकिन क्या आपने -अप्पल भाषा "(अंग्रेज़ी") रन पैरामीटर के साथ खेला था? (Http://dl.dropbox.com/u/15994997/Screenshots/2h.png देखें, जो योजनाएं अनुभाग अनुभाग में है)। मुझे संदेह है कि यह मुद्दा है लेकिन यह एकमात्र चीज है जो यह मानने के लिए आती है कि आपका कोड ठीक है। साथ ही, मुझे यकीन है कि आपने ऐसा किया है, लेकिन इसे लोकेल से प्राप्त करने के बाद बस एनएसएलओजी के साथ भाषा को प्रिंट करने का प्रयास करें और सत्यापित करें कि यह आपका शेष कोड नहीं है। – Mayjak

+0

क्या आपने आईओएस 5 में इसका परीक्षण किया है? शायद यह एक आईओएस 6 बग है? – Lefteris

+0

@Estarriol मैं आपकी दोपहर भाषा को आज दोपहर एक शॉट दे दूंगा। मैं मूल्य प्राप्त करने के बाद मैं एनएसएलओजी के साथ प्रिंट कर रहा हूं, और यह पहली बार "es" के रूप में रिपोर्ट करता है जब यह काम करता है, और फिर यह विफल होने पर "एन" होता है। अगर मैं ऐप से बाहर निकलता हूं, तो आईओएस में बाकी सब कुछ स्पैनिश में होने की उम्मीद है। –

उत्तर

7

मैंने कई महीनों के बाद इस समस्या को अंतिम रूप से हल किया है! मदद के लिए सभी के लिए धन्यवाद (मैं देव चैनलों के माध्यम से एक ऐप्पल डेवलपर के साथ कुछ अच्छा और आगे भी था)।

टी एल; डॉ: मैंने गलती से, उपकरणों के बीच भाषा प्राथमिकताओं को सिंक करना था (कई अन्य अप्रत्याशित बातों के अलावा) मेरे ऐप की iCloud कुंजी मान दुकान का उपयोग कर (MKiCloudSync के माध्यम से)! पढ़ें ...

मैं एमके क्लाउडसिंक नामक एक थर्ड-पार्टी क्लास का उपयोग कर रहा हूं, जो मेरे ऐप के iCloud कुंजी मान स्टोर में [NSUserDefaults standardUserDefaults] को सिंक करने में मदद करता है। मेरा इरादा जब मैंने इसका उपयोग करना शुरू किया था, तो इसे पृष्ठभूमि में समन्वयित करने वाले कुछ उपयोगकर्ता पसंदीदा को संभालने देना था।

हालांकि, यह समझ में नहीं आता कि standardUserDefaults कैसे काम करता है, मुझे यह नहीं पता था कि standardUserDefaults में अपनी कई कस्टम ऐप सेटिंग्स के अलावा अन्य कई चीजें लिखी जा रही हैं!

  1. प्रारंभ पहली बार इस एप्लिकेशन अप:

    तो क्या हो रहा था इस था। ताजा standardUserDefaults जगह पर, और आंतरिक "AppleLanguages" कुंजी जो भाषा वरीयताओं की क्रमबद्ध सूची संग्रहीत करती है वह वर्तमान डिवाइस विकल्पों के आधार पर सही है।

  2. ऐप निर्दिष्ट भाषा में ठीक से प्रदर्शित करता है।

  3. पृष्ठभूमि में, MKiCloudSync iCloud में सभी standardUserDefaults समन्वयित करता है। इसके विपरीत, यदि आपने इस ऐप को कहीं और चलाया है, तो एक अंग्रेजी सेट डिवाइस के साथ कहें, उस डिवाइस ने iCloud तक इसकी भाषा सेटिंग्स को भी समन्वयित किया होगा। तो अब यह वर्तमान चल रहा ऐप वास्तव में इसकी भाषा वरीयताओं को अधिलेखित कर रहा है।

  4. BOOM ... अगली बार ऐप चलाया जाता है, इससे कोई फर्क नहीं पड़ता कि आपने डिवाइस पर क्या चुना है, यह जो भी iCloud से खींचा गया है जिसे डिफ़ॉल्ट भाषा के रूप में उपयोग किया जाएगा!

    1. उपयोग एक forked version of MKiCloudSync कि केवल श्वेतसूची कुंजी नाम सिंक्रनाइज़ करने के लिए अनुमति देता है:

    मैं अपने अगले अनुप्रयोग अद्यतन के साथ इस मुद्दे को हल करने के लिए क्या करने की योजना है क्या।

  5. जोड़ें कोड है कि एक बार की सफाई करना होगा, पहले मेरी अनुप्रयोग के लिए iCloud कुंजीस्टोर की सफाई, तो (based on this SO answer), उपयोगकर्ता चूक पुनर्स्थापित करने के लिए इस कोड को बुला:

    NSString * appdomain = [[ एनएसबंडल मेनबंडल] बंडल इंडेंटिफायर]; [[NSUserDefaults standardUserDefaults] RemovePersistentDomainForName: appDomain];

मेरे परीक्षण में अब तक, इस तरह के मुद्दे को हल करती है ... दुर्भाग्य से, उपयोगकर्ता में किक करने भाषा सुधार के लिए एप्लिकेशन को पुनः प्रारंभ करना होगा। लेकिन, मेरा अनुमान अधिकांश उपयोगकर्ताओं को सामना नहीं कर रहे है यह समस्या, क्योंकि वे अलग-अलग डिफ़ॉल्ट भाषाओं के साथ कई उपकरणों का उपयोग करने की संभावना नहीं है।

+0

क्या आपने अपना निर्माण फ़ोल्डर साफ करने का प्रयास किया था? Cmd + option + shift + k – Danra

+0

यह सिर्फ मेरी जान बचाई।वैसे भी, ये कुंजी हैं जिन्हें अनदेखा किया जाना चाहिए: [[एनएसएमयूटेबलसेट सेट विथऑब्जेक्ट्स: @ "ऐप्पलिक्यूफोर्स 24 हॉरटाइम", @ "ऐप्पलिट्यून्सस्टोरइटेमकिंड्स", @ "ऐप्पलकेबोर्ड", @ "ऐप्पलकेबोर्ड्स एक्सपेन्डेड", @ "ऐप्पल लैंगेज", @ "ऐप्पल लॉकले", @ "एनएसआईएनटरफेस स्टाइल" , @ "एनएस भाषाएं", @ "ओपनयूडीआईडी", @ "स्टैट्सडोन", @ "यूआईडीएसएबल लेगेसीटेक्स्टव्यू", शून्य] बनाए रखें]; –

+0

@AndreiRadulescu आप शायद उन कुंजीों को श्वेतसूची से बेहतर कर देंगे जिन्हें आप सिंक करना चाहते हैं, क्योंकि ऐप्पल भविष्य में नई कुंजी पेश कर सकता है जो आपको कुछ अन्य अप्रत्याशित समस्याओं का कारण बन सकता है ... –

2

मैंने बिना किसी समस्या के अपने आईफोन 5 पर अपने कदमों का परीक्षण किया। इससे मुझे लगता है कि यहां खेलने के लिए कुछ और है: शायद कुछ ऐसे तरीके से हस्तक्षेप कर रहे हैं जिसमें आप लोकेल वैल्यू पढ़ रहे हैं।

चरणों मैं सलाह देते हैं क्या आप इस मुद्दे को डिबग मदद करने के लिए ले रहे हैं:

  1. पोस्ट विधि है जिसमें आप पसंद की भाषा मूल्य प्राप्त कर रहे हैं की पूरी कोड। सुनिश्चित करें कि प्रत्येक बार ऐप चलाने पर विधि निष्पादित की जाती है।
  2. सुनिश्चित करें कि आपके द्वारा पोस्ट किए गए कोड में एनएसएलओजी निर्देश का स्थान शामिल है जिसका उपयोग आप भाषा सेटिंग के लिए परीक्षण कर रहे हैं।
  3. क्या आप पहले रन के बाद कहीं और पसंदीदा भाषा संग्रहीत कर रहे हैं?
+0

यहां तक ​​कि मेरे कोड में ऐसी चीजें जो स्पष्ट रूप से उस मूल्य का उपयोग नहीं करती हैं जिसे मैं पसंदीदा भाषा के रूप में पहचानता हूं, वापस अंग्रेजी में वापस आ जाता है। उदाहरण के लिए, मैंने स्टोरीबोर्ड फ़ाइलों और स्थानीयizable.strings फ़ाइलों को स्थानीयकृत किया है जो प्रारंभिक लोड पर स्पैनिश में काम करते हैं। फिर बाद में जब यह अंग्रेजी में स्विच हो जाता है, तब भी वे चीजें वापस आती हैं। –

0

क्या आप किसी भाषा से संबंधित कुछ सहेजने के लिए NSUserDefaults का उपयोग करते हैं?

अपने सिम्युलेटर अनुप्रयोग निर्देशिका में

देखो -> लाइब्रेरी -> प्राथमिकताएं -><YourAppBundleName>.plist

देखें: कोई भाषा सेट करने के NSUserDefaults विधि के विवरण के लिए How to force NSLocalizedString to use a specific language

शायद आप अपनी भाषा को बचाएं और इस प्रकार पहचान सिर्फ सहेजे गए मूल्य को वापस कर दे।

+0

उत्तर के लिए धन्यवाद। मैं कुछ भी संबंधित भाषा को बचाने के लिए NSUserDefaults का उपयोग नहीं कर रहा हूं। –

2

निम्न कोड के साथ प्रयास करें:

LocalizationSystem.h ===

#import <Foundation/Foundation.h> 

#define AMLocalizedString(key, comment) \ 
[[LocalizationSystem sharedLocalSystem] localizedStringForKey:(key) value:(comment)] 

#define LocalizationSetLanguage(language) \ 
[[LocalizationSystem sharedLocalSystem] setLanguage:(language)] 

#define LocalizationGetLanguage \ 
[[LocalizationSystem sharedLocalSystem] getLanguage] 

#define LocalizationReset \ 
[[LocalizationSystem sharedLocalSystem] resetLocalization] 

@interface LocalizationSystem : NSObject { 
    NSString *language; 
} 


+ (LocalizationSystem *)sharedLocalSystem; 

//gets the string localized 
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment; 

//sets the language 
- (void) setLanguage:(NSString*) language; 

//gets the current language 
- (NSString*) getLanguage; 

//resets this system. 
- (void) resetLocalization; 

@end 

LocalizationSystem.m ===

#import "LocalizationSystem.h" 

@implementation LocalizationSystem 

//Singleton instance 
static LocalizationSystem *_sharedLocalSystem = nil; 

//Current application bundle to get the languages. 
static NSBundle *bundle = nil; 

+ (LocalizationSystem *)sharedLocalSystem{ 
    @synchronized([LocalizationSystem class]) 
    { 
     if (!_sharedLocalSystem){ 
      [[self alloc] init]; 
     } 
     return _sharedLocalSystem; 
    } 
    // to avoid compiler warning 
    return nil; 
} 

+(id)alloc{ 
    @synchronized([LocalizationSystem class]) 
    { 
     NSAssert(_sharedLocalSystem == nil, @"Attempted to allocate a second instance of a singleton."); 
     _sharedLocalSystem = [super alloc]; 
     return _sharedLocalSystem; 
    } 
    // to avoid compiler warning 
    return nil; 
} 

- (id)init{ 
    if ((self = [super init])) 
    { 
     //empty. 
     bundle = [NSBundle mainBundle]; 
    } 
    return self; 
} 

// Gets the current localized string as in NSLocalizedString. 

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment{ 
    return [bundle localizedStringForKey:key value:comment table:nil]; 
} 

// If this function is not called it will use the default OS language. 
// If the language does not exists y returns the default OS language. 
- (void) setLanguage:(NSString*) l{ 
    NSLog(@"preferredLang: %@", l); 

    NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ]; 


    if (path == nil) 
     //in case the language does not exists 
     [self resetLocalization]; 
    else 
     bundle = [[NSBundle bundleWithPath:path] retain]; 

    [[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:l, nil] forKey:@"AppleLanguages"]; 
} 

// Just gets the current setted up language. 
// returns "es","fr",... 
// 
// example call: 
// NSString * currentL = LocalizationGetLanguage; 
- (NSString*) getLanguage{ 

    NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]; 

    NSString *preferredLang = [languages objectAtIndex:0]; 

    return preferredLang; 
} 

// Resets the localization system, so it uses the OS default language. 
// 
// example call: 
// LocalizationReset; 
- (void) resetLocalization{ 
    bundle = [NSBundle mainBundle]; 
} 


@end 

इस कोड को पूरी तरह से काम करता है के रूप में आप का उल्लेख किया। यह मेरे लिए काम करता है और यदि आप जांचना चाहते हैं तो यह गेम अब ऐप स्टोर लाइव है (ह्यूशैप्स)।

+0

मैं आपकी प्रतिक्रिया की सराहना करता हूं, लेकिन जब तक कि मुझे कुछ याद नहीं आ रहा है, अंततः आप '[[NSUserDefaults standardUserDefaults] ऑब्जेक्ट फोरकी: @ "AppleLanguages"] को भाषा प्राप्त करने के लिए बुला रहे हैं, जो कई कॉलों में से एक है जिसे मैंने पहले से ही कोशिश की है, और मुझे अभी भी एक ही समस्या का अनुभव है ... यह पहली बार काम करता है ("es" के साथ वापस आता है) और उसके बाद के बाद के रनों में यह असफल हो जाता है (बदले में "एन" देता है, भले ही मैंने फोन को वापस फोन में नहीं बदला)। –

+0

क्या आप ऐप से या डिवाइस की सेटिंग्स से भाषा बदल रहे हैं, यदि ऐप से तो क्या आप स्थानीयकरण कोड साझा कर सकते हैं। डिवाइस की सेटिंग्स से –

+0

। –

3

सेटिंग्स-> सामान्य-> अंतरराष्ट्रीय में, स्थान भाषा सेट करने का एक विकल्प है। यदि आप उस भाषा में सेट करते हैं जिसे आप परीक्षण करने का प्रयास कर रहे हैं तो यह काम करेगा यदि आपका कोड सही है।

+0

हाँ, इस तरह मैं इसका परीक्षण करने की कोशिश कर रहा हूं। इस प्रकार मैं जिस भाषा का परीक्षण कर रहा हूं उसका चयन करता हूं (इस मामले में स्पेनिश)। जैसा कि मेरे प्रश्न में वर्णित है, यह केवल पहली बार काम करता है। एक बार जब मैं अपना कोड दूसरी बार चलाता हूं, तो ऐसा लगता है कि यह भाषा रीसेट करता है, भले ही बाकी फोन इंटरफ़ेस यह स्पष्ट करता है कि मैं अभी भी स्पेनिश में सही ढंग से सेट हूं। –

+1

यह एक एक्सकोड बग के कारण होना चाहिए (एक्सकोड अपडेट करने का प्रयास करें) – OnkaPlonka

+0

मैं इसे आज़मा दूंगा और रिपोर्ट करूंगा। ऐसा लगता है कि मैं एक्सकोड 4.5 पर था, और नवीनतम रिलीज 4.5.2 है। –

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