Cocoa/Obj-c:如何从英语本地化获取字符串.字符串,与首选的本地化无关



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

最新更新