किसी विशिष्ट भाषा का उपयोग करने के लिए NSLocalizedString को कैसे मजबूर करें


263

IPhone पर iPhone NSLocalizedStringकी भाषा में स्ट्रिंग लौटाता है। क्या NSLocalizedStringडिवाइस से अलग भाषा में एप्लिकेशन के लिए एक विशिष्ट भाषा का उपयोग करने के लिए मजबूर करना संभव है?


कृपया इसे देखें: stackoverflow.com/a/48187049/6665075 आकर्षण की तरह काम करता है
अंकित कुमार गुप्ता

जवाबों:


261

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

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

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate

यह जर्मन को आपके आवेदन के लिए पसंदीदा भाषा बना देगा, जिसमें अंग्रेजी और फ्रेंच में कमियां होंगी। आप इसे अपने एप्लिकेशन के स्टार्टअप में कुछ समय पहले कॉल करना चाहेंगे। आप यहां भाषा / स्थानीय प्राथमिकताओं के बारे में अधिक पढ़ सकते हैं: अंतर्राष्ट्रीयकरण प्रोग्रामिंग विषय: वर्तमान भाषा और स्थान प्राप्त करना


4
यह मेरे लिए काम नहीं करता है, यह डिफ़ॉल्ट भाषा का उपयोग करेगा चाहे कोई भी हो।
कुआनो

50
Denniss; यदि आप ऐप लॉन्च होने से पहले भाषा की प्राथमिकता निर्धारित करते हैं तो यह बेहतर काम करता है। मैं इसे मुख्य () फ़ंक्शन में करता हूं, इससे पहले UIApplicationMain () कहा जाता है। एक बार जब यह वास्तव में चल रहा होता है, तो यह इस्तेमाल की गई भाषा को नहीं बदलेगा, लेकिन बस अगली बार प्राथमिकता तय करें।
भू

3
आप भाषा सेट करने से पहले आप UIKit प्रारंभ है और आप एक पूरा भाषा + क्षेत्र भाषा निर्दिष्ट करना होगा - एक पूरा उदाहरण के लिए इस की जाँच blog.federicomestrone.com/2010/09/15/...
fedmest

18
यदि मुख्य में किया जाता है तो AppleLanguages ​​को रनटाइम पर एक भाषा बदल देगा - (सच)! लेकिन ... पहली बार जब ऐप इंस्टॉल किया जाता है, तो nsuserdefaults को AFTER UIApplicationMain () कहा जाता है, जो पहले से सेट किए गए AppleLanguages ​​को अनदेखा कर देगा और वांछित भाषा को देखने के लिए ऐप के एक बदसूरत बल-पुनरारंभ की आवश्यकता होगी।
जॉनपैन

3
यह Localizable.stringsdict में परिभाषित बहुवचन आइटम के साथ काम नहीं करता है। किसी भी विचार अगर वहाँ एक संभव तय है?
मिहि फ्रतु

147

मुझे हाल ही में यही समस्या थी और मैं अपना पूरा NSLocalizedString शुरू और पैच नहीं करना चाहता था न ही ऐप को नई भाषा को काम करने के लिए फिर से शुरू करने के लिए मजबूर कर । मैं चाहता था कि सब कुछ जैसे भी हो, मैं काम करूं।

मेरा समाधान मुख्य बंडल की कक्षा को गतिशील रूप से बदलना और वहां उपयुक्त बंडल को लोड करना था:

शीर्ष लेख फ़ाइल

@interface NSBundle (Language)
+(void)setLanguage:(NSString*)language;
@end

कार्यान्वयन

#import <objc/runtime.h>

static const char _bundle=0;

@interface BundleEx : NSBundle
@end

@implementation BundleEx
-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    NSBundle* bundle=objc_getAssociatedObject(self, &_bundle);
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}
@end

@implementation NSBundle (Language)
+(void)setLanguage:(NSString*)language
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
    {
        object_setClass([NSBundle mainBundle],[BundleEx class]);
    });
    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

इसलिए मूल रूप से, जब आपका ऐप शुरू होता है और इससे पहले कि आप अपना पहला नियंत्रक लोड करें, बस कॉल करें:

[NSBundle setLanguage:@"en"];

जब आपका उपयोगकर्ता आपकी सेटिंग स्क्रीन में अपनी पसंदीदा भाषा बदलता है, तो बस उसे फिर से कॉल करें:

[NSBundle setLanguage:@"fr"];

सिस्टम डिफॉल्ट्स पर वापस जाने के लिए, बस nil पास करें:

[NSBundle setLanguage:nil];

का आनंद लें...

उन लोगों के लिए जिन्हें स्विफ्ट संस्करण की आवश्यकता है:

var bundleKey: UInt8 = 0

class AnyLanguageBundle: Bundle {

    override func localizedString(forKey key: String,
                                  value: String?,
                                  table tableName: String?) -> String {

        guard let path = objc_getAssociatedObject(self, &bundleKey) as? String,
              let bundle = Bundle(path: path) else {

            return super.localizedString(forKey: key, value: value, table: tableName)
            }

        return bundle.localizedString(forKey: key, value: value, table: tableName)
    }
}

extension Bundle {

    class func setLanguage(_ language: String) {

        defer {

            object_setClass(Bundle.main, AnyLanguageBundle.self)
        }

        objc_setAssociatedObject(Bundle.main, &bundleKey,    Bundle.main.path(forResource: language, ofType: "lproj"), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}

7
हाय @Wirsing, यह मेरे लिए अब तक बहुत अच्छा काम करता है। मैंने स्टोर में एक ऐप भी अपलोड किया है और Apple द्वारा कोई शिकायत नहीं की गई है।
गिलाद नोविक

7
यह एक महान समाधान है, मैं इसे यहां भी संदर्भित कर रहा हूं: medium.com/ios-apprentice/905e4052b9de
जेम्स टैंग

1
हाय @JamesTang, संदर्भ और आपकी पोस्ट के लिए धन्यवाद - मुझे स्थानीयकरण के संबंध में बहुत उपयोगी जानकारी मिली।
गिलाद नोविक

3
@ गिलाद आपकी विधि डायनेमिक स्ट्रिंग्स (स्ट्रिंग्स जो मैंने localizable.strings में परिभाषित की है) के लिए एकदम सही काम करती है, लेकिन स्टोरीबोर्ड बटन और लेबल के लिए यह केवल मुख्य विधि पर ही काम करता है। तो क्या आप UI नियंत्रण स्थानीयकरण को शामिल करने के लिए अपने उत्तर का विस्तार कर सकते हैं? मेरा तात्पर्य है कि मैं (NSBundle setLanguage: @ "??) ताज़ा करने के बाद (बिना बंद किए) स्टोरीबोर्ड को कैसे ताज़ा करें;"
जवाद अल शेख

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

137

मैं आमतौर पर इस तरह से करता हूं, लेकिन आपके पास अपने प्रोजेक्ट में सभी स्थानीयकरण फ़ाइलें होनी चाहिए।

@implementation Language

static NSBundle *bundle = nil;

+(void)initialize 
{
    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
    NSArray* languages = [defs objectForKey:@"AppleLanguages"];
    NSString *current = [[languages objectAtIndex:0] retain];
    [self setLanguage:current];
}

/*
  example calls:
    [Language setLanguage:@"it"];
    [Language setLanguage:@"de"];
*/
+(void)setLanguage:(NSString *)l
{
    NSLog(@"preferredLang: %@", l);
    NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ];
    bundle = [[NSBundle bundleWithPath:path] retain];
}

+(NSString *)get:(NSString *)key alter:(NSString *)alternate 
{
    return [bundle localizedStringForKey:key value:alternate table:nil];
}

@end

1
+1। यह एक बहुत अच्छी चाल है जो मैंने कहीं और नहीं देखी है। स्थानीयकरण फ़ोल्डरों में से एक से "उप बंडल" बनाकर, आप तब तक ठीक काम करने के लिए स्ट्रिंग सामान प्राप्त कर सकते हैं जब तक कि आप NSLocalizedString को उस चीज़ के साथ लपेटते हैं जो यहां से अलग हो जाती है।
बेन ज़ोट्टो

4
बहुत बढ़िया मौरो। मैंने देखा कि यह आपके प्रोजेक्ट से बाहर की फाइलों के लिए भी काम कर सकता है। यदि किसी कारण से (जैसा कि मेरे मामले में), आपको नेटवर्क से स्ट्रिंग्स फ़ाइलों को डाउनलोड करने की आवश्यकता है, और उन्हें अपने 'दस्तावेज़' निर्देशिका (फ़ोल्डर संरचना के साथ दस्तावेज़ / en.lproj / Localizable.strings, दस्तावेज़ / fr.lproj / में संग्रहीत करें) स्थानीय करने योग्य। आप भले ही NSBundle बना लें। पथ के लिए इस कोड का उपयोग करें: NSString * path = [NSHomeDirectory () stringByAppendingPathComponent: [NSString stringWithFormat: @ "/ Documents /% @। Ljj", l, nil]];
अरनौद डेल।

1
मुझे लगता है कि नीचे एलेसेंड्रो के योगदान के साथ यह सबसे अच्छा तरीका है। यह इतना घुसपैठ नहीं है और इसे पुनः आरंभ करने की आवश्यकता नहीं है।
PKCLsoft

1
मैं क्या गलत कर रहा हूं? मैंने एक भाषा वर्ग बनाया, जिसमें NSObject विरासत में मिला, इसे क्रियान्वयन में लगाया, .h में विधि के नाम रखे, फिर [भाषा सेट करें: @ "es"]; मेरे चेंज लैंग्वेज बटन में, कोड रन (बटन विधि कहा जाता है, और भाषा वर्ग में जाता है), लेकिन कुछ भी नहीं करता है। मेरे पास मेरे स्थानीय नामकरण (स्पैनिश) भी स्थापित हैं। लेकिन यह बहुत से अन्य लोगों के लिए काम कर रहा है। कृपया किसी ने इसे मेरे लिए नीचा दिखाया।
सररूपर्ट आठवीं

1
@Kendall आप इसे इस तरह कहते हैं: [भाषा सेट करें: @ "es"]; NSString * stringToUse = [भाषा प्राप्त करें: @ "आपका पाठ" बदल: nil];
मिक्रासा

41

आईओएस 9 पर उपयोग न करें। यह सभी तारों से गुजरता है।

मुझे एक और उपाय मिला है जिससे आप भाषा के तार को अपडेट कर सकते हैं, w / o ऐप को फिर से शुरू कर सकते हैं और जेनस्ट्रिंग्स के साथ संगत कर सकते हैं:

इस मैक्रो को Prefix.pch में डालें:

#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]

और जहां कभी आपको स्थानीयकृत स्ट्रिंग उपयोग की आवश्यकता होती है:

NSLocalizedStringFromTableInBundle(@"GalleryTitleKey", nil, currentLanguageBundle, @"")

भाषा का उपयोग निर्धारित करने के लिए:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];

यहां तक ​​कि लगातार भाषा के साथ काम करता है जैसे:

NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"fr"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"it"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));

2
@ powerj1984: नहीं, यह आपके स्रोत फ़ाइलों में केवल तार बदल देगा। यदि आप xib भाषाओं को बदलना चाहते हैं, तो आपको अपनी चयनित भाषा के बंडल से xibs को पुनः लोड करना होगा।
गक्कल

@gklka मैंने तुडोज़ियर द्वारा दिए गए कदमों का पालन किया है, लेकिन मेरे एक्सआईबी भाषा को नहीं बदल रहे हैं, जैसा कि आपने हाथ से एक्सआईबी को फिर से लोड करने के लिए कहा था, वास्तव में एक्सआईबी को फिर से लोड करने का क्या मतलब है?
डीके कुमार

@DkKumar: आपको कुछ ऐसा करना है: stackoverflow.com/questions/21304988/…
gklka

@gklka आपका उत्तर सही प्रतीत होता है और मैंने आपके उत्तर में वर्णित चरणों के अनुसार ही किया है, लेकिन समस्या यह है कि यदि हम बंडल पथ को बदलते हैं, तो इससे सभी संसाधन (अर्थात XIB में प्रयुक्त। png फ़ाइल) मिलेंगे। एक ही बंडल, इसलिए हमें en.lproj, es.lproj और इतने पर जैसे सभी बंडल में छवियों के फ़ोल्डर की प्रतिलिपि बनाना होगा .. इसलिए आईपीए के आकार को बढ़ाने पर प्रभाव पड़ेगा, तो क्या इस समस्या को दूर करने का कोई तरीका है? जैसा कि आपने अपनी पोस्ट में कहा था, मुझे इस पर प्रयास करने दीजिए और इस पर मेरी मदद करने के लिए धन्यवाद।
Dk Kumar

1
यह iOS 9 में बुरी तरह से टूट गया है, सभी तारों के लिए अशक्त लौट रहा है।
एलेक्स ज़ावाटोन

32

जैसा कि पहले कहा गया था, बस करो:

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

लेकिन ऐप को पुनरारंभ करने से बचने के लिए, मुख्य विधि में लाइन डालें main.m, बस UIApplicationMain(...) से पहले ।


2
बहुत मददगार जवाब! पीएस मई गैर-शुरुआती लोगों के लिए स्पष्ट लगता है, लेकिन आपको उस पंक्ति को सम्मिलित करना चाहिए NSAutoreleasePool * pool ..या कुछ ऑटोरेल्ड ऑब्जेक्ट लीक हो जाएंगे।
pt2ph8

1
महत्वपूर्ण: यदि आप [[NSBundle mainBundle] URLForResource:withExtension:]पहले फोन करते हैं तो यह काम नहीं करेगा ।
कोफ

3
यदि स्विफ्ट का उपयोग करने के बारे में क्या है, तो कोई मेन नहीं है?
turetested

@turingtested ने आपने स्विफ्ट और स्टोरीबोर्ड पर प्रयास किया है, क्या यह काम कर रहा है?
iDevAmit

हाय, सर्वर से आने वाले डायनेमिक टेक्स्ट का स्थानीयकरण कैसे करें, मेरे आवेदन में प्रत्येक पाठ को मुझे सरलीकृत चीनी भाषा में प्रदर्शित करना है, लेकिन अंग्रेज़ी में आने वाले चीनी पाठ को कैसे प्रदर्शित किया जाए। मेरी मदद करो।
महेश नरला

31

एप्लिकेशन से इसे चुनकर विशिष्ट भाषा का उपयोग करने की चाल को मजबूर करना है NSLocalizedString , चयनित भाषा के आधार पर विशिष्ट बंडल का उपयोग करने के है,

यहाँ ios ऐप्स में इस सीखने के अग्रिम स्थानीयकरण के लिए पोस्ट लिखी गई है

और यहाँ ios ऐप्स में एक नमूना एप्लिकेशन अग्रिम स्थानीयकरण का कोड है


यह iOS7 पर भी काम करता है, मुझे ब्रायन के समाधान से इस पर स्विच करना होगा क्योंकि ऐसा लगता है जैसे iOS भाषाओं के विकल्प को फिर से ओवरराइड करता है इसलिए मैं पहली बार भाषा की सेटिंग के साथ अटक गया। आपका समाधान एक आकर्षण की तरह काम करता है!
12

14

स्विफ्ट 3 के इस समाधान के बारे में आप क्या सोचते हैं?

extension String {

    func localized(forLanguage language: String = Locale.preferredLanguages.first!.components(separatedBy: "-").first!) -> String {

        guard let path = Bundle.main.path(forResource: language == "en" ? "Base" : language, ofType: "lproj") else {

            let basePath = Bundle.main.path(forResource: "Base", ofType: "lproj")!

            return Bundle(path: basePath)!.localizedString(forKey: self, value: "", table: nil)
        }

        return Bundle(path: path)!.localizedString(forKey: self, value: "", table: nil)
    }
}

सरल उपयोग:

"report".localized(forLanguage: "pl") //forced language
"report".localized() //default language selected by user in settings, in case when your app doesnt support selected lanaguage, the default one is selected, here is an english.

हाय, सर्वर से आने वाले गतिशील पाठ को कैसे स्थानीय किया जाए, मेरे आवेदन में प्रत्येक पाठ को मुझे सरलीकृत चीनी भाषा में प्रदर्शित करना है, लेकिन अंग्रेजी में आने वाले चीनी पाठ को कैसे प्रदर्शित किया जाए। मेरी मदद करो।
महेश नरला

यह एक शानदार जवाब है;)
बार्टोलोमिएज सेमासकीक

बहुत अच्छा जवाब। मुझे उम्मीद है
दिलीप तिवारी

13

जैसा कि ब्रायन वेबस्टर का उल्लेख है, भाषा को "आपके एप्लिकेशन के स्टार्टअप में कुछ समय पहले" सेट करने की आवश्यकता है। मैंने सोचा था कि applicationDidFinishLaunching:की AppDelegateयह करने के लिए एक उपयुक्त जगह होना चाहिए, क्योंकि यह है जहाँ मैं सभी अन्य प्रारंभ करते हैं।

लेकिन जैसा कि विलियम डेनिस का उल्लेख है, ऐसा लगता है कि ऐप के दोबारा शुरू होने के बाद ही इसका असर होगा , जो बेकार है।

यदि मैं मुख्य कार्य में कोड डालता हूँ तो यह ठीक काम करता है, हालाँकि:

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

    // Force language to Swedish.
    [[NSUserDefaults standardUserDefaults]
     setObject:[NSArray arrayWithObject:@"sv"]
     forKey:@"AppleLanguages"];

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

मैं इस पर किसी भी टिप्पणी की सराहना करता हूँ।


मेरे क्रियान्वयन में यह एक उपयोगकर्ता-निबटने वाली बात है - इसलिए मैं सिर्फ एक डायलॉग बताता हूं कि उन्हें फिर से शुरू करने की आवश्यकता होगी :)
विलियम डेनिस

यह काम करता है, लगभग सभी के लिए - स्थानीय चूक Default.png छवि को छोड़कर।
लुकाज़

2
यदि आप उपयोगकर्ताओं को भाषा सेट करने दे रहे हैं और फिर उन्हें ऐप को पुनरारंभ करने के लिए कह रहे हैं, तो बस याद रखें कि यदि वे बहुत जल्दी पुनरारंभ होते हैं तो NSUserDefaults सहेजा नहीं जा सकता है। अधिकांश उपयोगकर्ता यह तेज़ नहीं हैं, लेकिन जब आप ऐप का परीक्षण कर रहे होते हैं तो आप बहुत तेज़ हो सकते हैं और परिणामस्वरूप असंगत व्यवहार देख सकते हैं। मुझे यह महसूस करने में कुछ घंटे लगे कि मेरी भाषा स्विच कभी काम कर रही थी और कभी नहीं!
अर्लोमेडिया

3
यह एक मुद्दा नहीं है, बस [[NSUserDefaults standardUserDefaults] synchronize];कॉल करने के बाद उपयोग करेंsetObject:forKey:
बेन बैरन

11

मुझे सबसे अच्छी मौरो डेलारियो की विधि पसंद है। मैंने अपने Project_Prefix.pch में निम्नलिखित को भी जोड़ा है

#import "Language.h"    
#define MyLocalizedString(key, alt) [Language get:key alter:alt]

इसलिए यदि आप कभी भी मानक विधि का उपयोग करना चाहते हैं (जो NSLocalizedString का उपयोग करता है) तो आप सभी फाइलों में एक त्वरित वाक्यविन्यास प्रतिस्थापन कर सकते हैं।


1
मुझे उसकी विधि भी पसंद है और मैं png images को लोड करने के लिए एक विधि जोड़ता हूं: + (UIImage ) imageNamed: (NSString *) imageFileName {NSString fullPath = [बंडल पाथफॉरइंडऑन सोर्स]: ImageFileName ofType: @ "png"]; UIImage * imageObj = [[UIImage आवंटन] initWithContentsOfFile: fullPath]; वापसी [imageObj ऑटोरेलिज़]; }
जैगी

11

NSLocalizedString()AppleLanguagesमानक उपयोगकर्ता डिफ़ॉल्ट ( [NSUserDefaults standardUserDefaults]) से कुंजी के लिए मान पढ़ता है । यह रनटाइम पर सभी मौजूदा स्थानीयकरणों के बीच एक उपयुक्त स्थानीयकरण चुनने के लिए उस मूल्य का उपयोग करता है। जब ऐप्पल लॉन्च के दौरान ऐप्पल उपयोगकर्ता डिफॉल्ट्स डिक्शनरी बनाता है, तो वे सिस्टम वरीयताओं में पसंदीदा भाषा (एस) कुंजी को देखते हैं और वहां से मूल्य कॉपी करते हैं। यह भी उदाहरण के लिए बताता है कि ओएस एक्स में भाषा सेटिंग्स को बदलने से ऐप चलाने पर कोई प्रभाव नहीं पड़ता है, केवल इसके बाद शुरू होने वाले ऐप पर। एक बार कॉपी करने के बाद, मूल्य केवल इसलिए अपडेट नहीं किया जाता है क्योंकि सेटिंग्स बदल जाती हैं। इसलिए iOS सभी ऐप्स को पुनरारंभ करता है यदि आप बदलते हैं तो भाषा।

हालाँकि, उपयोगकर्ता डिफॉल्ट्स डिक्शनरी के सभी मूल्यों को कमांड लाइन तर्कों द्वारा अधिलेखित किया जा सकता है। NSUserDefaultsपर प्रलेखन देखें NSArgumentDomain। यहां तक ​​कि उन मानों को भी शामिल किया गया है जो ऐप वरीयताओं (.plist) फ़ाइल से लोड किए गए हैं। यह जानना वास्तव में अच्छा है कि क्या आप परीक्षण के लिए सिर्फ एक बार मूल्य बदलना चाहते हैं

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

यहां छवि विवरण दर्ज करें

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


यह केवल 1 बार काम करता है उसके बाद यह फिर से डिवाइस प्रीफ़ में लोड होता है। भाषा ..
अक्स

@ अक्स हर बार मेरे लिए काम करता है। सुनिश्चित करें कि आप सही योजना शुरू कर रहे हैं, सुनिश्चित करें कि आप Xcode (relaunches, forks, आदि के भीतर से शुरू करें) को तर्क नहीं मिलेगा) और सुनिश्चित करें कि आप Optionsनए Xcode संस्करणों के साथ भाषा को ओवरराइड नहीं करते हैं, Apple ऑफर करता है कि भी।
मैकी

आपके उत्तर के लिए धन्यवाद @ मीकी .. मेरे लिए इसके एक्सकोड में काम नहीं करने पर जब मैं कोड में उल्लेख करता हूं, तो यह काम करता है .. लेकिन फिर भी अगर मैंने अपनी डिवाइस को कुछ अन्य पसंदीदा भाषाओं के साथ सेट किया है तो मुझे अपने पसंदीदा में लोड करने के लिए ऐप को पुनरारंभ करना होगा। भाषा जो मैं तर्क में पारित कर रहा हूँ ....
अक्स २०

@Aks जब किसी डिवाइस पर इसका उपयोग किया जाता है, तो यह केवल तब काम करेगा जब Xcode से सीधे शुरू किया गया हो, यह तब काम नहीं करेगा जब आप किसी डिवाइस पर इसके आइकन को टैप करके फिर से ऐप को शुरू करेंगे और यह तब भी काम नहीं करेगा जब ऐप को मार दिया जाएगा (जैसे) क्योंकि यह पृष्ठभूमि में चला गया) और सिस्टम द्वारा पुनः आरंभ हो जाता है (जैसा कि यह पुनरारंभ Xcode द्वारा किया गया पुनरारंभ नहीं है) - इसलिए किसी भिन्न ऐप और बैक पर स्विच करना तब काम नहीं कर सकता है जब iOS को आपके ऐप को बीच में मारना पड़े (जैसे कि क्योंकि यह स्मृति की जरूरत है)।
मेकी

10

मैं एक समाधान के साथ आया था जो आपको उपयोग करने की अनुमति देता है NSLocalizedString। मैं NSBundleकॉल की एक श्रेणी बनाता हूं NSBundle+RunTimeLanguage। इंटरफ़ेस इस तरह है।

// NSBundle+RunTimeLanguage.h
#import <Foundation/Foundation.h>
@interface NSBundle (RunTimeLanguage)
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] runTimeLocalizedStringForKey:(key) value:@"" table:nil]
- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName;
@end

कार्यान्वयन इस तरह है।

// NSBundle+RunTimeLanguage.m
#import "NSBundle+RunTimeLanguage.h"
#import "AppDelegate.h"

@implementation NSBundle (RunTimeLanguage)

- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    NSString *path= [[NSBundle mainBundle] pathForResource:[appDelegate languageCode] ofType:@"lproj"];
    NSBundle *languageBundle = [NSBundle bundleWithPath:path];
    NSString *localizedString=[languageBundle localizedStringForKey:key value:key table:nil];
    return localizedString;
}
@end

केवल NSBundle+RunTimeLanguage.hउन फ़ाइलों में आयात जोड़ें जो उपयोग करती हैं NSLocalizedString

जैसा कि आप देख सकते हैं कि मैं अपनी भाषा को एक संपत्ति में संग्रहीत करता हूं AppDelegate। इसे आप कहीं भी संग्रहीत कर सकते हैं।

यह केवल एक चीज है जो मुझे पसंद नहीं है यह एक चेतावनी है जिसे NSLocalizedStringमार्को ने फिर से परिभाषित किया है। शायद कोई मुझे इस हिस्से को ठीक करने में मदद कर सकता है।


1
चेतावनी को अक्षम करने #undef NSLocalizedStringसे ठीक पहले जोड़ें#define
बेरिलियम 19

क्या यह xib फ़ाइल के लिए स्थानीयकरण पर काम करता है? मेरे पास .xib फ़ाइल और .strings का यूआईएस नाम विशेष भाषा में अनुवाद करने के लिए है। मैंने कोशिश की और यह XIB के साथ काम नहीं करता है, लेकिन मुझे यकीन नहीं है कि अगर मैंने चीजों को सही ढंग से किया है
हांगकांग हंताक्रूल

विलंबित प्रतिक्रिया के लिए कोंग खेद। यह वह जगह है जहाँ कभी आप NSLocalizedString का उपयोग करते हैं। तो यह सीधे एक XIB में काम नहीं करेगा। आपको XIB में स्ट्रिंग्स के लिए IBOutlets की आवश्यकता होगी और फिर प्रोग्राम को कोड में स्ट्रिंग मान सेट करना होगा।
qman64

इस दृष्टिकोण ने मेरे लिए काम किया और मैं भाषाओं को मक्खी पर बदलने में सक्षम था। ध्यान दें कि "es", fr "और" en "ने ठीक काम किया है, लेकिन" zh "(सरलीकृत चीनी के लिए) जैसे भाषा कोड विफल हो गए और मुझे अशक्त तार वापस दे दिए। मैंने" es.lproj "के लिए अपने सिस्टम पर एक वैश्विक खोज की। देखें कि मैं जिन फाइलों को एक्सेस कर रहा था और मैंने वहां पाया कि "zh.lproj" वास्तव में "zh-Hans.proproj" है।
Gallymon

9

स्विफ्ट संस्करण:

NSUserDefaults.standardUserDefaults().setObject(["fr"], forKey: "AppleLanguages")
NSUserDefaults.standardUserDefaults().synchronize()

8

संक्षेप में :

अपने आवेदन का स्थानीयकरण करें

यह पहला काम है जो आपको अपने ऐप को कम से कम दो भाषाओं (इस उदाहरण में अंग्रेजी और फ्रेंच) के साथ करना है।

NSLocalizedString को ओवरराइड करें

अपने कोड में, उपयोग करने के बजाय NSLocalizedString(key, comment), MYLocalizedString(key, comment)इस तरह परिभाषित एक मैक्रो का उपयोग करें: #define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];

यह MYLocalizationSystemसिंगलटन होगा:

  • सही स्थानीयकृत NSBundle उपयोगकर्ता को सेट करके लैंगेज सेट करें
  • इस पहले से निर्धारित भाषा के अनुसार स्थानीयकृत NSString लौटाता है

उपयोगकर्ता भाषा सेट करें

जब उपयोगकर्ता ने फ्रेंच में एप्लिकेशन भाषा बदली, तो कॉल करें [[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];

- (void)setLanguage:(NSString *)lang
{
    NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"];
    if (!path)
    {
        _bundle = [NSBundle mainBundle];
        NSLog(@"Warning: No lproj for %@, system default set instead !", lang);
        return;
    }

    _bundle = [NSBundle bundleWithPath:path];
}

इस उदाहरण में इस विधि ने स्थानीयकृत बंडल को fr.lproj पर सेट किया है

स्थानीयकृत स्ट्रिंग लौटें

एक बार स्थानीयकृत बंडल सेट करने के बाद, आप इस विधि से उससे सही स्थानीयकृत स्ट्रिंग प्राप्त कर सकेंगे:

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value
{
    // bundle was initialized with [NSBundle mainBundle] as default and modified in setLanguage method
    return [self.bundle localizedStringForKey:key value:value table:nil];
}

आशा है कि यह आपकी मदद करेगा।

आप इस लेख में NSWinery.io से अधिक जानकारी प्राप्त करेंगे


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

7

स्विफ्ट 3 एक्सटेंशन:

extension Locale {
    static var preferredLanguage: String {
        get {
            return self.preferredLanguages.first ?? "en"
        }
        set {
            UserDefaults.standard.set([newValue], forKey: "AppleLanguages")
            UserDefaults.standard.synchronize()
        }
    }
}

extension String {
    var localized: String {

    var result: String

    let languageCode = Locale.preferredLanguage //en-US

    var path = Bundle.main.path(forResource: languageCode, ofType: "lproj")

    if path == nil, let hyphenRange = languageCode.range(of: "-") {
        let languageCodeShort = languageCode.substring(to: hyphenRange.lowerBound) // en
        path = Bundle.main.path(forResource: languageCodeShort, ofType: "lproj")
    }

    if let path = path, let locBundle = Bundle(path: path) {
        result = locBundle.localizedString(forKey: self, value: nil, table: nil)
    } else {
        result = NSLocalizedString(self, comment: "")
    }
        return result
    }
}

उपयोग:

Locale.preferredLanguage = "uk"

label.text = "localizedKey".localized

धन्यवाद। अच्छी तरह से काम कर रहा है।
क्रुणाल नागवड़िया '

5

फ़ाइल .pch में परिभाषित करने के लिए:

#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]


#define NSLocalizedString(str,nil) NSLocalizedStringFromTableInBundle(str, nil, currentLanguageBundle, @"")

मुझे चेतावनी 'ओवेराइड ...' से कैसे छुटकारा मिलेगा?
इदन मोशे

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

यह हैकी है (इसलिए अन्य सभी उत्तर हैं), और मैं जो इकाई परीक्षण लिख रहा था, उसमें इसे लागू करना सबसे आसान था।
मैक्स

4

शायद आपको इसके साथ पूरक होना चाहिए (#import के बाद .pch फ़ाइल पर):

extern NSBundle* bundle; // Declared on Language.m

#ifdef NSLocalizedString
    #undef NSLocalizedString
    // Delete this line to avoid warning
    #warning "Undefining NSLocalizedString"
#endif

#define NSLocalizedString(key, comment) \
    [bundle localizedStringForKey:(key) value:@"" table:nil]

/Users/pwang/Desktop/Myshinesvn/Myshine/viewController/OrientationReadyPagesView.m:193:31: अघोषित पहचानकर्ता 'बंडल' का उपयोग करें
पेंगवांग

4

स्विफ्ट 3 समाधान:

let languages = ["bs", "zh-Hant", "en", "fi", "ko", "lv", "ms", "pl", "pt-BR", "ru", "sr-Latn", "sk", "es", "tr"]
UserDefaults.standard.set([languages[0]], forKey: "AppleLanguages")

भाषा कोड के कुछ उदाहरण दिए गए जिनका उपयोग किया जा सकता है। उम्मीद है की यह मदद करेगा


3

आप स्थानीय स्ट्रिंग्स के सेट के साथ एक उप-बंडल बना सकते हैं जिसे आप इसके साथ करना चाहते हैं, और फिर NSLocalizedStringFromTableInBundle()उन्हें लोड करने के लिए उपयोग करें। (मैं मान रहा हूं कि यह सामान्य यूआई स्थानीयकरण से अलग है जो आप ऐप पर कर रहे हैं।


3

मेरे मामले में मेरे पास दो स्थानीय फ़ाइल, ja और en हैं

और मैं इसे लागू करने के लिए बाध्य करना चाहूंगा अगर सिस्टम में पसंदीदा भाषा न तो एन या जेए

मैं main.m फ़ाइल को संपादित करने जा रहा हूँ

मैं जाँच करूँगा कि क्या पहली पसंद एन या ja है, अगर नहीं तो मैं दूसरी पसंदीदा भाषा को बदलूँगा।

int main(int argc, char *argv[])
{

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

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

    if (![lang isEqualToString:@"en"]  &&  ![lang isEqualToString:@"ja"]){

        NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[NSLocale preferredLanguages]];
        [array replaceObjectAtIndex:1 withObject:@"en"];

        [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"AppleLanguages"];
        [[NSUserDefaults standardUserDefaults] synchronize];


    }

    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));


    }


}

धन्यवाद @ chings228 यह मेरे लिए उपयोगी है, लेकिन यह एप्लिकेशन के लिए डिफ़ॉल्ट लॉन्च छवि (स्पलैश) को नहीं बदलता है मेरे पास प्रत्येक भाषा के लिए अलग-अलग स्पलैश हैं। क्या आप जानते हैं कि इसके लिए आवेदन कैसे करें ??
जेईआरसी

मुझे लगता है कि मुख्य कार्यक्रम शुरू होने से पहले स्पलैश चलता है, इसलिए मुझे नहीं पता कि इसे कैसे ओवरराइड करना है,
प्लिस्ट

2

आप ऐसा कुछ कर सकते हैं:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"es"];


NSBundle *spanishBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]];

NSLocalizedStringFromTableInBundle(@"House", nil, spanishBundle, nil):

2

आवेदन छोड़ने या पुनः आरंभ किए बिना भाषा बदलने के लिए ट्यूडराइज़र के उत्तर के आधार पर ।

मैक्रो के बजाय, एक विशिष्ट भाषा कोड मौजूद है या नहीं यह जांचने के लिए पसंदीदा भाषा तक पहुंचने के लिए एक वर्ग का उपयोग करें।

नीचे वर्तमान भाषा बंडल को प्राप्त करने के लिए उपयोग किया जाने वाला एक वर्ग है जो iOS 9 के लिए काम कर रहा है:

@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

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

// 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")

नीचे की तरह भाषा को इन-लाइन में बदलें या नई भाषा को संदर्भित करने वाले एक स्ट्रिंग पैरामीटर लेने के लिए ऊपर दिए गए वर्ग में "चेंजकार्टल लैंग्वेज" विधि को अपडेट करें।

[[NSUserDefaults standardUserDefaults] setObject:@[@"es"] forKey:@"AppleLanguages"];

2

स्विफ्ट 4 में, मैंने इसे फिर से शुरू करने या पुस्तकालयों का उपयोग करने की आवश्यकता के बिना हल किया है।

कई विकल्पों को आज़माने के बाद, मुझे यह फ़ंक्शन मिला, जहाँ आप stringToLocalize (of Localizable.String, स्ट्रिंग्स फ़ाइल) जिसे आप अनुवाद करना चाहते हैं, और जिस भाषा में आप इसका अनुवाद करना चाहते हैं, और जो रिटर्न देता है, वह मान है स्ट्रिंग जो आपके पास स्ट्रिंग्स फ़ाइल में है:

    func localizeString (stringToLocalize: String, language: String) -> String
    {
        let path = Bundle.main.path (forResource: language, ofType: "lproj")
        let languageBundle = Bundle (path: path!)
        return languageBundle! .localizedString (forKey: stringToLocalize, value: "", table: nil)
    }

इस फ़ंक्शन को ध्यान में रखते हुए, मैंने एक स्विफ्ट फ़ाइल में यह फ़ंक्शन बनाया:

struct CustomLanguage {

    func createBundlePath () -> Bundle {
        let selectedLanguage = //recover the language chosen by the user (in my case, from UserDefaults)
        let path = Bundle.main.path(forResource: selectedLanguage, ofType: "lproj")
        return Bundle(path: path!)!
    }
}

पूरे ऐप से, और बाकी ViewControllers के प्रत्येक तार में डालने के बजाय:

NSLocalizedString ("StringToLocalize", comment: ")

मैंने इसे बदल दिया है

let customLang = CustomLanguage() //declare at top
let bundleLanguage = customLang.createBundle()

NSLocalizedString("StringToLocalize", tableName: nil, bundle: bundleLanguage, value: "", comment: “”) //use in each String

मुझे नहीं पता कि यह सबसे अच्छा तरीका है, लेकिन मुझे यह बहुत सरल लगा, और यह मेरे लिए काम करता है, मुझे आशा है कि यह आपकी मदद करता है!


1

यह फ़ंक्शन वर्तमान भाषा के लिए स्थानीयकृत स्ट्रिंग प्राप्त करने का प्रयास करेगा और अगर यह नहीं मिला है तो इसे अंग्रेजी भाषा का उपयोग करके मिलेगा।

- (NSString*)L:(NSString*)key
{
    static NSString* valueNotFound = @"VALUE_NOT_FOUND";
    static NSBundle* enBundle = nil;

    NSString* pl = [NSLocale preferredLanguages][0];
    NSString* bp = [[NSBundle mainBundle] pathForResource:pl ofType:@"lproj"];
    NSBundle* b = [NSBundle bundleWithPath:bp];

    NSString* s = [b localizedStringForKey:key value:valueNotFound table:nil];
    if ( [s isEqualToString:valueNotFound] ) {
        if ( !enBundle ) {
            bp = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
            enBundle = [NSBundle bundleWithPath:bp];
        }
        s = [enBundle localizedStringForKey:key value:key table:nil];
    }

    return s;
}

1

मैं ऐसी भाषा के लिए समर्थन जोड़ना चाहता था जो आधिकारिक रूप से iOS द्वारा समर्थित नहीं है (सिस्टम सेटिंग्स के तहत भाषा अनुभाग में सूचीबद्ध नहीं है)। का पालन करके एप्पल के अंतर्राष्ट्रीयकरण ट्यूटोरियल ब्रायन वेबस्टर और geon द्वारा यहां और कुछ संकेत, मैं कोड (main.m में रख) के इस टुकड़े के साथ आया था:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        // Grab regional settings locale, for Slovenian this is either sl_SI or en_SI
        NSLocale *locale = [NSLocale currentLocale];
        NSString *ll = [locale localeIdentifier]; // sl_SI

        // Grab the first part of language identifier
        NSArray *comp = [ll componentsSeparatedByString:@"_"];
        NSString *ll1 = @"en";
        if (comp.count > 0) {
            ll1 = comp[0]; // sl, en, ...
        }
        // Check if we already saved language (user can manually change it inside app for example)
        if (![[NSUserDefaults standardUserDefaults] objectForKey:@"SelectedLanguage"]) {
            //   Slovenian (Slovenia),            Slovenia
            if ([ll isEqualToString:@"sl_SI"] || [ll isEqualToString:@"en_SI"]) {
                ll1 = @"sl-SI"; // This is the part of localized path for Slovenian language that Xcode generates
            }
            // Add more unsupported languages here...

            [[NSUserDefaults standardUserDefaults] setObject:ll1 forKey:@"SelectedLanguage"]; // Save language
        }
        else {
            // Restore language as we have previously saved it
            ll1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"SelectedLanguage"];
        }
        // Overwrite NSLocalizedString and StoryBoard language preference
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:ll1, @"en", @"fr", nil] forKey:@"AppleLanguages"];
        // Make sure settings are stored to disk
        [[NSUserDefaults standardUserDefaults] synchronize];

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

यह स्टोरीबोर्ड और NSLocalizedString कोड दोनों के लिए अच्छा काम करता है। कोड मानता है कि उपयोगकर्ता के पास बाद में ऐप के अंदर भाषा को मैन्युअल रूप से बदलने का विकल्प होगा।

बेशक, उचित स्टोरीबोर्ड अनुवाद और Localizable.strings अनुवाद जोड़ने के लिए मत भूलना (कैसे करने के लिए ऊपर Apple पृष्ठ के लिए लिंक देखें)।


मैं देख रहा हूं कि आप भी स्लोवेनियाई भाषा के साथ समस्याओं का सामना कर रहे हैं :) आईओएस द्वारा समर्थित भाषाओं के लिए इस उत्तर को बेहतर बनाने के लिए, क्या आपको पता चला है कि क्या हम कस्टम स्थानीयकरण तार सेट कर सकते हैं जो कि ऐप में सिस्टम नियंत्रण के लिए उपयोग किया जाएगा (संपादित करें, किया, अधिक, आदि) ...)?
मिहिम

1

यहां इस समस्या का एक सभ्य समाधान है, और इसके लिए एप्लिकेशन पुनरारंभ की आवश्यकता नहीं है।

https://github.com/cmaftuleac/BundleLocalization

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


प्रोजेक्ट के इस कोड से मुझे बहुत मदद मिली। विशिष्ट भाषा कोड के लिए एक बंडल कैसे खोजें ---NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
Eonil

यह वर्ग ठीक काम कर रहा है, लेकिन भाषा को दूसरे में बदलने के बाद, इसका प्रभाव नहीं है।
अनिलकुमार iOS ReactNative

0

आप सभी जो भी करते हैं, सबसे अच्छा तरीका है कि निर्दिष्ट भाषा के लिए short_name लेना है, अर्थात: fr, en, nl, de, it, etc ... और इसे वैश्विक मान के लिए असाइन करें।

एक ड्रॉप डाउन मेनू की तरह पॉप अप करने के लिए एक पिकर दृश्य बनाएं (जिस पर क्लिक करने पर एक बटन का संयोजन भाषाओं की सूची के साथ नीचे से प्रकट होता है) और उस भाषा का चयन करें जिसे आप चाहते हैं। संक्षिप्त नाम को आंतरिक रूप से संग्रहीत किया जाए। स्थानीयकृतस्ट्रिंग नामक .h + .m फ़ाइल बनाएँ

Local_String.m में प्राप्त मान के बराबर होने के लिए short_name का वैश्विक मान सेट करें। आवश्यक भाषा चयनित होने पर आवश्यक भाषा के लिए प्रोजेक्ट उप-निर्देशिका बनाने के लिए NSBundlePath असाइन करें। उदाहरण के लिए, nl.proj, en.proj।

जब विशेष प्रोज फ़ोल्डर का चयन किया जाता है, तो संबंधित भाषा के लिए स्थानीय स्ट्रिंग को कॉल करें और भाषा को गतिशील रूप से बदलें।

कोई नियम नहीं तोड़ा।


0

स्विफ्ट के लिए आप main.swiftफ़ाइल को ओवरराइड कर सकते हैं और ऐप के चलने से पहले UserDefaults स्ट्रिंग को वहां सेट कर सकते हैं । इस तरह आपको वांछित प्रभाव देखने के लिए ऐप को पुनरारंभ करने की आवश्यकता नहीं है।

import Foundation
import UIKit

// Your initialisation code here
let langCultureCode: String = "LANGUAGE_CODE"

UserDefaults.standard.set([langCultureCode], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))

@UIApplicationMainआपकी AppDelegate.swiftफ़ाइल को निकालने के साथ जोड़ा गया ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.