Как изменить язык (локализацию) в приложении в swift 5? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь локализовать приложение iOS, которое разработано в Swift 5. Я сделал со всеми вещами локализации в коде, а также в раскадровке. Но я не уверен, как изменить язык в приложении, когда я нажимаю кнопку «Язык».

Можно ли изменить язык приложения в приложении? если да Как?

Пожалуйста, предложите лучший способ сделать то же самое

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Я только что сделал похожую реализацию. Рад, что вы спросили, и я видел это. Вот моя реализация. Вы можете изменить.

enum Language: String, CaseIterable {
    case english, german

    var code: String {
        switch self {
        case .english: return "en"
        case .german: return "de"
        }
    }

    static var selected: Language {
        set {
            UserDefaults.standard.set([newValue.code], forKey: "AppleLanguages")
            UserDefaults.standard.set(newValue.rawValue, forKey: "language")
        }
        get {
            return Language(rawValue: UserDefaults.standard.string(forKey: "language") ?? "") ?? .english
        }
    }

    static func switchLanguageBetweenEnglishAndGerman() {
        selected = selected == .english ? .german : .english
    }
}

Теперь вам просто нужно позвонить Language.selected == .german и перезагрузить представления.

0 голосов
/ 09 апреля 2020

Чтобы изменить локализацию во всем приложении. Для этого вам необходимо выполнить следующий шаг:

Создать родительский класс для каждого UIViewController и определить метод setupLocasitation для дальнейшего использования.

ParentViewController.swift

class ParentViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    func setupLocasitation(){

    }
}

Все остальные классы UIViewController должны быть подклассом ParentViewController и переопределять setupLocasitation метод

ViewController1.swift

class ViewController1: ParentViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupLocasitation()
    }

    override func setupLocasitation() {
        super.setupLocasitation()
        print("Your localisation specifi code here...")
    }
}

ViewController2.swift

class ViewController2: ParentViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupLocasitation()            
    }

    override func setupLocasitation() {
        super.setupLocasitation()
        print("Your localisation specifi code here...")
    }   
}

ChangeLanguageV C .swift

Вам нужно захватить все экземпляры ParentViewController и принудительно вызвать метод setupLocasitation.

class ChangeLanguageVC: ParentViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupLocasitation()
    }

    @IBAction func btnChangeLanguageTap(){
        //Code for your language changes here...

        let viewControllers = self.navigationController?.viewControllers ?? []
        for vc in viewControllers{
            if let parent = vc as? ParentViewController{
                parent.setupLocasitation()
            }
        }
    }
}
0 голосов
/ 09 апреля 2020

Да, это возможно. У меня есть 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, чтобы увидеть изменения , Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...