You want to set the application language from the application user interface, ignoring user preferences on the device. This is unusual, but here you go ...
First write all your language strings in the directory structure as follows:
i18n/en.lproj/Localizable.strings i18n/ar.lproj/Localizable.strings
Create an additional directory with the appropriate two-letter code for each supported language.
If files are recognized as i18n resources, they will be represented as follows: 
Files will have a key = value with the following format:
"button.back" = "ظهر";
In the code, replace any localizable string with the key. Example:
[self.stateBtn setTitle:localize(@"button.back") forState:UIControlStateNormal];
Usually you use NSLocalizedString(@"key",@"fallback") , but since you want to ignore the iPhone settings, I wrote a localize(@"key") macro localize(@"key") , which will have the following implementation:
Localization.h
#ifndef localize #define localize(key) [[Localization sharedInstance] localizedStringForKey:key] #endif @interface Localization : NSObject @property (nonatomic, retain) NSBundle* fallbackBundle; @property (nonatomic, retain) NSBundle* preferredBundle; @property (nonatomic, copy) NSString* fallbackLanguage; @property (nonatomic, copy) NSString* preferredLanguage; -(NSString*) localizedStringForKey:(NSString*)key; -(NSString*) pathForFilename:(NSString*)filename type:(NSString*)type; +(Localization*)sharedInstance; @end
Localization.m
#import "Localization.h" @implementation Localization +(Localization *)sharedInstance { static dispatch_once_t pred; static Localization *shared = nil; dispatch_once(&pred, ^{ shared = [[Localization alloc] init]; [shared setPreferred:@"en" fallback:@"ar"]; }); return shared; } -(void) setPreferred:(NSString*)preferred fallback:(NSString*)fallback { self.fallbackLanguage = fallback; self.preferredLanguage = preferred; NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:self.fallbackLanguage]; self.fallbackBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]]; bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:self.preferredLanguage]; self.preferredBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]]; } -(NSString*) pathForFilename:(NSString*)filename type:(NSString*)type { NSString *path = [self.preferredBundle pathForResource:filename ofType:type inDirectory:nil forLocalization:self.preferredLanguage]; if (!path) path = [self.fallbackBundle pathForResource:filename ofType:type inDirectory:nil forLocalization:self.fallbackLanguage]; if (!path) NSLog(@"Missing file: %@.%@", filename, type); return path; } -(NSString*) localizedStringForKey:(NSString*)key { NSString* result = nil; if (_preferredBundle!=nil) { result = [_preferredBundle localizedStringForKey:key value:nil table:nil]; } if (result == nil) { result = [_fallbackBundle localizedStringForKey:key value:nil table:nil]; } if (result == nil) { result = key; } return result; } @end
This will use the search for key lines in the Arabic file, and if the key is missing, it will look in the Arabic file. If you want it in another way, do the following from the button handlers:
[[Localization sharedInstance] setPreferred:@"ar" fallback:@"en"];
Sample project on Github .
If localization does not work
If localization does not work, use the plutil command-line tool to check the file format. It should output: Localizable.strings: OK . Example:
$ plutil -lint Localizable.strings Localizable.strings: OK
This format is described in Internationalization Programming Topics> String Localization . You can add comments // single-line or /* multi-line */ . For non-Latin languages, it is recommended to code Localized.strings in UTF-16. You can convert between encodings in the Xcode inspector panel.
If it still doesn’t work, check that you copy the Localizable.strings file in the “Copy Files” phase of your target. Note that when you add Localizable.strings files there, sometimes they appear in red, continue to do this until the file appears in black, and then delete the red ones (hacky, I know, Xcode is to blame).
