본문 바로가기
iOS/Swift

Swift Xib localization

by DnaJ 2018. 11. 18.
반응형

Swift Xib Localization

개발을 하다보면 Localization이 필요하다.


먼저 Localization을 수행하는 함수부터 보자


public func NSLocalizedString(_ key: String, tableName: String? = default, bundle: Bundle = default, value: String = default, comment: String) -> String

복잡하다....또륵....





특별한 일이 없다면 default로 채워져 있는 항목은 사용하지 않는다.

그렇기 때문에 필수 항목만 보겠다. 일반적으로 아래와 같이 사용된다.

let localizationString = NSLocalizedString("key", comment: "설명")


key : *.strings 파일 에 작성되는 key 

comment : 단순 설명이다. 빌드 됐을때 아무 영향을 주지 않는 주석 같은 놈이다.


"key" = "value - 변역된 String";

*.strings 파일 안에 위와 같이 작성이 된다. 자세한건 아래쪽에서.....


위와 같이 strings파일이 작성이 되었다면 변수 locaicationString의 값은 'value - 변역된 String' 이 될것이다.


==============================================================================================================================


Localization의 방법은 몇가지가 있다. 필자가 알고 있는 방법이다.


1. xib에 있는 UILabel을 swift파일에 바인딩 시킨 후 NSLocalizedString함수 호출 하여 번역 (Codeable)

-> 문제점 : 번역만을 위한 바인딩이 된 변수들이 존재 할 수있다. 

2. xib각 파일의 Localization 파일을 만들어 번역

-> 문제점 : 번역파일이 xib마다 여러개씩 생긴다.

3. Child View를 찾아서 번역(Codeable) -> 어떻게 설명해야 할지 잘 모르겠다.

-> 문제점 : 1,2 번에 비해 성능상의 문제가 발생할 수 있다. (요즘 기기들이 너무 성능이 좋아져서 그런지 사용해본 결과 성능상의 문제가 발생하는지 잘 모르겠다.)


지금부터 작성하는 Localization은 3번. Child View를 찾아서 코드로 변경하는 것이다.

변수를 따로 


1. 프로젝트파일 info 에서 로컬라이징을 추가한다



Localizations 하단의 +버튼을 눌러서 추가한다.


필자는 Base Internationlization을 사용을 하지 않기 위해서 체크를 해제 했다.

그러면 기존에 스토리보드나 런치 스크린에 바인딩이 되었던  strings파일이 사라진다. ㅎㅎㅎㅎㅎ

물론 곧바로 빌드하면 빌드에러가 날것이다.

빌드에러가 난다면 Finder에서 해당 storyboard를 찾아서 build path를 맞춰주자. (링크를 끊고 다시 추가하는 방법도 있다.)


체크를 해제하지 않아도 상관없다. 하지만 불필요한 파일이 남는다.


2. Localication 파일 생성


필자는 'Localizable'이라고 이름을 지었다.  파일 이름은 마음대로~ 하지만 해당 파일은 보통 시용이 많이 되는 이름으로 짓자.



Localizable.strings 파일이 생겼을 것이다.

해당 파일을 열어보면 아무 내용도 없다.


3. Localication 적용

Localizable.strings 파일을 선택 후 오른쪽 화면에 파일 모양의 아이콘을 누른다.




그리고 Localize... 라는 버튼을 찾아서 누른다 (음...? 왜 말줄임표가 되어있을까....?)



그러면 아래와 같이 Localization에 해당 언어들이 나온다. 모두 체크해두자





파일리스트를 보면 이렇게 보인다



4. Localication 파일 내용 작성

English 파일

"login" = "value - 변역된 String";

"input" = "input";


Korean 파일

"login" = "로그인";

"input" = "입력";


주의점!!! 세미콜론(;)을 빼먹지 말자!!!!! 오류나면 골아프다


5. 코드로 작성

UIViewController의 ViewDidLoad에서 작성을 한다.

절대로 설명하기 귀찮아서 코드를 그냥 붙여넣은게 아니다!!!!

편하시라고.....ㅎㅎ 절대 귀찮지 않음. 절대........또륵...


UILable과 UIButton, UITextField만 정의했다. 예외처리가 더필요한 것이 있으면 하는것이 좋다.


override func viewDidLoad() {

        super.viewDidLoad()

        

        localization(self.view)

    }

코드가 길어지는게 싫어서 함수로 뺐다.


코딩할때 되도록 지키는 것이 있다.

1. 한 함수당 최대 50라인을 넘기지 않기

2. 한 함수에는 한가지 일만 하기 -> (너무 어렵다)

3. depth가 깊어지지 않기!! 가끔 코드를 보면 피라미드를 만드시는 분이 있다. 8개 이상 쌓으시는 분들도 봤다. 우리는 건축가가 아니다!!!

if () {
    if () {

if ( ) {

     .......

}

    }

}


필자는  if () return 을 많이 사용한다. 

코드가 길어지긴 하지만 간결해 지기 때문!!! 

읽기 쉬운 코드가 좋은 코드라고 생각을 한다.


좋은 코드고 뭐고 일단 아래의 코드를 보자.


private func localization(_ parentView: UIView) {

        for view in parentView.subviews {

            if view is UILabel {

                localizationWithLable(view as! UILabel)

            } else if view is UIButton {

                localizationWithButton(view as! UIButton)

            } else if view is UITextField {

                localizationWithTextField(view as! UITextField)

            } else if view.subviews.count != 0 {

                localization(view)

            }

        }

    }

    

    private func localizationWithLable(_ label: UILabel) {

        let localization = label.text

        

        if localization == nil {

            return;

        }

        

        label.text = NSLocalizedString(localization!, comment: "")

    }

    

    private func localizationWithButton(_ button: UIButton) {

        let localization = button.titleLabel?.text

        

        if localization == nil {

            return

        }

        

        let title = NSLocalizedString(localization!, comment: "")

        button.setTitle(title, for: .normal)

    }

    

    private func localizationWithTextField(_ textField: UITextField) {

        let localization = textField.placeholder

        

        if localization == nil {

            return

        }

        

        let placeholder = NSLocalizedString(localization!, comment: "")

        textField.placeholder = placeholder

    }


먼저 for문을 보자

subView들을 찾아서 Localization을 해주는 함수를 호출한다.


UILable, UIButton, UITextFiled별로 분기를 했다.  String을 set하는 방법이 다르기 때문이다.

guard 구문을 써도 되긴 하지만 필자는 if가 편하다. 하지만 명확하게 하기 위해 습관을 바꿔야 하나 생각중이다.



6. xib에 key 입력



UILabel title에 key를 입력하자

필자는 'login' 이라는 키를 넣었다.

xib에서는 key name으로 나오지만 실행시켜보면 번역된 String이 나오게 된다.



7. 실행


말줄임표가 되긴했지만 Localization이 잘되고 있다!!!!! 짝짝짝짝짝짝짝








반응형

'iOS > Swift' 카테고리의 다른 글

RxSwift (ReactiveX)  (0) 2019.04.26
Swift Contacts read and write (주소록 읽기, 쓰기)  (0) 2019.01.13
Swift Realm (2) - 조회하기  (0) 2019.01.06
Swift Realm (1)  (0) 2018.12.06
swift Xib에 CustomView넣기  (0) 2018.11.17

댓글