我正在为五个不同的国家/地区创建一个iPhone应用程序。因此,根据国家/地区名称,我在应用资源中添加了Localizable.strings(请参阅下面的屏幕截图-1),并且通过设备设置语言更改,它可以正常工作。
[btnAIO setTitle:NSLocalizedString(@"AllInOnesTitle", nil) forState:UIControlStateNormal];
现在我的应用程序要求已经更改,并且我在登录成功后获得用户国家/地区代码。根据要求,用户不必更改设备设置中的语言。所以,我第一次需要只为所有用户显示英文文本的登录界面,登录成功后,根据用户国家代码我需要分别更改我的应用程序的所有文本。
可以通过为我的所有文本提供五个条件(检查国家/地区语言代码),但这不是正确的方法。
任何人都可以建议我这是最好的方法吗?谢谢!
答案 0 :(得分:4)
您可以为NSBundle创建名为NSBundle + Language
的类别NSBundle + Language.h
#import <Foundation/Foundation.h>
@interface NSBundle (Language)
+(void)setLanguage:(NSString*)language;
@end
一个NSBundle + Language.m
#import "NSBundle+Language.h"
#import <objc/runtime.h>
static const char _bundle=0;
@interface BundleEx : NSBundle
@end
@implementation BundleEx
-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
NSBundle* bundle=objc_getAssociatedObject(self, &_bundle);
return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}
@end
@implementation NSBundle (Language)
+(void)setLanguage:(NSString*)language
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
object_setClass([NSBundle mainBundle],[BundleEx class]);
});
objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
因此您可以为每个国家/地区代码设置其语言名称 select country用语言
调用setLanguage的方法作为示例[NSBundle setLanguage:&#34; en&#34;];