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:
- the below groups of code create in app language change, including tab bar names.
- you must put data in localize.strings main.strings not work this. means need programmatically add "back", "cancel" , navigation titles, menu items.
- 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:
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";
result:
Comments
Post a Comment