로컬라이징으로 정의된 언어는 영어, 한국어, 일본어, 스페인어 총 4가지다.
코드로 처리하는게 아닌 프로젝트 내에서 default 언어를 설정하는 방법을 계속 찾아봤다

위 value를 직접 변경해 보기도 하고

프로젝트 파일을 에디터로 열어서 변경도 했었다
제 3언어로 설정하면 직전에 설정한 언어로 표기가 되는 문제가 발생한다.
위 증상을 확인해보니 IOS는 현재 폰에 설정된 언어가 앱이 지원하는 언어가 아닐경우에 선호하는 언어의 상단에 있는 지원되는 언어로 표기 되는 것이었다.
결국엔 프로젝트내에서 설정 할 수 없어, 코드로 처리하기로 함
import Foundation
extension String {
var localized: String {
return NSLocalizedString(self, tableName: "Localizable", value: self, comment: "")
}
}
protocol Localizable {
var localized: String { get }
}
protocol XIBLocalizable {
var xibLocKey: String? { get set }
}
extension UILabel: XIBLocalizable {
@IBInspectable var xibLocKey: String? {
get { return nil }
set(key) {
text = key?.localized
}
}
}
extension UIButton: XIBLocalizable {
@IBInspectable var xibLocKey: String? {
get { return nil }
set(key) {
setTitle(key?.localized, for: .normal)
}
}
}
extension UINavigationItem: XIBLocalizable {
@IBInspectable var xibLocKey: String? {
get { return nil }
set(key) {
title = key?.localized
}
}
}

기본 구성 방식은
스토리보드에 위와같이 설정해서 로컬라이징 하는 방식으로 구현 되어있다.
func localizableBundleSet() -> Bundle {
var language = UserDefaults.standard.array(forKey: "AppleLanguages")?.first as! String // 초기에 "ko-KR" , "en-KR" 등으로 저장되어있음
if language.hasPrefix("en") { language = SupportedLanguage.en.rawValue }
else if language.hasPrefix("ko") { language = SupportedLanguage.ko.rawValue }
else if language.hasPrefix("ja") { language = SupportedLanguage.ja.rawValue }
else if language.hasPrefix("zh") { language = SupportedLanguage.zh_CN.rawValue }
else if language.hasPrefix("es") { language = SupportedLanguage.es.rawValue }
else { language = SupportedLanguage.ko.rawValue
/**
정의되지 않은 언어들은 한국어로 로컬라이징 한다.
navigation barItem이 선호하는언어의 상단 언어를 따라가는것을 확인
setAppleLanguageTo()를 통하여 AppleLanguages 순서를 변경 해주었으나 앱이 재구동 시켜야지 적용 되는것을 확인, 주석처리
*/
// setAppleLanguageTo(lang: "ko-US")
}
let path = Bundle.main.path(forResource: language, ofType: "lproj")
let bundle = Bundle(path: path!)!
return bundle
}
앱구동시 Appdelegate에 선택된 언어로 기준으로 분기시켜
위와 같이 정의된 언어 외의 언어일 경우 참조하는 번들을 직접 정해주도록 구현 하였다.
extension String {
var localized: String {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let bundle = appDelegate.bundle else {
print("localizable target bundle nil!!")
return ""
}
return bundle.localizedString(forKey: self, value: self, table: "Localizable")
//return NSLocalizedString(self, tableName: "Localizable", value: self, comment: "")
}
}
Appdelegate의 설정된 bundle에서 직접 로컬라징 되도록 구현 하였다.
위와같이 구현하였을때 잘 구현 되었으나, 문제가 발생하였는데
Navigation barItem 은 선호하는 언어의 상단에 있는 지원되는 언어로 표기 되는 것이었다. (ex : Back )
func setAppleLanguageTo(lang: String) {
// Get the current list
var languages = UserDefaults.standard.stringArray(forKey: "AppleLanguages") ?? []
// Get all locales using the specified language
let matching = languages.filter { $0.hasPrefix(lang) }
if matching.count > 0 {
// Remove those entries from the list
languages.removeAll { $0 == lang }
// Add them back at the start of the list
languages.insert(contentsOf: matching, at: 0)
} else {
// It wasn't found in the list so add it at the top
languages.insert(lang, at: 0)
}
UserDefaults.standard.set(languages, forKey: "AppleLanguages")
}
위와같이 AppleLanguages의 순서를 변경 해주었는데 앱을 재구동해야 적용 되는 문제가 있었다...
일단 순서를 변경해 주는 부분은 주석처리하였고 Navigation barItem의 문제는 수정하지 않아도 된다고 하여 변경하지 않았다.
참고 링크
https://gonslab.tistory.com/61
iOS Swift 앱 안끄고 언어 변경 ( 앱 내 언어 설정 )
안녕하세요 Gons 입니다. 오늘은 앱을 종료하지 않고 언어변경을 해보겠습니다. 먼저 다국어 설정이 완료된 상태여야합니다. 다국어 설정이 안되신 분들은 이전 포스팅을 확인해주세요. 다국어
gonslab.tistory.com
https://stackoverflow.com/questions/58153765/swift-how-to-get-ios-device-current-language
Swift - how to get ios device current language
My device running iOS 12 and has English language as its primary language and Hebrew as it's secondary language. Now I'm opening my application with English as it's Base localization. In the
stackoverflow.com
'swift > 잡다함' 카테고리의 다른 글
| Xcode Todo, Mark, Summary (0) | 2021.06.30 |
|---|---|
| filePrivate, private 차이 (0) | 2021.06.24 |
| Struct VS Class (0) | 2021.06.16 |
| extension, protocol, Higher_Order_Func (0) | 2021.06.16 |
| 기본 클로저 사용 (0) | 2021.06.07 |