Localization in Swift - Restrict app to one language even if the app has more languages

Viewed 2244

I have developed an app in Swift 3.2 which is currently live with base language English. I have added String files for Arabic and French. But till the time everything in completed and tested by my team I want to restrict app to one language as there would be issues I need to address even for the English version and upload to App store. Deleting the sting and nib file option will not work for me.

Please let me know if there is any code that I can add to appdelegate to restrict app only for English.

I have tried disabling language Arabic in Settings which deletes localized string files

3 Answers

Added below code to AppDelegate in didFinishLaunchingWithOptions First line to force app left to right. Then in Edit Scheme - Added an Argument on Launch -AppleLanguages (Base). Working quite well for me to force user to English.

UIView.appearance().semanticContentAttribute = .forceLeftToRight
    UserDefaults.standard.set(["Base"], forKey: "AppleLanguages")
    UserDefaults.standard.synchronize()

enter image description here

Here's a method that do what you want. I don't think there's another way to do that in the code.

// You can change 'Base' to 'en' if you don't have Base.lproj folder 
func localizedString(_ key: String) -> String? {
    if let path = Bundle.main.path(forResource: "Base", ofType: ".lproj"),
        let baseBundle = Bundle(path: path) {
        return baseBundle.localizedString(forKey: key, value: nil, table: nil)
    }
    return nil
}

EDIT: I found another way to do it based on this answer.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    UserDefaults.standard.set(["Base"], forKey: "AppleLanguages")
    UserDefaults.standard.synchronize()
    // Rest of your init code
}

EDIT 2:

What you could do for the first launch of the app in the viewDidLoad of your initial ViewController:

    if let languageArray = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String],
        languageArray.count >= 1,
        languageArray[0] != "Base" && languageArray.count == 1 {
        UserDefaults.standard.set(["Base"], forKey: "AppleLanguages")
        UserDefaults.standard.synchronize()
    } 

Have you tried removing languages from the localization settings in the project file?

This is based on the guide provided by apple: Enabling Base Internationalization Image taken from developer.apple.com

I believe you would not have to delete anything. This would just disable the localization.

Related