2

I would like to change application language inside the app without restarting.

There are Localizable.strings files for both languages. All my XIBs and main Storyboard too.

Te below code can change the language only after restarting an app

main.m:

int main(int argc, char *argv[])
{
    NSString *currLang = [[NSUserDefaults standardUserDefaults] stringForKey:@"Lang"];

    if (!currLang) {
        NSString *languageCode = [[NSLocale preferredLanguages] objectAtIndex:0];
        if ([languageCode isEqualToString:@"ru"]) {
            [[NSUserDefaults standardUserDefaults] setValue:languageCode forKey:@"Lang"];
        }
        else [[NSUserDefaults standardUserDefaults] setValue:@"en" forKey:@"Lang"];

        [[NSUserDefaults standardUserDefaults] synchronize];
    }

    currLang = nil;
    currLang = [[NSUserDefaults standardUserDefaults] stringForKey:@"Lang"];
    if ([currLang isEqualToString:@"ru"]) {
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"ru", @"en", nil]
                                                  forKey:@"AppleLanguages"];
    }
    else
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"ru", nil]
                                              forKey:@"AppleLanguages"];

    [[NSUserDefaults standardUserDefaults] synchronize];

    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

There are 2 buttons (Eng & Ru) ant the method:

- (IBAction)changeLang:(UIButton *)sender
{
    if ([sender isEqual:btnSetRuLang]) {
        if ([[userDefaults stringForKey:@"Lang"] isEqualToString:@"ru"]) {
            return;
        }
        [userDefaults setValue:@"ru" forKey:@"Lang"];
        [userDefaults synchronize];
    }
    else {
        if ([[userDefaults stringForKey:@"Lang"] isEqualToString:@"en"]) {
            return;
        }
        [userDefaults setValue:@"en" forKey:@"Lang"];
        [userDefaults synchronize];
    }

    NSString *currLang = [userDefaults stringForKey:@"Lang"];
    NSString *alertBody;
    if ([currLang isEqualToString:@"ru"]) {
        [userDefaults setObject:[NSArray arrayWithObjects:@"ru", @"en", nil]
                                                  forKey:@"AppleLanguages"];
        alertBody = @"Перезапустите приложение для смены языка";
    }
    else {
        [userDefaults setObject:[NSArray arrayWithObjects:@"en", @"ru", nil]
                                                  forKey:@"AppleLanguages"];
        alertBody = @"Restart application for change language";
    }

    [userDefaults synchronize];

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hom" message:alertBody delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
    [alertView show];

}

So, how should I change lang without restarting app?

Thank you.

4

2 回答 2

1

我在我的一个应用程序中做了同样的事情,当用户更改语言时,我做了同样的事情并通过调用 setNeedsDisplay 重新加载导航堆栈中的所有视图控制器,这会使用新的语言设置再次呈现视图。

编辑

对于视图控制器调用的每个实例,[self setNeedsDisplay]或者您可以将 self 替换为视图控制器的实例。

于 2013-08-07T04:12:57.080 回答
1

我建议你使用

NSLocalizedStringFromTable(key, tbl, comment)

代替NSLocalizedString(key, comment)

这样,您需要做的就是维护一个表名变量。使用en.stringsru.strings文件代替 Localizable.strings,当语言更改时,将表名作为enru传递

同样正如@Parser 建议的那样,您必须刷新您的视图。

于 2013-08-07T05:04:01.510 回答