Search code examples
ioslocalizationnsbundle

iOS Change app Language doesn't take effect


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?


Solution

  • 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)