2010-06-30 1 views
13

Voglio leggere il testo dal file localizable.strings. Sto raccogliendo le stringhe per la traduzione da diverse directory e file in un file .strings. Ma poi ho diverse copie delle stesse stringhe di traduzione. Voglio rimuovere questo al livello di programmazione. Quindi ho bisogno di leggere solo le stringhe (non i commenti) dal file .strings e - rimuovere le stringhe ripetute quindi creare un nuovo file .strings.iphone - lettura dal file Localizable.strings come valore-chiave in un dizionario

È possibile leggere il file di stringhe e mantenere la stringa di chiavi e il valore tradotto in un dizionario. Intendo qualsiasi metodo incorporato per leggere un file .text, solo la parte "chiave" = "valore", evitando/* ... */o la parte # commenti. Mi piace leggere un file di configurazione.

+0

MXG - Probabilmente significa risposta. – Jonny

risposta

7

Sono felice di trovare un'API eccellente nella classe NSString. Il codice è sotto

- (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

Ho trovato che il file .strings è stato compilato per diventare una "lista di proprietà binarie". Questo può essere caricato con: [Dizionario NSDictionaryWithContentsOfFile: 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

Semplicemente geniale! – mxg

+1

In realtà, funziona anche con i normali file (utf-8 e utf-16). –

0

Quello che stavo cercando un modo per leggere un JSON da un file in un fascio NSDictionary e quindi stamparlo all'interno di una UITextView. Il risultato non è stato ben formattato!

ho usato una parte della risposta di Karim dall'alto per creare un metodo che ha generato un JSON abbellita in una stringa:

-(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); 
}