iPhone/iOS: как получить список локализованных строк на всех языках, на которых локализовано мое приложение?

Мне нужно отправить на мой сервер список локализаций для определенной строки.

Это означает, что если в моем приложении есть строка Foo, локализованная как @"Foo" на английском языке и @"Фу" на русском языке, я бы хотел отправить на сервер такой список:

  • String Foo:
    • English: "Foo"
    • Русский: "Фу"

Я думаю, что я должен быть в состоянии сделать это:

  1. Перечислить локализованные строки для каждого языка, для которого локализовано мое приложение
  2. Получите локализованную версию Foo для каждого языка

Как мне сделать (1) и как мне сделать (2)?


person Tatiana Racheva    schedule 10.06.2011    source источник
comment
Вы заглянули в NSLocalizedStringFromTable? developer.apple.com/library/mac/#documentation/Cocoa/Reference/   -  person joshpaul    schedule 10.06.2011
comment
Из таблицы кажется, что это способ разделить ваши строки, а не хранить их все в одной таблице по умолчанию. Это не то, чего я хочу. Я хочу получить все различные локализации конкретной строки.   -  person Tatiana Racheva    schedule 13.06.2011


Ответы (1)


Вы можете получить все строковые ключи, прочитав в English.lproj/Localizable.strings словарь и извлекая его ключи:

NSString *stringsPath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings"];
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:stringsPath];

Чтобы получить перевод каждого языка, вы можете перебирать языки для каждой клавиши английского языка и использовать NSLocalizedStringFromTableInBundle:

for (NSString *language in [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]) {
    NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
    NSLog(@"%@: %@", language, NSLocalizedStringFromTableInBundle(@"Testing", @"Localizable", bundle, nil));
}
person bdunagan    schedule 24.06.2011
comment
Это звучит разумно; другие варианты, которые я видел, требовали перезаписи того, как мы извлекаем строки, но это менее инвазивно и похоже, что оно делает то, что мне нужно. Я попробую сегодня. - person Tatiana Racheva; 24.06.2011
comment
Обратите внимание, что первый вызов pathForResource в приведенных выше примерах кода вернет путь для текущей локализации, не обязательно английской (например, если ваш симулятор/устройство настроен на немецкий язык, вы получите путь до de.lproj/Localizable.strings). - person Alessandro; 29.03.2013