복수형이 적용된 Mac 앱 레이블을 완성하려면 Xcode에서 복수형 변형을 추가하고, 지원하는 각 현지화에 필요한 모든 범주를 채운 뒤, 렌더링된 결과를 테스트하세요. 이 안내에서는 가상의 항목 선택 메시지를 사용합니다.
이 작업은 SwiftUI Mac 앱에서 개수에 따라 달라지는 레이블 하나를 완성하는 것입니다. 메시지는 선택된 항목 수를 표시하고, 0 이상의 정수를 받으며, 번역 전반에서 그 의미를 유지합니다. 이 워크플로에서는 범주 범위, 플레이스홀더 점검, 런타임 테스트를 함께 활용해 카탈로그 항목이 충족해야 할 기준을 명확히 합니다.
복수형 범위를 완성하려면 무엇이 필요한가요?
Apple은 Xcode 15 이상에서 복수형 현지화에 문자열 카탈로그를 사용할 것을 권장합니다. Apple의 복수형 문서는 필수 대체 항목과 문법적 완전성을 구분합니다. 문자열 딕셔너리에는 other이 필수지만, 언어별 범주를 더 추가하지 않으면 문법이 틀릴 수 있습니다. 영어에는 one와 other가 필요하며, zero 범주는 선택 사항입니다. 복수형이 포함된 문자열 현지화.
사용 가능한 범주 이름은 zero, one, two, few, many, other입니다. 이 범주들은 모든 언어에 공통으로 적용되는 여섯 개의 숫자 범위가 아니라, 언어별 문법적 구분을 나타냅니다. one이라는 범주를 개수가 1과 같은지만 확인하는 보편적인 앱 규칙으로 사용해서는 안 됩니다. Unicode는 숫자 때문에 구문에 필요한 변화에 따라 범주를 정의하며, 여기에는 명사 자체를 넘어서는 변화도 포함됩니다. 복수형 규칙.
이 작업에는 다음 메시지 계약을 사용합니다. 이는 예시 앱의 요구사항이며 Apple이 정한 요구사항은 아닙니다.
| 계약 항목 | 이 예시의 요구사항 |
|---|---|
| 메시지 키 | selection.count |
| 영어 기본값 | \(count) items selected |
| 입력 | count이라는 이름의 음이 아닌 Swift Int 하나 |
| 의미 | 현재 선택된 항목 수 |
| 출력 | 개수를 포함하는 완전한 현지화 레이블 하나 |
| 범위 | 원본 현지화를 포함한 모든 지원 현지화 |
| 승인 기준 | 필수 범주 제공, 숫자 대체 유지, 대표 출력 확인 |
이 레이블에서는 숫자를 표시하도록 명시적으로 정했습니다. Apple은 숫자를 풀어 쓰거나 숫자 형식 지정자를 생략하는 복수형 변형도 허용합니다. 다른 메시지 계약이라면 이를 허용할 수 있습니다. 여기서는 선택 항목과 레이블을 쉽게 대조할 수 있도록 개수를 계속 표시합니다. 복수형이 포함된 문자열 현지화.
Swift 메시지를 카탈로그에 연결하기
Swift의 String.LocalizationValue는 런타임 보간이 포함된 현지화 가능 텍스트를 지원합니다. 안정적인 식별자를 영어 원본 텍스트와 다르게 지정하려는 경우, Apple은 별도의 defaultValue를 받는 String 이니셜라이저를 안내합니다. 이는 selection.count에 적합합니다. 식별자는 메시지 이름을 지정하고 기본값은 영어 문구를 제공합니다. String.LocalizationValue.
소규모 테스트 앱에서는 Xcode 15 이상에서 SwiftUI를 사용해 macOS 앱 프로젝트를 만들고, macOS 배포 대상을 12 이상으로 설정합니다. 생성된 앱 진입 파일을 아래의 전체 프로그램으로 바꾸고, 타깃에는 @main 선언을 하나만 남겨 둡니다. 카탈로그 단계를 진행하기 전에 Localizable.xcstrings를 앱 타깃에 추가합니다. 이 프로그램에는 Xcode와 macOS SDK가 필요하며, 이 조사 환경에서는 컴파일하지 않았습니다.
import Foundation
import SwiftUI
@main
struct PluralSampleApp: App {
var body: some Scene {
WindowGroup {
PluralSampleView()
}
}
}
struct PluralSampleView: View {
@State private var count: Int = 1
private let samples: [Int] = [
0, 1, 2, 3, 4, 5, 10, 11, 12,
20, 21, 22, 100, 101, 102, 1_000_000
]
private var selectionLabel: String {
String(
localized: "selection.count",
defaultValue: "\(count) items selected",
comment: "Selection summary. The integer is the number of selected items. Keep the count visible in every plural variant."
)
}
var body: some View {
VStack(alignment: .leading, spacing: 16) {
Picker("Sample count", selection: $count) {
ForEach(samples, id: \.self) { value in
Text(verbatim: String(value)).tag(value)
}
}
Text(verbatim: selectionLabel)
}
.padding(24)
.frame(minWidth: 360)
}
}
숫자 선택기 항목은 테스트 입력입니다. 현지화된 요약은 String(localized:defaultValue:comment:)으로 확인한 다음 결과 문자열로 표시됩니다. Apple 문서에 따르면 이니셜라이저의 첫 번째 인수는 조회 키를, 기본값은 원본 텍스트를 제공하며, 주석은 번역에 필요한 맥락을 제공합니다. 빌드 중에 Xcode는 현지화 API에 전달된 문자열을 추출합니다. 앱의 텍스트를 번역에 맞게 준비하기.
정수는 현지화 가능한 보간 안에 둡니다. 이 계약에서는 앱 분기문으로 영어 단수 문장과 복수 문장을 따로 미리 만들지 않습니다. 메시지를 하나로 유지하면 카탈로그가 제공된 개수에 맞는 현지화 문구를 선택하는 명확한 역할을 맡게 됩니다.
지원하는 모든 현지화에 범주 채우기
Xcode 편집기를 사용해 변형 구조를 만듭니다.
Product > Build를 선택해 카탈로그를 채웁니다.Localizable.xcstrings를 열고 원본 현지화를 선택합니다.selection.count을 Control-클릭하고Vary by Plural을 선택합니다.- 원본 언어의 각 변형을 채웁니다.
- 사이드바의
Add버튼으로 지원 현지화를 추가한 다음, 해당 현지화의 변형을 채웁니다.
Xcode는 언어별 복수형을 추가하고 보간에 사용할 형식 지정자를 결정합니다. 원본 현지화에 복수형 변형을 적용하면 언어 간 변형 구조가 동기화됩니다. 다른 현지화에만 적용하면 해당 현지화에만 영향을 줍니다. 문자열 카탈로그에서 텍스트 현지화 및 변형하기.
이 정수 보간에는 다음 영어 항목을 사용할 수 있습니다.
| 영어 범주 | 카탈로그 값 |
|---|---|
one |
%lld item selected |
other |
%lld items selected |
실제 보간 형식에 맞게 Xcode가 생성한 지정자를 사용합니다. Apple의 정수 예제에서는 %lld를 사용합니다. 번역에 다른 플레이스홀더를 복사하면 인수 계약이 깨질 수 있습니다. Xcode는 변형 필드에 키 값을 미리 채워 두므로 모든 필드의 문구를 확인하세요. 문자열 카탈로그에서 텍스트 현지화 및 변형하기.
실제 현지화 식별자마다 행 하나씩 포함하는 범위 점검표를 만듭니다. 이 메시지에 대해 Xcode가 생성한 범주, 각 범주의 번역 완료 여부, 테스트할 입력을 기록합니다. 프로젝트의 실제 식별자를 사용하면 포괄적인 언어 이름 뒤에 검토되지 않은 현지화가 가려지는 일을 막을 수 있습니다.
모든 행에 영어 범주 집합을 복사하지 마세요. 모든 곳에서 여섯 범주를 요구할 필요도 없습니다. 카탈로그가 기본 구조를 제공하도록 한 다음, 테스트 입력을 정할 때 해당 언어의 기수 복수형 규칙을 확인합니다. 기수 규칙은 수량에 관한 것이고, 서수 규칙은 순위에 관한 것이므로 서로 다른 질문에 답합니다. Unicode는 이를 별도의 규칙 유형으로 문서화합니다. Unicode 기술 표준 #35: 숫자.
구조, 플레이스홀더, 렌더링된 텍스트를 따로 검증하기
각 검사는 서로 다른 질문에 답하므로 세 가지 검사를 사용합니다. 범주 누락은 범위 문제이고, 잘못된 플레이스홀더는 형식 문제이며, 어색한 문장은 문구 문제입니다. 이를 따로 기록하면 다음에 무엇을 수정할지 명확해집니다.
범주 범위 확인하기
점검표의 각 행에서 예상 범주와 카탈로그에 채워진 항목을 비교합니다. other이 있는지, 예상 범주에 값이 비어 있거나 원본 텍스트를 그대로 복사한 미완성 항목이 없는지 확인합니다.
간단한 완전성 검사를 하려면 해당 현지화에 생성된 범주와 의도적으로 지원하는 추가 항목을 예상 집합으로 정의합니다. 누락 집합은 예상 집합에서 번역이 완료된 텍스트가 있는 범주를 뺀 것입니다. 이 집합에 항목이 하나라도 남으면 이 문서의 승인 기준에 따라 메시지는 미완성입니다. 이는 문서화된 변형 워크플로를 바탕으로 만든 실용적인 검토 방법이며, Xcode가 이 점검표를 그대로 강제한다는 뜻은 아닙니다.
두 범주의 문구가 정당한 이유로 같다면 필요한 곳에 그대로 두고 두 항목을 모두 검토합니다. 목표는 필요한 범주 전반에서 메시지의 의미를 유지하는 것이며, 모든 문자열 쌍이 겉으로 달라야 하는 것은 아닙니다.
숫자 대체 확인하기
빌드한 다음 카탈로그 진단을 검토합니다. Apple은 형식 지정자 불일치 같은 일반적인 문제를 확인하는 문자열 카탈로그 검증을 문서화했습니다. 진단 결과를 해결한 뒤 각 변형이 개수를 표시한다는 이 메시지의 요구사항을 여전히 충족하는지 살펴봅니다. 다국어 지원 앱 빌드하기.
인수 하나를 받는 이 예시에서는 숫자 플레이스홀더가 있고, 숫자 형식을 유지하며, 의도한 위치에 한 번 삽입되는지 확인합니다. 빌드 성공은 유용한 증거지만, 승인 여부를 판단하려면 범주 범위와 실제 렌더링된 텍스트도 확인해야 합니다.
Mac 앱에서 대표 개수 테스트하기
Product > Scheme > Edit Scheme을 선택하고 Run을 선택한 다음 Options를 엽니다. App Language와 해당 App Region을 설정하고 대화상자를 닫은 뒤 Mac 앱을 실행합니다. 지원하는 각 현지화에 대해 반복합니다. Apple은 이 스킴 기반 절차를 현지화된 출력을 테스트하는 방법으로 문서화했습니다. 앱을 실행할 때 현지화 테스트하기.
예시 선택기는 출발점이 되는 개수 집합이지, 모든 범주를 보편적으로 아우르는 값은 아닙니다. 해당 현지화의 테스트 행을 완료 처리하기 전에 그 현지화에 알맞은 값을 추가합니다.
| 테스트 항목 | 확인 내용 |
|---|---|
0, 1, 2 |
선택 항목이 없을 때, 하나일 때, 적은 수의 여러 항목을 선택했을 때 |
| 필수 범주마다 대표 입력 하나 이상 | 현지화의 문법적 구분 범위 |
| 관련 규칙 경계의 양쪽에 해당하는 값 | 가장 작은 개수를 넘어서는 범주 변화 |
| 유효한 큰 개수 하나 | 숫자 대체와 레이블에 사용할 수 있는 공간 |
| 테스트한 모든 입력 | 의미, 완전한 문구, 표시되는 개수 |
Unicode 규칙은 범주를 조건과 예시 값에 연결하며, 소수 자릿수 같은 숫자 세부 사항도 중요할 수 있습니다. 이 계약은 정수만 받습니다. 앱에서 나중에 소수 수량도 받게 된다면 정수 테스트 결과로 여전히 범위가 입증된다고 가정하지 말고, 보간, 원본 문구, 테스트를 함께 수정합니다. Unicode 기술 표준 #35: 숫자.
예상과 다른 결과 진단하기
관찰된 증상에 따라 다음에 확인할 항목을 선택합니다.
| 증상 | 다음 조치 |
|---|---|
selection.count이 카탈로그에 없음 |
다시 빌드하고 현지화 가능한 호출과 선택한 테이블을 확인합니다. |
| 한 현지화에만 복수형 변형이 있음 | Vary by Plural을 적용한 위치를 다시 확인합니다. |
| 변형에 영어 복수형 문구가 남아 있음 | 미리 채워진 필드를 확인하고 완성된 번역을 입력합니다. |
| 표시되는 숫자가 없거나 잘못된 형식임 | 변형의 플레이스홀더를 Xcode가 생성한 지정자 및 메시지 계약과 비교합니다. |
| 더 큰 개수에 예상치 못한 문구가 표시됨 | 해당 현지화의 범주 규칙을 확인하고 대표 테스트를 추가합니다. |
| 올바른 문구가 화면에 맞지 않음 | 뷰를 조정하고 레이블 전체를 다시 테스트합니다. |
Xcode 15 이전 버전을 사용하는 구형 프로젝트에서는 Apple이 .strings와 .stringsdict 리소스를 사용하는 방식을 지원합니다. 복수형 딕셔너리는 언어별 변형을 제공하며 other이 필요합니다. 그래도 올바른 문법에 필요한 나머지 범주를 채워야 합니다. 복수형이 포함된 문자열 현지화.
지원하는 모든 현지화의 범위 행을 완료하고 플레이스홀더가 계약을 충족하며, 실행 중인 앱에서 대표 개수가 의도한 레이블을 표시할 때 메시지 작업을 완료합니다. 지원 현지화, 숫자 입력 형식, 메시지 의미가 바뀌면 해당 행을 다시 검토합니다.
출처
- 문자열 카탈로그에서 텍스트 현지화 및 변형하기 — Apple
- 복수형이 포함된 문자열 현지화 — Apple
- String.LocalizationValue — Apple
- 앱의 텍스트를 번역에 맞게 준비하기 — Apple
- 앱을 실행할 때 현지화 테스트하기 — Apple
- 다국어 지원 앱 빌드하기 — Apple
- 복수형 규칙 — Unicode Consortium
- Unicode 기술 표준 #35: Unicode 공통 로캘 데이터 및 규칙(CLDR), 제3부: 숫자 — Unicode Consortium