TIL #9
사용자 Locale 정보 받아오기
프로젝트에서 캘린더를 만드는 과정에 Calendar 객체와 DateFormatter 객체를 사용하게 되었다.
두 객체에 Locale 정보를 입력할 필요가 생겼는데, Localization을 어떻게 적용할 수 있을까 공부하게 되었다.
current, autoUpdatingToCurrent 프로퍼티 사용하기
Locale - current
Locale - autoUpdatingCurrent
두 타입 프로퍼티는 사용자의 지역정보를 가지고 있는 변수이다.
해당 변수를 디버깅해보았는데, 결과는 en_KR 즉 영어 Locale 정보가 반환되었다.
Simulator 설정 오류인게 아닐까?
Simulator에서 설정 - 언어 변경을 변경해보았지만, 똑같이 영어가 나왔다.
덴마크 언어로 변경해보았지만, 똑같이 영어가 나왔다. 기본 언어가 영어로 설정되는 것인가?
문제
두 타입 프로퍼티를 사용하려면 번들에 lproj 파일을 가지고 있어야 한다.
Apple - How iOS Determines the Language For Your App
위의 공식문서를 보면, 앱은 다음과 같은 순서로 사용자의 언어를 결정한다.
- 사용자 설정에서 선호 언어들 중 첫 번째를 가져온다.
- 앱이 해당 언어를 지원하는지 확인한다. -> .lproj 파일이 존재하는지 확인
- 만약, 해당 언어를 지원하지 않으면 그 다음 선호 언어를 기반으로 1, 2번을 반복한다.
- 모두 지원되지 않는 경우에는 앱의 CFBundleDevelopmentRegion과 일치하는 언어를 선택한다.
그렇다면, 왜 영어가 설정된것일까? 답은 Project는 영어를 기본값으로 가지고 있기 때문이다.
해결법은?
다음 세가지 방법이 존재한다.
- Project의 Info에서 기본 언어 설정을 변경한다. (비추)
- 사용자 선호 언어를 사용한다.
- Locale 언어를 지원해준다.
1. Project의 Info에서 기본 언어 설정 변경 (비추)
Project - Info - Localizations로 이동해서 보면, 기본 언어가 English로 되어있는 것을 확인할 수 있다.
여기서, + 버튼을 눌러 추가하고자 하는 언어를 추가한 뒤 Set Default를 눌러 기본 언어로 설정하면 된다.
하지만, 좋은 방법은 아니다. 왜냐하면 이는 외국에서 사용할 경우에는 한국 언어로 나오기 때문이다.
2. preferredLanguages 프로퍼티 사용하기
Locale - preferredLanguages
Locale의 타입 프로퍼티로, 사용자의 선호 언어의 identifier String값들을 리스트로 반환하는 프로퍼티다.
반환된 String들 중 첫 번째가 유저가 기본으로 설정한 언어기에 이를 사용하면 된다.
그나마 괜찮은 방법이지만, 리스트 형태로 받기 때문에 index 값을 참고하거나, 옵셔널 바인딩을 써야하는 어려움이 존재한다.
이는 앱이 crash 날 수도 있는 위험요소가 있다.
3. lproj 파일 지원하기
가장 이상적인 방법이다. lproj 폴더를 생성하여 타겟 사용자별로 Localization을 지원하는 것이다.
너무 오버엔지니어링이 아닌가? 라고 생각할 수 있지만 가장 안전하고도, 이후에 확장 가능한 형태이다.