
Panduan Lengkap Penyetempatan Aplikasi iOS
Daripada Localizable.strings hingga metadata App Store: setempatkan aplikasi iOS dengan Xcode, SwiftUI, Fastlane, dan terjemahan AI automatik.
Aktifkan Penyetempatan dalam Xcode
Buka tetapan projek Xcode, pergi ke Info > Localizations, kemudian tambahkan bahasa yang mahu anda sokong. Xcode mencipta direktori .lproj untuk setiap bahasa secara automatik.
// 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.stringsCipta Localizable.strings
Fail penyetempatan iOS standard menggunakan pasangan kekunci-nilai yang dipisahkan tanda sama dengan, dengan setiap baris diakhiri koma bernoktah. Letakkan fail dalam 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";Pindahkan ke String Catalog (Xcode 15+)
String Catalog (.xcstrings) ialah pengganti moden fail .strings daripada Apple. Format ini menyediakan editor visual dalam Xcode, pengekstrakan rentetan automatik daripada paparan SwiftUI, dan sokongan bentuk jamak terbina dalam.
// 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 Rentetan Setempat dalam SwiftUI dan UIKit
Paparan Text SwiftUI menyetempatkan literal rentetan secara automatik. UIKit menggunakan NSLocalizedString. Untuk iOS 16+, API moden String(localized:comment:) menyediakan sintaks yang lebih kemas dengan sokongan pengkompil terbina dalam.
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"
)
}
}
}Kendalikan Bentuk Jamak
iOS menggunakan fail .stringsdict untuk peraturan bentuk jamak dan menyokong semua kategori bentuk jamak CLDR: zero, one, two, few, many, other. String Catalog mengendalikan bentuk jamak dengan editor visual dalam Xcode—jauh lebih ringkas 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)Setempatkan Metadata App Store dengan Fastlane
Gunakan alat deliver Fastlane untuk menyimpan metadata App Store—nama aplikasi, sari kata, penerangan, kata kunci, nota keluaran—sebagai fail teks biasa yang dikawal versi dalam repositori dan disusun mengikut 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 Penyetempatan anda
Uji kandungan setempat tanpa mengubah bahasa peranti. Gunakan penggantian skema Xcode untuk menjalankan aplikasi dalam sebarang bahasa, pratonton SwiftUI dengan persekitaran bahasa, dan XCUITest dengan argumen pelancaran untuk ujian automatik.
// 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()Automatikkan Kualiti Terjemahan
Automatikkan Terjemahan
Terjemah fail .strings, .xcstrings, dan metadata Fastlane dengan AI. Automatikkan terjemahan rentetan dalam aplikasi dan metadata App Store untuk menyediakan pengalaman yang disetempatkan sepenuhnya.
# 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: Sandaran Bahasa Pintar dengan LocaleChain
Secara lalai, iOS beralih kepada bahasa pembangunan apabila bahasa tepat pengguna tiada. Pengguna pt-BR yang hanya mempunyai terjemahan pt-PT akan melihat bahasa Inggeris, bukan Portugis. LocaleChain membaikinya dengan rantaian sandaran yang boleh dikonfigurasi.
LocaleChain ialah pakej 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"]]
)Kesilapan Umum
Ralat Sintaks Fail .strings
Interpolasi Text SwiftUI Tidak Disetempatkan
Widget/Sambungan Memaparkan Kekunci Mentah
Terjemahan yang Hilang Memaparkan Kekunci dalam Pengeluaran
Struktur Fail yang Disyorkan
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.swiftCuba i18n Agent Sekarang
Lepaskan fail terjemahan anda di sini
JSON, YAML, PO, XML, CSV, Markdown, Properties
atau klik untuk semak imbas
Bahasa sasaran
Sandaran Bahasa dengan ios-localechain
Apabila kekunci terjemahan tiada dalam bahasa serantau seperti de-AT, iOS terus beralih kepada bahasa pembangunan dan bukannya 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 Sandaran Bahasa kami untuk senarai lengkap rangka kerja yang disokong dan 75 rantaian terbina dalam. Learn more →