본문 바로가기
Front Side/Framework > SwiftUI

[SwiftUI] 다국어 지원하는 방법

by developerBeluga 2025. 5. 23.
728x90
반응형

 

 

 

 

Localization 섹션 아래에 +버튼을 클릭 후 원하는 언어 선택하기

 

 

File > New > File from Template 클릭 후 String Catalog 클릭

파일 명을 Localizable이라고 하고 생성

 

 

생성된 파일 선택하면 위와 같이 나와 있음

Localization에서 설정한 언어대로 설정할 수 있음

 

이때 English에서 key엔 한글을 작성 그 옆에 English에서 영어 입력해줘야 함

Korean에선 Default Localization이 key 값 따라가서 수정 불가함

그러니 먼저 English에서 key 값과 Englsih 값 넣어주고 Korean 가서 State 필드 확인하기

 

✨ 꿀팁 

테스트를 위해서 한, 두가지만 key 값에 넣기

반영 확인을 위해 시뮬레이터 돌리면 알아서 key 값 채워져 있기 때문에 일일이 하나하나 채울 필요 없음

(물론 다 채워지진 않아서 추후 하나하나 추가해줘야 하긴 하지만 그 수가 줄여서 좋음)

 

 

 tabButton(title: String(localized: "할 일"), isSelected: selectedTab == "할 일")

 TextField("", text: $taskText, prompt: Text(LocalizedStringKey("할 일을 작성해주세요")).foregroundColor(.white))
 
 Text(selectedDate != nil ? formattedDate(selectedDate!) : NSLocalizedString("마감 날짜 선택 (선택사항)", comment: ""))

다국어 지원이 필요한 곳으로 가서 String(localized: "") 혹은 Text( LocalizedStringKey()), NSLocalizedString()해주기

 

셋이 뭔 차이냐 하면

SwiftUI 뷰 내부이면 Text(LocalizedStringKey())

SwiftUI 외부(삼항/변수/로직)이면 String(localized:) 또는 NSLocalizedString()

 

⚠️ 알고가기

근데 Text("key")가 정적 문자열이면 자동 번역되서 굳이 Text(LocalizedStringKey("key")) 해줄 필요가 없음

하지만 Text(변수)일 땐 강제로 LocalizedStringKey로 바꿔줘야 함

 

 

 

프리뷰에서 반영이 안되서 시뮬레이터 설정에서 영어로 변경 후 반영된 것을 확인

 

 

#Preview("English") {
    ContentView()
        .environmentObject(GoalStorage())
        .environmentObject(TaskStorage())
        .environmentObject(AchievementStorage())
        .environment(\.locale, Locale(identifier: "en"))
}

#Preview("Korean") {
    ContentView()
        .environmentObject(GoalStorage())
        .environmentObject(TaskStorage())
        .environmentObject(AchievementStorage())
        .environment(\.locale, Locale(identifier: "ko"))
}

프리뷰 반영 안되는 줄 알았는데 갑자기 됨;;

근데 이번엔 ㅋㅋㅋ 영어로만 나와서 화병 남...

 

https://developer.apple.com/forums/thread/725490

그러다가 찾아본 결과로 빌드 폴더 정리가 도움이 된다고 함

난 빌드 폴더 정리해도 여전했는데 CMD+Shift+K를 하루 종일 했다는 댓글이 웃겨서 가져옴ㅋㅋㅋ

 

xcrun simctl --set previews delete all

차라리 난 위 코드를 사용하니깐 잘 됐음!

터미널에 치시길

 

 

 

728x90
반응형

댓글