Swift change language in runtime without restarting the app

519 views Asked by At

The code I wrote changes the language only if I restart the app, but I would like it to change language immediately.

It's possible to do it?

The language switch works fine, but only after I restart the app.

Maybe the problem is in the extension string?

Localizable.strings (it)

"label.language" = "Lingua";

Localizable.strings (en)

"label.language" = "Language";

struct ConstantFile {

static let labelLanguage = NSLocalizedString("label.language".localized, comment: "")

}

extension String {

    var localized: String {

        if let _ = UserDefaults.standard.string(forKey: "UserDefaultLanguage") {} else {

            // setting value default
            UserDefaults.standard.set(Language.italian.rawValue, forKey: "UserDefaultLanguage")
            UserDefaults.standard.synchronize()
        }

        let lang = UserDefaults.standard.string(forKey: "UserDefaultLanguage")

        let path = Bundle.main.path(forResource: lang, ofType: "lproj")
        let bundle = Bundle(path: path!)

        return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")

    }

}

class ViewController: UIViewController {

@IBOutlet weak var labelTitleLanguage: UILabel!

let userDefaults = UserDefaults.standard
let LANGUAGE_KEY = "UserDefaultLanguage"

override func viewDidLoad() {
        super.viewDidLoad()

labelTitleLanguage.text = ConstantFile.labelLanguage

}

@objc func tapBtnConfirmation(_ sender: UIButton) {
        
        let list = list[self.pickerView.selectedRow(inComponent: 0)]
        
        buttonPickerViewLanguage.setTitle(list, for: .normal)

        if list == ConstantFile.labelLanguageItalian {
            userDefaults.set(Language.italian.rawValue, forKey: LANGUAGE_KEY)
        } else if list == ConstantFile.labelLanguageEnglish {
            userDefaults.set(Language.english.rawValue, forKey: LANGUAGE_KEY)
        }

    }

}
1

There are 1 answers

1
David Ansermot On

You'll need to have a notification sent when changing language.

Then in your views, you observe this notification, and when it's raised, you update all translated texts in the view.

That's what I do