如何在我的应用程序中执行I18N,而忽略设备的语言设置?
我希望在启动屏幕之后有一个屏幕,询问用户要使用该应用程序使用的语言。这应该独立于系统语言。
是否有一种简单的方法可以仅在应用程序上下文中设置语言设置?就像是:
[[UIApplication sharedApplication] setLocale/setBundle/setLanguage]
感谢您的任何建议。
编辑
好的,我取得了一些进展。有没有一种方法可以覆盖NSLocalizedString()?问题在于,仅在重新启动应用程序后才能将NSUserDefaults设置为另一种语言代码。当然,这对我来说是没有选择的。
最佳答案
我最终得到了这个解决方案。我首先定义一个静态类来设置我的应用内语言:
@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
玩得开心!
关于iphone - iOS:如何在应用程序中进行I18N/本地化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185416/