본문 바로가기

iOS

[iOS] ♻️ Localization(지역화) 가능한 요소 구현해보기

# 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

- https://zeddios.tistory.com/368

- https://gonslab.tistory.com/61