Where who wants to meet someone

[SwiftUI] DatePicker로 달력 표시할 때, 헤더 언어 바꾸기 본문

Apple Developer/iOS(SwiftUI)

[SwiftUI] DatePicker로 달력 표시할 때, 헤더 언어 바꾸기

Lust3r 2024. 3. 19. 22:29
728x90

달력을 보여주기 위해 DatePicker를 사용하고 있는데, 상단의 연도와 달을 선택할 수 있는 부분이 "March 2024"와 같이 영문으로만 표기가 되는 것을 확인했다.

 

 

기기의 언어/지역 설정과 무관하고, DatePicker에서 설정할 수 있는 별도의 modifier가 없어 방법을 찾던 도중 하기의 방법을 알게 되었다.

DatePicker(
	"DatePicker",
    selection: $SelectedDate,
    displayedComponents: .date)
    .datePickerStyle(.graphical)
    .environment(\.locale, Locale(identifier: String(Locale.preferredLanguages[0])))

 

환경변수를 사용하여 Locale을 지정해주는 것이다. 그러나 Locale에 current나 autoupdatingCurrent를 사용해도 변화가 없어 identifier에 직접 한국 코드를 적어야 하나 고민을 했고, preferredLanguages의 첫 번째 항목을 이용하기로 했다.

 

https://developer.apple.com/documentation/foundation/nslocale/1415614-preferredlanguages

 

preferredLanguages | Apple Developer Documentation

An ordered list of the user's preferred languages.

developer.apple.com

https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html#//apple_ref/doc/uid/10000171i-CH15

 

Language and Locale IDs

Language and Locale IDs Language IDs identify a language, dialect, or script and are used to name language-specific resource folders stored in the app bundle. Locale IDs identify a set of regional conventions and are used in APIs—such as the NSLocale, NS

developer.apple.com

 

preferredLanguages는 사용자의 선호 언어 리스트인데, Language and Locale IDs에 나와있는 것처럼

[language designator]_[region designator]

의 순으로 저장되어 있다.

 

 

위 시뮬레이터와 같이 [설정] - [언어 및 지역] 에서 선호하는 언어에 한국어, English 순으로 되어있다면, 아래 스크린샷과 같이 preferredLanguages에는

["ko(language designator_korean)-KR(region designator_Korea)]

["en(language designator_english)-KR(region designator_Korea)]

로 저장이 된다.

 

물론 이는 언어 및 지역 하단의 지역이 대한민국으로 설정되어 있다는 가정 하, 다른 나라로 되어있다면 KR부분이 달라진다.

 

그래서 identifier에 하드코딩으로 직접 id를 입력하는 대신, 사용자 선호도에 따라 결정되도록 하는데에 사용할 수 있는 것이다.

 

preferredLanguage의 첫번째 항목 [0]을 인자로 전달해줘도 되고, prefix(2)로 앞의 ko, en 부분만 전달해줘도 동일하게 적용된다.