swift ios [아이폰 앱 개발] Swift) Localizing - 다국어 처리하기
2023.03.21 23:32
[아이폰 앱 개발] Swift) Localizing - 다국어 처리하기
안녕하세요 :-) 소들입니다
오늘은 Swift에서는 다국어를 어떻게 처리하는지에 대해 공부할 거예여!
다국어 처리가 무엇이냐 하면
우리가 화면에 다음과 같은 Label을 하나 만들고 text를 지정했어요
![](/user/zbxe/files/attach/images/12138/764/091/0d84d688f80bf5c7fb907672ada3ef64.png)
근데 이 Label은 미국에서 실행하든,
일본에서 실행하든, 한국에서 실행하든
국가에 상관없이
"안녕하세요"
이라는 글자만 출력할 거잖아요? :)
근데 만약 다음과 같이
![](/user/zbxe/files/attach/images/12138/764/091/d1b3dfec324fbbb96cba8e605bb7dbcd.png)
어플을 실행하는 국가(지역)에 따라서
Label에 대한 text를 그 나라 언어로 하고 싶다면 어떻게 할까여!?!?
이럴 때 사용하는 것이 바로 Localizing 입니다 :))))
말 그대로 다국어 처리를 하는 것이죠!!
Label은 한 개지만, 그 Label에 대한 text를 지역별로 다국어 처리 하는 것이예요!
어플 유저가 우리나라에만 한정된다면 굳이 할 필요 없겠지만,
외국으로 수출되는 어플이라면 다국어는 꼭꼭 필요한 기능이겠죠!?!?
(전 이전 회사에서 대략 10개국어를 다국어 처리 했답니다.........=_=)
이 다국어 처리를 하는 방법은 총 2가지가 있는데,
Storyboard
Code
두 가지 모두 어떻게 사용하는지 이번 포스팅에서 다뤄볼 거에요!!!
모든 포스팅은 편의 말투로 합니다~!!
1. Storyboard로 다국어 처리하기
먼저, Storyboard로 다국어 처리하는 방법에 대해 보겠음 ????
프로젝트를 하나 생성 하시구, 다음과 같이
![](/user/zbxe/files/attach/images/12138/764/091/92090c7e5e12efa8d79649b57be539dc.png)
Label 하나를 추가해주셈
이 Label에 대한 다국어 처리를 해보겠음!
먼저,
![](/user/zbxe/files/attach/images/12138/764/091/16688588f8000879f7644cd2217ec0a4.png)
Project - Info - Localizations에서 + 버튼을 눌러 주세요!!!
위에 보면 English ㅡ Development Language 라고 되어 있는데,
iOS App의 기본 Localization은
영어 (English) 임!!!!
따라서
영어는 기본이니 따로 추가하지 않고
![](/user/zbxe/files/attach/images/12138/764/091/cadeaef40d6a0fb50478d49dad5e9767.png)
![](/user/zbxe/files/attach/images/12138/764/091/5c36e81b987f653ed2cf9f21e15cafdf.png)
우리가 다국어 처리할 Japanese와 Korean을 추가해주셈!!!
다국어를 처리하고 싶은 Storyboard를 클릭한 후 Finish를 눌러주면 추가됨
(LaunchScreen은 안 다룰 거니까 난 뻈음)
![](/user/zbxe/files/attach/images/12138/764/091/89f542b218470ae0499317f85b6fc508.png)
이렇게 추가 됐으면 된 거임!!!!!
자 그러면 무슨 일이 생기냐면 :)
![](/user/zbxe/files/attach/images/12138/764/091/5b25eec97cbcb1830ee3103a327a201f.png)
이렇게 Storyboard에 갑자기 자식들이 생김!!!
앞서 말했듯이 Base는 영어고, 우리가 추가한 Japanese, Korean이 생긴 것임!
Main.strings(Japanese), Main.strings(Korean)을 각각 들어가보면
![](/user/zbxe/files/attach/images/12138/764/091/7ef4996cc0a0d5b9fe61d1ee253db36b.png)
머 이런 내용이 추가되어 있음!!!!!
Storyboard는 이런 식으로 다국어 처리를 지원함
![](/user/zbxe/files/attach/images/12138/764/091/d6e725c2850b4c83ed59ee0e503e363e.png)
따라서 위에선 VJs-qv-6HU가 ObjectID 이고,
참고로 ObjectID는 다 다르게 되어 있을텐데, 이 ObjectID가 무엇이냐면
![](/user/zbxe/files/attach/images/12138/764/091/e90054bdd31f11ad51c00f4cf8acd04f.png)
우리가 아까 추가한 Label의 고유 ID로 Storyboard에서 확인할 수 있음!!!
Storyboard에서 다국어처리는 해당 객체의 Object ID로 한다
그렇단 말임 ????
그리고 우리가 그냥 Storyboard에서 작성한 text는 base로 구분되어 "영어"로 구분됨!!!!
따라서 영어 다국어 처리는 Storyboard에서,
그 외의 Japanese, Koeran은 따로 생성된 파일에서 하면 되는 것임
![](/user/zbxe/files/attach/images/12138/764/091/596b11d147bd6d730e12956227fafa2f.png)
이렇게 Storyboard에서 작성한 Hello는 Base로 "영어" 처리되고,
Japanese File엔 다음과 같이
![](/user/zbxe/files/attach/images/12138/764/091/40842a29386fce297b0e86d48c72ddb0.png)
일본어를 입력해주고,
Korean File엔 다음과 같이
![](/user/zbxe/files/attach/images/12138/764/091/33950a55ffe3470f6171168818e6805a.png)
한국어를 입력해주면 Storyboard로 다국어 처리하기 끝임!!!!!!!!!!
실제 실행해보면,
![](/user/zbxe/files/attach/images/12138/764/091/d1b3dfec324fbbb96cba8e605bb7dbcd.png)
해당 Label이 다국어 처리가 된다!!!!!!!!! ????
1-1. 다국어 파일 삭제는 어케해요??
![](/user/zbxe/files/attach/images/12138/764/091/71771db6f7005577e96be064b6483f7c.png)
요렇게
1-2. 새로 Label을 추가했더니 String 파일에 ObjectID가 자동 생성되지 않아요ㅠㅠ
Localizations 파일은 파일을 추가하는 '순간',
그 순간에 스토리보드에 있던 Object만 자동으로 생성됨
따라서.. 이미 파일을 생성 한 후에는 수동으로 해줘야됨 =_=
![](/user/zbxe/files/attach/images/12138/764/091/4a1bfdf3cb206201b7208cb8b1b4629e.png)
이렇게 해당 객체의 Object ID를 알아낸 후
![](/user/zbxe/files/attach/images/12138/764/091/bb8cf4e8355f8d66f74bc7633ae46f28.png)
이런 식으로 수동으로 하나하나 추가해줘야함!!!!
따라서 만~~약 Storyboard로 다국어처리를 해야 한다면,
Storyboard에서 다국어 처리해야하는 객체를 모두 생성한 후
그 뒤에 Localizations를 추가하는 것을 추천!!!
1-3. 세미콜론 빼먹지 마세요
![](/user/zbxe/files/attach/images/12138/764/091/7370b29c675f7d9f7c0453fe52ed9c21.png)
님들 Swift하면 ;하고 좀 이별하는 것 같지만
strings 파일에서 세미콜론 (;) 빼먹으면 다국어 처리 안되니
꼭꼭... 꼭... 꼭..... 챙겨주셈..
2. Code로 다국어 처리하기
사실 Storyboard보다 Code로 다국어 처리 할 일이 훨 많을 거라 생각함 ????
자, 먼저 파일을 하나 추가해 줄 것임
![](/user/zbxe/files/attach/images/12138/764/091/8eb0c1b223a52bb720f594da952c1300.png)
![](/user/zbxe/files/attach/images/12138/764/091/579021168348f99f2fff30c8ecbef05d.png)
프로젝트 원하는 위치에 다음과 같은 Strings 파일을 추가해주는데..
제일 중요함 제발 파일 이름 ㅔㅈ발 다음과 같이 해주세요 제발
Localizable
파일 이름 위처럼 하셔야 함 꼭 제발..
원하는 이름으로 바꾸면 다국어 처리 안 돼요.. (이거때매 1시간 날렸었음)
![](/user/zbxe/files/attach/images/12138/764/091/692671250ccc7bf84b1ae8c9d147af9f.png)
이런 파일 생겼다면 성공!!!!
그럼 Localizable.strings의 인스펙터 영역을 보면
![](/user/zbxe/files/attach/images/12138/764/091/41c5c48838c0de8981bcca3d418cf8b2.png)
Localize...
버튼을.... 눌러.. 주셈....
![](/user/zbxe/files/attach/images/12138/764/091/9aa30ec034dfc7b29490adfb5d1241ad.png)
그럼 이렇게 English 파일이 생기는데,
위 Storyboard에서도 말했듯이 iOS App Localization의 기본 Base는
영어 (English) 임!!!!!!!!
따라서, 영어는 추가해주지 않아도 기본 파일로 설정 되어 있는 것이고,
이제 우리가 원하는 다국어 파일을 추가해주러 가잣
![](/user/zbxe/files/attach/images/12138/764/091/16688588f8000879f7644cd2217ec0a4.png)
![](/user/zbxe/files/attach/images/12138/764/091/cadeaef40d6a0fb50478d49dad5e9767.png)
Storyboard 때와 같이 Project -> Info -> Localizations에서 + 버튼을 누르고
원하는 다국어 파일을 추가해주는데,
우린 Storyboard가 아닌 Strings 파일에서 다국어 처리를Code로 해줄 것이기 때문에
![](/user/zbxe/files/attach/images/12138/764/091/c026f6f4d9a319521d2cf0e19f93fc4b.png)
Localizable.strings만 체크하고 Finish를 해줍세 ㅎㅎ
![](/user/zbxe/files/attach/images/12138/764/091/89f542b218470ae0499317f85b6fc508.png)
이렇게 추가 됐으면 끝!!!
그리고 다시 Localizable.string 파일로 돌아가면
![](/user/zbxe/files/attach/images/12138/764/091/5bdf87141e0c2da3a5777646091963da.png)
이렇게 Base(English), Japanese, Korean 파일이 생성되어 있음 ㅎㅎ
자, 이제 여기다가 다국어 처리를 해줘야하는데
Localizable.strings는 어떻게 하냐면
![](/user/zbxe/files/attach/images/12138/764/091/cf9b06a8d4b47a35412cd2095ca707cb.png)
이런 방식으로 함
무슨 말이냐면,, 이 key 에는 이 value로 다국어처리를 할 거예요!!! 하고 명시하는 것임
예제로 보면 이해하기 쉬울 거임!!!!
![](/user/zbxe/files/attach/images/12138/764/091/ca47f53b6e9ed0734ae62f38fb26f50e.png)
![](/user/zbxe/files/attach/images/12138/764/091/f7d351ee49444b434f15d3c471d31050.png)
![](/user/zbxe/files/attach/images/12138/764/091/5cd8501b17d3540566f28546352ab120.png)
여기서 key는 Hello고,
Localizations는 각각 Hello에 해당하는 다국어 value를 갖고 있음
그럼 이제 이 Hello란 Key를 어떻게 사용하는지 봐보자 :)
먼저, 예제로 사용할 UILabel을 하나 만들고
![](/user/zbxe/files/attach/images/12138/764/091/92090c7e5e12efa8d79649b57be539dc.png)
이 Label의 text를 Localizable을 이용해 아까 만들어둔 key "Hello"를 적용시켜 보겠음
![](/user/zbxe/files/attach/images/12138/764/091/050ea587ff01441458404c942efb9007.png)
위처럼
String(format:) 메서드 파라미터로 NSLocalizedString 메서드를 이용하면 됨!!!
이때, key 값에 아까 우리가 정의해둔 "Hello"를 넣어주면 되고,
comment는 말 그대로 주석임
(""로 비워둬도 되지만 key가 어떤 역할을 하는지 써두면 가독성이 좋아질듯)
따라서 다음과 같이 사용함
myLabel.text = String(format: NSLocalizedString("Hello", comment: "greeting"))
|
이렇게 사용하면 우리가 Localizable에 정의한 "Hello"란 key의 value 중에서
현재 국가에 맞는 value 값을 갖고와서 return 해주는 것임!!!
실제 결과로 확인하면
![](/user/zbxe/files/attach/images/12138/764/091/d1b3dfec324fbbb96cba8e605bb7dbcd.png)
Label 다국어 처리 완료 :)
근데 만약 존재하지 않는 key 값을 넣으면
![](/user/zbxe/files/attach/images/12138/764/091/c4651275095ed1c7732eba0056b10fae.png)
key 값이 그대로 Return됨!!!!
2-1. Extension으로 간단하게 써보자
그럼 다국어 처리할 때마다 저 길고 더러운
String(format: NSLocalizedString("Hello", comment: "greeting"))
|
이 친구를 다 써줘야 한다면 얼마나 귀찮고 성가시셈
따라서, 보통 String을 extension 해서 사용함!!!!!
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")
|
이렇게 사용할 수 있음 ㅎㅎㅎㅎ
결과도
![](/user/zbxe/files/attach/images/12138/764/091/417ddeea47b2ea3580b08996d6eb3950.png)
쨔쟌 ㅎㅎㅎㅎ
2-3. 세미콜론 빼먹지 마세요
Storyboard와 마찬가지로 Localizable에서도
![](/user/zbxe/files/attach/images/12138/764/091/0a4acbd10a9dee936fed3f1f20fc4da9.png)
세미콜론 (;) 빼먹으면 얜 아예 오류가 나니까
꼭꼭... 꼭... 꼭..... 챙겨주셈..
.
.
.
길다... 길다 길어...........
오늘은 Swift로 다국어 처리 하는 방법을 배워 봤어염 :)
실제 제가 전 회사에서 썼을 땐 다국어 처리한 Key를 #Define으로 정의해서 썼는데
이건 회사 코딩 Convention에 알아서 맞춰서 하심 될 거 같네영~_~
[출처] https://babbab2.tistory.com/59
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.