본문 바로가기

iOS/Swift

Swift) Localizing - 다국어 처리하기

 

 

안녕하세요 :-) 소들입니다

오늘은 Swift에서는 다국어를 어떻게 처리하는지에 대해 공부할 거예여!

 

다국어 처리가 무엇이냐 하면

우리가 화면에 다음과 같은 Label을 하나 만들고 text를 지정했어요

 

 

 

 

근데 이 Label은 미국에서 실행하든,

일본에서 실행하든, 한국에서 실행하든

 

국가에 상관없이 

 

"안녕하세요"

 

이라는 글자만 출력할 거잖아요? :)

근데 만약 다음과 같이

 

 

 

 

어플을 실행하는 국가(지역)에 따라서 

Label에 대한 text를 그 나라 언어로 하고 싶다면 어떻게 할까여!?!?

 

이럴 때 사용하는 것이 바로 Localizing 입니다 :))))

말 그대로 다국어 처리를 하는 것이죠!!

Label은 한 개지만, 그 Label에 대한 text를 지역별로 다국어 처리 하는 것이예요!

 

어플 유저가 우리나라에만 한정된다면 굳이 할 필요 없겠지만,

외국으로 수출되는 어플이라면 다국어는 꼭꼭 필요한 기능이겠죠!?!?

(전 이전 회사에서 대략 10개국어를 다국어 처리 했답니다.........=_=)

 

이 다국어 처리를 하는 방법은 총 2가지가 있는데,

 

Storyboard

Code

 

두 가지 모두 어떻게 사용하는지 이번 포스팅에서 다뤄볼 거에요!!!

모든 포스팅은 편의 말투로 합니다~!!

 

 

 

 

1. Storyboard로 다국어 처리하기

 

먼저, Storyboard로 다국어 처리하는 방법에 대해 보겠음 👀

프로젝트를 하나 생성 하시구, 다음과 같이

 

 

 

 

Label 하나를 추가해주셈

이 Label에 대한 다국어 처리를 해보겠음!

 

먼저,

 

 

 

 

Project - Info - Localizations에서 + 버튼을 눌러 주세요!!!

위에 보면 English ㅡ Development Language 라고 되어 있는데,

iOS App의 기본 Localization은 

 

영어 (English) 임!!!!

 

따라서 

영어는 기본이니 따로 추가하지 않고

 

 

 

 

우리가 다국어 처리할 JapaneseKorean을 추가해주셈!!!

 

다국어를 처리하고 싶은 Storyboard를 클릭한 후 Finish를 눌러주면 추가됨

(LaunchScreen은 안 다룰 거니까 난 뻈음)

 

 

 

 

이렇게 추가 됐으면 된 거임!!!!!

자 그러면 무슨 일이 생기냐면 :)

 

 

 

 

이렇게 Storyboard에 갑자기 자식들이 생김!!!

앞서 말했듯이 Base는 영어고, 우리가 추가한 Japanese, Korean이 생긴 것임!

 

Main.strings(Japanese), Main.strings(Korean)을 각각 들어가보면

 

 

 

 

머 이런 내용이 추가되어 있음!!!!! 

Storyboard는 이런 식으로 다국어 처리를 지원함

 

 

 

 

따라서 위에선 VJs-qv-6HU가 ObjectID 이고,

참고로 ObjectID는 다 다르게 되어 있을텐데, 이 ObjectID가 무엇이냐면

 

 

 

 

우리가 아까 추가한 Label의 고유 IDStoryboard에서 확인할 수 있음!!!

 

Storyboard에서 다국어처리는 해당 객체의 Object ID로 한다

 

그렇단 말임 👀

그리고 우리가 그냥 Storyboard에서 작성한 text는 base로 구분되어 "영어"로 구분됨!!!!

 

따라서 영어 다국어 처리는 Storyboard에서,

그 외의 Japanese, Koeran은 따로 생성된 파일에서 하면 되는 것임

 

 

 

 

이렇게 Storyboard에서 작성한 Hello는 Base로 "영어" 처리되고,

Japanese File엔 다음과 같이 

 

 

 

 

일본어를 입력해주고,

Korean File엔 다음과 같이

 

 

 

 

한국어를 입력해주면 Storyboard로 다국어 처리하기 끝임!!!!!!!!!!

 

 

실제 실행해보면,

 

 

 

 

해당 Label이 다국어 처리가 된다!!!!!!!!! 👀

 

 

 

1-1. 다국어 파일 삭제는 어케해요??

 

 

요렇게

 

 

 

1-2. 새로 Label을 추가했더니 String 파일에 ObjectID가 자동 생성되지 않아요ㅠㅠ

 

 Localizations 파일은 파일을 추가하는 '순간',

그 순간에 스토리보드에 있던 Object만 자동으로 생성

 

따라서.. 이미 파일을 생성 한 후에는 수동으로 해줘야됨 =_=

 

 

 

 

이렇게 해당 객체의 Object ID를 알아낸 후

 

 

 

 

이런 식으로 수동으로 하나하나 추가해줘야함!!!!

 

따라서 만~~약 Storyboard로 다국어처리를 해야 한다면,

Storyboard에서 다국어 처리해야하는 객체를 모두 생성한 후

그 뒤에 Localizations를 추가하는 것을 추천!!!

 

 

 

1-3. 세미콜론 빼먹지 마세요

 

 

 

 

님들 Swift하면 ;하고 좀 이별하는 것 같지만

strings 파일에서 세미콜론 (;) 빼먹으면 다국어 처리 안되니

꼭꼭... 꼭... 꼭..... 챙겨주셈..

 

 

 

 

2. Code로 다국어 처리하기

 

사실 Storyboard보다 Code로 다국어 처리 할 일이 훨 많을 거라 생각함 🌝

자, 먼저 파일을 하나 추가해 줄 것임 

 

 

 

 

프로젝트 원하는 위치에 다음과 같은 Strings 파일을 추가해주는데..

제일 중요함 제발 파일 이름 ㅔㅈ발 다음과 같이 해주세요 제발

 

Localizable

 

파일 이름 위처럼 하셔야 함 꼭 제발..

원하는 이름으로 바꾸면 다국어 처리 안 돼요.. (이거때매 1시간 날렸었음)

 

 

 

 

이런 파일 생겼다면 성공!!!!

그럼 Localizable.strings의 인스펙터 영역을 보면

 

 

 

 

Localize...

버튼을.... 눌러.. 주셈....

 

 

 

 

그럼 이렇게 English 파일이 생기는데,

위 Storyboard에서도 말했듯이 iOS App Localization의 기본 Base는

 

영어 (English) 임!!!!!!!!

 

따라서, 영어는 추가해주지 않아도 기본 파일로 설정 되어 있는 것이고,

이제 우리가 원하는 다국어 파일을 추가해주러 가잣

 

 

 

 

Storyboard 때와 같이 Project -> Info -> Localizations에서 + 버튼을 누르고

원하는 다국어 파일을 추가해주는데,

우린 Storyboard가 아닌 Strings 파일에서 다국어 처리를Code로 해줄 것이기 때문에 

 

 

 

 

Localizable.strings만 체크하고 Finish를 해줍세 ㅎㅎ

 

 

 

 

이렇게 추가 됐으면 끝!!!

그리고 다시 Localizable.string 파일로 돌아가면

 

 

 

 

이렇게 Base(English), Japanese, Korean 파일이 생성되어 있음 ㅎㅎ

 

자, 이제 여기다가 다국어 처리를 해줘야하는데

Localizable.strings는 어떻게 하냐면 

 

 

 

 

이런 방식으로 함

무슨 말이냐면,, 이 key 에는 이 value로 다국어처리를 할 거예요!!! 하고 명시하는 것임

예제로 보면 이해하기 쉬울 거임!!!!

 

 

 

 

여기서 keyHello고,

Localizations는 각각 Hello에 해당하는 다국어 value를 갖고 있음

 

그럼 이제 이 Hello란 Key를 어떻게 사용하는지 봐보자 :)

먼저, 예제로 사용할 UILabel을 하나 만들고

 

 

 

 

이 Label의 text를 Localizable을 이용해 아까 만들어둔 key "Hello"를 적용시켜 보겠음

 

 

 

 

위처럼

String(format:) 메서드 파라미터로 NSLocalizedString 메서드를 이용하면 됨!!!

 

이때, key 값에 아까 우리가 정의해둔 "Hello"를 넣어주면 되고,

comment는 말 그대로 주석임 

(""로 비워둬도 되지만 key가 어떤 역할을 하는지 써두면 가독성이 좋아질듯)

 

따라서 다음과 같이 사용함

 

 

myLabel.text = String(format: NSLocalizedString("Hello", comment: "greeting"))

 

 

이렇게 사용하면 우리가 Localizable에 정의한 "Hello"란 key의 value 중에서

현재 국가에 맞는 value 값을 갖고와서 return 해주는 것임!!! 

 

실제 결과로 확인하면

 

 

 

 

Label 다국어 처리 완료 :)

근데 만약 존재하지 않는 key 값을 넣으면

 

 

 

 

key 값이 그대로 Return됨!!!!

 

 

 

2-1. Extension으로 간단하게 써보자

 

그럼 다국어 처리할 때마다 저 길고 더러운 

 

 

String(format: NSLocalizedString("Hello", comment: "greeting"))

 

 

이 친구를 다 써줘야 한다면 얼마나 귀찮고 성가시셈

따라서, 보통 Stringextension 해서 사용함!!!!!

 

 

extension String {
    
    func localized(comment: String ""-> String {
        return NSLocalizedString(self, comment: comment)
    }
    
}
 

 

 

이렇게 extesion을 해주면

 

 

myLabel.text = "Hello".localized()

 

 

이렇게 간단하게 쓸 수 있음 :))))))

 

 

 

2-2. Value에 Format을 추가하고 싶으면 어떻게 하나요?

 

다국어처리를 할 때 만약 Format을 추가해주고 싶다면,

%d, %f ... 뭐 이런 것을 다음과 같이 추가해주면 됨

 

 

//Localizable.strings (English)
"My Age %d" = "I am %d years old";
//Localizable.strings (Japanese)
"My Age %d" = "私は%d歳だよ。";
//Localizable.strings (Korean)
"My Age %d" = "나의 나이 %d";

 

 

이렇게 추가 해 주고, 실제로 사용할 땐 

 

 

myLabel.text = String(format: NSLocalizedString("My Age %d", comment: "age"), 26)

 

 

이렇게 사용하지만, 이 또한 String extension 해서 

 

 

extension String {
    
    func localized(comment: String ""-> String {
        return NSLocalizedString(self, comment: comment)
    }
    func localized(with argument: CVarArg = [], comment: String ""-> String {
        return String(format: self.localized(comment: comment), argument)
    }
}
 

 

myLabel.text = "My Age %d".localized(with: 26, comment: "age")

 

 

이렇게 사용할 수 있음 ㅎㅎㅎㅎ

결과도

 

 

 

 

쨔쟌 ㅎㅎㅎㅎ

 

 

 

2-3. 세미콜론 빼먹지 마세요

 

Storyboard와 마찬가지로 Localizable에서도

 

 

 

 

세미콜론 (;) 빼먹으면 얜 아예 오류가 나니까

꼭꼭... 꼭... 꼭..... 챙겨주셈..

 

 

 

 

 

 

 

.

.

.

 

길다... 길다 길어...........

오늘은 Swift로 다국어 처리 하는 방법을 배워 봤어염 :)

실제 제가 전 회사에서 썼을 땐 다국어 처리한 Key를 #Define으로 정의해서 썼는데

이건 회사 코딩 Convention에 알아서 맞춰서 하심 될 거 같네영~_~

 

그럼 20000

틀리거나 잘못된 내용 피드백 환영!



Calendar
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
최근 댓글
Visits
Today
Yesterday