iphone - Lesen von Localizable.strings Datei als Schlüssel-Wert in einem Wörterbuch
-
01-10-2019 - |
Frage
Ich mag den Text aus der localizable.strings Datei lesen. Ich sammle die Saiten für die Übersetzung von mehreren Verzeichnissen und Dateien in einer .strings Datei. Aber dann habe ich mehrere Kopien der gleichen Übersetzungs-Strings. Ich möchte diese programmatisch entfernen. Also brauche ich nur die Saiten lesen (nicht die Kommentare) von der .strings-Datei und - dann sortiert sie, - Entfernen wiederholt Strings erstellen Sie eine neue Datei .strings.
Ist es möglich, die Zeichenketten-Datei und halten Sie die Schlüsselzeichenfolge und übersetzt Wert in einem Wörterbuch zu lesen. Ich meine, jede integrierte Methode eine .text-Datei zu lesen, nur die „Schlüssel“ = „Wert“ Teil, die Vermeidung / * ... * / oder # Kommentare Teil. Wie eine Konfigurationsdatei zu lesen.
Lösung 2
Ich bin glücklich, eine ausgezeichnete API in NSString-Klasse zu finden. Der Code ist unten.
- (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]];
}
}
Andere Tipps
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"];
Lösung in Swift
Ich habe einen schnellen Code nach dem Objective-C-Code beantwortet von @ jason-mooren oben Diese Lösung ist schnell gleichwertig.
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
}
Was ich suchte eine Möglichkeit, einen Json aus einer Bundle-Datei in eine NSDictionary
zu lesen und es dann in einem UITextView
zu drucken.
Das Ergebnis war nicht schön formatiert!
habe ich einen Teil von Karim Antwort von oben ein Verfahren zu schaffen, dass eine verschönerte json in einem String generiert:
-(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);
}