ios - बिना पुनरारंभ किए प्रोग्रामेटिक भाषा स्थानीयकरण



objective-c internationalization (1)

आप डिवाइस पर उपयोगकर्ता की वरीयता की उपेक्षा ऐप UI से एप्लिकेशन की भाषा सेट करना चाहते हैं। यह असामान्य है, लेकिन यहां आप जा सकते हैं ...

पहले अपने सभी भाषा स्ट्रिंग्स को इस तरह एक निर्देशिका संरचना पर लिखें:

i18n/en.lproj/Localizable.strings
i18n/ar.lproj/Localizable.strings

समर्थित प्रत्येक अतिरिक्त भाषा के लिए संबंधित दो अक्षर कोड के साथ एक अतिरिक्त निर्देशिका बनाएँ।

अगर फाइलें i18n संसाधनों के रूप में मान्यता प्राप्त हैं, तो उन्हें इस तरह प्रस्तुत किया जाएगा:

फाइल में निम्नलिखित प्रारूप के साथ एक कुंजी = मान होगा:

"button.back" = "ظهر";

आपके कोड में, कुंजी के साथ किसी भी स्थानीयकृत स्ट्रिंग को प्रतिस्थापित करें। उदाहरण:

[self.stateBtn setTitle:localize(@"button.back") forState:UIControlStateNormal];

आमतौर पर आप NSLocalizedString(@"key",@"fallback") उपयोग करेंगे NSLocalizedString(@"key",@"fallback") लेकिन जब से आप iPhone सेटिंग को अनदेखा करना चाहते हैं, तो मैंने उस स्थान पर localize(@"key") मैक्रो लिखा था जो निम्न कार्यान्वयन करेगा:

Localization.h

#ifndef localize
#define localize(key) [[Localization sharedInstance] localizedStringForKey:key]
#endif

@interface Localization : NSObject

@property (nonatomic, retain) NSBundle* fallbackBundle;
@property (nonatomic, retain) NSBundle* preferredBundle;

@property (nonatomic, copy) NSString* fallbackLanguage;
@property (nonatomic, copy) NSString* preferredLanguage;

-(NSString*) localizedStringForKey:(NSString*)key;

-(NSString*) pathForFilename:(NSString*)filename type:(NSString*)type;

+(Localization*)sharedInstance;

@end

Localization.m

#import "Localization.h"

@implementation Localization

+(Localization *)sharedInstance
{
    static dispatch_once_t pred;
    static Localization *shared = nil;
    dispatch_once(&pred, ^{
        shared = [[Localization alloc] init];
        [shared setPreferred:@"en" fallback:@"ar"];
    });
    return shared;
}

-(void) setPreferred:(NSString*)preferred fallback:(NSString*)fallback 
{
    self.fallbackLanguage = fallback;
    self.preferredLanguage = preferred;
    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:self.fallbackLanguage];
    self.fallbackBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]];
    bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:self.preferredLanguage];
    self.preferredBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]];
}

-(NSString*) pathForFilename:(NSString*)filename type:(NSString*)type
{
    NSString *path = [self.preferredBundle pathForResource:filename ofType:type inDirectory:nil forLocalization:self.preferredLanguage];
    if (!path) path = [self.fallbackBundle pathForResource:filename ofType:type inDirectory:nil forLocalization:self.fallbackLanguage];
    if (!path) NSLog(@"Missing file: %@.%@", filename, type);
    return path;
}

-(NSString*) localizedStringForKey:(NSString*)key
{
    NSString* result = nil;
    if (_preferredBundle!=nil) {
        result = [_preferredBundle localizedStringForKey:key value:nil table:nil];
    }
    if (result == nil) {
        result = [_fallbackBundle localizedStringForKey:key value:nil table:nil];
    }
    if (result == nil) {
        result = key;
    }
    return result;
}

@end

यह अरबी फ़ाइल में कुंजी स्ट्रिंग देखने का उपयोग करेगा, और यदि कुंजी अनुपलब्ध है, तो यह अरबी फ़ाइल में दिखाई देगा। यदि आप इसे दूसरी तरह से चाहते हैं, तो अपने बटन संचालकों से निम्नलिखित करें:

[[Localization sharedInstance] setPreferred:@"ar" fallback:@"en"];

गिथूब में नमूना परियोजना

यदि स्थानीयकरण काम नहीं करता है

यदि स्थानीयकरण काम नहीं करता है, तो फ़ाइल के प्रारूप को सत्यापित करने के लिए plutil कमांड लाइन उपकरण का उपयोग करें। इसे आउटपुट चाहिए: Localizable.strings: OK । उदाहरण:

$ plutil -lint Localizable.strings
Localizable.strings: OK

इस प्रारूप को अंतर्राष्ट्रीयकरण प्रोग्रामिंग विषय> स्ट्रिंग संसाधन स्थानीयकरण में वर्णित किया गया है। आप वैकल्पिक रूप से // single-line या /* multi-line */ टिप्पणियां जोड़ सकते हैं। गैर लैटिन भाषा के लिए स्थानीयकरण को सांकेतिकृत करने की अनुशंसा की जाती है। यूटीएफ -16 में स्ट्रिंग्स आप XCode के निरीक्षक फलक में एन्कोडिंग के बीच कन्वर्ट कर सकते हैं।

अगर यह अभी भी काम नहीं कर रहा है, तो जांच लें कि आप स्थानीयकरण योग्य की प्रतिलिपि बना रहे हैं। ध्यान दें कि जब आप स्थानीयकरण को जोड़ते हैं, तो वे लाल रंग में दिखाई देते हैं, कभी-कभी वे लाल रंग में दिखाई देते हैं, जब तक कि कोई फ़ाइल काला में नहीं दिखाई देती, तब लाल रंगों को हटा दें (मुझे पता है, मुझे पता है, Xcode दोष है)।

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

कोई विचार / सुझाव यह कैसे किया जाए?

नोट: मैं मैन्युअल रूप से भाषा नहीं बदलना चाहता हूं।

1 संपादित करें

@जानो के अनुसार, मैंने नीचे किया है

नई परियोजना बनाई गई स्थानीयकरण में अरबी जोड़ा गया अब मेरे पास दो स्टोरीबोर्ड और दो InfoPlist.strings फ़ाइल है।

उत्तर में दिखाया गया स्थानीयकरण। और। एम फ़ाइल जोड़ा गया।

निर्देशिका संरचना MyProject-ar.lproj और MyProject-en.lproj

"myButton01" = "Back"; की सामग्री "myButton01" = "Back"; & "myButton01" = "ظهر";

प्रथम दृश्य नियंत्रक के पास दो बटन हैं, जैसे कि अंग्रेजी और अरबी उन बटन पर कार्रवाई की गई

- (IBAction)pressedEnglish:(id)sender {
    [Localization sharedInstance].fallbackLanguage = @"ar";
    [Localization sharedInstance].preferredLanguage = @"en";
    NSLog(@"pressed english");
}

- (IBAction)pressedArabic:(id)sender {
    [Localization sharedInstance].fallbackLanguage = @"en";
    [Localization sharedInstance].preferredLanguage = @"ar";
    NSLog(@"pressed arabic");
}

दूसरे दृश्य नियंत्रक में, मैंने एक बटन जोड़ा और myButton नाम दिया। अब viewDidLoad में viewDidLoad , मेरे पास है

[self.myButton setTitle:localize(@"myButton01") forState:UIControlStateNormal];

मुझे उम्मीद है कि यह काम करना चाहिए, हालांकि जब मैं इस प्रोजेक्ट को चलाता हूं, तो मुझे अपने बटन के रूप में बटन दिखाई देता है

ऐसा क्यों हो रहा है किसी भी कारण?

2 संपादित करें

मुझे Edit 1 समस्या मिली है मैंने InfoPlist.strings नाम बदल दिया। InfoPlist.strings करने के लिए और यह काम किया। लेकिन लेकिन, लेकिन मैं अब भी अरबी पाठ प्राप्त कर रहा हूं चाहे जो भी बटन दबाएं,

कारण खोजते समय, मुझे पता चला कि यह Localization.m में कम वक्तव्य के कारण था। Localization.m

static Localization *shared = nil;
dispatch_once(&pred, ^{
    shared = [[Localization alloc] init];
    shared.fallbackLanguage = @"en";
    shared.preferredLanguage = @"ar";

समस्या पिछले दो लाइनों पर है जैसा कि हमने अरबी को पसंदीदा भाषा के रूप में निर्धारित किया है, मैं हमेशा अरबी पाठ देख रहा हूं।

मुझे ऐसा करने के लिए क्या बदलाव की आवश्यकता होगी ताकि बटन दबाए अनुसार मैं इसे बदल सकूं।





internationalization