Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] R.swift 프레임워크, Localization, Localizable 본문

iOS 응용 (swift)

[iOS - swift] R.swift 프레임워크, Localization, Localizable

jake-kim 2021. 1. 20. 22:22

R.swift 프레임워크

  • 사진, 문자열, Localizable과 같은 Resource에 접근할 때 key값으로 접근 가능
  • Assets.xcassets파일에 있는 Resource들을 코드로 접근 가능: UIImage(named: "커스텀") -> R.image.커스텀
  • Localizable과 같이 사용하면 컴파일 타임에 해당 문자열 키가 존재하는지 체크 가능 (만약 존재하지 않으면 컴파일에러 발생)
  • 빌드할 때마다 R.generated.swift파일 생성

R.generated.swift파일 생성

  • 종속성
pod 'R.swift'
  • 빌드 시, 프레임워크를 통해 R.generated.swift파일을 생성하기 위해 Build Phases에서 Run script 생성 후에 아래와 같이 작성

 

"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/R.generated.swift"
  • 드래그 하여 Run Script 파일을 Check Pods Manifest.lockCompile Sources사이로 이동

 

  • Input Files, Output Files 수정

// Input Files
$TEMP_DIR/rswift-lastrun

// Ouput Files
$SRCROOT/R.generated.swift
  • R.generated.swift 생성: Build 후 생성된 파일을 xcode로 드래그엔 드롭하여 복사


1. R.generated를 Assets.xcassets파일에 사용

  • Assets.xcassets에 파일 추가

  • 아무곳에서나 R.으로 접근


2. Localizable과 R.swift프레임워크를 같이 사용하는 방법 - 코드

* Localization은 언어 선택했을 때 해당 언어가 나오게끔 미리 지정해주는 것

* Localizable 개념 참고: ios-development.tistory.com/294

  • Localizable.Strings 추가

  • Localizable.strings파일 선택 후 Localize 클릭

  • 언어 추가 (기본언어가 english이므로 한국어 추가)

Localizable.strings파일에만 적용할 것이므로 해당 파일만 체크

  • Localizable에 key값과 value값 지정

English (=default)
Korean

  • 빌드 후 아래와 같이 사용

3. Localizable과 R.swift프레임워크를 같이 사용하는 방법 - xib, storyboard

  • 이전까지 경우는 코드로 입력하는 경우 반영이 되었지만, 코드가 개입하지 않고 storyboard, xib상에서 localizable 설정 방법
  • 원리: xib파일 런타임 시 동작되는 User Defined Runtime Attributes에 key값을 넣는 방식, 이 key값은 @IBinspectable을 갖도록 extension으로 localizable값을 return 하도록 설계

  • LocalizableExtension.swift 파일 추가
import UIKit

// MARK: - Localizable

protocol Localizable {
    var localized: String { get }
}

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

// MARK: - XIBLocalizable

protocol XIBLocalizable {
    var localizableKey: String? { get set }
    var placeholderKey: String? { get set }
}

extension XIBLocalizable {
    var placeholderKey: String? {
        get { 
            return nil 
        }
        set {
            _ = newValue 
        }
    }
}

extension UILabel: XIBLocalizable {
    @IBInspectable var localizableKey: String? {
        get { 
            return nil 
        }
        set(key) {
            text = key?.localized
        }
    }
}

extension UIButton: XIBLocalizable {
    @IBInspectable var localizableKey: String? {
        get { 
            return nil
        }
        set(key) {
            setTitle(key?.localized, for: .normal)
        }
   }
}

extension UITextField: XIBLocalizable {
    @IBInspectable var placeholderKey: String? {
        get { 
            return nil
        }
        set(key) {
            placeholder = key?.localized
        }
    }
    @IBInspectable var localizableKey: String? {
        get { 
            return nil
        }
        set(key) {
            text = key?.localized
        }
   }
}


extension UITextView: XIBLocalizable {
    @IBInspectable var localizableKey: String? {
        get {
            return nil 
        }
        set(key) {
            text = key?.localized
        }
   }
}
  • 사용 방법: xib에서 Localizable Key를 입력 -> 자동으로 User Defined Runtime Attributes 적용

 

응용 - 정규식

  • %d와 같은 정규식 이용 가능
// localizable.strings

"year-month-format" = "%d년 %d월";
R.string.localizable.yearMonthFormat(2021, 2) // 2021년 2월
  • %@ 정규식 이용 가능 - 문자열
"phone-number-masking" = "%@-****-%@";
Strings.phoneMasking4("123", "5678") // 123-****-5678

참고: github.com/mac-cain13/R.swift

Comments