Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 324
Yogesh Tandel Avatar asked Mar 08 '23 23:03

Yogesh Tandel


2 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

like image 64
Yogesh Tandel Avatar answered Apr 09 '23 01:04

Yogesh Tandel


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()
    } 
like image 22
Jeremy Avatar answered Apr 09 '23 02:04

Jeremy