ios - Switching the language directly in the application -


have been trying localize app 7 languages, tutorials found display how on single page, not through out app.

i @ point localization works when device of language, need have ability change languages via button.

edit: below code works fine looking similar solution.

notes below:

  1. the below groups of code create in app language change, including tab bar names.
  2. you must put data in localize.strings main.strings not work this. means need programmatically add "back", "cancel" , navigation titles, menu items.
  3. the nsnotificationcenter inside each of "changetoxx" func set notify tabbarviewcontroller (or controller need) language has changed.

i

import uikit  let applanguagekey = "applanguage"  let applanguagedefaultvalue = ""  var applanguage: string {  {     if let language = nsuserdefaults.standarduserdefaults().stringforkey(applanguagekey) {         return language     } else {         nsuserdefaults.standarduserdefaults().setvalue(applanguagedefaultvalue, forkey: applanguagekey)         return applanguagedefaultvalue     } }   set(value) {      nsuserdefaults.standarduserdefaults().setvalue((value), forkey: applanguagekey)  }    }   let languagechangedkey = "languagechanged"   class settingslanguagevc: uiviewcontroller  {       @iboutlet weak var languageenbutton: uibutton!     @iboutlet weak var flagenimageview: uiimageview!     @iboutlet weak var languageentitlelabel: uilabel!     @iboutlet weak var checkmarken: uiimageview!      @iboutlet weak var languagedebutton: uibutton!     @iboutlet weak var flagdeimageview: uiimageview!     @iboutlet weak var languagedetitlelabel: uilabel!     @iboutlet weak var checkmarkde: uiimageview!      @iboutlet weak var languagefrbutton: uibutton!     @iboutlet weak var flagfrimageview: uiimageview!     @iboutlet weak var languagefrtitlelabel: uilabel!     @iboutlet weak var checkmarkfr: uiimageview!      @iboutlet weak var languageesbutton: uibutton!     @iboutlet weak var flagesimageview: uiimageview!     @iboutlet weak var languageestitlelabel: uilabel!     @iboutlet weak var checkmarkes: uiimageview!      var tabbar = tabbarcontroller()     var mydelegateclass = ""       override func viewdidload()     {         super.viewdidload()          configureview()         print(applanguage)          navigationitem.leftbarbuttonitem = uibarbuttonitem(title: "back".localized, style: .plain, target: self, action: #selector(settingslanguagevc.back(_:)))         navigationitem.title = "select language".localized      }      override func didreceivememorywarning()     {         super.didreceivememorywarning()     }       func settranslatedtext(){         if applanguage == "es" {             checkmarkshowes()          } else if applanguage == "de" {             checkmarkshowde()          } else if applanguage == "fr" {             checkmarkshowfr()          } else {             checkmarkshowen()         }      }     func configureview(){           let localeen = nslocale(localeidentifier: "en")         let english = localeen.displaynameforkey(nslocaleidentifier, value: "en")          languageentitlelabel.text = english         flagenimageview.image = uiimage(named: "flag-en.png")         languageenbutton.addtarget(self, action: #selector(self.changetoen), forcontrolevents: .touchupinside)          //german          let localede = nslocale(localeidentifier: "de")         let german = localede.displaynameforkey(nslocaleidentifier, value: "de")          languagedetitlelabel.text = german         flagdeimageview.image = uiimage(named: "flag-de.png")         languagedebutton.addtarget(self, action: #selector(self.changetode), forcontrolevents: .touchupinside)          //french          let localefr = nslocale(localeidentifier: "fr")         let french = localefr.displaynameforkey(nslocaleidentifier, value: "fr")          languagefrtitlelabel.text = french         flagfrimageview.image = uiimage(named: "flag-fr.png")         languagefrbutton.addtarget(self, action: #selector(self.changetofr), forcontrolevents: .touchupinside)          //spanish          let localees = nslocale(localeidentifier: "es")         let spanish = localees.displaynameforkey(nslocaleidentifier, value: "es")          languageestitlelabel.text = spanish         flagesimageview.image = uiimage(named: "flag-es.png")         languageesbutton.addtarget(self, action: #selector(self.changetoes), forcontrolevents: .touchupinside)           if applanguage == "es" {             checkmarkshowes()          } else if applanguage == "de" {             checkmarkshowde()          } else if applanguage == "fr" {             checkmarkshowfr()          } else {             checkmarkshowen()         }     }       func changetoen(sender: uibutton)     {         checkmarkshowen()         applanguage = "en"         nsuserdefaults.standarduserdefaults().synchronize()         nsnotificationcenter.defaultcenter().postnotificationname(languagechangedkey, object: self)         [self.viewdidload()]     }      func changetode(sender: uibutton)     {         applanguage = "de"         nsuserdefaults.standarduserdefaults().synchronize()         nsnotificationcenter.defaultcenter().postnotificationname(languagechangedkey, object: self)         [self.viewdidload()]     }      func changetofr(sender: uibutton)     {         checkmarkshowfr()         applanguage = "fr"         nsuserdefaults.standarduserdefaults().synchronize()         nsnotificationcenter.defaultcenter().postnotificationname(languagechangedkey, object: self)         [self.viewdidload()]     }      func changetoes(sender: uibutton)     {         checkmarkshowes()         applanguage = "es"         nsuserdefaults.standarduserdefaults().synchronize()         nsnotificationcenter.defaultcenter().postnotificationname(languagechangedkey, object: self)         [self.viewdidload()]     }       func checkmarkshowen (){         self.checkmarken.hidden = false         self.checkmarkde.hidden = true         self.checkmarkfr.hidden = true         self.checkmarkes.hidden = true     }       func checkmarkshowde (){         self.checkmarken.hidden = true         self.checkmarkde.hidden = false         self.checkmarkfr.hidden = true         self.checkmarkes.hidden = true     }      func checkmarkshowfr (){         self.checkmarken.hidden = true         self.checkmarkde.hidden = true         self.checkmarkfr.hidden = false         self.checkmarkes.hidden = true     }      func checkmarkshowes () {          self.checkmarken.hidden = true         self.checkmarkde.hidden = true         self.checkmarkfr.hidden = true         self.checkmarkes.hidden = false     }        @ibaction func (sender: anyobject) {         //back 1 vc         navigationcontroller?.popviewcontrolleranimated(true)     }   } 

all text needing localized, need have suffix .localized, along following inside stringextension.swift

    extension string {  var localized: string {     return localized(applanguage) }  var localizestringusingsystemlang: string {     return nslocalizedstring(self, comment: "") }  func localized(lang:string?) -> string {      if let lang = lang {         if let path = nsbundle.mainbundle().pathforresource(lang, oftype: "lproj") {             let bundle = nsbundle(path: path)             return nslocalizedstring(self, tablename: nil, bundle: bundle!, value: "", comment: "")         }     }  return localizestringusingsystemlang } }  return localizestringusingsystemlang     } } 

here tabbarcontroller code:

  1. note: tabs "search", "favorites" , "more" system tabs. had change them custom , manually add names tabs , add own icons. otherwise not localized.

    import uikit

    class tabbarcontroller: uitabbarcontroller {

    override func viewdidload() {     super.viewdidload()     // additional setup after loading view, typically nib.      settabviewcontrollerparams(0, tabbaritemtitle: "species".localized, navigationitemtitle: filterby)     settabviewcontrollerparams(1, tabbaritemtitle: "regions".localized, navigationitemtitle: "my regions".localized)     settabviewcontrollerparams(2, tabbaritemtitle: "favorites".localized, navigationitemtitle: "favorites".localized)     settabviewcontrollerparams(3, tabbaritemtitle: "search".localized, navigationitemtitle: "")     settabviewcontrollerparams(4, tabbaritemtitle: "more".localized, navigationitemtitle: "reef life apps")      nsnotificationcenter.defaultcenter().addobserver(self, selector: #selector(tabbarcontroller.languagechangedtrigger), name: languagechangedkey, object: nil)  }   func languagechangedtrigger () {      [self.viewdidload()] }   func settabviewcontrollerparams(index: int, tabbaritemtitle: string, navigationitemtitle: string) {      if let tabbaritems = tabbar.items {         if index < tabbaritems.count {             tabbaritems[index].title = tabbaritemtitle         }     }      if let viewcontrollers = viewcontrollers {         if index < viewcontrollers.count {             if let navigationcontroller = viewcontrollers[index] as? uinavigationcontroller {                 if navigationcontroller.viewcontrollers.count > 0 {                     let viewcontroller = navigationcontroller.viewcontrollers[0]                     viewcontroller.navigationitem.title = navigationitemtitle                 }             }         }     } } 

    }

lastly, added below appdelegate's "didfinishlaunchingwithoptions" when non english based phone launches, app launch in language, rather default english.

if nslocale.currentlocale().objectforkey(nslocalelanguagecode)! as! string == "es" {   applanguage = "es" }else if nslocale.currentlocale().objectforkey(nslocalelanguagecode)! as! string == "fr" {     applanguage = "fr" }else if nslocale.currentlocale().objectforkey(nslocalelanguagecode)! as! string == "de" {     applanguage = "de" }else  {     applanguage = "en" } 

hope helps.

try sample:

viewcontroller.swift

import uikit  let applanguagekey = "applanguage" let applanguagedefaultvalue = "en"  var applanguage: string {  {     if let language = nsuserdefaults.standarduserdefaults().stringforkey(applanguagekey) {         return language     } else {         nsuserdefaults.standarduserdefaults().setvalue(applanguagedefaultvalue, forkey: applanguagekey)         return applanguagedefaultvalue     } }  set(value) {     nsuserdefaults.standarduserdefaults().setvalue((value), forkey: applanguagekey) }  }  class viewcontroller: uiviewcontroller {  override func viewdidload() {     super.viewdidload()      nslog("title user lang: \("title".localizestring)")     nslog("title en: \("title".localizestring("en"))")     nslog("title ru: \("title".localizestring("ru"))")     nslog("title fr: \("title".localizestring("fr"))")     nslog("title ??: \("title".localizestring("blabla"))")     nslog("title sysem lnag: \("title".localizestringusingsystemlang)")     // additional setup after loading view, typically nib.  } } 

stringextension.swift

import foundation  extension string {  var localizestring: string {     return localizestring(applanguage) }  var localizestringusingsystemlang: string {     return nslocalizedstring(self, comment: "") }  func localizestring(lang:string?) -> string {      if let lang = lang {         if let path = nsbundle.mainbundle().pathforresource(lang, oftype: "lproj") {             let bundle = nsbundle(path: path)             return nslocalizedstring(self, tablename: nil, bundle: bundle!, value: "", comment: "")         }     }     return localizestringusingsystemlang } } 

localizable.strings (russian)

"title" = "Привет"; 

localizable.strings (english)

"title" = "hello"; 

localizable.strings (french)

"title" = "salut"; 

enter image description here

result:

enter image description here


Comments

Popular posts from this blog

amazon web services - S3 Pre-signed POST validate file type? -

c# - Check Keyboard Input Winforms -