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.

¿Fue útil?

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top