xcode 로컬라이제이션 적용해보기

·2025년 11월 30일

iOS-posting

목록 보기
8/14

로컬라이제이션(Localization)이란?

Localization is the process of adapting your app for different languages, regions, and cultures.”
Apple Developer Documentation – App Localization
번역하면 -> 현지화는 다양한 언어, 지역, 문화에 맞춰 앱을 조정하는 과정 이라고 한다.

그냥 어렵게 말 할 필요 없이 다른 언어권에도 쉽게 등록할 수 있게 도와주는 것입니다!
Hi로 나오지만, 한국사람들에게는 안녕이 나오게하는 거라서 필요성을 아마 다들 알고 계실 것같아요.


어떻게 적용하는가?

  1. [Project] -> [Info] -> [Localizations] -> +버튼 눌러서 언어 추가하기

일단은 영어 베이스에 한국어랑 중국어(간체) 정도 추가하려한다 !

  1. [파일생성] -> [New File from Template] -> [String Catalog]
  1. 그렇게 생성하면 내가 [1]에서 생성해준
  1. 이제 칼럼으로 나타난 것을 볼 수가 있는 것이다.

그럼 이 Localizable.xcstrings 끝에 State는 뭔가요?

  • 이건 내가 한다기보다 이렇게 Xcode측에서 알려준다고 보시면된다!

  • Translated

  • Needs Review

  • Untranslated / Missing

  • Auto-translated

  • Error / Conflict

잘 기입이 되었는지 확인할 수 있는 섹션 정도라고 생각하면 될 듯 !


String에 아래와 같은 Extension을 추가해두면,

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

직접 문자열을 넣는 대신 "quit".localized 형태로 손쉽게 로컬라이징된 문자열을 사용할 수 있다.

근데 여기서 의문이든게, 문자열 키를 이렇게"quit".localized처럼 직접 작성해버리면 오타나 관리 측면에서 안정성이 떨어질 수 있을 것 같아서, 이를 enum으로 만들어주려고 한다. 그래서 문자열 키들을 enum으로 묶어 타입 안정성을 조금 더 높이는 방향으로 정리했다.

enum LocalText {
    enum Settings {
        static let quit = "quit".localized
        static let appInfo = "appInfo".localized
    }

    enum Common {
        static let confirm = "confirm".localized
        static let cancel = "cancel".localized
    }
}

이렇게 분리해두면 "quit".localized 같은 문자열 기반 접근을 피하면서, 자동 완성을 누릴 수 있다..!

Text(LocalText.Settings.quit)

그리고 이렇게하면 Feature 별로 나누거나, 혹은 View별로 나눌 수가 있게 되는 것이다.

근데 여기에서 이렇게 일반 텍스트는 알겠는데, 만약에 데이터에서 가져오는 값들은 어떻게 처리를 해줘야할까?

  • 이걸 고려해서 localization Key 자체를 반환하게끔 해주면 되는것이다.

예시를 들어보자! 그냥 간단하게 MenuItem을 ForEach로 출력해보자!

struct ContentView: View {
    var body: some View {
        VStack {
            ForEach(items) { item in
                Text(item.titleKey.localized)
            }
        }
    }
}

struct MenuItem: Identifiable {
    let id = UUID()
    let titleKey: String
}

let items = [
    MenuItem(titleKey: "confirm"),
    MenuItem(titleKey: "cancel"),
]

잘 출력된것을 확인할 수 있다 !

참고 자료

profile
기억보단 기록을

0개의 댓글