在我的应用程序中,我想在某个地方用英语显示一些消息。为此,要求始终从 English.lproj/Localized.strings 文件中读取消息,无论用户选择的本地化版本如何。我现在不能使用 NSLocalizedString 方法来实现此目的,因为它总是返回本地化字符串。请建议一种从默认(或开发)本地化资源文件中读取字符串的方法。
最佳答案
您必须手动执行此操作,如下所示:
- (NSString *)englishLocalizedStringForKey:(NSString *)key inTable:(NSString *)table {
if (table == nil) {
table = @"Localizable";
}
NSString *path = [[NSBundle mainBundle] pathForResource:table
ofType:@"strings"
inDirectory:nil
forLocalization:@"en"];
if (path == nil) {
return nil;
}
NSData *data = [NSData dataWithContentsOfFile:path];
id plist = [NSPropertyListSerialization propertyListWithData:data
options:0
format:NULL
error:NULL];
if (![plist isKindOfClass:[NSDictionary class]]) {
return nil;
}
return [plist objectForKey:key];
}
所以,这就是发生的事情。
- 从参数中获取表(字符串文件)的名称,如果您碰巧传入了
nil
,则默认为@"Localizable"
- 在
en.lproj
文件夹中查找{table}.strings
的路径 - 如果文件不存在,则返回
nil
- 将文件作为数据 block 读取
- 尝试将 blob 解码为属性列表。这是可行的,因为
.strings
文件采用旧式 plist 格式,因此我们可以使用此 plist 解析器将其构建为NSDictionary
- 如果我们没有得到
NSDictionary
返回,则返回nil
- 返回字典中包含的请求 key 的任何内容(如果找不到 key ,可能返回
nil
)
读取和反序列化位可能会很昂贵,因此我建议在某处的属性中缓存适当的信息。
关于objective-c - Cocoa/Obj-c : How to fetch string from english localizable. 字符串,无论首选本地化如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7398143/