-
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값에 맞는 영어/한국어로 변환됩니다.
하지만 여기서 두가지 문제점이 있습니다.
- 앱을 종료했을때 언어 상태가 유지 되지않음
- 언어 상태가 바뀌어도 현재 보여지고있는 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 는 해당 뷰에서 사용하면 좋습니다.
- 현재 보여지고 있는 뷰현재
- 보여지고있는 뷰 아래 있는 뷰 (예로 현재 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 를 다시 그리면 됩니다.
'개발 > Swift' 카테고리의 다른 글
[Swift] 클래스의 init 파헤치기 (0) 2021.10.18 [Swift 기본]ARC 와 Weak vs Strong (3) 2021.10.04 재사용 가능한 tableview cell nib만들기 (0) 2021.09.02 expandable + dynamic height tableview cell 구현하기 (0) 2021.09.02 Realm swift struct 타입, List타입 수정 하는법 (0) 2021.08.03