ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Localize + UserDefaults 사용하여 언어 설정 기능 구현 하기
    개발/Swift 2021. 9. 16. 15:51

    Localizable 세팅 참고 : https://zeddios.tistory.com/368

     

    앱 내의 언어설정을 위해 Localize 를 사용하고

    해당 언어설정 상태를 앱 내부에 저장해두고 사용하기위해 UserDefaults를 사용했습니다.

    첫번째로 Localize.setCurrentLanguage() 함수를 사용해 언어를 세팅해주는것입니다.

    @IBAction func onClickKorean(_ sender: Any) {
            Localize.setCurrentLanguage("ko")
    
        }
        @IBAction func onClickEnglish(_ sender: Any) {
            Localize.setCurrentLanguage("en")
    
        }

     

    "ko" "en" 같은 언어코드는

    http://www.lingoes.net/en/translator/langcode.htm

    여기서 찾아 사용하면 됩니다.

    이후로는

    Localizable.string 파일에 해당 언어 설정을 해둔뒤에

    "Key값".localized(using: "Localizable")

     

    이런식으로 사용하면 Key값에 맞는 영어/한국어로 변환됩니다.

     

    하지만 여기서 두가지 문제점이 있습니다.

    1. 앱을 종료했을때 언어 상태가 유지 되지않음
    2. 언어 상태가 바뀌어도 현재 보여지고있는 view의 언어는 바뀌지 않음(앞으로 보여질 view에만 적용됨)

    1번의 경우 앱의 내부 저장소를 이용합니다. UserDefaults를 사용하면 어떤 타입이든 저장할수 있습니다.

    pods을 사용하거나 import 도 필요하지 않습니다.

    값을 저장할때 이렇게 사용합니다.

    @IBAction func onClickKorean(_ sender: Any) {
            UserDefaults.standard.setValue("ko", forKey: "languageType")
            Localize.setCurrentLanguage("ko")
    
    				setUI()
    
        }
        @IBAction func onClickEnglish(_ sender: Any) {
            UserDefaults.standard.setValue("en", forKey: "languageType")
            Localize.setCurrentLanguage("en")
    				setUI()
        }

     

    "languageType" 이라는 키값을 줬고 변경 할때마다 밸류값으로 언어코드를 넣어줍니다.

    해당 키 값으로 원하는때에 밸류값을 받아올수있습니다.

    예로 밸류값에따라 다른 UI를 그린다고 가정 해본다면 위와같이 setUI함수를 호출시킬수 있습니다.

    setUI함수 안에서 언어 별로 다른 UI를 그리는 로직을 넣으면 되겠죠

    private func setUI(){
            let languageType = UserDefaults.standard.string(forKey: "languageType") ?? "ko"
            setButtonUI(languageType:languageType)
        }

     

     

    위와같이 UserDefaults.standard.string(forKey: "languageType") 을 호출해 밸류값을 받아와 사용했습니다.

    이러면 앱이 종료 되어도 UserDefaults.standard.string(forKey: "languageType") 을 불러와서

    사용할수 있습니다.

    2번의 경우 NotificationCenter 을 사용합니다.

    NotificationCenter 는 해당 뷰에서 사용하면 좋습니다.

    1. 현재 보여지고 있는 뷰현재
    2. 보여지고있는 뷰 아래 있는 뷰 (예로 현재 view 에서 pop 이 된 경우를 의미 합니다.)

    이미 떠있는 view 이기 때문에 이전 언어로 view가 그려진 상태고

    새 언어를 적용시키기 위해서는 새로 업데이트를 해줘야합니다.

    그러기 위해 NotificationCenter를 사용합니다.

     

    override func viewDidLoad() {
            super.viewDidLoad()
        
            NotificationCenter.default.addObserver(self,
    				 selector: #selector(onLanguageChange),
    				 name: NSNotification.Name(LCLLanguageChangeNotification),
    				 object: nil
    				)
        }
    
    
    @objc func onLanguageChange(){
            setUI()
        }

     

    LCLLanguageChangeNotification 는 Localize_Swift를 import 해야 사용할수 있습니다.

    이렇게 세팅을 해두면 언어가 변경될때 (Localize.setCurrentLanguage() 가 호출될때)

    onLanguageChange() 함수를 실행시키고 여기서 view 를 다시 그리면 됩니다.

     

     

    댓글

Designed by Tistory.