iphone - la lettura dal file Localizable.strings come un valore-chiave in un dizionario
-
01-10-2019 - |
Domanda
Voglio leggere il testo dal file Localizable.strings. Sto raccogliendo le stringhe per la traduzione da diverse directory e file in una .strings file. Ma poi ho diverse copie delle stesse stringhe di traduzione. Voglio rimuovere questo livello di programmazione. Così ho bisogno di leggere solo le stringhe (non i commenti) dal file .strings, e - quindi ordinare loro, - stringhe rimuovere ripetuto quindi creare un nuovo file .strings.
E 'possibile leggere il file stringhe e mantenere la stringa chiave e il valore tradotto in un dizionario. Voglio dire qualsiasi built-in metodo per leggere un file .text, solo la "chiave" = parte "valore", evitando / * ... * / o # commenti parte. Come la lettura di un file di configurazione.
Soluzione 2
Sono felice di trovare un ottimo API in classe NSString. Il codice è al di 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]];
}
}
Altri suggerimenti
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"];
Soluzione in Swift
Ho creato un codice swift che segue il codice Objective-C risposto @ jason-moore sopra Questa soluzione è rapida 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
}
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 era 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);
}