iPhone - al leer el archivo Localizable.strings como un valor clave en un diccionario
-
01-10-2019 - |
Pregunta
Quiero leer el texto del archivo Localizable.strings. Estoy recogiendo las cadenas para la traducción de varios directorios y archivos en un solo archivo .strings. Pero luego tengo varias copias de las mismas cadenas de traducción. Quiero eliminar esta programación. Así que tengo que leer sólo las cadenas (no los comentarios) desde el archivo .strings, y - a continuación, ordenar ellos, - Retire las cuerdas repetida a continuación, crear un nuevo archivo .strings.
¿Es posible leer el archivo de cadenas y mantener la cadena de clave y el valor traducido en un diccionario. Me refiero a cualquier método integrado para leer un archivo .text, sólo la "tecla" = parte "valor", evitando / * ... * / o # comments parte. Como leer un archivo de configuración.
Solución 2
Estoy feliz de encontrar un excelente API en clase NSString. El código está por debajo.
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings"];
NSString *fileText = [NSString stringWithContentsOfFile:filePath encoding: NSUnicodeStringEncoding error:nil];
NSDictionary *stringDictionary = [fileText propertyListFromStringsFileFormat];
NSArray *allKeys = [stringDictionary allKeys];
NSArray *sortedKeys = [allKeys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
NSString *documentsDirectory;
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
if ([paths count] > 0) {
documentsDirectory = [paths objectAtIndex:0];
}
NSString *outputPath = [documentsDirectory stringByAppendingString:@"/Localizable.strings"];
NSLog(@"Strings contents are writing to: %@",outputPath);
[[NSFileManager defaultManager] createFileAtPath:outputPath contents:nil attributes:nil];
NSFileHandle *outputHandle = [NSFileHandle fileHandleForWritingAtPath:outputPath];
[outputHandle seekToEndOfFile];
for(id key in sortedKeys){
NSString *line = [NSString stringWithFormat:@"\"%@\" = \"%@\";\n", key, [stringDictionary objectForKey:key]];
NSLog(@"%@",line);
[outputHandle writeData:[line dataUsingEncoding:NSUnicodeStringEncoding]];
}
}
Otros consejos
NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable"
ofType:@"strings"
inDirectory:nil
forLocalization:@"ja"];
// compiled .strings file becomes a "binary property list"
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
NSString *jaTranslation = [dict objectForKey:@"hello"];
Solución en Swift
He creado un código rápido que sigue al código de Objective-C @ respondida por Jason Moore- anterior Esta solución es rápida equivalente.
guard let path = Bundle.main.url(forResource: "Localizable", withExtension: "strings", subdirectory: nil, localization: "ja") else {
return nil
}
guard let dict = NSDictionary(contentsOf: path) else {
return nil
}
guard let jaTranslation = dict.value(forKey: "hello") as? String else {
return nil
}
Lo que yo estaba buscando una manera de leer un JSON desde un archivo de paquete en una NSDictionary
y luego imprimirlo en un UITextView
.
El resultado no fue muy bien formateado!
I utiliza una parte de la respuesta de Karim desde arriba para crear un método que genera un JSON embellecido en una cadena:
-(void)setText:(NSDictionary *)json
{
NSArray *allKeys = [json allKeys];
_beautyStr = @"";
for(id key in allKeys){
NSString *line = [NSString stringWithFormat:@"\"%@\" = \"%@\";\n", key, [text objectForKey:key]];
_beautyStr = [NSString stringWithFormat:@"%@%@",_beautyStr, line];
}
NSLog(@"%@",_beautyStr);
}