# Localization (현지화란?)
[정의]
- 앱을 여러 언어 및 지역으로 번역하고 조정하는 프로세스이다.
국제화(internationalization)를 I18N or i18n 으로 지역화(localization)를 L10N이나 l10n 으로 표기합니다. - 지역화 - L10N
- 국제화 - I18N
국제화(Internationalization)란?
국제화란 각 나라의 문화정보에 맞게 앱을 적용하는 과정을 말합니다. (문화정보란 언어, 통화, 날짜 포맷, 숫자 포맷 등) 예) 앱스토어같은 경우 이미 국제화가 되어있다.
전세계적으로 각 나라에 맞게 언어, 문화, 통화, 숫자 등 맞춰저 있다.
그러면 지역화는 뭘까 ?
지역화(Localization)란?
지역화란 사용자의 언어와 지역 포맷 설정을 기반으로 앱에 적절한 데이터를 제공하는 과정을 말합니다.
쉽게말해 사용자의 디바이스의 지역과 사용하는 언어에 맞게 포맷하여 보여주는 방식인것이다.
일본이면 일본어, 한국이면 한국어보여주듯이 !
- 지역화의 전제조건
해당앱이 지역화가 되려면 여러 국가에 배포되어 국제화 되어있는 앱이라는 조건이 있어야한다. - 지역화 가능한 요소
- RTL, LTR (문화권에 따른 읽기/쓰기 방식)
- 언어
- 시간
- 주소
- 화폐단위 및 통화
- 이미지
- region(지역)
- 사용자가 설정한 지역을 나타낸다. 그렇지않으면 언어의 지역을 나타낸다.
- locale(장소)
- 사용자가 사용 장소를 말하며 언어, 문화 및 기술 규약 및 표준에 대한 정보를 요약해준다.
- language(언어)
- 사용자의 언어를 나타내준다.
앱에서는 locale이 region과 language를 합쳐진 인스턴스로 사용이되고 있다.
# 그러면 이 요소들을 코드로 어떻게 적용 시킬 수 있을까 ?
# 언어 지역화
순서
파일 생성 -> PROJECT -> Info -> Localization 에 + 버튼눌러서 추가한다. -> 나라별로 추가하고싶은 것들을 추가한다. -> String file을 만든다 -> 파일누르면 좌측 인스펙터 창에 나라 체크박스를 체크해준다.(영어는 ㄱㅊ) 그렇게되면 체크한만큼 파일이 늘어날것이다. -> 그리고 형식에 맞게 / 언어 = “번역”; / 이와같이 작성해준다 -> 단어를 등록하고 실제로 NSLocalizedString() 메서드를 사용해서 값을 label.text에 “”.localized()값을 할당해준다. -> 완료 그러면 지역별로 원하는 언어를 설정한대로 나올 것 이다.
사진으로 직관적으로 보면 더 쉬울것이다.


아래 사진을 보면 기본이 english로 설정되있고 아래 부가적인
언어들이 포함되있다.
기준이 되는언어를 좌측에 번역했을때의 언어를 우측에 작성하고 ; 콜론 표시로 마무리를 지어주면 된다.

// 방법 1
extension String {
func localized(bundle: Bundle = .main, tableName: String = "Localizable") -> String {
return NSLocalizedString(self, tableName: tableName, bundle: bundle, value: "**\(self)**", comment: "")
}
}
label.text = "Hello".localized() 와 같이 사용하면된다.
// 방법 2
func numbers() {
let quantity = NumberFormatter.localizedString(from: 5000, number: .decimal)
label.text = String.localizedStringWithFormat(quantity)
}
# 기기 지역화 설정 테스트
빠른 테스트를 위해 언어 변경하는 방법
App -> Product -> Edit Scheme -> Run -> options -> App Language 변경


# 숫자 지역화
private func numbers() {
let formatter = NumberFormatter()
formatter.numberStyle = .currencyAccounting
formatter.currencyCode = Locale.current.currencyCode
formatter.locale = Locale.current
let price = 3000 as NSNumber
currencyLabel.text = formatter.string(from: price)
}
# 날씨 지역화
func date() {
let date = DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .short)
label.text = date
}
# RTL, LTR 지역화
func setRTL_LTR() {
view.semanticContentAttribute = .forceLeftToRight
}
이미지같은 경우에는 다음에 여유있을때 공부해볼 예정입니다…ㅎㅎ
# 앱 실행중에 언어변경하기
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var label2: UILabel!
@IBOutlet weak var label3: UILabel!
@IBOutlet weak var label4: UILabel!
@IBOutlet weak var label5: UILabel!
@IBOutlet weak var koreanButton: UIButton!
@IBOutlet weak var japaneseButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
setLanguage()
}
func setLanguage() {
// 설정된 언어 코드 가져오기
// 초기에 "ko-KR" , "en-KR" 등으로 저장되어있음
guard let language = UserDefaults.standard.array(forKey: "AppleLanguages")?.first as? String else {
return
}
let index = language.index(language.startIndex, offsetBy: 2)
// "ko", "en" 등
let languageCode = String(language[..<index])
// 설정된 언어 파일 가져오기
guard let path = Bundle.main.path(forResource: languageCode, ofType: "lproj") else {
return
}
let bundle = Bundle(path: path)
/*
"Hello" = "안녕";
"Love You" = "사랑해";
"I Like Coding" = "코딩을 좋아해";
"Chicken" = "치킨";
"Pork feet" = "족발";
*/
label.text = bundle?.localizedString(forKey: "안녕", value: nil, table: nil)
label2.text = bundle?.localizedString(forKey: "사랑해", value: nil, table: nil)
label3.text = bundle?.localizedString(forKey: "코딩을 좋아해", value: nil, table: nil)
label4.text = bundle?.localizedString(forKey: "치킨", value: nil, table: nil)
label5.text = bundle?.localizedString(forKey: "족발", value: nil, table: nil)
koreanButton.setTitle(bundle?.localizedString(forKey: "koreanButton", value: nil, table: nil), for: .normal)
japaneseButton.setTitle(bundle?.localizedString(forKey: "japanese", value: nil, table: nil), for: .normal)
}
@IBAction func koreanLanguageDidTap(_ sender: Any) {
// 한국어로 변경
UserDefaults.standard.set(["ko"], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()
// 메인화면으로 이동
setLanguage()
}
@IBAction func japaneseLanguageDidTap(_ sender: Any) {
// 영어로 변경
UserDefaults.standard.set(["ja"], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()
// 메인화면으로 이동
setLanguage()
}
}
# 실행화면

# Reference
- https://green1229.tistory.com/72
'iOS' 카테고리의 다른 글
[iOS] core Data Migration하는 방법 (0) | 2022.07.03 |
---|---|
기술스택(RxSwift, SwiftUI, UIkit) 고민 (0) | 2022.07.03 |
[iOS] Core Animation으로 햄버거 만들기(미완성) (0) | 2022.06.27 |
[작성중] CoreData 2편(Update&Delete 코드 구현) (0) | 2022.06.27 |
[iOS] CoreData 1편(Create&Read 코드 구현) (0) | 2022.06.27 |