0

我正在爲五個不同的國家創建iPhone應用程序。因此,根據國家/地區名稱,我在應用程序資源中添加了Localizable.strings(請參閱下面的屏幕截圖1),並且使用設備設置語言更改對我來說工作正常。以編程方式更改iOS中的本地化應用程序語言

enter image description here

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

現在我的應用需求已經得到了改變,我登錄後獲取用戶的國家代碼成功。按照要求,用戶不必從設備設置中更改語言。所以,我第一次需要以英文文本顯示我的登錄屏幕,只有所有的用戶和成功登錄後,根據用戶國家代碼,我需要分別更改我的應用程序的所有文本。

通過爲我的所有文本提供五個條件(檢查國家語言代碼)可能,但這不是一個正確的方法。

任何人都可以請建議我哪個是最好的方法來做到這一點?謝謝!

回答

4

您可以創建一個NSBundle類稱之爲一個NSBundle +語言

一個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 

所以你可以對每一個國家設置編碼其語言名稱然後當 選擇國家調用set語言的方法與語言

作爲例子[NSBundle setLanguage:「en」];

+0

其工作原理... – 2014-11-19 08:30:17

+0

故事板和Xib發生了什麼? – Nicopuri 2015-03-25 14:58:56

+0

完美。有一點需要注意的是,您需要重新加載視圖才能再次顯示新語言。 – coolbeet 2017-05-18 20:32:53

相關問題