🧑‍💻/Swift

Swift 다국어 String Catalog 적용하기

유리맥 2025. 3. 30. 20:23
반응형

iOS의 i18n 다국어 처리 방법을 알아봅시다.

Xcode 15 이상부터 적용 가능합니다.


1. 현지화 언어 추가

먼저 현지화할 언어를 추가합니다.

왼쪽 프로젝트 클릭 > 프로젝트 클릭 > Localizations + 버튼 클릭 > 현지화할 언어 추가

 

저는 한국어를 추가했습니다.

 

스토리보드 현지화할 거냐고 물어보는데 체크하고 Finish

 

 

2. String Catalog 추가

폴더 클릭 > 우클릭 > New File from Template > String Catalog를 클릭합니다.

파일명은 꼭 자동으로 입력된 Localizable 를 사용해야 인식됩니다.

 

파일이 생성되면 이렇게 비어있죠. 여기서 수동으로 추가하지 않습니다.

 

 

3. 다국어 코드 작성

다국어 코드 작성 > 빌드 > Localizable 자동 반영됩니다.

 

SwiftUI

Text()를 사용하기만 해도 다국어 처리됩니다.

다국어 처리하지 않을 경우에만 Text(verbatim:) 을 사용합니다. verbatim은 "말하는 바 그대로" 라는 뜻이라네요.

Text() 안에 변수를 추가하면 자동으로 "Hello %@"로 다국어가 추가됩니다.

import SwiftUI

struct SwiftUIView: View {
    let name = "yurimac"
    
    var body: some View {
        // 다국어 적용
        Text("Hello")
        
        // 변수 추가
        Text("Hello \(name)")
        
        // 다국어 적용 X
        Text(verbatim: "Hello")
    }
}

#Preview {
    SwiftUIView()
}

 

만약 Title을 enum case에 따라 설정하고 있다면 enum을 LocalizedStringKey로 감싸서 Text에 설정할 수 있습니다.

import SwiftUI

struct SwiftUIView: View {
    enum Title: LocalizedStringKey {
        case signIn = "Sign In"
        case signOut = "Sign Out"
    }
    
    let title: Title = .signIn
    
    var body: some View {
        Text(title.rawValue)
    }
}

#Preview {
    SwiftUIView()
}

 

UIKit

텍스트를 String(localized: "Hello")로 감쌉니다.

구글링하다보면 extension으로 "Hello".localized() 처럼 호출하는 방법도 있던데, 코드가 깔끔해져서 좋긴 합니다.

하지만 변수 추가할 때 유연하지가 않아서 String(localized:)를 사용하는게 편하더라구요.

String(localized:)를 String(format:)에 넣어서 변수도 처리할 수 있습니다.

import UIKit

class ViewController: UIViewController {
    let helloLabel = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.addSubview(helloLabel)
        helloLabel.translatesAutoresizingMaskIntoConstraints = false
        helloLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        helloLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        
        // 다국어 적용
        helloLabel.text = String(localized: "Hello")
        
        // 변수 추가
        let name = "yurimac"
        helloLabel.text = String(format: String(localized: "Hello %@"), name)
        
        // 다국어 적용 X
        helloLabel.text = "Hello"
    }
}

 

Info.plist 다국어

NSCameraUsageDescription, NSPhotoLibraryUsageDescription 등

Info.plist 내용들을 다국어 처리하려면

Localizable과 동일하게 String Catalog 파일을 생성하되 파일명을 InfoPlist로 설정합니다.

 

빌드하면 자동으로 InfoPlist가 채워집니다.

간혹 바로 채워지지 않는 경우도 있는데 Xcode 껐다가 켜서 빌드하면 됩니다.

 

 

4. 빌드 및 Localizable 관리

빌드를 완료하면 자동으로 Localizable.xcstrings 파일에 추가됩니다. NEW 상태와 함께 !

 

변수는 크게 String, Numeric 두 가지로 처리합니다. 

  • String 변수 : %@
  • Numeric 변수 : %lld

 

변수가 여러 개 붙으면 1$, 2$, 3$, ... 가 자동으로 붙습니다.

 

다국어 적용되던 String을 더 이상 사용하지 않으면 자동으로 Stale 태그가 붙습니다.

마이너스 버튼 클릭하여 제거해주면 됩니다.

 

 

5. 테스트

다국어 적용 여부를 확인하기 위해 테스트가 필요하죠. 앱 언어를 변경하여 확인할 수 있습니다.

아이폰 설정 앱 > 일반 > 언어 및 지역 > 선호하는 언어 변경 > 앱 재접속 > 앱 재시작됨 > 다국어 적용 확인

 


참고

https://www.youtube.com/watch?v=7xxUopPqjyI

 

반응형