Да, это возможно. У меня есть changeLanguageButton
как:
@IBAction func changeLanguage(_ sender: Any) {
if LocalizationSystem.sharedInstance.getLanguage() == "fr" {
LocalizationSystem.sharedInstance.setLanguage(languageCode: "en")
} else {
LocalizationSystem.sharedInstance.setLanguage(languageCode: "fr")
}
changeLanguageMethod()
}
И мой changeLanguageMethod
как:
func changeLanguageMethod() {
navItem.title = LocalizationSystem.sharedInstance.localizedStringForKey(key: "X9C-eo-NSL.title", comment: "")
nameTitleLabel.text = LocalizationSystem.sharedInstance.localizedStringForKey(key: "9lm-VV-Y7L.text", comment: "")
emailTitleLabel.text = LocalizationSystem.sharedInstance.localizedStringForKey(key: "OaK-Vp-bxb.text", comment: "")
viewWillAppear(true)
}
Добавьте эти коды для других ваших контроллеров представления:
override func viewWillAppear(_ animated: Bool) {
changeLanguageMethod()
}
changeLanguageMethod
контроллера другого представления должен иметь вид:
func changeLanguageMethod() {
navItem.title = LocalizationSystem.sharedInstance.localizedStringForKey(key: "X9C-eo-NSL.title", comment: "")
nameTitleLabel.text = LocalizationSystem.sharedInstance.localizedStringForKey(key: "9lm-VV-Y7L.text", comment: "")
emailTitleLabel.text = LocalizationSystem.sharedInstance.localizedStringForKey(key: "OaK-Vp-bxb.text", comment: "")
}
Класс LocalizationSystem (добавить свой проект):
import Foundation
import UIKit
class LocalizationSystem:NSObject {
var bundle: Bundle!
class var sharedInstance: LocalizationSystem {
struct Singleton {
static let instance: LocalizationSystem = LocalizationSystem()
}
return Singleton.instance
}
override init() {
super.init()
bundle = Bundle.main
}
func localizedStringForKey(key:String, comment:String) -> String {
return bundle.localizedString(forKey: key, value: comment, table: nil)
}
func localizedImagePathForImg(imagename:String, type:String) -> String {
guard let imagePath = bundle.path(forResource: imagename, ofType: type) else {
return ""
}
return imagePath
}
//MARK:- setLanguage
// Sets the desired language of the ones you have.
// If this function is not called it will use the default OS language.
// If the language does not exists y returns the default OS language.
func setLanguage(languageCode:String) {
var appleLanguages = UserDefaults.standard.object(forKey: "AppleLanguages") as! [String]
appleLanguages.remove(at: 0)
appleLanguages.insert(languageCode, at: 0)
UserDefaults.standard.set(appleLanguages, forKey: "AppleLanguages")
UserDefaults.standard.synchronize() //needs restrat
if let languageDirectoryPath = Bundle.main.path(forResource: languageCode, ofType: "lproj") {
bundle = Bundle.init(path: languageDirectoryPath)
} else {
resetLocalization()
}
}
//MARK:- resetLocalization
//Resets the localization system, so it uses the OS default language.
func resetLocalization() {
bundle = Bundle.main
}
//MARK:- getLanguage
// Just gets the current setted up language.
func getLanguage() -> String {
let appleLanguages = UserDefaults.standard.object(forKey: "AppleLanguages") as! [String]
let preferredLanguage = appleLanguages[0]
if preferredLanguage.contains("-") {
let array = preferredLanguage.components(separatedBy: "-")
return array[0]
}
return preferredLanguage
}
}
Я могу изменить язык локализации и вызвать willAppear
, чтобы увидеть изменения , Надеюсь, это поможет ...