상세 컨텐츠

본문 제목

[Swift, iOS] i18N Localizing 다국어 지원하는 앱 만들기

Swift

by Mr.Garlic 2022. 5. 12. 01:08

본문

들어가기에 앞서(우리가 만드는 파일의 의미)

어떻게 앱이 여러 언어에 대응할 수 있을까? 

 

어떤 외계인이 앱을 만든다.

이 외계인이 쓰는 언어로 🐍은 △▭O😛이다.

한국인과 영국인이 이 앱을 잘 쓸 수 있도록 언어를 제공하려고 한다.

그래서 외계어 ↔ 한국어, 외계어 ↔ 영어 이런식으로 짝을 지어서 번역을 해주려고 한다. 컴퓨터는 일머리가 없기 때문에 내가 굳이 파일로 만들어서 짝을 알려주어야 한다.

 

자! 이렇게 파일을 두 개 만들었다. A 파일에는 외계어 ↔ 한국어가 짝지어져 있고, B 파일에는 외계어 ↔ 영어가 짝지어져있다.

이제 앞으로 외계인이 만든 앱을 사용하는 사용자의 기기언어를 받아서 A파일에 있는 언어를 쓸 지, B 파일에 있는 언어를 쓸 지만 결정하면 되는 것이다.

파일을 만들고 적용하는 방법은 다른 블로그에도 많으니 해당 글을 참고하시길!

 

 

Swift) Localizing - 다국어 처리하기

안녕하세요 :-) 소들입니다 오늘은 Swift에서는 다국어를 어떻게 처리하는지에 대해 공부할 거예여! 다국어 처리가 무엇이냐 하면 우리가 화면에 다음과 같은 Label을 하나 만들고 text를 지정했어

babbab2.tistory.com

 

편하게 쓰기

파일을 잘 만들어 두었다면 이제 어떤 라벨이나, 버튼이나, 좌우간 텍스트가 들어가는 모든 곳에 내가 원하는 번역을 넣을 수 있게 된다.

예를 들어, 어떤 화면에 글씨를 띄울 수 있는 칸이 있다. 거기에 외계인은 🙋🏻‍♂️💖🍑 라는 의미를 가진 영어, 한국어를 보여주고자 한다. 그러면 A파일에는 🙋🏻‍♂️💖🍑="난 궁둥이가 좋아!" B파일에는 🙋🏻‍♂️💖🍑 = "I Like Butt" 을 미리 넣어 둔다.

앱을 불러올 때, 🙋🏻‍♂️💖🍑이 어떤 텍스트로 보여져야 할 지는 다음과 같은 코드로 작성해 둘 수 있다.

import UIKit 

class HomeViewController: UIViewController {
	@IBOutlet var buttTestLabel: UILabel! //🙋🏻‍♂️💖🍑를 띄울 칸

	override func viewDidLoad() {
        super.viewDidLoad()

        buttTestLabel.text = string(format: NSLocalizedString("🙋🏻‍♂️💖🍑", comment: "인간을 위한 해석이 들어감")) //NSLocalizedString은 미리 만들어 둔 파일 A, B 사이를 자유자재로 돌아다니면서 기기언어에 맞는 파일에서 "🙋🏻‍♂️💖🍑"에 맞는 짝을 찾아서 알려줄 것이다. 코멘트는 걍 코멘트다. 없어도 그만이다. 
	)

}

그런데 이게 편하지가 않다. string(format: NSLocalizedString("🙋🏻‍♂️💖🍑", comment: "인간을 위한 해석이 들어감")) 이게 총 몇자인지는 모르겠지만.. 길고 불편하고.. 그렇다.

그래서 보통은 String Extension으로 조금 더 쉽게 만든다. 원래 String 이라는 녀석이 가지고 있는 능력치에 하나를 더 더해주자.

import Foundation

extension String {
    var localized: String {
            return NSLocalizedString(self, comment: "")
    }
}

위 extension으로 말할 것 같으면 앞으로 모든 "String 형태로 된 무언가".localized()를 해 주면 혹시 이 String 형태로 된 무언가에 짝 지어진 번역된 값이 있는지 없는지 봐주는 것이다. 위에서 언급한 NSLocalizedString을 다 쓰는게 불편해서 만드는 것이다. 그러니 기능도 동일하다. 원래 파라미터에 찾고싶은 스트링을 꼭 넣어줬어야 했는데, 그냥 "String 형태로 된 무언가"가 자동으로 파라미터로 들어가게 끔 만든 것에 불과하다.

import UIKit 

class HomeViewController: UIViewController {
	@IBOutlet var buttTestLabel: UILabel! //🙋🏻‍♂️💖🍑를 띄울 칸

	override func viewDidLoad() {
        super.viewDidLoad()

        buttTestLabel.text = "🙋🏻‍♂️💖🍑".localized()
	)

}

익스텐션을 만들어 주고 나니 이렇게 간단하게 표현이 된다. 깔끔하고 쓰기도 편해졌다.

 

언어설정을 바꿀때마다 잘 적용이 된다면 성공이다! 외계인은 앱을 성공적으로 출시했다! 야호~~~

 

학습내용을 기록한 저의 레포지토리를 공개합니다.

1. 배운 내용을 정리한 TIL 레포지토리 

 

GitHub - AnnaBaeTofuMom/TodayILearned: 새롭게 배운 것을 기록합니다, 나의 언어로 새로 씁니다.

새롭게 배운 것을 기록합니다, 나의 언어로 새로 씁니다. Contribute to AnnaBaeTofuMom/TodayILearned development by creating an account on GitHub.

github.com

 

2. RxSwift 해외 자료를 번역, 학습하는 RxSwift 레포지토리

 

 

GitHub - AnnaBaeTofuMom/RxSwift: RxSwift와 관련한 학습의 기록

RxSwift와 관련한 학습의 기록. Contribute to AnnaBaeTofuMom/RxSwift development by creating an account on GitHub.

github.com

앞으로 꾸준히 업데이트 할 예정이니 많은 star 바랍니다! ㅎㅎ

 

관련글 더보기