TIL

TIL #9

wood0203 2023. 12. 31. 01:13

사용자 Locale 정보 받아오기

프로젝트에서 캘린더를 만드는 과정에 Calendar 객체와 DateFormatter 객체를 사용하게 되었다.
두 객체에 Locale 정보를 입력할 필요가 생겼는데, Localization을 어떻게 적용할 수 있을까 공부하게 되었다.

current, autoUpdatingToCurrent 프로퍼티 사용하기

Locale - current
Locale - autoUpdatingCurrent

두 타입 프로퍼티는 사용자의 지역정보를 가지고 있는 변수이다.
해당 변수를 디버깅해보았는데, 결과는 en_KR 즉 영어 Locale 정보가 반환되었다.

Locale.current를 디버깅한 결과

Simulator 설정 오류인게 아닐까?

Simulator에서 설정 - 언어 변경을 변경해보았지만, 똑같이 영어가 나왔다.
덴마크 언어로 변경해보았지만, 똑같이 영어가 나왔다. 기본 언어가 영어로 설정되는 것인가?

문제

두 타입 프로퍼티를 사용하려면 번들에 lproj 파일을 가지고 있어야 한다.
Apple - How iOS Determines the Language For Your App
위의 공식문서를 보면, 앱은 다음과 같은 순서로 사용자의 언어를 결정한다.

  1. 사용자 설정에서 선호 언어들 중 첫 번째를 가져온다.
  2. 앱이 해당 언어를 지원하는지 확인한다. -> .lproj 파일이 존재하는지 확인
  3. 만약, 해당 언어를 지원하지 않으면 그 다음 선호 언어를 기반으로 1, 2번을 반복한다.
  4. 모두 지원되지 않는 경우에는 앱의 CFBundleDevelopmentRegion과 일치하는 언어를 선택한다.

그렇다면, 왜 영어가 설정된것일까? 답은 Project는 영어를 기본값으로 가지고 있기 때문이다.

Project - Info 기본 언어 설정은 English로 되어있다.

해결법은?

다음 세가지 방법이 존재한다.

  1. Project의 Info에서 기본 언어 설정을 변경한다. (비추)
  2. 사용자 선호 언어를 사용한다.
  3. Locale 언어를 지원해준다.

1. Project의 Info에서 기본 언어 설정 변경 (비추)

Project - Info - Localizations로 이동해서 보면, 기본 언어가 English로 되어있는 것을 확인할 수 있다.

여기서, + 버튼을 눌러 추가하고자 하는 언어를 추가한 뒤 Set Default를 눌러 기본 언어로 설정하면 된다.
하지만, 좋은 방법은 아니다. 왜냐하면 이는 외국에서 사용할 경우에는 한국 언어로 나오기 때문이다.

설정에서 사용자 언어 설정
Locale.current 디버깅 결과

2. preferredLanguages 프로퍼티 사용하기

Locale - preferredLanguages
Locale의 타입 프로퍼티로, 사용자의 선호 언어의 identifier String값들을 리스트로 반환하는 프로퍼티다.
반환된 String들 중 첫 번째가 유저가 기본으로 설정한 언어기에 이를 사용하면 된다.

Locale.preferredLanguages 디버깅 화면

 

그나마 괜찮은 방법이지만, 리스트 형태로 받기 때문에 index 값을 참고하거나, 옵셔널 바인딩을 써야하는 어려움이 존재한다.
이는 앱이 crash 날 수도 있는 위험요소가 있다.

 

3. lproj 파일 지원하기

가장 이상적인 방법이다. lproj 폴더를 생성하여 타겟 사용자별로 Localization을 지원하는 것이다.
너무 오버엔지니어링이 아닌가? 라고 생각할 수 있지만 가장 안전하고도, 이후에 확장 가능한 형태이다.