
iOS 앱 현지화 완벽 가이드
Localizable.strings부터 App Store 메타데이터까지, Xcode, SwiftUI, Fastlane, AI 자동 번역으로 iOS 앱을 현지화하는 방법을 알아보세요.
Xcode에서 현지화 활성화
Xcode 프로젝트 설정을 열고 Info > Localizations로 이동한 다음 지원할 언어를 추가하세요. Xcode가 언어별 .lproj 디렉터리를 자동으로 생성해요.
// In Xcode:
// 1. Select your project in the navigator
// 2. Go to Info tab > Localizations
// 3. Click + to add languages (e.g., German, Japanese)
// 4. Select which files to localize
//
// Xcode creates .lproj directories automatically:
// en.lproj/Localizable.strings
// de.lproj/Localizable.strings
// ja.lproj/Localizable.stringsLocalizable.strings 생성
표준 iOS 현지화 파일은 등호로 구분한 키-값 쌍을 사용하고 각 줄 끝에 세미콜론을 붙여요. 원문 언어 파일은 Base.lproj 폴더에 두세요.
// Base.lproj/Localizable.strings
"welcome_title" = "Welcome to MyApp";
"login_button" = "Sign In";
"settings_label" = "Settings";
"greeting" = "Hello, %@!"; // %@ = string placeholder
"item_count" = "%d items"; // %d = integer placeholder// ❌ Common mistakes in .strings files:
// Missing semicolon — file loads but translations are empty
"welcome_title" = "Welcome"
// Unescaped quotes — causes parse error
"message" = "Click "here" to continue";
// ✅ Correct versions:
"welcome_title" = "Welcome";
"message" = "Click \"here\" to continue";String Catalog로 이전 (Xcode 15 이상)
String Catalog (.xcstrings)는 .strings 파일을 대체하는 Apple의 최신 방식이에요. Xcode의 시각적 편집기, SwiftUI 뷰의 자동 문자열 추출, 내장 복수형 지원을 제공해요.
// Xcode 15+ String Catalog (Localizable.xcstrings)
// Xcode automatically extracts strings from your code
// and manages translations in a visual editor.
// In SwiftUI, strings are automatically localizable:
Text("Welcome to MyApp")
Text("Hello, \(userName)!")
// Mark strings explicitly:
let title = String(localized: "welcome_title")SwiftUI 및 UIKit에서 현지화 문자열 사용
SwiftUI의 Text 뷰는 문자열 리터럴을 자동으로 현지화해요. UIKit에서는 NSLocalizedString을 사용해요. iOS 16 이상에서는 컴파일러 지원이 내장된 최신 String(localized:comment:) API로 더 간결한 구문을 사용할 수 있어요.
import SwiftUI
struct ContentView: View {
let userName: String
var body: some View {
VStack {
// ✅ SwiftUI auto-localizes string literals
Text("welcome_title")
// ⚠️ This does NOT localize (String interpolation)
// Text("Hello, \(userName)")
// ✅ Use String(localized:) for dynamic strings
Text(String(localized: "greeting \(userName)"))
// ✅ UIKit style (works everywhere)
let title = NSLocalizedString(
"settings_label",
comment: "Settings screen title"
)
// ✅ Modern API (iOS 16+)
let modern = String(
localized: "welcome_title",
comment: "Main screen title"
)
}
}
}복수형 처리
iOS는 복수형 규칙에 .stringsdict 파일을 사용하며 zero, one, two, few, many, other를 포함한 모든 CLDR 복수형 범주를 지원해요. String Catalog에서는 Xcode의 시각적 편집기로 복수형을 처리할 수 있어 stringsdict XML을 직접 작성하는 것보다 훨씬 간단해요.
<!-- Localizable.stringsdict -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>items_count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>No items</string>
<key>one</key>
<string>%d item</string>
<key>other</key>
<string>%d items</string>
</dict>
</dict>
</dict>
</plist>
// Usage in Swift:
String(format: NSLocalizedString("items_count", comment: ""),
itemCount)Fastlane으로 App Store 메타데이터 현지화
Fastlane의 deliver 도구를 사용하면 앱 이름, 부제, 설명, 키워드, 출시 노트 같은 App Store 메타데이터를 로케일별 일반 텍스트 파일로 저장소에서 버전 관리할 수 있어요.
# Install Fastlane
$ gem install fastlane
# Initialize deliver for App Store metadata
$ fastlane deliver init
# Directory structure created:
# fastlane/metadata/
# ├── en-US/
# │ ├── name.txt # App name (30 chars)
# │ ├── subtitle.txt # Subtitle (30 chars)
# │ ├── description.txt # Full description
# │ ├── keywords.txt # Search keywords (100 chars)
# │ ├── release_notes.txt # What's New
# │ └── promotional_text.txt
# ├── de-DE/
# │ └── ...
# └── ja/
# └── ...
# Push metadata to App Store Connect:
$ fastlane deliver현지화 테스트
기기 언어를 바꾸지 않고 현지화된 콘텐츠를 테스트하세요. Xcode 스킴 재정의로 원하는 언어로 앱을 실행하고, locale 환경을 적용한 SwiftUI 미리 보기와 실행 인수를 적용한 XCUITest로 자동 테스트하세요.
// 1. Xcode Scheme Override:
// Edit Scheme > Run > Options > App Language > Choose language
// 2. SwiftUI Preview with locale:
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environment(\.locale, Locale(identifier: "de"))
ContentView()
.environment(\.locale, Locale(identifier: "ja"))
ContentView()
.environment(\.locale, Locale(identifier: "ar"))
}
}
// 3. XCUITest with language override:
let app = XCUIApplication()
app.launchArguments += ["-AppleLanguages", "(de)"]
app.launchArguments += ["-AppleLocale", "de_DE"]
app.launch()번역 품질 검사 자동화
번역 자동화
AI로 .strings, .xcstrings, Fastlane 메타데이터 파일을 번역하세요. 앱 내 문자열과 App Store 메타데이터 번역을 모두 자동화해 완전히 현지화된 앱을 제공할 수 있어요.
# Translate .strings files
> Translate Base.lproj/Localizable.strings
to Japanese, German, and Spanish
# Translate App Store metadata too
> Translate fastlane/metadata/en-US/
to de-DE, ja, es-MX
✓ 6 files translated in 3.2s추가 기능: LocaleChain을 활용한 스마트 로케일 폴백
기본적으로 iOS는 사용자의 로케일과 정확히 일치하는 번역이 없으면 개발 언어로 폴백해요. pt-PT 번역만 있는 경우 pt-BR 사용자에게 포르투갈어 대신 영어가 표시돼요. LocaleChain은 구성 가능한 폴백 체인으로 이 문제를 해결해요.
LocaleChain은 오픈 소스 Swift 패키지예요. GitHub에서 보기
// Swift Package Manager
// File > Add Package Dependencies >
// https://github.com/i18n-agent/ios-localechain.gitimport LocaleChain
// In your App init or AppDelegate:
LocaleChain.configure() // Activates all default chains
// pt-BR user with only pt-PT translations?
// → Shows Portuguese instead of falling back to English
// Custom overrides for your specific locales:
LocaleChain.configure(
overrides: ["es-MX": ["es-419", "es"]]
)흔한 실수
.strings 파일 구문 오류
SwiftUI Text 보간 현지화 실패
위젯/확장 프로그램에 원시 키 표시
실제 서비스에서 번역 대신 키 표시
권장 파일 구조
MyApp/
├── MyApp.xcodeproj
├── MyApp/
│ ├── Base.lproj/
│ │ ├── Localizable.strings # Source strings
│ │ └── Localizable.stringsdict # Plural rules
│ ├── en.lproj/
│ │ └── Localizable.strings
│ ├── de.lproj/
│ │ └── Localizable.strings
│ ├── ja.lproj/
│ │ └── Localizable.strings
│ ├── Localizable.xcstrings # OR String Catalog
│ └── Info.plist
├── MyAppTests/
├── fastlane/
│ ├── Fastfile
│ └── metadata/
│ ├── en-US/
│ │ ├── name.txt
│ │ ├── description.txt
│ │ └── keywords.txt
│ ├── de-DE/
│ └── ja/
└── Package.swift지금 i18n Agent 사용해 보기
번역 파일을 여기에 드롭
JSON, YAML, PO, XML, CSV, Markdown, Properties
또는 클릭하여 파일 선택
대상 언어
ios-localechain을 활용한 로케일 폴백
de-AT 같은 지역 로케일에 번역 키가 없으면 iOS는 상위 로케일 de를 먼저 확인하지 않고 개발 언어로 바로 폴백해요.
// Swift Package Manager
// https://github.com/i18n-agent/ios-localechainimport LocaleChain
LocaleChain.configure(overrides: [
"de": ["en-GB", "en"],
"pt-BR": ["pt", "en"],
"zh-Hant-HK": ["zh-Hant", "zh", "en"],
])지원 프레임워크와 75개 내장 체인의 전체 목록은 로케일 폴백 가이드에서 확인하세요. Learn more →