切换应用程序语言而无需重新启动应用程序swift

时间:2018-04-11 11:28:43

标签: ios swift localization

我希望我的应用语言在点击按钮时更改..

我的代码是:

@IBAction func convertlang(_ sender: Any) {
   if L102Language.currentAppleLanguage() == "en" {
        L102Language.setAppleLAnguageTo(lang: "ar")
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        L102Language.setAppleLAnguageTo(lang: "en")
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}

let APPLE_LANGUAGE_KEY = "AppleLanguages"
class L102Language {
    class func currentAppleLanguage() -> String{
         let userdef = UserDefaults.standard
         let langArray = userdef.object(forKey: APPLE_LANGUAGE_KEY) as! NSArray
         let current = langArray.firstObject as! String
    return current
}

class func setAppleLAnguageTo(lang: String) {
    let userdef = UserDefaults.standard
    userdef.set([lang,currentAppleLanguage()], forKey: APPLE_LANGUAGE_KEY)
    userdef.synchronize()
}}

这很好用,当我点击按钮时转换语言..

问题是我需要重新启动应用以查看语言更改..

我搜索了这个但是他们中的大多数都是针对Objective-c并尝试了一些快速但是没有工作..

怎么做?

3 个答案:

答案 0 :(得分:4)

通过正常的按钮点击,您无法在运行时更改语言。如果您确实需要,则需要使用自定义本地化系统。

要在运行时更改应用程序语言,我已通过创建两个不同的故事板手动完成此操作。我在NSUserDefaults中保存了语言偏好设置,但未使用密钥AppleLanguages,然后调用AppDelegate的didFinishLaunchingWithOptions方法来选择故事板。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainEnglish" bundle:nil];
UINavigationController *navigationcontroller=[[UINavigationController alloc]init];
RegistorViewController *registor=[storyboard instantiateViewControllerWithIdentifier:@"Registor"];
[self.window setRootViewController:navigationcontroller];
[self.window makeKeyAndVisible];
[navigationvontroller pushViewController:registor animated:NO];

虽然这不是苹果希望开发人员在运行时做的事情。

Someone even asked an Apple engineer这是回复:

  

通常,您不应在应用程序中更改iOS系统语言(通过使用AppleLanguages pref键)。这违反了在Settings应用程序中切换语言的基本iOS用户模型,并且还使用了未记录的首选项密钥,这意味着在将来的某个时刻,密钥名称可能会更改,这会破坏您的应用程序。

     

如果要在应用程序中切换语言,可以通过手动加载捆绑包中的资源文件来实现。您可以使用NSBundle:pathForResource:ofType:inDirectory:forLocalization:为此目的,但请记住,您的应用程序将负责所有本地化数据的加载。

答案 1 :(得分:3)

我最近在项目中遇到了同样的问题。您使用正确的代码更改应用程序语言,但它只更改字符串文件数据而不更改故事板。要完成本地化,您必须再次重新启动应用程序,因为没有任何其他方法可以执行此操作。您可以向用户"Please restart your app to change language completely"显示弹出窗口。因为我们可以以编程方式终止应用程序,但在执行此操作后无法再次重新启动应用程序。

答案 2 :(得分:0)

这可能不是iOS最典型的做事方式,但我倾向于像处理应用程序中的任何其他数据一样处理静态内容,尤其是当我使用VIPER(尽管其他模式可行)和单向数据时流动。

考虑到这一点,为此我将有一个服务访问一个由用户的语言偏好键入的静态内容存储。当改变时,我会触发刷新内容。

当我还有服务器数据以及需要本地化的本地数据时,这对项目非常有效。

公平地说,我从未使用过标准工具。我怀疑这对于从右到左的语言类型可能并不理想。