iOS - 将 NSDictionary 写入 Localizable.strings

Posted

技术标签:

【中文标题】iOS - 将 NSDictionary 写入 Localizable.strings【英文标题】:iOS - Writing NSDictionary to Localizable.strings 【发布时间】:2012-12-02 12:28:02 【问题描述】:

这个问题是那个问题的连续体:ios - Could I change the localizable.strings content during runtime?

答案很有用,但是,我面临一个问题。打印的字符串不包括单个单词键和/或值的引号(如这些“”)。这使得 Localizable.string 文件无效。因此,即使对于格式正确的键/值,也不会从中检索任何内容。

例子:

英镑 = 英镑; 词汇表=词汇表; "Go_Location" = "前往位置";

前两个导致文件是无效的字符串文件。如何解决?

【问题讨论】:

【参考方案1】:

使用 NSDictionary 的

- (NSString *)descriptionInStringsFileFormat;

然后使用适当的编码将生成的字符串写入文件:

NSString* strings = [dict descriptionInStringsFileFormat];
[strings writeToFile: @"Localizable.strings" atomically: YES  encoding: NSUTF16StringEncoding  error: nil];

(显然添加您需要的任何错误检查)。

【讨论】:

如何从文件中获取单个字符串? @tentmaking : 使用 NSDictionary.init(contentsOfFile: "STRINGS_PATH") 将字符串转换为 dic 并将其用作键值对。【参考方案2】:
- (BOOL)writeLocalizableFileFromDictionary:(NSDictionary *)dictionary toURL:(NSURL *)url atomically:(BOOL)atomically

    NSMutableString *fileContent = [NSMutableString new];

    [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) 
        [fileContent appendFormat:@"\"%@\" = \"%@\";\n", [self escapeString:key], [self escapeString:obj]];
    ];

    return [fileContent writeToURL:url atomically:atomically encoding:NSUTF8StringEncoding error:nil];


- (NSString *)escapeString:(NSString *)string

    NSString *escapedString = [string stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
    escapedString = [escapedString stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"];
    escapedString = [escapedString stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
    return [escapedString stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];

【讨论】:

【参考方案3】:

通过枚举字典并将每个键/值对打印到 NSString,然后打印到字符串文件来解决它。

代码如下:

__block NSString *languageAndGlossaryDictionary = @"";
[[self getGlossaryDictionary] enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) 
    languageAndGlossaryDictionary = [languageAndGlossaryDictionary stringByAppendingFormat:@"\n\"%@\" = \"%@\";", key, obj];
];

【讨论】:

a) 只要任何键或值包含 " 或换行符,这就会中断 b) 不要分配 100 个字符串。使用 NSMutableString 对于 a) 不,它没有,它就像一个魅力。 b) 这是一个性能问题。感谢您的建议! c) 为什么是 -1?! a) 确实如此 -- c) 因为 a 和 b 关于 a) 如果 obj 是 'the dog is called (NEWLINE) "nanny"'

以上是关于iOS - 将 NSDictionary 写入 Localizable.strings的主要内容,如果未能解决你的问题,请参考以下文章

将 NSDictionary 写入我的应用程序包中的 plist

无法将 JSONValue 写入 NSDictionary - JSON 框架不起作用

iOS CoreText写入PDF和 自动换行

Xamarin.iOS,将 Dictionary 转换为 NSDictionary

将 NSDictionary 添加到 NSMutableArray 后访问密钥。 iOS

iOS 使用 NSDictionary 将数据加载到部分和行中