iOS에서 Xcode로 다국어 지원하기(2)

0

iOS 다국어 처리

목록 보기
2/4

서론

https://velog.io/@sustainable-git/iOS에서-Xcode로-다국어-지원하기1
이전 글에서 Xcode 14 이하의 버전에서 .strings파일을 추가하여 다국어를 처리하는 방법을 다루었습니다.
하지만 Xcode 15 버전에서는 String catalog라는 새로운 기능이 도입되었습니다.
String catalog는 문자열 리소스를 하나의 파일에서 효율적으로 관리하고, 각 View에서 자동으로 해당 문자열을 가져올 수 있게 합니다.
이번 글에서는 String catalog를 활용해 다국어를 처리하는 방법을 소개하겠습니다.


시작하기 전에

iOS 16 미만인 경우

Xcode 15 버전으로 iOS 16 미만 버전을 대응하는 앱을 개발하는 경우도 있을 수 있습니다.
그럴 경우 LocalizedStringResource를 사용할 수 없고, String(localized:)도 또한 사용할 수 없습니다.
그런 경우 NSLocalizedString을 사용해서 다국어를 처리해야 합니다.
이전 글의 내용을 함께 활용하여 문제를 해결하시면 됩니다.
아래는 Apple의 공식문서에 적혀있는 글입니다.

https://developer.apple.com/documentation/Xcode/localizing-and-varying-text-with-a-string-catalog

strings 파일이 있는 상태에서 migration이 필요한 경우

String catalog는 migration을 지원합니다.
strings 파일을 우클릭해서, migrate to string catalog... 버튼을 누르기만 하면 됩니다.

만약, 특정 언어가 번역이 안 된 상태로 string catalog가 만들어진다면 아래와 같이 stirngs 파일이 모든 언어에 대해 체크박스가 되어 있었는지 확인해 주세요.

String catalog를 쓴다면 script를 사용하지 않는게 좋습니다

이전 글에서 script를 사용한 이유는 View에서 String을 분리하여 Human error를 제거하기 위함이었습니다.
하지만, String catalog의 자동화는 View에서 String 값을 자동으로 가져오기 때문에 View에 String이 존재해야 합니다.
Human Error는 매 빌드마다 업데이트되는 String catalog에 State 값을 통해 Human error를 확인하고 처리해야 합니다.


String catalog를 이용해 문자열을 자동으로 가져오기

위와 같은 상황에서 참치를 추가하고 빌드를 해봅시다

그러면 String catalog에 참치가 추가되고, String catalog는 참치 Key에 대해 State에 New 태그를 붙여줍니다.
이런 변화는 각 언어 옆에 적혀있는 coverage의 변화로도 쉽게 확인할 수 있습니다.
여기서 English 부분에 번역을 적어주면 됩니다.

그런데, 일본어를 잘 모르는 사람이 임의로 참치를 다국어 처리했다고 생각해 봅시다.
잘못된 번역이 되었을 수도 있죠?
이런 경우 우클릭하여 Mark for Review를 선택해 Need Review로 State를 변경할 수 있습니다.
이렇게 되면 coverage가 올라가지 않아 다국어 처리가 더 필요함을 알 수 있고, State를 정렬하여 이 값을 쉽게 찾을 수 있습니다.

번역 전문가가 다시 값을 넣어주거나, 우클릭하여 Mark as Reviewed를 선택하면 번역이 coverage가 다시 상승합니다.

View가 아닌 곳에서 자동화를 하려면

iOS 16 미만일 경우 String catalog에 + 버튼을 눌러 하나하나 이 값을 처리해 주어야 합니다.
이 과정은 자동화가 되지 않기 때문에 string이 사라지면 개발자가 손수 string catalog의 값을 제거해야 하고,
개발자의 실수에 의해 string catalog에 값을 입력해두지 않아 번역이 되지 않는 문제가 발생할 수 있습니다.
하지만 iOS 16 이상인 경우 String(localized:) 함수를 이용해 이를 자동화할 수 있습니다.
이를 활용해 Model 또는 ViewModel에서 string을 다국어로 자동화하여 관리할 수 있습니다.

import SwiftUI

final class ViewModel: ObservableObject {
    @Published private(set) var description: String = ""
    
    func tunaButtonTouched() {
        description = String(localized: "고등어목 고등엇과의 다랑어족에 속하는 어류들의 총칭.")
    }
}

struct ContentView: View {
    @StateObject private var viewModel = ViewModel()
    
    var body: some View {
        VStack {
            Text("김치")
            Button {
                viewModel.tunaButtonTouched()
            } label: {
                Text("참치")
            }
            Text(viewModel.description)
        }
    }
}

#Preview {
    ContentView()
        .environment(\.locale, .init(identifier: "en"))
}

서버에서 가져오는 값은 어떻게 자동으로 String catalog에 담을 수 있나요?

불가능합니다.
서버에서 어떤 값이 올지 미리 알 수 없기 때문에 자동으로 String catalog에 담을 수 없습니다.
때문에 String catalog에 + 버튼을 눌러 하나하나 이 값을 미리 넣어주어야 합니다.
대신 이렇게 수동으로 추가한 값은 사용자가 삭제하기 전까지는 사라지지 않아 Text(_:) 또는 String(localized:) 값이 제거되더라도 존재하게 됩니다.

위 화면은 String catalog를 open as > source code 로 확인하면 됩니다.
(오늘 실습에서 김치는 migrate 되었기 때문에 수동으로 추가한 것으로 남아 있습니다.)


마무리

오늘은 간단하게 String catalog를 사용해서 자동으로 string을 관리하는 방법을 주로 다루었습니다.
다국어 처리는 소개할게 너무 많아서 다음 글에서 추가 내용을 더 담도록 하겠습니다.

profile
https://github.com/sustainable-git

0개의 댓글

관련 채용 정보