Swift) Localization 다국어 처리(Stringsdict File)

저번 글에서 Localization 다국어 처리의 기본적인 기능을 살펴보았습니다.
하지만 Strings File 만으로는 다국어처리를 완료할 수 없습니다. 왜냐하면 영어를 예시로 들었을 때
no Apples, an Apple, Apples 등 단복수에 대한 고려가 필요하기 때문입니다. 이렇듯 언어마다 명사와 단위를 처리하는 문법 규칙이 다른데 때문에 변수의 수량이 포함된 서식 문자열을 Localization하려면 각 언어의 복수형에 따라 다른 번역을 제공하기 위해 “stringsdict file”을 사용해야 합니다.

복수(Plural) 처리

만약 “stringsdict File”을 사용하지 않고 기존에 사용하는 “Strings File”을 사용해서 복수 처리를 한다고 가정해보겠습니다. 그럼 간단하게 할 수 있는 방법은 단수, 복수에 대한 key값을 여러 개 만드는 것입니다.
연산 프로퍼티를 사용해서 한 번 예시를 만들어 보겠습니다.

"ContentView.apples" = "%lld apples";

"ContentView.apple" = "%lld apple";

다음과 같이 단수, 복수에 대한 경우를 모두 고려해 Int 값에 따라 조건문으로 나누면 복수 처리를 할 수 있겠습니다.
하지만 공식적인 방법이 아닐 뿐더러, 만약 영어가 아닌 다른 언어에 대해서는 또 대응이 어려울 것입니다. 그리고 결정적으로 1문장에 여러 인자가 들어갈 경우 조건문이 더 복잡해질 것입니다.

"ContentView.apples.baskets" = "%lld apples in %lld baksets";

"ContentView.apple.baskets" = "%lld apple in %lld baksets";

"ContentView.apples.basket" = "%lld apples in %lld bakset";

"ContentView.apple.basket" = "%lld apple in %lld bakset";
        var appleInBasketText: String {
            switch (appleCount, basketCount) {
            case (let appleCount, let basketCount) where appleCount < 2 && basketCount < 2:
                return String(format: NSLocalizedString("ContentView.apple.bakset", comment: ""), appleCount, basketCount)
            case (let appleCount, let basketCount) where appleCount >= 2 && basketCount >= 2:
                return String(format: NSLocalizedString("ContentView.apples.baksets", comment: ""), appleCount, basketCount)
            case (let appleCount, let basketCount) where appleCount < 2 && basketCount >= 2:
                return String(format: NSLocalizedString("ContentView.apple.baksets", comment: ""), appleCount, basketCount)
            case (let appleCount, let basketCount) where appleCount >= 2 && basketCount <= 2:
                return String(format: NSLocalizedString("ContentView.apples.bakset", comment: ""), appleCount, basketCount)
            default:
                return ""
            }
        }

1문장에 Int 값의 인자가 2개가 들어가면 경우의 수가 훨씬 더 많이 증가하게 될 것입니다. 따라서 이런 처리 방법은 좋지 않아 보입니다.

Stringsdict File을 활용한 다국어 처리

파일 구조

stringsdic File의 파일 구조는 다음과 같습니다.

NSStringLocalizedFormatKey:
변수를 포함하는 서식 문자열입니다. 복수형 규칙으로 문자열을 대체하려면 변수를 “%#@” 문자로 시작하고 “@” 문자로 끝나게 합니다. 예를 들어, %#@applesCount@는 해당 문자열이 복수형 규칙에 따라 다르게 변할 것임을 나타냅니다.
NSStringFormatSpecTypeKey:
언어 규칙의 유형을 지정합니다. 사용할 수 있는 유일한 값은 “NSStringPluralRuleType”이며 언어의 복수형 변형을 나타냅니다.
NSStringFormatValueTypeKey:
숫자에 대한 문자열 서식 지정자입니다. 예를 들어 정수를 나타내는 문자열 “d”가 있습니다.
zero, one, two, few, many, other
복수 카테고리에 대한 형식화된 문자열입니다.


stringsDict 파일을 사용하면 복수화를 진행할 수 있지만 파일이 2개가 생겨서 관리가 힘들다는 단점이 있을 수 있습니다.

Leave a Comment