Reputation: 1315
I am changing my iOS application preferred language dynamically using this setting:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"ar"] forKey:@"AppleLanguages"];
Then I load a localised resource file from the main NSBundle object, but the loaded file isn't of the new language, it's loaded in the default english language until I restart the application totally then it loads the arabic localisation.
I want to force NSBundle to load the resource file in the new language @"ar" not the language been set when app starts. How?
Upvotes: 0
Views: 1069
Reputation: 836
You need to synchronize user defaults after changing the language: [[NSUserDefaults standardUserDefaults] default synchronize]
Upvotes: 0
Reputation: 341
I have tried this and its working fine without restarting the app:
//Use this in constants
#ifdef NSLocalizedString
#undef NSLocalizedString
#endif
#define NSLocalizedString(str, cmt) NSLocalizedStringFromTableInBundle(str, nil, newLangbundle, cmt)
newLangbundle --> Define a global variable in .pch and vary it according to language selection using this,
NSString* path = [[NSBundle mainBundle] pathForResource:@"th" ofType:@"lproj"];
newLangbundle = [NSBundle bundleWithPath:path];
Upvotes: 0
Reputation: 57040
Your method is a hacky way to get what you need, and requires app restart to take effect.
It is best to use NSLocalizedStringFromTableInBundle
instead of NSLocalizedString
, and provide the bundle for that language.
NSString* path = [[NSBundle mainBundle] pathForResource:@"ar" ofType:@"lproj"];
NSBundle* ar_bundle = [NSBundle bundleWithPath:path];
NSLocalizedStringFromTableInBundle(@"str", nil, ar_bundle, @"comment");
If you put the bundle in a global scope, you can create a macro for ease:
#define ARLocalizedString(str, cmt) NSLocalizedStringFromTableInBundle(str, nil, ar_bundle, cmt)
Upvotes: 3