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

标签 ios localization

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

两种语言都有 Localized.strings 文件。我所有的 XIB 和主 Storyboard 也是如此。

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

ma​​in.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 个按钮(英语和俄语):

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

}

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

谢谢。

最佳答案

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

编辑

对于 View Controller 的每个实例,调用[self setNeedsDisplay],或者您可以用 View Controller 的实例替换 self。

关于ios - 如何更改应用程序内的应用程序语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18094282/

相关文章:

ios - 更改 iOS 应用本地化运行时

ios - 如何禁用 UIPickerView (Objective-C)?

ios - 如何使用.scaleAspectFit和.top在UIImageView中正确对齐图像?

android - 为什么在Web View 中渲染组件的速度变慢?

ios - 如何设置状态栏的背景颜色?

javascript - 使用原生 JS 获取本地化的月份名称

php - 本地化网站

ios - 在 iOS SDK 上将录制的电影转换为 GIF

Android 应用程序不再回退到默认值/strings.xml

c# - 如何在代码隐藏中使用 wpflocalizeextension?