मैंने इसे कुछ हफ्ते पहले एक परियोजना में NSScanner
के साथ अपना स्वयं का सरल टेम्पलेट सिस्टम बनाकर हल किया। विधि एक टेम्पलेट सिस्टम का उपयोग करती है जो वाक्यविन्यास ${name}
के साथ चर पाती है। NSDictionary
के माध्यम से विधि को चर के लिए आपूर्ति की जाती है।
"born message" = "I was born in ${birthYear} on a ${birthWeekDay}. ${byebye}";
"byebye" = "Cheers!";
हम निम्नलिखित परिणाम हासिल कर सकते हैं ...
NSDictionary *variables = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1986], @"birthYear", @"monday", @"birthWeekDay", nil];
NSString *finalString [self localizedStringFromTemplateString:@"born message" variables:variables];
NSLog(@"%@", finalString); // "I was born in 1986 on a monday. Cheers!"
आप देख सकते हैं, मैं कुछ अतिरिक्त कार्यक्षमता जोड़ दिया है:
- (NSString *)localizedStringFromTemplateString:(NSString *)string variables:(NSDictionary *)variables {
NSMutableString *result = [NSMutableString string];
// Create scanner with the localized string
NSScanner *scanner = [[NSScanner alloc] initWithString:NSLocalizedString(string, nil)];
[scanner setCharactersToBeSkipped:nil];
NSString *output;
while (![scanner isAtEnd]) {
output = NULL;
// Find ${variable} templates
if ([scanner scanUpToString:@"${" intoString:&output]) {
[result appendString:output];
// Skip syntax
[scanner scanString:@"${" intoString:NULL];
output = NULL;
if ([scanner scanUpToString:@"}" intoString:&output]) {
id variable = nil;
// Check for the variable
if ((variable = [variables objectForKey:output])) {
if ([variable isKindOfClass:[NSString class]]) {
// NSString, append
[result appendString:variable];
} else if ([variable respondsToSelector:@selector(description)]) {
// Not a NSString, but can handle description, append
[result appendString:[variable description]];
}
} else {
// Not found, localize the template key and append
[result appendString:NSLocalizedString(output, nil)];
}
// Skip syntax
[scanner scanString:@"}" intoString:NULL];
}
}
}
[scanner release];
return result;
}
एक स्थानीयकरण फ़ाइल इस तरह लग रही के साथ
भी। सबसे पहले, कोई भी वेरिएबल नहीं मिला है (${byebye}
मेरे उदाहरण में) को स्थानीयकृत किया जाएगा और परिणामों में जोड़ा जाएगा। मैंने ऐसा इसलिए किया क्योंकि मैं अपने एप्लिकेशन बंडल से HTML-files में लोड करता हूं और उन्हें स्थानीयकरण विधि के माध्यम से चलाता हूं (ऐसा करने पर, हालांकि स्कैनर बनाते समय मैं इनपुट स्ट्रिंग को स्थानीयकृत नहीं करता)। इसके अलावा, मैंने कुछ अतिरिक्त लचीलापन के लिए NSString
ऑब्जेक्ट्स की तुलना में अन्य चीजों में भेजने की क्षमता भी जोड़ा।
इस कोड को शायद सबसे अच्छा प्रदर्शन नहीं है या लिखित सुंदर है, लेकिन यह किसी भी ध्यान देने प्रदर्शन प्रभावों :)
यह बस काम नहीं करता है, यह returnes एक ही स्ट्रिंग – user2159978
@ user2159978 किया आप वास्तव में सिर्फ अंतिम पंक्ति की प्रतिलिपि बनाते हैं? कोर्स का यह एक ही स्ट्रिंग वापस कर देगा ... –