Changing the language at runtime is a bit more complicated.
This is the best way I've used for this tiny class:
Language.m:
#import "Language.h" @implementation Language static NSBundle *bundle = nil; +(void)initialize { NSUserDefaults* defs = [NSUserDefaults standardUserDefaults]; NSArray* languages = [defs objectForKey:@"AppleLanguages"]; NSString *current = [languages objectAtIndex:0]; [self setLanguage:current]; } +(void)setLanguage:(NSString *)l { NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ]; bundle = [NSBundle bundleWithPath:path]; } +(NSString *)get:(NSString *)key alter:(NSString *)alternate { return [bundle localizedStringForKey:key value:alternate table:nil]; } @end
Language.h:
import <Foundation/Foundation.h> @interface Language : NSObject +(void)setLanguage:(NSString *)l; +(NSString *)get:(NSString *)key alter:(NSString *)alternate; @end
If you want to change the language:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"de", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; [Language setLanguage:@"en"]; [(AppDelegate *)[[UIApplication sharedApplication] delegate] window].rootViewController = [self.storyboard instantiateInitialViewController];
If you want to set the line:
[self.someButton setTitle:[Language get:@"Some Button Text" alter:nil] forState:UIControlStateNormal];
Segev source share