Я закончил с этим решением.Сначала я определяю статический класс, чтобы установить мой язык в приложении на:
@implementation I18NUtil
static NSBundle *_bundle;
static NSString *_language;
+ (id)alloc
{
[NSException raise:@"Cannot be instantiated!" format:@"Static class 'ClassName' cannot be instantiated!"];
return nil;
}
+ (void)setLanguage:(NSString *)languageCode
{
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:languageCode, nil] forKey:@"AppleLanguages"];
NSString *path = [[NSBundle mainBundle] pathForResource:languageCode ofType:@"lproj"];
_bundle = [NSBundle bundleWithPath:path];
_language = languageCode;
}
+ (NSString *)localizedString:(NSString *)key
{
return [_bundle localizedStringForKey:key value:@"" table:nil];
}
@end
Теперь вы можете легко использовать:
[I18NUtil localizedString:@"myLocalizedString"]
во всем вашем проекте.
Но я обнаружил, что намного проще переопределить макрос NSLocalizedString и использовать i18n, как я к нему привык.Вы должны включить это в свой AppName-Prefix.pch:
#ifdef __OBJC__
...
// Override native NSLocalizedString(key,message) to achieve in-app and on-the-fly i18n
// Needs to be defined AFTER importing Foundation.h
#import "I18NUtil.h"
#ifdef NSLocalizedString
#undef NSLocalizedString
#endif
#define NSLocalizedString(key, message) \
[I18NUtil localizedString:(key)]
#endif
Веселитесь!