objective-c - Cocoa/Obj-c : How to fetch string from english localizable. 字符串,无论首选本地化如何

标签 objective-c macos cocoa

在我的应用程序中,我想在某个地方用英语显示一些消息。为此,要求始终从 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/

相关文章:

cocoa - 将 socket 连接到阵列

objective-c - 异构 NSTreeController

objective-c - ios开发内存管理中的奇怪现象

ios - iOS 6 自动布局问题

macos - 使用 “elasticsearch”命令在任何目录的终端中运行elasticsearch

linux - ;& 和 ;; 之间的区别在 bash 脚本中

ios - 在 viewDidLoad 中执行对服务器的调用

iOS 更改表格 View 中的特定单元格

objective-c - 以编程方式向 Cocoa 核心数据实体添加新记录

objective-c - 从类方法调用实例方法