iphone - чтение из файла Localizable.strings в качестве значения ключа в словаре - PullRequest
13 голосов
/ 01 июля 2010

Я хочу прочитать текст из файла localizable.strings.Я собираю строки для перевода из нескольких каталогов и файла в один файл .strings.Но тогда у меня есть несколько копий одних и тех же строк перевода.Я хочу удалить это программно.Поэтому мне нужно читать только строки (но не комментарии) из файла .strings, а затем сортировать их, удалять повторяющиеся строки и создавать новый файл .strings.

Можно ли прочитать файл строк и сохранить строку ключа и переведенное значение в словаре.Я имею в виду любой встроенный метод для чтения файла .text, только часть «ключ» = «значение», избегая / * ... * / или # комментариев.Как чтение файла конфигурации.

Ответы [ 4 ]

60 голосов
/ 18 августа 2010
  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"];
8 голосов
/ 11 августа 2010

Я счастлив найти отличный API в классе NSString.Код ниже.

- (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]];
}
}
1 голос
/ 04 декабря 2018

Решение в Swift

Я создал быстрый код, следующий за кодом Objective-C, на который отвечает @ jason-moore выше Это решение является быстрым эквивалентом.

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
    }
0 голосов
/ 31 марта 2016

Я искал способ прочитать json из файла пакета в NSDictionary и затем распечатать его внутри UITextView. Результат не был красиво отформатирован!

Я использовал часть ответа Карима сверху, чтобы создать метод, который генерировал украшенный json в строке:

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