Какао / Obj-c: Как извлечь строку из английского localizable.strings независимо от предпочитаемой локализации - PullRequest
0 голосов
/ 13 сентября 2011

В моем приложении я хочу показать некоторые сообщения в каком-то месте на английском языке. Для этого необходимо, чтобы сообщения всегда читались из файла English.lproj / Localizable.strings независимо от выбранной пользователем локализации. Я не могу использовать метод NSLocalizedString для этой цели сейчас, потому что он всегда возвращает локализованную строку. Пожалуйста, предложите способ чтения строк из файла ресурсов локализации по умолчанию (или разработки).

Ответы [ 3 ]

4 голосов
/ 13 сентября 2011

Вам нужно будет сделать это вручную, например:

- (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];
}

Итак, вот что происходит.

  • Получите имя таблицы (строкифайл) из параметров, по умолчанию @"Localizable", если вы случайно передали nil
  • Найдите путь {table}.strings внутри папки en.lproj
  • , верните nil, еслифайл не существует
  • чтение файла в виде большого двоичного объекта данных
  • попытка декодировать большой двоичный объект в виде списка свойств.Это работает, потому что файлы .strings имеют старый формат plist, поэтому мы можем использовать этот анализатор plist, чтобы встроить его в NSDictionary для нас
  • , если мы не получили NSDictionary назад, return nil
  • вернуть то, что словарь имеет для ключа запроса (может вернуть nil, если ключ не может быть найден)

Бит чтения и десериализации можетпотенциально может быть дорогим, поэтому я бы рекомендовал кэшировать соответствующую информацию в каком-либо свойстве

1 голос
/ 13 сентября 2011

Я рекомендую поместить эти специальные строки в их собственную таблицу строк, а затем только помещать эту таблицу в английскую локализацию.Таким образом, вы можете использовать NSLocalizedStringFromTable(), как предлагает Бенедикт.Функции локализации будут искать в локалях, используя предпочтительный порядок поиска пользователя, пока не найдут запрошенный файл.

Преимущество этого подхода состоит в том, что вы можете избежать перевода строк, которые появляются только в этой таблице.

0 голосов
/ 13 сентября 2011

Вы пробовали NSLocalizedStringFromTable?Позволяет указать, какой файл использовать для строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...