2010-06-30 11 views
13

Quiero leer el texto del archivo localizable.strings. Estoy recopilando las cadenas de traducción de varios directorios y archivo en un archivo .strings. Pero luego tengo varias copias de las mismas cadenas de traducción. Quiero eliminar esto programáticamente. Así que necesito leer solo las cadenas (no los comentarios) del archivo .strings y - luego ordenarlas, - eliminar las cadenas repetidas y luego crear un nuevo archivo .strings.iphone - leyendo el archivo Localizable.strings como una clave-valor en un diccionario

Es posible leer el archivo de cadenas y mantener la cadena de teclas y el valor traducido en un diccionario. Me refiero a cualquier método incorporado para leer un archivo .text, solo la parte "key" = "value", evitando la parte/* ... */o # comments. Como leer un archivo de configuración.

+0

mxg - Probablemente decir respuesta. – Jonny

Respuesta

7

Estoy feliz de encontrar una API excelente en la clase NSString. El código está abajo.

- (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]]; 
} 
} 
+4

Encontré que el archivo .strings está compilado para convertirse en una "lista de propiedades binarias". Esto se puede cargar con: [NSDictionary dictionaryWithContentsOfFile: path]; –

52
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"]; 
+0

¡Simplemente brillante! – mxg

+1

En realidad, funciona con archivos regulares (utf-8 y utf-16) .strings también. –

0

Lo que estaba buscando es una manera de leer un JSON desde un archivo de paquete en una NSDictionary y luego imprimirlo en un UITextView. ¡El resultado no estaba muy bien formateado!

He utilizado 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); 
} 
Cuestiones relacionadas