如何更改应用程序内的应用程序语言?

时间:2013-08-07 03:44:18

标签: ios localization

我想在不重新启动的情况下更改应用内的应用语言。

这两种语言都有Localizable.strings文件。我的所有XIB和主要故事板也都是。

以下代码只能在重新启动应用程序后更改语言

的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]));
    }
}

方法有2个按钮(Eng& Ru):

- (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];

}

那么,如何在不重新启动应用程序的情况下更改lang?

谢谢。

2 个答案:

答案 0 :(得分:1)

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

修改

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

答案 1 :(得分:1)

我建议你使用

NSLocalizedStringFromTable(key, tbl, comment)

而不是NSLocalizedString(key, comment)

这样你需要做的就是维护一个表名变量。使用 en.strings ru.strings 文件而不是Localizable.strings,当语言更改时将表名称传递为 en RU

同样@Parser建议,你必须刷新你的观点。