Resolví esto en un proyecto hace unas semanas creando mi propio sistema de plantilla simple con NSScanner
. El método usa un sistema de plantilla que encuentra variables con la sintaxis ${name}
. Las variables se suministran al método a través de 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;
}
Con Localizar un archivo con este aspecto:
"born message" = "I was born in ${birthYear} on a ${birthWeekDay}. ${byebye}";
"byebye" = "Cheers!";
Podemos lograr los siguientes resultados ...
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!"
Como se puede ver, he añadido algunas funcionalidades extra también. En primer lugar, cualquier variable que no se encuentre (${byebye}
en mi ejemplo) se localizará y se adjuntará a los resultados. Hice esto porque cargué en archivos HTML de mi paquete de aplicaciones y los ejecuté a través del método de localización (al hacer eso, no localizo la cadena de entrada al crear el escáner). Además, agregué la capacidad de enviar otras cosas aparte de los objetos NSString
, para obtener más flexibilidad.
Este código puede que no sea el mejor rendimiento o más bonito escrito, pero hace el trabajo sin ningún impacto en el rendimiento notables :)
simplemente no funciona, se returnes la misma cadena – user2159978
@ user2159978 Did ¿Realmente solo copias la última línea? POR SUPUESTO, devolverá la misma cuerda ... –