티스토리 뷰

iOS 앱 개발 중에 다국어를 지원하는 방법을 알아보자.

 

 

 

# 앱 설정

1. 문자열 파일 만들기

New File로 String File을 생성한다. 

파일명은 Localizable으로 하자. 그래야 나중에 NSLocalizedString() 함수를 디폴트로 테이블 이름을 사용할 수 있어서 편하다. 다름 이름을 하게 되면 매번 테이블 이름을 전달해야 한다.

 

2. 생성한 문자열 파일을 인스펙터에서 Localize...로 선택한다. 

 

3. Project > Info > Localization 에서 언어를 추가한다.

 

 

 

# 다국어 추가하기

언어별로 문자열 파일이 생성되어 있을 것이다.

각 문자열 파일에 키-값 쌍으로 다국어를 추가한다.

꼭 끝에 콜롬을 추가해야 한다. (안하면 에러 발생)

 

// en

"groups" = "groups";

 

// ko

"groups" = "그룹";

 

 

 

# SwiftUI 미리보기에 다국어 적용하기

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ContentView()
                .previewDisplayName("en")
                .environment(\.locale, .init(identifier: "en"))
            ContentView()
                .previewDisplayName("ko")
                .environment(\.locale, .init(identifier: "ko"))
        }
    }
}

원래는 잘되어야 하는 코드인데 현재 XCode14.2의 미리보기에서는 작동하지 않는다. (시뮬과 기기에서는 잘됨)

미리보기에서 다국어를 볼려면, Scheme에서 App Language에서 수정하면, 해당 언어의 다국어를 확인할 수 있다.

 

 

 

# Swift Foundation에서 지역화 관련 API

struct Locale

데이터 형식을 포맷팅하는 데 사용되는 언어, 문화 및 기술 관습 정보에 대한 정보입니다.


class NSOrthography

일반적으로 맞춤법 및 문법 검사에 사용되는 자연 언어 텍스트의 언어 내용에 대한 설명입니다.

 

func NSLocalizedString

func NSLocalizedString(String, tableName: String?, bundle: Bundle, value: String, comment: String) -> String

로컬라이제이션 내보내기 시 Xcode가 생성하는 테이블에서 로컬라이즈된 문자열을 반환합니다.


struct LocalizedStringResource

다른 프로세스에서 접근 가능한 로컬라이즈 가능한 문자열에 대한 참조입니다.


protocol CustomLocalizedStringResourceConvertible

외부 프로세스에서 로컬라이즈 가능한 설명을 제공하는 유형입니다.


func NSLocalizedString

번들 내의 특정 파일 URL에 위치한 리소스입니다.

 

 

 

# func NSLocalizedString(String, tableName: String?, bundle: Bundle, value: String, comment: String) -> String

이 함수는 지역화에 맞는 문자열을 리턴한다. 첫 번째 인자는 key가 된다. 

key와 comment는 기본값이 없기 때문에 무조건 값을 전달해야 하고, 나머지는 옵션 사항이 된다.

func NSLocalizedString(
    _ key: String,
    tableName: String? = nil,
    bundle: Bundle = Bundle.main,
    value: String = "",
    comment: String
) -> String

 

key
지정된 테이블에 있는 문자열의 키이다.
키가 문자열 변수 또는 빈 문자열인 문자열에 대해서는 Xcode에서 현지화를 내보낼 수 없다.

tableName
키-값 쌍을 포함하는 테이블의 이름이다. 또한 현지화된 문자열을 저장할 문자열 파일(확장자가 .strings인 파일)의 접미사이다. tableName이 nil이거나 빈 문자열인 경우 기본값은 Localizable.strings의 테이블이다.

bundle
테이블의 문자열 파일이 포함된 번들이다. 기본 번들이 지정되지 않은 경우 기본 번들이 사용된다.

value
개발 로캘에 대한 지역화된 문자열이다. 테이블에서 키를 찾을 수 없는 경우 이 값을 반환한다. 만일 value가 ""인 경우, key 값이 된다.

comment
문자열 파일에서 키-값 쌍 위에 배치할 주석이다. 이 매개 변수는 번역가에게 현지화된 문자열이 사용자에게 표시되는 컨텍스트를 제공한다. 예를 들어 "Book"은 사용되는 문맥에 따라 "책"과 "예약"으로 번역될 수 있다. 이런 다중어를 사용자에게 설명하기 위해 comment를 추가한다.

NSLocalizedString("book-tag-title",
                  value: "Book",
                  comment: "noun: A label attached to literary items in the library.")


NSLocalizedString("book-button-title",
                  value: "Book",
                  comment: "verb: Title of the button that makes a reservation.")

개인 개발자라면 다중어가 크게 문제가 되지 않기 때문에 보통 comment는 문자열로 ""로 사용하는 경우가 많다.

 

bundle을 제외한 나머지 인자들은 전부 리터럴 문자열이여야 한다. 만약 문자열 변수를 사용해야 한다면 localizaedString(forKey:value:table:)를 사용해야 한다.

 

 

 

 

# 다국어 사용하기

## LocalizedStringKey로 사용하기

다국어 파일에서 키-값으로 만든 다국어의 키는 LocalizedStringKey가 된다.

그리고 LocalizedStringKey를 바로 사용할 수 있는 다양한 API를 제공한다.

 

예를 들어 SwiftUI의 Text에는 init(LocalizedStringKey, tableName: String?, bundle: Bundle?, comment: StaticString?) 생성자가 존재한다. 그러므로 Text("groups")처럼 LocalizedStringKey를 전달하면 다국어로 표시된다. 

 

## NSLocalizedString() 사용하기

만약 LocalizedStringKey를 지원하지 않는다면 NSLocalizedString()을 사용하면 된다.

NSLocalizedString("groups", comment: "")

이를 더 쉽게 사용하기 위해 Extension을 사용하면 좋다.

extension String {
    func localized(tableName: String? = nil, bundle: Bundle = .main, comment: String = "") -> String {
        NSLocalizedString(self, tableName: tableName, bundle: bundle, value: self, comment: comment)
    }
}
"groups".localized()

 

## 보간으로 다국어 사용하기

https://zeddios.tistory.com/744

 

## Info.plist 로컬라이징

https://zeddios.tistory.com/369

 

 

 

# 다국어가 안된다면?

위에서 말한대로 XCode14.2 미리보기에서는 다국어가 적용되지 않는다.

그리고 시스템 언어로도 다국어가 적용되지 않는 경우도 있었다. 이런 경우에는 Product > Clean bild folder를 하고, 빌드를 해보자. 

'SwiftUI' 카테고리의 다른 글

[SwiftUI] Admob, Info.plist 업데이트하는 방법  (0) 2023.09.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함