15

我想从 localizable.strings 文件中读取文本。我正在从一个 .strings 文件中的多个目录和文件中收集要翻译的字符串。但是我有几个相同翻译字符串的副本。我想以编程方式删除它。所以我只需要从 .strings 文件中读取字符串(而不是注释),然后 - 然后对它们进行排序 - 删除重复的字符串,然后创建一个新的 .strings 文件。

是否可以读取字符串文件并将键字符串和翻译值保存在字典中。我的意思是任何读取 .text 文件的内置方法,只有“键”=“值”部分,避免 /* ... */ 或 # 注释部分。就像读取配置文件一样。

4

4 回答 4

62
  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"];
于 2010-08-18T16:55:16.017 回答
8

我很高兴在 NSString 类中找到一个优秀的 API。代码如下。

- (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]];
}
}
于 2010-08-11T07:54:24.863 回答
2

Swift 中的解决方案

我在上面@jason-moore 回答的 Objective-C 代码之后创建了一个 swift 代码 这个解决方案是 swift 等效的。

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
    }
于 2018-12-03T23:46:37.953 回答
0

我一直在寻找一种将 json 从捆绑文件读取到 a 中NSDictionary,然后将其打印到UITextView. 结果没有很好地格式化!

我从上面使用了 Karim 的部分答案来创建一个在字符串中生成美化 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);
}
于 2016-03-31T13:19:53.227 回答