以编程方式更改iOS中的本地化的应用程序语言

时间:2014-10-17 10:51:26

标签: ios ios7 localization internationalization nslocalizedstring

我正在为五个不同的国家/地区创建一个iPhone应用程序。因此,根据国家/地区名称,我在应用资源中添加了Localizable.strings(请参阅下面的屏幕截图-1),并且通过设备设置语言更改,它可以正常工作。

enter image description here

[btnAIO setTitle:NSLocalizedString(@"AllInOnesTitle", nil) forState:UIControlStateNormal];

现在我的应用程序要求已经更改,并且我在登录成功后获得用户国家/地区代码。根据要求,用户不必更改设备设置中的语言。所以,我第一次需要只为所有用户显示英文文本的登录界面,登录成功后,根据用户国家代码我需要分别更改我的应用程序的所有文本。

可以通过为我的所有文本提供五个条件(检查国家/地区语言代码),但这不是正确的方法。

任何人都可以建议我这是最好的方法吗?谢谢!

1 个答案:

答案 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;];