
Panduan Lengkap Lokalisasi Aplikasi iOS
Dari Localizable.strings hingga metadata App Store: lokalkan aplikasi iOS dengan Xcode, SwiftUI, Fastlane, dan penerjemahan AI otomatis.
Aktifkan Lokalisasi di Xcode
Buka pengaturan proyek Xcode, buka Info > Localizations, lalu tambahkan bahasa yang ingin Anda dukung. Xcode membuat direktori .lproj untuk setiap bahasa secara otomatis.
// 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.stringsBuat Localizable.strings
File lokalisasi iOS standar menggunakan pasangan kunci-nilai yang dipisahkan tanda sama dengan, dengan setiap baris diakhiri titik koma. Tempatkan file di folder Base.lproj untuk bahasa sumber.
// 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";Migrasikan ke String Catalog (Xcode 15+)
String Catalog (.xcstrings) adalah pengganti modern file .strings dari Apple. Format ini menyediakan editor visual di Xcode, ekstraksi string otomatis dari tampilan SwiftUI, dan dukungan bentuk jamak bawaan.
// 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")Gunakan String Lokal di SwiftUI dan UIKit
Tampilan Text SwiftUI melokalkan literal string secara otomatis. UIKit menggunakan NSLocalizedString. Untuk iOS 16+, API modern String(localized:comment:) menyediakan sintaks yang lebih rapi dengan dukungan compiler bawaan.
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"
)
}
}
}Tangani Bentuk Jamak
iOS menggunakan file .stringsdict untuk aturan bentuk jamak dan mendukung semua kategori bentuk jamak CLDR: zero, one, two, few, many, other. String Catalog menangani bentuk jamak dengan editor visual di Xcode—jauh lebih sederhana daripada menulis XML stringsdict secara manual.
<!-- 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)Lokalkan Metadata App Store dengan Fastlane
Gunakan alat deliver Fastlane untuk menyimpan metadata App Store—nama aplikasi, subjudul, deskripsi, kata kunci, catatan rilis—sebagai file teks biasa yang dikontrol versi dalam repositori dan disusun menurut bahasa.
# 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 deliverUji Lokalisasi Anda
Uji konten lokal tanpa mengubah bahasa perangkat. Gunakan override scheme Xcode untuk menjalankan aplikasi dalam bahasa apa pun, preview SwiftUI dengan environment bahasa, dan XCUITest dengan argumen peluncuran untuk pengujian otomatis.
// 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()Otomatiskan Kualitas Terjemahan
Otomatiskan Penerjemahan
Terjemahkan file .strings, .xcstrings, dan metadata Fastlane dengan AI. Otomatiskan penerjemahan string dalam aplikasi dan metadata App Store untuk menghadirkan pengalaman yang sepenuhnya dilokalkan.
# 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.2sBonus: Fallback Bahasa Cerdas dengan LocaleChain
Secara default, iOS beralih ke bahasa pengembangan saat bahasa pengguna yang tepat tidak tersedia. Pengguna pt-BR yang hanya memiliki terjemahan pt-PT akan melihat bahasa Inggris, bukan Portugis. LocaleChain memperbaikinya dengan rantai fallback yang dapat dikonfigurasi.
LocaleChain adalah paket Swift sumber terbuka. Lihat di 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"]]
)Kesalahan Umum
Kesalahan Sintaks File .strings
Interpolasi Text SwiftUI Tidak Dilokalkan
Widget/Ekstensi Menampilkan Kunci Mentah
Terjemahan yang Hilang Menampilkan Kunci di Produksi
Struktur File yang Disarankan
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.swiftCoba i18n Agent Sekarang
Lepaskan file terjemahan Anda di sini
JSON, YAML, PO, XML, CSV, Markdown, Properties
atau klik untuk menjelajahi
Bahasa target
Fallback Bahasa dengan ios-localechain
Saat kunci terjemahan tidak ada dalam bahasa regional seperti de-AT, iOS langsung beralih ke bahasa pengembangan alih-alih memeriksa bahasa induk de terlebih dahulu.
// 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"],
])Lihat Panduan Fallback Bahasa kami untuk daftar lengkap framework yang didukung dan 75 rantai bawaan. Learn more →