在我的应用程序中,我想在英语语言的某个地方显示一些消息。为此,需要始终从English.lproj/Localizable读取消息。字符串文件,与用户选择的本地化无关。我现在不能使用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
如果文件不存在 - 读取文件作为一个blob的数据
- 尝试将blob解码为属性列表。这是因为
.strings
文件是老式的plist格式,所以我们可以使用这个plist解析器将其构建为NSDictionary
- 如果没有返回
NSDictionary
,则返回nil
- 返回字典中请求键的值(如果找不到键,可能返回
nil
)
读取和反序列化位可能会非常昂贵,因此我建议将适当的信息缓存到某个属性中。
我建议将这些特殊字符串放在它们自己的字符串表中,然后只将该表放在英文本地化中。这样你就可以像Benedict建议的那样使用NSLocalizedStringFromTable()
。本地化函数将使用用户首选的搜索顺序搜索语言环境,直到找到所请求的文件。
您试过NSLocalizedStringFromTable
吗?