我在几周后的一个项目中解决这一问题,建立了我自己的简单模板系统,其编号为。 该方法使用一个模板系统,该模板将各种变量与辛塔克斯(${ >>>>>。 可通过<代码>NSDictionary
向该方法提供变数。
- (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;
}
拥有地方档案。
"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!"
如你所知,我也增加了一些额外功能。 首先,任何已发现的变量(${byebye}
,以我为例)都将被本地化,并附在结果之后。 我之所以这样做,是因为我在申请书中装上了超文本文件,并且通过地方化方法操作(在这样做的时候,我在创建扫描仪时不会把所显示的投入本地化)。 此外,我还补充了在除<代码>NSString外的其他情况下发送物体的能力,以便具有某种额外的灵活性。
该法典可能只字不提最佳表现或预言,但它在工作上没有任何明显的业绩影响。