ABOUT ME

일상의 부재

Today
Yesterday
Total
  • Swift 다국어 String Catalog 적용하기
    🧑‍💻/Swift 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

     

    반응형

    댓글

Designed by Tistory.