Cocoa/Obj-c:如何从 english localizable.strings 获取字符串,而不管首选本地化

Abh*_*eet 0 macos cocoa objective-c

在我的应用程序中,我想在某个地方用英语显示一些消息。为此,无论用户选择何种本地化,都必须始终从 English.lproj/Localizable.strings 文件中读取消息。我现在不能为此目的使用 NSLocalizedString 方法,因为它总是返回本地化的字符串。请建议一种从默认(或开发)本地化资源文件中读取字符串的方法。

Dav*_*ong 5

您将不得不手动执行此操作,如下所示:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

所以,这就是正在发生的事情。

  • 从参数中获取表名(字符串文件),@"Localizable"如果碰巧传入默认为nil
  • 找到文件夹{table}.strings里面的路径en.lproj
  • nil如果文件不存在则返回
  • 将文件作为数据块读入
  • 尝试将 blob 解码为属性列表。这是有效的,因为.strings文件是旧式的 plist 格式,所以我们可以使用这个 plist 解析器NSDictionary为我们构建它
  • 如果我们没有得到NSDictionary回报,就回来nil
  • 返回字典对请求键的任何内容(nil如果找不到键,可能会返回)

读取和反序列化位可能很昂贵,因此我建议将适当的信息缓存在某个属性中。