Вот что я сделал. Я думаю, что трюк состоял в том, чтобы использовать NSLocalizedStringFromTableInBundle вместо NSLocalizedString.
Для всех строк используйте это
someLabel.text = NSLocalizedStringFromTableInBundle(@"Your String to be localized, %@",nil,self.localeBundle,@"some context for translators");
Чтобы сменить язык, запустите этот код
NSString * language = @"zh-Hans"; //or whatever language you want
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"];
if (path) {
self.localeBundle = [NSBundle bundleWithPath:path];
}
else {
self.localeBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"] ];
}
После этого вам, скорее всего, захочется вызывать код обновления для обновления строк на новых языках, например снова запустите это
someLabel.text = NSLocalizedStringFromTableInBundle(@"Your String to be localized, %@",nil,self.localeBundle,@"some context for translators");
Вот и все. Не нужно перезапускать приложение. Совместимость с системными настройками (если вы установите язык через настройки iOS, он тоже будет работать). Нет необходимости в внешней библиотеке. Не нужно джейлбрейка. И это также работает с genstrings.
Конечно, вы должны по-прежнему выполнять обычное для своих настроек приложения:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
(и делать чек в вашем представленииDidLoad или что-то еще )
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"];
if (path) {
self.localeBundle = [NSBundle bundleWithPath:path];
}
else {
self.localeBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"] ];
}