2014-10-29 71 views
3

我为我的iOS应用程序进行了本地化。通过客户端订单,我需要进行修改,即应用程序语言应通过按钮操作进行更改。我以前的本地化是基于设备语言的作品。现在,我必须修改应用程序以更改语言,而无需重新启动设备。更改iOS应用程序语言,而无需重新启动设备

+0

您需要tom更改按钮动作中的语言 – 2014-10-29 08:48:51

+0

您可以随时创建自定义本地化过程,可以通过应用程序中的按钮操作。你在哪里坚持实施这样的解决方案? – holex 2014-10-29 11:27:17

回答

4

您不能在应用程序中更改设备的语言,但您可以通过更改NSUserDefaults中的AppleLanguages属性来更改它,仅适用于您的应用程序。请注意,但我相信这仍然需要重新启动应用程序本身,但不需要重新启动设备。

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"nl", @"en", nil] forKey:@"AppleLanguages"]; 

Here's另一个类似的问题也可能能帮助你

+1

这里的重点不是以编程方式更改设备上的语言,而是通过点击按钮来更改应用程序中的语言。 _first_不可能通过公共API,_second_一个是完全合理的,可以没有任何限制地完成。 – holex 2014-10-29 11:29:54

4

创建LocalizeHelper.h

#import <Foundation/Foundation.h> 

// some macros (optional, but makes life easy) 

// Use "LocalizedString(key)" the same way you would use "NSLocalizedString(key,comment)" 
#define LocalizedString(key) [[LocalizeHelper sharedLocalSystem] localizedStringForKey:(key)] 

// "language" can be (for american english): "en", "en-US", "english". Analogous for other languages. 
#define LocalizationSetLanguage(language) [[LocalizeHelper sharedLocalSystem] setLanguage:(language)] 

@interface LocalizeHelper : NSObject 

// a singleton: 
+ (LocalizeHelper*) sharedLocalSystem; 

// this gets the string localized: 
- (NSString*) localizedStringForKey:(NSString*) key; 

//set a new language: 
- (void) setLanguage:(NSString*) lang; 

@end 

和.m文件

// LocalizeHelper.m 
#import "LocalizeHelper.h" 

// Singleton 
static LocalizeHelper* SingleLocalSystem = nil; 

// my Bundle (not the main bundle!) 
static NSBundle* myBundle = nil; 


@implementation LocalizeHelper 


//------------------------------------------------------------- 
// allways return the same singleton 
//------------------------------------------------------------- 
+ (LocalizeHelper*) sharedLocalSystem { 
    // lazy instantiation 
    if (SingleLocalSystem == nil) { 
     SingleLocalSystem = [[LocalizeHelper alloc] init]; 
    } 
    return SingleLocalSystem; 
} 


//------------------------------------------------------------- 
// initiating 
//------------------------------------------------------------- 
- (id) init { 
    self = [super init]; 
    if (self) { 
     // use systems main bundle as default bundle 
     myBundle = [NSBundle mainBundle]; 
    } 
    return self; 
} 


//------------------------------------------------------------- 
// translate a string 
//------------------------------------------------------------- 
// you can use this macro: 
// LocalizedString(@"Text"); 
- (NSString*) localizedStringForKey:(NSString*) key { 
    // this is almost exactly what is done when calling the macro NSLocalizedString(@"Text",@"comment") 
    // the difference is: here we do not use the systems main bundle, but a bundle 
    // we selected manually before (see "setLanguage") 
    return [myBundle localizedStringForKey:key value:@"" table:nil]; 
} 


//------------------------------------------------------------- 
// set a new language 
//------------------------------------------------------------- 
// you can use this macro: 
// LocalizationSetLanguage(@"German") or LocalizationSetLanguage(@"de"); 
- (void) setLanguage:(NSString*) lang { 

    // path to this languages bundle 
    NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ]; 
    if (path == nil) { 
     // there is no bundle for that language 
     // use main bundle instead 
     myBundle = [NSBundle mainBundle]; 
    } else { 

     // use this bundle as my bundle from now on: 
     myBundle = [NSBundle bundleWithPath:path]; 

     // to be absolutely shure (this is probably unnecessary): 
     if (myBundle == nil) { 
      myBundle = [NSBundle mainBundle]; 
     } 
    } 
} 


@end 

对于设置语言使用

LocalizationSetLanguage(@"ar"); 

对于获取值使用

self.Mylabel.text = LocalizedString(@ “租金”);

对于您想支持的每种语言,您需要一个名为Localizable.strings的文件。这与Apple本地化文档中描述的完全相同。

// TABS 

"buy" = "شراء"; 
"rent" = "إيجار"; 
"addListing" = "إضافة إعلان" ; 
"calculator" = "دلالي" ; 
"news" = "أخبار" ; 
相关问题