2012-08-30 21 views
28

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

उदाहरण के लिए, हमें NSLocalizedString प्रयोग करने के लिए, मैं इसे main.m पर रनटाइम पर भाषा सेट करने के लिए जब अपने AppDelegate आरंभ नहीं किया है संभव है पता है, लेकिन एक बार यह आरंभ नहीं हो जाता (विशेष रूप से आपके विचार नियंत्रक बनाई गई है), इसे बदल गया है नहीं अगले पुनः आरंभ

[[NSUserDefaults standardUserDefaults] 
    setObject:[NSMutableArray arrayWithObjects:language, nil] 
    forKey:@"AppleLanguages"]; 

किसी को भी पता नहीं है कि कैसे उन गतिशील भाषा बदलें एप्लिकेशन को पुन: प्रारंभ बिना किया जा सकता जब तक असर?

+0

खिड़की को हटाने और इंटरफ़ेस को पुनर्निर्मित करने के तरीके के बारे में कैसे 'एप्लिकेशन: didFinishLaunchingWithOptions: '। मैंने खुद की कोशिश नहीं की है लेकिन शायद यह –

+1

समीक्षा [यह लिंक] [1] आपकी मदद कर सकती है। [1]: http://stackoverflow.com/questions/1576904/how-to-change-iphone-app-language-during-runtime [यह एक] (http के –

+0

संभावित दोहराव: // stackoverflow.com/questions/11578298/change-application-language-setting-in-ios-not-the-whole-device/11578590#11578590)। इसके अलावा, मैंने वहां एक साधारण उत्तर पोस्ट किया है। आप प्रत्येक भाषा के लिए सभी आवश्यक तारों के साथ एक दस्तावेज़ बना सकते हैं और उन्हें इससे लोड कर सकते हैं। –

उत्तर

1

मैं हमेशा इस तरह से उपयोग कर रहा हूं, यह पूरी तरह से काम करता है, यह आपकी मदद भी कर सकता है।


आप सभी ग्रंथों NSLocalizableString(...) साथ UI के लिए वर्तमान भाषा के लिए अपने हर UIViewController की -viewWillAppear: विधि में स्थापित करना चाहिए।

इस तरह से आप (मेरा मतलब है, उन) का उपयोग कर सेटिंग में iOS की भाषा बदलने के बाद आवेदन को पुनः आरंभ करने की जरूरत नहीं है।


निश्चित रूप से , मैं एप्पल के मानक स्थानीयकरण वास्तुकला का प्रयोग कर रहा हूँ।

पर (24 अक्टूबर 2013) अद्यतन

मैं –viewWillAppear: विधि का अनुभव किया है वास्तविक दृश्य जब आवेदन को अग्रभाग में प्रवेश करती है के लिए प्रदर्शन किया जाना नहीं होगा; उस समस्या को हल करने के लिए जब मैं दृश्य में UIApplicationWillEnterForegroundNotification अधिसूचना प्राप्त करता हूं तो मैं प्रक्रिया (ऊपर देखें) भी करता हूं।

+0

आप भाषा कैसे बदलते हैं? – Dejell

+0

_Settings_ अनुप्रयोग में: _General_ -> _International_ -> _Language_, यदि आपका एप्लिकेशन चयनित भाषा का समर्थन करता है, जब आप अपने आवेदन पर वापस स्विच करते हैं तो यह नई भाषा का उपयोग करने के साथ दिखाई देगा; आप अपने ऐप में सत्र जारी रख सकते हैं जो आपने पहले शुरू किया था। – holex

+5

लेकिन यह सवाल का जवाब नहीं दे रहा है कि इसे प्रोग्राम के अनुसार कैसे करें – Dejell

5

वहाँ अन्य तरीकों में से कुछ चर्चा है यहाँ, विशेष रूप से एक अधिसूचना आधारित दृष्टिकोण: (1) संसाधनों के पुन: स्थानीयकरण स्वचालित रूप से लोड:

iOS: How to change app language programmatically WITHOUT restarting the app?

मेरी नजर में यहां वास्तव में तीन कार्य देखते हैं महत्वपूर्ण व्यक्ति। (उदाहरण के लिए यदि आप गतिशील रूप से किसी अन्य कस्टम UIView को निब से तुरंत चालू करते हैं, तो "पुरानी" भाषा स्ट्रिंग्स और सेटिंग्स (छवियां, टेक्स्ट दिशा) अभी भी लोड हो जाएंगी) (2) वर्तमान में स्क्रीन पर प्रदर्शित स्ट्रिंग का पुन: स्थानीयकरण। (3) प्रोग्राम कोड में डेवलपर (आप) द्वारा डाले गए स्ट्रिंग का पुन: स्थानीयकरण।

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

(1) के लिए, यदि आपने इंटरफ़ेस बिल्डर में अपना स्थानीयकरण नहीं किया है, बल्कि आप इसे गतिशील रूप से देखते हैं DidLoad, आदि, कोई समस्या नहीं है। आप उसी व्यवहार का उपयोग कर सकते हैं जिस पर चर्चा की गई है (यानी, संशोधित NSLocalizedString, आदि)। अन्यथा आप या तो (ए) उपर्युक्त लिंक (जटिल) में वर्णित अधिसूचना प्रणाली को कार्यान्वित कर सकते हैं, या (बी) स्थानीयकरण को आईबी से देखने के लिए डीडलोड लोड करने पर विचार करें, या (सी) initWithNibName: ओवरराइड करने का प्रयास करें और पुरानी भाषा से लोड ऑब्जेक्ट को स्वैप करें संसाधन, नए भाषा संसाधनों के साथ लोड एक के साथ। यह इस चर्चा के बहुत नीचे मोहम्मद द्वारा वर्णित एक दृष्टिकोण था: http://learning-ios.blogspot.ca/2011/04/advance-localization-in-ios-apps.html। उनका दावा है कि यह समस्याएं पैदा करता है (viewDidLoad नहीं कहा जाता है)। यहां तक ​​कि यदि यह काम नहीं करता है, तो इसे आज़माकर आपको कुछ ऐसा करने की ओर इशारा कर सकता है जो करता है।

अंत में, (2) संभावित रूप से सबसे आसान कार्य है: केवल वर्तमान दृश्य को हटाएं और दोबारा जोड़ें (या कुछ मामलों में, इसे फिर से निकालें)।

0

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

पाठ

_lblHeading.text = [self languageSelectedStringForKey:@"ViewHeadingInfo"]; 

/** 
This method is responsible for selecting language bundle according to user's selection. 
@param: the string which is to be converted in selected language. 
@return: the converted string. 
@throws: 
*/ 

-(NSString*) languageSelectedStringForKey:(NSString*) key 

{ 

    NSString* str=[[CommonData sharedCommonData].languageBundle localizedStringForKey:key value:@"" table:nil]; 

    return str; 

} 
2

विचार NSLocalizedString की तरह एक नया मैक्रो जो करता है, तो एक और विशिष्ट बंडल या नहीं से अनुवाद लेने के लिए जाँच करनी चाहिए लिखने के लिए के लिए XIB

self.homeScreen = [[HomeScreen alloc] initWithNibName:@"HomeScreen" bundle:[CommonData sharedCommonData].languageBundle]; 

लिए।

विधि 2this article में वास्तव में बताएं कि यह कैसे करना है। इस विशेष मामले में, लेखक एक नए मैक्रो का उपयोग नहीं करता है, लेकिन सीधे [NSBundle mainBundle] के लिए एक कस्टम क्लास सेट करें।

मुझे आशा है कि @ होलेक्स इसे पढ़ने में समस्या को समझ पाएगा।

NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; 
NSBundle *languageBundle = [NSBundle bundleWithPath:path]; 

और मैक्रो/समारोह NSLocalizedString की तरह जो कि बंडल पर अपने लोड बंडल या उपयोग तरीकों का उपयोग कर:

-1

आप किसी अन्य (जहां @ "एन" स्थान हो सकता है आप की जरूरत) इस तरह बंडल लोड करने के लिए की जरूरत है सीधे सभी एप्लिकेशन स्थानीयकरणों ("बेस" सहित) इस

[languageBundle localizedStringForKey:key value:value table:tableName]; 

[[NSBundle mainBundle] localizations] सूचियों की तरह।

इसके अलावा मैंने helper class लिखा है जो यह करता है (ध्यान दें कि इसमें एक निर्भरता के रूप में ReactiveCocoa है)। यह ऐप को पुनरारंभ किए बिना भाषा परिवर्तन की अनुमति देता है और जब भी यह बदल जाता है तो वर्तमान लोकेल भेजता है।

+0

यह सुनिश्चित नहीं है कि यह दिए गए अन्य उत्तरों पर कैसे सुधार करता है। – Popeye

+0

ठीक है, इसे NSLocalizedString को सबसे अधिक उत्तर देने वाले उत्तर के रूप में परिभाषित करने की आवश्यकता नहीं है, यह ऐसा करने के तरीके को रेखांकित करता है जिसे ऐप को पुनरारंभ करने की आवश्यकता नहीं होती है और समीक्षा के साथ कोई समस्या नहीं होती है और रुचि के लिए नमूना कोड (अस्वीकरण के साथ) है । यदि आपके पास सुझाव हैं कि इसे कैसे सुधारें - मैं उन्हें देखना और जवाब में सुधार करना चाहता हूं। –

+0

मैं अभी भी नहीं देखता कि आपका उत्तर पहले से ही क्या कहा जा रहा है पर सुधार करता है। पुराने प्रश्नों का उत्तर देते समय जिनके पास पहले से ही एक उत्तर दिया गया है, आपको यह बताने की ज़रूरत है कि आपका ऐसा करने का बेहतर तरीका क्यों हो सकता है और कोड साझा करने के लिए कोड को केवल एक लिंक नहीं बल्कि लिंक साझा करने का एक बेहतर तरीका हो सकता है क्योंकि लिंक समाप्त हो जाते हैं। – Popeye

0

मेरा कार्यान्वयन भाषा बदलने और वर्तमान भाषा बंडल तक पहुंचने के लिए कक्षा का उपयोग करता है। यह एक उदाहरण है इसलिए यदि आप मुझसे अलग भाषाओं का उपयोग करना चाहते हैं तो अपने सटीक भाषा कोड का उपयोग करने के तरीकों को बदलें।

यह कक्षा एनएसएलोकेल से पसंदीदा भाषाओं तक पहुंच जाएगी और पहली वस्तु ले जाएगी जिसका उपयोग भाषा है।

// Access a localized image 
[[OSLocalization currentLanguageBundle] pathForResource:@"my_image_name.png" ofType:nil] 
// Access a localized string from Localizable.strings file 
NSLocalizedStringFromTableInBundle(@"StringKey", nil, [OSLocalization currentLanguageBundle], @"comment") 

में लाइन बदलें भाषा नीचे की तरह या कक्षा में "changeCurrentLanguage" विधि अपडेट ऊपर लेने के लिए:

@implementation OSLocalization 

+ (NSBundle *)currentLanguageBundle 
{ 
    // Default language incase an unsupported language is found 
    NSString *language = @"en"; 

    if ([NSLocale preferredLanguages].count) { 
     // Check first object to be of type "en","es" etc 
     // Codes seen by my eyes: "en-US","en","es-US","es" etc 

     NSString *letterCode = [[NSLocale preferredLanguages] objectAtIndex:0]; 

     if ([letterCode rangeOfString:@"en"].location != NSNotFound) { 
      // English 
      language = @"en"; 
     } else if ([letterCode rangeOfString:@"es"].location != NSNotFound) { 
      // Spanish 
      language = @"es"; 
     } else if ([letterCode rangeOfString:@"fr"].location != NSNotFound) { 
      // French 
      language = @"fr"; 
     } // Add more if needed 
    } 

    return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]]; 
} 

/// Check if preferred language is English 
+ (BOOL)isCurrentLanguageEnglish 
{ 
    if (![NSLocale preferredLanguages].count) { 
     // Just incase check for no items in array 
     return YES; 
    } 

    if ([[[NSLocale preferredLanguages] objectAtIndex:0] rangeOfString:@"en"].location == NSNotFound) { 
     // No letter code for english found 
     return NO; 
    } else { 
     // Tis English 
     return YES; 
    } 
} 

/* Swap language between English & Spanish 
* Could send a string argument to directly pass the new language 
*/ 
+ (void)changeCurrentLanguage 
{ 
    if ([self isCurrentLanguageEnglish]) { 
     [[NSUserDefaults standardUserDefaults] setObject:@[@"es"] forKey:@"AppleLanguages"]; 
    } else { 
     [[NSUserDefaults standardUserDefaults] setObject:@[@"en"] forKey:@"AppleLanguages"]; 
    } 
} 
@end 

एक स्ट्रिंग फ़ाइल/छवि/वीडियो/आदि के संदर्भ के लिए ऊपर वर्ग का प्रयोग करें एक नया पैरामीटर कोड संदर्भित एक स्ट्रिंग पैरामीटर।

// Change the preferred language to Spanish 
[[NSUserDefaults standardUserDefaults] setObject:@[@"es"] forKey:@"AppleLanguages"]; 
संबंधित मुद्दे